Skip to content

purescript-react/purescript-nextui

Repository files navigation

purescript-nextui

Bindings for NextUI.

Installation

spago install nextui

Usage

Create a dark and light theme, see https://nextui.org/docs/theme/default-theme:

-- Theme.purs mkDark :: Effect Theme mkDark = createTheme { "type": "dark" , theme: { colors: { primary: "$blue600" ... } , space: {} , fonts: { ... } } } mkLight :: Effect Theme mkLight = createTheme { "type": "light" , theme: { colors: { primary: "$blue300" ... } , space: {} , fonts: { ... } } }

In your root layout component, set up the next theme provider:

-- RootComponent.purs myRootComponent :: React.Component { children :: Array React.JSX } myRootComponent = do dark <- Themes.mkDark light <- Themes.mkLight React.component "RootComponent" \{ children } -> React.do pure $ el nextThemesProvider { defaultTheme: "system" , attribute: "class" , storageKey: "theme" , value: { dark: (unsafeCoerce dark).className, light: (unsafeCoerce light).className } } $ el nextUIProvider {} children

Then use NextUI. Here is an example usage:

import NextUI.NextUI as NextUI import React.Basic.DOM (css) import React.Basic.DOM.Simplified.Generated as R import React.Basic.DOM.Simplified.ToJSX (el) myComponent :: React.Component Props myComponent = do React.component "MyComponent" \props -> React.do { theme, isDark } <- NextUI.useTheme pure $ el NextUI.container { gap: 0, lg: true } $ el NextUI.card { css: css { marginBottom: "50px" } } [ el NextUI.cardBody {} $ el NextUI.container { display: "flex", justify: "space-evenly" } [ el NextUI.spacer {} React.empty , el NextUI.text { h1: true , css: { letterSpacing: "0.002em" } , size: "$7xl" , weight: "black" } "Hello NextUI" , el NextUI.button { shadow: false, css: css { minHeight: "5rem", padding: "3rem", background: if isDark then "fuchsia" else "purple" } } $ el NextUI.text { size: "$3xl", color: "white", css: css { fontWeight: "$bold" } } "Get started" ] ]