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"
                    ]
            ]
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy