@beweco/aurora-ui 0.1.24 → 0.1.25

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 (24) hide show
  1. package/dist/assets/css/styles.css +1 -1
  2. package/dist/index.cjs.js +228 -4
  3. package/dist/index.esm.js +227 -6
  4. package/dist/types/components/content-carousel/ContentCarousel.d.ts +17 -0
  5. package/dist/types/components/content-carousel/ContentCarousel.d.ts.map +1 -0
  6. package/dist/types/components/content-carousel/ContentCarousel.types.d.ts +73 -0
  7. package/dist/types/components/content-carousel/ContentCarousel.types.d.ts.map +1 -0
  8. package/dist/types/components/content-carousel/index.d.ts +4 -0
  9. package/dist/types/components/content-carousel/index.d.ts.map +1 -0
  10. package/dist/types/components/content-carousel/variants/SocialMediaCarousel.d.ts +19 -0
  11. package/dist/types/components/content-carousel/variants/SocialMediaCarousel.d.ts.map +1 -0
  12. package/dist/types/components/content-carousel/variants/SocialMediaCarousel.types.d.ts +51 -0
  13. package/dist/types/components/content-carousel/variants/SocialMediaCarousel.types.d.ts.map +1 -0
  14. package/dist/types/components/content-carousel/variants/index.d.ts +3 -0
  15. package/dist/types/components/content-carousel/variants/index.d.ts.map +1 -0
  16. package/dist/types/components/social-media-bar/SocialMediaBar.d.ts +18 -0
  17. package/dist/types/components/social-media-bar/SocialMediaBar.d.ts.map +1 -0
  18. package/dist/types/components/social-media-bar/SocialMediaBar.types.d.ts +53 -0
  19. package/dist/types/components/social-media-bar/SocialMediaBar.types.d.ts.map +1 -0
  20. package/dist/types/components/social-media-bar/index.d.ts +3 -0
  21. package/dist/types/components/social-media-bar/index.d.ts.map +1 -0
  22. package/dist/types/index.d.ts +2 -0
  23. package/dist/types/index.d.ts.map +1 -1
  24. package/package.json +1 -1
package/dist/index.cjs.js CHANGED
@@ -177,7 +177,7 @@ var Input = function (_a) {
177
177
  } })));
178
178
  };
179
179
 
180
- var defaultTranslations$b = {
180
+ var defaultTranslations$d = {
181
181
  addHolidayTitle: "Add holiday",
182
182
  dayOption: "Day",
183
183
  dateRangeOption: "Date range",
@@ -201,7 +201,7 @@ var INITIAL_HOLIDAY_STATE = {
201
201
  */
202
202
  var AddHolidayForm = function (_a) {
203
203
  var onAddHoliday = _a.onAddHoliday, translations = _a.translations, className = _a.className, radioGroupProps = _a.radioGroupProps, dateRangePickerProps = _a.dateRangePickerProps, buttonProps = _a.buttonProps;
204
- var t = __assign(__assign({}, defaultTranslations$b), translations);
204
+ var t = __assign(__assign({}, defaultTranslations$d), translations);
205
205
  var _b = React.useState(INITIAL_HOLIDAY_STATE), newHoliday = _b[0], setNewHoliday = _b[1];
206
206
  /**
207
207
  * A boolean flag that determines if a date has been set.
@@ -271,7 +271,7 @@ var P = function (_a) {
271
271
  return (jsxRuntime.jsx("p", __assign({ className: react.cn("text-tiny text-default-500 font-normal", className) }, props, { children: children })));
272
272
  };
273
273
 
274
- var defaultTranslations$a = {
274
+ var defaultTranslations$c = {
275
275
  title: "Analytics",
276
276
  description: "Monthly growth of your metrics during the selected period",
277
277
  viewDetails: "View Details",
@@ -325,7 +325,7 @@ var formatMonth = function (month) {
325
325
  var AnalyticsCard = function (_a) {
326
326
  var _b, _c;
327
327
  var data = _a.data, _d = _a.showTimePeriods, showTimePeriods = _d === void 0 ? true : _d, _e = _a.showDropdownMenu, showDropdownMenu = _e === void 0 ? true : _e, _f = _a.showMetricCards, showMetricCards = _f === void 0 ? true : _f, onChartChange = _a.onChartChange, onMenuAction = _a.onMenuAction, onTimePeriodChange = _a.onTimePeriodChange, _g = _a.translations, translations = _g === void 0 ? {} : _g, props = __rest(_a, ["data", "showTimePeriods", "showDropdownMenu", "showMetricCards", "onChartChange", "onMenuAction", "onTimePeriodChange", "translations"]);
328
- var t = __assign(__assign({}, defaultTranslations$a), translations);
328
+ var t = __assign(__assign({}, defaultTranslations$c), translations);
329
329
  var _h = React.useState((_c = (_b = data[0]) === null || _b === void 0 ? void 0 : _b.key) !== null && _c !== void 0 ? _c : ""), activeChart = _h[0], setActiveChart = _h[1];
330
330
  var activeChartData = React.useMemo(function () {
331
331
  var _a;
@@ -989,6 +989,227 @@ var Chip = function (_a) {
989
989
  return (jsxRuntime.jsx(react.Chip, __assign({}, props, { onClose: props.onClose, classNames: __assign({ base: colorClasses }, props.classNames) })));
990
990
  };
991
991
 
992
+ // Default translations in Spanish
993
+ var defaultTranslations$b = {
994
+ emptyStateMessage: "No hay contenido disponible",
995
+ emptyStateButtonText: "Agregar contenido",
996
+ previousButtonLabel: "Anterior",
997
+ nextButtonLabel: "Siguiente",
998
+ editButtonLabel: "Editar",
999
+ deleteButtonLabel: "Eliminar",
1000
+ publishButtonLabel: "Publicar",
1001
+ previewButtonLabel: "Ver vista previa",
1002
+ goToItemLabel: "Ir al item",
1003
+ };
1004
+ /**
1005
+ * ContentCarousel - Generic 3D carousel component
1006
+ *
1007
+ * @component
1008
+ * @example
1009
+ * ```tsx
1010
+ * <ContentCarousel
1011
+ * items={items}
1012
+ * onItemClick={handleItemClick}
1013
+ * renderFooter={({ item }) => <div>Footer content</div>}
1014
+ * />
1015
+ * ```
1016
+ */
1017
+ var ContentCarousel = function (_a) {
1018
+ var items = _a.items, onItemClick = _a.onItemClick, _b = _a.className, className = _b === void 0 ? "" : _b, _c = _a.emptyStateRedirectPath, emptyStateRedirectPath = _c === void 0 ? "" : _c, _d = _a.translations, translations = _d === void 0 ? {} : _d, renderFooter = _a.renderFooter, renderHeader = _a.renderHeader, renderBody = _a.renderBody;
1019
+ var t = __assign(__assign({}, defaultTranslations$b), translations);
1020
+ var _e = React.useState(items.length >= 3 ? 1 : 0), activeIndex = _e[0], setActiveIndex = _e[1];
1021
+ // Reset to show 3 images when items change
1022
+ React.useEffect(function () {
1023
+ setActiveIndex(items.length >= 3 ? 1 : 0);
1024
+ }, [items.length]);
1025
+ var handleNext = React.useCallback(function () {
1026
+ setActiveIndex(function (prev) { return Math.min(prev + 1, items.length - 1); });
1027
+ }, [items.length]);
1028
+ var handlePrev = React.useCallback(function () {
1029
+ setActiveIndex(function (prev) { return Math.max(prev - 1, 0); });
1030
+ }, []);
1031
+ // Get position of card relative to active index
1032
+ var getPosition = function (index) {
1033
+ if (index === activeIndex) {
1034
+ return "center";
1035
+ }
1036
+ if (index === activeIndex - 1) {
1037
+ return "left";
1038
+ }
1039
+ if (index === activeIndex + 1) {
1040
+ return "right";
1041
+ }
1042
+ return "hidden";
1043
+ };
1044
+ var handleItemClick = React.useCallback(function (item) {
1045
+ if (onItemClick) {
1046
+ onItemClick(item);
1047
+ }
1048
+ }, [onItemClick]);
1049
+ // Empty state when no items
1050
+ if (items.length === 0) {
1051
+ return (jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center py-16 px-6 gap-6 ".concat(className), children: [jsxRuntime.jsx("p", { className: "text-default-500 text-center", children: t.emptyStateMessage }), emptyStateRedirectPath && (jsxRuntime.jsx(react.Button, { color: "primary", variant: "solid", size: "md", onPress: function () {
1052
+ if (typeof window !== "undefined") {
1053
+ window.location.href = emptyStateRedirectPath;
1054
+ }
1055
+ }, startContent: jsxRuntime.jsx(IconComponent, { icon: "solar:add-circle-bold", className: "w-5 h-5" }), children: t.emptyStateButtonText }))] }));
1056
+ }
1057
+ return (jsxRuntime.jsx("div", { className: "relative w-full ".concat(className), children: jsxRuntime.jsxs("div", { className: "relative w-full pt-4 pb-8", children: [jsxRuntime.jsxs("div", { className: "relative h-[450px] flex items-center justify-center overflow-hidden", children: [items.length > 1 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: "absolute left-0 top-1/2 -translate-y-1/2 z-20 ml-4", children: jsxRuntime.jsx(react.Button, { isIconOnly: true, variant: "bordered", onPress: handlePrev, isDisabled: activeIndex === 0, className: "rounded-full bg-white/95 dark:bg-gray-800/95 backdrop-blur-md border-gray-200 dark:border-gray-700 shadow-xl hover:bg-white dark:hover:bg-gray-800 hover:border-gray-300 dark:hover:border-gray-600 hover:scale-110 hover:-translate-x-1 disabled:opacity-20 disabled:hover:scale-100 disabled:hover:translate-x-0 transition-all duration-300 w-12 h-12", "aria-label": t.previousButtonLabel, children: jsxRuntime.jsx(IconComponent, { icon: "solar:alt-arrow-left-outline", className: "w-6 h-6" }) }) }), jsxRuntime.jsx("div", { className: "absolute right-0 top-1/2 -translate-y-1/2 z-20 mr-4", children: jsxRuntime.jsx(react.Button, { isIconOnly: true, variant: "bordered", onPress: handleNext, isDisabled: activeIndex === items.length - 1, className: "rounded-full bg-white/95 dark:bg-gray-800/95 backdrop-blur-md border-gray-200 dark:border-gray-700 shadow-xl hover:bg-white dark:hover:bg-gray-800 hover:border-gray-300 dark:hover:border-gray-600 hover:scale-110 hover:translate-x-1 disabled:opacity-20 disabled:hover:scale-100 disabled:hover:translate-x-0 transition-all duration-300 w-12 h-12", "aria-label": t.nextButtonLabel, children: jsxRuntime.jsx(IconComponent, { icon: "solar:alt-arrow-right-outline", className: "w-6 h-6" }) }) })] })), items.map(function (item, index) {
1058
+ var position = getPosition(index);
1059
+ if (position === "hidden") {
1060
+ return null;
1061
+ }
1062
+ return (jsxRuntime.jsx(CarouselItemComponent, { item: item, position: position, onClick: function () { return handleItemClick(item); }, translations: t, renderFooter: renderFooter, renderHeader: renderHeader, renderBody: renderBody }, item.id));
1063
+ })] }), items.length > 1 && (jsxRuntime.jsx("div", { className: "flex justify-center mt-4", children: jsxRuntime.jsx("div", { className: "flex justify-center gap-2", children: items.map(function (_, index) { return (jsxRuntime.jsx("button", { type: "button", onClick: function () { return setActiveIndex(index); }, className: "rounded-full transition-all duration-300 hover:scale-110 ".concat(index === activeIndex
1064
+ ? "w-8 h-2 bg-gradient-to-r from-primary-500 to-primary-600 shadow-lg shadow-primary-500/50"
1065
+ : "w-2 h-2 bg-gray-300 dark:bg-gray-600 hover:bg-gray-400 dark:hover:bg-gray-500 hover:w-3"), "aria-label": "".concat(t.goToItemLabel, " ").concat(index + 1) }, index)); }) }) }))] }) }));
1066
+ };
1067
+ /**
1068
+ * Internal carousel item component
1069
+ * Renders a single card with customizable content
1070
+ * @internal
1071
+ */
1072
+ function CarouselItemComponent(_a) {
1073
+ var item = _a.item, position = _a.position, onClick = _a.onClick, translations = _a.translations, renderFooter = _a.renderFooter, renderHeader = _a.renderHeader, renderBody = _a.renderBody;
1074
+ var _b = React.useState(false), isHovered = _b[0], setIsHovered = _b[1];
1075
+ var captionText = item.caption || item.title;
1076
+ // Get styles based on position
1077
+ var getPositionStyles = function () {
1078
+ var baseStyles = {
1079
+ minHeight: "400px",
1080
+ maxHeight: "400px",
1081
+ boxShadow: "0 10px 40px -5px rgba(0, 0, 0, 0.3), 0 8px 25px -8px rgba(0, 0, 0, 0.2)",
1082
+ };
1083
+ if (position === "center") {
1084
+ return __assign(__assign({}, baseStyles), { width: "500px", transform: "scale(1)", opacity: 1, zIndex: 10 });
1085
+ }
1086
+ if (position === "left") {
1087
+ return __assign(__assign({}, baseStyles), { width: "350px", transform: "translateX(-115%) scale(0.75)", opacity: 0.7, zIndex: 5 });
1088
+ }
1089
+ if (position === "right") {
1090
+ return __assign(__assign({}, baseStyles), { width: "350px", transform: "translateX(115%) scale(0.75)", opacity: 0.7, zIndex: 5 });
1091
+ }
1092
+ return baseStyles;
1093
+ };
1094
+ return (jsxRuntime.jsxs("div", { className: "absolute rounded-3xl shadow-lg transition-all duration-500 ease-in-out flex flex-col overflow-hidden", style: getPositionStyles(), onMouseEnter: function () { return setIsHovered(true); }, onMouseLeave: function () { return setIsHovered(false); }, children: [item.imageUrl ? (jsxRuntime.jsx("div", { className: "absolute inset-0 bg-cover bg-center transition-all duration-500 ease-in-out ".concat(isHovered ? "scale-110 blur-sm" : "scale-100 blur-0"), style: {
1095
+ backgroundImage: "url(".concat(item.imageUrl, ")"),
1096
+ } })) : (jsxRuntime.jsx("div", { className: "absolute inset-0 transition-all duration-500 ease-in-out ".concat(isHovered ? "scale-110 blur-sm" : "scale-100 blur-0"), style: {
1097
+ background: item.gradient,
1098
+ } })), jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-b transition-all duration-500 ease-in-out ".concat(isHovered
1099
+ ? "from-black/70 via-black/60 to-black/80"
1100
+ : "from-black/40 via-black/20 to-black/50") }), renderHeader && (jsxRuntime.jsx("div", { className: "absolute top-4 left-4 right-4 z-20", children: renderHeader({
1101
+ item: item,
1102
+ isHovered: isHovered,
1103
+ translations: translations,
1104
+ }) })), renderBody ? (jsxRuntime.jsx("div", { className: "relative w-full h-full z-10", children: renderBody(item, isHovered) })) : (jsxRuntime.jsxs("button", { type: "button", onClick: onClick, className: "relative w-full h-full cursor-pointer flex flex-col justify-between p-6 z-10", "aria-label": item.title, children: [jsxRuntime.jsx("div", { children: jsxRuntime.jsx("h3", { className: "text-white text-3xl font-semibold mb-2 text-left drop-shadow-lg", children: item.title }) }), jsxRuntime.jsx("div", { className: "space-y-3 overflow-hidden", children: jsxRuntime.jsx("p", { className: "text-white text-sm text-left drop-shadow-md transition-all duration-500 ease-in-out ".concat(!isHovered && "line-clamp-2"), children: captionText }) })] })), renderFooter && (function () {
1105
+ var footerContent = renderFooter({
1106
+ item: item,
1107
+ isHovered: isHovered,
1108
+ translations: translations,
1109
+ });
1110
+ // Only render if there's actual content
1111
+ if (footerContent) {
1112
+ return (jsxRuntime.jsx("div", { className: "absolute bottom-4 left-4 right-4 z-20", children: footerContent }));
1113
+ }
1114
+ return null;
1115
+ })()] }));
1116
+ }
1117
+
1118
+ // Default translations in Spanish
1119
+ var defaultTranslations$a = {
1120
+ editButtonLabel: "Editar",
1121
+ deleteButtonLabel: "Eliminar",
1122
+ publishButtonLabel: "Publicar",
1123
+ previewButtonLabel: "Ver vista previa",
1124
+ instagramLabel: "Instagram",
1125
+ storyLabel: "Story",
1126
+ tiktokLabel: "TikTok",
1127
+ whatsappLabel: "WhatsApp",
1128
+ };
1129
+ /**
1130
+ * SocialMediaBar - Independent bar component for social media badges and actions
1131
+ *
1132
+ * @component
1133
+ * @example
1134
+ * ```tsx
1135
+ * <SocialMediaBar
1136
+ * platform="instagram-post"
1137
+ * onEdit={handleEdit}
1138
+ * onDelete={handleDelete}
1139
+ * onPublish={handlePublish}
1140
+ * />
1141
+ * ```
1142
+ */
1143
+ var SocialMediaBar = function (_a) {
1144
+ var platform = _a.platform, _b = _a.badgeOnly, badgeOnly = _b === void 0 ? false : _b, _c = _a.showPreview, showPreview = _c === void 0 ? false : _c, onEdit = _a.onEdit, onDelete = _a.onDelete, onPublish = _a.onPublish, onPreview = _a.onPreview, _d = _a.actionsAlwaysVisible, actionsAlwaysVisible = _d === void 0 ? false : _d, _e = _a.isHovered, isHovered = _e === void 0 ? false : _e, _f = _a.className, className = _f === void 0 ? "" : _f, _g = _a.translations, translations = _g === void 0 ? {} : _g, customBadge = _a.customBadge, customActions = _a.customActions;
1145
+ var t = __assign(__assign({}, defaultTranslations$a), translations);
1146
+ // Determine visibility of actions
1147
+ var showActions = actionsAlwaysVisible || isHovered;
1148
+ return (jsxRuntime.jsxs("div", { className: "flex items-center justify-between ".concat(className), children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [customBadge || (jsxRuntime.jsxs("div", { className: "backdrop-blur-xl border border-white/30 rounded-full px-3 py-1.5 shadow-xl flex items-center gap-2", style: {
1149
+ background: "linear-gradient(135deg, rgba(255, 255, 255, 0.3) 0%, rgba(200, 200, 255, 0.25) 100%)",
1150
+ }, children: [platform === "instagram-post" && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(IconComponent, { icon: "mdi:instagram", className: "w-4 h-4 text-pink-400" }), jsxRuntime.jsx("span", { className: "text-xs font-medium text-white", children: t.instagramLabel })] })), platform === "instagram-story" && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(IconComponent, { icon: "mdi:instagram", className: "w-4 h-4 text-purple-400" }), jsxRuntime.jsx("span", { className: "text-xs font-medium text-white", children: t.storyLabel })] })), platform === "tiktok-video" && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(IconComponent, { icon: "ic:baseline-tiktok", className: "w-4 h-4 text-white" }), jsxRuntime.jsx("span", { className: "text-xs font-medium text-white", children: t.tiktokLabel })] })), (platform === "whatsapp" || platform === "whatsapp-message") && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(IconComponent, { icon: "mdi:whatsapp", className: "w-4 h-4 text-green-400" }), jsxRuntime.jsx("span", { className: "text-xs font-medium text-white", children: t.whatsappLabel })] }))] })), showPreview && onPreview && (jsxRuntime.jsx("button", { type: "button", onClick: function (e) {
1151
+ e.stopPropagation();
1152
+ onPreview();
1153
+ }, className: "backdrop-blur-xl border border-white/30 rounded-lg w-8 h-8 shadow-xl flex items-center justify-center hover:scale-110 transition-all duration-200", style: {
1154
+ background: "linear-gradient(135deg, rgba(255, 255, 255, 0.3) 0%, rgba(200, 200, 255, 0.25) 100%)",
1155
+ }, "aria-label": t.previewButtonLabel, children: jsxRuntime.jsx(IconComponent, { icon: "solar:eye-bold", className: "w-4 h-4 text-white" }) }))] }), !badgeOnly && (jsxRuntime.jsx("div", { className: "flex items-center gap-2 transition-opacity duration-500 ease-in-out ".concat(showActions ? "opacity-100" : "opacity-0 pointer-events-none"), children: customActions || (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [onEdit && (jsxRuntime.jsx(react.Button, { isIconOnly: true, variant: "flat", size: "sm", onPress: onEdit, className: "bg-white/90 hover:bg-white dark:bg-gray-800/90 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200 shadow-md backdrop-blur-sm transition-all duration-200 hover:scale-110 active:scale-95", "aria-label": t.editButtonLabel, children: jsxRuntime.jsx(IconComponent, { icon: "solar:pen-outline", className: "w-4 h-4 transition-transform duration-200 hover:rotate-12" }) })), onDelete && (jsxRuntime.jsx(react.Button, { isIconOnly: true, variant: "flat", size: "sm", onPress: onDelete, className: "bg-white/90 hover:bg-white dark:bg-gray-800/90 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200 shadow-md backdrop-blur-sm transition-all duration-200 hover:scale-110 active:scale-95", "aria-label": t.deleteButtonLabel, children: jsxRuntime.jsx(IconComponent, { icon: "solar:trash-bin-minimalistic-outline", className: "w-4 h-4 transition-transform duration-200 hover:scale-110" }) })), onPublish && (jsxRuntime.jsx(react.Button, { variant: "solid", color: "primary", size: "sm", onPress: onPublish, endContent: jsxRuntime.jsx(IconComponent, { icon: "solar:plain-3-bold", className: "w-3.5 h-3.5 transition-transform duration-200" }), "aria-label": t.publishButtonLabel, className: "text-xs shadow-md transition-all duration-200 hover:scale-105 hover:-translate-y-0.5 active:scale-95", children: t.publishButtonLabel }))] })) }))] }));
1156
+ };
1157
+
1158
+ // Inject CSS animations for audience info
1159
+ if (typeof document !== "undefined") {
1160
+ var style = document.createElement("style");
1161
+ style.textContent = "\n @keyframes pulse-subtle {\n 0%, 100% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(1.05);\n opacity: 0.95;\n }\n }\n \n @keyframes fade-in {\n from {\n opacity: 0;\n transform: translateX(-5px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n \n .animate-fade-in {\n animation: fade-in 0.3s ease-out;\n }\n";
1162
+ if (!document.head.querySelector("#social-carousel-animations")) {
1163
+ style.id = "social-carousel-animations";
1164
+ document.head.appendChild(style);
1165
+ }
1166
+ }
1167
+ /**
1168
+ * SocialMediaCarousel - Specialized carousel variant for social media content
1169
+ * Extends ContentCarousel with social media specific features
1170
+ *
1171
+ * @component
1172
+ * @example
1173
+ * ```tsx
1174
+ * <SocialMediaCarousel
1175
+ * items={socialMediaItems}
1176
+ * onEdit={handleEdit}
1177
+ * onDelete={handleDelete}
1178
+ * onPublish={handlePublish}
1179
+ * />
1180
+ * ```
1181
+ */
1182
+ var SocialMediaCarousel = function (_a) {
1183
+ var items = _a.items, onItemClick = _a.onItemClick, onEdit = _a.onEdit, onDelete = _a.onDelete, onPublish = _a.onPublish, _b = _a.className, className = _b === void 0 ? "" : _b, _c = _a.emptyStateRedirectPath, emptyStateRedirectPath = _c === void 0 ? "/contenidos-ai/crear-contenido" : _c; _a.compactHeader; _a.campaignView; var _f = _a.translations, translations = _f === void 0 ? {} : _f, _g = _a.hideFooter, hideFooter = _g === void 0 ? false : _g, _h = _a.hideAudienceInfo, hideAudienceInfo = _h === void 0 ? false : _h;
1184
+ var handlePreview = React.useCallback(function (item) {
1185
+ console.log("Preview:", item);
1186
+ // This could be extended to open a preview modal
1187
+ }, []);
1188
+ // Custom footer renderer with audience info + SocialMediaBar
1189
+ var renderSocialFooterWithAudience = React.useCallback(function (_a) {
1190
+ var item = _a.item, isHovered = _a.isHovered, translations = _a.translations;
1191
+ var socialItem = item;
1192
+ var showAudience = !hideAudienceInfo && socialItem.targetAudienceCount;
1193
+ return (jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [showAudience && (jsxRuntime.jsxs("div", { className: "backdrop-blur-xl border border-white/30 shadow-xl flex items-center transition-all duration-500 ".concat(isHovered
1194
+ ? "bg-gradient-to-br from-white/40 to-white/30 rounded-2xl px-4 py-2.5 gap-3 max-w-md"
1195
+ : "bg-gradient-to-br from-white/30 to-white/20 rounded-3xl px-3 py-1.5 gap-1.5 w-fit"), style: {
1196
+ animation: isHovered
1197
+ ? "none"
1198
+ : "pulse-subtle 3s ease-in-out infinite",
1199
+ }, children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 flex-shrink-0", children: [jsxRuntime.jsx(IconComponent, { icon: "solar:users-group-rounded-bold", className: "w-3.5 h-3.5 text-white transition-transform duration-300 hover:scale-110" }), jsxRuntime.jsx("span", { className: "text-[11px] font-medium text-white transition-all duration-500 ".concat(isHovered
1200
+ ? "opacity-100 max-w-20"
1201
+ : "opacity-100 max-w-20 whitespace-nowrap"), children: socialItem.targetAudienceCount.toLocaleString("es-ES") })] }), socialItem.audienceReason && isHovered && (jsxRuntime.jsx("div", { className: "text-[11px] text-white/95 leading-relaxed animate-fade-in", children: socialItem.audienceReason })), socialItem.requiredTags &&
1202
+ socialItem.requiredTags.length > 0 &&
1203
+ isHovered && (jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1 mt-2 pt-2 border-t border-white/20 animate-fade-in", children: socialItem.requiredTags.map(function (tag, idx) { return (jsxRuntime.jsx("span", { className: "text-[9px] px-1.5 py-0.5 rounded-md bg-white/20 text-white/95 backdrop-blur-sm border border-white/30", children: tag }, idx)); }) }))] })), !hideFooter && (jsxRuntime.jsx(SocialMediaBar, { platform: socialItem.type, isHovered: isHovered, showPreview: !!socialItem.imageUrl, onEdit: onEdit ? function () { return onEdit(socialItem); } : undefined, onDelete: onDelete ? function () { return onDelete(socialItem); } : undefined, onPublish: onPublish ? function () { return onPublish(socialItem); } : undefined, onPreview: function () { return handlePreview(socialItem); }, translations: {
1204
+ editButtonLabel: translations.editButtonLabel,
1205
+ deleteButtonLabel: translations.deleteButtonLabel,
1206
+ publishButtonLabel: translations.publishButtonLabel,
1207
+ previewButtonLabel: translations.previewButtonLabel,
1208
+ } }))] }));
1209
+ }, [hideAudienceInfo, hideFooter, onEdit, onDelete, onPublish, handlePreview]);
1210
+ return (jsxRuntime.jsx(ContentCarousel, { items: items, onItemClick: onItemClick, className: className, emptyStateRedirectPath: emptyStateRedirectPath, translations: translations, renderFooter: renderSocialFooterWithAudience }));
1211
+ };
1212
+
992
1213
  // Traducciones por defecto en español
993
1214
  var defaultTranslations$9 = {
994
1215
  dayOption: "Día específico",
@@ -4372,6 +4593,7 @@ exports.Button = Button;
4372
4593
  exports.Card = Card;
4373
4594
  exports.Chip = Chip;
4374
4595
  exports.ColorSelector = ColorSelector;
4596
+ exports.ContentCarousel = ContentCarousel;
4375
4597
  exports.DatePicker = DatePicker;
4376
4598
  exports.DateRangePicker = DateRangePicker;
4377
4599
  exports.DateSelector = DateSelector;
@@ -4404,6 +4626,8 @@ exports.RowSteps = RowSteps;
4404
4626
  exports.ScheduleRow = ScheduleRow;
4405
4627
  exports.SearchInput = SearchInput;
4406
4628
  exports.Select = Select;
4629
+ exports.SocialMediaBar = SocialMediaBar;
4630
+ exports.SocialMediaCarousel = SocialMediaCarousel;
4407
4631
  exports.SocialMediaPreview = SocialMediaPreview;
4408
4632
  exports.StepIndicator = StepIndicator;
4409
4633
  exports.SwitchComponent = Switch;
package/dist/index.esm.js CHANGED
@@ -2,7 +2,7 @@ import { Button as Button$1, DatePicker as DatePicker$1, DateRangePicker as Date
2
2
  export * from '@heroui/react';
3
3
  export { Slider } from '@heroui/react';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
- import React, { useId, useState, useCallback, useMemo, createContext, useContext, createElement, useRef, useEffect, useLayoutEffect } from 'react';
5
+ import React, { useId, useState, useCallback, useMemo, createContext, useContext, useEffect, createElement, useRef, useLayoutEffect } from 'react';
6
6
  import { Icon } from '@iconify/react';
7
7
  export { loadIcons } from '@iconify/react';
8
8
  import { ResponsiveContainer, AreaChart, CartesianGrid, XAxis, Tooltip, Area } from 'recharts';
@@ -178,7 +178,7 @@ var Input = function (_a) {
178
178
  } })));
179
179
  };
180
180
 
181
- var defaultTranslations$b = {
181
+ var defaultTranslations$d = {
182
182
  addHolidayTitle: "Add holiday",
183
183
  dayOption: "Day",
184
184
  dateRangeOption: "Date range",
@@ -202,7 +202,7 @@ var INITIAL_HOLIDAY_STATE = {
202
202
  */
203
203
  var AddHolidayForm = function (_a) {
204
204
  var onAddHoliday = _a.onAddHoliday, translations = _a.translations, className = _a.className, radioGroupProps = _a.radioGroupProps, dateRangePickerProps = _a.dateRangePickerProps, buttonProps = _a.buttonProps;
205
- var t = __assign(__assign({}, defaultTranslations$b), translations);
205
+ var t = __assign(__assign({}, defaultTranslations$d), translations);
206
206
  var _b = useState(INITIAL_HOLIDAY_STATE), newHoliday = _b[0], setNewHoliday = _b[1];
207
207
  /**
208
208
  * A boolean flag that determines if a date has been set.
@@ -272,7 +272,7 @@ var P = function (_a) {
272
272
  return (jsx("p", __assign({ className: cn("text-tiny text-default-500 font-normal", className) }, props, { children: children })));
273
273
  };
274
274
 
275
- var defaultTranslations$a = {
275
+ var defaultTranslations$c = {
276
276
  title: "Analytics",
277
277
  description: "Monthly growth of your metrics during the selected period",
278
278
  viewDetails: "View Details",
@@ -326,7 +326,7 @@ var formatMonth = function (month) {
326
326
  var AnalyticsCard = function (_a) {
327
327
  var _b, _c;
328
328
  var data = _a.data, _d = _a.showTimePeriods, showTimePeriods = _d === void 0 ? true : _d, _e = _a.showDropdownMenu, showDropdownMenu = _e === void 0 ? true : _e, _f = _a.showMetricCards, showMetricCards = _f === void 0 ? true : _f, onChartChange = _a.onChartChange, onMenuAction = _a.onMenuAction, onTimePeriodChange = _a.onTimePeriodChange, _g = _a.translations, translations = _g === void 0 ? {} : _g, props = __rest(_a, ["data", "showTimePeriods", "showDropdownMenu", "showMetricCards", "onChartChange", "onMenuAction", "onTimePeriodChange", "translations"]);
329
- var t = __assign(__assign({}, defaultTranslations$a), translations);
329
+ var t = __assign(__assign({}, defaultTranslations$c), translations);
330
330
  var _h = useState((_c = (_b = data[0]) === null || _b === void 0 ? void 0 : _b.key) !== null && _c !== void 0 ? _c : ""), activeChart = _h[0], setActiveChart = _h[1];
331
331
  var activeChartData = useMemo(function () {
332
332
  var _a;
@@ -990,6 +990,227 @@ var Chip = function (_a) {
990
990
  return (jsx(Chip$1, __assign({}, props, { onClose: props.onClose, classNames: __assign({ base: colorClasses }, props.classNames) })));
991
991
  };
992
992
 
993
+ // Default translations in Spanish
994
+ var defaultTranslations$b = {
995
+ emptyStateMessage: "No hay contenido disponible",
996
+ emptyStateButtonText: "Agregar contenido",
997
+ previousButtonLabel: "Anterior",
998
+ nextButtonLabel: "Siguiente",
999
+ editButtonLabel: "Editar",
1000
+ deleteButtonLabel: "Eliminar",
1001
+ publishButtonLabel: "Publicar",
1002
+ previewButtonLabel: "Ver vista previa",
1003
+ goToItemLabel: "Ir al item",
1004
+ };
1005
+ /**
1006
+ * ContentCarousel - Generic 3D carousel component
1007
+ *
1008
+ * @component
1009
+ * @example
1010
+ * ```tsx
1011
+ * <ContentCarousel
1012
+ * items={items}
1013
+ * onItemClick={handleItemClick}
1014
+ * renderFooter={({ item }) => <div>Footer content</div>}
1015
+ * />
1016
+ * ```
1017
+ */
1018
+ var ContentCarousel = function (_a) {
1019
+ var items = _a.items, onItemClick = _a.onItemClick, _b = _a.className, className = _b === void 0 ? "" : _b, _c = _a.emptyStateRedirectPath, emptyStateRedirectPath = _c === void 0 ? "" : _c, _d = _a.translations, translations = _d === void 0 ? {} : _d, renderFooter = _a.renderFooter, renderHeader = _a.renderHeader, renderBody = _a.renderBody;
1020
+ var t = __assign(__assign({}, defaultTranslations$b), translations);
1021
+ var _e = useState(items.length >= 3 ? 1 : 0), activeIndex = _e[0], setActiveIndex = _e[1];
1022
+ // Reset to show 3 images when items change
1023
+ useEffect(function () {
1024
+ setActiveIndex(items.length >= 3 ? 1 : 0);
1025
+ }, [items.length]);
1026
+ var handleNext = useCallback(function () {
1027
+ setActiveIndex(function (prev) { return Math.min(prev + 1, items.length - 1); });
1028
+ }, [items.length]);
1029
+ var handlePrev = useCallback(function () {
1030
+ setActiveIndex(function (prev) { return Math.max(prev - 1, 0); });
1031
+ }, []);
1032
+ // Get position of card relative to active index
1033
+ var getPosition = function (index) {
1034
+ if (index === activeIndex) {
1035
+ return "center";
1036
+ }
1037
+ if (index === activeIndex - 1) {
1038
+ return "left";
1039
+ }
1040
+ if (index === activeIndex + 1) {
1041
+ return "right";
1042
+ }
1043
+ return "hidden";
1044
+ };
1045
+ var handleItemClick = useCallback(function (item) {
1046
+ if (onItemClick) {
1047
+ onItemClick(item);
1048
+ }
1049
+ }, [onItemClick]);
1050
+ // Empty state when no items
1051
+ if (items.length === 0) {
1052
+ return (jsxs("div", { className: "flex flex-col items-center justify-center py-16 px-6 gap-6 ".concat(className), children: [jsx("p", { className: "text-default-500 text-center", children: t.emptyStateMessage }), emptyStateRedirectPath && (jsx(Button$1, { color: "primary", variant: "solid", size: "md", onPress: function () {
1053
+ if (typeof window !== "undefined") {
1054
+ window.location.href = emptyStateRedirectPath;
1055
+ }
1056
+ }, startContent: jsx(IconComponent, { icon: "solar:add-circle-bold", className: "w-5 h-5" }), children: t.emptyStateButtonText }))] }));
1057
+ }
1058
+ return (jsx("div", { className: "relative w-full ".concat(className), children: jsxs("div", { className: "relative w-full pt-4 pb-8", children: [jsxs("div", { className: "relative h-[450px] flex items-center justify-center overflow-hidden", children: [items.length > 1 && (jsxs(Fragment, { children: [jsx("div", { className: "absolute left-0 top-1/2 -translate-y-1/2 z-20 ml-4", children: jsx(Button$1, { isIconOnly: true, variant: "bordered", onPress: handlePrev, isDisabled: activeIndex === 0, className: "rounded-full bg-white/95 dark:bg-gray-800/95 backdrop-blur-md border-gray-200 dark:border-gray-700 shadow-xl hover:bg-white dark:hover:bg-gray-800 hover:border-gray-300 dark:hover:border-gray-600 hover:scale-110 hover:-translate-x-1 disabled:opacity-20 disabled:hover:scale-100 disabled:hover:translate-x-0 transition-all duration-300 w-12 h-12", "aria-label": t.previousButtonLabel, children: jsx(IconComponent, { icon: "solar:alt-arrow-left-outline", className: "w-6 h-6" }) }) }), jsx("div", { className: "absolute right-0 top-1/2 -translate-y-1/2 z-20 mr-4", children: jsx(Button$1, { isIconOnly: true, variant: "bordered", onPress: handleNext, isDisabled: activeIndex === items.length - 1, className: "rounded-full bg-white/95 dark:bg-gray-800/95 backdrop-blur-md border-gray-200 dark:border-gray-700 shadow-xl hover:bg-white dark:hover:bg-gray-800 hover:border-gray-300 dark:hover:border-gray-600 hover:scale-110 hover:translate-x-1 disabled:opacity-20 disabled:hover:scale-100 disabled:hover:translate-x-0 transition-all duration-300 w-12 h-12", "aria-label": t.nextButtonLabel, children: jsx(IconComponent, { icon: "solar:alt-arrow-right-outline", className: "w-6 h-6" }) }) })] })), items.map(function (item, index) {
1059
+ var position = getPosition(index);
1060
+ if (position === "hidden") {
1061
+ return null;
1062
+ }
1063
+ return (jsx(CarouselItemComponent, { item: item, position: position, onClick: function () { return handleItemClick(item); }, translations: t, renderFooter: renderFooter, renderHeader: renderHeader, renderBody: renderBody }, item.id));
1064
+ })] }), items.length > 1 && (jsx("div", { className: "flex justify-center mt-4", children: jsx("div", { className: "flex justify-center gap-2", children: items.map(function (_, index) { return (jsx("button", { type: "button", onClick: function () { return setActiveIndex(index); }, className: "rounded-full transition-all duration-300 hover:scale-110 ".concat(index === activeIndex
1065
+ ? "w-8 h-2 bg-gradient-to-r from-primary-500 to-primary-600 shadow-lg shadow-primary-500/50"
1066
+ : "w-2 h-2 bg-gray-300 dark:bg-gray-600 hover:bg-gray-400 dark:hover:bg-gray-500 hover:w-3"), "aria-label": "".concat(t.goToItemLabel, " ").concat(index + 1) }, index)); }) }) }))] }) }));
1067
+ };
1068
+ /**
1069
+ * Internal carousel item component
1070
+ * Renders a single card with customizable content
1071
+ * @internal
1072
+ */
1073
+ function CarouselItemComponent(_a) {
1074
+ var item = _a.item, position = _a.position, onClick = _a.onClick, translations = _a.translations, renderFooter = _a.renderFooter, renderHeader = _a.renderHeader, renderBody = _a.renderBody;
1075
+ var _b = useState(false), isHovered = _b[0], setIsHovered = _b[1];
1076
+ var captionText = item.caption || item.title;
1077
+ // Get styles based on position
1078
+ var getPositionStyles = function () {
1079
+ var baseStyles = {
1080
+ minHeight: "400px",
1081
+ maxHeight: "400px",
1082
+ boxShadow: "0 10px 40px -5px rgba(0, 0, 0, 0.3), 0 8px 25px -8px rgba(0, 0, 0, 0.2)",
1083
+ };
1084
+ if (position === "center") {
1085
+ return __assign(__assign({}, baseStyles), { width: "500px", transform: "scale(1)", opacity: 1, zIndex: 10 });
1086
+ }
1087
+ if (position === "left") {
1088
+ return __assign(__assign({}, baseStyles), { width: "350px", transform: "translateX(-115%) scale(0.75)", opacity: 0.7, zIndex: 5 });
1089
+ }
1090
+ if (position === "right") {
1091
+ return __assign(__assign({}, baseStyles), { width: "350px", transform: "translateX(115%) scale(0.75)", opacity: 0.7, zIndex: 5 });
1092
+ }
1093
+ return baseStyles;
1094
+ };
1095
+ return (jsxs("div", { className: "absolute rounded-3xl shadow-lg transition-all duration-500 ease-in-out flex flex-col overflow-hidden", style: getPositionStyles(), onMouseEnter: function () { return setIsHovered(true); }, onMouseLeave: function () { return setIsHovered(false); }, children: [item.imageUrl ? (jsx("div", { className: "absolute inset-0 bg-cover bg-center transition-all duration-500 ease-in-out ".concat(isHovered ? "scale-110 blur-sm" : "scale-100 blur-0"), style: {
1096
+ backgroundImage: "url(".concat(item.imageUrl, ")"),
1097
+ } })) : (jsx("div", { className: "absolute inset-0 transition-all duration-500 ease-in-out ".concat(isHovered ? "scale-110 blur-sm" : "scale-100 blur-0"), style: {
1098
+ background: item.gradient,
1099
+ } })), jsx("div", { className: "absolute inset-0 bg-gradient-to-b transition-all duration-500 ease-in-out ".concat(isHovered
1100
+ ? "from-black/70 via-black/60 to-black/80"
1101
+ : "from-black/40 via-black/20 to-black/50") }), renderHeader && (jsx("div", { className: "absolute top-4 left-4 right-4 z-20", children: renderHeader({
1102
+ item: item,
1103
+ isHovered: isHovered,
1104
+ translations: translations,
1105
+ }) })), renderBody ? (jsx("div", { className: "relative w-full h-full z-10", children: renderBody(item, isHovered) })) : (jsxs("button", { type: "button", onClick: onClick, className: "relative w-full h-full cursor-pointer flex flex-col justify-between p-6 z-10", "aria-label": item.title, children: [jsx("div", { children: jsx("h3", { className: "text-white text-3xl font-semibold mb-2 text-left drop-shadow-lg", children: item.title }) }), jsx("div", { className: "space-y-3 overflow-hidden", children: jsx("p", { className: "text-white text-sm text-left drop-shadow-md transition-all duration-500 ease-in-out ".concat(!isHovered && "line-clamp-2"), children: captionText }) })] })), renderFooter && (function () {
1106
+ var footerContent = renderFooter({
1107
+ item: item,
1108
+ isHovered: isHovered,
1109
+ translations: translations,
1110
+ });
1111
+ // Only render if there's actual content
1112
+ if (footerContent) {
1113
+ return (jsx("div", { className: "absolute bottom-4 left-4 right-4 z-20", children: footerContent }));
1114
+ }
1115
+ return null;
1116
+ })()] }));
1117
+ }
1118
+
1119
+ // Default translations in Spanish
1120
+ var defaultTranslations$a = {
1121
+ editButtonLabel: "Editar",
1122
+ deleteButtonLabel: "Eliminar",
1123
+ publishButtonLabel: "Publicar",
1124
+ previewButtonLabel: "Ver vista previa",
1125
+ instagramLabel: "Instagram",
1126
+ storyLabel: "Story",
1127
+ tiktokLabel: "TikTok",
1128
+ whatsappLabel: "WhatsApp",
1129
+ };
1130
+ /**
1131
+ * SocialMediaBar - Independent bar component for social media badges and actions
1132
+ *
1133
+ * @component
1134
+ * @example
1135
+ * ```tsx
1136
+ * <SocialMediaBar
1137
+ * platform="instagram-post"
1138
+ * onEdit={handleEdit}
1139
+ * onDelete={handleDelete}
1140
+ * onPublish={handlePublish}
1141
+ * />
1142
+ * ```
1143
+ */
1144
+ var SocialMediaBar = function (_a) {
1145
+ var platform = _a.platform, _b = _a.badgeOnly, badgeOnly = _b === void 0 ? false : _b, _c = _a.showPreview, showPreview = _c === void 0 ? false : _c, onEdit = _a.onEdit, onDelete = _a.onDelete, onPublish = _a.onPublish, onPreview = _a.onPreview, _d = _a.actionsAlwaysVisible, actionsAlwaysVisible = _d === void 0 ? false : _d, _e = _a.isHovered, isHovered = _e === void 0 ? false : _e, _f = _a.className, className = _f === void 0 ? "" : _f, _g = _a.translations, translations = _g === void 0 ? {} : _g, customBadge = _a.customBadge, customActions = _a.customActions;
1146
+ var t = __assign(__assign({}, defaultTranslations$a), translations);
1147
+ // Determine visibility of actions
1148
+ var showActions = actionsAlwaysVisible || isHovered;
1149
+ return (jsxs("div", { className: "flex items-center justify-between ".concat(className), children: [jsxs("div", { className: "flex items-center gap-2", children: [customBadge || (jsxs("div", { className: "backdrop-blur-xl border border-white/30 rounded-full px-3 py-1.5 shadow-xl flex items-center gap-2", style: {
1150
+ background: "linear-gradient(135deg, rgba(255, 255, 255, 0.3) 0%, rgba(200, 200, 255, 0.25) 100%)",
1151
+ }, children: [platform === "instagram-post" && (jsxs(Fragment, { children: [jsx(IconComponent, { icon: "mdi:instagram", className: "w-4 h-4 text-pink-400" }), jsx("span", { className: "text-xs font-medium text-white", children: t.instagramLabel })] })), platform === "instagram-story" && (jsxs(Fragment, { children: [jsx(IconComponent, { icon: "mdi:instagram", className: "w-4 h-4 text-purple-400" }), jsx("span", { className: "text-xs font-medium text-white", children: t.storyLabel })] })), platform === "tiktok-video" && (jsxs(Fragment, { children: [jsx(IconComponent, { icon: "ic:baseline-tiktok", className: "w-4 h-4 text-white" }), jsx("span", { className: "text-xs font-medium text-white", children: t.tiktokLabel })] })), (platform === "whatsapp" || platform === "whatsapp-message") && (jsxs(Fragment, { children: [jsx(IconComponent, { icon: "mdi:whatsapp", className: "w-4 h-4 text-green-400" }), jsx("span", { className: "text-xs font-medium text-white", children: t.whatsappLabel })] }))] })), showPreview && onPreview && (jsx("button", { type: "button", onClick: function (e) {
1152
+ e.stopPropagation();
1153
+ onPreview();
1154
+ }, className: "backdrop-blur-xl border border-white/30 rounded-lg w-8 h-8 shadow-xl flex items-center justify-center hover:scale-110 transition-all duration-200", style: {
1155
+ background: "linear-gradient(135deg, rgba(255, 255, 255, 0.3) 0%, rgba(200, 200, 255, 0.25) 100%)",
1156
+ }, "aria-label": t.previewButtonLabel, children: jsx(IconComponent, { icon: "solar:eye-bold", className: "w-4 h-4 text-white" }) }))] }), !badgeOnly && (jsx("div", { className: "flex items-center gap-2 transition-opacity duration-500 ease-in-out ".concat(showActions ? "opacity-100" : "opacity-0 pointer-events-none"), children: customActions || (jsxs(Fragment, { children: [onEdit && (jsx(Button$1, { isIconOnly: true, variant: "flat", size: "sm", onPress: onEdit, className: "bg-white/90 hover:bg-white dark:bg-gray-800/90 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200 shadow-md backdrop-blur-sm transition-all duration-200 hover:scale-110 active:scale-95", "aria-label": t.editButtonLabel, children: jsx(IconComponent, { icon: "solar:pen-outline", className: "w-4 h-4 transition-transform duration-200 hover:rotate-12" }) })), onDelete && (jsx(Button$1, { isIconOnly: true, variant: "flat", size: "sm", onPress: onDelete, className: "bg-white/90 hover:bg-white dark:bg-gray-800/90 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200 shadow-md backdrop-blur-sm transition-all duration-200 hover:scale-110 active:scale-95", "aria-label": t.deleteButtonLabel, children: jsx(IconComponent, { icon: "solar:trash-bin-minimalistic-outline", className: "w-4 h-4 transition-transform duration-200 hover:scale-110" }) })), onPublish && (jsx(Button$1, { variant: "solid", color: "primary", size: "sm", onPress: onPublish, endContent: jsx(IconComponent, { icon: "solar:plain-3-bold", className: "w-3.5 h-3.5 transition-transform duration-200" }), "aria-label": t.publishButtonLabel, className: "text-xs shadow-md transition-all duration-200 hover:scale-105 hover:-translate-y-0.5 active:scale-95", children: t.publishButtonLabel }))] })) }))] }));
1157
+ };
1158
+
1159
+ // Inject CSS animations for audience info
1160
+ if (typeof document !== "undefined") {
1161
+ var style = document.createElement("style");
1162
+ style.textContent = "\n @keyframes pulse-subtle {\n 0%, 100% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(1.05);\n opacity: 0.95;\n }\n }\n \n @keyframes fade-in {\n from {\n opacity: 0;\n transform: translateX(-5px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n \n .animate-fade-in {\n animation: fade-in 0.3s ease-out;\n }\n";
1163
+ if (!document.head.querySelector("#social-carousel-animations")) {
1164
+ style.id = "social-carousel-animations";
1165
+ document.head.appendChild(style);
1166
+ }
1167
+ }
1168
+ /**
1169
+ * SocialMediaCarousel - Specialized carousel variant for social media content
1170
+ * Extends ContentCarousel with social media specific features
1171
+ *
1172
+ * @component
1173
+ * @example
1174
+ * ```tsx
1175
+ * <SocialMediaCarousel
1176
+ * items={socialMediaItems}
1177
+ * onEdit={handleEdit}
1178
+ * onDelete={handleDelete}
1179
+ * onPublish={handlePublish}
1180
+ * />
1181
+ * ```
1182
+ */
1183
+ var SocialMediaCarousel = function (_a) {
1184
+ var items = _a.items, onItemClick = _a.onItemClick, onEdit = _a.onEdit, onDelete = _a.onDelete, onPublish = _a.onPublish, _b = _a.className, className = _b === void 0 ? "" : _b, _c = _a.emptyStateRedirectPath, emptyStateRedirectPath = _c === void 0 ? "/contenidos-ai/crear-contenido" : _c; _a.compactHeader; _a.campaignView; var _f = _a.translations, translations = _f === void 0 ? {} : _f, _g = _a.hideFooter, hideFooter = _g === void 0 ? false : _g, _h = _a.hideAudienceInfo, hideAudienceInfo = _h === void 0 ? false : _h;
1185
+ var handlePreview = useCallback(function (item) {
1186
+ console.log("Preview:", item);
1187
+ // This could be extended to open a preview modal
1188
+ }, []);
1189
+ // Custom footer renderer with audience info + SocialMediaBar
1190
+ var renderSocialFooterWithAudience = useCallback(function (_a) {
1191
+ var item = _a.item, isHovered = _a.isHovered, translations = _a.translations;
1192
+ var socialItem = item;
1193
+ var showAudience = !hideAudienceInfo && socialItem.targetAudienceCount;
1194
+ return (jsxs("div", { className: "flex flex-col gap-3", children: [showAudience && (jsxs("div", { className: "backdrop-blur-xl border border-white/30 shadow-xl flex items-center transition-all duration-500 ".concat(isHovered
1195
+ ? "bg-gradient-to-br from-white/40 to-white/30 rounded-2xl px-4 py-2.5 gap-3 max-w-md"
1196
+ : "bg-gradient-to-br from-white/30 to-white/20 rounded-3xl px-3 py-1.5 gap-1.5 w-fit"), style: {
1197
+ animation: isHovered
1198
+ ? "none"
1199
+ : "pulse-subtle 3s ease-in-out infinite",
1200
+ }, children: [jsxs("div", { className: "flex items-center gap-1.5 flex-shrink-0", children: [jsx(IconComponent, { icon: "solar:users-group-rounded-bold", className: "w-3.5 h-3.5 text-white transition-transform duration-300 hover:scale-110" }), jsx("span", { className: "text-[11px] font-medium text-white transition-all duration-500 ".concat(isHovered
1201
+ ? "opacity-100 max-w-20"
1202
+ : "opacity-100 max-w-20 whitespace-nowrap"), children: socialItem.targetAudienceCount.toLocaleString("es-ES") })] }), socialItem.audienceReason && isHovered && (jsx("div", { className: "text-[11px] text-white/95 leading-relaxed animate-fade-in", children: socialItem.audienceReason })), socialItem.requiredTags &&
1203
+ socialItem.requiredTags.length > 0 &&
1204
+ isHovered && (jsx("div", { className: "flex flex-wrap gap-1 mt-2 pt-2 border-t border-white/20 animate-fade-in", children: socialItem.requiredTags.map(function (tag, idx) { return (jsx("span", { className: "text-[9px] px-1.5 py-0.5 rounded-md bg-white/20 text-white/95 backdrop-blur-sm border border-white/30", children: tag }, idx)); }) }))] })), !hideFooter && (jsx(SocialMediaBar, { platform: socialItem.type, isHovered: isHovered, showPreview: !!socialItem.imageUrl, onEdit: onEdit ? function () { return onEdit(socialItem); } : undefined, onDelete: onDelete ? function () { return onDelete(socialItem); } : undefined, onPublish: onPublish ? function () { return onPublish(socialItem); } : undefined, onPreview: function () { return handlePreview(socialItem); }, translations: {
1205
+ editButtonLabel: translations.editButtonLabel,
1206
+ deleteButtonLabel: translations.deleteButtonLabel,
1207
+ publishButtonLabel: translations.publishButtonLabel,
1208
+ previewButtonLabel: translations.previewButtonLabel,
1209
+ } }))] }));
1210
+ }, [hideAudienceInfo, hideFooter, onEdit, onDelete, onPublish, handlePreview]);
1211
+ return (jsx(ContentCarousel, { items: items, onItemClick: onItemClick, className: className, emptyStateRedirectPath: emptyStateRedirectPath, translations: translations, renderFooter: renderSocialFooterWithAudience }));
1212
+ };
1213
+
993
1214
  // Traducciones por defecto en español
994
1215
  var defaultTranslations$9 = {
995
1216
  dayOption: "Día específico",
@@ -4355,4 +4576,4 @@ var NavigationLoadingProvider = function (_a) {
4355
4576
  return (jsxs(NavigationLoadingContext.Provider, { value: value, children: [children, jsx(NavigationLoadingOverlay, { isVisible: isVisible })] }));
4356
4577
  };
4357
4578
 
4358
- export { AddHolidayForm, AnalyticsCard, AuraAutocomplete, AuraTable, AuraToastProvider, BreadcrumbsComponent, Button, Card, Chip, ColorSelector, DatePicker, DateRangePicker, DateSelector, DrawerFilters, GlobalToast, H1, H2, H3, H4, HeaderComponent, HolidayType, IconComponent, ImagePreview, Input, MenuComponent, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, MultiStepWizard, NavigationLoadingContext, NavigationLoadingOverlay, NavigationLoadingProvider, P, Pagination, Phone, PromotionalBanner, RangeFilter, RowSteps, ScheduleRow, SearchInput, Select, SocialMediaPreview, StepIndicator, Switch as SwitchComponent, Textarea, ThemeContext, ThemePicker, ThemeProvider, TimeInput as TimeInputComponent, ToastContext, UploadFile, VerticalSteps, Wizard, WizardNavigation, WizardSidebar, defaultTranslations$4 as defaultTranslations, sizeMap, themeColors, useAuraToast, useNavigationLoading, useThemeContext };
4579
+ export { AddHolidayForm, AnalyticsCard, AuraAutocomplete, AuraTable, AuraToastProvider, BreadcrumbsComponent, Button, Card, Chip, ColorSelector, ContentCarousel, DatePicker, DateRangePicker, DateSelector, DrawerFilters, GlobalToast, H1, H2, H3, H4, HeaderComponent, HolidayType, IconComponent, ImagePreview, Input, MenuComponent, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, MultiStepWizard, NavigationLoadingContext, NavigationLoadingOverlay, NavigationLoadingProvider, P, Pagination, Phone, PromotionalBanner, RangeFilter, RowSteps, ScheduleRow, SearchInput, Select, SocialMediaBar, SocialMediaCarousel, SocialMediaPreview, StepIndicator, Switch as SwitchComponent, Textarea, ThemeContext, ThemePicker, ThemeProvider, TimeInput as TimeInputComponent, ToastContext, UploadFile, VerticalSteps, Wizard, WizardNavigation, WizardSidebar, defaultTranslations$4 as defaultTranslations, sizeMap, themeColors, useAuraToast, useNavigationLoading, useThemeContext };
@@ -0,0 +1,17 @@
1
+ import type React from "react";
2
+ import type { ContentCarouselProps } from "./ContentCarousel.types";
3
+ /**
4
+ * ContentCarousel - Generic 3D carousel component
5
+ *
6
+ * @component
7
+ * @example
8
+ * ```tsx
9
+ * <ContentCarousel
10
+ * items={items}
11
+ * onItemClick={handleItemClick}
12
+ * renderFooter={({ item }) => <div>Footer content</div>}
13
+ * />
14
+ * ```
15
+ */
16
+ export declare const ContentCarousel: React.FC<ContentCarouselProps>;
17
+ //# sourceMappingURL=ContentCarousel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentCarousel.d.ts","sourceRoot":"","sources":["../../../../src/components/content-carousel/ContentCarousel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAIX,oBAAoB,EAEpB,MAAM,yBAAyB,CAAC;AAejC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAuK1D,CAAC"}