Pierre Poupin
github.com/pierpo
Mathieu Fedrigo
twitter.com/mat_fdg
Android codebase
iOS codebase
Web codebase
React multiplatform codebase
Thanks React Native! Classic!
press "right"
❌ Not multiplatform...
❌ Not available on the web!
✅ Multiplatform
🤯 but it's a hard problem!
rows, grids, nested grids, an element disappears, the focused element disappears, a modal appears...
Many edge cases of "where am I when [something] happens?"
Keeping track of the positions of the elements in React
🗺️
🧭
What we want to do
Basic Program
Focusable Program
Vertical container
Horizontal container → Row
Whole page
Spatial Navigation rules
React
Spatial Navigation rules
React
Is there a lib for that? 📚️
LRUD = left-right-up-down
Represent a spatial layout with a data structure
It's UI agnostic! 🦴
// not the exact structure, but global idea
{
root: {
id: 'root-element',
orientation: 'vertical',
children: [
{ id: 'row1', orientation: 'horizontal', children: [
{id: 'program-1-1', isFocusable: true }
]},
{ id: 'row2', orientation: 'horizontal', children: [
{id: 'program-2-1', isFocusable: true }
]}
]
}
}Represent a spatial layout with a data structure
It's UI agnostic! 🦴
LRUD's representation is actually a tree!
(just like React 😎 it's a match! ❤️🔥)
lrud.registerElement('root', { direction: 'vertical' })lrud.registerElement('root', { direction: 'vertical' })
lrud.registerElement('row1', { parent: 'root', direction: 'horizontal' })lrud.registerElement('root', { direction: 'vertical' })
lrud.registerElement('row1', { parent: 'root', direction: 'horizontal' })
lrud.registerElement('program-1', { parent: 'row1', isFocusable: true })
lrud.registerElement('program-2', { parent: 'row1', isFocusable: true })lrud.registerElement('root', { direction: 'vertical' })
lrud.registerElement('row1', { parent: 'root', direction: 'horizontal' })
lrud.registerElement('program-1', { parent: 'row1', isFocusable: true })
lrud.registerElement('program-2', { parent: 'row1', isFocusable: true })
lrud.handleKeyEvent('right') // actually, any key to get first focuslrud.registerElement('root', { direction: 'vertical' })
lrud.registerElement('row1', { parent: 'root', direction: 'horizontal' })
lrud.registerElement('program-1', { parent: 'row1', isFocusable: true })
lrud.registerElement('program-2', { parent: 'row1', isFocusable: true })
lrud.handleKeyEvent('right')
lrud.handleKeyEvent('right')2 trees that need to live together
React
LRUD
Logs order:
Logs order:
Tree traversal is
depth-first, pre-order (NLR)
Node → left path → right path
Credit: skilled.dev
Logs order:
Logs order:
Node → left path → right path
Logs order:
Node → left path → right path
Logs order:
Node → left path → right path
Logs order:
Node → left path → right path
Logs order:
Node → left path → right path
Logs order:
Node → left path → right path
Logs order:
Node → left path → right path
Logs order:
Node → left path → right path
Logs order:
Logs order:
Tree traversal is
depth-first, post-order (LRN)
left path → right path → Node
Credit: skilled.dev
Logs order:
Logs order:
left path → right path → Node
Logs order:
left path → right path → Node
Logs order:
left path → right path → Node
Logs order:
left path → right path → Node
Logs order:
left path → right path → Node
Logs order:
left path → right path → Node
Logs order:
left path → right path → Node
Logs order:
left path → right path → Node
Logs order:
left path → right path → Node
Logs order:
left path → right path → Node
Logs order:
left path → right path → Node
Logs order:
left path → right path → Node
Logs order:
left path → right path → Node
Logs order:
left path → right path → Node
Check out https://blog.bam.tech !