@mdigital_ui/ui 0.1.0 → 0.1.2

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/README.md CHANGED
@@ -21,12 +21,42 @@ npm install @mdigital/ui
21
21
 
22
22
  ### Peer Dependencies
23
23
 
24
- Make sure you have these installed:
24
+ Required dependencies:
25
25
 
26
26
  ```bash
27
27
  npm install react react-dom tailwindcss
28
28
  ```
29
29
 
30
+ Optional dependencies (install only what you need based on components you use):
31
+
32
+ ```bash
33
+ # For advanced components (Modal, Tooltip, Dropdown, Popover)
34
+ npm install @radix-ui/react-dialog @radix-ui/react-popover @radix-ui/react-tooltip
35
+
36
+ # For icons
37
+ npm install lucide-react
38
+
39
+ # For DatePicker
40
+ npm install react-datepicker dayjs
41
+
42
+ # For Table
43
+ npm install @tanstack/react-table @tanstack/react-virtual
44
+
45
+ # For Carousel
46
+ npm install swiper
47
+
48
+ # For Command
49
+ npm install cmdk
50
+
51
+ # For Charts
52
+ npm install recharts
53
+
54
+ # For Drawer
55
+ npm install vaul
56
+ ```
57
+
58
+ See [TREE_SHAKING_GUIDE.md](./TREE_SHAKING_GUIDE.md) for detailed information on optimizing your bundle.
59
+
30
60
  ## Quick Start
31
61
 
32
62
  ### 1. Configure Tailwind
@@ -74,25 +104,39 @@ function App() {
74
104
 
75
105
  ## Import Patterns
76
106
 
77
- ### Named Imports (Recommended)
107
+ ### Subpath Imports (Recommended for Tree-Shaking)
108
+
109
+ For optimal bundle size and to avoid installing unnecessary dependencies:
78
110
 
79
111
  ```tsx
80
- import { Button, Input, Select } from '@mdigital/ui'
112
+ import Button from '@mdigital/ui/button'
113
+ import Input from '@mdigital/ui/input'
114
+ import Select from '@mdigital/ui/select'
81
115
  ```
82
116
 
83
- ### Direct Imports (Better Tree-Shaking)
117
+ **Benefits:**
118
+ - Only bundles the components you use
119
+ - Avoids peer dependency warnings for unused components
120
+ - Fastest build times
121
+
122
+ ### Named Imports (Requires All Peer Dependencies)
123
+
124
+ If you've installed all optional peer dependencies, you can use named imports:
84
125
 
85
126
  ```tsx
86
- import Button from '@mdigital/ui/button'
87
- import Input from '@mdigital/ui/input'
127
+ import { Button, Input, Select, Table, DatePicker } from '@mdigital/ui'
88
128
  ```
89
129
 
130
+ **Note:** This requires installing all optional peer dependencies, even for components you don't use. Your bundler may fail if dependencies for unused components aren't installed.
131
+
90
132
  ### Type Imports
91
133
 
92
134
  ```tsx
93
135
  import type { ButtonProps, InputProps } from '@mdigital/ui'
94
136
  ```
95
137
 
138
+ **See [TREE_SHAKING_GUIDE.md](./TREE_SHAKING_GUIDE.md) for detailed import strategies.**
139
+
96
140
  ## Theming
97
141
 
98
142
  ### CSS Variable Overrides
@@ -0,0 +1,7 @@
1
+ export { BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, breadcrumbs_default as default } from '../chunk-HUVXKOJC.js';
2
+ import '../chunk-KNQ7UQ2W.js';
3
+ import '../chunk-3PFA3YG6.js';
4
+ import '../chunk-5UEWVFF6.js';
5
+ import '../chunk-YNNAOXU5.js';
6
+ //# sourceMappingURL=index.js.map
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,4 @@
1
+ export { button_group_default as default } from '../chunk-56IXGP5C.js';
2
+ import '../chunk-YNNAOXU5.js';
3
+ //# sourceMappingURL=index.js.map
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,56 @@
1
+ import { cn } from './chunk-YNNAOXU5.js';
2
+ import { cva } from 'class-variance-authority';
3
+ import React from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var buttonGroupVariants = cva("inline-flex", {
7
+ variants: {
8
+ vertical: {
9
+ true: "flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:last-child)]:border-b-0 [&>*:not(:last-child)]:rounded-b-none",
10
+ false: "flex-row [&>*:not(:first-child)]:rounded-l-none [&>*:not(:last-child)]:border-r-0 [&>*:not(:last-child)]:rounded-r-none"
11
+ },
12
+ spacing: {
13
+ true: "gap-2",
14
+ false: "gap-0"
15
+ },
16
+ fullWidth: {
17
+ true: "w-full [&>*]:flex-1",
18
+ false: ""
19
+ }
20
+ },
21
+ defaultVariants: {
22
+ vertical: false,
23
+ fullWidth: false
24
+ }
25
+ });
26
+ var ButtonGroup = React.memo(
27
+ ({
28
+ vertical = false,
29
+ spacing = false,
30
+ fullWidth = false,
31
+ className,
32
+ children,
33
+ ref,
34
+ ...props
35
+ }) => {
36
+ return /* @__PURE__ */ jsx(
37
+ "div",
38
+ {
39
+ ref,
40
+ role: "group",
41
+ className: cn(
42
+ buttonGroupVariants({ vertical, spacing, fullWidth }),
43
+ className
44
+ ),
45
+ ...props,
46
+ children
47
+ }
48
+ );
49
+ }
50
+ );
51
+ ButtonGroup.displayName = "ButtonGroup";
52
+ var button_group_default = ButtonGroup;
53
+
54
+ export { button_group_default };
55
+ //# sourceMappingURL=chunk-56IXGP5C.js.map
56
+ //# sourceMappingURL=chunk-56IXGP5C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/button-group/index.tsx"],"names":[],"mappings":";;;;;AAMA,IAAM,mBAAA,GAAsB,IAAI,aAAA,EAAe;AAAA,EAC7C,QAAA,EAAU;AAAA,IACR,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,yHAAA;AAAA,MACN,KAAA,EACE;AAAA,KACJ;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,qBAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,QAAA,EAAU,KAAA;AAAA,IACV,SAAA,EAAW;AAAA;AAEf,CAAC,CAAA;AAED,IAAM,cAAc,KAAA,CAAM,IAAA;AAAA,EACxB,CAAC;AAAA,IACC,QAAA,GAAW,KAAA;AAAA,IACX,OAAA,GAAU,KAAA;AAAA,IACV,SAAA,GAAY,KAAA;AAAA,IACZ,SAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAG;AAAA,GACL,KAAM;AACJ,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,OAAA;AAAA,QACL,SAAA,EAAW,EAAA;AAAA,UACT,mBAAA,CAAoB,EAAE,QAAA,EAAU,OAAA,EAAS,WAAW,CAAA;AAAA,UACpD;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF,CAAA;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;AAG1B,IAAO,oBAAA,GAAQ","file":"chunk-56IXGP5C.js","sourcesContent":["import { cva } from 'class-variance-authority'\nimport React from 'react'\n\nimport { cn } from '../utils'\nimport type { ButtonGroupProps } from './types'\n\nconst buttonGroupVariants = cva('inline-flex', {\n variants: {\n vertical: {\n true: 'flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:last-child)]:border-b-0 [&>*:not(:last-child)]:rounded-b-none',\n false:\n 'flex-row [&>*:not(:first-child)]:rounded-l-none [&>*:not(:last-child)]:border-r-0 [&>*:not(:last-child)]:rounded-r-none',\n },\n spacing: {\n true: 'gap-2',\n false: 'gap-0',\n },\n fullWidth: {\n true: 'w-full [&>*]:flex-1',\n false: '',\n },\n },\n defaultVariants: {\n vertical: false,\n fullWidth: false,\n },\n})\n\nconst ButtonGroup = React.memo<ButtonGroupProps>(\n ({\n vertical = false,\n spacing = false,\n fullWidth = false,\n className,\n children,\n ref,\n ...props\n }) => {\n return (\n <div\n ref={ref}\n role=\"group\"\n className={cn(\n buttonGroupVariants({ vertical, spacing, fullWidth }),\n className,\n )}\n {...props}\n >\n {children}\n </div>\n )\n },\n)\n\nButtonGroup.displayName = 'ButtonGroup'\n\nexport type * from './types'\nexport default ButtonGroup\n"]}
@@ -0,0 +1,38 @@
1
+ import { cn } from './chunk-YNNAOXU5.js';
2
+ import { cva } from 'class-variance-authority';
3
+ import React from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var gridVariants = cva("w-full grid", {
7
+ variants: {
8
+ gap: {
9
+ xs: "gap-2",
10
+ sm: "gap-4",
11
+ md: "gap-6",
12
+ lg: "gap-8"
13
+ },
14
+ columns: {
15
+ 1: "grid-cols-1",
16
+ 2: "grid-cols-1 md:grid-cols-2",
17
+ 3: "grid-cols-1 md:grid-cols-2 lg:grid-cols-3",
18
+ 4: "grid-cols-1 md:grid-cols-2 lg:grid-cols-4",
19
+ 5: "grid-cols-1 md:grid-cols-3 lg:grid-cols-5",
20
+ 6: "grid-cols-1 md:grid-cols-3 lg:grid-cols-6"
21
+ }
22
+ },
23
+ defaultVariants: {
24
+ gap: "md",
25
+ columns: 3
26
+ }
27
+ });
28
+ var Grid = React.memo(
29
+ ({ children, columns = 3, gap = "md", className }) => {
30
+ return /* @__PURE__ */ jsx("div", { className: cn(gridVariants({ gap, columns }), className), children });
31
+ }
32
+ );
33
+ Grid.displayName = "Grid";
34
+ var grid_default = Grid;
35
+
36
+ export { grid_default };
37
+ //# sourceMappingURL=chunk-7PKVBUGL.js.map
38
+ //# sourceMappingURL=chunk-7PKVBUGL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/grid/index.tsx"],"names":[],"mappings":";;;;;AAMA,IAAM,YAAA,GAAe,IAAI,aAAA,EAAe;AAAA,EACtC,QAAA,EAAU;AAAA,IACR,GAAA,EAAK;AAAA,MACH,EAAA,EAAI,OAAA;AAAA,MACJ,EAAA,EAAI,OAAA;AAAA,MACJ,EAAA,EAAI,OAAA;AAAA,MACJ,EAAA,EAAI;AAAA,KACN;AAAA,IACA,OAAA,EAAS;AAAA,MACP,CAAA,EAAG,aAAA;AAAA,MACH,CAAA,EAAG,4BAAA;AAAA,MACH,CAAA,EAAG,2CAAA;AAAA,MACH,CAAA,EAAG,2CAAA;AAAA,MACH,CAAA,EAAG,2CAAA;AAAA,MACH,CAAA,EAAG;AAAA;AACL,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,GAAA,EAAK,IAAA;AAAA,IACL,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAED,IAAM,OAAO,KAAA,CAAM,IAAA;AAAA,EACjB,CAAC,EAAE,QAAA,EAAU,OAAA,GAAU,GAAG,GAAA,GAAM,IAAA,EAAM,WAAU,KAAM;AACpD,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,YAAA,CAAa,EAAE,GAAA,EAAK,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EACzD,QAAA,EACH,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,IAAA,CAAK,WAAA,GAAc,MAAA;AAGnB,IAAO,YAAA,GAAQ","file":"chunk-7PKVBUGL.js","sourcesContent":["import { cva } from 'class-variance-authority'\nimport React from 'react'\n\nimport { cn } from '../utils'\nimport type { GridProps } from './types'\n\nconst gridVariants = cva('w-full grid', {\n variants: {\n gap: {\n xs: 'gap-2',\n sm: 'gap-4',\n md: 'gap-6',\n lg: 'gap-8',\n },\n columns: {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2',\n 3: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',\n 4: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-4',\n 5: 'grid-cols-1 md:grid-cols-3 lg:grid-cols-5',\n 6: 'grid-cols-1 md:grid-cols-3 lg:grid-cols-6',\n },\n },\n defaultVariants: {\n gap: 'md',\n columns: 3,\n },\n})\n\nconst Grid = React.memo<GridProps>(\n ({ children, columns = 3, gap = 'md', className }) => {\n return (\n <div className={cn(gridVariants({ gap, columns }), className)}>\n {children}\n </div>\n )\n },\n)\n\nGrid.displayName = 'Grid'\n\nexport type * from './types'\nexport default Grid\n"]}
@@ -0,0 +1,198 @@
1
+ import { dropdown_default } from './chunk-KNQ7UQ2W.js';
2
+ import { textColorVariants } from './chunk-5UEWVFF6.js';
3
+ import { cn, iconSizes } from './chunk-YNNAOXU5.js';
4
+ import { cva } from 'class-variance-authority';
5
+ import { ChevronRight, MoreHorizontal, MoreVertical } from 'lucide-react';
6
+ import React from 'react';
7
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
+
9
+ var BreadcrumbContext = React.createContext({});
10
+ var breadcrumbVariants = cva("", {
11
+ variants: {
12
+ size: {
13
+ xs: "text-xs",
14
+ sm: "text-sm",
15
+ md: "text-base",
16
+ lg: "text-lg"
17
+ }
18
+ },
19
+ defaultVariants: {
20
+ size: "md"
21
+ }
22
+ });
23
+ var Breadcrumb = React.memo(
24
+ ({
25
+ children,
26
+ items,
27
+ color = "default",
28
+ size = "md",
29
+ separator,
30
+ className
31
+ }) => {
32
+ const content = items?.length ? /* @__PURE__ */ jsx(BreadcrumbList, { children: items.map((item, index) => {
33
+ const isLast = index === items.length - 1;
34
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
35
+ /* @__PURE__ */ jsx(BreadcrumbItem, { children: item.ellipsis ? /* @__PURE__ */ jsx(
36
+ BreadcrumbEllipsis,
37
+ {
38
+ orientation: item.ellipsisOrientation || "horizontal",
39
+ items: item.ellipsisItems || [],
40
+ size
41
+ }
42
+ ) : isLast ? /* @__PURE__ */ jsx(
43
+ BreadcrumbPage,
44
+ {
45
+ leftIcon: item.leftIcon,
46
+ rightIcon: item.rightIcon,
47
+ children: item.label
48
+ }
49
+ ) : /* @__PURE__ */ jsx(
50
+ BreadcrumbLink,
51
+ {
52
+ href: item.href || "",
53
+ onClick: item.onClick,
54
+ leftIcon: item.leftIcon,
55
+ rightIcon: item.rightIcon,
56
+ children: item.label
57
+ }
58
+ ) }),
59
+ !isLast && /* @__PURE__ */ jsx(BreadcrumbSeparator, { size, children: separator })
60
+ ] }, index);
61
+ }) }) : children;
62
+ return /* @__PURE__ */ jsx(BreadcrumbContext.Provider, { value: { color, size }, children: /* @__PURE__ */ jsx(
63
+ "nav",
64
+ {
65
+ "aria-label": "breadcrumb",
66
+ className: cn(
67
+ breadcrumbVariants({ size }),
68
+ textColorVariants({ color }),
69
+ className
70
+ ),
71
+ children: content
72
+ }
73
+ ) });
74
+ }
75
+ );
76
+ Breadcrumb.displayName = "Breadcrumb";
77
+ var BreadcrumbList = React.memo(
78
+ ({ children, className }) => {
79
+ return /* @__PURE__ */ jsx("ol", { className: cn("flex items-center gap-1.5", className), children });
80
+ }
81
+ );
82
+ BreadcrumbList.displayName = "BreadcrumbList";
83
+ var BreadcrumbItem = React.memo(
84
+ ({ children, className }) => {
85
+ return /* @__PURE__ */ jsx("li", { className: cn("inline-flex items-center gap-1.5", className), children });
86
+ }
87
+ );
88
+ BreadcrumbItem.displayName = "BreadcrumbItem";
89
+ var BreadcrumbLink = React.memo(
90
+ ({ children, href, onClick, leftIcon, rightIcon, className }) => {
91
+ const handleClick = (e) => {
92
+ if (onClick) {
93
+ e.preventDefault();
94
+ onClick();
95
+ }
96
+ };
97
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
98
+ leftIcon && /* @__PURE__ */ jsx("span", { className: "inline-flex items-center", children: leftIcon }),
99
+ children,
100
+ rightIcon && /* @__PURE__ */ jsx("span", { className: "inline-flex items-center", children: rightIcon })
101
+ ] });
102
+ if (href) {
103
+ return /* @__PURE__ */ jsx(
104
+ "a",
105
+ {
106
+ href,
107
+ onClick: handleClick,
108
+ className: cn(
109
+ "inline-flex items-center gap-1.5 transition-colors hover:underline cursor-pointer",
110
+ className
111
+ ),
112
+ children: content
113
+ }
114
+ );
115
+ }
116
+ if (onClick) {
117
+ return /* @__PURE__ */ jsx(
118
+ "button",
119
+ {
120
+ onClick: handleClick,
121
+ className: cn(
122
+ "inline-flex items-center gap-1.5 transition-colors hover:underline cursor-pointer",
123
+ className
124
+ ),
125
+ children: content
126
+ }
127
+ );
128
+ }
129
+ return /* @__PURE__ */ jsx("span", { className: cn("inline-flex items-center gap-1.5", className), children: content });
130
+ }
131
+ );
132
+ BreadcrumbLink.displayName = "BreadcrumbLink";
133
+ var BreadcrumbPage = React.memo(
134
+ ({ children, leftIcon, rightIcon, className }) => {
135
+ return /* @__PURE__ */ jsxs(
136
+ "span",
137
+ {
138
+ "aria-current": "page",
139
+ className: cn(
140
+ "inline-flex items-center gap-1.5 font-medium",
141
+ className
142
+ ),
143
+ children: [
144
+ leftIcon && /* @__PURE__ */ jsx("span", { className: "inline-flex items-center", children: leftIcon }),
145
+ children,
146
+ rightIcon && /* @__PURE__ */ jsx("span", { className: "inline-flex items-center", children: rightIcon })
147
+ ]
148
+ }
149
+ );
150
+ }
151
+ );
152
+ BreadcrumbPage.displayName = "BreadcrumbPage";
153
+ var BreadcrumbSeparator = React.memo(
154
+ ({ children, className, size = "md" }) => {
155
+ return /* @__PURE__ */ jsx("span", { className: cn("text-text-muted", className), children: children ?? /* @__PURE__ */ jsx(ChevronRight, { className: iconSizes[size] }) });
156
+ }
157
+ );
158
+ BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
159
+ var BreadcrumbEllipsis = React.memo(
160
+ ({ orientation = "horizontal", items, children, className, size = "md" }) => {
161
+ const Icon = orientation === "horizontal" ? MoreHorizontal : MoreVertical;
162
+ const ellipsisButton = /* @__PURE__ */ jsxs(
163
+ "span",
164
+ {
165
+ role: "presentation",
166
+ "aria-hidden": "true",
167
+ className: cn(
168
+ "flex items-center justify-center",
169
+ items || children ? "cursor-pointer" : "",
170
+ className
171
+ ),
172
+ children: [
173
+ /* @__PURE__ */ jsx(Icon, { className: iconSizes[size] }),
174
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "More" })
175
+ ]
176
+ }
177
+ );
178
+ if (items || children) {
179
+ const dropdownItems = (items || []).map((item) => ({
180
+ label: item.label || "",
181
+ value: item.label || "",
182
+ onClick: item.onClick || (() => {
183
+ if (item.href) {
184
+ window.location.href = item.href;
185
+ }
186
+ })
187
+ }));
188
+ return /* @__PURE__ */ jsx(dropdown_default, { items: dropdownItems, children: ellipsisButton });
189
+ }
190
+ return ellipsisButton;
191
+ }
192
+ );
193
+ BreadcrumbEllipsis.displayName = "BreadcrumbEllipsis";
194
+ var breadcrumbs_default = Breadcrumb;
195
+
196
+ export { BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, breadcrumbs_default };
197
+ //# sourceMappingURL=chunk-HUVXKOJC.js.map
198
+ //# sourceMappingURL=chunk-HUVXKOJC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/breadcrumbs/index.tsx"],"names":[],"mappings":"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","file":"chunk-HUVXKOJC.js","sourcesContent":["import { cva } from 'class-variance-authority'\nimport { ChevronRight, MoreHorizontal, MoreVertical } from 'lucide-react'\nimport React from 'react'\n\nimport Dropdown from '../dropdown'\nimport { cn, iconSizes } from '../utils'\nimport { textColorVariants } from '../variants'\nimport type {\n BreadcrumbEllipsisProps,\n BreadcrumbItemProps,\n BreadcrumbLinkProps,\n BreadcrumbListProps,\n BreadcrumbPageProps,\n BreadcrumbProps,\n BreadcrumbsColor,\n BreadcrumbSeparatorProps,\n BreadcrumbsSize,\n} from './types'\n\nexport type { BreadcrumbItemData } from './types'\n\ninterface BreadcrumbContextValue {\n color?: BreadcrumbsColor\n size?: BreadcrumbsSize\n}\n\nconst BreadcrumbContext = React.createContext<BreadcrumbContextValue>({})\n\nconst breadcrumbVariants = cva('', {\n variants: {\n size: {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nconst Breadcrumb = React.memo<BreadcrumbProps>(\n ({\n children,\n items,\n color = 'default',\n size = 'md',\n separator,\n className,\n }) => {\n const content = items?.length ? (\n <BreadcrumbList>\n {items.map((item, index) => {\n const isLast = index === items.length - 1\n return (\n <React.Fragment key={index}>\n <BreadcrumbItem>\n {item.ellipsis ? (\n <BreadcrumbEllipsis\n orientation={item.ellipsisOrientation || 'horizontal'}\n items={item.ellipsisItems || []}\n size={size}\n />\n ) : isLast ? (\n <BreadcrumbPage\n leftIcon={item.leftIcon}\n rightIcon={item.rightIcon}\n >\n {item.label}\n </BreadcrumbPage>\n ) : (\n <BreadcrumbLink\n href={item.href || ''}\n onClick={item.onClick}\n leftIcon={item.leftIcon}\n rightIcon={item.rightIcon}\n >\n {item.label}\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n {!isLast && (\n <BreadcrumbSeparator size={size}>\n {separator}\n </BreadcrumbSeparator>\n )}\n </React.Fragment>\n )\n })}\n </BreadcrumbList>\n ) : (\n children\n )\n\n return (\n <BreadcrumbContext.Provider value={{ color, size }}>\n <nav\n aria-label=\"breadcrumb\"\n className={cn(\n breadcrumbVariants({ size }),\n textColorVariants({ color }),\n className,\n )}\n >\n {content}\n </nav>\n </BreadcrumbContext.Provider>\n )\n },\n)\n\nBreadcrumb.displayName = 'Breadcrumb'\n\nexport const BreadcrumbList = React.memo<BreadcrumbListProps>(\n ({ children, className }) => {\n return (\n <ol className={cn('flex items-center gap-1.5', className)}>{children}</ol>\n )\n },\n)\n\nBreadcrumbList.displayName = 'BreadcrumbList'\n\nexport const BreadcrumbItem = React.memo<BreadcrumbItemProps>(\n ({ children, className }) => {\n return (\n <li className={cn('inline-flex items-center gap-1.5', className)}>\n {children}\n </li>\n )\n },\n)\n\nBreadcrumbItem.displayName = 'BreadcrumbItem'\n\nexport const BreadcrumbLink = React.memo<BreadcrumbLinkProps>(\n ({ children, href, onClick, leftIcon, rightIcon, className }) => {\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.preventDefault()\n onClick()\n }\n }\n\n const content = (\n <>\n {leftIcon && (\n <span className=\"inline-flex items-center\">{leftIcon}</span>\n )}\n {children}\n {rightIcon && (\n <span className=\"inline-flex items-center\">{rightIcon}</span>\n )}\n </>\n )\n\n if (href) {\n return (\n <a\n href={href}\n onClick={handleClick}\n className={cn(\n 'inline-flex items-center gap-1.5 transition-colors hover:underline cursor-pointer',\n className,\n )}\n >\n {content}\n </a>\n )\n }\n\n if (onClick) {\n return (\n <button\n onClick={handleClick}\n className={cn(\n 'inline-flex items-center gap-1.5 transition-colors hover:underline cursor-pointer',\n className,\n )}\n >\n {content}\n </button>\n )\n }\n\n return (\n <span className={cn('inline-flex items-center gap-1.5', className)}>\n {content}\n </span>\n )\n },\n)\n\nBreadcrumbLink.displayName = 'BreadcrumbLink'\n\nexport const BreadcrumbPage = React.memo<BreadcrumbPageProps>(\n ({ children, leftIcon, rightIcon, className }) => {\n return (\n <span\n aria-current=\"page\"\n className={cn(\n 'inline-flex items-center gap-1.5 font-medium',\n className,\n )}\n >\n {leftIcon && (\n <span className=\"inline-flex items-center\">{leftIcon}</span>\n )}\n {children}\n {rightIcon && (\n <span className=\"inline-flex items-center\">{rightIcon}</span>\n )}\n </span>\n )\n },\n)\n\nBreadcrumbPage.displayName = 'BreadcrumbPage'\n\nexport const BreadcrumbSeparator = React.memo<BreadcrumbSeparatorProps>(\n ({ children, className, size = 'md' }) => {\n return (\n <span className={cn('text-text-muted', className)}>\n {children ?? <ChevronRight className={iconSizes[size]} />}\n </span>\n )\n },\n)\n\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator'\n\nexport const BreadcrumbEllipsis = React.memo<BreadcrumbEllipsisProps>(\n ({ orientation = 'horizontal', items, children, className, size = 'md' }) => {\n const Icon = orientation === 'horizontal' ? MoreHorizontal : MoreVertical\n\n const ellipsisButton = (\n <span\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\n 'flex items-center justify-center',\n items || children ? 'cursor-pointer' : '',\n className,\n )}\n >\n <Icon className={iconSizes[size]} />\n <span className=\"sr-only\">More</span>\n </span>\n )\n\n // If items or children are provided, wrap in Dropdown\n if (items || children) {\n const dropdownItems = (items || []).map((item) => ({\n label: item.label || '',\n value: item.label || '',\n onClick:\n item.onClick ||\n (() => {\n if (item.href) {\n window.location.href = item.href\n }\n }),\n }))\n\n return <Dropdown items={dropdownItems}>{ellipsisButton}</Dropdown>\n }\n\n return ellipsisButton\n },\n)\n\nBreadcrumbEllipsis.displayName = 'BreadcrumbEllipsis'\n\nexport type * from './types'\nexport default Breadcrumb\n"]}