@iclips/ui 2.0.3 → 3.0.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/MIGRATION-v3.md +244 -0
- package/dist/alert-theme.css +20 -79
- package/dist/components/ui/charts/donut-chart.cjs +1 -1
- package/dist/components/ui/charts/donut-chart.cjs.map +1 -1
- package/dist/components/ui/charts/donut-chart.js +39 -60
- package/dist/components/ui/charts/donut-chart.js.map +1 -1
- package/dist/components/ui/charts/kpi-card.cjs +1 -1
- package/dist/components/ui/charts/kpi-card.cjs.map +1 -1
- package/dist/components/ui/charts/kpi-card.js +19 -19
- package/dist/components/ui/charts/kpi-card.js.map +1 -1
- package/dist/components/ui/data/comment-system.cjs +1 -1
- package/dist/components/ui/data/comment-system.cjs.map +1 -1
- package/dist/components/ui/data/comment-system.js +67 -67
- package/dist/components/ui/data/comment-system.js.map +1 -1
- package/dist/components/ui/data/data-table.cjs +1 -1
- package/dist/components/ui/data/data-table.cjs.map +1 -1
- package/dist/components/ui/data/data-table.js +112 -101
- package/dist/components/ui/data/data-table.js.map +1 -1
- package/dist/components/ui/data/editorial-calendar.cjs +1 -1
- package/dist/components/ui/data/editorial-calendar.cjs.map +1 -1
- package/dist/components/ui/data/editorial-calendar.js +291 -291
- package/dist/components/ui/data/editorial-calendar.js.map +1 -1
- package/dist/components/ui/data/filter-builder.cjs +1 -1
- package/dist/components/ui/data/filter-builder.cjs.map +1 -1
- package/dist/components/ui/data/filter-builder.js +1 -1
- package/dist/components/ui/data/filter-builder.js.map +1 -1
- package/dist/components/ui/feedback/empty-state.cjs +1 -1
- package/dist/components/ui/feedback/empty-state.cjs.map +1 -1
- package/dist/components/ui/feedback/empty-state.js +14 -14
- package/dist/components/ui/feedback/empty-state.js.map +1 -1
- package/dist/components/ui/feedback/toast.cjs +1 -1
- package/dist/components/ui/feedback/toast.cjs.map +1 -1
- package/dist/components/ui/feedback/toast.js +53 -22
- package/dist/components/ui/feedback/toast.js.map +1 -1
- package/dist/components/ui/forms/calendar.cjs +1 -1
- package/dist/components/ui/forms/calendar.cjs.map +1 -1
- package/dist/components/ui/forms/calendar.js +16 -16
- package/dist/components/ui/forms/calendar.js.map +1 -1
- package/dist/components/ui/forms/combobox.cjs +1 -1
- package/dist/components/ui/forms/combobox.cjs.map +1 -1
- package/dist/components/ui/forms/combobox.js +78 -76
- package/dist/components/ui/forms/combobox.js.map +1 -1
- package/dist/components/ui/forms/file-attachment-list.cjs +1 -1
- package/dist/components/ui/forms/file-attachment-list.cjs.map +1 -1
- package/dist/components/ui/forms/file-attachment-list.js +4 -4
- package/dist/components/ui/forms/file-attachment-list.js.map +1 -1
- package/dist/components/ui/forms/file-upload-zone.cjs +2 -2
- package/dist/components/ui/forms/file-upload-zone.cjs.map +1 -1
- package/dist/components/ui/forms/file-upload-zone.js +55 -49
- package/dist/components/ui/forms/file-upload-zone.js.map +1 -1
- package/dist/components/ui/forms/form.cjs +1 -1
- package/dist/components/ui/forms/form.cjs.map +1 -1
- package/dist/components/ui/forms/form.js +11 -11
- package/dist/components/ui/forms/form.js.map +1 -1
- package/dist/components/ui/forms/input-validation.cjs +1 -1
- package/dist/components/ui/forms/input-validation.cjs.map +1 -1
- package/dist/components/ui/forms/input-validation.js +20 -20
- package/dist/components/ui/forms/input-validation.js.map +1 -1
- package/dist/components/ui/forms/multi-select.cjs +1 -1
- package/dist/components/ui/forms/multi-select.cjs.map +1 -1
- package/dist/components/ui/forms/multi-select.js +69 -67
- package/dist/components/ui/forms/multi-select.js.map +1 -1
- package/dist/components/ui/forms/radio-group.cjs +1 -1
- package/dist/components/ui/forms/radio-group.cjs.map +1 -1
- package/dist/components/ui/forms/radio-group.js +19 -19
- package/dist/components/ui/forms/radio-group.js.map +1 -1
- package/dist/components/ui/forms/social-button.cjs +1 -1
- package/dist/components/ui/forms/social-button.cjs.map +1 -1
- package/dist/components/ui/forms/social-button.js +6 -6
- package/dist/components/ui/forms/social-button.js.map +1 -1
- package/dist/components/ui/forms/toggle.cjs +1 -1
- package/dist/components/ui/forms/toggle.cjs.map +1 -1
- package/dist/components/ui/forms/toggle.js +7 -7
- package/dist/components/ui/forms/toggle.js.map +1 -1
- package/dist/components/ui/navigation/navigation-menu.cjs +1 -1
- package/dist/components/ui/navigation/navigation-menu.cjs.map +1 -1
- package/dist/components/ui/navigation/navigation-menu.js +14 -14
- package/dist/components/ui/navigation/navigation-menu.js.map +1 -1
- package/dist/components/ui/navigation/sidebar.cjs +1 -1
- package/dist/components/ui/navigation/sidebar.cjs.map +1 -1
- package/dist/components/ui/navigation/sidebar.js +44 -44
- package/dist/components/ui/navigation/sidebar.js.map +1 -1
- package/dist/components/ui/overlays/context-menu.cjs +1 -1
- package/dist/components/ui/overlays/context-menu.cjs.map +1 -1
- package/dist/components/ui/overlays/context-menu.js +1 -1
- package/dist/components/ui/overlays/context-menu.js.map +1 -1
- package/dist/components/ui/overlays/dropdown-menu.cjs +1 -1
- package/dist/components/ui/overlays/dropdown-menu.cjs.map +1 -1
- package/dist/components/ui/overlays/dropdown-menu.js +5 -5
- package/dist/components/ui/overlays/dropdown-menu.js.map +1 -1
- package/dist/components/ui/overlays/menubar.cjs +1 -1
- package/dist/components/ui/overlays/menubar.cjs.map +1 -1
- package/dist/components/ui/overlays/menubar.js +29 -29
- package/dist/components/ui/overlays/menubar.js.map +1 -1
- package/dist/components/ui/overlays/tooltip.cjs +1 -1
- package/dist/components/ui/overlays/tooltip.cjs.map +1 -1
- package/dist/components/ui/overlays/tooltip.js +12 -12
- package/dist/components/ui/overlays/tooltip.js.map +1 -1
- package/dist/components/ui/primitives/avatar.cjs +1 -1
- package/dist/components/ui/primitives/avatar.cjs.map +1 -1
- package/dist/components/ui/primitives/avatar.js +20 -27
- package/dist/components/ui/primitives/avatar.js.map +1 -1
- package/dist/components/ui/primitives/badge.cjs +1 -1
- package/dist/components/ui/primitives/badge.cjs.map +1 -1
- package/dist/components/ui/primitives/badge.js +13 -13
- package/dist/components/ui/primitives/badge.js.map +1 -1
- package/dist/components/ui/primitives/button.cjs +1 -1
- package/dist/components/ui/primitives/button.cjs.map +1 -1
- package/dist/components/ui/primitives/button.js +11 -8
- package/dist/components/ui/primitives/button.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +34 -35
- package/dist/index.js.map +1 -1
- package/dist/preset.css +1 -2
- package/dist/toast-theme.css +100 -64
- package/dist/tokens.css +59 -159
- package/package.json +5 -3
- package/scripts/check-colors.mjs +208 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editorial-calendar.cjs","sources":["../../../../src/components/ui/data/editorial-calendar.tsx"],"sourcesContent":["import React, { useState, useMemo } from \"react\";\nimport { \n format, \n addMonths, \n subMonths, \n startOfMonth, \n endOfMonth, \n startOfWeek, \n endOfWeek, \n eachDayOfInterval, \n isSameMonth, \n isSameDay, \n isToday,\n addDays,\n setHours,\n getHours,\n getMinutes,\n differenceInMinutes,\n addHours,\n} from \"date-fns\";\nimport { \n ChevronLeft, \n ChevronRight, \n Plus, \n GripVertical,\n Instagram,\n Linkedin,\n Facebook,\n Twitter,\n Youtube,\n Calendar as CalendarIcon,\n Clock,\n PanelLeftClose,\n PanelLeftOpen,\n\n} from \"lucide-react\";\nimport { cn } from \"../utils\";\nimport { Button } from \"../primitives/button\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../primitives/avatar\";\nimport { Badge } from \"../primitives/badge\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../overlays/dialog\";\nimport { ToggleGroup, ToggleGroupItem } from \"../forms/toggle-group\";\nimport { ScrollArea } from \"../layout/scroll-area\";\nimport { DndProvider, useDrag, useDrop } from \"react-dnd\";\nimport { HTML5Backend } from \"react-dnd-html5-backend\";\n\n// --- Tipos ---\n\nexport type SocialChannel = \"instagram\" | \"linkedin\" | \"facebook\" | \"twitter\" | \"youtube\" | \"blog\" | \"other\";\nexport type TaskStatus = \"idea\" | \"planned\" | \"in-progress\" | \"approval\" | \"scheduled\" | \"published\";\nexport type CalendarMode = \"editorial\" | \"execution\";\n\nexport interface CalendarTask {\n id: string;\n title: string;\n date?: Date | string; // Data de início\n endDate?: Date | string; // Data de término (opcional)\n channel?: SocialChannel;\n status: TaskStatus;\n imageUrl?: string;\n description?: string;\n assignees?: {\n name: string;\n avatar?: string;\n }[];\n color?: string; // Cor customizada opcional\n}\n\ninterface BaseCalendarProps {\n tasks: CalendarTask[];\n onTaskUpdate: (updatedTask: CalendarTask) => void;\n onTaskCreate?: (newTask: Partial<CalendarTask>) => void;\n className?: string;\n}\n\ntype CalendarView = \"month\" | \"week\" | \"day\";\n\n/** Props compartilhadas pelas views de topo (recebem o grid inteiro de dias). */\ninterface CalendarViewProps {\n days: Date[];\n tasks: CalendarTask[];\n onDropTask: (taskId: string, date: Date) => void;\n onTaskClick: (task: CalendarTask) => void;\n onAddClick: (date?: Date) => void;\n}\n\n/** Props compartilhadas pelas colunas/células internas (já recebem um único dia). */\ninterface CalendarColumnProps {\n tasks: CalendarTask[];\n onDropTask: (taskId: string, date: Date) => void;\n onTaskClick: (task: CalendarTask) => void;\n onAddClick: (date: Date) => void;\n}\n\n// --- Constantes e Auxiliares ---\n\nconst ItemTypes = {\n TASK: 'task',\n};\n\nconst ChannelIcons: Record<SocialChannel, React.ElementType> = {\n instagram: Instagram,\n linkedin: Linkedin,\n facebook: Facebook,\n twitter: Twitter,\n youtube: Youtube,\n blog: CalendarIcon,\n other: CalendarIcon,\n};\n\n// Ícones de canal são monocromáticos — a forma do ícone carrega a identidade,\n// a cor fica no token neutro. Se o time quiser cores por canal no futuro, a\n// paleta de marca de terceiros entra como tokens `--brand-*` em tokens.css.\n\nconst StatusColors: Record<TaskStatus, string> = {\n idea: \"bg-muted text-muted-foreground border-border\",\n planned: \"bg-info/10 text-info-emphasis border-info/20\",\n \"in-progress\": \"bg-warning/10 text-warning-emphasis border-warning/20\",\n approval: \"bg-accent text-accent-foreground border-border\",\n scheduled: \"bg-success/10 text-success-emphasis border-success/20\",\n published: \"bg-foreground text-background border-foreground\",\n};\n\n// Rotating chart tokens for Execution mode cards (flip in dark mode)\nconst PastelColors = [\n \"bg-chart-2/15 border-chart-2/30 text-chart-2\",\n \"bg-chart-3/15 border-chart-3/30 text-chart-3\",\n \"bg-chart-1/15 border-chart-1/30 text-chart-1\",\n \"bg-chart-4/15 border-chart-4/30 text-chart-4\",\n \"bg-chart-5/15 border-chart-5/30 text-chart-5\",\n \"bg-chart-8/15 border-chart-8/30 text-chart-8\",\n];\n\nconst getRandomColor = (id: string) => {\n const index = id.split(\"\").reduce((acc, char) => acc + char.charCodeAt(0), 0);\n return PastelColors[index % PastelColors.length];\n};\n\n// --- Draggable Card Component ---\n\nfunction DraggableTaskCard({ \n task, \n view = \"month\", \n mode = \"editorial\",\n onClick, \n style \n}: { \n task: CalendarTask; \n view?: \"month\" | \"week\" | \"day\" | \"4day\" | \"backlog\" | \"list\"; \n mode?: CalendarMode;\n onClick: () => void;\n style?: React.CSSProperties;\n}) {\n const [{ isDragging }, drag] = useDrag(() => ({\n type: ItemTypes.TASK,\n item: { id: task.id, type: ItemTypes.TASK },\n collect: (monitor) => ({\n isDragging: !!monitor.isDragging(),\n }),\n }), [task.id]);\n\n const ChannelIcon = task.channel ? ChannelIcons[task.channel] : CalendarIcon;\n \n const startDate = task.date ? new Date(task.date) : null;\n const endDate = task.endDate ? new Date(task.endDate) : (startDate ? addHours(startDate, 1) : null);\n \n const timeString = startDate ? format(startDate, \"HH:mm\") : null;\n const durationString = startDate && endDate \n ? `${format(startDate, \"HH:mm\")} - ${format(endDate, \"HH:mm\")}`\n : timeString;\n\n // ---- STYLES ----\n \n // 1. EDITORIAL - WEEK / DAY (Feed Style)\n if (mode === \"editorial\" && (view === \"week\" || view === \"day\")) {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer bg-card border rounded-md shadow-sm hover:shadow-md transition-all mb-3 overflow-hidden\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.status === \"published\" ? \"border-l-2 border-l-foreground\" : \"border-l-2 border-l-primary\"\n )}\n >\n {/* Header: Time & Channel */}\n <div className=\"flex items-center justify-between px-3 py-2 border-b bg-muted/50\">\n <div className=\"flex items-center gap-2\">\n <ChannelIcon size={14} className=\"text-muted-foreground\" />\n {timeString && <span className=\"text-xs font-medium text-muted-foreground\">{timeString}</span>}\n </div>\n <div className=\"opacity-0 group-hover:opacity-100 text-muted-foreground cursor-grab\">\n <GripVertical size={14} />\n </div>\n </div>\n\n {/* Image (Large) */}\n {task.imageUrl && (\n <div className=\"w-full aspect-video bg-muted relative border-b\">\n <img src={task.imageUrl} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-3\">\n <h4 className=\"text-sm font-medium text-foreground line-clamp-2 mb-2 leading-snug\">\n {task.title}\n </h4>\n <div className=\"flex items-center justify-between\">\n <Badge variant=\"outline\" className={cn(\"px-1.5 py-0 text-[10px] h-5 font-normal uppercase tracking-wide\", StatusColors[task.status])}>\n {task.status}\n </Badge>\n {task.assignees && task.assignees.length > 0 && (\n <div className=\"flex -space-x-2\">\n {task.assignees.slice(0,2).map((a, i) => (\n <Avatar key={i} className=\"w-5 h-5 border border-background\">\n <AvatarImage src={a.avatar} />\n <AvatarFallback className=\"text-[8px]\">{a.name[0]}</AvatarFallback>\n </Avatar>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // 2. EDITORIAL - MONTH (Compact Grid)\n if (mode === \"editorial\" && view === \"month\") {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer bg-card border rounded-md shadow-sm hover:shadow-md transition-all mb-1 overflow-hidden flex items-center gap-2 p-1.5\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.status === \"published\" ? \"border-l-2 border-l-foreground\" : \"border-l-2 border-l-primary\"\n )}\n >\n {task.imageUrl && (\n <div className=\"w-8 h-8 flex-shrink-0 bg-muted rounded overflow-hidden\">\n <img src={task.imageUrl} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5\">\n <ChannelIcon size={12} className=\"text-muted-foreground\" />\n <span className=\"truncate font-medium text-xs\">{task.title}</span>\n </div>\n </div>\n </div>\n );\n }\n\n // 3. EXECUTION - TIMELINE (Week / Day)\n if (mode === \"execution\" && (view === \"week\" || view === \"day\")) {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n style={style}\n className={cn(\n \"absolute z-10 rounded-md border shadow-sm p-1.5 text-xs flex flex-col overflow-hidden hover:overflow-visible hover:h-auto! hover:min-h-[min-content] hover:z-50 transition-all cursor-pointer group\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.color || getRandomColor(task.id)\n )}\n >\n <div className=\"flex items-center gap-1 mb-0.5 font-semibold opacity-75 text-[10px] leading-none\">\n <Clock size={10} />\n <span className=\"truncate\">{durationString}</span>\n </div>\n \n <div className=\"font-bold leading-tight mb-1 line-clamp-2 text-[11px]\">{task.title}</div>\n \n <div className=\"mt-auto flex items-center justify-between pt-1\">\n <div className=\"flex -space-x-1.5\">\n {task.assignees?.map((a, i) => (\n <Avatar key={i} className=\"w-4 h-4 border border-background\">\n <AvatarImage src={a.avatar} />\n <AvatarFallback className=\"text-[8px]\">{a.name[0]}</AvatarFallback>\n </Avatar>\n ))}\n </div>\n {task.status !== 'published' && (\n <div className={cn(\"w-2 h-2 rounded-full\", StatusColors[task.status].split(\" \")[1].replace(\"text-\", \"bg-\"))} />\n )}\n </div>\n </div>\n );\n }\n \n // 4. EXECUTION - MONTH\n if (mode === \"execution\" && view === \"month\") {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer rounded px-2 py-1 mb-1 text-xs truncate font-medium transition-all\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.color || getRandomColor(task.id).replace(\"bg-\", \"bg-opacity-20 bg-\") // lighter background\n )}\n >\n {timeString} {task.title}\n </div>\n );\n }\n\n // 5. BACKLOG (Generic)\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer bg-card border rounded-md shadow-sm hover:shadow-md transition-all mb-2 p-2 flex items-start gap-3\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n mode === 'editorial' && (task.status === \"published\" ? \"border-l-2 border-l-foreground\" : \"border-l-2 border-l-primary\")\n )}\n >\n {mode === 'editorial' && task.imageUrl && (\n <div className=\"w-10 h-10 flex-shrink-0 bg-muted rounded overflow-hidden\">\n <img src={task.imageUrl} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5 mb-1\">\n {mode === 'editorial' && <ChannelIcon size={12} className=\"text-muted-foreground\" />}\n <span className=\"truncate font-medium text-sm\">{task.title}</span>\n </div>\n <Badge variant=\"secondary\" className=\"text-[10px] h-4 px-1 py-0\">{task.status}</Badge>\n </div>\n </div>\n );\n}\n\n// --- Layout Views ---\n\n// 1. EDITORIAL WEEK/DAY VIEW (Columnar, NOT Timeline)\nfunction EditorialColumnView({\n days,\n tasks,\n onDropTask,\n onTaskClick,\n onAddClick,\n view\n}: CalendarViewProps & { view: CalendarView }) {\n return (\n <div className={cn(\n \"grid h-full min-h-[calc(100vh-200px)] bg-muted/30\",\n view === 'week' ? \"grid-cols-7 divide-x\" : \"grid-cols-1 border-x\"\n )}>\n {days.map((day: Date) => {\n const dayTasks = tasks\n .filter((t: CalendarTask) => t.date && isSameDay(new Date(t.date), day))\n .sort((a: CalendarTask, b: CalendarTask) => {\n // Sort by time if available\n if (a.date && b.date) {\n return new Date(a.date).getTime() - new Date(b.date).getTime();\n }\n return 0;\n });\n\n return (\n <EditorialColumn \n key={day.toISOString()}\n day={day}\n tasks={dayTasks}\n onDropTask={onDropTask}\n onTaskClick={onTaskClick}\n onAddClick={onAddClick}\n isToday={isToday(day)}\n />\n )\n })}\n </div>\n );\n}\n\nfunction EditorialColumn({ day, tasks, onDropTask, onTaskClick, onAddClick, isToday }: CalendarColumnProps & { day: Date; isToday: boolean }) {\n const [{ isOver }, drop] = useDrop(() => ({\n accept: ItemTypes.TASK,\n drop: (item: { id: string }) => onDropTask(item.id, day),\n collect: (monitor) => ({\n isOver: !!monitor.isOver(),\n }),\n }), [day, onDropTask]);\n\n return (\n <div \n ref={drop as unknown as React.Ref<HTMLDivElement>}\n className={cn(\n \"flex flex-col h-full min-h-0 transition-colors\",\n isOver && \"bg-accent ring-inset ring-2 ring-ring\"\n )}\n >\n {/* Sticky Header */}\n <div className={cn(\n \"p-2 text-center border-b bg-card sticky top-0 z-10\",\n isToday && \"bg-accent/50\"\n )}>\n <div className=\"text-xs font-semibold uppercase text-muted-foreground mb-1\">{format(day, 'EEE')}</div>\n <div className={cn(\n \"w-8 h-8 rounded-full flex items-center justify-center mx-auto text-sm font-medium\",\n isToday ? \"bg-primary text-primary-foreground\" : \"text-foreground bg-muted\"\n )}>\n {format(day, 'd')}\n </div>\n </div>\n\n {/* Scrollable Content */}\n <div className=\"flex-1 p-2 space-y-3 overflow-y-auto\">\n <Button \n variant=\"outline\" \n size=\"sm\" \n className=\"w-full mb-2 justify-center px-1\"\n onClick={() => onAddClick(day)}\n >\n <Plus size={12} className=\"flex-shrink-0\" /> \n <span className=\"truncate ml-1.5 hidden xl:inline\">Add Post</span>\n <span className=\"truncate ml-1.5 inline xl:hidden\">Add</span>\n </Button>\n\n {tasks.map((task: CalendarTask) => (\n <DraggableTaskCard \n key={task.id}\n task={task}\n view=\"week\" // Triggers the Editorial Feed Card style\n mode=\"editorial\"\n onClick={() => onTaskClick(task)}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// 2. EXECUTION TIMELINE VIEW (Gantt/Agenda Style)\nfunction ExecutionTimelineView({ \n days,\n tasks, \n onDropTask, \n onTaskClick, \n onAddClick\n}: { \n days: Date[];\n tasks: CalendarTask[]; \n onDropTask: (taskId: string, date: Date) => void; \n onTaskClick: (task: CalendarTask) => void;\n onAddClick: (date: Date) => void;\n}) {\n \n const HOURS = Array.from({ length: 24 }, (_, i) => i);\n\n return (\n <div className=\"flex h-full relative overflow-y-auto bg-card select-none\">\n {/* Time Axis */}\n <div className=\"w-14 flex-shrink-0 border-r bg-card sticky left-0 z-30\">\n <div className=\"h-10 border-b bg-card sticky top-0 z-40 flex-shrink-0\" /> {/* Fixed height header match */}\n {HOURS.map(hour => (\n <div key={hour} className=\"h-24 border-b text-right pr-2 pt-2 text-xs text-muted-foreground font-medium relative\">\n <span className=\"-top-2.5 relative\">{format(setHours(new Date(), hour), \"ha\")}</span>\n </div>\n ))}\n </div>\n\n {/* Columns Container */}\n <div className=\"flex flex-1 min-w-0 relative\">\n {days.map((day, dayIndex) => {\n const dayTasks = tasks.filter(t => t.date && isSameDay(new Date(t.date), day));\n \n return (\n <ExecutionTimelineColumn \n key={day.toISOString()}\n day={day}\n tasks={dayTasks}\n onDropTask={onDropTask}\n onTaskClick={onTaskClick}\n onAddClick={onAddClick}\n isLast={dayIndex === days.length - 1}\n HOURS={HOURS}\n />\n );\n })}\n \n {/* Horizontal Grid Lines (Background) */}\n <div className=\"absolute inset-0 pointer-events-none z-0\">\n <div className=\"h-10 border-b bg-transparent\" /> {/* Header Spacer in grid */}\n {HOURS.map(hour => (\n <div key={hour} className=\"h-24 border-b border-dashed border-border w-full\" />\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction ExecutionTimelineColumn({\n day,\n tasks,\n onDropTask,\n onTaskClick,\n onAddClick,\n isLast,\n HOURS\n}: CalendarColumnProps & { day: Date; isLast: boolean; HOURS: number[] }) {\n const [{ isOver }, drop] = useDrop(() => ({\n accept: ItemTypes.TASK,\n drop: (item: { id: string }) => {\n onDropTask(item.id, day);\n },\n collect: (monitor) => ({\n isOver: !!monitor.isOver(),\n }),\n }), [day, onDropTask]);\n\n return (\n <div \n ref={drop as unknown as React.Ref<HTMLDivElement>}\n className={cn(\n \"flex-1 relative min-w-[150px]\", \n !isLast && \"border-r\",\n isOver && \"bg-accent/50\"\n )}\n >\n {/* Header (Only for timeline view within scroll area) */}\n <div className=\"sticky top-0 z-20 bg-card border-b h-10 flex items-center justify-center shadow-sm\">\n <div className=\"text-xs font-bold text-muted-foreground\">{format(day, 'EEE')} <span className={cn(\"ml-1\", isToday(day) && \"text-primary\")}>{format(day, 'd')}</span></div>\n </div>\n\n {/* Clickable areas for adding tasks */}\n {HOURS.map((hour: number) => (\n <div \n key={hour} \n className=\"h-24 w-full absolute hover:bg-muted/50 transition-colors cursor-pointer z-10\"\n style={{ top: `${hour * 96 + 40}px` }} \n onClick={(e) => {\n e.stopPropagation();\n const d = new Date(day);\n d.setHours(hour, 0);\n onAddClick(d);\n }}\n />\n ))}\n\n {/* Render Tasks */}\n {tasks.map((task: CalendarTask) => {\n const taskStart = task.date ? new Date(task.date) : new Date();\n const taskEnd = task.endDate ? new Date(task.endDate) : addHours(taskStart, 1);\n \n const startHour = getHours(taskStart);\n const startMin = getMinutes(taskStart);\n \n // Calculate duration in minutes for height\n let durationMins = differenceInMinutes(taskEnd, taskStart);\n if (durationMins < 30) durationMins = 30; // Min height\n\n const topPosition = (startHour * 96) + ((startMin / 60) * 96) + 40; // +40 for header offset\n const height = (durationMins / 60) * 96;\n\n return (\n <DraggableTaskCard \n key={task.id} \n task={task} \n view=\"week\" // Logic handled inside card based on 'mode' prop\n mode=\"execution\"\n onClick={() => onTaskClick(task)}\n style={{ \n top: `${topPosition}px`, \n height: `${height}px`, \n left: '4px',\n right: '4px',\n position: 'absolute'\n }}\n />\n );\n })}\n </div>\n );\n}\n\n// 3. MONTH VIEW\nfunction MonthView({\n days,\n tasks,\n currentDate,\n onDropTask,\n onTaskClick,\n onAddClick,\n mode\n}: CalendarViewProps & { currentDate: Date; mode: CalendarMode }) {\n return (\n <div className=\"grid grid-cols-7 auto-rows-fr min-h-[800px]\">\n {days.map((day: Date) => {\n const dayTasks = tasks.filter((t: CalendarTask) => \n t.date && isSameDay(new Date(t.date), day)\n );\n\n return (\n <DroppableMonthCell\n key={day.toISOString()}\n date={day}\n tasks={dayTasks}\n isCurrentMonth={isSameMonth(day, currentDate)}\n onDropTask={onDropTask}\n onTaskClick={onTaskClick}\n onAddClick={onAddClick}\n mode={mode}\n />\n );\n })}\n </div>\n )\n}\n\nfunction DroppableMonthCell({\n date,\n tasks,\n isCurrentMonth,\n onDropTask,\n onTaskClick,\n onAddClick,\n mode\n}: CalendarColumnProps & { date: Date; isCurrentMonth: boolean; mode: CalendarMode }) {\n const [{ isOver }, drop] = useDrop(() => ({\n accept: ItemTypes.TASK,\n drop: (item: { id: string }) => onDropTask(item.id, date),\n collect: (monitor) => ({\n isOver: !!monitor.isOver(),\n }),\n }), [date, onDropTask]);\n\n const isTodayDate = isToday(date);\n\n return (\n <div\n ref={drop as unknown as React.Ref<HTMLDivElement>}\n className={cn(\n \"min-h-[120px] border-b border-r p-2 relative transition-colors group flex flex-col\",\n !isCurrentMonth && \"bg-muted/50 text-muted-foreground\",\n isOver && \"bg-accent ring-2 ring-inset ring-ring\",\n isTodayDate && \"bg-accent/30\"\n )}\n >\n <div className=\"flex justify-between items-start mb-2\">\n <span className={cn(\n \"text-sm font-medium rounded-full w-7 h-7 flex items-center justify-center\",\n isTodayDate ? \"bg-primary text-primary-foreground\" : \"text-foreground\"\n )}>\n {format(date, \"d\")}\n </span>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={() => onAddClick(date)}\n aria-label={`Agendar publicação em ${format(date, \"d/MM\")}`}\n >\n <Plus size={14} />\n </Button>\n </div>\n\n <div className=\"flex-1 flex flex-col gap-1\">\n {tasks.map((task: CalendarTask) => (\n <DraggableTaskCard \n key={task.id}\n task={task}\n view=\"month\"\n mode={mode}\n onClick={() => onTaskClick(task)}\n />\n ))}\n </div>\n </div>\n )\n}\n\n// --- Task Modal (Shared) ---\n\nfunction TaskModal({ \n isOpen, \n onClose, \n task, \n onSave, \n isNew = false \n}: { \n isOpen: boolean; \n onClose: () => void; \n task?: Partial<CalendarTask>; \n onSave: (task: Partial<CalendarTask>) => void;\n isNew?: boolean;\n}) {\n const [editedTask, setEditedTask] = useState<Partial<CalendarTask>>(task || {});\n\n // Reset state when task changes\n useMemo(() => {\n setEditedTask(task || {});\n }, [task]);\n\n const handleSave = () => {\n onSave(editedTask);\n onClose();\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"sm:max-w-[600px]\">\n <DialogHeader>\n <DialogTitle>{isNew ? \"Create New Task\" : \"Edit Task\"}</DialogTitle>\n <DialogDescription>\n {isNew ? \"Enter the details for the new task below.\" : \"Modify the details of the selected task.\"}\n </DialogDescription>\n </DialogHeader>\n \n <div className=\"grid gap-6 py-4\">\n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label htmlFor=\"title\" className=\"text-right text-sm font-medium\">\n Title\n </label>\n <input\n id=\"title\"\n className=\"col-span-3 flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n value={editedTask.title || \"\"}\n onChange={(e) => setEditedTask({ ...editedTask, title: e.target.value })}\n placeholder=\"e.g. New Feature Announcement\"\n />\n </div>\n\n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label className=\"text-right text-sm font-medium\">\n Time\n </label>\n <div className=\"col-span-3 flex gap-2 items-center\">\n <input\n type=\"date\"\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.date instanceof Date ? format(editedTask.date, 'yyyy-MM-dd') : (typeof editedTask.date === 'string' ? editedTask.date.split('T')[0] : '')}\n onChange={(e) => {\n const newDateStr = e.target.value;\n const current = editedTask.date instanceof Date ? editedTask.date : new Date();\n const newDate = new Date(`${newDateStr}T${format(current, 'HH:mm')}`);\n setEditedTask({ ...editedTask, date: newDate })\n }}\n />\n <span className=\"text-sm text-muted-foreground\">at</span>\n <input \n type=\"time\"\n className=\"w-32 flex h-9 rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.date instanceof Date ? format(editedTask.date, 'HH:mm') : '09:00'}\n onChange={(e) => {\n const timeStr = e.target.value;\n const dateStr = editedTask.date instanceof Date ? format(editedTask.date, 'yyyy-MM-dd') : format(new Date(), 'yyyy-MM-dd');\n setEditedTask({ ...editedTask, date: new Date(`${dateStr}T${timeStr}`) })\n }}\n />\n </div>\n </div>\n \n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label htmlFor=\"channel\" className=\"text-right text-sm font-medium\">\n Channel / Category\n </label>\n <select\n id=\"channel\"\n className=\"col-span-3 flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.channel || \"instagram\"}\n onChange={(e) => setEditedTask({ ...editedTask, channel: e.target.value as SocialChannel })}\n >\n {Object.keys(ChannelIcons).map((channel) => (\n <option key={channel} value={channel}>{channel.charAt(0).toUpperCase() + channel.slice(1)}</option>\n ))}\n </select>\n </div>\n\n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label htmlFor=\"status\" className=\"text-right text-sm font-medium\">\n Status\n </label>\n <select\n id=\"status\"\n className=\"col-span-3 flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.status || \"idea\"}\n onChange={(e) => setEditedTask({ ...editedTask, status: e.target.value as TaskStatus })}\n >\n {Object.keys(StatusColors).map((status) => (\n <option key={status} value={status}>{status.charAt(0).toUpperCase() + status.slice(1)}</option>\n ))}\n </select>\n </div>\n\n <div className=\"grid grid-cols-4 items-start gap-4\">\n <label htmlFor=\"description\" className=\"text-right text-sm font-medium pt-2\">\n Description\n </label>\n <textarea\n id=\"description\"\n className=\"col-span-3 flex min-h-[80px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n value={editedTask.description || \"\"}\n onChange={(e) => setEditedTask({ ...editedTask, description: e.target.value })}\n placeholder=\"Details about this post...\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>Cancel</Button>\n <Button onClick={handleSave}>Save Changes</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n// --- Shared Controller Logic ---\n\nfunction useCalendarController({\n tasks: initialTasks,\n onTaskUpdate,\n onTaskCreate,\n defaultView = \"month\"\n}: BaseCalendarProps & { defaultView?: \"month\" | \"week\" | \"day\" }) {\n const [currentDate, setCurrentDate] = useState(new Date());\n const [view, setView] = useState<\"month\" | \"week\" | \"day\">(defaultView);\n const [isSidebarOpen, setIsSidebarOpen] = useState(true);\n \n // Modal state\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [editingTask, setEditingTask] = useState<Partial<CalendarTask> | null>(null);\n const [isNewTask, setIsNewTask] = useState(false);\n\n // Calendar Grid Generation\n const calendarDays = useMemo(() => {\n let startDate, endDate;\n\n if (view === 'month') {\n const monthStart = startOfMonth(currentDate);\n const monthEnd = endOfMonth(monthStart);\n startDate = startOfWeek(monthStart);\n endDate = endOfWeek(monthEnd);\n } else if (view === 'week') {\n startDate = startOfWeek(currentDate);\n endDate = endOfWeek(currentDate);\n } else {\n // Day view\n startDate = currentDate;\n endDate = currentDate;\n }\n\n return eachDayOfInterval({ start: startDate, end: endDate });\n }, [currentDate, view]);\n\n // Derived State\n const unplannedTasks = initialTasks.filter(t => !t.date);\n const scheduledTasks = initialTasks.filter(t => t.date);\n\n const handlePrev = () => {\n if (view === 'month') setCurrentDate(subMonths(currentDate, 1));\n else if (view === 'week') setCurrentDate(addDays(currentDate, -7));\n else setCurrentDate(addDays(currentDate, -1));\n };\n\n const handleNext = () => {\n if (view === 'month') setCurrentDate(addMonths(currentDate, 1));\n else if (view === 'week') setCurrentDate(addDays(currentDate, 7));\n else setCurrentDate(addDays(currentDate, 1));\n };\n\n const handleToday = () => setCurrentDate(new Date());\n\n const handleDropTask = (taskId: string, targetDate: Date, mode: CalendarMode) => {\n const task = initialTasks.find(t => t.id === taskId);\n if (task) {\n let newDate = new Date(targetDate);\n \n if (view === 'month' || mode === 'editorial') {\n if (task.date) {\n const oldDate = new Date(task.date);\n newDate.setHours(oldDate.getHours(), oldDate.getMinutes());\n } else {\n newDate.setHours(9, 0);\n }\n } \n \n const updatedTask = { ...task, date: newDate };\n onTaskUpdate(updatedTask);\n }\n };\n\n const handleTaskClick = (task: CalendarTask) => {\n setEditingTask(task);\n setIsNewTask(false);\n setIsModalOpen(true);\n };\n\n const handleAddClick = (date?: Date) => {\n const d = date || new Date();\n if (getHours(d) === 0 && getMinutes(d) === 0) {\n d.setHours(9, 0);\n }\n setEditingTask({\n date: d,\n status: \"idea\",\n channel: \"instagram\"\n });\n setIsNewTask(true);\n setIsModalOpen(true);\n };\n\n const handleModalSave = (task: Partial<CalendarTask>) => {\n if (isNewTask) {\n if (onTaskCreate) {\n onTaskCreate(task);\n }\n } else {\n if (task.id) {\n onTaskUpdate(task as CalendarTask);\n }\n }\n setIsModalOpen(false);\n };\n\n return {\n currentDate,\n view,\n setView,\n isSidebarOpen,\n setIsSidebarOpen,\n isModalOpen,\n setIsModalOpen,\n editingTask,\n isNewTask,\n calendarDays,\n unplannedTasks,\n scheduledTasks,\n handlePrev,\n handleNext,\n handleToday,\n handleDropTask,\n handleTaskClick,\n handleAddClick,\n handleModalSave\n };\n}\n\n// --- Helper Components ---\n\nfunction CalendarSidebar({ isOpen, setIsOpen, tasks, onAddClick, onTaskClick, mode }: {\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n tasks: CalendarTask[];\n onAddClick: () => void;\n onTaskClick: (task: CalendarTask) => void;\n mode: CalendarMode;\n}) {\n if (!isOpen) {\n return (\n <div className=\"border-r bg-card flex flex-col items-center py-4 w-12 flex-shrink-0 cursor-pointer hover:bg-muted transition-colors\" onClick={() => setIsOpen(true)}>\n <PanelLeftOpen className=\"text-muted-foreground mb-4\" size={20} />\n <div className=\"flex-1 flex items-center justify-center min-h-0\">\n <div className=\"whitespace-nowrap text-xs font-medium text-muted-foreground -rotate-90 transform\">BACKLOG</div>\n </div>\n <Badge className=\"mt-2 h-5 w-5 p-0 flex items-center justify-center rounded-full bg-primary text-[10px]\">{tasks.length}</Badge>\n </div>\n );\n }\n\n return (\n <div className=\"w-72 border-r bg-muted/50 flex flex-col transition-all duration-300 flex-shrink-0\">\n <div className=\"p-4 border-b bg-card flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold text-sm text-foreground\">Backlog</h3>\n <Badge variant=\"secondary\" className=\"bg-muted text-xs\">{tasks.length}</Badge>\n </div>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={() => setIsOpen(false)} aria-label=\"Recolher backlog\">\n <PanelLeftClose size={16} />\n </Button>\n </div>\n <div className=\"px-4 pt-3 bg-card pb-3 border-b space-y-2\">\n <Button \n onClick={onAddClick} \n variant=\"outline\" \n size=\"sm\" \n className=\"w-full justify-start pl-2\"\n >\n <Plus size={12} className=\"mr-1.5\" /> New Task\n </Button>\n </div>\n \n <ScrollArea className=\"flex-1 p-3\">\n <div className=\"space-y-2\">\n {tasks.length === 0 ? (\n <div className=\"text-center py-10 px-4 border-2 border-dashed border-border rounded-lg\">\n <p className=\"text-xs text-foreground/70\">Nenhum item sem agenda</p>\n </div>\n ) : (\n tasks.map((task: CalendarTask) => (\n <DraggableTaskCard \n key={task.id} \n task={task} \n view=\"backlog\"\n mode={mode}\n onClick={() => onTaskClick(task)} \n />\n ))\n )}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nfunction CalendarHeader({ title, onPrev, onNext, onToday, onAdd, view, setView }: {\n title: string;\n onPrev: () => void;\n onNext: () => void;\n onToday: () => void;\n onAdd: () => void;\n view: CalendarView;\n setView: (view: CalendarView) => void;\n mode?: CalendarMode;\n}) {\n return (\n <div className=\"flex flex-col xl:flex-row items-center justify-between p-4 border-b gap-4 flex-shrink-0 bg-card\">\n <div className=\"flex items-center gap-4 w-full xl:w-auto justify-between xl:justify-start\">\n <div className=\"flex items-center border rounded-md bg-card shadow-sm\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onPrev} className=\"h-8 w-8 rounded-r-none\" aria-label=\"Anterior\">\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" onClick={onToday} className=\"h-8 px-3 rounded-none border-x text-sm font-medium hover:bg-muted\">\n Hoje\n </Button>\n <Button variant=\"ghost\" size=\"icon\" onClick={onNext} className=\"h-8 w-8 rounded-l-none\" aria-label=\"Próximo\">\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n <h2 className=\"text-lg font-bold text-foreground whitespace-nowrap\">\n {title}\n </h2>\n </div>\n\n <div className=\"flex items-center gap-3 w-full xl:w-auto overflow-x-auto pb-1 xl:pb-0 justify-end\">\n <ToggleGroup\n type=\"single\"\n value={view}\n onValueChange={(v) => v && setView(v as CalendarView)}\n className=\"flex-shrink-0\"\n aria-label=\"Visualização do calendário\"\n >\n <ToggleGroupItem value=\"month\" className=\"text-xs\">Mês</ToggleGroupItem>\n <ToggleGroupItem value=\"week\" className=\"text-xs\">Semana</ToggleGroupItem>\n <ToggleGroupItem value=\"day\" className=\"text-xs\">Dia</ToggleGroupItem>\n </ToggleGroup>\n\n <Button\n variant=\"default\"\n className=\"h-9 px-4 flex-shrink-0\"\n onClick={onAdd}\n >\n <Plus className=\"mr-2 h-4 w-4\" /> Criar\n </Button>\n </div>\n </div>\n );\n}\n\nfunction MonthHeader({ days }: { days: Date[] }) {\n return (\n <div className=\"grid grid-cols-7 border-b bg-muted/50 flex-shrink-0 divide-x\">\n {days.slice(0, 7).map((day, index) => (\n <div key={index} className=\"py-2 text-center group\">\n <div className={cn(\"text-xs font-semibold uppercase tracking-wider\", isToday(day) ? \"text-primary\" : \"text-foreground/70\")}>\n {format(day, 'EEE')}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\n// --- EXPORTED COMPONENTS ---\n\nexport function EditorialCalendar(props: BaseCalendarProps) {\n const ctrl = useCalendarController({ ...props, defaultView: \"month\" });\n \n return (\n <DndProvider backend={HTML5Backend}>\n <div className={cn(\"flex h-[calc(100vh-100px)] bg-background border rounded-lg overflow-hidden shadow-sm\", props.className)}>\n <CalendarSidebar \n isOpen={ctrl.isSidebarOpen} \n setIsOpen={ctrl.setIsSidebarOpen} \n tasks={ctrl.unplannedTasks} \n onAddClick={() => ctrl.handleAddClick()}\n onTaskClick={ctrl.handleTaskClick}\n mode=\"editorial\"\n />\n \n <div className=\"flex-1 flex flex-col min-w-0 bg-card\">\n <CalendarHeader \n title={ctrl.view === 'day' ? format(ctrl.currentDate, \"MMM d, yyyy\") : format(ctrl.currentDate, \"MMMM yyyy\")}\n onPrev={ctrl.handlePrev}\n onNext={ctrl.handleNext}\n onToday={ctrl.handleToday}\n onAdd={() => ctrl.handleAddClick(ctrl.currentDate)}\n view={ctrl.view}\n setView={ctrl.setView}\n mode=\"editorial\"\n />\n\n {ctrl.view === 'month' && <MonthHeader days={ctrl.calendarDays} />}\n \n <div className=\"flex-1 overflow-hidden flex flex-col relative\">\n {ctrl.view === 'month' ? (\n <MonthView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n currentDate={ctrl.currentDate}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"editorial\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n mode=\"editorial\"\n />\n ) : (\n <EditorialColumnView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"editorial\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n view={ctrl.view}\n />\n )}\n </div>\n </div>\n\n {ctrl.isModalOpen && (\n <TaskModal\n isOpen={ctrl.isModalOpen}\n onClose={() => ctrl.setIsModalOpen(false)}\n task={ctrl.editingTask || {}}\n onSave={ctrl.handleModalSave}\n isNew={ctrl.isNewTask}\n />\n )}\n </div>\n </DndProvider>\n );\n}\n\nexport function TaskCalendar(props: BaseCalendarProps) {\n const ctrl = useCalendarController({ ...props, defaultView: \"week\" });\n\n return (\n <DndProvider backend={HTML5Backend}>\n <div className={cn(\"flex h-[calc(100vh-100px)] bg-background border rounded-lg overflow-hidden shadow-sm\", props.className)}>\n <CalendarSidebar \n isOpen={ctrl.isSidebarOpen} \n setIsOpen={ctrl.setIsSidebarOpen} \n tasks={ctrl.unplannedTasks} \n onAddClick={() => ctrl.handleAddClick()}\n onTaskClick={ctrl.handleTaskClick}\n mode=\"execution\"\n />\n \n <div className=\"flex-1 flex flex-col min-w-0 bg-card\">\n <CalendarHeader \n title={ctrl.view === 'day' ? format(ctrl.currentDate, \"MMM d, yyyy\") : format(ctrl.currentDate, \"MMMM yyyy\")}\n onPrev={ctrl.handlePrev}\n onNext={ctrl.handleNext}\n onToday={ctrl.handleToday}\n onAdd={() => ctrl.handleAddClick(ctrl.currentDate)}\n view={ctrl.view}\n setView={ctrl.setView}\n mode=\"execution\"\n />\n \n {ctrl.view === 'month' && <MonthHeader days={ctrl.calendarDays} />}\n\n <div className=\"flex-1 overflow-hidden flex flex-col relative\">\n {ctrl.view === 'month' ? (\n <MonthView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n currentDate={ctrl.currentDate}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"execution\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n mode=\"execution\"\n />\n ) : (\n <ExecutionTimelineView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"execution\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n />\n )}\n </div>\n </div>\n\n {ctrl.isModalOpen && (\n <TaskModal\n isOpen={ctrl.isModalOpen}\n onClose={() => ctrl.setIsModalOpen(false)}\n task={ctrl.editingTask || {}}\n onSave={ctrl.handleModalSave}\n isNew={ctrl.isNewTask}\n />\n )}\n </div>\n </DndProvider>\n );\n}\n"],"names":["ItemTypes","ChannelIcons","Instagram","Linkedin","Facebook","Twitter","Youtube","CalendarIcon","StatusColors","PastelColors","getRandomColor","id","index","acc","char","DraggableTaskCard","task","view","mode","onClick","style","isDragging","drag","useDrag","monitor","ChannelIcon","startDate","endDate","addHours","timeString","format","durationString","jsxs","cn","jsx","GripVertical","Badge","a","i","Avatar","AvatarImage","AvatarFallback","Clock","_a","EditorialColumnView","days","tasks","onDropTask","onTaskClick","onAddClick","day","dayTasks","t","isSameDay","b","EditorialColumn","isToday","isOver","drop","useDrop","item","Button","Plus","ExecutionTimelineView","HOURS","_","hour","setHours","dayIndex","ExecutionTimelineColumn","isLast","e","d","taskStart","taskEnd","startHour","getHours","startMin","getMinutes","durationMins","differenceInMinutes","topPosition","height","MonthView","currentDate","DroppableMonthCell","isSameMonth","date","isCurrentMonth","isTodayDate","TaskModal","isOpen","onClose","onSave","isNew","editedTask","setEditedTask","useState","useMemo","handleSave","Dialog","open","DialogContent","DialogHeader","DialogTitle","DialogDescription","newDateStr","current","newDate","timeStr","dateStr","channel","status","DialogFooter","useCalendarController","initialTasks","onTaskUpdate","onTaskCreate","defaultView","setCurrentDate","setView","isSidebarOpen","setIsSidebarOpen","isModalOpen","setIsModalOpen","editingTask","setEditingTask","isNewTask","setIsNewTask","calendarDays","monthStart","startOfMonth","monthEnd","endOfMonth","startOfWeek","endOfWeek","eachDayOfInterval","unplannedTasks","scheduledTasks","subMonths","addDays","addMonths","taskId","targetDate","oldDate","updatedTask","CalendarSidebar","setIsOpen","PanelLeftClose","ScrollArea","PanelLeftOpen","CalendarHeader","title","onPrev","onNext","onToday","onAdd","ChevronLeft","ChevronRight","ToggleGroup","v","ToggleGroupItem","MonthHeader","EditorialCalendar","props","ctrl","DndProvider","HTML5Backend","TaskCalendar"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"editorial-calendar.cjs","sources":["../../../../src/components/ui/data/editorial-calendar.tsx"],"sourcesContent":["import React, { useState, useMemo } from \"react\";\nimport { \n format, \n addMonths, \n subMonths, \n startOfMonth, \n endOfMonth, \n startOfWeek, \n endOfWeek, \n eachDayOfInterval, \n isSameMonth, \n isSameDay, \n isToday,\n addDays,\n setHours,\n getHours,\n getMinutes,\n differenceInMinutes,\n addHours,\n} from \"date-fns\";\nimport { \n ChevronLeft, \n ChevronRight, \n Plus, \n GripVertical,\n Instagram,\n Linkedin,\n Facebook,\n Twitter,\n Youtube,\n Calendar as CalendarIcon,\n Clock,\n PanelLeftClose,\n PanelLeftOpen,\n\n} from \"lucide-react\";\nimport { cn } from \"../utils\";\nimport { Button } from \"../primitives/button\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../primitives/avatar\";\nimport { Badge } from \"../primitives/badge\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../overlays/dialog\";\nimport { ToggleGroup, ToggleGroupItem } from \"../forms/toggle-group\";\nimport { ScrollArea } from \"../layout/scroll-area\";\nimport { DndProvider, useDrag, useDrop } from \"react-dnd\";\nimport { HTML5Backend } from \"react-dnd-html5-backend\";\n\n// --- Tipos ---\n\nexport type SocialChannel = \"instagram\" | \"linkedin\" | \"facebook\" | \"twitter\" | \"youtube\" | \"blog\" | \"other\";\nexport type TaskStatus = \"idea\" | \"planned\" | \"in-progress\" | \"approval\" | \"scheduled\" | \"published\";\nexport type CalendarMode = \"editorial\" | \"execution\";\n\nexport interface CalendarTask {\n id: string;\n title: string;\n date?: Date | string; // Data de início\n endDate?: Date | string; // Data de término (opcional)\n channel?: SocialChannel;\n status: TaskStatus;\n imageUrl?: string;\n description?: string;\n assignees?: {\n name: string;\n avatar?: string;\n }[];\n color?: string; // Cor customizada opcional\n}\n\ninterface BaseCalendarProps {\n tasks: CalendarTask[];\n onTaskUpdate: (updatedTask: CalendarTask) => void;\n onTaskCreate?: (newTask: Partial<CalendarTask>) => void;\n className?: string;\n}\n\ntype CalendarView = \"month\" | \"week\" | \"day\";\n\n/** Props compartilhadas pelas views de topo (recebem o grid inteiro de dias). */\ninterface CalendarViewProps {\n days: Date[];\n tasks: CalendarTask[];\n onDropTask: (taskId: string, date: Date) => void;\n onTaskClick: (task: CalendarTask) => void;\n onAddClick: (date?: Date) => void;\n}\n\n/** Props compartilhadas pelas colunas/células internas (já recebem um único dia). */\ninterface CalendarColumnProps {\n tasks: CalendarTask[];\n onDropTask: (taskId: string, date: Date) => void;\n onTaskClick: (task: CalendarTask) => void;\n onAddClick: (date: Date) => void;\n}\n\n// --- Constantes e Auxiliares ---\n\nconst ItemTypes = {\n TASK: 'task',\n};\n\nconst ChannelIcons: Record<SocialChannel, React.ElementType> = {\n instagram: Instagram,\n linkedin: Linkedin,\n facebook: Facebook,\n twitter: Twitter,\n youtube: Youtube,\n blog: CalendarIcon,\n other: CalendarIcon,\n};\n\n// Ícones de canal são monocromáticos — a forma do ícone carrega a identidade,\n// a cor fica no token neutro. Se o time quiser cores por canal no futuro, a\n// paleta de marca de terceiros entra como tokens `--brand-*` em tokens.css.\n\nconst StatusColors: Record<TaskStatus, string> = {\n idea: \"bg-muted text-muted-foreground border-border\",\n planned: \"bg-info/10 text-info-emphasis border-info/20\",\n \"in-progress\": \"bg-warning/10 text-warning-emphasis border-warning/20\",\n approval: \"bg-secondary text-secondary-foreground border-border\",\n scheduled: \"bg-success/10 text-success-emphasis border-success/20\",\n published: \"bg-foreground text-background border-foreground\",\n};\n\n// Rotating chart tokens for Execution mode cards (flip in dark mode)\n// Texto: chart-N misturado 45% com --foreground — o token cru é preenchimento e não passa AA\n// sobre o tint /15; 45% dá ≥ 5,3:1 nas 8 séries, nos dois temas (editorial-calendar.test.ts).\nconst PastelColors = [\n \"bg-chart-2/15 border-chart-2/30 text-[color-mix(in_oklab,var(--chart-2)_45%,var(--foreground))]\",\n \"bg-chart-3/15 border-chart-3/30 text-[color-mix(in_oklab,var(--chart-3)_45%,var(--foreground))]\",\n \"bg-chart-1/15 border-chart-1/30 text-[color-mix(in_oklab,var(--chart-1)_45%,var(--foreground))]\",\n \"bg-chart-4/15 border-chart-4/30 text-[color-mix(in_oklab,var(--chart-4)_45%,var(--foreground))]\",\n \"bg-chart-5/15 border-chart-5/30 text-[color-mix(in_oklab,var(--chart-5)_45%,var(--foreground))]\",\n \"bg-chart-8/15 border-chart-8/30 text-[color-mix(in_oklab,var(--chart-8)_45%,var(--foreground))]\",\n];\n\nconst getRandomColor = (id: string) => {\n const index = id.split(\"\").reduce((acc, char) => acc + char.charCodeAt(0), 0);\n return PastelColors[index % PastelColors.length];\n};\n\n// --- Draggable Card Component ---\n\nfunction DraggableTaskCard({ \n task, \n view = \"month\", \n mode = \"editorial\",\n onClick, \n style \n}: { \n task: CalendarTask; \n view?: \"month\" | \"week\" | \"day\" | \"4day\" | \"backlog\" | \"list\"; \n mode?: CalendarMode;\n onClick: () => void;\n style?: React.CSSProperties;\n}) {\n const [{ isDragging }, drag] = useDrag(() => ({\n type: ItemTypes.TASK,\n item: { id: task.id, type: ItemTypes.TASK },\n collect: (monitor) => ({\n isDragging: !!monitor.isDragging(),\n }),\n }), [task.id]);\n\n const ChannelIcon = task.channel ? ChannelIcons[task.channel] : CalendarIcon;\n \n const startDate = task.date ? new Date(task.date) : null;\n const endDate = task.endDate ? new Date(task.endDate) : (startDate ? addHours(startDate, 1) : null);\n \n const timeString = startDate ? format(startDate, \"HH:mm\") : null;\n const durationString = startDate && endDate \n ? `${format(startDate, \"HH:mm\")} - ${format(endDate, \"HH:mm\")}`\n : timeString;\n\n // ---- STYLES ----\n \n // 1. EDITORIAL - WEEK / DAY (Feed Style)\n if (mode === \"editorial\" && (view === \"week\" || view === \"day\")) {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer bg-card border rounded-md shadow-sm hover:shadow-md transition-all mb-3 overflow-hidden\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.status === \"published\" ? \"border-l-2 border-l-foreground\" : \"border-l-2 border-l-primary\"\n )}\n >\n {/* Header: Time & Channel */}\n <div className=\"flex items-center justify-between px-3 py-2 border-b bg-muted/50\">\n <div className=\"flex items-center gap-2\">\n <ChannelIcon size={14} className=\"text-muted-foreground\" />\n {timeString && <span className=\"text-xs font-medium text-muted-foreground\">{timeString}</span>}\n </div>\n <div className=\"opacity-0 group-hover:opacity-100 text-muted-foreground cursor-grab\">\n <GripVertical size={14} />\n </div>\n </div>\n\n {/* Image (Large) */}\n {task.imageUrl && (\n <div className=\"w-full aspect-video bg-muted relative border-b\">\n <img src={task.imageUrl} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-3\">\n <h4 className=\"text-sm font-medium text-foreground line-clamp-2 mb-2 leading-snug\">\n {task.title}\n </h4>\n <div className=\"flex items-center justify-between\">\n <Badge variant=\"outline\" className={cn(\"px-1.5 py-0 text-[10px] h-5 font-normal uppercase tracking-wide\", StatusColors[task.status])}>\n {task.status}\n </Badge>\n {task.assignees && task.assignees.length > 0 && (\n <div className=\"flex -space-x-2\">\n {task.assignees.slice(0,2).map((a, i) => (\n <Avatar key={i} className=\"w-5 h-5 border border-background\">\n <AvatarImage src={a.avatar} />\n <AvatarFallback className=\"text-[8px]\">{a.name[0]}</AvatarFallback>\n </Avatar>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // 2. EDITORIAL - MONTH (Compact Grid)\n if (mode === \"editorial\" && view === \"month\") {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer bg-card border rounded-md shadow-sm hover:shadow-md transition-all mb-1 overflow-hidden flex items-center gap-2 p-1.5\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.status === \"published\" ? \"border-l-2 border-l-foreground\" : \"border-l-2 border-l-primary\"\n )}\n >\n {task.imageUrl && (\n <div className=\"w-8 h-8 flex-shrink-0 bg-muted rounded overflow-hidden\">\n <img src={task.imageUrl} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5\">\n <ChannelIcon size={12} className=\"text-muted-foreground\" />\n <span className=\"truncate font-medium text-xs\">{task.title}</span>\n </div>\n </div>\n </div>\n );\n }\n\n // 3. EXECUTION - TIMELINE (Week / Day)\n if (mode === \"execution\" && (view === \"week\" || view === \"day\")) {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n style={style}\n className={cn(\n \"absolute z-10 rounded-md border shadow-sm p-1.5 text-xs flex flex-col overflow-hidden hover:overflow-visible hover:h-auto! hover:min-h-[min-content] hover:z-50 transition-all cursor-pointer group\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.color || getRandomColor(task.id)\n )}\n >\n <div className=\"flex items-center gap-1 mb-0.5 font-semibold text-[10px] leading-none\">\n <Clock size={10} />\n <span className=\"truncate\">{durationString}</span>\n </div>\n \n <div className=\"font-bold leading-tight mb-1 line-clamp-2 text-[11px]\">{task.title}</div>\n \n <div className=\"mt-auto flex items-center justify-between pt-1\">\n <div className=\"flex -space-x-1.5\">\n {task.assignees?.map((a, i) => (\n <Avatar key={i} className=\"w-4 h-4 border border-background\">\n <AvatarImage src={a.avatar} />\n <AvatarFallback className=\"text-[8px]\">{a.name[0]}</AvatarFallback>\n </Avatar>\n ))}\n </div>\n {task.status !== 'published' && (\n <div className={cn(\"w-2 h-2 rounded-full\", StatusColors[task.status].split(\" \")[1].replace(\"text-\", \"bg-\"))} />\n )}\n </div>\n </div>\n );\n }\n \n // 4. EXECUTION - MONTH\n if (mode === \"execution\" && view === \"month\") {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer rounded px-2 py-1 mb-1 text-xs truncate font-medium transition-all\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.color || getRandomColor(task.id).replace(\"bg-\", \"bg-opacity-20 bg-\") // lighter background\n )}\n >\n {timeString} {task.title}\n </div>\n );\n }\n\n // 5. BACKLOG (Generic)\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer bg-card border rounded-md shadow-sm hover:shadow-md transition-all mb-2 p-2 flex items-start gap-3\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n mode === 'editorial' && (task.status === \"published\" ? \"border-l-2 border-l-foreground\" : \"border-l-2 border-l-primary\")\n )}\n >\n {mode === 'editorial' && task.imageUrl && (\n <div className=\"w-10 h-10 flex-shrink-0 bg-muted rounded overflow-hidden\">\n <img src={task.imageUrl} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5 mb-1\">\n {mode === 'editorial' && <ChannelIcon size={12} className=\"text-muted-foreground\" />}\n <span className=\"truncate font-medium text-sm\">{task.title}</span>\n </div>\n <Badge variant=\"secondary\" className=\"text-[10px] h-4 px-1 py-0\">{task.status}</Badge>\n </div>\n </div>\n );\n}\n\n// --- Layout Views ---\n\n// 1. EDITORIAL WEEK/DAY VIEW (Columnar, NOT Timeline)\nfunction EditorialColumnView({\n days,\n tasks,\n onDropTask,\n onTaskClick,\n onAddClick,\n view\n}: CalendarViewProps & { view: CalendarView }) {\n return (\n <div className={cn(\n \"grid h-full min-h-[calc(100vh-200px)] bg-muted/30\",\n view === 'week' ? \"grid-cols-7 divide-x\" : \"grid-cols-1 border-x\"\n )}>\n {days.map((day: Date) => {\n const dayTasks = tasks\n .filter((t: CalendarTask) => t.date && isSameDay(new Date(t.date), day))\n .sort((a: CalendarTask, b: CalendarTask) => {\n // Sort by time if available\n if (a.date && b.date) {\n return new Date(a.date).getTime() - new Date(b.date).getTime();\n }\n return 0;\n });\n\n return (\n <EditorialColumn \n key={day.toISOString()}\n day={day}\n tasks={dayTasks}\n onDropTask={onDropTask}\n onTaskClick={onTaskClick}\n onAddClick={onAddClick}\n isToday={isToday(day)}\n />\n )\n })}\n </div>\n );\n}\n\nfunction EditorialColumn({ day, tasks, onDropTask, onTaskClick, onAddClick, isToday }: CalendarColumnProps & { day: Date; isToday: boolean }) {\n const [{ isOver }, drop] = useDrop(() => ({\n accept: ItemTypes.TASK,\n drop: (item: { id: string }) => onDropTask(item.id, day),\n collect: (monitor) => ({\n isOver: !!monitor.isOver(),\n }),\n }), [day, onDropTask]);\n\n return (\n <div \n ref={drop as unknown as React.Ref<HTMLDivElement>}\n className={cn(\n \"flex flex-col h-full min-h-0 transition-colors\",\n isOver && \"bg-accent ring-inset ring-2 ring-ring\"\n )}\n >\n {/* Sticky Header */}\n <div className={cn(\n \"p-2 text-center border-b bg-card sticky top-0 z-10\",\n isToday && \"bg-accent/50\"\n )}>\n <div className=\"text-xs font-semibold uppercase text-muted-foreground mb-1\">{format(day, 'EEE')}</div>\n <div className={cn(\n \"w-8 h-8 rounded-full flex items-center justify-center mx-auto text-sm font-medium\",\n isToday ? \"bg-primary text-primary-foreground\" : \"text-foreground bg-muted\"\n )}>\n {format(day, 'd')}\n </div>\n </div>\n\n {/* Scrollable Content */}\n <div className=\"flex-1 p-2 space-y-3 overflow-y-auto focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\" tabIndex={0} role=\"group\" aria-label={`Publicações de ${format(day, 'PP')}`}>\n <Button \n variant=\"outline\" \n size=\"sm\" \n className=\"w-full mb-2 justify-center px-1\"\n onClick={() => onAddClick(day)}\n >\n <Plus size={12} className=\"flex-shrink-0\" /> \n <span className=\"truncate ml-1.5 hidden xl:inline\">Add Post</span>\n <span className=\"truncate ml-1.5 inline xl:hidden\">Add</span>\n </Button>\n\n {tasks.map((task: CalendarTask) => (\n <DraggableTaskCard \n key={task.id}\n task={task}\n view=\"week\" // Triggers the Editorial Feed Card style\n mode=\"editorial\"\n onClick={() => onTaskClick(task)}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// 2. EXECUTION TIMELINE VIEW (Gantt/Agenda Style)\nfunction ExecutionTimelineView({ \n days,\n tasks, \n onDropTask, \n onTaskClick, \n onAddClick\n}: { \n days: Date[];\n tasks: CalendarTask[]; \n onDropTask: (taskId: string, date: Date) => void; \n onTaskClick: (task: CalendarTask) => void;\n onAddClick: (date: Date) => void;\n}) {\n \n const HOURS = Array.from({ length: 24 }, (_, i) => i);\n\n return (\n <div className=\"flex h-full relative overflow-y-auto bg-card select-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\" tabIndex={0} role=\"group\" aria-label=\"Linha do tempo de execução\">\n {/* Time Axis */}\n <div className=\"w-14 flex-shrink-0 border-r bg-card sticky left-0 z-30\">\n <div className=\"h-10 border-b bg-card sticky top-0 z-40 flex-shrink-0\" /> {/* Fixed height header match */}\n {HOURS.map(hour => (\n <div key={hour} className=\"h-24 border-b text-right pr-2 pt-2 text-xs text-muted-foreground font-medium relative\">\n <span className=\"-top-2.5 relative\">{format(setHours(new Date(), hour), \"ha\")}</span>\n </div>\n ))}\n </div>\n\n {/* Columns Container */}\n <div className=\"flex flex-1 min-w-0 relative\">\n {days.map((day, dayIndex) => {\n const dayTasks = tasks.filter(t => t.date && isSameDay(new Date(t.date), day));\n \n return (\n <ExecutionTimelineColumn \n key={day.toISOString()}\n day={day}\n tasks={dayTasks}\n onDropTask={onDropTask}\n onTaskClick={onTaskClick}\n onAddClick={onAddClick}\n isLast={dayIndex === days.length - 1}\n HOURS={HOURS}\n />\n );\n })}\n \n {/* Horizontal Grid Lines (Background) */}\n <div className=\"absolute inset-0 pointer-events-none z-0\">\n <div className=\"h-10 border-b bg-transparent\" /> {/* Header Spacer in grid */}\n {HOURS.map(hour => (\n <div key={hour} className=\"h-24 border-b border-dashed border-border w-full\" />\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction ExecutionTimelineColumn({\n day,\n tasks,\n onDropTask,\n onTaskClick,\n onAddClick,\n isLast,\n HOURS\n}: CalendarColumnProps & { day: Date; isLast: boolean; HOURS: number[] }) {\n const [{ isOver }, drop] = useDrop(() => ({\n accept: ItemTypes.TASK,\n drop: (item: { id: string }) => {\n onDropTask(item.id, day);\n },\n collect: (monitor) => ({\n isOver: !!monitor.isOver(),\n }),\n }), [day, onDropTask]);\n\n return (\n <div \n ref={drop as unknown as React.Ref<HTMLDivElement>}\n className={cn(\n \"flex-1 relative min-w-[150px]\", \n !isLast && \"border-r\",\n isOver && \"bg-accent/50\"\n )}\n >\n {/* Header (Only for timeline view within scroll area) */}\n <div className=\"sticky top-0 z-20 bg-card border-b h-10 flex items-center justify-center shadow-sm\">\n <div className=\"text-xs font-bold text-muted-foreground\">{format(day, 'EEE')} <span className={cn(\"ml-1\", isToday(day) && \"text-primary\")}>{format(day, 'd')}</span></div>\n </div>\n\n {/* Clickable areas for adding tasks */}\n {HOURS.map((hour: number) => (\n <div \n key={hour} \n className=\"h-24 w-full absolute hover:bg-muted/50 transition-colors cursor-pointer z-10\"\n style={{ top: `${hour * 96 + 40}px` }} \n onClick={(e) => {\n e.stopPropagation();\n const d = new Date(day);\n d.setHours(hour, 0);\n onAddClick(d);\n }}\n />\n ))}\n\n {/* Render Tasks */}\n {tasks.map((task: CalendarTask) => {\n const taskStart = task.date ? new Date(task.date) : new Date();\n const taskEnd = task.endDate ? new Date(task.endDate) : addHours(taskStart, 1);\n \n const startHour = getHours(taskStart);\n const startMin = getMinutes(taskStart);\n \n // Calculate duration in minutes for height\n let durationMins = differenceInMinutes(taskEnd, taskStart);\n if (durationMins < 30) durationMins = 30; // Min height\n\n const topPosition = (startHour * 96) + ((startMin / 60) * 96) + 40; // +40 for header offset\n const height = (durationMins / 60) * 96;\n\n return (\n <DraggableTaskCard \n key={task.id} \n task={task} \n view=\"week\" // Logic handled inside card based on 'mode' prop\n mode=\"execution\"\n onClick={() => onTaskClick(task)}\n style={{ \n top: `${topPosition}px`, \n height: `${height}px`, \n left: '4px',\n right: '4px',\n position: 'absolute'\n }}\n />\n );\n })}\n </div>\n );\n}\n\n// 3. MONTH VIEW\nfunction MonthView({\n days,\n tasks,\n currentDate,\n onDropTask,\n onTaskClick,\n onAddClick,\n mode\n}: CalendarViewProps & { currentDate: Date; mode: CalendarMode }) {\n return (\n <div className=\"grid grid-cols-7 auto-rows-fr min-h-[800px]\">\n {days.map((day: Date) => {\n const dayTasks = tasks.filter((t: CalendarTask) => \n t.date && isSameDay(new Date(t.date), day)\n );\n\n return (\n <DroppableMonthCell\n key={day.toISOString()}\n date={day}\n tasks={dayTasks}\n isCurrentMonth={isSameMonth(day, currentDate)}\n onDropTask={onDropTask}\n onTaskClick={onTaskClick}\n onAddClick={onAddClick}\n mode={mode}\n />\n );\n })}\n </div>\n )\n}\n\nfunction DroppableMonthCell({\n date,\n tasks,\n isCurrentMonth,\n onDropTask,\n onTaskClick,\n onAddClick,\n mode\n}: CalendarColumnProps & { date: Date; isCurrentMonth: boolean; mode: CalendarMode }) {\n const [{ isOver }, drop] = useDrop(() => ({\n accept: ItemTypes.TASK,\n drop: (item: { id: string }) => onDropTask(item.id, date),\n collect: (monitor) => ({\n isOver: !!monitor.isOver(),\n }),\n }), [date, onDropTask]);\n\n const isTodayDate = isToday(date);\n\n return (\n <div\n ref={drop as unknown as React.Ref<HTMLDivElement>}\n className={cn(\n \"min-h-[120px] border-b border-r p-2 relative transition-colors group flex flex-col\",\n !isCurrentMonth && \"bg-muted/50 text-muted-foreground\",\n isOver && \"bg-accent ring-2 ring-inset ring-ring\",\n isTodayDate && \"bg-accent/30\"\n )}\n >\n <div className=\"flex justify-between items-start mb-2\">\n <span className={cn(\n \"text-sm font-medium rounded-full w-7 h-7 flex items-center justify-center\",\n isTodayDate ? \"bg-primary text-primary-foreground\" : \"text-foreground\"\n )}>\n {format(date, \"d\")}\n </span>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 relative before:absolute before:-inset-1.5 before:content-[''] opacity-100 md:opacity-0 md:group-hover:opacity-100 md:group-focus-within:opacity-100 transition-opacity\"\n onClick={() => onAddClick(date)}\n aria-label={`Agendar publicação em ${format(date, \"d/MM\")}`}\n >\n <Plus size={14} />\n </Button>\n </div>\n\n <div className=\"flex-1 flex flex-col gap-1\">\n {tasks.map((task: CalendarTask) => (\n <DraggableTaskCard \n key={task.id}\n task={task}\n view=\"month\"\n mode={mode}\n onClick={() => onTaskClick(task)}\n />\n ))}\n </div>\n </div>\n )\n}\n\n// --- Task Modal (Shared) ---\n\nfunction TaskModal({ \n isOpen, \n onClose, \n task, \n onSave, \n isNew = false \n}: { \n isOpen: boolean; \n onClose: () => void; \n task?: Partial<CalendarTask>; \n onSave: (task: Partial<CalendarTask>) => void;\n isNew?: boolean;\n}) {\n const [editedTask, setEditedTask] = useState<Partial<CalendarTask>>(task || {});\n\n // Reset state when task changes\n useMemo(() => {\n setEditedTask(task || {});\n }, [task]);\n\n const handleSave = () => {\n onSave(editedTask);\n onClose();\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"sm:max-w-[600px]\">\n <DialogHeader>\n <DialogTitle>{isNew ? \"Create New Task\" : \"Edit Task\"}</DialogTitle>\n <DialogDescription>\n {isNew ? \"Enter the details for the new task below.\" : \"Modify the details of the selected task.\"}\n </DialogDescription>\n </DialogHeader>\n \n <div className=\"grid gap-6 py-4\">\n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label htmlFor=\"title\" className=\"text-right text-sm font-medium\">\n Title\n </label>\n <input\n id=\"title\"\n className=\"col-span-3 flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n value={editedTask.title || \"\"}\n onChange={(e) => setEditedTask({ ...editedTask, title: e.target.value })}\n placeholder=\"e.g. New Feature Announcement\"\n />\n </div>\n\n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label className=\"text-right text-sm font-medium\">\n Time\n </label>\n <div className=\"col-span-3 flex gap-2 items-center\">\n <input\n type=\"date\"\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.date instanceof Date ? format(editedTask.date, 'yyyy-MM-dd') : (typeof editedTask.date === 'string' ? editedTask.date.split('T')[0] : '')}\n onChange={(e) => {\n const newDateStr = e.target.value;\n const current = editedTask.date instanceof Date ? editedTask.date : new Date();\n const newDate = new Date(`${newDateStr}T${format(current, 'HH:mm')}`);\n setEditedTask({ ...editedTask, date: newDate })\n }}\n />\n <span className=\"text-sm text-muted-foreground\">at</span>\n <input \n type=\"time\"\n className=\"w-32 flex h-9 rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.date instanceof Date ? format(editedTask.date, 'HH:mm') : '09:00'}\n onChange={(e) => {\n const timeStr = e.target.value;\n const dateStr = editedTask.date instanceof Date ? format(editedTask.date, 'yyyy-MM-dd') : format(new Date(), 'yyyy-MM-dd');\n setEditedTask({ ...editedTask, date: new Date(`${dateStr}T${timeStr}`) })\n }}\n />\n </div>\n </div>\n \n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label htmlFor=\"channel\" className=\"text-right text-sm font-medium\">\n Channel / Category\n </label>\n <select\n id=\"channel\"\n className=\"col-span-3 flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.channel || \"instagram\"}\n onChange={(e) => setEditedTask({ ...editedTask, channel: e.target.value as SocialChannel })}\n >\n {Object.keys(ChannelIcons).map((channel) => (\n <option key={channel} value={channel}>{channel.charAt(0).toUpperCase() + channel.slice(1)}</option>\n ))}\n </select>\n </div>\n\n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label htmlFor=\"status\" className=\"text-right text-sm font-medium\">\n Status\n </label>\n <select\n id=\"status\"\n className=\"col-span-3 flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.status || \"idea\"}\n onChange={(e) => setEditedTask({ ...editedTask, status: e.target.value as TaskStatus })}\n >\n {Object.keys(StatusColors).map((status) => (\n <option key={status} value={status}>{status.charAt(0).toUpperCase() + status.slice(1)}</option>\n ))}\n </select>\n </div>\n\n <div className=\"grid grid-cols-4 items-start gap-4\">\n <label htmlFor=\"description\" className=\"text-right text-sm font-medium pt-2\">\n Description\n </label>\n <textarea\n id=\"description\"\n className=\"col-span-3 flex min-h-[80px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n value={editedTask.description || \"\"}\n onChange={(e) => setEditedTask({ ...editedTask, description: e.target.value })}\n placeholder=\"Details about this post...\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>Cancel</Button>\n <Button onClick={handleSave}>Save Changes</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n// --- Shared Controller Logic ---\n\nfunction useCalendarController({\n tasks: initialTasks,\n onTaskUpdate,\n onTaskCreate,\n defaultView = \"month\"\n}: BaseCalendarProps & { defaultView?: \"month\" | \"week\" | \"day\" }) {\n const [currentDate, setCurrentDate] = useState(new Date());\n const [view, setView] = useState<\"month\" | \"week\" | \"day\">(defaultView);\n const [isSidebarOpen, setIsSidebarOpen] = useState(true);\n \n // Modal state\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [editingTask, setEditingTask] = useState<Partial<CalendarTask> | null>(null);\n const [isNewTask, setIsNewTask] = useState(false);\n\n // Calendar Grid Generation\n const calendarDays = useMemo(() => {\n let startDate, endDate;\n\n if (view === 'month') {\n const monthStart = startOfMonth(currentDate);\n const monthEnd = endOfMonth(monthStart);\n startDate = startOfWeek(monthStart);\n endDate = endOfWeek(monthEnd);\n } else if (view === 'week') {\n startDate = startOfWeek(currentDate);\n endDate = endOfWeek(currentDate);\n } else {\n // Day view\n startDate = currentDate;\n endDate = currentDate;\n }\n\n return eachDayOfInterval({ start: startDate, end: endDate });\n }, [currentDate, view]);\n\n // Derived State\n const unplannedTasks = initialTasks.filter(t => !t.date);\n const scheduledTasks = initialTasks.filter(t => t.date);\n\n const handlePrev = () => {\n if (view === 'month') setCurrentDate(subMonths(currentDate, 1));\n else if (view === 'week') setCurrentDate(addDays(currentDate, -7));\n else setCurrentDate(addDays(currentDate, -1));\n };\n\n const handleNext = () => {\n if (view === 'month') setCurrentDate(addMonths(currentDate, 1));\n else if (view === 'week') setCurrentDate(addDays(currentDate, 7));\n else setCurrentDate(addDays(currentDate, 1));\n };\n\n const handleToday = () => setCurrentDate(new Date());\n\n const handleDropTask = (taskId: string, targetDate: Date, mode: CalendarMode) => {\n const task = initialTasks.find(t => t.id === taskId);\n if (task) {\n let newDate = new Date(targetDate);\n \n if (view === 'month' || mode === 'editorial') {\n if (task.date) {\n const oldDate = new Date(task.date);\n newDate.setHours(oldDate.getHours(), oldDate.getMinutes());\n } else {\n newDate.setHours(9, 0);\n }\n } \n \n const updatedTask = { ...task, date: newDate };\n onTaskUpdate(updatedTask);\n }\n };\n\n const handleTaskClick = (task: CalendarTask) => {\n setEditingTask(task);\n setIsNewTask(false);\n setIsModalOpen(true);\n };\n\n const handleAddClick = (date?: Date) => {\n const d = date || new Date();\n if (getHours(d) === 0 && getMinutes(d) === 0) {\n d.setHours(9, 0);\n }\n setEditingTask({\n date: d,\n status: \"idea\",\n channel: \"instagram\"\n });\n setIsNewTask(true);\n setIsModalOpen(true);\n };\n\n const handleModalSave = (task: Partial<CalendarTask>) => {\n if (isNewTask) {\n if (onTaskCreate) {\n onTaskCreate(task);\n }\n } else {\n if (task.id) {\n onTaskUpdate(task as CalendarTask);\n }\n }\n setIsModalOpen(false);\n };\n\n return {\n currentDate,\n view,\n setView,\n isSidebarOpen,\n setIsSidebarOpen,\n isModalOpen,\n setIsModalOpen,\n editingTask,\n isNewTask,\n calendarDays,\n unplannedTasks,\n scheduledTasks,\n handlePrev,\n handleNext,\n handleToday,\n handleDropTask,\n handleTaskClick,\n handleAddClick,\n handleModalSave\n };\n}\n\n// --- Helper Components ---\n\nfunction CalendarSidebar({ isOpen, setIsOpen, tasks, onAddClick, onTaskClick, mode }: {\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n tasks: CalendarTask[];\n onAddClick: () => void;\n onTaskClick: (task: CalendarTask) => void;\n mode: CalendarMode;\n}) {\n if (!isOpen) {\n return (\n <div className=\"border-r bg-card flex flex-col items-center py-4 w-12 flex-shrink-0 cursor-pointer hover:bg-muted transition-colors\" onClick={() => setIsOpen(true)}>\n <PanelLeftOpen className=\"text-muted-foreground mb-4\" size={20} />\n <div className=\"flex-1 flex items-center justify-center min-h-0\">\n <div className=\"whitespace-nowrap text-xs font-medium text-muted-foreground -rotate-90 transform\">BACKLOG</div>\n </div>\n <Badge className=\"mt-2 h-5 w-5 p-0 flex items-center justify-center rounded-full bg-primary text-[10px]\">{tasks.length}</Badge>\n </div>\n );\n }\n\n return (\n <div className=\"w-72 border-r bg-muted/50 flex flex-col transition-all duration-300 flex-shrink-0\">\n <div className=\"p-4 border-b bg-card flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold text-sm text-foreground\">Backlog</h3>\n <Badge variant=\"secondary\" className=\"bg-muted text-foreground text-xs\">{tasks.length}</Badge>\n </div>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6 relative before:absolute before:-inset-1.5 before:content-['']\" onClick={() => setIsOpen(false)} aria-label=\"Recolher backlog\">\n <PanelLeftClose size={16} />\n </Button>\n </div>\n <div className=\"px-4 pt-3 bg-card pb-3 border-b space-y-2\">\n <Button \n onClick={onAddClick} \n variant=\"outline\" \n size=\"sm\" \n className=\"w-full justify-start pl-2\"\n >\n <Plus size={12} className=\"mr-1.5\" /> New Task\n </Button>\n </div>\n \n <ScrollArea className=\"flex-1 p-3\">\n <div className=\"space-y-2\">\n {tasks.length === 0 ? (\n <div className=\"text-center py-10 px-4 border-2 border-dashed border-border rounded-lg\">\n <p className=\"text-xs text-foreground/70\">Nenhum item sem agenda</p>\n </div>\n ) : (\n tasks.map((task: CalendarTask) => (\n <DraggableTaskCard \n key={task.id} \n task={task} \n view=\"backlog\"\n mode={mode}\n onClick={() => onTaskClick(task)} \n />\n ))\n )}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nfunction CalendarHeader({ title, onPrev, onNext, onToday, onAdd, view, setView }: {\n title: string;\n onPrev: () => void;\n onNext: () => void;\n onToday: () => void;\n onAdd: () => void;\n view: CalendarView;\n setView: (view: CalendarView) => void;\n mode?: CalendarMode;\n}) {\n return (\n <div className=\"flex flex-col xl:flex-row items-center justify-between p-4 border-b gap-4 flex-shrink-0 bg-card\">\n <div className=\"flex items-center gap-4 w-full xl:w-auto justify-between xl:justify-start\">\n <div className=\"flex items-center border rounded-md bg-card shadow-sm\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onPrev} className=\"h-8 w-8 rounded-r-none\" aria-label=\"Anterior\">\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" onClick={onToday} className=\"h-8 px-3 rounded-none border-x text-sm font-medium hover:bg-muted\">\n Hoje\n </Button>\n <Button variant=\"ghost\" size=\"icon\" onClick={onNext} className=\"h-8 w-8 rounded-l-none\" aria-label=\"Próximo\">\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n <h2 className=\"text-lg font-bold text-foreground whitespace-nowrap\">\n {title}\n </h2>\n </div>\n\n <div className=\"flex items-center gap-3 w-full xl:w-auto overflow-x-auto pb-1 xl:pb-0 justify-end\">\n <ToggleGroup\n type=\"single\"\n value={view}\n onValueChange={(v) => v && setView(v as CalendarView)}\n className=\"flex-shrink-0\"\n aria-label=\"Visualização do calendário\"\n >\n <ToggleGroupItem value=\"month\" className=\"text-xs\">Mês</ToggleGroupItem>\n <ToggleGroupItem value=\"week\" className=\"text-xs\">Semana</ToggleGroupItem>\n <ToggleGroupItem value=\"day\" className=\"text-xs\">Dia</ToggleGroupItem>\n </ToggleGroup>\n\n <Button\n variant=\"default\"\n className=\"h-9 px-4 flex-shrink-0\"\n onClick={onAdd}\n >\n <Plus className=\"mr-2 h-4 w-4\" /> Criar\n </Button>\n </div>\n </div>\n );\n}\n\nfunction MonthHeader({ days }: { days: Date[] }) {\n return (\n <div className=\"grid grid-cols-7 border-b bg-muted/50 flex-shrink-0 divide-x\">\n {days.slice(0, 7).map((day, index) => (\n <div key={index} className=\"py-2 text-center group\">\n <div className={cn(\"text-xs font-semibold uppercase tracking-wider\", isToday(day) ? \"text-primary\" : \"text-foreground/70\")}>\n {format(day, 'EEE')}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\n// --- EXPORTED COMPONENTS ---\n\nexport function EditorialCalendar(props: BaseCalendarProps) {\n const ctrl = useCalendarController({ ...props, defaultView: \"month\" });\n \n return (\n <DndProvider backend={HTML5Backend}>\n <div className={cn(\"flex h-[calc(100vh-100px)] bg-background border rounded-lg overflow-hidden shadow-sm\", props.className)}>\n <CalendarSidebar \n isOpen={ctrl.isSidebarOpen} \n setIsOpen={ctrl.setIsSidebarOpen} \n tasks={ctrl.unplannedTasks} \n onAddClick={() => ctrl.handleAddClick()}\n onTaskClick={ctrl.handleTaskClick}\n mode=\"editorial\"\n />\n \n <div className=\"flex-1 flex flex-col min-w-0 bg-card\">\n <CalendarHeader \n title={ctrl.view === 'day' ? format(ctrl.currentDate, \"MMM d, yyyy\") : format(ctrl.currentDate, \"MMMM yyyy\")}\n onPrev={ctrl.handlePrev}\n onNext={ctrl.handleNext}\n onToday={ctrl.handleToday}\n onAdd={() => ctrl.handleAddClick(ctrl.currentDate)}\n view={ctrl.view}\n setView={ctrl.setView}\n mode=\"editorial\"\n />\n\n {ctrl.view === 'month' && <MonthHeader days={ctrl.calendarDays} />}\n \n <div className=\"flex-1 overflow-hidden flex flex-col relative\">\n {ctrl.view === 'month' ? (\n <MonthView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n currentDate={ctrl.currentDate}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"editorial\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n mode=\"editorial\"\n />\n ) : (\n <EditorialColumnView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"editorial\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n view={ctrl.view}\n />\n )}\n </div>\n </div>\n\n {ctrl.isModalOpen && (\n <TaskModal\n isOpen={ctrl.isModalOpen}\n onClose={() => ctrl.setIsModalOpen(false)}\n task={ctrl.editingTask || {}}\n onSave={ctrl.handleModalSave}\n isNew={ctrl.isNewTask}\n />\n )}\n </div>\n </DndProvider>\n );\n}\n\nexport function TaskCalendar(props: BaseCalendarProps) {\n const ctrl = useCalendarController({ ...props, defaultView: \"week\" });\n\n return (\n <DndProvider backend={HTML5Backend}>\n <div className={cn(\"flex h-[calc(100vh-100px)] bg-background border rounded-lg overflow-hidden shadow-sm\", props.className)}>\n <CalendarSidebar \n isOpen={ctrl.isSidebarOpen} \n setIsOpen={ctrl.setIsSidebarOpen} \n tasks={ctrl.unplannedTasks} \n onAddClick={() => ctrl.handleAddClick()}\n onTaskClick={ctrl.handleTaskClick}\n mode=\"execution\"\n />\n \n <div className=\"flex-1 flex flex-col min-w-0 bg-card\">\n <CalendarHeader \n title={ctrl.view === 'day' ? format(ctrl.currentDate, \"MMM d, yyyy\") : format(ctrl.currentDate, \"MMMM yyyy\")}\n onPrev={ctrl.handlePrev}\n onNext={ctrl.handleNext}\n onToday={ctrl.handleToday}\n onAdd={() => ctrl.handleAddClick(ctrl.currentDate)}\n view={ctrl.view}\n setView={ctrl.setView}\n mode=\"execution\"\n />\n \n {ctrl.view === 'month' && <MonthHeader days={ctrl.calendarDays} />}\n\n <div className=\"flex-1 overflow-hidden flex flex-col relative\">\n {ctrl.view === 'month' ? (\n <MonthView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n currentDate={ctrl.currentDate}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"execution\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n mode=\"execution\"\n />\n ) : (\n <ExecutionTimelineView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"execution\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n />\n )}\n </div>\n </div>\n\n {ctrl.isModalOpen && (\n <TaskModal\n isOpen={ctrl.isModalOpen}\n onClose={() => ctrl.setIsModalOpen(false)}\n task={ctrl.editingTask || {}}\n onSave={ctrl.handleModalSave}\n isNew={ctrl.isNewTask}\n />\n )}\n </div>\n </DndProvider>\n );\n}\n"],"names":["ItemTypes","ChannelIcons","Instagram","Linkedin","Facebook","Twitter","Youtube","CalendarIcon","StatusColors","PastelColors","getRandomColor","id","index","acc","char","DraggableTaskCard","task","view","mode","onClick","style","isDragging","drag","useDrag","monitor","ChannelIcon","startDate","endDate","addHours","timeString","format","durationString","jsxs","cn","jsx","GripVertical","Badge","a","i","Avatar","AvatarImage","AvatarFallback","Clock","_a","EditorialColumnView","days","tasks","onDropTask","onTaskClick","onAddClick","day","dayTasks","t","isSameDay","b","EditorialColumn","isToday","isOver","drop","useDrop","item","Button","Plus","ExecutionTimelineView","HOURS","_","hour","setHours","dayIndex","ExecutionTimelineColumn","isLast","e","d","taskStart","taskEnd","startHour","getHours","startMin","getMinutes","durationMins","differenceInMinutes","topPosition","height","MonthView","currentDate","DroppableMonthCell","isSameMonth","date","isCurrentMonth","isTodayDate","TaskModal","isOpen","onClose","onSave","isNew","editedTask","setEditedTask","useState","useMemo","handleSave","Dialog","open","DialogContent","DialogHeader","DialogTitle","DialogDescription","newDateStr","current","newDate","timeStr","dateStr","channel","status","DialogFooter","useCalendarController","initialTasks","onTaskUpdate","onTaskCreate","defaultView","setCurrentDate","setView","isSidebarOpen","setIsSidebarOpen","isModalOpen","setIsModalOpen","editingTask","setEditingTask","isNewTask","setIsNewTask","calendarDays","monthStart","startOfMonth","monthEnd","endOfMonth","startOfWeek","endOfWeek","eachDayOfInterval","unplannedTasks","scheduledTasks","subMonths","addDays","addMonths","taskId","targetDate","oldDate","updatedTask","CalendarSidebar","setIsOpen","PanelLeftClose","ScrollArea","PanelLeftOpen","CalendarHeader","title","onPrev","onNext","onToday","onAdd","ChevronLeft","ChevronRight","ToggleGroup","v","ToggleGroupItem","MonthHeader","EditorialCalendar","props","ctrl","DndProvider","HTML5Backend","TaskCalendar"],"mappings":"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"}
|