@moontra/moonui-pro 2.14.1 → 2.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -3,12 +3,12 @@ import { twMerge } from 'tailwind-merge';
3
3
  import * as t from 'react';
4
4
  import t__default, { useState, useRef, useCallback, forwardRef, createContext, useEffect, useMemo, useContext, useLayoutEffect, useDebugValue, Component } from 'react';
5
5
  import * as AccordionPrimitive from '@radix-ui/react-accordion';
6
- import { ChevronDown, Info, AlertCircle, AlertTriangle, Check, X, MoreHorizontal, Loader2, Minus, Search, ChevronRight, Circle, ChevronUp, Lock, Sparkles, Plus, Upload, Play, Eye, CheckCircle2, Pause, RotateCcw, Download, Copy, Share, Trash2, CreditCard, Globe, XCircle, Clock, HelpCircle, ChevronLeft, Calendar as Calendar$1, Edit, MapPin, User, Filter, Move, Archive, EyeOff, Settings, Timer, Palette, ArrowUpDown, FileText, Star, Square, CheckSquare, Bold as Bold$1, Italic as Italic$1, Underline as Underline$1, Strikethrough, Code as Code$1, Type, Heading1, Heading2, Heading3, AlignLeft, AlignCenter, AlignRight, AlignJustify, List, ListOrdered, Quote, Highlighter, Link2, Image as Image$1, Table as Table$1, Undo, Redo, RefreshCw, Wand2, Maximize, Briefcase, MessageSquare, Heart, GraduationCap, Zap, Languages, Lightbulb, TrendingUp, TrendingDown, ZoomOut, ZoomIn, FileSpreadsheet, FileJson, Maximize2, Menu, Bell, CheckCheck, CheckCircle, Settings2, LogOut, Edit3, LayoutGrid, Share2, Save, Video, Music, File, FileDown, ArrowUp, ArrowDown, ChevronsLeft, ChevronsRight, Pin, Sun, Moon, Monitor, Activity, Send, MessageCircle, Tag, MoreVertical, Paperclip, ExternalLink, CalendarIcon, DollarSign, Users, Github, GitFork, Server, RotateCw, Cpu, MemoryStick, HardDrive, Network, BarChart3, Columns, Flag, Grip, Unlock, Minimize2, Map as Map$1, Target, BellOff, ArrowDownRight, ArrowUpRight } from 'lucide-react';
6
+ import { ChevronDown, Info, AlertCircle, AlertTriangle, Check, X, MoreHorizontal, Loader2, Minus, Search, ChevronRight, Circle, ChevronUp, Lock, Sparkles, Plus, Upload, Play, Eye, CheckCircle2, Pause, RotateCcw, Download, Copy, Share, Trash2, CreditCard, Globe, XCircle, Clock, HelpCircle, ChevronLeft, Calendar as Calendar$1, Edit, MapPin, User, Filter, Move, Archive, EyeOff, Settings, Timer, Palette, ArrowUpDown, FileText, Star, Square, CheckSquare, Bold as Bold$1, Italic as Italic$1, Underline as Underline$1, Strikethrough, Code as Code$1, Type, Heading1, Heading2, Heading3, AlignLeft, AlignCenter, AlignRight, AlignJustify, List, ListOrdered, Quote, Highlighter, Link2, Image as Image$1, Table as Table$1, Undo, Redo, RefreshCw, Wand2, Maximize, Briefcase, MessageSquare, Heart, GraduationCap, Zap, Languages, Lightbulb, Target, Repeat, GitBranch, ArrowRight, MoreVertical, Trash, ExternalLink, TrendingUp, MessageCircle, Paperclip, Printer, TrendingDown, ZoomOut, ZoomIn, FileSpreadsheet, FileJson, Maximize2, Menu, Bell, CheckCheck, CheckCircle, Settings2, LogOut, Edit3, LayoutGrid, Share2, Save, Video, Music, File, FileDown, ArrowUp, ArrowDown, ChevronsLeft, ChevronsRight, Pin, Sun, Moon, Monitor, Activity, Send, Tag, Flag, CalendarIcon, DollarSign, Users, Github, GitFork, Server, RotateCw, Cpu, MemoryStick, HardDrive, Network, BarChart3, Columns, Grip, Unlock, Minimize2, Map as Map$1, BellOff, ArrowDownRight, ArrowUpRight } from 'lucide-react';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
8
  import { cva } from 'class-variance-authority';
9
9
  import * as AvatarPrimitive from '@radix-ui/react-avatar';
10
10
  import { format, addMonths, subMonths, startOfMonth, endOfMonth, eachDayOfInterval, getDay, startOfWeek, endOfWeek, isSameMonth, isToday, isSameDay, startOfDay, endOfDay, subDays, formatDistanceToNow } from 'date-fns';
11
- import { motion, AnimatePresence, useMotionValue, useSpring, useTransform, animate, useDragControls } from 'framer-motion';
11
+ import { motion, AnimatePresence, useMotionValue, useSpring, useTransform, animate, Reorder, useDragControls } from 'framer-motion';
12
12
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
13
13
  import * as ReactDOM from 'react-dom';
14
14
  import ReactDOM__default from 'react-dom';
@@ -11243,49 +11243,37 @@ function CardDetailModal({
11243
11243
  });
11244
11244
  };
11245
11245
  return /* @__PURE__ */ jsx(MoonUIDialogPro, { open: isOpen, onOpenChange: onClose, children: /* @__PURE__ */ jsxs(MoonUIDialogContentPro, { className: "max-w-4xl max-h-[90vh] overflow-hidden p-0", children: [
11246
- /* @__PURE__ */ jsx("div", { className: "p-6 pb-0", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between", children: [
11247
- /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
11248
- isEditingTitle ? /* @__PURE__ */ jsx(
11249
- MoonUIInputPro,
11250
- {
11251
- value: card.title,
11252
- onChange: (e) => updateCard({ title: e.target.value }),
11253
- onBlur: () => setIsEditingTitle(false),
11254
- onKeyDown: (e) => {
11255
- if (e.key === "Enter")
11256
- setIsEditingTitle(false);
11257
- if (e.key === "Escape") {
11258
- setCard(initialCard);
11259
- setIsEditingTitle(false);
11260
- }
11261
- },
11262
- className: "text-xl font-semibold",
11263
- autoFocus: true
11264
- }
11265
- ) : /* @__PURE__ */ jsx(
11266
- "h2",
11267
- {
11268
- className: "text-xl font-semibold cursor-pointer hover:bg-muted rounded px-2 -mx-2 py-1",
11269
- onClick: () => setIsEditingTitle(true),
11270
- children: card.title
11271
- }
11272
- ),
11273
- currentColumn && /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground mt-1", children: [
11274
- "in ",
11275
- currentColumn
11276
- ] })
11277
- ] }),
11278
- /* @__PURE__ */ jsx(
11279
- MoonUIButtonPro,
11246
+ /* @__PURE__ */ jsx("div", { className: "p-6 pb-0", children: /* @__PURE__ */ jsx("div", { className: "flex items-start justify-between", children: /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
11247
+ isEditingTitle ? /* @__PURE__ */ jsx(
11248
+ MoonUIInputPro,
11280
11249
  {
11281
- variant: "ghost",
11282
- size: "icon",
11283
- onClick: onClose,
11284
- className: "h-8 w-8",
11285
- children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
11250
+ value: card.title,
11251
+ onChange: (e) => updateCard({ title: e.target.value }),
11252
+ onBlur: () => setIsEditingTitle(false),
11253
+ onKeyDown: (e) => {
11254
+ if (e.key === "Enter")
11255
+ setIsEditingTitle(false);
11256
+ if (e.key === "Escape") {
11257
+ setCard(initialCard);
11258
+ setIsEditingTitle(false);
11259
+ }
11260
+ },
11261
+ className: "text-xl font-semibold",
11262
+ autoFocus: true
11286
11263
  }
11287
- )
11288
- ] }) }),
11264
+ ) : /* @__PURE__ */ jsx(
11265
+ "h2",
11266
+ {
11267
+ className: "text-xl font-semibold cursor-pointer hover:bg-muted rounded px-2 -mx-2 py-1",
11268
+ onClick: () => setIsEditingTitle(true),
11269
+ children: card.title
11270
+ }
11271
+ ),
11272
+ currentColumn && /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground mt-1", children: [
11273
+ "in ",
11274
+ currentColumn
11275
+ ] })
11276
+ ] }) }) }),
11289
11277
  /* @__PURE__ */ jsxs(MoonUITabsPro, { value: selectedTab, onValueChange: setSelectedTab, className: "flex-1", children: [
11290
11278
  /* @__PURE__ */ jsx("div", { className: "px-6 pt-4", children: /* @__PURE__ */ jsxs(MoonUITabsListPro, { children: [
11291
11279
  /* @__PURE__ */ jsx(MoonUITabsTriggerPro, { value: "overview", children: "Overview" }),
@@ -54778,57 +54766,187 @@ var SwipeableCard = t__default.forwardRef(
54778
54766
  }
54779
54767
  );
54780
54768
  SwipeableCard.displayName = "SwipeableCard";
54781
- var EVENT_COLORS2 = {
54769
+ var timelineVariants = cva("w-full", {
54770
+ variants: {
54771
+ theme: {
54772
+ default: "",
54773
+ minimal: "border-0 shadow-none",
54774
+ detailed: "border-2",
54775
+ compact: "p-0"
54776
+ }
54777
+ },
54778
+ defaultVariants: {
54779
+ theme: "default"
54780
+ }
54781
+ });
54782
+ var DEFAULT_COLORS = {
54782
54783
  success: "bg-green-500 border-green-500",
54783
54784
  warning: "bg-yellow-500 border-yellow-500",
54784
54785
  error: "bg-red-500 border-red-500",
54785
54786
  info: "bg-blue-500 border-blue-500",
54786
- pending: "bg-gray-400 border-gray-400"
54787
+ pending: "bg-gray-400 border-gray-400",
54788
+ milestone: "bg-purple-500 border-purple-500",
54789
+ custom: "bg-slate-500 border-slate-500"
54787
54790
  };
54788
- var EVENT_ICONS = {
54791
+ var DEFAULT_ICONS = {
54789
54792
  success: /* @__PURE__ */ jsx(CheckCircle2, { className: "h-4 w-4 text-white" }),
54790
54793
  warning: /* @__PURE__ */ jsx(AlertCircle, { className: "h-4 w-4 text-white" }),
54791
54794
  error: /* @__PURE__ */ jsx(XCircle, { className: "h-4 w-4 text-white" }),
54792
54795
  info: /* @__PURE__ */ jsx(Circle, { className: "h-4 w-4 text-white" }),
54793
- pending: /* @__PURE__ */ jsx(Clock, { className: "h-4 w-4 text-white" })
54796
+ pending: /* @__PURE__ */ jsx(Clock, { className: "h-4 w-4 text-white" }),
54797
+ milestone: /* @__PURE__ */ jsx(Flag, { className: "h-4 w-4 text-white" }),
54798
+ custom: /* @__PURE__ */ jsx(Sparkles, { className: "h-4 w-4 text-white" })
54794
54799
  };
54795
- var EVENT_TEXT_COLORS = {
54796
- success: "text-green-700",
54797
- warning: "text-yellow-700",
54798
- error: "text-red-700",
54799
- info: "text-blue-700",
54800
- pending: "text-gray-700"
54800
+ var TEXT_COLORS = {
54801
+ success: "text-green-700 dark:text-green-400",
54802
+ warning: "text-yellow-700 dark:text-yellow-400",
54803
+ error: "text-red-700 dark:text-red-400",
54804
+ info: "text-blue-700 dark:text-blue-400",
54805
+ pending: "text-gray-700 dark:text-gray-400",
54806
+ milestone: "text-purple-700 dark:text-purple-400",
54807
+ custom: "text-slate-700 dark:text-slate-400"
54808
+ };
54809
+ var animationVariants = {
54810
+ fade: {
54811
+ initial: { opacity: 0 },
54812
+ animate: { opacity: 1 },
54813
+ exit: { opacity: 0 }
54814
+ },
54815
+ slide: {
54816
+ initial: { opacity: 0, x: -20 },
54817
+ animate: { opacity: 1, x: 0 },
54818
+ exit: { opacity: 0, x: 20 }
54819
+ },
54820
+ scale: {
54821
+ initial: { opacity: 0, scale: 0.8 },
54822
+ animate: { opacity: 1, scale: 1 },
54823
+ exit: { opacity: 0, scale: 0.8 }
54824
+ }
54801
54825
  };
54802
54826
  function Timeline({
54803
- events,
54827
+ events: initialEvents,
54804
54828
  onEventClick,
54829
+ onEventEdit,
54830
+ onEventDelete,
54831
+ onEventsReorder,
54805
54832
  className,
54833
+ layout = "vertical",
54834
+ theme = "default",
54835
+ animation = "fade",
54836
+ groupBy = "none",
54806
54837
  showUserInfo = true,
54807
54838
  showMetadata = true,
54808
54839
  showRelativeTime = true,
54809
- groupByDate = false,
54810
- orientation = "vertical",
54811
- compact = false,
54812
- interactive = true
54840
+ showSearch = true,
54841
+ showFilter = true,
54842
+ showExport = true,
54843
+ eventRenderer,
54844
+ connectorRenderer,
54845
+ iconRenderer,
54846
+ colorScheme = DEFAULT_COLORS,
54847
+ draggable = false,
54848
+ expandable = true,
54849
+ editable = false,
54850
+ selectable = false,
54851
+ virtualScroll = false,
54852
+ maxEventsPerGroup = 20,
54853
+ printMode = false,
54854
+ compactMode = false,
54855
+ parallaxEffect = false,
54856
+ gradientConnectors = false,
54857
+ animatedProgress = false,
54858
+ ariaLabel = "Timeline of events",
54859
+ keyboardNavigation = true,
54860
+ ...props
54813
54861
  }) {
54814
- const sortedEvents = [...events].sort((a, b) => b.date.getTime() - a.date.getTime());
54815
- const formatDate2 = (date) => {
54862
+ const [events, setEvents] = useState(initialEvents);
54863
+ const [searchQuery, setSearchQuery] = useState("");
54864
+ const [filterType, setFilterType] = useState("all");
54865
+ const [selectedEvents, setSelectedEvents] = useState(/* @__PURE__ */ new Set());
54866
+ const [expandedEvents, setExpandedEvents] = useState(/* @__PURE__ */ new Set());
54867
+ const [focusedEventId, setFocusedEventId] = useState(null);
54868
+ const timelineRef = useRef(null);
54869
+ const eventRefs = useRef(/* @__PURE__ */ new Map());
54870
+ useEffect(() => {
54871
+ setEvents(initialEvents);
54872
+ }, [initialEvents]);
54873
+ useEffect(() => {
54874
+ if (!keyboardNavigation)
54875
+ return;
54876
+ const handleKeyDown3 = (e) => {
54877
+ const currentIndex = events.findIndex((event) => event.id === focusedEventId);
54878
+ switch (e.key) {
54879
+ case "ArrowDown":
54880
+ case "ArrowRight":
54881
+ e.preventDefault();
54882
+ if (currentIndex < events.length - 1) {
54883
+ const nextEvent = events[currentIndex + 1];
54884
+ setFocusedEventId(nextEvent.id);
54885
+ eventRefs.current.get(nextEvent.id)?.focus();
54886
+ }
54887
+ break;
54888
+ case "ArrowUp":
54889
+ case "ArrowLeft":
54890
+ e.preventDefault();
54891
+ if (currentIndex > 0) {
54892
+ const prevEvent = events[currentIndex - 1];
54893
+ setFocusedEventId(prevEvent.id);
54894
+ eventRefs.current.get(prevEvent.id)?.focus();
54895
+ }
54896
+ break;
54897
+ case "Enter":
54898
+ case " ":
54899
+ e.preventDefault();
54900
+ if (focusedEventId) {
54901
+ const event = events.find((e2) => e2.id === focusedEventId);
54902
+ if (event && onEventClick) {
54903
+ onEventClick(event);
54904
+ }
54905
+ }
54906
+ break;
54907
+ case "Delete":
54908
+ if (editable && focusedEventId && onEventDelete) {
54909
+ const event = events.find((e2) => e2.id === focusedEventId);
54910
+ if (event) {
54911
+ onEventDelete(event);
54912
+ }
54913
+ }
54914
+ break;
54915
+ }
54916
+ };
54917
+ timelineRef.current?.addEventListener("keydown", handleKeyDown3);
54918
+ return () => timelineRef.current?.removeEventListener("keydown", handleKeyDown3);
54919
+ }, [keyboardNavigation, events, focusedEventId, onEventClick, onEventDelete, editable]);
54920
+ const formatDate2 = useCallback((date) => {
54816
54921
  return date.toLocaleDateString("en-US", {
54817
54922
  year: "numeric",
54818
54923
  month: "long",
54819
54924
  day: "numeric"
54820
54925
  });
54821
- };
54822
- const formatTime2 = (date) => {
54926
+ }, []);
54927
+ const formatTime2 = useCallback((date) => {
54823
54928
  return date.toLocaleTimeString("en-US", {
54824
54929
  hour: "2-digit",
54825
54930
  minute: "2-digit",
54826
54931
  hour12: true
54827
54932
  });
54828
- };
54829
- const getRelativeTime = (date) => {
54933
+ }, []);
54934
+ const getRelativeTime = useCallback((date) => {
54830
54935
  const now = /* @__PURE__ */ new Date();
54831
54936
  const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1e3);
54937
+ if (diffInSeconds < 0) {
54938
+ const futureDiff = Math.abs(diffInSeconds);
54939
+ if (futureDiff < 3600) {
54940
+ const minutes = Math.floor(futureDiff / 60);
54941
+ return `In ${minutes} minute${minutes !== 1 ? "s" : ""}`;
54942
+ } else if (futureDiff < 86400) {
54943
+ const hours = Math.floor(futureDiff / 3600);
54944
+ return `In ${hours} hour${hours !== 1 ? "s" : ""}`;
54945
+ } else {
54946
+ const days = Math.floor(futureDiff / 86400);
54947
+ return `In ${days} day${days !== 1 ? "s" : ""}`;
54948
+ }
54949
+ }
54832
54950
  if (diffInSeconds < 60) {
54833
54951
  return "Just now";
54834
54952
  } else if (diffInSeconds < 3600) {
@@ -54837,76 +54955,291 @@ function Timeline({
54837
54955
  } else if (diffInSeconds < 86400) {
54838
54956
  const hours = Math.floor(diffInSeconds / 3600);
54839
54957
  return `${hours} hour${hours > 1 ? "s" : ""} ago`;
54840
- } else if (diffInSeconds < 2592e3) {
54958
+ } else if (diffInSeconds < 604800) {
54841
54959
  const days = Math.floor(diffInSeconds / 86400);
54842
54960
  return `${days} day${days > 1 ? "s" : ""} ago`;
54843
54961
  } else {
54844
54962
  return formatDate2(date);
54845
54963
  }
54846
- };
54847
- const getInitials4 = (name) => {
54848
- return name.split(" ").map((n) => n[0]).join("").toUpperCase();
54849
- };
54850
- const groupEventsByDate = (events2) => {
54964
+ }, [formatDate2]);
54965
+ const getInitials4 = useCallback((name) => {
54966
+ return name.split(" ").map((n) => n[0]).join("").toUpperCase().slice(0, 2);
54967
+ }, []);
54968
+ const groupEventsByDate = useCallback((events2) => {
54851
54969
  const groups = {};
54852
54970
  events2.forEach((event) => {
54853
- const dateKey = formatDate2(event.date);
54971
+ let dateKey;
54972
+ switch (groupBy) {
54973
+ case "week":
54974
+ const weekStart = new Date(event.date);
54975
+ weekStart.setDate(weekStart.getDate() - weekStart.getDay());
54976
+ dateKey = `Week of ${formatDate2(weekStart)}`;
54977
+ break;
54978
+ case "month":
54979
+ dateKey = event.date.toLocaleDateString("en-US", { year: "numeric", month: "long" });
54980
+ break;
54981
+ case "year":
54982
+ dateKey = event.date.getFullYear().toString();
54983
+ break;
54984
+ case "date":
54985
+ default:
54986
+ dateKey = formatDate2(event.date);
54987
+ }
54854
54988
  if (!groups[dateKey]) {
54855
54989
  groups[dateKey] = [];
54856
54990
  }
54857
54991
  groups[dateKey].push(event);
54858
54992
  });
54859
54993
  return groups;
54860
- };
54861
- const handleEventClick = (event) => {
54862
- if (interactive && onEventClick) {
54863
- onEventClick(event);
54994
+ }, [groupBy, formatDate2]);
54995
+ const filteredAndSortedEvents = useMemo(() => {
54996
+ let filtered = [...events];
54997
+ if (searchQuery) {
54998
+ filtered = filtered.filter(
54999
+ (event) => event.title.toLowerCase().includes(searchQuery.toLowerCase()) || event.description?.toLowerCase().includes(searchQuery.toLowerCase()) || event.metadata?.tags?.some((tag) => tag.toLowerCase().includes(searchQuery.toLowerCase()))
55000
+ );
54864
55001
  }
54865
- };
54866
- const renderEvent = (event, index2, isLast) => {
54867
- const eventColor = event.color || EVENT_COLORS2[event.type];
54868
- const eventIcon = event.icon || EVENT_ICONS[event.type];
54869
- const textColor = EVENT_TEXT_COLORS[event.type];
54870
- return /* @__PURE__ */ jsxs(
55002
+ if (filterType !== "all") {
55003
+ filtered = filtered.filter((event) => event.type === filterType);
55004
+ }
55005
+ return filtered.sort((a, b) => b.date.getTime() - a.date.getTime());
55006
+ }, [events, searchQuery, filterType]);
55007
+ const handleEventClick = useCallback((event) => {
55008
+ if (selectable) {
55009
+ setSelectedEvents((prev) => {
55010
+ const newSet = new Set(prev);
55011
+ if (newSet.has(event.id)) {
55012
+ newSet.delete(event.id);
55013
+ } else {
55014
+ newSet.add(event.id);
55015
+ }
55016
+ return newSet;
55017
+ });
55018
+ }
55019
+ if (expandable && "subEvents" in event) {
55020
+ setExpandedEvents((prev) => {
55021
+ const newSet = new Set(prev);
55022
+ if (newSet.has(event.id)) {
55023
+ newSet.delete(event.id);
55024
+ } else {
55025
+ newSet.add(event.id);
55026
+ }
55027
+ return newSet;
55028
+ });
55029
+ }
55030
+ onEventClick?.(event);
55031
+ }, [selectable, expandable, onEventClick]);
55032
+ const handleExport = useCallback(() => {
55033
+ const dataStr = JSON.stringify(filteredAndSortedEvents, null, 2);
55034
+ const dataUri = "data:application/json;charset=utf-8," + encodeURIComponent(dataStr);
55035
+ const exportFileDefaultName = `timeline-export-${( new Date()).toISOString()}.json`;
55036
+ const linkElement = document.createElement("a");
55037
+ linkElement.setAttribute("href", dataUri);
55038
+ linkElement.setAttribute("download", exportFileDefaultName);
55039
+ linkElement.click();
55040
+ }, [filteredAndSortedEvents]);
55041
+ const handlePrint = useCallback(() => {
55042
+ window.print();
55043
+ }, []);
55044
+ const renderEventIcon = useCallback((event) => {
55045
+ if (iconRenderer) {
55046
+ return iconRenderer(event);
55047
+ }
55048
+ if (event.icon) {
55049
+ return event.icon;
55050
+ }
55051
+ if ("milestone" in event) {
55052
+ return /* @__PURE__ */ jsx(Target, { className: "h-4 w-4 text-white" });
55053
+ }
55054
+ if ("recurrence" in event) {
55055
+ return /* @__PURE__ */ jsx(Repeat, { className: "h-4 w-4 text-white" });
55056
+ }
55057
+ if ("subEvents" in event) {
55058
+ return /* @__PURE__ */ jsx(GitBranch, { className: "h-4 w-4 text-white" });
55059
+ }
55060
+ return DEFAULT_ICONS[event.type] || DEFAULT_ICONS.custom;
55061
+ }, [iconRenderer]);
55062
+ const renderConnector = useCallback((fromEvent, toEvent, isLast) => {
55063
+ if (connectorRenderer) {
55064
+ return connectorRenderer(fromEvent, toEvent);
55065
+ }
55066
+ if (isLast)
55067
+ return null;
55068
+ const baseClasses = cn(
55069
+ "absolute",
55070
+ layout === "horizontal" ? "h-0.5 top-4" : "w-0.5 left-4 -ml-px",
55071
+ gradientConnectors && "bg-gradient-to-b from-border to-transparent"
55072
+ );
55073
+ if (layout === "horizontal") {
55074
+ return /* @__PURE__ */ jsx("div", { className: cn(baseClasses, "bg-border"), style: { width: "100px" } });
55075
+ }
55076
+ return /* @__PURE__ */ jsx(
55077
+ "div",
55078
+ {
55079
+ className: cn(
55080
+ baseClasses,
55081
+ "bg-border",
55082
+ layout === "alternating" && "hidden"
55083
+ ),
55084
+ style: {
55085
+ height: "calc(100% + 2rem)",
55086
+ top: "2rem"
55087
+ }
55088
+ }
55089
+ );
55090
+ }, [connectorRenderer, layout, gradientConnectors]);
55091
+ const renderEvent = useCallback((event, index2, isLast = false) => {
55092
+ const eventColor = event.color || colorScheme[event.type] || DEFAULT_COLORS[event.type];
55093
+ TEXT_COLORS[event.type] || TEXT_COLORS.custom;
55094
+ const isSelected = selectedEvents.has(event.id);
55095
+ const isExpanded = expandedEvents.has(event.id);
55096
+ const isFocused = focusedEventId === event.id;
55097
+ if (eventRenderer) {
55098
+ return eventRenderer(event, index2);
55099
+ }
55100
+ const isRangeEvent = "endDate" in event;
55101
+ const isNestedEvent = "subEvents" in event;
55102
+ const isMilestoneEvent = "milestone" in event;
55103
+ const eventContent = /* @__PURE__ */ jsxs(
54871
55104
  "div",
54872
55105
  {
55106
+ ref: (el) => {
55107
+ if (el)
55108
+ eventRefs.current.set(event.id, el);
55109
+ },
55110
+ tabIndex: keyboardNavigation ? 0 : -1,
54873
55111
  className: cn(
54874
55112
  "relative flex gap-4",
54875
- compact ? "pb-4" : "pb-8",
54876
- interactive && "cursor-pointer hover:bg-muted/50 rounded-lg p-2 -m-2 transition-colors"
55113
+ compactMode ? "pb-2" : "pb-8",
55114
+ layout === "alternating" && index2 % 2 === 0 && "flex-row-reverse",
55115
+ layout === "horizontal" && "flex-col items-center",
55116
+ "cursor-pointer rounded-lg p-3 -m-1 transition-all duration-200",
55117
+ "hover:bg-muted/50 focus:outline-none focus:ring-2 focus:ring-ring",
55118
+ isSelected && "bg-muted/70",
55119
+ isFocused && "ring-2 ring-ring",
55120
+ printMode && "print:break-inside-avoid"
54877
55121
  ),
54878
55122
  onClick: () => handleEventClick(event),
55123
+ onFocus: () => setFocusedEventId(event.id),
55124
+ role: "button",
55125
+ "aria-label": `Event: ${event.title}`,
55126
+ "aria-expanded": isNestedEvent ? isExpanded : void 0,
54879
55127
  children: [
54880
- orientation === "vertical" && /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
54881
- /* @__PURE__ */ jsx("div", { className: cn(
54882
- "flex items-center justify-center w-8 h-8 rounded-full border-2 bg-background",
54883
- eventColor
54884
- ), children: eventIcon }),
54885
- !isLast && /* @__PURE__ */ jsx("div", { className: "w-0.5 h-full bg-border mt-2" })
55128
+ /* @__PURE__ */ jsxs("div", { className: cn(
55129
+ "flex flex-col items-center",
55130
+ layout === "horizontal" && "flex-row"
55131
+ ), children: [
55132
+ /* @__PURE__ */ jsx(
55133
+ motion.div,
55134
+ {
55135
+ className: cn(
55136
+ "flex items-center justify-center rounded-full border-2 bg-background z-10",
55137
+ isMilestoneEvent ? "w-10 h-10" : "w-8 h-8",
55138
+ eventColor,
55139
+ isSelected && "ring-2 ring-ring ring-offset-2"
55140
+ ),
55141
+ whileHover: { scale: 1.1 },
55142
+ whileTap: { scale: 0.95 },
55143
+ children: renderEventIcon(event)
55144
+ }
55145
+ ),
55146
+ !isLast && renderConnector(event, events[index2 + 1], isLast)
54886
55147
  ] }),
54887
- /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
54888
- /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-2", children: [
55148
+ /* @__PURE__ */ jsxs("div", { className: cn(
55149
+ "flex-1 min-w-0",
55150
+ layout === "alternating" && index2 % 2 === 0 && "text-right"
55151
+ ), children: [
55152
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-2 mb-2", children: [
54889
55153
  /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
54890
- /* @__PURE__ */ jsx("h4", { className: cn(
54891
- "font-medium text-sm",
54892
- compact ? "mb-1" : "mb-2"
54893
- ), children: event.title }),
54894
- event.description && /* @__PURE__ */ jsx("p", { className: cn(
54895
- "text-muted-foreground text-sm",
54896
- compact ? "mb-1" : "mb-2"
54897
- ), children: event.description })
55154
+ /* @__PURE__ */ jsxs("h4", { className: cn(
55155
+ "font-semibold",
55156
+ compactMode ? "text-sm" : "text-base",
55157
+ isMilestoneEvent && "text-lg"
55158
+ ), children: [
55159
+ event.title,
55160
+ isMilestoneEvent && /* @__PURE__ */ jsx(MoonUIBadgePro, { variant: "secondary", className: "ml-2 bg-purple-500", children: "Milestone" })
55161
+ ] }),
55162
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mt-1 text-xs text-muted-foreground", children: [
55163
+ /* @__PURE__ */ jsx(Clock, { className: "h-3 w-3" }),
55164
+ showRelativeTime ? /* @__PURE__ */ jsx("span", { children: getRelativeTime(event.date) }) : /* @__PURE__ */ jsx("span", { children: formatTime2(event.date) }),
55165
+ isRangeEvent && /* @__PURE__ */ jsxs(Fragment, { children: [
55166
+ /* @__PURE__ */ jsx(ArrowRight, { className: "h-3 w-3" }),
55167
+ /* @__PURE__ */ jsx("span", { children: formatTime2(event.endDate) })
55168
+ ] })
55169
+ ] })
55170
+ ] }),
55171
+ (editable || event.metadata?.externalLink) && /* @__PURE__ */ jsxs(MoonUIDropdownMenuPro, { children: [
55172
+ /* @__PURE__ */ jsx(MoonUIDropdownMenuTriggerPro, { asChild: true, children: /* @__PURE__ */ jsx(MoonUIButtonPro, { variant: "ghost", size: "sm", className: "h-8 w-8 p-0", children: /* @__PURE__ */ jsx(MoreVertical, { className: "h-4 w-4" }) }) }),
55173
+ /* @__PURE__ */ jsxs(MoonUIDropdownMenuContentPro, { align: "end", children: [
55174
+ editable && /* @__PURE__ */ jsxs(Fragment, { children: [
55175
+ /* @__PURE__ */ jsxs(MoonUIDropdownMenuItemPro, { onClick: () => onEventEdit?.(event), children: [
55176
+ /* @__PURE__ */ jsx(Edit, { className: "mr-2 h-4 w-4" }),
55177
+ "Edit"
55178
+ ] }),
55179
+ /* @__PURE__ */ jsxs(MoonUIDropdownMenuItemPro, { onClick: () => onEventDelete?.(event), children: [
55180
+ /* @__PURE__ */ jsx(Trash, { className: "mr-2 h-4 w-4" }),
55181
+ "Delete"
55182
+ ] }),
55183
+ /* @__PURE__ */ jsx(MoonUIDropdownMenuSeparatorPro, {})
55184
+ ] }),
55185
+ /* @__PURE__ */ jsxs(MoonUIDropdownMenuItemPro, { onClick: () => navigator.clipboard.writeText(event.title), children: [
55186
+ /* @__PURE__ */ jsx(Copy, { className: "mr-2 h-4 w-4" }),
55187
+ "Copy"
55188
+ ] }),
55189
+ /* @__PURE__ */ jsxs(MoonUIDropdownMenuItemPro, { children: [
55190
+ /* @__PURE__ */ jsx(Share, { className: "mr-2 h-4 w-4" }),
55191
+ "Share"
55192
+ ] }),
55193
+ event.metadata?.externalLink && /* @__PURE__ */ jsxs(MoonUIDropdownMenuItemPro, { onClick: () => window.open(event.metadata?.externalLink, "_blank"), children: [
55194
+ /* @__PURE__ */ jsx(ExternalLink, { className: "mr-2 h-4 w-4" }),
55195
+ "View Details"
55196
+ ] })
55197
+ ] })
55198
+ ] })
55199
+ ] }),
55200
+ event.description && /* @__PURE__ */ jsx("p", { className: cn(
55201
+ "text-muted-foreground mb-2",
55202
+ compactMode ? "text-xs" : "text-sm"
55203
+ ), children: event.description }),
55204
+ isMilestoneEvent && event.milestone && /* @__PURE__ */ jsxs("div", { className: "bg-purple-50 dark:bg-purple-950/20 rounded-md p-3 mb-2", children: [
55205
+ event.milestone.target && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
55206
+ /* @__PURE__ */ jsx(Target, { className: "h-4 w-4 text-purple-600" }),
55207
+ /* @__PURE__ */ jsx("span", { className: "font-medium", children: "Target:" }),
55208
+ /* @__PURE__ */ jsx("span", { children: event.milestone.target })
54898
55209
  ] }),
54899
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground", children: [
54900
- showRelativeTime ? /* @__PURE__ */ jsx("span", { children: getRelativeTime(event.date) }) : /* @__PURE__ */ jsx("span", { children: formatTime2(event.date) }),
54901
- /* @__PURE__ */ jsx(MoonUIBadgePro, { variant: "outline", className: cn("text-xs", textColor), children: event.type })
55210
+ event.milestone.achievement && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm mt-1", children: [
55211
+ /* @__PURE__ */ jsx(TrendingUp, { className: "h-4 w-4 text-purple-600" }),
55212
+ /* @__PURE__ */ jsx("span", { className: "font-medium", children: "Achievement:" }),
55213
+ /* @__PURE__ */ jsx("span", { children: event.milestone.achievement })
54902
55214
  ] })
54903
55215
  ] }),
55216
+ event.metadata?.progress !== void 0 && /* @__PURE__ */ jsxs("div", { className: "mb-2", children: [
55217
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-xs mb-1", children: [
55218
+ /* @__PURE__ */ jsx("span", { children: "Progress" }),
55219
+ /* @__PURE__ */ jsxs("span", { children: [
55220
+ event.metadata.progress,
55221
+ "%"
55222
+ ] })
55223
+ ] }),
55224
+ /* @__PURE__ */ jsx("div", { className: "w-full bg-muted rounded-full h-2 overflow-hidden", children: /* @__PURE__ */ jsx(
55225
+ motion.div,
55226
+ {
55227
+ className: "h-full bg-primary",
55228
+ initial: { width: 0 },
55229
+ animate: { width: `${event.metadata.progress}%` },
55230
+ transition: { duration: 0.5, ease: "easeOut" }
55231
+ }
55232
+ ) })
55233
+ ] }),
54904
55234
  showUserInfo && event.user && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-2", children: [
54905
55235
  /* @__PURE__ */ jsxs(MoonUIAvatarPro, { className: "h-6 w-6", children: [
54906
55236
  /* @__PURE__ */ jsx(MoonUIAvatarImagePro, { src: event.user.avatar }),
54907
55237
  /* @__PURE__ */ jsx(MoonUIAvatarFallbackPro, { className: "text-xs", children: getInitials4(event.user.name) })
54908
55238
  ] }),
54909
- /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: event.user.name })
55239
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
55240
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: event.user.name }),
55241
+ event.user.role && /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: event.user.role })
55242
+ ] })
54910
55243
  ] }),
54911
55244
  showMetadata && event.metadata && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3 text-xs text-muted-foreground", children: [
54912
55245
  event.metadata.duration && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
@@ -54917,56 +55250,292 @@ function Timeline({
54917
55250
  /* @__PURE__ */ jsx(Calendar$1, { className: "h-3 w-3" }),
54918
55251
  /* @__PURE__ */ jsx("span", { children: event.metadata.location })
54919
55252
  ] }),
54920
- event.metadata.comments && event.metadata.comments > 0 && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
55253
+ event.metadata.comments !== void 0 && event.metadata.comments > 0 && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
54921
55254
  /* @__PURE__ */ jsx(MessageCircle, { className: "h-3 w-3" }),
54922
55255
  /* @__PURE__ */ jsx("span", { children: event.metadata.comments })
54923
55256
  ] }),
54924
- event.metadata.attachments && event.metadata.attachments > 0 && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
55257
+ event.metadata.attachments !== void 0 && event.metadata.attachments > 0 && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
54925
55258
  /* @__PURE__ */ jsx(Paperclip, { className: "h-3 w-3" }),
54926
55259
  /* @__PURE__ */ jsx("span", { children: event.metadata.attachments })
54927
55260
  ] }),
54928
- event.metadata.externalLink && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
54929
- /* @__PURE__ */ jsx(ExternalLink, { className: "h-3 w-3" }),
54930
- /* @__PURE__ */ jsx("span", { children: "View details" })
54931
- ] })
55261
+ event.metadata.priority && /* @__PURE__ */ jsx(
55262
+ MoonUIBadgePro,
55263
+ {
55264
+ variant: event.metadata.priority === "high" ? "destructive" : event.metadata.priority === "medium" ? "outline" : "secondary",
55265
+ className: "text-xs",
55266
+ children: event.metadata.priority
55267
+ }
55268
+ )
54932
55269
  ] }),
54933
- event.metadata?.tags && event.metadata.tags.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1 mt-2", children: event.metadata.tags.map((tag, tagIndex) => /* @__PURE__ */ jsx(MoonUIBadgePro, { variant: "secondary", className: "text-xs", children: tag }, tagIndex)) })
55270
+ event.metadata?.tags && event.metadata.tags.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1 mt-2", children: event.metadata.tags.map((tag, tagIndex) => /* @__PURE__ */ jsx(MoonUIBadgePro, { variant: "outline", className: "text-xs", children: tag }, tagIndex)) }),
55271
+ isNestedEvent && isExpanded && event.subEvents && /* @__PURE__ */ jsx("div", { className: "mt-3 ml-4 pl-4 border-l-2 border-muted", children: event.subEvents.map((subEvent, subIndex) => /* @__PURE__ */ jsx("div", { className: "mb-2 last:mb-0", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2", children: [
55272
+ /* @__PURE__ */ jsx("div", { className: cn(
55273
+ "w-2 h-2 rounded-full mt-1.5",
55274
+ colorScheme[subEvent.type] || DEFAULT_COLORS[subEvent.type]
55275
+ ) }),
55276
+ /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
55277
+ /* @__PURE__ */ jsx("h5", { className: "text-sm font-medium", children: subEvent.title }),
55278
+ subEvent.description && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: subEvent.description }),
55279
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: getRelativeTime(subEvent.date) })
55280
+ ] })
55281
+ ] }) }, subEvent.id)) }),
55282
+ isNestedEvent && event.subEvents && event.subEvents.length > 0 && /* @__PURE__ */ jsx(
55283
+ MoonUIButtonPro,
55284
+ {
55285
+ variant: "ghost",
55286
+ size: "sm",
55287
+ className: "mt-2 h-6 text-xs",
55288
+ onClick: (e) => {
55289
+ e.stopPropagation();
55290
+ setExpandedEvents((prev) => {
55291
+ const newSet = new Set(prev);
55292
+ if (newSet.has(event.id)) {
55293
+ newSet.delete(event.id);
55294
+ } else {
55295
+ newSet.add(event.id);
55296
+ }
55297
+ return newSet;
55298
+ });
55299
+ },
55300
+ children: isExpanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
55301
+ /* @__PURE__ */ jsx(ChevronDown, { className: "mr-1 h-3 w-3" }),
55302
+ "Hide ",
55303
+ event.subEvents.length,
55304
+ " sub-events"
55305
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
55306
+ /* @__PURE__ */ jsx(ChevronRight, { className: "mr-1 h-3 w-3" }),
55307
+ "Show ",
55308
+ event.subEvents.length,
55309
+ " sub-events"
55310
+ ] })
55311
+ }
55312
+ )
54934
55313
  ] })
54935
55314
  ]
55315
+ }
55316
+ );
55317
+ if (draggable && onEventsReorder) {
55318
+ return /* @__PURE__ */ jsx(
55319
+ Reorder.Item,
55320
+ {
55321
+ value: event,
55322
+ dragListener: false,
55323
+ dragControls: void 0,
55324
+ children: eventContent
55325
+ },
55326
+ event.id
55327
+ );
55328
+ }
55329
+ const variants = animation !== "none" ? animationVariants[animation] : void 0;
55330
+ return /* @__PURE__ */ jsx(
55331
+ motion.div,
55332
+ {
55333
+ variants,
55334
+ initial: variants?.initial,
55335
+ animate: variants?.animate,
55336
+ exit: variants?.exit,
55337
+ transition: { duration: 0.3, delay: index2 * 0.05 },
55338
+ children: eventContent
54936
55339
  },
54937
55340
  event.id
54938
55341
  );
54939
- };
54940
- const renderGroupedEvents = () => {
54941
- const groups = groupEventsByDate(sortedEvents);
54942
- return Object.entries(groups).map(([date, events2], groupIndex) => /* @__PURE__ */ jsxs("div", { className: "mb-8", children: [
54943
- /* @__PURE__ */ jsx("div", { className: "sticky top-0 bg-background/80 backdrop-blur-sm border-b p-2 mb-4", children: /* @__PURE__ */ jsx("h3", { className: "font-medium text-sm text-muted-foreground", children: date }) }),
54944
- events2.map((event, index2) => renderEvent(event, index2, index2 === events2.length - 1))
54945
- ] }, date));
54946
- };
54947
- return /* @__PURE__ */ jsxs(MoonUICardPro, { className: cn("w-full", className), children: [
54948
- /* @__PURE__ */ jsxs(MoonUICardHeaderPro, { children: [
54949
- /* @__PURE__ */ jsxs(MoonUICardTitlePro, { className: "flex items-center gap-2", children: [
54950
- /* @__PURE__ */ jsx(Clock, { className: "h-5 w-5" }),
54951
- "Timeline"
54952
- ] }),
54953
- /* @__PURE__ */ jsxs(MoonUICardDescriptionPro, { children: [
54954
- sortedEvents.length,
54955
- " event",
54956
- sortedEvents.length !== 1 ? "s" : "",
54957
- " tracked"
54958
- ] })
54959
- ] }),
54960
- /* @__PURE__ */ jsx(MoonUICardContentPro, { children: sortedEvents.length > 0 ? /* @__PURE__ */ jsx("div", { className: cn(
55342
+ }, [
55343
+ eventRenderer,
55344
+ colorScheme,
55345
+ selectedEvents,
55346
+ expandedEvents,
55347
+ focusedEventId,
55348
+ keyboardNavigation,
55349
+ layout,
55350
+ compactMode,
55351
+ printMode,
55352
+ handleEventClick,
55353
+ renderEventIcon,
55354
+ renderConnector,
55355
+ events,
55356
+ showRelativeTime,
55357
+ getRelativeTime,
55358
+ formatTime2,
55359
+ editable,
55360
+ onEventEdit,
55361
+ onEventDelete,
55362
+ showUserInfo,
55363
+ getInitials4,
55364
+ showMetadata,
55365
+ draggable,
55366
+ onEventsReorder,
55367
+ animation
55368
+ ]);
55369
+ const renderGroupedEvents = useCallback(() => {
55370
+ const groups = groupEventsByDate(filteredAndSortedEvents);
55371
+ return Object.entries(groups).map(([dateGroup, groupEvents], groupIndex) => {
55372
+ const displayEvents = maxEventsPerGroup ? groupEvents.slice(0, maxEventsPerGroup) : groupEvents;
55373
+ const remainingCount = groupEvents.length - displayEvents.length;
55374
+ return /* @__PURE__ */ jsxs("div", { className: "mb-8", children: [
55375
+ /* @__PURE__ */ jsx("div", { className: cn(
55376
+ "sticky top-0 z-20 bg-background/80 backdrop-blur-sm border-b p-3 mb-4 -mx-6 px-6",
55377
+ printMode && "print:relative print:bg-transparent"
55378
+ ), children: /* @__PURE__ */ jsxs("h3", { className: "font-semibold text-sm text-muted-foreground flex items-center justify-between", children: [
55379
+ /* @__PURE__ */ jsx("span", { children: dateGroup }),
55380
+ /* @__PURE__ */ jsxs(MoonUIBadgePro, { variant: "secondary", className: "text-xs", children: [
55381
+ groupEvents.length,
55382
+ " event",
55383
+ groupEvents.length !== 1 ? "s" : ""
55384
+ ] })
55385
+ ] }) }),
55386
+ /* @__PURE__ */ jsx(AnimatePresence, { mode: "popLayout", children: displayEvents.map(
55387
+ (event, index2) => renderEvent(event, index2, index2 === displayEvents.length - 1)
55388
+ ) }),
55389
+ remainingCount > 0 && /* @__PURE__ */ jsxs(
55390
+ MoonUIButtonPro,
55391
+ {
55392
+ variant: "ghost",
55393
+ size: "sm",
55394
+ className: "w-full mt-2",
55395
+ onClick: () => {
55396
+ console.log(`Show ${remainingCount} more events`);
55397
+ },
55398
+ children: [
55399
+ "Show ",
55400
+ remainingCount,
55401
+ " more event",
55402
+ remainingCount !== 1 ? "s" : ""
55403
+ ]
55404
+ }
55405
+ )
55406
+ ] }, dateGroup);
55407
+ });
55408
+ }, [groupEventsByDate, filteredAndSortedEvents, maxEventsPerGroup, printMode, renderEvent]);
55409
+ const renderTimeline = () => {
55410
+ const content = groupBy !== "none" ? renderGroupedEvents() : /* @__PURE__ */ jsx(AnimatePresence, { mode: "popLayout", children: draggable && onEventsReorder ? /* @__PURE__ */ jsx(
55411
+ Reorder.Group,
55412
+ {
55413
+ axis: layout === "horizontal" ? "x" : "y",
55414
+ values: filteredAndSortedEvents,
55415
+ onReorder: (newOrder) => {
55416
+ setEvents(newOrder);
55417
+ onEventsReorder(newOrder);
55418
+ },
55419
+ className: cn(
55420
+ "space-y-0",
55421
+ layout === "horizontal" && "flex overflow-x-auto gap-6 pb-4"
55422
+ ),
55423
+ children: filteredAndSortedEvents.map(
55424
+ (event, index2) => renderEvent(event, index2, index2 === filteredAndSortedEvents.length - 1)
55425
+ )
55426
+ }
55427
+ ) : /* @__PURE__ */ jsx("div", { className: cn(
54961
55428
  "space-y-0",
54962
- orientation === "horizontal" && "flex overflow-x-auto gap-6"
54963
- ), children: groupByDate ? renderGroupedEvents() : sortedEvents.map(
54964
- (event, index2) => renderEvent(event, index2, index2 === sortedEvents.length - 1)
54965
- ) }) : /* @__PURE__ */ jsxs("div", { className: "text-center py-8", children: [
54966
- /* @__PURE__ */ jsx(Clock, { className: "h-12 w-12 mx-auto mb-4 text-muted-foreground" }),
54967
- /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "No events to display" })
54968
- ] }) })
54969
- ] });
55429
+ layout === "horizontal" && "flex overflow-x-auto gap-6 pb-4",
55430
+ layout === "alternating" && "relative"
55431
+ ), children: filteredAndSortedEvents.map(
55432
+ (event, index2) => renderEvent(event, index2, index2 === filteredAndSortedEvents.length - 1)
55433
+ ) }) });
55434
+ if (virtualScroll && filteredAndSortedEvents.length > 50) {
55435
+ return /* @__PURE__ */ jsx("div", { className: "h-[600px] overflow-y-auto", children: content });
55436
+ }
55437
+ return content;
55438
+ };
55439
+ return /* @__PURE__ */ jsxs(
55440
+ MoonUICardPro,
55441
+ {
55442
+ className: cn(
55443
+ timelineVariants({ theme }),
55444
+ "relative",
55445
+ printMode && "print:shadow-none print:border-0",
55446
+ className
55447
+ ),
55448
+ ref: timelineRef,
55449
+ role: "region",
55450
+ "aria-label": ariaLabel,
55451
+ ...props,
55452
+ children: [
55453
+ /* @__PURE__ */ jsxs(MoonUICardHeaderPro, { className: cn(
55454
+ compactMode && "pb-3",
55455
+ printMode && "print:pb-2"
55456
+ ), children: [
55457
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
55458
+ /* @__PURE__ */ jsxs("div", { children: [
55459
+ /* @__PURE__ */ jsxs(MoonUICardTitlePro, { className: "flex items-center gap-2", children: [
55460
+ /* @__PURE__ */ jsx(Clock, { className: "h-5 w-5" }),
55461
+ "Timeline",
55462
+ /* @__PURE__ */ jsxs(MoonUIBadgePro, { variant: "pro", className: "ml-2", children: [
55463
+ /* @__PURE__ */ jsx(Sparkles, { className: "mr-1 h-3 w-3" }),
55464
+ "Pro"
55465
+ ] })
55466
+ ] }),
55467
+ /* @__PURE__ */ jsxs(MoonUICardDescriptionPro, { children: [
55468
+ filteredAndSortedEvents.length,
55469
+ " event",
55470
+ filteredAndSortedEvents.length !== 1 ? "s" : "",
55471
+ searchQuery && ` matching "${searchQuery}"`,
55472
+ filterType !== "all" && ` of type ${filterType}`
55473
+ ] })
55474
+ ] }),
55475
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
55476
+ showExport && /* @__PURE__ */ jsx(
55477
+ MoonUIButtonPro,
55478
+ {
55479
+ variant: "ghost",
55480
+ size: "sm",
55481
+ onClick: handleExport,
55482
+ className: "print:hidden",
55483
+ children: /* @__PURE__ */ jsx(Download, { className: "h-4 w-4" })
55484
+ }
55485
+ ),
55486
+ /* @__PURE__ */ jsx(
55487
+ MoonUIButtonPro,
55488
+ {
55489
+ variant: "ghost",
55490
+ size: "sm",
55491
+ onClick: handlePrint,
55492
+ className: "print:hidden",
55493
+ children: /* @__PURE__ */ jsx(Printer, { className: "h-4 w-4" })
55494
+ }
55495
+ )
55496
+ ] })
55497
+ ] }),
55498
+ (showSearch || showFilter) && /* @__PURE__ */ jsxs("div", { className: "flex gap-2 mt-4 print:hidden", children: [
55499
+ showSearch && /* @__PURE__ */ jsxs("div", { className: "relative flex-1", children: [
55500
+ /* @__PURE__ */ jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" }),
55501
+ /* @__PURE__ */ jsx(
55502
+ MoonUIInputPro,
55503
+ {
55504
+ type: "search",
55505
+ placeholder: "Search events...",
55506
+ value: searchQuery,
55507
+ onChange: (e) => setSearchQuery(e.target.value),
55508
+ className: "pl-9"
55509
+ }
55510
+ )
55511
+ ] }),
55512
+ showFilter && /* @__PURE__ */ jsxs(MoonUISelectPro, { value: filterType, onValueChange: (value) => setFilterType(value), children: [
55513
+ /* @__PURE__ */ jsxs(MoonUISelectTriggerPro, { className: "w-[150px]", children: [
55514
+ /* @__PURE__ */ jsx(Filter, { className: "mr-2 h-4 w-4" }),
55515
+ /* @__PURE__ */ jsx(MoonUISelectValuePro, { placeholder: "Filter by type" })
55516
+ ] }),
55517
+ /* @__PURE__ */ jsxs(MoonUISelectContentPro, { children: [
55518
+ /* @__PURE__ */ jsx(MoonUISelectItemPro, { value: "all", children: "All Types" }),
55519
+ /* @__PURE__ */ jsx(MoonUISelectItemPro, { value: "success", children: "Success" }),
55520
+ /* @__PURE__ */ jsx(MoonUISelectItemPro, { value: "warning", children: "Warning" }),
55521
+ /* @__PURE__ */ jsx(MoonUISelectItemPro, { value: "error", children: "Error" }),
55522
+ /* @__PURE__ */ jsx(MoonUISelectItemPro, { value: "info", children: "Info" }),
55523
+ /* @__PURE__ */ jsx(MoonUISelectItemPro, { value: "pending", children: "Pending" }),
55524
+ /* @__PURE__ */ jsx(MoonUISelectItemPro, { value: "milestone", children: "Milestone" })
55525
+ ] })
55526
+ ] })
55527
+ ] })
55528
+ ] }),
55529
+ /* @__PURE__ */ jsx(MoonUICardContentPro, { className: cn(
55530
+ compactMode && "pt-0",
55531
+ "relative"
55532
+ ), children: filteredAndSortedEvents.length > 0 ? renderTimeline() : /* @__PURE__ */ jsxs("div", { className: "text-center py-12", children: [
55533
+ /* @__PURE__ */ jsx(Clock, { className: "h-12 w-12 mx-auto mb-4 text-muted-foreground" }),
55534
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: searchQuery || filterType !== "all" ? "No events match your filters" : "No events to display" })
55535
+ ] }) })
55536
+ ]
55537
+ }
55538
+ );
54970
55539
  }
54971
55540
  var COLOR_THEMES = {
54972
55541
  default: [
@@ -55030,7 +55599,7 @@ var COLOR_THEMES = {
55030
55599
  "#FFE400"
55031
55600
  ]
55032
55601
  };
55033
- var DEFAULT_COLORS = COLOR_THEMES.default;
55602
+ var DEFAULT_COLORS2 = COLOR_THEMES.default;
55034
55603
  var CustomTooltip = ({ active, payload, label }) => {
55035
55604
  if (!active || !payload || !payload.length)
55036
55605
  return null;
@@ -55140,7 +55709,7 @@ function AdvancedChart({
55140
55709
  showReference = false,
55141
55710
  referenceLines = [],
55142
55711
  referenceAreas = [],
55143
- colors = DEFAULT_COLORS,
55712
+ colors = DEFAULT_COLORS2,
55144
55713
  className,
55145
55714
  onDataPointClick,
55146
55715
  onExport,
@@ -55172,7 +55741,7 @@ function AdvancedChart({
55172
55741
  const chartRef = t__default.useRef(null);
55173
55742
  const containerRef = t__default.useRef(null);
55174
55743
  const themeColors = t__default.useMemo(() => {
55175
- return COLOR_THEMES[selectedTheme] || DEFAULT_COLORS;
55744
+ return COLOR_THEMES[selectedTheme] || DEFAULT_COLORS2;
55176
55745
  }, [selectedTheme]);
55177
55746
  const gradientId = t__default.useId();
55178
55747
  const trend = t__default.useMemo(() => {
@@ -66360,7 +66929,7 @@ var DialogProContent = t.forwardRef(({
66360
66929
  overlayProps = {},
66361
66930
  ...props
66362
66931
  }, ref) => {
66363
- const animationVariants = {
66932
+ const animationVariants2 = {
66364
66933
  fade: {
66365
66934
  initial: { opacity: 0 },
66366
66935
  animate: { opacity: 1 },
@@ -66427,7 +66996,7 @@ var DialogProContent = t.forwardRef(({
66427
66996
  children: /* @__PURE__ */ jsxs(
66428
66997
  motion.div,
66429
66998
  {
66430
- variants: animationVariants[animation],
66999
+ variants: animationVariants2[animation],
66431
67000
  initial: "initial",
66432
67001
  animate: "animate",
66433
67002
  exit: "exit",