@faststore/components 3.0.135 → 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.
Files changed (65) hide show
  1. package/dist/cjs/atoms/Button/index.d.ts +1 -1
  2. package/dist/cjs/molecules/Dropdown/Dropdown.d.ts +1 -1
  3. package/dist/cjs/molecules/Dropdown/Dropdown.js +20 -16
  4. package/dist/cjs/molecules/Dropdown/Dropdown.js.map +1 -1
  5. package/dist/cjs/molecules/Dropdown/DropdownButton.d.ts +23 -5
  6. package/dist/cjs/molecules/Dropdown/DropdownButton.js +7 -7
  7. package/dist/cjs/molecules/Dropdown/DropdownButton.js.map +1 -1
  8. package/dist/cjs/molecules/Dropdown/DropdownItem.d.ts +9 -0
  9. package/dist/cjs/molecules/Dropdown/DropdownItem.js +8 -23
  10. package/dist/cjs/molecules/Dropdown/DropdownItem.js.map +1 -1
  11. package/dist/cjs/molecules/Dropdown/DropdownMenu.d.ts +7 -3
  12. package/dist/cjs/molecules/Dropdown/DropdownMenu.js +39 -11
  13. package/dist/cjs/molecules/Dropdown/DropdownMenu.js.map +1 -1
  14. package/dist/cjs/molecules/Dropdown/contexts/DropdownContext.d.ts +8 -8
  15. package/dist/cjs/molecules/Dropdown/contexts/DropdownContext.js +1 -1
  16. package/dist/cjs/molecules/Dropdown/contexts/DropdownContext.js.map +1 -1
  17. package/dist/cjs/molecules/Dropdown/hooks/useDropdown.d.ts +1 -1
  18. package/dist/cjs/molecules/Dropdown/hooks/useDropdown.js.map +1 -1
  19. package/dist/cjs/molecules/Dropdown/hooks/useDropdownItem.d.ts +15 -0
  20. package/dist/cjs/molecules/Dropdown/hooks/useDropdownItem.js +37 -0
  21. package/dist/cjs/molecules/Dropdown/hooks/useDropdownItem.js.map +1 -0
  22. package/dist/cjs/molecules/Dropdown/hooks/useDropdownPosition.d.ts +4 -2
  23. package/dist/cjs/molecules/Dropdown/hooks/useDropdownPosition.js +55 -18
  24. package/dist/cjs/molecules/Dropdown/hooks/useDropdownPosition.js.map +1 -1
  25. package/dist/cjs/molecules/Dropdown/hooks/useDropdownTrigger.d.ts +13 -0
  26. package/dist/cjs/molecules/Dropdown/hooks/useDropdownTrigger.js +20 -0
  27. package/dist/cjs/molecules/Dropdown/hooks/useDropdownTrigger.js.map +1 -0
  28. package/dist/esm/atoms/Button/index.d.ts +1 -1
  29. package/dist/esm/molecules/Dropdown/Dropdown.d.ts +1 -1
  30. package/dist/esm/molecules/Dropdown/Dropdown.js +20 -16
  31. package/dist/esm/molecules/Dropdown/Dropdown.js.map +1 -1
  32. package/dist/esm/molecules/Dropdown/DropdownButton.d.ts +23 -5
  33. package/dist/esm/molecules/Dropdown/DropdownButton.js +8 -8
  34. package/dist/esm/molecules/Dropdown/DropdownButton.js.map +1 -1
  35. package/dist/esm/molecules/Dropdown/DropdownItem.d.ts +9 -0
  36. package/dist/esm/molecules/Dropdown/DropdownItem.js +9 -24
  37. package/dist/esm/molecules/Dropdown/DropdownItem.js.map +1 -1
  38. package/dist/esm/molecules/Dropdown/DropdownMenu.d.ts +7 -3
  39. package/dist/esm/molecules/Dropdown/DropdownMenu.js +39 -11
  40. package/dist/esm/molecules/Dropdown/DropdownMenu.js.map +1 -1
  41. package/dist/esm/molecules/Dropdown/contexts/DropdownContext.d.ts +8 -8
  42. package/dist/esm/molecules/Dropdown/contexts/DropdownContext.js +1 -1
  43. package/dist/esm/molecules/Dropdown/contexts/DropdownContext.js.map +1 -1
  44. package/dist/esm/molecules/Dropdown/hooks/useDropdown.d.ts +1 -1
  45. package/dist/esm/molecules/Dropdown/hooks/useDropdown.js.map +1 -1
  46. package/dist/esm/molecules/Dropdown/hooks/useDropdownItem.d.ts +15 -0
  47. package/dist/esm/molecules/Dropdown/hooks/useDropdownItem.js +33 -0
  48. package/dist/esm/molecules/Dropdown/hooks/useDropdownItem.js.map +1 -0
  49. package/dist/esm/molecules/Dropdown/hooks/useDropdownPosition.d.ts +4 -2
  50. package/dist/esm/molecules/Dropdown/hooks/useDropdownPosition.js +55 -18
  51. package/dist/esm/molecules/Dropdown/hooks/useDropdownPosition.js.map +1 -1
  52. package/dist/esm/molecules/Dropdown/hooks/useDropdownTrigger.d.ts +13 -0
  53. package/dist/esm/molecules/Dropdown/hooks/useDropdownTrigger.js +16 -0
  54. package/dist/esm/molecules/Dropdown/hooks/useDropdownTrigger.js.map +1 -0
  55. package/package.json +2 -2
  56. package/src/atoms/Button/index.ts +1 -1
  57. package/src/molecules/Dropdown/Dropdown.tsx +27 -18
  58. package/src/molecules/Dropdown/DropdownButton.tsx +45 -32
  59. package/src/molecules/Dropdown/DropdownItem.tsx +39 -47
  60. package/src/molecules/Dropdown/DropdownMenu.tsx +58 -18
  61. package/src/molecules/Dropdown/contexts/DropdownContext.ts +11 -9
  62. package/src/molecules/Dropdown/hooks/useDropdown.ts +3 -3
  63. package/src/molecules/Dropdown/hooks/useDropdownItem.ts +56 -0
  64. package/src/molecules/Dropdown/hooks/useDropdownPosition.ts +62 -19
  65. 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 = Pick<React.CSSProperties, 'position' | 'top' | 'left'>
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 { dropdownButtonRef } = useDropdown()
12
+ export const useDropdownPosition = (align: 'left' | 'center' | 'right' = 'left'): DropdownPosition => {
13
+ const { dropdownTriggerRef, isOpen } = useDropdown()
11
14
 
12
- // Necessary to use this component in SSR
13
- const isBrowser = typeof window !== 'undefined'
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
- const buttonRect = dropdownButtonRef?.current?.getBoundingClientRect()
16
- const topLevel = buttonRect?.top ?? 0
17
- const topOffset = buttonRect?.height ?? 0
18
- const leftLevel = buttonRect?.left ?? 0
23
+ useEffect(() => {
24
+ const updateMenuPosition = () => {
25
+ // Necessary to use this component in SSR
26
+ const isBrowser = typeof window !== 'undefined'
19
27
 
20
- // The scroll properties fix the position of DropdownMenu when the scroll is activated.
21
- const scrollTop = isBrowser ? document?.documentElement?.scrollTop : 0
22
- const scrollLeft = isBrowser ? document?.documentElement?.scrollLeft : 0
28
+ if (!dropdownTriggerRef?.current) return
23
29
 
24
- const topPosition = topLevel + topOffset + scrollTop
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
- const leftPosition = leftLevel + scrollLeft
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
- return {
29
- position: 'absolute',
30
- top: topPosition,
31
- left: leftPosition,
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
+ }