npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@dash-ui/react

v1.1.0

Published

React components and hooks for dash-ui

Downloads

92

Readme

Quick Start

NOTE: You do not need to use this package to use @dash-ui with React. This merely provides a few useful utilities, particularly on the server-side.

Check out an example on CodeSandbox

import { createStyles } from "@dash-ui/styles";
import { useGlobal } from "@dash-ui/react";

const styles = createStyles({
  tokens: {
    color: {
      primary: "#ee5b5f",
    },
  },
});

const Heading = () => {
  useGlobal(
    styles,
    ({ color }) => `
      h1 {
        font-size: 2rem;
        font-family: -apple-system, sans-serif;
        color: ${color.primary};
      }
    `,
    []
  );

  return <h1>Hello world</h1>;
};

API docs

Components

| Component | Description | | --------------------- | ----------------------------------------------------------------------------------------------- | | <Inline> | A component for creating an inline <style> tag that is unmounted when the component unmounts. |

Hooks

| Hook | Description | | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | useCSS() | A hook for performantly and reliably inserting CSS into the DOM in React 18 using the useInsertionEffect hook. | | useGlobal() | A hook for inserting transient global styles into the DOM. These styles will be injected when the hook mounts and flushed when the hook unmounts. | | useTokens() | A hook for inserting transient CSS tokens into the DOM. These tokens will be injected when the hook mounts and flushed when the hook unmounts. | | useThemes() | A hook for inserting transient CSS theme tokens into the DOM. These tokens will be injected when the hook mounts and flushed when the hook unmounts. |

Server rendering

| | Description | | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | <Style> | A React component for injecting SSR CSS styles into Next.js documents. | | toComponent() | A function for creating a React <style> component for inserting Dash styles in SSR. | | createGatsbyRenderer | Creates a Gatsby replaceRenderer for injecting styles generated by Dash on the server into the Gatsby <head> component |

TypeScript support

Dash is written in TypeScript. It's also strongly typed, creating a beautiful IntelliSense experience in VSCode and providing solid insurance to your TypeScript application.

| | Description | | ----------------------------------------------- | -------------------------------------------------------------------------- | | Strongly typed tokens | Learn how to add autocomplete and type safety to your CSS tokens. | | Strongly typed themes | Learn how to add autocomplete and type safety to your CSS variable themes. |


<Inline>

A component for creating an inline <style> tag that is unmounted when the component unmounts.

Example

Play with an example on CodeSandbox

import * as React from 'react'
import {styles} from '@dash-ui/styles'
import {Inline} from '@dash-ui/react'

export const App = () => {
  return (
    <React.Fragment>
      <Inline styles={styles} css={`
        .heading {
          font-size: 2rem;
          font-family: -apple-system, sans-serif;
        }
      `}>
      <h1 className='heading'>Hello world</h1>
    </React.Fragment>
  )
}

Props

| Prop | Type | Required? | Description | | ------ | -------------------------------- | --------- | -------------------------------------- | | styles | Styles<DashTokens, DashThemes> | Yes | A styles instance. | | css | StyleValue<DashTokens> | Yes | The CSS you want to inline in the DOM. |


useCSS()

A hook for performantly and reliably inserting CSS into the DOM in React 18 using the useInsertionEffect hook.

Example

Play with an example on CodeSandbox

import * as React from "react";
import { createStyles } from "@dash-ui/styles";
import { useGlobal } from "@dash-ui/react";

const styles = createStyles();

const Component = () => {
  const classes = useCSS(styles, {
    root: styles.one({ display: "flex", gap: "2rem" }),
  });

  return (
    <div className={classes.root}>
      <div>Hello</div>
      <div>World</div>
    </div>
  );
};

Returns

Record<ClassNames, string>;

useGlobal()

A hook for inserting transient global styles into the DOM. These styles will be injected when the hook mounts and flushed when the hook unmounts.

Example

Play with an example on CodeSandbox

import * as React from "react";
import { createStyles } from "@dash-ui/styles";
import { useGlobal } from "@dash-ui/react";

const styles = createStyles();

const Component = () => {
  useGlobal(
    styles,
    {
      body: {
        minHeight: "100vh",
        backgroundColor: "#ee5b5f",
        color: "#fff",
        fontFamily: "Inter, -apple-system, sans-serif",
      },
      h1: {
        margin: "1rem",
        fontSize: "3rem",
      },
    },
    []
  );

  return (
    <div>
      <h1>Hello world</h1>
    </div>
  );
};

Returns

null;

useTokens()

A hook for inserting transient CSS tokens into the DOM. These tokens will be injected when the hook mounts and flushed when the hook unmounts.

Example

Play with an example on CodeSandbox

import * as React from "react";
import { createStyles } from "@dash-ui/styles";
import { useThemes } from "@dash-ui/react";

const styles = createStyles({
  tokens: {
    primaryColor: "#ee5b5f",
  },
});

const Component = () => {
  const [primaryColor, setPrimaryColor] = React.useState("#ee5b5f");

  useTokens(styles, { primaryColor }, [primaryColor]);

  return (
    <div>
      <div
        className={styles.cls(
          ({ primaryColor }) => `
            width: 200px;
            height: 200px;
            background-color: ${primaryColor};
          `
        )}
      />

      <label>
        <h4>Primary color</h4>
        <input
          value={primaryColor}
          onChange={(e) => setPrimaryColor(e.target.value)}
        />
      </label>
    </div>
  );
};

Arguments

function useTokens(
  value: PartialDeep<DashTokens> | Falsy,
  deps?: React.DependencyList
);

| Argument | Type | Required? | Description | | -------- | -------------------------------- | --------- | --------------------------------------------------------------- | ------------------------------------------------------------------ | | styles | Styles<DashTokens, DashThemes> | Yes | A styles instance. | | value | PartialDeep<DashTokens> | Falsy | Yes | CSS tokens to inject into the DOM and flush when the hook unmounts | | deps | React.DependencyList | No | A dependency array that will force the hook to re-insert tokens |

Returns

null;

useThemes()

A hook for inserting transient CSS theme tokens into the DOM. These tokens will be injected when the hook mounts and flushed when the hook unmounts.

Example

Play with an example on CodeSandbox

import * as React from "react";
import { createStyles } from "@dash-ui/styles";
import { useThemes } from "@dash-ui/react";

const styles = createStyles({
  themes: {
    // Light mode CSS tokens
    light: {
      primaryColor: "#ee5b5f",
    },
    // Dark mode CSS tokens
    dark: {
      primaryColor: "#272727",
    },
  },
});

const Component = () => {
  const [mode, setMode] = React.useState("light");
  const [darkModePrimary, setDarkModePrimary] = React.useState("#272727");
  const [lightModePrimary, setLightModePrimary] = React.useState("#ee5b5f");

  useThemes(
    {
      light: {
        primaryColor: lightModePrimary,
      },
      dark: {
        primaryColor: darkModePrimary,
      },
    },
    [darkModePrimary, lightModePrimary]
  );

  return (
    <body className={styles.theme(mode)}>
      <div
        className={styles.cls(
          ({ primaryColor }) => `
            width: 200px;
            height: 200px;
            background-color: ${primaryColor};
          `
        )}
      />

      <div>
        <button
          onClick={() =>
            setMode((mode) => (mode === "light" ? "dark" : "light"))
          }
        >
          Switch to {mode === "light" ? "dark" : "light"} mode
        </button>
      </div>

      <label>
        <h4>Light mode primary color</h4>
        <input
          value={lightModePrimary}
          onChange={(e) => setLightModePrimary(e.target.value)}
        />
      </label>

      <label>
        <h4>Dark mode primary color</h4>
        <input
          value={darkModePrimary}
          onChange={(e) => setDarkModePrimary(e.target.value)}
        />
      </label>
    </body>
  );
};

Arguments

function useThemes(
  styles,
  value: PartialDeep<DashThemes> | Falsy,
  deps?: React.DependencyList
);

| Argument | Type | Required? | Description | | -------- | --------------------------------- | --------- | --------------------------------------------------------------- | | styles | Styles<DashTokens, DashThemes> | Yes | A styles instance. | | value | PartialDeep<DashThemes>\| Falsy | Yes | Themes to inject into the DOM and flush when the hook unmounts | | deps | React.DependencyList | No | A dependency array that will force the hook to re-insert themes |

Returns

null;

<Style>

A React component for injecting SSR CSS styles into Next.js documents.

Example

// _document.js
import React from "react";
import Document from "next/document";
import { styles } from "@dash-ui/styles";
import { Style } from "@dash-ui/react/server";

export default class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const initialProps = await Document.getInitialProps(ctx);

    return {
      ...initialProps,
      styles: (
        <React.Fragment>
          {initialProps.styles}
          <Style html={initialProps.html} styles={styles} />
        </React.Fragment>
      ),
    };
  }
}

Props

| Prop | Type | Required? | Description | | ------ | -------------------------------- | --------- | -------------------------------------------------------------------------------------- | | html | string | Yes | HTML generated by Next.js, renderToStaticMarkup() or renderToString() | | styles | Styles<DashTokens, DashThemes> | No | An instance of styles. Defaults to the default styles instance in @dash-ui/styles. |


toComponent()

A function for creating a React <style> component for inserting Dash styles in SSR.

Example

// _document.js
import React from "react";
import Document from "next/document";
import { styles } from "@dash-ui/styles";
import { toComponent } from "@dash-ui/react/server";

export default class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const initialProps = await Document.getInitialProps(ctx);

    return {
      ...initialProps,
      styles: (
        <React.Fragment>
          {initialProps.styles}
          {toComponent(initialProps.html, styles)}
        </React.Fragment>
      ),
    };
  }
}

Arguments

function toComponent(
  html: string,
  styles: Styles = defaultStyles
): React.ReactElement;

| Argument | Type | Required? | Description | | -------- | -------------------------------- | --------- | -------------------------------------------------------------------------------------- | | html | string | Yes | The HTML generated by renderToStaticMarkup() or renderToString() | | styles | Styles<DashTokens, DashThemes> | No | An instance of styles. Defaults to the default styles instance in @dash-ui/styles. |

Returns

React.ReactElement; // A <style> element

createGatsbyRenderer()

Creates a Gatsby replaceRenderer for injecting styles generated by Dash on the server into the Gatsby <head> component.

Example

// gatsby-ssr.js
const { styles } = require("@dash-ui/styles");

exports.replaceRenderer =
  require("@dash-ui/react/server").createGatsbyRenderer(styles);

Arguments

function createGatsbyRenderer(styles: Styles = defaultStyles);

| Argument | Type | Required? | Description | | -------- | -------------------------------- | --------- | -------------------------------------------------------------------------------------- | | styles | Styles<DashTokens, DashThemes> | Yes | An instance of styles. Defaults to the default styles instance in @dash-ui/styles. |

Returns

function replaceRenderer<P = any>(props: P): P; // A Gatsby replace renderer

Strongly typed tokens

To use variable types with @dash-ui/react, you have to use the module declaration pattern:

Play with this example on CodeSandbox

const tokens = {
  color: {
    red: "#c17",
  },
};

type AppTokens = typeof tokens;

declare module "@dash-ui/styles" {
  export interface DashTokens extends AppTokens {}
}

// OR alternatively
declare module "@dash-ui/styles" {
  export interface DashTokens {
    color: {
      red: string;
    };
  }
}

Strongly typed themes

To use variable/theme types with @dash-ui/react, you have to use the module declaration pattern:

Play with the example on CodeSandbox

const themes = {
  light: {
    color: {
      // var(--color-bg)
      bg: "#fafafa",
    },
  },
  dark: {
    color: {
      // var(--color-bg)
      bg: "#1a1a1a",
    },
  },
};

type AppThemes = typeof themes;
type AppTokens = AppThemes["dark"] & AppThemes["light"];

declare module "@dash-ui/styles" {
  export interface DashTokens extends AppTokens {}
  export interface DashThemes extends AppThemes {}
}

// OR alternatively
declare module "@dash-ui/styles" {
  export interface DashTokens {
    color: {
      bg: string;
    };
  }

  export interface DashThemes {
    light: DashTokens;
    dark: DashTokens;
  }
}

LICENSE

MIT