Skip to content

fix(widget): el detalle no se reabre solo al soltar un orbe reordenado (#222) - #240

Merged
egdev6 merged 2 commits into
egdev6:mainfrom
DonatoSilva:fix/222-reorder-reopens-detail-panel
Nov 5, 2026
Merged

egdev6 merged 2 commits into
egdev6:mainfrom
DonatoSilva:fix/222-reorder-reopens-detail-panel

Conversation

@DonatoSilva

Copy link
Copy Markdown
Contributor

Related issue / Issue relacionada

Issue: Fixes #222
ODD: odd/tasks/222-reorder-reopen.md — alcance aprobado por el mantenedor en el hilo de la issue.

Scope / Alcance

Tras reordenar un orbe, el panel de detalle no se reabre por hover hasta que el puntero salga de la tira y vuelva a entrar (opción 1 de la issue). El clic explícito y el foco de teclado se mantienen.

  • Causa (medida): el navegador emite el mouseenter sobre el orbe soltado en un instante que no controlamos (entre 0,2 s y 2,3 s después de soltar). Con la guarda de 400 ms, si la entrada llega después, el hover reabre el panel sin clic.
  • Regla: ReorderHold, una retención pura en src/lib/anchor-panel.ts. Se activa al soltar un reordenado con el puntero dentro de la ventana y solo la libera el mouseleave de .dock. Pasar a otro orbe no la libera.
  • Cableado: ProviderGauge recibe la prop opcional onPointerEnter, usada solo por mouseenter; el foco y el clic siguen por onHover. openFor, anchorOn, PanelState y la guarda de 400 ms (que sigue frenando el clic posterior a soltar) no cambian.
  • Soltar fuera de la ventana: no se retiene, porque nada la liberaría después.
  • Exclusiones: no se unifica createPanelCoordinator con los temporizadores de Widget.tsx y no se toca la ventana del widget ni su tamaño.

Dos commits: el arreglo con sus tests y el ODD, y el inventario i18n regenerado (solo cambia la línea de hashes del árbol de src/).

Coordination / Coordinación

  • Para ODD: asignaciones y solapamientos revisados; toma verificada o acuerdo explícito del mantenedor enlazado.

Contributor / Contribuidor: @DonatoSilva
Claim or agreement evidence / Evidencia de asignación o acuerdo: asignación en la issue (#222 (comment)) y aprobación de la opción 1 y de las tres condiciones de implementación (#222 (comment)).

Acceptance and validation / Aceptación y validación

  • Criteria satisfied / Criterios cumplidos: el panel no se reabre solo tras reordenar (probado a mano en XWayland); retención solo en la vía del puntero, foco y clic intactos; retención solo si se suelta dentro de la ventana; liberación con el mouseleave de .dock; regla como función pura con su test.
  • Checks actually run and results / Comprobaciones ejecutadas y resultados:
    • Medición previa con registro temporal de eventos (no incluido en la PR), CachyOS + Hyprland 0.57.0, XWayland (GDK_BACKEND=x11): 2 de 4 reordenamientos reabrieron el panel sin clic (+1 s y +2,3 s tras soltar); en los otros llegó a ~0,2 s y la guarda lo frenó. En ningún caso hubo focus entre soltar y abrir.
    • Tests nuevos observados en rojo antes de implementar (7 fallos) y en verde después.
    • npm test: vitest 68 archivos / 912 tests; node --test 298; 0 fallos.
    • npm run typecheck y npm run build: sin errores. node scripts/i18n-inventory.mjs --check: correcto.
    • Verificación diferencial (no incluida en la PR): mouseenter, foco y clic de ProviderGauge sin la prop nueva, en 3 sistemas, con y sin :focus-visible y con y sin onClick, más el HTML renderizado: salida idéntica a la base.
    • Prueba manual en XWayland tras el cambio: el panel ya no se reabre.
  • Checks not run and why / Comprobaciones no ejecutadas y motivo:
    • Wayland nativo: no se reprodujo el fallo en esa sesión (2 reordenamientos, ambos frenados por la guarda), así que no hay antes/después en nativo.
    • No se probó a mano, punto por punto: soltar fuera de la ventana, foco de teclado y ocultar/mostrar el widget. La regla de soltar fuera está cubierta por test puro; el cableado de Widget.tsx no tiene test unitario (el repo no tiene entorno de DOM).
    • cargo test: no se tocó Rust.
    • Otros entornos de escritorio (KDE, GNOME): no medidos.
  • Remaining blockers / Bloqueos pendientes: ninguno conocido. El código es compartido y no está demostrado que el fallo sea exclusivo de Linux.

An open PR does not mean integration. Release, secrets and signing operations require separate authorization.
Una PR abierta no implica integración. Release, secretos y firma requieren autorización separada.

egdev6#222)

Tras reordenar, el navegador emite el `mouseenter` sobre el orbe soltado en
un instante que no controlamos (medido entre 0,2 s y 2,3 s después de soltar),
así que la guarda de 400 ms no basta: si la entrada llega después, el hover
reabre el panel sin clic.

Se añade una retención pura (`ReorderHold`): al soltar un reordenado con el
puntero dentro de la ventana el hover del puntero no abre el panel, y solo la
libera el `mouseleave` real de `.dock`. Pasar a otro orbe no la libera.

- `ProviderGauge` recibe la prop opcional `onPointerEnter`, usada solo por
  `mouseenter`: el foco de teclado y el clic siguen por `onHover`.
- Si se suelta fuera de la ventana no se retiene, porque nada la liberaría.
- La guarda de 400 ms se mantiene para el clic que llega tras soltar.

Refs egdev6#222
Solo cambia la línea de hashes del árbol de src/: el cambio no añade ni modifica textos de interfaz.
@egdev6
egdev6 merged commit 29c9188 into egdev6:main Nov 5, 2026
5 checks passed
@DonatoSilva
DonatoSilva deleted the fix/222-reorder-reopens-detail-panel branch November 5, 2026 21:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug(linux): al soltar un orbe reordenado, el puntero queda encima y el panel de detalle se reabre solo

2 participants