mimir-ui-kit 1.27.1 → 1.27.3

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.
package/README.md CHANGED
@@ -1,62 +1,62 @@
1
- # Mimir-ui
2
-
3
- ## Установка и запуск проекта
4
-
5
- 1. Установите зависимости:
6
- ```bash
7
- npm install
8
- ```
9
- 2. Запуск storybook
10
- ```bash
11
- npm run storybook
12
- ```
13
-
14
- ## Сборка проекта
15
-
16
- 1. Скрипт для сборки
17
- ```bash
18
- npm run build
19
- ```
20
-
21
- ## Создание нового компонента
22
-
23
- ```bash
24
- npm run create-component <ComponentName>
25
- ```
26
-
27
- ## Поднятие версии для публикации на npm
28
-
29
- Для поднятия версии пакета перед публикацией на npm используем следующие скрипты:
30
-
31
- 1. `patch`: Этот скрипт увеличивает версию пакета на один патч (например, с версии 1.0.0 до 1.0.1). Он автоматически обновляет версию в файле package.json и создает коммит с обновленной версией.
32
-
33
- ```bash
34
- npm version patch
35
- ```
36
-
37
- 2. `minor`: Этот скрипт увеличивает версию пакета на один минорный уровень (например, с версии 1.0.0 до 1.1.0). Также обновляет версию в package.json и создает коммит.
38
- ```bash
39
- npm version minor
40
- ```
41
- 3. `major`: Этот скрипт увеличивает версию пакета на один мажорный уровень (например, с версии 1.0.0 до 2.0.0). Он также обновляет версию в package.json и создает коммит.
42
- ```bash
43
- npm version major
44
- ```
45
-
46
- ## Публикация на npm
47
-
48
- 1. Скрипт для публикации на npm:
49
- ```bash
50
- npm publish
51
- ```
52
-
53
- ## Ручная Генерация иконок
54
-
55
- 1. Экспортируем с фигмы иконку.
56
- 2. Добавляем ее в папку svgs.
57
- 3. Запускаем скрипт:
58
- ```bash
59
- npm run icons
60
- ```
61
- 4. Смотрим в папку `icons/components`
62
- 5. Готово.
1
+ # Mimir-ui
2
+
3
+ ## Установка и запуск проекта
4
+
5
+ 1. Установите зависимости:
6
+ ```bash
7
+ npm install
8
+ ```
9
+ 2. Запуск storybook
10
+ ```bash
11
+ npm run storybook
12
+ ```
13
+
14
+ ## Сборка проекта
15
+
16
+ 1. Скрипт для сборки
17
+ ```bash
18
+ npm run build
19
+ ```
20
+
21
+ ## Создание нового компонента
22
+
23
+ ```bash
24
+ npm run create-component <ComponentName>
25
+ ```
26
+
27
+ ## Поднятие версии для публикации на npm
28
+
29
+ Для поднятия версии пакета перед публикацией на npm используем следующие скрипты:
30
+
31
+ 1. `patch`: Этот скрипт увеличивает версию пакета на один патч (например, с версии 1.0.0 до 1.0.1). Он автоматически обновляет версию в файле package.json и создает коммит с обновленной версией.
32
+
33
+ ```bash
34
+ npm version patch
35
+ ```
36
+
37
+ 2. `minor`: Этот скрипт увеличивает версию пакета на один минорный уровень (например, с версии 1.0.0 до 1.1.0). Также обновляет версию в package.json и создает коммит.
38
+ ```bash
39
+ npm version minor
40
+ ```
41
+ 3. `major`: Этот скрипт увеличивает версию пакета на один мажорный уровень (например, с версии 1.0.0 до 2.0.0). Он также обновляет версию в package.json и создает коммит.
42
+ ```bash
43
+ npm version major
44
+ ```
45
+
46
+ ## Публикация на npm
47
+
48
+ 1. Скрипт для публикации на npm:
49
+ ```bash
50
+ npm publish
51
+ ```
52
+
53
+ ## Ручная Генерация иконок
54
+
55
+ 1. Экспортируем с фигмы иконку.
56
+ 2. Добавляем ее в папку svgs.
57
+ 3. Запускаем скрипт:
58
+ ```bash
59
+ npm run icons
60
+ ```
61
+ 4. Смотрим в папку `icons/components`
62
+ 5. Готово.
@@ -1,7 +1,8 @@
1
+ import { ComponentProps } from 'react';
1
2
  import { TCommonStepsProps } from './types';
2
3
  import { TStepsZone } from './types.ts';
3
4
 
4
- export type TProps = TCommonStepsProps & {
5
+ export type TProps = TCommonStepsProps & Omit<ComponentProps<'div'>, 'onClick'> & {
5
6
  /**
6
7
  * Класс, применяемый к корневому элементу
7
8
  */
@@ -46,50 +47,28 @@ export type TProps = TCommonStepsProps & {
46
47
  * Класс для иконки шага
47
48
  */
48
49
  classNameIconStep?: string;
49
- };
50
- export declare const Steps: import('react').ForwardRefExoticComponent<TCommonStepsProps & {
51
- /**
52
- * Класс, применяемый к корневому элементу
53
- */
54
- rootClassName?: string;
55
- /**
56
- * Класс, применяемый к шагам
57
- */
58
- stepClassName?: string;
59
- /**
60
- * Количество шагов.
61
- */
62
- quantity: number;
63
- /**
64
- * Текущий шаг
65
- */
66
- current?: number;
67
- /**
68
- * Есть ли возможность переключать шаги по клику
69
- */
70
- editable?: boolean;
71
50
  /**
72
- * Обработчик клика на шаг
51
+ * Кастомные размеры шагов.
73
52
  */
74
- onClick?: (step: number) => void;
75
- /**
76
- * Отключено / включено взаимодействие с шагами
77
- */
78
- disabled?: boolean;
53
+ customSize?: {
54
+ width?: number;
55
+ height?: number;
56
+ };
79
57
  /**
80
- * Цвет оставшихся шагов
58
+ * Заливать ли элементы цветом той зоны на которую сейчас наведен курсор
81
59
  */
82
- zones?: TStepsZone[];
60
+ fillByActualZone?: boolean;
83
61
  /**
84
- * Цвет шага, если он не выбран
62
+ * Коллбек для события наведения на шаг курсором
85
63
  */
86
- unselectedColor?: string;
64
+ onStepMouseEnter?: (idx: number) => void;
87
65
  /**
88
- * Адаптивный шаг
66
+ * Коллбэк для события покидания шага курсором
89
67
  */
90
- resizable?: boolean;
68
+ onStepMouseLeave?: () => void;
91
69
  /**
92
- * Класс для иконки шага
70
+ * Передача текущего цвета в родительский компонент
93
71
  */
94
- classNameIconStep?: string;
95
- } & import('react').RefAttributes<HTMLDivElement>>;
72
+ setParentColor?: (color: string) => void;
73
+ };
74
+ export declare const Steps: import('react').ForwardRefExoticComponent<Omit<TProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
@@ -35,19 +35,34 @@ const Steps = forwardRef(
35
35
  editable: editable2 = false,
36
36
  size = EStepsSize.M,
37
37
  onClick,
38
+ customSize,
38
39
  resizable: resizable2,
39
40
  disabled = false,
40
41
  zones = [{ color: "#ff0000", to: quantity }],
41
42
  unselectedColor = "#ffffff",
42
- classNameIconStep
43
+ fillByActualZone,
44
+ onStepMouseEnter,
45
+ onStepMouseLeave,
46
+ setParentColor,
47
+ classNameIconStep,
48
+ ...otherProps
43
49
  } = props;
44
50
  const idPrefix = useId();
45
51
  const [step2, setStep] = useState(current);
46
52
  const [hoveredStep, setHoveredStep] = useState(null);
47
53
  const stepWasChangedRef = useRef(null);
54
+ const [currentColor, setCurrentColor] = useState(null);
48
55
  useEffect(() => {
49
56
  setStep(current);
50
57
  }, [current]);
58
+ useEffect(() => {
59
+ if (fillByActualZone) {
60
+ const zone = zones.find((zone2) => zone2.to >= (step2 + 1 || 0));
61
+ if (zone) {
62
+ setCurrentColor(zone.color);
63
+ }
64
+ }
65
+ }, []);
51
66
  const handleClick = (idx) => {
52
67
  const clickedStep = idx + DIFF_BETWEEN_STEP_AND_INDEX;
53
68
  stepWasChangedRef.current = true;
@@ -62,9 +77,25 @@ const Steps = forwardRef(
62
77
  const handleMouseEnter = (evt) => {
63
78
  const hoveredIdx = Number(evt.currentTarget.id.split(ID_SEPARATOR)[1]);
64
79
  setHoveredStep(hoveredIdx);
80
+ onStepMouseEnter && onStepMouseEnter(hoveredIdx);
81
+ const zone = zones.find((zone2) => zone2.to >= (hoveredIdx + 1 || 0));
82
+ if (zone) {
83
+ setParentColor && setParentColor(zone.color);
84
+ if (fillByActualZone) {
85
+ setCurrentColor(zone.color);
86
+ }
87
+ }
65
88
  };
66
89
  const handleMouseLeave = () => {
67
90
  setHoveredStep(null);
91
+ onStepMouseLeave && onStepMouseLeave();
92
+ const zone = zones.find((zone2) => zone2.to >= (step2 + 1 || 0));
93
+ if (zone) {
94
+ setParentColor && setParentColor(zone.color);
95
+ if (fillByActualZone) {
96
+ setCurrentColor(zone.color);
97
+ }
98
+ }
68
99
  };
69
100
  const buttons = Array.from({ length: quantity }, (_, idx) => {
70
101
  var _a, _b;
@@ -72,12 +103,24 @@ const Steps = forwardRef(
72
103
  while (currentZone < zones.length && zones[currentZone].to <= idx) {
73
104
  currentZone++;
74
105
  }
75
- const color = hoveredStep !== null && idx <= hoveredStep ? (_a = zones[currentZone]) == null ? void 0 : _a.color : step2 > idx && hoveredStep === null ? (_b = zones[currentZone]) == null ? void 0 : _b.color : unselectedColor;
106
+ let color;
107
+ if (fillByActualZone && hoveredStep !== null) {
108
+ color = idx <= hoveredStep ? currentColor : unselectedColor;
109
+ } else {
110
+ if (fillByActualZone) {
111
+ color = step2 > idx ? currentColor : unselectedColor;
112
+ } else {
113
+ color = hoveredStep !== null && idx <= hoveredStep ? (_a = zones[currentZone]) == null ? void 0 : _a.color : step2 > idx && hoveredStep === null ? (_b = zones[currentZone]) == null ? void 0 : _b.color : unselectedColor;
114
+ }
115
+ }
76
116
  return /* @__PURE__ */ jsx(
77
117
  "button",
78
118
  {
79
- type: "button",
80
- style: { backgroundColor: resizable2 ? color : void 0, color },
119
+ style: {
120
+ backgroundColor: resizable2 ? color !== null ? color : void 0 : void 0,
121
+ color: color !== null ? color : void 0,
122
+ height: customSize == null ? void 0 : customSize.height
123
+ },
81
124
  id: `${idPrefix}${ID_SEPARATOR}${idx}`,
82
125
  className: classNames(cls.step, cls[size], stepClassName, {
83
126
  [cls.editable]: editable2 && !disabled,
@@ -102,6 +145,7 @@ const Steps = forwardRef(
102
145
  return /* @__PURE__ */ jsx(
103
146
  "div",
104
147
  {
148
+ ...otherProps,
105
149
  className: classNames(
106
150
  cls.container,
107
151
  {
@@ -1,3 +1,3 @@
1
1
  import { TextareaHTMLAttributes } from 'react';
2
2
 
3
- export type TTextAreaProps = Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'readOnly' | 'size' | 'placeholder'>;
3
+ export type TTextAreaProps = Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'readOnly' | 'size'>;
@@ -1,5 +1,5 @@
1
1
  import { TCommonVoteProps } from './types';
2
- import { TStepsZone } from '../Steps/types.ts';
2
+ import { TStepsZone } from '../Steps';
3
3
 
4
4
  export type TProps = TCommonVoteProps & {
5
5
  /**
@@ -69,6 +69,17 @@ export type TProps = TCommonVoteProps & {
69
69
  * Класс для иконки шага
70
70
  */
71
71
  classNameIconStep?: string;
72
+ /**
73
+ * Кастомные размеры шагов.
74
+ */
75
+ customSize?: {
76
+ width?: number;
77
+ height?: number;
78
+ };
79
+ /**
80
+ * Заливать ли элементы цветом той зоны на которую сейчас наведен курсор
81
+ */
82
+ fillByActualZone?: boolean;
72
83
  };
73
84
  export declare const Vote: import('react').ForwardRefExoticComponent<TCommonVoteProps & {
74
85
  /**
@@ -138,4 +149,15 @@ export declare const Vote: import('react').ForwardRefExoticComponent<TCommonVote
138
149
  * Класс для иконки шага
139
150
  */
140
151
  classNameIconStep?: string;
152
+ /**
153
+ * Кастомные размеры шагов.
154
+ */
155
+ customSize?: {
156
+ width?: number;
157
+ height?: number;
158
+ };
159
+ /**
160
+ * Заливать ли элементы цветом той зоны на которую сейчас наведен курсор
161
+ */
162
+ fillByActualZone?: boolean;
141
163
  } & import('react').RefAttributes<HTMLDivElement>>;
@@ -3,7 +3,7 @@ import { c as classNames } from "../../index-CweZ_OcN.js";
3
3
  import { forwardRef, useState, useEffect } from "react";
4
4
  import { DEFAULT_TITLE, EVoteSize, ZERO_VALUE } from "./constants.js";
5
5
  import { Steps } from "../Steps/Steps.js";
6
- import { ZERO_STEP } from "../Steps/constants.js";
6
+ import { ZERO_STEP, StepSize } from "../Steps/constants.js";
7
7
  import '../../assets/Vote.css';const container = "_container_1akd9_2";
8
8
  const title = "_title_1akd9_9";
9
9
  const score = "_score_1akd9_16";
@@ -13,7 +13,6 @@ const cls = {
13
13
  score
14
14
  };
15
15
  const Vote = forwardRef((props, ref) => {
16
- var _a;
17
16
  const {
18
17
  rootClassName,
19
18
  titleClassName,
@@ -27,6 +26,7 @@ const Vote = forwardRef((props, ref) => {
27
26
  size = EVoteSize.M,
28
27
  onClick,
29
28
  resizable,
29
+ customSize,
30
30
  disabled = false,
31
31
  zones = [{ color: "#ff0000", to: quantity }],
32
32
  unselectedColor = "#ffffff",
@@ -34,18 +34,32 @@ const Vote = forwardRef((props, ref) => {
34
34
  unselected: "#000000",
35
35
  selected: "#ffffff"
36
36
  },
37
- classNameIconStep
37
+ classNameIconStep,
38
+ fillByActualZone
38
39
  } = props;
39
40
  const [score2, setScore] = useState(current);
41
+ const [hoveredScore, setHoveredScore] = useState(null);
42
+ const [currentColor, setCurrentColor] = useState(unselectedColor);
40
43
  const isZeroStep = score2 === ZERO_STEP;
41
44
  useEffect(() => {
42
45
  setScore(current);
43
46
  }, [current]);
47
+ useEffect(() => {
48
+ var _a;
49
+ const newColor = isZeroStep ? unselectedColor : ((_a = zones == null ? void 0 : zones.find((zone) => score2 <= zone.to)) == null ? void 0 : _a.color) ?? unselectedColor;
50
+ setCurrentColor(newColor);
51
+ }, [score2, zones, unselectedColor, isZeroStep]);
44
52
  const handleStepsClick = (step) => {
45
53
  setScore(step);
46
54
  onClick && onClick(step);
47
55
  };
48
- const backgroundColor = isZeroStep ? unselectedColor : ((_a = zones == null ? void 0 : zones.find((zone) => score2 <= zone.to)) == null ? void 0 : _a.color) || unselectedColor;
56
+ const handleHoverStepEnter = (step) => {
57
+ setHoveredScore(step + 1);
58
+ };
59
+ const handleHoverStepLeave = () => {
60
+ setHoveredScore(null);
61
+ };
62
+ const maxContainerWidth = resizable ? quantity * ((customSize == null ? void 0 : customSize.width) ?? StepSize[size].width) : void 0;
49
63
  return /* @__PURE__ */ jsxs("div", { className: classNames(cls.container, rootClassName), ref, children: [
50
64
  !withoutTitle && /* @__PURE__ */ jsx("p", { className: classNames(cls.title, titleClassName), children: title2 }),
51
65
  /* @__PURE__ */ jsx(
@@ -53,26 +67,34 @@ const Vote = forwardRef((props, ref) => {
53
67
  {
54
68
  className: classNames(cls.score, scoreClassName),
55
69
  style: {
56
- backgroundColor,
70
+ backgroundColor: isZeroStep ? unselectedColor : currentColor,
57
71
  color: isZeroStep ? scoreTextColor.unselected : scoreTextColor.selected
58
72
  },
59
- children: isZeroStep ? ZERO_VALUE : score2
73
+ children: isZeroStep ? ZERO_VALUE : hoveredScore || score2
60
74
  }
61
75
  ),
62
76
  /* @__PURE__ */ jsx(
63
77
  Steps,
64
78
  {
79
+ style: {
80
+ maxWidth: maxContainerWidth
81
+ },
82
+ customSize,
65
83
  rootClassName: stepsRootClassName,
66
84
  stepClassName: stepsStepClassName,
67
85
  quantity,
68
- size,
86
+ size: EVoteSize.L,
69
87
  current: score2,
70
88
  editable: true,
71
89
  resizable,
72
90
  disabled,
73
91
  onClick: handleStepsClick,
92
+ onStepMouseEnter: handleHoverStepEnter,
93
+ onStepMouseLeave: handleHoverStepLeave,
94
+ setParentColor: setCurrentColor,
74
95
  zones,
75
96
  unselectedColor,
97
+ fillByActualZone,
76
98
  classNameIconStep
77
99
  }
78
100
  )
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mimir-ui-kit",
3
3
  "private": false,
4
- "version": "1.27.1",
4
+ "version": "1.27.3",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  ".": {