wenay-react2 1.0.49 → 1.0.50

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 (49) hide show
  1. package/README.md +14 -14
  2. package/doc/EXAMPLE_USAGE.md +48 -0
  3. package/doc/PROJECT_FUNCTIONALITY.md +9 -0
  4. package/doc/PROJECT_RULES.md +27 -27
  5. package/doc/WENAY_REACT2_RENAMES.md +170 -170
  6. package/doc/changes/v1.0.41.md +35 -35
  7. package/doc/changes/v1.0.42.md +26 -26
  8. package/doc/changes/v1.0.43.md +10 -10
  9. package/doc/changes/v1.0.44.md +14 -14
  10. package/doc/changes/v1.0.45.md +8 -8
  11. package/doc/changes/v1.0.46.md +11 -11
  12. package/doc/changes/v1.0.47.md +9 -9
  13. package/doc/changes/v1.0.48.md +8 -8
  14. package/doc/changes/v1.0.49.md +7 -7
  15. package/doc/changes/v1.0.50.md +7 -0
  16. package/doc/examples/README.md +1 -1
  17. package/doc/examples/conference-client.html +34 -34
  18. package/doc/examples/conference-client.ts +212 -212
  19. package/doc/examples/conference-server.mjs +150 -150
  20. package/doc/examples/peer-call-media.tsx +7 -7
  21. package/doc/examples/stand.tsx +5 -5
  22. package/doc/native.md +37 -37
  23. package/doc/progress/README.md +13 -13
  24. package/doc/progress/architecture-fix-queue.md +74 -74
  25. package/doc/progress/column-state-present-gate.md +28 -28
  26. package/doc/progress/common2-adoption-1.0.73.md +28 -28
  27. package/doc/progress/common2-adoption-1.0.74.md +24 -24
  28. package/doc/progress/hook-controller-opportunities.md +363 -363
  29. package/doc/progress/hook-extraction-audit.md +195 -195
  30. package/doc/progress/public-surface-normalization.md +351 -351
  31. package/doc/progress/qa-stand-walkthrough-2026-07-12.md +62 -62
  32. package/doc/progress/stand-as-examples-audit.md +20 -20
  33. package/doc/progress/style-system-normalization.md +121 -121
  34. package/doc/target/README.md +32 -32
  35. package/doc/wenay-react2-rare.md +3 -0
  36. package/doc/wenay-react2.md +1 -1
  37. package/lib/common/src/hooks/useReplay.js +6 -2
  38. package/lib/common/testUseReact/qa.js +2 -2
  39. package/lib/common/testUseReact/replayVideo.d.ts +5 -0
  40. package/lib/common/testUseReact/replayVideo.js +98 -1
  41. package/lib/style/menuRight.css +19 -19
  42. package/lib/style/style.css +23 -23
  43. package/lib/style/tokens.css +184 -184
  44. package/package.json +54 -54
  45. package/doc/changes/v1.0.35.md +0 -26
  46. package/doc/changes/v1.0.37.md +0 -13
  47. package/doc/changes/v1.0.38.md +0 -48
  48. package/doc/changes/v1.0.39.md +0 -35
  49. package/doc/changes/v1.0.40.md +0 -15
package/README.md CHANGED
@@ -1,18 +1,18 @@
1
- # wenay-react2
2
-
3
- Documentation index only.
4
-
1
+ # wenay-react2
2
+
3
+ Documentation index only.
4
+
5
5
  - Brief API guide: [doc/wenay-react2.md](doc/wenay-react2.md)
6
- - React Native/headless entrypoint: [doc/native.md](doc/native.md)
7
- - Detailed / rare API guide: [doc/wenay-react2-rare.md](doc/wenay-react2-rare.md)
8
- - Project functionality map: [doc/PROJECT_FUNCTIONALITY.md](doc/PROJECT_FUNCTIONALITY.md)
9
- - Example usage standards: [doc/EXAMPLE_USAGE.md](doc/EXAMPLE_USAGE.md)
10
- - wenay-react2 rename map: [doc/WENAY_REACT2_RENAMES.md](doc/WENAY_REACT2_RENAMES.md)
11
- - Project rules for maintainers and AI agents: [doc/PROJECT_RULES.md](doc/PROJECT_RULES.md)
12
- - Recent version changes: [doc/changes/](doc/changes/)
13
-
14
- `wenay-common2` is an external dependency. Read its current docs from the installed module/package when needed; keep this README focused on `wenay-react2` documentation.
15
-
6
+ - React Native/headless entrypoint: [doc/native.md](doc/native.md)
7
+ - Detailed / rare API guide: [doc/wenay-react2-rare.md](doc/wenay-react2-rare.md)
8
+ - Project functionality map: [doc/PROJECT_FUNCTIONALITY.md](doc/PROJECT_FUNCTIONALITY.md)
9
+ - Example usage standards: [doc/EXAMPLE_USAGE.md](doc/EXAMPLE_USAGE.md)
10
+ - wenay-react2 rename map: [doc/WENAY_REACT2_RENAMES.md](doc/WENAY_REACT2_RENAMES.md)
11
+ - Project rules for maintainers and AI agents: [doc/PROJECT_RULES.md](doc/PROJECT_RULES.md)
12
+ - Recent version changes: [doc/changes/](doc/changes/)
13
+
14
+ `wenay-common2` is an external dependency. Read its current docs from the installed module/package when needed; keep this README focused on `wenay-react2` documentation.
15
+
16
16
  Feature-specific docs may also live next to their code, for example agGrid4 docs under `src/common/src/grid/agGrid4/`.
17
17
 
18
18
  ## Shipped examples
@@ -783,8 +783,56 @@ Standard:
783
783
  - For per-key grid updates, prefer `useStoreEach` or `useStoreReplayEach`
784
784
  feeding a grid/controller outside React state.
785
785
 
786
+ ## Lossless Replay Across a Transport Reconnect
787
+
788
+ Use when every retained event matters, such as orders, audit records, or
789
+ state-machine transitions. Obtain one RPC replay remote outside component
790
+ render and keep that same object through a temporary Socket.IO reconnect.
791
+
792
+ ```tsx
793
+ import { useRef } from "react"
794
+ import { useReplaySubscribe } from "wenay-react2"
795
+
796
+ // Created once by the RPC/client setup, not during OrdersFeed render.
797
+ // It remains the same object while its transport reconnects.
798
+ const ordersRemote = rpc.orders.replay
799
+
800
+ export function OrdersFeed() {
801
+ const applied = useRef<number[]>([])
802
+
803
+ const replay = useReplaySubscribe(ordersRemote, event => {
804
+ applied.current.push(event.id) // fold into a ref, store, or controller
805
+ }, {
806
+ since: 0,
807
+ policy: "queue",
808
+ onError: error => reportReplayGap(error),
809
+ })
810
+
811
+ return <span>{replay.ready ? `up to ${replay.seq()}` : "connecting"}</span>
812
+ }
813
+ ```
814
+
815
+ Why:
816
+
817
+ - `wenay-common2@^1.0.75` restores a stable remote after a transient transport
818
+ reconnect: live delivery, seq catch-up, queued race drain, then dedupe.
819
+ - `policy: "queue"` keeps every event available in the retained journal;
820
+ `"frame"` is intentionally lossy and belongs to visual/latest-value feeds.
821
+ - Callback identity and ordinary parent rerenders do not recreate the
822
+ subscription.
823
+
824
+ Standard:
825
+
826
+ - Do not call `restart()`, replace `ordersRemote`, remount with a new key, or
827
+ listen to Socket.IO in React just because the transport reconnected.
828
+ - Treat `replay.error` as a real recovery failure: a sacred journal gap without
829
+ a keyframe cannot be safely continued.
830
+ - `client.dispose()`/`close()` and hub token rotation are deliberate hard
831
+ teardowns. Start a new subscription only with the intentionally new remote.
832
+
786
833
  ## Replay Feed Into A Grid
787
834
 
835
+
788
836
  Use when a replay line carries store patches and the grid should update per key.
789
837
 
790
838
  ```tsx
@@ -278,6 +278,15 @@ Main APIs:
278
278
  Use these for high-frequency event lines, state sync from a replay source, and
279
279
  route hand-off between relay/direct transports.
280
280
 
281
+ Transport reconnect and replay recovery belong to `wenay-common2`, not these
282
+ hooks. With a stable RPC `remote`, common2 1.0.75 rebinds a transiently lost
283
+ physical Listen subscription, resumes from its own delivered seq, orders and
284
+ deduplicates catch-up, and reports an unrecoverable journal gap as an error.
285
+ `wenay-react2` owns only React mount/unmount, StrictMode-safe callback refs,
286
+ and controller state; it must not add reconnect listeners, retry timers, or a
287
+ second journal. Deliberate client disposal or token rotation is a hard
288
+ teardown, not an automatic recovery path.
289
+
281
290
  Avoid storing every frame in React state. High-frequency lines should fold into
282
291
  canvas, refs, external stores, or grid controllers. The controller exposes
283
292
  `seq()` and related getters so consumers can observe position without
@@ -19,35 +19,35 @@ Canonical documentation locations:
19
19
 
20
20
  `wenay-common2` documentation is not canonical in this repository. When common2 behavior matters, read the installed package/module docs and summarize only the React-facing impact in `doc/wenay-react2.md` or `doc/wenay-react2-rare.md`.
21
21
 
22
- ## wenay-common2 / common2 Updates
23
-
24
- In this repository, `common2` is the short name for `wenay-common2`. If a request says to check updates, update common/common2, read what changed in common, or similar, and no other dependency is named, assume it means `wenay-common2`.
25
-
26
- Before summarizing or acting on such an update, read:
27
-
28
- - `node_modules/wenay-common2/package.json` for the installed version.
29
- - `node_modules/wenay-common2/doc/changes/README.md` and the newest files in `node_modules/wenay-common2/doc/changes/` for what changed.
30
-
22
+ ## wenay-common2 / common2 Updates
23
+
24
+ In this repository, `common2` is the short name for `wenay-common2`. If a request says to check updates, update common/common2, read what changed in common, or similar, and no other dependency is named, assume it means `wenay-common2`.
25
+
26
+ Before summarizing or acting on such an update, read:
27
+
28
+ - `node_modules/wenay-common2/package.json` for the installed version.
29
+ - `node_modules/wenay-common2/doc/changes/README.md` and the newest files in `node_modules/wenay-common2/doc/changes/` for what changed.
30
+
31
31
  If the package is updated, read the changelog from the newly installed package before changing React-facing docs or code. Keep local docs focused on the React-facing impact.
32
32
 
33
- ## Target Backlog
34
-
35
- - `doc/target/` is the durable queue for dictated tasks and imported task direction. Read `doc/target/README.md` before acting on a request that starts from `target`.
36
- - `doc/target/my.md` must show task status. Before implementation, move/normalize the selected item into `In Progress`; when implementation is believed complete, move it to `Verify`; remove it from the queue only after acceptance checks pass and durable results are recorded.
37
- - `doc/progress/` is temporary and must not be used as the only task-status record. If a progress file is deleted at completion, `doc/target/my.md` must already be cleaned, moved to `Verify`, or otherwise updated with the next required check.
38
- - `target/*.md` files are source specs/prompts. Do not edit or delete them merely for progress tracking unless the user explicitly asks.
39
- ## Work Progress Files
40
-
41
- - For any task that is more than a tiny/local edit, create a temporary progress file before starting broad changes.
42
- - Put progress files under `doc/progress/`. This is the working-doc area, separate from public docs, roadmap docs, and release notes.
43
- - Name them by task, for example `doc/progress/replay-route-handoff.md`.
44
- - Keep the file short: goal, current checkpoints, notable decisions, blockers, and verification already run or still needed.
45
- - Update the progress file as checkpoints are completed, especially before switching context or making broad edits.
46
- - When the task is finished, delete the progress file.
47
- - Preserve only the durable outcome: final response, commit message, and, for publishable changes, the matching changelog/release-note entry.
48
- - If work is paused or blocked locally, leave the progress file in place and make the next required action explicit.
49
- - If the paused state must be committed or handed off, promote the useful part into a durable doc such as `ROADMAP`, `RECOMMENDATIONS`, `doc/target`, or `doc/changes`, instead of relying on an ignored progress file.
50
-
33
+ ## Target Backlog
34
+
35
+ - `doc/target/` is the durable queue for dictated tasks and imported task direction. Read `doc/target/README.md` before acting on a request that starts from `target`.
36
+ - `doc/target/my.md` must show task status. Before implementation, move/normalize the selected item into `In Progress`; when implementation is believed complete, move it to `Verify`; remove it from the queue only after acceptance checks pass and durable results are recorded.
37
+ - `doc/progress/` is temporary and must not be used as the only task-status record. If a progress file is deleted at completion, `doc/target/my.md` must already be cleaned, moved to `Verify`, or otherwise updated with the next required check.
38
+ - `target/*.md` files are source specs/prompts. Do not edit or delete them merely for progress tracking unless the user explicitly asks.
39
+ ## Work Progress Files
40
+
41
+ - For any task that is more than a tiny/local edit, create a temporary progress file before starting broad changes.
42
+ - Put progress files under `doc/progress/`. This is the working-doc area, separate from public docs, roadmap docs, and release notes.
43
+ - Name them by task, for example `doc/progress/replay-route-handoff.md`.
44
+ - Keep the file short: goal, current checkpoints, notable decisions, blockers, and verification already run or still needed.
45
+ - Update the progress file as checkpoints are completed, especially before switching context or making broad edits.
46
+ - When the task is finished, delete the progress file.
47
+ - Preserve only the durable outcome: final response, commit message, and, for publishable changes, the matching changelog/release-note entry.
48
+ - If work is paused or blocked locally, leave the progress file in place and make the next required action explicit.
49
+ - If the paused state must be committed or handed off, promote the useful part into a durable doc such as `ROADMAP`, `RECOMMENDATIONS`, `doc/target`, or `doc/changes`, instead of relying on an ignored progress file.
50
+
51
51
  ## Recent Changes Catalog
52
52
 
53
53
  Every meaningful code, public API, dependency, migration, or documentation-policy change must add or update a file in `doc/changes/`.
@@ -1,177 +1,177 @@
1
- # wenay-react2 Rename Map
2
-
3
- Date: 2026-07-08
4
-
5
- This is a breaking rename map. The package does not keep old aliases for these names.
6
-
7
- ## Root
8
-
9
- | Old | New |
10
- | --- | --- |
11
- | `v2` | `kit` |
12
- | `test()` | removed |
13
- | `LegacyMenuElement` | `MenuItemElement` |
14
-
15
- ## Persistent Memory
16
-
17
- | Old | New |
18
- | --- | --- |
19
- | `Cash` | `memoryCache` |
20
- | `MemoryMap` | `memoryMaps` |
21
- | `staticGetAdd` | `memoryGetOrCreate` |
22
- | `staticGetById` | `memoryGetById` |
23
- | `staticSet` | `memorySet` |
24
- | `staticGet` | `memoryGet` |
25
- | `staticUpdate` | `memoryUpdate` |
26
- | `staticMarkDirty` | `memoryMarkDirty` |
27
- | `staticProps` | `memoryProps` |
28
- | `mapMemory.tsx` | `memoryStore.tsx` |
29
-
30
- ## Outside Click And Keyboard
31
-
32
- | Old | New |
33
- | --- | --- |
34
- | `DivOutsideClick` | `OutsideClickArea` |
35
- | `DivOutsideClick2` | `OutsideClickArea` |
36
- | `ButtonOutClick` | `OutsideButton` |
37
- | `ButtonHover` | `HoverButton` |
38
- | `ButtonAbs` | `AbsoluteButton` |
39
- | `StyleOtherColum` | `StyleOtherColumn` |
40
- | `useOutsideOld` | `useOutsideRef` |
41
- | `useAddDownAnyKey` | `useKeyboard` |
42
- | `useKeyDown` | `useKeyboard` |
43
- | `useAnyKey` | `useKeyboard` |
44
- | `keyDownApi` | `keyboard` |
45
- | `KeyDown` | `keyboardState` |
46
- | `AnyKeyDownApi` | `KeyboardApi` |
47
- | `addDownAnyKey` | removed |
48
- | `useAddDownAnyKeyOld` | removed |
49
- | `useAddDownAnyKey.ts` | `useKeyboard.ts` |
50
-
1
+ # wenay-react2 Rename Map
2
+
3
+ Date: 2026-07-08
4
+
5
+ This is a breaking rename map. The package does not keep old aliases for these names.
6
+
7
+ ## Root
8
+
9
+ | Old | New |
10
+ | --- | --- |
11
+ | `v2` | `kit` |
12
+ | `test()` | removed |
13
+ | `LegacyMenuElement` | `MenuItemElement` |
14
+
15
+ ## Persistent Memory
16
+
17
+ | Old | New |
18
+ | --- | --- |
19
+ | `Cash` | `memoryCache` |
20
+ | `MemoryMap` | `memoryMaps` |
21
+ | `staticGetAdd` | `memoryGetOrCreate` |
22
+ | `staticGetById` | `memoryGetById` |
23
+ | `staticSet` | `memorySet` |
24
+ | `staticGet` | `memoryGet` |
25
+ | `staticUpdate` | `memoryUpdate` |
26
+ | `staticMarkDirty` | `memoryMarkDirty` |
27
+ | `staticProps` | `memoryProps` |
28
+ | `mapMemory.tsx` | `memoryStore.tsx` |
29
+
30
+ ## Outside Click And Keyboard
31
+
32
+ | Old | New |
33
+ | --- | --- |
34
+ | `DivOutsideClick` | `OutsideClickArea` |
35
+ | `DivOutsideClick2` | `OutsideClickArea` |
36
+ | `ButtonOutClick` | `OutsideButton` |
37
+ | `ButtonHover` | `HoverButton` |
38
+ | `ButtonAbs` | `AbsoluteButton` |
39
+ | `StyleOtherColum` | `StyleOtherColumn` |
40
+ | `useOutsideOld` | `useOutsideRef` |
41
+ | `useAddDownAnyKey` | `useKeyboard` |
42
+ | `useKeyDown` | `useKeyboard` |
43
+ | `useAnyKey` | `useKeyboard` |
44
+ | `keyDownApi` | `keyboard` |
45
+ | `KeyDown` | `keyboardState` |
46
+ | `AnyKeyDownApi` | `KeyboardApi` |
47
+ | `addDownAnyKey` | removed |
48
+ | `useAddDownAnyKeyOld` | removed |
49
+ | `useAddDownAnyKey.ts` | `useKeyboard.ts` |
50
+
51
51
  ## Floating Windows And Drag
52
52
 
53
53
  | Old | New |
54
54
  | --- | --- |
55
- | `DraggableOutlineDiv` | `OutlineDragDemo` |
56
- | `DivRnd3` | `FloatingWindow` |
57
- | `DivRndBase3` | `FloatingWindowBase` |
58
- | `ExRNDMap3` | `floatingWindowMap` |
59
- | `tRndUpdate` | `FloatingWindowUpdate` |
60
- | `Drag22` | `DragBox` |
61
- | `Drag2Props` | `DragBoxProps` |
62
- | `Drag2` | `DragArea` |
63
- | `RNDFunc3.tsx` | `FloatingWindow.tsx` |
64
- | `RNDFunc.tsx` | `DragArea.tsx` |
65
-
66
- ## Modal And Inputs
67
-
68
- | Old | New |
69
- | --- | --- |
70
- | `InputPage` | `TextInputPanel` |
71
- | `InputPageModal` | `TextInputModal` |
72
- | `InputFile` | `FileInputPanel` |
73
- | `InputFileModal` | `FileInputModal` |
74
- | `PageModalFree` | `FreeModal` |
75
- | `GetModalJSX` | `createModalElementStore` |
76
- | `GetModalFuncJSX` | `createModalRenderStore` |
77
- | `setModalJSX` argument | `modal` argument |
78
- | `LegacyModalSetter` | `ModalSetter` |
79
- | `useModalOld` | removed |
80
- | `useModalApi` | removed |
81
-
82
- ## Params
83
-
84
- | Old | New |
85
- | --- | --- |
86
- | `ParametersReact` | `ParamsEditor` |
87
- | `ParametersBaseReact` | `ParamsEditorBase` |
88
- | `ParametersEngine.tsx` | `ParamsEditor.tsx` |
89
- | `EditParams2` | `ParamsEdit` |
90
- | `EditParams3` | `ParamsArrayEdit` |
91
- | `CParameter` | `ParamRow` |
92
- | `FButton` | `ParamLabelContent` |
93
- | `FNameButton` | `ParamToggleLabel` |
94
- | `SetAutoStepForElement` | `setAutoStepForElement` |
95
-
96
- ## Menu
97
-
98
- | Old | New |
99
- | --- | --- |
100
- | `MenuBase` | `Menu` |
101
- | `MenuBaseProps` | `MenuProps` |
102
- | `tMenuReact` | `MenuItem` |
103
- | `tMenuReactStrictly` | `MenuItemStrict` |
104
- | `TimeNum` | `MenuProgress` |
105
- | `tCounters` | `MenuProgressCounters` |
106
- | `GetMouseMenuApi` | `createContextMenu` |
107
- | `mouseMenuApi` | `contextMenu` |
108
- | `ReactMouse` | `Layer` |
109
- | `ReactMenu` | `MenuView` |
110
- | `GetMenuR` | `createRightClickMenu` |
111
- | `MenuRightApi` | `createRightMenuController` |
112
- | `DropdownMenuTest` | `RightMenuDemo` |
113
-
114
- ## Buttons And Grid
115
-
116
- | Old | New |
117
- | --- | --- |
118
- | `MiniButton2` | `PopupButton` |
119
- | `MiniButton3` | removed |
120
- | `AgGridMy` | `AgGridTable` |
121
- | `AgGridMyProps` | `AgGridTableProps` |
122
- | `AgGridMyInner` | `AgGridTableInner` |
123
- | `applyTransactionAsyncUpdate2` | `applyGridRows` |
124
- | `applyTransactionAsyncUpdate` | removed; use `applyGridRows` or `useAgGrid` |
125
- | `getUpdateTable` | removed |
126
- | `getComparatorGrid` | removed; use `numericComparator` |
127
- | `applyTransactionAsyncUpdate.tsx` | `gridRows.ts` |
128
-
129
-
130
-
131
- ## Cache Helpers
132
-
133
- | Old | New |
134
- | --- | --- |
135
- | `tDirtyListener` | `DirtyListener` |
136
- | `IServerSaveBasePromise` | `CacheStorage` |
137
- | `CSaveToCache` | `BrowserCacheStorage` |
138
- | `CSaveToLocalStorage` | `LocalStorageCache` |
139
- | `CacheG` | `browserCacheStorage` |
140
- | `CacheLocal` | `localStorageCache` |
141
- | `CacheFuncMapBase` | `createCacheMapWithStorage` |
142
- | `CacheFuncMap` | `createCacheMap` |
55
+ | `DraggableOutlineDiv` | `OutlineDragDemo` |
56
+ | `DivRnd3` | `FloatingWindow` |
57
+ | `DivRndBase3` | `FloatingWindowBase` |
58
+ | `ExRNDMap3` | `floatingWindowMap` |
59
+ | `tRndUpdate` | `FloatingWindowUpdate` |
60
+ | `Drag22` | `DragBox` |
61
+ | `Drag2Props` | `DragBoxProps` |
62
+ | `Drag2` | `DragArea` |
63
+ | `RNDFunc3.tsx` | `FloatingWindow.tsx` |
64
+ | `RNDFunc.tsx` | `DragArea.tsx` |
65
+
66
+ ## Modal And Inputs
67
+
68
+ | Old | New |
69
+ | --- | --- |
70
+ | `InputPage` | `TextInputPanel` |
71
+ | `InputPageModal` | `TextInputModal` |
72
+ | `InputFile` | `FileInputPanel` |
73
+ | `InputFileModal` | `FileInputModal` |
74
+ | `PageModalFree` | `FreeModal` |
75
+ | `GetModalJSX` | `createModalElementStore` |
76
+ | `GetModalFuncJSX` | `createModalRenderStore` |
77
+ | `setModalJSX` argument | `modal` argument |
78
+ | `LegacyModalSetter` | `ModalSetter` |
79
+ | `useModalOld` | removed |
80
+ | `useModalApi` | removed |
81
+
82
+ ## Params
83
+
84
+ | Old | New |
85
+ | --- | --- |
86
+ | `ParametersReact` | `ParamsEditor` |
87
+ | `ParametersBaseReact` | `ParamsEditorBase` |
88
+ | `ParametersEngine.tsx` | `ParamsEditor.tsx` |
89
+ | `EditParams2` | `ParamsEdit` |
90
+ | `EditParams3` | `ParamsArrayEdit` |
91
+ | `CParameter` | `ParamRow` |
92
+ | `FButton` | `ParamLabelContent` |
93
+ | `FNameButton` | `ParamToggleLabel` |
94
+ | `SetAutoStepForElement` | `setAutoStepForElement` |
95
+
96
+ ## Menu
97
+
98
+ | Old | New |
99
+ | --- | --- |
100
+ | `MenuBase` | `Menu` |
101
+ | `MenuBaseProps` | `MenuProps` |
102
+ | `tMenuReact` | `MenuItem` |
103
+ | `tMenuReactStrictly` | `MenuItemStrict` |
104
+ | `TimeNum` | `MenuProgress` |
105
+ | `tCounters` | `MenuProgressCounters` |
106
+ | `GetMouseMenuApi` | `createContextMenu` |
107
+ | `mouseMenuApi` | `contextMenu` |
108
+ | `ReactMouse` | `Layer` |
109
+ | `ReactMenu` | `MenuView` |
110
+ | `GetMenuR` | `createRightClickMenu` |
111
+ | `MenuRightApi` | `createRightMenuController` |
112
+ | `DropdownMenuTest` | `RightMenuDemo` |
113
+
114
+ ## Buttons And Grid
115
+
116
+ | Old | New |
117
+ | --- | --- |
118
+ | `MiniButton2` | `PopupButton` |
119
+ | `MiniButton3` | removed |
120
+ | `AgGridMy` | `AgGridTable` |
121
+ | `AgGridMyProps` | `AgGridTableProps` |
122
+ | `AgGridMyInner` | `AgGridTableInner` |
123
+ | `applyTransactionAsyncUpdate2` | `applyGridRows` |
124
+ | `applyTransactionAsyncUpdate` | removed; use `applyGridRows` or `useAgGrid` |
125
+ | `getUpdateTable` | removed |
126
+ | `getComparatorGrid` | removed; use `numericComparator` |
127
+ | `applyTransactionAsyncUpdate.tsx` | `gridRows.ts` |
128
+
129
+
130
+
131
+ ## Cache Helpers
132
+
133
+ | Old | New |
134
+ | --- | --- |
135
+ | `tDirtyListener` | `DirtyListener` |
136
+ | `IServerSaveBasePromise` | `CacheStorage` |
137
+ | `CSaveToCache` | `BrowserCacheStorage` |
138
+ | `CSaveToLocalStorage` | `LocalStorageCache` |
139
+ | `CacheG` | `browserCacheStorage` |
140
+ | `CacheLocal` | `localStorageCache` |
141
+ | `CacheFuncMapBase` | `createCacheMapWithStorage` |
142
+ | `CacheFuncMap` | `createCacheMap` |
143
143
  | `ObjectStringToDate` | `restoreDates` |
144
- ## Public Type Prefix Cleanup
145
-
146
- | Old | New |
147
- | --- | --- |
148
- | `tToolbarItem` | `ToolbarItem` |
149
- | `tToolbarConfig` | `ToolbarConfig` |
150
- | `tToolbarDensity` | `ToolbarDensity` |
151
- | `tUiListConfig` | `UiListConfig` |
152
- | `tUiListSource` | `UiListSource` |
153
- | `tColumnMeta` | `ColumnMeta` |
154
- | `tColumnsSort` | `ColumnsSort` |
155
- | `tColumnsConfig` | `ColumnsConfig` |
156
- | `tMenuStripItem` | `MenuStripItem` |
157
- | `tReorderOptions` | `ReorderOptions` |
158
- | `tReorderItem` | `ReorderItem` |
159
- | `tReorderBoardOptions` | `ReorderBoardOptions` |
160
- | `tBoardPos` | `BoardPosition` |
161
- | `tBoardColumn` | `BoardColumn` |
162
- | `tSettingsSection` | `SettingsSection` |
163
- | `tThemeMode` | `ThemeMode` |
164
- | `tMapChangeListener` | `MapChangeListener` |
165
- | `tCallFuncAgGrid` | `AgGridClassRule` |
166
- | `tLogsInput` | `LogInput` |
167
- | `tLogs` | `LogEntry` |
168
- | `MenuRightPosition2` | `MenuRightVerticalPosition` |
169
- | `position2` prop/state | `verticalPosition` |
170
- | `PageLogs2` | `LogsPage` |
144
+ ## Public Type Prefix Cleanup
145
+
146
+ | Old | New |
147
+ | --- | --- |
148
+ | `tToolbarItem` | `ToolbarItem` |
149
+ | `tToolbarConfig` | `ToolbarConfig` |
150
+ | `tToolbarDensity` | `ToolbarDensity` |
151
+ | `tUiListConfig` | `UiListConfig` |
152
+ | `tUiListSource` | `UiListSource` |
153
+ | `tColumnMeta` | `ColumnMeta` |
154
+ | `tColumnsSort` | `ColumnsSort` |
155
+ | `tColumnsConfig` | `ColumnsConfig` |
156
+ | `tMenuStripItem` | `MenuStripItem` |
157
+ | `tReorderOptions` | `ReorderOptions` |
158
+ | `tReorderItem` | `ReorderItem` |
159
+ | `tReorderBoardOptions` | `ReorderBoardOptions` |
160
+ | `tBoardPos` | `BoardPosition` |
161
+ | `tBoardColumn` | `BoardColumn` |
162
+ | `tSettingsSection` | `SettingsSection` |
163
+ | `tThemeMode` | `ThemeMode` |
164
+ | `tMapChangeListener` | `MapChangeListener` |
165
+ | `tCallFuncAgGrid` | `AgGridClassRule` |
166
+ | `tLogsInput` | `LogInput` |
167
+ | `tLogs` | `LogEntry` |
168
+ | `MenuRightPosition2` | `MenuRightVerticalPosition` |
169
+ | `position2` prop/state | `verticalPosition` |
170
+ | `PageLogs2` | `LogsPage` |
171
171
  | `logs3.tsx` | `logsContext.tsx` |
172
- ## wenay-common2 Names Used Here
173
-
174
- | Old common2 alias | New name used in this package |
175
- | --- | --- |
176
- | `GetDblPrecision` / `GetDblPrecision2` | `decimals` |
172
+ ## wenay-common2 Names Used Here
173
+
174
+ | Old common2 alias | New name used in this package |
175
+ | --- | --- |
176
+ | `GetDblPrecision` / `GetDblPrecision2` | `decimals` |
177
177
  | `NormalizeDouble` | `round` |
@@ -1,36 +1,36 @@
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
- - Added: `createColumnGrid` / `useColumnGrid`, a high-level column kit that infers `ColumnMeta` from ag-grid `columnDefs`, accepts optional default `data`/`getId`, and returns ready table, menu, dots, cards, toolbar, settings, and view surfaces.
14
- - Changed: Added QA card 32 for the default grid-menu wrapper, including the built-in dots overlay driving both table and card representations.
15
- - Changed: `createColumnGrid.View` now defaults `controls="auto"` to the dots overlay; `Dots` defaults to all columns, default toolbar items toggle column visibility, and `autoSizeOnColumnCountChange` optionally fits only when visible column count changes.
16
- - Changed: Updated `wenay-common2` from `^1.0.65` to `^1.0.70`.
17
- - Reason: common2 1.0.66 adds the `Media` namespace (browser mic/camera capture as binary `Listen` sources, fixed-header media frames via `encodeMediaFrame`/`decodeMediaFrame`, `replay:true` media mode in `createRpcServerAuto`, `wenay-common2/media` export). Media lines are ordinary Listen/replay lines, so existing `useListen*`/`useReplay*` hooks consume them without new React surface; the brief/rare replay docs now record this instead of adding hooks.
18
- - Reason: common2 1.0.67 adds `Replay.createRouteCoordinator` (policy-gated relay<->direct routing over pure `RouteConnector` transports; data continuity via `replayRouteSubscribe`). Coordinator `link.subscribe` returns the same handle shape as our route hooks (`ready, seq(), label(), active()`); a React adapter for coordinator links is recorded as a target goal, existing route hooks stay the manual `switchRoute` surface.
19
- - Reason: common2 1.0.68 completes the direct path: `Replay.createSignalHub` (WebRTC signaling over the existing socket/RPC control channel), `Replay.createWebRtcConnector` (the direct `RouteConnector`; `rtc` is an injected runtime factory — in the browser `() => new RTCPeerConnection(cfg)`, which is exactly this library's environment), `acceptWebRtcDirect`, and `serveReplayChannel`/`channelReplayRemote` (replay wire over any ordered channel). Together 1.0.66-1.0.68 form the media -> replay line -> policy-routed relay/direct stack; React-side adoption goals are recorded in `doc/target/my.md`.
20
- - Reason: common2 1.0.69 adds the `Peer` namespace (`wenay-common2/peer`) — the one-call SDK over rpc + store + replay + route coordinator (`createPeerHost` / `createPeerClient` / `createPatchRelayJournal`; per-peer mirrored stores survive relay<->direct hand-offs in one seq space) and fixes real-browser ICE candidate serialization. This reframes our coordinator-adapter target goal: the React surface should sit on `Peer` (peer store mirror + route control), not on raw coordinator links. 1.0.70 ships oracle suites and the demo stand inside the npm package as living examples.
21
- - Added: `useCacheMapPersistence(cache, delay?)` in `utils/cache.ts` (+ exported `CacheMap` type) - the documented load + onDirty->saveDebounced app contract as one hook returning `{isDirty, flush, save, reload}`; the three duplicated effects in QA cards 20/21/25 now use it.
22
- - Added: `useResizeObserver(onResize)` / `useElementSize()` in `components/MyResizeObserver.tsx` - hook-shaped entry over the existing `CResizeObserver` singleton (callback ref, cb through a ref, rounded equality-guarded width/height state + live `getSize()`); `setResizeableElement` path untouched; QA card 19 migrated off its manual `ResizeObserver`+rAF wiring.
23
- - Added: `useLogsPageTable()` -> `LogsPageTableController` in `logs/logs.tsx` - the full-page logs table moved to the controller pattern (mount-time row snapshot, `applyTransactionAsync` appends, importance filter deduplicated into one `applyImportanceFilter` method); `PageLogs` is now a thin wrapper over `table.gridProps`.
24
- - Reason: the three do-now candidates from the hook-extraction audit (`doc/progress/hook-extraction-audit.md`): each removes real imperative duplication and has a live QA consumer; old names stay compatibility wrappers, public API unchanged.
25
- - Changed: Architecture audit (2026-07-09, 4 subsystem readers + core reading) recorded: fix queue in `doc/target/my.md` (A1-A10: memoryStore layering inversion, getLogsApi shared state, dead menuR, columnState barrel pulling ag-grid runtime, quadruplicated pinFixed idiom, updateBy resubscribe/ordering, drag primitive x4, undisposed onChange subscriptions, triple modal systems, naming/SSR pack); dead/suspicious surfaces added to the rare-doc Cleanup Inventory. No code changed by the audit itself.
26
- - Changed (A1): persisted maps (`floatingWindowMap`, `mapResiReact`, `mapRightMenu`) moved to the new utils leaf `utils/persistedMaps.ts`; FloatingWindow/Resizable/RightMenuStore now import and re-export them (public surface unchanged), `memoryStore` no longer imports the component layer - the utils->components backward edge is gone; `api.tsx` layer comments corrected.
27
- - Changed (A4): `columnState/index.ts` barrel is ag-grid-free again - `createColumnGrid` (AgGridTable + createToolbar runtime) is exported from the root api via its own module, grid-less consumers can import the columnState barrel directly.
28
- - Changed (A2): `getLogsApi<T>()` builds fresh per-call state (own map/mini/settings; optional `settingsKey` in `LogsApiOptions` persists instance settings); the global `logsApi` explicitly injects the legacy shared module state, so all existing consumers and QA card 9 are behavior-identical; React views bound per instance via optional state props defaulting to the legacy state.
29
- - Changed (A5): the quadruplicated `filter(!fixed)`+pinFixed idiom (columnState.normalize, ColumnsMenu.movedOrder, Toolbar.normalize, Toolbar.Settings.movedOrder) now shares `utils/fixedOrder.ts` (`pinFixedOrder`, `movedOrderWithFixed`), exported from the utils barrel; dead `renderBy`/`updateBy` imports dropped from columnState.
30
- - Changed (A6): `updateBy` - imperative `f` goes through a ref (inline callbacks no longer resubscribe every render); React notifiers and imperative callbacks live in separate sets, so `renderByLast`/`renderByRevers` affect ONLY React subscribers while `f` callbacks always run in subscription order (before React notifiers), matching the documented contract; reentrant `renderBy` on the same object coalesces (bounded passes).
31
- - Changed (A8): `createToolbar().api.dispose()` and `createColumnGrid().dispose()` release factory-lifetime subscriptions (external-source onChange, config onChange, pending fit RAF) - repeated factories over one key no longer accumulate permanent listeners; `createColumnGrid` re-seeds `visibleCount` on grid re-attach so the auto-fit is not mis-skipped after a remount.
32
- - Changed (A10, safe part): `searchHistory.items`/`use()` no longer mutate persisted state on read (normalization moved to the write path); `window` reads guarded in `RightMenu` render clamp, `LeftModal.useViewport`, and `ApiLeftMenu`'s import-time default element (SSR/tests).
33
- - Verification (architecture pass): `npx tsc -p tsconfig.qa-check.json --noEmit`; `npm run testjest -- --runInBand` (45/45); `npm run build`; QA stand 3010 fresh load with zero console errors; spot checks - card 21 place persisted across reload (persistedMaps path), card 25 toolbar click updates last action (fixedOrder + updateBy path), card 32 table/cards switch + dots overlay, card 9 add-log appends rows (isolated getLogsApi, global path).
34
- - Verification: `npx tsc -p tsconfig.qa-check.json --noEmit`; `npm run testjest -- --runInBand` (45/45); `npm run build`; QA stand 3010: card 21 place switch survives F5 (hook persistence), card 19 fixed-parent 150->240px updates select 92->180px and container 150x51->240x51 via `useElementSize`, card 9 add-log appends rows through the controller.
35
- - Verification: `npx tsc --noEmit`; `npm run build`; QA stand `http://127.0.0.1:3010/` and `/src/testReact.tsx` return HTTP 200.
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
+ - Added: `createColumnGrid` / `useColumnGrid`, a high-level column kit that infers `ColumnMeta` from ag-grid `columnDefs`, accepts optional default `data`/`getId`, and returns ready table, menu, dots, cards, toolbar, settings, and view surfaces.
14
+ - Changed: Added QA card 32 for the default grid-menu wrapper, including the built-in dots overlay driving both table and card representations.
15
+ - Changed: `createColumnGrid.View` now defaults `controls="auto"` to the dots overlay; `Dots` defaults to all columns, default toolbar items toggle column visibility, and `autoSizeOnColumnCountChange` optionally fits only when visible column count changes.
16
+ - Changed: Updated `wenay-common2` from `^1.0.65` to `^1.0.70`.
17
+ - Reason: common2 1.0.66 adds the `Media` namespace (browser mic/camera capture as binary `Listen` sources, fixed-header media frames via `encodeMediaFrame`/`decodeMediaFrame`, `replay:true` media mode in `createRpcServerAuto`, `wenay-common2/media` export). Media lines are ordinary Listen/replay lines, so existing `useListen*`/`useReplay*` hooks consume them without new React surface; the brief/rare replay docs now record this instead of adding hooks.
18
+ - Reason: common2 1.0.67 adds `Replay.createRouteCoordinator` (policy-gated relay<->direct routing over pure `RouteConnector` transports; data continuity via `replayRouteSubscribe`). Coordinator `link.subscribe` returns the same handle shape as our route hooks (`ready, seq(), label(), active()`); a React adapter for coordinator links is recorded as a target goal, existing route hooks stay the manual `switchRoute` surface.
19
+ - Reason: common2 1.0.68 completes the direct path: `Replay.createSignalHub` (WebRTC signaling over the existing socket/RPC control channel), `Replay.createWebRtcConnector` (the direct `RouteConnector`; `rtc` is an injected runtime factory — in the browser `() => new RTCPeerConnection(cfg)`, which is exactly this library's environment), `acceptWebRtcDirect`, and `serveReplayChannel`/`channelReplayRemote` (replay wire over any ordered channel). Together 1.0.66-1.0.68 form the media -> replay line -> policy-routed relay/direct stack; React-side adoption goals are recorded in `doc/target/my.md`.
20
+ - Reason: common2 1.0.69 adds the `Peer` namespace (`wenay-common2/peer`) — the one-call SDK over rpc + store + replay + route coordinator (`createPeerHost` / `createPeerClient` / `createPatchRelayJournal`; per-peer mirrored stores survive relay<->direct hand-offs in one seq space) and fixes real-browser ICE candidate serialization. This reframes our coordinator-adapter target goal: the React surface should sit on `Peer` (peer store mirror + route control), not on raw coordinator links. 1.0.70 ships oracle suites and the demo stand inside the npm package as living examples.
21
+ - Added: `useCacheMapPersistence(cache, delay?)` in `utils/cache.ts` (+ exported `CacheMap` type) - the documented load + onDirty->saveDebounced app contract as one hook returning `{isDirty, flush, save, reload}`; the three duplicated effects in QA cards 20/21/25 now use it.
22
+ - Added: `useResizeObserver(onResize)` / `useElementSize()` in `components/MyResizeObserver.tsx` - hook-shaped entry over the existing `CResizeObserver` singleton (callback ref, cb through a ref, rounded equality-guarded width/height state + live `getSize()`); `setResizeableElement` path untouched; QA card 19 migrated off its manual `ResizeObserver`+rAF wiring.
23
+ - Added: `useLogsPageTable()` -> `LogsPageTableController` in `logs/logs.tsx` - the full-page logs table moved to the controller pattern (mount-time row snapshot, `applyTransactionAsync` appends, importance filter deduplicated into one `applyImportanceFilter` method); `PageLogs` is now a thin wrapper over `table.gridProps`.
24
+ - Reason: the three do-now candidates from the hook-extraction audit (`doc/progress/hook-extraction-audit.md`): each removes real imperative duplication and has a live QA consumer; old names stay compatibility wrappers, public API unchanged.
25
+ - Changed: Architecture audit (2026-07-09, 4 subsystem readers + core reading) recorded: fix queue in `doc/target/my.md` (A1-A10: memoryStore layering inversion, getLogsApi shared state, dead menuR, columnState barrel pulling ag-grid runtime, quadruplicated pinFixed idiom, updateBy resubscribe/ordering, drag primitive x4, undisposed onChange subscriptions, triple modal systems, naming/SSR pack); dead/suspicious surfaces added to the rare-doc Cleanup Inventory. No code changed by the audit itself.
26
+ - Changed (A1): persisted maps (`floatingWindowMap`, `mapResiReact`, `mapRightMenu`) moved to the new utils leaf `utils/persistedMaps.ts`; FloatingWindow/Resizable/RightMenuStore now import and re-export them (public surface unchanged), `memoryStore` no longer imports the component layer - the utils->components backward edge is gone; `api.tsx` layer comments corrected.
27
+ - Changed (A4): `columnState/index.ts` barrel is ag-grid-free again - `createColumnGrid` (AgGridTable + createToolbar runtime) is exported from the root api via its own module, grid-less consumers can import the columnState barrel directly.
28
+ - Changed (A2): `getLogsApi<T>()` builds fresh per-call state (own map/mini/settings; optional `settingsKey` in `LogsApiOptions` persists instance settings); the global `logsApi` explicitly injects the legacy shared module state, so all existing consumers and QA card 9 are behavior-identical; React views bound per instance via optional state props defaulting to the legacy state.
29
+ - Changed (A5): the quadruplicated `filter(!fixed)`+pinFixed idiom (columnState.normalize, ColumnsMenu.movedOrder, Toolbar.normalize, Toolbar.Settings.movedOrder) now shares `utils/fixedOrder.ts` (`pinFixedOrder`, `movedOrderWithFixed`), exported from the utils barrel; dead `renderBy`/`updateBy` imports dropped from columnState.
30
+ - Changed (A6): `updateBy` - imperative `f` goes through a ref (inline callbacks no longer resubscribe every render); React notifiers and imperative callbacks live in separate sets, so `renderByLast`/`renderByRevers` affect ONLY React subscribers while `f` callbacks always run in subscription order (before React notifiers), matching the documented contract; reentrant `renderBy` on the same object coalesces (bounded passes).
31
+ - Changed (A8): `createToolbar().api.dispose()` and `createColumnGrid().dispose()` release factory-lifetime subscriptions (external-source onChange, config onChange, pending fit RAF) - repeated factories over one key no longer accumulate permanent listeners; `createColumnGrid` re-seeds `visibleCount` on grid re-attach so the auto-fit is not mis-skipped after a remount.
32
+ - Changed (A10, safe part): `searchHistory.items`/`use()` no longer mutate persisted state on read (normalization moved to the write path); `window` reads guarded in `RightMenu` render clamp, `LeftModal.useViewport`, and `ApiLeftMenu`'s import-time default element (SSR/tests).
33
+ - Verification (architecture pass): `npx tsc -p tsconfig.qa-check.json --noEmit`; `npm run testjest -- --runInBand` (45/45); `npm run build`; QA stand 3010 fresh load with zero console errors; spot checks - card 21 place persisted across reload (persistedMaps path), card 25 toolbar click updates last action (fixedOrder + updateBy path), card 32 table/cards switch + dots overlay, card 9 add-log appends rows (isolated getLogsApi, global path).
34
+ - Verification: `npx tsc -p tsconfig.qa-check.json --noEmit`; `npm run testjest -- --runInBand` (45/45); `npm run build`; QA stand 3010: card 21 place switch survives F5 (hook persistence), card 19 fixed-parent 150->240px updates select 92->180px and container 150x51->240x51 via `useElementSize`, card 9 add-log appends rows through the controller.
35
+ - Verification: `npx tsc --noEmit`; `npm run build`; QA stand `http://127.0.0.1:3010/` and `/src/testReact.tsx` return HTTP 200.
36
36
  - 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`.