@vkontakte/vkui 6.1.1 → 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 (120) 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/FocusTrap/FocusTrap.d.ts +2 -2
  8. package/dist/cjs/components/FocusTrap/FocusTrap.d.ts.map +1 -1
  9. package/dist/cjs/components/FocusTrap/FocusTrap.js +36 -11
  10. package/dist/cjs/components/FocusTrap/FocusTrap.js.map +1 -1
  11. package/dist/cjs/components/Select/Select.d.ts +1 -1
  12. package/dist/cjs/components/Select/Select.d.ts.map +1 -1
  13. package/dist/cjs/components/Select/Select.js +12 -6
  14. package/dist/cjs/components/Select/Select.js.map +1 -1
  15. package/dist/cjs/components/Spacing/Spacing.d.ts +16 -5
  16. package/dist/cjs/components/Spacing/Spacing.d.ts.map +1 -1
  17. package/dist/cjs/components/Spacing/Spacing.js +38 -31
  18. package/dist/cjs/components/Spacing/Spacing.js.map +1 -1
  19. package/dist/cjs/components/ToolButton/ToolButton.d.ts +5 -0
  20. package/dist/cjs/components/ToolButton/ToolButton.d.ts.map +1 -1
  21. package/dist/cjs/components/ToolButton/ToolButton.js +2 -1
  22. package/dist/cjs/components/ToolButton/ToolButton.js.map +1 -1
  23. package/dist/cjs/hooks/useResizeObserver.d.ts +6 -0
  24. package/dist/cjs/hooks/useResizeObserver.d.ts.map +1 -0
  25. package/dist/cjs/hooks/useResizeObserver.js +32 -0
  26. package/dist/cjs/hooks/useResizeObserver.js.map +1 -0
  27. package/dist/cjs/lib/floating/customResizeObserver.d.ts.map +1 -1
  28. package/dist/cjs/lib/floating/customResizeObserver.js +2 -1
  29. package/dist/cjs/lib/floating/customResizeObserver.js.map +1 -1
  30. package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
  31. package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +11 -1
  32. package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  33. package/dist/components/Clickable/useState.d.ts.map +1 -1
  34. package/dist/components/Clickable/useState.js +7 -6
  35. package/dist/components/Clickable/useState.js.map +1 -1
  36. package/dist/components/CustomScrollView/CustomScrollView.d.ts.map +1 -1
  37. package/dist/components/CustomScrollView/CustomScrollView.js +8 -1
  38. package/dist/components/CustomScrollView/CustomScrollView.js.map +1 -1
  39. package/dist/components/FocusTrap/FocusTrap.d.ts +2 -2
  40. package/dist/components/FocusTrap/FocusTrap.d.ts.map +1 -1
  41. package/dist/components/FocusTrap/FocusTrap.js +37 -11
  42. package/dist/components/FocusTrap/FocusTrap.js.map +1 -1
  43. package/dist/components/Select/Select.d.ts +1 -1
  44. package/dist/components/Select/Select.d.ts.map +1 -1
  45. package/dist/components/Select/Select.js +12 -6
  46. package/dist/components/Select/Select.js.map +1 -1
  47. package/dist/components/Spacing/Spacing.d.ts +16 -5
  48. package/dist/components/Spacing/Spacing.d.ts.map +1 -1
  49. package/dist/components/Spacing/Spacing.js +33 -28
  50. package/dist/components/Spacing/Spacing.js.map +1 -1
  51. package/dist/components/ToolButton/ToolButton.d.ts +5 -0
  52. package/dist/components/ToolButton/ToolButton.d.ts.map +1 -1
  53. package/dist/components/ToolButton/ToolButton.js +2 -1
  54. package/dist/components/ToolButton/ToolButton.js.map +1 -1
  55. package/dist/components.css +4 -4
  56. package/dist/components.css.map +1 -1
  57. package/dist/components.js.tmp +461 -330
  58. package/dist/cssm/components/Clickable/useState.d.ts.map +1 -1
  59. package/dist/cssm/components/Clickable/useState.js +7 -6
  60. package/dist/cssm/components/Clickable/useState.js.map +1 -1
  61. package/dist/cssm/components/CustomScrollView/CustomScrollView.d.ts.map +1 -1
  62. package/dist/cssm/components/CustomScrollView/CustomScrollView.js +8 -1
  63. package/dist/cssm/components/CustomScrollView/CustomScrollView.js.map +1 -1
  64. package/dist/cssm/components/CustomScrollView/CustomScrollView.module.css +4 -0
  65. package/dist/cssm/components/FocusTrap/FocusTrap.d.ts +2 -2
  66. package/dist/cssm/components/FocusTrap/FocusTrap.d.ts.map +1 -1
  67. package/dist/cssm/components/FocusTrap/FocusTrap.js +37 -11
  68. package/dist/cssm/components/FocusTrap/FocusTrap.js.map +1 -1
  69. package/dist/cssm/components/Select/Select.d.ts +1 -1
  70. package/dist/cssm/components/Select/Select.d.ts.map +1 -1
  71. package/dist/cssm/components/Select/Select.js +8 -5
  72. package/dist/cssm/components/Select/Select.js.map +1 -1
  73. package/dist/cssm/components/Spacing/Spacing.d.ts +16 -5
  74. package/dist/cssm/components/Spacing/Spacing.d.ts.map +1 -1
  75. package/dist/cssm/components/Spacing/Spacing.js +31 -30
  76. package/dist/cssm/components/Spacing/Spacing.js.map +1 -1
  77. package/dist/cssm/components/Spacing/Spacing.module.css +44 -0
  78. package/dist/cssm/components/ToolButton/ToolButton.d.ts +5 -0
  79. package/dist/cssm/components/ToolButton/ToolButton.d.ts.map +1 -1
  80. package/dist/cssm/components/ToolButton/ToolButton.js +2 -1
  81. package/dist/cssm/components/ToolButton/ToolButton.js.map +1 -1
  82. package/dist/cssm/components/ToolButton/ToolButton.module.css +6 -20
  83. package/dist/cssm/hooks/useResizeObserver.d.ts +6 -0
  84. package/dist/cssm/hooks/useResizeObserver.d.ts.map +1 -0
  85. package/dist/cssm/hooks/useResizeObserver.js +23 -0
  86. package/dist/cssm/hooks/useResizeObserver.js.map +1 -0
  87. package/dist/cssm/lib/floating/customResizeObserver.d.ts.map +1 -1
  88. package/dist/cssm/lib/floating/customResizeObserver.js +2 -1
  89. package/dist/cssm/lib/floating/customResizeObserver.js.map +1 -1
  90. package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
  91. package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +11 -1
  92. package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  93. package/dist/cssm/styles/adaptivity.module.css +1 -2
  94. package/dist/hooks/useResizeObserver.d.ts +6 -0
  95. package/dist/hooks/useResizeObserver.d.ts.map +1 -0
  96. package/dist/hooks/useResizeObserver.js +23 -0
  97. package/dist/hooks/useResizeObserver.js.map +1 -0
  98. package/dist/lib/floating/customResizeObserver.d.ts.map +1 -1
  99. package/dist/lib/floating/customResizeObserver.js +2 -1
  100. package/dist/lib/floating/customResizeObserver.js.map +1 -1
  101. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
  102. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +11 -1
  103. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  104. package/dist/vkui.css +4 -4
  105. package/dist/vkui.css.map +1 -1
  106. package/dist/vkui.js.tmp +461 -330
  107. package/package.json +1 -1
  108. package/src/components/Clickable/useState.tsx +16 -6
  109. package/src/components/CustomScrollView/CustomScrollView.module.css +4 -0
  110. package/src/components/CustomScrollView/CustomScrollView.tsx +7 -1
  111. package/src/components/FocusTrap/FocusTrap.tsx +54 -20
  112. package/src/components/Select/Select.tsx +12 -5
  113. package/src/components/Spacing/Spacing.module.css +44 -0
  114. package/src/components/Spacing/Spacing.tsx +38 -34
  115. package/src/components/ToolButton/ToolButton.module.css +4 -14
  116. package/src/components/ToolButton/ToolButton.tsx +7 -2
  117. package/src/hooks/useResizeObserver.ts +30 -0
  118. package/src/lib/floating/customResizeObserver.ts +10 -1
  119. package/src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts +11 -1
  120. 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":"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"}
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":";;;;+BAoCaA;;;eAAAA;;;;;;;;iEApCU;sBACI;+BACG;kCACG;8BACJ;mCACK;qBACX;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;IAC5B,MAAMuB,gBAAgBX,OAAMC,MAAM,CAAiB;IAEnD,MAAMW,OAAOZ,OAAMC,MAAM,CAAiB;IAC1C,MAAMY,WAAWb,OAAMC,MAAM,CAAiB;IAE9C,MAAMa,qBAAqB,CAACC;QAC1BZ,eAAea,OAAO,GAAGD;QACzB,IAAIF,SAASG,OAAO,KAAK,MAAM;YAC5BH,SAASG,OAAO,CAACC,KAAK,AAAQ,CAACV,cAAcS,OAAO,CAAC,GAAG,CAAC,aAAa,EAAED,UAAU,GAAG,CAAC;QACzF;IACF;IAEA,MAAMG,+BAA+B,CAACH;QACpC,MAAMI,WAAWJ,YAAaT,CAAAA,aAAaU,OAAO,GAAGZ,aAAaY,OAAO,AAAD;QACxEF,mBAAmB,AAACV,CAAAA,aAAaY,OAAO,GAAGX,cAAcW,OAAO,AAAD,IAAKG;IACtE;IAEA,MAAMC,SAAS;QACb,IAAI,CAACjC,OAAO6B,OAAO,IAAI,CAACJ,KAAKI,OAAO,IAAI,CAACH,SAASG,OAAO,EAAE;YACzD;QACF;QACA,MAAMK,oBAAoBlC,OAAO6B,OAAO,CAACZ,YAAY;QACrD,MAAMkB,oBAAoBnC,OAAO6B,OAAO,CAACV,YAAY;QACrD,MAAMiB,aAAaF,oBAAoBC;QACvC,MAAME,qBAAqBC,KAAKC,GAAG,CAACL,oBAAoBE,YAAY;QAEpExB,MAAMiB,OAAO,GAAGO;QAChBnB,aAAaY,OAAO,GAAGK;QACvBf,aAAaU,OAAO,GAAGM;QACvBjB,cAAcW,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,6BAA6B/B,OAAO6B,OAAO,CAACD,SAAS;QACvD;IACF;IAEA,MAAMc,gBAAgBC,IAAAA,kCAAgB,EAAC,UAAUV;IAEjDW,IAAAA,oDAAyB,EAAC;QACxB,IAAI1C,gBAAgBO,QAAQ;YAC1BiC,cAAcG,GAAG,CAACpC;QACpB;IACF,GAAG;QAACP;QAAcO;KAAO;IAEzBqC,IAAAA,oCAAiB,EAACtB,eAAeS;IAEjCW,IAAAA,oDAAyB,EAAC;YACZlB;QAAZ,IAAII,SAAQJ,oBAAAA,SAASG,OAAO,cAAhBH,wCAAAA,kBAAkBI,KAAK;QACnC,IAAIiB,OAAO;QACX,IAAIjB,UAAUjC,WAAW;YACvB,IAAI,eAAeiC,OAAO;gBACxBiB,OAAO;YACT,OAAO,IAAI,qBAAqBjB,OAAO;gBACrCiB,OAAO;YACT;QACF;QACA3B,cAAcS,OAAO,GAAGkB;IAC1B,GAAG,EAAE;IAELH,IAAAA,oDAAyB,EAACX;IAE1B,MAAMe,+BAA+B,CAAC1B;QACpC,MAAMU,WAAWV,aAAcL,CAAAA,aAAaY,OAAO,GAAGX,cAAcW,OAAO,AAAD;QAC1E,IAAI7B,OAAO6B,OAAO,KAAK,MAAM;YAC3B7B,OAAO6B,OAAO,CAACD,SAAS,GAAG,AAACT,CAAAA,aAAaU,OAAO,GAAGZ,aAAaY,OAAO,AAAD,IAAKG;QAC7E;IACF;IAEA,MAAMiB,SAAS,CAACC;QACdA,EAAEC,cAAc;QAChB,MAAMC,OAAOF,EAAEG,OAAO,GAAGhC,OAAOQ,OAAO;QACvC,MAAMyB,WAAWhB,KAAKiB,GAAG,CACvBjB,KAAKC,GAAG,CAACjB,WAAWO,OAAO,GAAGuB,MAAM,IACpCnC,aAAaY,OAAO,GAAGX,cAAcW,OAAO;QAG9CmB,6BAA6BM;IAC/B;IAEA,MAAM,EACJE,cAAc,EACdC,cAAc,EACdC,kBAAkB,EAClBC,iBAAiB,EACjBC,mBAAmB,EACnBC,mBAAmB,EACpB,GAAGC,IAAAA,0CAAoB,EAAC3D,mBAAmBC;IAE5C,MAAM2D,OAAO,CAACb;QACZA,EAAEC,cAAc;QAEhB,IAAIhD,mBAAmB;YACrBwD;QACF;QAEAK;IACF;IAEA,MAAMC,SAAS,CAACC;QACd,IAAItD,MAAMiB,OAAO,IAAI,KAAK,CAAC7B,OAAO6B,OAAO,EAAE;YACzC;QACF;QAEA,IAAI1B,mBAAmB;YACrBsD;QACF;QAEA1B,6BAA6B/B,OAAO6B,OAAO,CAACD,SAAS;QACrDvB,qBAAAA,+BAAAA,SAAW6D;IACb;IAEA,MAAMC,YAAY;QAACxB,IAAAA,kCAAgB,EAAC,aAAaM;QAASN,IAAAA,kCAAgB,EAAC,WAAWoB;KAAM;IAE5F,SAASK,UAAUC,EAAwB;QACzC,IAAIA,IAAI;YACNF,UAAUG,OAAO,CAAC,CAACC,IAAMA,EAAE1B,GAAG,CAACwB;QACjC;IACF;IAEA,SAASL;QACPG,UAAUG,OAAO,CAAC,CAACC,IAAMA,EAAEC,MAAM;IACnC;IAEA,MAAMC,cAAc,CAACvB;QACnBA,EAAEC,cAAc;QAChB9B,OAAOQ,OAAO,GAAGqB,EAAEG,OAAO;QAC1B/B,WAAWO,OAAO,GAAGb,eAAea,OAAO;QAE3C,IAAI1B,mBAAmB;YACrBuD;QACF;QAEAU,UAAU5D;IACZ;IAEA,qBACE,sBAACkE;QACC5E,WAAW6E,IAAAA,gBAAU,EAAC7E,mCAAuCH,oBAAoBC;QACjFgF,KAAKtE;OACDC;;0BAEJ,qBAACmE;gBAAI5E,SAAS;gBAAmC+E,UAAU,CAAC;gBAAGD,KAAK5E;gBAAQK,UAAU4D;0BACpF,cAAA,qBAACS;oBAAIE,KAAKpD;oBAAe1B,SAAS;8BAC/BC;;;0BAIL,qBAAC2E;gBAAI5E,SAAS;gBAAoC8E,KAAKnD;gBAAMqD,SAASC,sBAAe;0BACnF,cAAA,qBAACL;oBACC5E,WAAW6E,IAAAA,gBAAU,oCAEnB,CAACnB;oBAEHwB,cAAc7E,oBAAoByD,sBAAsB/D;oBACxDoF,cAAc9E,oBAAoB0D,sBAAsBhE;oBACxD+E,KAAKlD;oBACLwD,aAAaT;;;;;AAKvB"}
@@ -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) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/FocusTrap/FocusTrap.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { FOCUSABLE_ELEMENTS_LIST, Keys, pressedKey } from '../../lib/accessibility';\nimport {\n contains,\n getActiveElementByAnotherElement,\n getWindow,\n isHTMLElement,\n} from '../../lib/dom';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { HasComponent, HasRootRef } from '../../types';\nimport { AppRootContext } from '../AppRoot/AppRootContext';\n\nconst FOCUSABLE_ELEMENTS: string = FOCUSABLE_ELEMENTS_LIST.join();\nexport interface FocusTrapProps<T extends HTMLElement = HTMLElement>\n extends React.AllHTMLAttributes<T>,\n HasRootRef<T>,\n HasComponent {\n autoFocus?: boolean;\n restoreFocus?: boolean | (() => boolean);\n timeout?: number;\n onClose?: () => void;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/FocusTrap\n */\nexport const FocusTrap = <T extends HTMLElement = HTMLElement>({\n Component = 'div',\n onClose,\n autoFocus = true,\n restoreFocus = true,\n timeout = 0,\n getRootRef,\n children,\n ...restProps\n}: FocusTrapProps<T>) => {\n const ref = useExternRef<T>(getRootRef);\n\n const { keyboardInput } = React.useContext(AppRootContext);\n const focusableNodesRef = React.useRef<HTMLElement[]>([]);\n\n useIsomorphicLayoutEffect(\n function collectFocusableNodesRef() {\n if (!ref.current) {\n return;\n }\n\n const nodes: HTMLElement[] = [];\n // eslint-disable-next-line no-restricted-properties\n ref.current.querySelectorAll<HTMLElement>(FOCUSABLE_ELEMENTS).forEach((focusableEl) => {\n const { display, visibility } = getComputedStyle(focusableEl);\n if (display !== 'none' && visibility !== 'hidden') {\n nodes.push(focusableEl);\n }\n });\n\n if (nodes.length === 0) {\n // Чтобы фокус был хотя бы на родителе\n nodes.push(ref.current);\n }\n\n focusableNodesRef.current = nodes;\n },\n [children],\n );\n\n useIsomorphicLayoutEffect(\n function tryToAutoFocusToFirstNode() {\n if (!ref.current || !autoFocus || !keyboardInput) {\n return;\n }\n const autoFocusToFirstNode = () => {\n if (!ref.current || !focusableNodesRef.current.length) {\n return;\n }\n const activeElement = getActiveElementByAnotherElement(ref.current);\n if (!contains(ref.current, activeElement)) {\n focusableNodesRef.current[0].focus();\n }\n };\n const timeoutId = setTimeout(autoFocusToFirstNode, timeout);\n return () => {\n clearTimeout(timeoutId);\n };\n },\n [autoFocus, timeout, keyboardInput],\n );\n\n useIsomorphicLayoutEffect(\n function tryToRestoreFocusOnUnmount() {\n if (!ref.current || !restoreFocus) {\n return;\n }\n\n const restoreFocusTo = getActiveElementByAnotherElement(ref.current);\n\n return () => {\n const shouldRestoreFocus =\n typeof restoreFocus === 'function' ? restoreFocus() : restoreFocus;\n\n if (!shouldRestoreFocus || !isHTMLElement(restoreFocusTo)) {\n return;\n }\n\n setTimeout(() => {\n if (restoreFocusTo) {\n restoreFocusTo.focus();\n }\n }, timeout);\n };\n },\n [restoreFocus, timeout],\n );\n\n useIsomorphicLayoutEffect(() => {\n if (!ref.current) {\n return;\n }\n\n const onDocumentKeydown = (event: KeyboardEvent) => {\n const pressedKeyResult = pressedKey(event);\n\n switch (pressedKeyResult) {\n case Keys.TAB: {\n if (!focusableNodesRef.current.length) {\n return false;\n }\n\n const lastIdx = focusableNodesRef.current.length - 1;\n const targetIdx = focusableNodesRef.current.findIndex((node) => node === event.target);\n\n const shouldFocusFirstNode =\n targetIdx === -1 || (targetIdx === lastIdx && !event.shiftKey);\n\n if (shouldFocusFirstNode || (targetIdx === 0 && event.shiftKey)) {\n event.preventDefault();\n\n const node = focusableNodesRef.current[shouldFocusFirstNode ? 0 : lastIdx];\n\n if (node !== getActiveElementByAnotherElement(node)) {\n node.focus();\n }\n\n return false;\n }\n\n break;\n }\n case Keys.ESCAPE: {\n if (onClose) {\n event.preventDefault();\n onClose();\n }\n }\n }\n\n return true;\n };\n\n const doc = getWindow(ref.current).document;\n doc.addEventListener('keydown', onDocumentKeydown, {\n capture: true,\n });\n return () => {\n doc.removeEventListener('keydown', onDocumentKeydown, true);\n };\n }, [onClose, ref]);\n\n return (\n <Component tabIndex={-1} ref={ref} {...restProps}>\n {children}\n </Component>\n );\n};\n"],"names":["FocusTrap","FOCUSABLE_ELEMENTS","FOCUSABLE_ELEMENTS_LIST","join","Component","onClose","autoFocus","restoreFocus","timeout","getRootRef","children","restProps","ref","useExternRef","keyboardInput","React","useContext","AppRootContext","focusableNodesRef","useRef","useIsomorphicLayoutEffect","collectFocusableNodesRef","current","nodes","querySelectorAll","forEach","focusableEl","display","visibility","getComputedStyle","push","length","tryToAutoFocusToFirstNode","autoFocusToFirstNode","activeElement","getActiveElementByAnotherElement","contains","focus","timeoutId","setTimeout","clearTimeout","tryToRestoreFocusOnUnmount","restoreFocusTo","shouldRestoreFocus","isHTMLElement","onDocumentKeydown","event","pressedKeyResult","pressedKey","Keys","TAB","lastIdx","targetIdx","findIndex","node","target","shouldFocusFirstNode","shiftKey","preventDefault","ESCAPE","doc","getWindow","document","addEventListener","capture","removeEventListener","tabIndex"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/FocusTrap/FocusTrap.tsx"],"sourcesContent":["import { AllHTMLAttributes, useContext, useRef } from 'react';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { FOCUSABLE_ELEMENTS_LIST, Keys, pressedKey } from '../../lib/accessibility';\nimport {\n contains,\n getActiveElementByAnotherElement,\n getWindow,\n isHTMLElement,\n useDOM,\n} from '../../lib/dom';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { HasComponent, HasRootRef } from '../../types';\nimport { AppRootContext } from '../AppRoot/AppRootContext';\n\nconst FOCUSABLE_ELEMENTS: string = FOCUSABLE_ELEMENTS_LIST.join();\nexport interface FocusTrapProps<T extends HTMLElement = HTMLElement>\n extends AllHTMLAttributes<T>,\n HasRootRef<T>,\n HasComponent {\n autoFocus?: boolean;\n restoreFocus?: boolean | (() => boolean);\n timeout?: number;\n onClose?: () => void;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/FocusTrap\n */\nexport const FocusTrap = <T extends HTMLElement = HTMLElement>({\n Component = 'div',\n onClose,\n autoFocus = true,\n restoreFocus = true,\n timeout = 0,\n getRootRef,\n children,\n ...restProps\n}: FocusTrapProps<T>) => {\n const ref = useExternRef<T>(getRootRef);\n const { document } = useDOM();\n\n const { keyboardInput } = useContext(AppRootContext);\n const focusableNodesRef = useRef<HTMLElement[]>([]);\n\n const focusNodeByIndex = (nodeIndex: number) => {\n const element = focusableNodesRef.current[nodeIndex];\n\n if (element) {\n element.focus();\n }\n };\n\n const recalculateFocusableNodesRef = (parentNode: HTMLElement) => {\n // eslint-disable-next-line no-restricted-properties\n const newFocusableElements = parentNode.querySelectorAll<HTMLElement>(FOCUSABLE_ELEMENTS);\n\n const nodes: HTMLElement[] = [];\n newFocusableElements.forEach((focusableEl) => {\n const { display, visibility } = getComputedStyle(focusableEl);\n if (display !== 'none' && visibility !== 'hidden') {\n nodes.push(focusableEl);\n }\n });\n\n if (nodes.length === 0) {\n // Чтобы фокус был хотя бы на родителе\n nodes.push(parentNode);\n }\n focusableNodesRef.current = nodes;\n };\n\n const onMutateParentHandler = (parentNode: HTMLElement) => {\n recalculateFocusableNodesRef(parentNode);\n\n if (document) {\n const activeElement = document.activeElement as HTMLElement;\n const currentElementIndex = Math.max(\n document.activeElement ? focusableNodesRef.current.indexOf(activeElement) : -1,\n 0,\n );\n focusNodeByIndex(currentElementIndex);\n }\n };\n\n useIsomorphicLayoutEffect(\n function collectFocusableNodesRef() {\n if (!ref.current) {\n return;\n }\n const parentNode = ref.current;\n const observer = new MutationObserver(() => onMutateParentHandler(parentNode));\n observer.observe(ref.current, {\n subtree: true,\n childList: true,\n });\n recalculateFocusableNodesRef(parentNode);\n return () => observer.disconnect();\n },\n [ref],\n );\n\n useIsomorphicLayoutEffect(\n function tryToAutoFocusToFirstNode() {\n if (!ref.current || !autoFocus || !keyboardInput) {\n return;\n }\n const autoFocusToFirstNode = () => {\n if (!ref.current || !focusableNodesRef.current.length) {\n return;\n }\n const activeElement = getActiveElementByAnotherElement(ref.current);\n if (!contains(ref.current, activeElement)) {\n focusableNodesRef.current[0].focus();\n }\n };\n const timeoutId = setTimeout(autoFocusToFirstNode, timeout);\n return () => {\n clearTimeout(timeoutId);\n };\n },\n [autoFocus, timeout, keyboardInput],\n );\n\n useIsomorphicLayoutEffect(\n function tryToRestoreFocusOnUnmount() {\n if (!ref.current || !restoreFocus) {\n return;\n }\n\n const restoreFocusTo = getActiveElementByAnotherElement(ref.current);\n\n return () => {\n const shouldRestoreFocus =\n typeof restoreFocus === 'function' ? restoreFocus() : restoreFocus;\n\n if (!shouldRestoreFocus || !isHTMLElement(restoreFocusTo)) {\n return;\n }\n\n setTimeout(() => {\n if (restoreFocusTo) {\n restoreFocusTo.focus();\n }\n }, timeout);\n };\n },\n [restoreFocus, timeout],\n );\n\n useIsomorphicLayoutEffect(() => {\n if (!ref.current) {\n return;\n }\n\n const onDocumentKeydown = (event: KeyboardEvent) => {\n const pressedKeyResult = pressedKey(event);\n\n switch (pressedKeyResult) {\n case Keys.TAB: {\n if (!focusableNodesRef.current.length) {\n return false;\n }\n\n const lastIdx = focusableNodesRef.current.length - 1;\n const targetIdx = focusableNodesRef.current.findIndex((node) => node === event.target);\n\n const shouldFocusFirstNode =\n targetIdx === -1 || (targetIdx === lastIdx && !event.shiftKey);\n\n if (shouldFocusFirstNode || (targetIdx === 0 && event.shiftKey)) {\n event.preventDefault();\n\n const node = focusableNodesRef.current[shouldFocusFirstNode ? 0 : lastIdx];\n\n if (node !== getActiveElementByAnotherElement(node)) {\n node.focus();\n }\n\n return false;\n }\n\n break;\n }\n case Keys.ESCAPE: {\n if (onClose) {\n event.preventDefault();\n onClose();\n }\n }\n }\n\n return true;\n };\n\n const doc = getWindow(ref.current).document;\n doc.addEventListener('keydown', onDocumentKeydown, {\n capture: true,\n });\n return () => {\n doc.removeEventListener('keydown', onDocumentKeydown, true);\n };\n }, [onClose, ref]);\n\n return (\n <Component tabIndex={-1} ref={ref} {...restProps}>\n {children}\n </Component>\n );\n};\n"],"names":["FocusTrap","FOCUSABLE_ELEMENTS","FOCUSABLE_ELEMENTS_LIST","join","Component","onClose","autoFocus","restoreFocus","timeout","getRootRef","children","restProps","ref","useExternRef","document","useDOM","keyboardInput","useContext","AppRootContext","focusableNodesRef","useRef","focusNodeByIndex","nodeIndex","element","current","focus","recalculateFocusableNodesRef","parentNode","newFocusableElements","querySelectorAll","nodes","forEach","focusableEl","display","visibility","getComputedStyle","push","length","onMutateParentHandler","activeElement","currentElementIndex","Math","max","indexOf","useIsomorphicLayoutEffect","collectFocusableNodesRef","observer","MutationObserver","observe","subtree","childList","disconnect","tryToAutoFocusToFirstNode","autoFocusToFirstNode","getActiveElementByAnotherElement","contains","timeoutId","setTimeout","clearTimeout","tryToRestoreFocusOnUnmount","restoreFocusTo","shouldRestoreFocus","isHTMLElement","onDocumentKeydown","event","pressedKeyResult","pressedKey","Keys","TAB","lastIdx","targetIdx","findIndex","node","target","shouldFocusFirstNode","shiftKey","preventDefault","ESCAPE","doc","getWindow","addEventListener","capture","removeEventListener","tabIndex"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -3,5 +3,5 @@ export type SelectType = 'default' | 'plain' | 'accent';
3
3
  /**
4
4
  * @see https://vkcom.github.io/VKUI/#/Select
5
5
  */
6
- export declare const Select: <OptionT extends CustomSelectOptionInterface>({ children, ...props }: SelectProps<OptionT>) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const Select: <OptionT extends CustomSelectOptionInterface>({ children, className, ...props }: SelectProps<OptionT>) => import("react/jsx-runtime").JSX.Element;
7
7
  //# sourceMappingURL=Select.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../../../src/components/Select/Select.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,2BAA2B,EAChC,KAAK,WAAW,EACjB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,MAAM,wEAGhB,YAAY,OAAO,CAAC,4CAgDtB,CAAC"}
1
+ {"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../../../src/components/Select/Select.tsx"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,2BAA2B,EAChC,KAAK,WAAW,EACjB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,MAAM,mFAIhB,YAAY,OAAO,CAAC,4CAqDtB,CAAC"}
@@ -14,12 +14,14 @@ const _object_spread_props = require("@swc/helpers/_/_object_spread_props");
14
14
  const _object_without_properties = require("@swc/helpers/_/_object_without_properties");
15
15
  const _jsxruntime = require("react/jsx-runtime");
16
16
  const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
17
- const _useAdaptivityHasPointer = require("../../hooks/useAdaptivityHasPointer");
17
+ const _vkjs = require("@vkontakte/vkjs");
18
+ const _useAdaptivityConditionalRender = require("../../hooks/useAdaptivityConditionalRender");
18
19
  const _CustomSelect = require("../CustomSelect/CustomSelect");
19
20
  const _NativeSelect = require("../NativeSelect/NativeSelect");
20
21
  const Select = (_param)=>{
21
- var { children } = _param, props = _object_without_properties._(_param, [
22
- "children"
22
+ var { children, className } = _param, props = _object_without_properties._(_param, [
23
+ "children",
24
+ "className"
23
25
  ]);
24
26
  const { options = [], searchable, emptyText, onInputChange, filterFn, popupDirection, renderOption, renderDropdown, fetching, onClose, onOpen, icon, ClearButton, allowClearButton, clearButtonTestId, dropdownOffsetDistance, dropdownAutoWidth, forceDropdownPortal, noMaxHeight, autoHideScrollbar, autoHideScrollbarDelay, labelTextTestId, nativeSelectTestId, after, mode } = props, restProps = _object_without_properties._(props, [
25
27
  "options",
@@ -48,12 +50,16 @@ const Select = (_param)=>{
48
50
  "after",
49
51
  "mode"
50
52
  ]);
51
- const hasPointer = (0, _useAdaptivityHasPointer.useAdaptivityHasPointer)();
53
+ const { deviceType } = (0, _useAdaptivityConditionalRender.useAdaptivityConditionalRender)();
52
54
  const nativeProps = restProps;
53
55
  return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_react.Fragment, {
54
56
  children: [
55
- (hasPointer === undefined || hasPointer) && /*#__PURE__*/ (0, _jsxruntime.jsx)(_CustomSelect.CustomSelect, _object_spread._({}, props)),
56
- (hasPointer === undefined || !hasPointer) && /*#__PURE__*/ (0, _jsxruntime.jsx)(_NativeSelect.NativeSelect, _object_spread_props._(_object_spread._({}, nativeProps), {
57
+ deviceType.desktop && /*#__PURE__*/ (0, _jsxruntime.jsx)(_CustomSelect.CustomSelect, _object_spread._({
58
+ className: (0, _vkjs.classNames)(className, deviceType.desktop.className)
59
+ }, props)),
60
+ deviceType.mobile && /*#__PURE__*/ (0, _jsxruntime.jsx)(_NativeSelect.NativeSelect, _object_spread_props._(_object_spread._({
61
+ className: (0, _vkjs.classNames)(className, deviceType.mobile.className)
62
+ }, nativeProps), {
57
63
  children: options.map(({ label, value })=>/*#__PURE__*/ (0, _jsxruntime.jsx)("option", {
58
64
  value: value,
59
65
  children: label
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Select/Select.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { HasOnlyExpectedProps } from '../../types';\nimport {\n CustomSelect,\n type CustomSelectOptionInterface,\n type SelectProps,\n} from '../CustomSelect/CustomSelect';\nimport { NativeSelect, type NativeSelectProps } from '../NativeSelect/NativeSelect';\nexport type SelectType = 'default' | 'plain' | 'accent';\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Select\n */\nexport const Select = <OptionT extends CustomSelectOptionInterface>({\n children,\n ...props\n}: SelectProps<OptionT>) => {\n const {\n options = [],\n searchable,\n emptyText,\n onInputChange,\n filterFn,\n popupDirection,\n renderOption,\n renderDropdown,\n fetching,\n onClose,\n onOpen,\n icon,\n ClearButton,\n allowClearButton,\n clearButtonTestId,\n dropdownOffsetDistance,\n dropdownAutoWidth,\n forceDropdownPortal,\n noMaxHeight,\n autoHideScrollbar,\n autoHideScrollbarDelay,\n labelTextTestId,\n nativeSelectTestId,\n after,\n mode,\n ...restProps\n } = props;\n\n const hasPointer = useAdaptivityHasPointer();\n\n const nativeProps: HasOnlyExpectedProps<typeof restProps, NativeSelectProps> = restProps;\n\n return (\n <React.Fragment>\n {(hasPointer === undefined || hasPointer) && <CustomSelect {...props} />}\n {(hasPointer === undefined || !hasPointer) && (\n <NativeSelect {...nativeProps}>\n {options.map(({ label, value }) => (\n <option value={value} key={`${value}`}>\n {label}\n </option>\n ))}\n </NativeSelect>\n )}\n </React.Fragment>\n );\n};\n"],"names":["Select","children","props","options","searchable","emptyText","onInputChange","filterFn","popupDirection","renderOption","renderDropdown","fetching","onClose","onOpen","icon","ClearButton","allowClearButton","clearButtonTestId","dropdownOffsetDistance","dropdownAutoWidth","forceDropdownPortal","noMaxHeight","autoHideScrollbar","autoHideScrollbarDelay","labelTextTestId","nativeSelectTestId","after","mode","restProps","hasPointer","useAdaptivityHasPointer","nativeProps","React","Fragment","undefined","CustomSelect","NativeSelect","map","label","value","option"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;+BAcaA;;;eAAAA;;;;;;;;iEAdU;yCACiB;8BAMjC;8BAC8C;AAM9C,MAAMA,SAAS;QAA8C,EAClEC,QAAQ,EAEa,WADlBC;QADHD;;IAGA,MAAM,EACJE,UAAU,EAAE,EACZC,UAAU,EACVC,SAAS,EACTC,aAAa,EACbC,QAAQ,EACRC,cAAc,EACdC,YAAY,EACZC,cAAc,EACdC,QAAQ,EACRC,OAAO,EACPC,MAAM,EACNC,IAAI,EACJC,WAAW,EACXC,gBAAgB,EAChBC,iBAAiB,EACjBC,sBAAsB,EACtBC,iBAAiB,EACjBC,mBAAmB,EACnBC,WAAW,EACXC,iBAAiB,EACjBC,sBAAsB,EACtBC,eAAe,EACfC,kBAAkB,EAClBC,KAAK,EACLC,IAAI,EAEL,GAAGzB,OADC0B,yCACD1B;QA1BFC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;;IAIF,MAAME,aAAaC,IAAAA,gDAAuB;IAE1C,MAAMC,cAAyEH;IAE/E,qBACE,sBAACI,OAAMC,QAAQ;;YACXJ,CAAAA,eAAeK,aAAaL,UAAS,mBAAM,qBAACM,0BAAY,uBAAKjC;YAC7D2B,CAAAA,eAAeK,aAAa,CAACL,UAAS,mBACtC,qBAACO,0BAAY,8CAAKL;0BACf5B,QAAQkC,GAAG,CAAC,CAAC,EAAEC,KAAK,EAAEC,KAAK,EAAE,iBAC5B,qBAACC;wBAAOD,OAAOA;kCACZD;uBADwB,CAAC,EAAEC,MAAM,CAAC;;;;AAQjD"}
1
+ {"version":3,"sources":["../../../../src/components/Select/Select.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivityConditionalRender } from '../../hooks/useAdaptivityConditionalRender';\nimport { HasOnlyExpectedProps } from '../../types';\nimport {\n CustomSelect,\n type CustomSelectOptionInterface,\n type SelectProps,\n} from '../CustomSelect/CustomSelect';\nimport { NativeSelect, type NativeSelectProps } from '../NativeSelect/NativeSelect';\nexport type SelectType = 'default' | 'plain' | 'accent';\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Select\n */\nexport const Select = <OptionT extends CustomSelectOptionInterface>({\n children,\n className,\n ...props\n}: SelectProps<OptionT>) => {\n const {\n options = [],\n searchable,\n emptyText,\n onInputChange,\n filterFn,\n popupDirection,\n renderOption,\n renderDropdown,\n fetching,\n onClose,\n onOpen,\n icon,\n ClearButton,\n allowClearButton,\n clearButtonTestId,\n dropdownOffsetDistance,\n dropdownAutoWidth,\n forceDropdownPortal,\n noMaxHeight,\n autoHideScrollbar,\n autoHideScrollbarDelay,\n labelTextTestId,\n nativeSelectTestId,\n after,\n mode,\n ...restProps\n } = props;\n\n const { deviceType } = useAdaptivityConditionalRender();\n\n const nativeProps: HasOnlyExpectedProps<typeof restProps, NativeSelectProps> = restProps;\n\n return (\n <React.Fragment>\n {deviceType.desktop && (\n <CustomSelect className={classNames(className, deviceType.desktop.className)} {...props} />\n )}\n {deviceType.mobile && (\n <NativeSelect\n className={classNames(className, deviceType.mobile.className)}\n {...nativeProps}\n >\n {options.map(({ label, value }) => (\n <option value={value} key={`${value}`}>\n {label}\n </option>\n ))}\n </NativeSelect>\n )}\n </React.Fragment>\n );\n};\n"],"names":["Select","children","className","props","options","searchable","emptyText","onInputChange","filterFn","popupDirection","renderOption","renderDropdown","fetching","onClose","onOpen","icon","ClearButton","allowClearButton","clearButtonTestId","dropdownOffsetDistance","dropdownAutoWidth","forceDropdownPortal","noMaxHeight","autoHideScrollbar","autoHideScrollbarDelay","labelTextTestId","nativeSelectTestId","after","mode","restProps","deviceType","useAdaptivityConditionalRender","nativeProps","React","Fragment","desktop","CustomSelect","classNames","mobile","NativeSelect","map","label","value","option"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;+BAeaA;;;eAAAA;;;;;;;;iEAfU;sBACI;gDACoB;8BAMxC;8BAC8C;AAM9C,MAAMA,SAAS;QAA8C,EAClEC,QAAQ,EACRC,SAAS,EAEY,WADlBC;QAFHF;QACAC;;IAGA,MAAM,EACJE,UAAU,EAAE,EACZC,UAAU,EACVC,SAAS,EACTC,aAAa,EACbC,QAAQ,EACRC,cAAc,EACdC,YAAY,EACZC,cAAc,EACdC,QAAQ,EACRC,OAAO,EACPC,MAAM,EACNC,IAAI,EACJC,WAAW,EACXC,gBAAgB,EAChBC,iBAAiB,EACjBC,sBAAsB,EACtBC,iBAAiB,EACjBC,mBAAmB,EACnBC,WAAW,EACXC,iBAAiB,EACjBC,sBAAsB,EACtBC,eAAe,EACfC,kBAAkB,EAClBC,KAAK,EACLC,IAAI,EAEL,GAAGzB,OADC0B,yCACD1B;QA1BFC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;;IAIF,MAAM,EAAEE,UAAU,EAAE,GAAGC,IAAAA,8DAA8B;IAErD,MAAMC,cAAyEH;IAE/E,qBACE,sBAACI,OAAMC,QAAQ;;YACZJ,WAAWK,OAAO,kBACjB,qBAACC,0BAAY;gBAAClC,WAAWmC,IAAAA,gBAAU,EAACnC,WAAW4B,WAAWK,OAAO,CAACjC,SAAS;eAAOC;YAEnF2B,WAAWQ,MAAM,kBAChB,qBAACC,0BAAY;gBACXrC,WAAWmC,IAAAA,gBAAU,EAACnC,WAAW4B,WAAWQ,MAAM,CAACpC,SAAS;eACxD8B;0BAEH5B,QAAQoC,GAAG,CAAC,CAAC,EAAEC,KAAK,EAAEC,KAAK,EAAE,iBAC5B,qBAACC;wBAAOD,OAAOA;kCACZD;uBADwB,CAAC,EAAEC,MAAM,CAAC;;;;AAQjD"}
@@ -1,15 +1,26 @@
1
1
  import { HTMLAttributesWithRootRef } from '../../types';
2
- export declare const ALLOWED_SIZES: readonly ["3xs", "2xs", "xs", "s", "m", "l", "xl", "2xl", "3xl", "4xl"];
3
- type Size = (typeof ALLOWED_SIZES)[number];
2
+ export declare const CUSTOM_CSS_TOKEN_FOR_USER_GAP = "--vkui_internal--Spacing_gap";
3
+ export declare const sizesClassNames: {
4
+ '3xs': string;
5
+ '2xs': string;
6
+ xs: string;
7
+ s: string;
8
+ m: string;
9
+ l: string;
10
+ xl: string;
11
+ '2xl': string;
12
+ '3xl': string;
13
+ '4xl': string;
14
+ };
15
+ export type SpacingSize = keyof typeof sizesClassNames;
4
16
  export interface SpacingProps extends HTMLAttributesWithRootRef<HTMLDivElement> {
5
17
  /**
6
18
  * Высота спэйсинга
7
19
  */
8
- size?: number | Size;
20
+ size?: number | SpacingSize;
9
21
  }
10
22
  /**
11
23
  * @see https://vkcom.github.io/VKUI/#/Spacing
12
24
  */
13
- export declare const Spacing: ({ size, style: styleProp, ...restProps }: SpacingProps) => import("react/jsx-runtime").JSX.Element;
14
- export {};
25
+ export declare const Spacing: ({ size, style, className, ...restProps }: SpacingProps) => import("react/jsx-runtime").JSX.Element;
15
26
  //# sourceMappingURL=Spacing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Spacing.d.ts","sourceRoot":"","sources":["../../../../src/components/Spacing/Spacing.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAIxD,eAAO,MAAM,aAAa,yEAWhB,CAAC;AACX,KAAK,IAAI,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3C,MAAM,WAAW,YAAa,SAAQ,yBAAyB,CAAC,cAAc,CAAC;IAC7E;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AACD;;GAEG;AACH,eAAO,MAAM,OAAO,6CAAoD,YAAY,4CAOnF,CAAC"}
1
+ {"version":3,"file":"Spacing.d.ts","sourceRoot":"","sources":["../../../../src/components/Spacing/Spacing.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAIxD,eAAO,MAAM,6BAA6B,iCAAiC,CAAC;AAE5E,eAAO,MAAM,eAAe;;;;;;;;;;;CAW3B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,eAAe,CAAC;AAEvD,MAAM,WAAW,YAAa,SAAQ,yBAAyB,CAAC,cAAc,CAAC;IAC7E;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;CAC7B;AACD;;GAEG;AACH,eAAO,MAAM,OAAO,6CAAoD,YAAY,4CAqBnF,CAAC"}
@@ -9,52 +9,59 @@ function _export(target, all) {
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- ALLOWED_SIZES: function() {
13
- return ALLOWED_SIZES;
12
+ CUSTOM_CSS_TOKEN_FOR_USER_GAP: function() {
13
+ return CUSTOM_CSS_TOKEN_FOR_USER_GAP;
14
14
  },
15
15
  Spacing: function() {
16
16
  return Spacing;
17
+ },
18
+ sizesClassNames: function() {
19
+ return sizesClassNames;
17
20
  }
18
21
  });
19
- const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
20
22
  const _object_spread = require("@swc/helpers/_/_object_spread");
21
23
  const _object_spread_props = require("@swc/helpers/_/_object_spread_props");
22
24
  const _object_without_properties = require("@swc/helpers/_/_object_without_properties");
23
25
  const _jsxruntime = require("react/jsx-runtime");
24
- const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
26
+ const _vkjs = require("@vkontakte/vkjs");
25
27
  const _RootComponent = require("../RootComponent/RootComponent");
26
- const ALLOWED_SIZES = [
27
- '3xs',
28
- '2xs',
29
- 'xs',
30
- 's',
31
- 'm',
32
- 'l',
33
- 'xl',
34
- '2xl',
35
- '3xl',
36
- '4xl'
37
- ];
28
+ const CUSTOM_CSS_TOKEN_FOR_USER_GAP = '--vkui_internal--Spacing_gap';
29
+ const sizesClassNames = {
30
+ '3xs': "vkuiSpacing--3xs",
31
+ '2xs': "vkuiSpacing--2xs",
32
+ 'xs': "vkuiSpacing--xs",
33
+ 's': "vkuiSpacing--s",
34
+ 'm': "vkuiSpacing--m",
35
+ 'l': "vkuiSpacing--l",
36
+ 'xl': "vkuiSpacing--xl",
37
+ '2xl': "vkuiSpacing--2xl",
38
+ '3xl': "vkuiSpacing--3xl",
39
+ '4xl': "vkuiSpacing--4xl"
40
+ };
38
41
  const Spacing = (_param)=>{
39
- var { size = 'm', style: styleProp } = _param, restProps = _object_without_properties._(_param, [
42
+ var { size = 'm', style, className } = _param, restProps = _object_without_properties._(_param, [
40
43
  "size",
41
- "style"
44
+ "style",
45
+ "className"
42
46
  ]);
43
- const style = _object_spread._({}, getSizeStyle(size), styleProp);
47
+ if (typeof size === 'string') {
48
+ className = className ? (0, _vkjs.classNames)(sizesClassNames[size], className) : sizesClassNames[size];
49
+ } else {
50
+ if (style) {
51
+ // @ts-expect-error: TS7053 В React.CSSProperties не учитывается Custom Properties
52
+ style[CUSTOM_CSS_TOKEN_FOR_USER_GAP] = size;
53
+ } else {
54
+ // @ts-expect-error: TS2353 В React.CSSProperties не учитывается Custom Properties
55
+ style = {
56
+ [CUSTOM_CSS_TOKEN_FOR_USER_GAP]: size
57
+ };
58
+ }
59
+ }
44
60
  return /*#__PURE__*/ (0, _jsxruntime.jsx)(_RootComponent.RootComponent, _object_spread_props._(_object_spread._({}, restProps), {
45
- baseClassName: "vkuiSpacing",
46
- style: style
61
+ style: style,
62
+ className: className,
63
+ baseClassName: "vkuiSpacing"
47
64
  }));
48
65
  };
49
- function getSizeStyle(size) {
50
- const sizeValue = getSizeValue(size);
51
- return {
52
- height: sizeValue,
53
- padding: `calc(${sizeValue} / 2px) 0`
54
- };
55
- }
56
- function getSizeValue(size) {
57
- return typeof size === 'string' ? `var(--vkui--spacing_size_${size})` : size;
58
- }
59
66
 
60
67
  //# sourceMappingURL=Spacing.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Spacing/Spacing.tsx"],"sourcesContent":["import * as React from 'react';\nimport { HTMLAttributesWithRootRef } from '../../types';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './Spacing.module.css';\n\nexport const ALLOWED_SIZES = [\n '3xs',\n '2xs',\n 'xs',\n 's',\n 'm',\n 'l',\n 'xl',\n '2xl',\n '3xl',\n '4xl',\n] as const;\ntype Size = (typeof ALLOWED_SIZES)[number];\n\nexport interface SpacingProps extends HTMLAttributesWithRootRef<HTMLDivElement> {\n /**\n * Высота спэйсинга\n */\n size?: number | Size;\n}\n/**\n * @see https://vkcom.github.io/VKUI/#/Spacing\n */\nexport const Spacing = ({ size = 'm', style: styleProp, ...restProps }: SpacingProps) => {\n const style: React.CSSProperties = {\n ...getSizeStyle(size),\n ...styleProp,\n };\n\n return <RootComponent {...restProps} baseClassName={styles['Spacing']} style={style} />;\n};\n\nfunction getSizeStyle(size: number | Size): React.CSSProperties {\n const sizeValue = getSizeValue(size);\n\n return {\n height: sizeValue,\n padding: `calc(${sizeValue} / 2px) 0`,\n };\n}\n\nfunction getSizeValue(size: number | Size): `var(--vkui--spacing_size_${Size})` | number {\n return typeof size === 'string' ? `var(--vkui--spacing_size_${size})` : size;\n}\n"],"names":["ALLOWED_SIZES","Spacing","size","style","styleProp","restProps","getSizeStyle","RootComponent","baseClassName","sizeValue","getSizeValue","height","padding"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;;;;;;;;IAKaA,aAAa;eAAbA;;IAuBAC,OAAO;eAAPA;;;;;;;;iEA5BU;+BAEO;AAGvB,MAAMD,gBAAgB;IAC3B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAYM,MAAMC,UAAU;QAAC,EAAEC,OAAO,GAAG,EAAEC,OAAOC,SAAS,EAA8B,WAAzBC;QAAjCH;QAAYC;;IACpC,MAAMA,QAA6B,qBAC9BG,aAAaJ,OACbE;IAGL,qBAAO,qBAACG,4BAAa,8CAAKF;QAAWG,aAAa;QAAqBL,OAAOA;;AAChF;AAEA,SAASG,aAAaJ,IAAmB;IACvC,MAAMO,YAAYC,aAAaR;IAE/B,OAAO;QACLS,QAAQF;QACRG,SAAS,CAAC,KAAK,EAAEH,UAAU,SAAS,CAAC;IACvC;AACF;AAEA,SAASC,aAAaR,IAAmB;IACvC,OAAO,OAAOA,SAAS,WAAW,CAAC,yBAAyB,EAAEA,KAAK,CAAC,CAAC,GAAGA;AAC1E"}
1
+ {"version":3,"sources":["../../../../src/components/Spacing/Spacing.tsx"],"sourcesContent":["import { classNames } from '@vkontakte/vkjs';\nimport { HTMLAttributesWithRootRef } from '../../types';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './Spacing.module.css';\n\nexport const CUSTOM_CSS_TOKEN_FOR_USER_GAP = '--vkui_internal--Spacing_gap';\n\nexport const sizesClassNames = {\n '3xs': styles['Spacing--3xs'],\n '2xs': styles['Spacing--2xs'],\n 'xs': styles['Spacing--xs'],\n 's': styles['Spacing--s'],\n 'm': styles['Spacing--m'],\n 'l': styles['Spacing--l'],\n 'xl': styles['Spacing--xl'],\n '2xl': styles['Spacing--2xl'],\n '3xl': styles['Spacing--3xl'],\n '4xl': styles['Spacing--4xl'],\n};\n\nexport type SpacingSize = keyof typeof sizesClassNames;\n\nexport interface SpacingProps extends HTMLAttributesWithRootRef<HTMLDivElement> {\n /**\n * Высота спэйсинга\n */\n size?: number | SpacingSize;\n}\n/**\n * @see https://vkcom.github.io/VKUI/#/Spacing\n */\nexport const Spacing = ({ size = 'm', style, className, ...restProps }: SpacingProps) => {\n if (typeof size === 'string') {\n className = className ? classNames(sizesClassNames[size], className) : sizesClassNames[size];\n } else {\n if (style) {\n // @ts-expect-error: TS7053 В React.CSSProperties не учитывается Custom Properties\n style[CUSTOM_CSS_TOKEN_FOR_USER_GAP] = size;\n } else {\n // @ts-expect-error: TS2353 В React.CSSProperties не учитывается Custom Properties\n style = { [CUSTOM_CSS_TOKEN_FOR_USER_GAP]: size };\n }\n }\n\n return (\n <RootComponent\n {...restProps}\n style={style}\n className={className}\n baseClassName={styles['Spacing']}\n />\n );\n};\n"],"names":["CUSTOM_CSS_TOKEN_FOR_USER_GAP","Spacing","sizesClassNames","size","style","className","restProps","classNames","RootComponent","baseClassName"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;;;;;;;;IAKaA,6BAA6B;eAA7BA;;IA0BAC,OAAO;eAAPA;;IAxBAC,eAAe;eAAfA;;;;;;;sBAPc;+BAEG;AAGvB,MAAMF,gCAAgC;AAEtC,MAAME,kBAAkB;IAC7B,KAAK;IACL,KAAK;IACL,IAAI;IACJ,GAAG;IACH,GAAG;IACH,GAAG;IACH,IAAI;IACJ,KAAK;IACL,KAAK;IACL,KAAK;AACP;AAaO,MAAMD,UAAU;QAAC,EAAEE,OAAO,GAAG,EAAEC,KAAK,EAAEC,SAAS,EAA8B,WAAzBC;QAAjCH;QAAYC;QAAOC;;IAC3C,IAAI,OAAOF,SAAS,UAAU;QAC5BE,YAAYA,YAAYE,IAAAA,gBAAU,EAACL,eAAe,CAACC,KAAK,EAAEE,aAAaH,eAAe,CAACC,KAAK;IAC9F,OAAO;QACL,IAAIC,OAAO;YACT,kFAAkF;YAClFA,KAAK,CAACJ,8BAA8B,GAAGG;QACzC,OAAO;YACL,kFAAkF;YAClFC,QAAQ;gBAAE,CAACJ,8BAA8B,EAAEG;YAAK;QAClD;IACF;IAEA,qBACE,qBAACK,4BAAa,8CACRF;QACJF,OAAOA;QACPC,WAAWA;QACXI,aAAa;;AAGnB"}
@@ -4,6 +4,11 @@ export interface ToolButtonProps extends TappableProps, AdaptiveIconRendererProp
4
4
  mode?: 'primary' | 'secondary' | 'tertiary' | 'outline';
5
5
  appearance?: 'accent' | 'neutral';
6
6
  direction?: 'row' | 'column';
7
+ /**
8
+ * Задаёт `50%` закругления для контейнера.
9
+ *
10
+ * > Note: игнорируется при передаче `children`.
11
+ */
7
12
  rounded?: boolean;
8
13
  }
9
14
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ToolButton.d.ts","sourceRoot":"","sources":["../../../../src/components/ToolButton/ToolButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,yBAAyB,EAC1B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAY,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAyB/D,MAAM,WAAW,eAAgB,SAAQ,aAAa,EAAE,yBAAyB;IAC/E,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;IACxD,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAClC,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,mHAWpB,eAAe,4CA0BjB,CAAC"}
1
+ {"version":3,"file":"ToolButton.d.ts","sourceRoot":"","sources":["../../../../src/components/ToolButton/ToolButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,yBAAyB,EAC1B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAY,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAyB/D,MAAM,WAAW,eAAgB,SAAQ,aAAa,EAAE,yBAAyB;IAC/E,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;IACxD,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAClC,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,mHAWpB,eAAe,4CA0BjB,CAAC"}