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

@vivakits/react-components

v0.4.46

Published

A component library for React

Downloads

987

Readme

Vivakit React Tailwind Component Library

A component library for React

Installation

  • Install the package
 npm i @vivakits/react-components
  • Go to the tailwind.config.js file and update the content and add vivakitPreset as presets :
import { vivakitPreset } from "@vivakits/react-components";

 /** @type {import('tailwindcss').Config} */
export default {
  content: [
    ...,
    "./node_modules/@vivakits/react-components/dist/**/*.{js,ts,jsx,tsx}", // add this line
  ],
  theme: {},
  presets: [vivakitPreset],  // add the preset
  plugins: [],
};
  • Paste the following into your index.css file and change the colors according to your needs
@tailwind base;
@tailwind components;
@tailwind utilities;

@layer base {
  :root {
    --background: #fff;
    --foreground: #090909;
    --primary: #f97316;
    --primary-foreground: #fafaf9;
    --primary-light: #fef1e8;
    --secondary: #9b59b6;
    --secondary-foreground: #fafaf9;
    --secondary-light: #f5eef8;
    --accent: #3498db;
    --accent-foreground: #fafaf9;
    --accent-light: #ebf5fb;
    --success: #45d483;
    --success-foreground: #fafaf9;
    --success-light: #ecfbf3;
    --warning: #fab005;
    --warning-foreground: #fafaf9;
    --warning-light: #fff7e6;
    --danger: #fa5252;
    --danger-foreground: #fafaf9;
    --danger-light: #ffeeee;
    --neutral: #e4e4e7;
    --muted: #f4f4f5;
    --placeholder: #00000066;
    --black: #262626;
    --ring: #f97316;
    --divider: #00000066;
    --disabled: #f2f2f2;

    --vk_radius: 8px;
    --vk_height: 40px;
    --vk_padding: 0px 16px;
  }
}

Congrats! Now your are good to go 🥳

Available Components (till now)

Usage/Examples

Action Icon Component

import { VKActionIcon } from "@vivakits/react-components";

function App() {
  return (
    <VKActionIcon
      icon={<SearchIcon />} // ReactNode. Displays ActionIcon content
      variant="solid" // Changes ActionIcon appearance. Options: 'solid', 'outline', 'light'
      color="primary" // Changes ActionIcon color. Options: 'primary', 'secondary', 'accent', 'success', 'warning', 'danger'
      size="md" // Changes ActionIcon size. Options: 'default', 'xs', 'sm', 'md', 'lg', 'xl', '2xl'
      rounded="none" // Changes ActionIcon border radius. Options: 'default', 'none', 'xs', 'sm', 'md', 'lg', 'full'
      loading={false} // Whether the ActionIcon is loading
    />
  );
}

Anchor Component

import { VKAnchor } from "@vivakits/react-components";

function App() {
  return (
    <VKAnchor
      href="https://vivakit.vivasoftltd.com/"
      target="_blank"
      className="" // applying the custom css based on the variants
      color="primary" // Changes Anchor color. Options: 'primary', 'secondary', 'success', 'danger', 'warning', 'dark', 'light'
      size="xs" // Changes Anchor size. Options: 'default', 'xs', 'sm', 'md', 'lg', 'xl', '2xl'
      underline="hover" // Changes Anchor underline behavior. Options: 'none', 'hover', 'always'
      fontFamily="primary" // Changes Anchor font family. Options: 'primary', 'secondary'
    >
      Let's Go
    </VKAnchor>
  );
}

Asynchronous Datatable Component

import { AsyncDatatable } from "@vivakits/react-components";

function App() {
  return (
    <AsyncDatatable
      columnDefinitions={dataTableColumns}
      dataSource={dataTableDataSource}
      headerComponents={searchComponents} // optional
      isLoading={true} //optional. to show loader
      customLoadingComponent={<></>} //optional. If loading true then table shows a default Spinner. If you want to customize it, then pass a ReactNode through this attribute
      customEmptyDataComponent={} //optional. IF no data found then table shows a default React node. If you want to customize it, then pass a ReactNode through this attribute
      entriesHeader="" // optional. for customizing entries header
      entriesArray={[5, 10, 20]} // optional
      defaultEntries={10} //optional. to set default entries no initially
      entriesDropdownPosition="top" //optional. value is "top" or "bottom"
      entriesShowingSpaceText="" //optional. for customizing no of entries default 'of' text
      totalPages={20} // optional. mandatory for rendering pagination
      currentPage={currentPage} // optional. mandatory for rendering pagination
      noOfEntries={10} //optional. mandatory for showing no of entries value
      totalRecord={300} //optional. mandatory for showing no of entries value. This value defines total number of data in a table
      dynamicPreviousText="" // optional. for customizing previous btn label
      dynamicNextText="" // optional. for customizing next btn label
      previousIcon={<AnyIcon />} // optional. for customizing previous icon in pagination
      nextIcon={<AnyIcon />} // optional. for customizing next icon in pagination
      stripped // optional. It will show stripped rows.
      stripeColor="#c1c1c1" //optional. this color wll be override by default stripe color. It can take hex code or rgb() as well.
      horizontalBorder // optional. For adding horizontal border across all cells
      verticalBorder // optional. For adding vertical border across all cells
      isSelectableMulti // optional. mandatory for rendering selectable checkbox
      selectedRows={selectedRows} // optional. mandatory for rendering selectable checkbox. We have to pass the selectedRows array in this attribute
      defaultSelectedRows={defaultSelectedRows} // optional. pass an array of objects for default selecting
      handleOnSelectChange={handleOnSelectChange} // optional. mandatory for rendering selectable checkbox. callback function for selected rows
      handleOnSort={handleOnSort} // optional. callback function for getting the sorting dataIndex and sortOrder
      scroll={{ x: 2000, y: 500 }} // optional. x means horizontal width of table, y means height of the table.
      fixedHeader // optional. this attribute fixes our table header.
      rtl={true} //optional. for rtl support

      handleSearchInputChange={handleDataTableSearchInputChange} // optional. callback function for default search input
      handlePageChange={handlePageChange} // optional. However, mandatory for rendering pagination. callback function for pagination component
      handleNoOfEntriesChange={handleNoOfEntriesChange} // optional. However, mandatory for rendering entries. callback function for entries component
      handleOnRowClick={handleOnRowClick} // optional. Callback function for handling row click
      styles={{
        datatableFooterWrapperClassName="" // optional. for custom styling
        paginationWrapperClassName="text-gray-600" // optional. for custom styling
        paginationNoOfEntriesWrapperClassName="text-gray-600" // optional. for customizing no of entries text styling
        paginationPrevBtnClassName="text-gray-600" // optional. for custom styling pagination
        paginationNextBtnClassName="text-gray-600" // optional. for custom styling pagination
        paginationButtonClassName="" // optional. for custom styling pagination
        paginationButtonSelectedClassName="bg-gray-100 !text-black font-semibold" // optional. for custom styling
        tableWrapperClassName="" //optional. for custom styling
        headerWrapperClassName="bg-[#F2F5FF]" // optional. for custom styling
        headItemClassName="" // optional. for custom styling
        headItemLabelClassName="text-xs font-semibold text-gray-600" // optional. for custom styling
        tableBodyWrapperClassName="" // optional. for custom styling
        rowWrapperClassName="" // optional. for custom styling
        rowItemClassName="text-gray-500" // optional. for custom styling
        rowItemLabelClassName="text-sm" // optional. for custom styling
        entriesWrapperClassName="" // optional. for custom styling
        entriesHeaderClassName="" // optional. for custom styling
        selectEntriesWrapperClassName="" // optional. for custom styling
        selectEntryItemClassName="" // optional. for custom styling
        checkboxWrapperClassName="" // optional. for custom styling of checkbox wrapper
        checkboxClassName="" // optional. for custom styling of checkbox
      }}
    />
  );
};

Avatar Component

import { VKAvatar } from "@vivakits/react-components";

function App() {
  return (
    <div>
      <VKAvatar
        variant="text" // optional. Defines the variant of the avatar. Options: 'image', 'text'
        size="lg" // optional. Defines the size of the avatar. Options: 'xs', 'sm', 'md', 'lg', 'xl', '2xl'
        shape="rounded" // optional. Defines the shape of the avatar. Options: 'rounded', 'curved', 'square'
        fontSize="md" // optional. Defines the font size within the avatar. Options: 'default', 'xs', 'sm', 'md', 'lg', 'xl', '2xl'
        className="" // applying the custom CSS based on the variants
        color="primary" // optional. Defines the background color of the avatar. Options: 'none', 'primary', 'secondary', 'success', 'danger', 'warning', 'dark', 'light'
        borderColor="dark" // optional. Defines the border color of the avatar. Options: 'primary', 'secondary', 'success', 'danger', 'warning', 'dark', 'light'
        withBorder={true} // optional. If true, adds a border to the avatar
        fontFamily="default" // optional. Defines the font family within the avatar. Options: 'default', 'sansSerif', 'sans', 'mono'
        fontColor="default" // optional. Defines the font color within the avatar. Options: 'default', 'primary', 'secondary', 'success', 'danger', 'warning', 'dark', 'light'
        textValue="JS" // optional. Text content to display inside the avatar
        onClick={() => alert("Avatar clicked")} // optional. Click handler for the avatar
        src="" // optional. for image source of avatar
        alt="" // optional. for alternate text for image of avatar
      >
        JS
      </VKAvatar>
    </div>
  );
}

Badge Component

import { VKBadge } from "@vivakits/react-components";

function App() {
  return (
    <VKBadge
      variant="circular" // optional. for determining the style of badge. Currently "circular" | "square" available
      color="primary" // optional. for determining the background color of the badge
      borderColor="primary" // optional. for determining the border color of badge when border is available
      size="md" // optional. for different size of badge
      placement="topRight" // optional. for different placement. Currently "topRight" | "topLeft" | "bottomLeft" | "bottomRight" available
      invisible={false} // optional. for changing the badge visibility
      className="" // optional. for custom css class on the badge
      content={<CameraIcon />} // optional. for showing content inside badge. Currently "JSX.Element" | "number" type available
      containerProps={{}} // optional. for applying props to the wrapper container which holds children and badge
      containerRef={containerRef} // optional. for referencing the wrapper container
      ref={badgeRef} // optional. for referencing the badge component
      withBorder // optional. determines if border should be shown
    >
      <button>Button with badge</button>
    </VKBadge>
  );
}

Breadcrumb Component

import { BreadCrumbs } from "@vivakits/react-components";

function App() {
  const breadcrumbOptions = [
    { title: "Home", href: "/" },
    { title: "Category", href: "/category" },
    { title: "Subcategory", href: "/category/subcategory" },
    { title: "Current Page", href: window.location.pathname },
  ];

  const customStyle = {
    bg: "bg-gray-100 p-4 rounded",
    wrapper: "space-x-3",
    item: "flex items-center",
    link: "text-blue-600 hover:text-blue-800",
    href: "p-2 rounded-lg",
  };

  return (
    <div>
      <BreadCrumbs
        separator=">" // Separator displayed between breadcrumb items
        options={breadcrumbOptions} // Array of breadcrumb options
        underline={true} // Enable underline for breadcrumb links
        style={customStyle} // Custom styles for breadcrumb component
      />
    </div>
  );
}

Button Component

import { Button } from "@vivakits/react-components";

function App() {
  return (
    <Button
      variant="solid" // Style variant of the button. Options: 'solid', 'outline', 'text'
      color="primary" // Color variant of the button. Options: 'primary', 'secondary', 'success', 'danger', 'warning', 'dark', 'light'
      size="lg" // Size of the button. Options: 'sm', 'md', 'lg', 'xl', '2xl'
      rounded="md" // Border radius of the button. Options: 'none', 'xs', 'sm', 'md', 'lg', 'xl', 'full'
      onClick={() => console.log("Button clicked")} // Click handler function
    >
      Click me!
    </Button>
  );
}

Checkbox Component

import { useState } from "react";
import { Checkbox, CheckboxGroup, IndeterminateCheckbox } from "@vivakits/react-components";

function App() {
  const [selectedValues, setSelectedValues] = useState<string[]>([]);

  const handleCheckboxChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    const { value, checked } = e.target;
    if (checked) {
      setSelectedValues((prevValues) => [...prevValues, value]);
    } else {
      setSelectedValues((prevValues) =>
        prevValues.filter((val) => val !== value)
      );
    }
  };

  const checkboxOptions = [
    { label: "Option 1", value: "1" },
    { label: "Option 2", value: "2" },
    { label: "Option 3", value: "3" },
  ];

  return (
     <>
      {/* Checkbox Group */}
      <CheckboxGroup
        options={checkboxOptions} // Array of checkbox options
        handleChange={handleCheckboxChange} // Function to handle change events
      />

      {/* Single Checkbox */}
      <Checkbox
        id="single-checkbox" // Unique identifier for the single checkbox
        size="md" // Size of the checkbox
        color="primary" // Color of the checkbox
        rounded="full" // Border radius of the checkbox
        hasError={false} // Whether the checkbox has an error
      >
        Single Checkbox
      </Checkbox>

      {/* Checkbox with Error */}
      <Checkbox
        id="checkbox-with-error" // Unique identifier for the checkbox with an error
        size="md" // Size of the checkbox
        color="danger" // Color of the checkbox
        rounded="full" // Border radius of the checkbox
        hasError={true} // Whether the checkbox has an error
        errorMessage="This is required" // Error message to display
      >
        Checkbox with Error
      </Checkbox>

      {/* Indeterminate Checkbox */}
      <IndeterminateCheckbox
        indeterminate={true} // Whether the checkbox is indeterminate
        checked={false} // Whether the checkbox is checked
      />

      {/* Different Sizes and Colors Checkboxes */}
      <Checkbox
        id="checkbox-size-sm" // Unique identifier for the small secondary checkbox
        size="sm" // Size of the checkbox
        color="secondary" // Color of the checkbox
        rounded="xs" // Border radius of the checkbox
      >
        Small Secondary Checkbox
      </Checkbox>
      <Checkbox
        id="checkbox-size-lg" // Unique identifier for the large success checkbox
        size="lg" // Size of the checkbox
        color="success" // Color of the checkbox
        rounded="lg" // Border radius of the checkbox
      >
        Large Success Checkbox
      </Checkbox>
    </>
  );
};

Chip Component

import { VKChip } from "@vivakits/react-components";

function App() {
  return (
    <VKChip
      variant="outlined" // optional. for determining the style of Chip. Currently "outlined" | "filled" available
      color="primary" // optional. for determining the background and text color
      size="md" // optional. for different text size & chip size
      fontSize="md" // optional. for different font size
      state="disabled" // optional. for the current state of chip. Currently "selected" | "unselected" | "disabled" available
      leftIcon={<ProfileIcon />} // optional. for showing icon on the left
      rightIcon={<CloseIcon />} // optional. for showing icon on the right
      open={true} // optional. determines if the chip should be shown or hidden
      onClick={handleOnClick} // optional. when clicking on the chip the provided function would run
      onRightIconClick={handleRightIconClick} // optional. when clicking on the right icon the provided function would run
      onLeftIconClick={handleLeftIconClick} // optional. when clicking on the left icon the provided function would run
      className="" // optional. for custom css for a chip
      iconClassName="" // optional. for custom css for icons on the chip
      leftIconClassName="" // optional. for custom css for left icon on the chip
      rightIconClassName="" // optional. for custom css for the right icon on the chip
      labelClassName="" // optional. for custom css for the text label on the chip
      label="" // optional. for showing the text label on the chip
      rounded={true} // optional. determines if the chip should be rounded or curved square
    />
  );
}

Data Table

Dropdown Component

import React, { useState } from "react";
import {
  Dropdown,
  DropdownTrigger,
  DropdownMenu,
  DropdownItem,
} from "@vivakits/react-components";

function App() {
  // State to handle open/close of dropdown
  const [isOpen, setIsOpen] = useState(false);

  // Function to handle item selection
  const handleItemSelect = (value) => {
    console.log(`Selected: ${value}`);
    setIsOpen(false); // Close the dropdown on item select
  };

  return (
    <>
      <Dropdown open={isOpen}>
        <DropdownTrigger action="click"> {/* action can be "click" or "hover" */}
          <button onClick={() => setIsOpen(!isOpen)}>Dropdown Action</button>
        </DropdownTrigger>
        <DropdownMenu align="end"> {/* align can be "start", "center", "end", "top-left", "top-right", "bottom-left", "bottom-right" */}
          <DropdownItem
            value="Edit"
            onItemSelect={handleItemSelect}
            disabled={false} {/* can be true to disable */}
            className="custom-class" {/* optional custom class */}
          >
            Edit
          </DropdownItem>
          <DropdownItem
            value="Duplicate"
            onItemSelect={handleItemSelect}
            disabled={false} {/* can be true to disable */}
            className="custom-class" {/* optional custom class */}
          >
            Duplicate
          </DropdownItem>
        </DropdownMenu>
      </Dropdown>
    </>
  );
};

Group Component

import { VKGroup } from "@vivakits/react-components";

function App() {
  return (
    <VKGroup
      orientation="vertical" // optional. determines the orientation of the group. Currently "vertical" | "horizontal" available
      separatorColor="primary" // optional. for the separator color of the group
      color="primary" // optional. for the background color of the group
      border="sm" // optional. for the size of the border of the group
      borderColor="primary" // optional. for the border color of the group
      size="md" // optional. determines the size of the group. This is applied to all the children inside group
      rounded="none" // optional. for the border radius of the group
      className="" // optional. for the custom css style of the group
      maxCount={3} // optional. limits the number of elements shown on the group
      noSeparator={false} // optional. determines if separator should be shown or not
      shouldOverlapChildren={false} // optional. overlaps children to the left side inside the group. Often used with avatar components
      shouldWrap={true} // optional. determines if "flex-wrap" style should be applied
      truncatedElement={<TruncateElement />} // optional. when max count is available this element
      // shows the amount of children that are hidden
      // this element would receive a prop named "hiddenitems" which holds an array of hidden children from the group component
      shouldProvideHiddenChildren={true} // determines if "hiddenitems" should be passed on the truncated element
      childrenProps={{}} // optional. for applying common props to all children under the group component
    >
      <button>button 1</button>
      <button>button 1</button>
    </VKGroup>
  );
}

Highlight Component

import { Highlight } from "@vivakits/react-components";

function App() {
  return (
    <>
      {/* Single word highlight */}
      <Highlight
        highlightText="highlight" // Text to be highlighted (single word)
        background="success" // Background color for the highlight (success color)
        rounded="full" // Full border radius for the highlight (fully rounded)
        className="text-highlight" // Additional class for custom styling
      >
        This is a sample text to highlight a specific word.
      </Highlight>

      {/* Multiple words highlight */}
      <Highlight
        highlightText={["multiple", "words"]} // Array of words to be highlighted (multiple words)
        background="warning" // Background color for the highlight (warning color)
        rounded="md" // Medium border radius for the highlight (medium rounded)
        className="text-highlight" // Additional class for custom styling
      >
        This is a sample text to highlight multiple words in the sentence.
      </Highlight>

      {/* Styled highlight */}
      <Highlight
        highlightText="styled" // Text to be highlighted (single word)
        background="danger" // Background color for the highlight (danger color)
        rounded="xs" // Small border radius for the highlight (extra small rounded)
        className="text-highlight" // Additional class for custom styling
        style={{ fontWeight: "bold", fontStyle: "italic" }} // Inline styles for custom styling (bold and italic)
      >
        This is a sample text with a styled highlight.
      </Highlight>
    </>
  );
}

Input Component

import { Input } from "@vivakits/react-components";

function App() {
  return (
    <Input
      type="text" // Specifies the type of input field
      label="User Input" // Sets the label text for the input field
      isRequired // Indicates that the input is required
      labelPosition="start" // Positions the label to the left of the input field
      icon={<span className="material-icons">person</span>} // Icon displayed before the input field
      iconPosition="start" // Positions the icon to the left of the input field
      variant="outline" // Uses an outlined style for the input field
      size="lg" // Sets the large size for the input field
      color="primary" // Sets the primary color theme for the input field
      rounded="full" // Applies full rounded corners to the input field
      hasError={false} // Indicates if the input field has an error state
      errorMessage="This field is required" // Error message displayed when hasError is true
      errorClassName="text-red-500" // Custom CSS class for the error message text
      hint="Enter your user information" // Hint text displayed below the input field
      prefixContent="http://" // Content displayed before the input field
      prefixClassName="bg-gray-200 text-gray-700" // Custom CSS class for the prefix content
      suffixContent=".com" // Content displayed after the input field
      suffixClassName="bg-gray-200 text-gray-700" // Custom CSS class for the suffix content
      prefixRounded="lg" // Applies large rounded corners to the prefix content
      suffixRounded="lg" // Applies large rounded corners to the suffix content
      placeholder="yourname" // Placeholder text displayed inside the input field
    />
  );
}

Label Component

import { VKLabel } from "@vivakits/react-components";

function App() {
  return (
    <VKLabel
      color="primary" // optional. for determining the text color for label
      decorationColor="secondary" // optional. for decoration color if decoration is available on label text
      align="start" // optional. applies "align-self" style to the label
      size="md" // optional. for different text sizes on label
      fontFamily="sansSerif" // optional. for applying different font family on the label
      decoration="underline" // optional. for applying different decorations on the label
      wordSpacing="normal" // optional. for different word spacing on the label
      weight="400" // optional. for applying different font weights on the label
      isRequired // optional. determines if the label is required. Puts a "*" after the label
      isDisabled // optional. determines if the label is disabled. Shown with "text-gray-600" color
      hasError // optional. determines if the label has error. Shown with "text-danger" color
      italic // optional. for applying italic text on the label
      bold // optional. for applying bold style on the label
      gutterBottom // optional. for applying extra margin at the bottom of the element
      gutterTop // optional.  for applying extra margin at the top of the element
      disableCopy // optional. for determining if the text can be copied
      className="" // optional. for applying custom css class on the label
      translationFn={translation} // optional. this accepts a translation function which is called with children as its parameter
      // if translationFn is available it would be called like "translationFn(children)" inside the label
    >
      Label
    </VKLabel>
  );
}

Modal Component

import React from "react";
import {
  Modal,
  ModalBody,
  ModalContent,
  ModalFooter,
  ModalHeader,
  ModalTrigger,
} from "@vivakits/react-components";
import { Button } from "@vivakits/react-components";

function App() {
  const handleCancel = () => {
    // Handle cancel logic here
  };

  const handleSave = () => {
    // Handle save logic here
  };

  return (
    <Modal
      varient="screen-size" // Optional. Specifies the variant of the modal. Options: 'default', 'screen-size'
    >
      {/* ModalTrigger component */}
      <ModalTrigger>
        <Button
          variant="solid" // Style variant of the button. Options: 'solid', 'outline', 'text'
          rounded="md" // Border radius of the button. Options: 'none', 'xs', 'sm', 'md', 'lg', 'xl', 'full'
          className="px-3 py-2"
          color="primary" // Color variant of the button. Options: 'primary', 'secondary', 'success', 'danger', 'warning', 'dark', 'light'
        >
          Open Modal
        </Button>
      </ModalTrigger>

      {/* ModalContent component */}
      <ModalContent
        className="w-[600px]" // Optional. Custom class name for styling
        isDismissible={true} // Optional. Whether modal can be dismissed by clicking outside
        backdrop="bg-[rgba(0,0,0,0.25)] backdrop-blur-[2px]" // Optional. Background styling for modal backdrop
      >
        {/* ModalHeader component */}
        <ModalHeader
          wrapperClassName="px-4" // Optional. Custom class name for header wrapper
        >
          Modal Header
        </ModalHeader>

        {/* ModalBody component */}
        <ModalBody className="p-4">
          <p className="text-gray-500">
            {/* Modal body content */}
            Fusce in enim facilisis, placerat elit sed, porta tortor. Vivamus porta
            non ligula id sagittis.
            {/* Additional content truncated for brevity */}
          </p>
        </ModalBody>

        {/* ModalFooter component */}
        <ModalFooter>
          <Button
            variant="outline" // Style variant of the button. Options: 'solid', 'outline', 'text'
            onClick={handleCancel} // Optional. Click handler for the button
            className="px-3 py-1.5"
          >
            Cancel
          </Button>
          <Button onClick={handleSave} className="px-3 py-1.5">
            Save
          </Button>
        </ModalFooter>
      </ModalContent>
    </Modal>
  );
}

Notification Component

import {
  VKNotifications,
  useVKNotifications,
} from "@vivakits/react-components";

function App() {
  const { notify, closeNotification, closeAllNotifications } =
    useVKNotifications();

  return (
    <>
      <VKNotifications />
      <button
        onClick={() => {
          notify({
            id: "", // optional. for uniquely identifying each notification
            icon: <InfoIcon />, // optional. custom icon shown beside title
            closeIcon: <CloseIcon />, // optional. custom close icon for the notification
            title: "", // optional. title shown for the notification
            description: "", // mandatory. for showing notification text
            onClose: onClose, // optional. for what to do after closing a notification
            className: "", // optional. for custom css for a notification
            autoClose: true, // optional. for enabling / disabling auto close for a notification
            duration: 4000, // optional. for the duration in milliseconds after which the notification will close
            variant: "success", // optional. for showing different type of notification.
            color: "default", // optional. for showing different color on notification.
            size: "lg", // optional. for showing different text size and notification size
            placement: "topRight", // optional. for placing the notification in different locations on the web view.
          });
        }}
      >
        Open Notification
      </button>
      <button
        onClick={
          closeAllNotifications // closes all notifications on the web view at all placements
        }
      >
        Close All Notifications
      </button>
      <button
        onClick={
          (id) => closeNotification(id) // closes the notification that matches with the id provided
        }
      >
        Close Single Notification
      </button>
    </>
  );
}

Otp Input Component

import React from "react";
import { VKOtpInput, Button } from "@vivakits/react-components";

function App() {
  const handleOtpSubmit = (value) => {
    alert(`Submitted OTP: ${value}`);
  };

  const renderSubmitButton = (value, callback) => (
    <Button
      onClick={() => callback(value)}
      className="bg-blue-500 text-white px-4 py-2 rounded"
    >
      Submit OTP
    </Button>
  );

  const renderResetButton = (callback) => (
    <Button
      onClick={callback}
      className="bg-red-500 text-white px-4 py-2 rounded"
    >
      Reset
    </Button>
  );

  return (
    <VKOtpInput
      inputLength={6} // Specifies the length of the OTP input
      maskedIcon="•" // Icon or character used to mask the input
      isMasked={true} // Indicates whether the OTP input is masked (characters hidden)
      groupSize={3} // Group size for separating digits (e.g., 123-456)
      separator="-" // Separator character used between groups of digits
      allowChar={true} // Allows characters in addition to numbers in the OTP input
      required={true} // Indicates that the OTP input is required
      hasError={false} // Indicates if the OTP input has an error state
      errorMessage="Please fill all the inputs" // Error message displayed when hasError is true
      rounded="md" // Applies medium rounded corners to the OTP input
      size="lg" // Sets the large size for the OTP input
      className="border border-gray-300" // Custom CSS class for additional styling
      wrapperClass="mb-4" // Custom CSS class for the wrapper around the OTP input
      onSubmit={handleOtpSubmit} // Callback function invoked when OTP input is submitted
      renderSubmitButton={renderSubmitButton} // Function to render a custom submit button
      renderResetButton={renderResetButton} // Function to render a custom reset button
    />
  );
}

Pop Confirm Component

import React from "react";
import { Popconfirm, Button } from "@vivakits/react-components";

const App = () => {
  return (
    <Popconfirm
      children={<span>Trigger Popconfirm</span>} // Displays popconfirm triggering text
      wrapperClassName="trigger-class" // Classname for the popconfirm trigger
      title="Delete this item?" // Content of the popconfirm
      description="Are you sure you want to delete this item?" // Optional description of the popconfirm
      icon={
        <img
          src="https://img.icons8.com/nolan/48/information.png"
          alt="information"
        />
      } // Optional icon for the popconfirm
      yesButton={
        <button
          className="bg-purple-700 rounded-lg p-1 w-1/3"
          style={{ minWidth: "30%" }}
          onClick={() => alert("You clicked on the Yes button")}
        >
          Yes
        </button>
      } // Action button for the popconfirm
      noButton={
        <button
          className="border border-purple-700 rounded-lg p-1 w-1/3"
          style={{ minWidth: "30%" }}
          onClick={() => alert("You clicked on the No button")}
        >
          No
        </button>
      } // Action button for the popconfirm
      position="top" // Position of the popconfirm. Options: 'top', 'topLeft', 'topRight', 'left', 'bottom', 'bottomLeft', 'bottomRight'
      responsive={true} // Whether the popconfirm is responsive
      caret={true} // Whether to show the caret
      maxWidth="250px" // Maximum width of the popconfirm
      bodyClassName="border border-purple-700 text-white" // Classname for the popconfirm
      caretColor="purple" // Color of the caret
    >
      <Button className="w-28" size="md" variant="light">
        Click me
      </Button>
    </Popconfirm>
  );
};

Radio Button Component

import React, { useState } from "react";
import { RadioGroup, RadioButton } from "@vivakits/react-components";

function App() {
  const [selectedValue, setSelectedValue] = (useState < string) | (number > "");

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setSelectedValue(e.target.value);
  };

  return (
    <RadioGroup
      label="Select an option" // Label for the radio group
      labelPosition="start" // Position of the label relative to the radio buttons
      wrapperClassName="mb-4" // Custom CSS class for the wrapper around the radio group
      labelClassName="text-gray-700 font-semibold" // Custom CSS class for styling the label
      name="exampleRadioGroup" // Name attribute for the radio group (shared among radio buttons)
      selectedValue={selectedValue} // Currently selected value (controlled component)
      onChange={handleChange} // Callback function invoked when a radio button selection changes
    >
      <RadioButton
        id="option1" // Unique ID for the first radio button
        value="option1" // Value associated with the first radio button
        color="primary" // Color variant of the first radio button
        size="md" // Size variant of the first radio button
        variant="circle" // Shape variant of the first radio button
        className="border-gray-300" // Custom CSS class for additional styling of the first radio button
        wrapperClassName="mb-2" // Custom CSS class for the wrapper around the first radio button
        labelClassName="ml-2 text-gray-600" // Custom CSS class for styling the label of the first radio button
      >
        Option 1 // Label text for the first radio button
      </RadioButton>

      <RadioButton
        id="option2" // Unique ID for the second radio button
        value="option2" // Value associated with the second radio button
        color="secondary" // Color variant of the second radio button
        size="md" // Size variant of the second radio button
        variant="square" // Shape variant of the second radio button
        className="border-gray-300" // Custom CSS class for additional styling of the second radio button
        wrapperClassName="mb-2" // Custom CSS class for the wrapper around the second radio button
        labelClassName="ml-2 text-gray-600" // Custom CSS class for styling the label of the second radio button
      >
        Option 2 // Label text for the second radio button
      </RadioButton>

      <RadioButton
        id="option3" // Unique ID for the third radio button
        value="option3" // Value associated with the third radio button
        color="success" // Color variant of the third radio button
        size="md" // Size variant of the third radio button
        variant="circle" // Shape variant of the third radio button
        className="border-gray-300" // Custom CSS class for additional styling of the third radio button
        wrapperClassName="mb-2" // Custom CSS class for the wrapper around the third radio button
        labelClassName="ml-2 text-gray-600" // Custom CSS class for styling the label of the third radio button
      >
        Option 3 // Label text for the third radio button
      </RadioButton>
    </RadioGroup>
  );
}

Select Component

import React, { useState } from "react";
import { Select } from "@vivakits/react-components";

const App = () => {
  const [value, setValue] = useState(); // State to hold selected value
  const [options] = useState([
    { label: "Blue", value: "Blue" },
    { label: "White", value: "White" },
    { label: "Black", value: "Black" },
    { label: "Orange", value: "Orange" },
  ]); // State for options

  return (
    <Select
      options={options}
      onChange={(option) => setValue(option)}
      value={value}
      variant="solid" // Comment: 'outline', 'text'
      size="md" // Comment: 'sm', 'lg', 'xl'
      rounded="md" // Comment: 'none', 'xs', 'sm', 'lg', 'full'
      label="Choose a color" // Comment: Label for the select component
      labelPosition="top" // Comment: 'start', 'end', 'horizontal'
      labelClassName="font-semibold" // Comment: Custom utility classes for label
      isRequired={true} // Comment: boolean
      showCancel={false} // Comment: boolean
      showDivider={false} // Comment: boolean
      placeholder="Select color" // Comment: Placeholder text
      hasError={false} // Comment: boolean
      // errorMessage="Please select a color" // Comment: Error message to display
      isLoading={false} // Comment: boolean
      menuPlacement="bottom" // Comment: 'top'
      // menuMaxHeight="200px" // Comment: Maximum height of the dropdown menu
      isMultiple={false} // Comment: boolean
      isScrollable={false} // Comment: boolean
      isSearchable={true} // Comment: boolean
      // noOptionsMessage="No colors available" // Comment: Message to display when no options are available
      optionsWithCheck={false} // Comment: boolean
      // checkedIcon={<CheckIcon />} // Comment: Custom icon for selected options
      // removeValueIcon={<CloseIcon />} // Comment: Custom icon for removing selected values
      showSelectedOptions={false} // Comment: boolean
      // isCreatable={true} // Comment: boolean
      isDisabled={false} // Comment: boolean
      // DropdownIndicator={<CustomDropdownIndicator />} // Comment: Custom icon for dropdown
      // createOptionByAPI={(newOption) => console.log('New option created:', newOption)} // Comment: Callback function when new option is created
      // styles={customStyles} // Comment: Custom utility classes for styling
    />
  );
};

Skeleton Component

import { Skeleton } from "@vivakits/react-components";

function App() {
  return (
    <Skeleton
      variant="rectangular" // Specifies the variant of the skeleton. Options: 'rectangular', 'circular', 'text'
      size="lg" // Size of the skeleton. Options: 'sm', 'md', 'lg', 'xl'
      height={40} // Height of each element in the skeleton (applicable to 'rectangular' and 'text' variants)
      width={220} // Width of each element in the skeleton (applicable to 'rectangular' and 'text' variants)
      rounded="8px" // Border radius (rounded corners) of the elements (applicable to 'rectangular' and 'circular' variants)
      numOfRows={2} // Number of rows (elements) in the skeleton (applicable to 'rectangular' and 'text' variants)
      numOfColumns={3} // Number of columns (elements) in the skeleton (applicable to 'rectangular' and 'text' variants)
    />
  );
}

Spinner Component

import React from "react";
import { Spinner } from "@vivakits/react-components";

function App() {
  return (
    <Spinner
      variant="default" // Defines the variant of the spinner. Options: 'default', 'circular', 'text'
      size="md" // Defines the size of the spinner. Options: 'sm', 'md', 'lg', 'xl', '2xl'
      color="primary" // Defines the color of the spinner. Options: 'primary', 'secondary', 'success', 'danger', 'warning', 'dark', 'light', 'accent'
      className="" // Custom CSS class for additional styling
    />
  );
}

Switch Component

import { useState } from "react";
import { VKSwitch } from "@vivakits/react-components";

function App() {
  const [isChecked, setIsChecked] = useState(false);

  const handleToggle = (newCheckedState) => {
    setIsChecked(newCheckedState);
    console.log("Switch is now:", newCheckedState ? "ON" : "OFF");
  };

  return (
    <VKSwitch
      defaultChecked={false} // Default initial state of the switch
      isChecked={isChecked} // Controlled state of the switch (boolean)
      onToggle={handleToggle} // Callback function invoked when the switch state changes
      disabled={false} // If true, disables the switch interaction
      isVertical={false} // If true, renders the switch vertically
      reversible={true} // If true, allows the switch to be reversible (toggle between states)
      variant="iOS" // Visual style variant of the switch. Options: 'default', 'iOS', 'material'
      size="lg" // Size variant of the switch. Options: 'sm', 'md', 'lg'
      color="primary" // Background color of the switch. Options: 'primary', 'secondary', 'success', 'danger', 'warning', 'dark', 'light'
      switchColor="secondary" // Color variant of the switch. Options: 'primary', 'secondary', 'success', 'danger', 'warning', 'dark', 'light'
      bodyClassName="custom-body-class" // Custom CSS class applied to the switch body
      switchClassName="custom-switch-class" // Custom CSS class applied to the switch toggle
      onIcon={
        <span role="img" aria-label="On">
          🔆
        </span>
      } // Icon or content displayed when switch is on
      offIcon={
        <span role="img" aria-label="Off">
          🌙
        </span>
      } // Icon or content displayed when switch is off
      onInnerLabel="ON" // Inner label text displayed when switch is on
      offInnerLabel="OFF" // Inner label text displayed when switch is off
      label="Toggle Switch" // Label text displayed next to or above the switch
      labelPlacement="top" // Placement of the label relative to the switch. Options: 'top', 'bottom', 'left', 'right'
      labelClassName="custom-label-class" // Custom CSS class applied to the label
      required={true} // If true, indicates that the switch is required for form submission
    />
  );
}

Textarea Component

import { Textarea } from "@vivakits/react-components";

function App() {
  return (
    <Textarea
      label="Description" // Label text displayed above the textarea
      placeholder="Enter your description here..." // Placeholder text shown when textarea is empty
      variant="outline" // Visual style variant of the textarea. Options: 'outline', 'filled'
      color="primary" // Background color of the textarea. Options: 'primary', 'secondary', 'success', 'danger', 'warning', 'dark', 'light'
      size="lg" // Size variant of the textarea. Options: 'sm', 'md', 'lg'
      rounded="lg" // Border radius (rounded corners) of the textarea
      wrapperClassName="mb-2" // Custom CSS class applied to the wrapper/container of the textarea
      labelClassName="font-semibold" // Custom CSS class applied to the label text
      errorClassName="text-danger" // Custom CSS class applied to the error message text
      errorMessage="Please enter a valid description." // Error message displayed when validation fails
      onChange={(e) => console.log(e.target.value)} // Callback function invoked when the textarea value changes
    />
  );
}

Time Range Picker Component

import { VKTimeRangePicker } from "@vivakits/react-components";

function App() {
  return (
    <VKTimeRangePicker
      defaultValue={["10:00 AM", "12:00 PM"]} // Optional. Default value for the time range picker. if range is true then pass an array of two strings. Otherwise, pass a single string. string format should be "hh:mm AM/PM"
      callback={(params: any) => console.log(params)} // A callback function for getting the selected time range.
      range={true} // Optional. Determines if the time range picker should be a range picker or not.
      size="sm" // Optional. Size of the time range picker.
      rounded="lg" // Optional. Border radius of the time range picker.
      color="primary" // Optional. Theme color of the time range picker.
      fromPlaceholder="" // Optional. Placeholder for the from input.
      toPlaceholder="" // Optional. Placeholder for the to input.
      containerClassName="" // Optional. Custom class for the time range picker container.
      inputWrapperClassName="" // Optional. Custom class for the input wrapper.
      inputClassName="" // Optional. Custom class for the input.
      modalWrapperClassName="" // Optional. Custom class for the modal wrapper.
      buttonClassName="" // Optional. Custom class for the button.
      onReset={(params: any) => console.log(params)} // Optional. Callback function for resetting the time range picker.
      isClearable={true} // Optional. Determines if the reset button show or not. value is true or false.
      customResetLabel="" // Optional. Custom label for the reset button.
      customNowLabel="" // Optional. Custom label for the now button.
    />
  );
}

Tooltip Component

import { Tooltip } from "@vivakits/react-components";

function App() {
  return (
    <Tooltip
      content="Tooltip content" // Text content or JSX to display in the tooltip
      position="top" // Position of the tooltip relative to its target. Options: 'top', 'bottom', 'left', 'right'
    >
      {/* Content that triggers the tooltip */}
      <button className="bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded-md">
        Hover me
      </button>
    </Tooltip>
  );
}

Typography Component

import { VKTypography } from "@vivakits/react-components";

function App() {
  return (
    <VKTypography
      variant="h1" // optional. for determine the type of element to use for title. Currently "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "paragraph" available
      fontFamily="sansSerif" // optional. for applying different font family on the title
      color="primary" // optional. for determining the text color
      decorationColor="secondary" // optional. for decoration color if decoration is available
      size="lg" // optional. for different text sizes
      lineHeight="normal" // optional. for different line heights
      align="left" // optional. determines the text alignment property
      decoration="underline" // optional. for applying different decorations on the title
      overflow="truncate" // optional. for determining different text overflow on the title
      wordBreak="normal" // optional. for determining different word break on the title
      wordSpacing="normal" // optional. for different word spacing on the title
      weight="400" // optional. for applying different font weights on the title
      bold={true} // optional. for applying text bold on the title
      italic={true} // optional. for applying italic text on the title
      noWrap={true} // optional. determines if the text would wrap within the element
      gutterBottom={true} // optional. for applying extra margin at the bottom of the element
      disableCopy={true} // optional. for determining if the text can be copied
      className="" // optional. for custom css class on the title
      translationFn={translation} // optional. this accepts a translation function which is called with children as its parameter
      // if translationFn is available it would be called like "translationFn(children)" inside the title class
    >
      Typography
    </VKTypography>
  );
}