@faststore/components 3.0.134 → 3.0.141
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/cjs/atoms/Button/index.d.ts +1 -1
- package/dist/cjs/molecules/Dropdown/Dropdown.d.ts +1 -1
- package/dist/cjs/molecules/Dropdown/Dropdown.js +20 -16
- package/dist/cjs/molecules/Dropdown/Dropdown.js.map +1 -1
- package/dist/cjs/molecules/Dropdown/DropdownButton.d.ts +23 -5
- package/dist/cjs/molecules/Dropdown/DropdownButton.js +7 -7
- package/dist/cjs/molecules/Dropdown/DropdownButton.js.map +1 -1
- package/dist/cjs/molecules/Dropdown/DropdownItem.d.ts +9 -0
- package/dist/cjs/molecules/Dropdown/DropdownItem.js +8 -23
- package/dist/cjs/molecules/Dropdown/DropdownItem.js.map +1 -1
- package/dist/cjs/molecules/Dropdown/DropdownMenu.d.ts +7 -3
- package/dist/cjs/molecules/Dropdown/DropdownMenu.js +39 -11
- package/dist/cjs/molecules/Dropdown/DropdownMenu.js.map +1 -1
- package/dist/cjs/molecules/Dropdown/contexts/DropdownContext.d.ts +8 -8
- package/dist/cjs/molecules/Dropdown/contexts/DropdownContext.js +1 -1
- package/dist/cjs/molecules/Dropdown/contexts/DropdownContext.js.map +1 -1
- package/dist/cjs/molecules/Dropdown/hooks/useDropdown.d.ts +1 -1
- package/dist/cjs/molecules/Dropdown/hooks/useDropdown.js.map +1 -1
- package/dist/cjs/molecules/Dropdown/hooks/useDropdownItem.d.ts +15 -0
- package/dist/cjs/molecules/Dropdown/hooks/useDropdownItem.js +37 -0
- package/dist/cjs/molecules/Dropdown/hooks/useDropdownItem.js.map +1 -0
- package/dist/cjs/molecules/Dropdown/hooks/useDropdownPosition.d.ts +4 -2
- package/dist/cjs/molecules/Dropdown/hooks/useDropdownPosition.js +55 -18
- package/dist/cjs/molecules/Dropdown/hooks/useDropdownPosition.js.map +1 -1
- package/dist/cjs/molecules/Dropdown/hooks/useDropdownTrigger.d.ts +13 -0
- package/dist/cjs/molecules/Dropdown/hooks/useDropdownTrigger.js +20 -0
- package/dist/cjs/molecules/Dropdown/hooks/useDropdownTrigger.js.map +1 -0
- package/dist/esm/atoms/Button/index.d.ts +1 -1
- package/dist/esm/molecules/Dropdown/Dropdown.d.ts +1 -1
- package/dist/esm/molecules/Dropdown/Dropdown.js +20 -16
- package/dist/esm/molecules/Dropdown/Dropdown.js.map +1 -1
- package/dist/esm/molecules/Dropdown/DropdownButton.d.ts +23 -5
- package/dist/esm/molecules/Dropdown/DropdownButton.js +8 -8
- package/dist/esm/molecules/Dropdown/DropdownButton.js.map +1 -1
- package/dist/esm/molecules/Dropdown/DropdownItem.d.ts +9 -0
- package/dist/esm/molecules/Dropdown/DropdownItem.js +9 -24
- package/dist/esm/molecules/Dropdown/DropdownItem.js.map +1 -1
- package/dist/esm/molecules/Dropdown/DropdownMenu.d.ts +7 -3
- package/dist/esm/molecules/Dropdown/DropdownMenu.js +39 -11
- package/dist/esm/molecules/Dropdown/DropdownMenu.js.map +1 -1
- package/dist/esm/molecules/Dropdown/contexts/DropdownContext.d.ts +8 -8
- package/dist/esm/molecules/Dropdown/contexts/DropdownContext.js +1 -1
- package/dist/esm/molecules/Dropdown/contexts/DropdownContext.js.map +1 -1
- package/dist/esm/molecules/Dropdown/hooks/useDropdown.d.ts +1 -1
- package/dist/esm/molecules/Dropdown/hooks/useDropdown.js.map +1 -1
- package/dist/esm/molecules/Dropdown/hooks/useDropdownItem.d.ts +15 -0
- package/dist/esm/molecules/Dropdown/hooks/useDropdownItem.js +33 -0
- package/dist/esm/molecules/Dropdown/hooks/useDropdownItem.js.map +1 -0
- package/dist/esm/molecules/Dropdown/hooks/useDropdownPosition.d.ts +4 -2
- package/dist/esm/molecules/Dropdown/hooks/useDropdownPosition.js +55 -18
- package/dist/esm/molecules/Dropdown/hooks/useDropdownPosition.js.map +1 -1
- package/dist/esm/molecules/Dropdown/hooks/useDropdownTrigger.d.ts +13 -0
- package/dist/esm/molecules/Dropdown/hooks/useDropdownTrigger.js +16 -0
- package/dist/esm/molecules/Dropdown/hooks/useDropdownTrigger.js.map +1 -0
- package/package.json +4 -4
- package/src/atoms/Button/index.ts +1 -1
- package/src/molecules/Dropdown/Dropdown.tsx +27 -18
- package/src/molecules/Dropdown/DropdownButton.tsx +45 -32
- package/src/molecules/Dropdown/DropdownItem.tsx +39 -47
- package/src/molecules/Dropdown/DropdownMenu.tsx +58 -18
- package/src/molecules/Dropdown/contexts/DropdownContext.ts +11 -9
- package/src/molecules/Dropdown/hooks/useDropdown.ts +3 -3
- package/src/molecules/Dropdown/hooks/useDropdownItem.ts +56 -0
- package/src/molecules/Dropdown/hooks/useDropdownPosition.ts +62 -19
- package/src/molecules/Dropdown/hooks/useDropdownTrigger.ts +26 -0
|
@@ -1,33 +1,76 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react'
|
|
1
2
|
import { useDropdown } from './useDropdown'
|
|
2
3
|
|
|
3
|
-
type DropdownPosition =
|
|
4
|
+
type DropdownPosition = {
|
|
5
|
+
loading: boolean
|
|
6
|
+
} & Pick<React.CSSProperties, 'position' | 'top' | 'left' | 'right' | 'transform'>
|
|
4
7
|
|
|
5
8
|
/**
|
|
6
9
|
* Hook used to find the DropdownMenu position in relation to DropdownButton
|
|
7
10
|
* @returns Style with positions.
|
|
8
11
|
*/
|
|
9
|
-
export const useDropdownPosition = (): DropdownPosition => {
|
|
10
|
-
const {
|
|
12
|
+
export const useDropdownPosition = (align: 'left' | 'center' | 'right' = 'left'): DropdownPosition => {
|
|
13
|
+
const { dropdownTriggerRef, isOpen } = useDropdown()
|
|
11
14
|
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
const [positionProps, setPositionProps] = useState({
|
|
16
|
+
top: 0,
|
|
17
|
+
left: 0 as React.CSSProperties['left'],
|
|
18
|
+
right: 'auto',
|
|
19
|
+
transform: 'none',
|
|
20
|
+
loading: true
|
|
21
|
+
})
|
|
14
22
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
const updateMenuPosition = () => {
|
|
25
|
+
// Necessary to use this component in SSR
|
|
26
|
+
const isBrowser = typeof window !== 'undefined'
|
|
19
27
|
|
|
20
|
-
|
|
21
|
-
const scrollTop = isBrowser ? document?.documentElement?.scrollTop : 0
|
|
22
|
-
const scrollLeft = isBrowser ? document?.documentElement?.scrollLeft : 0
|
|
28
|
+
if (!dropdownTriggerRef?.current) return
|
|
23
29
|
|
|
24
|
-
|
|
30
|
+
const buttonRect = dropdownTriggerRef.current.getBoundingClientRect()
|
|
31
|
+
const topLevel = buttonRect?.top ?? 0
|
|
32
|
+
const topOffset = buttonRect?.height ?? 0
|
|
33
|
+
const leftLevel = buttonRect?.left ?? 0
|
|
34
|
+
const buttonWidth = buttonRect?.width ?? 0
|
|
25
35
|
|
|
26
|
-
|
|
36
|
+
// The scroll properties fix the position of DropdownMenu when the scroll is activated.
|
|
37
|
+
const scrollTop = isBrowser ? document?.documentElement?.scrollTop : 0
|
|
38
|
+
const scrollLeft = isBrowser ? document?.documentElement?.scrollLeft : 0
|
|
27
39
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
40
|
+
const topPosition = topLevel + topOffset + scrollTop
|
|
41
|
+
|
|
42
|
+
let leftPosition: React.CSSProperties['left'] = leftLevel + scrollLeft
|
|
43
|
+
let rightPosition = 'auto'
|
|
44
|
+
let transform = 'none'
|
|
45
|
+
|
|
46
|
+
if (align === 'right') {
|
|
47
|
+
rightPosition = `${document.documentElement.clientWidth - leftLevel - buttonWidth}px`
|
|
48
|
+
leftPosition = 'auto'
|
|
49
|
+
} else if (align === 'center') {
|
|
50
|
+
leftPosition = leftLevel + (buttonWidth / 2) + scrollLeft
|
|
51
|
+
transform = 'translateX(-50%)'
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
setPositionProps({
|
|
55
|
+
top: topPosition,
|
|
56
|
+
left: leftPosition,
|
|
57
|
+
right: rightPosition,
|
|
58
|
+
transform,
|
|
59
|
+
loading: false
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (isOpen) {
|
|
64
|
+
// Update the position of the menu
|
|
65
|
+
updateMenuPosition()
|
|
66
|
+
window.addEventListener('resize', updateMenuPosition)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Cleanup listener on unmount or close
|
|
70
|
+
return () => {
|
|
71
|
+
window.removeEventListener('resize', updateMenuPosition)
|
|
72
|
+
}
|
|
73
|
+
}, [dropdownTriggerRef, isOpen, align])
|
|
74
|
+
|
|
75
|
+
return { ...positionProps, position: 'absolute' as const }
|
|
33
76
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { useDropdown } from './useDropdown'
|
|
2
|
+
import React, { useImperativeHandle } from 'react'
|
|
3
|
+
|
|
4
|
+
type UseDropdownTriggerProps<T extends HTMLElement = HTMLElement> = {
|
|
5
|
+
triggerRef: React.ForwardedRef<T>
|
|
6
|
+
label?: string
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const useDropdownTrigger = <T extends HTMLElement = HTMLElement>({
|
|
10
|
+
triggerRef,
|
|
11
|
+
}: UseDropdownTriggerProps<T>) => {
|
|
12
|
+
const { toggle, dropdownTriggerRef, addDropdownTriggerRef, isOpen, id } =
|
|
13
|
+
useDropdown<T>()
|
|
14
|
+
|
|
15
|
+
useImperativeHandle(triggerRef, () => dropdownTriggerRef!.current!, [
|
|
16
|
+
dropdownTriggerRef,
|
|
17
|
+
])
|
|
18
|
+
|
|
19
|
+
return {
|
|
20
|
+
onClick: toggle,
|
|
21
|
+
ref: addDropdownTriggerRef,
|
|
22
|
+
'aria-expanded': isOpen,
|
|
23
|
+
'aria-controls': id,
|
|
24
|
+
'aria-haspopup': 'menu' as const,
|
|
25
|
+
}
|
|
26
|
+
}
|