Skip to content

One-Nexus/Lucid

Repository files navigation

GitHub license Build Status npm version npm downloads

No nonsense JavaScript styling for React DOM projects


Overview

Lucid is a collection of React Components that should be used to create your Presentational Components. Lucid uses state and context to determine which styles to apply to a given Element; it maps CSS keys from your styles Object to Components with a matching name prop (with top level keys applying to the parent Module), avoiding the need for class names.

Checkout this example to see how Lucid can be used to create a simple UI accordion that is both styled and functional:

View a live demo of this example on CodeSandbox

import React, { useState } from 'react';
import { Module, Component } from '@onenexus/lucid';

const styles = () => ({
  heading: ({ context, state }) => ({
    backgroundColor: 'red',
    
    ...(context.panel.open && {
      backgroundColor: 'blue'
    }),
    
    ':hover': {
      backgroundColor: 'purple'
    },

    // ...or alternatively:
    ...(state.isHovered && {
      backgroundColor: 'purple'
    })
  }),

  content: ({ context }) => ({
    display: context.panel.open ? 'block' : 'none'
  })
});

const Accordion = ({ panels, ...props }) => {
  const [current, toggle] = useState(0);

  return (
    <Module name='Accordion' styles={styles} { ...props }>
      {panels.map(({ heading, content }, i) => (
        <Component name='panel' open={i === current}>
          <Component name='heading' onClick={() => toggle(i === current ? -1 : i)}>
            {heading}
          </Component>
          <Component name='content' content={content} />
        </Component>
      ))}
    </Module>
  );
}

export default Accordion;

For a more fleshed out example, see the demo from the Synergy Wiki

Features

How it Works

  • Utilises React's context API under the hood
  • Singular styles object (or function that returns an object) passed to <Module>
  • Styles are mapped to child Components by matching keys with <Component> name props
  • Parent props/state are available as context, self props/state are available as state

NOT CSS-in-JS!

Whilst Lucid is a JavaScript tool for authoring styles, we don't consider it to be "CSS-in-JS". CSS is a language with its own rules and concepts such as classes, selectors, pseudo-elements, cascading, etc. Lucid is not a tool for translating CSS paradigms into JavaScript (unlike other solutions) - it is a tool for applying CSS properties to your React Components using a super friendly API. It results in inline-styles being applied to the DOM - Lucid doesn't generate any CSS.

Installation/Setup/Usage

npm install --save @onenexus/lucid

Basic

import { Module, Component } from '@onenexus/lucid';

All Lucid Components

import { 
  Module,
  Component,
  SubComponent,
  Wrapper,
  Group,
  Provider
} from '@onenexus/lucid';

Lucid Hooks

import { useConfig, useTheme, useUtils } from '@onenexus/lucid';