@beweco/aurora-ui 0.6.72-qa.96 → 0.6.73

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
@@ -3280,6 +3280,27 @@ var KanbanComponent = function (_a) {
3280
3280
  var Kanban = React.memo(KanbanComponent);
3281
3281
  Kanban.displayName = "Kanban";
3282
3282
 
3283
+ /**
3284
+ * Icono canónico de Linda para CTAs inteligentes (TECH-2386).
3285
+ *
3286
+ * SVG empaquetado como import estático — NUNCA usar `@iconify/react` /
3287
+ * `IconComponent` con este glifo: los iconos de Iconify se resuelven en
3288
+ * runtime contra api.iconify.design y desaparecen (control entero invisible
3289
+ * si es `isIconOnly`) cuando ese host no responde — ver TECH-2103/2104.
3290
+ * Este componente no depende de red.
3291
+ *
3292
+ * Glifo: el mismo path ya usado en el producto para señalar acciones de
3293
+ * Linda (equivalente al icono "magic-stick" ya presente junto a
3294
+ * "Linda Recommended Actions"), resuelto para v1 en TECH-2374 sin
3295
+ * diseñadora asignada — funcional-first, sin inventar iconografía nueva.
3296
+ * Cuando exista un asset bespoke (identidad "droide retro-futurista"),
3297
+ * este es el único componente a sustituir — ver README.md.
3298
+ */
3299
+ var LindaIcon = function (_a) {
3300
+ var _b = _a.size, size = _b === void 0 ? 24 : _b, className = _a.className, nativeProps = __rest(_a, ["size", "className"]);
3301
+ return (jsxRuntime.jsx("svg", __assign({ xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", className: className, role: "img", "aria-hidden": "true" }, nativeProps, { children: jsxRuntime.jsxs("g", { fill: "currentColor", children: [jsxRuntime.jsx("path", { d: "M3.84453 3.84453C2.71849 4.97056 2.71849 6.79623 3.84453 7.92226L5.43227 9.51C5.44419 9.49622 5.45669 9.48276 5.46978 9.46967L9.46978 5.46967C9.48284 5.45662 9.49625 5.44415 9.50999 5.43226L7.92226 3.84453C6.79623 2.71849 4.97056 2.71849 3.84453 3.84453Z" }), jsxRuntime.jsx("path", { d: "M10.5679 6.49012C10.556 6.50386 10.5435 6.51728 10.5304 6.53033L6.53044 10.5303C6.51735 10.5434 6.5039 10.5559 6.49011 10.5678L16.0777 20.1555C17.2038 21.2815 19.0294 21.2815 20.1555 20.1555C21.2815 19.0294 21.2815 17.2038 20.1555 16.0777L10.5679 6.49012Z" }), jsxRuntime.jsx("path", { d: "M16.1 2.30719C16.261 1.8976 16.8385 1.8976 16.9994 2.30719L17.4298 3.40247C17.479 3.52752 17.5776 3.62651 17.7022 3.67583L18.7934 4.1078C19.2015 4.26934 19.2015 4.849 18.7934 5.01054L17.7022 5.44252C17.5776 5.49184 17.479 5.59082 17.4298 5.71587L16.9995 6.81115C16.8385 7.22074 16.261 7.22074 16.1 6.81116L15.6697 5.71587C15.6205 5.59082 15.5219 5.49184 15.3973 5.44252L14.3061 5.01054C13.898 4.849 13.898 4.26934 14.3061 4.1078L15.3973 3.67583C15.5219 3.62651 15.6205 3.52752 15.6697 3.40247L16.1 2.30719Z" }), jsxRuntime.jsx("path", { d: "M19.9672 9.12945C20.1281 8.71987 20.7057 8.71987 20.8666 9.12945L21.0235 9.5288C21.0727 9.65385 21.1713 9.75284 21.2959 9.80215L21.6937 9.95965C22.1018 10.1212 22.1018 10.7009 21.6937 10.8624L21.2959 11.0199C21.1713 11.0692 21.0727 11.1682 21.0235 11.2932L20.8666 11.6926C20.7057 12.1022 20.1281 12.1022 19.9672 11.6926L19.8103 11.2932C19.7611 11.1682 19.6625 11.0692 19.5379 11.0199L19.14 10.8624C18.732 10.7009 18.732 10.1212 19.14 9.95965L19.5379 9.80215C19.6625 9.75284 19.7611 9.65385 19.8103 9.5288L19.9672 9.12945Z" }), jsxRuntime.jsx("path", { d: "M5.1332 15.3072C5.29414 14.8976 5.87167 14.8976 6.03261 15.3072L6.18953 15.7065C6.23867 15.8316 6.33729 15.9306 6.46188 15.9799L6.85975 16.1374C7.26783 16.2989 7.26783 16.8786 6.85975 17.0401L6.46188 17.1976C6.33729 17.2469 6.23867 17.3459 6.18953 17.471L6.03261 17.8703C5.87167 18.2799 5.29414 18.2799 5.1332 17.8703L4.97628 17.471C4.92714 17.3459 4.82852 17.2469 4.70393 17.1976L4.30606 17.0401C3.89798 16.8786 3.89798 16.2989 4.30606 16.1374L4.70393 15.9799C4.82852 15.9306 4.92714 15.8316 4.97628 15.7065L5.1332 15.3072Z" })] }) })));
3302
+ };
3303
+
3283
3304
  var defaultTranslations$8 = {
3284
3305
  previewAlt: "Vista previa de imagen",
3285
3306
  removeButtonAriaLabel: "Eliminar imagen",
@@ -3993,96 +4014,6 @@ var MenuClaw = React.memo(function MenuClaw(_a) {
3993
4014
  }) }), 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] }) })] }));
3994
4015
  });
3995
4016
 
3996
- /**
3997
- * Interacciones que un popover no-modal NO debe tratar como "clic fuera".
3998
- *
3999
- * El problema que resuelve: `useOverlay` de react-aria trata cualquier
4000
- * pulsación fuera del popover como interacción externa y, cuando el popover es
4001
- * el overlay visible más reciente, hace `stopPropagation()` + `preventDefault()`
4002
- * sobre el `pointerdown` **y** sobre el `click`
4003
- * (`@react-aria/overlays/useOverlay`). El evento nunca llega a su destino, así
4004
- * que `usePress` no registra la pulsación y `onPress` no se dispara: el primer
4005
- * clic solo cierra el desplegable.
4006
- *
4007
- * Para un clic en la página de fondo eso es lo correcto: descartar el
4008
- * desplegable sin activar nada por debajo. Dentro del mismo diálogo no: ahí el
4009
- * usuario está rellenando un formulario y espera que su clic llegue. Y como los
4010
- * buscadores se reabren al recuperar el foco, el clic siguiente se volvía a
4011
- * tragar — un callejón sin salida del que solo se salía vaciando el campo.
4012
- *
4013
- * La única palanca es `shouldCloseOnInteractOutside`: es el guardián de esos dos
4014
- * `preventDefault`. Devolviendo `false` para lo que no es realmente "fuera", la
4015
- * pulsación llega intacta. El desplegable sigue cerrándose igual, pero por
4016
- * pérdida de foco (`shouldCloseOnBlur`) en vez de por interacción externa.
4017
- */
4018
- var _a, _b;
4019
- /**
4020
- * Marca un botón como control de cierre de su contenedor. Los popovers de Aura
4021
- * no lo cuentan como interacción externa, así que su pulsación no se pierde.
4022
- */
4023
- var DISMISS_CONTROL_ATTRIBUTE = "data-aura-dismiss";
4024
- /** Props a esparcir en un control de cierre: `<Button {...dismissControlProps} />`. */
4025
- var dismissControlProps = (_a = {},
4026
- _a[DISMISS_CONTROL_ATTRIBUTE] = "true",
4027
- _a);
4028
- /**
4029
- * Marca el contenedor de una superficie modal propia (wizard, panel a medida).
4030
- * No hace falta en `Modal` ni `Drawer`: los diálogos de HeroUI ya traen
4031
- * `role="dialog"`, que cuenta igual.
4032
- */
4033
- var CONTAINER_ATTRIBUTE = "data-aura-container";
4034
- /** Props a esparcir en el contenedor: `<div {...containerProps}>`. */
4035
- var containerProps = (_b = {},
4036
- _b[CONTAINER_ATTRIBUTE] = "true",
4037
- _b);
4038
- /**
4039
- * Selector de controles de cierre. Incluye `[aria-label="Close"]` para cubrir
4040
- * los botones de cerrar internos de HeroUI (Modal, Drawer), que no admiten
4041
- * atributos propios.
4042
- */
4043
- var DISMISS_CONTROL_SELECTOR = "[".concat(DISMISS_CONTROL_ATTRIBUTE, "],[aria-label=\"Close\"]");
4044
- /** Selector del contenedor modal: el marcado de Aura o un diálogo estándar. */
4045
- var CONTAINER_SELECTOR = "[".concat(CONTAINER_ATTRIBUTE, "],[role=\"dialog\"],[role=\"alertdialog\"]");
4046
- var matchesAncestor = function (element, selector) {
4047
- if (!element || typeof element.closest !== "function") {
4048
- return false;
4049
- }
4050
- return element.closest(selector) != null;
4051
- };
4052
- /** `true` si el elemento es un control de cierre (o está dentro de uno). */
4053
- var isDismissControl = function (element) { return matchesAncestor(element, DISMISS_CONTROL_SELECTOR); };
4054
- /**
4055
- * Predicado listo para `popoverProps.shouldCloseOnInteractOutside` de un
4056
- * componente con popover no-modal.
4057
- *
4058
- * Devuelve `false` —no es interacción externa— en tres casos:
4059
- *
4060
- * 1. Dentro del propio componente: el popover vive en un portal, así que el
4061
- * campo de búsqueda queda fuera de él y una pulsación sobre el texto se
4062
- * contaba como externa.
4063
- * 2. Sobre un control de cierre del contenedor.
4064
- * 3. Dentro del mismo diálogo/contenedor que el componente: seguir rellenando
4065
- * el formulario no es descartar el desplegable.
4066
- *
4067
- * @param element Elemento donde ha empezado la interacción.
4068
- * @param root Raíz del componente.
4069
- */
4070
- var shouldClosePopoverOnInteractOutside = function (element, root) {
4071
- var _a;
4072
- if (root === null || root === void 0 ? void 0 : root.contains(element)) {
4073
- return false;
4074
- }
4075
- if (isDismissControl(element)) {
4076
- return false;
4077
- }
4078
- if (!matchesAncestor(element, CONTAINER_SELECTOR)) {
4079
- return true;
4080
- }
4081
- // Solo exime el contenedor propio: un diálogo distinto sigue siendo externo.
4082
- var container = (_a = root === null || root === void 0 ? void 0 : root.closest) === null || _a === void 0 ? void 0 : _a.call(root, CONTAINER_SELECTOR);
4083
- return !(container === null || container === void 0 ? void 0 : container.contains(element));
4084
- };
4085
-
4086
4017
  var StepIndicator = function (_a) {
4087
4018
  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"]);
4088
4019
  var progressPercentage = Math.min((currentStep / totalSteps) * 100, 100);
@@ -4266,7 +4197,7 @@ var VerticalSteps = React.forwardRef(function (_a, ref) {
4266
4197
  VerticalSteps.displayName = "VerticalSteps";
4267
4198
 
4268
4199
  var MultiStepSidebar = React.forwardRef(function (_a, ref) {
4269
- var children = _a.children, className = _a.className, currentPage = _a.currentPage; _a.onBack; _a.onNext; var onChangePage = _a.onChangePage, steps = _a.steps; _a.goBackTranslation; var _b = _a.closeTranslation, closeTranslation = _b === void 0 ? "Close" : _b, onClose = _a.onClose, _c = _a.hideInactiveDescriptions, hideInactiveDescriptions = _c === void 0 ? false : _c, _d = _a.isDismissable, isDismissable = _d === void 0 ? true : _d, props = __rest(_a, ["children", "className", "currentPage", "onBack", "onNext", "onChangePage", "steps", "goBackTranslation", "closeTranslation", "onClose", "hideInactiveDescriptions", "isDismissable"]);
4200
+ var children = _a.children, className = _a.className, currentPage = _a.currentPage; _a.onBack; _a.onNext; var onChangePage = _a.onChangePage, steps = _a.steps; _a.goBackTranslation; var onClose = _a.onClose, _b = _a.hideInactiveDescriptions, hideInactiveDescriptions = _b === void 0 ? false : _b, _c = _a.isDismissable, isDismissable = _c === void 0 ? true : _c, props = __rest(_a, ["children", "className", "currentPage", "onBack", "onNext", "onChangePage", "steps", "goBackTranslation", "onClose", "hideInactiveDescriptions", "isDismissable"]);
4270
4201
  var handleOverlayClick = function (e) {
4271
4202
  if (!isDismissable) {
4272
4203
  return;
@@ -4275,7 +4206,7 @@ var MultiStepSidebar = React.forwardRef(function (_a, ref) {
4275
4206
  onClose === null || onClose === void 0 ? void 0 : onClose();
4276
4207
  }
4277
4208
  };
4278
- return (jsxRuntime.jsx("div", __assign({}, containerProps, { className: "fixed inset-0 z-50 flex items-center justify-center bg-content3/50 backdrop-blur-sm", onClick: handleOverlayClick, children: jsxRuntime.jsxs("div", __assign({ ref: ref, className: react.cn("relative flex h-full w-full max-w-4xl overflow-hidden rounded-lg bg-background shadow-lg lg:h-auto lg:max-h-[85vh] lg:min-h-[512px]", className) }, props, { children: [jsxRuntime.jsx("div", { className: react.cn("absolute inset-y-0 left-0 hidden w-1/3 flex-col justify-start gap-y-8 overflow-y-auto p-8 md:flex [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]"), children: jsxRuntime.jsx(VerticalSteps, { className: "aura-stepper-theme", color: "primary", currentStep: currentPage, steps: steps, onStepChange: onChangePage, hideInactiveDescriptions: hideInactiveDescriptions }) }), jsxRuntime.jsxs("div", { className: "relative flex w-full flex-col items-center justify-between gap-4 md:ml-[33.333333%] md:w-2/3 md:p-4 min-h-0", children: [jsxRuntime.jsx(Button, __assign({ isIconOnly: true }, dismissControlProps, { "aria-label": closeTranslation, className: "absolute right-4 top-4", size: "sm", variant: "light", color: "default", onPress: onClose, startContent: jsxRuntime.jsx(IconComponent, { className: "text-foreground", icon: "material-symbols:close-rounded", size: "lg" }) })), jsxRuntime.jsx("div", { className: "pt-9 w-10/12 md:hidden", children: jsxRuntime.jsx("div", { className: "flex w-full justify-center", children: jsxRuntime.jsx(StepIndicator, { className: "aura-stepper-theme", currentStep: currentPage + 1, totalSteps: steps.length }) }) }), jsxRuntime.jsx("div", { className: "flex flex-col flex-1 w-full justify-between p-4 sm:max-w-md md:max-w-lg overflow-y-auto min-h-0 [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]", children: children })] })] })) })));
4209
+ return (jsxRuntime.jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-content3/50 backdrop-blur-sm", onClick: handleOverlayClick, children: jsxRuntime.jsxs("div", __assign({ ref: ref, className: react.cn("relative flex h-full w-full max-w-4xl overflow-hidden rounded-lg bg-background shadow-lg lg:h-auto lg:max-h-[85vh] lg:min-h-[512px]", className) }, props, { children: [jsxRuntime.jsx("div", { className: react.cn("absolute inset-y-0 left-0 hidden w-1/3 flex-col justify-start gap-y-8 overflow-y-auto p-8 md:flex [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]"), children: jsxRuntime.jsx(VerticalSteps, { className: "aura-stepper-theme", color: "primary", currentStep: currentPage, steps: steps, onStepChange: onChangePage, hideInactiveDescriptions: hideInactiveDescriptions }) }), jsxRuntime.jsxs("div", { className: "relative flex w-full flex-col items-center justify-between gap-4 md:ml-[33.333333%] md:w-2/3 md:p-4 min-h-0", children: [jsxRuntime.jsx(Button, { isIconOnly: true, className: "absolute right-4 top-4", size: "sm", variant: "light", color: "default", onPress: onClose, startContent: jsxRuntime.jsx(IconComponent, { className: "text-foreground", icon: "material-symbols:close-rounded", size: "lg" }) }), jsxRuntime.jsx("div", { className: "pt-9 w-10/12 md:hidden", children: jsxRuntime.jsx("div", { className: "flex w-full justify-center", children: jsxRuntime.jsx(StepIndicator, { className: "aura-stepper-theme", currentStep: currentPage + 1, totalSteps: steps.length }) }) }), jsxRuntime.jsx("div", { className: "flex flex-col flex-1 w-full justify-between p-4 sm:max-w-md md:max-w-lg overflow-y-auto min-h-0 [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]", children: children })] })] })) }));
4279
4210
  });
4280
4211
  MultiStepSidebar.displayName = "MultiStepSidebar";
4281
4212
 
@@ -4302,7 +4233,6 @@ var MultiStepWizard = function (_a) {
4302
4233
  cancel: "Cancel",
4303
4234
  next: "Next",
4304
4235
  complete: "Complete",
4305
- close: "Close",
4306
4236
  }, translations);
4307
4237
  var paginate = React.useCallback(function (newDirection) {
4308
4238
  setPage(function (prev) {
@@ -4354,11 +4284,14 @@ var MultiStepWizard = function (_a) {
4354
4284
  if (!isOpen) {
4355
4285
  return null;
4356
4286
  }
4357
- return (jsxRuntime.jsxs(MultiStepSidebar, { currentPage: page, goBackTranslation: t.goBack, closeTranslation: t.close, steps: steps, onBack: onBack, onChangePage: onChangePage, onClose: onClose, onNext: onNext, hideInactiveDescriptions: hideInactiveDescriptions, isDismissable: isDismissable, children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx(Button, { className: "w-fit text-default-600 mb-6", color: "default", variant: "light", onPress: onBack, isDisabled: page === 0, startContent: jsxRuntime.jsx(IconComponent, { className: "text-default-500", icon: "material-symbols:arrow-back-rounded", size: "sm" }), children: t.goBack || "Back" }), jsxRuntime.jsx("div", { className: "relative flex h-fit w-full flex-col text-center lg:justify-center lg:pt-0", children: content })] }), jsxRuntime.jsx(MultistepNavigationButtons, { backButtonProps: {
4287
+ return (jsxRuntime.jsxs(MultiStepSidebar, { currentPage: page, goBackTranslation: t.goBack, steps: steps, onBack: onBack, onChangePage: onChangePage, onClose: onClose, onNext: onNext, hideInactiveDescriptions: hideInactiveDescriptions, isDismissable: isDismissable, children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx(Button, { className: "w-fit text-default-600 mb-6", color: "default", variant: "light", onPress: onBack, isDisabled: page === 0, startContent: jsxRuntime.jsx(IconComponent, { className: "text-default-500", icon: "material-symbols:arrow-back-rounded", size: "sm" }), children: t.goBack || "Back" }), jsxRuntime.jsx("div", { className: "relative flex h-fit w-full flex-col text-center lg:justify-center lg:pt-0", children: content })] }), jsxRuntime.jsx(MultistepNavigationButtons, { backButtonProps: {
4358
4288
  isDisabled: page === 0,
4359
4289
  onPress: onBack,
4360
4290
  children: t.goBack,
4361
- }, cancelButtonProps: __assign(__assign({}, dismissControlProps), { onPress: onClose, children: t.cancel }), nextButtonProps: {
4291
+ }, cancelButtonProps: {
4292
+ onPress: onClose,
4293
+ children: t.cancel,
4294
+ }, nextButtonProps: {
4362
4295
  children: getButtonText(),
4363
4296
  onPress: handleNextAction,
4364
4297
  isDisabled: steps[page].isStepValid === false,
@@ -4437,6 +4370,13 @@ var Phone = function (_a) {
4437
4370
  document.removeEventListener("mousedown", handleClickOutside);
4438
4371
  };
4439
4372
  }, [isDropdownOpen]);
4373
+ // El dropdown se portea a `body` con posición absoluta fija; cerrarlo cuando
4374
+ // un ancestro hace scroll para que no quede flotando fuera de lugar.
4375
+ useCloseOnAncestorScroll({
4376
+ isOpen: isDropdownOpen,
4377
+ onClose: function () { return setIsDropdownOpen(false); },
4378
+ contentRef: portalDropdownRef,
4379
+ });
4440
4380
  var handleCountrySelect = function (country) {
4441
4381
  setSelectedCountry(country);
4442
4382
  setIsDropdownOpen(false);
@@ -8924,7 +8864,6 @@ function TagsFilter(_a) {
8924
8864
  var _m = React.useState(0), autocompleteKey = _m[0], setAutocompleteKey = _m[1];
8925
8865
  var selectedList = value !== null && value !== void 0 ? value : [];
8926
8866
  var _o = React.useState(null), sentinelNode = _o[0], setSentinelNode = _o[1];
8927
- var rootRef = React.useRef(null);
8928
8867
  React.useEffect(function () {
8929
8868
  if (!onLoadMore || !sentinelNode || !hasMore) {
8930
8869
  return;
@@ -8996,7 +8935,7 @@ function TagsFilter(_a) {
8996
8935
  if (isLoading) {
8997
8936
  return (jsxRuntime.jsx("div", { className: "flex flex-col gap-4 ".concat(className), children: jsxRuntime.jsx("div", { className: "flex justify-center py-4", children: jsxRuntime.jsx(react.Spinner, { size: "sm" }) }) }));
8998
8937
  }
8999
- return (jsxRuntime.jsxs("div", { ref: rootRef, className: "flex flex-col gap-4 ".concat(className), children: [error && (jsxRuntime.jsxs("div", { className: "text-danger text-small py-2", children: [t.errorLoadingPrefix, ": ", error] })), !error && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [jsxRuntime.jsxs(H4, { className: "text-tiny text-left text-default-700", children: [t.labelSelect, required && jsxRuntime.jsx("span", { className: "text-danger ml-0.5", children: "*" })] }), jsxRuntime.jsx(AuraAutocomplete, { placeholder: t.placeholder, "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : t.placeholder, inputValue: inputValue, onInputChange: function (v) {
8938
+ return (jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 ".concat(className), children: [error && (jsxRuntime.jsxs("div", { className: "text-danger text-small py-2", children: [t.errorLoadingPrefix, ": ", error] })), !error && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [jsxRuntime.jsxs(H4, { className: "text-tiny text-left text-default-700", children: [t.labelSelect, required && jsxRuntime.jsx("span", { className: "text-danger ml-0.5", children: "*" })] }), jsxRuntime.jsx(AuraAutocomplete, { placeholder: t.placeholder, "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : t.placeholder, inputValue: inputValue, onInputChange: function (v) {
9000
8939
  setInputValue(v);
9001
8940
  onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(v);
9002
8941
  }, selectedKey: null, items: itemsWithSentinel, onSelectionChange: handleAutocompleteSelection,
@@ -9015,24 +8954,7 @@ function TagsFilter(_a) {
9015
8954
  // intercepts pointer events, blocking the parent modal's close button.
9016
8955
  // shouldCloseOnInteractOutside already handles closing on outside clicks.
9017
8956
  isNonModal: true,
9018
- // El desplegable se renderiza en un portal, así que el campo de
9019
- // búsqueda queda FUERA de él y una pulsación sobre el texto contaba
9020
- // como interacción externa. Al cerrarse, el FocusScope devolvía el
9021
- // foco con un `.focus()` que abortaba el gesto de selección que el
9022
- // navegador acababa de iniciar: de ahí que arrastrar o hacer doble
9023
- // clic no seleccionara nada y solo quedara borrar letra a letra
9024
- // (con el teclado sí funcionaba, porque no pasa por aquí).
9025
- // Las pulsaciones dentro del componente dejan de contar como
9026
- // externas; las de fuera siguen cerrando el desplegable igual.
9027
- //
9028
- // Los controles de cierre del contenedor también quedan exentos:
9029
- // react-aria hace `preventDefault()` sobre el pointerdown Y el
9030
- // click de toda interacción externa, así que su `onPress` no se
9031
- // disparaba y el contenedor no se podía cerrar mientras el
9032
- // desplegable estuviera abierto (ver `shouldClosePopoverOnInteractOutside`).
9033
- shouldCloseOnInteractOutside: function (element) {
9034
- return shouldClosePopoverOnInteractOutside(element, rootRef.current);
9035
- },
8957
+ shouldCloseOnInteractOutside: function () { return true; },
9036
8958
  }, listboxProps: {
9037
8959
  className: "max-h-[200px] overflow-y-auto",
9038
8960
  }, className: "w-full", children: function (item) {
@@ -9797,7 +9719,6 @@ exports.AuraToastProvider = AuraToastProvider;
9797
9719
  exports.BEWEOS_THEME_MODE_COOKIE_NAME = BEWEOS_THEME_MODE_COOKIE_NAME;
9798
9720
  exports.BreadcrumbsComponent = BreadcrumbsComponent;
9799
9721
  exports.Button = Button;
9800
- exports.CONTAINER_ATTRIBUTE = CONTAINER_ATTRIBUTE;
9801
9722
  exports.Card = Card;
9802
9723
  exports.Chip = Chip;
9803
9724
  exports.ColorPicker = ColorPicker;
@@ -9807,7 +9728,6 @@ exports.Currency = Currency;
9807
9728
  exports.DEFAULT_DONUT_COLORS = DEFAULT_DONUT_COLORS;
9808
9729
  exports.DEFAULT_PREDEFINED_COLORS = DEFAULT_PREDEFINED_COLORS;
9809
9730
  exports.DEFAULT_RANKED_BAR_COLORS = DEFAULT_RANKED_BAR_COLORS;
9810
- exports.DISMISS_CONTROL_ATTRIBUTE = DISMISS_CONTROL_ATTRIBUTE;
9811
9731
  exports.DatePicker = DatePicker;
9812
9732
  exports.DateRangePicker = DateRangePicker;
9813
9733
  exports.DateSelector = DateSelector;
@@ -9827,6 +9747,7 @@ exports.InputPassword = InputPassword;
9827
9747
  exports.Kanban = Kanban;
9828
9748
  exports.KanbanCard = KanbanCard;
9829
9749
  exports.KanbanColumn = KanbanColumn;
9750
+ exports.LindaIcon = LindaIcon;
9830
9751
  exports.MenuClaw = MenuClaw;
9831
9752
  exports.MenuComponent = MenuComponent;
9832
9753
  exports.Modal = Modal;
@@ -9880,12 +9801,10 @@ exports.computeBars = computeBars;
9880
9801
  exports.computeMax = computeMax;
9881
9802
  exports.computeSlices = computeSlices;
9882
9803
  exports.computeTotal = computeTotal;
9883
- exports.containerProps = containerProps;
9884
9804
  exports.createCurrencyFormatter = createCurrencyFormatter;
9885
9805
  exports.defaultCountries = uniqueCountries;
9886
9806
  exports.defaultCurrencyOptions = defaultCurrencyOptions;
9887
9807
  exports.defaultTranslations = defaultTranslations$5;
9888
- exports.dismissControlProps = dismissControlProps;
9889
9808
  exports.forceLightOnlyThemeBeforeReact = forceLightOnlyThemeBeforeReact;
9890
9809
  exports.formatAuroraThemeTooltip = formatAuroraThemeTooltip;
9891
9810
  exports.generateThemeColorScale = generateThemeColorScale;
@@ -9895,7 +9814,6 @@ exports.getSelectedKeyFromPath = getSelectedKeyFromPath;
9895
9814
  exports.hexToThemeColor = hexToThemeColor;
9896
9815
  exports.hslToCssValue = hslToCssValue;
9897
9816
  exports.isAuroraFullThemeId = isAuroraFullThemeId;
9898
- exports.isDismissControl = isDismissControl;
9899
9817
  exports.isDonutEmpty = isDonutEmpty;
9900
9818
  exports.isExactThemeColor = isExactThemeColor;
9901
9819
  exports.isGroupState = isGroupState;
@@ -9903,7 +9821,6 @@ exports.isHexColor = isHexColor;
9903
9821
  exports.isRankedBarListEmpty = isRankedBarListEmpty;
9904
9822
  exports.isSegmentationGroup = isSegmentationGroup;
9905
9823
  exports.removeCustomPrimaryColor = removeCustomPrimaryColor;
9906
- exports.shouldClosePopoverOnInteractOutside = shouldClosePopoverOnInteractOutside;
9907
9824
  exports.sizeMap = sizeMap;
9908
9825
  exports.themeColors = themeColors;
9909
9826
  exports.useAuraToast = useAuraToast;
package/dist/index.esm.js CHANGED
@@ -3281,6 +3281,27 @@ var KanbanComponent = function (_a) {
3281
3281
  var Kanban = memo(KanbanComponent);
3282
3282
  Kanban.displayName = "Kanban";
3283
3283
 
3284
+ /**
3285
+ * Icono canónico de Linda para CTAs inteligentes (TECH-2386).
3286
+ *
3287
+ * SVG empaquetado como import estático — NUNCA usar `@iconify/react` /
3288
+ * `IconComponent` con este glifo: los iconos de Iconify se resuelven en
3289
+ * runtime contra api.iconify.design y desaparecen (control entero invisible
3290
+ * si es `isIconOnly`) cuando ese host no responde — ver TECH-2103/2104.
3291
+ * Este componente no depende de red.
3292
+ *
3293
+ * Glifo: el mismo path ya usado en el producto para señalar acciones de
3294
+ * Linda (equivalente al icono "magic-stick" ya presente junto a
3295
+ * "Linda Recommended Actions"), resuelto para v1 en TECH-2374 sin
3296
+ * diseñadora asignada — funcional-first, sin inventar iconografía nueva.
3297
+ * Cuando exista un asset bespoke (identidad "droide retro-futurista"),
3298
+ * este es el único componente a sustituir — ver README.md.
3299
+ */
3300
+ var LindaIcon = function (_a) {
3301
+ var _b = _a.size, size = _b === void 0 ? 24 : _b, className = _a.className, nativeProps = __rest(_a, ["size", "className"]);
3302
+ return (jsx("svg", __assign({ xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", className: className, role: "img", "aria-hidden": "true" }, nativeProps, { children: jsxs("g", { fill: "currentColor", children: [jsx("path", { d: "M3.84453 3.84453C2.71849 4.97056 2.71849 6.79623 3.84453 7.92226L5.43227 9.51C5.44419 9.49622 5.45669 9.48276 5.46978 9.46967L9.46978 5.46967C9.48284 5.45662 9.49625 5.44415 9.50999 5.43226L7.92226 3.84453C6.79623 2.71849 4.97056 2.71849 3.84453 3.84453Z" }), jsx("path", { d: "M10.5679 6.49012C10.556 6.50386 10.5435 6.51728 10.5304 6.53033L6.53044 10.5303C6.51735 10.5434 6.5039 10.5559 6.49011 10.5678L16.0777 20.1555C17.2038 21.2815 19.0294 21.2815 20.1555 20.1555C21.2815 19.0294 21.2815 17.2038 20.1555 16.0777L10.5679 6.49012Z" }), jsx("path", { d: "M16.1 2.30719C16.261 1.8976 16.8385 1.8976 16.9994 2.30719L17.4298 3.40247C17.479 3.52752 17.5776 3.62651 17.7022 3.67583L18.7934 4.1078C19.2015 4.26934 19.2015 4.849 18.7934 5.01054L17.7022 5.44252C17.5776 5.49184 17.479 5.59082 17.4298 5.71587L16.9995 6.81115C16.8385 7.22074 16.261 7.22074 16.1 6.81116L15.6697 5.71587C15.6205 5.59082 15.5219 5.49184 15.3973 5.44252L14.3061 5.01054C13.898 4.849 13.898 4.26934 14.3061 4.1078L15.3973 3.67583C15.5219 3.62651 15.6205 3.52752 15.6697 3.40247L16.1 2.30719Z" }), jsx("path", { d: "M19.9672 9.12945C20.1281 8.71987 20.7057 8.71987 20.8666 9.12945L21.0235 9.5288C21.0727 9.65385 21.1713 9.75284 21.2959 9.80215L21.6937 9.95965C22.1018 10.1212 22.1018 10.7009 21.6937 10.8624L21.2959 11.0199C21.1713 11.0692 21.0727 11.1682 21.0235 11.2932L20.8666 11.6926C20.7057 12.1022 20.1281 12.1022 19.9672 11.6926L19.8103 11.2932C19.7611 11.1682 19.6625 11.0692 19.5379 11.0199L19.14 10.8624C18.732 10.7009 18.732 10.1212 19.14 9.95965L19.5379 9.80215C19.6625 9.75284 19.7611 9.65385 19.8103 9.5288L19.9672 9.12945Z" }), jsx("path", { d: "M5.1332 15.3072C5.29414 14.8976 5.87167 14.8976 6.03261 15.3072L6.18953 15.7065C6.23867 15.8316 6.33729 15.9306 6.46188 15.9799L6.85975 16.1374C7.26783 16.2989 7.26783 16.8786 6.85975 17.0401L6.46188 17.1976C6.33729 17.2469 6.23867 17.3459 6.18953 17.471L6.03261 17.8703C5.87167 18.2799 5.29414 18.2799 5.1332 17.8703L4.97628 17.471C4.92714 17.3459 4.82852 17.2469 4.70393 17.1976L4.30606 17.0401C3.89798 16.8786 3.89798 16.2989 4.30606 16.1374L4.70393 15.9799C4.82852 15.9306 4.92714 15.8316 4.97628 15.7065L5.1332 15.3072Z" })] }) })));
3303
+ };
3304
+
3284
3305
  var defaultTranslations$8 = {
3285
3306
  previewAlt: "Vista previa de imagen",
3286
3307
  removeButtonAriaLabel: "Eliminar imagen",
@@ -3994,96 +4015,6 @@ var MenuClaw = React.memo(function MenuClaw(_a) {
3994
4015
  }) }), 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] }) })] }));
3995
4016
  });
3996
4017
 
3997
- /**
3998
- * Interacciones que un popover no-modal NO debe tratar como "clic fuera".
3999
- *
4000
- * El problema que resuelve: `useOverlay` de react-aria trata cualquier
4001
- * pulsación fuera del popover como interacción externa y, cuando el popover es
4002
- * el overlay visible más reciente, hace `stopPropagation()` + `preventDefault()`
4003
- * sobre el `pointerdown` **y** sobre el `click`
4004
- * (`@react-aria/overlays/useOverlay`). El evento nunca llega a su destino, así
4005
- * que `usePress` no registra la pulsación y `onPress` no se dispara: el primer
4006
- * clic solo cierra el desplegable.
4007
- *
4008
- * Para un clic en la página de fondo eso es lo correcto: descartar el
4009
- * desplegable sin activar nada por debajo. Dentro del mismo diálogo no: ahí el
4010
- * usuario está rellenando un formulario y espera que su clic llegue. Y como los
4011
- * buscadores se reabren al recuperar el foco, el clic siguiente se volvía a
4012
- * tragar — un callejón sin salida del que solo se salía vaciando el campo.
4013
- *
4014
- * La única palanca es `shouldCloseOnInteractOutside`: es el guardián de esos dos
4015
- * `preventDefault`. Devolviendo `false` para lo que no es realmente "fuera", la
4016
- * pulsación llega intacta. El desplegable sigue cerrándose igual, pero por
4017
- * pérdida de foco (`shouldCloseOnBlur`) en vez de por interacción externa.
4018
- */
4019
- var _a, _b;
4020
- /**
4021
- * Marca un botón como control de cierre de su contenedor. Los popovers de Aura
4022
- * no lo cuentan como interacción externa, así que su pulsación no se pierde.
4023
- */
4024
- var DISMISS_CONTROL_ATTRIBUTE = "data-aura-dismiss";
4025
- /** Props a esparcir en un control de cierre: `<Button {...dismissControlProps} />`. */
4026
- var dismissControlProps = (_a = {},
4027
- _a[DISMISS_CONTROL_ATTRIBUTE] = "true",
4028
- _a);
4029
- /**
4030
- * Marca el contenedor de una superficie modal propia (wizard, panel a medida).
4031
- * No hace falta en `Modal` ni `Drawer`: los diálogos de HeroUI ya traen
4032
- * `role="dialog"`, que cuenta igual.
4033
- */
4034
- var CONTAINER_ATTRIBUTE = "data-aura-container";
4035
- /** Props a esparcir en el contenedor: `<div {...containerProps}>`. */
4036
- var containerProps = (_b = {},
4037
- _b[CONTAINER_ATTRIBUTE] = "true",
4038
- _b);
4039
- /**
4040
- * Selector de controles de cierre. Incluye `[aria-label="Close"]` para cubrir
4041
- * los botones de cerrar internos de HeroUI (Modal, Drawer), que no admiten
4042
- * atributos propios.
4043
- */
4044
- var DISMISS_CONTROL_SELECTOR = "[".concat(DISMISS_CONTROL_ATTRIBUTE, "],[aria-label=\"Close\"]");
4045
- /** Selector del contenedor modal: el marcado de Aura o un diálogo estándar. */
4046
- var CONTAINER_SELECTOR = "[".concat(CONTAINER_ATTRIBUTE, "],[role=\"dialog\"],[role=\"alertdialog\"]");
4047
- var matchesAncestor = function (element, selector) {
4048
- if (!element || typeof element.closest !== "function") {
4049
- return false;
4050
- }
4051
- return element.closest(selector) != null;
4052
- };
4053
- /** `true` si el elemento es un control de cierre (o está dentro de uno). */
4054
- var isDismissControl = function (element) { return matchesAncestor(element, DISMISS_CONTROL_SELECTOR); };
4055
- /**
4056
- * Predicado listo para `popoverProps.shouldCloseOnInteractOutside` de un
4057
- * componente con popover no-modal.
4058
- *
4059
- * Devuelve `false` —no es interacción externa— en tres casos:
4060
- *
4061
- * 1. Dentro del propio componente: el popover vive en un portal, así que el
4062
- * campo de búsqueda queda fuera de él y una pulsación sobre el texto se
4063
- * contaba como externa.
4064
- * 2. Sobre un control de cierre del contenedor.
4065
- * 3. Dentro del mismo diálogo/contenedor que el componente: seguir rellenando
4066
- * el formulario no es descartar el desplegable.
4067
- *
4068
- * @param element Elemento donde ha empezado la interacción.
4069
- * @param root Raíz del componente.
4070
- */
4071
- var shouldClosePopoverOnInteractOutside = function (element, root) {
4072
- var _a;
4073
- if (root === null || root === void 0 ? void 0 : root.contains(element)) {
4074
- return false;
4075
- }
4076
- if (isDismissControl(element)) {
4077
- return false;
4078
- }
4079
- if (!matchesAncestor(element, CONTAINER_SELECTOR)) {
4080
- return true;
4081
- }
4082
- // Solo exime el contenedor propio: un diálogo distinto sigue siendo externo.
4083
- var container = (_a = root === null || root === void 0 ? void 0 : root.closest) === null || _a === void 0 ? void 0 : _a.call(root, CONTAINER_SELECTOR);
4084
- return !(container === null || container === void 0 ? void 0 : container.contains(element));
4085
- };
4086
-
4087
4018
  var StepIndicator = function (_a) {
4088
4019
  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"]);
4089
4020
  var progressPercentage = Math.min((currentStep / totalSteps) * 100, 100);
@@ -4267,7 +4198,7 @@ var VerticalSteps = React.forwardRef(function (_a, ref) {
4267
4198
  VerticalSteps.displayName = "VerticalSteps";
4268
4199
 
4269
4200
  var MultiStepSidebar = React.forwardRef(function (_a, ref) {
4270
- var children = _a.children, className = _a.className, currentPage = _a.currentPage; _a.onBack; _a.onNext; var onChangePage = _a.onChangePage, steps = _a.steps; _a.goBackTranslation; var _b = _a.closeTranslation, closeTranslation = _b === void 0 ? "Close" : _b, onClose = _a.onClose, _c = _a.hideInactiveDescriptions, hideInactiveDescriptions = _c === void 0 ? false : _c, _d = _a.isDismissable, isDismissable = _d === void 0 ? true : _d, props = __rest(_a, ["children", "className", "currentPage", "onBack", "onNext", "onChangePage", "steps", "goBackTranslation", "closeTranslation", "onClose", "hideInactiveDescriptions", "isDismissable"]);
4201
+ var children = _a.children, className = _a.className, currentPage = _a.currentPage; _a.onBack; _a.onNext; var onChangePage = _a.onChangePage, steps = _a.steps; _a.goBackTranslation; var onClose = _a.onClose, _b = _a.hideInactiveDescriptions, hideInactiveDescriptions = _b === void 0 ? false : _b, _c = _a.isDismissable, isDismissable = _c === void 0 ? true : _c, props = __rest(_a, ["children", "className", "currentPage", "onBack", "onNext", "onChangePage", "steps", "goBackTranslation", "onClose", "hideInactiveDescriptions", "isDismissable"]);
4271
4202
  var handleOverlayClick = function (e) {
4272
4203
  if (!isDismissable) {
4273
4204
  return;
@@ -4276,7 +4207,7 @@ var MultiStepSidebar = React.forwardRef(function (_a, ref) {
4276
4207
  onClose === null || onClose === void 0 ? void 0 : onClose();
4277
4208
  }
4278
4209
  };
4279
- return (jsx("div", __assign({}, containerProps, { className: "fixed inset-0 z-50 flex items-center justify-center bg-content3/50 backdrop-blur-sm", onClick: handleOverlayClick, children: jsxs("div", __assign({ ref: ref, className: cn("relative flex h-full w-full max-w-4xl overflow-hidden rounded-lg bg-background shadow-lg lg:h-auto lg:max-h-[85vh] lg:min-h-[512px]", className) }, props, { children: [jsx("div", { className: cn("absolute inset-y-0 left-0 hidden w-1/3 flex-col justify-start gap-y-8 overflow-y-auto p-8 md:flex [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]"), children: jsx(VerticalSteps, { className: "aura-stepper-theme", color: "primary", currentStep: currentPage, steps: steps, onStepChange: onChangePage, hideInactiveDescriptions: hideInactiveDescriptions }) }), jsxs("div", { className: "relative flex w-full flex-col items-center justify-between gap-4 md:ml-[33.333333%] md:w-2/3 md:p-4 min-h-0", children: [jsx(Button, __assign({ isIconOnly: true }, dismissControlProps, { "aria-label": closeTranslation, className: "absolute right-4 top-4", size: "sm", variant: "light", color: "default", onPress: onClose, startContent: jsx(IconComponent, { className: "text-foreground", icon: "material-symbols:close-rounded", size: "lg" }) })), jsx("div", { className: "pt-9 w-10/12 md:hidden", children: jsx("div", { className: "flex w-full justify-center", children: jsx(StepIndicator, { className: "aura-stepper-theme", currentStep: currentPage + 1, totalSteps: steps.length }) }) }), jsx("div", { className: "flex flex-col flex-1 w-full justify-between p-4 sm:max-w-md md:max-w-lg overflow-y-auto min-h-0 [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]", children: children })] })] })) })));
4210
+ return (jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-content3/50 backdrop-blur-sm", onClick: handleOverlayClick, children: jsxs("div", __assign({ ref: ref, className: cn("relative flex h-full w-full max-w-4xl overflow-hidden rounded-lg bg-background shadow-lg lg:h-auto lg:max-h-[85vh] lg:min-h-[512px]", className) }, props, { children: [jsx("div", { className: cn("absolute inset-y-0 left-0 hidden w-1/3 flex-col justify-start gap-y-8 overflow-y-auto p-8 md:flex [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]"), children: jsx(VerticalSteps, { className: "aura-stepper-theme", color: "primary", currentStep: currentPage, steps: steps, onStepChange: onChangePage, hideInactiveDescriptions: hideInactiveDescriptions }) }), jsxs("div", { className: "relative flex w-full flex-col items-center justify-between gap-4 md:ml-[33.333333%] md:w-2/3 md:p-4 min-h-0", children: [jsx(Button, { isIconOnly: true, className: "absolute right-4 top-4", size: "sm", variant: "light", color: "default", onPress: onClose, startContent: jsx(IconComponent, { className: "text-foreground", icon: "material-symbols:close-rounded", size: "lg" }) }), jsx("div", { className: "pt-9 w-10/12 md:hidden", children: jsx("div", { className: "flex w-full justify-center", children: jsx(StepIndicator, { className: "aura-stepper-theme", currentStep: currentPage + 1, totalSteps: steps.length }) }) }), jsx("div", { className: "flex flex-col flex-1 w-full justify-between p-4 sm:max-w-md md:max-w-lg overflow-y-auto min-h-0 [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]", children: children })] })] })) }));
4280
4211
  });
4281
4212
  MultiStepSidebar.displayName = "MultiStepSidebar";
4282
4213
 
@@ -4303,7 +4234,6 @@ var MultiStepWizard = function (_a) {
4303
4234
  cancel: "Cancel",
4304
4235
  next: "Next",
4305
4236
  complete: "Complete",
4306
- close: "Close",
4307
4237
  }, translations);
4308
4238
  var paginate = React.useCallback(function (newDirection) {
4309
4239
  setPage(function (prev) {
@@ -4355,11 +4285,14 @@ var MultiStepWizard = function (_a) {
4355
4285
  if (!isOpen) {
4356
4286
  return null;
4357
4287
  }
4358
- return (jsxs(MultiStepSidebar, { currentPage: page, goBackTranslation: t.goBack, closeTranslation: t.close, steps: steps, onBack: onBack, onChangePage: onChangePage, onClose: onClose, onNext: onNext, hideInactiveDescriptions: hideInactiveDescriptions, isDismissable: isDismissable, children: [jsxs("div", { children: [jsx(Button, { className: "w-fit text-default-600 mb-6", color: "default", variant: "light", onPress: onBack, isDisabled: page === 0, startContent: jsx(IconComponent, { className: "text-default-500", icon: "material-symbols:arrow-back-rounded", size: "sm" }), children: t.goBack || "Back" }), jsx("div", { className: "relative flex h-fit w-full flex-col text-center lg:justify-center lg:pt-0", children: content })] }), jsx(MultistepNavigationButtons, { backButtonProps: {
4288
+ return (jsxs(MultiStepSidebar, { currentPage: page, goBackTranslation: t.goBack, steps: steps, onBack: onBack, onChangePage: onChangePage, onClose: onClose, onNext: onNext, hideInactiveDescriptions: hideInactiveDescriptions, isDismissable: isDismissable, children: [jsxs("div", { children: [jsx(Button, { className: "w-fit text-default-600 mb-6", color: "default", variant: "light", onPress: onBack, isDisabled: page === 0, startContent: jsx(IconComponent, { className: "text-default-500", icon: "material-symbols:arrow-back-rounded", size: "sm" }), children: t.goBack || "Back" }), jsx("div", { className: "relative flex h-fit w-full flex-col text-center lg:justify-center lg:pt-0", children: content })] }), jsx(MultistepNavigationButtons, { backButtonProps: {
4359
4289
  isDisabled: page === 0,
4360
4290
  onPress: onBack,
4361
4291
  children: t.goBack,
4362
- }, cancelButtonProps: __assign(__assign({}, dismissControlProps), { onPress: onClose, children: t.cancel }), nextButtonProps: {
4292
+ }, cancelButtonProps: {
4293
+ onPress: onClose,
4294
+ children: t.cancel,
4295
+ }, nextButtonProps: {
4363
4296
  children: getButtonText(),
4364
4297
  onPress: handleNextAction,
4365
4298
  isDisabled: steps[page].isStepValid === false,
@@ -4438,6 +4371,13 @@ var Phone = function (_a) {
4438
4371
  document.removeEventListener("mousedown", handleClickOutside);
4439
4372
  };
4440
4373
  }, [isDropdownOpen]);
4374
+ // El dropdown se portea a `body` con posición absoluta fija; cerrarlo cuando
4375
+ // un ancestro hace scroll para que no quede flotando fuera de lugar.
4376
+ useCloseOnAncestorScroll({
4377
+ isOpen: isDropdownOpen,
4378
+ onClose: function () { return setIsDropdownOpen(false); },
4379
+ contentRef: portalDropdownRef,
4380
+ });
4441
4381
  var handleCountrySelect = function (country) {
4442
4382
  setSelectedCountry(country);
4443
4383
  setIsDropdownOpen(false);
@@ -8925,7 +8865,6 @@ function TagsFilter(_a) {
8925
8865
  var _m = useState(0), autocompleteKey = _m[0], setAutocompleteKey = _m[1];
8926
8866
  var selectedList = value !== null && value !== void 0 ? value : [];
8927
8867
  var _o = useState(null), sentinelNode = _o[0], setSentinelNode = _o[1];
8928
- var rootRef = useRef(null);
8929
8868
  useEffect(function () {
8930
8869
  if (!onLoadMore || !sentinelNode || !hasMore) {
8931
8870
  return;
@@ -8997,7 +8936,7 @@ function TagsFilter(_a) {
8997
8936
  if (isLoading) {
8998
8937
  return (jsx("div", { className: "flex flex-col gap-4 ".concat(className), children: jsx("div", { className: "flex justify-center py-4", children: jsx(Spinner, { size: "sm" }) }) }));
8999
8938
  }
9000
- return (jsxs("div", { ref: rootRef, className: "flex flex-col gap-4 ".concat(className), children: [error && (jsxs("div", { className: "text-danger text-small py-2", children: [t.errorLoadingPrefix, ": ", error] })), !error && (jsxs(Fragment, { children: [jsxs("div", { className: "flex flex-col gap-3", children: [jsxs(H4, { className: "text-tiny text-left text-default-700", children: [t.labelSelect, required && jsx("span", { className: "text-danger ml-0.5", children: "*" })] }), jsx(AuraAutocomplete, { placeholder: t.placeholder, "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : t.placeholder, inputValue: inputValue, onInputChange: function (v) {
8939
+ return (jsxs("div", { className: "flex flex-col gap-4 ".concat(className), children: [error && (jsxs("div", { className: "text-danger text-small py-2", children: [t.errorLoadingPrefix, ": ", error] })), !error && (jsxs(Fragment, { children: [jsxs("div", { className: "flex flex-col gap-3", children: [jsxs(H4, { className: "text-tiny text-left text-default-700", children: [t.labelSelect, required && jsx("span", { className: "text-danger ml-0.5", children: "*" })] }), jsx(AuraAutocomplete, { placeholder: t.placeholder, "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : t.placeholder, inputValue: inputValue, onInputChange: function (v) {
9001
8940
  setInputValue(v);
9002
8941
  onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(v);
9003
8942
  }, selectedKey: null, items: itemsWithSentinel, onSelectionChange: handleAutocompleteSelection,
@@ -9016,24 +8955,7 @@ function TagsFilter(_a) {
9016
8955
  // intercepts pointer events, blocking the parent modal's close button.
9017
8956
  // shouldCloseOnInteractOutside already handles closing on outside clicks.
9018
8957
  isNonModal: true,
9019
- // El desplegable se renderiza en un portal, así que el campo de
9020
- // búsqueda queda FUERA de él y una pulsación sobre el texto contaba
9021
- // como interacción externa. Al cerrarse, el FocusScope devolvía el
9022
- // foco con un `.focus()` que abortaba el gesto de selección que el
9023
- // navegador acababa de iniciar: de ahí que arrastrar o hacer doble
9024
- // clic no seleccionara nada y solo quedara borrar letra a letra
9025
- // (con el teclado sí funcionaba, porque no pasa por aquí).
9026
- // Las pulsaciones dentro del componente dejan de contar como
9027
- // externas; las de fuera siguen cerrando el desplegable igual.
9028
- //
9029
- // Los controles de cierre del contenedor también quedan exentos:
9030
- // react-aria hace `preventDefault()` sobre el pointerdown Y el
9031
- // click de toda interacción externa, así que su `onPress` no se
9032
- // disparaba y el contenedor no se podía cerrar mientras el
9033
- // desplegable estuviera abierto (ver `shouldClosePopoverOnInteractOutside`).
9034
- shouldCloseOnInteractOutside: function (element) {
9035
- return shouldClosePopoverOnInteractOutside(element, rootRef.current);
9036
- },
8958
+ shouldCloseOnInteractOutside: function () { return true; },
9037
8959
  }, listboxProps: {
9038
8960
  className: "max-h-[200px] overflow-y-auto",
9039
8961
  }, className: "w-full", children: function (item) {
@@ -9777,4 +9699,4 @@ var NavigationLoadingProvider = function (_a) {
9777
9699
  return (jsxs(NavigationLoadingContext.Provider, { value: value, children: [children, jsx(NavigationLoadingOverlay, { isVisible: isVisible })] }));
9778
9700
  };
9779
9701
 
9780
- export { ALL_THEMES, AURORA_THEME_FAMILIES, AURORA_THEME_REGISTRY, AccordionList, AddHolidayForm, AnalyticsCard, AreaLineChart, AuraAutocomplete, AuraTable, AuraToastProvider, BEWEOS_THEME_MODE_COOKIE_NAME, BreadcrumbsComponent, Button, CONTAINER_ATTRIBUTE, Card, Chip, ColorPicker, ColorSelector, ContentCarousel, Currency, DEFAULT_DONUT_COLORS, DEFAULT_PREDEFINED_COLORS, DEFAULT_RANKED_BAR_COLORS, DISMISS_CONTROL_ATTRIBUTE, DatePicker, DateRangePicker, DateSelector, DonutChart, 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, RankedBarList, RowSteps, DEFAULT_TRANSLATIONS$1 as SEGMENTATION_DEFAULT_TRANSLATIONS, ScheduleRow, SearchInput, SegmentationBuilder, Select, SimpleLineChart, SocialMediaBar, SocialMediaCarousel, SocialMediaPreview, StatTile, 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, computeBars, computeMax, computeSlices, computeTotal, containerProps, createCurrencyFormatter, uniqueCountries as defaultCountries, defaultCurrencyOptions, defaultTranslations$5 as defaultTranslations, dismissControlProps, forceLightOnlyThemeBeforeReact, formatAuroraThemeTooltip, generateThemeColorScale, getContrastForeground, getRegisteredThemeColorBases, getSelectedKeyFromPath, hexToThemeColor, hslToCssValue, isAuroraFullThemeId, isDismissControl, isDonutEmpty, isExactThemeColor, isGroupState, isHexColor, isRankedBarListEmpty, isSegmentationGroup, removeCustomPrimaryColor, shouldClosePopoverOnInteractOutside, sizeMap, themeColors, useAuraToast, useCloseOnAncestorScroll, useMediaQuery, useNavigationLoading, useThemeContext };
9702
+ 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_DONUT_COLORS, DEFAULT_PREDEFINED_COLORS, DEFAULT_RANKED_BAR_COLORS, DatePicker, DateRangePicker, DateSelector, DonutChart, DrawerFilters, EmailPreview, EnumMenuNavListItem, GlobalToast, H1, H2, H3, H4, HeaderComponent, HolidayType, IconComponent, ImagePreview, Input, InputPassword, Kanban, KanbanCard, KanbanColumn, LindaIcon, MenuClaw, MenuComponent, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, MultiStepWizard, NavigationLoadingContext, NavigationLoadingOverlay, NavigationLoadingProvider, P, Pagination, Phone, PromotionalBanner, REGISTERED_THEME_COLORS, RangeFilter, RankedBarList, RowSteps, DEFAULT_TRANSLATIONS$1 as SEGMENTATION_DEFAULT_TRANSLATIONS, ScheduleRow, SearchInput, SegmentationBuilder, Select, SimpleLineChart, SocialMediaBar, SocialMediaCarousel, SocialMediaPreview, StatTile, 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, computeBars, computeMax, computeSlices, computeTotal, createCurrencyFormatter, uniqueCountries as defaultCountries, defaultCurrencyOptions, defaultTranslations$5 as defaultTranslations, forceLightOnlyThemeBeforeReact, formatAuroraThemeTooltip, generateThemeColorScale, getContrastForeground, getRegisteredThemeColorBases, getSelectedKeyFromPath, hexToThemeColor, hslToCssValue, isAuroraFullThemeId, isDonutEmpty, isExactThemeColor, isGroupState, isHexColor, isRankedBarListEmpty, isSegmentationGroup, removeCustomPrimaryColor, sizeMap, themeColors, useAuraToast, useCloseOnAncestorScroll, useMediaQuery, useNavigationLoading, useThemeContext };
@@ -0,0 +1,20 @@
1
+ import type React from "react";
2
+ import type { LindaIconProps } from "./LindaIcon.types";
3
+ /**
4
+ * Icono canónico de Linda para CTAs inteligentes (TECH-2386).
5
+ *
6
+ * SVG empaquetado como import estático — NUNCA usar `@iconify/react` /
7
+ * `IconComponent` con este glifo: los iconos de Iconify se resuelven en
8
+ * runtime contra api.iconify.design y desaparecen (control entero invisible
9
+ * si es `isIconOnly`) cuando ese host no responde — ver TECH-2103/2104.
10
+ * Este componente no depende de red.
11
+ *
12
+ * Glifo: el mismo path ya usado en el producto para señalar acciones de
13
+ * Linda (equivalente al icono "magic-stick" ya presente junto a
14
+ * "Linda Recommended Actions"), resuelto para v1 en TECH-2374 sin
15
+ * diseñadora asignada — funcional-first, sin inventar iconografía nueva.
16
+ * Cuando exista un asset bespoke (identidad "droide retro-futurista"),
17
+ * este es el único componente a sustituir — ver README.md.
18
+ */
19
+ export declare const LindaIcon: React.FC<LindaIconProps>;
20
+ //# sourceMappingURL=LindaIcon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LindaIcon.d.ts","sourceRoot":"","sources":["../../../../src/components/linda-icon/LindaIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAyB9C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type React from "react";
2
+ export interface LindaIconProps extends React.SVGProps<SVGSVGElement> {
3
+ /** Tamaño en píxeles (ancho = alto). Default: 24. */
4
+ size?: number;
5
+ }
6
+ //# sourceMappingURL=LindaIcon.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LindaIcon.types.d.ts","sourceRoot":"","sources":["../../../../src/components/linda-icon/LindaIcon.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,cAAe,SAAQ,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;IACpE,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,3 @@
1
+ export { LindaIcon } from "./LindaIcon";
2
+ export type { LindaIconProps } from "./LindaIcon.types";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/linda-icon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"MultiStepWizard.d.ts","sourceRoot":"","sources":["../../../../src/components/multi-step-wizard/MultiStepWizard.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAIpE,eAAO,MAAM,eAAe,GAAI,oHAS7B,oBAAoB,mDAmJtB,CAAC"}
1
+ {"version":3,"file":"MultiStepWizard.d.ts","sourceRoot":"","sources":["../../../../src/components/multi-step-wizard/MultiStepWizard.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAIpE,eAAO,MAAM,eAAe,GAAI,oHAS7B,oBAAoB,mDA6ItB,CAAC"}
@@ -30,7 +30,5 @@ export interface MultiStepWizardTranslations {
30
30
  cancel?: string;
31
31
  next?: string;
32
32
  complete?: string;
33
- /** Nombre accesible del botón de cerrar (solo icono). Por defecto `"Close"`. */
34
- close?: string;
35
33
  }
36
34
  //# sourceMappingURL=MultiStepWizard.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MultiStepWizard.types.d.ts","sourceRoot":"","sources":["../../../../src/components/multi-step-wizard/MultiStepWizard.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,IAAI;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,YAAY,CAAC,EAAE,2BAA2B,CAAC;IAC3C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,wCAAwC;IACxC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;CACf"}
1
+ {"version":3,"file":"MultiStepWizard.types.d.ts","sourceRoot":"","sources":["../../../../src/components/multi-step-wizard/MultiStepWizard.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,IAAI;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,YAAY,CAAC,EAAE,2BAA2B,CAAC;IAC3C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,wCAAwC;IACxC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -1 +1 @@
1
- {"version":3,"file":"MultiStepSidebar.d.ts","sourceRoot":"","sources":["../../../../../src/components/multi-step-wizard/_internal/MultiStepSidebar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEtE,eAAO,MAAM,gBAAgB,8FAuG5B,CAAC"}
1
+ {"version":3,"file":"MultiStepSidebar.d.ts","sourceRoot":"","sources":["../../../../../src/components/multi-step-wizard/_internal/MultiStepSidebar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEtE,eAAO,MAAM,gBAAgB,8FA6F5B,CAAC"}
@@ -9,8 +9,6 @@ export interface MultiStepSidebarProps extends React.HTMLAttributes<HTMLDivEleme
9
9
  onChangePage?: (page: number) => void;
10
10
  steps: Step[];
11
11
  goBackTranslation?: string;
12
- /** Nombre accesible del botón de cerrar (solo icono). Por defecto `"Close"`. */
13
- closeTranslation?: string;
14
12
  hideInactiveDescriptions?: boolean;
15
13
  /** Permite cerrar al hacer clic en el backdrop. Por defecto `true`. */
16
14
  isDismissable?: boolean;