@fanvue/ui 2.0.0 → 2.1.1

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.
Files changed (50) hide show
  1. package/dist/cjs/components/Autocomplete/Autocomplete.cjs +2 -1
  2. package/dist/cjs/components/Autocomplete/Autocomplete.cjs.map +1 -1
  3. package/dist/cjs/components/Dialog/Dialog.cjs +1 -1
  4. package/dist/cjs/components/Dialog/Dialog.cjs.map +1 -1
  5. package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs +30 -20
  6. package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
  7. package/dist/cjs/components/Icons/NewMessageIcon.cjs +47 -0
  8. package/dist/cjs/components/Icons/NewMessageIcon.cjs.map +1 -0
  9. package/dist/cjs/components/Icons/ReverseIcon.cjs +64 -0
  10. package/dist/cjs/components/Icons/ReverseIcon.cjs.map +1 -0
  11. package/dist/cjs/components/InfoBox/InfoBox.cjs +3 -1
  12. package/dist/cjs/components/InfoBox/InfoBox.cjs.map +1 -1
  13. package/dist/cjs/components/Select/Select.cjs +31 -20
  14. package/dist/cjs/components/Select/Select.cjs.map +1 -1
  15. package/dist/cjs/components/Table/Table.cjs +341 -0
  16. package/dist/cjs/components/Table/Table.cjs.map +1 -0
  17. package/dist/cjs/components/Table/TablePagination.cjs +70 -0
  18. package/dist/cjs/components/Table/TablePagination.cjs.map +1 -0
  19. package/dist/cjs/index.cjs +26 -2
  20. package/dist/cjs/index.cjs.map +1 -1
  21. package/dist/cjs/utils/floatingContentCollisionPadding.cjs +6 -0
  22. package/dist/cjs/utils/floatingContentCollisionPadding.cjs.map +1 -0
  23. package/dist/components/Autocomplete/Autocomplete.mjs +2 -1
  24. package/dist/components/Autocomplete/Autocomplete.mjs.map +1 -1
  25. package/dist/components/Dialog/Dialog.mjs +1 -1
  26. package/dist/components/Dialog/Dialog.mjs.map +1 -1
  27. package/dist/components/DropdownMenu/DropdownMenu.mjs +30 -20
  28. package/dist/components/DropdownMenu/DropdownMenu.mjs.map +1 -1
  29. package/dist/components/Icons/NewMessageIcon.mjs +30 -0
  30. package/dist/components/Icons/NewMessageIcon.mjs.map +1 -0
  31. package/dist/components/Icons/ReverseIcon.mjs +47 -0
  32. package/dist/components/Icons/ReverseIcon.mjs.map +1 -0
  33. package/dist/components/InfoBox/InfoBox.mjs +3 -1
  34. package/dist/components/InfoBox/InfoBox.mjs.map +1 -1
  35. package/dist/components/Select/Select.mjs +31 -20
  36. package/dist/components/Select/Select.mjs.map +1 -1
  37. package/dist/components/Table/Table.mjs +324 -0
  38. package/dist/components/Table/Table.mjs.map +1 -0
  39. package/dist/components/Table/TablePagination.mjs +53 -0
  40. package/dist/components/Table/TablePagination.mjs.map +1 -0
  41. package/dist/index.d.ts +244 -40
  42. package/dist/index.mjs +26 -2
  43. package/dist/index.mjs.map +1 -1
  44. package/dist/utils/floatingContentCollisionPadding.mjs +6 -0
  45. package/dist/utils/floatingContentCollisionPadding.mjs.map +1 -0
  46. package/package.json +2 -2
  47. package/dist/cjs/components/Banner/Banner.cjs +0 -71
  48. package/dist/cjs/components/Banner/Banner.cjs.map +0 -1
  49. package/dist/components/Banner/Banner.mjs +0 -54
  50. package/dist/components/Banner/Banner.mjs.map +0 -1
@@ -0,0 +1,324 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../../utils/cn.mjs";
5
+ import { Select, SelectContent, SelectItem } from "../Select/Select.mjs";
6
+ const TableSizeContext = React.createContext("md");
7
+ function useTableSize() {
8
+ return React.useContext(TableSizeContext);
9
+ }
10
+ const TableCard = React.forwardRef(
11
+ ({ className, size = "md", ...props }, ref) => {
12
+ return /* @__PURE__ */ jsx(TableSizeContext.Provider, { value: size, children: /* @__PURE__ */ jsx(
13
+ "div",
14
+ {
15
+ ref,
16
+ className: cn(
17
+ "isolate flex flex-col gap-4 overflow-hidden rounded-md bg-bg-primary pb-4",
18
+ className
19
+ ),
20
+ ...props
21
+ }
22
+ ) });
23
+ }
24
+ );
25
+ TableCard.displayName = "TableCard";
26
+ const TableToolbar = React.forwardRef(
27
+ ({ className, ...props }, ref) => {
28
+ return /* @__PURE__ */ jsx(
29
+ "div",
30
+ {
31
+ ref,
32
+ className: cn(
33
+ "flex flex-wrap items-center gap-4 rounded-t-md bg-bg-primary px-6",
34
+ className
35
+ ),
36
+ ...props
37
+ }
38
+ );
39
+ }
40
+ );
41
+ TableToolbar.displayName = "TableToolbar";
42
+ const TableScrollArea = React.forwardRef(
43
+ ({ className, roundTop = true, children, ...props }, ref) => {
44
+ return /* @__PURE__ */ jsx(
45
+ "div",
46
+ {
47
+ ref,
48
+ className: cn(
49
+ "relative w-full min-w-0 overflow-hidden",
50
+ roundTop && "rounded-t-md",
51
+ className
52
+ ),
53
+ ...props,
54
+ children: /* @__PURE__ */ jsx("div", { className: "overflow-x-auto", children })
55
+ }
56
+ );
57
+ }
58
+ );
59
+ TableScrollArea.displayName = "TableScrollArea";
60
+ const Table = React.forwardRef(
61
+ ({ className, ...props }, ref) => {
62
+ return /* @__PURE__ */ jsx(
63
+ "table",
64
+ {
65
+ ref,
66
+ className: cn(
67
+ "w-full caption-bottom border-separate border-spacing-0 text-left",
68
+ className
69
+ ),
70
+ ...props
71
+ }
72
+ );
73
+ }
74
+ );
75
+ Table.displayName = "Table";
76
+ const TableHeader = React.forwardRef(
77
+ ({ className, ...props }, ref) => {
78
+ return /* @__PURE__ */ jsx(
79
+ "thead",
80
+ {
81
+ ref,
82
+ className: cn(
83
+ "[&_tr:first-child_th:first-child]:rounded-tl-md [&_tr:first-child_th:last-child]:rounded-tr-md",
84
+ className
85
+ ),
86
+ ...props
87
+ }
88
+ );
89
+ }
90
+ );
91
+ TableHeader.displayName = "TableHeader";
92
+ const TableBody = React.forwardRef(
93
+ ({ className, ...props }, ref) => {
94
+ return /* @__PURE__ */ jsx("tbody", { ref, className: cn(className), ...props });
95
+ }
96
+ );
97
+ TableBody.displayName = "TableBody";
98
+ const TableFooter = React.forwardRef(
99
+ ({ className, ...props }, ref) => {
100
+ return /* @__PURE__ */ jsx("tfoot", { ref, className: cn(className), ...props });
101
+ }
102
+ );
103
+ TableFooter.displayName = "TableFooter";
104
+ const TableRow = React.forwardRef(
105
+ ({ className, ...props }, ref) => {
106
+ return /* @__PURE__ */ jsx("tr", { ref, className: cn(className), ...props });
107
+ }
108
+ );
109
+ TableRow.displayName = "TableRow";
110
+ const HEAD_INTENT_CLASSES = {
111
+ default: "text-left",
112
+ checkbox: "w-8 min-w-8 max-w-8 text-center",
113
+ sort: "text-right",
114
+ leading: "min-w-0 w-2/5 text-left"
115
+ };
116
+ const TableHead = React.forwardRef(
117
+ ({ className, intent = "default", scope = "col", ...props }, ref) => {
118
+ return /* @__PURE__ */ jsx(
119
+ "th",
120
+ {
121
+ ref,
122
+ scope,
123
+ className: cn(
124
+ "typography-semibold-body-sm box-border h-8 min-h-8 bg-surface-secondary px-2 py-2 align-middle text-content-primary",
125
+ HEAD_INTENT_CLASSES[intent],
126
+ className
127
+ ),
128
+ ...props
129
+ }
130
+ );
131
+ }
132
+ );
133
+ TableHead.displayName = "TableHead";
134
+ const CELL_MIN_HEIGHT = {
135
+ md: "min-h-[60px]",
136
+ lg: "min-h-[80px]"
137
+ };
138
+ const CELL_VARIANT_CLASSES = {
139
+ default: "border-border-primary border-b px-2 py-2",
140
+ chip: "border-border-primary border-b px-2 py-2",
141
+ pillProgress: "border-border-primary border-b px-4 py-2"
142
+ };
143
+ const CELL_INTENT_CLASSES = {
144
+ default: "",
145
+ checkbox: "text-center",
146
+ stacked: "align-top",
147
+ multiline: "max-w-[240px]",
148
+ sideLabel: ""
149
+ };
150
+ const TableCell = React.forwardRef(
151
+ ({ className, cellVariant = "default", intent = "default", ...props }, ref) => {
152
+ const size = useTableSize();
153
+ const typo = intent === "sideLabel" ? "typography-semibold-body-md" : "typography-regular-body-md";
154
+ return /* @__PURE__ */ jsx(
155
+ "td",
156
+ {
157
+ ref,
158
+ className: cn(
159
+ typo,
160
+ "align-middle text-content-primary",
161
+ CELL_VARIANT_CLASSES[cellVariant],
162
+ CELL_MIN_HEIGHT[size],
163
+ CELL_INTENT_CLASSES[intent],
164
+ className
165
+ ),
166
+ ...props
167
+ }
168
+ );
169
+ }
170
+ );
171
+ TableCell.displayName = "TableCell";
172
+ const TableCellGroup = React.forwardRef(
173
+ ({ className, ...props }, ref) => {
174
+ return /* @__PURE__ */ jsx("div", { ref, className: cn("flex items-center gap-2.5", className), ...props });
175
+ }
176
+ );
177
+ TableCellGroup.displayName = "TableCellGroup";
178
+ const TableMediaThumbnail = React.forwardRef(
179
+ ({ className, src, alt = "", blurred, align = "start", ...props }, ref) => {
180
+ const tableSize = useTableSize();
181
+ const frame = tableSize === "lg" ? "h-[62px] w-11 overflow-hidden rounded-xs bg-neutral-alphas-200" : "h-10 w-[29px] overflow-hidden rounded-xs bg-neutral-alphas-200";
182
+ return /* @__PURE__ */ jsx(
183
+ "div",
184
+ {
185
+ ref,
186
+ className: cn(
187
+ align === "center" && "flex w-16 shrink-0 justify-center",
188
+ align === "start" && "inline-flex shrink-0"
189
+ ),
190
+ children: /* @__PURE__ */ jsx("div", { className: cn(frame, blurred && "blur-[2px]", className), ...props, children: /* @__PURE__ */ jsx("img", { alt, className: "size-full object-cover", src }) })
191
+ }
192
+ );
193
+ }
194
+ );
195
+ TableMediaThumbnail.displayName = "TableMediaThumbnail";
196
+ const TableStatusDot = React.forwardRef(
197
+ ({ className, ...props }, ref) => {
198
+ return /* @__PURE__ */ jsx(
199
+ "div",
200
+ {
201
+ ref,
202
+ className: cn("size-2 shrink-0 rounded-full bg-info-content", className),
203
+ ...props
204
+ }
205
+ );
206
+ }
207
+ );
208
+ TableStatusDot.displayName = "TableStatusDot";
209
+ const TableProgressTrack = React.forwardRef(
210
+ ({ className, value = 0, "aria-label": ariaLabel = "Progress", ...props }, ref) => {
211
+ const width = Math.min(100, Math.max(0, value));
212
+ const rounded = Math.round(width);
213
+ return /* @__PURE__ */ jsx(
214
+ "div",
215
+ {
216
+ ref,
217
+ role: "progressbar",
218
+ "aria-valuenow": rounded,
219
+ "aria-valuemin": 0,
220
+ "aria-valuemax": 100,
221
+ "aria-label": ariaLabel,
222
+ className: cn(
223
+ "relative h-1 w-full overflow-hidden rounded-full bg-neutral-alphas-200",
224
+ className
225
+ ),
226
+ ...props,
227
+ children: /* @__PURE__ */ jsx(
228
+ "div",
229
+ {
230
+ className: "absolute top-0 left-0 h-1 rounded-full bg-buttons-primary",
231
+ style: { width: `${width}%` },
232
+ "aria-hidden": true
233
+ }
234
+ )
235
+ }
236
+ );
237
+ }
238
+ );
239
+ TableProgressTrack.displayName = "TableProgressTrack";
240
+ const TablePillProgressLayout = React.forwardRef(({ className, ...props }, ref) => {
241
+ return /* @__PURE__ */ jsx(
242
+ "div",
243
+ {
244
+ ref,
245
+ className: cn("flex min-w-[120px] flex-col items-center gap-3", className),
246
+ ...props
247
+ }
248
+ );
249
+ });
250
+ TablePillProgressLayout.displayName = "TablePillProgressLayout";
251
+ const TableSortLabel = React.forwardRef(
252
+ ({ className, children, ...props }, ref) => {
253
+ return /* @__PURE__ */ jsxs("span", { ref, className: cn("inline-flex items-center gap-2.5", className), ...props, children: [
254
+ /* @__PURE__ */ jsx("span", { className: "typography-semibold-body-sm", children }),
255
+ /* @__PURE__ */ jsx("span", { className: "text-content-secondary", "aria-hidden": true, children: "↕" })
256
+ ] });
257
+ }
258
+ );
259
+ TableSortLabel.displayName = "TableSortLabel";
260
+ function TableStackedText({ title, subtitle }) {
261
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
262
+ /* @__PURE__ */ jsx("span", { className: "typography-semibold-body-md", children: title }),
263
+ /* @__PURE__ */ jsx("span", { className: "typography-regular-body-sm text-content-secondary", children: subtitle })
264
+ ] });
265
+ }
266
+ TableStackedText.displayName = "TableStackedText";
267
+ const TableLineClamp = React.forwardRef(
268
+ ({ className, lines = 2, ...props }, ref) => {
269
+ return /* @__PURE__ */ jsx(
270
+ "div",
271
+ {
272
+ ref,
273
+ className: cn(
274
+ lines === 1 && "line-clamp-1",
275
+ lines === 2 && "line-clamp-2",
276
+ lines === 3 && "line-clamp-3",
277
+ className
278
+ ),
279
+ ...props
280
+ }
281
+ );
282
+ }
283
+ );
284
+ TableLineClamp.displayName = "TableLineClamp";
285
+ function TableRowsPerPageSelect(props) {
286
+ const { id, "aria-label": ariaLabel = "Rows per page" } = props;
287
+ return /* @__PURE__ */ jsx(
288
+ Select,
289
+ {
290
+ defaultValue: "10",
291
+ size: "32",
292
+ "aria-label": ariaLabel,
293
+ className: "w-[154px] [&_button]:rounded-xs [&_button]:border-transparent [&_button]:bg-transparent",
294
+ id,
295
+ children: /* @__PURE__ */ jsxs(SelectContent, { children: [
296
+ /* @__PURE__ */ jsx(SelectItem, { value: "10", children: "10 rows per page" }),
297
+ /* @__PURE__ */ jsx(SelectItem, { value: "25", children: "25 rows per page" }),
298
+ /* @__PURE__ */ jsx(SelectItem, { value: "50", children: "50 rows per page" })
299
+ ] })
300
+ }
301
+ );
302
+ }
303
+ export {
304
+ Table,
305
+ TableBody,
306
+ TableCard,
307
+ TableCell,
308
+ TableCellGroup,
309
+ TableFooter,
310
+ TableHead,
311
+ TableHeader,
312
+ TableLineClamp,
313
+ TableMediaThumbnail,
314
+ TablePillProgressLayout,
315
+ TableProgressTrack,
316
+ TableRow,
317
+ TableRowsPerPageSelect,
318
+ TableScrollArea,
319
+ TableSortLabel,
320
+ TableStackedText,
321
+ TableStatusDot,
322
+ TableToolbar
323
+ };
324
+ //# sourceMappingURL=Table.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table.mjs","sources":["../../../src/components/Table/Table.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { Select, SelectContent, SelectItem } from \"../Select/Select\";\n\n/** Row density for body cells — `md` (60px min height) or `lg` (80px). */\nexport type TableSize = \"md\" | \"lg\";\n\nexport interface TableCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Row density applied to {@link TableCell} descendants. @default \"md\" */\n size?: TableSize;\n}\n\nconst TableSizeContext = React.createContext<TableSize>(\"md\");\n\nfunction useTableSize(): TableSize {\n return React.useContext(TableSizeContext);\n}\n\n/**\n * Surface wrapper for data tables: rounded container, spacing, and size\n * context for {@link TableCell} descendants. Compose with {@link TableScrollArea},\n * {@link Table}, {@link TableHeader}, {@link TableBody}, {@link TableRow},\n * {@link TableHead}, and {@link TableCell}.\n *\n * @example\n * ```tsx\n * <TableCard size=\"md\">\n * <TableScrollArea>\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>Name</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>Jane Doe</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * </TableScrollArea>\n * </TableCard>\n * ```\n */\nexport const TableCard = React.forwardRef<HTMLDivElement, TableCardProps>(\n ({ className, size = \"md\", ...props }, ref) => {\n return (\n <TableSizeContext.Provider value={size}>\n <div\n ref={ref}\n className={cn(\n \"isolate flex flex-col gap-4 overflow-hidden rounded-md bg-bg-primary pb-4\",\n className,\n )}\n {...props}\n />\n </TableSizeContext.Provider>\n );\n },\n);\nTableCard.displayName = \"TableCard\";\n\nexport interface TableToolbarProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Optional toolbar row above the table (e.g. bulk selection actions).\n */\nexport const TableToolbar = React.forwardRef<HTMLDivElement, TableToolbarProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-wrap items-center gap-4 rounded-t-md bg-bg-primary px-6\",\n className,\n )}\n {...props}\n />\n );\n },\n);\nTableToolbar.displayName = \"TableToolbar\";\n\nexport interface TableScrollAreaProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Rounds the top of the table block to match {@link TableCard}. Set `false` when {@link TableToolbar} is above this scroll area. @default true */\n roundTop?: boolean;\n}\n\n/**\n * Horizontal scroll container for wide tables. Uses an inner scrollport so the\n * table respects the card radius (plain `overflow-x-auto` on the table\n * wrapper often loses rounded corners with `border-collapse`).\n */\nexport const TableScrollArea = React.forwardRef<HTMLDivElement, TableScrollAreaProps>(\n ({ className, roundTop = true, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"relative w-full min-w-0 overflow-hidden\",\n roundTop && \"rounded-t-md\",\n className,\n )}\n {...props}\n >\n <div className=\"overflow-x-auto\">{children}</div>\n </div>\n );\n },\n);\nTableScrollArea.displayName = \"TableScrollArea\";\n\nexport interface TableProps extends React.TableHTMLAttributes<HTMLTableElement> {}\n\n/**\n * Semantic `<table>` element. Place inside {@link TableScrollArea}.\n */\nexport const Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, ...props }, ref) => {\n return (\n <table\n ref={ref}\n className={cn(\n \"w-full caption-bottom border-separate border-spacing-0 text-left\",\n className,\n )}\n {...props}\n />\n );\n },\n);\nTable.displayName = \"Table\";\n\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {}\n\nexport const TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => {\n return (\n <thead\n ref={ref}\n className={cn(\n \"[&_tr:first-child_th:first-child]:rounded-tl-md [&_tr:first-child_th:last-child]:rounded-tr-md\",\n className,\n )}\n {...props}\n />\n );\n },\n);\nTableHeader.displayName = \"TableHeader\";\n\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {}\n\nexport const TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => {\n return <tbody ref={ref} className={cn(className)} {...props} />;\n },\n);\nTableBody.displayName = \"TableBody\";\n\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {}\n\nexport const TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => {\n return <tfoot ref={ref} className={cn(className)} {...props} />;\n },\n);\nTableFooter.displayName = \"TableFooter\";\n\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {}\n\nexport const TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, ...props }, ref) => {\n return <tr ref={ref} className={cn(className)} {...props} />;\n },\n);\nTableRow.displayName = \"TableRow\";\n\n/** Column layout preset for {@link TableHead}. */\nexport type TableHeadIntent = \"default\" | \"checkbox\" | \"sort\" | \"leading\";\n\nconst HEAD_INTENT_CLASSES: Record<TableHeadIntent, string> = {\n default: \"text-left\",\n checkbox: \"w-8 min-w-8 max-w-8 text-center\",\n sort: \"text-right\",\n leading: \"min-w-0 w-2/5 text-left\",\n};\n\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n /** Layout preset for common column types. @default \"default\" */\n intent?: TableHeadIntent;\n}\n\nexport const TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, intent = \"default\", scope = \"col\", ...props }, ref) => {\n return (\n <th\n ref={ref}\n scope={scope}\n className={cn(\n \"typography-semibold-body-sm box-border h-8 min-h-8 bg-surface-secondary px-2 py-2 align-middle text-content-primary\",\n HEAD_INTENT_CLASSES[intent],\n className,\n )}\n {...props}\n />\n );\n },\n);\nTableHead.displayName = \"TableHead\";\n\nconst CELL_MIN_HEIGHT: Record<TableSize, string> = {\n md: \"min-h-[60px]\",\n lg: \"min-h-[80px]\",\n};\n\n/** Bottom border and padding preset for body cells (Figma table cell component). */\nexport type TableCellVariant = \"default\" | \"chip\" | \"pillProgress\";\n\nconst CELL_VARIANT_CLASSES: Record<TableCellVariant, string> = {\n default: \"border-border-primary border-b px-2 py-2\",\n chip: \"border-border-primary border-b px-2 py-2\",\n pillProgress: \"border-border-primary border-b px-4 py-2\",\n};\n\n/** Layout / typography preset for {@link TableCell} (orthogonal to {@link TableCellVariant}). */\nexport type TableCellIntent = \"default\" | \"checkbox\" | \"stacked\" | \"multiline\" | \"sideLabel\";\n\nconst CELL_INTENT_CLASSES: Record<TableCellIntent, string> = {\n default: \"\",\n checkbox: \"text-center\",\n stacked: \"align-top\",\n multiline: \"max-w-[240px]\",\n sideLabel: \"\",\n};\n\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n /** `pillProgress` uses wider horizontal padding; row dividers match the default weight for visibility. @default \"default\" */\n cellVariant?: TableCellVariant;\n /** Alignment and typography preset for common cell types. @default \"default\" */\n intent?: TableCellIntent;\n}\n\nexport const TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, cellVariant = \"default\", intent = \"default\", ...props }, ref) => {\n const size = useTableSize();\n const typo =\n intent === \"sideLabel\" ? \"typography-semibold-body-md\" : \"typography-regular-body-md\";\n return (\n <td\n ref={ref}\n className={cn(\n typo,\n \"align-middle text-content-primary\",\n CELL_VARIANT_CLASSES[cellVariant],\n CELL_MIN_HEIGHT[size],\n CELL_INTENT_CLASSES[intent],\n className,\n )}\n {...props}\n />\n );\n },\n);\nTableCell.displayName = \"TableCell\";\n\nexport interface TableCellGroupProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Horizontal group for icons, chips, and metadata inside a {@link TableCell} (Figma `gap-[10px]`).\n */\nexport const TableCellGroup = React.forwardRef<HTMLDivElement, TableCellGroupProps>(\n ({ className, ...props }, ref) => {\n return <div ref={ref} className={cn(\"flex items-center gap-2.5\", className)} {...props} />;\n },\n);\nTableCellGroup.displayName = \"TableCellGroup\";\n\nexport interface TableMediaThumbnailProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Image URL. */\n src: string;\n /** Alt text for the image. @default \"\" */\n alt?: string;\n /** Applies the table’s blurred-media treatment. @default false */\n blurred?: boolean;\n /** `center` uses the fixed media column width from the lg spec. @default \"start\" */\n align?: \"start\" | \"center\";\n}\n\n/**\n * Rounded thumbnail sized from {@link TableCard} `size` (`md` vs `lg`).\n */\nexport const TableMediaThumbnail = React.forwardRef<HTMLDivElement, TableMediaThumbnailProps>(\n ({ className, src, alt = \"\", blurred, align = \"start\", ...props }, ref) => {\n const tableSize = useTableSize();\n const frame =\n tableSize === \"lg\"\n ? \"h-[62px] w-11 overflow-hidden rounded-xs bg-neutral-alphas-200\"\n : \"h-10 w-[29px] overflow-hidden rounded-xs bg-neutral-alphas-200\";\n return (\n <div\n ref={ref}\n className={cn(\n align === \"center\" && \"flex w-16 shrink-0 justify-center\",\n align === \"start\" && \"inline-flex shrink-0\",\n )}\n >\n <div className={cn(frame, blurred && \"blur-[2px]\", className)} {...props}>\n <img alt={alt} className=\"size-full object-cover\" src={src} />\n </div>\n </div>\n );\n },\n);\nTableMediaThumbnail.displayName = \"TableMediaThumbnail\";\n\nexport interface TableStatusDotProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Small status indicator dot for table cells (Figma status column).\n */\nexport const TableStatusDot = React.forwardRef<HTMLDivElement, TableStatusDotProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"size-2 shrink-0 rounded-full bg-info-content\", className)}\n {...props}\n />\n );\n },\n);\nTableStatusDot.displayName = \"TableStatusDot\";\n\nexport interface TableProgressTrackProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Fill width from 0–100. @default 0 */\n value?: number;\n}\n\n/**\n * Thin progress track used with badges in table cells (Figma pill + progress).\n * Renders with `role=\"progressbar\"` and a default `aria-label` of `\"Progress\"`.\n */\nexport const TableProgressTrack = React.forwardRef<HTMLDivElement, TableProgressTrackProps>(\n ({ className, value = 0, \"aria-label\": ariaLabel = \"Progress\", ...props }, ref) => {\n const width = Math.min(100, Math.max(0, value));\n const rounded = Math.round(width);\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuenow={rounded}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={ariaLabel}\n className={cn(\n \"relative h-1 w-full overflow-hidden rounded-full bg-neutral-alphas-200\",\n className,\n )}\n {...props}\n >\n <div\n className=\"absolute top-0 left-0 h-1 rounded-full bg-buttons-primary\"\n style={{ width: `${width}%` }}\n aria-hidden\n />\n </div>\n );\n },\n);\nTableProgressTrack.displayName = \"TableProgressTrack\";\n\nexport interface TablePillProgressLayoutProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Vertical layout for pill label + {@link TableProgressTrack} in a cell.\n */\nexport const TablePillProgressLayout = React.forwardRef<\n HTMLDivElement,\n TablePillProgressLayoutProps\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"flex min-w-[120px] flex-col items-center gap-3\", className)}\n {...props}\n />\n );\n});\nTablePillProgressLayout.displayName = \"TablePillProgressLayout\";\n\nexport interface TableSortLabelProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactNode;\n}\n\n/**\n * Sortable column label with caption typography and a sort affordance.\n */\nexport const TableSortLabel = React.forwardRef<HTMLSpanElement, TableSortLabelProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <span ref={ref} className={cn(\"inline-flex items-center gap-2.5\", className)} {...props}>\n <span className=\"typography-semibold-body-sm\">{children}</span>\n <span className=\"text-content-secondary\" aria-hidden>\n ↕\n </span>\n </span>\n );\n },\n);\nTableSortLabel.displayName = \"TableSortLabel\";\n\nexport interface TableStackedTextProps {\n /** Primary line (semibold body). */\n title: React.ReactNode;\n /** Secondary line (caption, muted). */\n subtitle: React.ReactNode;\n}\n\n/**\n * Two-line primary + secondary text block for “cell + info” patterns.\n */\nexport function TableStackedText({ title, subtitle }: TableStackedTextProps) {\n return (\n <div className=\"flex flex-col gap-1\">\n <span className=\"typography-semibold-body-md\">{title}</span>\n <span className=\"typography-regular-body-sm text-content-secondary\">{subtitle}</span>\n </div>\n );\n}\n\nTableStackedText.displayName = \"TableStackedText\";\n\nexport interface TableLineClampProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Number of lines before ellipsis. @default 2 */\n lines?: 1 | 2 | 3;\n}\n\n/**\n * Clamps child text to a fixed number of lines inside a {@link TableCell}.\n */\nexport const TableLineClamp = React.forwardRef<HTMLDivElement, TableLineClampProps>(\n ({ className, lines = 2, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n lines === 1 && \"line-clamp-1\",\n lines === 2 && \"line-clamp-2\",\n lines === 3 && \"line-clamp-3\",\n className,\n )}\n {...props}\n />\n );\n },\n);\nTableLineClamp.displayName = \"TableLineClamp\";\n\nexport interface TableRowsPerPageSelectProps {\n /** Passed to the trigger for forms and labels. */\n id?: string;\n /** Accessible name for the trigger when no visible label. @default \"Rows per page\" */\n \"aria-label\"?: string;\n}\n\n/**\n * Rows-per-page {@link Select} styled for {@link TablePagination} (Figma field).\n */\nexport function TableRowsPerPageSelect(props: TableRowsPerPageSelectProps) {\n const { id, \"aria-label\": ariaLabel = \"Rows per page\" } = props;\n return (\n <Select\n defaultValue=\"10\"\n size=\"32\"\n aria-label={ariaLabel}\n className=\"w-[154px] [&_button]:rounded-xs [&_button]:border-transparent [&_button]:bg-transparent\"\n id={id}\n >\n <SelectContent>\n <SelectItem value=\"10\">10 rows per page</SelectItem>\n <SelectItem value=\"25\">25 rows per page</SelectItem>\n <SelectItem value=\"50\">50 rows per page</SelectItem>\n </SelectContent>\n </Select>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ "use client";
2
+ import { jsxs, jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../../utils/cn.mjs";
5
+ const TablePagination = React.forwardRef(
6
+ ({ className, layout = "desktop", leadingSlot, paginationSlot, summary, ...props }, ref) => {
7
+ if (layout === "mobile") {
8
+ return /* @__PURE__ */ jsxs(
9
+ "div",
10
+ {
11
+ ref,
12
+ className: cn("flex w-full max-w-full flex-col gap-3 px-4", className),
13
+ ...props,
14
+ children: [
15
+ /* @__PURE__ */ jsxs("div", { className: "flex w-full items-center gap-2.5", children: [
16
+ leadingSlot != null ? /* @__PURE__ */ jsx("div", { className: "flex min-w-0 shrink-0 items-center rounded-xs bg-surface-secondary", children: leadingSlot }) : null,
17
+ /* @__PURE__ */ jsx(
18
+ "div",
19
+ {
20
+ className: cn(
21
+ "typography-regular-body-md min-w-0 flex-1 text-content-secondary",
22
+ leadingSlot == null && "text-left",
23
+ leadingSlot != null && "text-right"
24
+ ),
25
+ children: summary
26
+ }
27
+ )
28
+ ] }),
29
+ paginationSlot != null ? /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: paginationSlot }) : null
30
+ ]
31
+ }
32
+ );
33
+ }
34
+ return /* @__PURE__ */ jsxs(
35
+ "div",
36
+ {
37
+ ref,
38
+ className: cn("flex w-full flex-wrap items-center gap-3 px-4", className),
39
+ ...props,
40
+ children: [
41
+ /* @__PURE__ */ jsx("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col items-start justify-center", children: leadingSlot != null ? /* @__PURE__ */ jsx("div", { className: "inline-flex min-w-0 rounded-xs bg-surface-secondary", children: leadingSlot }) : null }),
42
+ paginationSlot != null ? /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center justify-center", children: paginationSlot }) : null,
43
+ /* @__PURE__ */ jsx("div", { className: "typography-regular-body-md min-w-0 flex-1 text-right text-content-secondary", children: summary })
44
+ ]
45
+ }
46
+ );
47
+ }
48
+ );
49
+ TablePagination.displayName = "TablePagination";
50
+ export {
51
+ TablePagination
52
+ };
53
+ //# sourceMappingURL=TablePagination.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TablePagination.mjs","sources":["../../../src/components/Table/TablePagination.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/utils/cn\";\n\n/** Layout preset for the pagination bar — desktop (range on the right) or stacked mobile. */\nexport type TablePaginationLayout = \"desktop\" | \"mobile\";\n\nexport interface TablePaginationProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Layout preset. @default \"desktop\" */\n layout?: TablePaginationLayout;\n /** Left (desktop) or top row (mobile) content, e.g. rows-per-page {@link Select}. */\n leadingSlot?: React.ReactNode;\n /** Center (desktop) or bottom row (mobile) content, e.g. {@link Pagination}. */\n paginationSlot?: React.ReactNode;\n /** Summary text or node (e.g. current range and total). */\n summary: React.ReactNode;\n}\n\n/**\n * Footer bar for data tables: rows-per-page control, page navigation, and range\n * summary. Pair `paginationSlot` with {@link Pagination} for numbered controls.\n *\n * @example\n * ```tsx\n * <TablePagination\n * leadingSlot={<Select size=\"32\" aria-label=\"Rows per page\">…</Select>}\n * paginationSlot={<Pagination totalPages={5} currentPage={2} onPageChange={setPage} />}\n * summary=\"20–30 of 100 rows\"\n * />\n * ```\n */\nexport const TablePagination = React.forwardRef<HTMLDivElement, TablePaginationProps>(\n ({ className, layout = \"desktop\", leadingSlot, paginationSlot, summary, ...props }, ref) => {\n if (layout === \"mobile\") {\n return (\n <div\n ref={ref}\n className={cn(\"flex w-full max-w-full flex-col gap-3 px-4\", className)}\n {...props}\n >\n <div className=\"flex w-full items-center gap-2.5\">\n {leadingSlot != null ? (\n <div className=\"flex min-w-0 shrink-0 items-center rounded-xs bg-surface-secondary\">\n {leadingSlot}\n </div>\n ) : null}\n <div\n className={cn(\n \"typography-regular-body-md min-w-0 flex-1 text-content-secondary\",\n leadingSlot == null && \"text-left\",\n leadingSlot != null && \"text-right\",\n )}\n >\n {summary}\n </div>\n </div>\n {paginationSlot != null ? (\n <div className=\"flex justify-center\">{paginationSlot}</div>\n ) : null}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n className={cn(\"flex w-full flex-wrap items-center gap-3 px-4\", className)}\n {...props}\n >\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col items-start justify-center\">\n {leadingSlot != null ? (\n <div className=\"inline-flex min-w-0 rounded-xs bg-surface-secondary\">{leadingSlot}</div>\n ) : null}\n </div>\n {paginationSlot != null ? (\n <div className=\"flex shrink-0 items-center justify-center\">{paginationSlot}</div>\n ) : null}\n <div className=\"typography-regular-body-md min-w-0 flex-1 text-right text-content-secondary\">\n {summary}\n </div>\n </div>\n );\n },\n);\nTablePagination.displayName = \"TablePagination\";\n"],"names":[],"mappings":";;;;AA8BO,MAAM,kBAAkB,MAAM;AAAA,EACnC,CAAC,EAAE,WAAW,SAAS,WAAW,aAAa,gBAAgB,SAAS,GAAG,MAAA,GAAS,QAAQ;AAC1F,QAAI,WAAW,UAAU;AACvB,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,WAAW,GAAG,8CAA8C,SAAS;AAAA,UACpE,GAAG;AAAA,UAEJ,UAAA;AAAA,YAAA,qBAAC,OAAA,EAAI,WAAU,oCACZ,UAAA;AAAA,cAAA,eAAe,OACd,oBAAC,OAAA,EAAI,WAAU,sEACZ,uBACH,IACE;AAAA,cACJ;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,eAAe,QAAQ;AAAA,oBACvB,eAAe,QAAQ;AAAA,kBAAA;AAAA,kBAGxB,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH,GACF;AAAA,YACC,kBAAkB,OACjB,oBAAC,SAAI,WAAU,uBAAuB,0BAAe,IACnD;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAGV;AAEA,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,iDAAiD,SAAS;AAAA,QACvE,GAAG;AAAA,QAEJ,UAAA;AAAA,UAAA,oBAAC,OAAA,EAAI,WAAU,mEACZ,UAAA,eAAe,OACd,oBAAC,OAAA,EAAI,WAAU,uDAAuD,UAAA,YAAA,CAAY,IAChF,MACN;AAAA,UACC,kBAAkB,OACjB,oBAAC,SAAI,WAAU,6CAA6C,0BAAe,IACzE;AAAA,UACJ,oBAAC,OAAA,EAAI,WAAU,+EACZ,UAAA,QAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AACA,gBAAgB,cAAc;"}