@beweco/aurora-ui 0.1.23 → 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 (30) hide show
  1. package/dist/assets/css/styles.css +1 -1
  2. package/dist/index.cjs.js +317 -17
  3. package/dist/index.esm.js +315 -19
  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/components/social-media-preview/SocialMediaPreview.d.ts +19 -0
  23. package/dist/types/components/social-media-preview/SocialMediaPreview.d.ts.map +1 -0
  24. package/dist/types/components/social-media-preview/SocialMediaPreview.types.d.ts +46 -0
  25. package/dist/types/components/social-media-preview/SocialMediaPreview.types.d.ts.map +1 -0
  26. package/dist/types/components/social-media-preview/index.d.ts +3 -0
  27. package/dist/types/components/social-media-preview/index.d.ts.map +1 -0
  28. package/dist/types/index.d.ts +3 -0
  29. package/dist/types/index.d.ts.map +1 -1
  30. package/package.json +1 -1
package/dist/index.esm.js CHANGED
@@ -1,8 +1,8 @@
1
- import { Button as Button$1, DatePicker as DatePicker$1, DateRangePicker as DateRangePicker$1, Input as Input$1, RadioGroup, Radio, cn, Card as Card$1, Spacer, Tabs, Tab, Chip as Chip$1, Dropdown, DropdownTrigger, DropdownMenu, DropdownItem, Autocomplete, Breadcrumbs, BreadcrumbItem, DropdownSection, ListboxItem, Popover, PopoverTrigger, Tooltip as Tooltip$1, PopoverContent, Listbox, Accordion, AccordionItem, ListboxSection, Avatar, CardBody, CardFooter, Pagination as Pagination$1, Link, Switch as Switch$1, TimeInput as TimeInput$1, Select as Select$1, Table, TableHeader, TableColumn, TableBody, TableRow, TableCell, Textarea as Textarea$1, Alert, Modal as Modal$1, ModalContent as ModalContent$1, ModalHeader as ModalHeader$1, ModalBody as ModalBody$1, Slider, ModalFooter as ModalFooter$1, Spinner, SelectItem, Drawer, DrawerContent, DrawerBody } from '@heroui/react';
1
+ import { Button as Button$1, DatePicker as DatePicker$1, DateRangePicker as DateRangePicker$1, Input as Input$1, RadioGroup, Radio, cn, Card as Card$1, Spacer, Tabs, Tab, Chip as Chip$1, Dropdown, DropdownTrigger, DropdownMenu, DropdownItem, Autocomplete, Breadcrumbs, BreadcrumbItem, DropdownSection, ListboxItem, Popover, PopoverTrigger, Tooltip as Tooltip$1, PopoverContent, Listbox, Accordion, AccordionItem, ListboxSection, Avatar, CardBody, CardFooter, Pagination as Pagination$1, Link, Switch as Switch$1, TimeInput as TimeInput$1, Select as Select$1, Image as Image$1, Table, TableHeader, TableColumn, TableBody, TableRow, TableCell, Textarea as Textarea$1, Alert, Modal as Modal$1, ModalContent as ModalContent$1, ModalHeader as ModalHeader$1, ModalBody as ModalBody$1, Slider, ModalFooter as ModalFooter$1, Spinner, SelectItem, Drawer, DrawerContent, DrawerBody } from '@heroui/react';
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$a = {
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$a), 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$9 = {
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$9), 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,8 +990,229 @@ 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
- var defaultTranslations$8 = {
1215
+ var defaultTranslations$9 = {
995
1216
  dayOption: "Día específico",
996
1217
  dateRangeOption: "Rango de fechas",
997
1218
  selectDateAriaLabel: "Seleccionar fecha",
@@ -1009,7 +1230,7 @@ var DateSelector = function (_a) {
1009
1230
  var _f = React.useState(initialDate || null), date = _f[0], setDate = _f[1];
1010
1231
  var _g = React.useState(initialDateRange || null), dateRange = _g[0], setDateRange = _g[1];
1011
1232
  // Combinar traducciones por defecto con las proporcionadas
1012
- var t = __assign(__assign({}, defaultTranslations$8), translations);
1233
+ var t = __assign(__assign({}, defaultTranslations$9), translations);
1013
1234
  var handleTypeChange = function (value) {
1014
1235
  var newType = value;
1015
1236
  setType(newType);
@@ -1116,7 +1337,7 @@ var HeaderComponent = function (_a) {
1116
1337
  };
1117
1338
  HeaderComponent.displayName = "Header";
1118
1339
 
1119
- var defaultTranslations$7 = {
1340
+ var defaultTranslations$8 = {
1120
1341
  previewAlt: "Vista previa de imagen",
1121
1342
  removeButtonAriaLabel: "Eliminar imagen",
1122
1343
  emptyStateText: "No hay imágenes para mostrar",
@@ -1149,7 +1370,7 @@ var normalizeImages = function (images) {
1149
1370
  };
1150
1371
  var ImagePreview = function (_a) {
1151
1372
  var images = _a.images, _b = _a.size, size = _b === void 0 ? "small" : _b, onRemove = _a.onRemove, _c = _a.showRemoveButton, showRemoveButton = _c === void 0 ? true : _c, _d = _a.className, className = _d === void 0 ? "" : _d, _e = _a.translations, translations = _e === void 0 ? {} : _e, _f = _a.backgroundColor, backgroundColor = _f === void 0 ? "bg-white dark:bg-gray-800" : _f, _g = _a.radius, radius = _g === void 0 ? "lg" : _g, _h = _a.showBorder, showBorder = _h === void 0 ? true : _h, onImageClick = _a.onImageClick;
1152
- var t = __assign(__assign({}, defaultTranslations$7), translations);
1373
+ var t = __assign(__assign({}, defaultTranslations$8), translations);
1153
1374
  var normalizedImages = normalizeImages(images);
1154
1375
  var sizeClass = sizeClasses[size];
1155
1376
  var radiusClass = radiusClasses[radius];
@@ -1437,13 +1658,13 @@ function $458b0a5536c1a7cf$export$40bfa8c7b0832715(value, defaultValue, onChange
1437
1658
  ];
1438
1659
  }
1439
1660
 
1440
- var defaultTranslations$6 = {
1661
+ var defaultTranslations$7 = {
1441
1662
  checkIconTitle: "Check",
1442
1663
  };
1443
1664
  var VerticalSteps = React.forwardRef(function (_a, ref) {
1444
1665
  var _b = _a.color, color = _b === void 0 ? "primary" : _b, _c = _a.steps, stepsProp = _c === void 0 ? [] : _c, _d = _a.defaultStep, defaultStep = _d === void 0 ? 0 : _d, onStepChange = _a.onStepChange, currentStepProp = _a.currentStep, _e = _a.hideProgressBars, hideProgressBars = _e === void 0 ? false : _e, stepClassName = _a.stepClassName, className = _a.className, translations = _a.translations, props = __rest(_a, ["color", "steps", "defaultStep", "onStepChange", "currentStep", "hideProgressBars", "stepClassName", "className", "translations"]);
1445
1666
  var _f = $458b0a5536c1a7cf$export$40bfa8c7b0832715(currentStepProp, defaultStep, onStepChange), currentStep = _f[0], setCurrentStep = _f[1];
1446
- var t = __assign(__assign({}, defaultTranslations$6), translations);
1667
+ var t = __assign(__assign({}, defaultTranslations$7), translations);
1447
1668
  var steps = React.useMemo(function () {
1448
1669
  if (typeof stepsProp === "number") {
1449
1670
  return Array.from({ length: stepsProp }, function () { return ({}); });
@@ -2082,7 +2303,7 @@ var countries = [
2082
2303
  ];
2083
2304
  var uniqueCountries = Array.from(new Map(countries.map(function (item) { return [item.code + item.name, item]; })).values());
2084
2305
  // Traducciones por defecto
2085
- var defaultTranslations$5 = {
2306
+ var defaultTranslations$6 = {
2086
2307
  label: "Teléfono",
2087
2308
  placeholder: "Número de teléfono",
2088
2309
  searchPlaceholder: "Buscar país...",
@@ -2100,7 +2321,7 @@ var Phone = function (_a) {
2100
2321
  var portalDropdownRef = useRef(null);
2101
2322
  var _l = useState({}), dropdownPosition = _l[0], setDropdownPosition = _l[1];
2102
2323
  var _m = useState(uniqueCountries), filteredCountries = _m[0], setFilteredCountries = _m[1];
2103
- var t = __assign(__assign({}, defaultTranslations$5), translations);
2324
+ var t = __assign(__assign({}, defaultTranslations$6), translations);
2104
2325
  var finalLabel = label || t.label;
2105
2326
  useEffect(function () {
2106
2327
  if (value) {
@@ -2179,7 +2400,7 @@ var Phone = function (_a) {
2179
2400
  : ""), onClick: function () { return handleCountrySelect(country); }, children: [jsx("span", { className: "mr-3", children: jsx(FlagIcon, { countryCode: country.country, size: "md" }) }), jsx("span", { className: "flex-1 text-left text-default-500", children: country.name }), jsx("span", { className: "text-xs text-default-500", children: country.code })] }, "".concat(country.code, "-").concat(country.country))); })) : (jsx("div", { className: "px-4 py-2 text-sm text-default-500", children: t.noCountriesFound })) })] }), document.body)] }));
2180
2401
  };
2181
2402
 
2182
- var defaultTranslations$4 = {
2403
+ var defaultTranslations$5 = {
2183
2404
  message: "The Winter 2024 Release is here: new editor, analytics API, and so much more.",
2184
2405
  buttonText: "Explore",
2185
2406
  closeButtonLabel: "Close Banner",
@@ -2189,7 +2410,7 @@ var defaultTranslations$4 = {
2189
2410
  */
2190
2411
  var PromotionalBanner = function (_a) {
2191
2412
  var message = _a.message, buttonText = _a.buttonText, _b = _a.messageHref, messageHref = _b === void 0 ? "#" : _b, _c = _a.buttonHref, buttonHref = _c === void 0 ? "#" : _c, _d = _a.showCloseButton, showCloseButton = _d === void 0 ? true : _d, _e = _a.isVisible, isVisible = _e === void 0 ? true : _e, _f = _a.gradientColors, gradientColors = _f === void 0 ? ["default-100", "danger-100", "secondary-100"] : _f, _g = _a.buttonGradientColors, buttonGradientColors = _g === void 0 ? ["#F871A0", "#9353D3"] : _g, onClose = _a.onClose, onMessageClick = _a.onMessageClick, onButtonClick = _a.onButtonClick, _h = _a.messageLinkProps, messageLinkProps = _h === void 0 ? {} : _h, _j = _a.buttonProps, buttonProps = _j === void 0 ? {} : _j, _k = _a.translations, translations = _k === void 0 ? {} : _k;
2192
- var t = __assign(__assign({}, defaultTranslations$4), translations);
2413
+ var t = __assign(__assign({}, defaultTranslations$5), translations);
2193
2414
  var finalMessage = message || t.message;
2194
2415
  var finalButtonText = buttonText || t.buttonText;
2195
2416
  var handleClose = function () {
@@ -2518,7 +2739,7 @@ var TimeInput = function (_a) {
2518
2739
  * />
2519
2740
  * ```
2520
2741
  */
2521
- var defaultTranslations$3 = {
2742
+ var defaultTranslations$4 = {
2522
2743
  /** Label for the start time input field */
2523
2744
  from: "Desde",
2524
2745
  /** Label for the end time input field */
@@ -2576,7 +2797,7 @@ var defaultTranslations$3 = {
2576
2797
  */
2577
2798
  var ScheduleRow = function (_a) {
2578
2799
  var day = _a.day, daySchedule = _a.daySchedule, _b = _a.translations, translations = _b === void 0 ? {} : _b, _c = _a.showCopyToAll, showCopyToAll = _c === void 0 ? false : _c, onChange = _a.onChange, onCopyToAll = _a.onCopyToAll;
2579
- var t = __assign(__assign({}, defaultTranslations$3), translations);
2800
+ var t = __assign(__assign({}, defaultTranslations$4), translations);
2580
2801
  /**
2581
2802
  * @function validateTimeSlots
2582
2803
  * @description Validates all time slots to ensure the "from" time is not after the "to" time.
@@ -2729,6 +2950,81 @@ var Select = function (_a) {
2729
2950
  } })) }));
2730
2951
  };
2731
2952
 
2953
+ var defaultTranslations$3 = {
2954
+ username: "tu_negocio",
2955
+ sendMessage: "Enviar mensaje",
2956
+ viewMore: "ver más",
2957
+ viewLess: "ver menos",
2958
+ timeAgo: "hace unos momentos",
2959
+ imageAlt: "Vista previa de red social",
2960
+ };
2961
+ /**
2962
+ * SocialMediaPreview component for displaying social media post previews
2963
+ * across multiple platforms: Instagram, Facebook, TikTok, and Twitter.
2964
+ *
2965
+ * @component
2966
+ * @example
2967
+ * ```tsx
2968
+ * <SocialMediaPreview
2969
+ * platform="instagram"
2970
+ * imageUrl="/path/to/image.jpg"
2971
+ * caption="Check out our new product!"
2972
+ * variant="full"
2973
+ * />
2974
+ * ```
2975
+ */
2976
+ var SocialMediaPreview = function (_a) {
2977
+ var platform = _a.platform, imageUrl = _a.imageUrl, caption = _a.caption, _b = _a.variant, variant = _b === void 0 ? "full" : _b, _c = _a.showHeader, showHeader = _c === void 0 ? true : _c, _d = _a.maxCaptionLength, maxCaptionLength = _d === void 0 ? 125 : _d, onToggleCaption = _a.onToggleCaption, showFullCaption = _a.showFullCaption, username = _a.username, avatarUrl = _a.avatarUrl, _e = _a.translations, translations = _e === void 0 ? {} : _e, _f = _a.className, className = _f === void 0 ? "" : _f, _g = _a.imageProps, imageProps = _g === void 0 ? {} : _g;
2978
+ var t = __assign(__assign({}, defaultTranslations$3), translations);
2979
+ var displayUsername = username || t.username;
2980
+ var shouldTruncate = variant === "compact" && caption.length > maxCaptionLength;
2981
+ var getTruncatedCaption = function () {
2982
+ if (variant !== "compact") {
2983
+ return caption;
2984
+ }
2985
+ if (!shouldTruncate || showFullCaption) {
2986
+ return caption;
2987
+ }
2988
+ var firstLineEnd = caption.indexOf("\n");
2989
+ var truncateAt = firstLineEnd > 0 && firstLineEnd < maxCaptionLength
2990
+ ? firstLineEnd
2991
+ : maxCaptionLength;
2992
+ return "".concat(caption.substring(0, truncateAt).trim(), "...");
2993
+ };
2994
+ var displayCaption = getTruncatedCaption();
2995
+ // Render Instagram Preview
2996
+ var renderInstagram = function () {
2997
+ if (variant === "story") {
2998
+ return renderInstagramStory();
2999
+ }
3000
+ return renderInstagramPost();
3001
+ };
3002
+ var renderInstagramStory = function () { return (jsxs("div", { className: "relative w-full bg-gradient-to-b from-gray-900 to-gray-800 rounded-2xl shadow-2xl overflow-hidden ".concat(className), style: { aspectRatio: "9/16", maxHeight: "640px" }, children: [imageUrl && (jsxs("div", { className: "absolute inset-0", children: [jsx(Image$1, __assign({ src: imageUrl, alt: t.imageAlt, className: "w-full h-full object-cover" }, imageProps)), jsx("div", { className: "absolute inset-0 bg-black bg-opacity-20" })] })), showHeader && (jsxs("div", { className: "absolute top-0 left-0 right-0 z-10 p-4", children: [jsx("div", { className: "w-full h-0.5 bg-white bg-opacity-30 rounded-full mb-3", children: jsx("div", { className: "h-full w-1/3 bg-white rounded-full" }) }), jsxs("div", { className: "flex items-center justify-between", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx("div", { className: "w-8 h-8 rounded-full bg-gradient-to-br from-purple-500 via-pink-500 to-orange-500 flex items-center justify-center border-2 border-white", children: avatarUrl ? (jsx("img", { src: avatarUrl, alt: displayUsername, className: "w-full h-full rounded-full object-cover" })) : (jsx("span", { className: "text-white text-xs font-bold", children: displayUsername.substring(0, 2).toUpperCase() })) }), jsx("span", { className: "text-sm font-semibold text-white drop-shadow-lg", children: displayUsername }), jsx("span", { className: "text-xs text-white text-opacity-90", children: "hace 5min" })] }), jsxs("div", { className: "flex items-center gap-3", children: [jsx(IconComponent, { icon: "solar:play-circle-bold", className: "text-lg text-white drop-shadow-lg" }), jsx(IconComponent, { icon: "solar:volume-loud-bold", className: "text-lg text-white drop-shadow-lg" }), jsx(IconComponent, { icon: "solar:menu-dots-bold", className: "text-lg text-white drop-shadow-lg" })] })] })] })), jsxs("div", { className: "absolute bottom-6 left-0 right-0 z-20 px-4 flex items-center gap-3", children: [jsx("input", { type: "text", placeholder: t.sendMessage, className: "flex-1 bg-transparent border-2 border-white border-opacity-70 rounded-full px-4 py-2 text-white placeholder-white placeholder-opacity-70 text-sm", readOnly: true }), jsx(IconComponent, { icon: "solar:heart-outline", className: "text-2xl text-white drop-shadow-lg" }), jsx(IconComponent, { icon: "solar:plain-outline", className: "text-2xl text-white drop-shadow-lg" })] })] })); };
3003
+ var renderInstagramPost = function () { return (jsxs("div", { className: "flex flex-col bg-white dark:bg-gray-900 ".concat(variant === "full" ? "rounded-lg shadow-xl overflow-hidden" : "rounded-b-xl overflow-hidden", " h-full ").concat(className), children: [showHeader && (jsxs("div", { className: "flex items-center justify-between p-3 border-b border-gray-200 dark:border-gray-800", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx("div", { className: "w-8 h-8 rounded-full bg-gradient-to-br from-purple-500 via-pink-500 to-orange-500 flex items-center justify-center", children: avatarUrl ? (jsx("img", { src: avatarUrl, alt: displayUsername, className: "w-full h-full rounded-full object-cover" })) : (jsx("span", { className: "text-white text-xs font-bold", children: displayUsername.substring(0, 2).toUpperCase() })) }), jsx("span", { className: "text-sm font-semibold text-gray-900 dark:text-white", children: displayUsername })] }), jsx(IconComponent, { icon: "solar:menu-dots-bold", className: "text-lg text-gray-900 dark:text-white" })] })), imageUrl && (jsx("div", { className: "relative w-full bg-gray-50 dark:bg-gray-800 overflow-hidden rounded-none ".concat(variant === "full" ? "h-80" : ""), style: variant === "compact" ? { aspectRatio: "1/1" } : {}, children: jsx(Image$1, __assign({ src: imageUrl, alt: t.imageAlt, className: "w-full h-full object-cover rounded-none", radius: "none" }, imageProps)) })), jsxs("div", { className: "flex-1 p-3 overflow-y-auto", children: [jsxs("div", { className: "flex items-center justify-between mb-2", children: [jsxs("div", { className: "flex items-center gap-4", children: [jsx(IconComponent, { icon: "solar:heart-bold", className: "text-xl text-gray-900 dark:text-white" }), jsx(IconComponent, { icon: "solar:chat-round-bold", className: "text-xl text-gray-900 dark:text-white" }), jsx(IconComponent, { icon: "solar:plain-bold", className: "text-xl text-gray-900 dark:text-white" })] }), jsx(IconComponent, { icon: "solar:bookmark-bold", className: "text-xl text-gray-900 dark:text-white" })] }), jsxs("div", { className: "text-sm text-left", children: [jsxs("div", { className: showFullCaption ? "overflow-y-auto" : "", style: { maxHeight: showFullCaption ? "150px" : "none" }, children: [jsx("span", { className: "font-semibold mr-2 text-gray-900 dark:text-white", children: displayUsername }), jsx("span", { className: "text-gray-800 dark:text-gray-200 whitespace-pre-wrap break-words", children: displayCaption })] }), shouldTruncate && onToggleCaption && variant !== "compact" && (jsx("button", { type: "button", onClick: function (e) {
3004
+ e.stopPropagation();
3005
+ onToggleCaption();
3006
+ }, className: "text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-300 font-normal mt-1 underline text-xs block", children: showFullCaption ? t.viewLess : t.viewMore }))] }), variant !== "compact" && (jsx("div", { className: "text-xs text-gray-500 dark:text-gray-400 mt-1 text-left", children: t.timeAgo }))] })] })); };
3007
+ // Render Facebook Preview
3008
+ var renderFacebook = function () { return (jsxs("div", { className: "flex flex-col bg-white dark:bg-gray-900 ".concat(variant === "full" ? "rounded-lg shadow-xl overflow-hidden" : "rounded-xl overflow-hidden", " ").concat(className), children: [showHeader && (jsx("div", { className: "p-4 border-b border-gray-200 dark:border-gray-800", children: jsxs("div", { className: "flex items-center gap-3", children: [jsx("div", { className: "w-10 h-10 rounded-full bg-blue-600 flex items-center justify-center", children: avatarUrl ? (jsx("img", { src: avatarUrl, alt: displayUsername, className: "w-full h-full rounded-full object-cover" })) : (jsx("span", { className: "text-white text-sm font-bold", children: displayUsername.substring(0, 2).toUpperCase() })) }), jsxs("div", { className: "flex-1", children: [jsx("p", { className: "text-sm font-semibold text-gray-900 dark:text-white", children: displayUsername }), jsxs("p", { className: "text-xs text-gray-500 dark:text-gray-400 flex items-center gap-1", children: [t.timeAgo, " \u00B7 ", jsx(IconComponent, { icon: "solar:earth-bold", className: "text-xs" })] })] }), jsx(IconComponent, { icon: "solar:menu-dots-bold", className: "text-xl text-gray-600 dark:text-gray-400" })] }) })), jsx("div", { className: "px-4 py-2", children: jsx("p", { className: "text-sm text-gray-900 dark:text-white whitespace-pre-wrap break-words", children: displayCaption }) }), imageUrl && (jsx("div", { className: "relative w-full bg-gray-50 dark:bg-gray-800", children: jsx(Image$1, __assign({ src: imageUrl, alt: t.imageAlt, className: "w-full h-auto object-cover", radius: "none" }, imageProps)) })), jsx("div", { className: "p-3 border-t border-gray-200 dark:border-gray-800", children: jsxs("div", { className: "flex items-center justify-around", children: [jsxs("button", { type: "button", className: "flex items-center gap-2 text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 px-4 py-2 rounded-lg transition-colors", children: [jsx(IconComponent, { icon: "solar:like-bold", className: "text-xl" }), jsx("span", { className: "text-sm font-medium", children: "Me gusta" })] }), jsxs("button", { type: "button", className: "flex items-center gap-2 text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 px-4 py-2 rounded-lg transition-colors", children: [jsx(IconComponent, { icon: "solar:chat-round-bold", className: "text-xl" }), jsx("span", { className: "text-sm font-medium", children: "Comentar" })] }), jsxs("button", { type: "button", className: "flex items-center gap-2 text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 px-4 py-2 rounded-lg transition-colors", children: [jsx(IconComponent, { icon: "solar:share-bold", className: "text-xl" }), jsx("span", { className: "text-sm font-medium", children: "Compartir" })] })] }) })] })); };
3009
+ // Render TikTok Preview
3010
+ var renderTikTok = function () { return (jsxs("div", { className: "relative w-full bg-black rounded-2xl shadow-2xl overflow-hidden ".concat(className), style: { aspectRatio: "9/16", maxHeight: "640px" }, children: [imageUrl && (jsxs("div", { className: "absolute inset-0", children: [jsx(Image$1, __assign({ src: imageUrl, alt: t.imageAlt, className: "w-full h-full object-cover" }, imageProps)), jsx("div", { className: "absolute inset-0 bg-gradient-to-b from-transparent via-transparent to-black opacity-60" })] })), jsxs("div", { className: "absolute right-2 bottom-20 flex flex-col items-center gap-6 z-20", children: [jsxs("div", { className: "flex flex-col items-center", children: [jsx("div", { className: "w-12 h-12 rounded-full border-2 border-white bg-gray-900 flex items-center justify-center", children: avatarUrl ? (jsx("img", { src: avatarUrl, alt: displayUsername, className: "w-full h-full rounded-full object-cover" })) : (jsx("span", { className: "text-white text-xs font-bold", children: displayUsername.substring(0, 2).toUpperCase() })) }), jsx("div", { className: "w-6 h-6 rounded-full bg-pink-500 flex items-center justify-center -mt-3 border-2 border-black", children: jsx(IconComponent, { icon: "solar:add-circle-bold", className: "text-xs text-white" }) })] }), jsxs("div", { className: "flex flex-col items-center gap-2", children: [jsx(IconComponent, { icon: "solar:heart-bold", className: "text-3xl text-white drop-shadow-lg" }), jsx("span", { className: "text-xs text-white font-semibold", children: "24.5K" })] }), jsxs("div", { className: "flex flex-col items-center gap-2", children: [jsx(IconComponent, { icon: "solar:chat-round-bold", className: "text-3xl text-white drop-shadow-lg" }), jsx("span", { className: "text-xs text-white font-semibold", children: "1,234" })] }), jsxs("div", { className: "flex flex-col items-center gap-2", children: [jsx(IconComponent, { icon: "solar:bookmark-bold", className: "text-3xl text-white drop-shadow-lg" }), jsx("span", { className: "text-xs text-white font-semibold", children: "453" })] }), jsxs("div", { className: "flex flex-col items-center gap-2", children: [jsx(IconComponent, { icon: "solar:share-bold", className: "text-3xl text-white drop-shadow-lg" }), jsx("span", { className: "text-xs text-white font-semibold", children: "892" })] }), jsx("div", { className: "w-10 h-10 rounded-lg bg-gray-800 border border-gray-700 flex items-center justify-center", children: jsx(IconComponent, { icon: "solar:music-note-2-bold", className: "text-xl text-white" }) })] }), jsxs("div", { className: "absolute bottom-0 left-0 right-14 z-20 p-4", children: [jsxs("p", { className: "text-sm font-semibold text-white mb-1", children: ["@", displayUsername] }), jsx("p", { className: "text-sm text-white mb-2 line-clamp-2", children: displayCaption }), jsxs("div", { className: "flex items-center gap-2 text-xs text-white", children: [jsx(IconComponent, { icon: "solar:music-note-2-bold", className: "text-sm" }), jsxs("span", { className: "truncate", children: ["Sonido original - ", displayUsername] })] })] })] })); };
3011
+ // Render Twitter Preview
3012
+ var renderTwitter = function () { return (jsx("div", { className: "flex flex-col bg-white dark:bg-gray-900 ".concat(variant === "full" ? "rounded-xl border border-gray-200 dark:border-gray-800" : "rounded-xl border border-gray-200 dark:border-gray-800", " ").concat(className), children: jsx("div", { className: "p-4", children: jsxs("div", { className: "flex gap-3", children: [jsx("div", { className: "w-12 h-12 rounded-full bg-blue-500 flex items-center justify-center flex-shrink-0", children: avatarUrl ? (jsx("img", { src: avatarUrl, alt: displayUsername, className: "w-full h-full rounded-full object-cover" })) : (jsx("span", { className: "text-white text-sm font-bold", children: displayUsername.substring(0, 2).toUpperCase() })) }), jsxs("div", { className: "flex-1 min-w-0", children: [jsxs("div", { className: "flex items-center gap-1 mb-1", children: [jsx("span", { className: "font-bold text-gray-900 dark:text-white text-sm truncate", children: displayUsername }), jsx(IconComponent, { icon: "solar:verified-check-bold", className: "text-blue-500 text-base flex-shrink-0" }), jsxs("span", { className: "text-gray-500 dark:text-gray-400 text-sm truncate", children: ["@", displayUsername.toLowerCase().replace(/\s/g, "_")] }), jsx("span", { className: "text-gray-500 dark:text-gray-400 text-sm", children: "\u00B7 2h" })] }), jsx("p", { className: "text-gray-900 dark:text-white text-sm mb-3 whitespace-pre-wrap break-words", children: displayCaption }), imageUrl && (jsx("div", { className: "rounded-2xl overflow-hidden border border-gray-200 dark:border-gray-700 mb-3", children: jsx(Image$1, __assign({ src: imageUrl, alt: t.imageAlt, className: "w-full h-auto object-cover", radius: "none" }, imageProps)) })), jsxs("div", { className: "flex items-center justify-between max-w-md mt-3", children: [jsxs("button", { type: "button", className: "flex items-center gap-2 text-gray-500 dark:text-gray-400 hover:text-blue-500 dark:hover:text-blue-400 transition-colors", children: [jsx(IconComponent, { icon: "solar:chat-round-bold", className: "text-lg" }), jsx("span", { className: "text-xs", children: "234" })] }), jsxs("button", { type: "button", className: "flex items-center gap-2 text-gray-500 dark:text-gray-400 hover:text-green-500 dark:hover:text-green-400 transition-colors", children: [jsx(IconComponent, { icon: "solar:repost-bold", className: "text-lg" }), jsx("span", { className: "text-xs", children: "1.2K" })] }), jsxs("button", { type: "button", className: "flex items-center gap-2 text-gray-500 dark:text-gray-400 hover:text-pink-500 dark:hover:text-pink-400 transition-colors", children: [jsx(IconComponent, { icon: "solar:heart-bold", className: "text-lg" }), jsx("span", { className: "text-xs", children: "5.6K" })] }), jsxs("button", { type: "button", className: "flex items-center gap-2 text-gray-500 dark:text-gray-400 hover:text-blue-500 dark:hover:text-blue-400 transition-colors", children: [jsx(IconComponent, { icon: "solar:chart-2-bold", className: "text-lg" }), jsx("span", { className: "text-xs", children: "12K" })] }), jsx("button", { type: "button", className: "flex items-center gap-2 text-gray-500 dark:text-gray-400 hover:text-blue-500 dark:hover:text-blue-400 transition-colors", children: jsx(IconComponent, { icon: "solar:share-bold", className: "text-lg" }) })] })] })] }) }) })); };
3013
+ // Main render logic
3014
+ switch (platform) {
3015
+ case "instagram":
3016
+ return renderInstagram();
3017
+ case "facebook":
3018
+ return renderFacebook();
3019
+ case "tiktok":
3020
+ return renderTikTok();
3021
+ case "twitter":
3022
+ return renderTwitter();
3023
+ default:
3024
+ return renderInstagram();
3025
+ }
3026
+ };
3027
+
2732
3028
  function AuraTable(_a) {
2733
3029
  var columns = _a.columns, items = _a.items, renderCell = _a.renderCell, children = _a.children, props = __rest(_a, ["columns", "items", "renderCell", "children"]);
2734
3030
  return (jsxs(Table, __assign({ removeWrapper: true, radius: "none" }, props, { children: [jsx(TableHeader, { columns: columns, children: function (column) { return jsx(TableColumn, { children: column.label }, column.key); } }), jsx(TableBody, { items: items, children: function (item) { return (jsx(TableRow, { children: function (columnKey) { return (jsx(TableCell, { children: renderCell ? renderCell(item, columnKey) : children })); } }, item.id)); } })] })));
@@ -4280,4 +4576,4 @@ var NavigationLoadingProvider = function (_a) {
4280
4576
  return (jsxs(NavigationLoadingContext.Provider, { value: value, children: [children, jsx(NavigationLoadingOverlay, { isVisible: isVisible })] }));
4281
4577
  };
4282
4578
 
4283
- 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, StepIndicator, Switch as SwitchComponent, Textarea, ThemeContext, ThemePicker, ThemeProvider, TimeInput as TimeInputComponent, ToastContext, UploadFile, VerticalSteps, Wizard, WizardNavigation, WizardSidebar, defaultTranslations$3 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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Content Carousel Component Types
3
+ * Following BeweOS design rules and AuraUI conventions
4
+ */
5
+ /**
6
+ * Translations interface for ContentCarousel component
7
+ * Allows consumers to provide custom translations without imposing a specific i18n system
8
+ */
9
+ export interface ContentCarouselTranslations {
10
+ emptyStateMessage?: string;
11
+ emptyStateButtonText?: string;
12
+ previousButtonLabel?: string;
13
+ nextButtonLabel?: string;
14
+ editButtonLabel?: string;
15
+ deleteButtonLabel?: string;
16
+ publishButtonLabel?: string;
17
+ previewButtonLabel?: string;
18
+ goToItemLabel?: string;
19
+ }
20
+ /**
21
+ * Generic carousel item - minimal required fields
22
+ */
23
+ export interface CarouselItem {
24
+ id: string;
25
+ title: string;
26
+ caption?: string;
27
+ imageUrl?: string;
28
+ gradient: string;
29
+ [key: string]: any;
30
+ }
31
+ /**
32
+ * Props for custom render functions (footer/header)
33
+ */
34
+ export interface CarouselFooterRenderProps {
35
+ item: CarouselItem;
36
+ isHovered: boolean;
37
+ translations: Required<ContentCarouselTranslations>;
38
+ }
39
+ /**
40
+ * Props for the ContentCarousel component (Generic)
41
+ */
42
+ export interface ContentCarouselProps {
43
+ /** Array of items to display in the carousel */
44
+ items: CarouselItem[];
45
+ /** Callback when an item is clicked */
46
+ onItemClick?: (item: CarouselItem) => void;
47
+ /** Additional CSS classes for the container */
48
+ className?: string;
49
+ /** Path to redirect when empty state button is clicked */
50
+ emptyStateRedirectPath?: string;
51
+ /** Translations for all visible text */
52
+ translations?: ContentCarouselTranslations;
53
+ /** Custom footer render function. If provided, renders footer content */
54
+ renderFooter?: (props: CarouselFooterRenderProps) => React.ReactNode;
55
+ /** Custom header render function for content above the body */
56
+ renderHeader?: (props: CarouselFooterRenderProps) => React.ReactNode;
57
+ /** Custom body render function to completely customize card content */
58
+ renderBody?: (item: CarouselItem, isHovered: boolean) => React.ReactNode;
59
+ }
60
+ /**
61
+ * Internal props for individual carousel item component
62
+ * @internal
63
+ */
64
+ export interface CarouselItemComponentProps {
65
+ item: CarouselItem;
66
+ position: "center" | "left" | "right" | "hidden";
67
+ onClick: () => void;
68
+ translations: Required<ContentCarouselTranslations>;
69
+ renderFooter?: (props: CarouselFooterRenderProps) => React.ReactNode;
70
+ renderHeader?: (props: CarouselFooterRenderProps) => React.ReactNode;
71
+ renderBody?: (item: CarouselItem, isHovered: boolean) => React.ReactNode;
72
+ }
73
+ //# sourceMappingURL=ContentCarousel.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentCarousel.types.d.ts","sourceRoot":"","sources":["../../../../src/components/content-carousel/ContentCarousel.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACzC,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,QAAQ,CAAC,2BAA2B,CAAC,CAAC;CACpD;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,gDAAgD;IAChD,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,uCAAuC;IACvC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3C,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wCAAwC;IACxC,YAAY,CAAC,EAAE,2BAA2B,CAAC;IAC3C,yEAAyE;IACzE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,KAAK,CAAC,SAAS,CAAC;IACrE,+DAA+D;IAC/D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,KAAK,CAAC,SAAS,CAAC;IACrE,uEAAuE;IACvE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;CACzE;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IAC1C,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACjD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,EAAE,QAAQ,CAAC,2BAA2B,CAAC,CAAC;IACpD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,KAAK,CAAC,SAAS,CAAC;IACrE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,KAAK,CAAC,SAAS,CAAC;IACrE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;CACzE"}
@@ -0,0 +1,4 @@
1
+ export { ContentCarousel } from "./ContentCarousel.js";
2
+ export type { ContentCarouselProps, ContentCarouselTranslations, CarouselItem, CarouselFooterRenderProps, } from "./ContentCarousel.types.js";
3
+ export * from "./variants/index.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/content-carousel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EACX,oBAAoB,EACpB,2BAA2B,EAC3B,YAAY,EACZ,yBAAyB,GACzB,MAAM,4BAA4B,CAAC;AAGpC,cAAc,qBAAqB,CAAC"}