ropav 0.0.6 → 0.0.7

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 (127) hide show
  1. package/dist/_plugin-vue_export-helper.js +1 -11
  2. package/dist/accordion.css +112 -0
  3. package/dist/accordion.js +360 -0
  4. package/dist/accordion.js.map +1 -0
  5. package/dist/badge.css +169 -0
  6. package/dist/badge.js +103 -0
  7. package/dist/badge.js.map +1 -0
  8. package/dist/bem.js +11 -0
  9. package/dist/bem.js.map +1 -0
  10. package/dist/button-group.css +8 -8
  11. package/dist/button-group.js +2 -1
  12. package/dist/button-group.js.map +1 -1
  13. package/dist/button.js +3 -2
  14. package/dist/button.js.map +1 -1
  15. package/dist/card.js +2 -1
  16. package/dist/card.js.map +1 -1
  17. package/dist/checkbox.js +2 -1
  18. package/dist/checkbox.js.map +1 -1
  19. package/dist/collapse.css +32 -0
  20. package/dist/collapse.js +68 -0
  21. package/dist/collapse.js.map +1 -0
  22. package/dist/components/accordion/accordion-item.d.ts +40 -0
  23. package/dist/components/accordion/accordion.d.ts +23 -0
  24. package/dist/components/accordion/index.d.ts +4 -0
  25. package/dist/components/accordion/index.js +2 -0
  26. package/dist/components/accordion/types.d.ts +100 -0
  27. package/dist/components/accordion/useAccordion.d.ts +3 -0
  28. package/dist/components/badge/badge.d.ts +25 -0
  29. package/dist/components/badge/index.d.ts +3 -0
  30. package/dist/components/badge/index.js +2 -0
  31. package/dist/components/badge/types.d.ts +16 -0
  32. package/dist/components/badge/useBadgeColor.d.ts +8 -0
  33. package/dist/components/collapse/collapse.d.ts +36 -0
  34. package/dist/components/collapse/index.d.ts +3 -0
  35. package/dist/components/collapse/index.js +3 -0
  36. package/dist/components/collapse/types.d.ts +76 -0
  37. package/dist/components/collapse/useCollapse.d.ts +2 -0
  38. package/dist/components/dropdown-menu/dropdown-menu-items.d.ts +16 -0
  39. package/dist/components/dropdown-menu/dropdown-menu-utils.d.ts +23 -0
  40. package/dist/components/dropdown-menu/dropdown-menu.d.ts +26 -0
  41. package/dist/components/dropdown-menu/index.d.ts +3 -0
  42. package/dist/components/dropdown-menu/index.js +2 -0
  43. package/dist/components/dropdown-menu/types.d.ts +104 -0
  44. package/dist/components/dropdown-menu/useDropdownMenu.d.ts +32 -0
  45. package/dist/components/dropdown-menu/useDropdownMenuDisclosure.d.ts +30 -0
  46. package/dist/components/dropdown-menu/useDropdownMenuDom.d.ts +28 -0
  47. package/dist/components/dropdown-menu/useDropdownMenuHoverIntent.d.ts +24 -0
  48. package/dist/components/dropdown-menu/useDropdownMenuInteractions.d.ts +51 -0
  49. package/dist/components/dropdown-menu/useDropdownMenuNavigation.d.ts +16 -0
  50. package/dist/components/dropdown-menu/useDropdownMenuRenderItems.d.ts +25 -0
  51. package/dist/components/dropdown-menu/useDropdownSubmenus.d.ts +18 -0
  52. package/dist/components/field/field.d.ts +2 -2
  53. package/dist/components/field/useField.d.ts +16 -0
  54. package/dist/components/input/useInput.d.ts +8 -0
  55. package/dist/components/modal/index.d.ts +2 -0
  56. package/dist/components/modal/index.js +2 -0
  57. package/dist/components/modal/modal.d.ts +42 -0
  58. package/dist/components/modal/types.d.ts +32 -0
  59. package/dist/components/modal/useModal.d.ts +29 -0
  60. package/dist/components/overlay/index.d.ts +2 -0
  61. package/dist/components/overlay/index.js +2 -0
  62. package/dist/components/overlay/overlay.d.ts +19 -0
  63. package/dist/components/overlay/types.d.ts +12 -0
  64. package/dist/components/overlay/useOverlay.d.ts +7 -0
  65. package/dist/components/popover/index.d.ts +2 -0
  66. package/dist/components/popover/index.js +2 -0
  67. package/dist/components/popover/popover.d.ts +43 -0
  68. package/dist/components/popover/types.d.ts +40 -0
  69. package/dist/components/popover/usePopover.d.ts +20 -0
  70. package/dist/components/tabs/index.d.ts +6 -0
  71. package/dist/components/tabs/index.js +2 -0
  72. package/dist/components/tabs/tabs-content.d.ts +24 -0
  73. package/dist/components/tabs/tabs-list.d.ts +26 -0
  74. package/dist/components/tabs/tabs-trigger.d.ts +29 -0
  75. package/dist/components/tabs/tabs.d.ts +31 -0
  76. package/dist/components/tabs/types.d.ts +160 -0
  77. package/dist/components/tabs/useTabs.d.ts +5 -0
  78. package/dist/dropdown-menu.css +159 -0
  79. package/dist/dropdown-menu.js +903 -0
  80. package/dist/dropdown-menu.js.map +1 -0
  81. package/dist/field.css +8 -8
  82. package/dist/field.js +68 -50
  83. package/dist/field.js.map +1 -1
  84. package/dist/icon-button.css +1 -1
  85. package/dist/icon-button.js +3 -2
  86. package/dist/icon-button.js.map +1 -1
  87. package/dist/index.d.ts +8 -0
  88. package/dist/index.js +12 -1
  89. package/dist/input.css +25 -25
  90. package/dist/input.js +57 -38
  91. package/dist/input.js.map +1 -1
  92. package/dist/modal.css +134 -0
  93. package/dist/modal.js +433 -0
  94. package/dist/modal.js.map +1 -0
  95. package/dist/overlay.css +28 -0
  96. package/dist/overlay.js +84 -0
  97. package/dist/overlay.js.map +1 -0
  98. package/dist/popover.css +75 -0
  99. package/dist/popover.js +367 -0
  100. package/dist/popover.js.map +1 -0
  101. package/dist/progress.js +2 -1
  102. package/dist/progress.js.map +1 -1
  103. package/dist/radio.js +4 -9
  104. package/dist/radio.js.map +1 -1
  105. package/dist/select.js +8 -37
  106. package/dist/select.js.map +1 -1
  107. package/dist/slider.js +2 -1
  108. package/dist/slider.js.map +1 -1
  109. package/dist/switch.js +2 -1
  110. package/dist/switch.js.map +1 -1
  111. package/dist/tabs.css +279 -0
  112. package/dist/tabs.js +515 -0
  113. package/dist/tabs.js.map +1 -0
  114. package/dist/textarea.js +2 -1
  115. package/dist/textarea.js.map +1 -1
  116. package/dist/tooltip.js +2 -1
  117. package/dist/tooltip.js.map +1 -1
  118. package/dist/useClickOutside.js +26 -0
  119. package/dist/useClickOutside.js.map +1 -0
  120. package/dist/useCollapse.js +94 -0
  121. package/dist/useCollapse.js.map +1 -0
  122. package/dist/useRequiredInject.js +11 -0
  123. package/dist/useRequiredInject.js.map +1 -0
  124. package/dist/x.js +14 -0
  125. package/dist/x.js.map +1 -0
  126. package/package.json +35 -3
  127. package/dist/_plugin-vue_export-helper.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dropdown-menu.js","names":[],"sources":["../src/components/dropdown-menu/dropdown-menu-items.ts","../src/components/dropdown-menu/dropdown-menu-utils.ts","../src/components/dropdown-menu/useDropdownMenuDisclosure.ts","../src/components/dropdown-menu/useDropdownMenuDom.ts","../src/components/dropdown-menu/useDropdownMenuHoverIntent.ts","../src/components/dropdown-menu/useDropdownMenuInteractions.ts","../src/components/dropdown-menu/useDropdownMenuNavigation.ts","../src/components/dropdown-menu/useDropdownMenuRenderItems.ts","../src/components/dropdown-menu/useDropdownSubmenus.ts","../src/components/dropdown-menu/useDropdownMenu.ts","../src/components/dropdown-menu/dropdown-menu.vue","../src/components/dropdown-menu/dropdown-menu.vue"],"sourcesContent":["import { defineComponent, h, type PropType } from 'vue';\nimport type { DropdownMenuItemSlotProps, DropdownMenuRenderedItem } from './types';\n\nexport default defineComponent({\n name: 'RpDropdownMenuItems',\n props: {\n items: {\n type: Array as PropType<DropdownMenuRenderedItem[]>,\n required: true,\n },\n },\n setup(props, { slots }) {\n function renderItems(items: DropdownMenuRenderedItem[]) {\n return items.map((renderedItem) => {\n const children = [\n h(\n 'button',\n renderedItem.props,\n slots.item?.(renderedItem.slotProps as DropdownMenuItemSlotProps),\n ),\n ];\n\n if (renderedItem.hasSubmenu && renderedItem.submenuOpen) {\n children.push(\n h('div', renderedItem.submenuProps, renderItems(renderedItem.children)),\n );\n }\n\n return h(\n 'div',\n {\n key: renderedItem.key,\n class: 'rp-dropdown-menu__item-wrap',\n role: 'none',\n },\n children,\n );\n });\n }\n\n return () => renderItems(props.items);\n },\n});\n","import { bem } from '@/utils/bem';\nimport type {\n DropdownMenuFocusTarget,\n DropdownMenuItem,\n DropdownMenuItemPath,\n DropdownMenuOpenOptions,\n DropdownMenuPlacement,\n} from './types';\n\nexport const DEFAULT_PLACEMENT: DropdownMenuPlacement = 'bottom-start';\nexport const DEFAULT_FOCUS_TARGET: DropdownMenuFocusTarget = 'first';\n\nexport type ItemPath = DropdownMenuItemPath;\nexport type SubmenuFocusTarget = DropdownMenuFocusTarget | false;\n\nexport type PointerPoint = {\n x: number;\n y: number;\n};\n\nexport function getOpenFocusTarget(\n options: DropdownMenuOpenOptions | DropdownMenuFocusTarget | undefined,\n) {\n if (typeof options === 'string') return options;\n return options?.focus ?? DEFAULT_FOCUS_TARGET;\n}\n\nexport function getItemClass(\n item: DropdownMenuItem,\n focused: boolean,\n disabled: boolean,\n hasSubmenu: boolean,\n submenuOpen: boolean,\n) {\n return bem('rp-dropdown-menu__item', {\n focused,\n disabled,\n destructive: item.destructive,\n submenu: hasSubmenu,\n open: submenuOpen,\n });\n}\n\nexport function hasItemSubmenu(item: DropdownMenuItem) {\n return (item.children?.length ?? 0) > 0;\n}\n\nexport function hasNestedItems(items: DropdownMenuItem[]): boolean {\n return items.some((item) => hasItemSubmenu(item) || hasNestedItems(item.children ?? []));\n}\n\nexport function getPathKey(path: ItemPath) {\n return path.length === 0 ? 'root' : path.join('-');\n}\n\nexport function getParentPath(path: ItemPath) {\n return path.slice(0, -1);\n}\n\nexport function arePathsEqual(a: ItemPath, b: ItemPath) {\n return a.length === b.length && a.every((part, index) => part === b[index]);\n}\n\nexport function isPathPrefix(prefix: ItemPath, path: ItemPath) {\n return prefix.length <= path.length && prefix.every((part, index) => part === path[index]);\n}\n\nexport function normalizePath(indexOrPath: number | ItemPath): ItemPath {\n return Array.isArray(indexOrPath) ? indexOrPath : [indexOrPath];\n}\n\nexport function getEventPoint(event: MouseEvent): PointerPoint {\n return {\n x: event.clientX,\n y: event.clientY,\n };\n}\n\nexport function hasMeasuredRect(rect: DOMRect) {\n return rect.width > 0 || rect.height > 0;\n}\n\nexport function isPointInRect(point: PointerPoint, rect: DOMRect, padding = 0) {\n return (\n point.x >= rect.left - padding &&\n point.x <= rect.right + padding &&\n point.y >= rect.top - padding &&\n point.y <= rect.bottom + padding\n );\n}\n\nexport function getEnabledIndexes(items: DropdownMenuItem[]) {\n return items.map((item, index) => (item.disabled ? -1 : index)).filter((index) => index >= 0);\n}\n\nexport function getNextEnabledIndex(items: DropdownMenuItem[], index: number, direction: 1 | -1) {\n const enabledIndexes = getEnabledIndexes(items);\n if (enabledIndexes.length === 0) return undefined;\n\n if (direction === 1) {\n return enabledIndexes.find((candidate) => candidate > index) ?? enabledIndexes[0];\n }\n\n for (let i = enabledIndexes.length - 1; i >= 0; i -= 1) {\n const candidate = enabledIndexes[i]!;\n if (candidate < index) return candidate;\n }\n\n return enabledIndexes[enabledIndexes.length - 1];\n}\n","import { watch, type Ref } from 'vue';\nimport { useClickOutside } from '@/composables/useClickOutside';\nimport type {\n DropdownMenuCloseOptions,\n DropdownMenuFocusTarget,\n DropdownMenuItem,\n DropdownMenuOpenOptions,\n DropdownMenuProps,\n} from './types';\nimport { DEFAULT_FOCUS_TARGET, getOpenFocusTarget, type ItemPath } from './dropdown-menu-utils';\n\ntype BooleanSource = Readonly<Ref<boolean>>;\n\ntype UseDropdownMenuDisclosureOptions = {\n props: Readonly<DropdownMenuProps>;\n emit: {\n openChange?: (open: boolean) => void;\n select?: (item: DropdownMenuItem) => void;\n };\n rootRef: Ref<HTMLElement | null>;\n uncontrolledOpen: Ref<boolean>;\n isDisabled: BooleanSource;\n isOpen: BooleanSource;\n isVisible: BooleanSource;\n focusedPath: Ref<ItemPath>;\n resetFocus: () => void;\n resetSubmenus: () => void;\n resetHoverIntent: () => void;\n focusItem: (target: DropdownMenuFocusTarget, menuPath?: ItemPath) => boolean;\n focusMenu: () => void;\n focusTrigger: () => void;\n};\n\nexport function useDropdownMenuDisclosure({\n props,\n emit,\n rootRef,\n uncontrolledOpen,\n isDisabled,\n isOpen,\n isVisible,\n focusedPath,\n resetFocus,\n resetSubmenus,\n resetHoverIntent,\n focusItem,\n focusMenu,\n focusTrigger,\n}: UseDropdownMenuDisclosureOptions) {\n function setOpen(nextOpen: boolean) {\n if (nextOpen && isDisabled.value) return;\n\n const previousOpen = isOpen.value;\n if (props.open === undefined) uncontrolledOpen.value = nextOpen;\n if (previousOpen !== nextOpen) emit.openChange?.(nextOpen);\n }\n\n function resetMenuFocus() {\n resetFocus();\n resetSubmenus();\n resetHoverIntent();\n }\n\n function open(options?: DropdownMenuOpenOptions | DropdownMenuFocusTarget) {\n if (isDisabled.value) return;\n\n setOpen(true);\n focusItem(getOpenFocusTarget(options));\n resetSubmenus();\n resetHoverIntent();\n focusMenu();\n }\n\n function close(options: DropdownMenuCloseOptions = {}) {\n setOpen(false);\n resetMenuFocus();\n if (options.focusTrigger) focusTrigger();\n }\n\n function toggle() {\n if (isVisible.value) {\n close({ focusTrigger: true });\n } else {\n open();\n }\n }\n\n watch(isDisabled, (disabled) => {\n if (disabled) close();\n });\n\n watch(isVisible, (visible) => {\n if (visible) {\n if (focusedPath.value.length === 0) focusItem(DEFAULT_FOCUS_TARGET);\n focusMenu();\n } else {\n resetMenuFocus();\n }\n });\n\n useClickOutside(rootRef, isVisible, () => close());\n\n return {\n open,\n close,\n toggle,\n resetMenuFocus,\n };\n}\n","import { computed, nextTick, watch, type Ref } from 'vue';\nimport type { DropdownMenuPlacement } from './types';\nimport {\n arePathsEqual,\n getParentPath,\n getPathKey,\n hasMeasuredRect,\n normalizePath,\n type ItemPath,\n} from './dropdown-menu-utils';\n\ntype StringSource = {\n readonly value: string;\n};\ntype PlacementSource = {\n readonly value: DropdownMenuPlacement;\n};\n\ntype UseDropdownMenuDomOptions = {\n menuId: StringSource;\n rootRef: Ref<HTMLElement | null>;\n menuRef: Ref<HTMLElement | null>;\n placement: PlacementSource;\n focusedPath: Ref<ItemPath>;\n};\n\nexport function useDropdownMenuDom({\n menuId,\n rootRef,\n menuRef,\n placement,\n focusedPath,\n}: UseDropdownMenuDomOptions) {\n const activeDescendantId = computed(() =>\n focusedPath.value.length === 0 ? undefined : getItemId(focusedPath.value),\n );\n\n function focusMenu() {\n nextTick(() => menuRef.value?.focus());\n }\n\n function focusTrigger() {\n nextTick(() => {\n const trigger = rootRef.value?.querySelector<HTMLElement>('[aria-haspopup=\"menu\"]');\n trigger?.focus();\n });\n }\n\n function getItemId(indexOrPath: number | ItemPath) {\n return `${menuId.value}-item-${getPathKey(normalizePath(indexOrPath))}`;\n }\n\n function getSubmenuId(path: ItemPath) {\n return `${menuId.value}-submenu-${getPathKey(path)}`;\n }\n\n function getItemElement(path: ItemPath) {\n return document.getElementById(getItemId(path));\n }\n\n function getSubmenuElement(path: ItemPath) {\n return document.getElementById(getSubmenuId(path));\n }\n\n function isSubmenuOpeningLeft(path: ItemPath) {\n const submenuRect = getSubmenuElement(path)?.getBoundingClientRect();\n const itemRect = getItemElement(path)?.getBoundingClientRect();\n\n if (submenuRect && itemRect && hasMeasuredRect(submenuRect) && hasMeasuredRect(itemRect)) {\n return submenuRect.right <= itemRect.left;\n }\n\n return placement.value.endsWith('end');\n }\n\n function getMenuActiveDescendant(menuPath: ItemPath) {\n return arePathsEqual(getParentPath(focusedPath.value), menuPath)\n ? getItemId(focusedPath.value)\n : undefined;\n }\n\n watch(focusedPath, (path) => {\n if (path.length === 0) return;\n\n const targetPath = [...path];\n nextTick(() => {\n if (!arePathsEqual(targetPath, focusedPath.value)) return;\n getItemElement(targetPath)?.scrollIntoView?.({ block: 'nearest' });\n });\n });\n\n return {\n activeDescendantId,\n focusMenu,\n focusTrigger,\n getItemId,\n getSubmenuId,\n getItemElement,\n getSubmenuElement,\n isSubmenuOpeningLeft,\n getMenuActiveDescendant,\n };\n}\n","import { onUnmounted, ref, type Ref } from 'vue';\nimport type { DropdownMenuItem } from './types';\nimport {\n arePathsEqual,\n getEventPoint,\n hasMeasuredRect,\n isPathPrefix,\n isPointInRect,\n type ItemPath,\n type PointerPoint,\n} from './dropdown-menu-utils';\n\nconst SAFE_TRIANGLE_PADDING = 2;\nconst SAFE_TRIANGLE_ORIGIN_OFFSET = 2;\nconst SAFE_TRIANGLE_TIMEOUT = 400;\n\nexport type SafeTriangle = [PointerPoint, PointerPoint, PointerPoint];\ntype GetSafeTriangleOptions = {\n itemRect: DOMRect | null;\n submenuRect: DOMRect;\n origin: PointerPoint;\n};\ntype PendingHover = {\n item: DropdownMenuItem;\n path: ItemPath;\n};\ntype HoverCommit = (item: DropdownMenuItem, path: ItemPath, point?: PointerPoint) => void;\n\ntype UseDropdownMenuHoverIntentOptions = {\n openSubmenuPath: Ref<ItemPath>;\n getItemElement: (path: ItemPath) => HTMLElement | null;\n getSubmenuElement: (path: ItemPath) => HTMLElement | null;\n};\n\nfunction getTriangleArea(a: PointerPoint, b: PointerPoint, c: PointerPoint) {\n return Math.abs((a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y)) / 2);\n}\n\nfunction isPointInTriangle(point: PointerPoint, triangle: SafeTriangle) {\n const [a, b, c] = triangle;\n const area = getTriangleArea(a, b, c);\n const area1 = getTriangleArea(point, b, c);\n const area2 = getTriangleArea(a, point, c);\n const area3 = getTriangleArea(a, b, point);\n\n return Math.abs(area - (area1 + area2 + area3)) < 0.5;\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction clampPointToRect(point: PointerPoint, rect: DOMRect): PointerPoint {\n return {\n x: clamp(point.x, rect.left, rect.right),\n y: clamp(point.y, rect.top, rect.bottom),\n };\n}\n\nexport function getDropdownMenuSafeTriangle({\n itemRect,\n submenuRect,\n origin,\n}: GetSafeTriangleOptions): SafeTriangle {\n const measuredItemRect = itemRect && hasMeasuredRect(itemRect) ? itemRect : null;\n const opensRight = !measuredItemRect || submenuRect.left >= measuredItemRect.right;\n const edgeX = opensRight ? submenuRect.left : submenuRect.right;\n const boundedOrigin = measuredItemRect ? clampPointToRect(origin, measuredItemRect) : origin;\n const expandedOrigin = {\n x:\n boundedOrigin.x +\n (opensRight ? -SAFE_TRIANGLE_ORIGIN_OFFSET : SAFE_TRIANGLE_ORIGIN_OFFSET),\n y: boundedOrigin.y,\n };\n\n return [\n expandedOrigin,\n {\n x: edgeX,\n y: submenuRect.top - SAFE_TRIANGLE_PADDING,\n },\n {\n x: edgeX,\n y: submenuRect.bottom + SAFE_TRIANGLE_PADDING,\n },\n ];\n}\n\nexport function useDropdownMenuHoverIntent({\n openSubmenuPath,\n getItemElement,\n getSubmenuElement,\n}: UseDropdownMenuHoverIntentOptions) {\n const safeTriangleOrigin = ref<PointerPoint | null>(null);\n let latestPointerPoint: PointerPoint | null = null;\n let pendingHover: PendingHover | null = null;\n let pendingHoverTimer: number | undefined;\n\n function clearPendingHover() {\n pendingHover = null;\n if (pendingHoverTimer !== undefined) {\n window.clearTimeout(pendingHoverTimer);\n pendingHoverTimer = undefined;\n }\n }\n\n function resetHoverIntent() {\n safeTriangleOrigin.value = null;\n latestPointerPoint = null;\n clearPendingHover();\n }\n\n function getFallbackTriangleOrigin(path: ItemPath): PointerPoint | null {\n const itemRect = getItemElement(path)?.getBoundingClientRect();\n if (!itemRect) return null;\n\n const submenuRect = getSubmenuElement(path)?.getBoundingClientRect();\n const opensRight = !submenuRect || submenuRect.left >= itemRect.right;\n return {\n x: opensRight ? itemRect.right : itemRect.left,\n y: itemRect.top + itemRect.height / 2,\n };\n }\n\n function trackSubmenuOpen(path: ItemPath, point?: PointerPoint) {\n safeTriangleOrigin.value = point ?? getFallbackTriangleOrigin(path);\n clearPendingHover();\n }\n\n function isPointInCurrentSubmenu(point: PointerPoint) {\n if (openSubmenuPath.value.length === 0) return false;\n\n const submenuRect = getSubmenuElement(openSubmenuPath.value)?.getBoundingClientRect();\n return submenuRect ? isPointInRect(point, submenuRect, SAFE_TRIANGLE_PADDING) : false;\n }\n\n function getSafeTriangle(path: ItemPath): SafeTriangle | null {\n const submenuRect = getSubmenuElement(path)?.getBoundingClientRect();\n const itemRect = getItemElement(path)?.getBoundingClientRect();\n const origin = safeTriangleOrigin.value ?? getFallbackTriangleOrigin(path);\n\n if (!submenuRect || !origin) return null;\n\n return getDropdownMenuSafeTriangle({\n itemRect: itemRect ?? null,\n submenuRect,\n origin,\n });\n }\n\n function updateSafeTriangleOrigin(point: PointerPoint) {\n if (openSubmenuPath.value.length === 0) return;\n\n const itemRect = getItemElement(openSubmenuPath.value)?.getBoundingClientRect();\n if (itemRect && isPointInRect(point, itemRect)) {\n safeTriangleOrigin.value = point;\n }\n }\n\n function shouldDelayHover(path: ItemPath, point: PointerPoint) {\n if (openSubmenuPath.value.length === 0) return false;\n if (arePathsEqual(path, openSubmenuPath.value)) return false;\n if (isPathPrefix(openSubmenuPath.value, path)) return false;\n if (isPointInCurrentSubmenu(point)) return true;\n\n const triangle = getSafeTriangle(openSubmenuPath.value);\n return triangle ? isPointInTriangle(point, triangle) : false;\n }\n\n function delayHoveredItem(item: DropdownMenuItem, path: ItemPath, commit: HoverCommit) {\n pendingHover = {\n item,\n path,\n };\n\n if (pendingHoverTimer !== undefined) window.clearTimeout(pendingHoverTimer);\n pendingHoverTimer = window.setTimeout(() => {\n if (!pendingHover) return;\n\n const nextHover = pendingHover;\n if (latestPointerPoint && isPointInCurrentSubmenu(latestPointerPoint)) {\n clearPendingHover();\n return;\n }\n\n commit(nextHover.item, nextHover.path);\n }, SAFE_TRIANGLE_TIMEOUT);\n }\n\n function handleItemHover(\n item: DropdownMenuItem,\n path: ItemPath,\n event: MouseEvent | undefined,\n commit: HoverCommit,\n ) {\n const point = event ? getEventPoint(event) : undefined;\n latestPointerPoint = point ?? latestPointerPoint;\n\n if (point && shouldDelayHover(path, point)) {\n delayHoveredItem(item, path, commit);\n return;\n }\n\n commit(item, path, point);\n }\n\n function handleMenuMousemove(event: MouseEvent, commit: HoverCommit) {\n const point = getEventPoint(event);\n latestPointerPoint = point;\n updateSafeTriangleOrigin(point);\n if (!pendingHover) return;\n\n if (shouldDelayHover(pendingHover.path, point)) return;\n\n const nextHover = pendingHover;\n commit(nextHover.item, nextHover.path, point);\n }\n\n onUnmounted(clearPendingHover);\n\n return {\n clearPendingHover,\n resetHoverIntent,\n trackSubmenuOpen,\n handleItemHover,\n handleMenuMousemove,\n };\n}\n","import type { Ref } from 'vue';\nimport type {\n DropdownMenuCloseOptions,\n DropdownMenuFocusTarget,\n DropdownMenuItem,\n DropdownMenuOpenOptions,\n DropdownMenuProps,\n} from './types';\nimport {\n arePathsEqual,\n DEFAULT_FOCUS_TARGET,\n getEventPoint,\n getParentPath,\n hasItemSubmenu,\n normalizePath,\n type ItemPath,\n type PointerPoint,\n type SubmenuFocusTarget,\n} from './dropdown-menu-utils';\n\ntype BooleanSource = Readonly<Ref<boolean>>;\n\ntype DisclosureControls = {\n open: (options?: DropdownMenuOpenOptions | DropdownMenuFocusTarget) => void;\n close: (options?: DropdownMenuCloseOptions) => void;\n toggle: () => void;\n};\n\ntype SubmenuControls = {\n closeSubmenusAfter: (menuPath: ItemPath) => void;\n openSubmenu: (path: ItemPath, focus?: SubmenuFocusTarget) => boolean;\n closeSubmenu: (path: ItemPath) => boolean;\n closeCurrentSubmenu: () => boolean;\n};\n\ntype HoverIntentControls = {\n clearPendingHover: () => void;\n resetHoverIntent: () => void;\n trackSubmenuOpen: (path: ItemPath, point?: PointerPoint) => void;\n handleItemHover: (\n item: DropdownMenuItem,\n path: ItemPath,\n event: MouseEvent | undefined,\n commit: (item: DropdownMenuItem, path: ItemPath, point?: PointerPoint) => void,\n ) => void;\n handleMenuMousemove: (\n event: MouseEvent,\n commit: (item: DropdownMenuItem, path: ItemPath, point?: PointerPoint) => void,\n ) => void;\n};\n\ntype UseDropdownMenuInteractionsOptions = {\n props: Readonly<DropdownMenuProps>;\n emit: {\n select?: (item: DropdownMenuItem) => void;\n };\n isDisabled: BooleanSource;\n focusedPath: Ref<ItemPath>;\n openSubmenuPath: Ref<ItemPath>;\n getItemAtPath: (path: ItemPath) => DropdownMenuItem | undefined;\n focusItem: (target: DropdownMenuFocusTarget, menuPath?: ItemPath) => boolean;\n moveFocus: (direction: 1 | -1) => ItemPath | undefined;\n submenus: SubmenuControls;\n hoverIntent: HoverIntentControls;\n disclosure: DisclosureControls;\n isSubmenuOpeningLeft: (path: ItemPath) => boolean;\n};\n\nexport function useDropdownMenuInteractions({\n props,\n emit,\n isDisabled,\n focusedPath,\n openSubmenuPath,\n getItemAtPath,\n focusItem,\n moveFocus,\n submenus,\n hoverIntent,\n disclosure,\n isSubmenuOpeningLeft,\n}: UseDropdownMenuInteractionsOptions) {\n function activateItem(item: DropdownMenuItem, path: ItemPath, event?: MouseEvent) {\n if (item.disabled) return;\n\n if (hasItemSubmenu(item)) {\n openSubmenu(path, DEFAULT_FOCUS_TARGET, event ? getEventPoint(event) : undefined);\n return;\n }\n\n selectItem(item);\n }\n\n function selectItem(item: DropdownMenuItem) {\n if (item.disabled) return;\n\n emit.select?.(item);\n if (props.closeOnSelect !== false) {\n disclosure.close({ focusTrigger: true });\n }\n }\n\n function closeSubmenusAfter(menuPath: ItemPath) {\n submenus.closeSubmenusAfter(menuPath);\n hoverIntent.resetHoverIntent();\n }\n\n function openSubmenu(\n path: ItemPath,\n focus: SubmenuFocusTarget = DEFAULT_FOCUS_TARGET,\n point?: PointerPoint,\n ) {\n const opened = submenus.openSubmenu(path, focus);\n if (opened) hoverIntent.trackSubmenuOpen(path, point);\n return opened;\n }\n\n function closeSubmenu(path: ItemPath) {\n const closed = submenus.closeSubmenu(path);\n if (closed) hoverIntent.resetHoverIntent();\n return closed;\n }\n\n function closeCurrentSubmenu() {\n const closed = submenus.closeCurrentSubmenu();\n if (closed) hoverIntent.resetHoverIntent();\n return closed;\n }\n\n function commitHoveredItem(item: DropdownMenuItem, path: ItemPath, point?: PointerPoint) {\n hoverIntent.clearPendingHover();\n focusedPath.value = [...path];\n\n if (hasItemSubmenu(item)) {\n openSubmenu(path, false, point);\n } else {\n closeSubmenusAfter(getParentPath(path));\n }\n }\n\n function focusHoveredItem(\n item: DropdownMenuItem,\n indexOrPath: number | ItemPath,\n event?: MouseEvent,\n ) {\n if (item.disabled) return;\n\n const path = normalizePath(indexOrPath);\n hoverIntent.handleItemHover(item, path, event, commitHoveredItem);\n }\n\n function selectFocusedItem() {\n const item = getItemAtPath(focusedPath.value);\n if (!item) return;\n activateItem(item, focusedPath.value);\n }\n\n function moveFocusedItem(direction: 1 | -1) {\n const menuPath = moveFocus(direction);\n if (menuPath) closeSubmenusAfter(menuPath);\n }\n\n function onTriggerClick() {\n disclosure.toggle();\n }\n\n function onTriggerKeydown(event: KeyboardEvent) {\n if (isDisabled.value) return;\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault();\n disclosure.open();\n break;\n case 'ArrowUp':\n event.preventDefault();\n disclosure.open({ focus: 'last' });\n break;\n case 'Escape':\n disclosure.close({ focusTrigger: true });\n break;\n }\n }\n\n function onMenuKeydown(event: KeyboardEvent) {\n hoverIntent.resetHoverIntent();\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n moveFocusedItem(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n moveFocusedItem(-1);\n break;\n case 'Home':\n event.preventDefault();\n focusItem('first', getParentPath(focusedPath.value));\n break;\n case 'End':\n event.preventDefault();\n focusItem('last', getParentPath(focusedPath.value));\n break;\n case 'ArrowRight':\n case 'ArrowLeft':\n onMenuHorizontalKeydown(event);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n selectFocusedItem();\n break;\n case 'Escape':\n event.preventDefault();\n if (!closeCurrentSubmenu()) disclosure.close({ focusTrigger: true });\n break;\n case 'Tab':\n disclosure.close();\n break;\n }\n }\n\n function onMenuHorizontalKeydown(event: KeyboardEvent) {\n const isRight = event.key === 'ArrowRight';\n const currentMenuPath = getParentPath(focusedPath.value);\n const closePath =\n focusedPath.value.length > 1\n ? currentMenuPath\n : arePathsEqual(focusedPath.value, openSubmenuPath.value)\n ? focusedPath.value\n : undefined;\n\n if (closePath && isRight === isSubmenuOpeningLeft(closePath)) {\n event.preventDefault();\n closeSubmenu(closePath);\n return;\n }\n\n const item = getItemAtPath(focusedPath.value);\n if (!item || item.disabled || !hasItemSubmenu(item)) return;\n\n const nextSubmenuOpensLeft = isSubmenuOpeningLeft(focusedPath.value);\n if (isRight === nextSubmenuOpensLeft) return;\n\n event.preventDefault();\n openSubmenu(focusedPath.value);\n }\n\n function onMenuMousemove(event: MouseEvent) {\n hoverIntent.handleMenuMousemove(event, commitHoveredItem);\n }\n\n function onMenuMouseleave() {\n hoverIntent.resetHoverIntent();\n }\n\n return {\n activateItem,\n selectItem,\n openSubmenu,\n closeSubmenu,\n focusHoveredItem,\n onTriggerClick,\n onTriggerKeydown,\n onMenuKeydown,\n onMenuMousemove,\n onMenuMouseleave,\n };\n}\n","import { computed, ref } from 'vue';\nimport type { DropdownMenuFocusTarget, DropdownMenuItem } from './types';\nimport {\n arePathsEqual,\n getEnabledIndexes,\n getNextEnabledIndex,\n getParentPath,\n normalizePath,\n type ItemPath,\n} from './dropdown-menu-utils';\n\ntype DropdownMenuItemsSource = {\n readonly value: DropdownMenuItem[];\n};\n\nexport function useDropdownMenuNavigation(items: DropdownMenuItemsSource) {\n const focusedPath = ref<ItemPath>([]);\n const focusedIndex = computed(() => focusedPath.value[0] ?? -1);\n\n function getItemsAtPath(path: ItemPath) {\n let currentItems = items.value;\n for (const index of path) {\n const item = currentItems[index];\n if (!item) return [];\n currentItems = item.children ?? [];\n }\n return currentItems;\n }\n\n function getItemAtPath(path: ItemPath) {\n if (path.length === 0) return undefined;\n const parentItems = getItemsAtPath(getParentPath(path));\n return parentItems[path[path.length - 1]];\n }\n\n function focusItem(target: DropdownMenuFocusTarget, menuPath: ItemPath = []) {\n const enabledIndexes = getEnabledIndexes(getItemsAtPath(menuPath));\n const index =\n target === 'last' ? enabledIndexes[enabledIndexes.length - 1] : enabledIndexes[0];\n\n if (index === undefined) {\n if (menuPath.length === 0) focusedPath.value = [];\n return false;\n }\n\n focusedPath.value = [...menuPath, index];\n return true;\n }\n\n function resetFocus() {\n focusedPath.value = [];\n }\n\n function isItemFocused(indexOrPath: number | ItemPath) {\n return arePathsEqual(normalizePath(indexOrPath), focusedPath.value);\n }\n\n function moveFocus(direction: 1 | -1) {\n const menuPath = getParentPath(focusedPath.value);\n const itemsAtPath = getItemsAtPath(menuPath);\n const currentIndex =\n focusedPath.value.length === 0\n ? direction === 1\n ? -1\n : itemsAtPath.length\n : focusedPath.value[focusedPath.value.length - 1]!;\n const nextIndex = getNextEnabledIndex(itemsAtPath, currentIndex, direction);\n\n if (nextIndex === undefined) {\n focusedPath.value = [];\n return undefined;\n }\n\n focusedPath.value = [...menuPath, nextIndex];\n return menuPath;\n }\n\n return {\n focusedPath,\n focusedIndex,\n getItemsAtPath,\n getItemAtPath,\n focusItem,\n resetFocus,\n isItemFocused,\n moveFocus,\n };\n}\n","import { computed } from 'vue';\nimport { bem } from '@/utils/bem';\nimport type {\n DropdownMenuCloseOptions,\n DropdownMenuFocusTarget,\n DropdownMenuItem,\n DropdownMenuItemProps,\n DropdownMenuItemSlotProps,\n DropdownMenuRenderedItem,\n DropdownMenuSubmenuProps,\n} from './types';\nimport {\n DEFAULT_FOCUS_TARGET,\n getItemClass,\n getPathKey,\n hasItemSubmenu,\n hasNestedItems,\n normalizePath,\n type ItemPath,\n} from './dropdown-menu-utils';\n\ntype DropdownMenuItemsSource = {\n readonly value: DropdownMenuItem[];\n};\n\ntype UseDropdownMenuRenderItemsOptions = {\n items: DropdownMenuItemsSource;\n getItemId: (path: ItemPath) => string;\n getSubmenuId: (path: ItemPath) => string;\n getMenuActiveDescendant: (path: ItemPath) => string | undefined;\n isItemFocused: (indexOrPath: number | ItemPath) => boolean;\n isSubmenuOpen: (path: ItemPath) => boolean;\n activateItem: (item: DropdownMenuItem, path: ItemPath, event?: MouseEvent) => void;\n focusHoveredItem: (\n item: DropdownMenuItem,\n indexOrPath: number | ItemPath,\n event?: MouseEvent,\n ) => void;\n selectItem: (item: DropdownMenuItem) => void;\n openSubmenu: (path: ItemPath, focus?: DropdownMenuFocusTarget) => void;\n closeSubmenu: (path: ItemPath) => void;\n close: (options?: DropdownMenuCloseOptions) => void;\n};\n\nexport function useDropdownMenuRenderItems({\n items,\n getItemId,\n getSubmenuId,\n getMenuActiveDescendant,\n isItemFocused,\n isSubmenuOpen,\n activateItem,\n focusHoveredItem,\n selectItem,\n openSubmenu,\n closeSubmenu,\n close,\n}: UseDropdownMenuRenderItemsOptions) {\n const renderedItems = computed<DropdownMenuRenderedItem[]>(() => getRenderedItems(items.value));\n\n function getRenderedItems(\n dropdownItems: DropdownMenuItem[],\n parentPath: ItemPath = [],\n ): DropdownMenuRenderedItem[] {\n return dropdownItems.map((item, index) => {\n const path = [...parentPath, index];\n const level = parentPath.length;\n const focused = isItemFocused(path);\n const disabled = Boolean(item.disabled);\n const hasSubmenu = hasItemSubmenu(item);\n const submenuOpen = hasSubmenu && isSubmenuOpen(path);\n\n return {\n item,\n index,\n key: `${getPathKey(path)}:${String(item.value)}`,\n path,\n level,\n focused,\n disabled,\n hasSubmenu,\n submenuOpen,\n props: getItemProps(item, path, focused, disabled),\n submenuProps: hasSubmenu ? getSubmenuProps(item, path) : undefined,\n slotProps: getItemSlotProps(item, path, focused, disabled),\n children: hasSubmenu ? getRenderedItems(item.children ?? [], path) : [],\n };\n });\n }\n\n function getItemProps(\n item: DropdownMenuItem,\n indexOrPath: number | ItemPath,\n focused = isItemFocused(indexOrPath),\n disabled = Boolean(item.disabled),\n ): DropdownMenuItemProps {\n const path = normalizePath(indexOrPath);\n const hasSubmenu = hasItemSubmenu(item);\n const submenuOpen = hasSubmenu && isSubmenuOpen(path);\n\n return {\n id: getItemId(path),\n type: 'button',\n role: 'menuitem',\n tabindex: -1,\n class: getItemClass(item, focused, disabled, hasSubmenu, submenuOpen),\n 'aria-controls': hasSubmenu ? getSubmenuId(path) : undefined,\n 'aria-expanded': hasSubmenu ? submenuOpen : undefined,\n 'aria-haspopup': hasSubmenu ? 'menu' : undefined,\n 'aria-disabled': disabled || undefined,\n 'data-disabled': disabled || undefined,\n 'data-focused': focused || undefined,\n 'data-submenu': hasSubmenu || undefined,\n onClick: (event) => activateItem(item, path, event),\n onMouseenter: (event) => focusHoveredItem(item, path, event),\n };\n }\n\n function getSubmenuProps(item: DropdownMenuItem, path: ItemPath): DropdownMenuSubmenuProps {\n return {\n id: getSubmenuId(path),\n role: 'menu',\n class: bem('rp-dropdown-menu__submenu', {\n open: isSubmenuOpen(path),\n 'has-submenu': hasNestedItems(item.children ?? []),\n }),\n 'aria-label': item.label,\n 'aria-activedescendant': getMenuActiveDescendant(path),\n };\n }\n\n function getItemSlotProps(\n item: DropdownMenuItem,\n indexOrPath: number | ItemPath,\n focused = isItemFocused(indexOrPath),\n disabled = Boolean(item.disabled),\n ): DropdownMenuItemSlotProps {\n const path = normalizePath(indexOrPath);\n const hasSubmenu = hasItemSubmenu(item);\n\n return {\n item,\n index: path[path.length - 1] ?? -1,\n path,\n level: path.length - 1,\n focused,\n disabled,\n hasSubmenu,\n isSubmenuOpen: hasSubmenu && isSubmenuOpen(path),\n select: () => selectItem(item),\n openSubmenu: (focus = DEFAULT_FOCUS_TARGET) => openSubmenu(path, focus),\n closeSubmenu: () => closeSubmenu(path),\n close,\n };\n }\n\n return {\n renderedItems,\n getItemProps,\n getItemSlotProps,\n };\n}\n","import { ref, type Ref } from 'vue';\nimport type { DropdownMenuItem } from './types';\nimport {\n DEFAULT_FOCUS_TARGET,\n getParentPath,\n hasItemSubmenu,\n isPathPrefix,\n type ItemPath,\n type SubmenuFocusTarget,\n} from './dropdown-menu-utils';\n\ntype UseDropdownSubmenusOptions = {\n focusedPath: Ref<ItemPath>;\n getItemAtPath: (path: ItemPath) => DropdownMenuItem | undefined;\n focusItem: (target: Exclude<SubmenuFocusTarget, false>, menuPath?: ItemPath) => boolean;\n};\n\nexport function useDropdownSubmenus({\n focusedPath,\n getItemAtPath,\n focusItem,\n}: UseDropdownSubmenusOptions) {\n const openSubmenuPath = ref<ItemPath>([]);\n\n function resetSubmenus() {\n openSubmenuPath.value = [];\n }\n\n function isSubmenuOpen(path: ItemPath) {\n return path.length > 0 && isPathPrefix(path, openSubmenuPath.value);\n }\n\n function closeSubmenusAfter(menuPath: ItemPath) {\n openSubmenuPath.value = [...menuPath];\n }\n\n function openSubmenu(path: ItemPath, focus: SubmenuFocusTarget = DEFAULT_FOCUS_TARGET) {\n const item = getItemAtPath(path);\n if (!item || item.disabled || !hasItemSubmenu(item)) return false;\n\n openSubmenuPath.value = [...path];\n if (focus && !focusItem(focus, path)) focusedPath.value = [...path];\n return true;\n }\n\n function closeSubmenu(path: ItemPath) {\n if (!isSubmenuOpen(path)) return false;\n\n openSubmenuPath.value = getParentPath(path);\n if (isPathPrefix(path, focusedPath.value) && focusedPath.value.length > path.length) {\n focusedPath.value = [...path];\n }\n return true;\n }\n\n function closeCurrentSubmenu() {\n const path =\n focusedPath.value.length > 1 ? getParentPath(focusedPath.value) : focusedPath.value;\n\n if (path.length === 0 || !isSubmenuOpen(path)) return false;\n\n return closeSubmenu(path);\n }\n\n return {\n openSubmenuPath,\n resetSubmenus,\n isSubmenuOpen,\n closeSubmenusAfter,\n openSubmenu,\n closeSubmenu,\n closeCurrentSubmenu,\n };\n}\n","import { computed, ref, useId } from 'vue';\nimport { bem } from '@/utils/bem';\nimport type {\n DropdownMenuContentProps,\n DropdownMenuItem,\n DropdownMenuProps,\n DropdownMenuSlotProps,\n DropdownMenuTriggerProps,\n} from './types';\nimport { DEFAULT_PLACEMENT, hasNestedItems } from './dropdown-menu-utils';\nimport { useDropdownMenuDisclosure } from './useDropdownMenuDisclosure';\nimport { useDropdownMenuDom } from './useDropdownMenuDom';\nimport { useDropdownMenuHoverIntent } from './useDropdownMenuHoverIntent';\nimport { useDropdownMenuInteractions } from './useDropdownMenuInteractions';\nimport { useDropdownMenuNavigation } from './useDropdownMenuNavigation';\nimport { useDropdownMenuRenderItems } from './useDropdownMenuRenderItems';\nimport { useDropdownSubmenus } from './useDropdownSubmenus';\n\nexport function useDropdownMenu(\n props: Readonly<DropdownMenuProps>,\n emit: {\n openChange?: (open: boolean) => void;\n select?: (item: DropdownMenuItem) => void;\n } = {},\n) {\n const rootRef = ref<HTMLElement | null>(null);\n const menuRef = ref<HTMLElement | null>(null);\n const uncontrolledOpen = ref(false);\n\n const generatedId = useId();\n const menuId = computed(() => props.id ?? `${generatedId}-menu`);\n const placement = computed(() => props.placement ?? DEFAULT_PLACEMENT);\n const visibleItems = computed(() => props.items ?? []);\n const isDisabled = computed(() => Boolean(props.disabled));\n const isOpen = computed(() => props.open ?? uncontrolledOpen.value);\n const isVisible = computed(() => isOpen.value && !isDisabled.value);\n const contentHasSubmenu = computed(() => hasNestedItems(visibleItems.value));\n const isEmpty = computed(() => visibleItems.value.length === 0);\n\n const {\n focusedPath,\n focusedIndex,\n getItemAtPath,\n focusItem,\n resetFocus,\n isItemFocused,\n moveFocus,\n } = useDropdownMenuNavigation(visibleItems);\n\n const submenus = useDropdownSubmenus({\n focusedPath,\n getItemAtPath,\n focusItem,\n });\n const { openSubmenuPath, isSubmenuOpen } = submenus;\n\n const {\n activeDescendantId,\n focusMenu,\n focusTrigger,\n getItemId,\n getSubmenuId,\n getItemElement,\n getSubmenuElement,\n isSubmenuOpeningLeft,\n getMenuActiveDescendant,\n } = useDropdownMenuDom({\n menuId,\n rootRef,\n menuRef,\n placement,\n focusedPath,\n });\n\n const hoverIntent = useDropdownMenuHoverIntent({\n openSubmenuPath,\n getItemElement,\n getSubmenuElement,\n });\n\n const disclosure = useDropdownMenuDisclosure({\n props,\n emit,\n rootRef,\n uncontrolledOpen,\n isDisabled,\n isOpen,\n isVisible,\n focusedPath,\n resetFocus,\n resetSubmenus: submenus.resetSubmenus,\n resetHoverIntent: hoverIntent.resetHoverIntent,\n focusItem,\n focusMenu,\n focusTrigger,\n });\n const { open, close, toggle } = disclosure;\n\n const {\n activateItem,\n selectItem,\n openSubmenu,\n closeSubmenu,\n focusHoveredItem,\n onTriggerClick,\n onTriggerKeydown,\n onMenuKeydown,\n onMenuMousemove,\n onMenuMouseleave,\n } = useDropdownMenuInteractions({\n props,\n emit,\n isDisabled,\n focusedPath,\n openSubmenuPath,\n getItemAtPath,\n focusItem,\n moveFocus,\n submenus,\n hoverIntent,\n disclosure,\n isSubmenuOpeningLeft,\n });\n\n const rootClass = computed(() =>\n bem('rp-dropdown-menu', {\n [`placement-${placement.value}`]: true,\n open: isVisible.value,\n disabled: isDisabled.value,\n }),\n );\n\n const contentClass = computed(() =>\n bem('rp-dropdown-menu__content', {\n 'has-submenu': contentHasSubmenu.value,\n }),\n );\n\n const triggerProps = computed<DropdownMenuTriggerProps>(() => ({\n 'aria-controls': isDisabled.value ? undefined : menuId.value,\n 'aria-expanded': isDisabled.value ? undefined : isVisible.value,\n 'aria-haspopup': 'menu',\n disabled: isDisabled.value || undefined,\n onClick: onTriggerClick,\n onKeydown: onTriggerKeydown,\n }));\n\n const contentProps = computed<DropdownMenuContentProps>(() => ({\n id: menuId.value,\n role: 'menu',\n tabindex: -1,\n 'aria-label': props.ariaLabel || undefined,\n 'aria-activedescendant': activeDescendantId.value,\n onKeydown: onMenuKeydown,\n onMousemove: onMenuMousemove,\n onMouseleave: onMenuMouseleave,\n }));\n\n const slotProps = computed<DropdownMenuSlotProps>(() => ({\n triggerProps: triggerProps.value,\n isOpen: isVisible.value,\n open,\n close,\n toggle,\n }));\n\n const { renderedItems, getItemProps, getItemSlotProps } = useDropdownMenuRenderItems({\n items: visibleItems,\n getItemId,\n getSubmenuId,\n getMenuActiveDescendant,\n isItemFocused,\n isSubmenuOpen,\n activateItem,\n focusHoveredItem,\n selectItem,\n openSubmenu,\n closeSubmenu,\n close,\n });\n\n return {\n rootRef,\n menuRef,\n menuId,\n isVisible,\n isEmpty,\n visibleItems,\n renderedItems,\n focusedIndex,\n focusedPath,\n activeDescendantId,\n rootClass,\n contentClass,\n triggerProps,\n contentProps,\n slotProps,\n open,\n close,\n toggle,\n selectItem,\n openSubmenu,\n closeSubmenu,\n onItemMouseenter: focusHoveredItem,\n onTriggerKeydown,\n onMenuKeydown,\n getItemProps,\n getItemSlotProps,\n };\n}\n","<template>\n <span ref=\"rootRef\" :class=\"rootClass\">\n <slot v-bind=\"slotProps\" />\n\n <Transition name=\"rp-dropdown-menu-content\">\n <div v-if=\"isVisible\" ref=\"menuRef\" :class=\"contentClass\" v-bind=\"contentProps\">\n <div v-if=\"isEmpty\" class=\"rp-dropdown-menu__empty\">\n <slot name=\"empty\">No actions</slot>\n </div>\n\n <DropdownMenuItems :items=\"renderedItems\">\n <template #item=\"itemSlotProps\">\n <slot name=\"item\" v-bind=\"itemSlotProps\">\n <span class=\"rp-dropdown-menu__label\">{{\n itemSlotProps.item.label\n }}</span>\n <kbd\n v-if=\"itemSlotProps.item.shortcut\"\n class=\"rp-dropdown-menu__shortcut\"\n >\n {{ itemSlotProps.item.shortcut }}\n </kbd>\n </slot>\n <span\n v-if=\"itemSlotProps.hasSubmenu\"\n class=\"rp-dropdown-menu__submenu-icon\"\n aria-hidden=\"true\"\n >\n <IconChevronRight />\n </span>\n </template>\n </DropdownMenuItems>\n </div>\n </Transition>\n </span>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport IconChevronRight from '~icons/lucide/chevron-right';\nimport DropdownMenuItems from './dropdown-menu-items';\nimport { useDropdownMenu } from './useDropdownMenu';\nimport type {\n DropdownMenuItem,\n DropdownMenuItemSlotProps,\n DropdownMenuProps,\n DropdownMenuSlotProps,\n} from './types';\n\ndefineOptions({ name: 'RpDropdownMenu' });\n\nconst props = withDefaults(defineProps<DropdownMenuProps>(), {\n items: () => [],\n placement: 'bottom-start',\n open: undefined,\n disabled: false,\n closeOnSelect: true,\n});\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n select: [item: DropdownMenuItem];\n}>();\n\ndefineSlots<{\n default(props: DropdownMenuSlotProps): unknown;\n item?(props: DropdownMenuItemSlotProps): unknown;\n empty?(): unknown;\n}>();\n\nconst {\n rootRef,\n menuRef,\n isVisible,\n isEmpty,\n renderedItems,\n rootClass,\n contentClass,\n contentProps,\n slotProps,\n} = useDropdownMenu(props, {\n openChange: (open) => emit('update:open', open),\n select: (item) => emit('select', item),\n});\n\nvoid rootRef;\nvoid menuRef;\n</script>\n\n<style src=\"./dropdown-menu.scss\" lang=\"scss\"></style>\n","<template>\n <span ref=\"rootRef\" :class=\"rootClass\">\n <slot v-bind=\"slotProps\" />\n\n <Transition name=\"rp-dropdown-menu-content\">\n <div v-if=\"isVisible\" ref=\"menuRef\" :class=\"contentClass\" v-bind=\"contentProps\">\n <div v-if=\"isEmpty\" class=\"rp-dropdown-menu__empty\">\n <slot name=\"empty\">No actions</slot>\n </div>\n\n <DropdownMenuItems :items=\"renderedItems\">\n <template #item=\"itemSlotProps\">\n <slot name=\"item\" v-bind=\"itemSlotProps\">\n <span class=\"rp-dropdown-menu__label\">{{\n itemSlotProps.item.label\n }}</span>\n <kbd\n v-if=\"itemSlotProps.item.shortcut\"\n class=\"rp-dropdown-menu__shortcut\"\n >\n {{ itemSlotProps.item.shortcut }}\n </kbd>\n </slot>\n <span\n v-if=\"itemSlotProps.hasSubmenu\"\n class=\"rp-dropdown-menu__submenu-icon\"\n aria-hidden=\"true\"\n >\n <IconChevronRight />\n </span>\n </template>\n </DropdownMenuItems>\n </div>\n </Transition>\n </span>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport IconChevronRight from '~icons/lucide/chevron-right';\nimport DropdownMenuItems from './dropdown-menu-items';\nimport { useDropdownMenu } from './useDropdownMenu';\nimport type {\n DropdownMenuItem,\n DropdownMenuItemSlotProps,\n DropdownMenuProps,\n DropdownMenuSlotProps,\n} from './types';\n\ndefineOptions({ name: 'RpDropdownMenu' });\n\nconst props = withDefaults(defineProps<DropdownMenuProps>(), {\n items: () => [],\n placement: 'bottom-start',\n open: undefined,\n disabled: false,\n closeOnSelect: true,\n});\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n select: [item: DropdownMenuItem];\n}>();\n\ndefineSlots<{\n default(props: DropdownMenuSlotProps): unknown;\n item?(props: DropdownMenuItemSlotProps): unknown;\n empty?(): unknown;\n}>();\n\nconst {\n rootRef,\n menuRef,\n isVisible,\n isEmpty,\n renderedItems,\n rootClass,\n contentClass,\n contentProps,\n slotProps,\n} = useDropdownMenu(props, {\n openChange: (open) => emit('update:open', open),\n select: (item) => emit('select', item),\n});\n\nvoid rootRef;\nvoid menuRef;\n</script>\n\n<style src=\"./dropdown-menu.scss\" lang=\"scss\"></style>\n"],"mappings":"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"}
package/dist/field.css CHANGED
@@ -1,4 +1,4 @@
1
- .rp-field[data-v-b8c3dcbe] {
1
+ .rp-field[data-v-50e7f3a5] {
2
2
  --_rp-field-danger: var(--rp-color-danger);
3
3
  display: grid;
4
4
  gap: var(--rp-spacing-1);
@@ -6,10 +6,10 @@
6
6
  font-family: var(--rp-font-family);
7
7
  color: var(--rp-color-text);
8
8
  }
9
- html.dark .rp-field[data-v-b8c3dcbe] {
9
+ html.dark .rp-field[data-v-50e7f3a5] {
10
10
  --_rp-field-danger: var(--rp-color-danger-fg);
11
11
  }
12
- .rp-field__label[data-v-b8c3dcbe] {
12
+ .rp-field__label[data-v-50e7f3a5] {
13
13
  display: inline-flex;
14
14
  width: fit-content;
15
15
  align-items: center;
@@ -19,22 +19,22 @@ html.dark .rp-field[data-v-b8c3dcbe] {
19
19
  font-weight: var(--rp-font-weight-medium);
20
20
  line-height: var(--rp-line-height-normal);
21
21
  }
22
- .rp-field__required[data-v-b8c3dcbe] {
22
+ .rp-field__required[data-v-50e7f3a5] {
23
23
  color: var(--_rp-field-danger);
24
24
  line-height: var(--rp-line-height-none);
25
25
  }
26
- .rp-field__control[data-v-b8c3dcbe] {
26
+ .rp-field__control[data-v-50e7f3a5] {
27
27
  min-width: 0;
28
28
  }
29
- .rp-field__description[data-v-b8c3dcbe], .rp-field__message[data-v-b8c3dcbe] {
29
+ .rp-field__description[data-v-50e7f3a5], .rp-field__message[data-v-50e7f3a5] {
30
30
  margin: 0;
31
31
  color: var(--rp-color-text-secondary);
32
32
  font-size: var(--rp-font-size-sm);
33
33
  line-height: var(--rp-line-height-normal);
34
34
  }
35
- .rp-field--invalid .rp-field__message[data-v-b8c3dcbe] {
35
+ .rp-field--invalid .rp-field__message[data-v-50e7f3a5] {
36
36
  color: var(--_rp-field-danger);
37
37
  }
38
- .rp-field--disabled .rp-field__label[data-v-b8c3dcbe], .rp-field--disabled .rp-field__description[data-v-b8c3dcbe], .rp-field--disabled .rp-field__message[data-v-b8c3dcbe] {
38
+ .rp-field--disabled .rp-field__label[data-v-50e7f3a5], .rp-field--disabled .rp-field__description[data-v-50e7f3a5], .rp-field--disabled .rp-field__message[data-v-50e7f3a5] {
39
39
  color: var(--rp-color-text-disabled);
40
40
  }
package/dist/field.js CHANGED
@@ -1,13 +1,57 @@
1
1
  import './field.css';
2
- import { n as bem, t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
3
- import { child, computed, createIf, createSlot, defineVaporComponent, renderEffect, setClass, setInsertionState, setProp, setText, template, toDisplayString, useId, useSlots } from "vue";
2
+ import { t as bem } from "./bem.js";
3
+ import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
4
+ import { child, computed, createIf, createSlot, defineVaporComponent, renderEffect, setClass, setInsertionState, setProp, setText, template, toDisplayString, unref, useId, useSlots } from "vue";
5
+ //#region src/components/field/useField.ts
6
+ function useField(props) {
7
+ const slots = useSlots();
8
+ const generatedId = useId();
9
+ const controlId = computed(() => props.id ?? `${generatedId}-control`);
10
+ const labelId = computed(() => `${controlId.value}-label`);
11
+ const descriptionId = computed(() => `${controlId.value}-description`);
12
+ const messageId = computed(() => `${controlId.value}-message`);
13
+ const isInvalid = computed(() => Boolean(props.invalid || props.error));
14
+ const messageText = computed(() => props.error || props.message);
15
+ const hasLabel = computed(() => Boolean(props.label || slots.label));
16
+ const hasDescription = computed(() => Boolean(props.description || slots.description));
17
+ const hasMessage = computed(() => Boolean(messageText.value || slots.message));
18
+ const controlLabelledby = computed(() => hasLabel.value ? labelId.value : void 0);
19
+ const controlDescribedby = computed(() => [hasDescription.value ? descriptionId.value : void 0, hasMessage.value ? messageId.value : void 0].filter(Boolean).join(" ") || void 0);
20
+ return {
21
+ controlId,
22
+ labelId,
23
+ descriptionId,
24
+ messageId,
25
+ isInvalid,
26
+ messageText,
27
+ hasLabel,
28
+ hasDescription,
29
+ hasMessage,
30
+ controlLabelledby,
31
+ controlDescribedby,
32
+ rootClass: computed(() => bem("rp-field", {
33
+ disabled: props.disabled,
34
+ required: props.required,
35
+ invalid: isInvalid.value
36
+ })),
37
+ controlProps: computed(() => ({
38
+ id: controlId.value,
39
+ disabled: props.disabled || void 0,
40
+ required: props.required || void 0,
41
+ invalid: isInvalid.value || void 0,
42
+ labelledby: controlLabelledby.value,
43
+ describedby: controlDescribedby.value
44
+ }))
45
+ };
46
+ }
47
+ //#endregion
4
48
  //#region src/components/field/field.vue?vue&type=script&setup=true&vapor=true&lang.ts
5
49
  var t0 = template(" ");
6
- var t1 = template("<span data-v-b8c3dcbe class=rp-field__required aria-hidden=true>*", 2);
7
- var t2 = template("<label data-v-b8c3dcbe class=rp-field__label>");
8
- var t3 = template("<p data-v-b8c3dcbe class=rp-field__description>");
9
- var t4 = template("<p data-v-b8c3dcbe class=rp-field__message>");
10
- var t5 = template("<div data-v-b8c3dcbe><div data-v-b8c3dcbe class=rp-field__control></div>", 1);
50
+ var t1 = template("<span data-v-50e7f3a5 class=rp-field__required aria-hidden=true>*", 2);
51
+ var t2 = template("<label data-v-50e7f3a5 class=rp-field__label>");
52
+ var t3 = template("<p data-v-50e7f3a5 class=rp-field__description>");
53
+ var t4 = template("<p data-v-50e7f3a5 class=rp-field__message>");
54
+ var t5 = template("<div data-v-50e7f3a5><div data-v-50e7f3a5 class=rp-field__control></div>", 1);
11
55
  //#endregion
12
56
  //#region src/components/field/field.vue
13
57
  var field_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -33,42 +77,16 @@ var field_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
33
77
  }
34
78
  },
35
79
  setup(__props) {
36
- const props = __props;
37
- const slots = useSlots();
38
- const generatedId = useId();
39
- const controlId = computed(() => props.id ?? `${generatedId}-control`);
40
- const labelId = computed(() => `${controlId.value}-label`);
41
- const descriptionId = computed(() => `${controlId.value}-description`);
42
- const messageId = computed(() => `${controlId.value}-message`);
43
- const isInvalid = computed(() => Boolean(props.invalid || props.error));
44
- const messageText = computed(() => props.error || props.message);
45
- const hasLabel = computed(() => Boolean(props.label || slots.label));
46
- const hasDescription = computed(() => Boolean(props.description || slots.description));
47
- const hasMessage = computed(() => Boolean(messageText.value || slots.message));
48
- const controlLabelledby = computed(() => hasLabel.value ? labelId.value : void 0);
49
- const controlDescribedby = computed(() => [hasDescription.value ? descriptionId.value : void 0, hasMessage.value ? messageId.value : void 0].filter(Boolean).join(" ") || void 0);
50
- const rootClass = computed(() => bem("rp-field", {
51
- disabled: props.disabled,
52
- required: props.required,
53
- invalid: isInvalid.value
54
- }));
55
- const controlProps = computed(() => ({
56
- id: controlId.value,
57
- disabled: props.disabled || void 0,
58
- required: props.required || void 0,
59
- invalid: isInvalid.value || void 0,
60
- labelledby: controlLabelledby.value,
61
- describedby: controlDescribedby.value
62
- }));
80
+ const { controlId, labelId, descriptionId, messageId, isInvalid, messageText, hasLabel, hasDescription, hasMessage, controlLabelledby, controlDescribedby, rootClass, controlProps } = useField(__props);
63
81
  const n23 = t5();
64
82
  const n10 = child(n23, 1);
65
- renderEffect(() => setClass(n23, rootClass.value));
83
+ renderEffect(() => setClass(n23, unref(rootClass)));
66
84
  setInsertionState(n23, 0, 0);
67
- createIf(() => hasLabel.value, () => {
85
+ createIf(() => unref(hasLabel), () => {
68
86
  const n8 = t2();
69
87
  renderEffect(() => {
70
- setProp(n8, "id", labelId.value);
71
- setProp(n8, "for", controlId.value);
88
+ setProp(n8, "id", unref(labelId));
89
+ setProp(n8, "for", unref(controlId));
72
90
  });
73
91
  setInsertionState(n8, null, 0);
74
92
  createSlot("label", null, () => {
@@ -84,18 +102,18 @@ var field_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
84
102
  });
85
103
  setInsertionState(n10, null, 0);
86
104
  createSlot("default", {
87
- id: () => controlId.value,
105
+ id: () => unref(controlId),
88
106
  disabled: () => __props.disabled || void 0,
89
107
  required: () => __props.required || void 0,
90
- invalid: () => isInvalid.value || void 0,
91
- labelledby: () => controlLabelledby.value,
92
- describedby: () => controlDescribedby.value,
93
- controlProps: () => controlProps.value
108
+ invalid: () => unref(isInvalid) || void 0,
109
+ labelledby: () => unref(controlLabelledby),
110
+ describedby: () => unref(controlDescribedby),
111
+ controlProps: () => unref(controlProps)
94
112
  }, null, 1);
95
113
  setInsertionState(n23, null, 2);
96
- createIf(() => hasDescription.value, () => {
114
+ createIf(() => unref(hasDescription), () => {
97
115
  const n16 = t3();
98
- renderEffect(() => setProp(n16, "id", descriptionId.value));
116
+ renderEffect(() => setProp(n16, "id", unref(descriptionId)));
99
117
  setInsertionState(n16, null, 0);
100
118
  createSlot("description", null, () => {
101
119
  const n15 = t0();
@@ -105,23 +123,23 @@ var field_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
105
123
  return n16;
106
124
  });
107
125
  setInsertionState(n23, null, 3);
108
- createIf(() => hasMessage.value, () => {
126
+ createIf(() => unref(hasMessage), () => {
109
127
  const n22 = t4();
110
128
  renderEffect(() => {
111
- setProp(n22, "id", messageId.value);
112
- setProp(n22, "role", isInvalid.value ? "alert" : void 0);
129
+ setProp(n22, "id", unref(messageId));
130
+ setProp(n22, "role", unref(isInvalid) ? "alert" : void 0);
113
131
  });
114
132
  setInsertionState(n22, null, 0);
115
133
  createSlot("message", null, () => {
116
134
  const n21 = t0();
117
- renderEffect(() => setText(n21, toDisplayString(messageText.value)));
135
+ renderEffect(() => setText(n21, toDisplayString(unref(messageText))));
118
136
  return n21;
119
137
  }, 1);
120
138
  return n22;
121
139
  });
122
140
  return n23;
123
141
  }
124
- }), [["__scopeId", "data-v-b8c3dcbe"]]);
142
+ }), [["__scopeId", "data-v-50e7f3a5"]]);
125
143
  //#endregion
126
144
  export { field_default as t };
127
145
 
package/dist/field.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"field.js","names":[],"sources":["../src/components/field/field.vue","../src/components/field/field.vue"],"sourcesContent":["<template>\n <div :class=\"rootClass\">\n <label v-if=\"hasLabel\" :id=\"labelId\" class=\"rp-field__label\" :for=\"controlId\">\n <slot name=\"label\">{{ label }}</slot>\n <span v-if=\"required\" class=\"rp-field__required\" aria-hidden=\"true\">*</span>\n </label>\n\n <div class=\"rp-field__control\">\n <slot\n :id=\"controlId\"\n :disabled=\"disabled || undefined\"\n :required=\"required || undefined\"\n :invalid=\"isInvalid || undefined\"\n :labelledby=\"controlLabelledby\"\n :describedby=\"controlDescribedby\"\n :control-props=\"controlProps\"\n />\n </div>\n\n <p v-if=\"hasDescription\" :id=\"descriptionId\" class=\"rp-field__description\">\n <slot name=\"description\">{{ description }}</slot>\n </p>\n\n <p\n v-if=\"hasMessage\"\n :id=\"messageId\"\n class=\"rp-field__message\"\n :role=\"isInvalid ? 'alert' : undefined\"\n >\n <slot name=\"message\">{{ messageText }}</slot>\n </p>\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { computed, useId, useSlots } from 'vue';\nimport { bem } from '@/utils/bem';\nimport type { FieldControlProps, FieldProps } from './types';\n\ndefineOptions({ name: 'RpField' });\n\nconst props = withDefaults(defineProps<FieldProps>(), {\n label: '',\n description: '',\n message: '',\n error: '',\n disabled: undefined,\n required: false,\n invalid: undefined,\n});\n\nconst slots = useSlots();\nconst generatedId = useId();\n\nconst controlId = computed(() => props.id ?? `${generatedId}-control`);\nconst labelId = computed(() => `${controlId.value}-label`);\nconst descriptionId = computed(() => `${controlId.value}-description`);\nconst messageId = computed(() => `${controlId.value}-message`);\n\nconst isInvalid = computed(() => Boolean(props.invalid || props.error));\nconst messageText = computed(() => props.error || props.message);\n\nconst hasLabel = computed(() => Boolean(props.label || slots.label));\nconst hasDescription = computed(() => Boolean(props.description || slots.description));\nconst hasMessage = computed(() => Boolean(messageText.value || slots.message));\n\nconst controlLabelledby = computed(() => (hasLabel.value ? labelId.value : undefined));\nconst controlDescribedby = computed(\n () =>\n [\n hasDescription.value ? descriptionId.value : undefined,\n hasMessage.value ? messageId.value : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined,\n);\n\nconst rootClass = computed(() =>\n bem('rp-field', {\n disabled: props.disabled,\n required: props.required,\n invalid: isInvalid.value,\n }),\n);\n\nconst controlProps = computed<FieldControlProps>(() => ({\n id: controlId.value,\n disabled: props.disabled || undefined,\n required: props.required || undefined,\n invalid: isInvalid.value || undefined,\n labelledby: controlLabelledby.value,\n describedby: controlDescribedby.value,\n}));\n</script>\n\n<style src=\"./field.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div :class=\"rootClass\">\n <label v-if=\"hasLabel\" :id=\"labelId\" class=\"rp-field__label\" :for=\"controlId\">\n <slot name=\"label\">{{ label }}</slot>\n <span v-if=\"required\" class=\"rp-field__required\" aria-hidden=\"true\">*</span>\n </label>\n\n <div class=\"rp-field__control\">\n <slot\n :id=\"controlId\"\n :disabled=\"disabled || undefined\"\n :required=\"required || undefined\"\n :invalid=\"isInvalid || undefined\"\n :labelledby=\"controlLabelledby\"\n :describedby=\"controlDescribedby\"\n :control-props=\"controlProps\"\n />\n </div>\n\n <p v-if=\"hasDescription\" :id=\"descriptionId\" class=\"rp-field__description\">\n <slot name=\"description\">{{ description }}</slot>\n </p>\n\n <p\n v-if=\"hasMessage\"\n :id=\"messageId\"\n class=\"rp-field__message\"\n :role=\"isInvalid ? 'alert' : undefined\"\n >\n <slot name=\"message\">{{ messageText }}</slot>\n </p>\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { computed, useId, useSlots } from 'vue';\nimport { bem } from '@/utils/bem';\nimport type { FieldControlProps, FieldProps } from './types';\n\ndefineOptions({ name: 'RpField' });\n\nconst props = withDefaults(defineProps<FieldProps>(), {\n label: '',\n description: '',\n message: '',\n error: '',\n disabled: undefined,\n required: false,\n invalid: undefined,\n});\n\nconst slots = useSlots();\nconst generatedId = useId();\n\nconst controlId = computed(() => props.id ?? `${generatedId}-control`);\nconst labelId = computed(() => `${controlId.value}-label`);\nconst descriptionId = computed(() => `${controlId.value}-description`);\nconst messageId = computed(() => `${controlId.value}-message`);\n\nconst isInvalid = computed(() => Boolean(props.invalid || props.error));\nconst messageText = computed(() => props.error || props.message);\n\nconst hasLabel = computed(() => Boolean(props.label || slots.label));\nconst hasDescription = computed(() => Boolean(props.description || slots.description));\nconst hasMessage = computed(() => Boolean(messageText.value || slots.message));\n\nconst controlLabelledby = computed(() => (hasLabel.value ? labelId.value : undefined));\nconst controlDescribedby = computed(\n () =>\n [\n hasDescription.value ? descriptionId.value : undefined,\n hasMessage.value ? messageId.value : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined,\n);\n\nconst rootClass = computed(() =>\n bem('rp-field', {\n disabled: props.disabled,\n required: props.required,\n invalid: isInvalid.value,\n }),\n);\n\nconst controlProps = computed<FieldControlProps>(() => ({\n id: controlId.value,\n disabled: props.disabled || undefined,\n required: props.required || undefined,\n invalid: isInvalid.value || undefined,\n labelledby: controlLabelledby.value,\n describedby: controlDescribedby.value,\n}));\n</script>\n\n<style src=\"./field.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyCA,MAAM,QAAQ;EAUd,MAAM,QAAQ,SAAS;EACvB,MAAM,cAAc,MAAM;EAE1B,MAAM,YAAY,eAAe,MAAM,MAAM,GAAG,YAAY,SAAS;EACrE,MAAM,UAAU,eAAe,GAAG,UAAU,MAAM,OAAO;EACzD,MAAM,gBAAgB,eAAe,GAAG,UAAU,MAAM,aAAa;EACrE,MAAM,YAAY,eAAe,GAAG,UAAU,MAAM,SAAS;EAE7D,MAAM,YAAY,eAAe,QAAQ,MAAM,WAAW,MAAM,KAAK,CAAC;EACtE,MAAM,cAAc,eAAe,MAAM,SAAS,MAAM,OAAO;EAE/D,MAAM,WAAW,eAAe,QAAQ,MAAM,SAAS,MAAM,KAAK,CAAC;EACnE,MAAM,iBAAiB,eAAe,QAAQ,MAAM,eAAe,MAAM,WAAW,CAAC;EACrF,MAAM,aAAa,eAAe,QAAQ,YAAY,SAAS,MAAM,OAAO,CAAC;EAE7E,MAAM,oBAAoB,eAAgB,SAAS,QAAQ,QAAQ,QAAQ,KAAA,CAAU;EACrF,MAAM,qBAAqB,eAEnB,CACI,eAAe,QAAQ,cAAc,QAAQ,KAAA,GAC7C,WAAW,QAAQ,UAAU,QAAQ,KAAA,CACzC,CAAA,CACK,OAAO,OAAO,CAAA,CACd,KAAK,GAAG,KAAK,KAAA,CAC1B;EAEA,MAAM,YAAY,eACd,IAAI,YAAY;GACZ,UAAU,MAAM;GAChB,UAAU,MAAM;GAChB,SAAS,UAAU;EACvB,CAAC,CACL;EAEA,MAAM,eAAe,gBAAmC;GACpD,IAAI,UAAU;GACd,UAAU,MAAM,YAAY,KAAA;GAC5B,UAAU,MAAM,YAAY,KAAA;GAC5B,SAAS,UAAU,SAAS,KAAA;GAC5B,YAAY,kBAAkB;GAC9B,aAAa,mBAAmB;EACpC,EAAE;;;mCA3Fe,UAAA,KAAS,CAAA;;iBACL,SAAA,aAAQ;;;gBAAG,MAAI,QAAA,KAAO;gBAA2B,OAAK,UAAA,KAAS;;;cAClE,SAAY,YAAA;;mDAAI,QAAA,KAAK,CAAA,CAAA;;;;kBACf,QAAA,gBAAQ;;;;;;;GAKf,UAAI,UAAA;GACJ,gBAAU,QAAA,YAAY,KAAA;GACtB,gBAAU,QAAA,YAAY,KAAA;GACtB,eAAS,UAAA,SAAa,KAAA;GACtB,kBAAY,kBAAA;GACZ,mBAAa,mBAAA;GACb,oBAAe,aAAA;;;iBAIf,eAAA,aAAc;;mCAAG,MAAI,cAAA,KAAa,CAAA;;cACjC,eAAkB,YAAA;;oDAAI,QAAA,WAAW,CAAA,CAAA;;;;;;iBAIjC,WAAA,aAAU;;;iBACf,MAAI,UAAA,KAAS;iBAEb,QAAM,UAAA,QAAS,UAAa,KAAA,CAAS;;;cAEhC,WAAc,YAAA;;oDAAI,YAAA,KAAW,CAAA,CAAA"}
1
+ {"version":3,"file":"field.js","names":[],"sources":["../src/components/field/useField.ts","../src/components/field/field.vue","../src/components/field/field.vue"],"sourcesContent":["import { computed, useId, useSlots } from 'vue';\nimport { bem } from '@/utils/bem';\nimport type { FieldControlProps, FieldProps } from './types';\n\nexport function useField(props: Readonly<FieldProps>) {\n const slots = useSlots();\n const generatedId = useId();\n\n const controlId = computed(() => props.id ?? `${generatedId}-control`);\n const labelId = computed(() => `${controlId.value}-label`);\n const descriptionId = computed(() => `${controlId.value}-description`);\n const messageId = computed(() => `${controlId.value}-message`);\n\n const isInvalid = computed(() => Boolean(props.invalid || props.error));\n const messageText = computed(() => props.error || props.message);\n\n const hasLabel = computed(() => Boolean(props.label || slots.label));\n const hasDescription = computed(() => Boolean(props.description || slots.description));\n const hasMessage = computed(() => Boolean(messageText.value || slots.message));\n\n const controlLabelledby = computed(() => (hasLabel.value ? labelId.value : undefined));\n const controlDescribedby = computed(\n () =>\n [\n hasDescription.value ? descriptionId.value : undefined,\n hasMessage.value ? messageId.value : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined,\n );\n\n const rootClass = computed(() =>\n bem('rp-field', {\n disabled: props.disabled,\n required: props.required,\n invalid: isInvalid.value,\n }),\n );\n\n const controlProps = computed<FieldControlProps>(() => ({\n id: controlId.value,\n disabled: props.disabled || undefined,\n required: props.required || undefined,\n invalid: isInvalid.value || undefined,\n labelledby: controlLabelledby.value,\n describedby: controlDescribedby.value,\n }));\n\n return {\n controlId,\n labelId,\n descriptionId,\n messageId,\n isInvalid,\n messageText,\n hasLabel,\n hasDescription,\n hasMessage,\n controlLabelledby,\n controlDescribedby,\n rootClass,\n controlProps,\n };\n}\n","<template>\n <div :class=\"rootClass\">\n <label v-if=\"hasLabel\" :id=\"labelId\" class=\"rp-field__label\" :for=\"controlId\">\n <slot name=\"label\">{{ label }}</slot>\n <span v-if=\"required\" class=\"rp-field__required\" aria-hidden=\"true\">*</span>\n </label>\n\n <div class=\"rp-field__control\">\n <slot\n :id=\"controlId\"\n :disabled=\"disabled || undefined\"\n :required=\"required || undefined\"\n :invalid=\"isInvalid || undefined\"\n :labelledby=\"controlLabelledby\"\n :describedby=\"controlDescribedby\"\n :control-props=\"controlProps\"\n />\n </div>\n\n <p v-if=\"hasDescription\" :id=\"descriptionId\" class=\"rp-field__description\">\n <slot name=\"description\">{{ description }}</slot>\n </p>\n\n <p\n v-if=\"hasMessage\"\n :id=\"messageId\"\n class=\"rp-field__message\"\n :role=\"isInvalid ? 'alert' : undefined\"\n >\n <slot name=\"message\">{{ messageText }}</slot>\n </p>\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useField } from './useField';\nimport type { FieldProps } from './types';\n\ndefineOptions({ name: 'RpField' });\n\nconst props = withDefaults(defineProps<FieldProps>(), {\n label: '',\n description: '',\n message: '',\n error: '',\n disabled: undefined,\n required: false,\n invalid: undefined,\n});\n\nconst {\n controlId,\n labelId,\n descriptionId,\n messageId,\n isInvalid,\n messageText,\n hasLabel,\n hasDescription,\n hasMessage,\n controlLabelledby,\n controlDescribedby,\n rootClass,\n controlProps,\n} = useField(props);\n</script>\n\n<style src=\"./field.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div :class=\"rootClass\">\n <label v-if=\"hasLabel\" :id=\"labelId\" class=\"rp-field__label\" :for=\"controlId\">\n <slot name=\"label\">{{ label }}</slot>\n <span v-if=\"required\" class=\"rp-field__required\" aria-hidden=\"true\">*</span>\n </label>\n\n <div class=\"rp-field__control\">\n <slot\n :id=\"controlId\"\n :disabled=\"disabled || undefined\"\n :required=\"required || undefined\"\n :invalid=\"isInvalid || undefined\"\n :labelledby=\"controlLabelledby\"\n :describedby=\"controlDescribedby\"\n :control-props=\"controlProps\"\n />\n </div>\n\n <p v-if=\"hasDescription\" :id=\"descriptionId\" class=\"rp-field__description\">\n <slot name=\"description\">{{ description }}</slot>\n </p>\n\n <p\n v-if=\"hasMessage\"\n :id=\"messageId\"\n class=\"rp-field__message\"\n :role=\"isInvalid ? 'alert' : undefined\"\n >\n <slot name=\"message\">{{ messageText }}</slot>\n </p>\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useField } from './useField';\nimport type { FieldProps } from './types';\n\ndefineOptions({ name: 'RpField' });\n\nconst props = withDefaults(defineProps<FieldProps>(), {\n label: '',\n description: '',\n message: '',\n error: '',\n disabled: undefined,\n required: false,\n invalid: undefined,\n});\n\nconst {\n controlId,\n labelId,\n descriptionId,\n messageId,\n isInvalid,\n messageText,\n hasLabel,\n hasDescription,\n hasMessage,\n controlLabelledby,\n controlDescribedby,\n rootClass,\n controlProps,\n} = useField(props);\n</script>\n\n<style src=\"./field.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;AAIA,SAAgB,SAAS,OAA6B;CAClD,MAAM,QAAQ,SAAS;CACvB,MAAM,cAAc,MAAM;CAE1B,MAAM,YAAY,eAAe,MAAM,MAAM,GAAG,YAAY,SAAS;CACrE,MAAM,UAAU,eAAe,GAAG,UAAU,MAAM,OAAO;CACzD,MAAM,gBAAgB,eAAe,GAAG,UAAU,MAAM,aAAa;CACrE,MAAM,YAAY,eAAe,GAAG,UAAU,MAAM,SAAS;CAE7D,MAAM,YAAY,eAAe,QAAQ,MAAM,WAAW,MAAM,KAAK,CAAC;CACtE,MAAM,cAAc,eAAe,MAAM,SAAS,MAAM,OAAO;CAE/D,MAAM,WAAW,eAAe,QAAQ,MAAM,SAAS,MAAM,KAAK,CAAC;CACnE,MAAM,iBAAiB,eAAe,QAAQ,MAAM,eAAe,MAAM,WAAW,CAAC;CACrF,MAAM,aAAa,eAAe,QAAQ,YAAY,SAAS,MAAM,OAAO,CAAC;CAE7E,MAAM,oBAAoB,eAAgB,SAAS,QAAQ,QAAQ,QAAQ,KAAA,CAAU;CACrF,MAAM,qBAAqB,eAEnB,CACI,eAAe,QAAQ,cAAc,QAAQ,KAAA,GAC7C,WAAW,QAAQ,UAAU,QAAQ,KAAA,CACzC,CAAC,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,KAAK,KAAA,CAC1B;CAmBA,OAAO;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WA7Bc,eACd,IAAI,YAAY;GACZ,UAAU,MAAM;GAChB,UAAU,MAAM;GAChB,SAAS,UAAU;EACvB,CAAC,CAwBD;EACA,cAtBiB,gBAAmC;GACpD,IAAI,UAAU;GACd,UAAU,MAAM,YAAY,KAAA;GAC5B,UAAU,MAAM,YAAY,KAAA;GAC5B,SAAS,UAAU,SAAS,KAAA;GAC5B,YAAY,kBAAkB;GAC9B,aAAa,mBAAmB;EACpC,EAeI;CACJ;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECbA,MAAM,EACF,WACA,SACA,eACA,WACA,WACA,aACA,UACA,gBACA,YACA,mBACA,oBACA,WACA,iBACA,SAAS,OAAK;;;mCA/DD,MAAA,SAAA,CAAS,CAAA;;iBACL,MAAA,QAAA,SAAQ;;;gBAAG,MAAI,MAAA,OAAA,CAAO;gBAA2B,OAAK,MAAA,SAAA,CAAS;;;cAClE,SAAY,YAAA;;mDAAI,QAAA,KAAK,CAAA,CAAA;;;;kBACf,QAAA,gBAAQ;;;;;;;GAKf,UAAI,MAAA,SAAA;GACJ,gBAAU,QAAA,YAAY,KAAA;GACtB,gBAAU,QAAA,YAAY,KAAA;GACtB,eAAS,MAAA,SAAA,KAAa,KAAA;GACtB,kBAAY,MAAA,iBAAA;GACZ,mBAAa,MAAA,kBAAA;GACb,oBAAe,MAAA,YAAA;;;iBAIf,MAAA,cAAA,SAAc;;mCAAG,MAAI,MAAA,aAAA,CAAa,CAAA;;cACjC,eAAkB,YAAA;;oDAAI,QAAA,WAAW,CAAA,CAAA;;;;;;iBAIjC,MAAA,UAAA,SAAU;;;iBACf,MAAI,MAAA,SAAA,CAAS;iBAEb,QAAM,MAAA,SAAA,IAAS,UAAa,KAAA,CAAS;;;cAEhC,WAAc,YAAA;;oDAAI,MAAA,WAAA,CAAW,CAAA,CAAA"}
@@ -352,7 +352,7 @@ to {
352
352
  justify-content: center;
353
353
  line-height: 0;
354
354
  }
355
- .rp-icon-button__icon svg[data-v-7005752e-s] {
355
+ .rp-icon-button__icon[data-v-7005752e] > svg {
356
356
  display: block;
357
357
  width: 1em;
358
358
  height: 1em;
@@ -1,7 +1,8 @@
1
1
  import './icon-button.css';
2
- import { n as loader_circle_default, t as getButtonColorStyle } from "./useButtonColor.js";
2
+ import { t as bem } from "./bem.js";
3
+ import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
3
4
  import { r as isComponentPresetColor } from "./componentColors.js";
4
- import { n as bem, t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
5
+ import { n as loader_circle_default, t as getButtonColorStyle } from "./useButtonColor.js";
5
6
  import { computed, createComponent, createIf, createSlot, defineVaporComponent, renderEffect, setAttr, setClass, setInsertionState, setProp, setStyle, template, unref } from "vue";
6
7
  //#region src/components/icon-button/icon-button.vue?vue&type=script&setup=true&vapor=true&lang.ts
7
8
  var t0 = template("<span data-v-7005752e class=rp-icon-button__icon aria-hidden=true>");
@@ -1 +1 @@
1
- {"version":3,"file":"icon-button.js","names":[],"sources":["../src/components/icon-button/icon-button.vue","../src/components/icon-button/icon-button.vue"],"sourcesContent":["<template>\n <button\n :class=\"rootClass\"\n :style=\"rootStyle\"\n :disabled=\"disabled || loading || undefined\"\n :type=\"type\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-busy=\"loading || undefined\"\n >\n <IconLoaderCircle v-if=\"loading\" class=\"rp-icon-button__spinner\" aria-hidden=\"true\" />\n <span v-else class=\"rp-icon-button__icon\" aria-hidden=\"true\">\n <slot />\n </span>\n </button>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { computed } from 'vue';\nimport IconLoaderCircle from '~icons/lucide/loader-circle';\nimport { isComponentPresetColor } from '@/utils/componentColors';\nimport { bem } from '@/utils/bem';\nimport { getButtonColorStyle } from '../button/useButtonColor';\nimport type { IconButtonProps } from './types';\n\ndefineOptions({ name: 'RpIconButton' });\n\nconst props = withDefaults(defineProps<IconButtonProps>(), {\n type: 'button',\n disabled: false,\n loading: false,\n});\n\nconst rootClass = computed(() => [\n ...bem('rp-button', {\n [props.variant ?? '']: Boolean(props.variant),\n [`color-${props.color}`]: isComponentPresetColor(props.color),\n [`size-${props.size}`]: Boolean(props.size),\n [`radius-${props.radius}`]: Boolean(props.radius),\n }),\n 'rp-icon-button',\n]);\n\nconst rootStyle = computed(() => getButtonColorStyle(props.color));\n</script>\n\n<style src=\"../button/button.scss\" lang=\"scss\" scoped></style>\n<style src=\"./icon-button.scss\" lang=\"scss\" scoped></style>\n","<template>\n <button\n :class=\"rootClass\"\n :style=\"rootStyle\"\n :disabled=\"disabled || loading || undefined\"\n :type=\"type\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-busy=\"loading || undefined\"\n >\n <IconLoaderCircle v-if=\"loading\" class=\"rp-icon-button__spinner\" aria-hidden=\"true\" />\n <span v-else class=\"rp-icon-button__icon\" aria-hidden=\"true\">\n <slot />\n </span>\n </button>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { computed } from 'vue';\nimport IconLoaderCircle from '~icons/lucide/loader-circle';\nimport { isComponentPresetColor } from '@/utils/componentColors';\nimport { bem } from '@/utils/bem';\nimport { getButtonColorStyle } from '../button/useButtonColor';\nimport type { IconButtonProps } from './types';\n\ndefineOptions({ name: 'RpIconButton' });\n\nconst props = withDefaults(defineProps<IconButtonProps>(), {\n type: 'button',\n disabled: false,\n loading: false,\n});\n\nconst rootClass = computed(() => [\n ...bem('rp-button', {\n [props.variant ?? '']: Boolean(props.variant),\n [`color-${props.color}`]: isComponentPresetColor(props.color),\n [`size-${props.size}`]: Boolean(props.size),\n [`radius-${props.radius}`]: Boolean(props.radius),\n }),\n 'rp-icon-button',\n]);\n\nconst rootStyle = computed(() => getButtonColorStyle(props.color));\n</script>\n\n<style src=\"../button/button.scss\" lang=\"scss\" scoped></style>\n<style src=\"./icon-button.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BA,MAAM,QAAQ;EAMd,MAAM,YAAY,eAAe,CAC7B,GAAG,IAAI,aAAa;IACf,MAAM,WAAW,KAAK,QAAQ,MAAM,OAAO;IAC3C,SAAS,MAAM,UAAU,uBAAuB,MAAM,KAAK;IAC3D,QAAQ,MAAM,SAAS,QAAQ,MAAM,IAAI;IACzC,UAAU,MAAM,WAAW,QAAQ,MAAM,MAAM;EACpD,CAAC,GACD,gBACJ,CAAC;EAED,MAAM,YAAY,eAAe,oBAAoB,MAAM,KAAK,CAAC;;;;gBAxCjD,UAAA,KAAS;gBACT,UAAA,KAAS;eAChB,YAAU,QAAA,YAAY,YAAW,KAAA,CAAS;eAC1C,QAAM,QAAA,IAAI;eACV,cAAY,QAAA,aAAa,KAAA,CAAS;eAClC,aAAW,YAAW,KAAA,CAAS;;;iBAER,QAAA,eAAO;;IAAE,OAAM;IAA0B,eAAY"}
1
+ {"version":3,"file":"icon-button.js","names":[],"sources":["../src/components/icon-button/icon-button.vue","../src/components/icon-button/icon-button.vue"],"sourcesContent":["<template>\n <button\n :class=\"rootClass\"\n :style=\"rootStyle\"\n :disabled=\"disabled || loading || undefined\"\n :type=\"type\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-busy=\"loading || undefined\"\n >\n <IconLoaderCircle v-if=\"loading\" class=\"rp-icon-button__spinner\" aria-hidden=\"true\" />\n <span v-else class=\"rp-icon-button__icon\" aria-hidden=\"true\">\n <slot />\n </span>\n </button>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { computed } from 'vue';\nimport IconLoaderCircle from '~icons/lucide/loader-circle';\nimport { isComponentPresetColor } from '@/utils/componentColors';\nimport { bem } from '@/utils/bem';\nimport { getButtonColorStyle } from '../button/useButtonColor';\nimport type { IconButtonProps } from './types';\n\ndefineOptions({ name: 'RpIconButton' });\n\nconst props = withDefaults(defineProps<IconButtonProps>(), {\n type: 'button',\n disabled: false,\n loading: false,\n});\n\nconst rootClass = computed(() => [\n ...bem('rp-button', {\n [props.variant ?? '']: Boolean(props.variant),\n [`color-${props.color}`]: isComponentPresetColor(props.color),\n [`size-${props.size}`]: Boolean(props.size),\n [`radius-${props.radius}`]: Boolean(props.radius),\n }),\n 'rp-icon-button',\n]);\n\nconst rootStyle = computed(() => getButtonColorStyle(props.color));\n</script>\n\n<style src=\"../button/button.scss\" lang=\"scss\" scoped></style>\n<style src=\"./icon-button.scss\" lang=\"scss\" scoped></style>\n","<template>\n <button\n :class=\"rootClass\"\n :style=\"rootStyle\"\n :disabled=\"disabled || loading || undefined\"\n :type=\"type\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-busy=\"loading || undefined\"\n >\n <IconLoaderCircle v-if=\"loading\" class=\"rp-icon-button__spinner\" aria-hidden=\"true\" />\n <span v-else class=\"rp-icon-button__icon\" aria-hidden=\"true\">\n <slot />\n </span>\n </button>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { computed } from 'vue';\nimport IconLoaderCircle from '~icons/lucide/loader-circle';\nimport { isComponentPresetColor } from '@/utils/componentColors';\nimport { bem } from '@/utils/bem';\nimport { getButtonColorStyle } from '../button/useButtonColor';\nimport type { IconButtonProps } from './types';\n\ndefineOptions({ name: 'RpIconButton' });\n\nconst props = withDefaults(defineProps<IconButtonProps>(), {\n type: 'button',\n disabled: false,\n loading: false,\n});\n\nconst rootClass = computed(() => [\n ...bem('rp-button', {\n [props.variant ?? '']: Boolean(props.variant),\n [`color-${props.color}`]: isComponentPresetColor(props.color),\n [`size-${props.size}`]: Boolean(props.size),\n [`radius-${props.radius}`]: Boolean(props.radius),\n }),\n 'rp-icon-button',\n]);\n\nconst rootStyle = computed(() => getButtonColorStyle(props.color));\n</script>\n\n<style src=\"../button/button.scss\" lang=\"scss\" scoped></style>\n<style src=\"./icon-button.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BA,MAAM,QAAQ;EAMd,MAAM,YAAY,eAAe,CAC7B,GAAG,IAAI,aAAa;IACf,MAAM,WAAW,KAAK,QAAQ,MAAM,OAAO;IAC3C,SAAS,MAAM,UAAU,uBAAuB,MAAM,KAAK;IAC3D,QAAQ,MAAM,SAAS,QAAQ,MAAM,IAAI;IACzC,UAAU,MAAM,WAAW,QAAQ,MAAM,MAAM;EACpD,CAAC,GACD,gBACJ,CAAC;EAED,MAAM,YAAY,eAAe,oBAAoB,MAAM,KAAK,CAAC;;;;gBAxCjD,UAAA,KAAS;gBACT,UAAA,KAAS;eAChB,YAAU,QAAA,YAAY,YAAW,KAAA,CAAS;eAC1C,QAAM,QAAA,IAAI;eACV,cAAY,QAAA,aAAa,KAAA,CAAS;eAClC,aAAW,YAAW,KAAA,CAAS;;;iBAER,QAAA,eAAO;;IAAE,OAAM;IAA0B,eAAY"}
package/dist/index.d.ts CHANGED
@@ -1,14 +1,22 @@
1
+ export * from './components/accordion';
2
+ export * from './components/badge';
1
3
  export * from './components/button';
2
4
  export * from './components/button-group';
3
5
  export * from './components/card';
4
6
  export * from './components/checkbox';
7
+ export * from './components/collapse';
8
+ export * from './components/dropdown-menu';
5
9
  export * from './components/field';
6
10
  export * from './components/icon-button';
7
11
  export * from './components/input';
12
+ export * from './components/modal';
13
+ export * from './components/overlay';
14
+ export * from './components/popover';
8
15
  export * from './components/progress';
9
16
  export * from './components/radio';
10
17
  export * from './components/select';
11
18
  export * from './components/slider';
12
19
  export * from './components/switch';
20
+ export * from './components/tabs';
13
21
  export * from './components/textarea';
14
22
  export * from './components/tooltip';
package/dist/index.js CHANGED
@@ -1,16 +1,27 @@
1
+ import { t as useCollapse } from "./useCollapse.js";
2
+ import { i as useAccordionItem, n as accordion_default, r as useAccordion, t as accordion_item_default } from "./accordion.js";
3
+ import { a as badge_default, i as badgeVariants, n as badgeRadiuses, r as badgeSizes, t as badgeColors } from "./badge.js";
1
4
  import { t as button_default } from "./button.js";
2
5
  import { t as button_group_default } from "./button-group.js";
3
6
  import { t as card_default } from "./card.js";
4
7
  import { t as checkbox_default } from "./checkbox.js";
8
+ import { t as collapse_default } from "./collapse.js";
9
+ import { n as useDropdownMenu, t as dropdown_menu_default } from "./dropdown-menu.js";
5
10
  import { t as field_default } from "./field.js";
6
11
  import { t as icon_button_default } from "./icon-button.js";
12
+ import "./components/icon-button/index.js";
7
13
  import { t as input_default } from "./input.js";
14
+ import { t as overlay_default } from "./overlay.js";
15
+ import { t as modal_default } from "./modal.js";
16
+ import "./components/overlay/index.js";
17
+ import { t as popover_default } from "./popover.js";
8
18
  import { i as progress_default, n as progressRadiuses, r as progressSizes, t as progressColors } from "./progress.js";
9
19
  import { n as radio_default, t as radio_group_default } from "./radio.js";
10
20
  import { t as select_default } from "./select.js";
11
21
  import { t as tooltip_default } from "./tooltip.js";
12
22
  import { i as sliderSizes, n as sliderColors, r as sliderOrientations, t as slider_default } from "./slider.js";
13
23
  import { t as switch_default } from "./switch.js";
24
+ import { a as useTabs, c as useTabsTrigger, i as tabs_default, n as tabs_list_default, o as useTabsContent, r as tabs_content_default, s as useTabsList, t as tabs_trigger_default } from "./tabs.js";
14
25
  import { t as textarea_default } from "./textarea.js";
15
26
  import "./components/tooltip/index.js";
16
- export { button_default as Button, button_group_default as ButtonGroup, card_default as Card, checkbox_default as Checkbox, field_default as Field, icon_button_default as IconButton, input_default as Input, progress_default as Progress, radio_default as Radio, radio_group_default as RadioGroup, select_default as Select, slider_default as Slider, switch_default as Switch, textarea_default as Textarea, tooltip_default as Tooltip, progressColors, progressRadiuses, progressSizes, sliderColors, sliderOrientations, sliderSizes };
27
+ export { accordion_default as Accordion, accordion_item_default as AccordionItem, badge_default as Badge, button_default as Button, button_group_default as ButtonGroup, card_default as Card, checkbox_default as Checkbox, collapse_default as Collapse, dropdown_menu_default as DropdownMenu, field_default as Field, icon_button_default as IconButton, input_default as Input, modal_default as Modal, overlay_default as Overlay, popover_default as Popover, progress_default as Progress, radio_default as Radio, radio_group_default as RadioGroup, select_default as Select, slider_default as Slider, switch_default as Switch, tabs_default as Tabs, tabs_content_default as TabsContent, tabs_list_default as TabsList, tabs_trigger_default as TabsTrigger, textarea_default as Textarea, tooltip_default as Tooltip, badgeColors, badgeRadiuses, badgeSizes, badgeVariants, progressColors, progressRadiuses, progressSizes, sliderColors, sliderOrientations, sliderSizes, useAccordion, useAccordionItem, useCollapse, useDropdownMenu, useTabs, useTabsContent, useTabsList, useTabsTrigger };