Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Not working with portals #19

Closed
nanot1m opened this issue Feb 21, 2018 · 2 comments
Closed

Not working with portals #19

nanot1m opened this issue Feb 21, 2018 · 2 comments
Assignees
Labels

Comments

@nanot1m
Copy link

nanot1m commented Feb 21, 2018

How to reproduce?
Just render portal inside FocusTrap (example)

Why it's matter?
Dropdown menus usually render in portals. And it would be impossible to put focus on them to handle keydowns for example.

I don't know if it is possible to solve this issue

@theKashey
Copy link
Owner

This is a hard problem and it is impossible to solve it using the current logic, cos current logic is about making some boundaries you could not escape, but you do.

How this can be made:

  1. I have a plan to work with more than one FocusLock on "one level". Currently, you can "nest" them, but what about one level, and next you can tab from the first lock, to the second? That's is a requirement for my another project. WIP.
  2. React handles evens, occurred in portaled code, as they occur in normal code. It is possible to detect focus "outside" of a lock, which occurs "inside".
  3. And after that detection - create a virtual lock around the portal.

Sounds doable, should be doable. But devil, usually, is hidden in realization details.

@theKashey theKashey added the WIP label Mar 14, 2018
@theKashey theKashey self-assigned this Mar 14, 2018
theKashey added a commit that referenced this issue Mar 14, 2018
@theKashey
Copy link
Owner

So - portals are working now - https://codesandbox.io/s/w2l1q3m5w7
But only if you were able to "tab" inside. The example above have to disable focusGuards to let tab from content to portal. So "portals" are "supported" by just understanding that you are inside a portal and thus allowing to leave a trap. It does not help you to get into trap.

If you want to manage portaled content as a part of Lock - you have to use scattered trap. Just place another FocusLock inside a portal and assign the same focus group.

<FocusLock group="focus1">
      <h2>Start editing to see some magic happen {"\u2728"}</h2>
      <button>I'm jailed</button>
      <button>And I'm too...</button>
      {createPortal(
        <div>portal
        <FocusLock group="focus1">
          <button>I'm in portal 1</button>
          <button>I'm in portal 2</button>
          <button>I'm in portal 3</button>
        </FocusLock>
        </div>,
        document.getElementById("portal-root")
      )}
    </FocusLock>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants