@neoptocom/neopto-ui 1.6.7 → 1.6.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CONSUMER_SETUP.md CHANGED
@@ -4,6 +4,13 @@
4
4
 
5
5
  This component library uses **Tailwind CSS v4 utility classes** directly in the components. Your project **MUST** have Tailwind CSS v4 configured to use this library.
6
6
 
7
+ ---
8
+
9
+ ## 📚 Full Documentation
10
+
11
+ Visit the [documentation site](https://neoptocom.github.io/neopto-ui/docs) for interactive examples and API documentation.
12
+
13
+
7
14
  ---
8
15
 
9
16
  ## 📦 Installation
@@ -129,8 +136,4 @@ document.documentElement.classList.toggle("dark");
129
136
 
130
137
  **Solution:** Ensure the `@source` directive points to the library's **source files** (`/src`), not the compiled dist folder. The source files contain all the Tailwind utility classes that need to be scanned.
131
138
 
132
- ---
133
-
134
- ## 📚 Full Documentation
135
-
136
- Visit the [Storybook documentation](https://neoptocom.github.io/neopto-ui) for interactive examples and API documentation.
139
+ ---
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # NeoPTO UI
2
2
 
3
- A modern React component library built with Tailwind CSS v4 and TypeScript. Features dark mode, design tokens, and comprehensive Storybook documentation.
3
+ A modern React component library built with Tailwind CSS v4 and TypeScript. Features dark mode, design tokens, and comprehensive documentation.
4
4
 
5
5
  > ⚠️ **Requirements:** This library requires **Tailwind CSS v4** and **@tailwindcss/postcss** in your project. See installation steps below.
6
6
 
@@ -11,7 +11,7 @@ A modern React component library built with Tailwind CSS v4 and TypeScript. Feat
11
11
  - **Type Safe**: Full TypeScript support with exported types
12
12
  - **Accessible**: Built with accessibility in mind
13
13
  - **Tree Shakable**: Optimized bundle size with tree shaking
14
- - **Storybook**: Comprehensive documentation and testing environment
14
+ - **Documentation**: Comprehensive documentation site with interactive examples
15
15
 
16
16
  ## 📦 Installation
17
17
 
@@ -195,12 +195,14 @@ The library uses a comprehensive design token system:
195
195
 
196
196
  ## 📚 Documentation
197
197
 
198
- Visit our [Storybook documentation](https://neoptocom.github.io/neopto-ui/storybook-static) for:
198
+ Visit our [documentation site](https://neoptocom.github.io/neopto-ui/docs) for:
199
199
 
200
200
  - Interactive component playground
201
201
  - Design system guidelines
202
202
  - Usage examples
203
203
  - Accessibility information
204
+ - Getting started guide
205
+ - Design tokens reference
204
206
 
205
207
  ## 🤝 Contributing
206
208
 
package/dist/index.cjs CHANGED
@@ -3,6 +3,7 @@
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var React11 = require('react');
5
5
  var reactDom = require('react-dom');
6
+ var lucideReact = require('lucide-react');
6
7
 
7
8
  function _interopNamespace(e) {
8
9
  if (e && e.__esModule) return e;
@@ -651,10 +652,10 @@ function AvatarGroup({
651
652
  }
652
653
  var roundMap = {
653
654
  none: "rounded-none",
654
- sm: "rounded-[var(--radius-sm)]",
655
- md: "rounded-[var(--radius-md)]",
656
- lg: "rounded-[var(--radius-lg)]",
657
- xl: "rounded-[var(--radius-xl)]",
655
+ sm: "rounded",
656
+ md: "rounded-md",
657
+ lg: "rounded-lg",
658
+ xl: "rounded-xl",
658
659
  full: "rounded-full"
659
660
  };
660
661
  function Skeleton({ className = "", rounded = "md", ...props }) {
@@ -1150,7 +1151,8 @@ function getButtonClasses(variant = "primary", size = "md", fullWidth, className
1150
1151
  const variants = {
1151
1152
  primary: "bg-cyan-500 text-white hover:bg-cyan-400 active:bg-cyan-600 disabled:bg-neutral-400",
1152
1153
  secondary: "border border-cyan-500 text-cyan-500 bg-transparent hover:bg-cyan-50 active:bg-cyan-100 disabled:border-neutral-400 disabled:text-neutral-400",
1153
- ghost: "bg-transparent text-[var(--fg)] hover:bg-[var(--muted)] active:bg-[var(--muted)] disabled:opacity-50"
1154
+ ghost: "bg-transparent text-[var(--fg)] hover:bg-[var(--muted)] active:bg-[var(--muted)] disabled:opacity-50",
1155
+ inline: "text-cyan-500 bg-transparent active:bg-cyan-100 disabled:text-neutral-400"
1154
1156
  };
1155
1157
  const sizes = {
1156
1158
  sm: "h-9 px-3",
@@ -1160,7 +1162,7 @@ function getButtonClasses(variant = "primary", size = "md", fullWidth, className
1160
1162
  return [
1161
1163
  base,
1162
1164
  variants[variant],
1163
- sizes[size],
1165
+ variant === "inline" ? "px-2" : sizes[size],
1164
1166
  fullWidth ? "w-full" : "",
1165
1167
  className
1166
1168
  ].filter(Boolean).join(" ");
@@ -1265,7 +1267,7 @@ function Chip({
1265
1267
  title,
1266
1268
  ...props,
1267
1269
  children: [
1268
- icon ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: icon, size: "sm", className: "mr-0.5 flex-shrink-0" }) : null,
1270
+ icon ? icon : null,
1269
1271
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: label }),
1270
1272
  onDelete ? /* @__PURE__ */ jsxRuntime.jsx(
1271
1273
  "button",
@@ -1274,7 +1276,7 @@ function Chip({
1274
1276
  onClick: onDelete,
1275
1277
  className: "ml-1 flex h-4 w-4 items-center justify-center rounded-full transition-colors hover:bg-black/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-black/30 flex-shrink-0",
1276
1278
  "aria-label": "Remove",
1277
- children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "close", size: "sm" })
1279
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { size: 12, className: "flex-shrink-0" })
1278
1280
  }
1279
1281
  ) : null
1280
1282
  ]
@@ -1558,7 +1560,6 @@ var Breadcrumb = ({
1558
1560
  }
1559
1561
  return /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Breadcrumb", className, children: /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "flex items-center flex-wrap", children: items.map((item, index) => {
1560
1562
  const isLast = index === items.length - 1;
1561
- const isFirst = index === 0;
1562
1563
  return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-center", children: [
1563
1564
  item.href && !isLast ? /* @__PURE__ */ jsxRuntime.jsxs(
1564
1565
  "a",
@@ -1572,8 +1573,7 @@ var Breadcrumb = ({
1572
1573
  },
1573
1574
  className: "group flex items-center gap-1 cursor-pointer text-[var(--muted-fg)]",
1574
1575
  children: [
1575
- isFirst && showHomeIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "home", size: "sm" }),
1576
- item.icon && !showHomeIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: item.icon, size: "sm" }),
1576
+ item.icon && item.icon,
1577
1577
  /* @__PURE__ */ jsxRuntime.jsx(Typo, { variant: "label-md", bold: "semibold", className: "group-hover:underline", children: item.label })
1578
1578
  ]
1579
1579
  }
@@ -1592,8 +1592,7 @@ var Breadcrumb = ({
1592
1592
  } : void 0,
1593
1593
  "aria-current": isLast ? "page" : void 0,
1594
1594
  children: [
1595
- isFirst && showHomeIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "home", size: "sm" }),
1596
- item.icon && !showHomeIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: item.icon, size: "sm" }),
1595
+ item.icon && item.icon,
1597
1596
  /* @__PURE__ */ jsxRuntime.jsx(Typo, { variant: "label-md", bold: isLast ? "bold" : "semibold", className: item.onClick && !isLast ? "group-hover:underline" : "", children: item.label })
1598
1597
  ]
1599
1598
  }
package/dist/index.d.cts CHANGED
@@ -228,7 +228,7 @@ declare function Search({ className, options, onSearch, selectedOption, onSelect
228
228
 
229
229
  type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {
230
230
  /** Button visual variant */
231
- variant?: "primary" | "secondary" | "ghost";
231
+ variant?: "primary" | "secondary" | "ghost" | "inline";
232
232
  /** Button size */
233
233
  size?: "sm" | "md" | "lg";
234
234
  /** Make button full width */
@@ -238,7 +238,7 @@ type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {
238
238
  };
239
239
  declare const Button: React.ForwardRefExoticComponent<React.ButtonHTMLAttributes<HTMLButtonElement> & {
240
240
  /** Button visual variant */
241
- variant?: "primary" | "secondary" | "ghost";
241
+ variant?: "primary" | "secondary" | "ghost" | "inline";
242
242
  /** Button size */
243
243
  size?: "sm" | "md" | "lg";
244
244
  /** Make button full width */
@@ -290,7 +290,7 @@ declare function Icon({ name, className, title, size, fill }: IconProps): react_
290
290
 
291
291
  type ChipProps = React.HTMLAttributes<HTMLDivElement> & {
292
292
  variant?: "warning" | "success" | "error" | "light" | "dark";
293
- icon?: string;
293
+ icon?: React.ReactNode;
294
294
  label?: string;
295
295
  /** Custom text color (overrides variant) */
296
296
  textColor?: string;
@@ -366,7 +366,7 @@ interface BreadcrumbItem {
366
366
  /** Optional href for navigation */
367
367
  href?: string;
368
368
  /** Optional icon name (Material Symbols) */
369
- icon?: string;
369
+ icon?: React__default.ReactNode;
370
370
  /** Optional click handler */
371
371
  onClick?: () => void;
372
372
  }
package/dist/index.d.ts CHANGED
@@ -228,7 +228,7 @@ declare function Search({ className, options, onSearch, selectedOption, onSelect
228
228
 
229
229
  type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {
230
230
  /** Button visual variant */
231
- variant?: "primary" | "secondary" | "ghost";
231
+ variant?: "primary" | "secondary" | "ghost" | "inline";
232
232
  /** Button size */
233
233
  size?: "sm" | "md" | "lg";
234
234
  /** Make button full width */
@@ -238,7 +238,7 @@ type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {
238
238
  };
239
239
  declare const Button: React.ForwardRefExoticComponent<React.ButtonHTMLAttributes<HTMLButtonElement> & {
240
240
  /** Button visual variant */
241
- variant?: "primary" | "secondary" | "ghost";
241
+ variant?: "primary" | "secondary" | "ghost" | "inline";
242
242
  /** Button size */
243
243
  size?: "sm" | "md" | "lg";
244
244
  /** Make button full width */
@@ -290,7 +290,7 @@ declare function Icon({ name, className, title, size, fill }: IconProps): react_
290
290
 
291
291
  type ChipProps = React.HTMLAttributes<HTMLDivElement> & {
292
292
  variant?: "warning" | "success" | "error" | "light" | "dark";
293
- icon?: string;
293
+ icon?: React.ReactNode;
294
294
  label?: string;
295
295
  /** Custom text color (overrides variant) */
296
296
  textColor?: string;
@@ -366,7 +366,7 @@ interface BreadcrumbItem {
366
366
  /** Optional href for navigation */
367
367
  href?: string;
368
368
  /** Optional icon name (Material Symbols) */
369
- icon?: string;
369
+ icon?: React__default.ReactNode;
370
370
  /** Optional click handler */
371
371
  onClick?: () => void;
372
372
  }
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import * as React11 from 'react';
3
3
  import { useState, useEffect, useMemo, useId, useRef, useCallback } from 'react';
4
4
  import { createPortal } from 'react-dom';
5
+ import { X } from 'lucide-react';
5
6
 
6
7
  var __defProp = Object.defineProperty;
7
8
  var __export = (target, all) => {
@@ -630,10 +631,10 @@ function AvatarGroup({
630
631
  }
631
632
  var roundMap = {
632
633
  none: "rounded-none",
633
- sm: "rounded-[var(--radius-sm)]",
634
- md: "rounded-[var(--radius-md)]",
635
- lg: "rounded-[var(--radius-lg)]",
636
- xl: "rounded-[var(--radius-xl)]",
634
+ sm: "rounded",
635
+ md: "rounded-md",
636
+ lg: "rounded-lg",
637
+ xl: "rounded-xl",
637
638
  full: "rounded-full"
638
639
  };
639
640
  function Skeleton({ className = "", rounded = "md", ...props }) {
@@ -1129,7 +1130,8 @@ function getButtonClasses(variant = "primary", size = "md", fullWidth, className
1129
1130
  const variants = {
1130
1131
  primary: "bg-cyan-500 text-white hover:bg-cyan-400 active:bg-cyan-600 disabled:bg-neutral-400",
1131
1132
  secondary: "border border-cyan-500 text-cyan-500 bg-transparent hover:bg-cyan-50 active:bg-cyan-100 disabled:border-neutral-400 disabled:text-neutral-400",
1132
- ghost: "bg-transparent text-[var(--fg)] hover:bg-[var(--muted)] active:bg-[var(--muted)] disabled:opacity-50"
1133
+ ghost: "bg-transparent text-[var(--fg)] hover:bg-[var(--muted)] active:bg-[var(--muted)] disabled:opacity-50",
1134
+ inline: "text-cyan-500 bg-transparent active:bg-cyan-100 disabled:text-neutral-400"
1133
1135
  };
1134
1136
  const sizes = {
1135
1137
  sm: "h-9 px-3",
@@ -1139,7 +1141,7 @@ function getButtonClasses(variant = "primary", size = "md", fullWidth, className
1139
1141
  return [
1140
1142
  base,
1141
1143
  variants[variant],
1142
- sizes[size],
1144
+ variant === "inline" ? "px-2" : sizes[size],
1143
1145
  fullWidth ? "w-full" : "",
1144
1146
  className
1145
1147
  ].filter(Boolean).join(" ");
@@ -1244,7 +1246,7 @@ function Chip({
1244
1246
  title,
1245
1247
  ...props,
1246
1248
  children: [
1247
- icon ? /* @__PURE__ */ jsx(Icon, { name: icon, size: "sm", className: "mr-0.5 flex-shrink-0" }) : null,
1249
+ icon ? icon : null,
1248
1250
  /* @__PURE__ */ jsx("span", { className: "truncate", children: label }),
1249
1251
  onDelete ? /* @__PURE__ */ jsx(
1250
1252
  "button",
@@ -1253,7 +1255,7 @@ function Chip({
1253
1255
  onClick: onDelete,
1254
1256
  className: "ml-1 flex h-4 w-4 items-center justify-center rounded-full transition-colors hover:bg-black/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-black/30 flex-shrink-0",
1255
1257
  "aria-label": "Remove",
1256
- children: /* @__PURE__ */ jsx(Icon, { name: "close", size: "sm" })
1258
+ children: /* @__PURE__ */ jsx(X, { size: 12, className: "flex-shrink-0" })
1257
1259
  }
1258
1260
  ) : null
1259
1261
  ]
@@ -1537,7 +1539,6 @@ var Breadcrumb = ({
1537
1539
  }
1538
1540
  return /* @__PURE__ */ jsx("nav", { "aria-label": "Breadcrumb", className, children: /* @__PURE__ */ jsx("ol", { className: "flex items-center flex-wrap", children: items.map((item, index) => {
1539
1541
  const isLast = index === items.length - 1;
1540
- const isFirst = index === 0;
1541
1542
  return /* @__PURE__ */ jsxs("li", { className: "flex items-center", children: [
1542
1543
  item.href && !isLast ? /* @__PURE__ */ jsxs(
1543
1544
  "a",
@@ -1551,8 +1552,7 @@ var Breadcrumb = ({
1551
1552
  },
1552
1553
  className: "group flex items-center gap-1 cursor-pointer text-[var(--muted-fg)]",
1553
1554
  children: [
1554
- isFirst && showHomeIcon && /* @__PURE__ */ jsx(Icon, { name: "home", size: "sm" }),
1555
- item.icon && !showHomeIcon && /* @__PURE__ */ jsx(Icon, { name: item.icon, size: "sm" }),
1555
+ item.icon && item.icon,
1556
1556
  /* @__PURE__ */ jsx(Typo, { variant: "label-md", bold: "semibold", className: "group-hover:underline", children: item.label })
1557
1557
  ]
1558
1558
  }
@@ -1571,8 +1571,7 @@ var Breadcrumb = ({
1571
1571
  } : void 0,
1572
1572
  "aria-current": isLast ? "page" : void 0,
1573
1573
  children: [
1574
- isFirst && showHomeIcon && /* @__PURE__ */ jsx(Icon, { name: "home", size: "sm" }),
1575
- item.icon && !showHomeIcon && /* @__PURE__ */ jsx(Icon, { name: item.icon, size: "sm" }),
1574
+ item.icon && item.icon,
1576
1575
  /* @__PURE__ */ jsx(Typo, { variant: "label-md", bold: isLast ? "bold" : "semibold", className: item.onClick && !isLast ? "group-hover:underline" : "", children: item.label })
1577
1576
  ]
1578
1577
  }
package/dist/styles.css CHANGED
@@ -21,10 +21,6 @@
21
21
  --font-body: 'Roboto', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif;
22
22
  --font-sans: var(--font-body, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', sans-serif);
23
23
  --color-brand: #22A9CB;
24
- --radius-sm: 0.25rem;
25
- --radius-md: 0.375rem;
26
- --radius-lg: 0.5rem;
27
- --radius-xl: 0.75rem;
28
24
  --bg: #F3F4F6;
29
25
  --surface: #FFFFFF;
30
26
  --fg: #242832;
@@ -42,10 +38,6 @@
42
38
  --font-body: 'Roboto', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif;
43
39
  --font-sans: var(--font-body, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', sans-serif);
44
40
  --color-brand: #22A9CB;
45
- --radius-sm: 0.25rem;
46
- --radius-md: 0.375rem;
47
- --radius-lg: 0.5rem;
48
- --radius-xl: 0.75rem;
49
41
  --bg: #F3F4F6;
50
42
  --surface: #FFFFFF;
51
43
  --fg: #242832;
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@neoptocom/neopto-ui",
3
- "version": "1.6.7",
3
+ "version": "1.6.9",
4
4
  "private": false,
5
- "description": "A modern React component library built with Tailwind CSS v4 and TypeScript. Features dark mode, design tokens, and comprehensive Storybook documentation. Requires Tailwind v4+.",
5
+ "description": "A modern React component library built with Tailwind CSS v4 and TypeScript. Features dark mode, design tokens, and comprehensive documentation. Requires Tailwind v4+.",
6
6
  "keywords": [
7
7
  "react",
8
8
  "components",
@@ -18,7 +18,7 @@
18
18
  "type": "git",
19
19
  "url": "https://github.com/neoptocom/neopto-ui.git"
20
20
  },
21
- "homepage": "https://github.com/neoptocom/neopto-ui#readme",
21
+ "homepage": "https://neoptocom.github.io/neopto-ui/docs",
22
22
  "bugs": {
23
23
  "url": "https://github.com/neoptocom/neopto-ui/issues"
24
24
  },
@@ -50,6 +50,8 @@
50
50
  "storybook": "storybook dev -p 6006",
51
51
  "build-storybook": "storybook build",
52
52
  "storybook:docs": "storybook build --docs --output-dir storybook-static && cp storybook-static/index.json storybook-static/docs.json",
53
+ "docs": "vite --config docs/vite.config.ts",
54
+ "build:docs": "vite build --config docs/vite.config.ts",
53
55
  "prepublishOnly": "npm run build && npm run typecheck",
54
56
  "changeset": "changeset",
55
57
  "version-packages": "changeset version",
@@ -70,6 +72,7 @@
70
72
  "@storybook/test": "^8.1.0",
71
73
  "@tailwindcss/postcss": "^4.1.13",
72
74
  "@tailwindcss/vite": "^4.1.13",
75
+ "@types/node": "^24.10.1",
73
76
  "@types/react": "^18.2.0",
74
77
  "@types/react-dom": "^18.2.0",
75
78
  "@vitejs/plugin-react": "^5.0.3",
@@ -84,5 +87,9 @@
84
87
  },
85
88
  "publishConfig": {
86
89
  "access": "public"
90
+ },
91
+ "dependencies": {
92
+ "lucide-react": "^0.555.0",
93
+ "react-router-dom": "^7.9.6"
87
94
  }
88
95
  }