@beweco/aurora-ui 0.6.67 → 0.6.69-qa.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/css/styles.css +1 -1
- package/dist/index.cjs.js +285 -49
- package/dist/index.esm.js +276 -51
- package/dist/types/components/area-line-chart/AreaLineChart.d.ts +1 -1
- package/dist/types/components/area-line-chart/AreaLineChart.d.ts.map +1 -1
- package/dist/types/components/area-line-chart/AreaLineChart.types.d.ts +8 -0
- package/dist/types/components/area-line-chart/AreaLineChart.types.d.ts.map +1 -1
- package/dist/types/components/donut-chart/DonutChart.d.ts +9 -0
- package/dist/types/components/donut-chart/DonutChart.d.ts.map +1 -0
- package/dist/types/components/donut-chart/DonutChart.types.d.ts +51 -0
- package/dist/types/components/donut-chart/DonutChart.types.d.ts.map +1 -0
- package/dist/types/components/donut-chart/donut-chart.utils.d.ts +15 -0
- package/dist/types/components/donut-chart/donut-chart.utils.d.ts.map +1 -0
- package/dist/types/components/donut-chart/index.d.ts +4 -0
- package/dist/types/components/donut-chart/index.d.ts.map +1 -0
- package/dist/types/components/menu/Menu.d.ts.map +1 -1
- package/dist/types/components/menu/Menu.types.d.ts +7 -0
- package/dist/types/components/menu/Menu.types.d.ts.map +1 -1
- package/dist/types/components/menu/get-user-initials.d.ts +15 -0
- package/dist/types/components/menu/get-user-initials.d.ts.map +1 -0
- package/dist/types/components/menu-claw/MenuClaw.d.ts.map +1 -1
- package/dist/types/components/menu-claw/_internal/menu-claw-nav/MenuClawNavItem.d.ts +17 -0
- package/dist/types/components/menu-claw/_internal/menu-claw-nav/MenuClawNavItem.d.ts.map +1 -0
- package/dist/types/components/menu-claw/_internal/menu-claw-nav/MenuClawNavItem.types.d.ts +18 -0
- package/dist/types/components/menu-claw/_internal/menu-claw-nav/MenuClawNavItem.types.d.ts.map +1 -0
- package/dist/types/components/menu-claw/_internal/menu-claw-nav/index.d.ts +3 -0
- package/dist/types/components/menu-claw/_internal/menu-claw-nav/index.d.ts.map +1 -0
- package/dist/types/components/phone/Phone.d.ts.map +1 -1
- package/dist/types/components/ranked-bar-list/RankedBarList.d.ts +10 -0
- package/dist/types/components/ranked-bar-list/RankedBarList.d.ts.map +1 -0
- package/dist/types/components/ranked-bar-list/RankedBarList.types.d.ts +41 -0
- package/dist/types/components/ranked-bar-list/RankedBarList.types.d.ts.map +1 -0
- package/dist/types/components/ranked-bar-list/index.d.ts +4 -0
- package/dist/types/components/ranked-bar-list/index.d.ts.map +1 -0
- package/dist/types/components/ranked-bar-list/ranked-bar-list.utils.d.ts +16 -0
- package/dist/types/components/ranked-bar-list/ranked-bar-list.utils.d.ts.map +1 -0
- package/dist/types/components/schedule-row/schedule-row.d.ts.map +1 -1
- package/dist/types/components/stat-tile/StatTile.d.ts +10 -0
- package/dist/types/components/stat-tile/StatTile.d.ts.map +1 -0
- package/dist/types/components/stat-tile/StatTile.types.d.ts +40 -0
- package/dist/types/components/stat-tile/StatTile.types.d.ts.map +1 -0
- package/dist/types/components/stat-tile/index.d.ts +3 -0
- package/dist/types/components/stat-tile/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
|
@@ -581,9 +581,9 @@ function ChartTooltip(_a) {
|
|
|
581
581
|
})] }));
|
|
582
582
|
}
|
|
583
583
|
function AreaLineChart(_a) {
|
|
584
|
-
var data = _a.data, xAxisKey = _a.xAxisKey, series = _a.series, title = _a.title, value = _a.value, trend = _a.trend, _b = _a.height, height = _b === void 0 ? 200 : _b, _c = _a.className, className = _c === void 0 ? "" : _c, _d = _a.wrappedInCard, wrappedInCard = _d === void 0 ? false : _d, formatTooltipValue = _a.formatTooltipValue;
|
|
584
|
+
var data = _a.data, xAxisKey = _a.xAxisKey, series = _a.series, title = _a.title, value = _a.value, trend = _a.trend, _b = _a.height, height = _b === void 0 ? 200 : _b, _c = _a.className, className = _c === void 0 ? "" : _c, _d = _a.wrappedInCard, wrappedInCard = _d === void 0 ? false : _d, formatTooltipValue = _a.formatTooltipValue, _e = _a.yAxisDomain, yAxisDomain = _e === void 0 ? [0, "dataMax + 100"] : _e;
|
|
585
585
|
var hasHeader = title != null || value != null || trend != null || series.length > 0;
|
|
586
|
-
var content = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [hasHeader && (jsxRuntime.jsxs("div", { className: "flex items-start justify-between mb-6", children: [jsxRuntime.jsxs("div", { children: [title != null && (jsxRuntime.jsx(H3, { className: "text-xs font-semibold text-gray-500 uppercase tracking-wide mb-1", children: title })), value != null && (jsxRuntime.jsxs("div", { className: "flex items-baseline gap-2", children: [jsxRuntime.jsx("span", { className: "text-2xl font-bold text-gray-900", children: value }), trend != null && (jsxRuntime.jsx("span", { className: "text-xs font-medium text-yellow-600 bg-yellow-50 px-2 py-1 rounded", children: trend }))] }))] }), series.length > 0 && (jsxRuntime.jsx("div", { className: "flex items-center gap-4", children: series.map(function (s) { return (jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntime.jsx("svg", { width: "16", height: "2", viewBox: "0 0 16 2", fill: "none", children: jsxRuntime.jsx("line", { x1: "0", y1: "1", x2: "16", y2: "1", stroke: s.color, strokeWidth: "2" }) }), jsxRuntime.jsx("span", { className: "text-xs text-gray-600 font-medium", children: s.label })] }, s.dataKey)); }) }))] })), jsxRuntime.jsx("div", { className: "w-full", style: { height: "".concat(height, "px") }, children: jsxRuntime.jsx(recharts.ResponsiveContainer, { width: "100%", height: "100%", children: jsxRuntime.jsxs(recharts.LineChart, { data: data, margin: { top: 5, right: 5, left: 5, bottom: 5 }, children: [jsxRuntime.jsx("defs", { children: series.map(function (s) { return (jsxRuntime.jsxs("linearGradient", { id: "area-line-chart-".concat(s.dataKey), x1: "0", y1: "0", x2: "0", y2: "1", children: [jsxRuntime.jsx("stop", { offset: "0%", stopColor: s.color, stopOpacity: 0.3 }), jsxRuntime.jsx("stop", { offset: "50%", stopColor: s.color, stopOpacity: 0.15 }), jsxRuntime.jsx("stop", { offset: "100%", stopColor: s.color, stopOpacity: 0 })] }, s.dataKey)); }) }), jsxRuntime.jsx(recharts.XAxis, { dataKey: xAxisKey, axisLine: false, tickLine: false, tick: { fill: "#9ca3af", fontSize: 12 }, dy: 10 }), jsxRuntime.jsx(recharts.YAxis, { axisLine: false, tickLine: false, tick: { fill: "transparent", fontSize: 0 }, width: 0, tickCount: 6, domain:
|
|
586
|
+
var content = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [hasHeader && (jsxRuntime.jsxs("div", { className: "flex items-start justify-between mb-6", children: [jsxRuntime.jsxs("div", { children: [title != null && (jsxRuntime.jsx(H3, { className: "text-xs font-semibold text-gray-500 uppercase tracking-wide mb-1", children: title })), value != null && (jsxRuntime.jsxs("div", { className: "flex items-baseline gap-2", children: [jsxRuntime.jsx("span", { className: "text-2xl font-bold text-gray-900", children: value }), trend != null && (jsxRuntime.jsx("span", { className: "text-xs font-medium text-yellow-600 bg-yellow-50 px-2 py-1 rounded", children: trend }))] }))] }), series.length > 0 && (jsxRuntime.jsx("div", { className: "flex flex-wrap items-center gap-4", children: series.map(function (s) { return (jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntime.jsx("svg", { width: "16", height: "2", viewBox: "0 0 16 2", fill: "none", children: jsxRuntime.jsx("line", { x1: "0", y1: "1", x2: "16", y2: "1", stroke: s.color, strokeWidth: "2" }) }), jsxRuntime.jsx("span", { className: "text-xs text-gray-600 font-medium", children: s.label })] }, s.dataKey)); }) }))] })), jsxRuntime.jsx("div", { className: "w-full", style: { height: "".concat(height, "px") }, children: jsxRuntime.jsx(recharts.ResponsiveContainer, { width: "100%", height: "100%", children: jsxRuntime.jsxs(recharts.LineChart, { data: data, margin: { top: 5, right: 5, left: 5, bottom: 5 }, children: [jsxRuntime.jsx("defs", { children: series.map(function (s) { return (jsxRuntime.jsxs("linearGradient", { id: "area-line-chart-".concat(s.dataKey), x1: "0", y1: "0", x2: "0", y2: "1", children: [jsxRuntime.jsx("stop", { offset: "0%", stopColor: s.color, stopOpacity: 0.3 }), jsxRuntime.jsx("stop", { offset: "50%", stopColor: s.color, stopOpacity: 0.15 }), jsxRuntime.jsx("stop", { offset: "100%", stopColor: s.color, stopOpacity: 0 })] }, s.dataKey)); }) }), jsxRuntime.jsx(recharts.XAxis, { dataKey: xAxisKey, axisLine: false, tickLine: false, tick: { fill: "#9ca3af", fontSize: 12 }, dy: 10 }), jsxRuntime.jsx(recharts.YAxis, { axisLine: false, tickLine: false, tick: { fill: "transparent", fontSize: 0 }, width: 0, tickCount: 6, domain: yAxisDomain, allowDecimals: false }), jsxRuntime.jsx(recharts.CartesianGrid, { strokeDasharray: "3 3", stroke: "#d1d5db", strokeOpacity: 0.5, vertical: false, horizontal: true }), jsxRuntime.jsx(recharts.Tooltip, { content: jsxRuntime.jsx(ChartTooltip, { series: series, formatValue: formatTooltipValue }) }), series.map(function (s) { return (jsxRuntime.jsx(recharts.Area, { type: "natural", dataKey: s.dataKey, stroke: "none", fill: "url(#area-line-chart-".concat(s.dataKey, ")"), animationDuration: 1500, animationEasing: "ease-in-out" }, "area-".concat(s.dataKey))); }), series.map(function (s) { return (jsxRuntime.jsx(recharts.Line, { type: "natural", dataKey: s.dataKey, name: s.dataKey, stroke: s.color, strokeWidth: 3, dot: false, activeDot: {
|
|
587
587
|
r: 6,
|
|
588
588
|
fill: s.color,
|
|
589
589
|
stroke: "#fff",
|
|
@@ -2946,6 +2946,65 @@ var DateSelector = function (_a) {
|
|
|
2946
2946
|
return (jsxRuntime.jsxs("div", { className: "w-full flex flex-wrap xs:gap-5 justify-between items-center ".concat(className), children: [jsxRuntime.jsxs(react.RadioGroup, __assign({ color: "primary", orientation: "horizontal", size: "sm", value: type, onValueChange: handleTypeChange }, radioGroupProps, { children: [jsxRuntime.jsx(react.Radio, __assign({ value: exports.HolidayType.SingleDay }, radioItemProps, { children: t.dayOption })), jsxRuntime.jsx(react.Radio, __assign({ value: exports.HolidayType.DateRange }, radioItemProps, { children: t.dateRangeOption }))] })), type === exports.HolidayType.DateRange ? (jsxRuntime.jsx(react.DateRangePicker, __assign({ className: "xs:w-full md:flex-1 md:max-w-xs", value: dateRange || null, onChange: handleDateRangeChange, "aria-label": t.selectDateRangeAriaLabel, endContent: jsxRuntime.jsx(IconComponent, { icon: "solar:calendar-outline" }) }, dateRangePickerProps))) : (jsxRuntime.jsx(react.DatePicker, __assign({ className: "xs:w-full md:flex-1 md:max-w-40", value: date || null, onChange: handleDateChange, endContent: jsxRuntime.jsx(IconComponent, { icon: "solar:calendar-outline" }), "aria-label": t.selectDateAriaLabel }, datePickerProps)))] }));
|
|
2947
2947
|
};
|
|
2948
2948
|
|
|
2949
|
+
/** Paleta categórica por defecto: primary/secondary/success/warning/danger de BeweOS. */
|
|
2950
|
+
var DEFAULT_DONUT_COLORS = [
|
|
2951
|
+
"#006fee",
|
|
2952
|
+
"#7828c8",
|
|
2953
|
+
"#17c964",
|
|
2954
|
+
"#f5a524",
|
|
2955
|
+
"#f31260",
|
|
2956
|
+
];
|
|
2957
|
+
function safeValue$1(value) {
|
|
2958
|
+
return Number.isFinite(value) && value > 0 ? value : 0;
|
|
2959
|
+
}
|
|
2960
|
+
function computeTotal(data) {
|
|
2961
|
+
return data.reduce(function (sum, d) { return sum + safeValue$1(d.value); }, 0);
|
|
2962
|
+
}
|
|
2963
|
+
/**
|
|
2964
|
+
* `true` cuando no hay datos o todos los valores son 0 — mismo criterio que el
|
|
2965
|
+
* `NotData` legacy de Guru.js: un donut sin nada que repartir no aporta información.
|
|
2966
|
+
*/
|
|
2967
|
+
function isDonutEmpty(data) {
|
|
2968
|
+
return data.length === 0 || computeTotal(data) === 0;
|
|
2969
|
+
}
|
|
2970
|
+
/**
|
|
2971
|
+
* Resuelve las proporciones y el color final de cada categoría.
|
|
2972
|
+
* El color propio de cada dato tiene prioridad; si falta, se cicla `palette` por índice.
|
|
2973
|
+
*/
|
|
2974
|
+
function computeSlices(data, palette) {
|
|
2975
|
+
if (palette === void 0) { palette = DEFAULT_DONUT_COLORS; }
|
|
2976
|
+
var total = computeTotal(data);
|
|
2977
|
+
return data.map(function (datum, index) {
|
|
2978
|
+
var _a;
|
|
2979
|
+
var value = safeValue$1(datum.value);
|
|
2980
|
+
return __assign(__assign({}, datum), { value: value, color: (_a = datum.color) !== null && _a !== void 0 ? _a : palette[index % palette.length], percent: total > 0 ? value / total : 0 });
|
|
2981
|
+
});
|
|
2982
|
+
}
|
|
2983
|
+
|
|
2984
|
+
var DEFAULT_TRANSLATIONS$b = {
|
|
2985
|
+
emptyState: "Sin datos para mostrar",
|
|
2986
|
+
totalLabel: "Total",
|
|
2987
|
+
};
|
|
2988
|
+
/**
|
|
2989
|
+
* DonutChart - Gráfico circular (pie o donut, según `innerRadiusRatio`) con
|
|
2990
|
+
* leyenda y total central propios, renderizados fuera del árbol de Recharts
|
|
2991
|
+
* para que sean estables independientemente del tamaño medido del contenedor.
|
|
2992
|
+
*/
|
|
2993
|
+
var DonutChart = function (_a) {
|
|
2994
|
+
var data = _a.data, _b = _a.height, height = _b === void 0 ? 220 : _b, _c = _a.innerRadiusRatio, innerRadiusRatio = _c === void 0 ? 0.65 : _c, _d = _a.showLegend, showLegend = _d === void 0 ? true : _d, _e = _a.showTotal, showTotal = _e === void 0 ? true : _e, colors = _a.colors, formatValue = _a.formatValue, _f = _a.translations, translations = _f === void 0 ? {} : _f, className = _a.className;
|
|
2995
|
+
var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$b), translations);
|
|
2996
|
+
if (isDonutEmpty(data)) {
|
|
2997
|
+
return (jsxRuntime.jsx("div", { className: className, children: jsxRuntime.jsx(P, { children: t.emptyState }) }));
|
|
2998
|
+
}
|
|
2999
|
+
var slices = computeSlices(data, colors);
|
|
3000
|
+
var total = slices.reduce(function (sum, s) { return sum + s.value; }, 0);
|
|
3001
|
+
var format = function (value) {
|
|
3002
|
+
return formatValue ? formatValue(value) : String(value);
|
|
3003
|
+
};
|
|
3004
|
+
var isDonut = innerRadiusRatio > 0;
|
|
3005
|
+
return (jsxRuntime.jsxs("div", { className: className, children: [jsxRuntime.jsxs("div", { className: "relative w-full", style: { height: height }, children: [jsxRuntime.jsx(recharts.ResponsiveContainer, { width: "100%", height: "100%", children: jsxRuntime.jsxs(recharts.PieChart, { children: [jsxRuntime.jsx(recharts.Pie, { data: slices, dataKey: "value", nameKey: "name", innerRadius: isDonut ? "".concat(innerRadiusRatio * 100, "%") : 0, outerRadius: "90%", stroke: "none", children: slices.map(function (slice) { return (jsxRuntime.jsx(recharts.Cell, { fill: slice.color }, slice.name)); }) }), jsxRuntime.jsx(recharts.Tooltip, { formatter: function (value) { return format(value); } })] }) }), isDonut && showTotal && (jsxRuntime.jsxs("div", { className: "aurora-donut-total pointer-events-none absolute inset-0 flex flex-col items-center justify-center", "aria-hidden": "true", children: [jsxRuntime.jsx("span", { className: "text-xs text-foreground-500", children: t.totalLabel }), jsxRuntime.jsx("span", { className: "text-xl font-semibold", children: format(total) })] }))] }), showLegend && (jsxRuntime.jsx("ul", { className: "mt-3 flex flex-wrap gap-3", children: slices.map(function (slice) { return (jsxRuntime.jsxs("li", { className: "flex items-center gap-1.5 text-xs", children: [jsxRuntime.jsx("span", { className: "h-2 w-2 rounded-full", style: { backgroundColor: slice.color }, "aria-hidden": "true" }), jsxRuntime.jsx("span", { children: slice.name }), jsxRuntime.jsxs("span", { className: "text-foreground-500", children: [Math.round(slice.percent * 100), "%"] })] }, slice.name)); }) }))] }));
|
|
3006
|
+
};
|
|
3007
|
+
|
|
2949
3008
|
var H1 = function (_a) {
|
|
2950
3009
|
var children = _a.children, className = _a.className, props = __rest(_a, ["children", "className"]);
|
|
2951
3010
|
return (jsxRuntime.jsx("h1", __assign({ className: react.cn("text-xl font-bold", className) }, props, { children: children })));
|
|
@@ -3011,12 +3070,12 @@ var NotificationButton = function (_a) {
|
|
|
3011
3070
|
};
|
|
3012
3071
|
NotificationButton.displayName = "NotificationButton";
|
|
3013
3072
|
|
|
3014
|
-
var DEFAULT_TRANSLATIONS$
|
|
3073
|
+
var DEFAULT_TRANSLATIONS$a = {
|
|
3015
3074
|
logout: "Cerrar sesión",
|
|
3016
3075
|
};
|
|
3017
3076
|
var HeaderComponent = function (_a) {
|
|
3018
3077
|
var notificationCount = _a.notificationCount, options = _a.options, onMenuClick = _a.onMenuClick, onLogout = _a.onLogout, _b = _a.translations, translations = _b === void 0 ? {} : _b, breadcrumbs = _a.breadcrumbs, extraContent = _a.extraContent, _c = _a.showMenuButton, showMenuButton = _c === void 0 ? true : _c, onNotificationClick = _a.onNotificationClick, onOptionSelect = _a.onOptionSelect, onBreadcrumbClick = _a.onBreadcrumbClick;
|
|
3019
|
-
var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$
|
|
3078
|
+
var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$a), translations);
|
|
3020
3079
|
return (jsxRuntime.jsx("header", { className: "header__container", children: jsxRuntime.jsxs("div", { className: "flex items-center justify-between w-full", children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [showMenuButton && (jsxRuntime.jsx(react.Button, { className: "sm:hidden", isIconOnly: true, variant: "light", startContent: jsxRuntime.jsx(IconComponent, { icon: "solar:hamburger-menu-linear" }), onPress: onMenuClick })), breadcrumbs && breadcrumbs.length > 0 && (jsxRuntime.jsx(BreadcrumbsComponent, { items: breadcrumbs, onItemClick: onBreadcrumbClick }))] }), jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [extraContent, jsxRuntime.jsx(NotificationButton, { notificationCount: notificationCount, onPress: onNotificationClick }), jsxRuntime.jsx(ConfigMenu, { options: options, onLogout: onLogout, onOptionSelect: onOptionSelect, translations: t })] })] }) }));
|
|
3021
3080
|
};
|
|
3022
3081
|
HeaderComponent.displayName = "Header";
|
|
@@ -3140,7 +3199,7 @@ KanbanColumn.displayName = "KanbanColumn";
|
|
|
3140
3199
|
* Traducciones por defecto en español.
|
|
3141
3200
|
* Se mezclan con las traducciones proporcionadas por el usuario.
|
|
3142
3201
|
*/
|
|
3143
|
-
var DEFAULT_TRANSLATIONS$
|
|
3202
|
+
var DEFAULT_TRANSLATIONS$9 = {
|
|
3144
3203
|
dropHere: "Soltar aquí",
|
|
3145
3204
|
emptyMessage: "No hay elementos",
|
|
3146
3205
|
};
|
|
@@ -3174,7 +3233,7 @@ var columnGapClasses = {
|
|
|
3174
3233
|
var KanbanComponent = function (_a) {
|
|
3175
3234
|
var columns = _a.columns, renderItem = _a.renderItem, onCardClick = _a.onCardClick, onItemMove = _a.onItemMove, isDraggable = _a.isDraggable, cardClassName = _a.cardClassName, isCardClickable = _a.isCardClickable, className = _a.className, _b = _a.columnWidth, columnWidth = _b === void 0 ? "280px" : _b, _c = _a.columnGap, columnGap = _c === void 0 ? "md" : _c, _d = _a.horizontalScroll, horizontalScroll = _d === void 0 ? true : _d, columnMaxHeight = _a.columnMaxHeight, renderColumnHeader = _a.renderColumnHeader, renderEmptyState = _a.renderEmptyState, _e = _a.translations, translations = _e === void 0 ? {} : _e, onLoadMore = _a.onLoadMore;
|
|
3176
3235
|
// Mezclar traducciones del usuario con las por defecto
|
|
3177
|
-
var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$
|
|
3236
|
+
var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$9), translations);
|
|
3178
3237
|
// Determinar si drag está habilitado
|
|
3179
3238
|
var dragEnabled = isDraggable !== null && isDraggable !== void 0 ? isDraggable : !!onItemMove;
|
|
3180
3239
|
// Estado del drag actual
|
|
@@ -3332,6 +3391,32 @@ function getSelectedKeyFromPath(pathname, items) {
|
|
|
3332
3391
|
return undefined;
|
|
3333
3392
|
}
|
|
3334
3393
|
|
|
3394
|
+
/**
|
|
3395
|
+
* Deriva las iniciales para el avatar del usuario a partir de su nombre completo.
|
|
3396
|
+
*
|
|
3397
|
+
* Muestra la inicial del nombre + la inicial del primer apellido (2 letras en
|
|
3398
|
+
* mayúsculas), p. ej. "Roser Ruiz" -> "RR". Si el usuario solo tiene un token
|
|
3399
|
+
* (nombre sin apellido) devuelve una sola inicial. Si no hay texto, devuelve "".
|
|
3400
|
+
*
|
|
3401
|
+
* TECH-1727: reemplaza el comportamiento por defecto de HeroUI (`safeText`), que
|
|
3402
|
+
* muestra las 3 primeras letras del nombre ("Roser Ruiz" -> "Ros").
|
|
3403
|
+
*
|
|
3404
|
+
* @param fullName Nombre completo del usuario (se usa el mismo valor que el label).
|
|
3405
|
+
* @returns Iniciales en mayúsculas (0, 1 o 2 letras).
|
|
3406
|
+
*/
|
|
3407
|
+
var getUserInitials = function (fullName) {
|
|
3408
|
+
var tokens = fullName.trim().split(/\s+/).filter(Boolean);
|
|
3409
|
+
if (tokens.length === 0) {
|
|
3410
|
+
return "";
|
|
3411
|
+
}
|
|
3412
|
+
var firstInitial = tokens[0].charAt(0).toUpperCase();
|
|
3413
|
+
if (tokens.length === 1) {
|
|
3414
|
+
return firstInitial;
|
|
3415
|
+
}
|
|
3416
|
+
var secondInitial = tokens[1].charAt(0).toUpperCase();
|
|
3417
|
+
return "".concat(firstInitial).concat(secondInitial);
|
|
3418
|
+
};
|
|
3419
|
+
|
|
3335
3420
|
exports.EnumMenuNavListItem = void 0;
|
|
3336
3421
|
(function (EnumMenuNavListItem) {
|
|
3337
3422
|
EnumMenuNavListItem["Nest"] = "nest";
|
|
@@ -3492,7 +3577,7 @@ var MenuNavList = React.forwardRef(function (_a, ref) {
|
|
|
3492
3577
|
});
|
|
3493
3578
|
MenuNavList.displayName = "MenuNavList";
|
|
3494
3579
|
|
|
3495
|
-
var DEFAULT_TRANSLATIONS$
|
|
3580
|
+
var DEFAULT_TRANSLATIONS$8 = {
|
|
3496
3581
|
menuLabel: "Menú",
|
|
3497
3582
|
closeSidebarAriaLabel: "Cerrar menú lateral",
|
|
3498
3583
|
mobileNavAriaLabel: "Navegación móvil",
|
|
@@ -3507,10 +3592,10 @@ var DEFAULT_TRANSLATIONS$6 = {
|
|
|
3507
3592
|
*/
|
|
3508
3593
|
var MenuComponent = React.memo(function Menu(_a) {
|
|
3509
3594
|
var _b, _c;
|
|
3510
|
-
var commerceInfo = _a.commerceInfo, userInfo = _a.userInfo, helpButton = _a.helpButton, isOpenSidebar = _a.isOpenSidebar, onOpenSidebarChange = _a.onOpenSidebarChange, menuItems = _a.menuItems, mobileBottomBarGroupKey = _a.mobileBottomBarGroupKey, _d = _a.showNativeMenu, showNativeMenu = _d === void 0 ? true : _d, _e = _a.translations, translations = _e === void 0 ? {} : _e;
|
|
3595
|
+
var commerceInfo = _a.commerceInfo, userInfo = _a.userInfo, helpButton = _a.helpButton, isOpenSidebar = _a.isOpenSidebar, onOpenSidebarChange = _a.onOpenSidebarChange, menuItems = _a.menuItems, mobileBottomBarGroupKey = _a.mobileBottomBarGroupKey, _d = _a.showNativeMenu, showNativeMenu = _d === void 0 ? true : _d, onUserInfoClick = _a.onUserInfoClick, _e = _a.translations, translations = _e === void 0 ? {} : _e;
|
|
3511
3596
|
var _f = React.useState(false), isCollapsed = _f[0], setIsCollapsed = _f[1];
|
|
3512
3597
|
var _g = React.useState(false), logoError = _g[0], setLogoError = _g[1];
|
|
3513
|
-
var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$
|
|
3598
|
+
var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$8), translations);
|
|
3514
3599
|
var selectedKey = React.useMemo(function () {
|
|
3515
3600
|
var _a, _b, _c;
|
|
3516
3601
|
if (menuItems.selectedPath) {
|
|
@@ -3547,6 +3632,18 @@ var MenuComponent = React.memo(function Menu(_a) {
|
|
|
3547
3632
|
var handleSidebarClose = React.useCallback(function () {
|
|
3548
3633
|
onOpenSidebarChange === null || onOpenSidebarChange === void 0 ? void 0 : onOpenSidebarChange(false);
|
|
3549
3634
|
}, [onOpenSidebarChange]);
|
|
3635
|
+
// TECH-1784: clic en el bloque de usuario -> acción del consumidor (ej.
|
|
3636
|
+
// navegar a /profile) y cierre del sidebar en móvil, igual que los ítems.
|
|
3637
|
+
var handleUserInfoClick = React.useCallback(function () {
|
|
3638
|
+
onUserInfoClick === null || onUserInfoClick === void 0 ? void 0 : onUserInfoClick();
|
|
3639
|
+
handleSidebarClose();
|
|
3640
|
+
}, [onUserInfoClick, handleSidebarClose]);
|
|
3641
|
+
// Contenido del bloque de usuario (avatar + nombre + rol), reutilizado
|
|
3642
|
+
// tanto en la variante estática como en la interactiva (TECH-1784).
|
|
3643
|
+
var userInfoContent = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(react.Avatar, { size: "md", src: ((_b = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _b === void 0 ? void 0 : _b.trim()) || undefined, color: !((_c = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _c === void 0 ? void 0 : _c.trim()) ? "warning" : "default", name: userName,
|
|
3644
|
+
// TECH-1727: inicial de nombre + inicial de primer apellido
|
|
3645
|
+
// (p. ej. "Roser Ruiz" -> "RR") en vez de las 3 primeras letras.
|
|
3646
|
+
getInitials: getUserInitials, className: "shrink-0" }), jsxRuntime.jsxs("div", { className: "collapsible-item flex min-w-0 flex-col overflow-hidden", children: [jsxRuntime.jsx("p", { className: "text-small font-medium text-default-900 truncate", children: userName }), jsxRuntime.jsx("p", { className: "text-tiny text-default-400 truncate", children: userRole })] })] }));
|
|
3550
3647
|
var handleSidebarOpen = React.useCallback(function () {
|
|
3551
3648
|
onOpenSidebarChange === null || onOpenSidebarChange === void 0 ? void 0 : onOpenSidebarChange(true);
|
|
3552
3649
|
}, [onOpenSidebarChange]);
|
|
@@ -3686,7 +3783,7 @@ var MenuComponent = React.memo(function Menu(_a) {
|
|
|
3686
3783
|
flexDirection: isCollapsed ? "column-reverse" : "row",
|
|
3687
3784
|
}, children: [jsxRuntime.jsxs("div", { className: "flex flex-row items-center justify-center ".concat(isCollapsed ? "gap-0" : "gap-2"), children: [jsxRuntime.jsx("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded-full bg-foreground text-background", children: hasValidLogo ? (jsxRuntime.jsx("img", { src: commerceInfo.logo, alt: "".concat(t.logoAlt, " ").concat(commerceName), className: "h-full w-full object-cover", onError: function () { return setLogoError(true); } })) : (jsxRuntime.jsx(IconComponent, { icon: "solar:buildings-2-outline", size: "sm", className: "shrink-0", "aria-hidden": true })) }), jsxRuntime.jsx("span", { className: "collapsible-item text-small font-bold truncate min-w-0", children: commerceName })] }), jsxRuntime.jsxs("div", { className: "flex items-center", children: [jsxRuntime.jsx(IconComponent, { icon: "material-symbols-light:close", size: "lg", className: "cursor-pointer block sm:hidden", onClick: handleSidebarClose }), jsxRuntime.jsx(IconComponent, { icon: isCollapsed
|
|
3688
3785
|
? "solar:alt-arrow-right-outline"
|
|
3689
|
-
: "solar:alt-arrow-left-outline", size: "lg", className: "hidden sm:block cursor-pointer", onClick: handleCollapseToggle })] })] }), jsxRuntime.jsx(react.Spacer, { y: 6 }), jsxRuntime.
|
|
3786
|
+
: "solar:alt-arrow-left-outline", size: "lg", className: "hidden sm:block cursor-pointer", onClick: handleCollapseToggle })] })] }), jsxRuntime.jsx(react.Spacer, { y: 6 }), onUserInfoClick ? (jsxRuntime.jsx("button", { type: "button", onClick: handleUserInfoClick, className: "content__menu--user w-full text-left cursor-pointer rounded-large border-none bg-transparent transition-colors hover:bg-default/40 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus ".concat(isCollapsed ? "gap-0" : "gap-3"), children: userInfoContent })) : (jsxRuntime.jsx("div", { className: "content__menu--user ".concat(isCollapsed ? "gap-0" : "gap-3"), children: userInfoContent })), jsxRuntime.jsxs("div", { className: "".concat(!isCollapsed ? "flex-1" : "h-full", " min-h-0 py-6 relative"), children: [!isCollapsed && showScrollArrows && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [scrollState.canScrollUp && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: "menu-scroll-fade menu-scroll-fade--up", "aria-hidden": "true" }), jsxRuntime.jsx("button", { type: "button", "aria-label": t.scrollUpAriaLabel, className: "menu-scroll-chevron menu-scroll-chevron--up", onClick: handleScrollUp, children: jsxRuntime.jsx(IconComponent, { icon: "solar:alt-arrow-up-outline", size: "md", "aria-hidden": true }) })] })), scrollState.canScrollDown && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: "menu-scroll-fade menu-scroll-fade--down", "aria-hidden": "true" }), jsxRuntime.jsx("button", { type: "button", "aria-label": t.scrollDownAriaLabel, className: "menu-scroll-chevron menu-scroll-chevron--down", onClick: handleScrollDown, children: jsxRuntime.jsx(IconComponent, { icon: "solar:alt-arrow-down-outline", size: "md", "aria-hidden": true }) })] }))] })), jsxRuntime.jsx("div", { ref: scrollContainerRef, className: "h-full overflow-y-auto pr-6 -mr-6 [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none] select-none ".concat(isDraggingScroll ? "cursor-grabbing" : ""), onMouseDown: handleScrollAreaMouseDown, children: jsxRuntime.jsx(MenuNavList, { defaultSelectedKey: selectedKey, items: menuItems.items, isCollapsed: isCollapsed, onSelect: handleMenuSelect }, selectedKey) })] }), helpSection ? (jsxRuntime.jsx("div", { className: "mt-auto flex flex-col justify-center items-center", children: jsxRuntime.jsx(react.Button, { fullWidth: true, className: " text-default-500 data-[hover=true]:text-default-600", startContent: jsxRuntime.jsx(IconComponent, { className: "text-default-500", icon: "solar:info-circle-line-duotone", size: "md" }), variant: "light", onPress: handleHelpClick, isIconOnly: isCollapsed, children: !isCollapsed && (jsxRuntime.jsx("span", { className: "collapsible-item truncate", children: helpSection.title })) }) })) : null] }) })] }));
|
|
3690
3787
|
});
|
|
3691
3788
|
|
|
3692
3789
|
/**
|
|
@@ -3730,7 +3827,59 @@ var MenuClawHistoryPanel = React.memo(function MenuClawHistoryPanel(_a) {
|
|
|
3730
3827
|
: "solar:alt-arrow-down-linear", size: "sm", "aria-hidden": true }), isExpanded ? showLessLabel : showMoreLabel] })) : null] })) : null] }));
|
|
3731
3828
|
});
|
|
3732
3829
|
|
|
3733
|
-
|
|
3830
|
+
/** ¿Está la key seleccionada en este ítem o en cualquiera de sus descendientes? */
|
|
3831
|
+
var containsKey = function (item, key) {
|
|
3832
|
+
var _a;
|
|
3833
|
+
if (!key) {
|
|
3834
|
+
return false;
|
|
3835
|
+
}
|
|
3836
|
+
if (item.key === key) {
|
|
3837
|
+
return true;
|
|
3838
|
+
}
|
|
3839
|
+
return ((_a = item.items) !== null && _a !== void 0 ? _a : []).some(function (child) { return containsKey(child, key); });
|
|
3840
|
+
};
|
|
3841
|
+
/**
|
|
3842
|
+
* Fila del menú. Si el ítem trae `items`, se pinta como grupo desplegable en vez
|
|
3843
|
+
* de como enlace.
|
|
3844
|
+
*
|
|
3845
|
+
* Existe porque `MenuClaw` no puede reutilizar `MenuNavList` (heredaría sus filas
|
|
3846
|
+
* de 44px) pero sí necesita el mismo dato jerárquico: los consumidores mandan
|
|
3847
|
+
* módulos con hijos —Catálogo › Productos/Servicios— y sin este render se
|
|
3848
|
+
* perderían en silencio, porque `MenuNavListItem.items` es opcional y no falla
|
|
3849
|
+
* al compilar.
|
|
3850
|
+
*
|
|
3851
|
+
* El grupo que contiene la ruta activa se despliega solo y no se puede plegar:
|
|
3852
|
+
* si se pudiera, el ítem activo quedaría oculto.
|
|
3853
|
+
*/
|
|
3854
|
+
var MenuClawNavItem = function (_a) {
|
|
3855
|
+
var _b, _c;
|
|
3856
|
+
var item = _a.item, selectedKey = _a.selectedKey, isCollapsed = _a.isCollapsed, onSelect = _a.onSelect, _d = _a.depth, depth = _d === void 0 ? 0 : _d;
|
|
3857
|
+
var submenuId = React.useId();
|
|
3858
|
+
var _e = React.useState(false), isManuallyOpen = _e[0], setIsManuallyOpen = _e[1];
|
|
3859
|
+
var children = (_b = item.items) !== null && _b !== void 0 ? _b : [];
|
|
3860
|
+
// Comprimido no hay sitio para desplegables: la fila vuelve a ser navegable.
|
|
3861
|
+
var isGroup = children.length > 0 && !isCollapsed;
|
|
3862
|
+
var hasSelectedDescendant = React.useMemo(function () { return children.some(function (child) { return containsKey(child, selectedKey); }); }, [children, selectedKey]);
|
|
3863
|
+
var isOpen = hasSelectedDescendant || isManuallyOpen;
|
|
3864
|
+
var isActive = !!item.key && item.key === selectedKey;
|
|
3865
|
+
var handleClick = React.useCallback(function () {
|
|
3866
|
+
if (isGroup) {
|
|
3867
|
+
setIsManuallyOpen(function (prev) { return !prev; });
|
|
3868
|
+
return;
|
|
3869
|
+
}
|
|
3870
|
+
onSelect(item.key, item.href);
|
|
3871
|
+
}, [isGroup, onSelect, item.key, item.href]);
|
|
3872
|
+
var icon = item.icon || item.startContent ? (jsxRuntime.jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center text-default-500 [&_svg]:h-5 [&_svg]:w-5", children: item.icon ? (jsxRuntime.jsx(IconComponent, { icon: item.icon, size: "md", "aria-hidden": true })) : (item.startContent) })) : null;
|
|
3873
|
+
return (jsxRuntime.jsxs("li", { children: [jsxRuntime.jsxs("button", { type: "button", title: isCollapsed ? item.title : undefined, onClick: handleClick, "aria-expanded": isGroup ? isOpen : undefined, "aria-controls": isGroup ? submenuId : undefined, className: react.cn("flex w-full items-center rounded-lg px-2 py-1.5 text-left text-small transition-colors", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus", depth === 0 ? "min-h-9" : "min-h-8", isCollapsed ? "justify-center" : "gap-3",
|
|
3874
|
+
// Sangría del hijo: alinea su texto con el del padre (px-2 + icono
|
|
3875
|
+
// de 20px + gap de 12px).
|
|
3876
|
+
!isCollapsed && depth > 0 && !icon ? "pl-10" : undefined, isActive
|
|
3877
|
+
? "bg-default-100 font-medium text-foreground"
|
|
3878
|
+
: "text-default-600 hover:bg-default-100", item.className), children: [icon, !isCollapsed ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: "menu-claw-collapsible flex-1 truncate", children: item.title }), (_c = item.endContent) !== null && _c !== void 0 ? _c : null, isGroup ? (jsxRuntime.jsx(IconComponent, { icon: "solar:alt-arrow-down-linear", size: "sm", "aria-hidden": true, className: react.cn("shrink-0 text-default-400 transition-transform", isOpen && "rotate-180") })) : null] })) : null] }), isGroup && isOpen ? (jsxRuntime.jsx("ul", { id: submenuId, className: "mt-0.5 flex flex-col gap-0.5", children: children.map(function (child) { return (jsxRuntime.jsx(MenuClawNavItem, { item: child, selectedKey: selectedKey, isCollapsed: isCollapsed, onSelect: onSelect, depth: depth + 1 }, child.key)); }) })) : null] }));
|
|
3879
|
+
};
|
|
3880
|
+
MenuClawNavItem.displayName = "MenuClawNavItem";
|
|
3881
|
+
|
|
3882
|
+
var DEFAULT_TRANSLATIONS$7 = {
|
|
3734
3883
|
menuLabel: "Menú",
|
|
3735
3884
|
closeSidebarAriaLabel: "Cerrar menú lateral",
|
|
3736
3885
|
mobileNavAriaLabel: "Navegación móvil",
|
|
@@ -3768,7 +3917,7 @@ var MenuClaw = React.memo(function MenuClaw(_a) {
|
|
|
3768
3917
|
var _b, _c;
|
|
3769
3918
|
var userInfo = _a.userInfo, helpButton = _a.helpButton, menuItems = _a.menuItems, history = _a.history, isOpenSidebar = _a.isOpenSidebar, onOpenSidebarChange = _a.onOpenSidebarChange, mobileBottomBarGroupKey = _a.mobileBottomBarGroupKey, _d = _a.showNativeMenu, showNativeMenu = _d === void 0 ? true : _d, _e = _a.translations, translations = _e === void 0 ? {} : _e;
|
|
3770
3919
|
var _f = React.useState(false), isCollapsed = _f[0], setIsCollapsed = _f[1];
|
|
3771
|
-
var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$
|
|
3920
|
+
var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$7), translations);
|
|
3772
3921
|
var selectedKey = React.useMemo(function () {
|
|
3773
3922
|
var _a, _b, _c;
|
|
3774
3923
|
if (menuItems.selectedPath) {
|
|
@@ -3840,13 +3989,7 @@ var MenuClaw = React.memo(function MenuClaw(_a) {
|
|
|
3840
3989
|
? "solar:alt-arrow-right-linear"
|
|
3841
3990
|
: "solar:alt-arrow-left-linear", size: "md", "aria-hidden": true }) })] }), jsxRuntime.jsxs("div", { className: react.cn("flex items-center py-3", isCollapsed ? "justify-center gap-0" : "gap-3"), children: [jsxRuntime.jsx(react.Avatar, { size: "sm", src: ((_b = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _b === void 0 ? void 0 : _b.trim()) || undefined, color: !((_c = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _c === void 0 ? void 0 : _c.trim()) ? "warning" : "default", name: userName, className: "shrink-0" }), !isCollapsed ? (jsxRuntime.jsxs("div", { className: "menu-claw-collapsible flex min-w-0 flex-col overflow-hidden", children: [jsxRuntime.jsx("p", { className: "truncate text-small font-semibold text-foreground", children: userName }), jsxRuntime.jsx("p", { className: "truncate text-tiny text-default-400", children: userRole })] })) : null] }), jsxRuntime.jsx(MenuClawHistoryPanel, { items: historyConfig.items, initialVisibleCount: historyConfig.initialVisibleCount, onNewConversation: history === null || history === void 0 ? void 0 : history.onNewConversation, isCollapsed: isCollapsed, title: t.historyTitle, newLabel: t.historyNewLabel, showMoreLabel: t.historyShowMoreLabel, showLessLabel: t.historyShowLessLabel, onBeforeSelect: handleSidebarClose }), jsxRuntime.jsx("nav", { className: "flex min-h-0 flex-1 flex-col overflow-y-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]", children: menuItems.items.map(function (group) {
|
|
3842
3991
|
var _a;
|
|
3843
|
-
return (jsxRuntime.jsxs("div", { className: "mb-2", children: [group.title && !isCollapsed ? (jsxRuntime.jsx("p", { className: "px-2 pb-1 pt-2 text-tiny font-medium uppercase tracking-wide text-default-400", children: group.title })) : null, jsxRuntime.jsx("ul", { className: "flex flex-col gap-0.5", children: ((_a = group.items) !== null && _a !== void 0 ? _a : []).map(function (item) {
|
|
3844
|
-
var _a;
|
|
3845
|
-
var isActive = !!item.key && item.key === selectedKey;
|
|
3846
|
-
return (jsxRuntime.jsx("li", { children: jsxRuntime.jsxs("button", { type: "button", title: isCollapsed ? item.title : undefined, onClick: function () { return handleMenuSelect(item.key, item.href); }, className: react.cn("flex min-h-9 w-full items-center rounded-lg px-2 py-1.5 text-left text-small transition-colors", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus", isCollapsed ? "justify-center" : "gap-3", isActive
|
|
3847
|
-
? "bg-default-100 font-medium text-foreground"
|
|
3848
|
-
: "text-default-600 hover:bg-default-100", item.className), children: [item.icon || item.startContent ? (jsxRuntime.jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center text-default-500 [&_svg]:h-5 [&_svg]:w-5", children: item.icon ? (jsxRuntime.jsx(IconComponent, { icon: item.icon, size: "md", "aria-hidden": true })) : (item.startContent) })) : null, !isCollapsed ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: "menu-claw-collapsible flex-1 truncate", children: item.title }), (_a = item.endContent) !== null && _a !== void 0 ? _a : null] })) : null] }) }, item.key));
|
|
3849
|
-
}) })] }, group.key));
|
|
3992
|
+
return (jsxRuntime.jsxs("div", { className: "mb-2", children: [group.title && !isCollapsed ? (jsxRuntime.jsx("p", { className: "px-2 pb-1 pt-2 text-tiny font-medium uppercase tracking-wide text-default-400", children: group.title })) : null, jsxRuntime.jsx("ul", { className: "flex flex-col gap-0.5", children: ((_a = group.items) !== null && _a !== void 0 ? _a : []).map(function (item) { return (jsxRuntime.jsx(MenuClawNavItem, { item: item, selectedKey: selectedKey, isCollapsed: isCollapsed, onSelect: handleMenuSelect }, item.key)); }) })] }, group.key));
|
|
3850
3993
|
}) }), helpSection ? (jsxRuntime.jsx("div", { className: "mt-auto flex flex-col items-center justify-center", children: jsxRuntime.jsx(react.Button, { fullWidth: true, className: "text-default-500 data-[hover=true]:text-default-600", startContent: jsxRuntime.jsx(IconComponent, { className: "text-default-500", icon: "solar:info-circle-line-duotone", size: "md" }), variant: "light", onPress: handleHelpClick, isIconOnly: isCollapsed, children: !isCollapsed ? (jsxRuntime.jsx("span", { className: "menu-claw-collapsible truncate", children: helpSection.title })) : null }) })) : null] }) })] }));
|
|
3851
3994
|
});
|
|
3852
3995
|
|
|
@@ -4206,13 +4349,6 @@ var Phone = function (_a) {
|
|
|
4206
4349
|
document.removeEventListener("mousedown", handleClickOutside);
|
|
4207
4350
|
};
|
|
4208
4351
|
}, [isDropdownOpen]);
|
|
4209
|
-
// El dropdown se portea a `body` con posición absoluta fija; cerrarlo cuando
|
|
4210
|
-
// un ancestro hace scroll para que no quede flotando fuera de lugar.
|
|
4211
|
-
useCloseOnAncestorScroll({
|
|
4212
|
-
isOpen: isDropdownOpen,
|
|
4213
|
-
onClose: function () { return setIsDropdownOpen(false); },
|
|
4214
|
-
contentRef: portalDropdownRef,
|
|
4215
|
-
});
|
|
4216
4352
|
var handleCountrySelect = function (country) {
|
|
4217
4353
|
setSelectedCountry(country);
|
|
4218
4354
|
setIsDropdownOpen(false);
|
|
@@ -4284,6 +4420,64 @@ var PromotionalBanner = function (_a) {
|
|
|
4284
4420
|
}, variant: "bordered", onClick: handleButtonClick }, buttonProps, { children: finalButtonText })), showCloseButton && (jsxRuntime.jsx("div", { className: "flex flex-1 justify-end", children: jsxRuntime.jsx(react.Button, { isIconOnly: true, "aria-label": t.closeButtonLabel, className: "-m-1", size: "lg", variant: "bordered", onClick: handleClose, children: jsxRuntime.jsx(IconComponent, { "aria-hidden": "true", className: "text-default-500", icon: "lucide:x", size: "md" }) }) }))] }));
|
|
4285
4421
|
};
|
|
4286
4422
|
|
|
4423
|
+
/** Paleta categórica por defecto: primary/secondary/success/warning/danger de BeweOS. */
|
|
4424
|
+
var DEFAULT_RANKED_BAR_COLORS = [
|
|
4425
|
+
"#006fee",
|
|
4426
|
+
"#7828c8",
|
|
4427
|
+
"#17c964",
|
|
4428
|
+
"#f5a524",
|
|
4429
|
+
"#f31260",
|
|
4430
|
+
];
|
|
4431
|
+
function safeValue(value) {
|
|
4432
|
+
return Number.isFinite(value) && value > 0 ? value : 0;
|
|
4433
|
+
}
|
|
4434
|
+
function computeMax(data) {
|
|
4435
|
+
return data.reduce(function (max, d) { return Math.max(max, safeValue(d.value)); }, 0);
|
|
4436
|
+
}
|
|
4437
|
+
/**
|
|
4438
|
+
* `true` cuando no hay datos o todos los valores son 0 — mismo criterio que el
|
|
4439
|
+
* `NotData` legacy de Guru.js.
|
|
4440
|
+
*/
|
|
4441
|
+
function isRankedBarListEmpty(data) {
|
|
4442
|
+
return data.length === 0 || computeMax(data) === 0;
|
|
4443
|
+
}
|
|
4444
|
+
/**
|
|
4445
|
+
* Resuelve el ancho de cada barra como porcentaje del **valor máximo del set**
|
|
4446
|
+
* (no del total) — igual que `BusinessStage.js` legacy (`100 * quantity / max`),
|
|
4447
|
+
* y el color final de cada fila.
|
|
4448
|
+
*/
|
|
4449
|
+
function computeBars(data, palette) {
|
|
4450
|
+
if (palette === void 0) { palette = DEFAULT_RANKED_BAR_COLORS; }
|
|
4451
|
+
var max = computeMax(data);
|
|
4452
|
+
return data.map(function (item, index) {
|
|
4453
|
+
var _a;
|
|
4454
|
+
var value = safeValue(item.value);
|
|
4455
|
+
return __assign(__assign({}, item), { value: value, color: (_a = item.color) !== null && _a !== void 0 ? _a : palette[index % palette.length], percent: max > 0 ? (value / max) * 100 : 0 });
|
|
4456
|
+
});
|
|
4457
|
+
}
|
|
4458
|
+
|
|
4459
|
+
var DEFAULT_TRANSLATIONS$6 = {
|
|
4460
|
+
emptyState: "Sin datos para mostrar",
|
|
4461
|
+
};
|
|
4462
|
+
/**
|
|
4463
|
+
* RankedBarList - Lista de barras horizontales escaladas al valor máximo del
|
|
4464
|
+
* set (no al total) — mismo criterio visual que `BusinessStage.js` legacy.
|
|
4465
|
+
* No reordena las filas: el llamador decide el orden (por relevancia, por
|
|
4466
|
+
* etapa del funnel, etc.).
|
|
4467
|
+
*/
|
|
4468
|
+
var RankedBarList = function (_a) {
|
|
4469
|
+
var data = _a.data, colors = _a.colors, formatValue = _a.formatValue, _b = _a.showValue, showValue = _b === void 0 ? true : _b, _c = _a.barHeight, barHeight = _c === void 0 ? 8 : _c, _d = _a.translations, translations = _d === void 0 ? {} : _d, className = _a.className;
|
|
4470
|
+
var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$6), translations);
|
|
4471
|
+
if (isRankedBarListEmpty(data)) {
|
|
4472
|
+
return (jsxRuntime.jsx("div", { className: className, children: jsxRuntime.jsx(P, { children: t.emptyState }) }));
|
|
4473
|
+
}
|
|
4474
|
+
var bars = computeBars(data, colors);
|
|
4475
|
+
var format = function (value) {
|
|
4476
|
+
return formatValue ? formatValue(value) : String(value);
|
|
4477
|
+
};
|
|
4478
|
+
return (jsxRuntime.jsx("div", { className: ["flex flex-col gap-3", className].filter(Boolean).join(" "), children: bars.map(function (bar) { return (jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [jsxRuntime.jsxs("div", { className: "flex items-baseline justify-between gap-2", children: [jsxRuntime.jsx(P, { className: "truncate", children: bar.label }), showValue && (jsxRuntime.jsx("span", { className: "text-sm font-medium text-foreground", children: format(bar.value) }))] }), jsxRuntime.jsx("div", { className: "w-full rounded-full bg-default-100", style: { height: barHeight }, children: jsxRuntime.jsx("div", { className: "h-full rounded-full", style: { width: "".concat(bar.percent, "%"), backgroundColor: bar.color } }) })] }, bar.label)); }) }));
|
|
4479
|
+
};
|
|
4480
|
+
|
|
4287
4481
|
var VALID_STEP_COLORS = [
|
|
4288
4482
|
"primary",
|
|
4289
4483
|
"secondary",
|
|
@@ -5341,7 +5535,7 @@ var ScheduleRow = function (_a) {
|
|
|
5341
5535
|
// Return slots exactly as they are - no automatic additions
|
|
5342
5536
|
return slots;
|
|
5343
5537
|
};
|
|
5344
|
-
return (jsxRuntime.jsxs("div", { className: "flex flex-col w-full gap-y-4 last:border-b-0 last:mb-0 last:pb-0 border-b border-default-200 xs:py-4 xl:p-4 first:pt-0", children: [jsxRuntime.jsxs("div", { className: "flex w-full items-center justify-between", children: [jsxRuntime.jsxs("div", { className: "flex xs:space-x-2 sm:space-x-4", children: [jsxRuntime.jsx("h3", { className: "text-small font-semibold text-default-900 capitalize", children: day }), jsxRuntime.jsx(react.Chip, { size: "sm", color: daySchedule.isOpen ? "primary" : "default", className: "text-background", children: daySchedule.isOpen ? t.open : t.closed })] }), jsxRuntime.jsxs("div", { className: "flex xs:gap-2 sm:gap-5", children: [jsxRuntime.jsx(Switch, { size: "sm", color: "primary", isSelected: daySchedule.isOpen, onValueChange: handleToggleDay }), showCopyToAll && onCopyToAll && (jsxRuntime.jsx(Button, { size: "sm", variant: "bordered", onPress: function () { return onCopyToAll(day); }, children: t.copyToAll }))] })] }), daySchedule.isOpen && (jsxRuntime.jsx("div", { className: "flex flex-col justify-around gap-y-3 ", children: getSlotsToDisplay().map(function (slot, index) {
|
|
5538
|
+
return (jsxRuntime.jsxs("div", { className: "flex flex-col w-full gap-y-4 last:border-b-0 last:mb-0 last:pb-0 border-b border-default-200 xs:py-4 xl:p-4 first:pt-0", children: [jsxRuntime.jsxs("div", { className: "flex w-full items-center justify-between", children: [jsxRuntime.jsxs("div", { className: "flex items-center xs:space-x-2 sm:space-x-4", children: [jsxRuntime.jsx("h3", { className: "text-small font-semibold text-default-900 capitalize w-24 shrink-0", children: day }), jsxRuntime.jsx(react.Chip, { size: "sm", color: daySchedule.isOpen ? "primary" : "default", className: "text-background", children: daySchedule.isOpen ? t.open : t.closed })] }), jsxRuntime.jsxs("div", { className: "flex xs:gap-2 sm:gap-5", children: [jsxRuntime.jsx(Switch, { size: "sm", color: "primary", isSelected: daySchedule.isOpen, onValueChange: handleToggleDay }), showCopyToAll && onCopyToAll && (jsxRuntime.jsx(Button, { size: "sm", variant: "bordered", onPress: function () { return onCopyToAll(day); }, children: t.copyToAll }))] })] }), daySchedule.isOpen && (jsxRuntime.jsx("div", { className: "flex flex-col justify-around gap-y-3 ", children: getSlotsToDisplay().map(function (slot, index) {
|
|
5345
5539
|
var slotsToDisplay = getSlotsToDisplay();
|
|
5346
5540
|
var isLastSlot = index === slotsToDisplay.length - 1;
|
|
5347
5541
|
var isSlotFilled = slot.from && slot.to;
|
|
@@ -5475,6 +5669,59 @@ var SocialMediaPreview = function (_a) {
|
|
|
5475
5669
|
}
|
|
5476
5670
|
};
|
|
5477
5671
|
|
|
5672
|
+
var paddingClasses = {
|
|
5673
|
+
sm: "p-4",
|
|
5674
|
+
md: "p-6",
|
|
5675
|
+
lg: "p-8",
|
|
5676
|
+
};
|
|
5677
|
+
|
|
5678
|
+
/**
|
|
5679
|
+
* Card genérica siguiendo las reglas de diseño BeweOS basada en HeroUI.
|
|
5680
|
+
*
|
|
5681
|
+
* Reglas aplicadas:
|
|
5682
|
+
* - Shadow: none, sm, md, lg (configurable)
|
|
5683
|
+
* - Radius: sm (por defecto, configurable)
|
|
5684
|
+
* - Padding configurable (sm, md, lg)
|
|
5685
|
+
* - Hereda de HeroUI Card con personalización BeweOS
|
|
5686
|
+
*/
|
|
5687
|
+
var Card = function (_a) {
|
|
5688
|
+
var children = _a.children, _b = _a.className, className = _b === void 0 ? "" : _b, _c = _a.shadow, shadow = _c === void 0 ? "sm" : _c, _d = _a.radius, radius = _d === void 0 ? "sm" : _d, _e = _a.padding, padding = _e === void 0 ? "md" : _e, props = __rest(_a, ["children", "className", "shadow", "radius", "padding"]);
|
|
5689
|
+
var paddingClass = paddingClasses[padding];
|
|
5690
|
+
var combinedClassName = [paddingClass, className].filter(Boolean).join(" ");
|
|
5691
|
+
return (jsxRuntime.jsx(react.Card, __assign({ shadow: shadow, radius: radius, className: combinedClassName }, props, { children: children })));
|
|
5692
|
+
};
|
|
5693
|
+
|
|
5694
|
+
var DEFAULT_TRANSLATIONS$5 = {
|
|
5695
|
+
trendUpAriaLabel: "Tendencia al alza",
|
|
5696
|
+
trendDownAriaLabel: "Tendencia a la baja",
|
|
5697
|
+
trendNeutralAriaLabel: "Sin variación",
|
|
5698
|
+
};
|
|
5699
|
+
var TREND_COLOR_CLASS = {
|
|
5700
|
+
positive: "text-success",
|
|
5701
|
+
negative: "text-danger",
|
|
5702
|
+
neutral: "text-foreground-500",
|
|
5703
|
+
};
|
|
5704
|
+
var TREND_ARIA_KEY = {
|
|
5705
|
+
positive: "trendUpAriaLabel",
|
|
5706
|
+
negative: "trendDownAriaLabel",
|
|
5707
|
+
neutral: "trendNeutralAriaLabel",
|
|
5708
|
+
};
|
|
5709
|
+
/**
|
|
5710
|
+
* StatTile - Tarjeta KPI compacta: ícono opcional + título + valor + tendencia opcional.
|
|
5711
|
+
*
|
|
5712
|
+
* Cubre el patrón "tile" (título + número, con o sin ícono/variación) que se repite en
|
|
5713
|
+
* varios dashboards de estadísticas y no encajaba en ningún chart existente de AuraUI.
|
|
5714
|
+
*/
|
|
5715
|
+
var StatTile = function (_a) {
|
|
5716
|
+
var _b;
|
|
5717
|
+
var title = _a.title, value = _a.value, icon = _a.icon, trend = _a.trend, _c = _a.translations, translations = _c === void 0 ? {} : _c, className = _a.className, _d = _a.padding, padding = _d === void 0 ? "md" : _d, cardProps = __rest(_a, ["title", "value", "icon", "trend", "translations", "className", "padding"]);
|
|
5718
|
+
var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$5), translations);
|
|
5719
|
+
var direction = (_b = trend === null || trend === void 0 ? void 0 : trend.direction) !== null && _b !== void 0 ? _b : "neutral";
|
|
5720
|
+
return (jsxRuntime.jsxs(Card, __assign({ padding: padding, className: ["flex flex-row items-center gap-3", className]
|
|
5721
|
+
.filter(Boolean)
|
|
5722
|
+
.join(" ") }, cardProps, { children: [icon && (jsxRuntime.jsx("span", { className: "shrink-0 text-foreground-600", "aria-hidden": "true", children: icon })), jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [jsxRuntime.jsx(P, { className: "truncate", children: title }), jsxRuntime.jsxs("div", { className: "flex items-baseline gap-2", children: [jsxRuntime.jsx(H3, { className: "text-2xl font-semibold", children: value }), trend && (jsxRuntime.jsx("span", { className: "text-xs font-medium ".concat(TREND_COLOR_CLASS[direction]), "aria-label": t[TREND_ARIA_KEY[direction]], children: trend.value }))] })] })] })));
|
|
5723
|
+
};
|
|
5724
|
+
|
|
5478
5725
|
function AuraTable(_a) {
|
|
5479
5726
|
var columns = _a.columns, items = _a.items, renderCell = _a.renderCell, children = _a.children, props = __rest(_a, ["columns", "items", "renderCell", "children"]);
|
|
5480
5727
|
return (jsxRuntime.jsxs(react.Table, __assign({ removeWrapper: true, radius: "none" }, props, { children: [jsxRuntime.jsx(react.TableHeader, { columns: columns, children: function (column) { return jsxRuntime.jsx(react.TableColumn, { children: column.label }, column.key); } }), jsxRuntime.jsx(react.TableBody, { items: items, children: function (item) { return (jsxRuntime.jsx(react.TableRow, { children: function (columnKey) { return (jsxRuntime.jsx(react.TableCell, { children: renderCell ? renderCell(item, columnKey) : children })); } }, item.id)); } })] })));
|
|
@@ -8863,28 +9110,6 @@ ModalBody.displayName = "ModalBody";
|
|
|
8863
9110
|
|
|
8864
9111
|
var ModalFooter = react.ModalFooter;
|
|
8865
9112
|
|
|
8866
|
-
var paddingClasses = {
|
|
8867
|
-
sm: "p-4",
|
|
8868
|
-
md: "p-6",
|
|
8869
|
-
lg: "p-8",
|
|
8870
|
-
};
|
|
8871
|
-
|
|
8872
|
-
/**
|
|
8873
|
-
* Card genérica siguiendo las reglas de diseño BeweOS basada en HeroUI.
|
|
8874
|
-
*
|
|
8875
|
-
* Reglas aplicadas:
|
|
8876
|
-
* - Shadow: none, sm, md, lg (configurable)
|
|
8877
|
-
* - Radius: sm (por defecto, configurable)
|
|
8878
|
-
* - Padding configurable (sm, md, lg)
|
|
8879
|
-
* - Hereda de HeroUI Card con personalización BeweOS
|
|
8880
|
-
*/
|
|
8881
|
-
var Card = function (_a) {
|
|
8882
|
-
var children = _a.children, _b = _a.className, className = _b === void 0 ? "" : _b, _c = _a.shadow, shadow = _c === void 0 ? "sm" : _c, _d = _a.radius, radius = _d === void 0 ? "sm" : _d, _e = _a.padding, padding = _e === void 0 ? "md" : _e, props = __rest(_a, ["children", "className", "shadow", "radius", "padding"]);
|
|
8883
|
-
var paddingClass = paddingClasses[padding];
|
|
8884
|
-
var combinedClassName = [paddingClass, className].filter(Boolean).join(" ");
|
|
8885
|
-
return (jsxRuntime.jsx(react.Card, __assign({ shadow: shadow, radius: radius, className: combinedClassName }, props, { children: children })));
|
|
8886
|
-
};
|
|
8887
|
-
|
|
8888
9113
|
/**
|
|
8889
9114
|
* Tooltip - Componente BeweOS basado en HeroUI.
|
|
8890
9115
|
*
|
|
@@ -9454,10 +9679,13 @@ exports.ColorPicker = ColorPicker;
|
|
|
9454
9679
|
exports.ColorSelector = ColorSelector;
|
|
9455
9680
|
exports.ContentCarousel = ContentCarousel;
|
|
9456
9681
|
exports.Currency = Currency;
|
|
9682
|
+
exports.DEFAULT_DONUT_COLORS = DEFAULT_DONUT_COLORS;
|
|
9457
9683
|
exports.DEFAULT_PREDEFINED_COLORS = DEFAULT_PREDEFINED_COLORS;
|
|
9684
|
+
exports.DEFAULT_RANKED_BAR_COLORS = DEFAULT_RANKED_BAR_COLORS;
|
|
9458
9685
|
exports.DatePicker = DatePicker;
|
|
9459
9686
|
exports.DateRangePicker = DateRangePicker;
|
|
9460
9687
|
exports.DateSelector = DateSelector;
|
|
9688
|
+
exports.DonutChart = DonutChart;
|
|
9461
9689
|
exports.DrawerFilters = DrawerFilters;
|
|
9462
9690
|
exports.EmailPreview = EmailPreview;
|
|
9463
9691
|
exports.GlobalToast = GlobalToast;
|
|
@@ -9490,6 +9718,7 @@ exports.Phone = Phone;
|
|
|
9490
9718
|
exports.PromotionalBanner = PromotionalBanner;
|
|
9491
9719
|
exports.REGISTERED_THEME_COLORS = REGISTERED_THEME_COLORS;
|
|
9492
9720
|
exports.RangeFilter = RangeFilter;
|
|
9721
|
+
exports.RankedBarList = RankedBarList;
|
|
9493
9722
|
exports.RowSteps = RowSteps;
|
|
9494
9723
|
exports.SEGMENTATION_DEFAULT_TRANSLATIONS = DEFAULT_TRANSLATIONS$1;
|
|
9495
9724
|
exports.ScheduleRow = ScheduleRow;
|
|
@@ -9500,6 +9729,7 @@ exports.SimpleLineChart = SimpleLineChart;
|
|
|
9500
9729
|
exports.SocialMediaBar = SocialMediaBar;
|
|
9501
9730
|
exports.SocialMediaCarousel = SocialMediaCarousel;
|
|
9502
9731
|
exports.SocialMediaPreview = SocialMediaPreview;
|
|
9732
|
+
exports.StatTile = StatTile;
|
|
9503
9733
|
exports.StepIndicator = StepIndicator;
|
|
9504
9734
|
exports.SwitchComponent = Switch;
|
|
9505
9735
|
exports.THEME_COLOR_HEX_MAP = THEME_COLOR_HEX_MAP;
|
|
@@ -9520,6 +9750,10 @@ exports.Wizard = Wizard;
|
|
|
9520
9750
|
exports.WizardNavigation = WizardNavigation;
|
|
9521
9751
|
exports.WizardSidebar = WizardSidebar;
|
|
9522
9752
|
exports.applyCustomPrimaryColor = applyCustomPrimaryColor;
|
|
9753
|
+
exports.computeBars = computeBars;
|
|
9754
|
+
exports.computeMax = computeMax;
|
|
9755
|
+
exports.computeSlices = computeSlices;
|
|
9756
|
+
exports.computeTotal = computeTotal;
|
|
9523
9757
|
exports.createCurrencyFormatter = createCurrencyFormatter;
|
|
9524
9758
|
exports.defaultCountries = uniqueCountries;
|
|
9525
9759
|
exports.defaultCurrencyOptions = defaultCurrencyOptions;
|
|
@@ -9533,9 +9767,11 @@ exports.getSelectedKeyFromPath = getSelectedKeyFromPath;
|
|
|
9533
9767
|
exports.hexToThemeColor = hexToThemeColor;
|
|
9534
9768
|
exports.hslToCssValue = hslToCssValue;
|
|
9535
9769
|
exports.isAuroraFullThemeId = isAuroraFullThemeId;
|
|
9770
|
+
exports.isDonutEmpty = isDonutEmpty;
|
|
9536
9771
|
exports.isExactThemeColor = isExactThemeColor;
|
|
9537
9772
|
exports.isGroupState = isGroupState;
|
|
9538
9773
|
exports.isHexColor = isHexColor;
|
|
9774
|
+
exports.isRankedBarListEmpty = isRankedBarListEmpty;
|
|
9539
9775
|
exports.isSegmentationGroup = isSegmentationGroup;
|
|
9540
9776
|
exports.removeCustomPrimaryColor = removeCustomPrimaryColor;
|
|
9541
9777
|
exports.sizeMap = sizeMap;
|