mimir-ui-kit 1.44.3 → 1.46.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 (33) hide show
  1. package/dist/assets/SelectSearch.css +1 -1
  2. package/dist/assets/useNestedSelection.css +1 -0
  3. package/dist/components/MultiSelectSearch/MultiSelectSearch.d.ts +6 -3
  4. package/dist/components/MultiSelectSearch/MultiSelectSearch.js +283 -468
  5. package/dist/components/MultiSelectSearch/hooks/useChips.d.ts +18 -0
  6. package/dist/components/MultiSelectSearch/hooks/useChips.js +79 -0
  7. package/dist/components/MultiSelectSearch/hooks/useDataLoading.d.ts +10 -0
  8. package/dist/components/MultiSelectSearch/hooks/useDataLoading.js +21 -0
  9. package/dist/components/MultiSelectSearch/hooks/useEventHandling.d.ts +12 -0
  10. package/dist/components/MultiSelectSearch/hooks/useEventHandling.js +31 -0
  11. package/dist/components/MultiSelectSearch/hooks/useMenuPlacement.d.ts +19 -0
  12. package/dist/components/MultiSelectSearch/hooks/useMenuPlacement.js +38 -0
  13. package/dist/components/MultiSelectSearch/hooks/useMultiSelectState.d.ts +21 -0
  14. package/dist/components/MultiSelectSearch/hooks/useMultiSelectState.js +31 -0
  15. package/dist/components/MultiSelectSearch/hooks/useNestedSelection.d.ts +23 -0
  16. package/dist/components/MultiSelectSearch/hooks/useNestedSelection.js +11 -0
  17. package/dist/components/MultiSelectSearch/hooks/useRenderVirtualizedList.d.ts +27 -0
  18. package/dist/components/MultiSelectSearch/hooks/useRenderVirtualizedList.js +211 -0
  19. package/dist/components/MultiSelectSearch/hooks/useSearch.d.ts +14 -0
  20. package/dist/components/MultiSelectSearch/hooks/useSearch.js +44 -0
  21. package/dist/components/MultiSelectSearch/hooks/useVirtualization.d.ts +19 -0
  22. package/dist/components/MultiSelectSearch/hooks/useVirtualization.js +59 -0
  23. package/dist/components/MultiSelectSearch/types.d.ts +17 -1
  24. package/dist/components/MultiSelectSearch/utils.d.ts +50 -1
  25. package/dist/components/MultiSelectSearch/utils.js +165 -32
  26. package/dist/components/SelectSearch/SelectSearch.d.ts +4 -2
  27. package/dist/components/SelectSearch/SelectSearch.js +291 -287
  28. package/dist/components/SelectSearch/types.d.ts +5 -0
  29. package/dist/components/SelectSearch/utils.d.ts +16 -0
  30. package/dist/components/SelectSearch/utils.js +75 -28
  31. package/dist/useNestedSelection-DnuUbEqM.js +119 -0
  32. package/package.json +1 -1
  33. package/dist/assets/MultiSelectSearch.css +0 -1
@@ -104,4 +104,9 @@ export type TSelectSearchProps = Pick<TInputProps, 'withClearButton' | 'variant'
104
104
  * @default 'all'
105
105
  */
106
106
  borderRadius?: ESelectSearchBorderRadius | `${ESelectSearchBorderRadius}`;
107
+ /**
108
+ * Включить подсветку найденных значений в выпадающем списке
109
+ * @default false
110
+ */
111
+ highlightMatches?: boolean;
107
112
  };
@@ -6,3 +6,19 @@ export declare const mapSizeToInputSize: (size: ESelectSearchSize) => EInputSize
6
6
  export declare const getDropdownArrowIcon: (isOpen: boolean, size: ESelectSearchSize) => "DropdownArrowBottom16px" | "DropdownArrowUp16px" | "DropdownArrowUp24px" | "DropdownArrowDown24px";
7
7
  export declare const prepareGroupedItems: (items: TSelectOption[], groupBy: string, getGroupTitle: (value: string) => string) => TSelectOption[];
8
8
  export declare const shouldShowMenuOnTop: (selectRef: React.RefObject<HTMLDivElement>, size: ESelectSearchSize) => boolean;
9
+ /**
10
+ * Подсвечивает совпадения поискового запроса в тексте.
11
+ * @param text - Исходный текст для подсветки.
12
+ * @param searchQuery - Поисковый запрос.
13
+ * @param highlightClassName - CSS класс для подсвеченного текста.
14
+ * @returns Массив частей текста, где совпадения обернуты в span с классом.
15
+ */
16
+ export declare const highlightText: (text: string, searchQuery: string, highlightClassName: string) => (string | React.ReactElement)[];
17
+ /**
18
+ * Рекурсивно подсвечивает совпадения поискового запроса в ReactNode (включая JSX элементы).
19
+ * @param node - ReactNode для обработки.
20
+ * @param searchQuery - Поисковый запрос.
21
+ * @param highlightClassName - CSS класс для подсвеченного текста.
22
+ * @returns ReactNode с подсвеченными совпадениями.
23
+ */
24
+ export declare const highlightReactNode: (node: React.ReactNode, searchQuery: string, highlightClassName: string) => React.ReactNode;
@@ -1,38 +1,85 @@
1
- import { ESelectSearchSize as t, MOBILE_MENU_HEIGHT as i, DESKTOP_MENU_HEIGHT as a } from "./constants.js";
1
+ import { createElement as u, Fragment as l, isValidElement as g, cloneElement as m } from "react";
2
+ import { ESelectSearchSize as s, MOBILE_MENU_HEIGHT as w, DESKTOP_MENU_HEIGHT as f } from "./constants.js";
2
3
  import "../../Input-IzZ6B9kw.js";
3
- import { EInputSize as s } from "../Input/constants.js";
4
- const h = (r) => {
4
+ import { EInputSize as c } from "../Input/constants.js";
5
+ const A = (r) => {
5
6
  switch (r) {
6
- case t.S:
7
- return s.S;
8
- case t.M:
9
- return s.M;
10
- case t.L:
11
- return s.L;
7
+ case s.S:
8
+ return c.S;
9
+ case s.M:
10
+ return c.M;
11
+ case s.L:
12
+ return c.L;
12
13
  default:
13
- return s.M;
14
+ return c.M;
14
15
  }
15
- }, l = (r, o) => r ? o === t.L ? "DropdownArrowUp24px" : "DropdownArrowUp16px" : o === t.L ? "DropdownArrowDown24px" : "DropdownArrowBottom16px", f = (r, o, u) => {
16
- if (!r.length || !o) return r;
17
- const n = [], c = /* @__PURE__ */ new Set();
18
- for (const p of r) {
19
- const e = String(p[o] || "Без группы");
20
- c.has(e) || (c.add(e), n.push({
21
- id: `group-header-${e}`,
22
- name: u(e),
16
+ }, H = (r, t) => r ? t === s.L ? "DropdownArrowUp24px" : "DropdownArrowUp16px" : t === s.L ? "DropdownArrowDown24px" : "DropdownArrowBottom16px", M = (r, t, n) => {
17
+ if (!r.length || !t) return r;
18
+ const e = [], i = /* @__PURE__ */ new Set();
19
+ for (const o of r) {
20
+ const p = String(o[t] || "Без группы");
21
+ i.has(p) || (i.add(p), e.push({
22
+ id: `group-header-${p}`,
23
+ name: n(p),
23
24
  isGroupHeader: !0,
24
- originalValue: e
25
- })), n.push(p);
25
+ originalValue: p
26
+ })), e.push(o);
26
27
  }
27
- return n;
28
- }, g = (r, o) => {
28
+ return e;
29
+ }, D = (r, t) => {
29
30
  if (!r.current) return !1;
30
- const u = r.current.getBoundingClientRect(), n = window.innerHeight, c = o === t.M || o === t.S ? i : a, p = n - u.bottom, e = u.top;
31
- return p >= c ? !1 : e > p;
31
+ const n = r.current.getBoundingClientRect(), e = window.innerHeight, i = t === s.M || t === s.S ? w : f, o = e - n.bottom, p = n.top;
32
+ return o >= i ? !1 : p > o;
33
+ }, h = (r, t, n) => {
34
+ if (!t.trim())
35
+ return [r];
36
+ const e = new RegExp(
37
+ `(${t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")})`,
38
+ "gi"
39
+ );
40
+ return r.split(e).map((o, p) => e.test(o) ? u(
41
+ "span",
42
+ {
43
+ key: p,
44
+ className: n
45
+ },
46
+ o
47
+ ) : o);
48
+ }, a = (r, t, n) => {
49
+ if (!t.trim())
50
+ return r;
51
+ if (typeof r == "string") {
52
+ const e = h(
53
+ r,
54
+ t,
55
+ n
56
+ );
57
+ return u(
58
+ "span",
59
+ { className: "highlighted-text-wrapper" },
60
+ e
61
+ );
62
+ }
63
+ return Array.isArray(r) ? r.map(
64
+ (e, i) => u(
65
+ l,
66
+ { key: i },
67
+ a(e, t, n)
68
+ )
69
+ ) : g(r) ? m(r, {
70
+ ...r.props,
71
+ children: a(
72
+ r.props.children,
73
+ t,
74
+ n
75
+ )
76
+ }) : r;
32
77
  };
33
78
  export {
34
- l as getDropdownArrowIcon,
35
- h as mapSizeToInputSize,
36
- f as prepareGroupedItems,
37
- g as shouldShowMenuOnTop
79
+ H as getDropdownArrowIcon,
80
+ a as highlightReactNode,
81
+ h as highlightText,
82
+ A as mapSizeToInputSize,
83
+ M as prepareGroupedItems,
84
+ D as shouldShowMenuOnTop
38
85
  };
@@ -0,0 +1,119 @@
1
+ import { jsxs as r, jsx as _ } from "react/jsx-runtime";
2
+ import { c as a } from "./index-DIxK0V-G.js";
3
+ import { Icon as w } from "./icons/Icon.js";
4
+ import { CheckboxMimir as k } from "./components/CheckboxMimir/CheckboxMimir.js";
5
+ import { EMultiSelectSearchSize as N } from "./components/MultiSelectSearch/constants.js";
6
+ import { isOptionSelected as S } from "./components/MultiSelectSearch/utils.js";
7
+ import { W as y } from "./combobox-fIVOzEhl.js";
8
+ import './assets/useNestedSelection.css';const D = "_disabled_dbl8p_5", M = "_container_dbl8p_9", E = "_sticky_dbl8p_33", j = "_hidden_dbl8p_41", q = "_l_dbl8p_49", A = "_loader_dbl8p_53", C = "_full_dbl8p_63", O = "_button_dbl8p_75", W = "_options_dbl8p_45", B = "_visible_dbl8p_102", F = "_top_dbl8p_105", P = "_bottom_dbl8p_110", $ = "_m_dbl8p_2", G = "_focused_dbl8p_170", H = "_option_dbl8p_45", I = "_chip_dbl8p_199", J = "_clear_dbl8p_224", e = {
9
+ "multi-select-search": "_multi-select-search_dbl8p_2",
10
+ disabled: D,
11
+ container: M,
12
+ "container-open": "_container-open_dbl8p_18",
13
+ "group-header": "_group-header_dbl8p_22",
14
+ "sticky-active": "_sticky-active_dbl8p_33",
15
+ sticky: E,
16
+ hidden: j,
17
+ "options-container": "_options-container_dbl8p_45",
18
+ l: q,
19
+ loader: A,
20
+ "input-container": "_input-container_dbl8p_58",
21
+ full: C,
22
+ "selected-icon": "_selected-icon_dbl8p_67",
23
+ "selector-icon-open": "_selector-icon-open_dbl8p_71",
24
+ button: O,
25
+ "selector-icon": "_selector-icon_dbl8p_71",
26
+ options: W,
27
+ visible: B,
28
+ top: F,
29
+ bottom: P,
30
+ "no-options": "_no-options_dbl8p_131",
31
+ m: $,
32
+ "multi-select-input-disabled": "_multi-select-input-disabled_dbl8p_167",
33
+ "multi-select-input": "_multi-select-input_dbl8p_167",
34
+ focused: G,
35
+ option: H,
36
+ "option-active": "_option-active_dbl8p_189",
37
+ "option-inner": "_option-inner_dbl8p_192",
38
+ chip: I,
39
+ "chip-container": "_chip-container_dbl8p_204",
40
+ "chip-root": "_chip-root_dbl8p_210",
41
+ "right-slot": "_right-slot_dbl8p_214",
42
+ "required-mark": "_required-mark_dbl8p_219",
43
+ clear: J,
44
+ "icon-button": "_icon-button_dbl8p_233",
45
+ "highlighted-text": "_highlighted-text_dbl8p_237",
46
+ "highlighted-text-wrapper": "_highlighted-text-wrapper_dbl8p_242",
47
+ "nested-option": "_nested-option_dbl8p_246",
48
+ "expand-button": "_expand-button_dbl8p_254",
49
+ "expand-icon": "_expand-icon_dbl8p_266",
50
+ "expand-icon-expanded": "_expand-icon-expanded_dbl8p_269"
51
+ }, X = ({
52
+ filteredItems: b,
53
+ selectedItems: h,
54
+ expandedOptions: u,
55
+ setExpandedOptions: m,
56
+ size: c,
57
+ classNameOption: x,
58
+ items: f,
59
+ renderOptionContent: g
60
+ }) => {
61
+ const l = (n) => {
62
+ m((i) => {
63
+ const o = new Set(i);
64
+ return o.has(n) ? o.delete(n) : o.add(n), o;
65
+ });
66
+ }, s = (n, i = 0) => n.filter((o) => {
67
+ const p = b.some((t) => t.id === o.id);
68
+ return i === 0 ? p && f.some((t) => t.id === o.id) : !o.children;
69
+ }).map((o) => {
70
+ const p = u.has(o.id), t = o.children && o.children.length > 0, v = S(
71
+ o,
72
+ h.map((d) => d.id)
73
+ );
74
+ return /* @__PURE__ */ r("div", { children: [
75
+ /* @__PURE__ */ r(
76
+ y,
77
+ {
78
+ value: o,
79
+ className: ({ focus: d }) => a(e.option, x, c && e[c], {
80
+ [e["option-active"]]: d,
81
+ [e["nested-option"]]: i > 0
82
+ }),
83
+ children: [
84
+ /* @__PURE__ */ _(k, { isInteractive: !1, checked: v }),
85
+ /* @__PURE__ */ _("div", { className: e["option-inner"], children: g(o) }),
86
+ t && /* @__PURE__ */ _(
87
+ "div",
88
+ {
89
+ className: e["expand-button"],
90
+ "data-testid": `expand-button-${o.id}`,
91
+ onMouseDown: (d) => {
92
+ d.stopPropagation(), l(o.id);
93
+ },
94
+ children: /* @__PURE__ */ _(
95
+ w,
96
+ {
97
+ iconName: c === N.M ? "DropdownArrowBottom16px" : "DropdownArrowDown24px",
98
+ className: a(e["expand-icon"], {
99
+ [e["expand-icon-expanded"]]: p
100
+ })
101
+ }
102
+ )
103
+ }
104
+ )
105
+ ]
106
+ }
107
+ ),
108
+ t && p && /* @__PURE__ */ _("div", { className: e["nested-children"], children: s(o.children, i + 1) })
109
+ ] }, o.id);
110
+ });
111
+ return {
112
+ toggleExpanded: l,
113
+ renderNestedOptions: s
114
+ };
115
+ };
116
+ export {
117
+ e as c,
118
+ X as u
119
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mimir-ui-kit",
3
3
  "private": false,
4
- "version": "1.44.3",
4
+ "version": "1.46.0",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  ".": {
@@ -1 +0,0 @@
1
- ._multi-select-search_1b2pk_2{position:relative}._multi-select-search_1b2pk_2._disabled_1b2pk_5{cursor:not-allowed}._container_1b2pk_9{display:block;gap:var(--select-search-gap);-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;height:var(--select-search-height);background-color:var(--black-5);border-radius:var(--select-search-radius)}._container-open_1b2pk_18{border-bottom:1px solid var(--citrine-100)}._group-header_1b2pk_22{position:-webkit-sticky;position:sticky;top:0;z-index:2;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;padding:var(--select-search-option-space);background-color:var(--black-10);border-bottom:1px solid var(--black-20)}._group-header_1b2pk_22._sticky-active_1b2pk_33{-webkit-box-shadow:0 2px 4px rgba(0,0,0,.1);box-shadow:0 2px 4px #0000001a}._loader_1b2pk_37{display:-webkit-box;display:-ms-flexbox;display:flex;gap:var(--mimir-space-m)}._input-container_1b2pk_42{position:relative;width:100%}._full_1b2pk_47{width:100%}._selected-icon_1b2pk_51 path{fill:var(--sapphire-100)}._selector-icon-open_1b2pk_55{-webkit-transform:rotate(180deg);transform:rotate(180deg)}._button_1b2pk_59{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:none;border:none;cursor:pointer}._button_1b2pk_59._disabled_1b2pk_5{cursor:not-allowed}._button_1b2pk_59._disabled_1b2pk_5 ._selector-icon_1b2pk_55 path{fill:var(--white)}._options_1b2pk_73{position:absolute;z-index:10;width:100%;min-height:50%;max-height:var(--select-search-options-height);overflow-y:auto;font-size:var(--mimir-size-text-l);background:var(--white);-webkit-box-shadow:var(--mimir-box-shadow-select-search);box-shadow:var(--mimir-box-shadow-select-search);opacity:0;-webkit-transition:opacity .2s ease-out,-webkit-transform .2s ease-out;transition:opacity .2s ease-out,-webkit-transform .2s ease-out;transition:transform .2s ease-out,opacity .2s ease-out;transition:transform .2s ease-out,opacity .2s ease-out,-webkit-transform .2s ease-out}._options_1b2pk_73._visible_1b2pk_86{opacity:1}._options_1b2pk_73._top_1b2pk_89{bottom:100%;margin-bottom:1px;border-radius:var(--select-search-radius) var(--select-search-radius) 0 0}._options_1b2pk_73._bottom_1b2pk_94{top:100%;margin-top:1px;border-radius:0 0 var(--select-search-radius) var(--select-search-radius)}._options_1b2pk_73::-webkit-scrollbar{width:3px}._options_1b2pk_73::-webkit-scrollbar-thumb{background-color:var(--black-80);border-radius:var(--mimir-control-radius-xs2)}._options_1b2pk_73::-webkit-scrollbar-track{background-color:var(--white)}@media (max-width: 600px){._options_1b2pk_73{max-height:var(--mimir-select-search-options-height-mobile)}}._no-options_1b2pk_115{height:100%;padding:var(--select-search-option-space);color:var(--black-80)}._m_1b2pk_2{--select-search-height: var(--mimir-select-search-height-l);--select-search-space: var(--mimir-space-xss) var(--mimir-space-m);--select-search-radius: var(--mimir-control-radius);--select-search-gap: var(--mimir-space-2xs);--select-search-btn-space: var(--mimir-space-m) var(--mimir-space-m) var(--mimir-space-m) var(--mimir-space-xs);--select-search-option-space: var(--mimir-space-2s) var(--mimir-space-m);--select-search-options-height: var( --mimir-select-search-options-height-mobile );--clear-right: var(--mimir-space-2xxl);--multi-select-input-disabled-margin-right: var(--mimir-space-l)}._l_1b2pk_37{--select-search-height: var(--mimir-select-search-height-xxl);--select-search-space: var(--mimir-space-xss) var(--mimir-space-m);--select-search-radius: var(--mimir-control-radius-s);--select-search-gap: var(--mimir-space-xs);--select-search-btn-space: var(--mimir-space-l) var(--mimir-space-m) var(--mimir-space-l) var(--mimir-space-xs);--select-search-option-space: var(--mimir-space-2l) var(--mimir-space-m);--select-search-options-height: var( --mimir-select-search-options-height-desktop );--clear-right: var(--mimir-space-4xl);--multi-select-input-disabled-margin-right: var(--mimir-space-1xl)}._multi-select-input-disabled_1b2pk_151{margin-right:var(--multi-select-input-disabled-margin-right)}._multi-select-input_1b2pk_151._focused_1b2pk_154{height:auto;min-height:var(--input-height);overflow:hidden;resize:vertical}._multi-select-input_1b2pk_151:last-child{padding-right:var(--mimir-space-4xl)}._option_1b2pk_73{display:-webkit-box;display:-ms-flexbox;display:flex;gap:var(--mimir-space-m);-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;padding:var(--select-search-option-space);cursor:pointer;-webkit-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}._option-active_1b2pk_173{background-color:var(--black-5)}._option-inner_1b2pk_176{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:var(--mimir-space-xs);width:100%}._chip_1b2pk_183{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}._chip-container_1b2pk_188{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--mimir-space-2xs);margin-top:var(--mimir-space-xs)}._chip-root_1b2pk_194{max-width:100%}._right-slot_1b2pk_198{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;padding-top:0!important}._required-mark_1b2pk_203{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;margin-right:var(--mimir-space-xs)}._clear_1b2pk_208{position:absolute;top:50%;right:var(--clear-right);-webkit-transform:translateY(-50%);transform:translateY(-50%)}._clear_1b2pk_208._disabled_1b2pk_5{cursor:not-allowed}._clear_1b2pk_208._disabled_1b2pk_5 ._icon-button_1b2pk_217 path{fill:var(--white)}