skillhub/web/src
Michael a063090a52
fix(web): stop React 19 portal removeChild/insertBefore crashes (#624)
* fix(web): replace custom Dialog with Radix to stop portal races

Hand-rolled createPortal siblings on document.body raced with Radix
Select/DropdownMenu/Sonner under React 19 (insertBefore/removeChild).
Use @radix-ui/react-dialog like select/dropdown adapters and bail out
overview ResizeObserver setState when values are unchanged.

Signed-off-by: Mikhail Neradkov <michael.neradkov@gmail.com>

* fix(web): stop portal removeChild races on search and shell

Move Radix portals to #skillhub-portals, drop language-switcher body
portal (match UserMenu), remove Select/Dropdown exit animations, and keep
previous search results while typing to avoid skeleton unmount churn.

Signed-off-by: Mikhail Neradkov <michael.neradkov@gmail.com>

* fix(web): systemic overlay teardown for React 19 removeChild

Render Select/Dropdown in-tree (no Portal), translate=no on overlays,
dismiss overlays on pathname change, defer navigate after close, host
Toaster in #skillhub-portals, and add recoverable RouteError UI.

Signed-off-by: Mikhail Neradkov <michael.neradkov@gmail.com>

* fix(web): harden overlay dismiss after code review

Clip decorative layer only, dismiss Dialog via overlay pointer events,
log RouteError once in useEffect, and defer skill-detail leave navigations.

Signed-off-by: Mikhail Neradkov <michael.neradkov@gmail.com>

* fix(web): batch starred highlight and defer Sonner toasts

Avoid N× per-card star fetches on /search and flushSync toast races
during React 19 list re-renders (removeChild / insertBefore).

Signed-off-by: Mikhail Neradkov <michael.neradkov@gmail.com>

* fix(web): block Chrome Translate DOM races on skill overview

Keep html/#root notranslate, sync lang with i18n, and harden overview
expand so memoized markdown + quiet ResizeObserver avoid insertBefore crashes.

Signed-off-by: Mikhail Neradkov <michael.neradkov@gmail.com>

---------

Signed-off-by: Mikhail Neradkov <michael.neradkov@gmail.com>
2026-08-04 13:59:37 +08:00
..
api Merge pull request #554 from iflytek/fix/auth-password-settings 2026-06-24 10:50:26 +08:00
app fix(web): stop React 19 portal removeChild/insertBefore crashes (#624) 2026-08-04 13:59:37 +08:00
docs fix(publish): accept case-insensitive SKILL.md uploads 2026-06-11 16:34:13 +08:00
features fix(web): stop React 19 portal removeChild/insertBefore crashes (#624) 2026-08-04 13:59:37 +08:00
i18n fix(web): stop React 19 portal removeChild/insertBefore crashes (#624) 2026-08-04 13:59:37 +08:00
pages fix(web): stop React 19 portal removeChild/insertBefore crashes (#624) 2026-08-04 13:59:37 +08:00
shared fix(web): stop React 19 portal removeChild/insertBefore crashes (#624) 2026-08-04 13:59:37 +08:00
types refactor: address code review findings from 2026-03-22 2026-03-23 13:48:23 +08:00
bootstrap.ts fix(web): restore compatibility with Chromium 83 (Debian 10) 2026-05-09 13:55:50 +08:00
index.css fix: skill upload constraints, rejected label, and last-version guard (#82) 2026-03-18 16:40:51 +08:00
legacy-polyfills.ts fix(web): restore compatibility with Chromium 83 (Debian 10) 2026-05-09 13:55:50 +08:00
main.tsx docs: enrich frontend code documentation 2026-03-19 13:37:21 +08:00