MCPcopy Index your code
hub / github.com/bamlab/react-tv-space-navigation

github.com/bamlab/react-tv-space-navigation @v5.2.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v5.2.0 ↗ · + Follow
196 symbols 550 edges 148 files 0 documented · 0%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

banner

react-tv-space-navigation

Why?

Spatial navigation is a hard problem on a TV app. Many solutions exist. React Native TV even has a core solution for it. But most existing solutions are not 100% cross-platform.

If you’re looking to develop a TV app for AndroidTV, tvOS, and web-based TV devices, this package can be a valuable tool. However, if you don’t require web support, using the native react-native-tvos solution might be a better fit. The primary objective of this package is to provide consistent support across all platforms, though this comes with some trade-offs (see the pitfalls below).

The library is based on LRUD, which is a UI-agnostic lib that represents spatial navigation. The library is a React wrapper around the core logic of LRUD.

What you can achieve

demo

Check out the live web demo!

One of the goals of the lib is to have a simple and declarative API. No need for hooks or dark shenanigans. You just simply declare components.

Here's the kind of code you'll be able to achieve:

/**
 * A simple component that shows a rabbit program
 * We plug it to the Spatial Navigation easily using a FocusableView
 */
const Rabbit = ({ onSelect }) => (
  <SpatialNavigationFocusableView onSelect={onSelect}>
    {({ isFocused }) => <RabbitLayout isFocused={isFocused} />}
  </SpatialNavigationFocusableView>
);

/**
 * We can have as many nodes as we want. We group our rabbits in a horizontal spatial navigation view
 * to spatially describe a row layout
 * (it includes a spatial navigation node AND the horizontal styling for it)
 *
 * We also want to scroll horizontally, so we add a horizontal scrollview.
 */
const RabbitRow = () => (
  <SpatialNavigationScrollView horizontal>
    <SpatialNavigationView direction="horizontal">
      {/* assuming you have rabbits data */}
      {rabbits.map((_, index) => (
        <Rabbit onSelect={() => console.log('selected rabbit ', index)} />
      ))}
    </SpatialNavigationView>
  </SpatialNavigationScrollView>
);

/**
 * Now I simply add a page with a Root node and a vertical scroll view to scroll through my rows.
 */
const Page = () => (
  <SpatialNavigationRoot>
    <SpatialNavigationScrollView>
      <RabbitRow />
      <RabbitRow />
      <RabbitRow />
      <RabbitRow />
      <RabbitRow />
      <RabbitRow />
    </SpatialNavigationScrollView>
  </SpatialNavigationRoot>
);

How to use

You should follow the tutorial.

How to run the example

If you want to run the example app in packages/example, take a look at the README

API documentation

You can have a look at the documentation.

Pitfalls & troubleshooting

You should have a look at the pitfalls and troubleshooting.

Accessibility support

Read the state of accessibility.

Contributing

Publishing the package

  • Increment the package.json in ./packages/lib/package.json.
  • Commit the change git commit -m "chore: bump version"
  • Add a tag matching the version git tag vx.x.x && git push --tags
  • Generate the changelog and commit it yarn changelog && git add CHANGELOG.md && git commit "chore: update changelog"
  • Then publish the package:
cd packages/lib
yarn publish:package

Extension points exported contracts — how you extend this code

RemoteControlManagerInterface (Interface)
(no doc) [3 implementers]
packages/example/src/components/remote-control/RemoteControlManager.interface.ts
RemoteControlConfiguration (Interface)
(no doc)
packages/lib/src/spatial-navigation/configureRemoteControl.ts
Props (Interface)
(no doc)
packages/example/src/design-system/components/Box.tsx
VirtualizedListProps (Interface)
(no doc)
packages/lib/src/spatial-navigation/components/virtualizedList/VirtualizedList.tsx
Theme (Interface)
(no doc)
packages/example/src/design-system/typings/emotion.d.ts
Item (Interface)
(no doc)
packages/lib/src/spatial-navigation/components/virtualizedList/helpers/computeTranslation.test.ts
HeaderProps (Interface)
(no doc)
packages/example/src/modules/header/view/Header.tsx
DeviceContextProps (Interface)
(no doc)
packages/lib/src/spatial-navigation/context/DeviceContext.tsx

Core symbols most depended-on inside this repo

scaledPixels
called by 55
packages/example/src/design-system/helpers/scaledPixels.ts
computeTranslation
called by 21
packages/lib/src/spatial-navigation/components/virtualizedList/helpers/computeTranslation.ts
setComponentLayoutSize
called by 16
packages/lib/src/testing/setComponentLayoutSize.ts
typedMemo
called by 10
packages/lib/src/spatial-navigation/helpers/TypedMemo.tsx
useSpatialNavigator
called by 6
packages/lib/src/spatial-navigation/context/SpatialNavigatorContext.ts
callback
called by 5
packages/lib/src/spatial-navigation/context/DeviceContext.tsx
getPrograms
called by 4
packages/example/src/modules/program/infra/programInfos.ts
registerNode
called by 4
packages/lib/src/spatial-navigation/SpatialNavigator.ts

Shape

Function 156
Class 16
Interface 12
Method 9
Enum 3

Languages

TypeScript100%

Modules by API surface

packages/lib/src/spatial-navigation/components/virtualizedList/SpatialNavigationVirtualizedList.test.tsx8 symbols
packages/lib/src/spatial-navigation/SpatialNavigator.ts8 symbols
packages/lib/src/spatial-navigation/context/DeviceContext.tsx5 symbols
packages/lib/src/spatial-navigation/components/virtualizedGrid/SpatialNavigationVirtualizedGrid.test.tsx5 symbols
packages/lib/src/spatial-navigation/components/virtualizedList/helpers/getRange.ts4 symbols
packages/lib/src/spatial-navigation/components/virtualizedList/helpers/computeTranslation.ts4 symbols
packages/lib/src/spatial-navigation/components/virtualizedList/SpatialNavigationVirtualizedListWithVirtualNodes.tsx4 symbols
packages/lib/src/spatial-navigation/components/ScrollView/CustomScrollView/CustomScrollView.test.tsx4 symbols
packages/lib/src/spatial-navigation/components/Node.tsx4 symbols
packages/example/src/pages/ListWithVariableSize.tsx4 symbols
packages/example/src/components/modals/SpatialNavigationOverlay/useLockOverlay.tsx4 symbols
packages/lib/src/spatial-navigation/context/LockSpatialNavigationContext.ts3 symbols

For agents

$ claude mcp add react-tv-space-navigation \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page