framepexls-ui-lib 2.0.0 → 2.2.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.
Files changed (236) hide show
  1. package/dist/AnalyticsCharts.d.mts +4 -4
  2. package/dist/AnalyticsCharts.d.ts +4 -4
  3. package/dist/AppTopbar.d.mts +1 -2
  4. package/dist/AppTopbar.d.ts +1 -2
  5. package/dist/AssetPerformanceCard.d.mts +50 -0
  6. package/dist/AssetPerformanceCard.d.ts +50 -0
  7. package/dist/AssetPerformanceCard.js +342 -0
  8. package/dist/AssetPerformanceCard.mjs +319 -0
  9. package/dist/AssetTickerRow.d.mts +26 -0
  10. package/dist/AssetTickerRow.d.ts +26 -0
  11. package/dist/AssetTickerRow.js +255 -0
  12. package/dist/AssetTickerRow.mjs +225 -0
  13. package/dist/AuthTopbar.d.mts +2 -2
  14. package/dist/AuthTopbar.d.ts +2 -2
  15. package/dist/AuthTopbar.js +2 -1
  16. package/dist/AuthTopbar.mjs +2 -1
  17. package/dist/AvatarGroup.d.mts +2 -2
  18. package/dist/AvatarGroup.d.ts +2 -2
  19. package/dist/AvatarSquare.d.mts +2 -2
  20. package/dist/AvatarSquare.d.ts +2 -2
  21. package/dist/AvatarSquare.js +29 -27
  22. package/dist/AvatarSquare.mjs +29 -27
  23. package/dist/Badge.d.mts +1 -2
  24. package/dist/Badge.d.ts +1 -2
  25. package/dist/BadgeCluster.d.mts +2 -3
  26. package/dist/BadgeCluster.d.ts +2 -3
  27. package/dist/Breadcrumb.d.mts +1 -2
  28. package/dist/Breadcrumb.d.ts +1 -2
  29. package/dist/CalendarPanel.d.mts +2 -2
  30. package/dist/CalendarPanel.d.ts +2 -2
  31. package/dist/Carousel.d.mts +1 -2
  32. package/dist/Carousel.d.ts +1 -2
  33. package/dist/ChangeHistory.d.mts +1 -2
  34. package/dist/ChangeHistory.d.ts +1 -2
  35. package/dist/ChartCard.d.mts +1 -2
  36. package/dist/ChartCard.d.ts +1 -2
  37. package/dist/ChatCenter.d.mts +2 -2
  38. package/dist/ChatCenter.d.ts +2 -2
  39. package/dist/ChatbotCenter.d.mts +1 -2
  40. package/dist/ChatbotCenter.d.ts +1 -2
  41. package/dist/Checkbox.d.mts +1 -1
  42. package/dist/Checkbox.d.ts +1 -1
  43. package/dist/CheckboxPillsGroup.d.mts +1 -2
  44. package/dist/CheckboxPillsGroup.d.ts +1 -2
  45. package/dist/ColorPicker.d.mts +2 -2
  46. package/dist/ColorPicker.d.ts +2 -2
  47. package/dist/ColumnSelector.d.mts +1 -2
  48. package/dist/ColumnSelector.d.ts +1 -2
  49. package/dist/ComboSelect.d.mts +1 -2
  50. package/dist/ComboSelect.d.ts +1 -2
  51. package/dist/DataPageLayout.d.mts +64 -0
  52. package/dist/DataPageLayout.d.ts +64 -0
  53. package/dist/DataPageLayout.js +191 -0
  54. package/dist/DataPageLayout.mjs +157 -0
  55. package/dist/DataTable.d.mts +1 -2
  56. package/dist/DataTable.d.ts +1 -2
  57. package/dist/DataTableCard.d.mts +1 -2
  58. package/dist/DataTableCard.d.ts +1 -2
  59. package/dist/DataTableCardFooter.d.mts +2 -2
  60. package/dist/DataTableCardFooter.d.ts +2 -2
  61. package/dist/DateTimeField.d.mts +1 -2
  62. package/dist/DateTimeField.d.ts +1 -2
  63. package/dist/Dialog.d.mts +6 -7
  64. package/dist/Dialog.d.ts +6 -7
  65. package/dist/DocumentEditor.d.mts +3 -3
  66. package/dist/DocumentEditor.d.ts +3 -3
  67. package/dist/Drawer.d.mts +4 -5
  68. package/dist/Drawer.d.ts +4 -5
  69. package/dist/Dropdown.d.mts +7 -8
  70. package/dist/Dropdown.d.ts +7 -8
  71. package/dist/EmptyState.d.mts +1 -2
  72. package/dist/EmptyState.d.ts +1 -2
  73. package/dist/FiltersMultiSelect.d.mts +1 -2
  74. package/dist/FiltersMultiSelect.d.ts +1 -2
  75. package/dist/HeliipLoader.d.mts +2 -2
  76. package/dist/HeliipLoader.d.ts +2 -2
  77. package/dist/ImpersonationDialog.d.mts +2 -2
  78. package/dist/ImpersonationDialog.d.ts +2 -2
  79. package/dist/ImpersonationSwitcher.d.mts +2 -2
  80. package/dist/ImpersonationSwitcher.d.ts +2 -2
  81. package/dist/InfoGrid.d.mts +1 -2
  82. package/dist/InfoGrid.d.ts +1 -2
  83. package/dist/KnowledgeBase.d.mts +1 -2
  84. package/dist/KnowledgeBase.d.ts +1 -2
  85. package/dist/KpiCard.d.mts +2 -3
  86. package/dist/KpiCard.d.ts +2 -3
  87. package/dist/LanguageSwitcher.d.mts +2 -2
  88. package/dist/LanguageSwitcher.d.ts +2 -2
  89. package/dist/LicenseStatus.d.mts +1 -2
  90. package/dist/LicenseStatus.d.ts +1 -2
  91. package/dist/Link.d.mts +1 -2
  92. package/dist/Link.d.ts +1 -2
  93. package/dist/Login.d.mts +1 -2
  94. package/dist/Login.d.ts +1 -2
  95. package/dist/LoginCarousel.d.mts +2 -3
  96. package/dist/LoginCarousel.d.ts +2 -3
  97. package/dist/LoginGallery.d.mts +2 -3
  98. package/dist/LoginGallery.d.ts +2 -3
  99. package/dist/LoginTools.d.mts +1 -2
  100. package/dist/LoginTools.d.ts +1 -2
  101. package/dist/Map.d.mts +4 -5
  102. package/dist/Map.d.ts +4 -5
  103. package/dist/MarkdownEditor.d.mts +2 -2
  104. package/dist/MarkdownEditor.d.ts +2 -2
  105. package/dist/MediaCard.d.mts +2 -2
  106. package/dist/MediaCard.d.ts +2 -2
  107. package/dist/MediaLibraryLayout.d.mts +89 -0
  108. package/dist/MediaLibraryLayout.d.ts +89 -0
  109. package/dist/MediaLibraryLayout.js +369 -0
  110. package/dist/MediaLibraryLayout.mjs +348 -0
  111. package/dist/MediaSelector.d.mts +2 -2
  112. package/dist/MediaSelector.d.ts +2 -2
  113. package/dist/MediaTile.d.mts +2 -2
  114. package/dist/MediaTile.d.ts +2 -2
  115. package/dist/Money.d.mts +2 -2
  116. package/dist/Money.d.ts +2 -2
  117. package/dist/MotionProvider.d.mts +1 -2
  118. package/dist/MotionProvider.d.ts +1 -2
  119. package/dist/MultiComboSelect.d.mts +2 -3
  120. package/dist/MultiComboSelect.d.ts +2 -3
  121. package/dist/NotificationsCenter.d.mts +1 -2
  122. package/dist/NotificationsCenter.d.ts +1 -2
  123. package/dist/Numeric.d.mts +24 -0
  124. package/dist/Numeric.d.ts +24 -0
  125. package/dist/Numeric.js +102 -0
  126. package/dist/Numeric.mjs +76 -0
  127. package/dist/OmniSearch.d.mts +2 -3
  128. package/dist/OmniSearch.d.ts +2 -3
  129. package/dist/OrderButton.d.mts +2 -2
  130. package/dist/OrderButton.d.ts +2 -2
  131. package/dist/PageScaffold.d.mts +1 -2
  132. package/dist/PageScaffold.d.ts +1 -2
  133. package/dist/PageScaffold.js +1 -1
  134. package/dist/PageScaffold.mjs +1 -1
  135. package/dist/PageTransition.d.mts +1 -2
  136. package/dist/PageTransition.d.ts +1 -2
  137. package/dist/PageTransition.js +33 -27
  138. package/dist/PageTransition.mjs +33 -27
  139. package/dist/Pagination.d.mts +2 -2
  140. package/dist/Pagination.d.ts +2 -2
  141. package/dist/PasswordField.d.mts +1 -2
  142. package/dist/PasswordField.d.ts +1 -2
  143. package/dist/ProductCatalog.d.mts +2 -3
  144. package/dist/ProductCatalog.d.ts +2 -3
  145. package/dist/PromotionsCatalog.d.mts +2 -3
  146. package/dist/PromotionsCatalog.d.ts +2 -3
  147. package/dist/QrCode.d.mts +2 -2
  148. package/dist/QrCode.d.ts +2 -2
  149. package/dist/QuoteEditor.d.mts +2 -2
  150. package/dist/QuoteEditor.d.ts +2 -2
  151. package/dist/RechartsBarCard.d.mts +1 -2
  152. package/dist/RechartsBarCard.d.ts +1 -2
  153. package/dist/RechartsDonutCard.d.mts +1 -2
  154. package/dist/RechartsDonutCard.d.ts +1 -2
  155. package/dist/RechartsTimeSeriesCard.d.mts +1 -2
  156. package/dist/RechartsTimeSeriesCard.d.ts +1 -2
  157. package/dist/ReviewHistory.d.mts +3 -3
  158. package/dist/ReviewHistory.d.ts +3 -3
  159. package/dist/Reviews.d.mts +1 -2
  160. package/dist/Reviews.d.ts +1 -2
  161. package/dist/SearchInput.d.mts +2 -2
  162. package/dist/SearchInput.d.ts +2 -2
  163. package/dist/SegmentedTabs.d.mts +1 -2
  164. package/dist/SegmentedTabs.d.ts +1 -2
  165. package/dist/Select.d.mts +2 -2
  166. package/dist/Select.d.ts +2 -2
  167. package/dist/ShareAccess.d.mts +1 -2
  168. package/dist/ShareAccess.d.ts +1 -2
  169. package/dist/Sidebar.d.mts +1 -2
  170. package/dist/Sidebar.d.ts +1 -2
  171. package/dist/Sidebar.js +492 -335
  172. package/dist/Sidebar.mjs +492 -335
  173. package/dist/StatCard.d.mts +1 -2
  174. package/dist/StatCard.d.ts +1 -2
  175. package/dist/Steps.d.mts +3 -3
  176. package/dist/Steps.d.ts +3 -3
  177. package/dist/StorageUsage.d.mts +1 -2
  178. package/dist/StorageUsage.d.ts +1 -2
  179. package/dist/Table.d.mts +4 -5
  180. package/dist/Table.d.ts +4 -5
  181. package/dist/TableRecordButton.d.mts +1 -2
  182. package/dist/TableRecordButton.d.ts +1 -2
  183. package/dist/TimeAgo.d.mts +2 -2
  184. package/dist/TimeAgo.d.ts +2 -2
  185. package/dist/TimePanel.d.mts +1 -2
  186. package/dist/TimePanel.d.ts +1 -2
  187. package/dist/TimeRangeField.d.mts +2 -2
  188. package/dist/TimeRangeField.d.ts +2 -2
  189. package/dist/Toast.d.mts +1 -2
  190. package/dist/Toast.d.ts +1 -2
  191. package/dist/Tooltip.d.mts +1 -2
  192. package/dist/Tooltip.d.ts +1 -2
  193. package/dist/UploadCard.d.mts +1 -2
  194. package/dist/UploadCard.d.ts +1 -2
  195. package/dist/WordEditor.d.mts +3 -3
  196. package/dist/WordEditor.d.ts +3 -3
  197. package/dist/WorkflowDiagram.d.mts +1 -2
  198. package/dist/WorkflowDiagram.d.ts +1 -2
  199. package/dist/{animations-CHrNeawW.d.mts → animations-Di5tQRLw.d.mts} +2 -2
  200. package/dist/{animations-CHrNeawW.d.ts → animations-Di5tQRLw.d.ts} +2 -2
  201. package/dist/animations.d.mts +1 -1
  202. package/dist/animations.d.ts +1 -1
  203. package/dist/charts.d.mts +2 -1
  204. package/dist/charts.d.ts +2 -1
  205. package/dist/charts.js +6 -0
  206. package/dist/charts.mjs +6 -2
  207. package/dist/i18n.d.mts +1 -2
  208. package/dist/i18n.d.ts +1 -2
  209. package/dist/iconos/WorkflowEdgesSvg.d.mts +1 -2
  210. package/dist/iconos/WorkflowEdgesSvg.d.ts +1 -2
  211. package/dist/iconos/index.d.mts +1546 -1547
  212. package/dist/iconos/index.d.ts +1546 -1547
  213. package/dist/iconos/regular-icons.js +2 -2
  214. package/dist/iconos/regular-icons.mjs +2 -2
  215. package/dist/index.d.mts +10 -4
  216. package/dist/index.d.ts +10 -4
  217. package/dist/index.js +33 -0
  218. package/dist/index.mjs +166 -146
  219. package/dist/internal/AutoSize.d.mts +1 -2
  220. package/dist/internal/AutoSize.d.ts +1 -2
  221. package/dist/map.css +1 -1
  222. package/dist/theme/FontSizeController.d.mts +2 -2
  223. package/dist/theme/FontSizeController.d.ts +2 -2
  224. package/dist/theme/FontSizeController.js +1 -1
  225. package/dist/theme/FontSizeController.mjs +1 -1
  226. package/dist/theme/ThemeController.d.mts +2 -3
  227. package/dist/theme/ThemeController.d.ts +2 -3
  228. package/dist/theme/ThemeProvider.d.mts +1 -2
  229. package/dist/theme/ThemeProvider.d.ts +1 -2
  230. package/dist/theme/ThemeScript.d.mts +2 -2
  231. package/dist/theme/ThemeScript.d.ts +2 -2
  232. package/dist/theme/ThemeToggle.d.mts +2 -2
  233. package/dist/theme/ThemeToggle.d.ts +2 -2
  234. package/dist/theme/ThemeToggle.js +4 -4
  235. package/dist/theme/ThemeToggle.mjs +4 -4
  236. package/package.json +7 -8
@@ -0,0 +1,319 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import React from "react";
4
+ import {
5
+ Area,
6
+ AreaChart,
7
+ CartesianGrid,
8
+ Tooltip,
9
+ XAxis,
10
+ YAxis
11
+ } from "recharts";
12
+ import ChartCard from "./ChartCard.mjs";
13
+ import AutoSize from "./internal/AutoSize.mjs";
14
+ import SegmentedTabs from "./SegmentedTabs.mjs";
15
+ import Select from "./Select.mjs";
16
+ import { TrendDownIcon, TrendUpIcon } from "./iconos/index.mjs";
17
+ import { formatCurrencyValue, formatNumericValue, formatPercentValue } from "./Numeric.mjs";
18
+ function alphaColor(color, alpha, fallback) {
19
+ if (!color) return fallback;
20
+ if (color.startsWith("#")) {
21
+ let hex = color.slice(1);
22
+ if (hex.length === 3) {
23
+ hex = hex.split("").map((char) => char + char).join("");
24
+ }
25
+ if (hex.length === 6) {
26
+ const r = Number.parseInt(hex.slice(0, 2), 16);
27
+ const g = Number.parseInt(hex.slice(2, 4), 16);
28
+ const b = Number.parseInt(hex.slice(4, 6), 16);
29
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
30
+ }
31
+ }
32
+ return `color-mix(in oklab, ${color} ${Math.round(alpha * 100)}%, transparent)`;
33
+ }
34
+ function AssetBadge({
35
+ name,
36
+ symbol,
37
+ accent,
38
+ icon
39
+ }) {
40
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
41
+ /* @__PURE__ */ jsx(
42
+ "div",
43
+ {
44
+ className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-2xl text-sm font-semibold text-white shadow-sm",
45
+ style: { background: accent },
46
+ children: icon != null ? icon : (symbol || name).slice(0, 3).toUpperCase()
47
+ }
48
+ ),
49
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
50
+ /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-semibold text-[var(--foreground)]", children: name }),
51
+ symbol ? /* @__PURE__ */ jsx("div", { className: "text-[11px] uppercase tracking-[0.16em] text-[var(--muted)]", children: symbol }) : null
52
+ ] })
53
+ ] });
54
+ }
55
+ function AssetPerformanceCard({
56
+ title,
57
+ subtitle,
58
+ name,
59
+ symbol,
60
+ icon,
61
+ accent = "var(--primary)",
62
+ value,
63
+ change,
64
+ changePercent,
65
+ data,
66
+ xKey,
67
+ yKey,
68
+ locale = "es-MX",
69
+ currency = "USD",
70
+ currencies,
71
+ selectedCurrency,
72
+ defaultCurrency,
73
+ onCurrencyChange,
74
+ ranges = [
75
+ { value: "1H", label: "1H" },
76
+ { value: "1D", label: "1D" },
77
+ { value: "1W", label: "1W" },
78
+ { value: "1M", label: "1M" },
79
+ { value: "1Y", label: "1Y" },
80
+ { value: "ALL", label: "All" }
81
+ ],
82
+ selectedRange,
83
+ defaultRange,
84
+ onRangeChange,
85
+ xTickFormatter,
86
+ valueFormatter,
87
+ yTickFormatter,
88
+ tooltipLabelFormatter,
89
+ tooltipValueFormatter,
90
+ className,
91
+ helperText,
92
+ emptyState
93
+ }) {
94
+ var _a, _b, _c, _d, _e, _f, _g;
95
+ const gradientId = React.useId();
96
+ const initialCurrency = (_c = (_b = selectedCurrency != null ? selectedCurrency : defaultCurrency) != null ? _b : (_a = currencies == null ? void 0 : currencies[0]) == null ? void 0 : _a.value) != null ? _c : currency;
97
+ const initialRange = (_f = (_e = selectedRange != null ? selectedRange : defaultRange) != null ? _e : (_d = ranges[0]) == null ? void 0 : _d.value) != null ? _f : "1D";
98
+ const [internalCurrency, setInternalCurrency] = React.useState(initialCurrency);
99
+ const [internalRange, setInternalRange] = React.useState(initialRange);
100
+ React.useEffect(() => {
101
+ if (selectedCurrency !== void 0) {
102
+ setInternalCurrency(selectedCurrency);
103
+ }
104
+ }, [selectedCurrency]);
105
+ React.useEffect(() => {
106
+ if (selectedRange !== void 0) {
107
+ setInternalRange(selectedRange);
108
+ }
109
+ }, [selectedRange]);
110
+ const activeCurrency = selectedCurrency != null ? selectedCurrency : internalCurrency;
111
+ const activeRange = selectedRange != null ? selectedRange : internalRange;
112
+ const positive = ((_g = changePercent != null ? changePercent : change) != null ? _g : 0) >= 0;
113
+ const lineColor = accent;
114
+ const handleCurrencyChange = (next) => {
115
+ if (!next) return;
116
+ if (selectedCurrency === void 0) {
117
+ setInternalCurrency(next);
118
+ }
119
+ onCurrencyChange == null ? void 0 : onCurrencyChange(next);
120
+ };
121
+ const handleRangeChange = (next) => {
122
+ if (selectedRange === void 0) {
123
+ setInternalRange(next);
124
+ }
125
+ onRangeChange == null ? void 0 : onRangeChange(next);
126
+ };
127
+ const formatValue = (amount, options) => {
128
+ var _a2, _b2;
129
+ const formatterOptions = { currency: activeCurrency || currency, locale };
130
+ if (valueFormatter) return valueFormatter(amount, formatterOptions);
131
+ return formatCurrencyValue(amount, {
132
+ ...formatterOptions,
133
+ minimumFractionDigits: (_a2 = options == null ? void 0 : options.minimumFractionDigits) != null ? _a2 : 0,
134
+ maximumFractionDigits: (_b2 = options == null ? void 0 : options.maximumFractionDigits) != null ? _b2 : 2
135
+ });
136
+ };
137
+ const yFormatter = (amount) => {
138
+ const formatterOptions = { currency: activeCurrency || currency, locale };
139
+ if (yTickFormatter) return yTickFormatter(amount, formatterOptions);
140
+ if (valueFormatter) return valueFormatter(amount, formatterOptions);
141
+ return formatCurrencyValue(amount, {
142
+ ...formatterOptions,
143
+ minimumFractionDigits: 0,
144
+ maximumFractionDigits: 0
145
+ });
146
+ };
147
+ return /* @__PURE__ */ jsx(
148
+ ChartCard,
149
+ {
150
+ className,
151
+ title,
152
+ subtitle,
153
+ right: /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-end gap-2", children: [
154
+ currencies && currencies.length > 0 ? /* @__PURE__ */ jsx(
155
+ Select,
156
+ {
157
+ size: "sm",
158
+ fullWidth: false,
159
+ fit: true,
160
+ value: activeCurrency,
161
+ onChange: handleCurrencyChange,
162
+ options: currencies.map((option) => ({
163
+ label: option.label,
164
+ value: option.value
165
+ })),
166
+ className: "min-w-[88px]"
167
+ }
168
+ ) : null,
169
+ ranges.length > 0 ? /* @__PURE__ */ jsx(
170
+ SegmentedTabs,
171
+ {
172
+ size: "sm",
173
+ value: activeRange,
174
+ onChange: handleRangeChange,
175
+ options: ranges,
176
+ className: "max-w-full overflow-x-auto"
177
+ }
178
+ ) : null
179
+ ] }),
180
+ children: /* @__PURE__ */ jsxs("div", { className: "space-y-5", children: [
181
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4 lg:flex-row lg:items-end lg:justify-between", children: /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
182
+ /* @__PURE__ */ jsx(AssetBadge, { name, symbol, accent, icon }),
183
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-end gap-x-3 gap-y-2", children: [
184
+ /* @__PURE__ */ jsx("div", { className: "text-4xl font-semibold tracking-[-0.04em] tabular-nums text-[var(--foreground)]", children: formatValue(value) }),
185
+ change != null || changePercent != null ? /* @__PURE__ */ jsxs(
186
+ "div",
187
+ {
188
+ className: [
189
+ "mb-1 inline-flex items-center gap-1.5 rounded-full px-3 py-1 text-sm font-semibold",
190
+ positive ? "bg-emerald-50 text-emerald-700" : "bg-rose-50 text-rose-700"
191
+ ].join(" "),
192
+ children: [
193
+ positive ? /* @__PURE__ */ jsx(TrendUpIcon, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(TrendDownIcon, { className: "h-4 w-4" }),
194
+ /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: change != null ? formatNumericValue(change, {
195
+ locale,
196
+ minimumFractionDigits: 2,
197
+ maximumFractionDigits: 2,
198
+ prefix: change > 0 ? "+" : ""
199
+ }) : null }),
200
+ changePercent != null ? /* @__PURE__ */ jsxs("span", { className: "tabular-nums", children: [
201
+ "(",
202
+ formatPercentValue(changePercent, {
203
+ locale,
204
+ minimumFractionDigits: 2,
205
+ maximumFractionDigits: 2
206
+ }),
207
+ ")"
208
+ ] }) : null
209
+ ]
210
+ }
211
+ ) : null
212
+ ] }),
213
+ helperText ? /* @__PURE__ */ jsx("div", { className: "text-xs text-[var(--muted)]", children: helperText }) : null
214
+ ] }) }),
215
+ !Array.isArray(data) || data.length === 0 ? /* @__PURE__ */ jsx("div", { className: "flex h-[320px] items-center justify-center rounded-[1.75rem] border border-dashed border-[var(--border)] bg-[color-mix(in_oklab,var(--surface)_72%,transparent)] px-6 text-sm text-[var(--muted)]", children: emptyState != null ? emptyState : "Sin datos para el rango seleccionado." }) : /* @__PURE__ */ jsx(
216
+ "div",
217
+ {
218
+ className: "min-w-0 rounded-[1.75rem] border border-[var(--border)] p-3",
219
+ style: {
220
+ background: `linear-gradient(180deg, ${alphaColor(lineColor, 0.1, "color-mix(in oklab,var(--primary) 10%,transparent)")}, transparent 22%, var(--card) 68%)`
221
+ },
222
+ children: /* @__PURE__ */ jsx("div", { className: "h-[320px] min-h-[320px] w-full min-w-0 overflow-hidden", children: /* @__PURE__ */ jsx(AutoSize, { className: "h-full w-full", children: ({ width, height }) => /* @__PURE__ */ jsxs(
223
+ AreaChart,
224
+ {
225
+ width,
226
+ height,
227
+ data,
228
+ margin: { top: 18, right: 12, left: 0, bottom: 8 },
229
+ children: [
230
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("linearGradient", { id: gradientId, x1: "0", x2: "0", y1: "0", y2: "1", children: [
231
+ /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: alphaColor(lineColor, 0.32, lineColor) }),
232
+ /* @__PURE__ */ jsx("stop", { offset: "65%", stopColor: alphaColor(lineColor, 0.08, lineColor) }),
233
+ /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: alphaColor(lineColor, 0.02, lineColor) })
234
+ ] }) }),
235
+ /* @__PURE__ */ jsx(
236
+ CartesianGrid,
237
+ {
238
+ vertical: false,
239
+ stroke: "var(--grid)",
240
+ strokeDasharray: "4 8"
241
+ }
242
+ ),
243
+ /* @__PURE__ */ jsx(
244
+ XAxis,
245
+ {
246
+ dataKey: xKey,
247
+ axisLine: false,
248
+ tickLine: false,
249
+ minTickGap: 28,
250
+ tickMargin: 12,
251
+ tick: { fontSize: 11, fill: "var(--muted)" },
252
+ tickFormatter: (value2) => xTickFormatter ? xTickFormatter(value2) : String(value2 != null ? value2 : "")
253
+ }
254
+ ),
255
+ /* @__PURE__ */ jsx(
256
+ YAxis,
257
+ {
258
+ axisLine: false,
259
+ tickLine: false,
260
+ width: 72,
261
+ tickMargin: 12,
262
+ tick: { fontSize: 11, fill: "var(--muted)" },
263
+ tickFormatter: (amount) => yFormatter(Number(amount))
264
+ }
265
+ ),
266
+ /* @__PURE__ */ jsx(
267
+ Tooltip,
268
+ {
269
+ cursor: {
270
+ stroke: alphaColor(lineColor, 0.55, lineColor),
271
+ strokeWidth: 1.25,
272
+ strokeDasharray: "4 6"
273
+ },
274
+ content: ({ active, payload, label }) => {
275
+ var _a2;
276
+ if (!active || !payload || payload.length === 0) return null;
277
+ const raw = (_a2 = payload[0]) == null ? void 0 : _a2.value;
278
+ const numeric = typeof raw === "number" ? raw : Number(raw);
279
+ const formattedValue = tooltipValueFormatter ? tooltipValueFormatter(numeric, activeCurrency || currency) : formatValue(numeric, {
280
+ minimumFractionDigits: 2,
281
+ maximumFractionDigits: 2
282
+ });
283
+ return /* @__PURE__ */ jsxs("div", { className: "min-w-[140px] rounded-2xl border border-[var(--border)] bg-[color-mix(in_oklab,var(--card)_96%,white)] px-3 py-2.5 shadow-xl ring-1 ring-black/5 backdrop-blur", children: [
284
+ /* @__PURE__ */ jsx("div", { className: "text-[11px] font-medium text-[var(--muted)]", children: tooltipLabelFormatter ? tooltipLabelFormatter(label) : String(label != null ? label : "") }),
285
+ /* @__PURE__ */ jsx("div", { className: "mt-1 text-lg font-semibold tracking-[-0.03em] tabular-nums text-[var(--foreground)]", children: formattedValue })
286
+ ] });
287
+ }
288
+ }
289
+ ),
290
+ /* @__PURE__ */ jsx(
291
+ Area,
292
+ {
293
+ type: "monotone",
294
+ dataKey: yKey,
295
+ stroke: lineColor,
296
+ strokeWidth: 3,
297
+ fill: `url(#${gradientId})`,
298
+ fillOpacity: 1,
299
+ dot: false,
300
+ activeDot: {
301
+ r: 6,
302
+ strokeWidth: 3,
303
+ stroke: "#fff",
304
+ fill: lineColor
305
+ }
306
+ }
307
+ )
308
+ ]
309
+ }
310
+ ) }) })
311
+ }
312
+ )
313
+ ] })
314
+ }
315
+ );
316
+ }
317
+ export {
318
+ AssetPerformanceCard as default
319
+ };
@@ -0,0 +1,26 @@
1
+ import React__default from 'react';
2
+
3
+ type AssetTickerItem = {
4
+ id: string;
5
+ name: string;
6
+ symbol: string;
7
+ price: number | null | undefined;
8
+ priceCurrency?: string;
9
+ change?: number | null;
10
+ changePercent?: number | null;
11
+ sparkline?: number[];
12
+ icon?: React__default.ReactNode;
13
+ accent?: string;
14
+ meta?: React__default.ReactNode;
15
+ };
16
+ type AssetTickerRowProps = {
17
+ items: AssetTickerItem[];
18
+ locale?: string;
19
+ className?: string;
20
+ selectedId?: string;
21
+ onSelect?: (item: AssetTickerItem) => void;
22
+ priceFormatter?: (price: number | null | undefined, item: AssetTickerItem, locale: string) => React__default.ReactNode;
23
+ };
24
+ declare function AssetTickerRow({ items, locale, className, selectedId, onSelect, priceFormatter, }: AssetTickerRowProps): React__default.JSX.Element;
25
+
26
+ export { type AssetTickerItem, type AssetTickerRowProps, AssetTickerRow as default };
@@ -0,0 +1,26 @@
1
+ import React__default from 'react';
2
+
3
+ type AssetTickerItem = {
4
+ id: string;
5
+ name: string;
6
+ symbol: string;
7
+ price: number | null | undefined;
8
+ priceCurrency?: string;
9
+ change?: number | null;
10
+ changePercent?: number | null;
11
+ sparkline?: number[];
12
+ icon?: React__default.ReactNode;
13
+ accent?: string;
14
+ meta?: React__default.ReactNode;
15
+ };
16
+ type AssetTickerRowProps = {
17
+ items: AssetTickerItem[];
18
+ locale?: string;
19
+ className?: string;
20
+ selectedId?: string;
21
+ onSelect?: (item: AssetTickerItem) => void;
22
+ priceFormatter?: (price: number | null | undefined, item: AssetTickerItem, locale: string) => React__default.ReactNode;
23
+ };
24
+ declare function AssetTickerRow({ items, locale, className, selectedId, onSelect, priceFormatter, }: AssetTickerRowProps): React__default.JSX.Element;
25
+
26
+ export { type AssetTickerItem, type AssetTickerRowProps, AssetTickerRow as default };
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var AssetTickerRow_exports = {};
31
+ __export(AssetTickerRow_exports, {
32
+ default: () => AssetTickerRow
33
+ });
34
+ module.exports = __toCommonJS(AssetTickerRow_exports);
35
+ var import_jsx_runtime = require("react/jsx-runtime");
36
+ var import_react = __toESM(require("react"));
37
+ var import_iconos = require("./iconos");
38
+ var import_Numeric = require("./Numeric");
39
+ function alphaColor(color, alpha, fallback) {
40
+ if (!color) return fallback;
41
+ if (color.startsWith("#")) {
42
+ let hex = color.slice(1);
43
+ if (hex.length === 3) {
44
+ hex = hex.split("").map((char) => char + char).join("");
45
+ }
46
+ if (hex.length === 6) {
47
+ const r = Number.parseInt(hex.slice(0, 2), 16);
48
+ const g = Number.parseInt(hex.slice(2, 4), 16);
49
+ const b = Number.parseInt(hex.slice(4, 6), 16);
50
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
51
+ }
52
+ }
53
+ return `color-mix(in oklab, ${color} ${Math.round(alpha * 100)}%, transparent)`;
54
+ }
55
+ function Sparkline({
56
+ data,
57
+ color,
58
+ width = 128,
59
+ height = 56
60
+ }) {
61
+ var _a;
62
+ const gradientId = import_react.default.useId();
63
+ if (!Array.isArray(data) || data.length < 2) {
64
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-8 w-20 rounded-full bg-[color-mix(in_oklab,var(--surface)_80%,transparent)]" });
65
+ }
66
+ const min = Math.min(...data);
67
+ const max = Math.max(...data);
68
+ const range = max - min || 1;
69
+ const step = width / Math.max(1, data.length - 1);
70
+ const points = data.map((value, index) => {
71
+ const x = index * step;
72
+ const y = height - (value - min) / range * height;
73
+ return `${x},${y}`;
74
+ }).join(" ");
75
+ const areaPoints = `0,${height} ${points} ${width},${height}`;
76
+ const last = (_a = data[data.length - 1]) != null ? _a : 0;
77
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
78
+ "svg",
79
+ {
80
+ viewBox: `0 0 ${width} ${height}`,
81
+ className: "h-14 w-32 overflow-visible",
82
+ "aria-hidden": "true",
83
+ focusable: "false",
84
+ children: [
85
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("defs", { children: [
86
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("linearGradient", { id: `${gradientId}-line`, x1: "0", x2: "1", y1: "0", y2: "0", children: [
87
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("stop", { offset: "0%", stopColor: alphaColor(color, 0.24, color) }),
88
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("stop", { offset: "100%", stopColor: color })
89
+ ] }),
90
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("linearGradient", { id: `${gradientId}-fill`, x1: "0", x2: "0", y1: "0", y2: "1", children: [
91
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("stop", { offset: "0%", stopColor: alphaColor(color, 0.4, color) }),
92
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("stop", { offset: "58%", stopColor: alphaColor(color, 0.18, color) }),
93
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("stop", { offset: "100%", stopColor: alphaColor(color, 0.02, color) })
94
+ ] })
95
+ ] }),
96
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
97
+ "polygon",
98
+ {
99
+ points: areaPoints,
100
+ fill: `url(#${gradientId}-fill)`
101
+ }
102
+ ),
103
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
104
+ "polyline",
105
+ {
106
+ fill: "none",
107
+ stroke: `url(#${gradientId}-line)`,
108
+ strokeWidth: "2.5",
109
+ strokeLinecap: "round",
110
+ strokeLinejoin: "round",
111
+ points
112
+ }
113
+ ),
114
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
115
+ "circle",
116
+ {
117
+ cx: width,
118
+ cy: height - (last - min) / range * height,
119
+ r: "2.75",
120
+ fill: color
121
+ }
122
+ )
123
+ ]
124
+ }
125
+ );
126
+ }
127
+ function AssetAvatar({ symbol, accent, icon }) {
128
+ if (icon) {
129
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
130
+ "div",
131
+ {
132
+ className: "flex h-12 w-12 shrink-0 items-center justify-center rounded-2xl text-white shadow-sm",
133
+ style: { background: accent != null ? accent : "var(--primary)" },
134
+ children: icon
135
+ }
136
+ );
137
+ }
138
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
139
+ "div",
140
+ {
141
+ className: "flex h-12 w-12 shrink-0 items-center justify-center rounded-2xl text-sm font-semibold text-white shadow-sm",
142
+ style: { background: accent != null ? accent : "var(--primary)" },
143
+ children: symbol.slice(0, 3).toUpperCase()
144
+ }
145
+ );
146
+ }
147
+ function AssetTickerRow({
148
+ items,
149
+ locale = "es-MX",
150
+ className,
151
+ selectedId,
152
+ onSelect,
153
+ priceFormatter
154
+ }) {
155
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
156
+ "div",
157
+ {
158
+ className: [
159
+ "grid gap-3 sm:grid-cols-2 xl:grid-cols-3",
160
+ className != null ? className : ""
161
+ ].join(" "),
162
+ children: items.map((item) => {
163
+ var _a, _b, _c, _d, _e;
164
+ const positive = ((_b = (_a = item.changePercent) != null ? _a : item.change) != null ? _b : 0) >= 0;
165
+ const accent = (_c = item.accent) != null ? _c : "var(--primary)";
166
+ const selected = selectedId === item.id;
167
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
168
+ "button",
169
+ {
170
+ type: "button",
171
+ onClick: () => onSelect == null ? void 0 : onSelect(item),
172
+ className: [
173
+ "group relative flex w-full items-center gap-4 overflow-hidden rounded-[1.6rem] border px-4 py-3 text-left shadow-sm transition",
174
+ "bg-[linear-gradient(180deg,color-mix(in_oklab,var(--card)_96%,white),var(--card))]",
175
+ "hover:-translate-y-0.5 hover:shadow-md focus:outline-none focus-visible:ring-2 focus-visible:ring-[color-mix(in_oklab,var(--ring)_35%,transparent)]",
176
+ selected ? "border-[color-mix(in_oklab,var(--ring)_40%,transparent)] ring-1 ring-[color-mix(in_oklab,var(--ring)_22%,transparent)]" : "border-[var(--border)]"
177
+ ].join(" "),
178
+ children: [
179
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
180
+ "div",
181
+ {
182
+ "aria-hidden": "true",
183
+ className: "pointer-events-none absolute inset-y-0 right-0 hidden w-1/2 sm:block",
184
+ style: {
185
+ background: `linear-gradient(90deg, transparent 0%, ${alphaColor(accent, 0.08, accent)} 32%, ${alphaColor(accent, 0.18, accent)} 100%)`
186
+ }
187
+ }
188
+ ),
189
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
190
+ "div",
191
+ {
192
+ "aria-hidden": "true",
193
+ className: "pointer-events-none absolute inset-x-4 bottom-0 h-px",
194
+ style: { background: `linear-gradient(90deg, transparent, ${alphaColor(accent, 0.42, accent)}, transparent)` }
195
+ }
196
+ ),
197
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative z-10 shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AssetAvatar, { symbol: item.symbol, accent, icon: item.icon }) }),
198
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "relative z-10 min-w-0 flex-1", children: [
199
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2", children: [
200
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "truncate text-[15px] font-semibold text-[var(--foreground)]", children: item.name }),
201
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "rounded-full bg-[color-mix(in_oklab,var(--surface)_82%,transparent)] px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.18em] text-[var(--muted)]", children: item.symbol })
202
+ ] }),
203
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-1 flex flex-wrap items-center gap-x-2 gap-y-1", children: [
204
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-sm font-semibold tabular-nums text-[var(--foreground)]", children: priceFormatter ? priceFormatter(item.price, item, locale) : (0, import_Numeric.formatCurrencyValue)(item.price, {
205
+ currency: (_d = item.priceCurrency) != null ? _d : "USD",
206
+ locale,
207
+ minimumFractionDigits: 2,
208
+ maximumFractionDigits: 2
209
+ }) }),
210
+ item.changePercent != null ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
211
+ "span",
212
+ {
213
+ className: [
214
+ "inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-semibold",
215
+ positive ? "bg-emerald-50 text-emerald-700" : "bg-rose-50 text-rose-700"
216
+ ].join(" "),
217
+ children: [
218
+ positive ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_iconos.TrendUpIcon, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_iconos.TrendDownIcon, { className: "h-3.5 w-3.5" }),
219
+ (0, import_Numeric.formatPercentValue)(item.changePercent, {
220
+ locale,
221
+ minimumFractionDigits: 2,
222
+ maximumFractionDigits: 2
223
+ })
224
+ ]
225
+ }
226
+ ) : item.change != null ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
227
+ "span",
228
+ {
229
+ className: [
230
+ "inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-semibold",
231
+ positive ? "bg-emerald-50 text-emerald-700" : "bg-rose-50 text-rose-700"
232
+ ].join(" "),
233
+ children: [
234
+ positive ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_iconos.TrendUpIcon, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_iconos.TrendDownIcon, { className: "h-3.5 w-3.5" }),
235
+ (0, import_Numeric.formatNumericValue)(item.change, {
236
+ locale,
237
+ minimumFractionDigits: 2,
238
+ maximumFractionDigits: 2,
239
+ prefix: item.change > 0 ? "+" : ""
240
+ })
241
+ ]
242
+ }
243
+ ) : null
244
+ ] }),
245
+ item.meta ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mt-1 text-xs text-[var(--muted)]", children: item.meta }) : null
246
+ ] }),
247
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative z-10 hidden shrink-0 sm:block", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Sparkline, { data: (_e = item.sparkline) != null ? _e : [], color: accent }) })
248
+ ]
249
+ },
250
+ item.id
251
+ );
252
+ })
253
+ }
254
+ );
255
+ }