@alfalab/core-components-select 18.2.7 → 18.2.9

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 (135) hide show
  1. package/components/arrow/index.css +4 -4
  2. package/components/arrow/index.module.css.js +1 -1
  3. package/components/base-checkmark/index.css +5 -5
  4. package/components/base-checkmark/index.module.css.js +1 -1
  5. package/components/base-option/index.css +16 -16
  6. package/components/base-option/index.module.css.js +1 -1
  7. package/components/base-select/index.css +14 -14
  8. package/components/base-select/index.module.css.js +1 -1
  9. package/components/base-select/mobile.css +11 -11
  10. package/components/base-select/mobile.module.css.js +1 -1
  11. package/components/checkmark/index.css +9 -9
  12. package/components/checkmark/index.module.css.js +1 -1
  13. package/components/checkmark-mobile/index.css +5 -5
  14. package/components/checkmark-mobile/index.module.css.js +1 -1
  15. package/components/clear-button/index.css +4 -4
  16. package/components/clear-button/index.module.css.js +1 -1
  17. package/components/field/index.css +13 -13
  18. package/components/field/index.module.css.js +1 -1
  19. package/components/footer/index.css +4 -4
  20. package/components/footer/index.module.css.js +1 -1
  21. package/components/optgroup/index.css +4 -4
  22. package/components/optgroup/index.module.css.js +1 -1
  23. package/components/option/desktop/index.css +19 -19
  24. package/components/option/desktop/index.module.css.js +1 -1
  25. package/components/option/mobile/index.css +16 -16
  26. package/components/option/mobile/index.module.css.js +1 -1
  27. package/components/options-list/Component.js +8 -5
  28. package/components/options-list/Component.js.map +1 -1
  29. package/components/options-list/index.css +24 -11
  30. package/components/options-list/index.module.css.js +1 -1
  31. package/components/options-list/index.module.css.js.map +1 -1
  32. package/components/search/index.css +1 -1
  33. package/components/search/index.module.css.js +1 -1
  34. package/components/virtual-options-list/index.css +13 -13
  35. package/components/virtual-options-list/index.module.css.js +1 -1
  36. package/cssm/components/base-select/index.module.css +3 -3
  37. package/cssm/components/options-list/Component.js +8 -5
  38. package/cssm/components/options-list/Component.js.map +1 -1
  39. package/cssm/components/options-list/index.module.css +18 -5
  40. package/esm/components/arrow/index.css +4 -4
  41. package/esm/components/arrow/index.module.css.js +1 -1
  42. package/esm/components/base-checkmark/index.css +5 -5
  43. package/esm/components/base-checkmark/index.module.css.js +1 -1
  44. package/esm/components/base-option/index.css +16 -16
  45. package/esm/components/base-option/index.module.css.js +1 -1
  46. package/esm/components/base-select/index.css +14 -14
  47. package/esm/components/base-select/index.module.css.js +1 -1
  48. package/esm/components/base-select/mobile.css +11 -11
  49. package/esm/components/base-select/mobile.module.css.js +1 -1
  50. package/esm/components/checkmark/index.css +9 -9
  51. package/esm/components/checkmark/index.module.css.js +1 -1
  52. package/esm/components/checkmark-mobile/index.css +5 -5
  53. package/esm/components/checkmark-mobile/index.module.css.js +1 -1
  54. package/esm/components/clear-button/index.css +4 -4
  55. package/esm/components/clear-button/index.module.css.js +1 -1
  56. package/esm/components/field/index.css +13 -13
  57. package/esm/components/field/index.module.css.js +1 -1
  58. package/esm/components/footer/index.css +4 -4
  59. package/esm/components/footer/index.module.css.js +1 -1
  60. package/esm/components/optgroup/index.css +4 -4
  61. package/esm/components/optgroup/index.module.css.js +1 -1
  62. package/esm/components/option/desktop/index.css +19 -19
  63. package/esm/components/option/desktop/index.module.css.js +1 -1
  64. package/esm/components/option/mobile/index.css +16 -16
  65. package/esm/components/option/mobile/index.module.css.js +1 -1
  66. package/esm/components/options-list/Component.js +8 -5
  67. package/esm/components/options-list/Component.js.map +1 -1
  68. package/esm/components/options-list/index.css +24 -11
  69. package/esm/components/options-list/index.module.css.js +1 -1
  70. package/esm/components/options-list/index.module.css.js.map +1 -1
  71. package/esm/components/search/index.css +1 -1
  72. package/esm/components/search/index.module.css.js +1 -1
  73. package/esm/components/virtual-options-list/index.css +13 -13
  74. package/esm/components/virtual-options-list/index.module.css.js +1 -1
  75. package/esm/presets/useSelectWithApply/options-list-with-apply/footer/index.css +3 -3
  76. package/esm/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js +1 -1
  77. package/esm/presets/useSelectWithApply/options-list-with-apply/header/index.css +3 -3
  78. package/esm/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js +1 -1
  79. package/esm/presets/useSelectWithLoading/index.css +1 -1
  80. package/esm/presets/useSelectWithLoading/index.module.css.js +1 -1
  81. package/modern/components/arrow/index.css +4 -4
  82. package/modern/components/arrow/index.module.css.js +1 -1
  83. package/modern/components/base-checkmark/index.css +5 -5
  84. package/modern/components/base-checkmark/index.module.css.js +1 -1
  85. package/modern/components/base-option/index.css +16 -16
  86. package/modern/components/base-option/index.module.css.js +1 -1
  87. package/modern/components/base-select/index.css +14 -14
  88. package/modern/components/base-select/index.module.css.js +1 -1
  89. package/modern/components/base-select/mobile.css +11 -11
  90. package/modern/components/base-select/mobile.module.css.js +1 -1
  91. package/modern/components/checkmark/index.css +9 -9
  92. package/modern/components/checkmark/index.module.css.js +1 -1
  93. package/modern/components/checkmark-mobile/index.css +5 -5
  94. package/modern/components/checkmark-mobile/index.module.css.js +1 -1
  95. package/modern/components/clear-button/index.css +4 -4
  96. package/modern/components/clear-button/index.module.css.js +1 -1
  97. package/modern/components/field/index.css +13 -13
  98. package/modern/components/field/index.module.css.js +1 -1
  99. package/modern/components/footer/index.css +4 -4
  100. package/modern/components/footer/index.module.css.js +1 -1
  101. package/modern/components/optgroup/index.css +4 -4
  102. package/modern/components/optgroup/index.module.css.js +1 -1
  103. package/modern/components/option/desktop/index.css +19 -19
  104. package/modern/components/option/desktop/index.module.css.js +1 -1
  105. package/modern/components/option/mobile/index.css +16 -16
  106. package/modern/components/option/mobile/index.module.css.js +1 -1
  107. package/modern/components/options-list/Component.js +4 -1
  108. package/modern/components/options-list/Component.js.map +1 -1
  109. package/modern/components/options-list/index.css +24 -11
  110. package/modern/components/options-list/index.module.css.js +1 -1
  111. package/modern/components/options-list/index.module.css.js.map +1 -1
  112. package/modern/components/search/index.css +1 -1
  113. package/modern/components/search/index.module.css.js +1 -1
  114. package/modern/components/virtual-options-list/index.css +13 -13
  115. package/modern/components/virtual-options-list/index.module.css.js +1 -1
  116. package/modern/presets/useSelectWithApply/options-list-with-apply/footer/index.css +3 -3
  117. package/modern/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js +1 -1
  118. package/modern/presets/useSelectWithApply/options-list-with-apply/header/index.css +3 -3
  119. package/modern/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js +1 -1
  120. package/modern/presets/useSelectWithLoading/index.css +1 -1
  121. package/modern/presets/useSelectWithLoading/index.module.css.js +1 -1
  122. package/moderncssm/components/base-select/index.module.css +1 -1
  123. package/moderncssm/components/options-list/Component.js +4 -1
  124. package/moderncssm/components/options-list/Component.js.map +1 -1
  125. package/moderncssm/components/options-list/index.module.css +26 -5
  126. package/package.json +6 -6
  127. package/presets/useSelectWithApply/options-list-with-apply/footer/index.css +3 -3
  128. package/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js +1 -1
  129. package/presets/useSelectWithApply/options-list-with-apply/header/index.css +3 -3
  130. package/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js +1 -1
  131. package/presets/useSelectWithLoading/index.css +1 -1
  132. package/presets/useSelectWithLoading/index.module.css.js +1 -1
  133. package/src/components/options-list/Component.tsx +4 -0
  134. package/src/components/options-list/index.module.css +25 -5
  135. package/src/vars.css +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Component.js","sources":["../../../src/components/options-list/Component.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useRef, useState } from 'react';\nimport mergeRefs from 'react-merge-refs';\nimport cn from 'classnames';\n\nimport { Scrollbar } from '@alfalab/core-components-scrollbar';\n\nimport { DEFAULT_VISIBLE_OPTIONS, SIZE_TO_CLASSNAME_MAP } from '../../consts';\nimport { useNativeScrollbar } from '../../hooks/use-native-scrollbar';\nimport { type GroupShape, type OptionShape, type OptionsListProps } from '../../typings';\nimport { isGroup, useVisibleOptions } from '../../utils';\nimport { Optgroup as DefaultOptgroup } from '../optgroup';\n\nimport styles from './index.module.css';\n\nconst createCounter = () => {\n let count = 0;\n\n // eslint-disable-next-line no-plusplus\n return () => count++;\n};\n\nexport const OptionsList = forwardRef<HTMLDivElement, OptionsListProps>(\n (\n {\n size = 48,\n className,\n optionGroupClassName,\n footerClassName,\n scrollbarClassName,\n Option,\n getOptionProps,\n groupOptionProps = {},\n options = [],\n Optgroup = DefaultOptgroup,\n dataTestId,\n emptyPlaceholder,\n visibleOptions = DEFAULT_VISIBLE_OPTIONS,\n onScroll,\n open,\n header,\n footer,\n showFooter = true,\n optionsListWidth,\n nativeScrollbar: nativeScrollbarProp,\n flatOptions = [],\n setHighlightedIndex,\n selectedItems,\n search,\n setSelectedItems,\n multiple,\n limitDynamicOptionGroupSize = false,\n client,\n },\n ref,\n ) => {\n const [scrollTop, setScrollTop] = useState(true);\n const [scrollBottom, setScrollBottom] = useState(false);\n\n const nativeScrollbar = useNativeScrollbar({\n nativeScrollbar: nativeScrollbarProp,\n client,\n });\n\n const handleScroll = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n const scrolledToHeader = event.currentTarget.scrollTop <= 0;\n const scrolledToFooter =\n event.currentTarget.scrollHeight - event.currentTarget.offsetHeight <=\n event.currentTarget.scrollTop;\n\n setScrollTop(scrolledToHeader);\n setScrollBottom(scrolledToFooter);\n\n onScroll?.(event);\n },\n [onScroll],\n );\n\n const renderOption = (option: OptionShape, index: number) => (\n <Option key={option.key} {...getOptionProps(option, index)} />\n );\n\n const listRef = useRef<HTMLDivElement>(null);\n const scrollbarRef = useRef<HTMLDivElement>(null);\n const counter = createCounter();\n const renderGroup = (group: GroupShape) => {\n const groupSelectedItems = selectedItems?.filter(({ key: selectedItemKey }) =>\n group.options.some((option) => option.key === selectedItemKey),\n );\n const handleSelectedItems = (items: OptionShape[]) => {\n setSelectedItems(\n (\n selectedItems?.filter(\n ({ key: selectedItemKey }) =>\n !group.options.some((option) => option.key === selectedItemKey),\n ) ?? []\n ).concat(items),\n );\n };\n\n return (\n <Optgroup\n className={optionGroupClassName}\n label={group.label}\n key={group.label}\n size={size}\n options={group.options}\n selectedItems={groupSelectedItems}\n setSelectedItems={handleSelectedItems}\n search={search}\n multiple={multiple}\n {...groupOptionProps}\n >\n {group.options.map((option) => renderOption(option, counter()))}\n </Optgroup>\n );\n };\n\n const actualOptionsCount = limitDynamicOptionGroupSize && options.length > 0;\n\n const [measured, height] = useVisibleOptions({\n visibleOptions,\n listRef,\n open,\n options,\n actualOptionsCount,\n size: actualOptionsCount\n ? (() => {\n switch (typeof size) {\n case 'string':\n throw new Error(\n 'OptionsList with `limitDynamicOptionGroupSize` enabled needs a `size` with number type',\n );\n default:\n return size;\n }\n })()\n : undefined,\n });\n\n if (options.length === 0 && !emptyPlaceholder && !header && !footer) {\n return null;\n }\n\n const renderListItems = () => (\n <React.Fragment>\n {options.map((option) =>\n isGroup(option) ? renderGroup(option) : renderOption(option, counter()),\n )}\n\n {emptyPlaceholder && options.length === 0 && (\n <div className={styles.emptyPlaceholder}>{emptyPlaceholder}</div>\n )}\n </React.Fragment>\n );\n\n const renderWithCustomScrollbar = () => {\n const scrollableNodeProps = {\n onScroll: handleScroll,\n 'data-test-id': dataTestId,\n ref: ref as React.RefObject<HTMLDivElement>,\n };\n\n return (\n <Scrollbar\n className={cn(styles.scrollable, scrollbarClassName)}\n ref={scrollbarRef}\n style={{ height }}\n horizontalAutoStretch={optionsListWidth === 'content'}\n scrollableNodeProps={scrollableNodeProps}\n contentNodeProps={{ ref: listRef }}\n maskProps={{\n /*\n * Для корректного подсчета высоты опций(иначе для optionsListWidth: 'field'\n * высота опции всегда будет равна высоте одной строчки)\n */\n className: cn({\n [styles.mask]: optionsListWidth === 'content' && !measured,\n }),\n }}\n >\n {renderListItems()}\n </Scrollbar>\n );\n };\n\n const renderWithNativeScrollbar = () => (\n <div\n className={cn(styles.scrollable, scrollbarClassName)}\n ref={mergeRefs([listRef, ref])}\n onScroll={handleScroll}\n style={{ height }}\n >\n {renderListItems()}\n </div>\n );\n\n const resetHighlightedIndex = () => setHighlightedIndex?.(-1);\n\n return (\n <div\n {...(nativeScrollbar && { 'data-test-id': dataTestId })}\n className={cn(styles.optionsList, styles[SIZE_TO_CLASSNAME_MAP[size]], className)}\n >\n {header && (\n <div\n className={cn(styles.optionsListHeader, {\n [styles.headerHighlighted]: !scrollTop,\n })}\n onMouseEnter={resetHighlightedIndex}\n >\n {header}\n </div>\n )}\n\n {nativeScrollbar ? renderWithNativeScrollbar() : renderWithCustomScrollbar()}\n\n {showFooter && footer && (\n <div\n onMouseEnter={resetHighlightedIndex}\n className={cn(styles.optionsListFooter, footerClassName, {\n [styles.withBorder]:\n visibleOptions &&\n flatOptions.length > visibleOptions &&\n !scrollBottom,\n })}\n >\n {footer}\n </div>\n )}\n </div>\n );\n },\n);\n"],"names":["Optgroup","DefaultOptgroup"],"mappings":"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"}
1
+ {"version":3,"file":"Component.js","sources":["../../../src/components/options-list/Component.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useRef, useState } from 'react';\nimport mergeRefs from 'react-merge-refs';\nimport cn from 'classnames';\n\nimport { Scrollbar } from '@alfalab/core-components-scrollbar';\n\nimport { DEFAULT_VISIBLE_OPTIONS, SIZE_TO_CLASSNAME_MAP } from '../../consts';\nimport { useNativeScrollbar } from '../../hooks/use-native-scrollbar';\nimport { type GroupShape, type OptionShape, type OptionsListProps } from '../../typings';\nimport { isGroup, useVisibleOptions } from '../../utils';\nimport { Optgroup as DefaultOptgroup } from '../optgroup';\n\nimport styles from './index.module.css';\n\nconst createCounter = () => {\n let count = 0;\n\n // eslint-disable-next-line no-plusplus\n return () => count++;\n};\n\nexport const OptionsList = forwardRef<HTMLDivElement, OptionsListProps>(\n (\n {\n size = 48,\n className,\n optionGroupClassName,\n footerClassName,\n scrollbarClassName,\n Option,\n getOptionProps,\n groupOptionProps = {},\n options = [],\n Optgroup = DefaultOptgroup,\n dataTestId,\n emptyPlaceholder,\n visibleOptions = DEFAULT_VISIBLE_OPTIONS,\n onScroll,\n open,\n header,\n footer,\n showFooter = true,\n optionsListWidth,\n nativeScrollbar: nativeScrollbarProp,\n flatOptions = [],\n setHighlightedIndex,\n selectedItems,\n search,\n setSelectedItems,\n multiple,\n limitDynamicOptionGroupSize = false,\n client,\n },\n ref,\n ) => {\n const [scrollTop, setScrollTop] = useState(true);\n const [scrollBottom, setScrollBottom] = useState(false);\n\n const nativeScrollbar = useNativeScrollbar({\n nativeScrollbar: nativeScrollbarProp,\n client,\n });\n\n const handleScroll = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n const scrolledToHeader = event.currentTarget.scrollTop <= 0;\n const scrolledToFooter =\n event.currentTarget.scrollHeight - event.currentTarget.offsetHeight <=\n event.currentTarget.scrollTop;\n\n setScrollTop(scrolledToHeader);\n setScrollBottom(scrolledToFooter);\n\n onScroll?.(event);\n },\n [onScroll],\n );\n\n const renderOption = (option: OptionShape, index: number) => (\n <Option key={option.key} {...getOptionProps(option, index)} />\n );\n\n const listRef = useRef<HTMLDivElement>(null);\n const scrollbarRef = useRef<HTMLDivElement>(null);\n const counter = createCounter();\n const renderGroup = (group: GroupShape) => {\n const groupSelectedItems = selectedItems?.filter(({ key: selectedItemKey }) =>\n group.options.some((option) => option.key === selectedItemKey),\n );\n const handleSelectedItems = (items: OptionShape[]) => {\n setSelectedItems(\n (\n selectedItems?.filter(\n ({ key: selectedItemKey }) =>\n !group.options.some((option) => option.key === selectedItemKey),\n ) ?? []\n ).concat(items),\n );\n };\n\n return (\n <Optgroup\n className={optionGroupClassName}\n label={group.label}\n key={group.label}\n size={size}\n options={group.options}\n selectedItems={groupSelectedItems}\n setSelectedItems={handleSelectedItems}\n search={search}\n multiple={multiple}\n {...groupOptionProps}\n >\n {group.options.map((option) => renderOption(option, counter()))}\n </Optgroup>\n );\n };\n\n const actualOptionsCount = limitDynamicOptionGroupSize && options.length > 0;\n\n const [measured, height] = useVisibleOptions({\n visibleOptions,\n listRef,\n open,\n options,\n actualOptionsCount,\n size: actualOptionsCount\n ? (() => {\n switch (typeof size) {\n case 'string':\n throw new Error(\n 'OptionsList with `limitDynamicOptionGroupSize` enabled needs a `size` with number type',\n );\n default:\n return size;\n }\n })()\n : undefined,\n });\n\n if (options.length === 0 && !emptyPlaceholder && !header && !footer) {\n return null;\n }\n\n const renderListItems = () => (\n <React.Fragment>\n {options.map((option) =>\n isGroup(option) ? renderGroup(option) : renderOption(option, counter()),\n )}\n\n {emptyPlaceholder && options.length === 0 && (\n <div className={styles.emptyPlaceholder}>{emptyPlaceholder}</div>\n )}\n </React.Fragment>\n );\n\n const renderWithCustomScrollbar = () => {\n const scrollableNodeProps = {\n onScroll: handleScroll,\n 'data-test-id': dataTestId,\n ref: ref as React.RefObject<HTMLDivElement>,\n };\n\n return (\n <Scrollbar\n className={cn(styles.scrollable, scrollbarClassName)}\n verticalBarClassName={cn(styles.verticalBar, {\n [styles.verticalBarWithHeader]: Boolean(header),\n [styles.verticalBarWithFooter]: Boolean(footer),\n })}\n ref={scrollbarRef}\n style={{ height }}\n horizontalAutoStretch={optionsListWidth === 'content'}\n scrollableNodeProps={scrollableNodeProps}\n contentNodeProps={{ ref: listRef }}\n maskProps={{\n /*\n * Для корректного подсчета высоты опций(иначе для optionsListWidth: 'field'\n * высота опции всегда будет равна высоте одной строчки)\n */\n className: cn({\n [styles.mask]: optionsListWidth === 'content' && !measured,\n }),\n }}\n >\n {renderListItems()}\n </Scrollbar>\n );\n };\n\n const renderWithNativeScrollbar = () => (\n <div\n className={cn(styles.scrollable, scrollbarClassName)}\n ref={mergeRefs([listRef, ref])}\n onScroll={handleScroll}\n style={{ height }}\n >\n {renderListItems()}\n </div>\n );\n\n const resetHighlightedIndex = () => setHighlightedIndex?.(-1);\n\n return (\n <div\n {...(nativeScrollbar && { 'data-test-id': dataTestId })}\n className={cn(styles.optionsList, styles[SIZE_TO_CLASSNAME_MAP[size]], className)}\n >\n {header && (\n <div\n className={cn(styles.optionsListHeader, {\n [styles.headerHighlighted]: !scrollTop,\n })}\n onMouseEnter={resetHighlightedIndex}\n >\n {header}\n </div>\n )}\n\n {nativeScrollbar ? renderWithNativeScrollbar() : renderWithCustomScrollbar()}\n\n {showFooter && footer && (\n <div\n onMouseEnter={resetHighlightedIndex}\n className={cn(styles.optionsListFooter, footerClassName, {\n [styles.withBorder]:\n visibleOptions &&\n flatOptions.length > visibleOptions &&\n !scrollBottom,\n })}\n >\n {footer}\n </div>\n )}\n </div>\n );\n },\n);\n"],"names":["Optgroup","DefaultOptgroup"],"mappings":"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"}
@@ -10,34 +10,47 @@
10
10
  --gap-16: var(--gap-m);
11
11
  --gap-24: var(--gap-xl);
12
12
  } :root {
13
+ --select-options-list-scrollbar-gap: var(--gap-12);
13
14
  --select-options-list-empty-placeholder-color: var(--color-light-text-secondary);
14
- } .select__optionsList_6zwqx {
15
+ } .select__optionsList_1709v {
15
16
  width: 100%;
16
17
  outline: none;
17
18
  box-sizing: border-box;
18
19
  position: relative;
19
- } .select__optionsListHeader_6zwqx {
20
+ } .select__optionsList_1709v .select__scrollable_1709v {
21
+ overflow: auto;
22
+ width: 100%;
23
+ } .select__optionsList_1709v .select__scrollable_1709v .select__verticalBar_1709v.select__verticalBar_1709v {
24
+ top: var(--select-options-list-scrollbar-gap);
25
+ height: calc(100% - 2 * var(--select-options-list-scrollbar-gap));
26
+ } .select__optionsList_1709v .select__scrollable_1709v .select__verticalBar_1709v.select__verticalBar_1709v.select__verticalBarWithHeader_1709v {
27
+ top: 0;
28
+ height: calc(100% - var(--select-options-list-scrollbar-gap));
29
+ } .select__optionsList_1709v .select__scrollable_1709v .select__verticalBar_1709v.select__verticalBar_1709v.select__verticalBarWithFooter_1709v {
30
+ top: var(--select-options-list-scrollbar-gap);
31
+ height: calc(100% - var(--select-options-list-scrollbar-gap));
32
+ } .select__optionsList_1709v .select__scrollable_1709v .select__verticalBar_1709v.select__verticalBar_1709v.select__verticalBarWithHeader_1709v.select__verticalBarWithFooter_1709v {
33
+ top: 0;
34
+ height: 100%;
35
+ } .select__optionsListHeader_1709v {
20
36
  box-sizing: border-box;
21
37
  border-bottom: 1px solid transparent;
22
38
  transition: border-color 0.2s ease;
23
- } .select__optionsListHeader_6zwqx.select__headerHighlighted_6zwqx {
39
+ } .select__optionsListHeader_1709v.select__headerHighlighted_1709v {
24
40
  border-bottom-color: var(--color-light-neutral-300);
25
- } .select__optionsListFooter_6zwqx {
41
+ } .select__optionsListFooter_1709v {
26
42
  position: sticky;
27
43
  bottom: var(--gap-0);
28
44
  box-sizing: border-box;
29
45
  border-top: 1px solid transparent;
30
46
  transition: border-color 0.2s ease;
31
- } .select__optionsListFooter_6zwqx.select__withBorder_6zwqx {
47
+ } .select__optionsListFooter_1709v.select__withBorder_1709v {
32
48
  border-top-color: var(--color-light-neutral-300);
33
- } .select__scrollable_6zwqx {
34
- overflow: auto;
35
- width: 100%;
36
- } .select__mask_6zwqx {
49
+ } .select__mask_1709v {
37
50
  min-width: 4000px;
38
- } .select__emptyPlaceholder_6zwqx {
51
+ } .select__emptyPlaceholder_1709v {
39
52
  padding: var(--gap-16) var(--gap-12);
40
53
  color: var(--select-options-list-empty-placeholder-color);
41
- } .select__size-72_6zwqx .select__emptyPlaceholder_6zwqx {
54
+ } .select__size-72_1709v .select__emptyPlaceholder_1709v {
42
55
  padding: var(--gap-24) var(--gap-16);
43
56
  }
@@ -1,6 +1,6 @@
1
1
  import './index.css';
2
2
 
3
- const styles = {"optionsList":"select__optionsList_6zwqx","optionsListHeader":"select__optionsListHeader_6zwqx","headerHighlighted":"select__headerHighlighted_6zwqx","optionsListFooter":"select__optionsListFooter_6zwqx","withBorder":"select__withBorder_6zwqx","scrollable":"select__scrollable_6zwqx","mask":"select__mask_6zwqx","emptyPlaceholder":"select__emptyPlaceholder_6zwqx","size-72":"select__size-72_6zwqx"};
3
+ const styles = {"optionsList":"select__optionsList_1709v","scrollable":"select__scrollable_1709v","verticalBar":"select__verticalBar_1709v","verticalBarWithHeader":"select__verticalBarWithHeader_1709v","verticalBarWithFooter":"select__verticalBarWithFooter_1709v","optionsListHeader":"select__optionsListHeader_1709v","headerHighlighted":"select__headerHighlighted_1709v","optionsListFooter":"select__optionsListFooter_1709v","withBorder":"select__withBorder_1709v","mask":"select__mask_1709v","emptyPlaceholder":"select__emptyPlaceholder_1709v","size-72":"select__size-72_1709v"};
4
4
 
5
5
  export { styles as default };
6
6
  //# sourceMappingURL=index.module.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.css.js","sources":["../../src/components/options-list/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/no-typography-index.css';\n@import '../../vars.css';\n\n.optionsList {\n width: 100%;\n outline: none;\n box-sizing: border-box;\n position: relative;\n}\n\n.optionsListHeader {\n box-sizing: border-box;\n border-bottom: 1px solid transparent;\n transition: border-color 0.2s ease;\n\n &.headerHighlighted {\n border-bottom-color: var(--color-light-neutral-300);\n }\n}\n\n.optionsListFooter {\n position: sticky;\n bottom: var(--gap-0);\n box-sizing: border-box;\n border-top: 1px solid transparent;\n transition: border-color 0.2s ease;\n\n &.withBorder {\n border-top-color: var(--color-light-neutral-300);\n }\n}\n\n.scrollable {\n overflow: auto;\n width: 100%;\n}\n\n.mask {\n min-width: 4000px;\n}\n\n.emptyPlaceholder {\n padding: var(--gap-16) var(--gap-12);\n color: var(--select-options-list-empty-placeholder-color);\n}\n\n.size-72 .emptyPlaceholder {\n padding: var(--gap-24) var(--gap-16);\n}\n"],"names":[],"mappings":";;AAEgB,eAAe,CAAC,aAAa,CAAC,2BAA2B,CAAC,mBAAmB,CAAC,iCAAiC,CAAC,mBAAmB,CAAC,iCAAiC,CAAC,mBAAmB,CAAC,iCAAiC,CAAC,YAAY,CAAC,0BAA0B,CAAC,YAAY,CAAC,0BAA0B,CAAC,MAAM,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,gCAAgC,CAAC,SAAS,CAAC,uBAAuB,CAAC;;;;"}
1
+ {"version":3,"file":"index.module.css.js","sources":["../../src/components/options-list/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/no-typography-index.css';\n@import '../../vars.css';\n\n.optionsList {\n width: 100%;\n outline: none;\n box-sizing: border-box;\n position: relative;\n\n & .scrollable {\n overflow: auto;\n width: 100%;\n\n & .verticalBar.verticalBar {\n top: var(--select-options-list-scrollbar-gap);\n height: calc(100% - 2 * var(--select-options-list-scrollbar-gap));\n\n &.verticalBarWithHeader {\n top: 0;\n height: calc(100% - var(--select-options-list-scrollbar-gap));\n }\n\n &.verticalBarWithFooter {\n top: var(--select-options-list-scrollbar-gap);\n height: calc(100% - var(--select-options-list-scrollbar-gap));\n }\n\n &.verticalBarWithHeader.verticalBarWithFooter {\n top: 0;\n height: 100%;\n }\n }\n }\n}\n\n.optionsListHeader {\n box-sizing: border-box;\n border-bottom: 1px solid transparent;\n transition: border-color 0.2s ease;\n\n &.headerHighlighted {\n border-bottom-color: var(--color-light-neutral-300);\n }\n}\n\n.optionsListFooter {\n position: sticky;\n bottom: var(--gap-0);\n box-sizing: border-box;\n border-top: 1px solid transparent;\n transition: border-color 0.2s ease;\n\n &.withBorder {\n border-top-color: var(--color-light-neutral-300);\n }\n}\n\n.mask {\n min-width: 4000px;\n}\n\n.emptyPlaceholder {\n padding: var(--gap-16) var(--gap-12);\n color: var(--select-options-list-empty-placeholder-color);\n}\n\n.size-72 .emptyPlaceholder {\n padding: var(--gap-24) var(--gap-16);\n}\n"],"names":[],"mappings":";;AAEgB,eAAe,CAAC,aAAa,CAAC,2BAA2B,CAAC,YAAY,CAAC,0BAA0B,CAAC,aAAa,CAAC,2BAA2B,CAAC,uBAAuB,CAAC,qCAAqC,CAAC,uBAAuB,CAAC,qCAAqC,CAAC,mBAAmB,CAAC,iCAAiC,CAAC,mBAAmB,CAAC,iCAAiC,CAAC,mBAAmB,CAAC,iCAAiC,CAAC,YAAY,CAAC,0BAA0B,CAAC,MAAM,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,gCAAgC,CAAC,SAAS,CAAC,uBAAuB,CAAC;;;;"}
@@ -1,3 +1,3 @@
1
- .select__component_16ak6.select__component_16ak6 {
1
+ .select__component_7aknm.select__component_7aknm {
2
2
  width: auto;
3
3
  }
@@ -1,6 +1,6 @@
1
1
  import './index.css';
2
2
 
3
- const styles = {"component":"select__component_16ak6"};
3
+ const styles = {"component":"select__component_7aknm"};
4
4
 
5
5
  export { styles as default };
6
6
  //# sourceMappingURL=index.module.css.js.map
@@ -17,35 +17,35 @@
17
17
 
18
18
  --select-option-left-padding: var(--gap-12);
19
19
  --select-option-right-padding: var(--gap-12);
20
- } .select__virtualOptionsList_yyfv8 {
20
+ } .select__virtualOptionsList_16cps {
21
21
  width: 100%;
22
22
  outline: none;
23
23
  box-sizing: border-box;
24
24
  position: sticky;
25
25
  justify-content: space-between;
26
- } .select__virtualOptionsListHeader_yyfv8 {
26
+ } .select__virtualOptionsListHeader_16cps {
27
27
  box-sizing: border-box;
28
28
  border-bottom: 1px solid var(--color-light-neutral-300);
29
- } .select__virtualOptionsListFooter_yyfv8 {
29
+ } .select__virtualOptionsListFooter_16cps {
30
30
  position: sticky;
31
31
  bottom: var(--gap-0);
32
32
  box-sizing: border-box;
33
33
  border-top: 1px solid transparent;
34
- } .select__virtualOptionsListFooter_yyfv8.select__withBorder_yyfv8 {
34
+ } .select__virtualOptionsListFooter_16cps.select__withBorder_16cps {
35
35
  border-top: 1px solid var(--color-light-neutral-300);
36
- } .select__scrollable_yyfv8 {
36
+ } .select__scrollable_16cps {
37
37
  position: relative;
38
38
  overflow: auto;
39
39
  width: 100%;
40
- } .select__inner_yyfv8 {
40
+ } .select__inner_16cps {
41
41
  position: relative;
42
42
  width: 100%;
43
- } .select__virtualRow_yyfv8 {
43
+ } .select__virtualRow_16cps {
44
44
  position: absolute;
45
45
  top: var(--gap-0);
46
46
  left: var(--gap-0);
47
47
  width: 100%;
48
- } .select__virtualRow_yyfv8:before {
48
+ } .select__virtualRow_16cps:before {
49
49
  content: '';
50
50
  position: absolute;
51
51
  z-index: 1;
@@ -55,15 +55,15 @@
55
55
  height: 1px;
56
56
  background: var(--select-option-divider-background);
57
57
  display: var(--select-option-divider-display);
58
- } .select__virtualRow_yyfv8:first-child:before {
58
+ } .select__virtualRow_16cps:first-child:before {
59
59
  display: none;
60
- } .select__highlighted_yyfv8:before,
61
- .select__highlighted_yyfv8 + .select__virtualRow_yyfv8:before {
60
+ } .select__highlighted_16cps:before,
61
+ .select__highlighted_16cps + .select__virtualRow_16cps:before {
62
62
  display: none;
63
- } .select__emptyPlaceholder_yyfv8 {
63
+ } .select__emptyPlaceholder_16cps {
64
64
  padding: var(--gap-16) var(--gap-12);
65
65
  color: var(--select-options-list-empty-placeholder-color);
66
66
  flex: 1;
67
- } .select__size-72_yyfv8 .select__emptyPlaceholder_yyfv8 {
67
+ } .select__size-72_16cps .select__emptyPlaceholder_16cps {
68
68
  padding: var(--gap-24) var(--gap-16);
69
69
  }
@@ -1,6 +1,6 @@
1
1
  import './index.css';
2
2
 
3
- const styles = {"virtualOptionsList":"select__virtualOptionsList_yyfv8","virtualOptionsListHeader":"select__virtualOptionsListHeader_yyfv8","virtualOptionsListFooter":"select__virtualOptionsListFooter_yyfv8","withBorder":"select__withBorder_yyfv8","scrollable":"select__scrollable_yyfv8","inner":"select__inner_yyfv8","virtualRow":"select__virtualRow_yyfv8","highlighted":"select__highlighted_yyfv8","emptyPlaceholder":"select__emptyPlaceholder_yyfv8","size-72":"select__size-72_yyfv8"};
3
+ const styles = {"virtualOptionsList":"select__virtualOptionsList_16cps","virtualOptionsListHeader":"select__virtualOptionsListHeader_16cps","virtualOptionsListFooter":"select__virtualOptionsListFooter_16cps","withBorder":"select__withBorder_16cps","scrollable":"select__scrollable_16cps","inner":"select__inner_16cps","virtualRow":"select__virtualRow_16cps","highlighted":"select__highlighted_16cps","emptyPlaceholder":"select__emptyPlaceholder_16cps","size-72":"select__size-72_16cps"};
4
4
 
5
5
  export { styles as default };
6
6
  //# sourceMappingURL=index.module.css.js.map
@@ -9,12 +9,12 @@
9
9
  --gap-16: var(--gap-m);
10
10
  } :root {
11
11
  --select-option-list-footer-button-gap: var(--gap-8);
12
- } .select__footer_knau3 {
12
+ } .select__footer_17zxh {
13
13
  background-color: var(--color-light-base-bg-primary);
14
14
  padding: var(--gap-12);
15
15
  outline: none;
16
- } .select__footer_knau3.select__size-72_knau3 {
16
+ } .select__footer_17zxh.select__size-72_17zxh {
17
17
  padding: var(--gap-12) var(--gap-16);
18
- } .select__footer_knau3 > .select__button_knau3 + .select__button_knau3 {
18
+ } .select__footer_17zxh > .select__button_17zxh + .select__button_17zxh {
19
19
  margin-left: var(--select-option-list-footer-button-gap);
20
20
  }
@@ -1,6 +1,6 @@
1
1
  import './index.css';
2
2
 
3
- const styles = {"footer":"select__footer_knau3","size-72":"select__size-72_knau3","button":"select__button_knau3"};
3
+ const styles = {"footer":"select__footer_17zxh","size-72":"select__size-72_17zxh","button":"select__button_17zxh"};
4
4
 
5
5
  export { styles as default };
6
6
  //# sourceMappingURL=index.module.css.js.map
@@ -5,10 +5,10 @@
5
5
  --gap-8: var(--gap-xs);
6
6
  --gap-12: var(--gap-s);
7
7
  --gap-16: var(--gap-m);
8
- } .select__desktop_156uq {
8
+ } .select__desktop_55q7s {
9
9
  padding: var(--gap-12);
10
- } .select__desktop_156uq.select__size-72_156uq {
10
+ } .select__desktop_55q7s.select__size-72_55q7s {
11
11
  padding-left: var(--gap-16);
12
- } .select__mobile_156uq {
12
+ } .select__mobile_55q7s {
13
13
  padding: var(--gap-12) var(--gap-8);
14
14
  }
@@ -1,6 +1,6 @@
1
1
  import './index.css';
2
2
 
3
- const styles = {"desktop":"select__desktop_156uq","size-72":"select__size-72_156uq","mobile":"select__mobile_156uq"};
3
+ const styles = {"desktop":"select__desktop_55q7s","size-72":"select__size-72_55q7s","mobile":"select__mobile_55q7s"};
4
4
 
5
5
  export { styles as default };
6
6
  //# sourceMappingURL=index.module.css.js.map
@@ -1,4 +1,4 @@
1
- .select__skeleton_17vfu {
1
+ .select__skeleton_kjkl3 {
2
2
  position: absolute;
3
3
  top: 50%;
4
4
  transform: translateY(-50%);
@@ -1,6 +1,6 @@
1
1
  import './index.css';
2
2
 
3
- const styles = {"skeleton":"select__skeleton_17vfu"};
3
+ const styles = {"skeleton":"select__skeleton_kjkl3"};
4
4
 
5
5
  export { styles as default };
6
6
  //# sourceMappingURL=index.module.css.js.map
@@ -1,6 +1,6 @@
1
1
  :root {
2
2
 
3
- --select-options-list-border-radius: var(--border-radius-8);
3
+ --select-options-list-border-radius: var(--border-radius-16);
4
4
  --select-options-list-box-shadow: var(--shadow-m);
5
5
  --select-options-list-offset: var(--gap-4);
6
6
  --select-options-list-top-padding: var(--gap-0);
@@ -69,7 +69,10 @@ const OptionsList = forwardRef(({ size = 48, className, optionGroupClassName, fo
69
69
  'data-test-id': dataTestId,
70
70
  ref: ref,
71
71
  };
72
- return (React.createElement(Scrollbar, { className: cn(styles.scrollable, scrollbarClassName), ref: scrollbarRef, style: { height }, horizontalAutoStretch: optionsListWidth === 'content', scrollableNodeProps: scrollableNodeProps, contentNodeProps: { ref: listRef }, maskProps: {
72
+ return (React.createElement(Scrollbar, { className: cn(styles.scrollable, scrollbarClassName), verticalBarClassName: cn(styles.verticalBar, {
73
+ [styles.verticalBarWithHeader]: Boolean(header),
74
+ [styles.verticalBarWithFooter]: Boolean(footer),
75
+ }), ref: scrollbarRef, style: { height }, horizontalAutoStretch: optionsListWidth === 'content', scrollableNodeProps: scrollableNodeProps, contentNodeProps: { ref: listRef }, maskProps: {
73
76
  /*
74
77
  * Для корректного подсчета высоты опций(иначе для optionsListWidth: 'field'
75
78
  * высота опции всегда будет равна высоте одной строчки)
@@ -1 +1 @@
1
- {"version":3,"file":"Component.js","sources":["../../../src/components/options-list/Component.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useRef, useState } from 'react';\nimport mergeRefs from 'react-merge-refs';\nimport cn from 'classnames';\n\nimport { Scrollbar } from '@alfalab/core-components-scrollbar';\n\nimport { DEFAULT_VISIBLE_OPTIONS, SIZE_TO_CLASSNAME_MAP } from '../../consts';\nimport { useNativeScrollbar } from '../../hooks/use-native-scrollbar';\nimport { type GroupShape, type OptionShape, type OptionsListProps } from '../../typings';\nimport { isGroup, useVisibleOptions } from '../../utils';\nimport { Optgroup as DefaultOptgroup } from '../optgroup';\n\nimport styles from './index.module.css';\n\nconst createCounter = () => {\n let count = 0;\n\n // eslint-disable-next-line no-plusplus\n return () => count++;\n};\n\nexport const OptionsList = forwardRef<HTMLDivElement, OptionsListProps>(\n (\n {\n size = 48,\n className,\n optionGroupClassName,\n footerClassName,\n scrollbarClassName,\n Option,\n getOptionProps,\n groupOptionProps = {},\n options = [],\n Optgroup = DefaultOptgroup,\n dataTestId,\n emptyPlaceholder,\n visibleOptions = DEFAULT_VISIBLE_OPTIONS,\n onScroll,\n open,\n header,\n footer,\n showFooter = true,\n optionsListWidth,\n nativeScrollbar: nativeScrollbarProp,\n flatOptions = [],\n setHighlightedIndex,\n selectedItems,\n search,\n setSelectedItems,\n multiple,\n limitDynamicOptionGroupSize = false,\n client,\n },\n ref,\n ) => {\n const [scrollTop, setScrollTop] = useState(true);\n const [scrollBottom, setScrollBottom] = useState(false);\n\n const nativeScrollbar = useNativeScrollbar({\n nativeScrollbar: nativeScrollbarProp,\n client,\n });\n\n const handleScroll = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n const scrolledToHeader = event.currentTarget.scrollTop <= 0;\n const scrolledToFooter =\n event.currentTarget.scrollHeight - event.currentTarget.offsetHeight <=\n event.currentTarget.scrollTop;\n\n setScrollTop(scrolledToHeader);\n setScrollBottom(scrolledToFooter);\n\n onScroll?.(event);\n },\n [onScroll],\n );\n\n const renderOption = (option: OptionShape, index: number) => (\n <Option key={option.key} {...getOptionProps(option, index)} />\n );\n\n const listRef = useRef<HTMLDivElement>(null);\n const scrollbarRef = useRef<HTMLDivElement>(null);\n const counter = createCounter();\n const renderGroup = (group: GroupShape) => {\n const groupSelectedItems = selectedItems?.filter(({ key: selectedItemKey }) =>\n group.options.some((option) => option.key === selectedItemKey),\n );\n const handleSelectedItems = (items: OptionShape[]) => {\n setSelectedItems(\n (\n selectedItems?.filter(\n ({ key: selectedItemKey }) =>\n !group.options.some((option) => option.key === selectedItemKey),\n ) ?? []\n ).concat(items),\n );\n };\n\n return (\n <Optgroup\n className={optionGroupClassName}\n label={group.label}\n key={group.label}\n size={size}\n options={group.options}\n selectedItems={groupSelectedItems}\n setSelectedItems={handleSelectedItems}\n search={search}\n multiple={multiple}\n {...groupOptionProps}\n >\n {group.options.map((option) => renderOption(option, counter()))}\n </Optgroup>\n );\n };\n\n const actualOptionsCount = limitDynamicOptionGroupSize && options.length > 0;\n\n const [measured, height] = useVisibleOptions({\n visibleOptions,\n listRef,\n open,\n options,\n actualOptionsCount,\n size: actualOptionsCount\n ? (() => {\n switch (typeof size) {\n case 'string':\n throw new Error(\n 'OptionsList with `limitDynamicOptionGroupSize` enabled needs a `size` with number type',\n );\n default:\n return size;\n }\n })()\n : undefined,\n });\n\n if (options.length === 0 && !emptyPlaceholder && !header && !footer) {\n return null;\n }\n\n const renderListItems = () => (\n <React.Fragment>\n {options.map((option) =>\n isGroup(option) ? renderGroup(option) : renderOption(option, counter()),\n )}\n\n {emptyPlaceholder && options.length === 0 && (\n <div className={styles.emptyPlaceholder}>{emptyPlaceholder}</div>\n )}\n </React.Fragment>\n );\n\n const renderWithCustomScrollbar = () => {\n const scrollableNodeProps = {\n onScroll: handleScroll,\n 'data-test-id': dataTestId,\n ref: ref as React.RefObject<HTMLDivElement>,\n };\n\n return (\n <Scrollbar\n className={cn(styles.scrollable, scrollbarClassName)}\n ref={scrollbarRef}\n style={{ height }}\n horizontalAutoStretch={optionsListWidth === 'content'}\n scrollableNodeProps={scrollableNodeProps}\n contentNodeProps={{ ref: listRef }}\n maskProps={{\n /*\n * Для корректного подсчета высоты опций(иначе для optionsListWidth: 'field'\n * высота опции всегда будет равна высоте одной строчки)\n */\n className: cn({\n [styles.mask]: optionsListWidth === 'content' && !measured,\n }),\n }}\n >\n {renderListItems()}\n </Scrollbar>\n );\n };\n\n const renderWithNativeScrollbar = () => (\n <div\n className={cn(styles.scrollable, scrollbarClassName)}\n ref={mergeRefs([listRef, ref])}\n onScroll={handleScroll}\n style={{ height }}\n >\n {renderListItems()}\n </div>\n );\n\n const resetHighlightedIndex = () => setHighlightedIndex?.(-1);\n\n return (\n <div\n {...(nativeScrollbar && { 'data-test-id': dataTestId })}\n className={cn(styles.optionsList, styles[SIZE_TO_CLASSNAME_MAP[size]], className)}\n >\n {header && (\n <div\n className={cn(styles.optionsListHeader, {\n [styles.headerHighlighted]: !scrollTop,\n })}\n onMouseEnter={resetHighlightedIndex}\n >\n {header}\n </div>\n )}\n\n {nativeScrollbar ? renderWithNativeScrollbar() : renderWithCustomScrollbar()}\n\n {showFooter && footer && (\n <div\n onMouseEnter={resetHighlightedIndex}\n className={cn(styles.optionsListFooter, footerClassName, {\n [styles.withBorder]:\n visibleOptions &&\n flatOptions.length > visibleOptions &&\n !scrollBottom,\n })}\n >\n {footer}\n </div>\n )}\n </div>\n );\n },\n);\n"],"names":["Optgroup","DefaultOptgroup"],"mappings":"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"}
1
+ {"version":3,"file":"Component.js","sources":["../../../src/components/options-list/Component.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useRef, useState } from 'react';\nimport mergeRefs from 'react-merge-refs';\nimport cn from 'classnames';\n\nimport { Scrollbar } from '@alfalab/core-components-scrollbar';\n\nimport { DEFAULT_VISIBLE_OPTIONS, SIZE_TO_CLASSNAME_MAP } from '../../consts';\nimport { useNativeScrollbar } from '../../hooks/use-native-scrollbar';\nimport { type GroupShape, type OptionShape, type OptionsListProps } from '../../typings';\nimport { isGroup, useVisibleOptions } from '../../utils';\nimport { Optgroup as DefaultOptgroup } from '../optgroup';\n\nimport styles from './index.module.css';\n\nconst createCounter = () => {\n let count = 0;\n\n // eslint-disable-next-line no-plusplus\n return () => count++;\n};\n\nexport const OptionsList = forwardRef<HTMLDivElement, OptionsListProps>(\n (\n {\n size = 48,\n className,\n optionGroupClassName,\n footerClassName,\n scrollbarClassName,\n Option,\n getOptionProps,\n groupOptionProps = {},\n options = [],\n Optgroup = DefaultOptgroup,\n dataTestId,\n emptyPlaceholder,\n visibleOptions = DEFAULT_VISIBLE_OPTIONS,\n onScroll,\n open,\n header,\n footer,\n showFooter = true,\n optionsListWidth,\n nativeScrollbar: nativeScrollbarProp,\n flatOptions = [],\n setHighlightedIndex,\n selectedItems,\n search,\n setSelectedItems,\n multiple,\n limitDynamicOptionGroupSize = false,\n client,\n },\n ref,\n ) => {\n const [scrollTop, setScrollTop] = useState(true);\n const [scrollBottom, setScrollBottom] = useState(false);\n\n const nativeScrollbar = useNativeScrollbar({\n nativeScrollbar: nativeScrollbarProp,\n client,\n });\n\n const handleScroll = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n const scrolledToHeader = event.currentTarget.scrollTop <= 0;\n const scrolledToFooter =\n event.currentTarget.scrollHeight - event.currentTarget.offsetHeight <=\n event.currentTarget.scrollTop;\n\n setScrollTop(scrolledToHeader);\n setScrollBottom(scrolledToFooter);\n\n onScroll?.(event);\n },\n [onScroll],\n );\n\n const renderOption = (option: OptionShape, index: number) => (\n <Option key={option.key} {...getOptionProps(option, index)} />\n );\n\n const listRef = useRef<HTMLDivElement>(null);\n const scrollbarRef = useRef<HTMLDivElement>(null);\n const counter = createCounter();\n const renderGroup = (group: GroupShape) => {\n const groupSelectedItems = selectedItems?.filter(({ key: selectedItemKey }) =>\n group.options.some((option) => option.key === selectedItemKey),\n );\n const handleSelectedItems = (items: OptionShape[]) => {\n setSelectedItems(\n (\n selectedItems?.filter(\n ({ key: selectedItemKey }) =>\n !group.options.some((option) => option.key === selectedItemKey),\n ) ?? []\n ).concat(items),\n );\n };\n\n return (\n <Optgroup\n className={optionGroupClassName}\n label={group.label}\n key={group.label}\n size={size}\n options={group.options}\n selectedItems={groupSelectedItems}\n setSelectedItems={handleSelectedItems}\n search={search}\n multiple={multiple}\n {...groupOptionProps}\n >\n {group.options.map((option) => renderOption(option, counter()))}\n </Optgroup>\n );\n };\n\n const actualOptionsCount = limitDynamicOptionGroupSize && options.length > 0;\n\n const [measured, height] = useVisibleOptions({\n visibleOptions,\n listRef,\n open,\n options,\n actualOptionsCount,\n size: actualOptionsCount\n ? (() => {\n switch (typeof size) {\n case 'string':\n throw new Error(\n 'OptionsList with `limitDynamicOptionGroupSize` enabled needs a `size` with number type',\n );\n default:\n return size;\n }\n })()\n : undefined,\n });\n\n if (options.length === 0 && !emptyPlaceholder && !header && !footer) {\n return null;\n }\n\n const renderListItems = () => (\n <React.Fragment>\n {options.map((option) =>\n isGroup(option) ? renderGroup(option) : renderOption(option, counter()),\n )}\n\n {emptyPlaceholder && options.length === 0 && (\n <div className={styles.emptyPlaceholder}>{emptyPlaceholder}</div>\n )}\n </React.Fragment>\n );\n\n const renderWithCustomScrollbar = () => {\n const scrollableNodeProps = {\n onScroll: handleScroll,\n 'data-test-id': dataTestId,\n ref: ref as React.RefObject<HTMLDivElement>,\n };\n\n return (\n <Scrollbar\n className={cn(styles.scrollable, scrollbarClassName)}\n verticalBarClassName={cn(styles.verticalBar, {\n [styles.verticalBarWithHeader]: Boolean(header),\n [styles.verticalBarWithFooter]: Boolean(footer),\n })}\n ref={scrollbarRef}\n style={{ height }}\n horizontalAutoStretch={optionsListWidth === 'content'}\n scrollableNodeProps={scrollableNodeProps}\n contentNodeProps={{ ref: listRef }}\n maskProps={{\n /*\n * Для корректного подсчета высоты опций(иначе для optionsListWidth: 'field'\n * высота опции всегда будет равна высоте одной строчки)\n */\n className: cn({\n [styles.mask]: optionsListWidth === 'content' && !measured,\n }),\n }}\n >\n {renderListItems()}\n </Scrollbar>\n );\n };\n\n const renderWithNativeScrollbar = () => (\n <div\n className={cn(styles.scrollable, scrollbarClassName)}\n ref={mergeRefs([listRef, ref])}\n onScroll={handleScroll}\n style={{ height }}\n >\n {renderListItems()}\n </div>\n );\n\n const resetHighlightedIndex = () => setHighlightedIndex?.(-1);\n\n return (\n <div\n {...(nativeScrollbar && { 'data-test-id': dataTestId })}\n className={cn(styles.optionsList, styles[SIZE_TO_CLASSNAME_MAP[size]], className)}\n >\n {header && (\n <div\n className={cn(styles.optionsListHeader, {\n [styles.headerHighlighted]: !scrollTop,\n })}\n onMouseEnter={resetHighlightedIndex}\n >\n {header}\n </div>\n )}\n\n {nativeScrollbar ? renderWithNativeScrollbar() : renderWithCustomScrollbar()}\n\n {showFooter && footer && (\n <div\n onMouseEnter={resetHighlightedIndex}\n className={cn(styles.optionsListFooter, footerClassName, {\n [styles.withBorder]:\n visibleOptions &&\n flatOptions.length > visibleOptions &&\n !scrollBottom,\n })}\n >\n {footer}\n </div>\n )}\n </div>\n );\n },\n);\n"],"names":["Optgroup","DefaultOptgroup"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  :root {
2
+ --select-options-list-scrollbar-gap: var(--gap-12);
2
3
  --select-options-list-empty-placeholder-color: var(--color-light-text-secondary);
3
4
  }
4
5
 
@@ -9,6 +10,31 @@
9
10
  position: relative;
10
11
  }
11
12
 
13
+ .optionsList .scrollable {
14
+ overflow: auto;
15
+ width: 100%;
16
+ }
17
+
18
+ .optionsList .scrollable .verticalBar.verticalBar {
19
+ top: var(--select-options-list-scrollbar-gap);
20
+ height: calc(100% - 2 * var(--select-options-list-scrollbar-gap));
21
+ }
22
+
23
+ .optionsList .scrollable .verticalBar.verticalBar.verticalBarWithHeader {
24
+ top: 0;
25
+ height: calc(100% - var(--select-options-list-scrollbar-gap));
26
+ }
27
+
28
+ .optionsList .scrollable .verticalBar.verticalBar.verticalBarWithFooter {
29
+ top: var(--select-options-list-scrollbar-gap);
30
+ height: calc(100% - var(--select-options-list-scrollbar-gap));
31
+ }
32
+
33
+ .optionsList .scrollable .verticalBar.verticalBar.verticalBarWithHeader.verticalBarWithFooter {
34
+ top: 0;
35
+ height: 100%;
36
+ }
37
+
12
38
  .optionsListHeader {
13
39
  box-sizing: border-box;
14
40
  border-bottom: 1px solid transparent;
@@ -31,11 +57,6 @@
31
57
  border-top-color: var(--color-light-neutral-300);
32
58
  }
33
59
 
34
- .scrollable {
35
- overflow: auto;
36
- width: 100%;
37
- }
38
-
39
60
  .mask {
40
61
  min-width: 4000px;
41
62
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfalab/core-components-select",
3
- "version": "18.2.7",
3
+ "version": "18.2.9",
4
4
  "description": "Select component",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -12,12 +12,12 @@
12
12
  "dependencies": {
13
13
  "@alfalab/core-components-badge": "^6.0.0",
14
14
  "@alfalab/core-components-base-modal": "^6.1.0",
15
- "@alfalab/core-components-bottom-sheet": "^7.4.1",
16
- "@alfalab/core-components-button": "^12.0.2",
15
+ "@alfalab/core-components-bottom-sheet": "^7.4.3",
16
+ "@alfalab/core-components-button": "^12.1.1",
17
17
  "@alfalab/core-components-checkbox": "^5.0.2",
18
18
  "@alfalab/core-components-form-control": "^13.0.2",
19
- "@alfalab/core-components-input": "^16.0.3",
20
- "@alfalab/core-components-modal": "^10.0.8",
19
+ "@alfalab/core-components-input": "^16.0.5",
20
+ "@alfalab/core-components-modal": "^10.0.10",
21
21
  "@alfalab/core-components-mq": "^5.0.2",
22
22
  "@alfalab/core-components-popover": "^7.1.1",
23
23
  "@alfalab/core-components-scrollbar": "^4.0.0",
@@ -43,6 +43,6 @@
43
43
  "access": "public",
44
44
  "directory": "dist"
45
45
  },
46
- "themesVersion": "14.1.3",
46
+ "themesVersion": "14.2.0",
47
47
  "varsVersion": "10.2.0"
48
48
  }
@@ -9,12 +9,12 @@
9
9
  --gap-16: var(--gap-m);
10
10
  } :root {
11
11
  --select-option-list-footer-button-gap: var(--gap-8);
12
- } .select__footer_knau3 {
12
+ } .select__footer_17zxh {
13
13
  background-color: var(--color-light-base-bg-primary);
14
14
  padding: var(--gap-12);
15
15
  outline: none;
16
- } .select__footer_knau3.select__size-72_knau3 {
16
+ } .select__footer_17zxh.select__size-72_17zxh {
17
17
  padding: var(--gap-12) var(--gap-16);
18
- } .select__footer_knau3 > .select__button_knau3 + .select__button_knau3 {
18
+ } .select__footer_17zxh > .select__button_17zxh + .select__button_17zxh {
19
19
  margin-left: var(--select-option-list-footer-button-gap);
20
20
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  require('./index.css');
4
4
 
5
- var styles = {"footer":"select__footer_knau3","size-72":"select__size-72_knau3","button":"select__button_knau3"};
5
+ var styles = {"footer":"select__footer_17zxh","size-72":"select__size-72_17zxh","button":"select__button_17zxh"};
6
6
 
7
7
  module.exports = styles;
8
8
  //# sourceMappingURL=index.module.css.js.map
@@ -5,10 +5,10 @@
5
5
  --gap-8: var(--gap-xs);
6
6
  --gap-12: var(--gap-s);
7
7
  --gap-16: var(--gap-m);
8
- } .select__desktop_156uq {
8
+ } .select__desktop_55q7s {
9
9
  padding: var(--gap-12);
10
- } .select__desktop_156uq.select__size-72_156uq {
10
+ } .select__desktop_55q7s.select__size-72_55q7s {
11
11
  padding-left: var(--gap-16);
12
- } .select__mobile_156uq {
12
+ } .select__mobile_55q7s {
13
13
  padding: var(--gap-12) var(--gap-8);
14
14
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  require('./index.css');
4
4
 
5
- var styles = {"desktop":"select__desktop_156uq","size-72":"select__size-72_156uq","mobile":"select__mobile_156uq"};
5
+ var styles = {"desktop":"select__desktop_55q7s","size-72":"select__size-72_55q7s","mobile":"select__mobile_55q7s"};
6
6
 
7
7
  module.exports = styles;
8
8
  //# sourceMappingURL=index.module.css.js.map
@@ -1,4 +1,4 @@
1
- .select__skeleton_17vfu {
1
+ .select__skeleton_kjkl3 {
2
2
  position: absolute;
3
3
  top: 50%;
4
4
  transform: translateY(-50%);
@@ -2,7 +2,7 @@
2
2
 
3
3
  require('./index.css');
4
4
 
5
- var styles = {"skeleton":"select__skeleton_17vfu"};
5
+ var styles = {"skeleton":"select__skeleton_kjkl3"};
6
6
 
7
7
  module.exports = styles;
8
8
  //# sourceMappingURL=index.module.css.js.map
@@ -164,6 +164,10 @@ export const OptionsList = forwardRef<HTMLDivElement, OptionsListProps>(
164
164
  return (
165
165
  <Scrollbar
166
166
  className={cn(styles.scrollable, scrollbarClassName)}
167
+ verticalBarClassName={cn(styles.verticalBar, {
168
+ [styles.verticalBarWithHeader]: Boolean(header),
169
+ [styles.verticalBarWithFooter]: Boolean(footer),
170
+ })}
167
171
  ref={scrollbarRef}
168
172
  style={{ height }}
169
173
  horizontalAutoStretch={optionsListWidth === 'content'}
@@ -6,6 +6,31 @@
6
6
  outline: none;
7
7
  box-sizing: border-box;
8
8
  position: relative;
9
+
10
+ & .scrollable {
11
+ overflow: auto;
12
+ width: 100%;
13
+
14
+ & .verticalBar.verticalBar {
15
+ top: var(--select-options-list-scrollbar-gap);
16
+ height: calc(100% - 2 * var(--select-options-list-scrollbar-gap));
17
+
18
+ &.verticalBarWithHeader {
19
+ top: 0;
20
+ height: calc(100% - var(--select-options-list-scrollbar-gap));
21
+ }
22
+
23
+ &.verticalBarWithFooter {
24
+ top: var(--select-options-list-scrollbar-gap);
25
+ height: calc(100% - var(--select-options-list-scrollbar-gap));
26
+ }
27
+
28
+ &.verticalBarWithHeader.verticalBarWithFooter {
29
+ top: 0;
30
+ height: 100%;
31
+ }
32
+ }
33
+ }
9
34
  }
10
35
 
11
36
  .optionsListHeader {
@@ -30,11 +55,6 @@
30
55
  }
31
56
  }
32
57
 
33
- .scrollable {
34
- overflow: auto;
35
- width: 100%;
36
- }
37
-
38
58
  .mask {
39
59
  min-width: 4000px;
40
60
  }
package/src/vars.css CHANGED
@@ -6,7 +6,8 @@
6
6
 
7
7
  /* options list */
8
8
 
9
- --select-options-list-border-radius: var(--border-radius-8);
9
+ --select-options-list-border-radius: var(--border-radius-16);
10
+ --select-options-list-scrollbar-gap: var(--gap-12);
10
11
  --select-options-list-box-shadow: var(--shadow-m);
11
12
  --select-options-list-offset: var(--gap-4);
12
13
  --select-options-list-top-padding: var(--gap-0);