wenay-react2 1.0.19 → 1.0.21

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 (77) hide show
  1. package/README.md +383 -382
  2. package/lib/common/api.d.ts +28 -0
  3. package/lib/common/api.js +41 -16
  4. package/lib/common/src/components/Buttons/MiniButton.d.ts +1 -0
  5. package/lib/common/src/components/Buttons/MiniButton.js +2 -2
  6. package/lib/common/src/components/Dnd/DraggableOutlineDiv.d.ts +1 -0
  7. package/lib/common/src/components/Dnd/DraggableOutlineDiv.js +10 -7
  8. package/lib/common/src/components/Dnd/RNDFunc.js +28 -17
  9. package/lib/common/src/components/Dnd/RNDFunc3.d.ts +27 -17
  10. package/lib/common/src/components/Dnd/RNDFunc3.js +107 -107
  11. package/lib/common/src/components/Dnd/Resizable.js +3 -3
  12. package/lib/common/src/components/Input.js +3 -3
  13. package/lib/common/src/components/Menu/RightMenu.js +17 -18
  14. package/lib/common/src/components/Menu/StickerMenu.d.ts +1 -3
  15. package/lib/common/src/components/Menu/StickerMenu.js +42 -28
  16. package/lib/common/src/components/Menu/index.d.ts +1 -1
  17. package/lib/common/src/components/Menu/index.js +1 -1
  18. package/lib/common/src/components/Modal/LeftModal.d.ts +14 -12
  19. package/lib/common/src/components/Modal/LeftModal.js +34 -52
  20. package/lib/common/src/components/Modal/Modal.d.ts +26 -12
  21. package/lib/common/src/components/Modal/Modal.js +66 -89
  22. package/lib/common/src/components/Modal/ModalContextProvider.d.ts +20 -3
  23. package/lib/common/src/components/Modal/ModalContextProvider.js +35 -8
  24. package/lib/common/src/components/MyResizeObserver.js +15 -18
  25. package/lib/common/src/components/Other.js +6 -5
  26. package/lib/common/src/components/Parameters.js +8 -7
  27. package/lib/common/src/components/ParametersEngine.js +36 -59
  28. package/lib/common/src/grid/agGrid4/agGrid4.d.ts +53 -0
  29. package/lib/common/src/grid/agGrid4/agGrid4.js +132 -0
  30. package/lib/common/src/grid/agGrid4/core.d.ts +56 -0
  31. package/lib/common/src/grid/agGrid4/core.js +127 -0
  32. package/lib/common/src/grid/agGrid4/index.d.ts +6 -0
  33. package/lib/common/src/grid/agGrid4/index.js +3 -0
  34. package/lib/common/src/grid/agGrid4/theme.d.ts +7 -0
  35. package/lib/common/src/grid/agGrid4/theme.js +18 -0
  36. package/lib/common/src/hooks/useAddDownAnyKey.d.ts +21 -2
  37. package/lib/common/src/hooks/useAddDownAnyKey.js +46 -9
  38. package/lib/common/src/hooks/useDraggable.d.ts +20 -2
  39. package/lib/common/src/hooks/useDraggable.js +146 -115
  40. package/lib/common/src/hooks/useOutside.d.ts +24 -4
  41. package/lib/common/src/hooks/useOutside.js +77 -26
  42. package/lib/common/src/logs/logs.d.ts +5 -2
  43. package/lib/common/src/logs/logs.js +18 -34
  44. package/lib/common/src/logs/logs3.d.ts +9 -9
  45. package/lib/common/src/logs/logs3.js +48 -39
  46. package/lib/common/src/logs/miniLogs.d.ts +3 -3
  47. package/lib/common/src/logs/miniLogs.js +28 -36
  48. package/lib/common/src/menu/menu.d.ts +18 -18
  49. package/lib/common/src/menu/menu.js +49 -25
  50. package/lib/common/src/menu/menuMouse.d.ts +2 -1
  51. package/lib/common/src/menu/menuMouse.js +5 -4
  52. package/lib/common/src/menu/menuR.d.ts +4 -3
  53. package/lib/common/src/menu/menuR.js +42 -38
  54. package/lib/common/src/myChart/1/myChart.d.ts +5 -5
  55. package/lib/common/src/myChart/1/myChart.js +58 -47
  56. package/lib/common/src/myChart/1/myChartTest.js +8 -4
  57. package/lib/common/src/myChart/chartEngine/chartEngineReact.d.ts +24 -27
  58. package/lib/common/src/myChart/chartEngine/chartEngineReact.js +189 -118
  59. package/lib/common/src/styles/styleGrid.d.ts +2 -1
  60. package/lib/common/src/styles/styleGrid.js +10 -12
  61. package/lib/common/src/styles/tokens.d.ts +39 -0
  62. package/lib/common/src/styles/tokens.js +40 -0
  63. package/lib/common/src/utils/applyTransactionAsyncUpdate.d.ts +7 -0
  64. package/lib/common/src/utils/applyTransactionAsyncUpdate.js +25 -19
  65. package/lib/common/src/utils/arrayPromise.d.ts +6 -0
  66. package/lib/common/src/utils/arrayPromise.js +7 -1
  67. package/lib/common/src/utils/cache.js +32 -24
  68. package/lib/common/src/utils/inputAutoStep.d.ts +1 -1
  69. package/lib/common/src/utils/inputAutoStep.js +30 -19
  70. package/lib/common/src/utils/mapMemory.js +15 -15
  71. package/lib/common/updateBy.d.ts +21 -2
  72. package/lib/common/updateBy.js +66 -131
  73. package/lib/index.js +0 -2
  74. package/lib/style/menuRight.css +13 -26
  75. package/lib/style/style.css +51 -39
  76. package/lib/style/tokens.css +34 -0
  77. package/package.json +2 -2
@@ -1,7 +1,16 @@
1
- import { useLayoutEffect, useSyncExternalStore } from "react";
2
- import { waitRun } from "wenay-common2";
1
+ import { useCallback, useLayoutEffect, useSyncExternalStore } from "react";
2
+ import { UseListen, waitRun } from "wenay-common2";
3
3
  export const map3 = new WeakMap();
4
4
  export const mapWait = new Map();
5
+ const updateListens = new WeakMap();
6
+ function getUpdateListen(obj) {
7
+ let listen = updateListens.get(obj);
8
+ if (!listen) {
9
+ listen = UseListen();
10
+ updateListens.set(obj, listen);
11
+ }
12
+ return listen;
13
+ }
5
14
  function getObserverState(obj) {
6
15
  let state = map3.get(obj);
7
16
  if (!state) {
@@ -10,68 +19,64 @@ function getObserverState(obj) {
10
19
  }
11
20
  return state;
12
21
  }
22
+ // reverse/lastOnly действуют только на React-подписчиков (useUpdateBy);
23
+ // императивные on-подписчики вызываются всегда все, в порядке подписки
13
24
  function triggerUpdate(obj, reverse = false, lastOnly = false) {
14
- const state = map3.get(obj);
15
- if (!state || state.listeners.size === 0)
25
+ const listen = updateListens.get(obj);
26
+ let state = map3.get(obj);
27
+ if ((!state || state.listeners.size === 0) && !listen?.[1].count())
16
28
  return;
29
+ state ??= getObserverState(obj);
17
30
  state.version += 1;
18
31
  let listenersArray = Array.from(state.listeners);
19
32
  if (lastOnly) {
20
33
  const last = listenersArray.at(-1);
21
34
  if (last)
22
35
  last(obj);
36
+ listen?.[0](obj);
23
37
  return;
24
38
  }
25
39
  if (reverse) {
26
40
  listenersArray.reverse();
27
41
  }
28
42
  listenersArray.forEach(listener => listener(obj));
43
+ listen?.[0](obj);
29
44
  }
30
- export function renderBy(a, ms) {
45
+ function schedule(a, ms, reverse = false, lastOnly = false) {
31
46
  if (ms) {
32
47
  (mapWait.get(a) || mapWait.set(a, waitRun()).get(a))
33
48
  .refreshAsync(ms, () => {
34
49
  mapWait.delete(a);
35
- triggerUpdate(a);
50
+ triggerUpdate(a, reverse, lastOnly);
36
51
  });
37
52
  }
38
53
  else
39
- triggerUpdate(a);
54
+ triggerUpdate(a, reverse, lastOnly);
55
+ }
56
+ export function renderBy(a, ms) {
57
+ schedule(a, ms);
40
58
  }
41
59
  export function renderByRevers(a, ms, reverse = true) {
42
- if (ms) {
43
- (mapWait.get(a) || mapWait.set(a, waitRun()).get(a))
44
- .refreshAsync(ms, () => {
45
- mapWait.delete(a);
46
- triggerUpdate(a, reverse);
47
- });
48
- }
49
- else
50
- triggerUpdate(a, reverse);
60
+ schedule(a, ms, reverse);
51
61
  }
52
62
  export function renderByLast(a, ms) {
53
- if (ms) {
54
- (mapWait.get(a) || mapWait.set(a, waitRun()).get(a))
55
- .refreshAsync(ms, () => {
56
- mapWait.delete(a);
57
- triggerUpdate(a, false, true);
58
- });
59
- }
60
- else
61
- triggerUpdate(a, false, true);
63
+ schedule(a, ms, false, true);
62
64
  }
63
65
  export function useUpdateBy(a, f) {
64
- useSyncExternalStore((listener) => {
66
+ // стабильный subscribe: без useCallback React переподписывается на каждый рендер,
67
+ // а удаление state из map3 при этом сбрасывало бы version → лишний форс-ререндер
68
+ const subscribe = useCallback((listener) => {
65
69
  if (f)
66
70
  return () => { };
67
71
  const state = getObserverState(a);
68
72
  state.listeners.add(listener);
69
73
  return () => {
70
74
  state.listeners.delete(listener);
71
- if (state.listeners.size === 0)
72
- map3.delete(a);
73
75
  };
74
- }, () => (f ? 0 : getObserverState(a).version));
76
+ }, [a, f]);
77
+ useSyncExternalStore(subscribe,
78
+ // getSnapshot must be pure: only read the version, subscribe creates the state
79
+ () => (f ? 0 : (map3.get(a)?.version ?? 0)));
75
80
  useLayoutEffect(() => {
76
81
  if (!f)
77
82
  return;
@@ -79,111 +84,41 @@ export function useUpdateBy(a, f) {
79
84
  state.listeners.add(f);
80
85
  return () => {
81
86
  state.listeners.delete(f);
82
- if (state.listeners.size === 0)
83
- map3.delete(a);
84
87
  };
85
88
  }, [a, f]);
86
89
  }
87
90
  export function updateBy(a, f) {
88
91
  useUpdateBy(a, f);
89
92
  }
90
- // import {useLayoutEffect, useState} from "react";
91
- // import {waitRun} from "wenay-common2";
92
- //
93
- // type tFunc2 = Map<object, (a?: any) => void>
94
- // export const map3 = new WeakMap<object, tFunc2>();
95
- // export const mapWait = new Map<object, ReturnType<typeof waitRun>>();
96
- //
97
- //
98
- // export function renderBy(a: object, ms?: number) {
99
- // const t = () => map3.get(a)?.forEach(e=>e(a))
100
- // if (ms) {
101
- // (mapWait.get(a) || mapWait.set(a, waitRun()).get(a)!)
102
- // .refreshAsync(ms, ()=> {
103
- // mapWait.delete(a)
104
- // t()})
105
- // }
106
- // else t()
107
- // }
108
- //
109
- // export function renderByRevers(a: object, ms?: number, reverse = true) {
110
- // const ar: ((a?: any) => void)[] = []
111
- // map3.get(a)?.forEach(e=>ar.push(e))
112
- // const t = reverse ? () => ar.reverse().forEach(e=>e(a))
113
- // : () => ar.forEach(e=>e(a))
114
- // if (ms) {
115
- // (mapWait.get(a) || mapWait.set(a, waitRun()).get(a)!)
116
- // .refreshAsync(ms, ()=> {
117
- // mapWait.delete(a)
118
- // t()})
119
- // }
120
- // else t()
121
- // }
122
- //
123
- // export function renderByLast(a: object, ms?: number) {
124
- // const ar: ((a?: any) => void)[] = []
125
- // map3.get(a)?.forEach(e=>ar.push(e))
126
- // const t = () => ar.at(-1)?.()
127
- // if (ms) {
128
- // (mapWait.get(a) || mapWait.set(a, waitRun()).get(a)!)
129
- // .refreshAsync(ms, ()=> {
130
- // mapWait.delete(a)
131
- // t()})
132
- // }
133
- // else t()
134
- // }
135
- //
136
- // // Главная функция
137
- // export function useUpdateBy<T extends object>(
138
- // a: T,
139
- // f?: React.Dispatch<React.SetStateAction<T>> | ((a: T) => void)
140
- // ) {
141
- // const [_, setCounter] = useState(0); // Состояние счётчика для обновлений
142
- //
143
- // // Эффект для работы с объектом и картой
144
- // useLayoutEffect(() => {
145
- // // Если передан второй аргумент `f`, используем его, иначе создаём default-функцию
146
- // const func = f ?? (() => {
147
- // setCounter(prev => prev + 1);
148
- // });
149
- //
150
- // // Получаем карту из глобальной переменной map3 или создаём новую для объекта `a`
151
- // const funcMap = map3.get(a) || map3.set(a, new Map()).get(a)!;
152
- // funcMap.set(func, func); // Привязываем функцию обновления к объекту `a`
153
- //
154
- // // Возвращаем функцию очистки (cleanup), чтобы удалить привязки
155
- // return () => {
156
- // funcMap.delete(func); // Удаляем функцию из карты
157
- // if (funcMap.size === 0) {
158
- // map3.delete(a); // Удаляем объект из `map3`, если он больше не нужен
159
- // }
160
- // };
161
- // }, [a, f]); // Указываем зависимости: объект `a` и функция `f`
162
- // }
163
- //
164
- // // Backward-compatible name (hook rules are the same).
165
- // export function updateBy<T extends object>(
166
- // a: T,
167
- // f?: React.Dispatch<React.SetStateAction<T>> | ((a: T) => void)
168
- // ) {
169
- // return useUpdateBy(a, f);
170
- // }
171
- //
172
- // // export function updateBy<T extends object>(a: T, f?: React.Dispatch<React.SetStateAction<T>> | ((a: T) => void)) {
173
- // // const t = useState(0)
174
- // // useLayoutEffect(() => {
175
- // // const func = f ?? ((a: T) =>{
176
- // // // без особых причин только для первого рендера - необходима два вызова, иначе - вызов не проходит
177
- // // if (t[0] == 0) {
178
- // // t[1](t[0]++)
179
- // // // t[1](t[0]++)
180
- // // }
181
- // // else t[1](t[0]++)
182
- // // })
183
- // // const r = (map3.get(a) || map3.set(a, new Map()).get(a)!)
184
- // // r.set(func, func)
185
- // // return ()=> {
186
- // // r?.delete(func)
187
- // // }
188
- // // },[true])
189
- // // }
93
+ const apiCache = new WeakMap();
94
+ export function createUpdateApi(obj) {
95
+ const cached = apiCache.get(obj);
96
+ if (cached)
97
+ return cached;
98
+ const [, listen] = getUpdateListen(obj);
99
+ const api = {
100
+ object: obj,
101
+ emit(ms) { renderBy(obj, ms); },
102
+ render(ms) { renderBy(obj, ms); },
103
+ renderReverse(ms, reverse = true) { renderByRevers(obj, ms, reverse); },
104
+ renderLast(ms) { renderByLast(obj, ms); },
105
+ on(listener) {
106
+ return listen.on((value) => listener(value));
107
+ },
108
+ subscribe(listener) {
109
+ return api.on(listener);
110
+ },
111
+ use(f) {
112
+ useUpdateBy(obj, f);
113
+ },
114
+ useSubscribe(f) {
115
+ useUpdateBy(obj, f);
116
+ },
117
+ };
118
+ apiCache.set(obj, api);
119
+ return api;
120
+ }
121
+ export function useUpdateByApi(obj, f) {
122
+ useUpdateBy(obj, f);
123
+ return createUpdateApi(obj);
124
+ }
package/lib/index.js CHANGED
@@ -1,3 +1 @@
1
1
  export * from "./common/api";
2
- import { test } from "./common/api";
3
- test();
@@ -1,18 +1,5 @@
1
- :root {
2
- --base-border: 1px solid rgba(255, 255, 255, 0.41);
3
- --base-color-hover: #fff;
4
- }
5
- :root {
6
- --menu-bg-color: rgba(12, 12, 12, 0.91);
7
- --menu-blur: 10px;
8
- --menu-border: var(--base-border);
9
- --menu-active-background: rgba(255, 255, 255, 0.23);
10
-
11
- --menu-item-color: var(--base-color-hover);
12
- --menu-item-hover-color: #101010;
13
- --menu-item-hover-bg-color: var(--base-color-hover);
14
-
15
- }
1
+ /* Tokens moved to tokens.css (same values) */
2
+ @import "./tokens.css";
16
3
 
17
4
  .menu-container{
18
5
  position: fixed;
@@ -74,8 +61,8 @@
74
61
  .submenu {
75
62
  background: var(--menu-bg-color);
76
63
 
77
- backdrop-filter: blur(var(--menu-blur)); /* Размытие */
78
- -webkit-backdrop-filter: blur(var(--menu-blur)); /* Для Safari */
64
+ backdrop-filter: blur(var(--menu-blur)); /* Blur */
65
+ -webkit-backdrop-filter: blur(var(--menu-blur)); /* For Safari */
79
66
 
80
67
  border: var(--menu-border);
81
68
  min-width: 200px;
@@ -85,11 +72,11 @@
85
72
  /*padding: 20px;*/
86
73
  /*margin: 20px;*/
87
74
  /*background-color: #fff;*/
88
- /*border: 1px solid #ddd; !* базовая граница, можно убрать *!*/
75
+ /*border: 1px solid #ddd; !* base border, can be removed *!*/
89
76
  cursor: pointer;
90
77
  }
91
78
 
92
- /* Псевдоэлемент для отрисовки обводки */
79
+ /* Pseudo-element for drawing the outline */
93
80
  .draggable-div::after {
94
81
  content: "";
95
82
  position: absolute;
@@ -102,19 +89,19 @@
102
89
  box-sizing: border-box;
103
90
  }
104
91
 
105
- /* Запуск анимации, когда зажата кнопка мыши */
92
+ /* Start the animation while the mouse button is held */
106
93
  .draggable-div.outline-animation::after {
107
94
  animation: running-line 0.5s linear forwards;
108
95
  }
109
96
 
110
- /* Если анимация успела завершиться, обводка остается */
97
+ /* If the animation completed, the outline remains */
111
98
  .draggable-div.outline-complete::after {
112
99
  border-color: #007bff;
113
- /* Чтобы псевдоэлемент точно отображал полную обводку */
100
+ /* Ensure the pseudo-element shows the full outline */
114
101
  clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
115
102
  }
116
103
 
117
- /* Анимация «бегущей линии» */
104
+ /* Running line animation */
118
105
  @keyframes running-line {
119
106
  0% {
120
107
  border-color: transparent;
@@ -122,15 +109,15 @@
122
109
  }
123
110
  25% {
124
111
  border-color: #007bff;
125
- /* Рисуем верхнюю линию */
112
+ /* Draw the top line */
126
113
  clip-path: polygon(0 0, 100% 0, 100% 0, 0 0);
127
114
  }
128
115
  50% {
129
- /* Добавляем правую сторону */
116
+ /* Add the right side */
130
117
  clip-path: polygon(0 0, 100% 0, 100% 100%, 100% 100%);
131
118
  }
132
119
  75% {
133
- /* Добавляем нижнюю сторону */
120
+ /* Add the bottom side */
134
121
  clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
135
122
  }
136
123
  100% {
@@ -1,21 +1,7 @@
1
- :root {
2
- /* Основные фоновые цвета */
3
- --color-bg-dark: #131821;
4
- --color-bg-light: #17202e;
1
+ /* Tokens moved to tokens.css (same values) */
2
+ @import "./tokens.css";
5
3
 
6
- /* Скролл */
7
- --color-scrollbar-track: rgba(255, 255, 255, 0);
8
- --color-scrollbar-thumb: #1d262c;
9
- /* альтернатива для MSTradeScroll */
10
- --color-scrollbar-thumb-alt: #4c4562;
11
-
12
- /* Основные текстовые/обводки */
13
- --color-text-base: #c4c4c4;
14
- --color-text-theme: #5D9FFA;
15
- --color-border-common: rgb(50, 62, 71);
16
- }
17
-
18
- /* Сбрасываем box-sizing */
4
+ /* Reset box-sizing */
19
5
  *,
20
6
  *::before,
21
7
  *::after {
@@ -24,7 +10,7 @@
24
10
  box-sizing: border-box;
25
11
  }
26
12
 
27
- /* Основные фоны */
13
+ /* Main backgrounds */
28
14
  html,
29
15
  .fon {
30
16
  background: var(--color-bg-dark);
@@ -33,16 +19,16 @@ html,
33
19
  background: var(--color-bg-light);
34
20
  }
35
21
 
36
- /* Стили прокрутки (scrollbar) */
22
+ /* Scrollbar styles */
37
23
  body::-webkit-scrollbar {
38
- width: 12px; /* ширина scrollbar */
24
+ width: 12px; /* scrollbar width */
39
25
  }
40
26
  ::-webkit-scrollbar-track {
41
- background: var(--color-scrollbar-track); /* цвет дорожки */
27
+ background: var(--color-scrollbar-track); /* track color */
42
28
  }
43
29
  ::-webkit-scrollbar-thumb {
44
- background-color: var(--color-scrollbar-thumb); /* цвет плашки */
45
- border-radius: 20px; /* закругления плашки */
30
+ background-color: var(--color-scrollbar-thumb); /* thumb color */
31
+ border-radius: 20px; /* thumb rounding */
46
32
  }
47
33
 
48
34
  .MSTradeScroll .ag-body-viewport::-webkit-scrollbar-track {
@@ -53,7 +39,7 @@ body::-webkit-scrollbar {
53
39
  border-radius: 20px;
54
40
  }
55
41
 
56
- /* Дублирующие селекторы scrollbar, если нужна поддержка под некоторыми движками */
42
+ /* Duplicate scrollbar selectors for engines that need them */
57
43
  *::-webkit-scrollbar {
58
44
  width: 12px;
59
45
  }
@@ -65,7 +51,7 @@ body::-webkit-scrollbar {
65
51
  border-radius: 20px;
66
52
  }
67
53
 
68
- /* Кнопки */
54
+ /* Buttons */
69
55
  .defButton {
70
56
  padding: 20px;
71
57
  display: block;
@@ -85,7 +71,7 @@ html {
85
71
  display: flex;
86
72
  }
87
73
 
88
- /* инпуты */
74
+ /* Inputs */
89
75
  .toNumberInput {
90
76
  width: 70px;
91
77
  margin-right: 10%;
@@ -94,7 +80,7 @@ input:invalid {
94
80
  box-shadow: 0 0 5px 1px red;
95
81
  }
96
82
 
97
- /* Блоки-кнопки, миниэлементы */
83
+ /* Button blocks, mini elements */
98
84
  .toButton,
99
85
  .miniEl,
100
86
  .toButtonA,
@@ -104,7 +90,7 @@ input:invalid {
104
90
  cursor: default;
105
91
  }
106
92
 
107
- /* Кнопки Switch */
93
+ /* Switch buttons */
108
94
  .LeftMenuParameters {
109
95
  font-size: 12px;
110
96
  min-height: 30px;
@@ -116,7 +102,7 @@ input:invalid {
116
102
  font-size: 12px;
117
103
  }
118
104
 
119
- /* Заполнение последнего дива на всю оставшуюся часть */
105
+ /* Fill the remaining space with the last div */
120
106
  .toSpace,
121
107
  .toSpaceColum {
122
108
  display: flex;
@@ -131,7 +117,7 @@ input:invalid {
131
117
  flex: 1 1 100%;
132
118
  }
133
119
 
134
- /* Кнопки */
120
+ /* Buttons */
135
121
  .toButton {
136
122
  padding: 8px 10px;
137
123
  height: 30px;
@@ -148,7 +134,7 @@ input:invalid {
148
134
  display: block;
149
135
  }
150
136
 
151
- /* Меню */
137
+ /* Menu */
152
138
  .MenuR {
153
139
  box-shadow: 0 0 20px 14px rgba(34, 60, 80, 0.2);
154
140
  margin-top: 4px;
@@ -178,7 +164,7 @@ input:invalid {
178
164
  border: solid 1px var(--color-border-common);
179
165
  }
180
166
 
181
- /* Наведение/активность */
167
+ /* Hover/activity */
182
168
  .toButtonA,
183
169
  .miniEl:hover {
184
170
  user-select: none;
@@ -208,7 +194,7 @@ input:invalid {
208
194
  color: var(--color-text-theme);
209
195
  }
210
196
 
211
- /* Элементы меню-индикаторы */
197
+ /* Menu indicator elements */
212
198
  .toIndicatorMenuButton {
213
199
  user-select: none;
214
200
  padding-left: 10px;
@@ -220,7 +206,7 @@ input:invalid {
220
206
  background: #3a4b57;
221
207
  }
222
208
 
223
- /* input-стили */
209
+ /* Input styles */
224
210
  .inputCan {
225
211
  -webkit-writing-mode: horizontal-tb !important;
226
212
  text-rendering: auto;
@@ -254,7 +240,7 @@ input:invalid {
254
240
  border-image: none;
255
241
  }
256
242
 
257
- /* Кнопки формы */
243
+ /* Form buttons */
258
244
  button[type="submit"] {
259
245
  background: #86b32d;
260
246
  border-bottom: 1px solid #5d7d1f;
@@ -270,7 +256,7 @@ input[type="color"] {
270
256
  display: block;
271
257
  }
272
258
 
273
- /* Основное тело */
259
+ /* Main body */
274
260
  body {
275
261
  color: var(--color-text-base);
276
262
  vertical-align: middle;
@@ -285,13 +271,13 @@ body {
285
271
  display: flex;
286
272
  }
287
273
 
288
- /* Текстовые блоки */
274
+ /* Text blocks */
289
275
  .toPTextIndicator {
290
276
  margin-block-start: 0.7em;
291
277
  margin-block-end: 0.7em;
292
278
  }
293
279
 
294
- /* React анимации появления/удаления */
280
+ /* React enter/exit animations */
295
281
  .example-exit {
296
282
  opacity: 1;
297
283
  transform: translateY(0px);
@@ -302,7 +288,7 @@ body {
302
288
  transition: 0.3s;
303
289
  }
304
290
 
305
- /* Доп. стили .msTradeAlt */
291
+ /* Additional .msTradeAlt styles */
306
292
  .msTradeAlt {
307
293
  font-size: 12px;
308
294
  cursor: default;
@@ -332,3 +318,29 @@ body {
332
318
  margin-top: -1px;
333
319
  margin-left: -1px;
334
320
  }
321
+
322
+ /* Window close button (DivRnd3 and others) */
323
+ .wenayCloseBtn {
324
+ width: 28px;
325
+ height: 28px;
326
+ display: flex;
327
+ align-items: center;
328
+ justify-content: center;
329
+ border-radius: 50%;
330
+ background: var(--color-bg-light);
331
+ border: 1px solid var(--color-border-common);
332
+ color: var(--color-text-base);
333
+ cursor: pointer;
334
+ user-select: none;
335
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35);
336
+ transition: background 0.15s, color 0.15s, transform 0.15s;
337
+ }
338
+ .wenayCloseBtn:hover {
339
+ background: #e5484d;
340
+ border-color: #e5484d;
341
+ color: #fff;
342
+ transform: scale(1.08);
343
+ }
344
+ .wenayCloseBtn:active {
345
+ transform: scale(0.95);
346
+ }
@@ -0,0 +1,34 @@
1
+ /* Shared library design tokens. Values are collected from style.css and menuRight.css
2
+ without changes. TS mirror for inline styles and ag-grid themes - src/common/src/styles/tokens.ts */
3
+ :root {
4
+ /* Main background colors */
5
+ --color-bg-dark: #131821;
6
+ --color-bg-light: #17202e;
7
+
8
+ /* Scroll */
9
+ --color-scrollbar-track: rgba(255, 255, 255, 0);
10
+ --color-scrollbar-thumb: #1d262c;
11
+ /* alternative for MSTradeScroll */
12
+ --color-scrollbar-thumb-alt: #4c4562;
13
+
14
+ /* Main text/outline colors */
15
+ --color-text-base: #c4c4c4;
16
+ --color-text-theme: #5D9FFA;
17
+ --color-border-common: rgb(50, 62, 71);
18
+
19
+ /* Menu base */
20
+ --base-border: 1px solid rgba(255, 255, 255, 0.41);
21
+ --base-color-hover: #fff;
22
+
23
+ /* Menu */
24
+ --menu-bg-color: rgba(12, 12, 12, 0.91);
25
+ --menu-blur: 10px;
26
+ --menu-border: var(--base-border);
27
+ --menu-active-background: rgba(255, 255, 255, 0.23);
28
+ --menu-item-color: var(--base-color-hover);
29
+ --menu-item-hover-color: #101010;
30
+ --menu-item-hover-bg-color: var(--base-color-hover);
31
+
32
+ /* Layers */
33
+ --wenay-z-modal: 9999;
34
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wenay-react2",
3
- "version": "1.0.19",
3
+ "version": "1.0.21",
4
4
  "description": "Common react",
5
5
  "strict": true,
6
6
  "main": "dist/index.js",
@@ -23,7 +23,7 @@
23
23
  "react": "^19.2.0",
24
24
  "react-dom": "^19.2.0",
25
25
  "react-rnd": "^10.5.3",
26
- "wenay-common2": "^1.0.28"
26
+ "wenay-common2": "^1.0.49"
27
27
  },
28
28
  "peerDependencies": {
29
29
  "react": "^19.2.0",