@avenue-ticketing/ui 0.4.0 → 0.6.0
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/dist/react/avatar.d.ts +42 -0
- package/dist/react/avatar.js +159 -0
- package/dist/react/avatar.js.map +1 -0
- package/dist/react/badge.d.ts +12 -0
- package/dist/react/badge.js +35 -1
- package/dist/react/badge.js.map +1 -1
- package/dist/react/button.d.ts +1 -1
- package/dist/react/button.js +3 -3
- package/dist/react/button.js.map +1 -1
- package/dist/react/calendar.d.ts +13 -0
- package/dist/react/calendar.js +4639 -0
- package/dist/react/calendar.js.map +1 -0
- package/dist/react/card.d.ts +11 -0
- package/dist/react/card.js +113 -0
- package/dist/react/card.js.map +1 -0
- package/dist/react/checkbox.d.ts +11 -0
- package/dist/react/checkbox.js +129 -0
- package/dist/react/checkbox.js.map +1 -0
- package/dist/react/datetime-picker.d.ts +21 -0
- package/dist/react/datetime-picker.js +6124 -0
- package/dist/react/datetime-picker.js.map +1 -0
- package/dist/react/dialog.js +1 -1
- package/dist/react/dialog.js.map +1 -1
- package/dist/react/dropdown.d.ts +34 -9
- package/dist/react/dropdown.js +295 -144
- package/dist/react/dropdown.js.map +1 -1
- package/dist/react/input.d.ts +7 -0
- package/dist/react/input.js +15 -2
- package/dist/react/input.js.map +1 -1
- package/dist/react/pagination.d.ts +28 -0
- package/dist/react/pagination.js +262 -0
- package/dist/react/pagination.js.map +1 -0
- package/dist/react/popover.d.ts +76 -0
- package/dist/react/popover.js +564 -0
- package/dist/react/popover.js.map +1 -0
- package/dist/react/scroll-header.js +13 -1
- package/dist/react/scroll-header.js.map +1 -1
- package/dist/react/scroll-wheel.d.ts +45 -0
- package/dist/react/scroll-wheel.js +557 -0
- package/dist/react/scroll-wheel.js.map +1 -0
- package/dist/react/select.d.ts +62 -0
- package/dist/react/select.js +889 -0
- package/dist/react/select.js.map +1 -0
- package/dist/react/sheet.js +1 -1
- package/dist/react/sheet.js.map +1 -1
- package/dist/react/switch.d.ts +38 -0
- package/dist/react/switch.js +117 -0
- package/dist/react/switch.js.map +1 -0
- package/dist/react/table-pagination.d.ts +15 -0
- package/dist/react/table-pagination.js +1153 -0
- package/dist/react/table-pagination.js.map +1 -0
- package/dist/react/table-view/column-menu.d.ts +15 -0
- package/dist/react/table-view/column-menu.js +955 -0
- package/dist/react/table-view/column-menu.js.map +1 -0
- package/dist/react/table-view/index.d.ts +70 -0
- package/dist/react/table-view/index.js +2190 -0
- package/dist/react/table-view/index.js.map +1 -0
- package/dist/react/table.d.ts +86 -0
- package/dist/react/table.js +414 -0
- package/dist/react/table.js.map +1 -0
- package/dist/react/tabs.d.ts +9 -3
- package/dist/react/tabs.js +204 -48
- package/dist/react/tabs.js.map +1 -1
- package/dist/react/textarea.d.ts +6 -0
- package/dist/react/textarea.js +33 -0
- package/dist/react/textarea.js.map +1 -0
- package/dist/react/time-picker.d.ts +22 -0
- package/dist/react/time-picker.js +856 -0
- package/dist/react/time-picker.js.map +1 -0
- package/dist/react/tooltip.d.ts +45 -0
- package/dist/react/tooltip.js +540 -0
- package/dist/react/tooltip.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { ChevronLeft, MoreHorizontal, ChevronRight } from 'lucide-react';
|
|
2
|
+
import * as React2 from 'react';
|
|
3
|
+
import { clsx } from 'clsx';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
5
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function cn(...inputs) {
|
|
8
|
+
return twMerge(clsx(inputs));
|
|
9
|
+
}
|
|
10
|
+
var sizeClass = {
|
|
11
|
+
xs: "h-8 min-h-8 gap-2 px-4 text-sm has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3",
|
|
12
|
+
default: "h-10 min-h-10 gap-2 px-5 text-sm has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4",
|
|
13
|
+
lg: "h-11 min-h-11 gap-2 px-6 text-base has-[>svg]:px-5 [&_svg:not([class*='size-'])]:size-5"
|
|
14
|
+
};
|
|
15
|
+
var iconOnlySizeClass = {
|
|
16
|
+
xs: "size-8 min-h-8 min-w-8 gap-0 p-0 [&_svg:not([class*='size-'])]:size-3",
|
|
17
|
+
default: "size-10 min-h-10 min-w-10 gap-0 p-0 [&_svg:not([class*='size-'])]:size-4",
|
|
18
|
+
lg: "size-11 min-h-11 min-w-11 gap-0 p-0 [&_svg:not([class*='size-'])]:size-5"
|
|
19
|
+
};
|
|
20
|
+
var roundedClass = {
|
|
21
|
+
full: "rounded-full",
|
|
22
|
+
lg: "rounded-lg",
|
|
23
|
+
md: "rounded-md"
|
|
24
|
+
};
|
|
25
|
+
var variantClass = {
|
|
26
|
+
primary: "bg-primary text-background border border-transparent hover:bg-primary/90 active:bg-primary/85",
|
|
27
|
+
secondary: "bg-background text-primary border border-primary/10 hover:bg-primary/5",
|
|
28
|
+
destructive: "bg-background text-red-500 border border-red-500/25 hover:bg-red-500/5",
|
|
29
|
+
success: "bg-background text-green-500 border border-green-500/25 hover:bg-green-500/5"
|
|
30
|
+
};
|
|
31
|
+
var Button = React2.forwardRef(
|
|
32
|
+
({
|
|
33
|
+
className,
|
|
34
|
+
type = "button",
|
|
35
|
+
variant = "secondary",
|
|
36
|
+
rounded: roundedProp,
|
|
37
|
+
size = "default",
|
|
38
|
+
iconOnly = false,
|
|
39
|
+
disabled,
|
|
40
|
+
...props
|
|
41
|
+
}, ref) => {
|
|
42
|
+
const rounded = roundedProp ?? (iconOnly ? "md" : "full");
|
|
43
|
+
return /* @__PURE__ */ jsx(
|
|
44
|
+
"button",
|
|
45
|
+
{
|
|
46
|
+
type,
|
|
47
|
+
disabled,
|
|
48
|
+
"data-slot": "button",
|
|
49
|
+
"data-icon-only": iconOnly ? "" : void 0,
|
|
50
|
+
className: cn(
|
|
51
|
+
"inline-flex shrink-0 cursor-pointer items-center justify-center whitespace-nowrap outline-none scale-100 transition-[color,background-color,box-shadow,transform] duration-150 ease-out active:scale-[0.98] active:duration-100 active:ease-linear [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
52
|
+
"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
|
|
53
|
+
"focus-visible:border-ring font-medium lg:tracking-wide focus-visible:ring-ring/50 focus-visible:ring-[3px]",
|
|
54
|
+
iconOnly ? iconOnlySizeClass[size] : sizeClass[size],
|
|
55
|
+
roundedClass[rounded],
|
|
56
|
+
variantClass[variant],
|
|
57
|
+
className
|
|
58
|
+
),
|
|
59
|
+
ref,
|
|
60
|
+
...props
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
Button.displayName = "Button";
|
|
66
|
+
var PaginationInner = React2.forwardRef(
|
|
67
|
+
function Pagination({
|
|
68
|
+
meta,
|
|
69
|
+
onPageChange,
|
|
70
|
+
className,
|
|
71
|
+
maxVisibleButtons = 3,
|
|
72
|
+
disabled = false,
|
|
73
|
+
size = "default",
|
|
74
|
+
rounded = "full"
|
|
75
|
+
}, ref) {
|
|
76
|
+
const handlePageChange = React2.useCallback(
|
|
77
|
+
(page) => {
|
|
78
|
+
onPageChange?.(page);
|
|
79
|
+
},
|
|
80
|
+
[onPageChange]
|
|
81
|
+
);
|
|
82
|
+
const totalPages = React2.useMemo(() => {
|
|
83
|
+
const totalItems = Math.max(0, Number(meta.totalItems) || 0);
|
|
84
|
+
const itemsPerPage = Math.max(1, Number(meta.itemsPerPage) || 16);
|
|
85
|
+
if (meta.totalPages != null && Number.isFinite(meta.totalPages)) {
|
|
86
|
+
return Math.max(1, Math.floor(Number(meta.totalPages)));
|
|
87
|
+
}
|
|
88
|
+
return Math.max(1, Math.ceil(totalItems / itemsPerPage));
|
|
89
|
+
}, [meta.totalItems, meta.itemsPerPage, meta.totalPages]);
|
|
90
|
+
const currentPage = React2.useMemo(
|
|
91
|
+
() => Math.max(1, Number(meta.currentPage) || 1),
|
|
92
|
+
[meta.currentPage]
|
|
93
|
+
);
|
|
94
|
+
const { endPage, adjustedStart } = React2.useMemo(() => {
|
|
95
|
+
const sp = Math.max(1, currentPage - Math.floor(maxVisibleButtons / 2));
|
|
96
|
+
const ep = Math.min(totalPages, sp + maxVisibleButtons - 1);
|
|
97
|
+
const adj = ep - sp + 1 < maxVisibleButtons ? Math.max(1, ep - maxVisibleButtons + 1) : sp;
|
|
98
|
+
return { endPage: ep, adjustedStart: adj };
|
|
99
|
+
}, [currentPage, totalPages, maxVisibleButtons]);
|
|
100
|
+
const middlePageNumbers = React2.useMemo(
|
|
101
|
+
() => Array.from({ length: endPage - adjustedStart + 1 }, (_, i) => adjustedStart + i),
|
|
102
|
+
[endPage, adjustedStart]
|
|
103
|
+
);
|
|
104
|
+
const navButtonSize = React2.useMemo(
|
|
105
|
+
() => size === "xs" ? "default" : "lg",
|
|
106
|
+
[size]
|
|
107
|
+
);
|
|
108
|
+
const ellipsisClassName = React2.useMemo(
|
|
109
|
+
() => cn(
|
|
110
|
+
"inline-flex shrink-0 items-center justify-center",
|
|
111
|
+
navButtonSize === "lg" ? "size-11 min-h-11 min-w-11" : "size-10 min-h-10 min-w-10",
|
|
112
|
+
rounded === "full" ? "rounded-full" : rounded === "lg" ? "rounded-lg" : "rounded-md"
|
|
113
|
+
),
|
|
114
|
+
[navButtonSize, rounded]
|
|
115
|
+
);
|
|
116
|
+
const gapIconClassName = React2.useMemo(
|
|
117
|
+
() => cn(
|
|
118
|
+
"mx-auto shrink-0 text-primary/45",
|
|
119
|
+
navButtonSize === "lg" ? "size-[18px]" : "size-4"
|
|
120
|
+
),
|
|
121
|
+
[navButtonSize]
|
|
122
|
+
);
|
|
123
|
+
if (totalPages <= 1) return null;
|
|
124
|
+
return /* @__PURE__ */ jsx("div", { ref, className: cn("flex w-full justify-center", className), children: /* @__PURE__ */ jsxs(
|
|
125
|
+
"nav",
|
|
126
|
+
{
|
|
127
|
+
role: "navigation",
|
|
128
|
+
"aria-label": "Pagination",
|
|
129
|
+
className: "text-primary flex items-center justify-center gap-0.5 text-base font-medium tabular-nums tracking-tight",
|
|
130
|
+
children: [
|
|
131
|
+
/* @__PURE__ */ jsx(
|
|
132
|
+
Button,
|
|
133
|
+
{
|
|
134
|
+
type: "button",
|
|
135
|
+
rounded,
|
|
136
|
+
iconOnly: true,
|
|
137
|
+
size: navButtonSize,
|
|
138
|
+
className: "border-0 tracking-tight focus-visible:border-transparent focus-visible:ring-0",
|
|
139
|
+
disabled: disabled || currentPage <= 1,
|
|
140
|
+
onClick: () => handlePageChange(currentPage - 1),
|
|
141
|
+
"aria-label": "Previous page",
|
|
142
|
+
children: /* @__PURE__ */ jsx(ChevronLeft, { "aria-hidden": true, className: "size-5 shrink-0 mr-0.5" })
|
|
143
|
+
}
|
|
144
|
+
),
|
|
145
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-0.5", children: [
|
|
146
|
+
adjustedStart > 1 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
147
|
+
currentPage === 1 ? /* @__PURE__ */ jsx(
|
|
148
|
+
Button,
|
|
149
|
+
{
|
|
150
|
+
type: "button",
|
|
151
|
+
variant: "primary",
|
|
152
|
+
rounded,
|
|
153
|
+
iconOnly: true,
|
|
154
|
+
size: navButtonSize,
|
|
155
|
+
className: "tracking-tight",
|
|
156
|
+
"aria-current": "page",
|
|
157
|
+
tabIndex: -1,
|
|
158
|
+
children: /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: 1 })
|
|
159
|
+
}
|
|
160
|
+
) : /* @__PURE__ */ jsx(
|
|
161
|
+
Button,
|
|
162
|
+
{
|
|
163
|
+
type: "button",
|
|
164
|
+
rounded,
|
|
165
|
+
iconOnly: true,
|
|
166
|
+
size: navButtonSize,
|
|
167
|
+
className: "border-none tracking-tight",
|
|
168
|
+
disabled,
|
|
169
|
+
onClick: () => handlePageChange(1),
|
|
170
|
+
"aria-label": "Go to page 1",
|
|
171
|
+
children: /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: "1" })
|
|
172
|
+
}
|
|
173
|
+
),
|
|
174
|
+
adjustedStart > 2 && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: ellipsisClassName, children: /* @__PURE__ */ jsx(MoreHorizontal, { className: gapIconClassName, "aria-hidden": true }) })
|
|
175
|
+
] }),
|
|
176
|
+
middlePageNumbers.map(
|
|
177
|
+
(page) => currentPage === page ? /* @__PURE__ */ jsx(
|
|
178
|
+
Button,
|
|
179
|
+
{
|
|
180
|
+
type: "button",
|
|
181
|
+
variant: "primary",
|
|
182
|
+
rounded,
|
|
183
|
+
iconOnly: true,
|
|
184
|
+
size: navButtonSize,
|
|
185
|
+
className: "tracking-tight",
|
|
186
|
+
"aria-current": "page",
|
|
187
|
+
tabIndex: -1,
|
|
188
|
+
children: /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: page })
|
|
189
|
+
},
|
|
190
|
+
page
|
|
191
|
+
) : /* @__PURE__ */ jsx(
|
|
192
|
+
Button,
|
|
193
|
+
{
|
|
194
|
+
type: "button",
|
|
195
|
+
rounded,
|
|
196
|
+
iconOnly: true,
|
|
197
|
+
size: navButtonSize,
|
|
198
|
+
className: "border-none tracking-tight",
|
|
199
|
+
disabled,
|
|
200
|
+
onClick: () => handlePageChange(page),
|
|
201
|
+
"aria-label": `Go to page ${page}`,
|
|
202
|
+
children: /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: page })
|
|
203
|
+
},
|
|
204
|
+
page
|
|
205
|
+
)
|
|
206
|
+
),
|
|
207
|
+
endPage < totalPages && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
208
|
+
endPage < totalPages - 1 && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: ellipsisClassName, children: /* @__PURE__ */ jsx(MoreHorizontal, { className: gapIconClassName, "aria-hidden": true }) }),
|
|
209
|
+
currentPage === totalPages ? /* @__PURE__ */ jsx(
|
|
210
|
+
Button,
|
|
211
|
+
{
|
|
212
|
+
type: "button",
|
|
213
|
+
variant: "primary",
|
|
214
|
+
rounded,
|
|
215
|
+
iconOnly: true,
|
|
216
|
+
size: navButtonSize,
|
|
217
|
+
className: "tracking-tight",
|
|
218
|
+
"aria-current": "page",
|
|
219
|
+
tabIndex: -1,
|
|
220
|
+
children: /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: totalPages })
|
|
221
|
+
}
|
|
222
|
+
) : /* @__PURE__ */ jsx(
|
|
223
|
+
Button,
|
|
224
|
+
{
|
|
225
|
+
type: "button",
|
|
226
|
+
rounded,
|
|
227
|
+
iconOnly: true,
|
|
228
|
+
size: navButtonSize,
|
|
229
|
+
className: "border-none tracking-tight",
|
|
230
|
+
disabled,
|
|
231
|
+
onClick: () => handlePageChange(totalPages),
|
|
232
|
+
"aria-label": `Go to page ${totalPages}`,
|
|
233
|
+
children: /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: totalPages })
|
|
234
|
+
}
|
|
235
|
+
)
|
|
236
|
+
] })
|
|
237
|
+
] }),
|
|
238
|
+
/* @__PURE__ */ jsx(
|
|
239
|
+
Button,
|
|
240
|
+
{
|
|
241
|
+
type: "button",
|
|
242
|
+
rounded,
|
|
243
|
+
iconOnly: true,
|
|
244
|
+
size: navButtonSize,
|
|
245
|
+
className: "border-0 tracking-tight focus-visible:border-transparent focus-visible:ring-0",
|
|
246
|
+
disabled: disabled || currentPage >= totalPages,
|
|
247
|
+
onClick: () => handlePageChange(currentPage + 1),
|
|
248
|
+
"aria-label": "Next page",
|
|
249
|
+
children: /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": true, className: "size-5 shrink-0 ml-0.5" })
|
|
250
|
+
}
|
|
251
|
+
)
|
|
252
|
+
]
|
|
253
|
+
}
|
|
254
|
+
) });
|
|
255
|
+
}
|
|
256
|
+
);
|
|
257
|
+
PaginationInner.displayName = "Pagination";
|
|
258
|
+
var Pagination2 = React2.memo(PaginationInner);
|
|
259
|
+
|
|
260
|
+
export { Pagination2 as Pagination };
|
|
261
|
+
//# sourceMappingURL=pagination.js.map
|
|
262
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/react/button.tsx","../../src/react/pagination.tsx"],"names":["React","jsx","Pagination"],"mappings":"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","file":"pagination.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst sizeClass = {\n xs: \"h-8 min-h-8 gap-2 px-4 text-sm has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3\",\n default:\n \"h-10 min-h-10 gap-2 px-5 text-sm has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4\",\n lg: \"h-11 min-h-11 gap-2 px-6 text-base has-[>svg]:px-5 [&_svg:not([class*='size-'])]:size-5\",\n} as const;\n\n/** Square hit targets for `iconOnly` — same keys as `sizeClass` (`default` | `lg`). */\nconst iconOnlySizeClass = {\n xs: \"size-8 min-h-8 min-w-8 gap-0 p-0 [&_svg:not([class*='size-'])]:size-3\",\n default:\n \"size-10 min-h-10 min-w-10 gap-0 p-0 [&_svg:not([class*='size-'])]:size-4\",\n lg: \"size-11 min-h-11 min-w-11 gap-0 p-0 [&_svg:not([class*='size-'])]:size-5\",\n} as const;\n\nconst roundedClass = {\n full: \"rounded-full\",\n lg: \"rounded-lg\",\n md: \"rounded-md\",\n} as const;\n\nconst variantClass = {\n primary:\n \"bg-primary text-background border border-transparent hover:bg-primary/90 active:bg-primary/85\",\n secondary:\n \"bg-background text-primary border border-primary/10 hover:bg-primary/5\",\n destructive:\n \"bg-background text-red-500 border border-red-500/25 hover:bg-red-500/5\",\n success:\n \"bg-background text-green-500 border border-green-500/25 hover:bg-green-500/5\",\n} as const;\n\nexport type ButtonProps = React.ComponentProps<\"button\"> & {\n /**\n * Visual style: neutral (`secondary`, `primary`), or outline (`destructive`,\n * `success`) using Tailwind `red-500` / `green-500` text and matching borders on\n * `bg-background` (no solid fill).\n */\n variant?: keyof typeof variantClass;\n /**\n * Corner radius. Labeled buttons default to `full` (pill). `iconOnly` buttons\n * default to `md` (square corners) unless you pass `rounded` explicitly.\n */\n rounded?: keyof typeof roundedClass;\n /** Height and horizontal padding: `default` or `lg` only. */\n size?: keyof typeof sizeClass;\n /**\n * Square icon-only control; same `size` presets (`default` | `lg`). Pair with\n * `aria-label` (or `title`) when there is no visible text.\n */\n iconOnly?: boolean;\n};\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n type = \"button\",\n variant = \"secondary\",\n rounded: roundedProp,\n size = \"default\",\n iconOnly = false,\n disabled,\n ...props\n },\n ref,\n ) => {\n const rounded = roundedProp ?? (iconOnly ? \"md\" : \"full\");\n\n return (\n <button\n type={type}\n disabled={disabled}\n data-slot=\"button\"\n data-icon-only={iconOnly ? \"\" : undefined}\n className={cn(\n \"inline-flex shrink-0 cursor-pointer items-center justify-center whitespace-nowrap outline-none scale-100 transition-[color,background-color,box-shadow,transform] duration-150 ease-out active:scale-[0.98] active:duration-100 active:ease-linear [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n \"focus-visible:border-ring font-medium lg:tracking-wide focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n iconOnly ? iconOnlySizeClass[size] : sizeClass[size],\n roundedClass[rounded],\n variantClass[variant],\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button };\n","\"use client\";\n\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Button, type ButtonProps } from \"./button\";\n\nexport type PaginationMeta = {\n currentPage: number;\n totalItems: number;\n itemsPerPage: number;\n /** omit to derive `ceil(totalItems / itemsPerPage)` (minimum 1) */\n totalPages?: number;\n};\n\nexport type PaginationProps = {\n meta: PaginationMeta;\n onPageChange?: (page: number) => void;\n className?: string;\n /** max page numbers in the sliding window (excluding first/last when ellipses show; default 3) */\n maxVisibleButtons?: number;\n disabled?: boolean;\n /**\n * density preset → resolved `Button` size for every control (`xs` → `default`;\n * `default` / `lg` → `lg`) so chevrons and page cells share one hit grid.\n */\n size?: ButtonProps[\"size\"];\n /** same as `Button` `rounded`; pagination defaults to `full` */\n rounded?: NonNullable<ButtonProps[\"rounded\"]>;\n};\n\nconst PaginationInner = React.forwardRef<HTMLDivElement, PaginationProps>(\n function Pagination(\n {\n meta,\n onPageChange,\n className,\n maxVisibleButtons = 3,\n disabled = false,\n size = \"default\",\n rounded = \"full\",\n },\n ref,\n ) {\n const handlePageChange = React.useCallback(\n (page: number) => {\n onPageChange?.(page);\n },\n [onPageChange],\n );\n\n const totalPages = React.useMemo(() => {\n const totalItems = Math.max(0, Number(meta.totalItems) || 0);\n const itemsPerPage = Math.max(1, Number(meta.itemsPerPage) || 16);\n if (meta.totalPages != null && Number.isFinite(meta.totalPages)) {\n return Math.max(1, Math.floor(Number(meta.totalPages)));\n }\n return Math.max(1, Math.ceil(totalItems / itemsPerPage));\n }, [meta.totalItems, meta.itemsPerPage, meta.totalPages]);\n\n const currentPage = React.useMemo(\n () => Math.max(1, Number(meta.currentPage) || 1),\n [meta.currentPage],\n );\n\n const { endPage, adjustedStart } = React.useMemo(() => {\n const sp = Math.max(1, currentPage - Math.floor(maxVisibleButtons / 2));\n const ep = Math.min(totalPages, sp + maxVisibleButtons - 1);\n const adj =\n ep - sp + 1 < maxVisibleButtons ? Math.max(1, ep - maxVisibleButtons + 1) : sp;\n return { endPage: ep, adjustedStart: adj };\n }, [currentPage, totalPages, maxVisibleButtons]);\n\n const middlePageNumbers = React.useMemo(\n () =>\n Array.from({ length: endPage - adjustedStart + 1 }, (_, i) => adjustedStart + i),\n [endPage, adjustedStart],\n );\n\n const navButtonSize = React.useMemo(\n (): NonNullable<ButtonProps[\"size\"]> => (size === \"xs\" ? \"default\" : \"lg\"),\n [size],\n );\n\n const ellipsisClassName = React.useMemo(\n () =>\n cn(\n \"inline-flex shrink-0 items-center justify-center\",\n navButtonSize === \"lg\"\n ? \"size-11 min-h-11 min-w-11\"\n : \"size-10 min-h-10 min-w-10\",\n rounded === \"full\"\n ? \"rounded-full\"\n : rounded === \"lg\"\n ? \"rounded-lg\"\n : \"rounded-md\",\n ),\n [navButtonSize, rounded],\n );\n\n const gapIconClassName = React.useMemo(\n () =>\n cn(\n \"mx-auto shrink-0 text-primary/45\",\n navButtonSize === \"lg\" ? \"size-[18px]\" : \"size-4\",\n ),\n [navButtonSize],\n );\n\n if (totalPages <= 1) return null;\n\n return (\n <div ref={ref} className={cn(\"flex w-full justify-center\", className)}>\n <nav\n role=\"navigation\"\n aria-label=\"Pagination\"\n className=\"text-primary flex items-center justify-center gap-0.5 text-base font-medium tabular-nums tracking-tight\"\n >\n <Button\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-0 tracking-tight focus-visible:border-transparent focus-visible:ring-0\"\n disabled={disabled || currentPage <= 1}\n onClick={() => handlePageChange(currentPage - 1)}\n aria-label=\"Previous page\"\n >\n <ChevronLeft aria-hidden className=\"size-5 shrink-0 mr-0.5\" />\n </Button>\n <div className=\"flex items-center gap-0.5\">\n {adjustedStart > 1 && (\n <>\n {currentPage === 1 ? (\n <Button\n type=\"button\"\n variant=\"primary\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"tracking-tight\"\n aria-current=\"page\"\n tabIndex={-1}\n >\n <span className=\"tabular-nums\">{1}</span>\n </Button>\n ) : (\n <Button\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-none tracking-tight\"\n disabled={disabled}\n onClick={() => handlePageChange(1)}\n aria-label=\"Go to page 1\"\n >\n <span className=\"tabular-nums\">1</span>\n </Button>\n )}\n {adjustedStart > 2 && (\n <span aria-hidden className={ellipsisClassName}>\n <MoreHorizontal className={gapIconClassName} aria-hidden />\n </span>\n )}\n </>\n )}\n {middlePageNumbers.map((page) =>\n currentPage === page ? (\n <Button\n key={page}\n type=\"button\"\n variant=\"primary\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"tracking-tight\"\n aria-current=\"page\"\n tabIndex={-1}\n >\n <span className=\"tabular-nums\">{page}</span>\n </Button>\n ) : (\n <Button\n key={page}\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-none tracking-tight\"\n disabled={disabled}\n onClick={() => handlePageChange(page)}\n aria-label={`Go to page ${page}`}\n >\n <span className=\"tabular-nums\">{page}</span>\n </Button>\n ),\n )}\n {endPage < totalPages && (\n <>\n {endPage < totalPages - 1 && (\n <span aria-hidden className={ellipsisClassName}>\n <MoreHorizontal className={gapIconClassName} aria-hidden />\n </span>\n )}\n {currentPage === totalPages ? (\n <Button\n type=\"button\"\n variant=\"primary\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"tracking-tight\"\n aria-current=\"page\"\n tabIndex={-1}\n >\n <span className=\"tabular-nums\">{totalPages}</span>\n </Button>\n ) : (\n <Button\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-none tracking-tight\"\n disabled={disabled}\n onClick={() => handlePageChange(totalPages)}\n aria-label={`Go to page ${totalPages}`}\n >\n <span className=\"tabular-nums\">{totalPages}</span>\n </Button>\n )}\n </>\n )}\n </div>\n <Button\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-0 tracking-tight focus-visible:border-transparent focus-visible:ring-0\"\n disabled={disabled || currentPage >= totalPages}\n onClick={() => handlePageChange(currentPage + 1)}\n aria-label=\"Next page\"\n >\n <ChevronRight aria-hidden className=\"size-5 shrink-0 ml-0.5\" />\n </Button>\n </nav>\n </div>\n );\n },\n);\n\nPaginationInner.displayName = \"Pagination\";\n\nexport const Pagination = React.memo(PaginationInner);\n"]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
|
|
3
|
+
declare const Popover: React__default.FC<{
|
|
4
|
+
children: React__default.ReactNode;
|
|
5
|
+
open?: boolean;
|
|
6
|
+
onOpenChange?: (open: boolean) => void;
|
|
7
|
+
}>;
|
|
8
|
+
declare const PopoverTrigger: React__default.FC<{
|
|
9
|
+
children: React__default.ReactNode;
|
|
10
|
+
asChild?: boolean;
|
|
11
|
+
}>;
|
|
12
|
+
declare const PopoverClose: React__default.FC<{
|
|
13
|
+
children: React__default.ReactNode;
|
|
14
|
+
asChild?: boolean;
|
|
15
|
+
}>;
|
|
16
|
+
/**
|
|
17
|
+
* Narrow-viewport (≤1024px) bottom-sheet options for {@link PopoverContent}.
|
|
18
|
+
* `className` merges onto the sheet panel root (after base sheet styles).
|
|
19
|
+
*/
|
|
20
|
+
interface PopoverMobileSheetOptions {
|
|
21
|
+
/** When `true`, use a bottom sheet on narrow viewports. Default `false`. */
|
|
22
|
+
sheet?: boolean;
|
|
23
|
+
title?: string;
|
|
24
|
+
className?: string;
|
|
25
|
+
contentClassName?: string;
|
|
26
|
+
}
|
|
27
|
+
interface PopoverMobileCloseProps extends React__default.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Dismiss control for the mobile bottom-sheet popover. Styling matches
|
|
31
|
+
* {@link DialogCloseButton} (circular hit target, X icon).
|
|
32
|
+
*/
|
|
33
|
+
declare const PopoverMobileClose: React__default.ForwardRefExoticComponent<PopoverMobileCloseProps & React__default.RefAttributes<HTMLButtonElement>>;
|
|
34
|
+
type Side = "top" | "right" | "bottom" | "left";
|
|
35
|
+
type Align = "start" | "center" | "end";
|
|
36
|
+
interface PopoverContentProps extends React__default.HTMLAttributes<HTMLDivElement> {
|
|
37
|
+
/** Which side of the trigger to render on */
|
|
38
|
+
side?: Side;
|
|
39
|
+
/** Alignment along the cross-axis */
|
|
40
|
+
align?: Align;
|
|
41
|
+
/** Gap between trigger and popover in px */
|
|
42
|
+
offset?: number;
|
|
43
|
+
/** Show a small arrow pointing to the trigger */
|
|
44
|
+
showArrow?: boolean;
|
|
45
|
+
/** Close when clicking outside */
|
|
46
|
+
closeOnClickOutside?: boolean;
|
|
47
|
+
/** Close when Escape key is pressed */
|
|
48
|
+
closeOnEscape?: boolean;
|
|
49
|
+
/** Animation duration in ms */
|
|
50
|
+
duration?: number;
|
|
51
|
+
/** Minimum distance from the viewport edge in px */
|
|
52
|
+
viewportPadding?: number;
|
|
53
|
+
/** Portal container – defaults to document.body */
|
|
54
|
+
container?: HTMLElement | null;
|
|
55
|
+
/** Width of the popover. 'trigger' matches the trigger width. */
|
|
56
|
+
width?: "auto" | "trigger" | number;
|
|
57
|
+
/**
|
|
58
|
+
* Narrow-viewport (≤1024px) bottom sheet — same options as dropdown
|
|
59
|
+
* `mobileOptions`, except `sheet` defaults to `false`.
|
|
60
|
+
*/
|
|
61
|
+
mobileOptions?: PopoverMobileSheetOptions;
|
|
62
|
+
/**
|
|
63
|
+
* Mobile bottom sheet only. When `true` (default), panel motion matches Dialog
|
|
64
|
+
* `slideEntrance`; when `false`, uses full `translateY(100%)`.
|
|
65
|
+
*/
|
|
66
|
+
slideEntrance?: boolean;
|
|
67
|
+
/** Mobile sheet only; defaults to 120px (same as dropdown / dialog full sheet). */
|
|
68
|
+
slideEntranceOffsetPx?: number;
|
|
69
|
+
}
|
|
70
|
+
declare const PopoverContent: React__default.FC<PopoverContentProps>;
|
|
71
|
+
declare const PopoverHeader: React__default.FC<React__default.HTMLAttributes<HTMLDivElement>>;
|
|
72
|
+
declare const PopoverFooter: React__default.FC<React__default.HTMLAttributes<HTMLDivElement>>;
|
|
73
|
+
declare const PopoverTitle: React__default.FC<React__default.HTMLAttributes<HTMLHeadingElement>>;
|
|
74
|
+
declare const PopoverDescription: React__default.FC<React__default.HTMLAttributes<HTMLParagraphElement>>;
|
|
75
|
+
|
|
76
|
+
export { Popover, PopoverClose, PopoverContent, PopoverDescription, PopoverFooter, PopoverHeader, PopoverMobileClose, type PopoverMobileCloseProps, type PopoverMobileSheetOptions, PopoverTitle, PopoverTrigger };
|