@alfalab/core-components-picker-button 10.3.29 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/Component-5e1b8383.d.ts +72 -0
  2. package/Component-63dec22f.d.ts +167 -0
  3. package/Component-89a3cf4c.d.ts +6 -0
  4. package/Component-bdb4c6b9.d.ts +12 -0
  5. package/Component-e81c389f.d.ts +5 -0
  6. package/Component-ebda875c.d.ts +12 -0
  7. package/Component.desktop-785df74d.d.ts +6 -0
  8. package/{Component.d.ts → Component.desktop.d.ts} +4 -5
  9. package/Component.desktop.js +47 -0
  10. package/Component.mobile-06ffd24b.d.ts +41 -0
  11. package/Component.mobile-d7e9f69d.d.ts +6 -0
  12. package/Component.mobile-ebda875c.d.ts +6 -0
  13. package/Component.mobile-f1f15074.d.ts +34 -0
  14. package/Component.mobile.d.ts +16 -4
  15. package/Component.mobile.js +6 -4
  16. package/Component.modal.mobile-5e1b8383.d.ts +60 -0
  17. package/Component.responsive-3109f463.d.ts +26 -0
  18. package/Component.responsive.d.ts +6 -6
  19. package/Component.responsive.js +4 -3
  20. package/Context-bdb4c6b9.d.ts +4 -0
  21. package/ResponsiveContext-baf4875b.d.ts +5 -0
  22. package/component-89a3cf4c.d.ts +44 -0
  23. package/consts-f777ba1a.d.ts +2 -0
  24. package/cssm/Component-5e1b8383.d.ts +72 -0
  25. package/cssm/Component-63dec22f.d.ts +167 -0
  26. package/cssm/Component-89a3cf4c.d.ts +6 -0
  27. package/cssm/Component-bdb4c6b9.d.ts +12 -0
  28. package/cssm/Component-e81c389f.d.ts +5 -0
  29. package/cssm/Component-ebda875c.d.ts +12 -0
  30. package/cssm/Component.desktop-785df74d.d.ts +6 -0
  31. package/{modern/Component.d.ts → cssm/Component.desktop.d.ts} +4 -5
  32. package/cssm/{Component.js → Component.desktop.js} +5 -4
  33. package/cssm/Component.mobile-06ffd24b.d.ts +41 -0
  34. package/cssm/Component.mobile-d7e9f69d.d.ts +6 -0
  35. package/cssm/Component.mobile-ebda875c.d.ts +6 -0
  36. package/cssm/Component.mobile-f1f15074.d.ts +34 -0
  37. package/cssm/Component.mobile.d.ts +16 -4
  38. package/cssm/Component.mobile.js +6 -4
  39. package/cssm/Component.modal.mobile-5e1b8383.d.ts +60 -0
  40. package/cssm/Component.responsive-3109f463.d.ts +26 -0
  41. package/cssm/Component.responsive.d.ts +6 -6
  42. package/cssm/Component.responsive.js +4 -3
  43. package/cssm/Context-bdb4c6b9.d.ts +4 -0
  44. package/cssm/ResponsiveContext-baf4875b.d.ts +5 -0
  45. package/cssm/component-89a3cf4c.d.ts +44 -0
  46. package/cssm/consts-f777ba1a.d.ts +2 -0
  47. package/cssm/desktop-63dec22f.d.ts +6 -0
  48. package/cssm/desktop.d.ts +2 -1
  49. package/cssm/desktop.js +3 -3
  50. package/cssm/field/Component.d.ts +3 -2
  51. package/cssm/hook-9ea9e32c.d.ts +75 -0
  52. package/cssm/index-136acbb1.d.ts +28 -0
  53. package/cssm/index-3109f463.d.ts +62 -0
  54. package/cssm/index-425c8522.d.ts +6 -0
  55. package/cssm/index-89a3cf4c.d.ts +3 -0
  56. package/cssm/index-bdb4c6b9.d.ts +2 -0
  57. package/cssm/index-c44170fe.d.ts +160 -0
  58. package/cssm/index-e81c389f.d.ts +3 -0
  59. package/cssm/index-ebda875c.d.ts +81 -0
  60. package/cssm/index-f12ee135.d.ts +3 -0
  61. package/cssm/index.d.ts +2 -4
  62. package/cssm/index.js +8 -8
  63. package/cssm/mobile-96988a65.d.ts +2 -0
  64. package/cssm/mobile.d.ts +1 -1
  65. package/cssm/mobile.js +2 -1
  66. package/cssm/option/Component.d.ts +5 -4
  67. package/cssm/option/Component.js +2 -2
  68. package/cssm/option/index.js +1 -1
  69. package/cssm/shared-4cd3936b.d.ts +93 -0
  70. package/cssm/shared.d.ts +2 -0
  71. package/cssm/shared.js +13 -0
  72. package/cssm/types-425c8522.d.ts +259 -0
  73. package/cssm/types-ebda875c.d.ts +113 -0
  74. package/cssm/types.d.ts +3 -0
  75. package/cssm/types.js +2 -0
  76. package/cssm/typings-5e1b8383.d.ts +4 -459
  77. package/cssm/typings-9211a437.d.ts +95 -0
  78. package/cssm/typings-bdb4c6b9.d.ts +52 -0
  79. package/cssm/utils/index.d.ts +1 -1
  80. package/cssm/utils-1574ad8b.d.ts +29 -0
  81. package/cssm/utils-49cc3c24.d.ts +8 -0
  82. package/cssm/utils-5e1b8383.d.ts +38 -0
  83. package/desktop-63dec22f.d.ts +6 -0
  84. package/desktop.d.ts +2 -1
  85. package/desktop.js +3 -3
  86. package/esm/Component-5e1b8383.d.ts +72 -0
  87. package/esm/Component-63dec22f.d.ts +167 -0
  88. package/esm/Component-89a3cf4c.d.ts +6 -0
  89. package/esm/Component-bdb4c6b9.d.ts +12 -0
  90. package/esm/Component-e81c389f.d.ts +5 -0
  91. package/esm/Component-ebda875c.d.ts +12 -0
  92. package/esm/Component.desktop-785df74d.d.ts +6 -0
  93. package/{cssm/Component.d.ts → esm/Component.desktop.d.ts} +4 -5
  94. package/esm/{Component.js → Component.desktop.js} +5 -4
  95. package/esm/Component.mobile-06ffd24b.d.ts +41 -0
  96. package/esm/Component.mobile-d7e9f69d.d.ts +6 -0
  97. package/esm/Component.mobile-ebda875c.d.ts +6 -0
  98. package/esm/Component.mobile-f1f15074.d.ts +34 -0
  99. package/esm/Component.mobile.d.ts +16 -4
  100. package/esm/Component.mobile.js +6 -4
  101. package/esm/Component.modal.mobile-5e1b8383.d.ts +60 -0
  102. package/esm/Component.responsive-3109f463.d.ts +26 -0
  103. package/esm/Component.responsive.d.ts +6 -6
  104. package/esm/Component.responsive.js +4 -3
  105. package/esm/Context-bdb4c6b9.d.ts +4 -0
  106. package/esm/ResponsiveContext-baf4875b.d.ts +5 -0
  107. package/esm/component-89a3cf4c.d.ts +44 -0
  108. package/esm/consts-f777ba1a.d.ts +2 -0
  109. package/esm/desktop-63dec22f.d.ts +6 -0
  110. package/esm/desktop.d.ts +2 -1
  111. package/esm/desktop.js +2 -2
  112. package/esm/field/Component.d.ts +3 -2
  113. package/esm/field/Component.js +1 -1
  114. package/esm/field/index.css +5 -5
  115. package/esm/hook-9ea9e32c.d.ts +75 -0
  116. package/esm/index-136acbb1.d.ts +28 -0
  117. package/esm/index-3109f463.d.ts +62 -0
  118. package/esm/index-425c8522.d.ts +6 -0
  119. package/esm/index-89a3cf4c.d.ts +3 -0
  120. package/esm/index-bdb4c6b9.d.ts +2 -0
  121. package/esm/index-c44170fe.d.ts +160 -0
  122. package/esm/index-e81c389f.d.ts +3 -0
  123. package/esm/index-ebda875c.d.ts +81 -0
  124. package/esm/index-f12ee135.d.ts +3 -0
  125. package/esm/index.css +5 -5
  126. package/esm/index.d.ts +2 -4
  127. package/esm/index.js +6 -5
  128. package/esm/mobile-96988a65.d.ts +2 -0
  129. package/esm/mobile.d.ts +1 -1
  130. package/esm/mobile.js +2 -1
  131. package/esm/option/Component.d.ts +5 -4
  132. package/esm/option/Component.js +2 -2
  133. package/esm/option/index.css +4 -4
  134. package/esm/option/index.js +1 -1
  135. package/esm/shared-4cd3936b.d.ts +93 -0
  136. package/esm/shared.d.ts +2 -0
  137. package/esm/shared.js +5 -0
  138. package/esm/types-425c8522.d.ts +259 -0
  139. package/esm/types-ebda875c.d.ts +113 -0
  140. package/esm/types.d.ts +3 -0
  141. package/esm/types.js +1 -0
  142. package/esm/typings-5e1b8383.d.ts +4 -459
  143. package/esm/typings-9211a437.d.ts +95 -0
  144. package/esm/typings-bdb4c6b9.d.ts +52 -0
  145. package/esm/utils/index.d.ts +1 -1
  146. package/esm/utils-1574ad8b.d.ts +29 -0
  147. package/esm/utils-49cc3c24.d.ts +8 -0
  148. package/esm/utils-5e1b8383.d.ts +38 -0
  149. package/field/Component.d.ts +3 -2
  150. package/field/Component.js +1 -1
  151. package/field/index.css +5 -5
  152. package/hook-9ea9e32c.d.ts +75 -0
  153. package/index-136acbb1.d.ts +28 -0
  154. package/index-3109f463.d.ts +62 -0
  155. package/index-425c8522.d.ts +6 -0
  156. package/index-89a3cf4c.d.ts +3 -0
  157. package/index-bdb4c6b9.d.ts +2 -0
  158. package/index-c44170fe.d.ts +160 -0
  159. package/index-e81c389f.d.ts +3 -0
  160. package/index-ebda875c.d.ts +81 -0
  161. package/index-f12ee135.d.ts +3 -0
  162. package/index.css +5 -5
  163. package/index.d.ts +2 -4
  164. package/index.js +6 -6
  165. package/mobile-96988a65.d.ts +2 -0
  166. package/mobile.d.ts +1 -1
  167. package/mobile.js +2 -1
  168. package/modern/Component-5e1b8383.d.ts +72 -0
  169. package/modern/Component-63dec22f.d.ts +167 -0
  170. package/modern/Component-89a3cf4c.d.ts +6 -0
  171. package/modern/Component-bdb4c6b9.d.ts +12 -0
  172. package/modern/Component-e81c389f.d.ts +5 -0
  173. package/modern/Component-ebda875c.d.ts +12 -0
  174. package/modern/Component.desktop-785df74d.d.ts +6 -0
  175. package/{esm/Component.d.ts → modern/Component.desktop.d.ts} +4 -5
  176. package/modern/{Component.js → Component.desktop.js} +5 -4
  177. package/modern/Component.mobile-06ffd24b.d.ts +41 -0
  178. package/modern/Component.mobile-d7e9f69d.d.ts +6 -0
  179. package/modern/Component.mobile-ebda875c.d.ts +6 -0
  180. package/modern/Component.mobile-f1f15074.d.ts +34 -0
  181. package/modern/Component.mobile.d.ts +16 -4
  182. package/modern/Component.mobile.js +6 -4
  183. package/modern/Component.modal.mobile-5e1b8383.d.ts +60 -0
  184. package/modern/Component.responsive-3109f463.d.ts +26 -0
  185. package/modern/Component.responsive.d.ts +6 -6
  186. package/modern/Component.responsive.js +4 -3
  187. package/modern/Context-bdb4c6b9.d.ts +4 -0
  188. package/modern/ResponsiveContext-baf4875b.d.ts +5 -0
  189. package/modern/component-89a3cf4c.d.ts +44 -0
  190. package/modern/consts-f777ba1a.d.ts +2 -0
  191. package/modern/desktop-63dec22f.d.ts +6 -0
  192. package/modern/desktop.d.ts +2 -1
  193. package/modern/desktop.js +2 -2
  194. package/modern/field/Component.d.ts +3 -2
  195. package/modern/field/Component.js +1 -1
  196. package/modern/field/index.css +5 -5
  197. package/modern/hook-9ea9e32c.d.ts +75 -0
  198. package/modern/index-136acbb1.d.ts +28 -0
  199. package/modern/index-3109f463.d.ts +62 -0
  200. package/modern/index-425c8522.d.ts +6 -0
  201. package/modern/index-89a3cf4c.d.ts +3 -0
  202. package/modern/index-bdb4c6b9.d.ts +2 -0
  203. package/modern/index-c44170fe.d.ts +160 -0
  204. package/modern/index-e81c389f.d.ts +3 -0
  205. package/modern/index-ebda875c.d.ts +81 -0
  206. package/modern/index-f12ee135.d.ts +3 -0
  207. package/modern/index.css +5 -5
  208. package/modern/index.d.ts +2 -4
  209. package/modern/index.js +6 -5
  210. package/modern/mobile-96988a65.d.ts +2 -0
  211. package/modern/mobile.d.ts +1 -1
  212. package/modern/mobile.js +2 -1
  213. package/modern/option/Component.d.ts +5 -4
  214. package/modern/option/Component.js +2 -2
  215. package/modern/option/index.css +4 -4
  216. package/modern/option/index.js +1 -1
  217. package/modern/shared-4cd3936b.d.ts +93 -0
  218. package/modern/shared.d.ts +2 -0
  219. package/modern/shared.js +5 -0
  220. package/modern/types-425c8522.d.ts +259 -0
  221. package/modern/types-ebda875c.d.ts +113 -0
  222. package/modern/types.d.ts +3 -0
  223. package/modern/types.js +1 -0
  224. package/modern/typings-5e1b8383.d.ts +4 -459
  225. package/modern/typings-9211a437.d.ts +95 -0
  226. package/modern/typings-bdb4c6b9.d.ts +52 -0
  227. package/modern/utils/index.d.ts +1 -1
  228. package/modern/utils-1574ad8b.d.ts +29 -0
  229. package/modern/utils-49cc3c24.d.ts +8 -0
  230. package/modern/utils-5e1b8383.d.ts +38 -0
  231. package/option/Component.d.ts +5 -4
  232. package/option/Component.js +3 -3
  233. package/option/index.css +4 -4
  234. package/option/index.js +1 -1
  235. package/package.json +27 -3
  236. package/shared-4cd3936b.d.ts +93 -0
  237. package/shared.d.ts +2 -0
  238. package/shared.js +13 -0
  239. package/src/Component.desktop.tsx +122 -0
  240. package/src/Component.mobile.tsx +83 -0
  241. package/src/Component.responsive.tsx +61 -0
  242. package/src/desktop.ts +1 -0
  243. package/src/field/Component.tsx +86 -0
  244. package/src/field/index.module.css +18 -0
  245. package/src/field/index.ts +1 -0
  246. package/src/index.module.css +22 -0
  247. package/src/index.ts +4 -0
  248. package/src/mobile.ts +1 -0
  249. package/src/option/Component.tsx +30 -0
  250. package/src/option/index.module.css +17 -0
  251. package/src/option/index.ts +1 -0
  252. package/src/shared.ts +2 -0
  253. package/src/types.ts +3 -0
  254. package/src/utils/index.ts +19 -0
  255. package/types-425c8522.d.ts +259 -0
  256. package/types-ebda875c.d.ts +113 -0
  257. package/types.d.ts +3 -0
  258. package/types.js +2 -0
  259. package/typings-5e1b8383.d.ts +4 -459
  260. package/typings-9211a437.d.ts +95 -0
  261. package/typings-bdb4c6b9.d.ts +52 -0
  262. package/utils/index.d.ts +1 -1
  263. package/utils-1574ad8b.d.ts +29 -0
  264. package/utils-49cc3c24.d.ts +8 -0
  265. package/utils-5e1b8383.d.ts +38 -0
  266. package/Component.js +0 -46
  267. package/cssm/responsive.d.ts +0 -2
  268. package/cssm/responsive.js +0 -27
  269. package/esm/responsive.d.ts +0 -2
  270. package/esm/responsive.js +0 -16
  271. package/modern/responsive.d.ts +0 -2
  272. package/modern/responsive.js +0 -15
  273. package/responsive.d.ts +0 -2
  274. package/responsive.js +0 -24
@@ -0,0 +1,38 @@
1
+ import { ReactNode, RefObject } from 'react';
2
+ import { BaseSelectProps, GroupShape, OptionShape } from "./typings-5e1b8383";
3
+ declare const isGroup: (item: OptionShape | GroupShape) => item is GroupShape;
4
+ declare const isOptionShape: (item: OptionShape | string | null) => item is OptionShape;
5
+ declare const joinOptions: ({ selected, selectedMultiple, }: {
6
+ selected?: OptionShape | undefined;
7
+ selectedMultiple?: OptionShape[] | undefined;
8
+ }) => ReactNode[] | null;
9
+ declare function processOptions(options: BaseSelectProps['options'], selected?: BaseSelectProps['selected']): {
10
+ flatOptions: OptionShape[];
11
+ selectedOptions: OptionShape[];
12
+ };
13
+ type useVisibleOptionsArgs = {
14
+ /**
15
+ * Количество видимых пунктов
16
+ */
17
+ visibleOptions: number;
18
+ /**
19
+ * Реф на контейнер с пунтами меню
20
+ */
21
+ listRef: RefObject<HTMLElement>;
22
+ /**
23
+ * Реф на контейнер, которому нужно установить высоту
24
+ */
25
+ styleTargetRef?: RefObject<HTMLElement>;
26
+ /**
27
+ * Флаг открытия меню
28
+ */
29
+ open?: boolean;
30
+ /**
31
+ * Позволяет вызвать пересчет высоты
32
+ */
33
+ invalidate?: unknown;
34
+ };
35
+ declare function useVisibleOptions({ visibleOptions, listRef, styleTargetRef, open, invalidate, }: useVisibleOptionsArgs): void;
36
+ declare function usePrevious<T>(value: T): T | undefined;
37
+ declare const lastIndexOf: <T>(array: T[], predicate: (item: T) => boolean) => number;
38
+ export { isGroup, isOptionShape, joinOptions, processOptions, useVisibleOptions, usePrevious, lastIndexOf };
@@ -1,11 +1,12 @@
1
1
  /// <reference types="react" />
2
- import { FC, SVGProps } from 'react';
3
- import { OptionShape } from "../typings-5e1b8383";
4
- import { OptionProps as BaseOptionProps } from "../typings-5e1b8383";
2
+ import React from 'react';
3
+ import { FC, SVGProps } from "react";
4
+ import { OptionShape } from "../shared-4cd3936b";
5
+ import { OptionProps as BaseOptionProps } from "../shared-4cd3936b";
5
6
  type OptionProps = Omit<BaseOptionProps, 'option'> & {
6
7
  option: OptionShape & {
7
8
  icon?: FC<SVGProps<SVGSVGElement>>;
8
9
  };
9
10
  };
10
- declare const Option: ({ option, children, ...restProps }: OptionProps) => JSX.Element;
11
+ declare const Option: ({ option, children, ...restProps }: OptionProps) => React.JSX.Element;
11
12
  export { Option };
@@ -4,20 +4,20 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var tslib = require('tslib');
6
6
  var React = require('react');
7
- var coreComponentsSelect = require('@alfalab/core-components-select');
7
+ var shared = require('@alfalab/core-components-select/shared');
8
8
 
9
9
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
10
10
 
11
11
  var React__default = /*#__PURE__*/_interopDefaultCompat(React);
12
12
 
13
- var styles = {"container":"picker-button__container_tl44d","icon":"picker-button__icon_tl44d","content":"picker-button__content_tl44d"};
13
+ var styles = {"container":"picker-button__container_n5ay9","icon":"picker-button__icon_n5ay9","content":"picker-button__content_n5ay9"};
14
14
  require('./index.css')
15
15
 
16
16
  var Option = function (_a) {
17
17
  var option = _a.option, children = _a.children, restProps = tslib.__rest(_a, ["option", "children"]);
18
18
  var content = children || option.content || option.key;
19
19
  var Icon = option.icon;
20
- return (React__default.default.createElement(coreComponentsSelect.Option, tslib.__assign({ option: option }, restProps),
20
+ return (React__default.default.createElement(shared.Option, tslib.__assign({ option: option }, restProps),
21
21
  React__default.default.createElement("div", { className: styles.container },
22
22
  Icon && React__default.default.createElement(Icon, { className: styles.icon }),
23
23
  React__default.default.createElement("div", { className: styles.content }, content))));
package/option/index.css CHANGED
@@ -1,4 +1,4 @@
1
- /* hash: wqdyo */
1
+ /* hash: 1g853 */
2
2
  :root {
3
3
  } /* deprecated */ :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
4
4
  } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
@@ -15,13 +15,13 @@
15
15
  --gap-s: 12px;
16
16
  } :root {
17
17
  } :root {
18
- } .picker-button__container_tl44d {
18
+ } .picker-button__container_n5ay9 {
19
19
  display: flex;
20
20
  align-items: center;
21
- } .picker-button__icon_tl44d {
21
+ } .picker-button__icon_n5ay9 {
22
22
  display: flex;
23
23
  margin-right: var(--gap-s);
24
- } .picker-button__content_tl44d {
24
+ } .picker-button__content_n5ay9 {
25
25
  overflow: hidden;
26
26
  flex: 1;
27
27
  text-overflow: ellipsis;
package/option/index.js CHANGED
@@ -5,7 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var option_Component = require('./Component.js');
6
6
  require('tslib');
7
7
  require('react');
8
- require('@alfalab/core-components-select');
8
+ require('@alfalab/core-components-select/shared');
9
9
 
10
10
 
11
11
 
package/package.json CHANGED
@@ -1,11 +1,35 @@
1
1
  {
2
2
  "name": "@alfalab/core-components-picker-button",
3
- "version": "10.3.29",
3
+ "version": "11.0.0",
4
4
  "description": "Picker button component",
5
5
  "keywords": [],
6
6
  "license": "MIT",
7
7
  "main": "index.js",
8
8
  "module": "./esm/index.js",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./esm/index.js",
12
+ "require": "./index.js"
13
+ },
14
+ "./mobile": {
15
+ "import": "./esm/mobile.js",
16
+ "require": "./mobile.js"
17
+ },
18
+ "./desktop": {
19
+ "import": "./esm/desktop.js",
20
+ "require": "./desktop.js"
21
+ },
22
+ "./shared": {
23
+ "import": "./esm/shared.js",
24
+ "require": "./shared.js"
25
+ },
26
+ "./esm": "./esm/index.js",
27
+ "./cssm": "./cssm/index.js",
28
+ "./modern": "./modern/index.js",
29
+ "./esm/*": "./esm/*",
30
+ "./cssm/*": "./cssm/*",
31
+ "./modern/*": "./modern/*"
32
+ },
9
33
  "publishConfig": {
10
34
  "access": "public",
11
35
  "directory": "dist"
@@ -15,8 +39,8 @@
15
39
  "react-dom": "^16.9.0 || ^17.0.1 || ^18.0.0"
16
40
  },
17
41
  "dependencies": {
18
- "@alfalab/core-components-button": "^8.5.1",
19
- "@alfalab/core-components-select": "^14.3.4",
42
+ "@alfalab/core-components-button": "^9.0.0",
43
+ "@alfalab/core-components-select": "^15.0.0",
20
44
  "@alfalab/hooks": "^1.13.0",
21
45
  "@alfalab/icons-glyph": "^2.108.0",
22
46
  "classnames": "^2.3.1",
@@ -0,0 +1,93 @@
1
+ /// <reference types="react" />
2
+ import React from "react";
3
+ import { ReactNode } from "react";
4
+ import { BaseSelectProps, OptionProps, OptionShape } from "./typings-5e1b8383";
5
+ // eslint-disable-next-line @typescript-eslint/naming-convention
6
+ type useSelectWithLoadingProps = {
7
+ loading?: boolean;
8
+ visibleOptions?: BaseSelectProps["visibleOptions"];
9
+ Option?: React.FC<OptionProps>;
10
+ };
11
+ declare function useSelectWithLoading({ loading, visibleOptions, Option }: useSelectWithLoadingProps): {
12
+ Option: (props: OptionProps) => React.JSX.Element;
13
+ options: OptionShape[];
14
+ } | null;
15
+ type OptionsFetcherResponse = {
16
+ options: OptionShape[];
17
+ hasMore: boolean;
18
+ };
19
+ // eslint-disable-next-line @typescript-eslint/naming-convention
20
+ type useLazyLoadingProps = {
21
+ /** Количество элементов на "странице" */
22
+ limit?: number;
23
+ /** Начальный номер "страницы" */
24
+ initialOffset?: number;
25
+ /** Скелетон загружаемых элементов */
26
+ skeleton?: React.ReactNode;
27
+ /** Компонент пункта меню */
28
+ Option?: React.FC<OptionProps>;
29
+ /**
30
+ * Функция-загрузчик опций.
31
+ * @param offset - текущая страница
32
+ * @param limit - количество элементов на странице
33
+ * @param queryString - строчные данные, пробрасываемые для поиска из кастомного инпута, расположенного в заголовке OptionsList
34
+ * @returns Promise<{
35
+ * options - список опций следующей "страницы". Они аппендятся к предыдущим
36
+ * hasMore - указывает, есть ли еще незагруженные элементы (в случае false перестает загружать "следующую страницу")
37
+ * }>
38
+ */
39
+ optionsFetcher(offset: number, limit: number, queryString?: string): Promise<OptionsFetcherResponse>;
40
+ };
41
+ declare function useLazyLoading({ limit, initialOffset, optionsFetcher, skeleton, Option }: useLazyLoadingProps): {
42
+ optionsProps: {
43
+ Option: (props: OptionProps) => React.JSX.Element;
44
+ options: OptionShape[];
45
+ optionsListProps: {
46
+ ref: React.RefObject<HTMLDivElement>;
47
+ inputProps: {
48
+ onChange: (event: React.ChangeEvent<HTMLInputElement>, payload: {
49
+ value: string;
50
+ }) => void;
51
+ value: string;
52
+ };
53
+ };
54
+ onOpen: (payload: {
55
+ open?: boolean;
56
+ }) => void;
57
+ };
58
+ reset: () => void;
59
+ };
60
+ type SkeletonProps = {
61
+ /**
62
+ * Флаг, явно задающий состояние, при котором контент закрывается прелоадером
63
+ */
64
+ visible?: boolean;
65
+ /**
66
+ * Флаг явного включения анимации скелета
67
+ */
68
+ animate?: boolean;
69
+ /**
70
+ * Дополнительный класс
71
+ */
72
+ className?: string;
73
+ /**
74
+ * Дополнительные инлайн стили
75
+ */
76
+ style?: React.CSSProperties;
77
+ /**
78
+ * Идентификатор для систем автоматизированного тестирования
79
+ */
80
+ dataTestId?: string;
81
+ /**
82
+ * Дочерние элементы.
83
+ */
84
+ children?: ReactNode;
85
+ };
86
+ declare const Skeleton: React.FC<SkeletonProps>;
87
+ export * from "./index-ebda875c";
88
+ export * from "./Component-5e1b8383";
89
+ export { useSelectWithLoading, useLazyLoading, SkeletonProps, Skeleton };
90
+ export * from "./hook-9ea9e32c";
91
+ export * from "./typings-5e1b8383";
92
+ export * from "./utils-5e1b8383";
93
+ export type { AdditionalMobileProps } from "./Component.mobile-06ffd24b";
package/shared.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { getIcon } from "./utils/index";
2
+ export * from "./types";
package/shared.js ADDED
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var utils_index = require('./utils/index.js');
6
+ require('@alfalab/icons-glyph/ChevronDownCompactSIcon');
7
+ require('@alfalab/icons-glyph/ChevronDownMIcon');
8
+ require('@alfalab/icons-glyph/MoreMIcon');
9
+ require('@alfalab/icons-glyph/MoreSIcon');
10
+
11
+
12
+
13
+ exports.getIcon = utils_index.getIcon;
@@ -0,0 +1,122 @@
1
+ import React, { FC, forwardRef, SVGProps } from 'react';
2
+ import cn from 'classnames';
3
+
4
+ import type { ButtonProps } from '@alfalab/core-components-button';
5
+ import {
6
+ BaseSelect,
7
+ BaseSelectProps,
8
+ Optgroup as DefaultOptgroup,
9
+ OptionsList as DefaultOptionsList,
10
+ } from '@alfalab/core-components-select/shared';
11
+
12
+ import { Field as DefaultField } from './field';
13
+ import { Option as DefaultOption } from './option';
14
+ import type { PickerButtonSize, PickerButtonVariant } from './types';
15
+
16
+ import styles from './index.module.css';
17
+
18
+ const SIDE_POSITIONS = ['right', 'right-start', 'right-end', 'left', 'left-start', 'left-end'];
19
+
20
+ export type PickerButtonDesktopProps = Omit<
21
+ BaseSelectProps,
22
+ | 'placeholder'
23
+ | 'Arrow'
24
+ | 'autocomplete'
25
+ | 'size'
26
+ | 'onFocus'
27
+ | 'selected'
28
+ | 'closeOnSelect'
29
+ | 'multiple'
30
+ | 'hint'
31
+ | 'allowUnselect'
32
+ | 'options'
33
+ > &
34
+ Pick<ButtonProps, 'view' | 'loading' | 'leftAddons' | 'rightAddons'> & {
35
+ options: Array<
36
+ BaseSelectProps['options'][0] & {
37
+ /**
38
+ * Иконка, отображающаяся слева от текстового представления пункта
39
+ */
40
+ icon?: FC<SVGProps<SVGSVGElement>>;
41
+ }
42
+ >;
43
+
44
+ /**
45
+ * Размер кнопки
46
+ */
47
+ size?: PickerButtonSize;
48
+
49
+ /**
50
+ * Тип кнопки
51
+ */
52
+ variant?: PickerButtonVariant;
53
+
54
+ /**
55
+ * Показывать стрелку
56
+ * @default true
57
+ */
58
+ showArrow?: boolean;
59
+ };
60
+
61
+ export const PickerButtonDesktop = forwardRef<HTMLInputElement, PickerButtonDesktopProps>(
62
+ (
63
+ {
64
+ OptionsList = DefaultOptionsList,
65
+ Optgroup = DefaultOptgroup,
66
+ Option = DefaultOption,
67
+ view,
68
+ loading,
69
+ size = 'm',
70
+ variant = 'default',
71
+ className,
72
+ leftAddons,
73
+ rightAddons,
74
+ popperClassName,
75
+ optionClassName,
76
+ showArrow,
77
+ Field = DefaultField,
78
+ fieldProps = {},
79
+ ...restProps
80
+ },
81
+ ref,
82
+ ) => {
83
+ const isSideGap =
84
+ !!restProps.popoverPosition && SIDE_POSITIONS.includes(restProps.popoverPosition);
85
+
86
+ const fieldDefaultProps = {
87
+ view,
88
+ loading,
89
+ /** size у select, button несовместимы */
90
+ buttonSize: size,
91
+ buttonVariant: variant,
92
+ leftAddons,
93
+ rightAddons,
94
+ showArrow,
95
+ breakpoint: 1,
96
+ };
97
+
98
+ return (
99
+ <BaseSelect
100
+ {...restProps}
101
+ optionProps={{ Checkmark: null }}
102
+ ref={ref}
103
+ Option={Option}
104
+ Field={Field}
105
+ size={size === 'm' ? 'm' : 's'}
106
+ fieldProps={{
107
+ ...fieldDefaultProps,
108
+ ...(fieldProps as object),
109
+ }}
110
+ Optgroup={Optgroup}
111
+ OptionsList={OptionsList}
112
+ className={cn(styles.container, className)}
113
+ popperClassName={cn('cc-picker-button', styles.optionsPopover, popperClassName, {
114
+ [styles.sideGap]: isSideGap,
115
+ })}
116
+ optionClassName={cn(styles.option, optionClassName)}
117
+ selected={[]}
118
+ closeOnSelect={true}
119
+ />
120
+ );
121
+ },
122
+ );
@@ -0,0 +1,83 @@
1
+ import React, { forwardRef } from 'react';
2
+
3
+ import { SelectMobile } from '@alfalab/core-components-select/mobile';
4
+ import {
5
+ AdditionalMobileProps,
6
+ Optgroup as DefaultOptgroup,
7
+ } from '@alfalab/core-components-select/shared';
8
+
9
+ import type { PickerButtonDesktopProps } from './desktop';
10
+ import { Field as DefaultField } from './field';
11
+ import { Option as DefaultOption } from './option';
12
+
13
+ export type PickerButtonMobileProps = Omit<
14
+ PickerButtonDesktopProps,
15
+ 'OptionsList' | 'Checkmark' | 'onScroll'
16
+ > &
17
+ AdditionalMobileProps & {
18
+ /**
19
+ * Контрольная точка для кнопки, с нее начинается desktop версия
20
+ * @default 1024
21
+ */
22
+ breakpoint?: number;
23
+ };
24
+
25
+ export const PickerButtonMobile = forwardRef<HTMLInputElement, PickerButtonMobileProps>(
26
+ (
27
+ {
28
+ options,
29
+ label,
30
+ Option = DefaultOption,
31
+ Optgroup = DefaultOptgroup,
32
+ view,
33
+ loading,
34
+ variant = 'default',
35
+ leftAddons,
36
+ rightAddons,
37
+ size,
38
+ bottomSheetProps,
39
+ showArrow,
40
+ Field = DefaultField,
41
+ fieldProps = {},
42
+ breakpoint = 1024,
43
+ ...restProps
44
+ },
45
+ ref,
46
+ ) => {
47
+ const fieldDefaultProps = {
48
+ view,
49
+ loading,
50
+ /** size у select, button несовместимы */
51
+ buttonSize: size,
52
+ buttonVariant: variant,
53
+ leftAddons,
54
+ rightAddons,
55
+ showArrow,
56
+ breakpoint,
57
+ };
58
+
59
+ return (
60
+ <SelectMobile
61
+ {...restProps}
62
+ label={label}
63
+ Option={Option}
64
+ bottomSheetProps={{
65
+ title: label,
66
+ stickyHeader: true,
67
+ ...bottomSheetProps,
68
+ }}
69
+ Field={Field}
70
+ Optgroup={Optgroup}
71
+ size={size === 'm' ? 'm' : 's'}
72
+ closeOnSelect={true}
73
+ fieldProps={{
74
+ ...fieldDefaultProps,
75
+ ...(fieldProps as object),
76
+ }}
77
+ ref={ref}
78
+ options={options}
79
+ selected={[]}
80
+ />
81
+ );
82
+ },
83
+ );
@@ -0,0 +1,61 @@
1
+ import React, { forwardRef } from 'react';
2
+
3
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
4
+ import { ButtonProps } from '@alfalab/core-components-button';
5
+ import type { AdditionalMobileProps } from '@alfalab/core-components-select/shared';
6
+ import { useMedia } from '@alfalab/hooks';
7
+
8
+ import { PickerButtonDesktop, PickerButtonDesktopProps } from './desktop';
9
+ import { PickerButtonMobile } from './mobile';
10
+
11
+ export type PickerButtonMatchMedia = 'desktop' | 'mobile';
12
+
13
+ export type PickerButtonResponsiveProps = PickerButtonDesktopProps &
14
+ AdditionalMobileProps & {
15
+ /**
16
+ * Контрольная точка, с нее начинается desktop версия
17
+ * @default 1024
18
+ */
19
+ breakpoint?: number;
20
+ };
21
+
22
+ export const PickerButtonResponsive = forwardRef<HTMLInputElement, PickerButtonResponsiveProps>(
23
+ (
24
+ {
25
+ OptionsList,
26
+ onScroll,
27
+ footer,
28
+ swipeable,
29
+ bottomSheetProps,
30
+ breakpoint = 1024,
31
+ ...restProps
32
+ },
33
+ ref,
34
+ ) => {
35
+ const [view] = useMedia(
36
+ [
37
+ ['mobile', `(max-width: ${breakpoint - 1}px)`],
38
+ ['desktop', `(min-width: ${breakpoint}px)`],
39
+ ],
40
+ 'desktop',
41
+ );
42
+
43
+ return view === 'desktop' ? (
44
+ <PickerButtonDesktop
45
+ ref={ref}
46
+ OptionsList={OptionsList}
47
+ onScroll={onScroll}
48
+ {...restProps}
49
+ />
50
+ ) : (
51
+ <PickerButtonMobile
52
+ ref={ref}
53
+ footer={footer}
54
+ swipeable={swipeable}
55
+ bottomSheetProps={bottomSheetProps}
56
+ breakpoint={breakpoint}
57
+ {...restProps}
58
+ />
59
+ );
60
+ },
61
+ );
package/src/desktop.ts ADDED
@@ -0,0 +1 @@
1
+ export { PickerButtonDesktop, PickerButtonDesktopProps } from './Component.desktop';
@@ -0,0 +1,86 @@
1
+ import React, { ButtonHTMLAttributes, FC, Fragment, SVGProps } from 'react';
2
+ import cn from 'classnames';
3
+
4
+ import { Button, ButtonProps } from '@alfalab/core-components-button';
5
+ import { FieldProps as BaseFieldProps } from '@alfalab/core-components-select/src/typings';
6
+
7
+ import type { PickerButtonSize, PickerButtonVariant } from '../types';
8
+ import { getIcon } from '../utils';
9
+
10
+ import styles from './index.module.css';
11
+
12
+ type FieldProps = Omit<BaseFieldProps, 'size' | 'hint' | 'success' | 'error' | 'placeholder'> &
13
+ ButtonProps & {
14
+ buttonSize?: PickerButtonSize;
15
+ buttonVariant?: PickerButtonVariant;
16
+ showArrow?: boolean;
17
+ };
18
+
19
+ export const Field = ({
20
+ buttonSize = 'm',
21
+ buttonVariant = 'default',
22
+ view,
23
+ label,
24
+ open,
25
+ multiple,
26
+ rightAddons,
27
+ Arrow,
28
+ innerProps,
29
+ className,
30
+ selected,
31
+ selectedMultiple,
32
+ setSelectedItems,
33
+ toggleMenu,
34
+ valueRenderer,
35
+ showArrow = true,
36
+ labelView,
37
+ ...restProps
38
+ }: FieldProps) => {
39
+ const Icon: FC<SVGProps<SVGSVGElement>> = getIcon(buttonVariant, buttonSize);
40
+
41
+ const { ref, ...restInnerProps } = innerProps;
42
+
43
+ const buttonProps = {
44
+ ...restProps,
45
+ ...restInnerProps,
46
+ } as ButtonHTMLAttributes<HTMLButtonElement>;
47
+
48
+ return (
49
+ <div ref={ref}>
50
+ <Button
51
+ {...buttonProps}
52
+ rightAddons={
53
+ <Fragment>
54
+ {rightAddons && (
55
+ <span
56
+ className={cn(styles.addonsContainer, {
57
+ [styles.showControlIcon]:
58
+ showArrow || buttonVariant === 'compact',
59
+ })}
60
+ >
61
+ {rightAddons}
62
+ </span>
63
+ )}
64
+
65
+ {(showArrow || buttonVariant === 'compact') && (
66
+ <span
67
+ className={cn(
68
+ styles.iconContainer,
69
+ buttonVariant !== 'compact' && open && styles.open,
70
+ )}
71
+ >
72
+ <Icon data-test-id='picker-button-icon' />
73
+ </span>
74
+ )}
75
+ </Fragment>
76
+ }
77
+ block={true}
78
+ view={view}
79
+ size={buttonSize}
80
+ className={cn(styles.component, view === 'primary' && styles.primary, className)}
81
+ >
82
+ {buttonVariant !== 'compact' && label}
83
+ </Button>
84
+ </div>
85
+ );
86
+ };
@@ -0,0 +1,18 @@
1
+ @import '@alfalab/core-components-themes/src/default.css';
2
+
3
+ .iconContainer {
4
+ display: flex;
5
+ transition: transform 0.15s ease-in-out;
6
+ }
7
+
8
+ .addonsContainer {
9
+ display: flex;
10
+
11
+ &.showControlIcon {
12
+ margin-right: var(--gap-2xs);
13
+ }
14
+ }
15
+
16
+ .open {
17
+ transform: var(--arrow-transform);
18
+ }
@@ -0,0 +1 @@
1
+ export * from './Component';
@@ -0,0 +1,22 @@
1
+ @import '@alfalab/core-components-themes/src/default.css';
2
+
3
+ .container {
4
+ min-width: auto;
5
+ }
6
+
7
+ :global(.cc-picker-button) {
8
+ &.optionsPopover {
9
+ &.sideGap {
10
+ padding: 0 var(--gap-xs);
11
+ }
12
+ }
13
+
14
+ & .option {
15
+ padding: 0 var(--gap-m);
16
+
17
+ &:before {
18
+ /* Удаляем разделители у опций выпадающего списка. */
19
+ display: none;
20
+ }
21
+ }
22
+ }