wenay-react2 1.0.40 → 1.0.42
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/doc/EXAMPLE_USAGE.md +971 -0
- package/doc/PROJECT_FUNCTIONALITY.md +405 -0
- package/doc/PROJECT_RULES.md +80 -0
- package/doc/WENAY_REACT2_RENAMES.md +177 -0
- package/doc/changes/v1.0.35.md +26 -0
- package/doc/changes/v1.0.37.md +13 -0
- package/doc/changes/v1.0.38.md +48 -0
- package/doc/changes/v1.0.39.md +35 -0
- package/doc/changes/v1.0.40.md +15 -0
- package/doc/changes/v1.0.41.md +36 -0
- package/doc/changes/v1.0.42.md +26 -0
- package/doc/progress/README.md +14 -0
- package/doc/progress/architecture-fix-queue.md +74 -0
- package/doc/progress/hook-controller-opportunities.md +367 -0
- package/doc/progress/hook-extraction-audit.md +195 -0
- package/doc/progress/public-surface-normalization.md +368 -0
- package/doc/progress/style-system-normalization.md +121 -0
- package/doc/target/README.md +33 -0
- package/doc/target/my.md +81 -0
- package/doc/wenay-react2-1.0.8.tgz +0 -0
- package/doc/wenay-react2-rare.md +807 -0
- package/doc/wenay-react2.md +539 -0
- package/lib/common/api.d.ts +1 -0
- package/lib/common/api.js +8 -4
- package/lib/common/src/components/Dnd/DragArea.d.ts +5 -0
- package/lib/common/src/components/Dnd/DragArea.js +5 -1
- package/lib/common/src/components/Dnd/FloatingWindow.d.ts +9 -5
- package/lib/common/src/components/Dnd/FloatingWindow.js +39 -97
- package/lib/common/src/components/Dnd/Resizable.d.ts +3 -7
- package/lib/common/src/components/Dnd/Resizable.js +4 -3
- package/lib/common/src/components/Menu/RightMenu.js +8 -4
- package/lib/common/src/components/Menu/RightMenuStore.d.ts +2 -2
- package/lib/common/src/components/Menu/RightMenuStore.js +5 -3
- package/lib/common/src/components/Modal/LeftModal.js +4 -2
- package/lib/common/src/components/Modal/ModalContextProvider.js +5 -16
- package/lib/common/src/components/MyResizeObserver.d.ts +24 -0
- package/lib/common/src/components/MyResizeObserver.js +49 -0
- package/lib/common/src/components/Overlay.d.ts +24 -0
- package/lib/common/src/components/Overlay.js +28 -0
- package/lib/common/src/components/Settings/SettingsDialog.js +21 -22
- package/lib/common/src/components/Toolbar/Toolbar.d.ts +1 -0
- package/lib/common/src/components/Toolbar/Toolbar.js +16 -23
- package/lib/common/src/grid/columnState/ColumnsMenu.js +4 -13
- package/lib/common/src/grid/columnState/columnGrid.d.ts +103 -0
- package/lib/common/src/grid/columnState/columnGrid.js +231 -0
- package/lib/common/src/grid/columnState/columnState.js +10 -9
- package/lib/common/src/grid/columnState/index.js +3 -0
- package/lib/common/src/hooks/useDraggable.d.ts +8 -0
- package/lib/common/src/hooks/useDraggable.js +13 -4
- package/lib/common/src/hooks/useOutside.d.ts +4 -1
- package/lib/common/src/hooks/useOutside.js +2 -1
- package/lib/common/src/logs/logs.d.ts +123 -5
- package/lib/common/src/logs/logs.js +218 -130
- package/lib/common/src/logs/logsController.d.ts +3 -0
- package/lib/common/src/styles/tokens.d.ts +7 -6
- package/lib/common/src/styles/tokens.js +8 -5
- package/lib/common/src/utils/cache.d.ts +12 -0
- package/lib/common/src/utils/cache.js +0 -0
- package/lib/common/src/utils/fixedOrder.d.ts +15 -0
- package/lib/common/src/utils/fixedOrder.js +30 -0
- package/lib/common/src/utils/index.d.ts +2 -0
- package/lib/common/src/utils/index.js +2 -0
- package/lib/common/src/utils/memoryStore.d.ts +3 -6
- package/lib/common/src/utils/memoryStore.js +1 -3
- package/lib/common/src/utils/persistedMaps.d.ts +16 -0
- package/lib/common/src/utils/persistedMaps.js +5 -0
- package/lib/common/src/utils/searchHistory.js +7 -6
- package/lib/common/src/utils/structEqual.d.ts +12 -0
- package/lib/common/src/utils/structEqual.js +40 -0
- package/lib/common/updateBy.d.ts +3 -0
- package/lib/common/updateBy.js +57 -22
- package/lib/style/menuRight.css +29 -23
- package/lib/style/style.css +73 -10
- package/lib/style/tokens.css +8 -4
- package/package.json +3 -2
|
@@ -7,9 +7,11 @@ export function createSearchHistory(opts) {
|
|
|
7
7
|
const max = Math.max(1, opts.max ?? 8);
|
|
8
8
|
const st = memoryGetOrCreate(opts.key, { items: [] });
|
|
9
9
|
const stApi = createUpdateApi(st);
|
|
10
|
-
|
|
10
|
+
/** Pure derivation - reads must not rewrite the persisted object (a getter that
|
|
11
|
+
* mutates state silently marks nothing dirty and surprises memoryCache diffing). */
|
|
12
|
+
function normalized() {
|
|
11
13
|
const seen = new Set();
|
|
12
|
-
|
|
14
|
+
return st.items
|
|
13
15
|
.map(normalizeSearchHistoryItem)
|
|
14
16
|
.filter(Boolean)
|
|
15
17
|
.filter(item => {
|
|
@@ -20,20 +22,19 @@ export function createSearchHistory(opts) {
|
|
|
20
22
|
return true;
|
|
21
23
|
})
|
|
22
24
|
.slice(0, max);
|
|
23
|
-
return st.items;
|
|
24
25
|
}
|
|
25
26
|
function emit() {
|
|
26
|
-
|
|
27
|
+
st.items = normalized(); // normalization happens on WRITE, announced below
|
|
27
28
|
stApi.render();
|
|
28
29
|
memoryMarkDirty(opts.key);
|
|
29
30
|
}
|
|
30
31
|
return {
|
|
31
32
|
get items() {
|
|
32
|
-
return
|
|
33
|
+
return normalized();
|
|
33
34
|
},
|
|
34
35
|
use() {
|
|
35
36
|
stApi.use();
|
|
36
|
-
return
|
|
37
|
+
return normalized();
|
|
37
38
|
},
|
|
38
39
|
add(value) {
|
|
39
40
|
const item = normalizeSearchHistoryItem(value);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Structural deep equality for plain config/data trees (objects, arrays, primitives).
|
|
2
|
+
*
|
|
3
|
+
* Replacement for the `JSON.stringify(a) == JSON.stringify(b)` idiom, with the same
|
|
4
|
+
* tolerance but none of its key-order sensitivity:
|
|
5
|
+
* - object key ORDER does not matter (stringify's false-positive "changed");
|
|
6
|
+
* - object props with `undefined` values count as absent (JSON drops them);
|
|
7
|
+
* - `NaN` equals `NaN` (JSON serializes both to `null`);
|
|
8
|
+
* - no serialization cost, early exit on first difference.
|
|
9
|
+
*
|
|
10
|
+
* Not for class instances / Maps / Sets / cycles - data that would not survive
|
|
11
|
+
* JSON round-tripping did not work with the stringify idiom either. */
|
|
12
|
+
export declare function structEqual(a: unknown, b: unknown): boolean;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Structural deep equality for plain config/data trees (objects, arrays, primitives).
|
|
2
|
+
*
|
|
3
|
+
* Replacement for the `JSON.stringify(a) == JSON.stringify(b)` idiom, with the same
|
|
4
|
+
* tolerance but none of its key-order sensitivity:
|
|
5
|
+
* - object key ORDER does not matter (stringify's false-positive "changed");
|
|
6
|
+
* - object props with `undefined` values count as absent (JSON drops them);
|
|
7
|
+
* - `NaN` equals `NaN` (JSON serializes both to `null`);
|
|
8
|
+
* - no serialization cost, early exit on first difference.
|
|
9
|
+
*
|
|
10
|
+
* Not for class instances / Maps / Sets / cycles - data that would not survive
|
|
11
|
+
* JSON round-tripping did not work with the stringify idiom either. */
|
|
12
|
+
export function structEqual(a, b) {
|
|
13
|
+
if (a === b)
|
|
14
|
+
return true;
|
|
15
|
+
if (typeof a == 'number' && typeof b == 'number')
|
|
16
|
+
return Number.isNaN(a) && Number.isNaN(b);
|
|
17
|
+
if (typeof a != 'object' || typeof b != 'object' || a == null || b == null)
|
|
18
|
+
return false;
|
|
19
|
+
const aArr = Array.isArray(a);
|
|
20
|
+
if (aArr != Array.isArray(b))
|
|
21
|
+
return false;
|
|
22
|
+
if (aArr) {
|
|
23
|
+
const x = a, y = b;
|
|
24
|
+
if (x.length != y.length)
|
|
25
|
+
return false;
|
|
26
|
+
for (let i = 0; i < x.length; i++)
|
|
27
|
+
if (!structEqual(x[i], y[i]))
|
|
28
|
+
return false;
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
const ao = a, bo = b;
|
|
32
|
+
const ka = Object.keys(ao).filter(k => ao[k] !== undefined);
|
|
33
|
+
const kb = Object.keys(bo).filter(k => bo[k] !== undefined);
|
|
34
|
+
if (ka.length != kb.length)
|
|
35
|
+
return false;
|
|
36
|
+
for (const k of ka)
|
|
37
|
+
if (!structEqual(ao[k], bo[k]))
|
|
38
|
+
return false;
|
|
39
|
+
return true;
|
|
40
|
+
}
|
package/lib/common/updateBy.d.ts
CHANGED
|
@@ -2,7 +2,10 @@ import React from "react";
|
|
|
2
2
|
type Listener = (a?: any) => void;
|
|
3
3
|
interface ObserverState {
|
|
4
4
|
listeners: Set<Listener>;
|
|
5
|
+
callbacks: Set<Listener>;
|
|
5
6
|
version: number;
|
|
7
|
+
running: boolean;
|
|
8
|
+
pending: boolean;
|
|
6
9
|
}
|
|
7
10
|
export declare const map3: WeakMap<object, ObserverState>;
|
|
8
11
|
export declare const mapWait: Map<object, {
|
package/lib/common/updateBy.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useCallback, useLayoutEffect, useSyncExternalStore } from "react";
|
|
1
|
+
import React, { useCallback, useLayoutEffect, useSyncExternalStore } from "react";
|
|
2
2
|
import { listen as createListen, waitRun } from "wenay-common2";
|
|
3
3
|
export const map3 = new WeakMap();
|
|
4
4
|
export const mapWait = new Map();
|
|
@@ -14,34 +14,59 @@ function getUpdateListen(obj) {
|
|
|
14
14
|
function getObserverState(obj) {
|
|
15
15
|
let state = map3.get(obj);
|
|
16
16
|
if (!state) {
|
|
17
|
-
state = { listeners: new Set(), version: 0 };
|
|
17
|
+
state = { listeners: new Set(), callbacks: new Set(), version: 0, running: false, pending: false };
|
|
18
18
|
map3.set(obj, state);
|
|
19
19
|
}
|
|
20
20
|
return state;
|
|
21
21
|
}
|
|
22
|
-
// reverse/lastOnly действуют только на React-подписчиков (
|
|
23
|
-
// императивные
|
|
24
|
-
function
|
|
22
|
+
// reverse/lastOnly действуют только на React-подписчиков (useSyncExternalStore);
|
|
23
|
+
// императивные f-колбэки вызываются всегда все, в порядке подписки, ДО React-нотификаторов
|
|
24
|
+
function runTriggerPass(obj, state, reverse, lastOnly) {
|
|
25
25
|
const listen = updateListens.get(obj);
|
|
26
|
-
let state = map3.get(obj);
|
|
27
|
-
if ((!state || state.listeners.size === 0) && !listen?.[1].count())
|
|
28
|
-
return;
|
|
29
|
-
state ??= getObserverState(obj);
|
|
30
26
|
state.version += 1;
|
|
31
|
-
|
|
27
|
+
// императивные f-колбэки: всегда все, в порядке подписки
|
|
28
|
+
Array.from(state.callbacks).forEach(callback => callback(obj));
|
|
29
|
+
const listenersArray = Array.from(state.listeners);
|
|
32
30
|
if (lastOnly) {
|
|
33
31
|
const last = listenersArray.at(-1);
|
|
34
32
|
if (last)
|
|
35
33
|
last(obj);
|
|
36
|
-
listen?.[0](obj);
|
|
37
|
-
return;
|
|
38
34
|
}
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
else {
|
|
36
|
+
if (reverse) {
|
|
37
|
+
listenersArray.reverse();
|
|
38
|
+
}
|
|
39
|
+
listenersArray.forEach(listener => listener(obj));
|
|
41
40
|
}
|
|
42
|
-
listenersArray.forEach(listener => listener(obj));
|
|
43
41
|
listen?.[0](obj);
|
|
44
42
|
}
|
|
43
|
+
const MAX_TRIGGER_PASSES = 100;
|
|
44
|
+
function triggerUpdate(obj, reverse = false, lastOnly = false) {
|
|
45
|
+
const listen = updateListens.get(obj);
|
|
46
|
+
let state = map3.get(obj);
|
|
47
|
+
if ((!state || (state.listeners.size === 0 && state.callbacks.size === 0)) && !listen?.[1].count())
|
|
48
|
+
return;
|
|
49
|
+
state ??= getObserverState(obj);
|
|
50
|
+
// реентерабельность: синхронный renderBy по тому же объекту изнутри слушателя
|
|
51
|
+
// коалесцируется — помечаем pending и выходим, текущая итерация сделает ещё проход
|
|
52
|
+
if (state.running) {
|
|
53
|
+
state.pending = true;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
state.running = true;
|
|
57
|
+
try {
|
|
58
|
+
for (let pass = 0; pass < MAX_TRIGGER_PASSES; pass++) {
|
|
59
|
+
state.pending = false;
|
|
60
|
+
runTriggerPass(obj, state, reverse, lastOnly);
|
|
61
|
+
if (!state.pending)
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
state.running = false;
|
|
67
|
+
state.pending = false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
45
70
|
function schedule(a, ms, reverse = false, lastOnly = false) {
|
|
46
71
|
if (ms) {
|
|
47
72
|
(mapWait.get(a) || mapWait.set(a, waitRun()).get(a))
|
|
@@ -63,29 +88,39 @@ export function renderByLast(a, ms) {
|
|
|
63
88
|
schedule(a, ms, false, true);
|
|
64
89
|
}
|
|
65
90
|
export function useUpdateBy(a, f) {
|
|
91
|
+
// f прокидывается через ref: inline-колбэк (новая identity на каждый рендер)
|
|
92
|
+
// не должен вызывать переподписку — регистрируется одна стабильная обёртка на (a)
|
|
93
|
+
const fRef = React.useRef(f);
|
|
94
|
+
fRef.current = f;
|
|
95
|
+
const hasF = !!f;
|
|
66
96
|
// стабильный subscribe: без useCallback React переподписывается на каждый рендер,
|
|
67
97
|
// а удаление state из map3 при этом сбрасывало бы version → лишний форс-ререндер
|
|
68
98
|
const subscribe = useCallback((listener) => {
|
|
69
|
-
if (
|
|
99
|
+
if (hasF)
|
|
70
100
|
return () => { };
|
|
71
101
|
const state = getObserverState(a);
|
|
72
102
|
state.listeners.add(listener);
|
|
73
103
|
return () => {
|
|
74
104
|
state.listeners.delete(listener);
|
|
75
105
|
};
|
|
76
|
-
}, [a,
|
|
106
|
+
}, [a, hasF]);
|
|
77
107
|
useSyncExternalStore(subscribe,
|
|
78
108
|
// getSnapshot must be pure: only read the version, subscribe creates the state
|
|
79
|
-
() => (
|
|
109
|
+
() => (hasF ? 0 : (map3.get(a)?.version ?? 0)));
|
|
80
110
|
useLayoutEffect(() => {
|
|
81
|
-
if (!
|
|
111
|
+
if (!hasF)
|
|
82
112
|
return;
|
|
83
113
|
const state = getObserverState(a);
|
|
84
|
-
|
|
114
|
+
// обёртка передаёт тот же мутированный объект — для ветки Dispatch<SetStateAction<T>>
|
|
115
|
+
// setState(тот же ref) React бэйлаутит без ререндера (см. UpdateCallback)
|
|
116
|
+
const wrapper = (obj) => {
|
|
117
|
+
fRef.current?.(obj);
|
|
118
|
+
};
|
|
119
|
+
state.callbacks.add(wrapper);
|
|
85
120
|
return () => {
|
|
86
|
-
state.
|
|
121
|
+
state.callbacks.delete(wrapper);
|
|
87
122
|
};
|
|
88
|
-
}, [a,
|
|
123
|
+
}, [a, hasF]);
|
|
89
124
|
}
|
|
90
125
|
export function updateBy(a, f) {
|
|
91
126
|
useUpdateBy(a, f);
|
package/lib/style/menuRight.css
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
right: 0;
|
|
8
8
|
}
|
|
9
9
|
.menu-container.activeM {
|
|
10
|
-
background: var(--menu-active-background);
|
|
10
|
+
background: var(--menu-active-background, var(--menu-item-active-bg-color, #262626));
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
.menu-button {
|
|
14
14
|
padding: 4px 10px;
|
|
15
|
-
color: var(--menu-item-color);
|
|
15
|
+
color: var(--menu-item-color, #fff);
|
|
16
16
|
font-size: 28px;
|
|
17
17
|
border: none;
|
|
18
18
|
background: transparent;
|
|
@@ -33,38 +33,44 @@
|
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
.dropdown-content {
|
|
36
|
-
background: var(--menu-bg-color);
|
|
37
|
-
border-top: var(--menu-border);
|
|
38
|
-
border-left: var(--menu-border);
|
|
39
|
-
border-right: var(--menu-border);
|
|
36
|
+
background: var(--menu-bg-color, #0c0c0c);
|
|
37
|
+
border-top: var(--menu-border, 1px solid rgba(255, 255, 255, 0.41));
|
|
38
|
+
border-left: var(--menu-border, 1px solid rgba(255, 255, 255, 0.41));
|
|
39
|
+
border-right: var(--menu-border, 1px solid rgba(255, 255, 255, 0.41));
|
|
40
40
|
user-select: none;
|
|
41
41
|
min-width: 50px;
|
|
42
42
|
height: min-content;
|
|
43
43
|
width: max-content;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
.menu-item {
|
|
47
|
-
min-height: 30px;
|
|
48
|
-
padding: 10px;
|
|
49
|
-
position: relative;
|
|
50
|
-
cursor: pointer;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
.menu-item
|
|
57
|
-
|
|
58
|
-
|
|
46
|
+
.menu-item {
|
|
47
|
+
min-height: 30px;
|
|
48
|
+
padding: 10px;
|
|
49
|
+
position: relative;
|
|
50
|
+
cursor: pointer;
|
|
51
|
+
color: var(--menu-item-color, #fff);
|
|
52
|
+
border-bottom: var(--menu-border, 1px solid rgba(255, 255, 255, 0.41));
|
|
53
|
+
transition: background 0.3s, color 0.3s;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.menu-item:hover,
|
|
57
|
+
.menu-item.force-hover {
|
|
58
|
+
background: var(--menu-item-hover-bg-color, #fff);
|
|
59
|
+
color: var(--menu-item-hover-color, #101010);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.menu-item:active {
|
|
63
|
+
background: var(--menu-item-pressed-bg-color, #f2c94c);
|
|
64
|
+
color: var(--menu-item-pressed-color, #101010);
|
|
59
65
|
}
|
|
60
66
|
|
|
61
67
|
.submenu {
|
|
62
|
-
background: var(--menu-bg-color);
|
|
68
|
+
background: var(--menu-bg-color, #0c0c0c);
|
|
63
69
|
|
|
64
|
-
backdrop-filter: blur(var(--menu-blur)); /* Blur */
|
|
65
|
-
-webkit-backdrop-filter: blur(var(--menu-blur)); /* For Safari */
|
|
70
|
+
backdrop-filter: blur(var(--menu-blur, 0px)); /* Blur */
|
|
71
|
+
-webkit-backdrop-filter: blur(var(--menu-blur, 0px)); /* For Safari */
|
|
66
72
|
|
|
67
|
-
border: var(--menu-border);
|
|
73
|
+
border: var(--menu-border, 1px solid rgba(255, 255, 255, 0.41));
|
|
68
74
|
min-width: 200px;
|
|
69
75
|
}
|
|
70
76
|
.draggable-div {
|
package/lib/style/style.css
CHANGED
|
@@ -136,11 +136,11 @@ input:invalid {
|
|
|
136
136
|
|
|
137
137
|
/* Menu */
|
|
138
138
|
.MenuR {
|
|
139
|
-
box-shadow: var(--menu-shadow);
|
|
139
|
+
box-shadow: var(--menu-shadow, 0 0 20px 14px rgba(34, 60, 80, 0.2));
|
|
140
140
|
margin-top: 4px;
|
|
141
141
|
min-width: 80px;
|
|
142
142
|
width: max-content;
|
|
143
|
-
background: var(--menu-bg-color);
|
|
143
|
+
background: var(--menu-bg-color, #0c0c0c);
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
.maxSize {
|
|
@@ -197,18 +197,24 @@ input:invalid {
|
|
|
197
197
|
menu-specific colors through the shared --menu-* token contract. */
|
|
198
198
|
.MenuR.toButton,
|
|
199
199
|
.MenuR.toButtonA {
|
|
200
|
-
color: var(--menu-item-color);
|
|
201
|
-
border-bottom: var(--menu-border);
|
|
200
|
+
color: var(--menu-item-color, #fff);
|
|
201
|
+
border-bottom: var(--menu-border, 1px solid rgba(255, 255, 255, 0.41));
|
|
202
202
|
}
|
|
203
203
|
.MenuR.toButtonA {
|
|
204
|
-
background: var(--menu-active-background);
|
|
204
|
+
background: var(--menu-active-background, var(--menu-item-active-bg-color, #262626));
|
|
205
|
+
color: var(--menu-item-active-color, var(--menu-item-color, #fff));
|
|
205
206
|
}
|
|
206
207
|
.MenuR.toButton:hover,
|
|
207
|
-
.MenuR.toButton:active,
|
|
208
208
|
.MenuR.toButtonA:hover {
|
|
209
|
-
background: var(--menu-item-hover-bg-color);
|
|
210
|
-
color: var(--menu-item-hover-color);
|
|
211
|
-
border-bottom: var(--menu-border);
|
|
209
|
+
background: var(--menu-item-hover-bg-color, #fff);
|
|
210
|
+
color: var(--menu-item-hover-color, #101010);
|
|
211
|
+
border-bottom: var(--menu-border, 1px solid rgba(255, 255, 255, 0.41));
|
|
212
|
+
}
|
|
213
|
+
.MenuR.toButton:active,
|
|
214
|
+
.MenuR.toButtonA:active {
|
|
215
|
+
background: var(--menu-item-pressed-bg-color, #f2c94c);
|
|
216
|
+
color: var(--menu-item-pressed-color, #101010);
|
|
217
|
+
border-bottom: var(--menu-border, 1px solid rgba(255, 255, 255, 0.41));
|
|
212
218
|
}
|
|
213
219
|
|
|
214
220
|
/* Menu indicator elements */
|
|
@@ -745,6 +751,63 @@ body {
|
|
|
745
751
|
overflow: auto;
|
|
746
752
|
}
|
|
747
753
|
|
|
754
|
+
/* Column grid kit layout (createColumnGrid.View). */
|
|
755
|
+
.wenayColumnGrid {
|
|
756
|
+
position: relative;
|
|
757
|
+
display: grid;
|
|
758
|
+
gap: var(--cols-grid-gap, 8px);
|
|
759
|
+
min-width: 0;
|
|
760
|
+
}
|
|
761
|
+
.wenayColumnGridControls,
|
|
762
|
+
.wenayColumnGridBody {
|
|
763
|
+
min-width: 0;
|
|
764
|
+
}
|
|
765
|
+
.wenayColumnGridControls_dots {
|
|
766
|
+
position: absolute;
|
|
767
|
+
left: var(--cols-grid-dots-x, 10px);
|
|
768
|
+
right: var(--cols-grid-dots-x, 10px);
|
|
769
|
+
bottom: var(--cols-grid-dots-bottom, 10px);
|
|
770
|
+
z-index: 3;
|
|
771
|
+
}
|
|
772
|
+
.wenayColumnGrid_cards.wenayColumnGrid_controls_dots .wenayCardListItem:last-child {
|
|
773
|
+
padding-bottom: var(--cols-grid-dots-card-bottom-padding, 92px);
|
|
774
|
+
}
|
|
775
|
+
.wenayColumnGridDots {
|
|
776
|
+
padding: var(--cols-grid-dots-padding, 6px 8px 8px);
|
|
777
|
+
border: 1px solid transparent;
|
|
778
|
+
border-radius: 8px;
|
|
779
|
+
background: transparent;
|
|
780
|
+
box-shadow: none;
|
|
781
|
+
backdrop-filter: none;
|
|
782
|
+
}
|
|
783
|
+
.wenayColumnGridDots .wenayColDotsHead {
|
|
784
|
+
justify-content: flex-end;
|
|
785
|
+
gap: 0;
|
|
786
|
+
margin-bottom: 2px;
|
|
787
|
+
font-size: 11px;
|
|
788
|
+
}
|
|
789
|
+
.wenayColumnGridDots .wenayColDotsTrack {
|
|
790
|
+
height: 48px;
|
|
791
|
+
margin: 0 16px;
|
|
792
|
+
}
|
|
793
|
+
.wenayColumnGridDots .wenayColDotsMeta,
|
|
794
|
+
.wenayColumnGridDots .wenayColDotsSpacer {
|
|
795
|
+
display: none;
|
|
796
|
+
}
|
|
797
|
+
.wenayColumnGridDots .wenayColDotsSort {
|
|
798
|
+
width: 32px;
|
|
799
|
+
height: 28px;
|
|
800
|
+
padding: 0;
|
|
801
|
+
font-size: 0;
|
|
802
|
+
opacity: 0.82;
|
|
803
|
+
background: transparent;
|
|
804
|
+
}
|
|
805
|
+
.wenayColumnGridDots .wenayColDotsSort::before {
|
|
806
|
+
content: "⇅";
|
|
807
|
+
font-size: 16px;
|
|
808
|
+
line-height: 1;
|
|
809
|
+
}
|
|
810
|
+
|
|
748
811
|
/* Column state compact menu (ColumnsMenu/MenuStrip). Visual defaults moved from
|
|
749
812
|
component inline styles; runtime drag transforms remain inline. */
|
|
750
813
|
.wenayColsMenu,
|
|
@@ -1162,4 +1225,4 @@ body {
|
|
|
1162
1225
|
.wenaySegBtnActive {
|
|
1163
1226
|
background: rgba(255, 255, 255, 0.16);
|
|
1164
1227
|
color: #fff;
|
|
1165
|
-
}
|
|
1228
|
+
}
|
package/lib/style/tokens.css
CHANGED
|
@@ -21,13 +21,17 @@
|
|
|
21
21
|
--base-color-hover: #fff;
|
|
22
22
|
|
|
23
23
|
/* Menu */
|
|
24
|
-
--menu-bg-color:
|
|
25
|
-
--menu-blur:
|
|
24
|
+
--menu-bg-color: #0c0c0c;
|
|
25
|
+
--menu-blur: 0px;
|
|
26
26
|
--menu-border: var(--base-border);
|
|
27
|
-
--menu-active-background: rgba(255, 255, 255, 0.23);
|
|
28
27
|
--menu-item-color: var(--base-color-hover);
|
|
28
|
+
--menu-item-active-bg-color: #262626;
|
|
29
|
+
--menu-item-active-color: var(--base-color-hover);
|
|
30
|
+
--menu-active-background: var(--menu-item-active-bg-color);
|
|
29
31
|
--menu-item-hover-color: #101010;
|
|
30
|
-
--menu-item-hover-bg-color: var(--base-color-hover);
|
|
32
|
+
--menu-item-hover-bg-color: var(--base-color-hover);
|
|
33
|
+
--menu-item-pressed-color: #101010;
|
|
34
|
+
--menu-item-pressed-bg-color: #f2c94c;
|
|
31
35
|
--menu-outline-color: #007bff;
|
|
32
36
|
|
|
33
37
|
/* Menu shadow (was a literal in .MenuR) */
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wenay-react2",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.42",
|
|
4
4
|
"description": "Common react",
|
|
5
5
|
"strict": true,
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"files": [
|
|
9
9
|
"lib/**/*",
|
|
10
|
+
"doc/**/*",
|
|
10
11
|
"!**/*.tsbuildinfo"
|
|
11
12
|
],
|
|
12
13
|
"author": "wenay",
|
|
@@ -23,7 +24,7 @@
|
|
|
23
24
|
"react": "^19.2.0",
|
|
24
25
|
"react-dom": "^19.2.0",
|
|
25
26
|
"react-rnd": "^10.5.3",
|
|
26
|
-
"wenay-common2": "^1.0.
|
|
27
|
+
"wenay-common2": "^1.0.70"
|
|
27
28
|
},
|
|
28
29
|
"peerDependencies": {
|
|
29
30
|
"react": "^19.2.0",
|