@beweco/aurora-ui 0.1.48 → 0.1.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/assets/css/styles.css +1 -1
  2. package/dist/index.cjs.js +389 -2
  3. package/dist/index.esm.js +389 -4
  4. package/dist/types/components/assistant-orb/AssistantOrb.d.ts +11 -0
  5. package/dist/types/components/assistant-orb/AssistantOrb.d.ts.map +1 -0
  6. package/dist/types/components/assistant-orb/AssistantOrb.types.d.ts +30 -0
  7. package/dist/types/components/assistant-orb/AssistantOrb.types.d.ts.map +1 -0
  8. package/dist/types/components/assistant-orb/_internal/AuraGlow.d.ts +11 -0
  9. package/dist/types/components/assistant-orb/_internal/AuraGlow.d.ts.map +1 -0
  10. package/dist/types/components/assistant-orb/_internal/SpeechBubble.d.ts +12 -0
  11. package/dist/types/components/assistant-orb/_internal/SpeechBubble.d.ts.map +1 -0
  12. package/dist/types/components/assistant-orb/_internal/index.d.ts +3 -0
  13. package/dist/types/components/assistant-orb/_internal/index.d.ts.map +1 -0
  14. package/dist/types/components/assistant-orb/assistant-orb.constants.d.ts +9 -0
  15. package/dist/types/components/assistant-orb/assistant-orb.constants.d.ts.map +1 -0
  16. package/dist/types/components/assistant-orb/index.d.ts +3 -0
  17. package/dist/types/components/assistant-orb/index.d.ts.map +1 -0
  18. package/dist/types/components/two-column-layout-agent/TwoColumnLayoutAgent.d.ts +4 -0
  19. package/dist/types/components/two-column-layout-agent/TwoColumnLayoutAgent.d.ts.map +1 -0
  20. package/dist/types/components/two-column-layout-agent/TwoColumnLayoutAgent.types.d.ts +35 -0
  21. package/dist/types/components/two-column-layout-agent/TwoColumnLayoutAgent.types.d.ts.map +1 -0
  22. package/dist/types/components/two-column-layout-agent/index.d.ts +3 -0
  23. package/dist/types/components/two-column-layout-agent/index.d.ts.map +1 -0
  24. package/dist/types/hooks/index.d.ts +2 -0
  25. package/dist/types/hooks/index.d.ts.map +1 -0
  26. package/dist/types/hooks/useMediaQuery.d.ts +5 -0
  27. package/dist/types/hooks/useMediaQuery.d.ts.map +1 -0
  28. package/dist/types/index.d.ts +2 -0
  29. package/dist/types/index.d.ts.map +1 -1
  30. package/package.json +1 -1
package/dist/index.cjs.js CHANGED
@@ -1822,7 +1822,7 @@ KanbanColumn.displayName = "KanbanColumn";
1822
1822
  * Traducciones por defecto en español.
1823
1823
  * Se mezclan con las traducciones proporcionadas por el usuario.
1824
1824
  */
1825
- var DEFAULT_TRANSLATIONS$1 = {
1825
+ var DEFAULT_TRANSLATIONS$2 = {
1826
1826
  dropHere: "Soltar aquí",
1827
1827
  emptyMessage: "No hay elementos",
1828
1828
  };
@@ -1856,7 +1856,7 @@ var columnGapClasses = {
1856
1856
  var KanbanComponent = function (_a) {
1857
1857
  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;
1858
1858
  // Mezclar traducciones del usuario con las por defecto
1859
- var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$1), translations);
1859
+ var t = __assign(__assign({}, DEFAULT_TRANSLATIONS$2), translations);
1860
1860
  // Determinar si drag está habilitado
1861
1861
  var dragEnabled = isDraggable !== null && isDraggable !== void 0 ? isDraggable : !!onItemMove;
1862
1862
  // Estado del drag actual
@@ -3682,6 +3682,391 @@ function GlobalToast() {
3682
3682
  return (jsxRuntime.jsx("div", { className: "fixed top-4 right-4 z-[2000] w-full max-w-sm", children: jsxRuntime.jsx(react.Alert, { hideIconWrapper: true, color: toast.color, variant: "flat", title: toast.title, description: toast.description, isClosable: true, onClose: hideToast }) }));
3683
3683
  }
3684
3684
 
3685
+ /**
3686
+ * Subscribe to a CSS media query and return its current match state.
3687
+ */
3688
+ var useMediaQuery = function (query, initialValue) {
3689
+ if (initialValue === void 0) { initialValue = true; }
3690
+ var _a = React.useState(function () {
3691
+ if (typeof window === "undefined") {
3692
+ return initialValue;
3693
+ }
3694
+ return window.matchMedia(query).matches;
3695
+ }), matches = _a[0], setMatches = _a[1];
3696
+ React.useEffect(function () {
3697
+ if (typeof window === "undefined") {
3698
+ return;
3699
+ }
3700
+ var mediaQuery = window.matchMedia(query);
3701
+ var onMediaQueryChange = function (event) {
3702
+ setMatches(event.matches);
3703
+ };
3704
+ setMatches(mediaQuery.matches);
3705
+ if (typeof mediaQuery.addEventListener === "function") {
3706
+ mediaQuery.addEventListener("change", onMediaQueryChange);
3707
+ return function () { return mediaQuery.removeEventListener("change", onMediaQueryChange); };
3708
+ }
3709
+ var legacyMediaQuery = mediaQuery;
3710
+ legacyMediaQuery.addListener(onMediaQueryChange);
3711
+ return function () { return legacyMediaQuery.removeListener(onMediaQueryChange); };
3712
+ }, [query]);
3713
+ return matches;
3714
+ };
3715
+
3716
+ /** Default typing speed in milliseconds per character */
3717
+ var DEFAULT_TYPING_SPEED_MS = 20;
3718
+ /** Default system primary color token for the aura glow */
3719
+ var DEFAULT_AURA_COLOR = "hsl(var(--heroui-primary))";
3720
+ /** Default max width for the speech bubble */
3721
+ var DEFAULT_MAX_WIDTH = 420;
3722
+ /** Orb dimensions by size variant */
3723
+ var ORB_SIZES = {
3724
+ sm: 96,
3725
+ md: 128,
3726
+ lg: 160,
3727
+ xl: 192,
3728
+ };
3729
+
3730
+ var isHexColor = function (value) {
3731
+ var normalized = value.startsWith("#") ? value.slice(1) : value;
3732
+ return /^[0-9A-Fa-f]{3}$|^[0-9A-Fa-f]{6}$/.test(normalized);
3733
+ };
3734
+ var hexToRgba = function (hexColor, alpha) {
3735
+ var hex = hexColor.replace("#", "");
3736
+ var parsed = hex.length === 3
3737
+ ? hex
3738
+ .split("")
3739
+ .map(function (c) { return c + c; })
3740
+ .join("")
3741
+ : hex;
3742
+ var r = parseInt(parsed.slice(0, 2), 16);
3743
+ var g = parseInt(parsed.slice(2, 4), 16);
3744
+ var b = parseInt(parsed.slice(4, 6), 16);
3745
+ return "rgba(".concat(r, ", ").concat(g, ", ").concat(b, ", ").concat(alpha, ")");
3746
+ };
3747
+ var colorWithAlpha = function (color, alpha) {
3748
+ if (isHexColor(color)) {
3749
+ var normalized = color.startsWith("#") ? color : "#".concat(color);
3750
+ return hexToRgba(normalized, alpha);
3751
+ }
3752
+ return "color-mix(in srgb, ".concat(color, " ").concat(Math.round(alpha * 100), "%, transparent)");
3753
+ };
3754
+ var STATE_ANIMATIONS = {
3755
+ excited: {
3756
+ scale: [1, 1.05, 1],
3757
+ rotate: [0, 5, -5, 0],
3758
+ },
3759
+ thinking: {
3760
+ scale: [1, 0.95, 1],
3761
+ rotate: [0, 360],
3762
+ transition: {
3763
+ rotate: { duration: 8, repeat: Infinity, ease: "linear" },
3764
+ },
3765
+ },
3766
+ happy: {
3767
+ y: [0, -10, 0],
3768
+ },
3769
+ concerned: {
3770
+ scale: [1, 0.9, 1],
3771
+ opacity: [1, 0.8, 1],
3772
+ },
3773
+ learning: {
3774
+ scale: [1, 1.1, 1],
3775
+ rotate: [0, -5, 5, 0],
3776
+ },
3777
+ surprised: {
3778
+ scale: [1, 1.2, 1],
3779
+ y: [0, -15, 0],
3780
+ },
3781
+ inspired: {
3782
+ scale: [1, 1.15, 1],
3783
+ },
3784
+ };
3785
+ var AuraGlow = function (_a) {
3786
+ var _b;
3787
+ var _c = _a.state, state = _c === void 0 ? "happy" : _c, _d = _a.size, size = _d === void 0 ? "xl" : _d, _e = _a.animated, animated = _e === void 0 ? true : _e, _f = _a.className, className = _f === void 0 ? "" : _f;
3788
+ var auraBaseColor = DEFAULT_AURA_COLOR;
3789
+ var auraStrong = colorWithAlpha(auraBaseColor, 0.6);
3790
+ var auraMedium = colorWithAlpha(auraBaseColor, 0.45);
3791
+ var auraSoft = colorWithAlpha(auraBaseColor, 0.25);
3792
+ var auraGlow = colorWithAlpha(auraBaseColor, 0.8);
3793
+ var animations = animated && STATE_ANIMATIONS[state] ? STATE_ANIMATIONS[state] : {};
3794
+ var dimension = (_b = ORB_SIZES[size]) !== null && _b !== void 0 ? _b : ORB_SIZES.xl;
3795
+ return (jsxRuntime.jsxs(framerMotion.motion.div, { animate: animated
3796
+ ? __assign({ y: [0, -12, 0] }, animations) : {}, transition: {
3797
+ y: { duration: 5, repeat: Infinity, ease: "easeInOut" },
3798
+ default: { duration: 0.5 },
3799
+ }, className: className, style: {
3800
+ width: "".concat(dimension, "px"),
3801
+ height: "".concat(dimension, "px"),
3802
+ position: "relative",
3803
+ background: "none",
3804
+ border: "none",
3805
+ boxShadow: "none",
3806
+ outline: "none",
3807
+ }, children: [jsxRuntime.jsx(framerMotion.motion.div, { animate: {
3808
+ opacity: [0.2, 0.5, 0.2],
3809
+ scale: [1, 1.3, 1],
3810
+ rotate: [0, 180, 360],
3811
+ }, transition: {
3812
+ duration: 8,
3813
+ repeat: Infinity,
3814
+ ease: "easeInOut",
3815
+ }, className: "pointer-events-none", style: {
3816
+ position: "absolute",
3817
+ top: "-50%",
3818
+ left: "-50%",
3819
+ right: "-50%",
3820
+ bottom: "-50%",
3821
+ background: "radial-gradient(circle, ".concat(auraMedium, " 0%, ").concat(auraSoft, " 50%, transparent 70%)"),
3822
+ filter: "blur(40px)",
3823
+ borderRadius: "9999px",
3824
+ border: "none",
3825
+ boxShadow: "none",
3826
+ } }), jsxRuntime.jsx(framerMotion.motion.div, { animate: {
3827
+ opacity: [0.4, 0.7, 0.4],
3828
+ scale: [1.1, 1.25, 1.1],
3829
+ rotate: [360, 0],
3830
+ }, transition: {
3831
+ duration: 10,
3832
+ repeat: Infinity,
3833
+ ease: "linear",
3834
+ }, className: "pointer-events-none", style: {
3835
+ position: "absolute",
3836
+ top: "-30%",
3837
+ left: "-30%",
3838
+ right: "-30%",
3839
+ bottom: "-30%",
3840
+ background: "radial-gradient(ellipse, ".concat(auraStrong, " 0%, ").concat(auraMedium, " 40%, ").concat(auraSoft, " 70%, transparent 100%)"),
3841
+ filter: "blur(30px)",
3842
+ borderRadius: "9999px",
3843
+ border: "none",
3844
+ boxShadow: "none",
3845
+ } }), jsxRuntime.jsx(framerMotion.motion.div, { animate: {
3846
+ opacity: [0.6, 1, 0.6],
3847
+ scale: [0.9, 1.1, 0.9],
3848
+ }, transition: {
3849
+ duration: 3,
3850
+ repeat: Infinity,
3851
+ ease: "easeInOut",
3852
+ }, className: "pointer-events-none", style: {
3853
+ position: "absolute",
3854
+ top: 0,
3855
+ left: 0,
3856
+ right: 0,
3857
+ bottom: 0,
3858
+ background: "radial-gradient(circle, ".concat(auraGlow, " 0%, ").concat(auraStrong, " 30%, ").concat(auraSoft, " 60%, transparent 100%)"),
3859
+ filter: "blur(20px)",
3860
+ borderRadius: "9999px",
3861
+ border: "none",
3862
+ boxShadow: "none",
3863
+ } }), jsxRuntime.jsx(framerMotion.motion.div, { animate: {
3864
+ opacity: [0.3, 0.8, 0.3],
3865
+ rotate: [0, -360],
3866
+ scale: [1, 1.15, 1],
3867
+ }, transition: {
3868
+ duration: 12,
3869
+ repeat: Infinity,
3870
+ ease: "linear",
3871
+ }, className: "pointer-events-none", style: {
3872
+ position: "absolute",
3873
+ top: "10%",
3874
+ left: "10%",
3875
+ right: "10%",
3876
+ bottom: "10%",
3877
+ background: "conic-gradient(from 0deg, transparent 0deg, ".concat(auraMedium, " 90deg, ").concat(auraSoft, " 180deg, ").concat(auraMedium, " 270deg, transparent 360deg)"),
3878
+ filter: "blur(15px)",
3879
+ mixBlendMode: "screen",
3880
+ borderRadius: "9999px",
3881
+ border: "none",
3882
+ boxShadow: "none",
3883
+ } }), __spreadArray([], Array(3), true).map(function (_, i) { return (jsxRuntime.jsx(framerMotion.motion.div, { animate: {
3884
+ opacity: [0, 0.6, 0],
3885
+ scale: [0.5, 1.5, 0.5],
3886
+ x: [0, (i % 2 === 0 ? 1 : -1) * (15 + i * 5)],
3887
+ y: [0, (i % 2 === 0 ? -1 : 1) * (15 + i * 5)],
3888
+ }, transition: {
3889
+ duration: 4 + i,
3890
+ repeat: Infinity,
3891
+ delay: i * 1.5,
3892
+ ease: "easeInOut",
3893
+ }, className: "absolute w-4 h-4 rounded-full", style: {
3894
+ top: "".concat(30 + i * 20, "%"),
3895
+ left: "".concat(30 + i * 20, "%"),
3896
+ background: i % 2 === 0
3897
+ ? "radial-gradient(circle, ".concat(auraGlow, ", transparent)")
3898
+ : "radial-gradient(circle, ".concat(auraMedium, ", transparent)"),
3899
+ filter: "blur(8px)",
3900
+ } }, i)); })] }));
3901
+ };
3902
+
3903
+ var toGraphemes = function (value) {
3904
+ var IntlWithSegmenter = Intl;
3905
+ if (typeof Intl !== "undefined" && IntlWithSegmenter.Segmenter) {
3906
+ var seg = new IntlWithSegmenter.Segmenter("es", { granularity: "grapheme" });
3907
+ return Array.from(seg.segment(value), function (s) { return s.segment; });
3908
+ }
3909
+ return Array.from(value); // fallback
3910
+ };
3911
+ var SpeechBubble = React.memo(function (_a) {
3912
+ var text = _a.text, _b = _a.typing, typing = _b === void 0 ? false : _b, _c = _a.typingSpeed, typingSpeed = _c === void 0 ? DEFAULT_TYPING_SPEED_MS : _c, _d = _a.maxWidth, maxWidth = _d === void 0 ? 700 : _d, _e = _a.className, className = _e === void 0 ? "" : _e, onTypingComplete = _a.onTypingComplete;
3913
+ var _f = React.useState(typing ? "" : typeof text === "string" ? text : ""), displayedText = _f[0], setDisplayedText = _f[1];
3914
+ var _g = React.useState(typing), isTyping = _g[0], setIsTyping = _g[1];
3915
+ var onTypingCompleteRef = React.useRef(onTypingComplete);
3916
+ var intervalIdRef = React.useRef(null);
3917
+ React.useEffect(function () {
3918
+ onTypingCompleteRef.current = onTypingComplete;
3919
+ }, [onTypingComplete]);
3920
+ React.useEffect(function () {
3921
+ var currentText = typeof text === "string" ? toGraphemes(text) : [''];
3922
+ if (!typing) {
3923
+ setDisplayedText(currentText.join(''));
3924
+ setIsTyping(false);
3925
+ return;
3926
+ }
3927
+ if (intervalIdRef.current) {
3928
+ return;
3929
+ }
3930
+ setIsTyping(true);
3931
+ setDisplayedText("");
3932
+ var cancelled = false;
3933
+ var charIndex = 0;
3934
+ intervalIdRef.current = setInterval(function () {
3935
+ var _a, _b;
3936
+ if (cancelled)
3937
+ return;
3938
+ if (charIndex >= currentText.length) {
3939
+ clearInterval((_a = intervalIdRef.current) !== null && _a !== void 0 ? _a : undefined);
3940
+ intervalIdRef.current = null;
3941
+ setIsTyping(false);
3942
+ (_b = onTypingCompleteRef.current) === null || _b === void 0 ? void 0 : _b.call(onTypingCompleteRef);
3943
+ return;
3944
+ }
3945
+ var char = currentText[charIndex];
3946
+ charIndex++;
3947
+ setDisplayedText(function (prev) { return prev + char; });
3948
+ }, typingSpeed);
3949
+ return function () {
3950
+ var _a;
3951
+ if (intervalIdRef.current) {
3952
+ clearInterval((_a = intervalIdRef.current) !== null && _a !== void 0 ? _a : undefined);
3953
+ intervalIdRef.current = null;
3954
+ }
3955
+ cancelled = true;
3956
+ };
3957
+ }, []);
3958
+ return (jsxRuntime.jsxs(framerMotion.motion.div, { initial: { opacity: 0, y: 12, scale: 0.97 }, animate: { opacity: 1, y: 0, scale: 1 }, transition: {
3959
+ duration: 0.6,
3960
+ ease: [0.4, 0.0, 0.2, 1],
3961
+ }, className: "relative ".concat(className), style: { maxWidth: "".concat(maxWidth, "px") }, children: [jsxRuntime.jsx("div", { className: "bg-white/85 dark:bg-gray-900/85 backdrop-blur-xl rounded-3xl px-8 py-6 shadow-[0_8px_30px_rgba(0,0,0,0.04)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.3)] border border-white/50 dark:border-gray-800/50", children: jsxRuntime.jsxs("p", { className: "text-lg text-gray-800 dark:text-gray-200 leading-relaxed font-sans font-normal", children: [displayedText, isTyping && (jsxRuntime.jsx(framerMotion.motion.span, { animate: { opacity: [0.3, 1, 0.3] }, transition: {
3962
+ duration: 1.2,
3963
+ repeat: Infinity,
3964
+ ease: "easeInOut",
3965
+ }, className: "inline-block ml-1.5 w-0.5 h-5 bg-blue-500/50 align-middle rounded-full" }))] }) }), jsxRuntime.jsx("div", { className: "absolute -top-2 left-10 w-4 h-4 bg-white/85 dark:bg-gray-900/85 border-l border-t border-white/50 dark:border-gray-800/50 transform rotate-45 backdrop-blur-xl" })] }));
3966
+ });
3967
+
3968
+ /**
3969
+ * AssistantOrb
3970
+ *
3971
+ * A compound component that renders an animated aurora orb
3972
+ * with a speech bubble featuring a character-by-character typing effect.
3973
+ * Designed for AI assistant UIs with AuraUI system theming.
3974
+ */
3975
+ var AssistantOrb = function (_a) {
3976
+ var _b;
3977
+ var text = _a.text, _c = _a.state, state = _c === void 0 ? "happy" : _c, _d = _a.size, size = _d === void 0 ? "xl" : _d, _e = _a.animated, animated = _e === void 0 ? true : _e, _f = _a.typing, typing = _f === void 0 ? false : _f, _g = _a.typingSpeed, typingSpeed = _g === void 0 ? DEFAULT_TYPING_SPEED_MS : _g, hint = _a.hint, _h = _a.maxWidth, maxWidth = _h === void 0 ? DEFAULT_MAX_WIDTH : _h, onTypingComplete = _a.onTypingComplete, translations = _a.translations, _j = _a.className, className = _j === void 0 ? "" : _j;
3978
+ var hintText = (_b = translations === null || translations === void 0 ? void 0 : translations.hint) !== null && _b !== void 0 ? _b : hint;
3979
+ var handleTypingComplete = React.useCallback(function () {
3980
+ onTypingComplete === null || onTypingComplete === void 0 ? void 0 : onTypingComplete();
3981
+ }, []);
3982
+ return (jsxRuntime.jsxs("div", { className: "relative flex flex-col items-center gap-6 max-w-md ".concat(className), children: [jsxRuntime.jsx(AuraGlow, { state: state, size: size, animated: animated }), jsxRuntime.jsx(SpeechBubble, { text: text, typing: typing, typingSpeed: typingSpeed, maxWidth: maxWidth, onTypingComplete: handleTypingComplete }), hintText && (jsxRuntime.jsx(framerMotion.motion.p, { initial: { opacity: 0 }, animate: { opacity: 1 }, transition: {
3983
+ delay: 0.6,
3984
+ duration: 0.6,
3985
+ ease: [0.4, 0.0, 0.2, 1],
3986
+ }, className: "text-sm text-gray-500 dark:text-gray-400 text-center mt-4 font-normal", children: hintText }))] }));
3987
+ };
3988
+
3989
+ var TYPING_SPEED_MS = 15;
3990
+ var DESKTOP_BREAKPOINT_PX = 1024;
3991
+ var WELCOME_GRADIENTS = [
3992
+ "linear-gradient(135deg, rgba(59, 130, 246, 0.03) 0%, rgba(147, 51, 234, 0.02) 50%, rgba(168, 85, 247, 0.02) 100%)",
3993
+ "linear-gradient(135deg, rgba(147, 51, 234, 0.03) 0%, rgba(168, 85, 247, 0.02) 50%, rgba(59, 130, 246, 0.02) 100%)",
3994
+ "linear-gradient(135deg, rgba(168, 85, 247, 0.03) 0%, rgba(59, 130, 246, 0.02) 50%, rgba(147, 51, 234, 0.02) 100%)",
3995
+ ];
3996
+ var AURORAS = [
3997
+ {
3998
+ size: "w-[700px] h-[700px]",
3999
+ color: "from-blue-400/4 to-transparent",
4000
+ position: { top: "10%", left: "10%" },
4001
+ duration: 45,
4002
+ },
4003
+ {
4004
+ size: "w-[600px] h-[600px]",
4005
+ color: "from-purple-400/4 to-transparent",
4006
+ position: { bottom: "15%", right: "15%" },
4007
+ duration: 50,
4008
+ },
4009
+ {
4010
+ size: "w-[500px] h-[500px]",
4011
+ color: "from-violet-400/3 to-transparent",
4012
+ position: { top: "50%", left: "50%" },
4013
+ duration: 55,
4014
+ },
4015
+ ];
4016
+ var DEFAULT_TRANSLATIONS$1 = {
4017
+ backButtonLabel: "Atras",
4018
+ };
4019
+ var BackButton = function (_a) {
4020
+ var onPress = _a.onPress, _b = _a.visible, visible = _b === void 0 ? true : _b, _c = _a.className, className = _c === void 0 ? "" : _c, label = _a.label;
4021
+ if (!visible) {
4022
+ return null;
4023
+ }
4024
+ return (jsxRuntime.jsx("div", { className: "fixed top-6 left-6 z-30 ".concat(className), children: jsxRuntime.jsx(react.Button, { variant: "light", size: "sm", onPress: onPress, className: "bg-transparent hover:bg-transparent text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 px-3", startContent: jsxRuntime.jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", "aria-hidden": "true", children: jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2.5, d: "M15 19l-7-7 7-7" }) }), children: label }) }));
4025
+ };
4026
+ var Aurora = function (_a) {
4027
+ var size = _a.size, color = _a.color, position = _a.position, duration = _a.duration, _b = _a.delay, delay = _b === void 0 ? 0 : _b;
4028
+ return (jsxRuntime.jsx(framerMotion.motion.div, { className: "absolute ".concat(size, " rounded-full bg-gradient-radial ").concat(color, " blur-3xl"), style: position, animate: {
4029
+ x: [0, 40, -20, 0],
4030
+ y: [0, -30, 20, 0],
4031
+ scale: [1, 1.1, 0.95, 1],
4032
+ opacity: [0.3, 0.5, 0.35, 0.3],
4033
+ }, transition: {
4034
+ duration: duration,
4035
+ repeat: Number.POSITIVE_INFINITY,
4036
+ ease: [0.4, 0.0, 0.2, 1],
4037
+ delay: delay,
4038
+ } }));
4039
+ };
4040
+ var AnimatedBackground = function (_a) {
4041
+ var _b = _a.className, className = _b === void 0 ? "" : _b;
4042
+ return (jsxRuntime.jsxs("div", { className: "absolute inset-0 z-0 overflow-hidden pointer-events-none ".concat(className), children: [jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-br from-gray-50 via-white to-gray-50 dark:from-gray-950 dark:via-gray-900 dark:to-gray-950" }), jsxRuntime.jsx(framerMotion.motion.div, { className: "absolute inset-0", animate: { background: WELCOME_GRADIENTS }, transition: {
4043
+ duration: 30,
4044
+ repeat: Number.POSITIVE_INFINITY,
4045
+ ease: "linear",
4046
+ } }), AURORAS.map(function (aurora, index) { return (jsxRuntime.jsx(Aurora, __assign({}, aurora, { delay: index * 5 }), aurora.duration)); })] }));
4047
+ };
4048
+ var TwoColumnLayoutAgent = function (_a) {
4049
+ var _b = _a.assistantState, assistantState = _b === void 0 ? "happy" : _b, assistantSpeech = _a.assistantSpeech, _c = _a.assistantSize, assistantSize = _c === void 0 ? "xl" : _c, assistantHint = _a.assistantHint, _d = _a.enableSequence, enableSequence = _d === void 0 ? true : _d, children = _a.children, _e = _a.showBackButton, showBackButton = _e === void 0 ? false : _e, onBack = _a.onBack, _f = _a.translations, translations = _f === void 0 ? {} : _f, _g = _a.className, className = _g === void 0 ? "" : _g;
4050
+ var _h = React.useState(!enableSequence), showRightContent = _h[0], setShowRightContent = _h[1];
4051
+ var isDesktop = useMediaQuery("(min-width: ".concat(DESKTOP_BREAKPOINT_PX, "px)"));
4052
+ var t = React.useMemo(function () { return (__assign(__assign({}, DEFAULT_TRANSLATIONS$1), translations)); }, [translations]);
4053
+ var handleBackPress = onBack !== null && onBack !== void 0 ? onBack : (function () { return undefined; });
4054
+ React.useEffect(function () {
4055
+ if (enableSequence && !showRightContent) {
4056
+ var safetyTimeout_1 = setTimeout(function () {
4057
+ setShowRightContent(true);
4058
+ }, 10000);
4059
+ return function () { return clearTimeout(safetyTimeout_1); };
4060
+ }
4061
+ }, [enableSequence, showRightContent]);
4062
+ var handleTypingComplete = function () {
4063
+ setTimeout(function () {
4064
+ setShowRightContent(true);
4065
+ }, 100);
4066
+ };
4067
+ return (jsxRuntime.jsxs("div", { className: "min-h-screen relative isolate overflow-hidden ".concat(className), children: [jsxRuntime.jsx(BackButton, { onPress: handleBackPress, visible: showBackButton, label: t.backButtonLabel }), jsxRuntime.jsx(AnimatedBackground, {}), jsxRuntime.jsx("div", { className: "relative z-10 flex flex-col h-screen", children: jsxRuntime.jsxs("div", { className: "flex-grow flex overflow-hidden", children: [jsxRuntime.jsx(framerMotion.motion.div, { initial: { opacity: 0, x: -30 }, animate: { opacity: 1, x: 0 }, transition: { duration: 0.8, ease: [0.4, 0.0, 0.2, 1] }, className: "".concat(isDesktop ? "flex w-2/5" : "hidden", " flex-col items-center justify-center p-8 xl:p-12"), children: jsxRuntime.jsx(AssistantOrb, { text: assistantSpeech, state: assistantState, size: assistantSize, animated: true, typing: enableSequence, typingSpeed: TYPING_SPEED_MS, hint: assistantHint, onTypingComplete: handleTypingComplete }) }), jsxRuntime.jsxs("div", { className: "".concat(isDesktop ? "w-3/5 p-12" : "w-full p-6 sm:p-8", " flex flex-col items-center justify-center overflow-y-auto"), children: [!isDesktop && (jsxRuntime.jsx("div", { className: "mb-8 flex flex-col items-center gap-4", children: jsxRuntime.jsx(AssistantOrb, { text: assistantSpeech, state: assistantState, size: "lg", animated: true, typing: false }) })), jsxRuntime.jsx(framerMotion.AnimatePresence, { mode: "wait", children: showRightContent && (jsxRuntime.jsx(framerMotion.motion.div, { initial: { opacity: 0, x: 30 }, animate: { opacity: 1, x: 0 }, exit: { opacity: 0, x: -30 }, transition: { duration: 0.6, ease: [0.4, 0.0, 0.2, 1] }, className: "w-full max-w-2xl", children: children }, "right-content")) })] })] }) })] }));
4068
+ };
4069
+
3685
4070
  // Traducciones por defecto en español
3686
4071
  var defaultTranslations$1 = {
3687
4072
  uploadText: "Da clic y selecciona tus archivos",
@@ -5298,6 +5683,7 @@ exports.ThemePicker = ThemePicker;
5298
5683
  exports.ThemeProvider = ThemeProvider;
5299
5684
  exports.TimeInputComponent = TimeInput;
5300
5685
  exports.ToastContext = ToastContext;
5686
+ exports.TwoColumnLayoutAgent = TwoColumnLayoutAgent;
5301
5687
  exports.UploadFile = UploadFile;
5302
5688
  exports.VerticalSteps = VerticalSteps;
5303
5689
  exports.Wizard = Wizard;
@@ -5307,6 +5693,7 @@ exports.defaultTranslations = defaultTranslations$4;
5307
5693
  exports.sizeMap = sizeMap;
5308
5694
  exports.themeColors = themeColors;
5309
5695
  exports.useAuraToast = useAuraToast;
5696
+ exports.useMediaQuery = useMediaQuery;
5310
5697
  exports.useNavigationLoading = useNavigationLoading;
5311
5698
  exports.useThemeContext = useThemeContext;
5312
5699
  Object.keys(react).forEach(function (k) {