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.
- package/doc/EXAMPLE_USAGE.md +915 -0
- package/doc/PROJECT_FUNCTIONALITY.md +401 -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 +13 -0
- package/doc/progress/README.md +14 -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 +109 -0
- package/doc/wenay-react2-1.0.8.tgz +0 -0
- package/doc/wenay-react2-rare.md +702 -0
- package/doc/wenay-react2.md +475 -0
- package/lib/common/src/components/Dnd/FloatingWindow.d.ts +29 -12
- package/lib/common/src/components/Dnd/FloatingWindow.js +100 -91
- package/lib/common/src/components/Menu/RightMenu.d.ts +28 -1
- package/lib/common/src/components/Menu/RightMenu.js +62 -35
- package/lib/common/src/components/Modal/LeftModal.js +5 -4
- package/lib/common/src/components/Modal/Modal.js +8 -7
- package/lib/common/src/components/ParamsEditor.d.ts +15 -0
- package/lib/common/src/components/ParamsEditor.js +45 -18
- package/lib/common/src/components/Settings/SettingsDialog.d.ts +68 -6
- package/lib/common/src/components/Settings/SettingsDialog.js +61 -12
- package/lib/common/src/components/Toolbar/Toolbar.js +64 -19
- package/lib/common/src/components/UiSlot/UiSlot.js +5 -4
- package/lib/common/src/grid/columnState/columnState.js +8 -6
- package/lib/common/src/hooks/useKeyboard.js +4 -3
- package/lib/common/src/logs/logs.d.ts +40 -133
- package/lib/common/src/logs/logs.js +96 -66
- package/lib/common/src/logs/logsContext.d.ts +26 -0
- package/lib/common/src/logs/logsContext.js +25 -20
- package/lib/common/src/logs/logsController.d.ts +88 -0
- package/lib/common/src/logs/logsController.js +54 -0
- package/lib/common/src/logs/miniLogs.d.ts +69 -3
- package/lib/common/src/logs/miniLogs.js +70 -15
- package/lib/common/src/menu/menu.d.ts +15 -3
- package/lib/common/src/menu/menu.js +81 -17
- package/lib/common/src/menu/menuMouse.d.ts +18 -0
- package/lib/common/src/menu/menuMouse.js +43 -1
- package/lib/common/src/styles/tokens.d.ts +7 -6
- package/lib/common/src/styles/tokens.js +8 -5
- package/lib/common/src/utils/memoryStore.d.ts +1 -10
- package/lib/common/src/utils/searchHistory.js +4 -3
- package/lib/style/menuRight.css +29 -23
- package/lib/style/style.css +15 -9
- package/lib/style/tokens.css +8 -4
- package/package.json +50 -49
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# v1.0.37
|
|
2
|
+
|
|
3
|
+
Date: 2026-07-08
|
|
4
|
+
|
|
5
|
+
- Changed: Refactored `Menu` active/open handling so it no longer mutates `item.status`; `status` remains an initial hint and custom-renderer compatibility field.
|
|
6
|
+
- Changed: Routed mouse context-menu item colors, active state, and separators through the existing `--menu-*` tokens while preserving `MenuR` / `toButton` class compatibility.
|
|
7
|
+
- Changed: Added the shared logger style contract in `src/common/src/logs/logStyles.ts` and wired global/context logger chrome to `--logs-*` tokens.
|
|
8
|
+
- Changed: Tokenized `OutlineDragDemo` outline color as `--menu-outline-color` and reused `--dlg-scrim` in `ModalProvider`.
|
|
9
|
+
- Changed: Added project rules and `doc/progress/README.md` for temporary task progress files during active non-trivial work.
|
|
10
|
+
- Changed: Added `doc/target/README.md` and clarified that `doc/target/my.md` is the durable task queue while `doc/progress` is temporary; target tasks now pass through a `Verify` status before removal.
|
|
11
|
+
- Changed: Added `common2` shorthand rules for checking `wenay-common2` updates from the installed package changelog.
|
|
12
|
+
- Reason: Reduce hidden state mutation and hardcoded shared styling while preserving the existing public API; make agent working notes and common2 update checks explicit.
|
|
13
|
+
- Verification: `npm run build`; `npm run testjest -- --runInBand`; QA stand `http://127.0.0.1:3002/` returns HTTP 200; documentation-only policy reviewed in `doc/PROJECT_RULES.md`, `doc/progress/README.md`, and `node_modules/wenay-common2/doc/changes/README.md`.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# v1.0.38
|
|
2
|
+
|
|
3
|
+
Date: 2026-07-09
|
|
4
|
+
|
|
5
|
+
- Changed: Redesigned `SettingsDialog` from a flat section list into a searchable settings tree while preserving flat `{key, name, render}` sections.
|
|
6
|
+
- Changed: Extended `SettingsSection` with optional `children`, `parentKey`, `searchText`, and `keywords` for nested settings pages and content-aware search.
|
|
7
|
+
- Changed: Added SettingsDialog tree/search styles and widened the default `--dlg-nav-width` token to `220px` with the TypeScript token mirror updated.
|
|
8
|
+
- Changed: Updated the QA stand SettingsDialog card and public docs for tree structure, registry `parentKey`, and search behavior.
|
|
9
|
+
- Reason: Let client apps present larger settings surfaces in a JetBrains-style tree without moving hierarchy/search logic into each app.
|
|
10
|
+
- Verification: `npm run build`; `npm run testjest -- --runInBand`; QA stand `http://127.0.0.1:3002/` returns HTTP 200.
|
|
11
|
+
- Changed: Extended `createToolbar` with focused API writes (`setOrder`, `show`, `setDensity`, `showSettings`, `showReset`), `sourceMode:"order"`, and a default-hidden reset pseudo-control (`resetItem`, `Bar reset`).
|
|
12
|
+
- Changed: Updated QA card 30 to use `createToolbar({source: columnState.api.listSource, sourceMode:"order"})` instead of a manual order bridge.
|
|
13
|
+
- Reason: Let table/grid layers own icon-menu order directly while toolbar membership, density, pseudo-controls, and extra non-source items stay local; give users a built-in reset-to-default control that starts hidden while Settings stays visible by default.
|
|
14
|
+
- Verification: `.\node_modules\.bin\tsc -p tsconfig.qa-check.json --noEmit`; `npm run build`; `npm run testjest -- --runInBand`; QA stand `http://127.0.0.1:3002/` returns HTTP 200.
|
|
15
|
+
- Changed: Added runtime `columnState.api.setPresentGate(...)` and switched QA card 30 to stable grouped `columnDefs` plus a 3-letter vertical-dot mode button in the upper toolbar; removed the old lower menu from this demo.
|
|
16
|
+
- Reason: Demonstrate the app-owned multi-state layer above MenuStrip without rebuilding the grid schema on each mode click: presentGate decides which leaf columns are available while persisted user visibility stays separate.
|
|
17
|
+
- Verification: `.\node_modules\.bin\tsc -p tsconfig.qa-check.json --noEmit`; `npm run build`; `npm run testjest -- --runInBand`; QA stand `http://127.0.0.1:3002/` returns HTTP 200.
|
|
18
|
+
- Changed: Updated `wenay-common2` from `^1.0.64` to `^1.0.65` and recorded a target backlog item for React route hand-off hooks over `Replay.replayRouteSubscribe` / `Observe.syncStoreReplayRoute`.
|
|
19
|
+
- Reason: common2 1.0.65 adds replay route hand-off for relay/direct promotion; using it in this package needs an explicit React controller surface rather than changing existing replay hooks implicitly.
|
|
20
|
+
- Verification: `tsc -p tsconfig.qa-check.json --noEmit`; `npm run build`; `npm run testjest -- --runInBand`.
|
|
21
|
+
- Changed: Added route hand-off React hooks: `useReplayRouteSubscribe`, `useStoreReplayRouteSync`, and `useStoreReplayRouteMirror`.
|
|
22
|
+
- Changed: Added unit coverage and QA card 26 with a canvas video route switch demo for relay/direct/failure fallback.
|
|
23
|
+
- Changed: Updated Replay docs with the explicit `switchRoute(...)` contract and the current no-`stale`/`lastTs()` limitation of common2 route handles.
|
|
24
|
+
- Reason: Let React consumers use `wenay-common2@1.0.65` replay route replacement without changing existing non-route hook semantics.
|
|
25
|
+
- Verification: `npm run testjest -- --runInBand`; `tsc -p tsconfig.qa-check.json --noEmit`; `npm run build`; QA stand `http://127.0.0.1:3004/` returns HTTP 200.
|
|
26
|
+
- Changed: Added `doc/PROJECT_FUNCTIONALITY.md` and `doc/EXAMPLE_USAGE.md`, and linked both from `README.md` and `doc/PROJECT_RULES.md`.
|
|
27
|
+
- Reason: Separate project purpose/feature boundaries and example usage standards from the API cheat sheet, including guidance to prefer current controller primitives over legacy low-level stand examples.
|
|
28
|
+
- Verification: Documentation-only review against `doc/wenay-react2.md`, `doc/wenay-react2-rare.md`, `src/common/api.tsx`, and the QA stand.
|
|
29
|
+
- Changed: Added reusable `createSearchHistory({key,max?})`, wired `SettingsDialog` search to persisted history, and replaced three tree tool buttons with one compact dotted cycle control in the search row.
|
|
30
|
+
- Changed: Moved `ColumnDots` and `CardList` visual styling from inline/raw styles into shared `.wenayColDots*` and `.wenayCardList*` CSS classes while preserving runtime geometry inline.
|
|
31
|
+
- Reason: Apply the newly documented usage standards inside the library itself: reuse persistence helpers for search history and keep public primitives styleable through shared CSS contracts.
|
|
32
|
+
- Verification: `npx tsc -p tsconfig.qa-check.json --noEmit`; `git diff --check -- src/common/src/components/Settings/SettingsDialog.tsx src/common/src/utils/searchHistory.ts src/common/src/utils/index.ts src/common/src/grid/columnState/ColumnDots.tsx src/common/src/grid/columnState/CardList.tsx src/style/style.css`.
|
|
33
|
+
- Changed: Documented the hook/controller-first architecture rule for shared functionality and added a target audit for converting component-owned behavior into headless APIs where appropriate.
|
|
34
|
+
- Reason: Keep reusable behavior available to apps, visual components, and QA stand layers without copying component internals.
|
|
35
|
+
- Verification: Documentation-only scoped review; `git diff --check` on touched docs.
|
|
36
|
+
- Changed: Recorded the compatibility policy for old public APIs and added a backlog item for local menu/context-menu usage statistics.
|
|
37
|
+
- Reason: New hook/controller APIs should not break existing consumers, and risky menu migrations need usage signal before deprecation/removal.
|
|
38
|
+
- Verification: Documentation-only scoped review; git diff --check on touched docs.
|
|
39
|
+
- Changed: Refined compatibility guidance to allow explicit aggressive migrations while treating removed default styles as compatibility breaks unless a replacement class/token path is shipped.
|
|
40
|
+
- Changed: Added a style-system normalization target for default primitive styles and CSS variable contracts.
|
|
41
|
+
- Reason: API migrations can be explained in changelog, but broken default visuals make shared primitives hard to use and override safely.
|
|
42
|
+
- Verification: Documentation-only scoped review; git diff --check on touched docs.
|
|
43
|
+
- Changed: Added a persisted SettingsDialog tree/content width divider with mouse drag, keyboard arrows, and double-click/Enter reset to the default width.
|
|
44
|
+
- Changed: Tightened the SettingsDialog tree/search layout so the search row, dotted tree-cycle control, toggles, and rows use less horizontal and vertical space.
|
|
45
|
+
- Changed: Restored the card 29 `ColumnDots` / `CardList` default visual shape after CSS extraction: the primitive remains class-styleable, but the QA/default look matches the original compact track, dark dots, selected blue dot, and clean white cards.
|
|
46
|
+
- Changed: Added click-only FLIP movement animation to the card 30 horizontal toolbar menu when order or density changes elsewhere; the menu itself does not gain drag reorder behavior.
|
|
47
|
+
- Reason: Finish the settings usability pass without treating demo-only sketches as global style standards, and keep column-state demos visually usable while preserving the new CSS override contracts.
|
|
48
|
+
- Verification: `npx tsc -p tsconfig.qa-check.json --noEmit`; `npm run testjest -- --runInBand`; `git diff --check`; `npm run build`.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# v1.0.39
|
|
2
|
+
|
|
3
|
+
Date: 2026-07-09
|
|
4
|
+
|
|
5
|
+
- Changed: Added local in-memory `contextMenu.stats` diagnostics with `getSnapshot()`, `reset()`, and `onChange(cb)`.
|
|
6
|
+
- Changed: Counted direct `openAt`, `openAtPoint`, legacy Layer queued opens, empty opens, close/replace, and source/layer usage without storing menu labels.
|
|
7
|
+
- Changed: Added explicit `MenuItemStrict.actionKey` and action-level `contextMenu.stats` counters: aggregate `actionTotals` plus keyed `actions[actionKey]` for click/ok/error/task/submenu/func/focus outcomes.
|
|
8
|
+
- Changed: Added focused tests for direct stats, reset/onChange, the legacy `contextMenu.map` Layer path, keyed actions, unkeyed action totals, and keyed submenu stats.
|
|
9
|
+
- Changed: Clarified the columnState menu guidance: `createToolbar({source: cs.api.listSource})` is the richer Settings-integrated surface; `ColumnsMenu` remains the compact presentation menu.
|
|
10
|
+
- Changed: Extracted card 27 `BoardDemo` stand-only inline styles into local style helpers without changing `useReorderBoard` behavior.
|
|
11
|
+
- Changed: Recorded the style-system default contract inventory and corrected the style source-of-truth paths for the next token migration.
|
|
12
|
+
- Changed: Moved `ColumnsMenu/MenuStrip` visual button styles into `.wenayColsMenu*` classes and `--cols-menu-*` tokens while leaving runtime reorder transforms inline.
|
|
13
|
+
- Changed: Tokenized `ColumnDots` / `CardList` restored defaults through `--cols-dots-*` and `--cols-card-*` without changing component runtime geometry.
|
|
14
|
+
- Changed: Added headless `useTextInputPanel` and `useFileInputPanel` hooks while keeping the old input panel/modal components as compatible visual wrappers.
|
|
15
|
+
- Changed: Increased `ColumnDots` default max visible dots from 4 to 8 and updated QA card 29 to show 8 fields with the dots control overlaid on the bottom card.
|
|
16
|
+
- Changed: Split `MiniLogs` into hook/controller-first layers: `useMiniLogsTable`, `MiniLogsView`, `MiniLogsTable`, with `MiniLogs` kept as the compatibility wrapper.
|
|
17
|
+
- Changed: Added MiniLogs hook tests and updated QA card 9 plus usage docs for the compact log table flow.
|
|
18
|
+
- Changed: Added `useRightMenuController` as the hook/controller layer behind `DropdownMenu`; kept `DropdownMenu` and `createRightMenuController().Render` compatible.
|
|
19
|
+
- Changed: Added RightMenu tests for mounted controller rerender, direct hook state, hover submenu, and fixed toggle compatibility.
|
|
20
|
+
- Changed: Added `useParamsEditorController` as the first controller layer for `ParamsEditor` draft clone, immediate/delayed notify, expand callback, and timer cleanup.
|
|
21
|
+
- Changed: Added ParamsEditor controller tests for clone isolation, delayed notify cleanup, and current expand callbacks.
|
|
22
|
+
- Changed: Moved context logger `LogsTable` from raw `AgGridReact` to shared `AgGridTable` defaults and added `logs.copyCell` action stats key to `PageLogs` copy menu.
|
|
23
|
+
- Changed: Added headless `createLogsController` / `createLogsControllerState` for log append, limits, latest rows, settings, and update emitters while keeping `getLogsApi` as the compatibility entrypoint.
|
|
24
|
+
- Changed: Added Logs controller tests for append order, `num`, mini/per-id limits, fresh latest, and settings emitters.
|
|
25
|
+
- Changed: Added `useSettingsDialogController` as the first controller layer for `SettingsDialog` open/search/history/tree-cycle/nav-resize/Escape actions while keeping the visual wrapper compatible.
|
|
26
|
+
- Changed: Added a SettingsDialog controller test for headless open/search/current-section/tree-cycle state.
|
|
27
|
+
- Changed: Added context logger hooks `useLogsTableController` and `useLogsNotificationsController` while keeping `LogsTable` and `LogsNotifications` as visual wrappers.
|
|
28
|
+
- Changed: Added context logger hook tests for table rows/defaults/filter state and notification gate/show state.
|
|
29
|
+
- Changed: Added `useFloatingWindowController` plus public geometry/controller types as the first controller layer for `FloatingWindow` saved geometry, z-index stack, drag state, resize callbacks, and viewport clamp.
|
|
30
|
+
- Changed: Kept `FloatingWindowBase` as a compatibility visual wrapper over the same `Rnd` DOM/classes/gesture behavior; `DragBox` and `FResizableReact` were not rewritten.
|
|
31
|
+
- Changed: Added FloatingWindow controller tests for saved geometry restore, resize-stop commit, drag clamp/persistence touch, and live resize `onUpdate` forwarding.
|
|
32
|
+
- Changed: Updated QA card 25 toolbar subscription to use `useListenEffect(tb.api.onChange, ...)` instead of a manual `useEffect(() => listen.on(...))` cleanup.
|
|
33
|
+
- Fixed: `SettingsDialog` search history now closes when focus leaves the search box; added a regression test.
|
|
34
|
+
- Reason: Start the menu compatibility/statistics target with a safe diagnostics layer while keeping old public context-menu paths working.
|
|
35
|
+
- Verification: `npx tsc -p tsconfig.qa-check.json --noEmit`; `npm run testjest -- --runInBand logsController.test.ts miniLogs.test.tsx`; `npm run testjest -- --runInBand logsContextControllers.test.tsx`; `npm run testjest -- --runInBand contextMenuStats.test.tsx`; `npm run testjest -- --runInBand createRightMenuController.test.tsx`; `npm run testjest -- --runInBand paramsEditorController.test.tsx`; `npm run testjest -- --runInBand floatingWindowController.test.tsx`; `npm run testjest -- --runInBand createToolbar.test.ts`; `npm run testjest -- --runInBand __test/inputPanelHooks.test.tsx`; `npm run testjest -- --runInBand __test/settingsDialog.test.tsx`; `npm run testjest -- --runInBand`; `npm run build`; `git diff --check`.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# v1.0.40
|
|
2
|
+
|
|
3
|
+
Date: 2026-07-09
|
|
4
|
+
|
|
5
|
+
- Changed: Added FLIP-style item movement animation to the standard `createToolbar().Bar`, matching the card 30 behavior for horizontal toolbar menus.
|
|
6
|
+
- Changed: QA cards 25 and 31 now receive toolbar item glide animation through the shared `Toolbar.Bar`; card 30 remains the stand-only visual reference.
|
|
7
|
+
- Changed: Added `useFloatingWindowController` plus public geometry/controller types as the first controller layer for `FloatingWindow` saved geometry, z-index stack, drag state, resize callbacks, and viewport clamp.
|
|
8
|
+
- Changed: Added controller-first layers for MiniLogs, RightMenu, ParamsEditor, Logs, SettingsDialog, and context logger UI wrappers while keeping compatibility components.
|
|
9
|
+
- Changed: Added explicit `MenuItemStrict.actionKey` and action-level `contextMenu.stats` counters.
|
|
10
|
+
- Changed: Moved log tables and context log table to shared `AgGridTable` primitives where behavior was safe to preserve.
|
|
11
|
+
- Changed: Updated QA card 25 toolbar subscription to use `useListenEffect(tb.api.onChange, ...)` instead of a manual `useEffect(() => listen.on(...))` cleanup.
|
|
12
|
+
- Fixed: `SettingsDialog` search history closes when focus leaves the search box.
|
|
13
|
+
- Skipped: `FResizableReact` hook, `memoryStore` core rewrite, broad `DragBox` rewrite, `PageVisibilityProvider` adoption, and `logsContext` persistence migration until a real consumer/test scenario exists.
|
|
14
|
+
- Note: The QA stand mounts log tables in card 9; top-right log notification layers exist in the library but are not mounted globally in the stand.
|
|
15
|
+
- Verification: `npx tsc -p tsconfig.qa-check.json --noEmit`; `npm run testjest -- --runInBand`; `npm run build`; `git diff --check`.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# v1.0.41
|
|
2
|
+
|
|
3
|
+
Date: 2026-07-09
|
|
4
|
+
|
|
5
|
+
Status: released.
|
|
6
|
+
|
|
7
|
+
- Changed: Split global log notifications into `useMessageEventLogsController`, `MessageEventLogsView`, and `MessageEventLogCard`; `MessageEventLogs` and `logsApi.React.Message` remain compatibility wrappers.
|
|
8
|
+
- Changed: QA card 9 now mounts the global log notification layer, so the corner popups can be checked from the stand with the existing `add log` button.
|
|
9
|
+
- Changed: Added usage docs for the hook/controller notification layer and recorded follow-up hook/controller split candidates with effectiveness/simplicity estimates.
|
|
10
|
+
- Fixed: npm package assembly now copies `doc/` into `dist` and allows `doc/**/*` in package `files`; pack verification confirms `doc/changes/v1.0.41.md`, `doc/wenay-react2.md`, and `doc/wenay-react2-rare.md` are included.
|
|
11
|
+
- Fixed: Restored opaque dark default styling for mouse/right-click menus; hover is white with dark text, active stays dark, and pressed state has a separate contrast token.
|
|
12
|
+
- Changed: Polished the log notification toggle in card 9 / `MessageEventLogsView` from a large text `X` into a compact close button.
|
|
13
|
+
- Verification: `npx tsc -p tsconfig.qa-check.json --noEmit`; `npm run testjest -- --runInBand`; `npm run build`; `npm pack .\dist --json` confirmed `doc/changes/v1.0.41.md`, `doc/wenay-react2.md`, `doc/wenay-react2-rare.md`, `doc/EXAMPLE_USAGE.md`, and `doc/target/my.md`.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Task progress
|
|
2
|
+
|
|
3
|
+
This directory is for short-lived checkpoint files during active non-trivial tasks.
|
|
4
|
+
|
|
5
|
+
Rules:
|
|
6
|
+
- create one file per task, named `doc/progress/<task>.md`;
|
|
7
|
+
- keep it short: goal, checkpoints, decisions, blockers, and verification;
|
|
8
|
+
- update it when checkpoints are completed or before switching context;
|
|
9
|
+
- delete it when the task is finished;
|
|
10
|
+
- keep durable history elsewhere: changelog/release notes for publishable changes,
|
|
11
|
+
roadmap/recommendations/target docs for long-lived project direction,
|
|
12
|
+
and the commit message or final response for the immediate summary.
|
|
13
|
+
|
|
14
|
+
Progress files are working notes, not API docs, release notes, or the durable target queue. When a task comes from `doc/target/my.md`, update that file before deleting the progress file: move completed work to `Verify` until checks pass, or remove it only after verification is recorded.
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
# Hook/controller opportunities audit
|
|
2
|
+
|
|
3
|
+
Дата: 2026-07-09.
|
|
4
|
+
|
|
5
|
+
Задача: пройтись по коду библиотеки и записать места, где есть смысл продолжать переводить функционал в стиль `use*` hook / `create*` controller + тонкий visual wrapper. Не записывать задачи ради задач: у каждой позиции есть оценка эффективности, простоты и риска.
|
|
6
|
+
|
|
7
|
+
## Проверенные зоны
|
|
8
|
+
|
|
9
|
+
- `src/common/src/logs/miniLogs.tsx`
|
|
10
|
+
- `src/common/src/logs/logs.tsx`
|
|
11
|
+
- `src/common/src/logs/logsContext.tsx`
|
|
12
|
+
- `src/common/src/components/ParamsEditor.tsx`
|
|
13
|
+
- `src/common/src/components/Other.tsx`
|
|
14
|
+
- `src/common/src/components/Settings/SettingsDialog.tsx`
|
|
15
|
+
- `src/common/src/menu/menu.tsx`
|
|
16
|
+
- `src/common/src/menu/menuMouse.tsx`
|
|
17
|
+
- `src/common/src/components/Menu/RightMenu.tsx`
|
|
18
|
+
- `src/common/src/components/Menu/StickerMenu.tsx`
|
|
19
|
+
- `src/common/src/components/Dnd/FloatingWindow.tsx`
|
|
20
|
+
- `src/common/src/components/Dnd/Resizable.tsx`
|
|
21
|
+
- `src/common/src/hooks/useDraggable.tsx`
|
|
22
|
+
- `src/common/src/components/MyResizeObserver.tsx`
|
|
23
|
+
- QA usage references in `src/common/testUseReact/qa.tsx`
|
|
24
|
+
|
|
25
|
+
## Execution updates
|
|
26
|
+
|
|
27
|
+
### MiniLogs layered redesign — done
|
|
28
|
+
|
|
29
|
+
Сделано:
|
|
30
|
+
- добавлены `useMiniLogsTable`, `MiniLogsView`, `MiniLogsTable` и compatibility wrapper `MiniLogs`;
|
|
31
|
+
- hook возвращает table props, `gridProps` alias, `apiRef`, `fit`, `getApi`, `withApi`, `onGridReady`, `onGridPreDestroyed`, `onCellMouseDown`;
|
|
32
|
+
- сохранён старый `rowData` path, чтобы не менять row identity для повторяющихся log `id`;
|
|
33
|
+
- MiniLogs-owned store/append/history не добавлялись: реального consumer для этого пока нет;
|
|
34
|
+
- обновлены `doc/EXAMPLE_USAGE.md`, `doc/wenay-react2.md`, `doc/wenay-react2-rare.md`, QA card 9 и добавлен `__test/miniLogs.test.tsx`.
|
|
35
|
+
|
|
36
|
+
Проверено:
|
|
37
|
+
- `npm run testjest -- --runInBand miniLogs.test.tsx`;
|
|
38
|
+
- `npx tsc -p tsconfig.qa-check.json --noEmit`;
|
|
39
|
+
- `npm run testjest -- --runInBand`;
|
|
40
|
+
- `npm run build`;
|
|
41
|
+
- `git diff --check`.
|
|
42
|
+
|
|
43
|
+
## Очередь полезных задач
|
|
44
|
+
|
|
45
|
+
### 1. MiniLogs layered redesign
|
|
46
|
+
|
|
47
|
+
Статус: выполнено; оставить как reference implementation для следующих hook/controller passes.
|
|
48
|
+
|
|
49
|
+
Что сделать:
|
|
50
|
+
- слой 1: `useMiniLogsTable(...)` или `createMiniLogsTableController(...)`, который готовит `columns`, `defaultColDef`, callbacks и grid contract;
|
|
51
|
+
- слой 2: `MiniLogsTable` / `MiniLogsView` как тонкий visual wrapper на `AgGridTable`;
|
|
52
|
+
- слой 3: совместимый `<MiniLogs data onClick />`.
|
|
53
|
+
|
|
54
|
+
Оценка:
|
|
55
|
+
- эффективность: medium/high;
|
|
56
|
+
- простота: medium;
|
|
57
|
+
- риск: medium.
|
|
58
|
+
|
|
59
|
+
Почему задача не высосана из пальца:
|
|
60
|
+
- текущий `MiniLogs` уже использует наши grid helpers, но сам API остаётся плоским компонентом;
|
|
61
|
+
- это небольшой публичный компонент, его можно проверить отдельно без переписывания всего logger API.
|
|
62
|
+
|
|
63
|
+
Проверка:
|
|
64
|
+
- найти или добавить QA usage для `MiniLogs`;
|
|
65
|
+
- проверить отображение времени, click callback, fit/resize таблицы.
|
|
66
|
+
|
|
67
|
+
### 2. ParamsEditor / ParamsEdit controller split
|
|
68
|
+
|
|
69
|
+
Статус: first controller layer done; full renderer/view split deferred.
|
|
70
|
+
|
|
71
|
+
Что сделано:
|
|
72
|
+
- добавлен `useParamsEditorController(...)` в `ParamsEditor.tsx`;
|
|
73
|
+
- controller владеет mutable draft clone, immediate notify, delayed notify, expand callback и cleanup таймера;
|
|
74
|
+
- `ParamsEditorBase` использует controller, но сложная JSX-разметка rows/arrays/inputs не переписывалась;
|
|
75
|
+
- `ParamsEditor`, `ParamsEdit`, `ParamsArrayEdit` остались compatibility wrappers.
|
|
76
|
+
|
|
77
|
+
Что не сделано сейчас:
|
|
78
|
+
- `ParamsEditorView` / row-model split: слишком большой pass, высокий риск array mutation/resize/autostep UX;
|
|
79
|
+
- async load/save hook для `ParamsEdit`/`ParamsArrayEdit`: полезно только отдельным pass с policy tests;
|
|
80
|
+
- стили/плотность/buttons add/remove не трогались.
|
|
81
|
+
|
|
82
|
+
Оценка:
|
|
83
|
+
- эффективность: medium/high;
|
|
84
|
+
- простота: medium;
|
|
85
|
+
- риск: medium, потому что renderer остался на месте.
|
|
86
|
+
|
|
87
|
+
Проверка:
|
|
88
|
+
- `paramsEditorController.test.tsx`: draft clone isolation, delayed notify + unmount cleanup, current `onExpand` callback;
|
|
89
|
+
- QA card 7/10 остаются ручными regression points для обычного renderer/save behavior.
|
|
90
|
+
|
|
91
|
+
### 3. Logs API controller split
|
|
92
|
+
|
|
93
|
+
Статус: headless controller pass done; full UI split deferred.
|
|
94
|
+
|
|
95
|
+
Что видно сейчас:
|
|
96
|
+
- `logs.tsx` хранит global maps (`cashLogs`, `datumConst`, `datumMiniConst`), settings, rendering API, table UI and notification UI вместе;
|
|
97
|
+
- `logsContext.tsx` уже предлагает отдельный context-based logger, но это параллельный surface;
|
|
98
|
+
- `PageLogs` и `MiniLogs` уже переведены на `AgGridTable`; `LogsTable` из `logsContext.tsx` теперь тоже переведён на `AgGridTable` + `colDefCentered` без изменения context state;
|
|
99
|
+
- right-click copy action in `PageLogs` now has explicit `actionKey: "logs.copyCell"` for contextMenu action stats.
|
|
100
|
+
|
|
101
|
+
Что сделано:
|
|
102
|
+
- добавлен `src/common/src/logs/logsController.ts`;
|
|
103
|
+
- экспортированы `LogsApiOptions`, `LogsController`, `LogsControllerState`, `createLogsControllerState`, `createLogsController` через `logs.tsx`;
|
|
104
|
+
- `LogInput` / `LogEntry` остались в `logsController.ts`, но не re-export через общий `api.tsx`, потому эти имена уже заняты `logsContext.tsx`;
|
|
105
|
+
- вынесен headless state/API слой: `addLogs`, `limit/limitPer`, `num`, `getRows()`, `getMiniRows()`, `getLatest()`, `params.def/get/set`, update emitters;
|
|
106
|
+
- `getLogsApi`, `logsApi`, `PageLogs`, `MessageEventLogs`, `LogsPage`, `logsApi.React.*` оставлены compatibility wrappers;
|
|
107
|
+
- `logsContext.tsx` не объединялся с global logger.
|
|
108
|
+
|
|
109
|
+
Оценка:
|
|
110
|
+
- эффективность: high для headless controller;
|
|
111
|
+
- простота: medium;
|
|
112
|
+
- риск: medium, если UI не переписывать.
|
|
113
|
+
|
|
114
|
+
Дополнительный context logger pass:
|
|
115
|
+
- добавлены `useLogsTableController()` и `useLogsNotificationsController()`;
|
|
116
|
+
- `LogsTable` и `LogsNotifications` остались compatibility visual wrappers;
|
|
117
|
+
- provider state, localStorage settings, notification timers and visual styles не менялись.
|
|
118
|
+
|
|
119
|
+
Что пропустить:
|
|
120
|
+
- публичный конфликт имён `logsContext.LogInput/LogEntry` решать отдельно, если понадобится единый logger contract;
|
|
121
|
+
- merge/deprecate `logsContext.tsx` без отдельного решения;
|
|
122
|
+
- MiniLogs-owned store/history без реального consumer.
|
|
123
|
+
### 4. SettingsDialog controller split
|
|
124
|
+
|
|
125
|
+
Статус: first controller layer done; full view split deferred.
|
|
126
|
+
|
|
127
|
+
Что сделано:
|
|
128
|
+
- добавлен `useSettingsDialogController(props)`;
|
|
129
|
+
- controller владеет open/close, active/search, search history open/commit/pick/clear, expanded tree state, dotted tree cycle, nav resize state/commit, Escape handling and refs;
|
|
130
|
+
- `SettingsDialog` остался compatibility wrapper with the same JSX/portal/FloatingWindowBase/classes;
|
|
131
|
+
- pure tree/search helpers не переписывались;
|
|
132
|
+
- QA card 20 менять не нужно: он продолжает проверять старый visual wrapper.
|
|
133
|
+
|
|
134
|
+
Что пропущено:
|
|
135
|
+
- full `SettingsDialogView` split по файлам: риск выше пользы сейчас;
|
|
136
|
+
- переписывание `buildSettingsTree`/search helpers, registry, `settingsDialogLayout` store, `FloatingWindowBase`, CSS/tokens/default trigger;
|
|
137
|
+
- любые UX changes search history/divider/dotted tree control ради красивого split.
|
|
138
|
+
|
|
139
|
+
Оценка:
|
|
140
|
+
- эффективность: medium/high;
|
|
141
|
+
- простота: medium;
|
|
142
|
+
- риск: medium, снижен тем, что JSX и UX остались на месте.
|
|
143
|
+
|
|
144
|
+
Проверка:
|
|
145
|
+
- `settingsDialog.test.tsx`: old search/content/history regression + hook open/search/tree-cycle state;
|
|
146
|
+
- QA card 20: search history, outside blur close, dotted tree cycle, divider drag/keyboard/double-click reset, Escape behavior.
|
|
147
|
+
### 5. Menu action controller + action-level stats
|
|
148
|
+
|
|
149
|
+
Статус: action-level stats done; полный action-controller split отложен как более крупный pass.
|
|
150
|
+
|
|
151
|
+
Что сделано:
|
|
152
|
+
- `MenuItemStrict.actionKey?: string | null` стал стабильным diagnostics-key контрактом;
|
|
153
|
+
- `MenuActionEvent` / `MenuActionHandler` прокинуты через `Menu`, nested menu layers и `contextMenu.Layer`;
|
|
154
|
+
- `contextMenu.stats` теперь считает `actionTotals` и `actions[actionKey]` для click/ok/error/task/submenu/func/focus outcomes;
|
|
155
|
+
- stats не падают обратно на `name`/index/source, не хранят labels и errors;
|
|
156
|
+
- QA card 4 использует `qa4.*` action keys.
|
|
157
|
+
|
|
158
|
+
Что осталось отдельной задачей:
|
|
159
|
+
- выделить `createMenuActionController(...)` или `useMenuAction(...)`, если нужен более тонкий визуальный слой;
|
|
160
|
+
- перенести исполнение item action/progress/loading cleanup из visual components без изменения DOM/classes;
|
|
161
|
+
- добавить расширенные async-error tests, если будет выделяться controller.
|
|
162
|
+
|
|
163
|
+
Оценка выполненного pass:
|
|
164
|
+
- эффективность: medium/high;
|
|
165
|
+
- простота: medium;
|
|
166
|
+
- риск: medium, снижен явным `actionKey` и focused tests.
|
|
167
|
+
|
|
168
|
+
Проверка:
|
|
169
|
+
- unit tests: direct stats, reset/onChange, legacy Layer, keyed action, unkeyed action, keyed submenu;
|
|
170
|
+
- QA card 4: right-click menu open/close/click/submenu behavior.
|
|
171
|
+
|
|
172
|
+
### 6. FloatingWindow / DnD controller split
|
|
173
|
+
|
|
174
|
+
Статус: first controller layer done; pointer-drag migration deferred.
|
|
175
|
+
|
|
176
|
+
Что сделано:
|
|
177
|
+
- добавлен `useFloatingWindowController(...)` в `FloatingWindow.tsx`;
|
|
178
|
+
- controller владеет saved geometry (`position/size`), update counter, z-index stack, drag active state, mouse/touch header handlers, resize callbacks, viewport clamp and persistence `touch`;
|
|
179
|
+
- экспортированы `FloatingWindowProps`, `FloatingWindowPosition`, `FloatingWindowSize`, `FloatingWindowSavedGeometry`, `FloatingWindowControllerOptions`, `FloatingWindowController`;
|
|
180
|
+
- `FloatingWindowBase` остался compatibility visual wrapper над тем же `Rnd`, с теми же DOM/classes/header/close/overlay paths;
|
|
181
|
+
- `FloatingWindow` memo-child wrapper сохранён;
|
|
182
|
+
- `openWindows` registry уже использует `createUpdateApi`, отдельный `useWindowStack` не выделялся, чтобы не раздувать API без внешнего consumer.
|
|
183
|
+
|
|
184
|
+
Что не сделано сейчас:
|
|
185
|
+
- перенос drag на `useDraggableApi`/pointer-drag не делался: семантика другая (absolute `x/y`, limit clamp, touch id, z-index, persisted map), риск visual regression высокий;
|
|
186
|
+
- `DragBox` не трогался: это отдельный legacy/compat path;
|
|
187
|
+
- `SettingsDialog` JSX/portal/classes не менялись, он продолжает использовать `FloatingWindowBase`.
|
|
188
|
+
|
|
189
|
+
Оценка выполненного pass:
|
|
190
|
+
- эффективность: medium/high;
|
|
191
|
+
- простота: medium/hard;
|
|
192
|
+
- риск: medium, потому что DOM/Rnd/gesture semantics сохранены.
|
|
193
|
+
|
|
194
|
+
Проверка:
|
|
195
|
+
- `floatingWindowController.test.tsx`: restore saved geometry, resize stop commits/touches map, drag clamp and touch, live resize `onUpdate` forwarding;
|
|
196
|
+
- manual QA still needed: card 2 drag/resize/z-index/persisted geometry/no listener spam;
|
|
197
|
+
- card 20 SettingsDialog remains regression point because it uses `FloatingWindowBase`.
|
|
198
|
+
|
|
199
|
+
### 7. logsContext migration or deprecation
|
|
200
|
+
|
|
201
|
+
Статус: полезно решить направление, но не обязательно переписывать.
|
|
202
|
+
|
|
203
|
+
Что видно сейчас:
|
|
204
|
+
- `logsContext.tsx` содержит свою локальную `memoryGetOrCreate` на `localStorage`;
|
|
205
|
+
- `LogsTable` использует raw `AgGridReact`, хотя основной путь уже перешёл на `AgGridTable`;
|
|
206
|
+
- это выглядит как старый альтернативный logger implementation.
|
|
207
|
+
|
|
208
|
+
Варианты:
|
|
209
|
+
- мигрировать на общий `memoryStore`, `AgGridTable`, `colDefCentered` и общий logs controller;
|
|
210
|
+
- или пометить как deprecated/compat example, чтобы не было двух “правильных” logger API.
|
|
211
|
+
|
|
212
|
+
Оценка:
|
|
213
|
+
- эффективность: medium;
|
|
214
|
+
- простота: hard;
|
|
215
|
+
- риск: medium/high.
|
|
216
|
+
|
|
217
|
+
Почему не делать как quick fix:
|
|
218
|
+
- простая замена `AgGridReact` на `AgGridTable` не решает дублирование logger architecture;
|
|
219
|
+
- прямой `localStorage` лучше убирать вместе с решением о будущем этого модуля.
|
|
220
|
+
|
|
221
|
+
### 8. RightMenu controller cleanup
|
|
222
|
+
|
|
223
|
+
Статус: hook/controller split done for `DropdownMenu`; deeper registry rewrite skipped as low-effectiveness for now.
|
|
224
|
+
|
|
225
|
+
Что сделано:
|
|
226
|
+
- добавлен `useRightMenuController(...)` для open/fixed/select/submenu/drag-position state;
|
|
227
|
+
- `DropdownMenu` стал compatibility visual wrapper поверх hook/controller state;
|
|
228
|
+
- `createRightMenuController().Render` сохранён и продолжает рендерить `DropdownMenu`;
|
|
229
|
+
- docs и usage examples показывают hook для кастомного DOM, а default wrapper для старого вида.
|
|
230
|
+
|
|
231
|
+
Что пропущено:
|
|
232
|
+
- registry `createRightMenuController` не переводился на `createUpdateApi`: текущий single-render setter уже покрывает реальный consumer/test, а переписывание массива элементов сейчас даст мало пользы при риске совместимости;
|
|
233
|
+
- drag save проверен компиляцией и сохранением старого кода, но без отдельного DOM drag unit-test из-за сложности jsdom geometry.
|
|
234
|
+
|
|
235
|
+
Оценка:
|
|
236
|
+
- эффективность: medium;
|
|
237
|
+
- простота: medium;
|
|
238
|
+
- риск: low/medium после сохранения wrapper API.
|
|
239
|
+
|
|
240
|
+
Проверка:
|
|
241
|
+
- `createRightMenuController` mounted Render rerender;
|
|
242
|
+
- `useRightMenuController` direct open/fixed/select/submenu state;
|
|
243
|
+
- `DropdownMenu` hover submenu and fixed toggle compatibility.
|
|
244
|
+
|
|
245
|
+
### 9. Resizable primitive hook
|
|
246
|
+
|
|
247
|
+
Статус: skipped for now; low-effectiveness without consumers.
|
|
248
|
+
|
|
249
|
+
Что проверено:
|
|
250
|
+
- `rg` по `src`/`__test` нашёл `FResizableReact` только в export/docs and `mapResiReact` persistence wiring через `memoryStore`;
|
|
251
|
+
- реальных render-consumers, которые проверили бы новый `useResizableSave`, нет.
|
|
252
|
+
|
|
253
|
+
Почему не делать:
|
|
254
|
+
- hook был бы speculative refactor без проверки behavior;
|
|
255
|
+
- `FResizableReact` маленький compatibility wrapper, а риск сломать persisted size/save path выше пользы;
|
|
256
|
+
- возвращаться стоит только когда появится consumer или новая resize-секция в стенде.
|
|
257
|
+
|
|
258
|
+
Оценка:
|
|
259
|
+
- эффективность: low сейчас;
|
|
260
|
+
- простота: medium;
|
|
261
|
+
- риск: medium.
|
|
262
|
+
|
|
263
|
+
## Задачи, которые сейчас лучше не делать
|
|
264
|
+
|
|
265
|
+
### memoryStore core helper
|
|
266
|
+
|
|
267
|
+
Статус: пропускать без конкретного test/consumer.
|
|
268
|
+
|
|
269
|
+
Причина:
|
|
270
|
+
- `memoryStore` является core persistence helper для toolbar/columnState/UiSlot/search history/settings/window/right menu flows;
|
|
271
|
+
- `memoryUpdate` можно технически обернуть через `createUpdateApi(cur)`, но это почти не улучшит публичный contract;
|
|
272
|
+
- ошибка здесь ударит сразу по нескольким primitives.
|
|
273
|
+
|
|
274
|
+
Когда возвращаться:
|
|
275
|
+
- если появится test на stored object subscription + `memoryUpdate` + dirty event;
|
|
276
|
+
- если вводим отдельный стандарт “memory object update controller”.
|
|
277
|
+
|
|
278
|
+
### PageVisibilityProvider
|
|
279
|
+
|
|
280
|
+
Статус: не внедрять в обычный UI ради helper.
|
|
281
|
+
|
|
282
|
+
Причина:
|
|
283
|
+
- полезен только для polling, replay/canvas или тяжёлых анимаций, которые должны паузиться в hidden tab;
|
|
284
|
+
- без конкретного consumer это будет искусственное усложнение.
|
|
285
|
+
|
|
286
|
+
### StickerMenu
|
|
287
|
+
|
|
288
|
+
Статус: не делать shared-standard pass сейчас.
|
|
289
|
+
|
|
290
|
+
Причина:
|
|
291
|
+
- выглядит как standalone/demo-like side menu с hardcoded items and styles;
|
|
292
|
+
- прежде чем переписывать, нужно решить: это публичный primitive или legacy/demo.
|
|
293
|
+
|
|
294
|
+
Если делать:
|
|
295
|
+
- сначала определить API и usage card;
|
|
296
|
+
- затем уже `useStickerMenuController` + visual wrapper.
|
|
297
|
+
|
|
298
|
+
### DragBox broad rewrite
|
|
299
|
+
|
|
300
|
+
Статус: не делать вместе с FloatingWindow.
|
|
301
|
+
|
|
302
|
+
Причина:
|
|
303
|
+
- `DragBox` legacy/compat and low-level;
|
|
304
|
+
- новый код лучше вести через `useDraggableApi` или будущий `usePointerDrag`, но существующий compatibility path не ломать без consumer-driven миграции.
|
|
305
|
+
|
|
306
|
+
## Рекомендуемый порядок выполнения
|
|
307
|
+
|
|
308
|
+
Текущий hook/controller-first backlog из этого audit-pass выполнен настолько, насколько это осмысленно без новых consumers:
|
|
309
|
+
|
|
310
|
+
1. Logs API/controller split — done.
|
|
311
|
+
2. SettingsDialog controller split — done.
|
|
312
|
+
3. FloatingWindow first controller layer — done.
|
|
313
|
+
4. Resizable hook — skipped until real consumers appear.
|
|
314
|
+
|
|
315
|
+
Дальше не выполнять задачи ради задачи: `memoryStore`, обычный UI + `PageVisibilityProvider`, `StickerMenu`, `DragBox` broad rewrite and `FResizableReact` hook требуют отдельного consumer/test сценария.
|
|
316
|
+
|
|
317
|
+
## Дополнительный проход: notification layer и новые кандидаты
|
|
318
|
+
|
|
319
|
+
Дата: 2026-07-09.
|
|
320
|
+
|
|
321
|
+
### MessageEventLogs notification split — done
|
|
322
|
+
|
|
323
|
+
Что сделано:
|
|
324
|
+
- старый `MessageEventLogs` разбит на `useMessageEventLogsController`, `MessageEventLogsView` и `MessageEventLogCard`;
|
|
325
|
+
- `MessageEventLogs` и `logsApi.React.Message` оставлены compatibility wrappers;
|
|
326
|
+
- controller владеет queue/timers/filter by `minVarMessage`, `show`, `setShow`, `toggleShow`, `visibleNotifications`, `maxVisible`;
|
|
327
|
+
- QA card 9 теперь реально монтирует notification layer поверх log card, а не только описывает его в тексте;
|
|
328
|
+
- добавлен focused test `messageEventLogs.test.tsx` и usage docs.
|
|
329
|
+
|
|
330
|
+
Оценка:
|
|
331
|
+
- эффективность: high — убран старый module-level JSX store `tt`, таймеры и подписка вынесены из visual wrapper;
|
|
332
|
+
- простота: medium — глобальный `logsApi`/`datumMiniConst` сохранён ради совместимости;
|
|
333
|
+
- риск: low/medium — старый компонент остался, но уведомления теперь локальны для mounted layer вместо общего module-level React-element map.
|
|
334
|
+
|
|
335
|
+
### Кандидаты на следующие split passes
|
|
336
|
+
|
|
337
|
+
1. `menuMouse.tsx` + `menu.tsx`: context menu/action controller split.
|
|
338
|
+
- Идея: выделить `createContextMenuController` / `useMenuLayer` + `MenuView` и отдельный `useMenuAction` для async action/progress/submenu flow.
|
|
339
|
+
- Эффективность: high; простота: medium/hard; риск: medium.
|
|
340
|
+
- Почему не делать мелким quick fix: меню уже имеет compatibility/statistics контракты, нужен focused pass с tests по click/async/submenu/stats.
|
|
341
|
+
|
|
342
|
+
2. `LeftModal.tsx`: sidebar/modal controller split.
|
|
343
|
+
- Идея: вынести viewport listener, drag API, open/close animation state and imperative store из visual layer.
|
|
344
|
+
- Эффективность: medium/high; простота: medium/hard; риск: medium.
|
|
345
|
+
- Делать, когда появится задача по left/sidebar UX или QA card для ручной приёмки.
|
|
346
|
+
|
|
347
|
+
3. `logsContext.tsx`: migration/deprecation decision.
|
|
348
|
+
- Идея: не просто дробить файл, а решить направление: общий `logsController`/memoryStore или documented compat surface.
|
|
349
|
+
- Эффективность: medium/high; простота: hard; риск: medium/high.
|
|
350
|
+
- Без решения о будущем context logger переписывание будет косметическим.
|
|
351
|
+
|
|
352
|
+
4. `chartEngineReact.tsx`: `useChartEngineCanvas` + `ChartCanvasView`.
|
|
353
|
+
- Идея: вынести canvas lifecycle, `ResizeObserver`, event attach/destroy and RAF bridge из React wrapper.
|
|
354
|
+
- Эффективность: medium; простота: medium; риск: medium.
|
|
355
|
+
- Имеет смысл, если будет stand/test на chart canvas lifecycle.
|
|
356
|
+
|
|
357
|
+
5. `ParamsEditor.tsx`: full row-model/View split.
|
|
358
|
+
- Идея: продолжить после `useParamsEditorController`, но только через отдельную модель строк/inputs.
|
|
359
|
+
- Эффективность: medium/high; простота: hard; риск: high.
|
|
360
|
+
- Сейчас не брать как простую задачу: renderer рекурсивный и чувствителен к array mutation/resize/autostep UX.
|
|
361
|
+
|
|
362
|
+
6. `SettingsDialog.tsx`: full View split.
|
|
363
|
+
- Идея: controller уже есть; следующий шаг — вынести visual tree/portal/FloatingWindow composition.
|
|
364
|
+
- Эффективность: medium; простота: medium/hard; риск: medium.
|
|
365
|
+
- Делать только вместе с реальным изменением UI, иначе польза ниже риска.
|
|
366
|
+
|
|
367
|
+
Не включать как активные задачи без нового consumer/test: `memoryStore` core rewrite, `StickerMenu`, broad `DragBox`, `FResizableReact` hook.
|