@beweco/aurora-ui 0.6.65 → 0.6.67

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/index.cjs.js CHANGED
@@ -3011,12 +3011,12 @@ var NotificationButton = function (_a) {
3011
3011
  };
3012
3012
  NotificationButton.displayName = "NotificationButton";
3013
3013
 
3014
- var DEFAULT_TRANSLATIONS$7 = {
3014
+ var DEFAULT_TRANSLATIONS$8 = {
3015
3015
  logout: "Cerrar sesión",
3016
3016
  };
3017
3017
  var HeaderComponent = function (_a) {
3018
3018
  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$7), translations);
3019
+ var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$8), translations);
3020
3020
  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
3021
  };
3022
3022
  HeaderComponent.displayName = "Header";
@@ -3140,7 +3140,7 @@ KanbanColumn.displayName = "KanbanColumn";
3140
3140
  * Traducciones por defecto en español.
3141
3141
  * Se mezclan con las traducciones proporcionadas por el usuario.
3142
3142
  */
3143
- var DEFAULT_TRANSLATIONS$6 = {
3143
+ var DEFAULT_TRANSLATIONS$7 = {
3144
3144
  dropHere: "Soltar aquí",
3145
3145
  emptyMessage: "No hay elementos",
3146
3146
  };
@@ -3174,7 +3174,7 @@ var columnGapClasses = {
3174
3174
  var KanbanComponent = function (_a) {
3175
3175
  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
3176
  // Mezclar traducciones del usuario con las por defecto
3177
- var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$6), translations);
3177
+ var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$7), translations);
3178
3178
  // Determinar si drag está habilitado
3179
3179
  var dragEnabled = isDraggable !== null && isDraggable !== void 0 ? isDraggable : !!onItemMove;
3180
3180
  // Estado del drag actual
@@ -3492,7 +3492,7 @@ var MenuNavList = React.forwardRef(function (_a, ref) {
3492
3492
  });
3493
3493
  MenuNavList.displayName = "MenuNavList";
3494
3494
 
3495
- var DEFAULT_TRANSLATIONS$5 = {
3495
+ var DEFAULT_TRANSLATIONS$6 = {
3496
3496
  menuLabel: "Menú",
3497
3497
  closeSidebarAriaLabel: "Cerrar menú lateral",
3498
3498
  mobileNavAriaLabel: "Navegación móvil",
@@ -3510,7 +3510,7 @@ var MenuComponent = React.memo(function Menu(_a) {
3510
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;
3511
3511
  var _f = React.useState(false), isCollapsed = _f[0], setIsCollapsed = _f[1];
3512
3512
  var _g = React.useState(false), logoError = _g[0], setLogoError = _g[1];
3513
- var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$5), translations);
3513
+ var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$6), translations);
3514
3514
  var selectedKey = React.useMemo(function () {
3515
3515
  var _a, _b, _c;
3516
3516
  if (menuItems.selectedPath) {
@@ -3689,6 +3689,167 @@ var MenuComponent = React.memo(function Menu(_a) {
3689
3689
  : "solar:alt-arrow-left-outline", size: "lg", className: "hidden sm:block cursor-pointer", onClick: handleCollapseToggle })] })] }), jsxRuntime.jsx(react.Spacer, { y: 6 }), jsxRuntime.jsxs("div", { className: "content__menu--user ".concat(isCollapsed ? "gap-0" : "gap-3"), 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, 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 })] })] }), 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
3690
  });
3691
3691
 
3692
+ /**
3693
+ * Sección de historial de conversaciones: botón de nueva conversación + lista de
3694
+ * entradas recientes con "ver más".
3695
+ *
3696
+ * La lista tiene **scroll interno propio** (`flex-1 min-h-0 overflow-y-auto`) y
3697
+ * la sección está acotada en altura, para que crecer el historial no arrastre ni
3698
+ * recorte el área de navegación.
3699
+ *
3700
+ * Densidad de MenuClaw: fila de 36px, `px-2`, `text-small`/`text-tiny` y radios
3701
+ * `rounded-lg`/`rounded-xl` — que es justo lo que difiere del menú compartido.
3702
+ */
3703
+ var MenuClawHistoryPanel = React.memo(function MenuClawHistoryPanel(_a) {
3704
+ var items = _a.items, initialVisibleCount = _a.initialVisibleCount, onNewConversation = _a.onNewConversation, isCollapsed = _a.isCollapsed, title = _a.title, newLabel = _a.newLabel, showMoreLabel = _a.showMoreLabel, showLessLabel = _a.showLessLabel, onBeforeSelect = _a.onBeforeSelect;
3705
+ var _b = React.useState(false), isExpanded = _b[0], setIsExpanded = _b[1];
3706
+ var visibleItems = React.useMemo(function () { return (isExpanded ? items : items.slice(0, initialVisibleCount)); }, [isExpanded, items, initialVisibleCount]);
3707
+ var hasHiddenItems = items.length > initialVisibleCount;
3708
+ var handleToggleExpand = React.useCallback(function () {
3709
+ setIsExpanded(function (prev) { return !prev; });
3710
+ }, []);
3711
+ var handleItemPress = React.useCallback(function (item) {
3712
+ var _a;
3713
+ // `disabled` ya bloquea el botón; este guard cubre además el caso de
3714
+ // activación programática.
3715
+ if (item.disabled) {
3716
+ return;
3717
+ }
3718
+ onBeforeSelect === null || onBeforeSelect === void 0 ? void 0 : onBeforeSelect();
3719
+ (_a = item.onSelect) === null || _a === void 0 ? void 0 : _a.call(item);
3720
+ }, [onBeforeSelect]);
3721
+ // Comprimido no hay ancho para texto: solo el botón de nueva conversación,
3722
+ // en modo icono. Sin `onNewConversation` no hay nada que mostrar.
3723
+ if (isCollapsed && !onNewConversation) {
3724
+ return null;
3725
+ }
3726
+ return (jsxRuntime.jsxs("div", { className: "flex max-h-[40%] min-h-0 flex-col gap-2 pb-3", children: [onNewConversation ? (jsxRuntime.jsxs("button", { type: "button", title: newLabel, onClick: onNewConversation, className: react.cn("flex h-9 shrink-0 items-center gap-3 rounded-xl bg-foreground px-2 text-small font-medium text-background transition-opacity hover:opacity-90", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus", isCollapsed && "justify-center"), children: [jsxRuntime.jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center", children: jsxRuntime.jsx(IconComponent, { icon: "solar:pen-new-square-linear", size: "md", "aria-hidden": true }) }), !isCollapsed ? (jsxRuntime.jsx("span", { className: "menu-claw-collapsible truncate", children: newLabel })) : null] })) : null, !isCollapsed && items.length > 0 ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("p", { className: "shrink-0 px-2 pb-1 pt-2 text-tiny font-medium uppercase tracking-wide text-default-400", children: title }), jsxRuntime.jsx("ul", { "aria-label": title, className: "flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]", children: visibleItems.map(function (item) { return (jsxRuntime.jsx("li", { children: jsxRuntime.jsxs("button", { type: "button", disabled: item.disabled, "aria-disabled": item.disabled, title: item.title, onClick: function () { return handleItemPress(item); }, className: react.cn("flex min-h-9 w-full items-center gap-3 rounded-lg px-2 py-1.5 text-left text-small text-default-600 transition-colors", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus", item.disabled
3727
+ ? "cursor-not-allowed opacity-50"
3728
+ : "hover:bg-default-100"), children: [jsxRuntime.jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center text-default-400", children: jsxRuntime.jsx(IconComponent, { icon: "solar:chat-round-dots-linear", size: "md", "aria-hidden": true }) }), jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col", children: [jsxRuntime.jsx("span", { className: "truncate", children: item.title }), item.meta ? (jsxRuntime.jsx("span", { className: "truncate text-tiny text-default-400", children: item.meta })) : null] })] }) }, item.id)); }) }), hasHiddenItems ? (jsxRuntime.jsxs("button", { type: "button", onClick: handleToggleExpand, "aria-expanded": isExpanded, className: "flex w-full shrink-0 items-center gap-1.5 rounded-lg px-2 py-2 text-tiny font-medium text-default-500 transition-colors hover:bg-default-100 hover:text-default-700 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus", children: [jsxRuntime.jsx(IconComponent, { icon: isExpanded
3729
+ ? "solar:alt-arrow-up-linear"
3730
+ : "solar:alt-arrow-down-linear", size: "sm", "aria-hidden": true }), isExpanded ? showLessLabel : showMoreLabel] })) : null] })) : null] }));
3731
+ });
3732
+
3733
+ var DEFAULT_TRANSLATIONS$5 = {
3734
+ menuLabel: "Menú",
3735
+ closeSidebarAriaLabel: "Cerrar menú lateral",
3736
+ mobileNavAriaLabel: "Navegación móvil",
3737
+ notDefinedLabel: "no definido",
3738
+ toggleSidebarAriaLabel: "Comprimir o expandir el menú",
3739
+ historyTitle: "Historial",
3740
+ historyNewLabel: "Nueva conversación",
3741
+ historyShowMoreLabel: "Ver más",
3742
+ historyShowLessLabel: "Ver menos",
3743
+ };
3744
+ /** Ítems del historial visibles antes de pulsar "ver más". */
3745
+ var DEFAULT_HISTORY_VISIBLE_COUNT = 5;
3746
+ /**
3747
+ * Menú lateral con historial de conversaciones integrado.
3748
+ *
3749
+ * Es un componente **aparte de `MenuComponent`**, no una extensión suya, y esa
3750
+ * es toda su razón de ser: el diseño no solo añade historial, cambia la
3751
+ * DENSIDAD del menú (fila de 36px en vez de 44, `px-2` en vez de `px-3`, dos
3752
+ * escalas tipográficas en vez de una, radios `lg`/`xl` en vez de `large`).
3753
+ * `MenuComponent` lo consumen varias plataformas —solo en beweossmbs hay 446
3754
+ * ficheros que importan el paquete— y no se puede cambiar su densidad base sin
3755
+ * regresionar a todas. Por eso aquí hay render propio y libertad visual, y por
3756
+ * eso **no** se reutiliza `MenuNavList`: heredaría los 44px que el diseño
3757
+ * cambia.
3758
+ *
3759
+ * Lo que sí se reutiliza es el **contrato de datos** (`MenuNavListItem`), para
3760
+ * que un consumidor pueda pasar exactamente la misma estructura de menú que ya
3761
+ * le da a `MenuComponent`. Mismo dato, render distinto.
3762
+ *
3763
+ * Preserva `helpButton` y la barra inferior móvil, que el menú hecho a mano del
3764
+ * diseño dejó caer. No pinta cabecera de comercio: en este diseño la identidad
3765
+ * del comercio vive fuera del lateral.
3766
+ */
3767
+ var MenuClaw = React.memo(function MenuClaw(_a) {
3768
+ var _b, _c;
3769
+ 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
+ var _f = React.useState(false), isCollapsed = _f[0], setIsCollapsed = _f[1];
3771
+ var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$5), translations);
3772
+ var selectedKey = React.useMemo(function () {
3773
+ var _a, _b, _c;
3774
+ if (menuItems.selectedPath) {
3775
+ return ((_b = (_a = getSelectedKeyFromPath(menuItems.selectedPath, menuItems.items)) !== null && _a !== void 0 ? _a : menuItems.selectedKey) !== null && _b !== void 0 ? _b : "");
3776
+ }
3777
+ return (_c = menuItems.selectedKey) !== null && _c !== void 0 ? _c : "";
3778
+ }, [menuItems.selectedPath, menuItems.selectedKey, menuItems.items]);
3779
+ var userName = (typeof (userInfo === null || userInfo === void 0 ? void 0 : userInfo.name) === "string" && userInfo.name.trim()) ||
3780
+ t.notDefinedLabel;
3781
+ var userRole = (typeof (userInfo === null || userInfo === void 0 ? void 0 : userInfo.role) === "string" && userInfo.role.trim()) ||
3782
+ t.notDefinedLabel;
3783
+ var helpSection = React.useMemo(function () {
3784
+ if (helpButton == null) {
3785
+ return null;
3786
+ }
3787
+ var title = typeof helpButton.title === "string" ? helpButton.title.trim() : "";
3788
+ var redirect = typeof helpButton.redirect === "string" ? helpButton.redirect.trim() : "";
3789
+ if (!(title && redirect)) {
3790
+ return null;
3791
+ }
3792
+ return { title: title, redirect: redirect };
3793
+ }, [helpButton]);
3794
+ var historyConfig = React.useMemo(function () {
3795
+ var items = Array.isArray(history === null || history === void 0 ? void 0 : history.items) ? history.items : [];
3796
+ var rawCount = history === null || history === void 0 ? void 0 : history.initialVisibleCount;
3797
+ var initialVisibleCount = typeof rawCount === "number" && Number.isFinite(rawCount) && rawCount > 0
3798
+ ? Math.floor(rawCount)
3799
+ : DEFAULT_HISTORY_VISIBLE_COUNT;
3800
+ return { items: items, initialVisibleCount: initialVisibleCount };
3801
+ }, [history]);
3802
+ var bottomBarItems = React.useMemo(function () {
3803
+ if (!mobileBottomBarGroupKey) {
3804
+ return [];
3805
+ }
3806
+ var group = menuItems.items.find(function (item) { return item.key === mobileBottomBarGroupKey; });
3807
+ if (!(group === null || group === void 0 ? void 0 : group.items)) {
3808
+ return [];
3809
+ }
3810
+ return group.items.filter(function (item) { return item.icon; });
3811
+ }, [mobileBottomBarGroupKey, menuItems.items]);
3812
+ var handleSidebarClose = React.useCallback(function () {
3813
+ onOpenSidebarChange === null || onOpenSidebarChange === void 0 ? void 0 : onOpenSidebarChange(false);
3814
+ }, [onOpenSidebarChange]);
3815
+ var handleSidebarOpen = React.useCallback(function () {
3816
+ onOpenSidebarChange === null || onOpenSidebarChange === void 0 ? void 0 : onOpenSidebarChange(true);
3817
+ }, [onOpenSidebarChange]);
3818
+ var handleCollapseToggle = React.useCallback(function () {
3819
+ setIsCollapsed(function (prev) { return !prev; });
3820
+ }, []);
3821
+ var handleHelpClick = React.useCallback(function () {
3822
+ if (helpSection) {
3823
+ window.open(helpSection.redirect, "_blank");
3824
+ }
3825
+ }, [helpSection]);
3826
+ var handleMenuSelect = React.useCallback(function (key, href) {
3827
+ var _a;
3828
+ onOpenSidebarChange === null || onOpenSidebarChange === void 0 ? void 0 : onOpenSidebarChange(false);
3829
+ (_a = menuItems.onSelect) === null || _a === void 0 ? void 0 : _a.call(menuItems, key, href, "sidebar");
3830
+ }, [onOpenSidebarChange, menuItems.onSelect]);
3831
+ // Barra inferior: cerrar el lateral y avisar con source 'bottomBar' para que
3832
+ // la app no lo reabra al navegar.
3833
+ var handleBottomBarSelect = React.useCallback(function (key, href) {
3834
+ var _a;
3835
+ onOpenSidebarChange === null || onOpenSidebarChange === void 0 ? void 0 : onOpenSidebarChange(false);
3836
+ (_a = menuItems.onSelect) === null || _a === void 0 ? void 0 : _a.call(menuItems, key, href, "bottomBar");
3837
+ }, [onOpenSidebarChange, menuItems.onSelect]);
3838
+ var showBottomBar = (mobileBottomBarGroupKey && bottomBarItems.length > 0) || showNativeMenu;
3839
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [showBottomBar ? (jsxRuntime.jsx(MenuMobileBottomBar, { items: bottomBarItems, selectedKey: selectedKey, onSelect: handleBottomBarSelect, onMenuPress: handleSidebarOpen, menuLabel: t.menuLabel, navAriaLabel: t.mobileNavAriaLabel, forceVisible: showNativeMenu && bottomBarItems.length === 0 })) : null, jsxRuntime.jsx("button", { type: "button", "aria-label": t.closeSidebarAriaLabel, className: "menu-claw-overlay ".concat(isOpenSidebar ? "menu-claw-overlay--open" : ""), onClick: handleSidebarClose, tabIndex: isOpenSidebar ? 0 : -1 }), jsxRuntime.jsx("div", { className: react.cn("menu-claw", isCollapsed ? "menu-claw--collapsed" : "menu-claw--expanded", isOpenSidebar && "menu-claw--mobile-open"), "aria-hidden": !isOpenSidebar, children: jsxRuntime.jsxs("div", { className: "menu-claw__content", children: [jsxRuntime.jsxs("div", { className: react.cn("flex items-center", isCollapsed ? "justify-center" : "justify-end"), children: [jsxRuntime.jsx(IconComponent, { icon: "material-symbols-light:close", size: "lg", className: "block cursor-pointer sm:hidden", onClick: handleSidebarClose }), jsxRuntime.jsx("button", { type: "button", "aria-label": t.toggleSidebarAriaLabel, onClick: handleCollapseToggle, className: "hidden h-7 w-7 shrink-0 cursor-pointer items-center justify-center rounded-lg text-default-500 transition-colors hover:bg-default-100 sm:flex", children: jsxRuntime.jsx(IconComponent, { icon: isCollapsed
3840
+ ? "solar:alt-arrow-right-linear"
3841
+ : "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
+ 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));
3850
+ }) }), 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
+ });
3852
+
3692
3853
  var StepIndicator = function (_a) {
3693
3854
  var currentStep = _a.currentStep, totalSteps = _a.totalSteps, _b = _a.color, color = _b === void 0 ? "primary" : _b, _c = _a.showStepText, showStepText = _c === void 0 ? true : _c, stepTextFormatter = _a.stepTextFormatter, className = _a.className, props = __rest(_a, ["currentStep", "totalSteps", "color", "showStepText", "stepTextFormatter", "className"]);
3694
3855
  var progressPercentage = Math.min((currentStep / totalSteps) * 100, 100);
@@ -6445,10 +6606,17 @@ var COLOR_BODY = "#c7d2fe";
6445
6606
  var COLOR_STROKE = "#4338ca";
6446
6607
  var COLOR_MEDIAN = "#1e3a8a";
6447
6608
  var COLOR_AXIS = "#6b7280";
6609
+ /** Desplazamiento vertical del rótulo del grupo bajo el eje X. */
6610
+ var GROUP_LABEL_DY = 16;
6611
+ /** Desplazamiento vertical de la línea `n=` (bajo el rótulo del grupo). */
6612
+ var SAMPLE_SIZE_DY = 30;
6613
+ /** Aire por debajo de la línea `n=` que la superficie de hover también cubre. */
6614
+ var HOVER_PADDING = 4;
6448
6615
  var defaultTranslations$1 = {
6449
6616
  emptyState: "Sin datos de distribución",
6450
6617
  sampleSizeLabel: "n",
6451
6618
  outliersLabel: "outliers",
6619
+ pointsLabel: "puntos",
6452
6620
  };
6453
6621
  function formatTick(value, factor, unit) {
6454
6622
  var scaled = value * factor;
@@ -6496,9 +6664,22 @@ function ViolinPlot(_a) {
6496
6664
  var fmt = formatValue !== null && formatValue !== void 0 ? formatValue : (function (v) { return formatTick(v, factor, unit); });
6497
6665
  var columnWidth = (VIEW_WIDTH - marginLeft - MARGIN.right) / groups.length;
6498
6666
  var axisTitle = unit ? "".concat(valueLabel, " (").concat(unit, ")") : valueLabel;
6667
+ /**
6668
+ * Texto del tooltip de columna (TECH-1768): de qué grupo es y cuántos puntos tiene.
6669
+ *
6670
+ * El `nExcluded` va en el MISMO tooltip cuando lo hay: sin él, `n` se leería como "puntos
6671
+ * dibujados" y no lo son — los outliers recortados están contados en `n` pero fuera del lienzo,
6672
+ * y la diferencia importa justo en los grupos con cola larga.
6673
+ */
6674
+ var tooltipFor = function (group) {
6675
+ var base = "".concat(group.label, " \u00B7 ").concat(group.n, " ").concat(t.pointsLabel);
6676
+ return group.nExcluded > 0
6677
+ ? "".concat(base, " \u00B7 \u2212").concat(group.nExcluded, " ").concat(t.outliersLabel)
6678
+ : base;
6679
+ };
6499
6680
  return (jsxRuntime.jsxs("svg", { viewBox: "0 0 ".concat(VIEW_WIDTH, " ").concat(height), width: "100%", role: "img", "aria-label": valueLabel, children: [[0, maxValue / 2, maxValue].map(function (v) { return (jsxRuntime.jsxs("g", { children: [jsxRuntime.jsx("line", { x1: marginLeft, x2: VIEW_WIDTH - MARGIN.right, y1: valueToY(v), y2: valueToY(v), stroke: "#e5e7eb", strokeDasharray: "3 3" }), jsxRuntime.jsx("text", { x: marginLeft - 6, y: valueToY(v) + 4, textAnchor: "end", fontSize: 11, fill: COLOR_AXIS, children: fmt(v) })] }, v)); }), jsxRuntime.jsx("text", { transform: "translate(12 ".concat(plotTop + plotHeight / 2, ") rotate(-90)"), textAnchor: "middle", fontSize: 12, fill: COLOR_AXIS, children: axisTitle }), groupLabel ? (jsxRuntime.jsx("text", { x: marginLeft + (VIEW_WIDTH - marginLeft - MARGIN.right) / 2, y: height - 6, textAnchor: "middle", fontSize: 12, fill: COLOR_AXIS, children: groupLabel })) : null, groups.map(function (group, i) {
6500
6681
  var centerX = marginLeft + columnWidth * (i + 0.5);
6501
- return (jsxRuntime.jsxs("g", { children: [shouldFallback(group, minSampleForViolin) ? (jsxRuntime.jsx(ViolinFallback, { group: group, centerX: centerX, valueToY: valueToY })) : (jsxRuntime.jsx(ViolinBody, { group: group, centerX: centerX, valueToY: valueToY })), jsxRuntime.jsx("text", { x: centerX, y: plotBottom + 16, textAnchor: "middle", fontSize: 12, fill: COLOR_AXIS, children: group.label }), jsxRuntime.jsxs("text", { x: centerX, y: plotBottom + 30, textAnchor: "middle", fontSize: 10, fill: COLOR_AXIS, children: [t.sampleSizeLabel, "=", group.n, group.nExcluded > 0
6682
+ return (jsxRuntime.jsxs("g", { children: [jsxRuntime.jsx("title", { children: tooltipFor(group) }), jsxRuntime.jsx("rect", { x: centerX - columnWidth / 2, y: plotTop, width: columnWidth, height: plotBottom - plotTop + SAMPLE_SIZE_DY + HOVER_PADDING, fill: "transparent", pointerEvents: "all" }), shouldFallback(group, minSampleForViolin) ? (jsxRuntime.jsx(ViolinFallback, { group: group, centerX: centerX, valueToY: valueToY })) : (jsxRuntime.jsx(ViolinBody, { group: group, centerX: centerX, valueToY: valueToY })), jsxRuntime.jsx("text", { x: centerX, y: plotBottom + GROUP_LABEL_DY, textAnchor: "middle", fontSize: 12, fill: COLOR_AXIS, children: group.label }), jsxRuntime.jsxs("text", { x: centerX, y: plotBottom + SAMPLE_SIZE_DY, textAnchor: "middle", fontSize: 10, fill: COLOR_AXIS, children: [t.sampleSizeLabel, "=", group.n, group.nExcluded > 0
6502
6683
  ? " \u00B7 \u2212".concat(group.nExcluded, " ").concat(t.outliersLabel)
6503
6684
  : ""] })] }, group.label));
6504
6685
  })] }));
@@ -9292,6 +9473,7 @@ exports.InputPassword = InputPassword;
9292
9473
  exports.Kanban = Kanban;
9293
9474
  exports.KanbanCard = KanbanCard;
9294
9475
  exports.KanbanColumn = KanbanColumn;
9476
+ exports.MenuClaw = MenuClaw;
9295
9477
  exports.MenuComponent = MenuComponent;
9296
9478
  exports.Modal = Modal;
9297
9479
  exports.ModalBody = ModalBody;
package/dist/index.esm.js CHANGED
@@ -3012,12 +3012,12 @@ var NotificationButton = function (_a) {
3012
3012
  };
3013
3013
  NotificationButton.displayName = "NotificationButton";
3014
3014
 
3015
- var DEFAULT_TRANSLATIONS$7 = {
3015
+ var DEFAULT_TRANSLATIONS$8 = {
3016
3016
  logout: "Cerrar sesión",
3017
3017
  };
3018
3018
  var HeaderComponent = function (_a) {
3019
3019
  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;
3020
- var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$7), translations);
3020
+ var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$8), translations);
3021
3021
  return (jsx("header", { className: "header__container", children: jsxs("div", { className: "flex items-center justify-between w-full", children: [jsxs("div", { className: "flex items-center gap-4", children: [showMenuButton && (jsx(Button$1, { className: "sm:hidden", isIconOnly: true, variant: "light", startContent: jsx(IconComponent, { icon: "solar:hamburger-menu-linear" }), onPress: onMenuClick })), breadcrumbs && breadcrumbs.length > 0 && (jsx(BreadcrumbsComponent, { items: breadcrumbs, onItemClick: onBreadcrumbClick }))] }), jsxs("div", { className: "flex items-center gap-4", children: [extraContent, jsx(NotificationButton, { notificationCount: notificationCount, onPress: onNotificationClick }), jsx(ConfigMenu, { options: options, onLogout: onLogout, onOptionSelect: onOptionSelect, translations: t })] })] }) }));
3022
3022
  };
3023
3023
  HeaderComponent.displayName = "Header";
@@ -3141,7 +3141,7 @@ KanbanColumn.displayName = "KanbanColumn";
3141
3141
  * Traducciones por defecto en español.
3142
3142
  * Se mezclan con las traducciones proporcionadas por el usuario.
3143
3143
  */
3144
- var DEFAULT_TRANSLATIONS$6 = {
3144
+ var DEFAULT_TRANSLATIONS$7 = {
3145
3145
  dropHere: "Soltar aquí",
3146
3146
  emptyMessage: "No hay elementos",
3147
3147
  };
@@ -3175,7 +3175,7 @@ var columnGapClasses = {
3175
3175
  var KanbanComponent = function (_a) {
3176
3176
  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;
3177
3177
  // Mezclar traducciones del usuario con las por defecto
3178
- var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$6), translations);
3178
+ var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$7), translations);
3179
3179
  // Determinar si drag está habilitado
3180
3180
  var dragEnabled = isDraggable !== null && isDraggable !== void 0 ? isDraggable : !!onItemMove;
3181
3181
  // Estado del drag actual
@@ -3493,7 +3493,7 @@ var MenuNavList = React.forwardRef(function (_a, ref) {
3493
3493
  });
3494
3494
  MenuNavList.displayName = "MenuNavList";
3495
3495
 
3496
- var DEFAULT_TRANSLATIONS$5 = {
3496
+ var DEFAULT_TRANSLATIONS$6 = {
3497
3497
  menuLabel: "Menú",
3498
3498
  closeSidebarAriaLabel: "Cerrar menú lateral",
3499
3499
  mobileNavAriaLabel: "Navegación móvil",
@@ -3511,7 +3511,7 @@ var MenuComponent = React.memo(function Menu(_a) {
3511
3511
  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;
3512
3512
  var _f = React.useState(false), isCollapsed = _f[0], setIsCollapsed = _f[1];
3513
3513
  var _g = React.useState(false), logoError = _g[0], setLogoError = _g[1];
3514
- var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$5), translations);
3514
+ var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$6), translations);
3515
3515
  var selectedKey = React.useMemo(function () {
3516
3516
  var _a, _b, _c;
3517
3517
  if (menuItems.selectedPath) {
@@ -3690,6 +3690,167 @@ var MenuComponent = React.memo(function Menu(_a) {
3690
3690
  : "solar:alt-arrow-left-outline", size: "lg", className: "hidden sm:block cursor-pointer", onClick: handleCollapseToggle })] })] }), jsx(Spacer, { y: 6 }), jsxs("div", { className: "content__menu--user ".concat(isCollapsed ? "gap-0" : "gap-3"), children: [jsx(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, className: "shrink-0" }), jsxs("div", { className: "collapsible-item flex min-w-0 flex-col overflow-hidden", children: [jsx("p", { className: "text-small font-medium text-default-900 truncate", children: userName }), jsx("p", { className: "text-tiny text-default-400 truncate", children: userRole })] })] }), jsxs("div", { className: "".concat(!isCollapsed ? "flex-1" : "h-full", " min-h-0 py-6 relative"), children: [!isCollapsed && showScrollArrows && (jsxs(Fragment, { children: [scrollState.canScrollUp && (jsxs(Fragment, { children: [jsx("div", { className: "menu-scroll-fade menu-scroll-fade--up", "aria-hidden": "true" }), jsx("button", { type: "button", "aria-label": t.scrollUpAriaLabel, className: "menu-scroll-chevron menu-scroll-chevron--up", onClick: handleScrollUp, children: jsx(IconComponent, { icon: "solar:alt-arrow-up-outline", size: "md", "aria-hidden": true }) })] })), scrollState.canScrollDown && (jsxs(Fragment, { children: [jsx("div", { className: "menu-scroll-fade menu-scroll-fade--down", "aria-hidden": "true" }), jsx("button", { type: "button", "aria-label": t.scrollDownAriaLabel, className: "menu-scroll-chevron menu-scroll-chevron--down", onClick: handleScrollDown, children: jsx(IconComponent, { icon: "solar:alt-arrow-down-outline", size: "md", "aria-hidden": true }) })] }))] })), 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: jsx(MenuNavList, { defaultSelectedKey: selectedKey, items: menuItems.items, isCollapsed: isCollapsed, onSelect: handleMenuSelect }, selectedKey) })] }), helpSection ? (jsx("div", { className: "mt-auto flex flex-col justify-center items-center", children: jsx(Button$1, { fullWidth: true, className: " text-default-500 data-[hover=true]:text-default-600", startContent: jsx(IconComponent, { className: "text-default-500", icon: "solar:info-circle-line-duotone", size: "md" }), variant: "light", onPress: handleHelpClick, isIconOnly: isCollapsed, children: !isCollapsed && (jsx("span", { className: "collapsible-item truncate", children: helpSection.title })) }) })) : null] }) })] }));
3691
3691
  });
3692
3692
 
3693
+ /**
3694
+ * Sección de historial de conversaciones: botón de nueva conversación + lista de
3695
+ * entradas recientes con "ver más".
3696
+ *
3697
+ * La lista tiene **scroll interno propio** (`flex-1 min-h-0 overflow-y-auto`) y
3698
+ * la sección está acotada en altura, para que crecer el historial no arrastre ni
3699
+ * recorte el área de navegación.
3700
+ *
3701
+ * Densidad de MenuClaw: fila de 36px, `px-2`, `text-small`/`text-tiny` y radios
3702
+ * `rounded-lg`/`rounded-xl` — que es justo lo que difiere del menú compartido.
3703
+ */
3704
+ var MenuClawHistoryPanel = React.memo(function MenuClawHistoryPanel(_a) {
3705
+ var items = _a.items, initialVisibleCount = _a.initialVisibleCount, onNewConversation = _a.onNewConversation, isCollapsed = _a.isCollapsed, title = _a.title, newLabel = _a.newLabel, showMoreLabel = _a.showMoreLabel, showLessLabel = _a.showLessLabel, onBeforeSelect = _a.onBeforeSelect;
3706
+ var _b = React.useState(false), isExpanded = _b[0], setIsExpanded = _b[1];
3707
+ var visibleItems = useMemo(function () { return (isExpanded ? items : items.slice(0, initialVisibleCount)); }, [isExpanded, items, initialVisibleCount]);
3708
+ var hasHiddenItems = items.length > initialVisibleCount;
3709
+ var handleToggleExpand = useCallback(function () {
3710
+ setIsExpanded(function (prev) { return !prev; });
3711
+ }, []);
3712
+ var handleItemPress = useCallback(function (item) {
3713
+ var _a;
3714
+ // `disabled` ya bloquea el botón; este guard cubre además el caso de
3715
+ // activación programática.
3716
+ if (item.disabled) {
3717
+ return;
3718
+ }
3719
+ onBeforeSelect === null || onBeforeSelect === void 0 ? void 0 : onBeforeSelect();
3720
+ (_a = item.onSelect) === null || _a === void 0 ? void 0 : _a.call(item);
3721
+ }, [onBeforeSelect]);
3722
+ // Comprimido no hay ancho para texto: solo el botón de nueva conversación,
3723
+ // en modo icono. Sin `onNewConversation` no hay nada que mostrar.
3724
+ if (isCollapsed && !onNewConversation) {
3725
+ return null;
3726
+ }
3727
+ return (jsxs("div", { className: "flex max-h-[40%] min-h-0 flex-col gap-2 pb-3", children: [onNewConversation ? (jsxs("button", { type: "button", title: newLabel, onClick: onNewConversation, className: cn("flex h-9 shrink-0 items-center gap-3 rounded-xl bg-foreground px-2 text-small font-medium text-background transition-opacity hover:opacity-90", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus", isCollapsed && "justify-center"), children: [jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center", children: jsx(IconComponent, { icon: "solar:pen-new-square-linear", size: "md", "aria-hidden": true }) }), !isCollapsed ? (jsx("span", { className: "menu-claw-collapsible truncate", children: newLabel })) : null] })) : null, !isCollapsed && items.length > 0 ? (jsxs(Fragment, { children: [jsx("p", { className: "shrink-0 px-2 pb-1 pt-2 text-tiny font-medium uppercase tracking-wide text-default-400", children: title }), jsx("ul", { "aria-label": title, className: "flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]", children: visibleItems.map(function (item) { return (jsx("li", { children: jsxs("button", { type: "button", disabled: item.disabled, "aria-disabled": item.disabled, title: item.title, onClick: function () { return handleItemPress(item); }, className: cn("flex min-h-9 w-full items-center gap-3 rounded-lg px-2 py-1.5 text-left text-small text-default-600 transition-colors", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus", item.disabled
3728
+ ? "cursor-not-allowed opacity-50"
3729
+ : "hover:bg-default-100"), children: [jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center text-default-400", children: jsx(IconComponent, { icon: "solar:chat-round-dots-linear", size: "md", "aria-hidden": true }) }), jsxs("span", { className: "flex min-w-0 flex-col", children: [jsx("span", { className: "truncate", children: item.title }), item.meta ? (jsx("span", { className: "truncate text-tiny text-default-400", children: item.meta })) : null] })] }) }, item.id)); }) }), hasHiddenItems ? (jsxs("button", { type: "button", onClick: handleToggleExpand, "aria-expanded": isExpanded, className: "flex w-full shrink-0 items-center gap-1.5 rounded-lg px-2 py-2 text-tiny font-medium text-default-500 transition-colors hover:bg-default-100 hover:text-default-700 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus", children: [jsx(IconComponent, { icon: isExpanded
3730
+ ? "solar:alt-arrow-up-linear"
3731
+ : "solar:alt-arrow-down-linear", size: "sm", "aria-hidden": true }), isExpanded ? showLessLabel : showMoreLabel] })) : null] })) : null] }));
3732
+ });
3733
+
3734
+ var DEFAULT_TRANSLATIONS$5 = {
3735
+ menuLabel: "Menú",
3736
+ closeSidebarAriaLabel: "Cerrar menú lateral",
3737
+ mobileNavAriaLabel: "Navegación móvil",
3738
+ notDefinedLabel: "no definido",
3739
+ toggleSidebarAriaLabel: "Comprimir o expandir el menú",
3740
+ historyTitle: "Historial",
3741
+ historyNewLabel: "Nueva conversación",
3742
+ historyShowMoreLabel: "Ver más",
3743
+ historyShowLessLabel: "Ver menos",
3744
+ };
3745
+ /** Ítems del historial visibles antes de pulsar "ver más". */
3746
+ var DEFAULT_HISTORY_VISIBLE_COUNT = 5;
3747
+ /**
3748
+ * Menú lateral con historial de conversaciones integrado.
3749
+ *
3750
+ * Es un componente **aparte de `MenuComponent`**, no una extensión suya, y esa
3751
+ * es toda su razón de ser: el diseño no solo añade historial, cambia la
3752
+ * DENSIDAD del menú (fila de 36px en vez de 44, `px-2` en vez de `px-3`, dos
3753
+ * escalas tipográficas en vez de una, radios `lg`/`xl` en vez de `large`).
3754
+ * `MenuComponent` lo consumen varias plataformas —solo en beweossmbs hay 446
3755
+ * ficheros que importan el paquete— y no se puede cambiar su densidad base sin
3756
+ * regresionar a todas. Por eso aquí hay render propio y libertad visual, y por
3757
+ * eso **no** se reutiliza `MenuNavList`: heredaría los 44px que el diseño
3758
+ * cambia.
3759
+ *
3760
+ * Lo que sí se reutiliza es el **contrato de datos** (`MenuNavListItem`), para
3761
+ * que un consumidor pueda pasar exactamente la misma estructura de menú que ya
3762
+ * le da a `MenuComponent`. Mismo dato, render distinto.
3763
+ *
3764
+ * Preserva `helpButton` y la barra inferior móvil, que el menú hecho a mano del
3765
+ * diseño dejó caer. No pinta cabecera de comercio: en este diseño la identidad
3766
+ * del comercio vive fuera del lateral.
3767
+ */
3768
+ var MenuClaw = React.memo(function MenuClaw(_a) {
3769
+ var _b, _c;
3770
+ 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;
3771
+ var _f = React.useState(false), isCollapsed = _f[0], setIsCollapsed = _f[1];
3772
+ var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$5), translations);
3773
+ var selectedKey = useMemo(function () {
3774
+ var _a, _b, _c;
3775
+ if (menuItems.selectedPath) {
3776
+ return ((_b = (_a = getSelectedKeyFromPath(menuItems.selectedPath, menuItems.items)) !== null && _a !== void 0 ? _a : menuItems.selectedKey) !== null && _b !== void 0 ? _b : "");
3777
+ }
3778
+ return (_c = menuItems.selectedKey) !== null && _c !== void 0 ? _c : "";
3779
+ }, [menuItems.selectedPath, menuItems.selectedKey, menuItems.items]);
3780
+ var userName = (typeof (userInfo === null || userInfo === void 0 ? void 0 : userInfo.name) === "string" && userInfo.name.trim()) ||
3781
+ t.notDefinedLabel;
3782
+ var userRole = (typeof (userInfo === null || userInfo === void 0 ? void 0 : userInfo.role) === "string" && userInfo.role.trim()) ||
3783
+ t.notDefinedLabel;
3784
+ var helpSection = useMemo(function () {
3785
+ if (helpButton == null) {
3786
+ return null;
3787
+ }
3788
+ var title = typeof helpButton.title === "string" ? helpButton.title.trim() : "";
3789
+ var redirect = typeof helpButton.redirect === "string" ? helpButton.redirect.trim() : "";
3790
+ if (!(title && redirect)) {
3791
+ return null;
3792
+ }
3793
+ return { title: title, redirect: redirect };
3794
+ }, [helpButton]);
3795
+ var historyConfig = useMemo(function () {
3796
+ var items = Array.isArray(history === null || history === void 0 ? void 0 : history.items) ? history.items : [];
3797
+ var rawCount = history === null || history === void 0 ? void 0 : history.initialVisibleCount;
3798
+ var initialVisibleCount = typeof rawCount === "number" && Number.isFinite(rawCount) && rawCount > 0
3799
+ ? Math.floor(rawCount)
3800
+ : DEFAULT_HISTORY_VISIBLE_COUNT;
3801
+ return { items: items, initialVisibleCount: initialVisibleCount };
3802
+ }, [history]);
3803
+ var bottomBarItems = useMemo(function () {
3804
+ if (!mobileBottomBarGroupKey) {
3805
+ return [];
3806
+ }
3807
+ var group = menuItems.items.find(function (item) { return item.key === mobileBottomBarGroupKey; });
3808
+ if (!(group === null || group === void 0 ? void 0 : group.items)) {
3809
+ return [];
3810
+ }
3811
+ return group.items.filter(function (item) { return item.icon; });
3812
+ }, [mobileBottomBarGroupKey, menuItems.items]);
3813
+ var handleSidebarClose = useCallback(function () {
3814
+ onOpenSidebarChange === null || onOpenSidebarChange === void 0 ? void 0 : onOpenSidebarChange(false);
3815
+ }, [onOpenSidebarChange]);
3816
+ var handleSidebarOpen = useCallback(function () {
3817
+ onOpenSidebarChange === null || onOpenSidebarChange === void 0 ? void 0 : onOpenSidebarChange(true);
3818
+ }, [onOpenSidebarChange]);
3819
+ var handleCollapseToggle = useCallback(function () {
3820
+ setIsCollapsed(function (prev) { return !prev; });
3821
+ }, []);
3822
+ var handleHelpClick = useCallback(function () {
3823
+ if (helpSection) {
3824
+ window.open(helpSection.redirect, "_blank");
3825
+ }
3826
+ }, [helpSection]);
3827
+ var handleMenuSelect = useCallback(function (key, href) {
3828
+ var _a;
3829
+ onOpenSidebarChange === null || onOpenSidebarChange === void 0 ? void 0 : onOpenSidebarChange(false);
3830
+ (_a = menuItems.onSelect) === null || _a === void 0 ? void 0 : _a.call(menuItems, key, href, "sidebar");
3831
+ }, [onOpenSidebarChange, menuItems.onSelect]);
3832
+ // Barra inferior: cerrar el lateral y avisar con source 'bottomBar' para que
3833
+ // la app no lo reabra al navegar.
3834
+ var handleBottomBarSelect = useCallback(function (key, href) {
3835
+ var _a;
3836
+ onOpenSidebarChange === null || onOpenSidebarChange === void 0 ? void 0 : onOpenSidebarChange(false);
3837
+ (_a = menuItems.onSelect) === null || _a === void 0 ? void 0 : _a.call(menuItems, key, href, "bottomBar");
3838
+ }, [onOpenSidebarChange, menuItems.onSelect]);
3839
+ var showBottomBar = (mobileBottomBarGroupKey && bottomBarItems.length > 0) || showNativeMenu;
3840
+ return (jsxs(Fragment, { children: [showBottomBar ? (jsx(MenuMobileBottomBar, { items: bottomBarItems, selectedKey: selectedKey, onSelect: handleBottomBarSelect, onMenuPress: handleSidebarOpen, menuLabel: t.menuLabel, navAriaLabel: t.mobileNavAriaLabel, forceVisible: showNativeMenu && bottomBarItems.length === 0 })) : null, jsx("button", { type: "button", "aria-label": t.closeSidebarAriaLabel, className: "menu-claw-overlay ".concat(isOpenSidebar ? "menu-claw-overlay--open" : ""), onClick: handleSidebarClose, tabIndex: isOpenSidebar ? 0 : -1 }), jsx("div", { className: cn("menu-claw", isCollapsed ? "menu-claw--collapsed" : "menu-claw--expanded", isOpenSidebar && "menu-claw--mobile-open"), "aria-hidden": !isOpenSidebar, children: jsxs("div", { className: "menu-claw__content", children: [jsxs("div", { className: cn("flex items-center", isCollapsed ? "justify-center" : "justify-end"), children: [jsx(IconComponent, { icon: "material-symbols-light:close", size: "lg", className: "block cursor-pointer sm:hidden", onClick: handleSidebarClose }), jsx("button", { type: "button", "aria-label": t.toggleSidebarAriaLabel, onClick: handleCollapseToggle, className: "hidden h-7 w-7 shrink-0 cursor-pointer items-center justify-center rounded-lg text-default-500 transition-colors hover:bg-default-100 sm:flex", children: jsx(IconComponent, { icon: isCollapsed
3841
+ ? "solar:alt-arrow-right-linear"
3842
+ : "solar:alt-arrow-left-linear", size: "md", "aria-hidden": true }) })] }), jsxs("div", { className: cn("flex items-center py-3", isCollapsed ? "justify-center gap-0" : "gap-3"), children: [jsx(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 ? (jsxs("div", { className: "menu-claw-collapsible flex min-w-0 flex-col overflow-hidden", children: [jsx("p", { className: "truncate text-small font-semibold text-foreground", children: userName }), jsx("p", { className: "truncate text-tiny text-default-400", children: userRole })] })) : null] }), 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 }), 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) {
3843
+ var _a;
3844
+ return (jsxs("div", { className: "mb-2", children: [group.title && !isCollapsed ? (jsx("p", { className: "px-2 pb-1 pt-2 text-tiny font-medium uppercase tracking-wide text-default-400", children: group.title })) : null, jsx("ul", { className: "flex flex-col gap-0.5", children: ((_a = group.items) !== null && _a !== void 0 ? _a : []).map(function (item) {
3845
+ var _a;
3846
+ var isActive = !!item.key && item.key === selectedKey;
3847
+ return (jsx("li", { children: jsxs("button", { type: "button", title: isCollapsed ? item.title : undefined, onClick: function () { return handleMenuSelect(item.key, item.href); }, className: 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
3848
+ ? "bg-default-100 font-medium text-foreground"
3849
+ : "text-default-600 hover:bg-default-100", item.className), children: [item.icon || item.startContent ? (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 ? (jsx(IconComponent, { icon: item.icon, size: "md", "aria-hidden": true })) : (item.startContent) })) : null, !isCollapsed ? (jsxs(Fragment, { children: [jsx("span", { className: "menu-claw-collapsible flex-1 truncate", children: item.title }), (_a = item.endContent) !== null && _a !== void 0 ? _a : null] })) : null] }) }, item.key));
3850
+ }) })] }, group.key));
3851
+ }) }), helpSection ? (jsx("div", { className: "mt-auto flex flex-col items-center justify-center", children: jsx(Button$1, { fullWidth: true, className: "text-default-500 data-[hover=true]:text-default-600", startContent: jsx(IconComponent, { className: "text-default-500", icon: "solar:info-circle-line-duotone", size: "md" }), variant: "light", onPress: handleHelpClick, isIconOnly: isCollapsed, children: !isCollapsed ? (jsx("span", { className: "menu-claw-collapsible truncate", children: helpSection.title })) : null }) })) : null] }) })] }));
3852
+ });
3853
+
3693
3854
  var StepIndicator = function (_a) {
3694
3855
  var currentStep = _a.currentStep, totalSteps = _a.totalSteps, _b = _a.color, color = _b === void 0 ? "primary" : _b, _c = _a.showStepText, showStepText = _c === void 0 ? true : _c, stepTextFormatter = _a.stepTextFormatter, className = _a.className, props = __rest(_a, ["currentStep", "totalSteps", "color", "showStepText", "stepTextFormatter", "className"]);
3695
3856
  var progressPercentage = Math.min((currentStep / totalSteps) * 100, 100);
@@ -6446,10 +6607,17 @@ var COLOR_BODY = "#c7d2fe";
6446
6607
  var COLOR_STROKE = "#4338ca";
6447
6608
  var COLOR_MEDIAN = "#1e3a8a";
6448
6609
  var COLOR_AXIS = "#6b7280";
6610
+ /** Desplazamiento vertical del rótulo del grupo bajo el eje X. */
6611
+ var GROUP_LABEL_DY = 16;
6612
+ /** Desplazamiento vertical de la línea `n=` (bajo el rótulo del grupo). */
6613
+ var SAMPLE_SIZE_DY = 30;
6614
+ /** Aire por debajo de la línea `n=` que la superficie de hover también cubre. */
6615
+ var HOVER_PADDING = 4;
6449
6616
  var defaultTranslations$1 = {
6450
6617
  emptyState: "Sin datos de distribución",
6451
6618
  sampleSizeLabel: "n",
6452
6619
  outliersLabel: "outliers",
6620
+ pointsLabel: "puntos",
6453
6621
  };
6454
6622
  function formatTick(value, factor, unit) {
6455
6623
  var scaled = value * factor;
@@ -6497,9 +6665,22 @@ function ViolinPlot(_a) {
6497
6665
  var fmt = formatValue !== null && formatValue !== void 0 ? formatValue : (function (v) { return formatTick(v, factor, unit); });
6498
6666
  var columnWidth = (VIEW_WIDTH - marginLeft - MARGIN.right) / groups.length;
6499
6667
  var axisTitle = unit ? "".concat(valueLabel, " (").concat(unit, ")") : valueLabel;
6668
+ /**
6669
+ * Texto del tooltip de columna (TECH-1768): de qué grupo es y cuántos puntos tiene.
6670
+ *
6671
+ * El `nExcluded` va en el MISMO tooltip cuando lo hay: sin él, `n` se leería como "puntos
6672
+ * dibujados" y no lo son — los outliers recortados están contados en `n` pero fuera del lienzo,
6673
+ * y la diferencia importa justo en los grupos con cola larga.
6674
+ */
6675
+ var tooltipFor = function (group) {
6676
+ var base = "".concat(group.label, " \u00B7 ").concat(group.n, " ").concat(t.pointsLabel);
6677
+ return group.nExcluded > 0
6678
+ ? "".concat(base, " \u00B7 \u2212").concat(group.nExcluded, " ").concat(t.outliersLabel)
6679
+ : base;
6680
+ };
6500
6681
  return (jsxs("svg", { viewBox: "0 0 ".concat(VIEW_WIDTH, " ").concat(height), width: "100%", role: "img", "aria-label": valueLabel, children: [[0, maxValue / 2, maxValue].map(function (v) { return (jsxs("g", { children: [jsx("line", { x1: marginLeft, x2: VIEW_WIDTH - MARGIN.right, y1: valueToY(v), y2: valueToY(v), stroke: "#e5e7eb", strokeDasharray: "3 3" }), jsx("text", { x: marginLeft - 6, y: valueToY(v) + 4, textAnchor: "end", fontSize: 11, fill: COLOR_AXIS, children: fmt(v) })] }, v)); }), jsx("text", { transform: "translate(12 ".concat(plotTop + plotHeight / 2, ") rotate(-90)"), textAnchor: "middle", fontSize: 12, fill: COLOR_AXIS, children: axisTitle }), groupLabel ? (jsx("text", { x: marginLeft + (VIEW_WIDTH - marginLeft - MARGIN.right) / 2, y: height - 6, textAnchor: "middle", fontSize: 12, fill: COLOR_AXIS, children: groupLabel })) : null, groups.map(function (group, i) {
6501
6682
  var centerX = marginLeft + columnWidth * (i + 0.5);
6502
- return (jsxs("g", { children: [shouldFallback(group, minSampleForViolin) ? (jsx(ViolinFallback, { group: group, centerX: centerX, valueToY: valueToY })) : (jsx(ViolinBody, { group: group, centerX: centerX, valueToY: valueToY })), jsx("text", { x: centerX, y: plotBottom + 16, textAnchor: "middle", fontSize: 12, fill: COLOR_AXIS, children: group.label }), jsxs("text", { x: centerX, y: plotBottom + 30, textAnchor: "middle", fontSize: 10, fill: COLOR_AXIS, children: [t.sampleSizeLabel, "=", group.n, group.nExcluded > 0
6683
+ return (jsxs("g", { children: [jsx("title", { children: tooltipFor(group) }), jsx("rect", { x: centerX - columnWidth / 2, y: plotTop, width: columnWidth, height: plotBottom - plotTop + SAMPLE_SIZE_DY + HOVER_PADDING, fill: "transparent", pointerEvents: "all" }), shouldFallback(group, minSampleForViolin) ? (jsx(ViolinFallback, { group: group, centerX: centerX, valueToY: valueToY })) : (jsx(ViolinBody, { group: group, centerX: centerX, valueToY: valueToY })), jsx("text", { x: centerX, y: plotBottom + GROUP_LABEL_DY, textAnchor: "middle", fontSize: 12, fill: COLOR_AXIS, children: group.label }), jsxs("text", { x: centerX, y: plotBottom + SAMPLE_SIZE_DY, textAnchor: "middle", fontSize: 10, fill: COLOR_AXIS, children: [t.sampleSizeLabel, "=", group.n, group.nExcluded > 0
6503
6684
  ? " \u00B7 \u2212".concat(group.nExcluded, " ").concat(t.outliersLabel)
6504
6685
  : ""] })] }, group.label));
6505
6686
  })] }));
@@ -9247,4 +9428,4 @@ var NavigationLoadingProvider = function (_a) {
9247
9428
  return (jsxs(NavigationLoadingContext.Provider, { value: value, children: [children, jsx(NavigationLoadingOverlay, { isVisible: isVisible })] }));
9248
9429
  };
9249
9430
 
9250
- export { ALL_THEMES, AURORA_THEME_FAMILIES, AURORA_THEME_REGISTRY, AccordionList, AddHolidayForm, AnalyticsCard, AreaLineChart, AuraAutocomplete, AuraTable, AuraToastProvider, BEWEOS_THEME_MODE_COOKIE_NAME, BreadcrumbsComponent, Button, Card, Chip, ColorPicker, ColorSelector, ContentCarousel, Currency, DEFAULT_PREDEFINED_COLORS, DatePicker, DateRangePicker, DateSelector, DrawerFilters, EmailPreview, EnumMenuNavListItem, GlobalToast, H1, H2, H3, H4, HeaderComponent, HolidayType, IconComponent, ImagePreview, Input, InputPassword, Kanban, KanbanCard, KanbanColumn, MenuComponent, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, MultiStepWizard, NavigationLoadingContext, NavigationLoadingOverlay, NavigationLoadingProvider, P, Pagination, Phone, PromotionalBanner, REGISTERED_THEME_COLORS, RangeFilter, RowSteps, DEFAULT_TRANSLATIONS$1 as SEGMENTATION_DEFAULT_TRANSLATIONS, ScheduleRow, SearchInput, SegmentationBuilder, Select, SimpleLineChart, SocialMediaBar, SocialMediaCarousel, SocialMediaPreview, StepIndicator, Switch as SwitchComponent, THEME_COLOR_HEX_MAP, TagsFilter, Textarea, ThemeContext, ThemePicker, ThemeProvider, TimeInput as TimeInputComponent, ToastContext, Tooltip, TwoColumnLayoutAgent, UploadFile, VerticalSteps, ViolinPlot, WhatsAppPreview, Wizard, WizardNavigation, WizardSidebar, applyCustomPrimaryColor, createCurrencyFormatter, uniqueCountries as defaultCountries, defaultCurrencyOptions, defaultTranslations$5 as defaultTranslations, forceLightOnlyThemeBeforeReact, formatAuroraThemeTooltip, generateThemeColorScale, getContrastForeground, getRegisteredThemeColorBases, getSelectedKeyFromPath, hexToThemeColor, hslToCssValue, isAuroraFullThemeId, isExactThemeColor, isGroupState, isHexColor, isSegmentationGroup, removeCustomPrimaryColor, sizeMap, themeColors, useAuraToast, useCloseOnAncestorScroll, useMediaQuery, useNavigationLoading, useThemeContext };
9431
+ export { ALL_THEMES, AURORA_THEME_FAMILIES, AURORA_THEME_REGISTRY, AccordionList, AddHolidayForm, AnalyticsCard, AreaLineChart, AuraAutocomplete, AuraTable, AuraToastProvider, BEWEOS_THEME_MODE_COOKIE_NAME, BreadcrumbsComponent, Button, Card, Chip, ColorPicker, ColorSelector, ContentCarousel, Currency, DEFAULT_PREDEFINED_COLORS, DatePicker, DateRangePicker, DateSelector, DrawerFilters, EmailPreview, EnumMenuNavListItem, GlobalToast, H1, H2, H3, H4, HeaderComponent, HolidayType, IconComponent, ImagePreview, Input, InputPassword, Kanban, KanbanCard, KanbanColumn, MenuClaw, MenuComponent, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, MultiStepWizard, NavigationLoadingContext, NavigationLoadingOverlay, NavigationLoadingProvider, P, Pagination, Phone, PromotionalBanner, REGISTERED_THEME_COLORS, RangeFilter, RowSteps, DEFAULT_TRANSLATIONS$1 as SEGMENTATION_DEFAULT_TRANSLATIONS, ScheduleRow, SearchInput, SegmentationBuilder, Select, SimpleLineChart, SocialMediaBar, SocialMediaCarousel, SocialMediaPreview, StepIndicator, Switch as SwitchComponent, THEME_COLOR_HEX_MAP, TagsFilter, Textarea, ThemeContext, ThemePicker, ThemeProvider, TimeInput as TimeInputComponent, ToastContext, Tooltip, TwoColumnLayoutAgent, UploadFile, VerticalSteps, ViolinPlot, WhatsAppPreview, Wizard, WizardNavigation, WizardSidebar, applyCustomPrimaryColor, createCurrencyFormatter, uniqueCountries as defaultCountries, defaultCurrencyOptions, defaultTranslations$5 as defaultTranslations, forceLightOnlyThemeBeforeReact, formatAuroraThemeTooltip, generateThemeColorScale, getContrastForeground, getRegisteredThemeColorBases, getSelectedKeyFromPath, hexToThemeColor, hslToCssValue, isAuroraFullThemeId, isExactThemeColor, isGroupState, isHexColor, isSegmentationGroup, removeCustomPrimaryColor, sizeMap, themeColors, useAuraToast, useCloseOnAncestorScroll, useMediaQuery, useNavigationLoading, useThemeContext };
@@ -0,0 +1,26 @@
1
+ import React from "react";
2
+ import "./MenuClaw.scss";
3
+ import type { MenuClawProps } from "./MenuClaw.types";
4
+ /**
5
+ * Menú lateral con historial de conversaciones integrado.
6
+ *
7
+ * Es un componente **aparte de `MenuComponent`**, no una extensión suya, y esa
8
+ * es toda su razón de ser: el diseño no solo añade historial, cambia la
9
+ * DENSIDAD del menú (fila de 36px en vez de 44, `px-2` en vez de `px-3`, dos
10
+ * escalas tipográficas en vez de una, radios `lg`/`xl` en vez de `large`).
11
+ * `MenuComponent` lo consumen varias plataformas —solo en beweossmbs hay 446
12
+ * ficheros que importan el paquete— y no se puede cambiar su densidad base sin
13
+ * regresionar a todas. Por eso aquí hay render propio y libertad visual, y por
14
+ * eso **no** se reutiliza `MenuNavList`: heredaría los 44px que el diseño
15
+ * cambia.
16
+ *
17
+ * Lo que sí se reutiliza es el **contrato de datos** (`MenuNavListItem`), para
18
+ * que un consumidor pueda pasar exactamente la misma estructura de menú que ya
19
+ * le da a `MenuComponent`. Mismo dato, render distinto.
20
+ *
21
+ * Preserva `helpButton` y la barra inferior móvil, que el menú hecho a mano del
22
+ * diseño dejó caer. No pinta cabecera de comercio: en este diseño la identidad
23
+ * del comercio vive fuera del lateral.
24
+ */
25
+ export declare const MenuClaw: React.FC<MenuClawProps>;
26
+ //# sourceMappingURL=MenuClaw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MenuClaw.d.ts","sourceRoot":"","sources":["../../../../src/components/menu-claw/MenuClaw.tsx"],"names":[],"mappings":"AACA,OAAO,KAA+B,MAAM,OAAO,CAAC;AACpD,OAAO,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,kBAAkB,CAAC;AAkB5E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA4S3C,CAAC"}