@hina-ui/vue 1.3.1 → 1.5.0
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.
- package/dist/index.js +4336 -2180
- package/dist/index.js.map +1 -1
- package/dist/types/components/dialog/Dialog.vue.d.ts +3 -1
- package/dist/types/components/dialog/Dialog.vue.d.ts.map +1 -1
- package/dist/types/components/drawer/Drawer.vue.d.ts +21 -14
- package/dist/types/components/drawer/Drawer.vue.d.ts.map +1 -1
- package/dist/types/components/drawer/drawer.variants.d.ts +10 -1
- package/dist/types/components/drawer/drawer.variants.d.ts.map +1 -1
- package/dist/types/components/dropdown-menu/DropdownMenu.vue.d.ts +4 -1
- package/dist/types/components/dropdown-menu/DropdownMenu.vue.d.ts.map +1 -1
- package/dist/types/components/hover-card/HoverCard.vue.d.ts +10 -7
- package/dist/types/components/hover-card/HoverCard.vue.d.ts.map +1 -1
- package/dist/types/components/hover-card/HoverCardAnchor.vue.d.ts +29 -0
- package/dist/types/components/hover-card/HoverCardAnchor.vue.d.ts.map +1 -0
- package/dist/types/components/hover-card/composables/useHoverCardAnchor.d.ts +22 -0
- package/dist/types/components/hover-card/composables/useHoverCardAnchor.d.ts.map +1 -0
- package/dist/types/components/image/Image.vue.d.ts +3 -1
- package/dist/types/components/image/Image.vue.d.ts.map +1 -1
- package/dist/types/components/image/composables/useImageGroupState.d.ts.map +1 -1
- package/dist/types/components/image/image.variants.d.ts +1 -1
- package/dist/types/components/lightbox/Lightbox.vue.d.ts.map +1 -1
- package/dist/types/components/lightbox/LightboxChrome.vue.d.ts +4 -0
- package/dist/types/components/lightbox/LightboxChrome.vue.d.ts.map +1 -1
- package/dist/types/components/lightbox/LightboxToolbar.vue.d.ts +4 -0
- package/dist/types/components/lightbox/LightboxToolbar.vue.d.ts.map +1 -1
- package/dist/types/components/lightbox/composables/useLightboxFrames.d.ts +4 -1
- package/dist/types/components/lightbox/composables/useLightboxFrames.d.ts.map +1 -1
- package/dist/types/components/lightbox/composables/useLightboxLarge.d.ts +1 -0
- package/dist/types/components/lightbox/composables/useLightboxLarge.d.ts.map +1 -1
- package/dist/types/components/lightbox/composables/useLightboxLayout.d.ts +17 -0
- package/dist/types/components/lightbox/composables/useLightboxLayout.d.ts.map +1 -0
- package/dist/types/components/lightbox/composables/useLightboxPhase.d.ts +1 -1
- package/dist/types/components/lightbox/composables/useLightboxPhase.d.ts.map +1 -1
- package/dist/types/components/lightbox/composables/useLightboxPose.d.ts.map +1 -1
- package/dist/types/components/lightbox/composables/useLightboxRotation.d.ts +5 -1
- package/dist/types/components/lightbox/composables/useLightboxRotation.d.ts.map +1 -1
- package/dist/types/components/lightbox/composables/useLightboxZoom.d.ts +10 -1
- package/dist/types/components/lightbox/composables/useLightboxZoom.d.ts.map +1 -1
- package/dist/types/components/lightbox/lightbox.variants.d.ts +2 -0
- package/dist/types/components/lightbox/lightbox.variants.d.ts.map +1 -0
- package/dist/types/components/lightbox/types.d.ts +7 -1
- package/dist/types/components/lightbox/types.d.ts.map +1 -1
- package/dist/types/components/lightbox/utils/pose.d.ts +2 -2
- package/dist/types/components/lightbox/utils/pose.d.ts.map +1 -1
- package/dist/types/components/lightbox/utils/source.d.ts +4 -0
- package/dist/types/components/lightbox/utils/source.d.ts.map +1 -0
- package/dist/types/components/lightbox/utils/zoom.d.ts +8 -4
- package/dist/types/components/lightbox/utils/zoom.d.ts.map +1 -1
- package/dist/types/components/pagination/Pagination.vue.d.ts +59 -0
- package/dist/types/components/pagination/Pagination.vue.d.ts.map +1 -0
- package/dist/types/components/pagination/PaginationContent.vue.d.ts +23 -0
- package/dist/types/components/pagination/PaginationContent.vue.d.ts.map +1 -0
- package/dist/types/components/pagination/PaginationControl.vue.d.ts +10 -0
- package/dist/types/components/pagination/PaginationControl.vue.d.ts.map +1 -0
- package/dist/types/components/pagination/PaginationEllipsis.vue.d.ts +23 -0
- package/dist/types/components/pagination/PaginationEllipsis.vue.d.ts.map +1 -0
- package/dist/types/components/pagination/PaginationInfo.vue.d.ts +24 -0
- package/dist/types/components/pagination/PaginationInfo.vue.d.ts.map +1 -0
- package/dist/types/components/pagination/PaginationJump.vue.d.ts +7 -0
- package/dist/types/components/pagination/PaginationJump.vue.d.ts.map +1 -0
- package/dist/types/components/pagination/PaginationPage.vue.d.ts +20 -0
- package/dist/types/components/pagination/PaginationPage.vue.d.ts.map +1 -0
- package/dist/types/components/pagination/PaginationPages.vue.d.ts +27 -0
- package/dist/types/components/pagination/PaginationPages.vue.d.ts.map +1 -0
- package/dist/types/components/pagination/PaginationPopup.vue.d.ts +8 -0
- package/dist/types/components/pagination/PaginationPopup.vue.d.ts.map +1 -0
- package/dist/types/components/pagination/PaginationSize.vue.d.ts +7 -0
- package/dist/types/components/pagination/PaginationSize.vue.d.ts.map +1 -0
- package/dist/types/components/pagination/composables/usePagination.d.ts +25 -0
- package/dist/types/components/pagination/composables/usePagination.d.ts.map +1 -0
- package/dist/types/components/pagination/composables/usePaginationEllipsis.d.ts +34 -0
- package/dist/types/components/pagination/composables/usePaginationEllipsis.d.ts.map +1 -0
- package/dist/types/components/pagination/composables/usePaginationJump.d.ts +8 -0
- package/dist/types/components/pagination/composables/usePaginationJump.d.ts.map +1 -0
- package/dist/types/components/pagination/composables/usePaginationPageTooltip.d.ts +3 -0
- package/dist/types/components/pagination/composables/usePaginationPageTooltip.d.ts.map +1 -0
- package/dist/types/components/pagination/composables/usePaginationWindow.d.ts +188 -0
- package/dist/types/components/pagination/composables/usePaginationWindow.d.ts.map +1 -0
- package/dist/types/components/pagination/context.d.ts +19 -0
- package/dist/types/components/pagination/context.d.ts.map +1 -0
- package/dist/types/components/pagination/pagination.variants.d.ts +68 -0
- package/dist/types/components/pagination/pagination.variants.d.ts.map +1 -0
- package/dist/types/components/pagination/types.d.ts +23 -0
- package/dist/types/components/pagination/types.d.ts.map +1 -0
- package/dist/types/components/pagination/utils/ranges.d.ts +3 -0
- package/dist/types/components/pagination/utils/ranges.d.ts.map +1 -0
- package/dist/types/components/popover/Popover.vue.d.ts +4 -1
- package/dist/types/components/popover/Popover.vue.d.ts.map +1 -1
- package/dist/types/components/range-slider/RangeSlider.vue.d.ts +1 -0
- package/dist/types/components/range-slider/RangeSlider.vue.d.ts.map +1 -1
- package/dist/types/components/sheet/Sheet.vue.d.ts +21 -14
- package/dist/types/components/sheet/Sheet.vue.d.ts.map +1 -1
- package/dist/types/components/sheet/sheet.variants.d.ts +54 -3
- package/dist/types/components/sheet/sheet.variants.d.ts.map +1 -1
- package/dist/types/components/slider/Slider.vue.d.ts +1 -0
- package/dist/types/components/slider/Slider.vue.d.ts.map +1 -1
- package/dist/types/components/slider/slider.variants.d.ts.map +1 -1
- package/dist/types/components/tooltip/Tooltip.vue.d.ts +4 -15
- package/dist/types/components/tooltip/Tooltip.vue.d.ts.map +1 -1
- package/dist/types/components/tooltip/TooltipBubble.vue.d.ts +20 -0
- package/dist/types/components/tooltip/TooltipBubble.vue.d.ts.map +1 -0
- package/dist/types/components/tooltip/TooltipDirectiveRoot.d.ts +33 -0
- package/dist/types/components/tooltip/TooltipDirectiveRoot.d.ts.map +1 -0
- package/dist/types/components/tooltip/composables/useTooltipTarget.d.ts +2 -0
- package/dist/types/components/tooltip/composables/useTooltipTarget.d.ts.map +1 -0
- package/dist/types/components/tooltip/directive.d.ts +4 -0
- package/dist/types/components/tooltip/directive.d.ts.map +1 -0
- package/dist/types/components/tooltip/types.d.ts +14 -0
- package/dist/types/components/tooltip/types.d.ts.map +1 -0
- package/dist/types/components/tooltip/utils/directiveContext.d.ts +10 -0
- package/dist/types/components/tooltip/utils/directiveContext.d.ts.map +1 -0
- package/dist/types/components/tree-select/TreeSelect.vue.d.ts +6 -1
- package/dist/types/components/tree-select/TreeSelect.vue.d.ts.map +1 -1
- package/dist/types/components/tree-select/TreeSelectSearch.vue.d.ts +22 -0
- package/dist/types/components/tree-select/TreeSelectSearch.vue.d.ts.map +1 -0
- package/dist/types/components/tree-select/composables/useTreeSelect.d.ts +35 -0
- package/dist/types/components/tree-select/composables/useTreeSelect.d.ts.map +1 -0
- package/dist/types/components/tree-select/tree-select.variants.d.ts +1 -1
- package/dist/types/components/tree-select/tree-select.variants.d.ts.map +1 -1
- package/dist/types/components/tree-select/utils/filterTree.d.ts +7 -0
- package/dist/types/components/tree-select/utils/filterTree.d.ts.map +1 -0
- package/dist/types/index.d.ts +10 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/anchored-overlay.d.ts +12 -2
- package/dist/types/lib/anchored-overlay.d.ts.map +1 -1
- package/dist/types/lib/overlay-anchor.d.ts +16 -0
- package/dist/types/lib/overlay-anchor.d.ts.map +1 -0
- package/dist/types/lib/overlay-positioner.d.ts +3 -0
- package/dist/types/lib/overlay-positioner.d.ts.map +1 -0
- package/dist/types/lib/pointer-corridor.d.ts +7 -0
- package/dist/types/lib/pointer-corridor.d.ts.map +1 -0
- package/dist/types/lib/scroll-viewport.d.ts +9 -0
- package/dist/types/lib/scroll-viewport.d.ts.map +1 -0
- package/dist/types/lib/useDirection.d.ts +7 -0
- package/dist/types/lib/useDirection.d.ts.map +1 -0
- package/dist/types/locale/en-US.d.ts.map +1 -1
- package/dist/types/locale/index.d.ts.map +1 -1
- package/dist/types/locale/types.d.ts +13 -0
- package/dist/types/locale/types.d.ts.map +1 -1
- package/dist/types/locale/zh-CN.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/badge/badge.variants.ts +1 -1
- package/src/components/dialog/Dialog.vue +5 -1
- package/src/components/drawer/Drawer.vue +69 -32
- package/src/components/drawer/drawer.variants.ts +6 -2
- package/src/components/dropdown-menu/DropdownMenu.vue +18 -5
- package/src/components/hover-card/HoverCard.vue +39 -16
- package/src/components/hover-card/HoverCardAnchor.vue +18 -0
- package/src/components/hover-card/composables/useHoverCardAnchor.ts +151 -0
- package/src/components/image/Image.vue +2 -0
- package/src/components/image/composables/useImageGroupState.ts +9 -1
- package/src/components/image/image.variants.ts +1 -1
- package/src/components/lightbox/Lightbox.vue +23 -17
- package/src/components/lightbox/LightboxChrome.vue +7 -1
- package/src/components/lightbox/LightboxToolbar.vue +16 -2
- package/src/components/lightbox/composables/useLightboxFrames.ts +108 -12
- package/src/components/lightbox/composables/useLightboxLarge.ts +4 -1
- package/src/components/lightbox/composables/useLightboxLayout.ts +44 -0
- package/src/components/lightbox/composables/useLightboxPhase.ts +12 -4
- package/src/components/lightbox/composables/useLightboxPose.ts +17 -19
- package/src/components/lightbox/composables/useLightboxRotation.ts +14 -4
- package/src/components/lightbox/composables/useLightboxZoom.ts +51 -9
- package/src/components/lightbox/lightbox.variants.ts +5 -0
- package/src/components/lightbox/types.ts +5 -1
- package/src/components/lightbox/utils/pose.ts +13 -6
- package/src/components/lightbox/utils/source.ts +17 -0
- package/src/components/lightbox/utils/zoom.ts +21 -7
- package/src/components/pagination/Pagination.vue +118 -0
- package/src/components/pagination/PaginationContent.vue +29 -0
- package/src/components/pagination/PaginationControl.vue +42 -0
- package/src/components/pagination/PaginationEllipsis.vue +67 -0
- package/src/components/pagination/PaginationInfo.vue +18 -0
- package/src/components/pagination/PaginationJump.vue +32 -0
- package/src/components/pagination/PaginationPage.vue +34 -0
- package/src/components/pagination/PaginationPages.vue +43 -0
- package/src/components/pagination/PaginationPopup.vue +92 -0
- package/src/components/pagination/PaginationSize.vue +30 -0
- package/src/components/pagination/composables/usePagination.ts +76 -0
- package/src/components/pagination/composables/usePaginationEllipsis.ts +269 -0
- package/src/components/pagination/composables/usePaginationJump.ts +23 -0
- package/src/components/pagination/composables/usePaginationPageTooltip.ts +23 -0
- package/src/components/pagination/composables/usePaginationWindow.ts +116 -0
- package/src/components/pagination/context.ts +23 -0
- package/src/components/pagination/pagination.variants.ts +32 -0
- package/src/components/pagination/types.ts +19 -0
- package/src/components/pagination/utils/ranges.ts +12 -0
- package/src/components/popover/Popover.vue +17 -7
- package/src/components/range-slider/RangeSlider.vue +6 -0
- package/src/components/sheet/Sheet.vue +67 -24
- package/src/components/sheet/sheet.variants.ts +17 -4
- package/src/components/slider/Slider.vue +6 -0
- package/src/components/slider/slider.variants.ts +1 -0
- package/src/components/tooltip/Tooltip.vue +10 -33
- package/src/components/tooltip/TooltipBubble.vue +36 -0
- package/src/components/tooltip/TooltipDirectiveRoot.ts +61 -0
- package/src/components/tooltip/composables/useTooltipTarget.ts +56 -0
- package/src/components/tooltip/directive.ts +54 -0
- package/src/components/tooltip/types.ts +15 -0
- package/src/components/tooltip/utils/directiveContext.ts +32 -0
- package/src/components/tree-select/TreeSelect.vue +90 -61
- package/src/components/tree-select/TreeSelectSearch.vue +48 -0
- package/src/components/tree-select/composables/useTreeSelect.ts +130 -0
- package/src/components/tree-select/tree-select.variants.ts +2 -2
- package/src/components/tree-select/utils/filterTree.ts +19 -0
- package/src/index.ts +10 -1
- package/src/lib/anchored-overlay.ts +28 -19
- package/src/lib/overlay-anchor.ts +65 -0
- package/src/lib/overlay-positioner.ts +25 -0
- package/src/lib/pointer-corridor.ts +26 -0
- package/src/lib/scroll-viewport.ts +8 -0
- package/src/lib/useDirection.ts +31 -0
- package/src/locale/en-US.ts +15 -1
- package/src/locale/index.ts +1 -0
- package/src/locale/types.ts +13 -0
- package/src/locale/zh-CN.ts +15 -1
|
@@ -1,8 +1,21 @@
|
|
|
1
|
-
import { computed, nextTick,
|
|
1
|
+
import { computed, nextTick, watch, type Ref } from 'vue'
|
|
2
|
+
import { defaultDocument } from '@vueuse/core'
|
|
3
|
+
import { useOverlayPortal } from './overlay-portal'
|
|
4
|
+
import {
|
|
5
|
+
overlayAnchorContext,
|
|
6
|
+
overlayAnchorElement,
|
|
7
|
+
useOverlayAnchor,
|
|
8
|
+
type OverlayAnchor,
|
|
9
|
+
type OverlayPositionStrategy,
|
|
10
|
+
} from './overlay-anchor'
|
|
2
11
|
import { useForwardExpose, type DropdownMenuContentEmits } from 'reka-ui'
|
|
3
12
|
|
|
4
13
|
export function useAnchoredOverlay(
|
|
5
|
-
props: {
|
|
14
|
+
props: {
|
|
15
|
+
anchor?: OverlayAnchor | null
|
|
16
|
+
modal: boolean
|
|
17
|
+
updatePositionStrategy: OverlayPositionStrategy
|
|
18
|
+
},
|
|
6
19
|
open: Ref<boolean | undefined>,
|
|
7
20
|
emit: <K extends keyof DropdownMenuContentEmits>(
|
|
8
21
|
event: K,
|
|
@@ -11,14 +24,6 @@ export function useAnchoredOverlay(
|
|
|
11
24
|
openAutoFocus?: (event: Event) => void,
|
|
12
25
|
) {
|
|
13
26
|
const { forwardRef: trigger, currentElement: triggerElement } = useForwardExpose()
|
|
14
|
-
const retainedAnchor = shallowRef<HTMLElement>()
|
|
15
|
-
const reference = computed(
|
|
16
|
-
() =>
|
|
17
|
-
props.anchor ??
|
|
18
|
-
(open.value
|
|
19
|
-
? (triggerElement.value ?? retainedAnchor.value)
|
|
20
|
-
: (retainedAnchor.value ?? triggerElement.value)),
|
|
21
|
-
)
|
|
22
27
|
const visible = computed({
|
|
23
28
|
get: () => !!open.value && !!(props.anchor || triggerElement.value),
|
|
24
29
|
set: value => {
|
|
@@ -26,12 +31,12 @@ export function useAnchoredOverlay(
|
|
|
26
31
|
},
|
|
27
32
|
})
|
|
28
33
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
const { content, present } = useOverlayPortal(visible)
|
|
35
|
+
const reference = useOverlayAnchor(
|
|
36
|
+
() => props.anchor ?? triggerElement.value,
|
|
37
|
+
visible,
|
|
38
|
+
present,
|
|
39
|
+
() => props.updatePositionStrategy,
|
|
35
40
|
)
|
|
36
41
|
|
|
37
42
|
let previousFocus: HTMLElement | null = null
|
|
@@ -50,7 +55,10 @@ export function useAnchoredOverlay(
|
|
|
50
55
|
visible,
|
|
51
56
|
active => {
|
|
52
57
|
if (!active) return
|
|
53
|
-
const document =
|
|
58
|
+
const document =
|
|
59
|
+
overlayAnchorContext(props.anchor)?.ownerDocument ??
|
|
60
|
+
triggerElement.value?.ownerDocument ??
|
|
61
|
+
defaultDocument
|
|
54
62
|
previousFocus = document?.activeElement as HTMLElement | null
|
|
55
63
|
interactedOutside = false
|
|
56
64
|
},
|
|
@@ -73,12 +81,11 @@ export function useAnchoredOverlay(
|
|
|
73
81
|
(active === panel.ownerDocument.body || panel.contains(active))
|
|
74
82
|
)
|
|
75
83
|
target.focus({ preventScroll: true })
|
|
76
|
-
if (!visible.value) retainedAnchor.value = undefined
|
|
77
84
|
})
|
|
78
85
|
})
|
|
79
86
|
|
|
80
87
|
const onInteractOutside = once((event: DropdownMenuContentEmits['interactOutside'][0]) => {
|
|
81
|
-
if (!triggerElement.value && props.anchor?.contains(event.target as Node))
|
|
88
|
+
if (!triggerElement.value && overlayAnchorElement(props.anchor)?.contains(event.target as Node))
|
|
82
89
|
event.preventDefault()
|
|
83
90
|
emit('interactOutside', event)
|
|
84
91
|
const original = event.detail.originalEvent
|
|
@@ -89,6 +96,8 @@ export function useAnchoredOverlay(
|
|
|
89
96
|
|
|
90
97
|
return {
|
|
91
98
|
trigger,
|
|
99
|
+
content,
|
|
100
|
+
present,
|
|
92
101
|
reference,
|
|
93
102
|
visible,
|
|
94
103
|
events: {
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { shallowRef, watch, type Ref } from 'vue'
|
|
2
|
+
|
|
3
|
+
export type OverlayAnchor =
|
|
4
|
+
| HTMLElement
|
|
5
|
+
| {
|
|
6
|
+
getBoundingClientRect: () => Pick<
|
|
7
|
+
DOMRect,
|
|
8
|
+
'x' | 'y' | 'width' | 'height' | 'top' | 'right' | 'bottom' | 'left'
|
|
9
|
+
>
|
|
10
|
+
contextElement?: Element
|
|
11
|
+
}
|
|
12
|
+
export type OverlayPositionStrategy = 'optimized' | 'always'
|
|
13
|
+
|
|
14
|
+
export function overlayAnchorElement(anchor?: OverlayAnchor | null): HTMLElement | undefined {
|
|
15
|
+
return anchor && 'nodeType' in anchor ? anchor : undefined
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function overlayAnchorContext(anchor?: OverlayAnchor | null): Element | undefined {
|
|
19
|
+
return (
|
|
20
|
+
overlayAnchorElement(anchor) ??
|
|
21
|
+
(anchor && 'contextElement' in anchor ? anchor.contextElement : undefined)
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function useOverlayAnchor(
|
|
26
|
+
source: () => OverlayAnchor | null | undefined,
|
|
27
|
+
open: Ref<boolean | undefined>,
|
|
28
|
+
present: Ref<boolean>,
|
|
29
|
+
strategy: () => OverlayPositionStrategy,
|
|
30
|
+
) {
|
|
31
|
+
const reference = shallowRef<Exclude<OverlayAnchor, HTMLElement>>()
|
|
32
|
+
|
|
33
|
+
let current: OverlayAnchor | undefined
|
|
34
|
+
|
|
35
|
+
watch(
|
|
36
|
+
[source, open, present, strategy],
|
|
37
|
+
([anchor, active, mounted]) => {
|
|
38
|
+
if (!mounted) {
|
|
39
|
+
current = undefined
|
|
40
|
+
reference.value = undefined
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
if (!anchor || (!active && reference.value && anchor !== current)) return
|
|
44
|
+
const contextElement = overlayAnchorContext(anchor)
|
|
45
|
+
if (contextElement && !contextElement.isConnected) return
|
|
46
|
+
current = anchor
|
|
47
|
+
const measure = () => {
|
|
48
|
+
const { x, y, width, height, top, right, bottom, left } = anchor.getBoundingClientRect()
|
|
49
|
+
return { x, y, width, height, top, right, bottom, left }
|
|
50
|
+
}
|
|
51
|
+
let rect = measure()
|
|
52
|
+
reference.value = {
|
|
53
|
+
contextElement,
|
|
54
|
+
getBoundingClientRect: () => {
|
|
55
|
+
if (source() === anchor && (!contextElement || contextElement.isConnected))
|
|
56
|
+
rect = measure()
|
|
57
|
+
return rect
|
|
58
|
+
},
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
{ immediate: true, flush: 'post' },
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
return reference
|
|
65
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
toValue,
|
|
3
|
+
watchEffect,
|
|
4
|
+
type ComponentPublicInstance,
|
|
5
|
+
type MaybeRefOrGetter,
|
|
6
|
+
type Ref,
|
|
7
|
+
} from 'vue'
|
|
8
|
+
|
|
9
|
+
export function useOverlayPositionerClass(
|
|
10
|
+
content: Ref<ComponentPublicInstance | null>,
|
|
11
|
+
className: MaybeRefOrGetter<string | undefined>,
|
|
12
|
+
) {
|
|
13
|
+
watchEffect(
|
|
14
|
+
onCleanup => {
|
|
15
|
+
const element = content.value?.$el as HTMLElement | undefined
|
|
16
|
+
const positioner = element?.parentElement
|
|
17
|
+
const classes = toValue(className)?.split(/\s+/).filter(Boolean) ?? []
|
|
18
|
+
if (!positioner?.hasAttribute('data-reka-popper-content-wrapper') || !classes.length) return
|
|
19
|
+
const added = classes.filter(name => !positioner.classList.contains(name))
|
|
20
|
+
positioner.classList.add(...added)
|
|
21
|
+
onCleanup(() => positioner.classList.remove(...added))
|
|
22
|
+
},
|
|
23
|
+
{ flush: 'post' },
|
|
24
|
+
)
|
|
25
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
type Point = { x: number; y: number }
|
|
2
|
+
const cross = (a: Point, b: Point, c: Point) =>
|
|
3
|
+
(b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x)
|
|
4
|
+
|
|
5
|
+
export function inPointerCorridor(point: Point, first: DOMRect, second: DOMRect) {
|
|
6
|
+
const points = [first, second]
|
|
7
|
+
.flatMap(rect => [
|
|
8
|
+
{ x: rect.left - 6, y: rect.top - 6 },
|
|
9
|
+
{ x: rect.right + 6, y: rect.top - 6 },
|
|
10
|
+
{ x: rect.left - 6, y: rect.bottom + 6 },
|
|
11
|
+
{ x: rect.right + 6, y: rect.bottom + 6 },
|
|
12
|
+
])
|
|
13
|
+
.sort((a, b) => a.x - b.x || a.y - b.y)
|
|
14
|
+
const half = (values: Point[]) => {
|
|
15
|
+
const hull: Point[] = []
|
|
16
|
+
for (const value of values) {
|
|
17
|
+
while (hull.length > 1 && cross(hull[hull.length - 2]!, hull[hull.length - 1]!, value) <= 0)
|
|
18
|
+
hull.pop()
|
|
19
|
+
hull.push(value)
|
|
20
|
+
}
|
|
21
|
+
hull.pop()
|
|
22
|
+
return hull
|
|
23
|
+
}
|
|
24
|
+
const hull = [...half(points), ...half([...points].reverse())]
|
|
25
|
+
return hull.every((a, i) => cross(a, hull[(i + 1) % hull.length]!, point) >= 0)
|
|
26
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { computed, shallowRef, watchEffect } from 'vue'
|
|
2
|
+
import { injectConfigProviderContext, type Direction } from 'reka-ui'
|
|
3
|
+
|
|
4
|
+
export function useDirection(dir: () => Direction | undefined) {
|
|
5
|
+
const root = shallowRef<HTMLElement>()
|
|
6
|
+
const context = injectConfigProviderContext(null)
|
|
7
|
+
const inherited = shallowRef<Direction>('ltr')
|
|
8
|
+
const rootDirection = computed(() => dir() ?? context?.dir?.value)
|
|
9
|
+
const direction = computed(() => rootDirection.value ?? inherited.value)
|
|
10
|
+
|
|
11
|
+
watchEffect(
|
|
12
|
+
onCleanup => {
|
|
13
|
+
const element = root.value
|
|
14
|
+
const view = element?.ownerDocument.defaultView
|
|
15
|
+
if (!element || !view || rootDirection.value) return
|
|
16
|
+
|
|
17
|
+
const update = () => {
|
|
18
|
+
inherited.value = view.getComputedStyle(element).direction === 'rtl' ? 'rtl' : 'ltr'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
update()
|
|
22
|
+
const observer = new view.MutationObserver(update)
|
|
23
|
+
for (let ancestor: HTMLElement | null = element; ancestor; ancestor = ancestor.parentElement)
|
|
24
|
+
observer.observe(ancestor, { attributes: true, attributeFilter: ['dir'] })
|
|
25
|
+
onCleanup(() => observer.disconnect())
|
|
26
|
+
},
|
|
27
|
+
{ flush: 'post' },
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
return { root, direction, rootDirection }
|
|
31
|
+
}
|
package/src/locale/en-US.ts
CHANGED
|
@@ -16,6 +16,16 @@ export const enUS: UiMessages = {
|
|
|
16
16
|
next: 'Next notice',
|
|
17
17
|
},
|
|
18
18
|
pagination: {
|
|
19
|
+
rangeLabel: (from, to, total) =>
|
|
20
|
+
total ? String(from) + '–' + to + ' of ' + total + ' items' : '0 items',
|
|
21
|
+
pageCountLabel: (page, count) => 'Page ' + page + ' of ' + count,
|
|
22
|
+
pageSizeLabel: 'Items per page',
|
|
23
|
+
pageSizeOption: n => String(n) + ' / page',
|
|
24
|
+
jumpLabel: 'Go to page',
|
|
25
|
+
previousPagesLabel: n => 'Go back ' + n + ' pages',
|
|
26
|
+
nextPagesLabel: n => 'Go forward ' + n + ' pages',
|
|
27
|
+
choosePage: 'Choose a page',
|
|
28
|
+
choosePageHint: 'Press ArrowDown or ArrowUp to choose a page',
|
|
19
29
|
navLabel: 'Pagination',
|
|
20
30
|
prev: 'Previous page',
|
|
21
31
|
next: 'Next page',
|
|
@@ -78,7 +88,8 @@ export const enUS: UiMessages = {
|
|
|
78
88
|
lightbox: {
|
|
79
89
|
zoomIn: 'Zoom in',
|
|
80
90
|
zoomOut: 'Zoom out',
|
|
81
|
-
resetZoom: '
|
|
91
|
+
resetZoom: 'Fit to window',
|
|
92
|
+
actualSize: 'Actual size',
|
|
82
93
|
rotate: 'Rotate',
|
|
83
94
|
download: 'Download',
|
|
84
95
|
loadingLarge: 'Loading HD',
|
|
@@ -94,6 +105,9 @@ export const enUS: UiMessages = {
|
|
|
94
105
|
show: 'Show password',
|
|
95
106
|
hide: 'Hide password',
|
|
96
107
|
},
|
|
108
|
+
treeSelect: {
|
|
109
|
+
search: 'Search nodes',
|
|
110
|
+
},
|
|
97
111
|
combobox: {
|
|
98
112
|
placeholder: 'Type or choose',
|
|
99
113
|
toggle: 'Show options',
|
package/src/locale/index.ts
CHANGED
|
@@ -36,6 +36,7 @@ function merge(base: UiMessages, patch: PartialUiMessages): UiMessages {
|
|
|
36
36
|
chip: { ...base.chip, ...patch.chip },
|
|
37
37
|
numberInput: { ...base.numberInput, ...patch.numberInput },
|
|
38
38
|
passwordInput: { ...base.passwordInput, ...patch.passwordInput },
|
|
39
|
+
treeSelect: { ...base.treeSelect, ...patch.treeSelect },
|
|
39
40
|
combobox: { ...base.combobox, ...patch.combobox },
|
|
40
41
|
slider: { ...base.slider, ...patch.slider },
|
|
41
42
|
pinInput: { ...base.pinInput, ...patch.pinInput },
|
package/src/locale/types.ts
CHANGED
|
@@ -14,6 +14,15 @@ export interface UiMessages {
|
|
|
14
14
|
next: string
|
|
15
15
|
}
|
|
16
16
|
pagination: {
|
|
17
|
+
rangeLabel: (from: number, to: number, total: number) => string
|
|
18
|
+
pageCountLabel: (page: number, count: number) => string
|
|
19
|
+
pageSizeLabel: string
|
|
20
|
+
pageSizeOption: (n: number) => string
|
|
21
|
+
jumpLabel: string
|
|
22
|
+
previousPagesLabel: (n: number) => string
|
|
23
|
+
nextPagesLabel: (n: number) => string
|
|
24
|
+
choosePage: string
|
|
25
|
+
choosePageHint: string
|
|
17
26
|
navLabel: string
|
|
18
27
|
prev: string
|
|
19
28
|
next: string
|
|
@@ -77,6 +86,7 @@ export interface UiMessages {
|
|
|
77
86
|
zoomIn: string
|
|
78
87
|
zoomOut: string
|
|
79
88
|
resetZoom: string
|
|
89
|
+
actualSize: string
|
|
80
90
|
rotate: string
|
|
81
91
|
download: string
|
|
82
92
|
loadingLarge: string
|
|
@@ -92,6 +102,9 @@ export interface UiMessages {
|
|
|
92
102
|
show: string
|
|
93
103
|
hide: string
|
|
94
104
|
}
|
|
105
|
+
treeSelect: {
|
|
106
|
+
search: string
|
|
107
|
+
}
|
|
95
108
|
combobox: {
|
|
96
109
|
placeholder: string
|
|
97
110
|
toggle: string
|
package/src/locale/zh-CN.ts
CHANGED
|
@@ -16,6 +16,16 @@ export const zhCN: UiMessages = {
|
|
|
16
16
|
next: '下一条',
|
|
17
17
|
},
|
|
18
18
|
pagination: {
|
|
19
|
+
rangeLabel: (from, to, total) =>
|
|
20
|
+
total ? String(from) + '–' + to + ' / 共 ' + total + ' 条' : '共 0 条',
|
|
21
|
+
pageCountLabel: (page, count) => '第 ' + page + ' / ' + count + ' 页',
|
|
22
|
+
pageSizeLabel: '每页条数',
|
|
23
|
+
pageSizeOption: n => String(n) + ' / 页',
|
|
24
|
+
jumpLabel: '跳至页码',
|
|
25
|
+
previousPagesLabel: n => '向前跳 ' + n + ' 页',
|
|
26
|
+
nextPagesLabel: n => '向后跳 ' + n + ' 页',
|
|
27
|
+
choosePage: '选择页码',
|
|
28
|
+
choosePageHint: '按向下或向上箭头选择页码',
|
|
19
29
|
navLabel: '翻页',
|
|
20
30
|
prev: '上一页',
|
|
21
31
|
next: '下一页',
|
|
@@ -78,7 +88,8 @@ export const zhCN: UiMessages = {
|
|
|
78
88
|
lightbox: {
|
|
79
89
|
zoomIn: '放大',
|
|
80
90
|
zoomOut: '缩小',
|
|
81
|
-
resetZoom: '
|
|
91
|
+
resetZoom: '适应窗口',
|
|
92
|
+
actualSize: '原始尺寸',
|
|
82
93
|
rotate: '旋转',
|
|
83
94
|
download: '下载',
|
|
84
95
|
loadingLarge: '正在加载原图',
|
|
@@ -94,6 +105,9 @@ export const zhCN: UiMessages = {
|
|
|
94
105
|
show: '显示密码',
|
|
95
106
|
hide: '隐藏密码',
|
|
96
107
|
},
|
|
108
|
+
treeSelect: {
|
|
109
|
+
search: '搜索节点',
|
|
110
|
+
},
|
|
97
111
|
combobox: {
|
|
98
112
|
placeholder: '输入或选择',
|
|
99
113
|
toggle: '展开选项',
|