@7onic-ui/react 0.3.9 → 0.3.10

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 (167) hide show
  1. package/README.md +2 -2
  2. package/dist/chart.mjs +3 -9
  3. package/dist/chart.mjs.map +1 -1
  4. package/dist/chunk-234NAXGV.mjs +252 -0
  5. package/dist/chunk-234NAXGV.mjs.map +1 -0
  6. package/dist/chunk-53MIUPSY.mjs +13 -0
  7. package/dist/chunk-53MIUPSY.mjs.map +1 -0
  8. package/dist/chunk-BN5BEA3V.mjs +195 -0
  9. package/dist/chunk-BN5BEA3V.mjs.map +1 -0
  10. package/dist/chunk-COW3B62M.mjs +214 -0
  11. package/dist/chunk-COW3B62M.mjs.map +1 -0
  12. package/dist/chunk-CTH6SN5Y.mjs +114 -0
  13. package/dist/chunk-CTH6SN5Y.mjs.map +1 -0
  14. package/dist/chunk-D3NTQNDW.mjs +440 -0
  15. package/dist/chunk-D3NTQNDW.mjs.map +1 -0
  16. package/dist/chunk-DDRYEJBJ.mjs +164 -0
  17. package/dist/chunk-DDRYEJBJ.mjs.map +1 -0
  18. package/dist/chunk-DJAEXCRU.mjs +190 -0
  19. package/dist/chunk-DJAEXCRU.mjs.map +1 -0
  20. package/dist/chunk-DRVHHEAY.mjs +145 -0
  21. package/dist/chunk-DRVHHEAY.mjs.map +1 -0
  22. package/dist/chunk-DTLNWOTR.mjs +482 -0
  23. package/dist/chunk-DTLNWOTR.mjs.map +1 -0
  24. package/dist/chunk-DYYQOHQR.mjs +214 -0
  25. package/dist/chunk-DYYQOHQR.mjs.map +1 -0
  26. package/dist/chunk-FHUAH6AJ.mjs +93 -0
  27. package/dist/chunk-FHUAH6AJ.mjs.map +1 -0
  28. package/dist/chunk-GD4YE5AE.mjs +209 -0
  29. package/dist/chunk-GD4YE5AE.mjs.map +1 -0
  30. package/dist/chunk-GRCJ35DX.mjs +144 -0
  31. package/dist/chunk-GRCJ35DX.mjs.map +1 -0
  32. package/dist/chunk-HHX4GABH.mjs +129 -0
  33. package/dist/chunk-HHX4GABH.mjs.map +1 -0
  34. package/dist/chunk-IPCIC2BI.mjs +148 -0
  35. package/dist/chunk-IPCIC2BI.mjs.map +1 -0
  36. package/dist/chunk-IY3R2VGB.mjs +272 -0
  37. package/dist/chunk-IY3R2VGB.mjs.map +1 -0
  38. package/dist/chunk-JCJEVXER.mjs +170 -0
  39. package/dist/chunk-JCJEVXER.mjs.map +1 -0
  40. package/dist/chunk-KBPYAMGS.mjs +157 -0
  41. package/dist/chunk-KBPYAMGS.mjs.map +1 -0
  42. package/dist/chunk-LJJ6K4IU.mjs +318 -0
  43. package/dist/chunk-LJJ6K4IU.mjs.map +1 -0
  44. package/dist/chunk-MRUVGHGP.mjs +375 -0
  45. package/dist/chunk-MRUVGHGP.mjs.map +1 -0
  46. package/dist/chunk-N4K2BDGM.mjs +153 -0
  47. package/dist/chunk-N4K2BDGM.mjs.map +1 -0
  48. package/dist/chunk-NWFMJWGX.mjs +165 -0
  49. package/dist/chunk-NWFMJWGX.mjs.map +1 -0
  50. package/dist/chunk-PTAPPOKU.mjs +117 -0
  51. package/dist/chunk-PTAPPOKU.mjs.map +1 -0
  52. package/dist/chunk-PVTBM7V7.mjs +316 -0
  53. package/dist/chunk-PVTBM7V7.mjs.map +1 -0
  54. package/dist/chunk-Q5WVLK2L.mjs +77 -0
  55. package/dist/chunk-Q5WVLK2L.mjs.map +1 -0
  56. package/dist/chunk-RKSB2N5L.mjs +206 -0
  57. package/dist/chunk-RKSB2N5L.mjs.map +1 -0
  58. package/dist/chunk-S4DGVKBK.mjs +151 -0
  59. package/dist/chunk-S4DGVKBK.mjs.map +1 -0
  60. package/dist/chunk-S4T4PU7F.mjs +114 -0
  61. package/dist/chunk-S4T4PU7F.mjs.map +1 -0
  62. package/dist/chunk-SZPZOGPC.mjs +394 -0
  63. package/dist/chunk-SZPZOGPC.mjs.map +1 -0
  64. package/dist/chunk-T546XBQG.mjs +443 -0
  65. package/dist/chunk-T546XBQG.mjs.map +1 -0
  66. package/dist/chunk-UWTT5AE6.mjs +145 -0
  67. package/dist/chunk-UWTT5AE6.mjs.map +1 -0
  68. package/dist/chunk-V5UFWYFI.mjs +255 -0
  69. package/dist/chunk-V5UFWYFI.mjs.map +1 -0
  70. package/dist/chunk-VUPGBB5X.mjs +150 -0
  71. package/dist/chunk-VUPGBB5X.mjs.map +1 -0
  72. package/dist/chunk-W6YNEU53.mjs +175 -0
  73. package/dist/chunk-W6YNEU53.mjs.map +1 -0
  74. package/dist/chunk-WWSN5YME.mjs +222 -0
  75. package/dist/chunk-WWSN5YME.mjs.map +1 -0
  76. package/dist/chunk-XK52LYR4.mjs +182 -0
  77. package/dist/chunk-XK52LYR4.mjs.map +1 -0
  78. package/dist/chunk-YIAH6KHV.mjs +164 -0
  79. package/dist/chunk-YIAH6KHV.mjs.map +1 -0
  80. package/dist/chunk-Z6JWWCNL.mjs +108 -0
  81. package/dist/chunk-Z6JWWCNL.mjs.map +1 -0
  82. package/dist/chunk-ZDRUTJ4T.mjs +119 -0
  83. package/dist/chunk-ZDRUTJ4T.mjs.map +1 -0
  84. package/dist/components/accordion.mjs +19 -0
  85. package/dist/components/accordion.mjs.map +1 -0
  86. package/dist/components/alert.mjs +15 -0
  87. package/dist/components/alert.mjs.map +1 -0
  88. package/dist/components/avatar.mjs +23 -0
  89. package/dist/components/avatar.mjs.map +1 -0
  90. package/dist/components/badge.mjs +11 -0
  91. package/dist/components/badge.mjs.map +1 -0
  92. package/dist/components/breadcrumb.mjs +23 -0
  93. package/dist/components/breadcrumb.mjs.map +1 -0
  94. package/dist/components/button-group.mjs +11 -0
  95. package/dist/components/button-group.mjs.map +1 -0
  96. package/dist/components/button.mjs +12 -0
  97. package/dist/components/button.mjs.map +1 -0
  98. package/dist/components/card.mjs +25 -0
  99. package/dist/components/card.mjs.map +1 -0
  100. package/dist/components/chat-input.mjs +15 -0
  101. package/dist/components/chat-input.mjs.map +1 -0
  102. package/dist/components/chat-message.mjs +17 -0
  103. package/dist/components/chat-message.mjs.map +1 -0
  104. package/dist/components/checkbox.mjs +12 -0
  105. package/dist/components/checkbox.mjs.map +1 -0
  106. package/dist/components/divider.mjs +11 -0
  107. package/dist/components/divider.mjs.map +1 -0
  108. package/dist/components/drawer.mjs +33 -0
  109. package/dist/components/drawer.mjs.map +1 -0
  110. package/dist/components/dropdown.mjs +35 -0
  111. package/dist/components/dropdown.mjs.map +1 -0
  112. package/dist/components/field.mjs +17 -0
  113. package/dist/components/field.mjs.map +1 -0
  114. package/dist/components/icon-button.mjs +12 -0
  115. package/dist/components/icon-button.mjs.map +1 -0
  116. package/dist/components/input.mjs +12 -0
  117. package/dist/components/input.mjs.map +1 -0
  118. package/dist/components/metric-card.mjs +23 -0
  119. package/dist/components/metric-card.mjs.map +1 -0
  120. package/dist/components/modal.mjs +57 -0
  121. package/dist/components/modal.mjs.map +1 -0
  122. package/dist/components/navigation-menu.mjs +27 -0
  123. package/dist/components/navigation-menu.mjs.map +1 -0
  124. package/dist/components/pagination.mjs +33 -0
  125. package/dist/components/pagination.mjs.map +1 -0
  126. package/dist/components/popover.mjs +23 -0
  127. package/dist/components/popover.mjs.map +1 -0
  128. package/dist/components/progress.mjs +11 -0
  129. package/dist/components/progress.mjs.map +1 -0
  130. package/dist/components/quick-reply.mjs +15 -0
  131. package/dist/components/quick-reply.mjs.map +1 -0
  132. package/dist/components/radio-group.mjs +16 -0
  133. package/dist/components/radio-group.mjs.map +1 -0
  134. package/dist/components/segmented.mjs +15 -0
  135. package/dist/components/segmented.mjs.map +1 -0
  136. package/dist/components/select.mjs +23 -0
  137. package/dist/components/select.mjs.map +1 -0
  138. package/dist/components/skeleton.mjs +11 -0
  139. package/dist/components/skeleton.mjs.map +1 -0
  140. package/dist/components/slider.mjs +11 -0
  141. package/dist/components/slider.mjs.map +1 -0
  142. package/dist/components/spinner.mjs +11 -0
  143. package/dist/components/spinner.mjs.map +1 -0
  144. package/dist/components/switch.mjs +12 -0
  145. package/dist/components/switch.mjs.map +1 -0
  146. package/dist/components/table.mjs +23 -0
  147. package/dist/components/table.mjs.map +1 -0
  148. package/dist/components/tabs.mjs +19 -0
  149. package/dist/components/tabs.mjs.map +1 -0
  150. package/dist/components/textarea.mjs +12 -0
  151. package/dist/components/textarea.mjs.map +1 -0
  152. package/dist/components/toast.mjs +13 -0
  153. package/dist/components/toast.mjs.map +1 -0
  154. package/dist/components/toggle-group.mjs +15 -0
  155. package/dist/components/toggle-group.mjs.map +1 -0
  156. package/dist/components/toggle.mjs +11 -0
  157. package/dist/components/toggle.mjs.map +1 -0
  158. package/dist/components/tooltip.mjs +21 -0
  159. package/dist/components/tooltip.mjs.map +1 -0
  160. package/dist/components/typing-indicator.mjs +11 -0
  161. package/dist/components/typing-indicator.mjs.map +1 -0
  162. package/dist/index.mjs +296 -7536
  163. package/dist/index.mjs.map +1 -1
  164. package/llms.txt +23 -23
  165. package/package.json +4 -3
  166. package/dist/chart.d.mts +0 -147
  167. package/dist/index.d.mts +0 -1535
@@ -0,0 +1,195 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-53MIUPSY.mjs";
5
+
6
+ // src/components/ui/table.tsx
7
+ import * as React from "react";
8
+ import { cva } from "class-variance-authority";
9
+ var TableContext = React.createContext({ size: "default", variant: "default", stickyHeader: false });
10
+ var cellPaddingMap = {
11
+ sm: "px-3 py-2 text-sm",
12
+ default: "px-4 py-3 text-sm",
13
+ lg: "px-6 py-4 text-base"
14
+ };
15
+ var headPaddingMap = {
16
+ sm: "px-3 py-2 text-xs",
17
+ default: "px-4 py-3 text-xs",
18
+ lg: "px-6 py-3.5 text-sm"
19
+ };
20
+ var checkboxPaddingMap = {
21
+ sm: "[&:has([role=checkbox])]:pl-1 [&:has([role=checkbox])]:pr-0",
22
+ default: "[&:has([role=checkbox])]:pl-2 [&:has([role=checkbox])]:pr-0",
23
+ lg: "[&:has([role=checkbox])]:pl-3 [&:has([role=checkbox])]:pr-0"
24
+ };
25
+ var tableVariants = cva(
26
+ "w-full caption-bottom text-sm",
27
+ {
28
+ variants: {
29
+ variant: {
30
+ default: "",
31
+ bordered: "border border-border",
32
+ striped: ""
33
+ }
34
+ },
35
+ defaultVariants: {
36
+ variant: "default"
37
+ }
38
+ }
39
+ );
40
+ var Table = React.forwardRef(
41
+ ({ className, size = "default", variant = "default", stickyHeader = false, wrapperClassName, ...props }, ref) => /* @__PURE__ */ React.createElement(TableContext.Provider, { value: { size, variant, stickyHeader } }, /* @__PURE__ */ React.createElement("div", { className: cn("relative w-full overflow-auto", wrapperClassName) }, /* @__PURE__ */ React.createElement(
42
+ "table",
43
+ {
44
+ ref,
45
+ className: cn(tableVariants({ variant }), className),
46
+ ...props
47
+ }
48
+ )))
49
+ );
50
+ Table.displayName = "Table";
51
+ var TableHeader = React.forwardRef(({ className, ...props }, ref) => {
52
+ const { stickyHeader } = React.useContext(TableContext);
53
+ return /* @__PURE__ */ React.createElement(
54
+ "thead",
55
+ {
56
+ ref,
57
+ className: cn(
58
+ "[&_tr]:border-b [&_tr]:border-border",
59
+ stickyHeader && "sticky top-0 z-10 bg-background",
60
+ className
61
+ ),
62
+ ...props
63
+ }
64
+ );
65
+ });
66
+ TableHeader.displayName = "TableHeader";
67
+ var TableBody = React.forwardRef(({ className, ...props }, ref) => {
68
+ const { variant } = React.useContext(TableContext);
69
+ return /* @__PURE__ */ React.createElement(
70
+ "tbody",
71
+ {
72
+ ref,
73
+ className: cn(
74
+ "[&_tr:last-child]:border-b-0",
75
+ variant === "striped" && "[&_tr:nth-child(even)]:bg-background-muted",
76
+ className
77
+ ),
78
+ ...props
79
+ }
80
+ );
81
+ });
82
+ TableBody.displayName = "TableBody";
83
+ var TableFooter = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
84
+ "tfoot",
85
+ {
86
+ ref,
87
+ className: cn(
88
+ "border-t border-border bg-background-muted/50 font-normal [&>tr]:last:border-b-0",
89
+ className
90
+ ),
91
+ ...props
92
+ }
93
+ ));
94
+ TableFooter.displayName = "TableFooter";
95
+ var TableRow = React.forwardRef(
96
+ ({ className, interactive = false, selected = false, ...props }, ref) => /* @__PURE__ */ React.createElement(
97
+ "tr",
98
+ {
99
+ ref,
100
+ "data-selected": selected || void 0,
101
+ className: cn(
102
+ "border-b border-border transition-colors duration-fast",
103
+ interactive && "hover:bg-background-muted/50 cursor-pointer",
104
+ className
105
+ ),
106
+ ...props
107
+ }
108
+ )
109
+ );
110
+ TableRow.displayName = "TableRow";
111
+ var defaultSortIcons = {
112
+ asc: /* @__PURE__ */ React.createElement("svg", { className: "icon-xs", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 15l7-7 7 7" })),
113
+ desc: /* @__PURE__ */ React.createElement("svg", { className: "icon-xs", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })),
114
+ default: /* @__PURE__ */ React.createElement("svg", { className: "icon-xs", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4" }))
115
+ };
116
+ var TableHead = React.forwardRef(
117
+ ({ className, align = "left", sortable = false, sortDirection = null, onSort, sortIcon, children, ...props }, ref) => {
118
+ const { size } = React.useContext(TableContext);
119
+ const icons = { ...defaultSortIcons, ...sortIcon };
120
+ const content = sortable ? /* @__PURE__ */ React.createElement(
121
+ "button",
122
+ {
123
+ type: "button",
124
+ className: "inline-flex items-center gap-1.5 hover:text-foreground transition-colors duration-fast group",
125
+ onClick: onSort
126
+ },
127
+ children,
128
+ /* @__PURE__ */ React.createElement("span", { className: cn(
129
+ "shrink-0 transition-colors duration-fast",
130
+ sortDirection ? "text-foreground" : "text-text-muted"
131
+ ) }, sortDirection === "asc" ? icons.asc : sortDirection === "desc" ? icons.desc : icons.default)
132
+ ) : children;
133
+ return /* @__PURE__ */ React.createElement(
134
+ "th",
135
+ {
136
+ ref,
137
+ className: cn(
138
+ "text-left align-middle font-semibold text-text-muted whitespace-nowrap",
139
+ headPaddingMap[size],
140
+ checkboxPaddingMap[size],
141
+ align === "center" && "text-center",
142
+ align === "right" && "text-right",
143
+ sortable && "select-none",
144
+ className
145
+ ),
146
+ "aria-sort": sortDirection === "asc" ? "ascending" : sortDirection === "desc" ? "descending" : void 0,
147
+ ...props
148
+ },
149
+ content
150
+ );
151
+ }
152
+ );
153
+ TableHead.displayName = "TableHead";
154
+ var TableCell = React.forwardRef(
155
+ ({ className, align = "left", ...props }, ref) => {
156
+ const { size } = React.useContext(TableContext);
157
+ return /* @__PURE__ */ React.createElement(
158
+ "td",
159
+ {
160
+ ref,
161
+ className: cn(
162
+ "text-foreground align-middle",
163
+ cellPaddingMap[size],
164
+ checkboxPaddingMap[size],
165
+ align === "center" && "text-center",
166
+ align === "right" && "text-right",
167
+ className
168
+ ),
169
+ ...props
170
+ }
171
+ );
172
+ }
173
+ );
174
+ TableCell.displayName = "TableCell";
175
+ var TableCaption = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
176
+ "caption",
177
+ {
178
+ ref,
179
+ className: cn("mt-4 text-sm text-text-muted", className),
180
+ ...props
181
+ }
182
+ ));
183
+ TableCaption.displayName = "TableCaption";
184
+
185
+ export {
186
+ Table,
187
+ TableHeader,
188
+ TableBody,
189
+ TableFooter,
190
+ TableRow,
191
+ TableHead,
192
+ TableCell,
193
+ TableCaption
194
+ };
195
+ //# sourceMappingURL=chunk-BN5BEA3V.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/table.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n// Size variants for table density\ntype TableSize = 'sm' | 'default' | 'lg'\n\n// Visual style variants\ntype TableVariant = 'default' | 'bordered' | 'striped'\n\n// Root context — set at Root, consumed by children\nconst TableContext = React.createContext<{\n size: TableSize\n variant: TableVariant\n stickyHeader: boolean\n}>({ size: 'default', variant: 'default', stickyHeader: false })\n\n// Cell padding per size\nconst cellPaddingMap: Record<TableSize, string> = {\n sm: 'px-3 py-2 text-sm',\n default: 'px-4 py-3 text-sm',\n lg: 'px-6 py-4 text-base',\n}\n\n// Head cell padding per size\nconst headPaddingMap: Record<TableSize, string> = {\n sm: 'px-3 py-2 text-xs',\n default: 'px-4 py-3 text-xs',\n lg: 'px-6 py-3.5 text-sm',\n}\n\n// Checkbox column padding override per size (right padding removed — next column's left padding handles the gap)\nconst checkboxPaddingMap: Record<TableSize, string> = {\n sm: '[&:has([role=checkbox])]:pl-1 [&:has([role=checkbox])]:pr-0',\n default: '[&:has([role=checkbox])]:pl-2 [&:has([role=checkbox])]:pr-0',\n lg: '[&:has([role=checkbox])]:pl-3 [&:has([role=checkbox])]:pr-0',\n}\n\nconst tableVariants = cva(\n 'w-full caption-bottom text-sm',\n {\n variants: {\n variant: {\n default: '',\n bordered: 'border border-border',\n striped: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\n// ─── Root ────────────────────────────────────────────────────────\nexport interface TableProps\n extends React.HTMLAttributes<HTMLTableElement>,\n VariantProps<typeof tableVariants> {\n /** Table density */\n size?: TableSize\n /** Visual style */\n variant?: TableVariant\n /** Sticky header when scrolling */\n stickyHeader?: boolean\n /** Additional className for the scroll wrapper (e.g. max-h-[400px]) */\n wrapperClassName?: string\n}\n\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, size = 'default', variant = 'default', stickyHeader = false, wrapperClassName, ...props }, ref) => (\n <TableContext.Provider value={{ size, variant, stickyHeader }}>\n <div className={cn('relative w-full overflow-auto', wrapperClassName)}>\n <table\n ref={ref}\n className={cn(tableVariants({ variant }), className)}\n {...props}\n />\n </div>\n </TableContext.Provider>\n )\n)\nTable.displayName = 'Table'\n\n// ─── Header ──────────────────────────────────────────────────────\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => {\n const { stickyHeader } = React.useContext(TableContext)\n return (\n <thead\n ref={ref}\n className={cn(\n '[&_tr]:border-b [&_tr]:border-border',\n stickyHeader && 'sticky top-0 z-10 bg-background',\n className\n )}\n {...props}\n />\n )\n})\nTableHeader.displayName = 'TableHeader'\n\n// ─── Body ────────────────────────────────────────────────────────\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => {\n const { variant } = React.useContext(TableContext)\n return (\n <tbody\n ref={ref}\n className={cn(\n '[&_tr:last-child]:border-b-0',\n variant === 'striped' && '[&_tr:nth-child(even)]:bg-background-muted',\n className\n )}\n {...props}\n />\n )\n})\nTableBody.displayName = 'TableBody'\n\n// ─── Footer ──────────────────────────────────────────────────────\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n 'border-t border-border bg-background-muted/50 font-normal [&>tr]:last:border-b-0',\n className\n )}\n {...props}\n />\n))\nTableFooter.displayName = 'TableFooter'\n\n// ─── Row ─────────────────────────────────────────────────────────\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n /** Enable hover highlight */\n interactive?: boolean\n /** Selected state background */\n selected?: boolean\n}\n\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, interactive = false, selected = false, ...props }, ref) => (\n <tr\n ref={ref}\n data-selected={selected || undefined}\n className={cn(\n 'border-b border-border transition-colors duration-fast',\n interactive && 'hover:bg-background-muted/50 cursor-pointer',\n className\n )}\n {...props}\n />\n )\n)\nTableRow.displayName = 'TableRow'\n\n// ─── Head Cell ───────────────────────────────────────────────────\ntype SortDirection = 'asc' | 'desc' | null\n\n// Default sort icons\nconst defaultSortIcons = {\n asc: (\n <svg className=\"icon-xs\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 15l7-7 7 7\" />\n </svg>\n ),\n desc: (\n <svg className=\"icon-xs\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n ),\n default: (\n <svg className=\"icon-xs\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4\" />\n </svg>\n ),\n}\n\nexport interface SortIconSet {\n /** Icon for ascending state */\n asc?: React.ReactNode\n /** Icon for descending state */\n desc?: React.ReactNode\n /** Icon for unsorted (default) state */\n default?: React.ReactNode\n}\n\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n /** Text alignment */\n align?: 'left' | 'center' | 'right'\n /** Enable sort indicator */\n sortable?: boolean\n /** Current sort direction */\n sortDirection?: SortDirection\n /** Sort click handler */\n onSort?: () => void\n /** Custom sort icons (overrides built-in icons) */\n sortIcon?: SortIconSet\n}\n\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, align = 'left', sortable = false, sortDirection = null, onSort, sortIcon, children, ...props }, ref) => {\n const { size } = React.useContext(TableContext)\n const icons = { ...defaultSortIcons, ...sortIcon }\n\n const content = sortable ? (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 hover:text-foreground transition-colors duration-fast group\"\n onClick={onSort}\n >\n {children}\n <span className={cn(\n 'shrink-0 transition-colors duration-fast',\n sortDirection ? 'text-foreground' : 'text-text-muted'\n )}>\n {sortDirection === 'asc' ? icons.asc\n : sortDirection === 'desc' ? icons.desc\n : icons.default}\n </span>\n </button>\n ) : children\n\n return (\n <th\n ref={ref}\n className={cn(\n 'text-left align-middle font-semibold text-text-muted whitespace-nowrap',\n headPaddingMap[size],\n checkboxPaddingMap[size],\n align === 'center' && 'text-center',\n align === 'right' && 'text-right',\n sortable && 'select-none',\n className\n )}\n aria-sort={sortDirection === 'asc' ? 'ascending' : sortDirection === 'desc' ? 'descending' : undefined}\n {...props}\n >\n {content}\n </th>\n )\n }\n)\nTableHead.displayName = 'TableHead'\n\n// ─── Data Cell ───────────────────────────────────────────────────\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n /** Text alignment */\n align?: 'left' | 'center' | 'right'\n}\n\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, align = 'left', ...props }, ref) => {\n const { size } = React.useContext(TableContext)\n return (\n <td\n ref={ref}\n className={cn(\n 'text-foreground align-middle',\n cellPaddingMap[size],\n checkboxPaddingMap[size],\n align === 'center' && 'text-center',\n align === 'right' && 'text-right',\n className\n )}\n {...props}\n />\n )\n }\n)\nTableCell.displayName = 'TableCell'\n\n// ─── Caption ─────────────────────────────────────────────────────\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn('mt-4 text-sm text-text-muted', className)}\n {...props}\n />\n))\nTableCaption.displayName = 'TableCaption'\n\nexport type { TableSize, TableVariant, SortDirection }\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableRow,\n TableHead,\n TableCell,\n TableCaption,\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,214 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-53MIUPSY.mjs";
5
+
6
+ // src/components/ui/tabs.tsx
7
+ import * as React from "react";
8
+ import * as TabsPrimitive from "@radix-ui/react-tabs";
9
+ import { cva } from "class-variance-authority";
10
+ var TabsStyleContext = React.createContext({});
11
+ var useTabsStyleContext = () => React.useContext(TabsStyleContext);
12
+ var tabsListVariants = cva(
13
+ "inline-flex items-center text-text-subtle",
14
+ {
15
+ variants: {
16
+ variant: {
17
+ line: "border-b border-border bg-transparent gap-0",
18
+ enclosed: "border-b border-border bg-transparent gap-0",
19
+ pill: "bg-background-muted p-1 gap-1"
20
+ },
21
+ fitted: {
22
+ true: "w-full",
23
+ false: ""
24
+ }
25
+ },
26
+ defaultVariants: {
27
+ variant: "line",
28
+ fitted: false
29
+ }
30
+ }
31
+ );
32
+ var TabsList = React.forwardRef(({ className, variant, size, fitted, color, radius, ...props }, ref) => {
33
+ const resolvedVariant = variant || "line";
34
+ return /* @__PURE__ */ React.createElement(TabsStyleContext.Provider, { value: { variant: resolvedVariant, size: size || "default", fitted: fitted ?? false, color: color || "default", radius: radius || "md" } }, /* @__PURE__ */ React.createElement(
35
+ TabsPrimitive.List,
36
+ {
37
+ ref,
38
+ className: cn(
39
+ tabsListVariants({ variant, fitted }),
40
+ resolvedVariant === "pill" && pillListRadiusClasses[radius || "md"],
41
+ className
42
+ ),
43
+ ...props
44
+ }
45
+ ));
46
+ });
47
+ TabsList.displayName = "TabsList";
48
+ var tabsTriggerVariants = cva(
49
+ [
50
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap",
51
+ "transition-all duration-micro ease-out cursor-pointer",
52
+ // Keyboard-only focus ring: see pointer tracking in TabsTrigger
53
+ "[&:focus-visible:not([data-pointer-focus])]:focus-ring",
54
+ "disabled:pointer-events-none disabled:text-text-subtle disabled:opacity-50"
55
+ ].join(" "),
56
+ {
57
+ variants: {
58
+ variant: {
59
+ line: [
60
+ "border-b-2 border-transparent -mb-px",
61
+ "hover:text-foreground hover:border-border",
62
+ "data-[state=active]:text-foreground data-[state=active]:font-semibold"
63
+ ].join(" "),
64
+ enclosed: [
65
+ "border border-transparent -mb-px",
66
+ "hover:text-foreground",
67
+ "data-[state=active]:text-foreground data-[state=active]:font-semibold data-[state=active]:bg-background",
68
+ "data-[state=active]:border-border data-[state=active]:border-b-background"
69
+ ].join(" "),
70
+ pill: [
71
+ "hover:text-foreground",
72
+ "data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:font-semibold data-[state=active]:shadow-sm"
73
+ ].join(" ")
74
+ },
75
+ size: {
76
+ sm: "h-8 text-sm",
77
+ // 32px, 13px
78
+ md: "h-9 text-sm",
79
+ // 36px, 13px
80
+ default: "h-10 text-md",
81
+ // 40px, 14px
82
+ lg: "h-12 text-base"
83
+ // 48px, 16px
84
+ },
85
+ fitted: {
86
+ true: "flex-1",
87
+ false: ""
88
+ }
89
+ },
90
+ compoundVariants: [
91
+ // Padding per variant × size
92
+ { variant: "line", size: "sm", className: "px-3" },
93
+ { variant: "line", size: "md", className: "px-3.5" },
94
+ { variant: "line", size: "default", className: "px-4" },
95
+ { variant: "line", size: "lg", className: "px-6" },
96
+ { variant: "enclosed", size: "sm", className: "px-3" },
97
+ { variant: "enclosed", size: "md", className: "px-3.5" },
98
+ { variant: "enclosed", size: "default", className: "px-4" },
99
+ { variant: "enclosed", size: "lg", className: "px-6" },
100
+ // Pill: reduced height + Segmented-matching font/padding
101
+ { variant: "pill", size: "sm", className: "h-6 text-xs px-3.5" },
102
+ { variant: "pill", size: "md", className: "h-7 text-sm px-3.5" },
103
+ { variant: "pill", size: "default", className: "h-8 text-sm px-4" },
104
+ { variant: "pill", size: "lg", className: "h-10 text-md px-6" }
105
+ ],
106
+ defaultVariants: {
107
+ variant: "line",
108
+ size: "default",
109
+ fitted: false
110
+ }
111
+ }
112
+ );
113
+ var triggerIconSizeClasses = {
114
+ sm: "[&>svg]:icon-xs",
115
+ // 14px
116
+ md: "[&>svg]:icon-sm",
117
+ // 16px
118
+ default: "[&>svg]:icon-sm",
119
+ // 16px
120
+ lg: "[&>svg]:icon-sm"
121
+ // 16px
122
+ };
123
+ var lineColorClasses = {
124
+ default: "data-[state=active]:border-foreground",
125
+ primary: "data-[state=active]:border-primary"
126
+ };
127
+ var enclosedRadiusClasses = {
128
+ none: "rounded-t-none",
129
+ sm: "rounded-t-sm",
130
+ base: "rounded-t",
131
+ md: "rounded-t-md",
132
+ lg: "rounded-t-lg",
133
+ xl: "rounded-t-xl"
134
+ };
135
+ var pillListRadiusClasses = {
136
+ none: "rounded-none",
137
+ sm: "rounded-sm",
138
+ base: "rounded",
139
+ md: "rounded-md",
140
+ lg: "rounded-lg",
141
+ xl: "rounded-xl",
142
+ "2xl": "rounded-2xl",
143
+ "3xl": "rounded-3xl",
144
+ full: "rounded-full"
145
+ };
146
+ var pillItemRadiusClasses = {
147
+ none: "rounded-none",
148
+ sm: "rounded-sm",
149
+ base: "rounded",
150
+ md: "rounded-md",
151
+ lg: "rounded-md",
152
+ xl: "rounded-lg",
153
+ "2xl": "rounded-xl",
154
+ "3xl": "rounded-2xl",
155
+ full: "rounded-full"
156
+ };
157
+ var TabsTrigger = React.forwardRef(({ className, children, onPointerDown, onKeyDown, onBlur, ...props }, ref) => {
158
+ const { variant, size, fitted, color, radius } = useTabsStyleContext();
159
+ const resolvedSize = size || "default";
160
+ const [pointerFocus, setPointerFocus] = React.useState(false);
161
+ return /* @__PURE__ */ React.createElement(
162
+ TabsPrimitive.Trigger,
163
+ {
164
+ ref,
165
+ className: cn(
166
+ tabsTriggerVariants({ variant, size: resolvedSize, fitted }),
167
+ triggerIconSizeClasses[resolvedSize],
168
+ variant === "line" && lineColorClasses[color || "default"],
169
+ variant === "enclosed" && enclosedRadiusClasses[radius || "md"],
170
+ variant === "pill" && pillItemRadiusClasses[radius || "md"],
171
+ className
172
+ ),
173
+ "data-pointer-focus": pointerFocus ? "" : void 0,
174
+ onPointerDown: (event) => {
175
+ setPointerFocus(true);
176
+ onPointerDown?.(event);
177
+ },
178
+ onKeyDown: (event) => {
179
+ setPointerFocus(false);
180
+ onKeyDown?.(event);
181
+ },
182
+ onBlur: (event) => {
183
+ setPointerFocus(false);
184
+ onBlur?.(event);
185
+ },
186
+ ...props
187
+ },
188
+ children
189
+ );
190
+ });
191
+ TabsTrigger.displayName = "TabsTrigger";
192
+ var TabsContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
193
+ TabsPrimitive.Content,
194
+ {
195
+ ref,
196
+ className: cn(
197
+ "mt-4 focus-visible:focus-ring",
198
+ className
199
+ ),
200
+ ...props
201
+ }
202
+ ));
203
+ TabsContent.displayName = "TabsContent";
204
+ var Tabs = TabsPrimitive.Root;
205
+
206
+ export {
207
+ tabsListVariants,
208
+ TabsList,
209
+ tabsTriggerVariants,
210
+ TabsTrigger,
211
+ TabsContent,
212
+ Tabs
213
+ };
214
+ //# sourceMappingURL=chunk-COW3B62M.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/tabs.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n// Context to pass style props from TabsList to TabsTrigger\ntype TabsStyleContextValue = {\n variant?: 'line' | 'enclosed' | 'pill'\n size?: 'sm' | 'md' | 'default' | 'lg'\n fitted?: boolean\n color?: 'default' | 'primary'\n radius?: 'none' | 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n}\nconst TabsStyleContext = React.createContext<TabsStyleContextValue>({})\nconst useTabsStyleContext = () => React.useContext(TabsStyleContext)\n\n// ─── TabsList ────────────────────────────────────────────────\n\nconst tabsListVariants = cva(\n 'inline-flex items-center text-text-subtle',\n {\n variants: {\n variant: {\n line: 'border-b border-border bg-transparent gap-0',\n enclosed: 'border-b border-border bg-transparent gap-0',\n pill: 'bg-background-muted p-1 gap-1',\n },\n fitted: {\n true: 'w-full',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'line',\n fitted: false,\n },\n }\n)\n\nexport interface TabsListProps\n extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>,\n VariantProps<typeof tabsListVariants> {\n size?: 'sm' | 'md' | 'default' | 'lg'\n /** Indicator color for line variant */\n color?: 'default' | 'primary'\n /** Top border-radius for enclosed variant, container radius for pill variant */\n radius?: 'none' | 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n}\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n TabsListProps\n>(({ className, variant, size, fitted, color, radius, ...props }, ref) => {\n const resolvedVariant = variant || 'line'\n return (\n <TabsStyleContext.Provider value={{ variant: resolvedVariant, size: size || 'default', fitted: fitted ?? false, color: color || 'default', radius: radius || 'md' }}>\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n tabsListVariants({ variant, fitted }),\n resolvedVariant === 'pill' && pillListRadiusClasses[radius || 'md'],\n className\n )}\n {...props}\n />\n </TabsStyleContext.Provider>\n )\n})\nTabsList.displayName = 'TabsList'\n\n// ─── TabsTrigger ─────────────────────────────────────────────\n\nconst tabsTriggerVariants = cva(\n [\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap',\n 'transition-all duration-micro ease-out cursor-pointer',\n // Keyboard-only focus ring: see pointer tracking in TabsTrigger\n '[&:focus-visible:not([data-pointer-focus])]:focus-ring',\n 'disabled:pointer-events-none disabled:text-text-subtle disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n variant: {\n line: [\n 'border-b-2 border-transparent -mb-px',\n 'hover:text-foreground hover:border-border',\n 'data-[state=active]:text-foreground data-[state=active]:font-semibold',\n ].join(' '),\n enclosed: [\n 'border border-transparent -mb-px',\n 'hover:text-foreground',\n 'data-[state=active]:text-foreground data-[state=active]:font-semibold data-[state=active]:bg-background',\n 'data-[state=active]:border-border data-[state=active]:border-b-background',\n ].join(' '),\n pill: [\n 'hover:text-foreground',\n 'data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:font-semibold data-[state=active]:shadow-sm',\n ].join(' '),\n },\n size: {\n sm: 'h-8 text-sm', // 32px, 13px\n md: 'h-9 text-sm', // 36px, 13px\n default: 'h-10 text-md', // 40px, 14px\n lg: 'h-12 text-base', // 48px, 16px\n },\n fitted: {\n true: 'flex-1',\n false: '',\n },\n },\n compoundVariants: [\n // Padding per variant × size\n { variant: 'line', size: 'sm', className: 'px-3' },\n { variant: 'line', size: 'md', className: 'px-3.5' },\n { variant: 'line', size: 'default', className: 'px-4' },\n { variant: 'line', size: 'lg', className: 'px-6' },\n { variant: 'enclosed', size: 'sm', className: 'px-3' },\n { variant: 'enclosed', size: 'md', className: 'px-3.5' },\n { variant: 'enclosed', size: 'default', className: 'px-4' },\n { variant: 'enclosed', size: 'lg', className: 'px-6' },\n // Pill: reduced height + Segmented-matching font/padding\n { variant: 'pill', size: 'sm', className: 'h-6 text-xs px-3.5' },\n { variant: 'pill', size: 'md', className: 'h-7 text-sm px-3.5' },\n { variant: 'pill', size: 'default', className: 'h-8 text-sm px-4' },\n { variant: 'pill', size: 'lg', className: 'h-10 text-md px-6' },\n ],\n defaultVariants: {\n variant: 'line',\n size: 'default',\n fitted: false,\n },\n }\n)\n\n// Icon size mapping for tabs (same as Button icon+text pattern)\nconst triggerIconSizeClasses = {\n sm: '[&>svg]:icon-xs', // 14px\n md: '[&>svg]:icon-sm', // 16px\n default: '[&>svg]:icon-sm', // 16px\n lg: '[&>svg]:icon-sm', // 16px\n} as const\n\nexport interface TabsTriggerProps\n extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>,\n Omit<VariantProps<typeof tabsTriggerVariants>, 'variant' | 'size' | 'fitted'> {}\n\n// Line variant: active indicator color\nconst lineColorClasses = {\n default: 'data-[state=active]:border-foreground',\n primary: 'data-[state=active]:border-primary',\n} as const\n\n// Enclosed variant: top border-radius\nconst enclosedRadiusClasses = {\n none: 'rounded-t-none',\n sm: 'rounded-t-sm',\n base: 'rounded-t',\n md: 'rounded-t-md',\n lg: 'rounded-t-lg',\n xl: 'rounded-t-xl',\n} as const\n\n// Pill variant: container radius (applied to TabsList, matches Segmented scale)\nconst pillListRadiusClasses = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n base: 'rounded',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n '2xl': 'rounded-2xl',\n '3xl': 'rounded-3xl',\n full: 'rounded-full',\n} as const\n\n// Pill variant: item radius (one step smaller than container, matches Segmented item scale)\nconst pillItemRadiusClasses = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n base: 'rounded',\n md: 'rounded-md',\n lg: 'rounded-md',\n xl: 'rounded-lg',\n '2xl': 'rounded-xl',\n '3xl': 'rounded-2xl',\n full: 'rounded-full',\n} as const\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n TabsTriggerProps\n>(({ className, children, onPointerDown, onKeyDown, onBlur, ...props }, ref) => {\n const { variant, size, fitted, color, radius } = useTabsStyleContext()\n const resolvedSize = size || 'default'\n // Radix Tabs 1.2+ calls focus() on mouse down, so :focus-visible matches after any\n // earlier keyboard input. Mark pointer-initiated focus to keep the ring keyboard-only.\n const [pointerFocus, setPointerFocus] = React.useState(false)\n\n return (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n tabsTriggerVariants({ variant, size: resolvedSize, fitted }),\n triggerIconSizeClasses[resolvedSize],\n variant === 'line' && lineColorClasses[color || 'default'],\n variant === 'enclosed' && enclosedRadiusClasses[(radius || 'md') as keyof typeof enclosedRadiusClasses],\n variant === 'pill' && pillItemRadiusClasses[radius || 'md'],\n className\n )}\n data-pointer-focus={pointerFocus ? '' : undefined}\n onPointerDown={(event) => {\n setPointerFocus(true)\n onPointerDown?.(event)\n }}\n onKeyDown={(event) => {\n setPointerFocus(false)\n onKeyDown?.(event)\n }}\n onBlur={(event) => {\n setPointerFocus(false)\n onBlur?.(event)\n }}\n {...props}\n >\n {children}\n </TabsPrimitive.Trigger>\n )\n})\nTabsTrigger.displayName = 'TabsTrigger'\n\n// ─── TabsContent ─────────────────────────────────────────────\n\nexport interface TabsContentProps\n extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content> {}\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n TabsContentProps\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'mt-4 focus-visible:focus-ring',\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = 'TabsContent'\n\n// ─── Tabs (Root) ─────────────────────────────────────────────\n\nconst Tabs = TabsPrimitive.Root\n\nexport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n tabsListVariants,\n tabsTriggerVariants,\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,114 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-53MIUPSY.mjs";
5
+
6
+ // src/components/ui/skeleton.tsx
7
+ import * as React from "react";
8
+ import { cva } from "class-variance-authority";
9
+ var PULSE_DURATION_MS = 2e3;
10
+ var WAVE_DURATION_MS = 1800;
11
+ var WAVE_GRADIENT = [
12
+ "transparent 0%",
13
+ "transparent 30%",
14
+ "var(--color-background-elevated) 50%",
15
+ "transparent 70%",
16
+ "transparent 100%"
17
+ ].join(", ");
18
+ var MULTI_LINE_WIDTHS = ["100%", "92%", "100%", "85%", "75%"];
19
+ var skeletonVariants = cva(
20
+ "bg-background-muted",
21
+ {
22
+ variants: {
23
+ variant: {
24
+ text: "rounded-md h-4 w-full",
25
+ circular: "rounded-full w-10 h-10",
26
+ rectangular: "rounded-xl w-full h-24"
27
+ }
28
+ },
29
+ defaultVariants: {
30
+ variant: "text"
31
+ }
32
+ }
33
+ );
34
+ var SkeletonBlock = React.forwardRef(
35
+ ({
36
+ className,
37
+ variant = "text",
38
+ animation = "pulse",
39
+ width,
40
+ height,
41
+ radius,
42
+ style,
43
+ ...props
44
+ }, ref) => {
45
+ return /* @__PURE__ */ React.createElement(
46
+ "div",
47
+ {
48
+ ref,
49
+ "aria-hidden": "true",
50
+ className: cn(
51
+ skeletonVariants({ variant }),
52
+ animation === "pulse" && "animate-skeleton-pulse",
53
+ animation === "wave" && "relative overflow-hidden",
54
+ className
55
+ ),
56
+ style: {
57
+ ...style,
58
+ ...width != null ? { width } : {},
59
+ ...height != null ? { height } : {},
60
+ ...radius != null ? { borderRadius: radius } : {},
61
+ ...animation === "pulse" ? { animationDuration: `${PULSE_DURATION_MS}ms` } : {}
62
+ },
63
+ ...props
64
+ },
65
+ animation === "wave" && /* @__PURE__ */ React.createElement(
66
+ "div",
67
+ {
68
+ className: "absolute inset-0 animate-skeleton-wave",
69
+ style: {
70
+ animationDuration: `${WAVE_DURATION_MS}ms`,
71
+ background: `linear-gradient(90deg, ${WAVE_GRADIENT})`
72
+ }
73
+ }
74
+ )
75
+ );
76
+ }
77
+ );
78
+ SkeletonBlock.displayName = "SkeletonBlock";
79
+ var Skeleton = React.forwardRef(
80
+ ({
81
+ count,
82
+ loading,
83
+ children,
84
+ variant = "text",
85
+ ...rest
86
+ }, ref) => {
87
+ if (loading !== void 0) {
88
+ if (!loading) return /* @__PURE__ */ React.createElement(React.Fragment, null, children);
89
+ }
90
+ if (count != null && count > 1 && variant === "text") {
91
+ return /* @__PURE__ */ React.createElement("div", { ref, className: "space-y-2.5", "aria-hidden": "true" }, Array.from({ length: count }, (_, i) => {
92
+ const widthPattern = MULTI_LINE_WIDTHS[i % MULTI_LINE_WIDTHS.length];
93
+ const isLast = i === count - 1;
94
+ return /* @__PURE__ */ React.createElement(
95
+ SkeletonBlock,
96
+ {
97
+ key: i,
98
+ variant: "text",
99
+ style: { width: isLast ? "60%" : widthPattern },
100
+ ...rest
101
+ }
102
+ );
103
+ }));
104
+ }
105
+ return /* @__PURE__ */ React.createElement(SkeletonBlock, { ref, variant, ...rest });
106
+ }
107
+ );
108
+ Skeleton.displayName = "Skeleton";
109
+
110
+ export {
111
+ skeletonVariants,
112
+ Skeleton
113
+ };
114
+ //# sourceMappingURL=chunk-CTH6SN5Y.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/skeleton.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Pulse animation duration in ms (slower = more premium) */\nconst PULSE_DURATION_MS = 2000\n/** Wave animation duration in ms */\nconst WAVE_DURATION_MS = 1800\n\n/**\n * Wave shimmer gradient — wide sweep with soft edges.\n * 5 gradient stops create a broader, smoother light band.\n */\nconst WAVE_GRADIENT = [\n 'transparent 0%',\n 'transparent 30%',\n 'var(--color-background-elevated) 50%',\n 'transparent 70%',\n 'transparent 100%',\n].join(', ')\n\n/**\n * Multi-line text width pattern.\n * Last line is always shorter for natural appearance.\n */\nconst MULTI_LINE_WIDTHS = ['100%', '92%', '100%', '85%', '75%'] as const\n\n// ============================================================================\n// Variants (CVA)\n// ============================================================================\n\nconst skeletonVariants = cva(\n 'bg-background-muted',\n {\n variants: {\n variant: {\n text: 'rounded-md h-4 w-full',\n circular: 'rounded-full w-10 h-10',\n rectangular: 'rounded-xl w-full h-24',\n },\n },\n defaultVariants: {\n variant: 'text',\n },\n }\n)\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SkeletonProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof skeletonVariants> {\n /** Animation style */\n animation?: 'pulse' | 'wave' | false\n /** Custom width */\n width?: string | number\n /** Custom height */\n height?: string | number\n /** Custom border radius */\n radius?: string | number\n /** Number of text lines (text variant only, generates stacked lines) */\n count?: number\n /** Conditional loading — true: show skeleton, false: render children */\n loading?: boolean\n /** Children to render when loading=false */\n children?: React.ReactNode\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nconst SkeletonBlock = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, 'count' | 'loading' | 'children'>>(\n ({\n className,\n variant = 'text',\n animation = 'pulse',\n width,\n height,\n radius,\n style,\n ...props\n }, ref) => {\n return (\n <div\n ref={ref}\n aria-hidden=\"true\"\n className={cn(\n skeletonVariants({ variant }),\n animation === 'pulse' && 'animate-skeleton-pulse',\n animation === 'wave' && 'relative overflow-hidden',\n className,\n )}\n style={{\n ...style,\n ...(width != null ? { width } : {}),\n ...(height != null ? { height } : {}),\n ...(radius != null ? { borderRadius: radius } : {}),\n ...(animation === 'pulse' ? { animationDuration: `${PULSE_DURATION_MS}ms` } : {}),\n }}\n {...props}\n >\n {animation === 'wave' && (\n <div\n className=\"absolute inset-0 animate-skeleton-wave\"\n style={{\n animationDuration: `${WAVE_DURATION_MS}ms`,\n background: `linear-gradient(90deg, ${WAVE_GRADIENT})`,\n }}\n />\n )}\n </div>\n )\n }\n)\nSkeletonBlock.displayName = 'SkeletonBlock'\n\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({\n count,\n loading,\n children,\n variant = 'text',\n ...rest\n }, ref) => {\n // loading mode — show skeleton or children\n if (loading !== undefined) {\n if (!loading) return <>{children}</>\n // When loading, fall through to render skeleton\n }\n\n // count mode — render multiple text lines\n if (count != null && count > 1 && variant === 'text') {\n return (\n <div ref={ref} className=\"space-y-2.5\" aria-hidden=\"true\">\n {Array.from({ length: count }, (_, i) => {\n const widthPattern = MULTI_LINE_WIDTHS[i % MULTI_LINE_WIDTHS.length]\n const isLast = i === count - 1\n return (\n <SkeletonBlock\n key={i}\n variant=\"text\"\n style={{ width: isLast ? '60%' : widthPattern }}\n {...rest}\n />\n )\n })}\n </div>\n )\n }\n\n return <SkeletonBlock ref={ref} variant={variant} {...rest} />\n }\n)\nSkeleton.displayName = 'Skeleton'\n\nexport { Skeleton, skeletonVariants }\n"],"mappings":";;;;;;AAEA,YAAY,WAAW;AACvB,SAAS,WAA8B;AAQvC,IAAM,oBAAoB;AAE1B,IAAM,mBAAmB;AAMzB,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAMX,IAAM,oBAAoB,CAAC,QAAQ,OAAO,QAAQ,OAAO,KAAK;AAM9D,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AA6BA,IAAM,gBAAsB;AAAA,EAC1B,CAAC;AAAA,IACC;AAAA,IACA,UAAU;AAAA,IACV,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GAAG,QAAQ;AACT,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,eAAY;AAAA,QACZ,WAAW;AAAA,UACT,iBAAiB,EAAE,QAAQ,CAAC;AAAA,UAC5B,cAAc,WAAW;AAAA,UACzB,cAAc,UAAU;AAAA,UACxB;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL,GAAG;AAAA,UACH,GAAI,SAAS,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,UACjC,GAAI,UAAU,OAAO,EAAE,OAAO,IAAI,CAAC;AAAA,UACnC,GAAI,UAAU,OAAO,EAAE,cAAc,OAAO,IAAI,CAAC;AAAA,UACjD,GAAI,cAAc,UAAU,EAAE,mBAAmB,GAAG,iBAAiB,KAAK,IAAI,CAAC;AAAA,QACjF;AAAA,QACC,GAAG;AAAA;AAAA,MAEH,cAAc,UACb;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,mBAAmB,GAAG,gBAAgB;AAAA,YACtC,YAAY,0BAA0B,aAAa;AAAA,UACrD;AAAA;AAAA,MACF;AAAA,IAEJ;AAAA,EAEJ;AACF;AACA,cAAc,cAAc;AAE5B,IAAM,WAAiB;AAAA,EACrB,CAAC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,GAAG;AAAA,EACL,GAAG,QAAQ;AAET,QAAI,YAAY,QAAW;AACzB,UAAI,CAAC,QAAS,QAAO,0DAAG,QAAS;AAAA,IAEnC;AAGA,QAAI,SAAS,QAAQ,QAAQ,KAAK,YAAY,QAAQ;AACpD,aACE,oCAAC,SAAI,KAAU,WAAU,eAAc,eAAY,UAChD,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,MAAM;AACvC,cAAM,eAAe,kBAAkB,IAAI,kBAAkB,MAAM;AACnE,cAAM,SAAS,MAAM,QAAQ;AAC7B,eACE;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,SAAQ;AAAA,YACR,OAAO,EAAE,OAAO,SAAS,QAAQ,aAAa;AAAA,YAC7C,GAAG;AAAA;AAAA,QACN;AAAA,MAEJ,CAAC,CACH;AAAA,IAEJ;AAEA,WAAO,oCAAC,iBAAc,KAAU,SAAmB,GAAG,MAAM;AAAA,EAC9D;AACF;AACA,SAAS,cAAc;","names":[]}