wenay-react2 1.0.39 → 1.0.41

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 (54) hide show
  1. package/doc/EXAMPLE_USAGE.md +915 -0
  2. package/doc/PROJECT_FUNCTIONALITY.md +401 -0
  3. package/doc/PROJECT_RULES.md +80 -0
  4. package/doc/WENAY_REACT2_RENAMES.md +177 -0
  5. package/doc/changes/v1.0.35.md +26 -0
  6. package/doc/changes/v1.0.37.md +13 -0
  7. package/doc/changes/v1.0.38.md +48 -0
  8. package/doc/changes/v1.0.39.md +35 -0
  9. package/doc/changes/v1.0.40.md +15 -0
  10. package/doc/changes/v1.0.41.md +13 -0
  11. package/doc/progress/README.md +14 -0
  12. package/doc/progress/hook-controller-opportunities.md +367 -0
  13. package/doc/progress/hook-extraction-audit.md +195 -0
  14. package/doc/progress/public-surface-normalization.md +368 -0
  15. package/doc/progress/style-system-normalization.md +121 -0
  16. package/doc/target/README.md +33 -0
  17. package/doc/target/my.md +109 -0
  18. package/doc/wenay-react2-1.0.8.tgz +0 -0
  19. package/doc/wenay-react2-rare.md +702 -0
  20. package/doc/wenay-react2.md +475 -0
  21. package/lib/common/src/components/Dnd/FloatingWindow.d.ts +29 -12
  22. package/lib/common/src/components/Dnd/FloatingWindow.js +100 -91
  23. package/lib/common/src/components/Menu/RightMenu.d.ts +28 -1
  24. package/lib/common/src/components/Menu/RightMenu.js +62 -35
  25. package/lib/common/src/components/Modal/LeftModal.js +5 -4
  26. package/lib/common/src/components/Modal/Modal.js +8 -7
  27. package/lib/common/src/components/ParamsEditor.d.ts +15 -0
  28. package/lib/common/src/components/ParamsEditor.js +45 -18
  29. package/lib/common/src/components/Settings/SettingsDialog.d.ts +68 -6
  30. package/lib/common/src/components/Settings/SettingsDialog.js +61 -12
  31. package/lib/common/src/components/Toolbar/Toolbar.js +64 -19
  32. package/lib/common/src/components/UiSlot/UiSlot.js +5 -4
  33. package/lib/common/src/grid/columnState/columnState.js +8 -6
  34. package/lib/common/src/hooks/useKeyboard.js +4 -3
  35. package/lib/common/src/logs/logs.d.ts +40 -133
  36. package/lib/common/src/logs/logs.js +96 -66
  37. package/lib/common/src/logs/logsContext.d.ts +26 -0
  38. package/lib/common/src/logs/logsContext.js +25 -20
  39. package/lib/common/src/logs/logsController.d.ts +88 -0
  40. package/lib/common/src/logs/logsController.js +54 -0
  41. package/lib/common/src/logs/miniLogs.d.ts +69 -3
  42. package/lib/common/src/logs/miniLogs.js +70 -15
  43. package/lib/common/src/menu/menu.d.ts +15 -3
  44. package/lib/common/src/menu/menu.js +81 -17
  45. package/lib/common/src/menu/menuMouse.d.ts +18 -0
  46. package/lib/common/src/menu/menuMouse.js +43 -1
  47. package/lib/common/src/styles/tokens.d.ts +7 -6
  48. package/lib/common/src/styles/tokens.js +8 -5
  49. package/lib/common/src/utils/memoryStore.d.ts +1 -10
  50. package/lib/common/src/utils/searchHistory.js +4 -3
  51. package/lib/style/menuRight.css +29 -23
  52. package/lib/style/style.css +15 -9
  53. package/lib/style/tokens.css +8 -4
  54. package/package.json +50 -49
@@ -0,0 +1,121 @@
1
+ # Style system normalization
2
+
3
+ Status: verify; default inventory and column-state scoped token fixes implemented.
4
+
5
+ ## Source
6
+
7
+ User clarification: compatibility can be an aggressive migration when it is
8
+ clearly recorded in changelog, but default styles are dangerous to remove.
9
+ If default styles disappear, the project can become visually broken even when
10
+ the TypeScript/API migration is understandable.
11
+
12
+ ## Standard
13
+
14
+ - Shared primitives must keep a usable default visual style.
15
+ - A default style may be changed, but not silently removed.
16
+ - Removing/replacing a default class requires a replacement class/token path,
17
+ changelog entry, and migration note.
18
+ - New shared visual rules should use CSS custom properties first.
19
+ - Runtime geometry may stay inline when it is state-derived, but color, spacing,
20
+ border, shadow, font, and hover/active states should move to classes/tokens.
21
+ - Apps may override variables; primitives should not require apps to copy a full
22
+ CSS block to remain usable.
23
+
24
+ ## Token direction
25
+
26
+ Current prefixes are a good start:
27
+
28
+ - `--color-*`
29
+ - `--menu-*`
30
+ - `--wnd-*`
31
+ - `--dlg-*`
32
+ - `--tb-*`
33
+ - `--logs-*`
34
+ - `--cols-menu-*` for compact `ColumnsMenu/MenuStrip` visuals.
35
+ - `--cols-dots-*` for `ColumnDots` visuals.
36
+ - `--cols-card-*` for `CardList` visuals.
37
+
38
+ Likely next prefixes:
39
+
40
+ - `--cols-*` remains a family prefix; concrete prefixes now use `--cols-menu-*`, `--cols-dots-*`, and `--cols-card-*`.
41
+ - `--input-*` for generic input/panel defaults if they stay public.
42
+ - `--param-*` for `ParamsEditor` if it remains a shared primitive.
43
+
44
+ ## First audit candidates
45
+
46
+ - `src/style/style.css`: old button/menu classes, `FloatingWindow`, `SettingsDialog`, `Toolbar`, `ColumnDots/CardList`, and raw hover colors.
47
+ - `src/style/menuRight.css`: right-menu visual contract and default state styles.
48
+ - `src/common/src/grid/columnState/*`: finish deciding whether mobile/card
49
+ visuals need `--cols-*` tokens.
50
+ - `src/common/src/components/ParamsEditor.tsx`: move reusable editor visuals
51
+ out of component-owned inline styles if the API remains public.
52
+ - `src/common/src/components/Input.tsx`: decide whether old input panels are
53
+ compatibility-only or need a proper tokenized default.
54
+
55
+ ## Acceptance
56
+
57
+ - Default visual contract documented per public primitive group.
58
+ - Token prefixes chosen before broad style rewrites.
59
+ - No removal of default classes without replacement and changelog.
60
+ - Scoped visual QA cards checked before and after style migration.
61
+ ## 2026-07-09 default style contract inventory
62
+
63
+ Source of truth:
64
+
65
+ - CSS tokens: `src/style/tokens.css`.
66
+ - TS mirror for inline styles/theme builders: `src/common/src/styles/tokens.ts`.
67
+ - Shared runtime CSS: `src/style/style.css` and `src/style/menuRight.css`.
68
+ - Generated `dist/lib/style/*` is build output, not the edit target.
69
+
70
+ Public/default visual contracts:
71
+
72
+ - `Menu` / `MenuR` / mouse context menu: legacy `.MenuR`, `.toButton`, `.toButtonA` classes remain; colors/shadow/borders are already routed through `--menu-*` tokens. Keep the old class names as compatibility surface.
73
+ - `RightMenu`: default classes `.menu-container`, `.menu-button`, `.dropdown-content`, `.menu-item`, `.submenu`, `.draggable-div` live in `src/style/menuRight.css` and already consume `--menu-*` / `--menu-outline-color`.
74
+ - `FloatingWindow`: `.wenayWnd*` and `.wenayCloseBtn` live in `src/style/style.css`; defaults intentionally preserve the old transparent/striped window while allowing `--wnd-*` theme overrides.
75
+ - `SettingsDialog`: `.wenayDlg*` classes live in `src/style/style.css`; default look is dark and tokenized through `--dlg-*` plus selected `--wnd-*` bridge variables on `.wenayDlgWindow`.
76
+ - `Toolbar` / `createToolbar`: `.wenayTb*` classes live in `src/style/style.css`; defaults consume `--tb-*`; stand-specific skins should override through wrapper classes, not by changing shared defaults.
77
+ - `Logs`: `src/common/src/logs/logStyles.ts` maps inline logger chrome to `--logs-*`; this is an accepted transitional contract while old logger JSX stays inline-heavy.
78
+ - `ColumnDots` / `CardList`: `.wenayColDots*` and `.wenayCardList*` classes live in `src/style/style.css`; restored card-29 defaults are now tokenized through `--cols-dots-*` / `--cols-card-*` with the same fallback values.
79
+ - `ColumnsMenu` / `MenuStrip`: behavior is already headless/presentation split. Visual button/container/divider states now use `.wenayColsMenu*` classes and `--cols-menu-*` tokens with the exact previous GitHub-like defaults; runtime reorder transform stays inline.
80
+ - `ParamsEditor`: public and still mostly old class + inline style based (`toIndicatorMenuButton`, `miniEl`, `toButtonEasy`, `inputCan`). Do not token-migrate broadly until hook/API direction is decided; candidate prefix `--param-*`.
81
+ - `Input` modal helpers: public compatibility helpers over `FloatingWindow`, `.msTradeAlt`, `.msTradeActive`, `.inputCan`, inline panel spacing. Candidate prefix `--input-*`, but may remain compatibility-only if newer app surfaces replace them.
82
+
83
+ Done scoped fix:
84
+
85
+ - `ColumnsMenu/MenuStrip` visual button/container/divider styles moved to classes/tokens; runtime reorder transform/drag geometry remains inline.
86
+
87
+ Done scoped fixes:
88
+
89
+ - `ColumnsMenu/MenuStrip` visual button/container/divider styles moved to classes/tokens; runtime reorder transform/drag geometry remains inline.
90
+ - `ColumnDots/CardList` restored card-29 defaults moved to `--cols-dots-*` / `--cols-card-*` variables with unchanged fallback values.
91
+
92
+ Next scoped candidate:
93
+
94
+ - Leave `ParamsEditor` / `Input` broad visual migration until the hook-first/API direction is clearer; only do bug-level style fixes there.
95
+ ## 2026-07-09 scoped fix - ColumnsMenu/MenuStrip tokens
96
+
97
+ Implemented the compact column menu style contract:
98
+
99
+ - Added `--cols-menu-*` defaults to `src/style/tokens.css` and the TS mirror in `src/common/src/styles/tokens.ts`.
100
+ - Added `.wenayColsMenu*` classes in `src/style/style.css` for container/list/button states, fixed/drag shadow, text abbreviation, marks, and divider.
101
+ - Updated `src/common/src/grid/columnState/ColumnsMenu.tsx` so visual state uses classes; only consumer `style` and `useReorder` runtime transform remain inline.
102
+
103
+ Verification: `npx tsc -p tsconfig.qa-check.json --noEmit`; `npm run testjest -- --runInBand`; `npm run build`; `git diff --check`.
104
+ ## 2026-07-09 scoped fix - ColumnDots/CardList tokens
105
+
106
+ Implemented the mobile/card column-state style contract:
107
+
108
+ - Added `--cols-dots-*` and `--cols-card-*` defaults to `src/style/tokens.css` and the TS mirror in `src/common/src/styles/tokens.ts`.
109
+ - Rewrote `.wenayColDots*` and `.wenayCardList*` values in `src/style/style.css` to use variables with the exact previous fallbacks.
110
+ - Kept component code unchanged; `ColumnDots` runtime geometry (`left`, drag transform) remains inline in the component where it belongs.
111
+
112
+ Verification: `npx tsc -p tsconfig.qa-check.json --noEmit`; `npm run testjest -- --runInBand`; `npm run build`; `git diff --check`.
113
+ ## 2026-07-09 — Menu default contrast restore
114
+
115
+ Сделано:
116
+ - `--menu-bg-color` возвращён к непрозрачному dark fallback `#0c0c0c`, `--menu-blur` по умолчанию `0px`;
117
+ - добавлены `--menu-item-active-*` и `--menu-item-pressed-*` tokens, старый `--menu-active-background` оставлен alias/fallback;
118
+ - `MenuR` / mouse context menu and `RightMenu` CSS получили hard fallbacks: default dark background, white text, hover white with dark text, pressed yellow-ish contrast state;
119
+ - причина: рабочие проекты могут ещё не переопределять новые CSS variables, поэтому дефолт не должен становиться glass/transparent.
120
+
121
+ Проверка: CSS-only visual contract; прогнать `tsc`/`build`, card 4 вручную открыть правой кнопкой.
@@ -0,0 +1,33 @@
1
+ # Target Backlog Rules
2
+
3
+ `doc/target` is the durable task backlog for dictated or imported work. It is not a scratchpad and it is not a changelog.
4
+
5
+ ## Files
6
+
7
+ - `doc/target/my.md` is the user-owned inbox/queue for dictated tasks. Keep it clean and actionable.
8
+ - `target/*.md` are source prompt files imported into this repo. Treat them as task specs; do not edit or delete them just to mark progress unless the user asks for that exact cleanup.
9
+ - `doc/progress/*.md` are temporary working notes for an active task. They may be deleted when the task is finished, so they must never be the only place where queue status lives.
10
+ - `doc/changes/vX.Y.Z.md` records durable completed changes when code, public docs, theme contracts, dependencies, or policy changed.
11
+
12
+ ## Workflow
13
+
14
+ 1. When the user says to start from `target`, read this README first, then `doc/target/my.md`, then relevant files under `target/`.
15
+ 2. Before coding, normalize dictated text into concrete tasks in `doc/target/my.md`: a short title, current status, source note, and acceptance checks if they are known.
16
+ 3. When taking a task, move it to `In Progress` in `doc/target/my.md` and point to the progress file if one is created.
17
+ 4. Use `doc/progress/<task>.md` only for checkpoints, decisions, blockers, and verification while work is active.
18
+ 5. When implementation is believed complete, move the task to `Verify` in `doc/target/my.md` with the concrete checks that prove it: commands, QA stand checks, screenshots, or manual acceptance points.
19
+ 6. Remove a task from `doc/target/my.md` only after `Verify` checks pass and the durable result exists: code/docs are updated, verification is recorded, and changelog is updated when required.
20
+ 7. If the task is paused or blocked, leave it in `doc/target/my.md` under `In Progress` or `Blocked` with the next concrete action. Do not delete the progress file in that case.
21
+ 8. If a task from `target/*.md` is found already implemented, move it to `Verify` first and check its acceptance criteria before removing it. Do not rely on a deleted progress file as proof.
22
+
23
+ ## Status Sections For `my.md`
24
+
25
+ Use these sections:
26
+
27
+ - `Inbox` - raw or lightly cleaned tasks not yet triaged.
28
+ - `Ready` - concrete tasks that can be started.
29
+ - `In Progress` - the task currently being worked on, with a progress-file link when applicable.
30
+ - `Verify` - implementation is believed complete, but acceptance checks still need to be run or reviewed.
31
+ - `Blocked` - tasks waiting for user input, another repository, credentials, or an external change.
32
+
33
+ Completed tasks are normally removed from `my.md`; the final response, commit message, and changelog carry the durable completion record.
@@ -0,0 +1,109 @@
1
+ # Target — очередь задач
2
+
3
+ Правила ведения: [README.md](README.md). Ниже — статус по задачам; **исходные надиктовки сохранены дословно в конце файла** (ничего не удаляю).
4
+
5
+ ## In Progress
6
+
7
+ - **Второй проход по публичной поверхности `wenay-react2`: нормализация внутренних слоёв библиотеки** — идём от простых useful passes к более рискованным; сомнительные задачи пропускаем и помечаем.
8
+ - Прогресс: [../progress/public-surface-normalization.md](../progress/public-surface-normalization.md)
9
+ - Правило прохода: обновлять не только production-код, но и `doc/EXAMPLE_USAGE.md`, `src/common/testUseReact/qa.tsx` cards, `replayVideo.tsx`, `agGrid4/example.tsx`/docs, если меняется canonical usage; если пример уже корректен — записывать, что менять не нужно.
10
+ - Hook/controller-first стандарт: новый reusable функционал проектировать через `use*` hook или `create*` controller с API управления; визуальный компонент делать тонким слоем сверху, старое имя оставлять compatibility wrapper, если это не ломает код.
11
+ - Оценка задач: эффективность high/medium/low, простота simple/medium/hard, риск low/medium/high. Low-effectiveness или hard/high-risk без явного выигрыша пропускать и помечать причиной.
12
+ - Сделано: `useKeyboard.ts` переведён с прямого `renderBy(keyboardState)` на `createUpdateApi(keyboardState)`; публичный `keyboard` / `useKeyboard` API не менялся.
13
+ - Сделано: `MiniLogs` / `PageLogs` используют `colDefCentered` + локальный `wrapText: true` вместо ручного `defaultColDef`.
14
+ - Сделано: `MiniLogs` / `PageLogs` переведены с raw `AgGridReact` на `AgGridTable` без переписывания logger state/timing; card 9 готова для ручной проверки.
15
+ - Сделано: `createModalElementStore` / `createModalRenderStore` переведены с прямого `renderBy/updateBy(data)` на `createUpdateApi(data)` без изменения публичного compatibility API.
16
+ - Сделано: `createUiSlot` переведён с прямого `renderBy/updateBy(st)` на `createUpdateApi(st)`; card 21 проверена как usage-пример, менять не нужно.
17
+ - Сделано: `Toolbar.tsx` density registry переведён с прямого `renderBy/updateBy(densities)` на `createUpdateApi(densities)`; card 25 проверена как usage-пример, менять не нужно.
18
+ - Сделано: `SettingsDialog.tsx` section registry переведён с прямого `renderBy/updateBy(registry)` на `createUpdateApi(registry)`; card 20 проверена как usage-пример, менять не нужно; layout-store пропущен как low-effectiveness без явного consumer.
19
+ - Сделано: `columnState.ts` runtime `rt` (`present/presentGate`) и persisted `st` переведены на `createUpdateApi`; cards 28-31 проверены как usage-примеры, менять не нужно.
20
+ - Сделано: `createSearchHistory` переведён на `createUpdateApi`; публичный API истории поиска не менялся.
21
+ - Сделано: `createToolbar` local persisted store `st` переведён на `createUpdateApi`; `sourceMode`, external source hook и memory dirty flow не менялись.
22
+ - Сделано: `FloatingWindow.tsx` open-window z-index registry переведён на `createUpdateApi`; drag/resize geometry не менялась.
23
+ - Сделано: `LeftModal.tsx` menuStore переведён на `createUpdateApi`; compatibility `ApiLeftMenu.renderBy()` сохранён.
24
+ - Сделано: отдельный audit-pass по hook/controller-first кандидатам записан в [../progress/hook-controller-opportunities.md](../progress/hook-controller-opportunities.md); в очередь попали только задачи с понятной пользой/риском, сомнительные отмечены как skip.
25
+ - Сделано: `MiniLogs` layered redesign — добавлены `useMiniLogsTable`, `MiniLogsView`, `MiniLogsTable`, старый `MiniLogs` оставлен compatibility wrapper; store/history намеренно не добавлялись без consumer.
26
+ - Сделано: `Menu` action-level stats — добавлен явный `actionKey`, `actionTotals`/`actions` counters, focused tests и QA card 4; полный `useMenuActionController` split отложен как отдельный более крупный pass.
27
+ - Сделано: `RightMenu` cleanup — добавлен `useRightMenuController`, `DropdownMenu` оставлен compatibility wrapper, `createRightMenuController().Render` сохранён; registry rewrite пропущен как низкоэффективный без нового consumer.
28
+ - Сделано: `ParamsEditor` first controller layer — добавлен `useParamsEditorController` для draft clone / immediate+delayed notify / expand / cleanup; full renderer/view split и `ParamsEdit` async-save hook отложены как hard/high-risk без отдельного pass.
29
+ - Сделано: Logs inventory + low-risk primitive reuse — `logsContext.LogsTable` переведён на `AgGridTable`/`colDefCentered`, `PageLogs` copy action получил `actionKey: "logs.copyCell"`.
30
+ - Сделано: Logs headless controller — добавлен `createLogsController` / `createLogsControllerState` для append/limits/latest/settings emitters; `getLogsApi` оставлен compatibility wrapper, UI/timers/tabs не переписывались.
31
+ - Сделано: `SettingsDialog` first controller layer — добавлен `useSettingsDialogController` для open/search/history/tree-cycle/nav-resize/Escape actions; JSX/portal/FloatingWindow/classes не переписывались.
32
+ - Сделано: context logger UI hooks — добавлены `useLogsTableController` и `useLogsNotificationsController`; `LogsTable`/`LogsNotifications` оставлены compatibility wrappers.
33
+ - Сделано: `FloatingWindow` first controller layer — добавлен `useFloatingWindowController` для saved geometry / update counter / z-index stack / drag state / resize callbacks / viewport clamp; `FloatingWindowBase` оставлен compatibility wrapper над тем же `Rnd` и DOM/classes.
34
+ - Пропущено: `FResizableReact` hook — в `src`/`__test` нет render-consumers, только export/docs и `mapResiReact` persistence wiring; без consumer это low-effectiveness speculative refactor.
35
+ - Hook/controller-first backlog обновлён: low-effectiveness пункты не делать без отдельного consumer/test, а новые осмысленные split passes вынесены в `Ready`.
36
+ - Сделано: final primitive-reuse inventory — raw `AgGridReact` / `useGrid.tsx`, `logsContext.localStorage`, PageVisibility/replay/chart timers, Settings/Toolbar registries and ModalProvider paths проверены; оставшиеся места помечены как low-effectiveness/high-risk без отдельного consumer/test.
37
+ - Сделано: QA card 25 toolbar `tb.api.onChange` переведён с ручного `useEffect(() => listen.on(...))` на `useListenEffect(tb.api.onChange, ...)` как canonical listen-hook usage.
38
+ - Сделано: `Toolbar.Bar` получил FLIP-анимацию перемещения элементов; cards 25 и 31 теперь ведут себя как card 30-эталон, card 30 не переписывался.
39
+ - Сделано: `MessageEventLogs` / `logsApi.React.Message` разбит на `useMessageEventLogsController` + `MessageEventLogsView` + `MessageEventLogCard`; card 9 теперь реально показывает corner notification layer.
40
+ - Записано: дополнительные hook/controller split candidates с оценкой эффективности/простоты/риска в [../progress/hook-controller-opportunities.md](../progress/hook-controller-opportunities.md); low-effectiveness пункты оставлены parked.
41
+ - Сделано: default правой/контекстной менюшки снова непрозрачный тёмный (`--menu-bg-color: #0c0c0c`), hover белый/чёрный, active/pressed вынесены в отдельные `--menu-item-*` tokens; card 9 close toggle сделан компактной кнопкой.
42
+
43
+ ## Ready
44
+
45
+ - **Context menu / Menu: controller-first split**.
46
+ - Прогресс/оценка: [../progress/hook-controller-opportunities.md](../progress/hook-controller-opportunities.md)
47
+ - Смысл: выделить `createContextMenuController` / `useMenuLayer` + `MenuView` и action-layer для async/progress/submenu flow, не ломая `contextMenu.openAt`, `contextMenu.Layer` и `contextMenu.stats`.
48
+ - Оценка: эффективность high; простота medium/hard; риск medium. Брать только отдельным focused pass с tests по click/async/submenu/stats.
49
+ - **Chart canvas wrapper: `useChartEngineCanvas` + view split**.
50
+ - Прогресс/оценка: [../progress/hook-controller-opportunities.md](../progress/hook-controller-opportunities.md)
51
+ - Смысл: вынести canvas lifecycle, `ResizeObserver`, event attach/destroy and RAF bridge из `MyChartEngine` wrapper.
52
+ - Оценка: эффективность medium; простота medium; риск medium. Брать, если будет stand/test на chart lifecycle.
53
+
54
+ - **Hook extraction audit: API-возвращающие хуки (проход по всей библиотеке)** — multi-agent аудит выполнен; отобраны 3 осмысленных do-now кандидата (каждый устраняет реальный императив/дублирование и имеет живой consumer). Хук отдаёт метод/значение («хочу X,Y / размер / dirty → получаю метод»).
55
+ - Прогресс/детали (survivors + parked + отклонённое с причинами): [../progress/hook-extraction-audit.md](../progress/hook-extraction-audit.md)
56
+ - Общее правило: старое имя — compatibility wrapper, публичный API не менять; проверка `tsc -p tsconfig.qa-check.json --noEmit` + `jest` + `build` + стенд; card 25 не трогать; версию не бампать.
57
+ - **1. `useCacheMapPersistence` (`utils/cache.ts`)** — simple / low-risk. Убрать тройное точное дублирование `load()+onDirty(()=>saveDebounced(300))` в `qa.tsx` (SettingsDialogDemo 1221-1224, UiSlotDemo 1247-1251, ToolbarDemo 1329-1332). Хук отдаёт `{isDirty(), flush(), save(), reload()}`; `reload` = явный alias над существующим `load()` (не выдумывать метод). Аддитивная обёртка, НЕ `memoryStore` rewrite; scope только `load`+`onDirty`→`saveDebounced` (без pagehide/visibility flush).
58
+ - **2. `useResizeObserver`/`useElementSize` (`components/MyResizeObserver.tsx`)** — simple / low-risk. `CResizeObserver` сейчас класс+синглтон без хука; `qa.tsx` `ResizeBugRepro` (~1076, рендер ~1723) вручную городит `ResizeObserver`+`rAF`+`getBoundingClientRect`+`disconnect` в `useState`. Хук отдаёт `{width, height, getSize(), ref}`, оборачивая существующий синглтон (не ломая `setResizeableElement`/`ParamsEditor`). Явно запрошен в `REFACTOR_PLAN.md` 187/209/221/309.
59
+ - **3. `useLogsPageTable`/`useLogsFullTableController` (`logs/logs.tsx`)** — medium / medium-risk. Последняя logs-таблица вне controller-паттерна: `PageLogs` гоняет ag-grid через `apiGrid` ref, importance-filter `setFilterModel` дублируется дважды (эффект 92-103 и `onGridReady` 160-167). Хук: `getApi(), fit(), applyImportanceFilter(min), appendRow(row), onGridReady, columnDefs, gridProps`; `PageLogs` — тонкий wrapper, row identity сохранить. Consumer: card 9. Делать аккуратно (filter-timing, `applyTransactionAsync` append).
60
+ - Parked/отклонённое: `useChartCanvas` (consumer только example, не в карточке), `useContextMenuGesture` (menuR — мёртвый код), `columnState.api.reorderPreview` (дедуп 1 из 3 копий), `useResizeableFit` (не хук, а shared bind callback-ref) и ещё 13 кандидатов с причинами — в progress-файле.
61
+
62
+ ## Inbox
63
+
64
+ _Actionable задач по текущему repo-pass нет; пункты ниже оставлены как исходные specs со статусом выполнено/parked._
65
+
66
+ - **Недоиспользуемые методы `wenay-react2`: пройти по коду и внедрять свои primitives там, где они реально заменяют ручной код**.
67
+ - Порядок выполнения: начинать с самых простых и низкорисковых замен; если место спорное — пропускать, фиксировать причину в progress-файле и идти дальше.
68
+ - Grid helpers: искать локальные `comparator`, `cellStyle`, `wrapText`, theme/defaultColDef и заменять на `numericComparator`, `colDefCentered`, `colDefWrap`, `useAgGridTheme` / `buildAgTheme`, когда это не меняет UX.
69
+ - `AgGridTable`: искать голый `AgGridReact` и ручное lifecycle/resize/getRowId wiring; переводить на `AgGridTable` / `useAgGrid` только там, где можно сохранить текущую тему, selection, events и row identity.
70
+ - `createColumnBuffer`: проверить места с динамическими колонками и ручным хранением набора имён; использовать буфер, если нужен reusable lifecycle exact-set/apply/detach.
71
+ - Store/listen hooks: заменить ручные `listen.on(...) + useEffect/useState` и чтение `Observe.Store` на `useListenEffect`, `useListenValue`, `useListenArgs`, `useStoreNode`, `useStoreSelect`, `useStoreEach`, `useStoreMirror`, где есть явный `wenay-common2` store/listen source.
72
+ - Settings/Toolbar registries: активнее использовать `registerSettingsSection` для саморегистрации настроек и `registerToolbarDensity` для стандартных режимов плотности вместо локальных вариантов кнопок.
73
+ - Modal layer: для новых модалок использовать `ModalProvider` + `useModal`; старые imperative modal stores оставлять только как compatibility path.
74
+ - Replay hooks: применять `useReplaySubscribe`, route-варианты, `useStoreReplayEach`, `useReplayFrame`, `useReplayHistory` только в местах с реальным streaming/history/replay сценарием; не внедрять в обычный UI ради переиспользования.
75
+ - Page visibility: проверить polling, анимации, replay/canvas и тяжёлые обновления; если поведение должно паузиться в скрытой вкладке, использовать `PageVisibilityProvider` / `PageVisibilityContext`.
76
+ - Статус текущего repo-pass: выполнено в рамках [../progress/public-surface-normalization.md](../progress/public-surface-normalization.md); новые пункты добавлять сюда только при появлении реального consumer/test сценария.
77
+ - **Hook/controller-first backlog после audit-pass**.
78
+ - Прогресс/детали: [../progress/hook-controller-opportunities.md](../progress/hook-controller-opportunities.md)
79
+ - Новое: `MessageEventLogs` split выполнен; две следующие осмысленные задачи вынесены в `Ready` (`Menu/contextMenu`, `Chart canvas wrapper`).
80
+ - Не делать сейчас без отдельного consumer/test: `memoryStore` core rewrite, `PageVisibilityProvider` в обычный UI, `StickerMenu` как shared primitive, broad rewrite `DragBox`, `FResizableReact` hook.
81
+ - Оценка: дальнейшие hard/high-risk пункты (`ParamsEditor` full renderer split, `logsContext` migration, `SettingsDialog` full view split, `LeftModal`) брать только отдельным focused pass с ручной/тестовой приёмкой.
82
+
83
+ ## Verify
84
+ - **Система стилей и CSS variables для shared primitives** — default contract inventory и низкорисковые token fixes готовы, ждут ручной/релизной проверки.
85
+ - Прогресс: [../progress/style-system-normalization.md](../progress/style-system-normalization.md)
86
+ - Сделано: зафиксирована карта style source-of-truth (`src/style/tokens.css`, `src/common/src/styles/tokens.ts`, `src/style/style.css`, `src/style/menuRight.css`) и default visual contracts по публичным primitive groups.
87
+ - Сделано: `ColumnsMenu/MenuStrip` переведён на `.wenayColsMenu*` + `--cols-menu-*`; runtime reorder transform/drag geometry оставлен inline.
88
+ - Сделано: `ColumnDots/CardList` восстановленный card-29 baseline переведён на `--cols-dots-*` / `--cols-card-*` с теми же fallback-значениями; component runtime geometry не менялась.
89
+ - Проверено: `npx tsc -p tsconfig.qa-check.json --noEmit`; `npm run testjest -- --runInBand`; `npm run build`; `git diff --check`.
90
+ - Не сделано: `ParamsEditor` / `Input` broad visual migration отложен до hook-first/API решения; там нельзя безопасно менять только CSS без риска зацепить поведение.
91
+
92
+ ## Blocked — уровень приложения (не эта React-библиотека)
93
+
94
+ Эти задачи живут на стороне приложения (`clientBacktest` / супер-админка), а не в этой библиотеке. Держим как источник, пока не будет доступа к тем репозиториям.
95
+
96
+ - **Balance / Client Backtest**: total по категориям и общий total; фильтры по каждой категории; количество монет в базовой валюте (или фильтр относительно прайса, как на главной странице — есть спец-фильтр для кредитов); кликабельность — возврат займа (по одной и массово, правой кнопкой), панель займа как на главной, трансфер в spot/др. (в т.ч. массовый), массовая очистка лимиток, массовое закрытие позиций на фьючерсах; окно рыночной сделки (buy/sell по выбранному рынку) по кнопке Asset и по BaseOne.
97
+ - **Уровень прав пользователя через супер-админку**: IP супер-админки статичен (хардкод-константа в коде, не ENV); узнавать уровень/права клиента через супер-админку (клиентские страницы и так открываются через неё); нужно комплексное решение — bootstrap прав при открытии клиентской страницы.
98
+
99
+ ---
100
+
101
+ ## Исходные надиктовки (дословно)
102
+
103
+ > Тут я буду надиктовывать различные задачи через Transkriptor, э-э-э, поэтому могут быть какие-тооо опечатки в словах, это нужно понимать. Вот. И вот этот главный пункт — это как бы ты запишешь как README таргета, что ли, а-а-а, файл README. Это твоя первая задача, по сути. А-а-а, потом суть данного направления в том, что типа я просто надиктовываю задачи, которые хочу сделать в порядке какой-нибудь очереди, ну, чтобы про них потом не забыть. Иии потом ты- Угу действия начинаешь выполнять, ты делаешь согласно своих правил, там, у тебя правила записаны, как поступать. Типааа прогрееесс, там, файл, типа, и прочее, ход выполнения. Иии к-- если ты её взял на разработку, то ты как-то должен помечать, типа, вот взял на разработку. Типа, доделано, недоделано — это мы уже потом по прогрессу будем смотреть. Вот и всё. Ну и удалять отсюда, чтобы всегда подчищать документ. То есть я сюда- выкидываю задачи. Можно даже сделать несколько слоёв. Слой, типа, от меня, как задачи, слой, который выполняется, пока не выполнен полностью, и тот, который выполнен и уже очищен. Ну, вот, я думаю, это так будет наиболее правильно.
104
+
105
+ > Нам нужнооо Используя технологию из библиотек, наших же, а-а-а, изменить Ниньо. А точнее, давай не миньо, начнем с баланса. А-а-а, вот есть Binance, а-а-а, баланс нааа Client Backtest. Э-э-э, там есть кнопка, так и называется она Баланс есть. И там есть для спота, для кросса, для фьючерсов отдельные записи. Хотелось бы видеть там же total общий, а-а-а, в базе в его соответствиях, также total по категории. Такжеяя ты сделал таблицу, нооо Лучшеее разрешить таммм вот эти фильтрыыы везде. Который, ну, м-можно было, чтоб каждую категорию фильтровать. Ну, в общем, как обычно. Потом А, кстати, вас бы, чтобы палатка кабельность То есть важно Чтооо, допустим, количество монет мне нужно фильтровать в базовой валюте, ну, типа относительно. Ну, тут есть хотя бы базовая валюта. Я могу по этому столбцу фильтровать. Вот. Ну, либо писать там, как бы в скобках, сколько это будет в базовой валюте, как, ну, как на главной странице. Иии фильтр-- ну, тоже сделать всё, как на главной странице: фильтр относительно прайса. Там у нас специальный фильтр для кредитов для этого написан, и он там используется. Потоммм А, добавить кликабельность, наверное. Что я имею в виду под кликабельностью? Ну, типа чтобы можно было нажать там на «Борууу» и можно было вернуть займ. Вот. Чтобы можно было выделить массово и вернуть займ везде правой кнопкой, допустим, а-а-а, либо по одной монете вернуть займ. Вот. Чтобы при клике на «Борууу» именно открывалась панелька займа, как с главной страницы. Ну, это касаемо кросс. Вот. Чтобы я мог нажать правую кнопку, нажать «Перевести трансфер» иии просто перекинуть её, а-а-а, в spot или куда-нибудь ещё, чтобы я мог массово выделить и сделать массовый трансфер. Вот. Хоть получается у нас много где такие правды, но всё-таки. Также по лимиткам хочу иметь возможность очистить данную лимитку, также массово выбрать, очистить массово лимитки. Вот. А-а-а, на фьючерсах Закрыть позиции массово. А-а-а, также я хочу при нажатии на кнопку «Asset» Чтобы у меняяя, наверное, открывалось окно возможности конвертации данной монеты, но без кон-- ну и без системы конвертации рыночной, типа buy-sell. По различным рынкам. Ну, типа, чтобы мне предполагалось, м-м-м, на как-- по какому рынку я хочу открыть диалоговое окно на покупку-продажу. Вот. Ну, типа, чтобы на месте я мог Выбрать, куда я хочу Стифом продать или купить. А-а-а, потом. А-а-а, м-м-м Как бы, конверт у BaseOne. А-а-а, конвертировать базовую валюту. Но опять же, это ещё не конвертация, а именно сделка по рынку, по ASL. Вот, а-а-а Точно так же хотелось бы отцу-то её иметь.
106
+
107
+ > Смотри, нам, короче, нужно как-то брать. У нас есть, короче, супер-админка, и его-- и ее IP-шник, как правило, пока что статичен. Можно хардкодить временно, ну, либо использовать как через переменную, хардкодить через переменную статическую, чтобы было-- ну, не через ENW, а в коде прям, короче. Вот. И просто у нас есть некоторые моменты, которые требуются только для определенных вещей, и нам бы узнавать уровень пользователя. Типа, ну, есть ли права, а-а-а, в клиентской системе, э-э-э, типа для такого-то режима. А узнать уровень пользователя мы можем только через супер-админку. Вот. Как это правильнее сделать? Я пока не понимаю. Ну, типа, к примеру, вот мы на фронте показываем APK. Пока что понятно для отладки, у нас пока так и оставляем. Ну, это больше задачааа, которая требует, наверное, комплексного решения. Скорее всего, нам нужно просто открывать клиентскую страницу через суперадминку. Кстати, мы так и делаем. Все клиентские страницы мы открываем через суперадминку.
108
+
109
+ > wenay-common2 Обнови эту библиотеку на последней версии. Посмотри, что там есть новое, можем ли это использовать. Если можем, тооо создай в таргете цели использовать это. И что необходимо сделать в качестве задач.
Binary file