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

nodoku-flowbite

v0.2.0

Published

a collection of visual components, based on React and Flowbite, for Nodoku static site generator

Downloads

492

Readme

nodoku-flowbite is a set of visual components to be used with the Nodoku static site generator.

The components provided in the nodoku-flowbite library are based on flowbite and flowbite-react.

The components in the nodoku-flowbite library are styled using Tailwind CSS.

All the Nodoku components support localization out of the box.

One needs to provide the i18n provider parameter to the Nodoku root component - RenderingPage.

See nodoku-i18n for more details

Getting started

Installation

The installation of the nodoku-flowbite library is straightforward:

npm install nodoku-core nodoku-flowbite

Running generation scripts

Once the installation is performed, one needs to run the following scripts in order to generate the Nodoku component resolver and Nodoku skin schema.

In brief, running the scripts would consist of the following steps:

  • add the scripts to the package.json file
    • "scripts": {
        "gen-component-resolver": "nodoku-gen-component-resolver",
        "gen-skin-schema": "nodoku-gen-skin-schema"
      },
  • run the scripts as follows:
    • ./gen-component-resolver
      ./gen-skin-schema

After the generation scripts are executed, the following new files should appear in the project tree:

  • src/nodoku-component-resolver.ts

    • the file resolving the textual names of the components to an actual JS function implementing the compoent
  • schemas/visual-schema.json

    • this JSON file is a schema to be used for Nodoku skin Yaml file.

The component resolver should be having the following lines now:

components.set("flowbite/card", { ... });
components.set("flowbite/horizontal-card", { ... });
components.set("flowbite/carousel", { ... });
components.set("flowbite/jumbotron", { ... });

Applying JSON schema to a Yaml file

There are several techniques to apply the JSON schema to a Yaml file, and they in particular depend on your development environment.

For example, this link shows the steps to follow for IntelliJ family products.

Alternatively, one can consider using the following option: add the following line to the top of the Yaml where the schema should be applied:

# yaml-language-server: $schema=../../../schemas/visual-schema.json

like this:

# yaml-language-server: $schema=../../../schemas/visual-schema.json

rows:
  - row:
      components:
        - flowbite/carousel:

Configuring Tailwind

nodoku-flowbite is a library of Nodoku visual components, based on flowbite and react-flowbite.

flowbite and react-flowbite are the libraries heavily relying on Tailwind CSS, and so is nodoku-flowibte.

Here is the Tailwind CSS config to be used with the project:

import flowbite from "flowbite-react/tailwind";
import type {Config} from "tailwindcss";

const config: Config = {
    content: [
        "./src/**/*.ts",
        "./src/**/*.tsx",
        "./src/**/*.js",
        "./src/**/*.jsx",
        "./schemas/**/*.yml",

        "./node_modules/nodoku-core/dist/esm/**/*.js",
        "./node_modules/nodoku-core/dist/esm/**/*.jsx",
        "./node_modules/nodoku-components/dist/esm/**/*.js",
        "./node_modules/nodoku-components/dist/esm/**/*.jsx",
        "./node_modules/nodoku-flowbite/dist/esm/**/*.js",
        "./node_modules/nodoku-flowbite/dist/esm/**/*.jsx",
        "./node_modules/nodoku-flowbite/dist/schemas/**/*.yml",
        "./public/**/*.html",
        "./src/**/*.{html,js}",
        "./public/site/**/*.yaml",
        flowbite.content(),
    ],
    plugins: [
        flowbite.plugin(),
    ],
};


export default config;

The main point behind this config is to make the Tailwind plugin to scan all the places where the Tailwind classnames can potentially be encountered.

This includes not only the .js/.jsx files that the bundle contains, but also the Yaml files that the bundle brings in, as the Yaml files contain the default theme configuration of a bundle in terms of Tailwind classes.

Let's have a closer look at the paths contained in the Tailwind config:

  • ./src/**/*(.ts|.tsx|.js|.jsx)

    • these are the files that belong to your project. They should be scanned only if they use Tailwind themselves
  • ./schemas/**/*.yml

    • after the skin schema generation (see Nodoku skin schema) this folder would contain not only the JSON schema for the Nodoku skin Yaml file (schemas/visual-schema.json), but also the default themes for the components, contained in the plugged in bundles (such as nodoku-flowbite). This folder should be included because otherwise all the default values for the component themes wouldn't be scanned, and the CSS for them wouldn't be generated by Tailwind.
  • ./node_modules/nodoku-flowbite/dist/esm/**/*(.js|.jsx)

    • the components might contain some Tailwind class names in their code as well (hardcoded Tailwind classes). In order to account for them, we need to scan also the .js/.jsx files included in the component bundle. The same applies other dependencies, that might include the Tailwind classes, in particular nodoku-core and nodoku-components.
  • ./public/site/**/*.yaml

    • for the sake of this example, we assume that the Nodoku skin Yaml file is being fetched from the location ./public/site. The Nodoku skin Yaml file is entirely based on Tailwind classes. Hence, it is of utmost importance to include the scanning of the Nodoku skin Yaml files to the Tailwind config.

Integration in Nodoku skin Yaml file

Use the component name in the skin Yaml file to use a given component to render a particular content block, as follows:

rows:
  - row:
      components:
        - flowbite/card:
            selector:
              attributes:
                sectionName: nodoku-way

You can find the names of the available components in the nodoku.manifest.json, found in the component bundle.

For example, for nodoku-flowbite this file should be located in:

./node-modules/nodoku-flowbite/dist/nodoku.manifest.json

Alternatively, you can look up the names of the available components in the generated ./src/nodoku-component-resolver.ts, as shown in running-generation-scripts

Make sure to apply the generated JSON schema to the skin Yaml file to facilitate the skin editing process

Component's default theme

Each component is shipped with a predefined theme file, which contains the initial settings for the given component.

For example, here is an excerpt from the default theme file for the component flowbite/card, contained in the file

./schemas/nodoku-flowbite/dist/schemas/components/card/default-theme.yml

containerStyle:
    base: w-full pb-10
    decoration: border rounded-lg shadow border-gray-200 dark:border-gray-700
...
titleStyle:
    base: mb-2 text-3xl font-bold tracking-tight
    decoration: ''
subTitleStyle:
    base: mb-2 text-2xl tracking-tight
    decoration: ''
...

This default theme file contains the necessary predefined values for different component's sections.

It is being copied to the ./schemas folder by the skin schema file generation process (gen-skin-schema script)

The file is being copied to the project folder to give a clear understand what are the default values used for the component.

Don't modify the default Yaml file to alter the component appearance. Instead, use the skin customization mechanism to fine tune the component's presentation.

For example, to add the extra top margin on the title section of the component, use:

rows
  - row:
      components:
        - flowbite/card:
            theme: 
              titleStyle: 
                decoration: mt-12
            selector:
              attributes:
                sectionName: nodoku-way

Nodoku skin component customization

The Nodoku skin file offers several level of component visual appearance customization:

  • global level: the customization is applied to all the components, having the customized option (titleStyle, in this example)
global:
  theme: 
    titleStyle: 
      decoration: mt-12
  • component level: the customization is applied on all the components with the given name
global:
  components:
    flowbite/card:
      theme:
        titleStyle:
          decoration: mt-12
  • individual component level: the customization is applied to the given component only:
  - row:
      components:
        - flowbite/card:
            theme:
              titleStyle:
                decoration: mt-12
            selector:
              attributes:
                sectionName: nodoku-way

Customization of sequential components

Consider a situation when several components are shown in a row, and the appearance of each one of them is identical, except for a single detail, say - title color.

For example, this is a typical situation working with the card component, when several cards are displayed on a single row.

This effect can be achieved using the sequential customization.

To use this feature, instead of the attribute "theme" use the attribute "themes", which is an array of component theme structure.

This way an arbitrary number of customizations can be defined.

Each one of them will be applied sequentially on a component with the given name.

For example, consider this skin file:

rows:
  - row:
      components:
        - flowbite/card:
            themes:
              - titleStyle:
                  decoration: text-red-500
              - titleStyle:
                  decoration: text-green-500
              - titleStyle:
                  decoration: text-blue-500
            selector:
              attributes:
                sectionName: nodoku-way

The sequential customization can be applied on all the 3 levels defined above (where the single theme customization can be applied): global level, component level and individual component level.

Applying the Flowbite theme

The flowbite-react library, on top of which the nodoku-flowbite is built, allows the user to provide their own theme, which is a convenient way to customize the appearance of the flowbite-react components.

The flowbite-react theme can also be applied on the Nodoku RenderingPage component, thus customizing all the flowbite-react components, that would be used during the rendering of Nodoku.

Consider the following code:

  import {Flowbite, getTheme} from "flowbite-react";
  ...
  const customCarousel = {...getTheme()};
  
  customCarousel.carousel.scrollContainer.base = "snap-mandatory flex h-full overflow-y-hidden overflow-x-scroll scroll-smooth rounded-none";
  
  ...
  
  export default async function Home({params}: { params: { lng: string } }): Promise<JSX.Element> {
    ...  
    return (
      <Flowbite theme={{theme: customCarousel}}>
        <RenderingPage .../>
      </Flowbite>
    );
  }

In this example we are customizing the flowbite-react component Carousel, on top of which the nodoku-flowbite's component flowbite/carousel is built.

The original (default) theme for the Carousel component has the following predefined value:

const carouselTheme = createTheme({
  ...
  scrollContainer: {
    base: "flex h-full snap-mandatory overflow-y-hidden overflow-x-scroll scroll-smooth rounded-lg",
    ...
  }
});

In order to remove the class rounded-lg, and replace it the class rounded-none, to remove the rounded corners of the Carousel component, one would use the theme customization shown above.

The nodoku-flowbite components

The package nodoku-flowbite contains currently the following components.

flowbite/card

A Nodoku wrapper around the Flowbite card component:

flowbite/horizontal-card

A Nodoku wrapper around the Flowbite horizontal card component:

flowbite/jumbotron

A Nodoku wrapper around the Flowbite jumbotron component:

flowbite/carousel

A Nodoku wrapper around the Flowbite carousel component:

The Nodoku skin file can contain also the options for the nodoku/carousel components, which are the options of the underlying flowbite-react Carousel component.

For example, to customize the scroll time use the following piece of yaml code in the skin file:

  - row:
      components:
        - flowbite/carousel:
            options: 
              slideInterval: 5000
            selector:
              attributes:
                sectionName: nodoku-way

The list of available options can be found in the JSON schema file.

Alternatively, one might want to use the autocompletion option (once the schema file is correctly applied), which should look similar to this: