@beweco/aurora-ui 0.6.60-qa.70 → 0.6.60-qa.77

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
@@ -3332,6 +3332,32 @@ function getSelectedKeyFromPath(pathname, items) {
3332
3332
  return undefined;
3333
3333
  }
3334
3334
 
3335
+ /**
3336
+ * Deriva las iniciales para el avatar del usuario a partir de su nombre completo.
3337
+ *
3338
+ * Muestra la inicial del nombre + la inicial del primer apellido (2 letras en
3339
+ * mayúsculas), p. ej. "Roser Ruiz" -> "RR". Si el usuario solo tiene un token
3340
+ * (nombre sin apellido) devuelve una sola inicial. Si no hay texto, devuelve "".
3341
+ *
3342
+ * TECH-1727: reemplaza el comportamiento por defecto de HeroUI (`safeText`), que
3343
+ * muestra las 3 primeras letras del nombre ("Roser Ruiz" -> "Ros").
3344
+ *
3345
+ * @param fullName Nombre completo del usuario (se usa el mismo valor que el label).
3346
+ * @returns Iniciales en mayúsculas (0, 1 o 2 letras).
3347
+ */
3348
+ var getUserInitials = function (fullName) {
3349
+ var tokens = fullName.trim().split(/\s+/).filter(Boolean);
3350
+ if (tokens.length === 0) {
3351
+ return "";
3352
+ }
3353
+ var firstInitial = tokens[0].charAt(0).toUpperCase();
3354
+ if (tokens.length === 1) {
3355
+ return firstInitial;
3356
+ }
3357
+ var secondInitial = tokens[1].charAt(0).toUpperCase();
3358
+ return "".concat(firstInitial).concat(secondInitial);
3359
+ };
3360
+
3335
3361
  exports.EnumMenuNavListItem = void 0;
3336
3362
  (function (EnumMenuNavListItem) {
3337
3363
  EnumMenuNavListItem["Nest"] = "nest";
@@ -3686,7 +3712,10 @@ var MenuComponent = React.memo(function Menu(_a) {
3686
3712
  flexDirection: isCollapsed ? "column-reverse" : "row",
3687
3713
  }, 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
3714
  ? "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.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] }) })] }));
3715
+ : "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,
3716
+ // TECH-1727: inicial de nombre + inicial de primer apellido
3717
+ // (p. ej. "Roser Ruiz" -> "RR") en vez de las 3 primeras letras.
3718
+ 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 })] })] }), 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
3719
  });
3691
3720
 
3692
3721
  var StepIndicator = function (_a) {
@@ -8151,11 +8180,13 @@ var SegmentationBuilder = React.forwardRef(function (_a, ref) {
8151
8180
  SegmentationBuilder.displayName = "SegmentationBuilder";
8152
8181
 
8153
8182
  var SENTINEL_KEY = "__tags-filter-sentinel__";
8183
+ var EMPTY_KEY = "__tags-filter-empty__";
8154
8184
  var DEFAULT_TRANSLATIONS = {
8155
8185
  placeholder: "Nombre de la etiqueta",
8156
8186
  labelSelect: "Selecciona etiqueta",
8157
8187
  labelSelected: "Etiquetas actuales",
8158
8188
  emptySelectedMessage: "No hay etiquetas seleccionadas",
8189
+ emptyAvailableMessage: "No hay etiquetas disponibles",
8159
8190
  errorLoadingPrefix: "Error al cargar etiquetas",
8160
8191
  loadingMoreLabel: "Cargando más etiquetas…",
8161
8192
  endOfListMessage: "",
@@ -8223,8 +8254,14 @@ function TagsFilter(_a) {
8223
8254
  }, [items, inputValue, compareTags, onInputChange]);
8224
8255
  var filteredItems = getFilteredAvailable(selectedList);
8225
8256
  var showSentinel = Boolean(onLoadMore) && (hasMore || Boolean(t.endOfListMessage));
8226
- var itemsWithSentinel = showSentinel
8227
- ? __spreadArray(__spreadArray([], filteredItems, true), [{ id: SENTINEL_KEY, value: "" }], false) : filteredItems;
8257
+ // Sin nada que ofrecer se inyecta un item de solo lectura con el mensaje de
8258
+ // vacío: así el desplegable explica por qué está vacío en vez de no abrirse
8259
+ // (o abrirse en blanco), y la colección nunca queda realmente vacía.
8260
+ var isAvailableEmpty = filteredItems.length === 0;
8261
+ var itemsWithSentinel = isAvailableEmpty
8262
+ ? [{ id: EMPTY_KEY, value: "" }]
8263
+ : showSentinel
8264
+ ? __spreadArray(__spreadArray([], filteredItems, true), [{ id: SENTINEL_KEY, value: "" }], false) : filteredItems;
8228
8265
  var handleAutocompleteSelection = React.useCallback(function (key) {
8229
8266
  if (key == null) {
8230
8267
  return;
@@ -8243,9 +8280,12 @@ function TagsFilter(_a) {
8243
8280
  setInputValue(v);
8244
8281
  onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(v);
8245
8282
  }, selectedKey: null, items: itemsWithSentinel, onSelectionChange: handleAutocompleteSelection,
8246
- // "focus" keeps the menu tied to focus; prefer opening when typing.
8247
- menuTrigger: "input",
8248
- // When the filtered list is empty, avoid keeping an open overlay that blocks the modal.
8283
+ // TECH-1640: el desplegable abre al enfocar/hacer clic, no solo al
8284
+ // escribir. Un selector de etiquetas debe enseñar lo que hay sin
8285
+ // exigir que el usuario recuerde el nombre.
8286
+ menuTrigger: "focus",
8287
+ // La colección nunca llega vacía (ver `itemsWithSentinel`): cuando no
8288
+ // hay nada que ofrecer se inyecta el item con el mensaje de vacío.
8249
8289
  allowsEmptyCollection: false, shouldCloseOnBlur: true, popoverProps: {
8250
8290
  // isNonModal: false would render a full-screen invisible backdrop that
8251
8291
  // intercepts pointer events, blocking the parent modal's close button.
@@ -8256,6 +8296,9 @@ function TagsFilter(_a) {
8256
8296
  className: "max-h-[200px] overflow-y-auto",
8257
8297
  }, className: "w-full", children: function (item) {
8258
8298
  var candidate = item;
8299
+ if (candidate.id === EMPTY_KEY) {
8300
+ return (jsxRuntime.jsx(react.AutocompleteItem, { textValue: t.emptyAvailableMessage, isReadOnly: true, className: "opacity-100 cursor-default data-[hover=true]:bg-transparent", children: jsxRuntime.jsx("span", { className: "text-tiny text-default-500", children: t.emptyAvailableMessage }) }, EMPTY_KEY));
8301
+ }
8259
8302
  if (candidate.id === SENTINEL_KEY) {
8260
8303
  return (jsxRuntime.jsx(react.AutocompleteItem, { textValue: "", isReadOnly: true, className: "opacity-100 cursor-default data-[hover=true]:bg-transparent", children: jsxRuntime.jsx("div", { ref: function (node) {
8261
8304
  var _a;
package/dist/index.esm.js CHANGED
@@ -3333,6 +3333,32 @@ function getSelectedKeyFromPath(pathname, items) {
3333
3333
  return undefined;
3334
3334
  }
3335
3335
 
3336
+ /**
3337
+ * Deriva las iniciales para el avatar del usuario a partir de su nombre completo.
3338
+ *
3339
+ * Muestra la inicial del nombre + la inicial del primer apellido (2 letras en
3340
+ * mayúsculas), p. ej. "Roser Ruiz" -> "RR". Si el usuario solo tiene un token
3341
+ * (nombre sin apellido) devuelve una sola inicial. Si no hay texto, devuelve "".
3342
+ *
3343
+ * TECH-1727: reemplaza el comportamiento por defecto de HeroUI (`safeText`), que
3344
+ * muestra las 3 primeras letras del nombre ("Roser Ruiz" -> "Ros").
3345
+ *
3346
+ * @param fullName Nombre completo del usuario (se usa el mismo valor que el label).
3347
+ * @returns Iniciales en mayúsculas (0, 1 o 2 letras).
3348
+ */
3349
+ var getUserInitials = function (fullName) {
3350
+ var tokens = fullName.trim().split(/\s+/).filter(Boolean);
3351
+ if (tokens.length === 0) {
3352
+ return "";
3353
+ }
3354
+ var firstInitial = tokens[0].charAt(0).toUpperCase();
3355
+ if (tokens.length === 1) {
3356
+ return firstInitial;
3357
+ }
3358
+ var secondInitial = tokens[1].charAt(0).toUpperCase();
3359
+ return "".concat(firstInitial).concat(secondInitial);
3360
+ };
3361
+
3336
3362
  var EnumMenuNavListItem;
3337
3363
  (function (EnumMenuNavListItem) {
3338
3364
  EnumMenuNavListItem["Nest"] = "nest";
@@ -3687,7 +3713,10 @@ var MenuComponent = React.memo(function Menu(_a) {
3687
3713
  flexDirection: isCollapsed ? "column-reverse" : "row",
3688
3714
  }, children: [jsxs("div", { className: "flex flex-row items-center justify-center ".concat(isCollapsed ? "gap-0" : "gap-2"), children: [jsx("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded-full bg-foreground text-background", children: hasValidLogo ? (jsx("img", { src: commerceInfo.logo, alt: "".concat(t.logoAlt, " ").concat(commerceName), className: "h-full w-full object-cover", onError: function () { return setLogoError(true); } })) : (jsx(IconComponent, { icon: "solar:buildings-2-outline", size: "sm", className: "shrink-0", "aria-hidden": true })) }), jsx("span", { className: "collapsible-item text-small font-bold truncate min-w-0", children: commerceName })] }), jsxs("div", { className: "flex items-center", children: [jsx(IconComponent, { icon: "material-symbols-light:close", size: "lg", className: "cursor-pointer block sm:hidden", onClick: handleSidebarClose }), jsx(IconComponent, { icon: isCollapsed
3689
3715
  ? "solar:alt-arrow-right-outline"
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] }) })] }));
3716
+ : "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,
3717
+ // TECH-1727: inicial de nombre + inicial de primer apellido
3718
+ // (p. ej. "Roser Ruiz" -> "RR") en vez de las 3 primeras letras.
3719
+ getInitials: getUserInitials, 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
3720
  });
3692
3721
 
3693
3722
  var StepIndicator = function (_a) {
@@ -8152,11 +8181,13 @@ var SegmentationBuilder = forwardRef(function (_a, ref) {
8152
8181
  SegmentationBuilder.displayName = "SegmentationBuilder";
8153
8182
 
8154
8183
  var SENTINEL_KEY = "__tags-filter-sentinel__";
8184
+ var EMPTY_KEY = "__tags-filter-empty__";
8155
8185
  var DEFAULT_TRANSLATIONS = {
8156
8186
  placeholder: "Nombre de la etiqueta",
8157
8187
  labelSelect: "Selecciona etiqueta",
8158
8188
  labelSelected: "Etiquetas actuales",
8159
8189
  emptySelectedMessage: "No hay etiquetas seleccionadas",
8190
+ emptyAvailableMessage: "No hay etiquetas disponibles",
8160
8191
  errorLoadingPrefix: "Error al cargar etiquetas",
8161
8192
  loadingMoreLabel: "Cargando más etiquetas…",
8162
8193
  endOfListMessage: "",
@@ -8224,8 +8255,14 @@ function TagsFilter(_a) {
8224
8255
  }, [items, inputValue, compareTags, onInputChange]);
8225
8256
  var filteredItems = getFilteredAvailable(selectedList);
8226
8257
  var showSentinel = Boolean(onLoadMore) && (hasMore || Boolean(t.endOfListMessage));
8227
- var itemsWithSentinel = showSentinel
8228
- ? __spreadArray(__spreadArray([], filteredItems, true), [{ id: SENTINEL_KEY, value: "" }], false) : filteredItems;
8258
+ // Sin nada que ofrecer se inyecta un item de solo lectura con el mensaje de
8259
+ // vacío: así el desplegable explica por qué está vacío en vez de no abrirse
8260
+ // (o abrirse en blanco), y la colección nunca queda realmente vacía.
8261
+ var isAvailableEmpty = filteredItems.length === 0;
8262
+ var itemsWithSentinel = isAvailableEmpty
8263
+ ? [{ id: EMPTY_KEY, value: "" }]
8264
+ : showSentinel
8265
+ ? __spreadArray(__spreadArray([], filteredItems, true), [{ id: SENTINEL_KEY, value: "" }], false) : filteredItems;
8229
8266
  var handleAutocompleteSelection = useCallback(function (key) {
8230
8267
  if (key == null) {
8231
8268
  return;
@@ -8244,9 +8281,12 @@ function TagsFilter(_a) {
8244
8281
  setInputValue(v);
8245
8282
  onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(v);
8246
8283
  }, selectedKey: null, items: itemsWithSentinel, onSelectionChange: handleAutocompleteSelection,
8247
- // "focus" keeps the menu tied to focus; prefer opening when typing.
8248
- menuTrigger: "input",
8249
- // When the filtered list is empty, avoid keeping an open overlay that blocks the modal.
8284
+ // TECH-1640: el desplegable abre al enfocar/hacer clic, no solo al
8285
+ // escribir. Un selector de etiquetas debe enseñar lo que hay sin
8286
+ // exigir que el usuario recuerde el nombre.
8287
+ menuTrigger: "focus",
8288
+ // La colección nunca llega vacía (ver `itemsWithSentinel`): cuando no
8289
+ // hay nada que ofrecer se inyecta el item con el mensaje de vacío.
8250
8290
  allowsEmptyCollection: false, shouldCloseOnBlur: true, popoverProps: {
8251
8291
  // isNonModal: false would render a full-screen invisible backdrop that
8252
8292
  // intercepts pointer events, blocking the parent modal's close button.
@@ -8257,6 +8297,9 @@ function TagsFilter(_a) {
8257
8297
  className: "max-h-[200px] overflow-y-auto",
8258
8298
  }, className: "w-full", children: function (item) {
8259
8299
  var candidate = item;
8300
+ if (candidate.id === EMPTY_KEY) {
8301
+ return (jsx(AutocompleteItem, { textValue: t.emptyAvailableMessage, isReadOnly: true, className: "opacity-100 cursor-default data-[hover=true]:bg-transparent", children: jsx("span", { className: "text-tiny text-default-500", children: t.emptyAvailableMessage }) }, EMPTY_KEY));
8302
+ }
8260
8303
  if (candidate.id === SENTINEL_KEY) {
8261
8304
  return (jsx(AutocompleteItem, { textValue: "", isReadOnly: true, className: "opacity-100 cursor-default data-[hover=true]:bg-transparent", children: jsx("div", { ref: function (node) {
8262
8305
  var _a;
@@ -1 +1 @@
1
- {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../../src/components/menu/Menu.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAkD,MAAM,OAAO,CAAC;AACvE,OAAO,aAAa,CAAC;AAIrB,OAAO,KAAK,EACX,kBAAkB,EAElB,MAAM,cAAc,CAAC;AAgBtB;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA8ZtD,CAAC"}
1
+ {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../../src/components/menu/Menu.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAkD,MAAM,OAAO,CAAC;AACvE,OAAO,aAAa,CAAC;AAKrB,OAAO,KAAK,EACX,kBAAkB,EAElB,MAAM,cAAc,CAAC;AAgBtB;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAiatD,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Deriva las iniciales para el avatar del usuario a partir de su nombre completo.
3
+ *
4
+ * Muestra la inicial del nombre + la inicial del primer apellido (2 letras en
5
+ * mayúsculas), p. ej. "Roser Ruiz" -> "RR". Si el usuario solo tiene un token
6
+ * (nombre sin apellido) devuelve una sola inicial. Si no hay texto, devuelve "".
7
+ *
8
+ * TECH-1727: reemplaza el comportamiento por defecto de HeroUI (`safeText`), que
9
+ * muestra las 3 primeras letras del nombre ("Roser Ruiz" -> "Ros").
10
+ *
11
+ * @param fullName Nombre completo del usuario (se usa el mismo valor que el label).
12
+ * @returns Iniciales en mayúsculas (0, 1 o 2 letras).
13
+ */
14
+ export declare const getUserInitials: (fullName: string) => string;
15
+ //# sourceMappingURL=get-user-initials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-user-initials.d.ts","sourceRoot":"","sources":["../../../../src/components/menu/get-user-initials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,KAAG,MAWlD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TagsFilter.d.ts","sourceRoot":"","sources":["../../../../src/components/tags-filter/TagsFilter.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EACX,eAAe,EAEf,MAAM,oBAAoB,CAAC;AAqC5B;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EACpE,KAAK,EACL,KAAK,EACL,QAAQ,EACR,YAAiB,EACjB,KAAK,EACL,SAAiB,EACjB,SAAc,EACd,YAAY,EAAE,SAAS,EACvB,QAAgB,EAChB,WAA2D,EAC3D,SAAkD,EAClD,aAAa,EACb,OAAe,EACf,aAAqB,EACrB,UAAU,EACV,kBAA0B,GAC1B,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CA0MzC;yBA3Ne,UAAU"}
1
+ {"version":3,"file":"TagsFilter.d.ts","sourceRoot":"","sources":["../../../../src/components/tags-filter/TagsFilter.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EACX,eAAe,EAEf,MAAM,oBAAoB,CAAC;AAuC5B;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EACpE,KAAK,EACL,KAAK,EACL,QAAQ,EACR,YAAiB,EACjB,KAAK,EACL,SAAiB,EACjB,SAAc,EACd,YAAY,EAAE,SAAS,EACvB,QAAgB,EAChB,WAA2D,EAC3D,SAAkD,EAClD,aAAa,EACb,OAAe,EACf,aAAqB,EACrB,UAAU,EACV,kBAA0B,GAC1B,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAkOzC;yBAnPe,UAAU"}
@@ -20,6 +20,12 @@ export type TagsFilterTranslations = {
20
20
  labelSelected?: string;
21
21
  /** Mensaje cuando no hay etiquetas seleccionadas */
22
22
  emptySelectedMessage?: string;
23
+ /**
24
+ * Mensaje dentro del desplegable cuando no queda ninguna etiqueta que
25
+ * ofrecer (el centro no tiene etiquetas, ya están todas asignadas o la
26
+ * búsqueda no encontró nada).
27
+ */
28
+ emptyAvailableMessage?: string;
23
29
  /** Prefijo del mensaje de error (ej. "Error al cargar etiquetas") */
24
30
  errorLoadingPrefix?: string;
25
31
  /** Texto sr-only del spinner inline mientras se cargan más páginas. */
@@ -1 +1 @@
1
- {"version":3,"file":"TagsFilter.types.d.ts","sourceRoot":"","sources":["../../../../src/components/tags-filter/TagsFilter.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,OAAO;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACpC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO;IAC3D,qDAAqD;IACrD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,0CAA0C;IAC1C,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,2DAA2D;IAC3D,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAClC,uFAAuF;IACvF,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2GAA2G;IAC3G,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wEAAwE;IACxE,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC;IACtC,kFAAkF;IAClF,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IAC/B;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mIAAmI;IACnI,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B"}
1
+ {"version":3,"file":"TagsFilter.types.d.ts","sourceRoot":"","sources":["../../../../src/components/tags-filter/TagsFilter.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,OAAO;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACpC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO;IAC3D,qDAAqD;IACrD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,0CAA0C;IAC1C,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,2DAA2D;IAC3D,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAClC,uFAAuF;IACvF,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2GAA2G;IAC3G,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wEAAwE;IACxE,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC;IACtC,kFAAkF;IAClF,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IAC/B;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mIAAmI;IACnI,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beweco/aurora-ui",
3
- "version": "0.6.60-qa.70",
3
+ "version": "0.6.60-qa.77",
4
4
  "description": "Bewe Aurora UI Component Library",
5
5
  "main": "./dist/index.cjs.js",
6
6
  "module": "./dist/index.esm.js",