mimir-ui-kit 1.27.1 → 1.27.3

Sign up to get free protection for your applications and to get access to all the features.
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
  ".": {