{"_id":"@abel3t/ui","_rev":"2-44b576b366d8c6230bd578ff0ecd12cf","name":"@abel3t/ui","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"@abel3t/ui","version":"0.0.1","keywords":["react","ui","component-library","tailwindcss","tailwind","typescript","vite","react-components","design-system","accessible-ui","customizable-ui","react-ui-kit","frontend","web-components","ui-framework","css-in-js","react-hooks","responsive-ui","modern-ui","developer-friendly"],"license":"MIT","_id":"@abel3t/ui@0.0.1","maintainers":[{"name":"abel3t","email":"abeltran.develop@gmail.com"}],"dist":{"shasum":"ca2e5d27b05aa3aae13997ed0b47d48872634e3c","tarball":"https://registry.npmjs.org/@abel3t/ui/-/ui-0.0.1.tgz","fileCount":33,"integrity":"sha512-ca8zPl7R+agtq9PwYrS+7usrAIS8V7JV9j5wdkxuiCmBLHIWDgtX3ng9cjalFr6KF4XMq9KaUMCNLsWNDExSYg==","signatures":[{"sig":"MEQCIAHkr1W9I1pY6aIYcNMDbmQgS0GDjquij3KjXka/YqemAiBd4VCWO84RNMAQczDrU7ZltJGqufVT2LyeKmFznws0tA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":186961},"main":"./dist/abel3t-ui-umd.cjs","type":"module","module":"./dist/abel3t-ui.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/abel3t-ui.js","require":"./dist/abel3t-ui-umd.cjs"}},"gitHead":"399573495346fc3d70d9a78cb67273f94d80d468","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest","build":"tsc -b && vite build","check":"tsc --noEmit && eslint . --ext .ts,.tsx","prepare":"npm run build","preview":"vite preview","coverage":"vitest run --coverage","prebuild":"rm -rf dist","storybook":"storybook dev -p 6006","build-storybook":"storybook build","semantic-release":"semantic-release"},"_npmUser":{"name":"abel3t","email":"abeltran.develop@gmail.com"},"_npmVersion":"10.8.2","description":"A customizable, accessible, and developer-friendly React UI component library powered by Tailwind CSS, TypeScript, and Vite","directories":{},"_nodeVersion":"20.19.4","dependencies":{"clsx":"^2.1.1","tailwind-merge":"^3.3.1","class-variance-authority":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.4","eslint":"^9.30.1","vitest":"^3.2.4","globals":"^16.3.0","storybook":"^9.0.18","@eslint/js":"^9.30.1","playwright":"^1.54.1","typescript":"~5.8.3","@types/node":"^24.1.0","tailwindcss":"^4.1.11","@types/react":"^19.1.8","@biomejs/biome":"2.1.2","@vitest/browser":"^3.2.4","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.1.6","semantic-release":"^24.2.7","@tailwindcss/vite":"^4.1.11","typescript-eslint":"^8.35.1","@vitest/coverage-v8":"^3.2.4","vite-tsconfig-paths":"^5.1.4","@vitejs/plugin-react":"^4.6.0","@semantic-release/git":"github:semantic-release/git","@storybook/addon-a11y":"^9.0.18","@storybook/addon-docs":"^9.0.18","@storybook/react-vite":"^9.0.18","@storybook/addon-vitest":"^9.0.18","eslint-plugin-storybook":"^9.0.18","vite-plugin-static-copy":"^3.1.1","@chromatic-com/storybook":"^4.0.1","eslint-plugin-react-hooks":"^5.2.0","rollup-preserve-directives":"^1.1.3","vite-plugin-lib-inject-css":"^2.2.2","@semantic-release/changelog":"github:semantic-release/changelog","@storybook/addon-onboarding":"^9.0.18","eslint-plugin-react-refresh":"^0.4.20"},"peerDependencies":{"react":"^18.2.0 || ^19.0.0","react-dom":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_0.0.1_1763613365424_0.13551177238740242","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@abel3t/ui","private":false,"version":"0.0.2","license":"MIT","description":"A customizable, accessible, and developer-friendly React UI component library powered by Tailwind CSS, TypeScript, and Vite","type":"module","main":"./dist/abel3t-ui-umd.cjs","module":"./dist/abel3t-ui.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/abel3t-ui.js","require":"./dist/abel3t-ui-umd.cjs"}},"scripts":{"prebuild":"rm -rf dist","build":"tsc -b && vite build","prepare":"npm run build","dev":"vite","preview":"vite preview","check":"tsc --noEmit && eslint . --ext .ts,.tsx","lint":"eslint .","test":"vitest","coverage":"vitest run --coverage","storybook":"storybook dev -p 6006","build-storybook":"storybook build","semantic-release":"semantic-release"},"publishConfig":{"access":"public"},"dependencies":{"class-variance-authority":"^0.7.1","clsx":"^2.1.1","tailwind-merge":"^3.3.1"},"devDependencies":{"@biomejs/biome":"2.1.2","@chromatic-com/storybook":"^4.0.1","@eslint/js":"^9.30.1","@semantic-release/changelog":"github:semantic-release/changelog","@semantic-release/git":"github:semantic-release/git","@storybook/addon-a11y":"^9.0.18","@storybook/addon-docs":"^9.0.18","@storybook/addon-onboarding":"^9.0.18","@storybook/addon-vitest":"^9.0.18","@storybook/react-vite":"^9.0.18","@tailwindcss/vite":"^4.1.11","@types/node":"^24.1.0","@types/react":"^19.1.8","@types/react-dom":"^19.1.6","@vitejs/plugin-react":"^4.6.0","@vitest/browser":"^3.2.4","@vitest/coverage-v8":"^3.2.4","eslint":"^9.30.1","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20","eslint-plugin-storybook":"^9.0.18","globals":"^16.3.0","playwright":"^1.54.1","rollup-preserve-directives":"^1.1.3","semantic-release":"^24.2.7","storybook":"^9.0.18","tailwindcss":"^4.1.11","typescript":"~5.8.3","typescript-eslint":"^8.35.1","vite":"^7.0.4","vite-plugin-dts":"^4.5.4","vite-plugin-lib-inject-css":"^2.2.2","vite-plugin-static-copy":"^3.1.1","vite-tsconfig-paths":"^5.1.4","vitest":"^3.2.4"},"peerDependencies":{"react":"^18.2.0 || ^19.0.0","react-dom":"^18.2.0 || ^19.0.0"},"keywords":["react","ui","component-library","tailwindcss","tailwind","typescript","vite","react-components","design-system","accessible-ui","customizable-ui","react-ui-kit","frontend","web-components","ui-framework","css-in-js","react-hooks","responsive-ui","modern-ui","developer-friendly"],"_id":"@abel3t/ui@0.0.2","gitHead":"399573495346fc3d70d9a78cb67273f94d80d468","_nodeVersion":"20.19.4","_npmVersion":"10.8.2","dist":{"integrity":"sha512-IesRrblVjCp335+4LfwtF+kpJxcBqq9gdIPCPIa+1TWj8zdokAqTI4fc18Ovz00Y950G5wR/iwR4HZM7Hm8LdA==","shasum":"719e34939791f037faaded3982998a3a00a414f9","tarball":"https://registry.npmjs.org/@abel3t/ui/-/ui-0.0.2.tgz","fileCount":33,"unpackedSize":186966,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICYUthW4yM8zcKMxf3XhqUUJM8MGmxFOH+6PX7CrdemVAiEA8aZ3+5xdLoi1GvynmtfUyveHI0i1VDPan/tVFMC+Z0k="}]},"_npmUser":{"name":"abel3t","email":"abeltran.develop@gmail.com"},"directories":{},"maintainers":[{"name":"abel3t","email":"abeltran.develop@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ui_0.0.2_1763613416717_0.6020262665186269"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-20T04:36:05.318Z","modified":"2025-11-20T04:36:57.084Z","0.0.1":"2025-11-20T04:36:05.661Z","0.0.2":"2025-11-20T04:36:56.908Z"},"license":"MIT","keywords":["react","ui","component-library","tailwindcss","tailwind","typescript","vite","react-components","design-system","accessible-ui","customizable-ui","react-ui-kit","frontend","web-components","ui-framework","css-in-js","react-hooks","responsive-ui","modern-ui","developer-friendly"],"description":"A customizable, accessible, and developer-friendly React UI component library powered by Tailwind CSS, TypeScript, and Vite","maintainers":[{"name":"abel3t","email":"abeltran.develop@gmail.com"}],"readme":"<p align=\"center\">\n  <img src=\"https://v2.pdf2qa.org/images/logo-primary.svg\" alt=\"Logo\" width=\"150\" />\n</p>\n\n<p align=\"center\">\n  ✨ A customizable, accessible, and developer-friendly React UI component library powered by <strong>Tailwind CSS</strong> , <strong>TypeScript</strong>, and <strong>Vite</strong>.\n</p>\n\n## ⚙️ Technologies\n\n[![React](https://img.shields.io/badge/React-20232a?style=for-the-badge&logo=react&logoColor=61DAFB)](https://react.dev)\n[![TailwindCSS](https://img.shields.io/badge/TailwindCSS-0ea5e9?style=for-the-badge&logo=tailwindcss&logoColor=white)](https://tailwindcss.com)\n[![Vite](https://img.shields.io/badge/Vite-646CFF?style=for-the-badge&logo=vite&logoColor=white)](https://vitejs.dev)\n[![TypeScript](https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge&logo=typescript&logoColor=white)](https://www.typescriptlang.org/)\n[![Node.js](https://img.shields.io/badge/Node.js-339933?style=for-the-badge&logo=node.js&logoColor=white)](https://nodejs.org/en/download)\n[![clsx](https://img.shields.io/badge/clsx-1e293b?style=for-the-badge&logo=npm&logoColor=white)](https://github.com/lukeed/clsx)\n[![tailwind-merge](https://img.shields.io/badge/tw--merge-06b6d4?style=for-the-badge&logo=tailwindcss&logoColor=white)](https://github.com/dcastil/tailwind-merge)\n[![class-variance-authority](https://img.shields.io/badge/CVA-8b5cf6?style=for-the-badge&logo=vercel&logoColor=white)](https://cva.style)\n\n## ✨ Features\n\n- 🎨 **Pre-styled Components** using raw CSS hex values (no custom theme required)\n- ⚛️ **React 19** with `forwardRef` and `class-variance-authority`\n- 🌀 **Tailwind CSS v3+ compatible**\n- ✨ **Zero-config styles** with automatic CSS—no setup needed\n- 💅 Consistent design using `cva` and `tailwind-merge`\n- 📦 Tree-shakable, typed, and optimized via Vite\n- 📚 Storybook and TypeScript support\n\n## 📦 Installation\n\nInstall the library (and make sure your app has Tailwind):\n\n```bash\npnpm add @abel3t/ui\n# or\nnpm install @abel3t/ui\n```\n\n## 🚀 Getting Started\n\n\n# ✅ Button\n\nA fully customizable, accessible React button component with built-in **loading state**, **icon support**, and **ripple effect**. Designed for flexibility using **Class Variance Authority** for variants.\n\n## Features\n\n- Supports **variants** like `intent`, `size`, and `radius`.\n- Built-in **loading state** with customizable loader.\n- Optional **start and end icons**.\n- Full-width support with `fullWidth` prop.\n- Ripple effect on click.\n- Compatible with standard HTML button attributes.\n- Works seamlessly in **client-side React** (`\"use client\"`).\n\n## Props\n\n| Prop         | Type                                     | Default     | Description                                                       |\n| ------------ | ---------------------------------------  | -------     | ----------------------------------------------------------------- |\n| `intent`     | `string` (variant)                       | —           | Sets the button style variant (primary, secondary, etc.).         |\n| `size`       | `string` (variant)                       | —           | Controls the button size.                                         |\n| `radius`     | `string` (variant)                       | —           | Controls the border radius.                                       |\n| `loading`    | `boolean`                                | `false`     | Shows loading state and disables the button.                      |\n| `loader`     | `ReactNode`                              | `<Loader />`| Custom loader component to display when `loading` is true.        |\n| `iconStart`  | `ReactNode`                              | —           | Optional icon displayed before the button text.                   |\n| `iconEnd`    | `ReactNode`                              | —           | Optional icon displayed after the button text.                    |\n| `fullWidth`  | `boolean`                                | `false`     | Makes the button span the full width of its container.            |\n| `disabled`   | `boolean`                                | `false`     | Disables the button.                                              |\n\nAll other native `button` attributes (like `onClick`, `type`, etc.) are supported.\n\n## Usage\n\n```tsx\nimport { Button } from \"@/components/ui/Button\";\nimport { Loader } from \"@/svg/Loader\";\n\n<Button intent=\"primary\" size=\"md\" onClick={() => alert(\"Clicked!\")}>\n  Click Me\n</Button>\n\n<Button loading intent=\"secondary\" loader={<Loader />}>\n  Loading...\n</Button>\n\n<Button iconStart={<Icon />} iconEnd={<Arrow />} fullWidth>\n  Button with Icons\n</Button>\n```\n\n\n\n# 🪟 Modal\n\nA fully controllable, accessible React modal component with **imperative API** using refs. Supports **custom close icons**, backdrop clicks, and keyboard escape handling. Built for client-side usage (`\"use client\"`).\n\n## Features\n\n- Imperative API via `ref` (`toggle`, `open`, `close`).\n- Optional close icon in the top-right corner.\n- Close modal on **backdrop click**.\n- Close modal on **Escape key** press.\n- Fully customizable via `className` prop.\n- Works with any ReactNode as children.\n\n## Props\n\n| Prop             | Type                      | Default      | Description                                    |\n| ---------------- | ------------------------- | -------      | ---------------------------------------------- |   \n| `children`       | `ReactNode`               | —            | The content to render inside the modal.        |\n| `className`      | `string`                  | —            | Additional classes for the modal container.    | \n| `showCloseIcon`  | `boolean`                 | `true`       | Show the close button in the top-right corner. |\n| `closeIcon`      | `ReactNode`               | `<Cancel />` | Optional custom icon for the close button.     |\n| `modalRef`       | `RefObject<ModalHandle>`  | —            | Ref to control the modal imperatively.         |\n| `onBackdropClick`| `() => void`              | —            | Callback when the backdrop is clicked.         |\n\n## ModalHandle\n\nThe `modalRef` exposes the following methods:\n\n```tsx\ntype ModalHandle = {\n  toggle: () => void;\n  open: () => void;\n  close: () => void;\n};\n```\n---\n\n# 🧾 Accordion Component\n\nThe `Accordion` component is a flexible and generic expandable/collapsible UI element that accepts any data type and renders titles and content based on user-provided render functions.\n\n### 🎯 Features\n\n- Fully generic TypeScript support for any data structure\n- Controlled open/close state with smooth animations\n- Accessible with proper ARIA attributes and keyboard interaction\n- Customizable styling via `className` prop\n\n### 📦 Usage\n\n```tsx\nimport { Accordion } from \"@abel3t/ui\";\n\nconst accordionData = [\n  {\n    title: \"What is your return policy?\",\n    content:\n      \"You can return any item within 30 days of purchase as long as it’s in its original condition.\",\n  },\n  // more items...\n];\n\nexport default function Example() {\n  return (\n    <Accordion\n      data={accordionData}\n      renderTitle={(item) => item.title}\n      renderContent={(item) => item.content}\n      className=\"my-accordion\"\n    />\n  );\n}\n```\n\n## Carousel\n\nA flexible and responsive React carousel component with **customizable navigation buttons** and smooth transition effects. Supports any ReactNode slides and automatic slide cloning for seamless infinite loops.\n\n## Props\n\n| Prop                  | Type             | Default | Description                                   |\n| --------------------- | ---------------- | ------- | --------------------------------------------- |\n| `children`            | `ReactNode[]`    | —       | An array of React nodes to display as slides. |\n| `className`           | `string`         | —       | Custom classes for the carousel wrapper.      |\n| `prevButton`          | `ReactNode`      | —       | Custom previous button element.               |\n| `nextButton`          | `ReactNode`      | —       | Custom next button element.                   |\n| `prevButtonClassName` | `string`         | —       | Additional classes for the previous button.   |\n| `nextButtonClassName` | `string`         | —       | Additional classes for the next button.       |\n| `transitionDuration`  | `number`         | `500`   | Slide transition duration in milliseconds.    |\n\n## Features\n\n- Smooth sliding transitions with configurable duration.\n- Supports custom **prev/next buttons** and styles.\n- Handles infinite loop seamlessly using slide cloning.\n- Fully responsive and works with any ReactNode children.\n\n## Usage\n\n```tsx\nimport { Carousel } from \"@/components/ui/Carousel\";\n\nconst testimonialList = [\n  { name: \"John Doe\", position: \"CEO\", from: \"Company A\", content: \"Great product!\" },\n  { name: \"Jane Smith\", position: \"CTO\", from: \"Company B\", content: \"Highly recommend!\" },\n  // Add more testimonials...\n];\n\nexport default function Example() {\n  return (\n    <Carousel>\n      {testimonialList.map((item) => (\n        <div\n          key={`${item.name}-${item.position}-${item.from}`}\n          className=\"py-14 px-9 md:py-20 md:px-12 text-secondary\"\n        >\n          <p className=\"mb-6 opacity-80\">{item.content}</p>\n          <h5 className=\"text-[19px] font-medium\">\n            -{item.name}, {item.position}, {item.from}\n          </h5>\n        </div>\n      ))}\n    </Carousel>\n  );\n}\n```\n\n\n# Accordion\n\nA fully customizable, generic React Accordion component. Supports custom headings, content, and toggle icons for each item. Keyboard navigation is built-in.\n\n## Props\n\n| Prop                       | Type                                                      | Default | Description                                                                         |\n| -------------------------- | --------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------- |\n| `items`                     | `AccordionItem<T>[]`                                     | —       | Array of accordion items. Each item can have an optional `id`.                      |\n| `renderHeading`             | `(item: AccordionItem<T>, isOpen: boolean) => ReactNode` | —       | Function to render the heading of each panel. Receives the item and its open state. |\n| `renderContent`             | `(item: AccordionItem<T>, isOpen: boolean) => ReactNode` | —       | Function to render the content of each panel. Receives the item and its open state. |\n| `renderToggleIcon`          | `(isOpen: boolean) => ReactNode`                         | —       | Optional function to render a custom toggle icon based on open state.               |\n| `panelClassName`            | `string`                                                 | —       | Additional classes for each accordion panel.                                        |\n| `panelHeadingClassName`     | `string`                                                 | —       | Additional classes for the heading section of each panel.                           |\n| `panelContentClassName`     | `string`                                                 | —       | Additional classes for the content section of each panel.                           |\n| `panelButtonClassName`      | `string`                                                 | —       | Additional classes for the toggle button in each panel.                             |\n| `idKey`                     | `keyof T \\| string`                                      | `\"id\"`  | Key in the item object to use as a unique identifier.                               |\n\n## Usage Example\n\n```tsx\nimport { Accordion, type AccordionItem } from \"@/components/ui/Accordion\";\n\ntype FAQ = {\n  question: string;\n  answer: string;\n};\n\nconst faqItems: AccordionItem<FAQ>[] = [\n  { id: \"1\", question: \"What is your return policy?\", answer: \"You can return within 30 days.\" },\n  { id: \"2\", question: \"Do you offer support?\", answer: \"Yes, 24/7 customer support.\" },\n];\n\nexport default function FAQAccordion() {\n  return (\n    <Accordion\n      items={faqItems}\n      renderHeading={(item, isOpen) => (\n        <h3 className=\"font-semibold\">{item.question} {isOpen ? \"-\" : \"+\"}</h3>\n      )}\n      renderContent={(item) => <p>{item.answer}</p>}\n      panelClassName=\"border-b border-gray-200\"\n      panelHeadingClassName=\"p-4 cursor-pointer\"\n      panelContentClassName=\"p-4 text-gray-600\"\n    />\n  );\n}\n```\n\n## 🎨 Theming\n\nYou can customize the look and feel of the components using the className props. Override colors, spacing, or other utilities.\n\n\n```css\n@theme {\n  --color-tiiqu-primary: #18e1c9;\n  --color-tiiqu-secondary: #034459;\n\n  --color-tiiqu-primary-light: #18e1c966;\n  --color-tiiqu-secondary-light: #03445966;\n\n  --color-tiiqu-gray: #e6ecee;\n\n  --color-tiiqu-white: #ffffff;\n}\n\n```\n\n\n\n## 🚧 Coming Soon\n\nWe're actively working on expanding the TiiQu UI library with the following components:\n\n- 📊 **Table** — Fully customizable data tables with sorting, pagination, and responsive design.\n- 📚 **SideNav** — Sidebar navigation for complex layouts and dashboards.\n\n```\n⚠️ This package requires Tailwind CSS v3.0.0 or later to be installed in your project.\n\n```\n\n[![npm version](https://img.shields.io/npm/v/@abel3t/ui)](https://www.npmjs.com/package/@abel3t/ui)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n","readmeFilename":"README.md"}