@vkontakte/vkui 6.1.0 → 6.1.2

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 (167) hide show
  1. package/dist/cjs/components/Clickable/useState.d.ts.map +1 -1
  2. package/dist/cjs/components/Clickable/useState.js +7 -6
  3. package/dist/cjs/components/Clickable/useState.js.map +1 -1
  4. package/dist/cjs/components/CustomScrollView/CustomScrollView.d.ts.map +1 -1
  5. package/dist/cjs/components/CustomScrollView/CustomScrollView.js +8 -1
  6. package/dist/cjs/components/CustomScrollView/CustomScrollView.js.map +1 -1
  7. package/dist/cjs/components/DatePicker/DatePicker.d.ts +3 -2
  8. package/dist/cjs/components/DatePicker/DatePicker.d.ts.map +1 -1
  9. package/dist/cjs/components/DatePicker/DatePicker.js +64 -50
  10. package/dist/cjs/components/DatePicker/DatePicker.js.map +1 -1
  11. package/dist/cjs/components/FocusTrap/FocusTrap.d.ts +2 -2
  12. package/dist/cjs/components/FocusTrap/FocusTrap.d.ts.map +1 -1
  13. package/dist/cjs/components/FocusTrap/FocusTrap.js +36 -11
  14. package/dist/cjs/components/FocusTrap/FocusTrap.js.map +1 -1
  15. package/dist/cjs/components/Select/Select.d.ts +1 -1
  16. package/dist/cjs/components/Select/Select.d.ts.map +1 -1
  17. package/dist/cjs/components/Select/Select.js +12 -6
  18. package/dist/cjs/components/Select/Select.js.map +1 -1
  19. package/dist/cjs/components/Spacing/Spacing.d.ts +16 -5
  20. package/dist/cjs/components/Spacing/Spacing.d.ts.map +1 -1
  21. package/dist/cjs/components/Spacing/Spacing.js +38 -31
  22. package/dist/cjs/components/Spacing/Spacing.js.map +1 -1
  23. package/dist/cjs/components/SplitLayout/SplitLayout.js +2 -2
  24. package/dist/cjs/components/SplitLayout/SplitLayout.js.map +1 -1
  25. package/dist/cjs/components/ToolButton/ToolButton.d.ts +5 -0
  26. package/dist/cjs/components/ToolButton/ToolButton.d.ts.map +1 -1
  27. package/dist/cjs/components/ToolButton/ToolButton.js +2 -1
  28. package/dist/cjs/components/ToolButton/ToolButton.js.map +1 -1
  29. package/dist/cjs/hooks/useDraggableWithDomApi/autoScroll.d.ts +0 -1
  30. package/dist/cjs/hooks/useDraggableWithDomApi/autoScroll.d.ts.map +1 -1
  31. package/dist/cjs/hooks/useDraggableWithDomApi/autoScroll.js +1 -5
  32. package/dist/cjs/hooks/useDraggableWithDomApi/autoScroll.js.map +1 -1
  33. package/dist/cjs/hooks/useResizeObserver.d.ts +6 -0
  34. package/dist/cjs/hooks/useResizeObserver.d.ts.map +1 -0
  35. package/dist/cjs/hooks/useResizeObserver.js +32 -0
  36. package/dist/cjs/hooks/useResizeObserver.js.map +1 -0
  37. package/dist/cjs/lib/floating/customResizeObserver.d.ts.map +1 -1
  38. package/dist/cjs/lib/floating/customResizeObserver.js +2 -1
  39. package/dist/cjs/lib/floating/customResizeObserver.js.map +1 -1
  40. package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
  41. package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +11 -1
  42. package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  43. package/dist/cjs/lib/utils.d.ts.map +1 -1
  44. package/dist/cjs/lib/utils.js +1 -2
  45. package/dist/cjs/lib/utils.js.map +1 -1
  46. package/dist/components/Clickable/useState.d.ts.map +1 -1
  47. package/dist/components/Clickable/useState.js +7 -6
  48. package/dist/components/Clickable/useState.js.map +1 -1
  49. package/dist/components/CustomScrollView/CustomScrollView.d.ts.map +1 -1
  50. package/dist/components/CustomScrollView/CustomScrollView.js +8 -1
  51. package/dist/components/CustomScrollView/CustomScrollView.js.map +1 -1
  52. package/dist/components/DatePicker/DatePicker.d.ts +3 -2
  53. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
  54. package/dist/components/DatePicker/DatePicker.js +64 -50
  55. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  56. package/dist/components/FocusTrap/FocusTrap.d.ts +2 -2
  57. package/dist/components/FocusTrap/FocusTrap.d.ts.map +1 -1
  58. package/dist/components/FocusTrap/FocusTrap.js +37 -11
  59. package/dist/components/FocusTrap/FocusTrap.js.map +1 -1
  60. package/dist/components/Select/Select.d.ts +1 -1
  61. package/dist/components/Select/Select.d.ts.map +1 -1
  62. package/dist/components/Select/Select.js +12 -6
  63. package/dist/components/Select/Select.js.map +1 -1
  64. package/dist/components/Spacing/Spacing.d.ts +16 -5
  65. package/dist/components/Spacing/Spacing.d.ts.map +1 -1
  66. package/dist/components/Spacing/Spacing.js +33 -28
  67. package/dist/components/Spacing/Spacing.js.map +1 -1
  68. package/dist/components/SplitLayout/SplitLayout.js +2 -2
  69. package/dist/components/SplitLayout/SplitLayout.js.map +1 -1
  70. package/dist/components/ToolButton/ToolButton.d.ts +5 -0
  71. package/dist/components/ToolButton/ToolButton.d.ts.map +1 -1
  72. package/dist/components/ToolButton/ToolButton.js +2 -1
  73. package/dist/components/ToolButton/ToolButton.js.map +1 -1
  74. package/dist/components.css +6 -6
  75. package/dist/components.css.map +1 -1
  76. package/dist/components.js.tmp +542 -399
  77. package/dist/cssm/components/Clickable/useState.d.ts.map +1 -1
  78. package/dist/cssm/components/Clickable/useState.js +7 -6
  79. package/dist/cssm/components/Clickable/useState.js.map +1 -1
  80. package/dist/cssm/components/CustomScrollView/CustomScrollView.d.ts.map +1 -1
  81. package/dist/cssm/components/CustomScrollView/CustomScrollView.js +8 -1
  82. package/dist/cssm/components/CustomScrollView/CustomScrollView.js.map +1 -1
  83. package/dist/cssm/components/CustomScrollView/CustomScrollView.module.css +4 -0
  84. package/dist/cssm/components/DatePicker/DatePicker.d.ts +3 -2
  85. package/dist/cssm/components/DatePicker/DatePicker.d.ts.map +1 -1
  86. package/dist/cssm/components/DatePicker/DatePicker.js +57 -41
  87. package/dist/cssm/components/DatePicker/DatePicker.js.map +1 -1
  88. package/dist/cssm/components/FocusTrap/FocusTrap.d.ts +2 -2
  89. package/dist/cssm/components/FocusTrap/FocusTrap.d.ts.map +1 -1
  90. package/dist/cssm/components/FocusTrap/FocusTrap.js +37 -11
  91. package/dist/cssm/components/FocusTrap/FocusTrap.js.map +1 -1
  92. package/dist/cssm/components/Select/Select.d.ts +1 -1
  93. package/dist/cssm/components/Select/Select.d.ts.map +1 -1
  94. package/dist/cssm/components/Select/Select.js +8 -5
  95. package/dist/cssm/components/Select/Select.js.map +1 -1
  96. package/dist/cssm/components/Spacing/Spacing.d.ts +16 -5
  97. package/dist/cssm/components/Spacing/Spacing.d.ts.map +1 -1
  98. package/dist/cssm/components/Spacing/Spacing.js +31 -30
  99. package/dist/cssm/components/Spacing/Spacing.js.map +1 -1
  100. package/dist/cssm/components/Spacing/Spacing.module.css +44 -0
  101. package/dist/cssm/components/SplitLayout/SplitLayout.js +2 -2
  102. package/dist/cssm/components/SplitLayout/SplitLayout.js.map +1 -1
  103. package/dist/cssm/components/SplitLayout/SplitLayout.module.css +1 -1
  104. package/dist/cssm/components/Textarea/Textarea.module.css +1 -0
  105. package/dist/cssm/components/ToolButton/ToolButton.d.ts +5 -0
  106. package/dist/cssm/components/ToolButton/ToolButton.d.ts.map +1 -1
  107. package/dist/cssm/components/ToolButton/ToolButton.js +2 -1
  108. package/dist/cssm/components/ToolButton/ToolButton.js.map +1 -1
  109. package/dist/cssm/components/ToolButton/ToolButton.module.css +6 -20
  110. package/dist/cssm/hooks/useDraggableWithDomApi/autoScroll.d.ts +0 -1
  111. package/dist/cssm/hooks/useDraggableWithDomApi/autoScroll.d.ts.map +1 -1
  112. package/dist/cssm/hooks/useDraggableWithDomApi/autoScroll.js +1 -2
  113. package/dist/cssm/hooks/useDraggableWithDomApi/autoScroll.js.map +1 -1
  114. package/dist/cssm/hooks/useResizeObserver.d.ts +6 -0
  115. package/dist/cssm/hooks/useResizeObserver.d.ts.map +1 -0
  116. package/dist/cssm/hooks/useResizeObserver.js +23 -0
  117. package/dist/cssm/hooks/useResizeObserver.js.map +1 -0
  118. package/dist/cssm/lib/floating/customResizeObserver.d.ts.map +1 -1
  119. package/dist/cssm/lib/floating/customResizeObserver.js +2 -1
  120. package/dist/cssm/lib/floating/customResizeObserver.js.map +1 -1
  121. package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
  122. package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +11 -1
  123. package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  124. package/dist/cssm/lib/utils.d.ts.map +1 -1
  125. package/dist/cssm/lib/utils.js +1 -2
  126. package/dist/cssm/lib/utils.js.map +1 -1
  127. package/dist/cssm/styles/adaptivity.module.css +1 -2
  128. package/dist/hooks/useDraggableWithDomApi/autoScroll.d.ts +0 -1
  129. package/dist/hooks/useDraggableWithDomApi/autoScroll.d.ts.map +1 -1
  130. package/dist/hooks/useDraggableWithDomApi/autoScroll.js +1 -2
  131. package/dist/hooks/useDraggableWithDomApi/autoScroll.js.map +1 -1
  132. package/dist/hooks/useResizeObserver.d.ts +6 -0
  133. package/dist/hooks/useResizeObserver.d.ts.map +1 -0
  134. package/dist/hooks/useResizeObserver.js +23 -0
  135. package/dist/hooks/useResizeObserver.js.map +1 -0
  136. package/dist/lib/floating/customResizeObserver.d.ts.map +1 -1
  137. package/dist/lib/floating/customResizeObserver.js +2 -1
  138. package/dist/lib/floating/customResizeObserver.js.map +1 -1
  139. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
  140. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +11 -1
  141. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  142. package/dist/lib/utils.d.ts.map +1 -1
  143. package/dist/lib/utils.js +1 -2
  144. package/dist/lib/utils.js.map +1 -1
  145. package/dist/vkui.css +6 -6
  146. package/dist/vkui.css.map +1 -1
  147. package/dist/vkui.js.tmp +542 -399
  148. package/package.json +1 -1
  149. package/src/components/Clickable/useState.tsx +16 -6
  150. package/src/components/CustomScrollView/CustomScrollView.module.css +4 -0
  151. package/src/components/CustomScrollView/CustomScrollView.tsx +7 -1
  152. package/src/components/DatePicker/DatePicker.tsx +80 -45
  153. package/src/components/FocusTrap/FocusTrap.tsx +54 -20
  154. package/src/components/Select/Select.tsx +12 -5
  155. package/src/components/Spacing/Spacing.module.css +44 -0
  156. package/src/components/Spacing/Spacing.tsx +38 -34
  157. package/src/components/SplitLayout/SplitLayout.module.css +1 -1
  158. package/src/components/SplitLayout/SplitLayout.tsx +1 -1
  159. package/src/components/Textarea/Textarea.module.css +1 -0
  160. package/src/components/ToolButton/ToolButton.module.css +4 -14
  161. package/src/components/ToolButton/ToolButton.tsx +7 -2
  162. package/src/hooks/useDraggableWithDomApi/autoScroll.ts +1 -4
  163. package/src/hooks/useResizeObserver.ts +30 -0
  164. package/src/lib/floating/customResizeObserver.ts +10 -1
  165. package/src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts +11 -1
  166. package/src/lib/utils.ts +1 -2
  167. package/src/styles/adaptivity.module.css +1 -2
@@ -1 +1 @@
1
- {"version":3,"file":"useState.d.ts","sourceRoot":"","sources":["../../../../src/components/Clickable/useState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,eAAO,MAAM,YAAY,KAAK,CAAC;AAsE/B,eAAO,MAAM,yBAAyB,qBAAwC,OAAO,KAAK,IAAI,cAE7F,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,uEAO3B;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,EAAE,UAAU;;;EAwBzE"}
1
+ {"version":3,"file":"useState.d.ts","sourceRoot":"","sources":["../../../../src/components/Clickable/useState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AASD,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,eAAO,MAAM,YAAY,KAAK,CAAC;AAwE/B,eAAO,MAAM,yBAAyB,qBAAwC,OAAO,KAAK,IAAI,cAE7F,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,uEAO3B;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,EAAE,UAAU;;;EAyBzE"}
@@ -37,9 +37,9 @@ const DEFAULT_ACTIVE_EFFECT_DELAY = 600;
37
37
  const ACTIVE_DELAY = 70;
38
38
  /**
39
39
  * Управляет наведением на компонент, игнорирует тач события
40
- */ function useHover({ hovered, hoverClassName, hasHover = true }) {
40
+ */ function useHover({ hovered, hoverClassName, hasHover = true, lockState }) {
41
41
  const [hoveredState, setHover] = _react.useState(false);
42
- const hover = hasHover && (hovered || hoveredState) ? hoverClassName : undefined;
42
+ const hover = hasHover && !lockState && (hovered || hoveredState) ? hoverClassName : undefined;
43
43
  const onPointerEnter = (e)=>{
44
44
  if (e.pointerType === 'touch') {
45
45
  return;
@@ -57,11 +57,11 @@ const ACTIVE_DELAY = 70;
57
57
  }
58
58
  /**
59
59
  * Управляет активацией компонента
60
- */ function useActive({ activated, activeClassName, activeEffectDelay, hasActive = true }) {
60
+ */ function useActive({ activated, activeClassName, activeEffectDelay, hasActive = true, lockState }) {
61
61
  const [activatedState, setActivated] = (0, _useStateWithDelay.useStateWithDelay)(false);
62
62
  // Список нажатий которые не требуется отменять
63
63
  const pointersUp = _react.useMemo(()=>new Set(), []);
64
- const active = hasActive && (activated || activatedState) ? activeClassName : undefined;
64
+ const active = hasActive && !lockState && (activated || activatedState) ? activeClassName : undefined;
65
65
  const onPointerDown = ()=>setActivated(true, ACTIVE_DELAY);
66
66
  const onPointerCancel = (e)=>{
67
67
  if (pointersUp.has(e.pointerId)) {
@@ -101,8 +101,9 @@ function useState(_param) {
101
101
  ]);
102
102
  const [lockState, setLockBubbling, setLockBubblingImmediate] = useLockState();
103
103
  const props = _object_spread._({
104
- hasHover: hasHover && !lockState,
105
- hasActive: hasActive && !lockState
104
+ hasHover,
105
+ hasActive,
106
+ lockState
106
107
  }, restProps);
107
108
  const _useHover = useHover(_object_spread._({}, props)), { hover } = _useHover, hoverEvent = _object_without_properties._(_useHover, [
108
109
  "hover"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Clickable/useState.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { mergeCalls } from '../../lib/mergeCalls';\nimport { useStateWithDelay } from './useStateWithDelay';\n\nexport interface StateProps {\n /**\n * Указывает, должен ли компонент реагировать на hover-состояние\n */\n hasHover?: boolean;\n /**\n * Позволяет управлять hovered-состоянием извне\n */\n hovered?: boolean;\n /**\n * Позволяет управлять activated-состоянием извне\n */\n activated?: boolean;\n /**\n * Указывает, должен ли компонент реагировать на active-состояние\n */\n hasActive?: boolean;\n\n /**\n * Длительность показа `activated`-состояния\n */\n activeEffectDelay?: number;\n\n /**\n * Стиль подсветки active-состояния\n */\n activeClassName?: string;\n\n /**\n * Стиль подсветки hover-состояния\n */\n hoverClassName?: string;\n}\n\nexport const DEFAULT_ACTIVE_EFFECT_DELAY = 600;\n\nexport const ACTIVE_DELAY = 70;\n\n/**\n * Управляет наведением на компонент, игнорирует тач события\n */\nfunction useHover({ hovered, hoverClassName, hasHover = true }: StateProps) {\n const [hoveredState, setHover] = React.useState(false);\n\n const hover = hasHover && (hovered || hoveredState) ? hoverClassName : undefined;\n\n const onPointerEnter: React.PointerEventHandler<any> = (e) => {\n if (e.pointerType === 'touch') {\n return;\n }\n\n setHover(true);\n };\n\n const onPointerLeave = () => {\n setHover(false);\n };\n\n return {\n hover,\n onPointerEnter: hasHover ? onPointerEnter : noop,\n onPointerLeave: hasHover ? onPointerLeave : noop,\n };\n}\n\n/**\n * Управляет активацией компонента\n */\nfunction useActive({\n activated,\n activeClassName,\n activeEffectDelay,\n hasActive = true,\n}: StateProps) {\n const [activatedState, setActivated] = useStateWithDelay(false);\n\n // Список нажатий которые не требуется отменять\n const pointersUp = React.useMemo(() => new Set<number>(), []);\n\n const active = hasActive && (activated || activatedState) ? activeClassName : undefined;\n\n const onPointerDown = () => setActivated(true, ACTIVE_DELAY);\n const onPointerCancel: React.PointerEventHandler = (e) => {\n if (pointersUp.has(e.pointerId)) {\n pointersUp.delete(e.pointerId);\n return;\n }\n\n setActivated(false);\n };\n\n const onPointerUp: React.PointerEventHandler = (e) => {\n pointersUp.add(e.pointerId);\n setActivated(true);\n setActivated(false, activeEffectDelay);\n };\n\n return {\n active,\n onPointerLeave: hasActive ? onPointerCancel : noop,\n onPointerDown: hasActive ? onPointerDown : noop,\n onPointerCancel: hasActive ? onPointerCancel : noop,\n onPointerUp: hasActive ? onPointerUp : noop,\n };\n}\n\nexport const ClickableLockStateContext = React.createContext<undefined | ((v: boolean) => void)>(\n undefined,\n);\n\n/**\n * Блокирует стейт на всплытие\n */\nexport function useLockState() {\n const setLockBubbling = React.useContext(ClickableLockStateContext) || noop;\n const [lockState, setLockState] = React.useState(false);\n\n const setLockBubblingImmediate = callMultiple(setLockState, setLockBubbling);\n\n return [lockState, setLockBubbling, setLockBubblingImmediate] as const;\n}\n\n/**\n * Управляет состоянием компонента\n */\nexport function useState({ hasHover, hasActive, ...restProps }: StateProps) {\n const [lockState, setLockBubbling, setLockBubblingImmediate] = useLockState();\n\n const props = {\n hasHover: hasHover && !lockState,\n hasActive: hasActive && !lockState,\n ...restProps,\n };\n\n const { hover, ...hoverEvent } = useHover({ ...props });\n const { active, ...activeEvent } = useActive(props);\n\n const stateClassName = classNames(hover, active);\n const handlers = mergeCalls(hoverEvent, activeEvent);\n\n React.useEffect(() => {\n setLockBubbling(!!stateClassName);\n }, [setLockBubbling, stateClassName]);\n\n return {\n stateClassName,\n setLockBubblingImmediate,\n ...handlers,\n };\n}\n"],"names":["ACTIVE_DELAY","ClickableLockStateContext","DEFAULT_ACTIVE_EFFECT_DELAY","useLockState","useState","useHover","hovered","hoverClassName","hasHover","hoveredState","setHover","React","hover","undefined","onPointerEnter","e","pointerType","onPointerLeave","noop","useActive","activated","activeClassName","activeEffectDelay","hasActive","activatedState","setActivated","useStateWithDelay","pointersUp","useMemo","Set","active","onPointerDown","onPointerCancel","has","pointerId","delete","onPointerUp","add","createContext","setLockBubbling","useContext","lockState","setLockState","setLockBubblingImmediate","callMultiple","restProps","props","hoverEvent","activeEvent","stateClassName","classNames","handlers","mergeCalls","useEffect"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/Clickable/useState.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { mergeCalls } from '../../lib/mergeCalls';\nimport { useStateWithDelay } from './useStateWithDelay';\n\nexport interface StateProps {\n /**\n * Указывает, должен ли компонент реагировать на hover-состояние\n */\n hasHover?: boolean;\n /**\n * Позволяет управлять hovered-состоянием извне\n */\n hovered?: boolean;\n /**\n * Позволяет управлять activated-состоянием извне\n */\n activated?: boolean;\n /**\n * Указывает, должен ли компонент реагировать на active-состояние\n */\n hasActive?: boolean;\n\n /**\n * Длительность показа `activated`-состояния\n */\n activeEffectDelay?: number;\n\n /**\n * Стиль подсветки active-состояния\n */\n activeClassName?: string;\n\n /**\n * Стиль подсветки hover-состояния\n */\n hoverClassName?: string;\n}\n\ninterface StateHookProps extends StateProps {\n /**\n * Блокирование активации состояний\n */\n lockState: boolean;\n}\n\nexport const DEFAULT_ACTIVE_EFFECT_DELAY = 600;\n\nexport const ACTIVE_DELAY = 70;\n\n/**\n * Управляет наведением на компонент, игнорирует тач события\n */\nfunction useHover({ hovered, hoverClassName, hasHover = true, lockState }: StateHookProps) {\n const [hoveredState, setHover] = React.useState(false);\n\n const hover = hasHover && !lockState && (hovered || hoveredState) ? hoverClassName : undefined;\n\n const onPointerEnter: React.PointerEventHandler<any> = (e) => {\n if (e.pointerType === 'touch') {\n return;\n }\n\n setHover(true);\n };\n\n const onPointerLeave = () => {\n setHover(false);\n };\n\n return {\n hover,\n onPointerEnter: hasHover ? onPointerEnter : noop,\n onPointerLeave: hasHover ? onPointerLeave : noop,\n };\n}\n\n/**\n * Управляет активацией компонента\n */\nfunction useActive({\n activated,\n activeClassName,\n activeEffectDelay,\n hasActive = true,\n lockState,\n}: StateHookProps) {\n const [activatedState, setActivated] = useStateWithDelay(false);\n\n // Список нажатий которые не требуется отменять\n const pointersUp = React.useMemo(() => new Set<number>(), []);\n\n const active =\n hasActive && !lockState && (activated || activatedState) ? activeClassName : undefined;\n\n const onPointerDown = () => setActivated(true, ACTIVE_DELAY);\n const onPointerCancel: React.PointerEventHandler = (e) => {\n if (pointersUp.has(e.pointerId)) {\n pointersUp.delete(e.pointerId);\n return;\n }\n\n setActivated(false);\n };\n\n const onPointerUp: React.PointerEventHandler = (e) => {\n pointersUp.add(e.pointerId);\n setActivated(true);\n setActivated(false, activeEffectDelay);\n };\n\n return {\n active,\n onPointerLeave: hasActive ? onPointerCancel : noop,\n onPointerDown: hasActive ? onPointerDown : noop,\n onPointerCancel: hasActive ? onPointerCancel : noop,\n onPointerUp: hasActive ? onPointerUp : noop,\n };\n}\n\nexport const ClickableLockStateContext = React.createContext<undefined | ((v: boolean) => void)>(\n undefined,\n);\n\n/**\n * Блокирует стейт на всплытие\n */\nexport function useLockState() {\n const setLockBubbling = React.useContext(ClickableLockStateContext) || noop;\n const [lockState, setLockState] = React.useState(false);\n\n const setLockBubblingImmediate = callMultiple(setLockState, setLockBubbling);\n\n return [lockState, setLockBubbling, setLockBubblingImmediate] as const;\n}\n\n/**\n * Управляет состоянием компонента\n */\nexport function useState({ hasHover, hasActive, ...restProps }: StateProps) {\n const [lockState, setLockBubbling, setLockBubblingImmediate] = useLockState();\n\n const props = {\n hasHover,\n hasActive,\n lockState,\n ...restProps,\n };\n\n const { hover, ...hoverEvent } = useHover({ ...props });\n const { active, ...activeEvent } = useActive(props);\n\n const stateClassName = classNames(hover, active);\n const handlers = mergeCalls(hoverEvent, activeEvent);\n\n React.useEffect(() => {\n setLockBubbling(!!stateClassName);\n }, [setLockBubbling, stateClassName]);\n\n return {\n stateClassName,\n setLockBubblingImmediate,\n ...handlers,\n };\n}\n"],"names":["ACTIVE_DELAY","ClickableLockStateContext","DEFAULT_ACTIVE_EFFECT_DELAY","useLockState","useState","useHover","hovered","hoverClassName","hasHover","lockState","hoveredState","setHover","React","hover","undefined","onPointerEnter","e","pointerType","onPointerLeave","noop","useActive","activated","activeClassName","activeEffectDelay","hasActive","activatedState","setActivated","useStateWithDelay","pointersUp","useMemo","Set","active","onPointerDown","onPointerCancel","has","pointerId","delete","onPointerUp","add","createContext","setLockBubbling","useContext","setLockState","setLockBubblingImmediate","callMultiple","restProps","props","hoverEvent","activeEvent","stateClassName","classNames","handlers","mergeCalls","useEffect"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CustomScrollView.d.ts","sourceRoot":"","sources":["../../../../src/components/CustomScrollView/CustomScrollView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAwB,MAAM,wBAAwB,CAAC;AAenF,MAAM,WAAW,qBACf,SAAQ,KAAK,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAC7C,UAAU,CAAC,cAAc,CAAC,EAC1B,mBAAmB;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC1D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,iJAU1B,qBAAqB,4CA8KvB,CAAC"}
1
+ {"version":3,"file":"CustomScrollView.d.ts","sourceRoot":"","sources":["../../../../src/components/CustomScrollView/CustomScrollView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAwB,MAAM,wBAAwB,CAAC;AAenF,MAAM,WAAW,qBACf,SAAQ,KAAK,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAC7C,UAAU,CAAC,cAAc,CAAC,EAC1B,mBAAmB;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC1D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,iJAU1B,qBAAqB,4CAmLvB,CAAC"}
@@ -18,6 +18,7 @@ const _vkjs = require("@vkontakte/vkjs");
18
18
  const _useAdaptivity = require("../../hooks/useAdaptivity");
19
19
  const _useEventListener = require("../../hooks/useEventListener");
20
20
  const _useExternRef = require("../../hooks/useExternRef");
21
+ const _useResizeObserver = require("../../hooks/useResizeObserver");
21
22
  const _dom = require("../../lib/dom");
22
23
  const _useIsomorphicLayoutEffect = require("../../lib/useIsomorphicLayoutEffect");
23
24
  const _utils = require("../../lib/utils");
@@ -55,6 +56,7 @@ const CustomScrollView = (_param)=>{
55
56
  const startY = _react.useRef(0);
56
57
  const trackerTop = _react.useRef(0);
57
58
  const boxRef = (0, _useExternRef.useExternRef)(externalBoxRef);
59
+ const boxContentRef = _react.useRef(null);
58
60
  const barY = _react.useRef(null);
59
61
  const trackerY = _react.useRef(null);
60
62
  const setTrackerPosition = (scrollTop)=>{
@@ -96,6 +98,7 @@ const CustomScrollView = (_param)=>{
96
98
  windowResize,
97
99
  window
98
100
  ]);
101
+ (0, _useResizeObserver.useResizeObserver)(boxContentRef, resize);
99
102
  (0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(()=>{
100
103
  var _trackerY_current;
101
104
  let style = (_trackerY_current = trackerY.current) === null || _trackerY_current === void 0 ? void 0 : _trackerY_current.style;
@@ -171,7 +174,11 @@ const CustomScrollView = (_param)=>{
171
174
  tabIndex: -1,
172
175
  ref: boxRef,
173
176
  onScroll: scroll,
174
- children: children
177
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
178
+ ref: boxContentRef,
179
+ className: "vkuiCustomScrollView__box-content",
180
+ children: children
181
+ })
175
182
  }),
176
183
  /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
177
184
  className: "vkuiCustomScrollView__barY",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/CustomScrollView/CustomScrollView.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useEventListener } from '../../hooks/useEventListener';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useDOM } from '../../lib/dom';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { stopPropagation } from '../../lib/utils';\nimport type { HasRootRef } from '../../types';\nimport { TrackerOptionsProps, useTrackerVisibility } from './useTrackerVisibility';\nimport styles from './CustomScrollView.module.css';\n\nfunction hasPointerClassName(hasPointer: boolean | undefined) {\n switch (hasPointer) {\n case true:\n return styles['CustomScrollView--hasPointer-true'];\n case false:\n return styles['CustomScrollView--hasPointer-false'];\n case undefined:\n default:\n return styles['CustomScrollView--hasPointer-none'];\n }\n}\n\nexport interface CustomScrollViewProps\n extends React.AllHTMLAttributes<HTMLDivElement>,\n HasRootRef<HTMLDivElement>,\n TrackerOptionsProps {\n windowResize?: boolean;\n boxRef?: React.Ref<HTMLDivElement>;\n className?: HTMLDivElement['className'];\n onScroll?: (event: React.UIEvent<HTMLDivElement>) => void;\n children: React.ReactNode;\n}\n\nexport const CustomScrollView = ({\n className,\n children,\n boxRef: externalBoxRef,\n windowResize,\n autoHideScrollbar = false,\n autoHideScrollbarDelay,\n onScroll,\n getRootRef,\n ...restProps\n}: CustomScrollViewProps) => {\n const { document, window } = useDOM();\n const { hasPointer } = useAdaptivity();\n\n const ratio = React.useRef(NaN);\n const lastTrackerTop = React.useRef(0);\n const clientHeight = React.useRef(0);\n const trackerHeight = React.useRef(0);\n const scrollHeight = React.useRef(0);\n const transformProp = React.useRef('');\n const startY = React.useRef(0);\n const trackerTop = React.useRef(0);\n\n const boxRef = useExternRef(externalBoxRef);\n\n const barY = React.useRef<HTMLDivElement>(null);\n const trackerY = React.useRef<HTMLDivElement>(null);\n\n const setTrackerPosition = (scrollTop: number) => {\n lastTrackerTop.current = scrollTop;\n if (trackerY.current !== null) {\n (trackerY.current.style as any)[transformProp.current] = `translate(0, ${scrollTop}px)`;\n }\n };\n\n const setTrackerPositionFromScroll = (scrollTop: number) => {\n const progress = scrollTop / (scrollHeight.current - clientHeight.current);\n setTrackerPosition((clientHeight.current - trackerHeight.current) * progress);\n };\n\n const resize = () => {\n if (!boxRef.current || !barY.current || !trackerY.current) {\n return;\n }\n const localClientHeight = boxRef.current.clientHeight;\n const localScrollHeight = boxRef.current.scrollHeight;\n const localRatio = localClientHeight / localScrollHeight;\n const localTrackerHeight = Math.max(localClientHeight * localRatio, 40);\n\n ratio.current = localRatio;\n clientHeight.current = localClientHeight;\n scrollHeight.current = localScrollHeight;\n trackerHeight.current = localTrackerHeight;\n\n if (localRatio >= 1) {\n barY.current.style.display = 'none';\n } else {\n barY.current.style.display = '';\n trackerY.current.style.height = `${localTrackerHeight}px`;\n setTrackerPositionFromScroll(boxRef.current.scrollTop);\n }\n };\n\n const resizeHandler = useEventListener('resize', resize);\n\n useIsomorphicLayoutEffect(() => {\n if (windowResize && window) {\n resizeHandler.add(window);\n }\n }, [windowResize, window]);\n\n useIsomorphicLayoutEffect(() => {\n let style = trackerY.current?.style;\n let prop = '';\n if (style !== undefined) {\n if ('transform' in style) {\n prop = 'transform';\n } else if ('webkitTransform' in style) {\n prop = 'webkitTransform';\n }\n }\n transformProp.current = prop;\n }, []);\n\n useIsomorphicLayoutEffect(resize);\n\n const setScrollPositionFromTracker = (trackerTop: number) => {\n const progress = trackerTop / (clientHeight.current - trackerHeight.current);\n if (boxRef.current !== null) {\n boxRef.current.scrollTop = (scrollHeight.current - clientHeight.current) * progress;\n }\n };\n\n const onMove = (e: MouseEvent) => {\n e.preventDefault();\n const diff = e.clientY - startY.current;\n const position = Math.min(\n Math.max(trackerTop.current + diff, 0),\n clientHeight.current - trackerHeight.current,\n );\n\n setScrollPositionFromTracker(position);\n };\n\n const {\n trackerVisible,\n onTargetScroll,\n onTrackerDragStart,\n onTrackerDragStop,\n onTrackerMouseEnter,\n onTrackerMouseLeave,\n } = useTrackerVisibility(autoHideScrollbar, autoHideScrollbarDelay);\n\n const onUp = (e: MouseEvent) => {\n e.preventDefault();\n\n if (autoHideScrollbar) {\n onTrackerDragStop();\n }\n\n unsubscribe();\n };\n\n const scroll = (event: React.UIEvent<HTMLDivElement>) => {\n if (ratio.current >= 1 || !boxRef.current) {\n return;\n }\n\n if (autoHideScrollbar) {\n onTargetScroll();\n }\n\n setTrackerPositionFromScroll(boxRef.current.scrollTop);\n onScroll?.(event);\n };\n\n const listeners = [useEventListener('mousemove', onMove), useEventListener('mouseup', onUp)];\n\n function subscribe(el: Document | undefined) {\n if (el) {\n listeners.forEach((l) => l.add(el));\n }\n }\n\n function unsubscribe() {\n listeners.forEach((l) => l.remove());\n }\n\n const onDragStart = (e: React.MouseEvent) => {\n e.preventDefault();\n startY.current = e.clientY;\n trackerTop.current = lastTrackerTop.current;\n\n if (autoHideScrollbar) {\n onTrackerDragStart();\n }\n\n subscribe(document);\n };\n\n return (\n <div\n className={classNames(className, styles['CustomScrollView'], hasPointerClassName(hasPointer))}\n ref={getRootRef}\n {...restProps}\n >\n <div className={styles['CustomScrollView__box']} tabIndex={-1} ref={boxRef} onScroll={scroll}>\n {children}\n </div>\n\n <div className={styles['CustomScrollView__barY']} ref={barY} onClick={stopPropagation}>\n <div\n className={classNames(\n styles['CustomScrollView__trackerY'],\n !trackerVisible && styles['CustomScrollView__trackerY--hidden'],\n )}\n onMouseEnter={autoHideScrollbar ? onTrackerMouseEnter : undefined}\n onMouseLeave={autoHideScrollbar ? onTrackerMouseLeave : undefined}\n ref={trackerY}\n onMouseDown={onDragStart}\n />\n </div>\n </div>\n );\n};\n"],"names":["CustomScrollView","hasPointerClassName","hasPointer","undefined","className","children","boxRef","externalBoxRef","windowResize","autoHideScrollbar","autoHideScrollbarDelay","onScroll","getRootRef","restProps","document","window","useDOM","useAdaptivity","ratio","React","useRef","NaN","lastTrackerTop","clientHeight","trackerHeight","scrollHeight","transformProp","startY","trackerTop","useExternRef","barY","trackerY","setTrackerPosition","scrollTop","current","style","setTrackerPositionFromScroll","progress","resize","localClientHeight","localScrollHeight","localRatio","localTrackerHeight","Math","max","display","height","resizeHandler","useEventListener","useIsomorphicLayoutEffect","add","prop","setScrollPositionFromTracker","onMove","e","preventDefault","diff","clientY","position","min","trackerVisible","onTargetScroll","onTrackerDragStart","onTrackerDragStop","onTrackerMouseEnter","onTrackerMouseLeave","useTrackerVisibility","onUp","unsubscribe","scroll","event","listeners","subscribe","el","forEach","l","remove","onDragStart","div","classNames","ref","tabIndex","onClick","stopPropagation","onMouseEnter","onMouseLeave","onMouseDown"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;+BAmCaA;;;eAAAA;;;;;;;;iEAnCU;sBACI;+BACG;kCACG;8BACJ;qBACN;2CACmB;uBACV;sCAE0B;AAG1D,SAASC,oBAAoBC,UAA+B;IAC1D,OAAQA;QACN,KAAK;YACH;QACF,KAAK;YACH;QACF,KAAKC;QACL;YACE;IACJ;AACF;AAaO,MAAMH,mBAAmB;QAAC,EAC/BI,SAAS,EACTC,QAAQ,EACRC,QAAQC,cAAc,EACtBC,YAAY,EACZC,oBAAoB,KAAK,EACzBC,sBAAsB,EACtBC,QAAQ,EACRC,UAAU,EAEY,WADnBC;QARHT;QACAC;QACAC;QACAE;QACAC;QACAC;QACAC;QACAC;;IAGA,MAAM,EAAEE,QAAQ,EAAEC,MAAM,EAAE,GAAGC,IAAAA,WAAM;IACnC,MAAM,EAAEd,UAAU,EAAE,GAAGe,IAAAA,4BAAa;IAEpC,MAAMC,QAAQC,OAAMC,MAAM,CAACC;IAC3B,MAAMC,iBAAiBH,OAAMC,MAAM,CAAC;IACpC,MAAMG,eAAeJ,OAAMC,MAAM,CAAC;IAClC,MAAMI,gBAAgBL,OAAMC,MAAM,CAAC;IACnC,MAAMK,eAAeN,OAAMC,MAAM,CAAC;IAClC,MAAMM,gBAAgBP,OAAMC,MAAM,CAAC;IACnC,MAAMO,SAASR,OAAMC,MAAM,CAAC;IAC5B,MAAMQ,aAAaT,OAAMC,MAAM,CAAC;IAEhC,MAAMd,SAASuB,IAAAA,0BAAY,EAACtB;IAE5B,MAAMuB,OAAOX,OAAMC,MAAM,CAAiB;IAC1C,MAAMW,WAAWZ,OAAMC,MAAM,CAAiB;IAE9C,MAAMY,qBAAqB,CAACC;QAC1BX,eAAeY,OAAO,GAAGD;QACzB,IAAIF,SAASG,OAAO,KAAK,MAAM;YAC5BH,SAASG,OAAO,CAACC,KAAK,AAAQ,CAACT,cAAcQ,OAAO,CAAC,GAAG,CAAC,aAAa,EAAED,UAAU,GAAG,CAAC;QACzF;IACF;IAEA,MAAMG,+BAA+B,CAACH;QACpC,MAAMI,WAAWJ,YAAaR,CAAAA,aAAaS,OAAO,GAAGX,aAAaW,OAAO,AAAD;QACxEF,mBAAmB,AAACT,CAAAA,aAAaW,OAAO,GAAGV,cAAcU,OAAO,AAAD,IAAKG;IACtE;IAEA,MAAMC,SAAS;QACb,IAAI,CAAChC,OAAO4B,OAAO,IAAI,CAACJ,KAAKI,OAAO,IAAI,CAACH,SAASG,OAAO,EAAE;YACzD;QACF;QACA,MAAMK,oBAAoBjC,OAAO4B,OAAO,CAACX,YAAY;QACrD,MAAMiB,oBAAoBlC,OAAO4B,OAAO,CAACT,YAAY;QACrD,MAAMgB,aAAaF,oBAAoBC;QACvC,MAAME,qBAAqBC,KAAKC,GAAG,CAACL,oBAAoBE,YAAY;QAEpEvB,MAAMgB,OAAO,GAAGO;QAChBlB,aAAaW,OAAO,GAAGK;QACvBd,aAAaS,OAAO,GAAGM;QACvBhB,cAAcU,OAAO,GAAGQ;QAExB,IAAID,cAAc,GAAG;YACnBX,KAAKI,OAAO,CAACC,KAAK,CAACU,OAAO,GAAG;QAC/B,OAAO;YACLf,KAAKI,OAAO,CAACC,KAAK,CAACU,OAAO,GAAG;YAC7Bd,SAASG,OAAO,CAACC,KAAK,CAACW,MAAM,GAAG,CAAC,EAAEJ,mBAAmB,EAAE,CAAC;YACzDN,6BAA6B9B,OAAO4B,OAAO,CAACD,SAAS;QACvD;IACF;IAEA,MAAMc,gBAAgBC,IAAAA,kCAAgB,EAAC,UAAUV;IAEjDW,IAAAA,oDAAyB,EAAC;QACxB,IAAIzC,gBAAgBO,QAAQ;YAC1BgC,cAAcG,GAAG,CAACnC;QACpB;IACF,GAAG;QAACP;QAAcO;KAAO;IAEzBkC,IAAAA,oDAAyB,EAAC;YACZlB;QAAZ,IAAII,SAAQJ,oBAAAA,SAASG,OAAO,cAAhBH,wCAAAA,kBAAkBI,KAAK;QACnC,IAAIgB,OAAO;QACX,IAAIhB,UAAUhC,WAAW;YACvB,IAAI,eAAegC,OAAO;gBACxBgB,OAAO;YACT,OAAO,IAAI,qBAAqBhB,OAAO;gBACrCgB,OAAO;YACT;QACF;QACAzB,cAAcQ,OAAO,GAAGiB;IAC1B,GAAG,EAAE;IAELF,IAAAA,oDAAyB,EAACX;IAE1B,MAAMc,+BAA+B,CAACxB;QACpC,MAAMS,WAAWT,aAAcL,CAAAA,aAAaW,OAAO,GAAGV,cAAcU,OAAO,AAAD;QAC1E,IAAI5B,OAAO4B,OAAO,KAAK,MAAM;YAC3B5B,OAAO4B,OAAO,CAACD,SAAS,GAAG,AAACR,CAAAA,aAAaS,OAAO,GAAGX,aAAaW,OAAO,AAAD,IAAKG;QAC7E;IACF;IAEA,MAAMgB,SAAS,CAACC;QACdA,EAAEC,cAAc;QAChB,MAAMC,OAAOF,EAAEG,OAAO,GAAG9B,OAAOO,OAAO;QACvC,MAAMwB,WAAWf,KAAKgB,GAAG,CACvBhB,KAAKC,GAAG,CAAChB,WAAWM,OAAO,GAAGsB,MAAM,IACpCjC,aAAaW,OAAO,GAAGV,cAAcU,OAAO;QAG9CkB,6BAA6BM;IAC/B;IAEA,MAAM,EACJE,cAAc,EACdC,cAAc,EACdC,kBAAkB,EAClBC,iBAAiB,EACjBC,mBAAmB,EACnBC,mBAAmB,EACpB,GAAGC,IAAAA,0CAAoB,EAACzD,mBAAmBC;IAE5C,MAAMyD,OAAO,CAACb;QACZA,EAAEC,cAAc;QAEhB,IAAI9C,mBAAmB;YACrBsD;QACF;QAEAK;IACF;IAEA,MAAMC,SAAS,CAACC;QACd,IAAIpD,MAAMgB,OAAO,IAAI,KAAK,CAAC5B,OAAO4B,OAAO,EAAE;YACzC;QACF;QAEA,IAAIzB,mBAAmB;YACrBoD;QACF;QAEAzB,6BAA6B9B,OAAO4B,OAAO,CAACD,SAAS;QACrDtB,qBAAAA,+BAAAA,SAAW2D;IACb;IAEA,MAAMC,YAAY;QAACvB,IAAAA,kCAAgB,EAAC,aAAaK;QAASL,IAAAA,kCAAgB,EAAC,WAAWmB;KAAM;IAE5F,SAASK,UAAUC,EAAwB;QACzC,IAAIA,IAAI;YACNF,UAAUG,OAAO,CAAC,CAACC,IAAMA,EAAEzB,GAAG,CAACuB;QACjC;IACF;IAEA,SAASL;QACPG,UAAUG,OAAO,CAAC,CAACC,IAAMA,EAAEC,MAAM;IACnC;IAEA,MAAMC,cAAc,CAACvB;QACnBA,EAAEC,cAAc;QAChB5B,OAAOO,OAAO,GAAGoB,EAAEG,OAAO;QAC1B7B,WAAWM,OAAO,GAAGZ,eAAeY,OAAO;QAE3C,IAAIzB,mBAAmB;YACrBqD;QACF;QAEAU,UAAU1D;IACZ;IAEA,qBACE,sBAACgE;QACC1E,WAAW2E,IAAAA,gBAAU,EAAC3E,mCAAuCH,oBAAoBC;QACjF8E,KAAKpE;OACDC;;0BAEJ,qBAACiE;gBAAI1E,SAAS;gBAAmC6E,UAAU,CAAC;gBAAGD,KAAK1E;gBAAQK,UAAU0D;0BACnFhE;;0BAGH,qBAACyE;gBAAI1E,SAAS;gBAAoC4E,KAAKlD;gBAAMoD,SAASC,sBAAe;0BACnF,cAAA,qBAACL;oBACC1E,WAAW2E,IAAAA,gBAAU,oCAEnB,CAACnB;oBAEHwB,cAAc3E,oBAAoBuD,sBAAsB7D;oBACxDkF,cAAc5E,oBAAoBwD,sBAAsB9D;oBACxD6E,KAAKjD;oBACLuD,aAAaT;;;;;AAKvB"}
1
+ {"version":3,"sources":["../../../../src/components/CustomScrollView/CustomScrollView.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useEventListener } from '../../hooks/useEventListener';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useResizeObserver } from '../../hooks/useResizeObserver';\nimport { useDOM } from '../../lib/dom';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { stopPropagation } from '../../lib/utils';\nimport type { HasRootRef } from '../../types';\nimport { TrackerOptionsProps, useTrackerVisibility } from './useTrackerVisibility';\nimport styles from './CustomScrollView.module.css';\n\nfunction hasPointerClassName(hasPointer: boolean | undefined) {\n switch (hasPointer) {\n case true:\n return styles['CustomScrollView--hasPointer-true'];\n case false:\n return styles['CustomScrollView--hasPointer-false'];\n case undefined:\n default:\n return styles['CustomScrollView--hasPointer-none'];\n }\n}\n\nexport interface CustomScrollViewProps\n extends React.AllHTMLAttributes<HTMLDivElement>,\n HasRootRef<HTMLDivElement>,\n TrackerOptionsProps {\n windowResize?: boolean;\n boxRef?: React.Ref<HTMLDivElement>;\n className?: HTMLDivElement['className'];\n onScroll?: (event: React.UIEvent<HTMLDivElement>) => void;\n children: React.ReactNode;\n}\n\nexport const CustomScrollView = ({\n className,\n children,\n boxRef: externalBoxRef,\n windowResize,\n autoHideScrollbar = false,\n autoHideScrollbarDelay,\n onScroll,\n getRootRef,\n ...restProps\n}: CustomScrollViewProps) => {\n const { document, window } = useDOM();\n const { hasPointer } = useAdaptivity();\n\n const ratio = React.useRef(NaN);\n const lastTrackerTop = React.useRef(0);\n const clientHeight = React.useRef(0);\n const trackerHeight = React.useRef(0);\n const scrollHeight = React.useRef(0);\n const transformProp = React.useRef('');\n const startY = React.useRef(0);\n const trackerTop = React.useRef(0);\n\n const boxRef = useExternRef(externalBoxRef);\n const boxContentRef = React.useRef<HTMLDivElement>(null);\n\n const barY = React.useRef<HTMLDivElement>(null);\n const trackerY = React.useRef<HTMLDivElement>(null);\n\n const setTrackerPosition = (scrollTop: number) => {\n lastTrackerTop.current = scrollTop;\n if (trackerY.current !== null) {\n (trackerY.current.style as any)[transformProp.current] = `translate(0, ${scrollTop}px)`;\n }\n };\n\n const setTrackerPositionFromScroll = (scrollTop: number) => {\n const progress = scrollTop / (scrollHeight.current - clientHeight.current);\n setTrackerPosition((clientHeight.current - trackerHeight.current) * progress);\n };\n\n const resize = () => {\n if (!boxRef.current || !barY.current || !trackerY.current) {\n return;\n }\n const localClientHeight = boxRef.current.clientHeight;\n const localScrollHeight = boxRef.current.scrollHeight;\n const localRatio = localClientHeight / localScrollHeight;\n const localTrackerHeight = Math.max(localClientHeight * localRatio, 40);\n\n ratio.current = localRatio;\n clientHeight.current = localClientHeight;\n scrollHeight.current = localScrollHeight;\n trackerHeight.current = localTrackerHeight;\n\n if (localRatio >= 1) {\n barY.current.style.display = 'none';\n } else {\n barY.current.style.display = '';\n trackerY.current.style.height = `${localTrackerHeight}px`;\n setTrackerPositionFromScroll(boxRef.current.scrollTop);\n }\n };\n\n const resizeHandler = useEventListener('resize', resize);\n\n useIsomorphicLayoutEffect(() => {\n if (windowResize && window) {\n resizeHandler.add(window);\n }\n }, [windowResize, window]);\n\n useResizeObserver(boxContentRef, resize);\n\n useIsomorphicLayoutEffect(() => {\n let style = trackerY.current?.style;\n let prop = '';\n if (style !== undefined) {\n if ('transform' in style) {\n prop = 'transform';\n } else if ('webkitTransform' in style) {\n prop = 'webkitTransform';\n }\n }\n transformProp.current = prop;\n }, []);\n\n useIsomorphicLayoutEffect(resize);\n\n const setScrollPositionFromTracker = (trackerTop: number) => {\n const progress = trackerTop / (clientHeight.current - trackerHeight.current);\n if (boxRef.current !== null) {\n boxRef.current.scrollTop = (scrollHeight.current - clientHeight.current) * progress;\n }\n };\n\n const onMove = (e: MouseEvent) => {\n e.preventDefault();\n const diff = e.clientY - startY.current;\n const position = Math.min(\n Math.max(trackerTop.current + diff, 0),\n clientHeight.current - trackerHeight.current,\n );\n\n setScrollPositionFromTracker(position);\n };\n\n const {\n trackerVisible,\n onTargetScroll,\n onTrackerDragStart,\n onTrackerDragStop,\n onTrackerMouseEnter,\n onTrackerMouseLeave,\n } = useTrackerVisibility(autoHideScrollbar, autoHideScrollbarDelay);\n\n const onUp = (e: MouseEvent) => {\n e.preventDefault();\n\n if (autoHideScrollbar) {\n onTrackerDragStop();\n }\n\n unsubscribe();\n };\n\n const scroll = (event: React.UIEvent<HTMLDivElement>) => {\n if (ratio.current >= 1 || !boxRef.current) {\n return;\n }\n\n if (autoHideScrollbar) {\n onTargetScroll();\n }\n\n setTrackerPositionFromScroll(boxRef.current.scrollTop);\n onScroll?.(event);\n };\n\n const listeners = [useEventListener('mousemove', onMove), useEventListener('mouseup', onUp)];\n\n function subscribe(el: Document | undefined) {\n if (el) {\n listeners.forEach((l) => l.add(el));\n }\n }\n\n function unsubscribe() {\n listeners.forEach((l) => l.remove());\n }\n\n const onDragStart = (e: React.MouseEvent) => {\n e.preventDefault();\n startY.current = e.clientY;\n trackerTop.current = lastTrackerTop.current;\n\n if (autoHideScrollbar) {\n onTrackerDragStart();\n }\n\n subscribe(document);\n };\n\n return (\n <div\n className={classNames(className, styles['CustomScrollView'], hasPointerClassName(hasPointer))}\n ref={getRootRef}\n {...restProps}\n >\n <div className={styles['CustomScrollView__box']} tabIndex={-1} ref={boxRef} onScroll={scroll}>\n <div ref={boxContentRef} className={styles['CustomScrollView__box-content']}>\n {children}\n </div>\n </div>\n\n <div className={styles['CustomScrollView__barY']} ref={barY} onClick={stopPropagation}>\n <div\n className={classNames(\n styles['CustomScrollView__trackerY'],\n !trackerVisible && styles['CustomScrollView__trackerY--hidden'],\n )}\n onMouseEnter={autoHideScrollbar ? onTrackerMouseEnter : undefined}\n onMouseLeave={autoHideScrollbar ? onTrackerMouseLeave : undefined}\n ref={trackerY}\n onMouseDown={onDragStart}\n />\n </div>\n </div>\n );\n};\n"],"names":["CustomScrollView","hasPointerClassName","hasPointer","undefined","className","children","boxRef","externalBoxRef","windowResize","autoHideScrollbar","autoHideScrollbarDelay","onScroll","getRootRef","restProps","document","window","useDOM","useAdaptivity","ratio","React","useRef","NaN","lastTrackerTop","clientHeight","trackerHeight","scrollHeight","transformProp","startY","trackerTop","useExternRef","boxContentRef","barY","trackerY","setTrackerPosition","scrollTop","current","style","setTrackerPositionFromScroll","progress","resize","localClientHeight","localScrollHeight","localRatio","localTrackerHeight","Math","max","display","height","resizeHandler","useEventListener","useIsomorphicLayoutEffect","add","useResizeObserver","prop","setScrollPositionFromTracker","onMove","e","preventDefault","diff","clientY","position","min","trackerVisible","onTargetScroll","onTrackerDragStart","onTrackerDragStop","onTrackerMouseEnter","onTrackerMouseLeave","useTrackerVisibility","onUp","unsubscribe","scroll","event","listeners","subscribe","el","forEach","l","remove","onDragStart","div","classNames","ref","tabIndex","onClick","stopPropagation","onMouseEnter","onMouseLeave","onMouseDown"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -4,11 +4,12 @@ export type DatePickerDateFormat = {
4
4
  month: number;
5
5
  year: number;
6
6
  };
7
- export interface DatePickerProps extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'defaultValue' | 'min' | 'max'> {
7
+ export interface DatePickerProps extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'defaultValue' | 'value' | 'min' | 'max'> {
8
8
  min?: DatePickerDateFormat;
9
9
  max?: DatePickerDateFormat;
10
10
  name?: string;
11
11
  defaultValue?: DatePickerDateFormat;
12
+ value?: DatePickerDateFormat;
12
13
  popupDirection?: 'top' | 'bottom';
13
14
  monthNames?: string[];
14
15
  dayPlaceholder?: string;
@@ -20,5 +21,5 @@ export interface DatePickerProps extends Omit<HTMLAttributesWithRootRef<HTMLDivE
20
21
  /**
21
22
  * @see https://vkcom.github.io/VKUI/#/DatePicker
22
23
  */
23
- export declare const DatePicker: ({ defaultValue, ...props }: DatePickerProps) => import("react/jsx-runtime").JSX.Element;
24
+ export declare const DatePicker: ({ onDateChange, ...props }: DatePickerProps) => import("react/jsx-runtime").JSX.Element;
24
25
  //# sourceMappingURL=DatePicker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAwB,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAqB9E,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,WAAW,eACf,SAAQ,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,KAAK,GAAG,KAAK,CAAC;IACvF,GAAG,CAAC,EAAE,oBAAoB,CAAC;IAC3B,GAAG,CAAC,EAAE,oBAAoB,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,cAAc,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA0ID;;GAEG;AACH,eAAO,MAAM,UAAU,+BAAgC,eAAe,4CAkBrE,CAAC"}
1
+ {"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAwB,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAqB9E,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAIF,MAAM,WAAW,eACf,SAAQ,IAAI,CACV,yBAAyB,CAAC,cAAc,CAAC,EACzC,cAAc,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,CACzC;IACD,GAAG,CAAC,EAAE,oBAAoB,CAAC;IAC3B,GAAG,CAAC,EAAE,oBAAoB,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,cAAc,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA6KD;;GAEG;AACH,eAAO,MAAM,UAAU,+BAAgC,eAAe,4CASrE,CAAC"}
@@ -15,8 +15,11 @@ const _object_without_properties = require("@swc/helpers/_/_object_without_prope
15
15
  const _jsxruntime = require("react/jsx-runtime");
16
16
  const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
17
17
  const _vkjs = require("@vkontakte/vkjs");
18
+ const _math = require("../../helpers/math");
18
19
  const _range = require("../../helpers/range");
19
20
  const _useAdaptivityHasPointer = require("../../hooks/useAdaptivityHasPointer");
21
+ const _useEnsuredControl = require("../../hooks/useEnsuredControl");
22
+ const _useNativeFormResetListener = require("../../hooks/useNativeFormResetListener");
20
23
  const _CustomSelect = require("../CustomSelect/CustomSelect");
21
24
  const _Input = require("../Input/Input");
22
25
  const _RootComponent = require("../RootComponent/RootComponent");
@@ -34,12 +37,24 @@ const DefaultMonths = [
34
37
  'Ноября',
35
38
  'Декабря'
36
39
  ];
40
+ const DEFAULT_EMPTY_DATE = {
41
+ day: 0,
42
+ month: 0,
43
+ year: 0
44
+ };
37
45
  // Переводим state к формату гг-мм-дд
38
- function convertToInputFormat({ day = 0, month = 0, year = 0 }) {
46
+ function convertToInputFormat(value) {
47
+ if (!value) {
48
+ return undefined;
49
+ }
50
+ const { day = 0, month = 0, year = 0 } = value;
39
51
  return `${year}-${(0, _vkjs.leadingZero)(month)}-${(0, _vkjs.leadingZero)(day)}`;
40
52
  }
41
53
  // Переводим дату формата гг-мм-дд к объекту
42
54
  function parseInputDate(date) {
55
+ if (date.length === 0) {
56
+ return DEFAULT_EMPTY_DATE;
57
+ }
43
58
  const splited = date.split('-');
44
59
  return {
45
60
  day: Number(splited[2]),
@@ -59,7 +74,7 @@ const DatePickerCustom = (_param)=>{
59
74
  day: 31,
60
75
  month: 12,
61
76
  year: 2100
62
- }, dayPlaceholder, monthPlaceholder, yearPlaceholder, popupDirection, defaultValue, monthNames, day = 0, month = 0, year = 0, onDateChange, disabled } = _param, restProps = _object_without_properties._(_param, [
77
+ }, dayPlaceholder, monthPlaceholder, yearPlaceholder, popupDirection, value, monthNames, onDateChange, disabled, defaultValue = DEFAULT_EMPTY_DATE } = _param, restProps = _object_without_properties._(_param, [
63
78
  "name",
64
79
  "min",
65
80
  "max",
@@ -67,23 +82,30 @@ const DatePickerCustom = (_param)=>{
67
82
  "monthPlaceholder",
68
83
  "yearPlaceholder",
69
84
  "popupDirection",
70
- "defaultValue",
85
+ "value",
71
86
  "monthNames",
72
- "day",
73
- "month",
74
- "year",
75
87
  "onDateChange",
76
- "disabled"
88
+ "disabled",
89
+ "defaultValue"
77
90
  ]);
91
+ const isControlled = value !== undefined;
92
+ const [internalValue, setInternalValue] = (0, _useEnsuredControl.useCustomEnsuredControl)({
93
+ value,
94
+ defaultValue
95
+ });
96
+ const hiddenInput = _react.useRef(null);
78
97
  const onSelectChange = (e)=>{
79
- onDateChange === null || onDateChange === void 0 ? void 0 : onDateChange({
80
- day,
81
- month,
82
- year,
83
- [e.target.name]: Number(e.target.value)
84
- });
98
+ const nextDate = {
99
+ day: internalValue.day,
100
+ month: internalValue.month,
101
+ year: internalValue.year
102
+ };
103
+ nextDate[e.target.name] = Number(e.target.value);
104
+ nextDate.day = nextDate.day ? (0, _math.clamp)(nextDate.day, 1, getMonthMaxDay(nextDate.month, nextDate.year)) : nextDate.day;
105
+ setInternalValue(nextDate);
106
+ onDateChange === null || onDateChange === void 0 ? void 0 : onDateChange(nextDate);
85
107
  };
86
- const dayOptions = (0, _range.range)(1, getMonthMaxDay(month, year)).map((value)=>({
108
+ const dayOptions = (0, _range.range)(1, getMonthMaxDay(internalValue.month, internalValue.year)).map((value)=>({
87
109
  label: String(value),
88
110
  value
89
111
  }));
@@ -95,6 +117,11 @@ const DatePickerCustom = (_param)=>{
95
117
  label: String(value),
96
118
  value: value
97
119
  }));
120
+ (0, _useNativeFormResetListener.useNativeFormResetListener)(hiddenInput, ()=>{
121
+ if (!isControlled) {
122
+ setInternalValue(defaultValue);
123
+ }
124
+ });
98
125
  return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_RootComponent.RootComponent, _object_spread_props._(_object_spread._({
99
126
  baseClassName: "vkuiDatePicker"
100
127
  }, restProps), {
@@ -106,7 +133,7 @@ const DatePickerCustom = (_param)=>{
106
133
  className: "vkuiDatePicker__day",
107
134
  children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_CustomSelect.CustomSelect, {
108
135
  name: "day",
109
- value: day,
136
+ value: internalValue.day,
110
137
  options: dayOptions,
111
138
  placeholder: dayPlaceholder,
112
139
  popupDirection: popupDirection,
@@ -119,7 +146,7 @@ const DatePickerCustom = (_param)=>{
119
146
  children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_CustomSelect.CustomSelect, {
120
147
  className: "vkuiDatePicker__monthSelect",
121
148
  name: "month",
122
- value: month,
149
+ value: internalValue.month,
123
150
  options: monthOptions,
124
151
  placeholder: monthPlaceholder,
125
152
  popupDirection: popupDirection,
@@ -131,7 +158,7 @@ const DatePickerCustom = (_param)=>{
131
158
  className: "vkuiDatePicker__year",
132
159
  children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_CustomSelect.CustomSelect, {
133
160
  name: "year",
134
- value: year,
161
+ value: internalValue.year,
135
162
  options: yearOptions,
136
163
  placeholder: yearPlaceholder,
137
164
  popupDirection: popupDirection,
@@ -144,11 +171,8 @@ const DatePickerCustom = (_param)=>{
144
171
  /*#__PURE__*/ (0, _jsxruntime.jsx)("input", {
145
172
  type: "hidden",
146
173
  name: name,
147
- value: convertToInputFormat({
148
- day,
149
- month,
150
- year
151
- })
174
+ ref: hiddenInput,
175
+ value: convertToInputFormat(internalValue)
152
176
  })
153
177
  ]
154
178
  }));
@@ -162,7 +186,7 @@ const DatePickerNative = (_param)=>{
162
186
  day: 31,
163
187
  month: 12,
164
188
  year: 2100
165
- }, monthNames, popupDirection, dayPlaceholder, monthPlaceholder, yearPlaceholder, defaultValue, day, month, year, onDateChange } = _param, restProps = _object_without_properties._(_param, [
189
+ }, monthNames, popupDirection, dayPlaceholder, monthPlaceholder, yearPlaceholder, value, defaultValue = DEFAULT_EMPTY_DATE, onDateChange } = _param, restProps = _object_without_properties._(_param, [
166
190
  "min",
167
191
  "max",
168
192
  "monthNames",
@@ -170,51 +194,41 @@ const DatePickerNative = (_param)=>{
170
194
  "dayPlaceholder",
171
195
  "monthPlaceholder",
172
196
  "yearPlaceholder",
197
+ "value",
173
198
  "defaultValue",
174
- "day",
175
- "month",
176
- "year",
177
199
  "onDateChange"
178
200
  ]);
179
- const defProps = day && month && year ? {
180
- defaultValue: convertToInputFormat({
181
- day,
182
- month,
183
- year
184
- })
185
- } : {};
186
201
  const onStringChange = _react.useCallback((e)=>{
187
202
  onDateChange === null || onDateChange === void 0 ? void 0 : onDateChange(parseInputDate(e.currentTarget.value));
188
203
  }, [
189
204
  onDateChange
190
205
  ]);
191
206
  const inputProps = restProps;
192
- return /*#__PURE__*/ (0, _jsxruntime.jsx)(_Input.Input, _object_spread._(_object_spread_props._(_object_spread._({}, inputProps), {
207
+ if (value) {
208
+ // контролируемый компонент
209
+ inputProps.value = convertToInputFormat(value);
210
+ } else {
211
+ // неконтролируемый компонент
212
+ inputProps.defaultValue = convertToInputFormat(defaultValue);
213
+ }
214
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(_Input.Input, _object_spread_props._(_object_spread._({}, inputProps), {
193
215
  type: "date",
194
216
  onChange: onStringChange,
195
217
  min: convertToInputFormat(min),
196
218
  max: convertToInputFormat(max)
197
- }), defProps));
219
+ }));
198
220
  };
199
221
  const DatePicker = (_param)=>{
200
- var { defaultValue } = _param, props = _object_without_properties._(_param, [
201
- "defaultValue"
222
+ var { onDateChange } = _param, props = _object_without_properties._(_param, [
223
+ "onDateChange"
202
224
  ]);
203
225
  const hasPointer = (0, _useAdaptivityHasPointer.useAdaptivityHasPointer)();
204
- const [value, setValue] = _react.useState(()=>({
205
- day: (defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.day) || 0,
206
- month: (defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.month) || 0,
207
- year: (defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.year) || 0
208
- }));
209
- const onDateChange = _react.useCallback((update)=>{
210
- setValue(update);
211
- props.onDateChange && props.onDateChange(_object_spread._({}, update));
212
- }, [
213
- props
214
- ]);
226
+ const onChange = (update)=>{
227
+ onDateChange && onDateChange(_object_spread._({}, update));
228
+ };
215
229
  const Cmp = hasPointer ? DatePickerCustom : DatePickerNative;
216
- return /*#__PURE__*/ (0, _jsxruntime.jsx)(Cmp, _object_spread_props._(_object_spread._({}, props, value), {
217
- onDateChange: onDateChange
230
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(Cmp, _object_spread_props._(_object_spread._({}, props), {
231
+ onDateChange: onChange
218
232
  }));
219
233
  };
220
234
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import * as React from 'react';\nimport { leadingZero } from '@vkontakte/vkjs';\nimport { range } from '../../helpers/range';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { HasOnlyExpectedProps, HTMLAttributesWithRootRef } from '../../types';\nimport { CustomSelect } from '../CustomSelect/CustomSelect';\nimport { Input, type InputProps } from '../Input/Input';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './DatePicker.module.css';\n\nconst DefaultMonths: string[] = [\n 'Января',\n 'Февраля',\n 'Марта',\n 'Апреля',\n 'Мая',\n 'Июня',\n 'Июля',\n 'Августа',\n 'Сентября',\n 'Октября',\n 'Ноября',\n 'Декабря',\n];\n\nexport type DatePickerDateFormat = {\n day: number;\n month: number;\n year: number;\n};\n\nexport interface DatePickerProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'defaultValue' | 'min' | 'max'> {\n min?: DatePickerDateFormat;\n max?: DatePickerDateFormat;\n name?: string;\n defaultValue?: DatePickerDateFormat;\n popupDirection?: 'top' | 'bottom';\n monthNames?: string[];\n dayPlaceholder?: string;\n monthPlaceholder?: string;\n yearPlaceholder?: string;\n onDateChange?: (value: DatePickerDateFormat) => void;\n disabled?: boolean;\n}\n\n// Переводим state к формату гг-мм-дд\nfunction convertToInputFormat({ day = 0, month = 0, year = 0 }: Partial<DatePickerDateFormat>) {\n return `${year}-${leadingZero(month)}-${leadingZero(day)}`;\n}\n\n// Переводим дату формата гг-мм-дд к объекту\nfunction parseInputDate(date: string): DatePickerDateFormat {\n const splited = date.split('-');\n\n return {\n day: Number(splited[2]),\n month: Number(splited[1]),\n year: Number(splited[0]),\n };\n}\n\nfunction getMonthMaxDay(month?: number, year?: number) {\n return month ? new Date(year || 2016, month, 0).getDate() : 31;\n}\n\nconst DatePickerCustom = ({\n name,\n min = { day: 0, month: 0, year: 0 },\n max = { day: 31, month: 12, year: 2100 },\n dayPlaceholder,\n monthPlaceholder,\n yearPlaceholder,\n popupDirection,\n defaultValue,\n monthNames,\n day = 0,\n month = 0,\n year = 0,\n onDateChange,\n disabled,\n ...restProps\n}: DatePickerProps & Partial<DatePickerDateFormat>) => {\n const onSelectChange: React.ChangeEventHandler<HTMLSelectElement> = (e) => {\n onDateChange?.({\n day,\n month,\n year,\n [e.target.name]: Number(e.target.value),\n });\n };\n const dayOptions = range(1, getMonthMaxDay(month, year)).map((value) => ({\n label: String(value),\n value,\n }));\n const monthOptions = (monthNames || DefaultMonths).map((name, index) => ({\n label: name,\n value: index + 1,\n }));\n const yearOptions = range(max.year, min.year).map((value) => ({\n label: String(value),\n value: value,\n }));\n return (\n <RootComponent baseClassName={styles['DatePicker']} {...restProps}>\n <div className={styles['DatePicker__container']}>\n <div className={styles['DatePicker__day']}>\n <CustomSelect\n name=\"day\"\n value={day}\n options={dayOptions}\n placeholder={dayPlaceholder}\n popupDirection={popupDirection}\n onChange={onSelectChange}\n disabled={disabled}\n />\n </div>\n <div className={styles['DatePicker__month']}>\n <CustomSelect\n className={styles['DatePicker__monthSelect']}\n name=\"month\"\n value={month}\n options={monthOptions}\n placeholder={monthPlaceholder}\n popupDirection={popupDirection}\n onChange={onSelectChange}\n disabled={disabled}\n />\n </div>\n <div className={styles['DatePicker__year']}>\n <CustomSelect\n name=\"year\"\n value={year}\n options={yearOptions}\n placeholder={yearPlaceholder}\n popupDirection={popupDirection}\n onChange={onSelectChange}\n disabled={disabled}\n />\n </div>\n </div>\n <input type=\"hidden\" name={name} value={convertToInputFormat({ day, month, year })} />\n </RootComponent>\n );\n};\n\nconst DatePickerNative = ({\n min = { day: 0, month: 0, year: 0 },\n max = { day: 31, month: 12, year: 2100 },\n monthNames,\n popupDirection,\n dayPlaceholder,\n monthPlaceholder,\n yearPlaceholder,\n defaultValue,\n day,\n month,\n year,\n onDateChange,\n ...restProps\n}: DatePickerProps & Partial<DatePickerDateFormat>) => {\n const defProps =\n day && month && year ? { defaultValue: convertToInputFormat({ day, month, year }) } : {};\n const onStringChange: React.ChangeEventHandler<HTMLInputElement> = React.useCallback(\n (e) => {\n onDateChange?.(parseInputDate(e.currentTarget.value));\n },\n [onDateChange],\n );\n const inputProps: HasOnlyExpectedProps<typeof restProps, InputProps> = restProps;\n return (\n <Input\n {...inputProps}\n type=\"date\"\n onChange={onStringChange}\n min={convertToInputFormat(min)}\n max={convertToInputFormat(max)}\n {...defProps}\n />\n );\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/DatePicker\n */\nexport const DatePicker = ({ defaultValue, ...props }: DatePickerProps) => {\n const hasPointer = useAdaptivityHasPointer();\n const [value, setValue] = React.useState<Partial<DatePickerDateFormat>>(() => ({\n day: defaultValue?.day || 0,\n month: defaultValue?.month || 0,\n year: defaultValue?.year || 0,\n }));\n\n const onDateChange = React.useCallback(\n (update: DatePickerDateFormat) => {\n setValue(update);\n props.onDateChange && props.onDateChange({ ...update });\n },\n [props],\n );\n\n const Cmp = hasPointer ? DatePickerCustom : DatePickerNative;\n return <Cmp {...props} {...value} onDateChange={onDateChange} />;\n};\n"],"names":["DatePicker","DefaultMonths","convertToInputFormat","day","month","year","leadingZero","parseInputDate","date","splited","split","Number","getMonthMaxDay","Date","getDate","DatePickerCustom","name","min","max","dayPlaceholder","monthPlaceholder","yearPlaceholder","popupDirection","defaultValue","monthNames","onDateChange","disabled","restProps","onSelectChange","e","target","value","dayOptions","range","map","label","String","monthOptions","index","yearOptions","RootComponent","baseClassName","div","className","CustomSelect","options","placeholder","onChange","input","type","DatePickerNative","defProps","onStringChange","React","useCallback","currentTarget","inputProps","Input","props","hasPointer","useAdaptivityHasPointer","setValue","useState","update","Cmp"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import * as React from 'react';\nimport { leadingZero } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { range } from '../../helpers/range';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { useCustomEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { useNativeFormResetListener } from '../../hooks/useNativeFormResetListener';\nimport { HasOnlyExpectedProps, HTMLAttributesWithRootRef } from '../../types';\nimport { CustomSelect } from '../CustomSelect/CustomSelect';\nimport { Input, type InputProps } from '../Input/Input';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './DatePicker.module.css';\n\nconst DefaultMonths: string[] = [\n 'Января',\n 'Февраля',\n 'Марта',\n 'Апреля',\n 'Мая',\n 'Июня',\n 'Июля',\n 'Августа',\n 'Сентября',\n 'Октября',\n 'Ноября',\n 'Декабря',\n];\n\nexport type DatePickerDateFormat = {\n day: number;\n month: number;\n year: number;\n};\n\nconst DEFAULT_EMPTY_DATE = { day: 0, month: 0, year: 0 };\n\nexport interface DatePickerProps\n extends Omit<\n HTMLAttributesWithRootRef<HTMLDivElement>,\n 'defaultValue' | 'value' | 'min' | 'max'\n > {\n min?: DatePickerDateFormat;\n max?: DatePickerDateFormat;\n name?: string;\n defaultValue?: DatePickerDateFormat;\n value?: DatePickerDateFormat;\n popupDirection?: 'top' | 'bottom';\n monthNames?: string[];\n dayPlaceholder?: string;\n monthPlaceholder?: string;\n yearPlaceholder?: string;\n onDateChange?: (value: DatePickerDateFormat) => void; // TODO [>=7] заменить на onChange\n disabled?: boolean;\n}\n\n// Переводим state к формату гг-мм-дд\nfunction convertToInputFormat(value: Partial<DatePickerDateFormat> | undefined) {\n if (!value) {\n return undefined;\n }\n const { day = 0, month = 0, year = 0 } = value;\n return `${year}-${leadingZero(month)}-${leadingZero(day)}`;\n}\n\n// Переводим дату формата гг-мм-дд к объекту\nfunction parseInputDate(date: string): DatePickerDateFormat {\n if (date.length === 0) {\n return DEFAULT_EMPTY_DATE;\n }\n const splited = date.split('-');\n\n return {\n day: Number(splited[2]),\n month: Number(splited[1]),\n year: Number(splited[0]),\n };\n}\n\nfunction getMonthMaxDay(month?: number, year?: number) {\n return month ? new Date(year || 2016, month, 0).getDate() : 31;\n}\n\nconst DatePickerCustom = ({\n name,\n min = { day: 0, month: 0, year: 0 },\n max = { day: 31, month: 12, year: 2100 },\n dayPlaceholder,\n monthPlaceholder,\n yearPlaceholder,\n popupDirection,\n value,\n monthNames,\n onDateChange,\n disabled,\n defaultValue = DEFAULT_EMPTY_DATE,\n ...restProps\n}: DatePickerProps) => {\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useCustomEnsuredControl({ value, defaultValue });\n const hiddenInput = React.useRef<HTMLInputElement>(null);\n\n const onSelectChange: React.ChangeEventHandler<HTMLSelectElement> = (e) => {\n const nextDate = {\n day: internalValue.day,\n month: internalValue.month,\n year: internalValue.year,\n };\n nextDate[e.target.name as keyof typeof nextDate] = Number(e.target.value);\n nextDate.day = nextDate.day\n ? clamp(nextDate.day, 1, getMonthMaxDay(nextDate.month, nextDate.year))\n : nextDate.day;\n setInternalValue(nextDate);\n onDateChange?.(nextDate);\n };\n const dayOptions = range(1, getMonthMaxDay(internalValue.month, internalValue.year)).map(\n (value) => ({\n label: String(value),\n value,\n }),\n );\n const monthOptions = (monthNames || DefaultMonths).map((name, index) => ({\n label: name,\n value: index + 1,\n }));\n const yearOptions = range(max.year, min.year).map((value) => ({\n label: String(value),\n value: value,\n }));\n\n useNativeFormResetListener(hiddenInput, () => {\n if (!isControlled) {\n setInternalValue(defaultValue);\n }\n });\n\n return (\n <RootComponent baseClassName={styles['DatePicker']} {...restProps}>\n <div className={styles['DatePicker__container']}>\n <div className={styles['DatePicker__day']}>\n <CustomSelect\n name=\"day\"\n value={internalValue.day}\n options={dayOptions}\n placeholder={dayPlaceholder}\n popupDirection={popupDirection}\n onChange={onSelectChange}\n disabled={disabled}\n />\n </div>\n <div className={styles['DatePicker__month']}>\n <CustomSelect\n className={styles['DatePicker__monthSelect']}\n name=\"month\"\n value={internalValue.month}\n options={monthOptions}\n placeholder={monthPlaceholder}\n popupDirection={popupDirection}\n onChange={onSelectChange}\n disabled={disabled}\n />\n </div>\n <div className={styles['DatePicker__year']}>\n <CustomSelect\n name=\"year\"\n value={internalValue.year}\n options={yearOptions}\n placeholder={yearPlaceholder}\n popupDirection={popupDirection}\n onChange={onSelectChange}\n disabled={disabled}\n />\n </div>\n </div>\n <input\n type=\"hidden\"\n name={name}\n ref={hiddenInput}\n value={convertToInputFormat(internalValue)}\n />\n </RootComponent>\n );\n};\n\nconst DatePickerNative = ({\n min = { day: 0, month: 0, year: 0 },\n max = { day: 31, month: 12, year: 2100 },\n monthNames,\n popupDirection,\n dayPlaceholder,\n monthPlaceholder,\n yearPlaceholder,\n value,\n defaultValue = DEFAULT_EMPTY_DATE,\n onDateChange,\n ...restProps\n}: DatePickerProps) => {\n const onStringChange: React.ChangeEventHandler<HTMLInputElement> = React.useCallback(\n (e) => {\n onDateChange?.(parseInputDate(e.currentTarget.value));\n },\n [onDateChange],\n );\n const inputProps: HasOnlyExpectedProps<\n typeof restProps & Pick<InputProps, 'value' | 'defaultValue'>,\n InputProps\n > = restProps;\n\n if (value) {\n // контролируемый компонент\n inputProps.value = convertToInputFormat(value);\n } else {\n // неконтролируемый компонент\n inputProps.defaultValue = convertToInputFormat(defaultValue);\n }\n\n return (\n <Input\n {...inputProps}\n type=\"date\"\n onChange={onStringChange}\n min={convertToInputFormat(min)}\n max={convertToInputFormat(max)}\n />\n );\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/DatePicker\n */\nexport const DatePicker = ({ onDateChange, ...props }: DatePickerProps) => {\n const hasPointer = useAdaptivityHasPointer();\n\n const onChange = (update: DatePickerDateFormat) => {\n onDateChange && onDateChange({ ...update });\n };\n\n const Cmp = hasPointer ? DatePickerCustom : DatePickerNative;\n return <Cmp {...props} onDateChange={onChange} />;\n};\n"],"names":["DatePicker","DefaultMonths","DEFAULT_EMPTY_DATE","day","month","year","convertToInputFormat","value","undefined","leadingZero","parseInputDate","date","length","splited","split","Number","getMonthMaxDay","Date","getDate","DatePickerCustom","name","min","max","dayPlaceholder","monthPlaceholder","yearPlaceholder","popupDirection","monthNames","onDateChange","disabled","defaultValue","restProps","isControlled","internalValue","setInternalValue","useCustomEnsuredControl","hiddenInput","React","useRef","onSelectChange","e","nextDate","target","clamp","dayOptions","range","map","label","String","monthOptions","index","yearOptions","useNativeFormResetListener","RootComponent","baseClassName","div","className","CustomSelect","options","placeholder","onChange","input","type","ref","DatePickerNative","onStringChange","useCallback","currentTarget","inputProps","Input","props","hasPointer","useAdaptivityHasPointer","update","Cmp"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1,6 +1,6 @@
1
- import * as React from 'react';
1
+ import { AllHTMLAttributes } from 'react';
2
2
  import { HasComponent, HasRootRef } from '../../types';
3
- export interface FocusTrapProps<T extends HTMLElement = HTMLElement> extends React.AllHTMLAttributes<T>, HasRootRef<T>, HasComponent {
3
+ export interface FocusTrapProps<T extends HTMLElement = HTMLElement> extends AllHTMLAttributes<T>, HasRootRef<T>, HasComponent {
4
4
  autoFocus?: boolean;
5
5
  restoreFocus?: boolean | (() => boolean);
6
6
  timeout?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"FocusTrap.d.ts","sourceRoot":"","sources":["../../../../src/components/FocusTrap/FocusTrap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIvD,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CACjE,SAAQ,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAChC,UAAU,CAAC,CAAC,CAAC,EACb,YAAY;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,sIASnB,eAAe,CAAC,CAAC,4CA0InB,CAAC"}
1
+ {"version":3,"file":"FocusTrap.d.ts","sourceRoot":"","sources":["../../../../src/components/FocusTrap/FocusTrap.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAsB,MAAM,OAAO,CAAC;AAW9D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIvD,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CACjE,SAAQ,iBAAiB,CAAC,CAAC,CAAC,EAC1B,UAAU,CAAC,CAAC,CAAC,EACb,YAAY;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,sIASnB,eAAe,CAAC,CAAC,4CA2KnB,CAAC"}
@@ -8,12 +8,11 @@ Object.defineProperty(exports, "FocusTrap", {
8
8
  return FocusTrap;
9
9
  }
10
10
  });
11
- const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
12
11
  const _object_spread = require("@swc/helpers/_/_object_spread");
13
12
  const _object_spread_props = require("@swc/helpers/_/_object_spread_props");
14
13
  const _object_without_properties = require("@swc/helpers/_/_object_without_properties");
15
14
  const _jsxruntime = require("react/jsx-runtime");
16
- const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
15
+ const _react = require("react");
17
16
  const _useExternRef = require("../../hooks/useExternRef");
18
17
  const _accessibility = require("../../lib/accessibility");
19
18
  const _dom = require("../../lib/dom");
@@ -31,15 +30,20 @@ const FocusTrap = (_param)=>{
31
30
  "children"
32
31
  ]);
33
32
  const ref = (0, _useExternRef.useExternRef)(getRootRef);
34
- const { keyboardInput } = _react.useContext(_AppRootContext.AppRootContext);
35
- const focusableNodesRef = _react.useRef([]);
36
- (0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(function collectFocusableNodesRef() {
37
- if (!ref.current) {
38
- return;
33
+ const { document } = (0, _dom.useDOM)();
34
+ const { keyboardInput } = (0, _react.useContext)(_AppRootContext.AppRootContext);
35
+ const focusableNodesRef = (0, _react.useRef)([]);
36
+ const focusNodeByIndex = (nodeIndex)=>{
37
+ const element = focusableNodesRef.current[nodeIndex];
38
+ if (element) {
39
+ element.focus();
39
40
  }
40
- const nodes = [];
41
+ };
42
+ const recalculateFocusableNodesRef = (parentNode)=>{
41
43
  // eslint-disable-next-line no-restricted-properties
42
- ref.current.querySelectorAll(FOCUSABLE_ELEMENTS).forEach((focusableEl)=>{
44
+ const newFocusableElements = parentNode.querySelectorAll(FOCUSABLE_ELEMENTS);
45
+ const nodes = [];
46
+ newFocusableElements.forEach((focusableEl)=>{
43
47
  const { display, visibility } = getComputedStyle(focusableEl);
44
48
  if (display !== 'none' && visibility !== 'hidden') {
45
49
  nodes.push(focusableEl);
@@ -47,11 +51,32 @@ const FocusTrap = (_param)=>{
47
51
  });
48
52
  if (nodes.length === 0) {
49
53
  // Чтобы фокус был хотя бы на родителе
50
- nodes.push(ref.current);
54
+ nodes.push(parentNode);
51
55
  }
52
56
  focusableNodesRef.current = nodes;
57
+ };
58
+ const onMutateParentHandler = (parentNode)=>{
59
+ recalculateFocusableNodesRef(parentNode);
60
+ if (document) {
61
+ const activeElement = document.activeElement;
62
+ const currentElementIndex = Math.max(document.activeElement ? focusableNodesRef.current.indexOf(activeElement) : -1, 0);
63
+ focusNodeByIndex(currentElementIndex);
64
+ }
65
+ };
66
+ (0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(function collectFocusableNodesRef() {
67
+ if (!ref.current) {
68
+ return;
69
+ }
70
+ const parentNode = ref.current;
71
+ const observer = new MutationObserver(()=>onMutateParentHandler(parentNode));
72
+ observer.observe(ref.current, {
73
+ subtree: true,
74
+ childList: true
75
+ });
76
+ recalculateFocusableNodesRef(parentNode);
77
+ return ()=>observer.disconnect();
53
78
  }, [
54
- children
79
+ ref
55
80
  ]);
56
81
  (0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(function tryToAutoFocusToFirstNode() {
57
82
  if (!ref.current || !autoFocus || !keyboardInput) {