@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.
- package/dist/assets/css/styles.css +1 -1
- package/dist/index.cjs.js +228 -4
- package/dist/index.esm.js +227 -6
- package/dist/types/components/content-carousel/ContentCarousel.d.ts +17 -0
- package/dist/types/components/content-carousel/ContentCarousel.d.ts.map +1 -0
- package/dist/types/components/content-carousel/ContentCarousel.types.d.ts +73 -0
- package/dist/types/components/content-carousel/ContentCarousel.types.d.ts.map +1 -0
- package/dist/types/components/content-carousel/index.d.ts +4 -0
- package/dist/types/components/content-carousel/index.d.ts.map +1 -0
- package/dist/types/components/content-carousel/variants/SocialMediaCarousel.d.ts +19 -0
- package/dist/types/components/content-carousel/variants/SocialMediaCarousel.d.ts.map +1 -0
- package/dist/types/components/content-carousel/variants/SocialMediaCarousel.types.d.ts +51 -0
- package/dist/types/components/content-carousel/variants/SocialMediaCarousel.types.d.ts.map +1 -0
- package/dist/types/components/content-carousel/variants/index.d.ts +3 -0
- package/dist/types/components/content-carousel/variants/index.d.ts.map +1 -0
- package/dist/types/components/social-media-bar/SocialMediaBar.d.ts +18 -0
- package/dist/types/components/social-media-bar/SocialMediaBar.d.ts.map +1 -0
- package/dist/types/components/social-media-bar/SocialMediaBar.types.d.ts +53 -0
- package/dist/types/components/social-media-bar/SocialMediaBar.types.d.ts.map +1 -0
- package/dist/types/components/social-media-bar/index.d.ts +3 -0
- package/dist/types/components/social-media-bar/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- 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$
|
|
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$
|
|
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$
|
|
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$
|
|
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,
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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"}
|