@mlw-packages/react-components 1.7.17 → 1.7.19

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
@@ -12163,7 +12163,7 @@ function AgendaView({
12163
12163
  onEventSelect,
12164
12164
  showUndatedEvents = false
12165
12165
  }) {
12166
- const isValidDate3 = (d) => {
12166
+ const isValidDate6 = (d) => {
12167
12167
  try {
12168
12168
  const t = d instanceof Date ? d.getTime() : new Date(String(d)).getTime();
12169
12169
  return !isNaN(t);
@@ -12172,11 +12172,11 @@ function AgendaView({
12172
12172
  }
12173
12173
  };
12174
12174
  const datedEvents = useMemo9(
12175
- () => events.filter((e) => isValidDate3(e.start) && isValidDate3(e.end)),
12175
+ () => events.filter((e) => isValidDate6(e.start) && isValidDate6(e.end)),
12176
12176
  [events]
12177
12177
  );
12178
12178
  const undatedEvents = useMemo9(
12179
- () => events.filter((e) => !(isValidDate3(e.start) && isValidDate3(e.end))),
12179
+ () => events.filter((e) => !(isValidDate6(e.start) && isValidDate6(e.end))),
12180
12180
  [events]
12181
12181
  );
12182
12182
  const days = useMemo9(() => {
@@ -12900,19 +12900,14 @@ function EventCalendar({
12900
12900
  onEventUpdate,
12901
12901
  onEventDelete,
12902
12902
  className,
12903
- initialView = "month",
12904
- mode = "default"
12903
+ initialView = "month"
12905
12904
  }) {
12906
- const isAgendaOnly = mode === "agenda-only";
12907
12905
  const [currentDate, setCurrentDate] = useState24(/* @__PURE__ */ new Date());
12908
- const [view, setView] = useState24(
12909
- isAgendaOnly ? "agenda" : initialView
12910
- );
12906
+ const [view, setView] = useState24(initialView);
12911
12907
  const [isFading, setIsFading] = useState24(false);
12912
12908
  const FADE_DURATION = 220;
12913
12909
  const changeView = useCallback12(
12914
12910
  (next) => {
12915
- if (isAgendaOnly) return;
12916
12911
  if (next === view) return;
12917
12912
  setIsFading(true);
12918
12913
  window.setTimeout(() => {
@@ -12920,7 +12915,7 @@ function EventCalendar({
12920
12915
  requestAnimationFrame(() => setIsFading(false));
12921
12916
  }, FADE_DURATION);
12922
12917
  },
12923
- [view, isAgendaOnly]
12918
+ [view]
12924
12919
  );
12925
12920
  const [isPaging, setIsPaging] = useState24(false);
12926
12921
  const [pageDirection, setPageDirection] = useState24(
@@ -12950,7 +12945,6 @@ function EventCalendar({
12950
12945
  if (isEventDialogOpen || e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement || e.target instanceof HTMLElement && e.target.isContentEditable) {
12951
12946
  return;
12952
12947
  }
12953
- if (isAgendaOnly) return;
12954
12948
  switch (e.key.toLowerCase()) {
12955
12949
  case "m":
12956
12950
  changeView("month");
@@ -12971,7 +12965,7 @@ function EventCalendar({
12971
12965
  return () => {
12972
12966
  window.removeEventListener("keydown", handleKeyDown);
12973
12967
  };
12974
- }, [isEventDialogOpen, changeView, isAgendaOnly]);
12968
+ }, [isEventDialogOpen, changeView]);
12975
12969
  const handlePrevious = () => {
12976
12970
  pageTransition(() => {
12977
12971
  if (view === "month") {
@@ -13002,13 +12996,11 @@ function EventCalendar({
13002
12996
  setCurrentDate(/* @__PURE__ */ new Date());
13003
12997
  };
13004
12998
  const handleEventSelect = (event) => {
13005
- if (isAgendaOnly) return;
13006
12999
  console.log("Event selected:", event);
13007
13000
  setSelectedEvent(event);
13008
13001
  setIsEventDialogOpen(true);
13009
13002
  };
13010
13003
  const handleEventCreate = (startTime) => {
13011
- if (isAgendaOnly) return;
13012
13004
  console.log("Creating new event at:", startTime);
13013
13005
  const minutes = startTime.getMinutes();
13014
13006
  const remainder = minutes % 15;
@@ -13035,9 +13027,13 @@ function EventCalendar({
13035
13027
  if (event.id) {
13036
13028
  onEventUpdate?.(event);
13037
13029
  toast3(`Evento "${event.title}" atualizado`, {
13038
- description: format5(new Date(event.start), "d 'de' MMMM 'de' yyyy", {
13039
- locale: ptBR4
13040
- }),
13030
+ description: format5(
13031
+ new Date(event.start ?? event.attend_date ?? event.end ?? Date.now()),
13032
+ "d 'de' MMMM 'de' yyyy",
13033
+ {
13034
+ locale: ptBR4
13035
+ }
13036
+ ),
13041
13037
  position: "bottom-left"
13042
13038
  });
13043
13039
  } else {
@@ -13046,9 +13042,11 @@ function EventCalendar({
13046
13042
  id: Math.random().toString(36).substring(2, 11)
13047
13043
  });
13048
13044
  toast3(`Evento "${event.title}" adicionado`, {
13049
- description: format5(new Date(event.start), "d 'de' MMMM 'de' yyyy", {
13050
- locale: ptBR4
13051
- }),
13045
+ description: format5(
13046
+ new Date(event.start ?? event.attend_date ?? event.end ?? Date.now()),
13047
+ "d 'de' MMMM 'de' yyyy",
13048
+ { locale: ptBR4 }
13049
+ ),
13052
13050
  position: "bottom-left"
13053
13051
  });
13054
13052
  }
@@ -13063,7 +13061,9 @@ function EventCalendar({
13063
13061
  if (deletedEvent) {
13064
13062
  toast3(`Evento "${deletedEvent.title}" exclu\xEDdo`, {
13065
13063
  description: format5(
13066
- new Date(deletedEvent.start),
13064
+ new Date(
13065
+ deletedEvent.start ?? deletedEvent.attend_date ?? deletedEvent.end ?? Date.now()
13066
+ ),
13067
13067
  "d 'de' MMMM 'de' yyyy",
13068
13068
  { locale: ptBR4 }
13069
13069
  ),
@@ -13075,7 +13075,9 @@ function EventCalendar({
13075
13075
  onEventUpdate?.(updatedEvent);
13076
13076
  toast3(`Evento "${updatedEvent.title}" movido`, {
13077
13077
  description: format5(
13078
- new Date(updatedEvent.start),
13078
+ new Date(
13079
+ updatedEvent.start ?? updatedEvent.attend_date ?? updatedEvent.end ?? Date.now()
13080
+ ),
13079
13081
  "d 'de' MMMM 'de' yyyy",
13080
13082
  { locale: ptBR4 }
13081
13083
  ),
@@ -13133,7 +13135,7 @@ function EventCalendar({
13133
13135
  ),
13134
13136
  children: [
13135
13137
  /* @__PURE__ */ jsxs58("div", { className: "flex items-center gap-1 sm:gap-4", children: [
13136
- !isAgendaOnly && /* @__PURE__ */ jsxs58(
13138
+ /* @__PURE__ */ jsxs58(
13137
13139
  ButtonBase,
13138
13140
  {
13139
13141
  className: "max-[479px]:aspect-square max-[479px]:p-0!",
@@ -13176,7 +13178,7 @@ function EventCalendar({
13176
13178
  ] }),
13177
13179
  /* @__PURE__ */ jsx78("h2", { className: "font-semibold text-sm sm:text-lg md:text-xl", children: viewTitle })
13178
13180
  ] }),
13179
- /* @__PURE__ */ jsx78("div", { className: "flex items-center gap-2", children: !isAgendaOnly && /* @__PURE__ */ jsxs58(Fragment11, { children: [
13181
+ /* @__PURE__ */ jsx78("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxs58(Fragment11, { children: [
13180
13182
  /* @__PURE__ */ jsxs58(DropDownMenuBase, { children: [
13181
13183
  /* @__PURE__ */ jsx78(DropDownMenuTriggerBase, { asChild: true, children: /* @__PURE__ */ jsxs58(
13182
13184
  ButtonBase,
@@ -13221,8 +13223,7 @@ function EventCalendar({
13221
13223
  /* @__PURE__ */ jsx78(DropDownMenuShortcutBase, { children: "M" })
13222
13224
  ] }),
13223
13225
  /* @__PURE__ */ jsxs58(DropDownMenuItemBase, { onClick: () => changeView("week"), children: [
13224
- "Semana",
13225
- " ",
13226
+ "Semana ",
13226
13227
  /* @__PURE__ */ jsx78(DropDownMenuShortcutBase, { children: "S" })
13227
13228
  ] }),
13228
13229
  /* @__PURE__ */ jsxs58(DropDownMenuItemBase, { onClick: () => changeView("day"), children: [
@@ -13230,8 +13231,7 @@ function EventCalendar({
13230
13231
  /* @__PURE__ */ jsx78(DropDownMenuShortcutBase, { children: "D" })
13231
13232
  ] }),
13232
13233
  /* @__PURE__ */ jsxs58(DropDownMenuItemBase, { onClick: () => changeView("agenda"), children: [
13233
- "Agenda",
13234
- " ",
13234
+ "Agenda ",
13235
13235
  /* @__PURE__ */ jsx78(DropDownMenuShortcutBase, { children: "A" })
13236
13236
  ] })
13237
13237
  ] })
@@ -13303,8 +13303,7 @@ function EventCalendar({
13303
13303
  {
13304
13304
  currentDate,
13305
13305
  events,
13306
- onEventSelect: isAgendaOnly ? void 0 : handleEventSelect,
13307
- showUndatedEvents: isAgendaOnly
13306
+ onEventSelect: handleEventSelect
13308
13307
  }
13309
13308
  )
13310
13309
  ]
@@ -13333,7 +13332,7 @@ function EventCalendar({
13333
13332
  "--event-height": `${EventHeight}px`,
13334
13333
  "--week-cells-height": `${WeekCellsHeight}px`
13335
13334
  },
13336
- children: isAgendaOnly ? calendarContent : /* @__PURE__ */ jsx78(CalendarDndProvider, { onEventUpdate: handleEventUpdate, children: calendarContent })
13335
+ children: /* @__PURE__ */ jsx78(CalendarDndProvider, { onEventUpdate: handleEventUpdate, children: calendarContent })
13337
13336
  }
13338
13337
  );
13339
13338
  }
@@ -13803,6 +13802,9 @@ function EventDialog({
13803
13802
  // src/components/event-calendar/EventItem.tsx
13804
13803
  import { differenceInMinutes as differenceInMinutes3, format as format7, isPast } from "date-fns";
13805
13804
  import { useMemo as useMemo13 } from "react";
13805
+ import {
13806
+ ClockUserIcon
13807
+ } from "@phosphor-icons/react";
13806
13808
  import { Fragment as Fragment12, jsx as jsx80, jsxs as jsxs60 } from "react/jsx-runtime";
13807
13809
  var formatTimeWithOptionalMinutes = (date) => {
13808
13810
  return format7(date, "HH:mm");
@@ -13830,17 +13832,26 @@ function EventWrapper({
13830
13832
  onTouchStart,
13831
13833
  ariaLabel
13832
13834
  }) {
13833
- const hasValidTimeForWrapper = isValidDate(event.start) && isValidDate(event.end);
13834
- const displayEnd = hasValidTimeForWrapper ? currentTime ? new Date(
13835
- new Date(currentTime).getTime() + (new Date(event.end).getTime() - new Date(event.start).getTime())
13836
- ) : new Date(event.end) : void 0;
13835
+ const hasValidTimeForWrapper = isValidDate(event.start) && isValidDate(event.end) || isValidDate(event.attend_date);
13836
+ const displayEnd = (() => {
13837
+ if (isValidDate(event.start) && isValidDate(event.end)) {
13838
+ return currentTime ? new Date(
13839
+ new Date(currentTime).getTime() + (new Date(event.end).getTime() - new Date(event.start).getTime())
13840
+ ) : new Date(event.end);
13841
+ }
13842
+ if (isValidDate(event.attend_date)) {
13843
+ const start = new Date(event.attend_date);
13844
+ return addHoursToDate(start, 1);
13845
+ }
13846
+ return void 0;
13847
+ })();
13837
13848
  const isEventInPast = displayEnd ? isPast(displayEnd) : false;
13838
13849
  const colorClasses = hasValidTimeForWrapper ? getEventColorClasses(event.color) : "bg-gray-200/50 hover:bg-gray-200/40 text-gray-900/80 dark:bg-gray-700/25 dark:text-gray-200/90 shadow-none";
13839
13850
  return /* @__PURE__ */ jsx80(
13840
13851
  "button",
13841
13852
  {
13842
13853
  className: cn(
13843
- "flex w-full select-none overflow-hidden px-3 py-1 text-left font-medium outline-none transition-transform duration-150 ease-out backdrop-blur-sm focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:border-ring data-dragging:cursor-grabbing data-past-event:line-through data-dragging:shadow-lg sm:px-3 rounded-lg shadow-sm hover:shadow-md hover:scale-105",
13854
+ "flex w-full select-none overflow-hidden px-3 py-1 text-left font-medium outline-none transition-transform duration-150 ease-out backdrop-blur-sm focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:border-ring data-dragging:cursor-grabbing data-past-event:line-through data-dragging:shadow-lg sm:px-3 rounded-lg shadow-sm hover:shadow-md ",
13844
13855
  colorClasses,
13845
13856
  getBorderRadiusClasses(isFirstDay, isLastDay),
13846
13857
  className
@@ -13861,7 +13872,6 @@ function EventWrapper({
13861
13872
  function EventItem({
13862
13873
  event,
13863
13874
  view,
13864
- isDragging,
13865
13875
  onClick,
13866
13876
  showTime,
13867
13877
  currentTime,
@@ -13940,12 +13950,9 @@ function EventItem({
13940
13950
  dndListeners,
13941
13951
  event,
13942
13952
  ariaLabel,
13943
- isDragging,
13944
13953
  isFirstDay,
13945
13954
  isLastDay,
13946
13955
  onClick,
13947
- onMouseDown,
13948
- onTouchStart,
13949
13956
  children: children || /* @__PURE__ */ jsxs60("span", { className: "flex items-center gap-2 truncate", children: [
13950
13957
  !event.allDay && hasValidTime && displayStart && /* @__PURE__ */ jsx80("span", { className: "truncate font-normal opacity-80 sm:text-[11px] bg-white/10 px-2 py-0.5 rounded-full text-[11px]", children: formatTimeWithOptionalMinutes(displayStart) }),
13951
13958
  /* @__PURE__ */ jsx80(
@@ -13977,27 +13984,22 @@ function EventItem({
13977
13984
  dndListeners,
13978
13985
  event,
13979
13986
  ariaLabel,
13980
- isDragging,
13981
13987
  isFirstDay,
13982
13988
  isLastDay,
13983
- onClick,
13984
- onMouseDown,
13985
- onTouchStart,
13986
13989
  children: durationMinutes < 45 ? /* @__PURE__ */ jsxs60("div", { className: "flex items-center justify-between w-full", children: [
13987
- /* @__PURE__ */ jsx80("div", { className: cn("truncate", agendaOnly ? "text-lg" : ""), children: event.title }),
13990
+ /* @__PURE__ */ jsx80("div", { className: cn("truncate text-lg"), children: event.title }),
13988
13991
  showTime && hasValidTime && displayStart && /* @__PURE__ */ jsx80("span", { className: "ml-2 inline-block bg-white/10 px-2 py-0.5 rounded-full text-[11px] opacity-90", children: formatTimeWithOptionalMinutes(displayStart) })
13989
13992
  ] }) : /* @__PURE__ */ jsxs60(Fragment12, { children: [
13990
13993
  /* @__PURE__ */ jsx80(
13991
13994
  "div",
13992
13995
  {
13993
13996
  className: cn(
13994
- "truncate font-medium",
13995
- agendaOnly ? "text-lg" : ""
13997
+ "truncate font-medium text-lg"
13996
13998
  ),
13997
13999
  children: event.title
13998
14000
  }
13999
14001
  ),
14000
- showTime && hasValidTime && /* @__PURE__ */ jsx80("div", { className: "truncate font-normal opacity-70 sm:text-[11px]", children: /* @__PURE__ */ jsx80("span", { className: "inline-block bg-white/5 px-2 py-0.5 rounded-full", children: getEventTime() }) })
14002
+ showTime && hasValidTime && /* @__PURE__ */ jsx80("div", { className: "truncate font-normal opacity-70 sm:text-[15px]", children: /* @__PURE__ */ jsx80("span", { className: "inline-block bg-white/5 px-0.5 py-0.5 rounded-full", children: getEventTime() }) })
14001
14003
  ] })
14002
14004
  }
14003
14005
  );
@@ -14038,7 +14040,7 @@ function EventItem({
14038
14040
  {
14039
14041
  className: cn(
14040
14042
  "my-1 opacity-90",
14041
- agendaOnly ? "text-sm" : "text-xs"
14043
+ agendaOnly ? "text-md" : "text-xs"
14042
14044
  ),
14043
14045
  style: {
14044
14046
  display: "-webkit-box",
@@ -14057,7 +14059,7 @@ function EventItem({
14057
14059
  "button",
14058
14060
  {
14059
14061
  className: cn(
14060
- "flex w-full flex-col gap-2 rounded-lg p-3 text-left outline-none transition-shadow duration-150 ease-out hover:bg-white/3 focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:border-ring data-past-event:line-through data-past-event:opacity-90",
14062
+ "flex w-full flex-col gap-2 rounded-lg p-3 text-left outline-none transition-shadow duration-150 ease-out hover:bg-white/3 focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:border-ring data-past-event:line-through data-past-event:opacity-90 border-2 border-border",
14061
14063
  colorClasses,
14062
14064
  className
14063
14065
  ),
@@ -14070,32 +14072,29 @@ function EventItem({
14070
14072
  ...dndListeners,
14071
14073
  ...dndAttributes,
14072
14074
  children: [
14073
- /* @__PURE__ */ jsx80("div", { className: cn("font-medium", agendaOnly ? "text-lg" : "text-sm"), children: event.title }),
14074
- /* @__PURE__ */ jsxs60(
14075
- "div",
14076
- {
14077
- className: cn(
14078
- "opacity-70 flex items-center gap-2",
14079
- agendaOnly ? "text-sm" : "text-xs"
14080
- ),
14081
- children: [
14082
- event.allDay ? /* @__PURE__ */ jsx80("span", { className: "uppercase", children: "All day" }) : /* @__PURE__ */ jsxs60("span", { className: "uppercase", children: [
14075
+ /* @__PURE__ */ jsxs60("div", { className: "flex w-full justify-between border-b-2 border-black/5 ", children: [
14076
+ /* @__PURE__ */ jsx80("div", { className: cn("font-bold text-lg"), children: event.title }),
14077
+ /* @__PURE__ */ jsx80(
14078
+ "div",
14079
+ {
14080
+ className: cn(
14081
+ "opacity-90 flex items-center gap-2 text-lg"
14082
+ ),
14083
+ children: event.allDay ? /* @__PURE__ */ jsx80("span", { children: "Dia todo" }) : /* @__PURE__ */ jsxs60("span", { className: "uppercase font-semibold flex items-center gap-2", children: [
14083
14084
  formatTimeWithOptionalMinutes(displayStart),
14084
- " -",
14085
- " ",
14086
- formatTimeWithOptionalMinutes(displayEnd)
14087
- ] }),
14088
- event.location && /* @__PURE__ */ jsxs60("span", { className: "opacity-80 flex items-center gap-1", children: [
14089
- "-",
14090
- /* @__PURE__ */ jsx80("span", { className: "truncate", children: event.location })
14085
+ /* @__PURE__ */ jsx80("span", { className: "opacity-70", children: "-" }),
14086
+ formatTimeWithOptionalMinutes(displayEnd),
14087
+ /* @__PURE__ */ jsx80(ClockUserIcon, {})
14091
14088
  ] })
14092
- ]
14093
- }
14094
- ),
14089
+ }
14090
+ )
14091
+ ] }),
14095
14092
  event.description && /* @__PURE__ */ jsx80(
14096
14093
  "div",
14097
14094
  {
14098
- className: cn("my-1 opacity-90", agendaOnly ? "text-sm" : "text-xs"),
14095
+ className: cn(
14096
+ "my-1 opacity-90 flex text-md"
14097
+ ),
14099
14098
  style: {
14100
14099
  display: "-webkit-box",
14101
14100
  WebkitLineClamp: 2,
@@ -15411,51 +15410,2346 @@ function debounce(func, wait) {
15411
15410
  };
15412
15411
  }
15413
15412
 
15414
- // src/hooks/use-drag.tsx
15415
- import { useState as useState31, useCallback as useCallback16, useRef as useRef15, useEffect as useEffect26 } from "react";
15416
- var useDrag = (options = {}) => {
15417
- const [isDragging, setIsDragging] = useState31(null);
15418
- const [positions, setPositions] = useState31({});
15419
- const dragStartPos = useRef15(null);
15420
- const dragId = useRef15(null);
15421
- const handleMouseDown = useCallback16((id, e) => {
15422
- e.preventDefault();
15423
- const currentPosition = positions[id] || { top: 0, left: 0 };
15424
- dragStartPos.current = {
15425
- x: e.clientX,
15426
- y: e.clientY,
15427
- elementX: currentPosition.left,
15428
- elementY: currentPosition.top
15429
- };
15430
- dragId.current = id;
15431
- setIsDragging(id);
15432
- options.onDragStart?.(id);
15433
- }, [positions, options]);
15434
- const handleMouseMove = useCallback16((e) => {
15435
- if (!isDragging || !dragStartPos.current || !dragId.current) return;
15436
- const deltaX = e.clientX - dragStartPos.current.x;
15437
- const deltaY = e.clientY - dragStartPos.current.y;
15438
- const newPosition = {
15439
- left: dragStartPos.current.elementX + deltaX,
15440
- top: dragStartPos.current.elementY + deltaY
15441
- };
15442
- newPosition.left = Math.max(0, Math.min(window.innerWidth - 300, newPosition.left));
15443
- newPosition.top = Math.max(0, Math.min(window.innerHeight - 200, newPosition.top));
15444
- setPositions((prev) => ({
15445
- ...prev,
15446
- [dragId.current]: newPosition
15447
- }));
15448
- options.onDrag?.(dragId.current, newPosition);
15449
- }, [isDragging, options]);
15450
- const handleMouseUp = useCallback16(() => {
15451
- if (dragId.current) {
15452
- options.onDragEnd?.(dragId.current);
15413
+ // src/components/event-calendar-view/Agenda.tsx
15414
+ import { addDays as addDays4, format as format11, isToday as isToday4 } from "date-fns";
15415
+ import { ptBR as ptBR10 } from "date-fns/locale";
15416
+ import { useMemo as useMemo19 } from "react";
15417
+ import { CalendarIcon as CalendarIcon5 } from "@phosphor-icons/react";
15418
+ import { twMerge as twMerge2 } from "tailwind-merge";
15419
+ import { Fragment as Fragment14, jsx as jsx86, jsxs as jsxs66 } from "react/jsx-runtime";
15420
+ function Agenda({
15421
+ currentDate,
15422
+ events,
15423
+ onEventSelect,
15424
+ showUndatedEvents = true
15425
+ }) {
15426
+ const isValidDate6 = (d) => {
15427
+ try {
15428
+ const t = d instanceof Date ? d.getTime() : new Date(String(d)).getTime();
15429
+ return !isNaN(t);
15430
+ } catch {
15431
+ return false;
15453
15432
  }
15454
- setIsDragging(null);
15455
- dragStartPos.current = null;
15456
- dragId.current = null;
15457
- }, [options]);
15458
- useEffect26(() => {
15433
+ };
15434
+ const datedEvents = useMemo19(
15435
+ () => events.filter(
15436
+ (e) => isValidDate6(e.start) && isValidDate6(e.end) || isValidDate6(e.attend_date)
15437
+ ),
15438
+ [events]
15439
+ );
15440
+ const undatedEvents = useMemo19(
15441
+ () => events.filter(
15442
+ (e) => !(isValidDate6(e.start) && isValidDate6(e.end)) && !isValidDate6(e.attend_date)
15443
+ ),
15444
+ [events]
15445
+ );
15446
+ const days = useMemo19(() => {
15447
+ console.log("Agenda view updating with date:", currentDate.toISOString());
15448
+ return Array.from(
15449
+ { length: AgendaDaysToShowAgenda },
15450
+ (_, i) => addDays4(new Date(currentDate), i)
15451
+ );
15452
+ }, [currentDate]);
15453
+ const handleEventClick = (event, e) => {
15454
+ e.stopPropagation();
15455
+ console.log("Agenda view event clicked:", event);
15456
+ if (onEventSelect) onEventSelect(event);
15457
+ };
15458
+ const hasEvents = days.some(
15459
+ (day) => getAgendaEventsForDayAgenda(datedEvents, day).length > 0
15460
+ );
15461
+ return /* @__PURE__ */ jsx86("div", { className: "border-border/70 border-t px-4", children: !hasEvents && !(showUndatedEvents && undatedEvents.length > 0) ? /* @__PURE__ */ jsxs66("div", { className: "flex min-h-[70svh] flex-col items-center justify-center py-16 text-center", children: [
15462
+ /* @__PURE__ */ jsx86(CalendarIcon5, { className: "mb-2 text-muted-foreground/50", size: 32 }),
15463
+ /* @__PURE__ */ jsx86("h3", { className: "font-medium text-lg", children: "Nenhum evento encontrado" }),
15464
+ /* @__PURE__ */ jsx86("p", { className: "text-muted-foreground", children: "N\xE3o h\xE1 eventos agendados para este per\xEDodo." })
15465
+ ] }) : /* @__PURE__ */ jsxs66(Fragment14, { children: [
15466
+ days.map((day) => {
15467
+ const dayEvents = getAgendaEventsForDayAgenda(datedEvents, day);
15468
+ if (dayEvents.length === 0) return null;
15469
+ return /* @__PURE__ */ jsxs66(
15470
+ "div",
15471
+ {
15472
+ className: twMerge2("relative my-12 border-border/70 border-t", isToday4(day) ? "border-blue-200" : ""),
15473
+ children: [
15474
+ /* @__PURE__ */ jsx86(
15475
+ "span",
15476
+ {
15477
+ className: twMerge2("-top-3 absolute left-0 flex h-6 items-center bg-background pe-4 uppercase data-today:font-extrabold sm:pe-4 text-lg font-bold", isToday4(day) ? "text-blue-500" : ""),
15478
+ "data-today": isToday4(day) || void 0,
15479
+ children: (() => {
15480
+ const s = format11(day, "d MMM, EEEE", { locale: ptBR10 });
15481
+ return s.split(" ").map((w) => w ? w[0].toUpperCase() + w.slice(1) : w).join(" ");
15482
+ })()
15483
+ }
15484
+ ),
15485
+ /* @__PURE__ */ jsx86("div", { className: "mt-6 space-y-2", children: dayEvents.map((event) => /* @__PURE__ */ jsx86(
15486
+ EventItemAgenda,
15487
+ {
15488
+ event,
15489
+ onClick: onEventSelect ? (e) => handleEventClick(event, e) : void 0,
15490
+ view: "agenda",
15491
+ className: onEventSelect ? void 0 : "cursor-default hover:shadow-none hover:scale-100"
15492
+ },
15493
+ event.id
15494
+ )) })
15495
+ ]
15496
+ },
15497
+ day.toString()
15498
+ );
15499
+ }),
15500
+ /* @__PURE__ */ jsx86(
15501
+ UndatedEvents,
15502
+ {
15503
+ events,
15504
+ onEventSelect,
15505
+ show: showUndatedEvents,
15506
+ className: "my-12"
15507
+ }
15508
+ )
15509
+ ] }) });
15510
+ }
15511
+
15512
+ // src/components/event-calendar-view/CalendarDND.tsx
15513
+ import {
15514
+ DndContext as DndContext2,
15515
+ DragOverlay as DragOverlay2,
15516
+ MouseSensor as MouseSensor2,
15517
+ PointerSensor as PointerSensor2,
15518
+ TouchSensor as TouchSensor2,
15519
+ useSensor as useSensor2,
15520
+ useSensors as useSensors2
15521
+ } from "@dnd-kit/core";
15522
+ import { addMinutes as addMinutes2, differenceInMinutes as differenceInMinutes5 } from "date-fns";
15523
+ import { useId as useId3, useRef as useRef15, useState as useState31 } from "react";
15524
+
15525
+ // src/components/event-calendar-view/hooks.ts
15526
+ import { createContext as createContext7, useContext as useContext8 } from "react";
15527
+ var CalendarDndContext2 = createContext7({
15528
+ activeEvent: null,
15529
+ activeId: null,
15530
+ activeView: null,
15531
+ currentTime: null,
15532
+ dragHandlePosition: null,
15533
+ eventHeight: null,
15534
+ isMultiDay: false,
15535
+ multiDayWidth: null
15536
+ });
15537
+ var useCalendarDndAgenda = () => useContext8(CalendarDndContext2);
15538
+
15539
+ // src/components/event-calendar-view/CalendarDND.tsx
15540
+ import { jsx as jsx87, jsxs as jsxs67 } from "react/jsx-runtime";
15541
+ function CalendarDndProviderAgenda({
15542
+ children,
15543
+ onEventUpdate
15544
+ }) {
15545
+ const [activeEvent, setActiveEvent] = useState31(null);
15546
+ const [activeId, setActiveId] = useState31(null);
15547
+ const [activeView, setActiveView] = useState31(
15548
+ null
15549
+ );
15550
+ const [currentTime, setCurrentTime] = useState31(null);
15551
+ const [eventHeight, setEventHeight] = useState31(null);
15552
+ const [isMultiDay, setIsMultiDay] = useState31(false);
15553
+ const [multiDayWidth, setMultiDayWidth] = useState31(null);
15554
+ const [dragHandlePosition, setDragHandlePosition] = useState31(null);
15555
+ const eventDimensions = useRef15({ height: 0 });
15556
+ const sensors = useSensors2(
15557
+ useSensor2(MouseSensor2, {
15558
+ // Require the mouse to move by 5px before activating
15559
+ activationConstraint: {
15560
+ distance: 5
15561
+ }
15562
+ }),
15563
+ useSensor2(TouchSensor2, {
15564
+ // Press delay of 250ms, with tolerance of 5px of movement
15565
+ activationConstraint: {
15566
+ delay: 250,
15567
+ tolerance: 5
15568
+ }
15569
+ }),
15570
+ useSensor2(PointerSensor2, {
15571
+ // Require the pointer to move by 5px before activating
15572
+ activationConstraint: {
15573
+ distance: 5
15574
+ }
15575
+ })
15576
+ );
15577
+ const dndContextId = useId3();
15578
+ const handleDragStart = (event) => {
15579
+ const { active } = event;
15580
+ if (!active.data.current) {
15581
+ console.error("Missing data in drag start event", event);
15582
+ return;
15583
+ }
15584
+ const {
15585
+ event: calendarEvent,
15586
+ view,
15587
+ height,
15588
+ isMultiDay: eventIsMultiDay,
15589
+ multiDayWidth: eventMultiDayWidth,
15590
+ dragHandlePosition: eventDragHandlePosition
15591
+ } = active.data.current;
15592
+ setActiveEvent(calendarEvent);
15593
+ setActiveId(active.id);
15594
+ setActiveView(view);
15595
+ setCurrentTime(calendarEvent.start ? new Date(calendarEvent.start) : null);
15596
+ setIsMultiDay(eventIsMultiDay || false);
15597
+ setMultiDayWidth(eventMultiDayWidth || null);
15598
+ setDragHandlePosition(eventDragHandlePosition || null);
15599
+ if (height) {
15600
+ eventDimensions.current.height = height;
15601
+ setEventHeight(height);
15602
+ }
15603
+ };
15604
+ const handleDragOver = (event) => {
15605
+ const { over } = event;
15606
+ if (over && activeEvent && over.data.current) {
15607
+ const { date, time } = over.data.current;
15608
+ if (time !== void 0 && activeView !== "month") {
15609
+ const newTime = new Date(date);
15610
+ const hours = Math.floor(time);
15611
+ const fractionalHour = time - hours;
15612
+ let minutes = 0;
15613
+ if (fractionalHour < 0.125) minutes = 0;
15614
+ else if (fractionalHour < 0.375) minutes = 15;
15615
+ else if (fractionalHour < 0.625) minutes = 30;
15616
+ else minutes = 45;
15617
+ newTime.setHours(hours, minutes, 0, 0);
15618
+ if (!currentTime || newTime.getHours() !== currentTime.getHours() || newTime.getMinutes() !== currentTime.getMinutes() || newTime.getDate() !== currentTime.getDate() || newTime.getMonth() !== currentTime.getMonth() || newTime.getFullYear() !== currentTime.getFullYear()) {
15619
+ setCurrentTime(newTime);
15620
+ }
15621
+ } else if (activeView === "month") {
15622
+ const newTime = new Date(date);
15623
+ if (currentTime) {
15624
+ newTime.setHours(
15625
+ currentTime.getHours(),
15626
+ currentTime.getMinutes(),
15627
+ currentTime.getSeconds(),
15628
+ currentTime.getMilliseconds()
15629
+ );
15630
+ }
15631
+ if (!currentTime || newTime.getDate() !== currentTime.getDate() || newTime.getMonth() !== currentTime.getMonth() || newTime.getFullYear() !== currentTime.getFullYear()) {
15632
+ setCurrentTime(newTime);
15633
+ }
15634
+ }
15635
+ }
15636
+ };
15637
+ const handleDragEnd = (event) => {
15638
+ const { active, over } = event;
15639
+ if (!over || !activeEvent || !currentTime) {
15640
+ setActiveEvent(null);
15641
+ setActiveId(null);
15642
+ setActiveView(null);
15643
+ setCurrentTime(null);
15644
+ setEventHeight(null);
15645
+ setIsMultiDay(false);
15646
+ setMultiDayWidth(null);
15647
+ setDragHandlePosition(null);
15648
+ return;
15649
+ }
15650
+ try {
15651
+ if (!active.data.current || !over.data.current) {
15652
+ throw new Error("Missing data in drag event");
15653
+ }
15654
+ const activeData = active.data.current;
15655
+ const overData = over.data.current;
15656
+ if (!activeData.event || !overData.date) {
15657
+ throw new Error("Missing required event data");
15658
+ }
15659
+ const calendarEvent = activeData.event;
15660
+ const date = overData.date;
15661
+ const time = overData.time;
15662
+ const newStart = new Date(date);
15663
+ if (time !== void 0) {
15664
+ const hours = Math.floor(time);
15665
+ const fractionalHour = time - hours;
15666
+ let minutes = 0;
15667
+ if (fractionalHour < 0.125) minutes = 0;
15668
+ else if (fractionalHour < 0.375) minutes = 15;
15669
+ else if (fractionalHour < 0.625) minutes = 30;
15670
+ else minutes = 45;
15671
+ newStart.setHours(hours, minutes, 0, 0);
15672
+ } else {
15673
+ newStart.setHours(
15674
+ currentTime.getHours(),
15675
+ currentTime.getMinutes(),
15676
+ currentTime.getSeconds(),
15677
+ currentTime.getMilliseconds()
15678
+ );
15679
+ }
15680
+ if (!calendarEvent.start || !calendarEvent.end) {
15681
+ console.error("Cannot compute duration: event start or end is null", calendarEvent);
15682
+ return;
15683
+ }
15684
+ const originalStart = new Date(calendarEvent.start);
15685
+ const originalEnd = new Date(calendarEvent.end);
15686
+ const durationMinutes = differenceInMinutes5(originalEnd, originalStart);
15687
+ const newEnd = addMinutes2(newStart, durationMinutes);
15688
+ const hasStartTimeChanged = originalStart.getFullYear() !== newStart.getFullYear() || originalStart.getMonth() !== newStart.getMonth() || originalStart.getDate() !== newStart.getDate() || originalStart.getHours() !== newStart.getHours() || originalStart.getMinutes() !== newStart.getMinutes();
15689
+ if (hasStartTimeChanged) {
15690
+ onEventUpdate({
15691
+ ...calendarEvent,
15692
+ end: newEnd,
15693
+ start: newStart
15694
+ });
15695
+ }
15696
+ } catch (error) {
15697
+ console.error("Error in drag end handler:", error);
15698
+ } finally {
15699
+ setActiveEvent(null);
15700
+ setActiveId(null);
15701
+ setActiveView(null);
15702
+ setCurrentTime(null);
15703
+ setEventHeight(null);
15704
+ setIsMultiDay(false);
15705
+ setMultiDayWidth(null);
15706
+ setDragHandlePosition(null);
15707
+ }
15708
+ };
15709
+ return /* @__PURE__ */ jsx87(
15710
+ DndContext2,
15711
+ {
15712
+ id: dndContextId,
15713
+ onDragEnd: handleDragEnd,
15714
+ onDragOver: handleDragOver,
15715
+ onDragStart: handleDragStart,
15716
+ sensors,
15717
+ children: /* @__PURE__ */ jsxs67(
15718
+ CalendarDndContext2.Provider,
15719
+ {
15720
+ value: {
15721
+ activeEvent,
15722
+ activeId,
15723
+ activeView,
15724
+ currentTime,
15725
+ dragHandlePosition,
15726
+ eventHeight,
15727
+ isMultiDay,
15728
+ multiDayWidth
15729
+ },
15730
+ children: [
15731
+ children,
15732
+ /* @__PURE__ */ jsx87(DragOverlay2, { adjustScale: false, dropAnimation: null, children: activeEvent && activeView && /* @__PURE__ */ jsx87(
15733
+ "div",
15734
+ {
15735
+ style: {
15736
+ height: eventHeight ? `${eventHeight}px` : "auto",
15737
+ width: isMultiDay && multiDayWidth ? `${multiDayWidth}%` : "100%"
15738
+ },
15739
+ children: /* @__PURE__ */ jsx87(
15740
+ EventItemAgenda,
15741
+ {
15742
+ currentTime: currentTime || void 0,
15743
+ event: activeEvent,
15744
+ isDragging: true,
15745
+ isFirstDay: dragHandlePosition?.data?.isFirstDay !== false,
15746
+ isLastDay: dragHandlePosition?.data?.isLastDay !== false,
15747
+ showTime: activeView !== "month",
15748
+ view: activeView
15749
+ }
15750
+ )
15751
+ }
15752
+ ) })
15753
+ ]
15754
+ }
15755
+ )
15756
+ }
15757
+ );
15758
+ }
15759
+
15760
+ // src/components/event-calendar-view/constants.ts
15761
+ var EventHeightAgenda = 24;
15762
+ var EventGapAgenda = 4;
15763
+ var WeekCellsHeightAgenda = 64;
15764
+ var AgendaDaysToShowAgenda = 30;
15765
+ var StartHourAgenda = 0;
15766
+ var EndHourAgenda = 24;
15767
+ var DefaultStartHourAgenda = 9;
15768
+ var DefaultEndHourAgenda = 10;
15769
+
15770
+ // src/components/event-calendar-view/DayView.tsx
15771
+ import {
15772
+ addHours as addHours5,
15773
+ areIntervalsOverlapping as areIntervalsOverlapping3,
15774
+ differenceInMinutes as differenceInMinutes7,
15775
+ eachHourOfInterval as eachHourOfInterval3,
15776
+ format as format13,
15777
+ getHours as getHours3,
15778
+ getMinutes as getMinutes3,
15779
+ isSameDay as isSameDay9,
15780
+ startOfDay as startOfDay3,
15781
+ endOfDay
15782
+ } from "date-fns";
15783
+ import { useMemo as useMemo21 } from "react";
15784
+
15785
+ // src/components/event-calendar-view/utils.ts
15786
+ import { isSameDay as isSameDay7 } from "date-fns";
15787
+ import { addHours as addHours4 } from "date-fns";
15788
+ function getEventColorClassesAgenda(color) {
15789
+ const eventColor = color || "sky";
15790
+ switch (eventColor) {
15791
+ case "sky":
15792
+ return "bg-sky-200/50 hover:bg-sky-200/40 text-sky-950/80 dark:bg-sky-400/25 dark:hover:bg-sky-400/20 dark:text-sky-200 shadow-sky-700/8";
15793
+ case "amber":
15794
+ return "bg-amber-200/50 hover:bg-amber-200/40 text-amber-950/80 dark:bg-amber-400/25 dark:hover:bg-amber-400/20 dark:text-amber-200 shadow-amber-700/8";
15795
+ case "violet":
15796
+ return "bg-violet-200/50 hover:bg-violet-200/40 text-violet-950/80 dark:bg-violet-400/25 dark:hover:bg-violet-400/20 dark:text-violet-200 shadow-violet-700/8";
15797
+ case "rose":
15798
+ return "bg-rose-200/50 hover:bg-rose-200/40 text-rose-950/80 dark:bg-rose-400/25 dark:hover:bg-rose-400/20 dark:text-rose-200 shadow-rose-700/8";
15799
+ case "emerald":
15800
+ return "bg-emerald-200/50 hover:bg-emerald-200/40 text-emerald-950/80 dark:bg-emerald-400/25 dark:hover:bg-emerald-400/20 dark:text-emerald-200 shadow-emerald-700/8";
15801
+ case "orange":
15802
+ return "bg-orange-200/50 hover:bg-orange-200/40 text-orange-950/80 dark:bg-orange-400/25 dark:hover:bg-orange-400/20 dark:text-orange-200 shadow-orange-700/8";
15803
+ default:
15804
+ return "bg-sky-200/50 hover:bg-sky-200/40 text-sky-950/80 dark:bg-sky-400/25 dark:hover:bg-sky-400/20 dark:text-sky-200 shadow-sky-700/8";
15805
+ }
15806
+ }
15807
+ function getBorderRadiusClassesAgenda(isFirstDay, isLastDay) {
15808
+ if (isFirstDay && isLastDay) {
15809
+ return "rounded";
15810
+ }
15811
+ if (isFirstDay) {
15812
+ return "rounded-l rounded-r-none";
15813
+ }
15814
+ if (isLastDay) {
15815
+ return "rounded-r rounded-l-none";
15816
+ }
15817
+ return "rounded-none";
15818
+ }
15819
+ function isMultiDayEventAgenda(event) {
15820
+ const eventStart = isValidDate3(event.start) ? new Date(event.start) : void 0;
15821
+ const eventEnd = isValidDate3(event.end) ? new Date(event.end) : void 0;
15822
+ if (!eventStart || !eventEnd) return !!event.allDay;
15823
+ return event.allDay || eventStart.getDate() !== eventEnd.getDate();
15824
+ }
15825
+ function getEventsForDayAgenda(events, day) {
15826
+ return events.filter((event) => {
15827
+ const eventStart = isValidDate3(event.start) ? new Date(event.start) : isValidDate3(event.attend_date) ? normalizeAttendDate(event.attend_date) : void 0;
15828
+ return eventStart ? isSameDay7(day, eventStart) : false;
15829
+ }).sort((a, b) => getEventStartTimestamp2(a) - getEventStartTimestamp2(b));
15830
+ }
15831
+ function sortEventsAgenda(events) {
15832
+ return [...events].sort((a, b) => {
15833
+ const aIsMultiDay = isMultiDayEventAgenda(a);
15834
+ const bIsMultiDay = isMultiDayEventAgenda(b);
15835
+ if (aIsMultiDay && !bIsMultiDay) return -1;
15836
+ if (!aIsMultiDay && bIsMultiDay) return 1;
15837
+ return getEventStartTimestamp2(a) - getEventStartTimestamp2(b);
15838
+ });
15839
+ }
15840
+ function getSpanningEventsForDayAgenda(events, day) {
15841
+ return events.filter((event) => {
15842
+ if (!isMultiDayEventAgenda(event)) return false;
15843
+ const eventStart = isValidDate3(event.start) ? new Date(event.start) : void 0;
15844
+ const eventEnd = isValidDate3(event.end) ? new Date(event.end) : void 0;
15845
+ if (!eventStart || !eventEnd) return false;
15846
+ return !isSameDay7(day, eventStart) && (isSameDay7(day, eventEnd) || day > eventStart && day < eventEnd);
15847
+ });
15848
+ }
15849
+ function getAllEventsForDayAgenda(events, day) {
15850
+ return events.filter((event) => {
15851
+ const eventStart = isValidDate3(event.start) ? new Date(event.start) : void 0;
15852
+ const eventEnd = isValidDate3(event.end) ? new Date(event.end) : void 0;
15853
+ if (!eventStart) return false;
15854
+ return isSameDay7(day, eventStart) || (eventEnd ? isSameDay7(day, eventEnd) : false) || (eventEnd ? day > eventStart && day < eventEnd : false);
15855
+ });
15856
+ }
15857
+ function getAgendaEventsForDayAgenda(events, day) {
15858
+ return events.filter((event) => {
15859
+ const eventStart = isValidDate3(event.start) ? new Date(event.start) : isValidDate3(event.attend_date) ? normalizeAttendDate(event.attend_date) : void 0;
15860
+ const eventEnd = isValidDate3(event.end) ? new Date(event.end) : isValidDate3(event.attend_date) ? (() => {
15861
+ const dt = normalizeAttendDate(event.attend_date);
15862
+ return dt ? addHours4(dt, 1) : void 0;
15863
+ })() : void 0;
15864
+ if (!eventStart) return false;
15865
+ return isSameDay7(day, eventStart) || (eventEnd ? isSameDay7(day, eventEnd) : false) || (eventEnd ? day > eventStart && day < eventEnd : false);
15866
+ }).sort((a, b) => getEventStartTimestamp2(a) - getEventStartTimestamp2(b));
15867
+ }
15868
+ function isValidDate3(d) {
15869
+ try {
15870
+ const t = d instanceof Date ? d.getTime() : new Date(String(d)).getTime();
15871
+ return !isNaN(t);
15872
+ } catch {
15873
+ return false;
15874
+ }
15875
+ }
15876
+ function getEventStartTimestamp2(e) {
15877
+ if (isValidDate3(e.start)) return new Date(e.start).getTime();
15878
+ if (isValidDate3(e.attend_date))
15879
+ return normalizeAttendDate(e.attend_date).getTime();
15880
+ return Number.MAX_SAFE_INTEGER;
15881
+ }
15882
+ function normalizeAttendDate(d) {
15883
+ if (d === void 0 || d === null) return void 0;
15884
+ try {
15885
+ const dt = d instanceof Date ? d : new Date(String(d));
15886
+ if (isNaN(dt.getTime())) return void 0;
15887
+ if (dt.getHours() !== 0 || dt.getMinutes() !== 0 || dt.getSeconds() !== 0 || dt.getMilliseconds() !== 0) {
15888
+ return dt;
15889
+ }
15890
+ return new Date(dt.getFullYear(), dt.getMonth(), dt.getDate());
15891
+ } catch {
15892
+ return void 0;
15893
+ }
15894
+ }
15895
+ function addHoursToDateAgenda(date, hours) {
15896
+ const result = new Date(date);
15897
+ result.setHours(result.getHours() + hours);
15898
+ return result;
15899
+ }
15900
+
15901
+ // src/components/event-calendar-view/hooks/use-current-time-indicator.ts
15902
+ import { endOfWeek as endOfWeek5, isSameDay as isSameDay8, isWithinInterval as isWithinInterval2, startOfWeek as startOfWeek5 } from "date-fns";
15903
+ import { ptBR as ptBR11 } from "date-fns/locale";
15904
+ import { useEffect as useEffect26, useState as useState32 } from "react";
15905
+ function useCurrentTimeIndicatorAgenda(currentDate, view) {
15906
+ const [currentTimePosition, setCurrentTimePosition] = useState32(0);
15907
+ const [currentTimeVisible, setCurrentTimeVisible] = useState32(false);
15908
+ useEffect26(() => {
15909
+ const calculateTimePosition = () => {
15910
+ const now = /* @__PURE__ */ new Date();
15911
+ const hours = now.getHours();
15912
+ const minutes = now.getMinutes();
15913
+ const totalMinutes = (hours - StartHourAgenda) * 60 + minutes;
15914
+ const dayStartMinutes = 0;
15915
+ const dayEndMinutes = (EndHourAgenda - StartHourAgenda) * 60;
15916
+ const position = (totalMinutes - dayStartMinutes) / (dayEndMinutes - dayStartMinutes) * 100;
15917
+ let isCurrentTimeVisible = false;
15918
+ if (view === "day") {
15919
+ isCurrentTimeVisible = isSameDay8(now, currentDate);
15920
+ } else if (view === "week") {
15921
+ const startOfWeekDate = startOfWeek5(currentDate, { locale: ptBR11 });
15922
+ const endOfWeekDate = endOfWeek5(currentDate, { locale: ptBR11 });
15923
+ isCurrentTimeVisible = isWithinInterval2(now, {
15924
+ end: endOfWeekDate,
15925
+ start: startOfWeekDate
15926
+ });
15927
+ }
15928
+ setCurrentTimePosition(position);
15929
+ setCurrentTimeVisible(isCurrentTimeVisible);
15930
+ };
15931
+ calculateTimePosition();
15932
+ const interval = setInterval(calculateTimePosition, 6e4);
15933
+ return () => clearInterval(interval);
15934
+ }, [currentDate, view]);
15935
+ return { currentTimePosition, currentTimeVisible };
15936
+ }
15937
+
15938
+ // src/components/event-calendar-view/EventItemAgenda.tsx
15939
+ import { differenceInMinutes as differenceInMinutes6, format as format12, isPast as isPast2 } from "date-fns";
15940
+ import { useMemo as useMemo20 } from "react";
15941
+ import { ClockUserIcon as ClockUserIcon2 } from "@phosphor-icons/react";
15942
+ import { Fragment as Fragment15, jsx as jsx88, jsxs as jsxs68 } from "react/jsx-runtime";
15943
+ var formatTimeWithOptionalMinutes2 = (date) => {
15944
+ return format12(date, "HH:mm");
15945
+ };
15946
+ var isValidDate4 = (d) => {
15947
+ try {
15948
+ const dt = d instanceof Date ? d : new Date(String(d));
15949
+ return !isNaN(dt.getTime());
15950
+ } catch {
15951
+ return false;
15952
+ }
15953
+ };
15954
+ function EventWrapper2({
15955
+ event,
15956
+ isFirstDay = true,
15957
+ isLastDay = true,
15958
+ isDragging,
15959
+ onClick,
15960
+ className,
15961
+ children,
15962
+ currentTime,
15963
+ dndListeners,
15964
+ dndAttributes,
15965
+ onMouseDown,
15966
+ onTouchStart,
15967
+ ariaLabel
15968
+ }) {
15969
+ const hasValidTimeForWrapper = isValidDate4(event.start) && isValidDate4(event.end) || isValidDate4(event.attend_date);
15970
+ const displayEnd = (() => {
15971
+ if (isValidDate4(event.start) && isValidDate4(event.end)) {
15972
+ return currentTime ? new Date(
15973
+ new Date(currentTime).getTime() + (new Date(event.end).getTime() - new Date(event.start).getTime())
15974
+ ) : new Date(event.end);
15975
+ }
15976
+ if (isValidDate4(event.attend_date)) {
15977
+ const start = normalizeAttendDate(event.attend_date);
15978
+ return start ? addHoursToDateAgenda(start, 1) : void 0;
15979
+ }
15980
+ return void 0;
15981
+ })();
15982
+ const isEventInPast = displayEnd ? isPast2(displayEnd) : false;
15983
+ const colorClasses = hasValidTimeForWrapper ? getEventColorClassesAgenda(event.color) : "bg-gray-200/50 hover:bg-gray-200/40 text-gray-900/80 dark:bg-gray-700/25 dark:text-gray-200/90 shadow-none";
15984
+ return /* @__PURE__ */ jsx88(
15985
+ "button",
15986
+ {
15987
+ className: cn(
15988
+ "flex w-full select-none overflow-hidden px-3 py-1 text-left font-medium outline-none transition-transform duration-150 ease-out backdrop-blur-sm focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:border-ring data-dragging:cursor-grabbing data-past-event:line-through data-dragging:shadow-lg sm:px-3 rounded-lg shadow-sm hover:shadow-md ",
15989
+ colorClasses,
15990
+ getBorderRadiusClassesAgenda(isFirstDay, isLastDay),
15991
+ className
15992
+ ),
15993
+ "data-dragging": isDragging || void 0,
15994
+ "data-past-event": isEventInPast || void 0,
15995
+ onClick,
15996
+ onMouseDown,
15997
+ onTouchStart,
15998
+ "aria-label": ariaLabel,
15999
+ type: "button",
16000
+ ...dndListeners,
16001
+ ...dndAttributes,
16002
+ children
16003
+ }
16004
+ );
16005
+ }
16006
+ function EventItemAgenda({
16007
+ event,
16008
+ view,
16009
+ onClick,
16010
+ showTime,
16011
+ currentTime,
16012
+ isFirstDay = true,
16013
+ isLastDay = true,
16014
+ children,
16015
+ className,
16016
+ dndListeners,
16017
+ dndAttributes,
16018
+ onMouseDown,
16019
+ onTouchStart,
16020
+ agendaOnly = false
16021
+ }) {
16022
+ const eventColor = event.color;
16023
+ const hasValidTime = isValidDate4(event.start) && isValidDate4(event.end) || isValidDate4(event.attend_date);
16024
+ const colorClasses = hasValidTime ? getEventColorClassesAgenda(eventColor) : "bg-gray-200/50 hover:bg-gray-200/40 text-gray-900/80 dark:bg-gray-700/25 dark:text-gray-200/90 shadow-none";
16025
+ const displayStart = useMemo20(() => {
16026
+ if (!hasValidTime) return void 0;
16027
+ if (isValidDate4(event.start))
16028
+ return currentTime || new Date(event.start);
16029
+ if (isValidDate4(event.attend_date))
16030
+ return currentTime || normalizeAttendDate(event.attend_date);
16031
+ return void 0;
16032
+ }, [currentTime, event.start, event.attend_date, hasValidTime]);
16033
+ const displayEnd = useMemo20(() => {
16034
+ if (!hasValidTime) return void 0;
16035
+ if (isValidDate4(event.end)) {
16036
+ return currentTime ? new Date(
16037
+ new Date(currentTime).getTime() + (new Date(event.end).getTime() - new Date(event.start).getTime())
16038
+ ) : new Date(event.end);
16039
+ }
16040
+ if (isValidDate4(event.attend_date)) {
16041
+ const start = normalizeAttendDate(event.attend_date);
16042
+ return start ? addHoursToDateAgenda(start, 1) : void 0;
16043
+ }
16044
+ return void 0;
16045
+ }, [currentTime, event.start, event.end, event.attend_date, hasValidTime]);
16046
+ const durationMinutes = useMemo20(() => {
16047
+ if (!hasValidTime || !displayStart || !displayEnd) return 0;
16048
+ return differenceInMinutes6(displayEnd, displayStart);
16049
+ }, [displayStart, displayEnd, hasValidTime]);
16050
+ const getEventTime = () => {
16051
+ if (!hasValidTime) return "";
16052
+ if (event.allDay) return "All day";
16053
+ if (durationMinutes < 45) {
16054
+ return formatTimeWithOptionalMinutes2(displayStart);
16055
+ }
16056
+ return `${formatTimeWithOptionalMinutes2(
16057
+ displayStart
16058
+ )} - ${formatTimeWithOptionalMinutes2(displayEnd)}`;
16059
+ };
16060
+ let ariaLabel;
16061
+ if (!hasValidTime) {
16062
+ ariaLabel = event.title;
16063
+ } else if (event.allDay) {
16064
+ ariaLabel = `${event.title}, All day`;
16065
+ } else if (durationMinutes < 45) {
16066
+ ariaLabel = `${event.title}, ${formatTimeWithOptionalMinutes2(
16067
+ displayStart
16068
+ )}`;
16069
+ } else {
16070
+ ariaLabel = `${event.title}, ${formatTimeWithOptionalMinutes2(
16071
+ displayStart
16072
+ )} - ${formatTimeWithOptionalMinutes2(displayEnd)}`;
16073
+ }
16074
+ if (view === "month") {
16075
+ return /* @__PURE__ */ jsx88(
16076
+ EventWrapper2,
16077
+ {
16078
+ className: cn(
16079
+ "mt-[var(--event-gap)] h-[var(--event-height)] items-center text-[10px] sm:text-xs",
16080
+ className
16081
+ ),
16082
+ currentTime,
16083
+ dndAttributes,
16084
+ dndListeners,
16085
+ event,
16086
+ ariaLabel,
16087
+ isFirstDay,
16088
+ isLastDay,
16089
+ onClick,
16090
+ children: children || /* @__PURE__ */ jsxs68("span", { className: "flex items-center gap-2 truncate", children: [
16091
+ !event.allDay && hasValidTime && displayStart && /* @__PURE__ */ jsx88("span", { className: "truncate font-normal opacity-80 sm:text-[11px] bg-white/10 px-2 py-0.5 rounded-full text-[11px]", children: formatTimeWithOptionalMinutes2(displayStart) }),
16092
+ /* @__PURE__ */ jsx88(
16093
+ "span",
16094
+ {
16095
+ className: cn(
16096
+ "truncate",
16097
+ agendaOnly ? "font-bold text-lg" : "font-medium"
16098
+ ),
16099
+ children: event.title
16100
+ }
16101
+ )
16102
+ ] })
16103
+ }
16104
+ );
16105
+ }
16106
+ if (view === "week" || view === "day") {
16107
+ return /* @__PURE__ */ jsx88(
16108
+ EventWrapper2,
16109
+ {
16110
+ className: cn(
16111
+ "py-1",
16112
+ durationMinutes < 45 ? "items-center" : "flex-col",
16113
+ view === "week" ? "text-[10px] sm:text-xs" : "text-xs",
16114
+ className
16115
+ ),
16116
+ currentTime,
16117
+ dndAttributes,
16118
+ dndListeners,
16119
+ event,
16120
+ ariaLabel,
16121
+ isFirstDay,
16122
+ isLastDay,
16123
+ children: durationMinutes < 45 ? /* @__PURE__ */ jsxs68("div", { className: "flex items-center justify-between w-full", children: [
16124
+ /* @__PURE__ */ jsx88("div", { className: cn("truncate text-lg"), children: event.title }),
16125
+ showTime && hasValidTime && displayStart && /* @__PURE__ */ jsx88("span", { className: "ml-2 inline-block bg-white/10 px-2 py-0.5 rounded-full text-[11px] opacity-90", children: formatTimeWithOptionalMinutes2(displayStart) })
16126
+ ] }) : /* @__PURE__ */ jsxs68(Fragment15, { children: [
16127
+ /* @__PURE__ */ jsx88("div", { className: cn("truncate font-medium text-lg"), children: event.title }),
16128
+ showTime && hasValidTime && /* @__PURE__ */ jsx88("div", { className: "truncate font-normal opacity-70 sm:text-[15px]", children: /* @__PURE__ */ jsx88("span", { className: "inline-block bg-white/5 px-0.5 py-0.5 rounded-full", children: getEventTime() }) })
16129
+ ] })
16130
+ }
16131
+ );
16132
+ }
16133
+ if (!hasValidTime) {
16134
+ return /* @__PURE__ */ jsxs68(
16135
+ "button",
16136
+ {
16137
+ className: cn(
16138
+ "flex w-full flex-col gap-2 rounded-lg p-3 text-left outline-none transition-shadow duration-150 ease-out hover:bg-white/3 focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:border-ring",
16139
+ getEventColorClassesAgenda(eventColor),
16140
+ className
16141
+ ),
16142
+ "aria-label": ariaLabel,
16143
+ onClick,
16144
+ onMouseDown,
16145
+ onTouchStart,
16146
+ type: "button",
16147
+ ...dndListeners,
16148
+ ...dndAttributes,
16149
+ children: [
16150
+ /* @__PURE__ */ jsx88("div", { className: cn("font-medium", agendaOnly ? "text-lg" : "text-sm"), children: event.title }),
16151
+ /* @__PURE__ */ jsx88(
16152
+ "div",
16153
+ {
16154
+ className: cn(
16155
+ "opacity-70 flex items-center gap-2",
16156
+ agendaOnly ? "text-sm" : "text-xs"
16157
+ ),
16158
+ children: event.location && /* @__PURE__ */ jsxs68("span", { className: "opacity-80 flex items-center gap-1", children: [
16159
+ "-",
16160
+ /* @__PURE__ */ jsx88("span", { className: "truncate", children: event.location })
16161
+ ] })
16162
+ }
16163
+ ),
16164
+ event.description && /* @__PURE__ */ jsx88(
16165
+ "div",
16166
+ {
16167
+ className: cn(
16168
+ "my-1 opacity-90",
16169
+ agendaOnly ? "text-md" : "text-xs"
16170
+ ),
16171
+ style: {
16172
+ display: "-webkit-box",
16173
+ WebkitLineClamp: 2,
16174
+ WebkitBoxOrient: "vertical",
16175
+ overflow: "hidden"
16176
+ },
16177
+ children: event.description
16178
+ }
16179
+ )
16180
+ ]
16181
+ }
16182
+ );
16183
+ }
16184
+ return /* @__PURE__ */ jsxs68(
16185
+ "button",
16186
+ {
16187
+ className: cn(
16188
+ "flex w-full flex-col gap-2 rounded-lg p-3 text-left outline-none transition-shadow duration-150 ease-out hover:bg-white/3 focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:border-ring data-past-event:line-through data-past-event:opacity-90 border-2 border-border",
16189
+ colorClasses,
16190
+ className
16191
+ ),
16192
+ "data-past-event": isPast2(displayEnd) || void 0,
16193
+ "aria-label": ariaLabel,
16194
+ onClick,
16195
+ onMouseDown,
16196
+ onTouchStart,
16197
+ type: "button",
16198
+ ...dndListeners,
16199
+ ...dndAttributes,
16200
+ children: [
16201
+ /* @__PURE__ */ jsxs68("div", { className: "flex w-full justify-between ", children: [
16202
+ /* @__PURE__ */ jsx88("div", { className: cn("font-bold text-lg"), children: event.title }),
16203
+ /* @__PURE__ */ jsx88("div", { className: cn("opacity-90 flex items-center gap-2 text-lg"), children: event.allDay ? /* @__PURE__ */ jsx88("span", { children: "Dia todo" }) : /* @__PURE__ */ jsxs68("span", { className: "uppercase font-semibold flex items-center gap-2", children: [
16204
+ formatTimeWithOptionalMinutes2(displayStart),
16205
+ /* @__PURE__ */ jsx88("span", { className: "opacity-70", children: "-" }),
16206
+ formatTimeWithOptionalMinutes2(displayEnd),
16207
+ /* @__PURE__ */ jsx88(ClockUserIcon2, {})
16208
+ ] }) })
16209
+ ] }),
16210
+ event.description && /* @__PURE__ */ jsx88(
16211
+ "div",
16212
+ {
16213
+ className: cn("my-1 opacity-90 flex text-md"),
16214
+ style: {
16215
+ display: "-webkit-box",
16216
+ WebkitLineClamp: 2,
16217
+ WebkitBoxOrient: "vertical",
16218
+ overflow: "hidden"
16219
+ },
16220
+ children: event.description
16221
+ }
16222
+ )
16223
+ ]
16224
+ }
16225
+ );
16226
+ }
16227
+
16228
+ // src/components/event-calendar-view/DroppableCell.tsx
16229
+ import { useDroppable as useDroppable2 } from "@dnd-kit/core";
16230
+ import { jsx as jsx89 } from "react/jsx-runtime";
16231
+ function DroppableCellAgenda({
16232
+ id,
16233
+ date,
16234
+ time,
16235
+ children,
16236
+ className,
16237
+ onClick
16238
+ }) {
16239
+ const { activeEvent } = useCalendarDndAgenda();
16240
+ const { setNodeRef, isOver } = useDroppable2({
16241
+ data: {
16242
+ date,
16243
+ time
16244
+ },
16245
+ id
16246
+ });
16247
+ const formattedTime = time !== void 0 ? `${Math.floor(time)}:${Math.round((time - Math.floor(time)) * 60).toString().padStart(2, "0")}` : null;
16248
+ return /* @__PURE__ */ jsx89(
16249
+ "div",
16250
+ {
16251
+ className: cn(
16252
+ "flex h-full flex-col overflow-hidden px-0.5 py-1 data-dragging:bg-accent sm:px-1",
16253
+ className
16254
+ ),
16255
+ "data-dragging": isOver && activeEvent ? true : void 0,
16256
+ onClick,
16257
+ ref: setNodeRef,
16258
+ title: formattedTime ? `${formattedTime}` : void 0,
16259
+ children
16260
+ }
16261
+ );
16262
+ }
16263
+
16264
+ // src/components/event-calendar-view/DayView.tsx
16265
+ import { jsx as jsx90, jsxs as jsxs69 } from "react/jsx-runtime";
16266
+ function DayViewAgenda({
16267
+ currentDate,
16268
+ events,
16269
+ onEventSelect,
16270
+ showUndatedEvents
16271
+ }) {
16272
+ const hours = useMemo21(() => {
16273
+ const dayStart = startOfDay3(currentDate);
16274
+ return eachHourOfInterval3({
16275
+ end: addHours5(dayStart, EndHourAgenda - 1),
16276
+ start: addHours5(dayStart, StartHourAgenda)
16277
+ });
16278
+ }, [currentDate]);
16279
+ const dayEvents = useMemo21(() => {
16280
+ const dayStart = startOfDay3(currentDate);
16281
+ const dayEnd = endOfDay(currentDate);
16282
+ return events.map((event) => {
16283
+ let eventStart = event.start != null ? new Date(event.start) : void 0;
16284
+ let eventEnd = event.end != null ? new Date(event.end) : void 0;
16285
+ if ((!eventStart || !eventEnd) && event.attend_date) {
16286
+ try {
16287
+ const ad = new Date(event.attend_date);
16288
+ const hasTime = ad.getHours() !== 0 || ad.getMinutes() !== 0 || ad.getSeconds() !== 0 || ad.getMilliseconds() !== 0;
16289
+ if (hasTime) {
16290
+ if (!eventStart) eventStart = ad;
16291
+ if (!eventEnd) eventEnd = addHours5(ad, 1);
16292
+ }
16293
+ } catch {
16294
+ }
16295
+ }
16296
+ return { event, eventStart, eventEnd };
16297
+ }).filter(({ eventStart, eventEnd }) => !!eventStart && !!eventEnd).filter(
16298
+ ({ eventStart, eventEnd }) => areIntervalsOverlapping3(
16299
+ { start: eventStart, end: eventEnd },
16300
+ { start: dayStart, end: dayEnd }
16301
+ )
16302
+ ).map(({ event }) => event).sort((a, b) => {
16303
+ const aStart = a.start ? new Date(a.start).getTime() : a.attend_date ? new Date(a.attend_date).getTime() : 0;
16304
+ const bStart = b.start ? new Date(b.start).getTime() : b.attend_date ? new Date(b.attend_date).getTime() : 0;
16305
+ return aStart - bStart;
16306
+ });
16307
+ }, [currentDate, events]);
16308
+ const allDayEvents = useMemo21(() => {
16309
+ return dayEvents.filter((event) => {
16310
+ return event.allDay || isMultiDayEventAgenda(event);
16311
+ });
16312
+ }, [dayEvents]);
16313
+ const timeEvents = useMemo21(() => {
16314
+ return dayEvents.filter((event) => {
16315
+ return !event.allDay && !isMultiDayEventAgenda(event);
16316
+ });
16317
+ }, [dayEvents]);
16318
+ const positionedEvents = useMemo21(() => {
16319
+ const result = [];
16320
+ const dayStart = startOfDay3(currentDate);
16321
+ const sortedEvents = [...timeEvents].sort((a, b) => {
16322
+ const aStart = new Date(a.start);
16323
+ const bStart = new Date(b.start);
16324
+ const aEnd = new Date(a.end);
16325
+ const bEnd = new Date(b.end);
16326
+ if (aStart < bStart) return -1;
16327
+ if (aStart > bStart) return 1;
16328
+ const aDuration = differenceInMinutes7(aEnd, aStart);
16329
+ const bDuration = differenceInMinutes7(bEnd, bStart);
16330
+ return bDuration - aDuration;
16331
+ });
16332
+ const columns = [];
16333
+ for (const event of sortedEvents) {
16334
+ let eventStart = event.start != null ? new Date(event.start) : void 0;
16335
+ let eventEnd = event.end != null ? new Date(event.end) : void 0;
16336
+ if ((!eventStart || !eventEnd) && event.attend_date) {
16337
+ try {
16338
+ const ad = new Date(event.attend_date);
16339
+ const hasTime = ad.getHours() !== 0 || ad.getMinutes() !== 0 || ad.getSeconds() !== 0 || ad.getMilliseconds() !== 0;
16340
+ if (hasTime) {
16341
+ if (!eventStart) eventStart = ad;
16342
+ if (!eventEnd) eventEnd = addHours5(ad, 1);
16343
+ }
16344
+ } catch {
16345
+ }
16346
+ }
16347
+ if (!eventStart || !eventEnd) continue;
16348
+ const adjustedStart = isSameDay9(currentDate, eventStart) ? eventStart : dayStart;
16349
+ const adjustedEnd = isSameDay9(currentDate, eventEnd) ? eventEnd : addHours5(dayStart, 24);
16350
+ const startHour = getHours3(adjustedStart) + getMinutes3(adjustedStart) / 60;
16351
+ const endHour = getHours3(adjustedEnd) + getMinutes3(adjustedEnd) / 60;
16352
+ const top = (startHour - StartHourAgenda) * WeekCellsHeightAgenda;
16353
+ const height = (endHour - startHour) * WeekCellsHeightAgenda;
16354
+ let columnIndex = 0;
16355
+ let placed = false;
16356
+ while (!placed) {
16357
+ const col = columns[columnIndex] || [];
16358
+ if (col.length === 0) {
16359
+ columns[columnIndex] = col;
16360
+ placed = true;
16361
+ } else {
16362
+ const overlaps = col.some(
16363
+ (c) => areIntervalsOverlapping3(
16364
+ { end: adjustedEnd, start: adjustedStart },
16365
+ { end: c.end, start: c.start }
16366
+ )
16367
+ );
16368
+ if (!overlaps) {
16369
+ placed = true;
16370
+ } else {
16371
+ columnIndex++;
16372
+ }
16373
+ }
16374
+ }
16375
+ const currentColumn = columns[columnIndex] || [];
16376
+ columns[columnIndex] = currentColumn;
16377
+ currentColumn.push({ start: adjustedStart, end: adjustedEnd, event });
16378
+ const width = columnIndex === 0 ? 1 : 0.9;
16379
+ const left = columnIndex === 0 ? 0 : columnIndex * 0.1;
16380
+ result.push({
16381
+ event,
16382
+ height,
16383
+ left,
16384
+ top,
16385
+ width,
16386
+ zIndex: 10 + columnIndex
16387
+ });
16388
+ }
16389
+ return result;
16390
+ }, [currentDate, timeEvents]);
16391
+ const handleEventClick = (event, e) => {
16392
+ e.stopPropagation();
16393
+ onEventSelect(event);
16394
+ };
16395
+ const showAllDaySection = allDayEvents.length > 0;
16396
+ const { currentTimePosition, currentTimeVisible } = useCurrentTimeIndicatorAgenda(
16397
+ currentDate,
16398
+ "day"
16399
+ );
16400
+ return /* @__PURE__ */ jsxs69("div", { className: "contents", "data-slot": "day-view", children: [
16401
+ showAllDaySection && /* @__PURE__ */ jsx90("div", { className: "border-border/70 border-t bg-muted/50", children: /* @__PURE__ */ jsxs69("div", { className: "grid grid-cols-[3rem_1fr] sm:grid-cols-[4rem_1fr]", children: [
16402
+ /* @__PURE__ */ jsx90("div", { className: "relative", children: /* @__PURE__ */ jsx90("span", { className: "absolute bottom-0 left-0 h-6 w-16 max-w-full pe-2 text-right text-[10px] text-muted-foreground/70 sm:pe-4 sm:text-xs", children: "All day" }) }),
16403
+ /* @__PURE__ */ jsx90("div", { className: "relative border-border/70 border-r p-1 last:border-r-0", children: allDayEvents.map((event) => {
16404
+ const eventStart = new Date(
16405
+ event.start ?? event.attend_date ?? event.end ?? Date.now()
16406
+ );
16407
+ const eventEnd = new Date(
16408
+ event.end ?? event.attend_date ?? event.start ?? Date.now()
16409
+ );
16410
+ const isFirstDay = isSameDay9(currentDate, eventStart);
16411
+ const isLastDay = isSameDay9(currentDate, eventEnd);
16412
+ return /* @__PURE__ */ jsx90(
16413
+ EventItemAgenda,
16414
+ {
16415
+ event,
16416
+ isFirstDay,
16417
+ isLastDay,
16418
+ onClick: (e) => handleEventClick(event, e),
16419
+ view: "month",
16420
+ children: /* @__PURE__ */ jsx90("div", { children: event.title })
16421
+ },
16422
+ `spanning-${event.id}`
16423
+ );
16424
+ }) })
16425
+ ] }) }),
16426
+ /* @__PURE__ */ jsxs69("div", { className: "grid flex-1 grid-cols-[3rem_1fr] overflow-hidden border-border/70 border-t sm:grid-cols-[4rem_1fr]", children: [
16427
+ /* @__PURE__ */ jsx90("div", { children: hours.map((hour, index) => /* @__PURE__ */ jsx90(
16428
+ "div",
16429
+ {
16430
+ className: "relative h-[var(--week-cells-height)] border-border/70 border-b last:border-b-0",
16431
+ children: index > 0 && /* @__PURE__ */ jsx90("span", { className: "-top-3 absolute left-0 flex h-6 w-16 max-w-full items-center justify-end bg-background pe-2 text-[10px] text-muted-foreground/70 sm:pe-4 sm:text-xs", children: format13(hour, "HH:mm") })
16432
+ },
16433
+ hour.toString()
16434
+ )) }),
16435
+ /* @__PURE__ */ jsxs69("div", { className: "relative", children: [
16436
+ positionedEvents.map((positionedEvent) => {
16437
+ const evt = positionedEvent.event;
16438
+ const eventStart = new Date(
16439
+ evt.start ?? evt.attend_date ?? evt.end ?? Date.now()
16440
+ );
16441
+ const eventEnd = new Date(
16442
+ evt.end ?? evt.attend_date ?? evt.start ?? Date.now()
16443
+ );
16444
+ const isFirstDay = isSameDay9(currentDate, eventStart);
16445
+ const isLastDay = isSameDay9(currentDate, eventEnd);
16446
+ return /* @__PURE__ */ jsx90(
16447
+ "div",
16448
+ {
16449
+ className: "absolute z-10 px-0.5",
16450
+ style: {
16451
+ height: `${positionedEvent.height}px`,
16452
+ left: `${positionedEvent.left * 100}%`,
16453
+ top: `${positionedEvent.top}px`,
16454
+ width: `${positionedEvent.width * 100}%`,
16455
+ zIndex: positionedEvent.zIndex
16456
+ },
16457
+ children: /* @__PURE__ */ jsx90(
16458
+ EventItemAgenda,
16459
+ {
16460
+ event: evt,
16461
+ view: "day",
16462
+ isFirstDay,
16463
+ isLastDay,
16464
+ onClick: (e) => handleEventClick(evt, e),
16465
+ showTime: true
16466
+ }
16467
+ )
16468
+ },
16469
+ positionedEvent.event.id
16470
+ );
16471
+ }),
16472
+ currentTimeVisible && /* @__PURE__ */ jsx90(
16473
+ "div",
16474
+ {
16475
+ className: "pointer-events-none absolute right-0 left-0 z-20",
16476
+ style: { top: `${currentTimePosition}%` },
16477
+ children: /* @__PURE__ */ jsxs69("div", { className: "relative flex items-center", children: [
16478
+ /* @__PURE__ */ jsx90("div", { className: "-left-1 absolute h-2 w-2 rounded-full bg-primary" }),
16479
+ /* @__PURE__ */ jsx90("div", { className: "h-[2px] w-full bg-primary" })
16480
+ ] })
16481
+ }
16482
+ ),
16483
+ hours.map((hour) => {
16484
+ const hourValue = getHours3(hour);
16485
+ return /* @__PURE__ */ jsx90(
16486
+ "div",
16487
+ {
16488
+ className: "relative h-[var(--week-cells-height)] border-border/70 border-b last:border-b-0",
16489
+ children: [0, 1, 2, 3].map((quarter) => {
16490
+ const quarterHourTime = hourValue + quarter * 0.25;
16491
+ return /* @__PURE__ */ jsx90(
16492
+ DroppableCellAgenda,
16493
+ {
16494
+ className: cn(
16495
+ "absolute h-[calc(var(--week-cells-height)/4)] w-full",
16496
+ quarter === 0 && "top-0",
16497
+ quarter === 1 && "top-[calc(var(--week-cells-height)/4)]",
16498
+ quarter === 2 && "top-[calc(var(--week-cells-height)/4*2)]",
16499
+ quarter === 3 && "top-[calc(var(--week-cells-height)/4*3)]"
16500
+ ),
16501
+ date: currentDate,
16502
+ id: `day-cell-${currentDate.toISOString()}-${quarterHourTime}`,
16503
+ onClick: () => {
16504
+ const startTime = new Date(currentDate);
16505
+ startTime.setHours(hourValue);
16506
+ startTime.setMinutes(quarter * 15);
16507
+ },
16508
+ time: quarterHourTime
16509
+ },
16510
+ `${hour.toString()}-${quarter}`
16511
+ );
16512
+ })
16513
+ },
16514
+ hour.toString()
16515
+ );
16516
+ })
16517
+ ] })
16518
+ ] }),
16519
+ /* @__PURE__ */ jsx90(
16520
+ UndatedEvents,
16521
+ {
16522
+ events,
16523
+ onEventSelect,
16524
+ show: showUndatedEvents
16525
+ }
16526
+ )
16527
+ ] });
16528
+ }
16529
+
16530
+ // src/components/event-calendar-view/EventAgenda.tsx
16531
+ import {
16532
+ addDays as addDays5,
16533
+ addMonths as addMonths2,
16534
+ addWeeks as addWeeks2,
16535
+ endOfWeek as endOfWeek6,
16536
+ format as format14,
16537
+ isSameMonth as isSameMonth3,
16538
+ startOfWeek as startOfWeek6,
16539
+ subMonths as subMonths2,
16540
+ subWeeks as subWeeks2
16541
+ } from "date-fns";
16542
+ import { ptBR as ptBR12 } from "date-fns/locale";
16543
+ import { useEffect as useEffect27, useMemo as useMemo22, useState as useState33, useCallback as useCallback16 } from "react";
16544
+ import { toast as toast4 } from "sonner";
16545
+ import {
16546
+ CalendarIcon as CalendarIcon6,
16547
+ CaretDownIcon as CaretDownIcon6,
16548
+ CaretLeftIcon as CaretLeftIcon4,
16549
+ CaretRightIcon as CaretRightIcon7,
16550
+ Check as Check2
16551
+ } from "@phosphor-icons/react";
16552
+ import { Fragment as Fragment16, jsx as jsx91, jsxs as jsxs70 } from "react/jsx-runtime";
16553
+ function EventAgenda({
16554
+ events = [],
16555
+ onEventUpdate,
16556
+ className,
16557
+ initialView = "month",
16558
+ mode,
16559
+ initialDate
16560
+ }) {
16561
+ const [currentDate, setCurrentDate] = useState33(
16562
+ initialDate && new Date(initialDate) || /* @__PURE__ */ new Date()
16563
+ );
16564
+ const [view, setView] = useState33(initialView);
16565
+ const [isFading, setIsFading] = useState33(false);
16566
+ const FADE_DURATION = 220;
16567
+ const changeView = useCallback16(
16568
+ (next) => {
16569
+ if (mode === "agenda-only") return;
16570
+ if (next === view) return;
16571
+ setIsFading(true);
16572
+ window.setTimeout(() => {
16573
+ setView(next);
16574
+ requestAnimationFrame(() => setIsFading(false));
16575
+ }, FADE_DURATION);
16576
+ },
16577
+ [view, mode]
16578
+ );
16579
+ const [isPaging, setIsPaging] = useState33(false);
16580
+ const [pageDirection, setPageDirection] = useState33(
16581
+ null
16582
+ );
16583
+ const PAGE_DURATION = 200;
16584
+ const pageTransition = useCallback16(
16585
+ (applyDateChange, direction) => {
16586
+ setIsPaging(true);
16587
+ setPageDirection(direction);
16588
+ window.setTimeout(() => {
16589
+ applyDateChange();
16590
+ requestAnimationFrame(() => {
16591
+ setIsPaging(false);
16592
+ setPageDirection(null);
16593
+ });
16594
+ }, PAGE_DURATION);
16595
+ },
16596
+ []
16597
+ );
16598
+ const [isEventDialogOpen, setIsEventDialogOpen] = useState33(false);
16599
+ useEffect27(() => {
16600
+ const handleKeyDown = (e) => {
16601
+ if (isEventDialogOpen || e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement || e.target instanceof HTMLElement && e.target.isContentEditable) {
16602
+ return;
16603
+ }
16604
+ if (mode === "agenda-only") return;
16605
+ switch (e.key.toLowerCase()) {
16606
+ case "m":
16607
+ changeView("month");
16608
+ break;
16609
+ case "w":
16610
+ case "s":
16611
+ changeView("week");
16612
+ break;
16613
+ case "d":
16614
+ changeView("day");
16615
+ break;
16616
+ case "a":
16617
+ changeView("agenda");
16618
+ break;
16619
+ }
16620
+ };
16621
+ window.addEventListener("keydown", handleKeyDown);
16622
+ return () => {
16623
+ window.removeEventListener("keydown", handleKeyDown);
16624
+ };
16625
+ }, [isEventDialogOpen, changeView, mode]);
16626
+ useEffect27(() => {
16627
+ if (mode === "agenda-only") setView("agenda");
16628
+ }, [mode]);
16629
+ const handlePrevious = () => {
16630
+ pageTransition(() => {
16631
+ if (view === "month") {
16632
+ setCurrentDate(subMonths2(currentDate, 1));
16633
+ } else if (view === "week") {
16634
+ setCurrentDate(subWeeks2(currentDate, 1));
16635
+ } else if (view === "day") {
16636
+ setCurrentDate(addDays5(currentDate, -1));
16637
+ } else if (view === "agenda") {
16638
+ setCurrentDate(addDays5(currentDate, -AgendaDaysToShowAgenda));
16639
+ }
16640
+ }, "right");
16641
+ };
16642
+ const handleNext = () => {
16643
+ pageTransition(() => {
16644
+ if (view === "month") {
16645
+ setCurrentDate(addMonths2(currentDate, 1));
16646
+ } else if (view === "week") {
16647
+ setCurrentDate(addWeeks2(currentDate, 1));
16648
+ } else if (view === "day") {
16649
+ setCurrentDate(addDays5(currentDate, 1));
16650
+ } else if (view === "agenda") {
16651
+ setCurrentDate(addDays5(currentDate, AgendaDaysToShowAgenda));
16652
+ }
16653
+ }, "left");
16654
+ };
16655
+ const handleToday = () => {
16656
+ setCurrentDate(/* @__PURE__ */ new Date());
16657
+ };
16658
+ const handleEventSelect = (event) => {
16659
+ console.log("Event selected:", event);
16660
+ setIsEventDialogOpen(true);
16661
+ };
16662
+ const handleEventUpdate = (updatedEvent) => {
16663
+ onEventUpdate?.(updatedEvent);
16664
+ const startDate = updatedEvent.start ?? /* @__PURE__ */ new Date();
16665
+ toast4(`Evento "${updatedEvent.title}" movido`, {
16666
+ description: format14(startDate, "d 'de' MMMM 'de' yyyy", { locale: ptBR12 }),
16667
+ position: "bottom-left"
16668
+ });
16669
+ };
16670
+ const viewTitle = useMemo22(() => {
16671
+ const capitalize = (s) => s && s.length > 0 ? s.charAt(0).toUpperCase() + s.slice(1) : s;
16672
+ if (view === "month") {
16673
+ return capitalize(format14(currentDate, "MMMM yyyy", { locale: ptBR12 }));
16674
+ }
16675
+ if (view === "week") {
16676
+ const start = startOfWeek6(currentDate, { weekStartsOn: 1 });
16677
+ const end = endOfWeek6(currentDate, { weekStartsOn: 1 });
16678
+ if (isSameMonth3(start, end)) {
16679
+ return capitalize(format14(start, "MMMM yyyy", { locale: ptBR12 }));
16680
+ }
16681
+ const s1 = capitalize(format14(start, "MMM", { locale: ptBR12 }));
16682
+ const s2 = capitalize(format14(end, "MMM yyyy", { locale: ptBR12 }));
16683
+ return `${s1} - ${s2}`;
16684
+ }
16685
+ if (view === "day") {
16686
+ const dayNum = format14(currentDate, "d", { locale: ptBR12 });
16687
+ const month = capitalize(format14(currentDate, "MMMM", { locale: ptBR12 }));
16688
+ const year = format14(currentDate, "yyyy", { locale: ptBR12 });
16689
+ const short = `${dayNum} de ${month} de ${year}`;
16690
+ return /* @__PURE__ */ jsxs70(Fragment16, { children: [
16691
+ /* @__PURE__ */ jsx91("span", { "aria-hidden": "true", className: "min-[480px]:hidden", children: short }),
16692
+ /* @__PURE__ */ jsx91("span", { "aria-hidden": "true", className: "max-[479px]:hidden min-md:hidden", children: short })
16693
+ ] });
16694
+ }
16695
+ if (view === "agenda") {
16696
+ const start = currentDate;
16697
+ const end = addDays5(currentDate, AgendaDaysToShowAgenda - 1);
16698
+ if (isSameMonth3(start, end)) {
16699
+ return capitalize(format14(start, "MMMM yyyy", { locale: ptBR12 }));
16700
+ }
16701
+ const s1 = capitalize(format14(start, "MMMM", { locale: ptBR12 }));
16702
+ const s2 = capitalize(format14(end, "MMMM yyyy", { locale: ptBR12 }));
16703
+ return `${s1} - ${s2}`;
16704
+ }
16705
+ return capitalize(format14(currentDate, "MMMM yyyy", { locale: ptBR12 }));
16706
+ }, [currentDate, view]);
16707
+ const calendarContent = /* @__PURE__ */ jsxs70(Fragment16, { children: [
16708
+ /* @__PURE__ */ jsxs70(
16709
+ "div",
16710
+ {
16711
+ className: cn(
16712
+ "flex items-center justify-between p-2 sm:p-4",
16713
+ className
16714
+ ),
16715
+ children: [
16716
+ /* @__PURE__ */ jsxs70("div", { className: "flex items-center gap-1 sm:gap-4", children: [
16717
+ /* @__PURE__ */ jsxs70(
16718
+ ButtonBase,
16719
+ {
16720
+ className: "max-[479px]:aspect-square max-[479px]:p-0!",
16721
+ onClick: handleToday,
16722
+ variant: "outline",
16723
+ children: [
16724
+ /* @__PURE__ */ jsx91(
16725
+ CalendarIcon6,
16726
+ {
16727
+ "aria-hidden": "true",
16728
+ className: "min-[480px]:hidden",
16729
+ size: 16
16730
+ }
16731
+ ),
16732
+ /* @__PURE__ */ jsx91("span", { className: "max-[479px]:sr-only", children: "Hoje" })
16733
+ ]
16734
+ }
16735
+ ),
16736
+ /* @__PURE__ */ jsxs70("div", { className: "flex items-center sm:gap-2", children: [
16737
+ /* @__PURE__ */ jsx91(
16738
+ ButtonBase,
16739
+ {
16740
+ "aria-label": "Anterior",
16741
+ onClick: handlePrevious,
16742
+ size: "icon",
16743
+ variant: "ghost",
16744
+ children: /* @__PURE__ */ jsx91(CaretLeftIcon4, { "aria-hidden": "true", size: 16 })
16745
+ }
16746
+ ),
16747
+ /* @__PURE__ */ jsx91(
16748
+ ButtonBase,
16749
+ {
16750
+ "aria-label": "Pr\xF3ximo",
16751
+ onClick: handleNext,
16752
+ size: "icon",
16753
+ variant: "ghost",
16754
+ children: /* @__PURE__ */ jsx91(CaretRightIcon7, { "aria-hidden": "true", size: 16 })
16755
+ }
16756
+ )
16757
+ ] }),
16758
+ /* @__PURE__ */ jsx91("h2", { className: "font-semibold text-xl", children: viewTitle })
16759
+ ] }),
16760
+ /* @__PURE__ */ jsx91("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsx91(Fragment16, { children: /* @__PURE__ */ jsxs70(DropDownMenuBase, { children: [
16761
+ /* @__PURE__ */ jsx91(DropDownMenuTriggerBase, { asChild: true, children: /* @__PURE__ */ jsxs70(
16762
+ ButtonBase,
16763
+ {
16764
+ className: "gap-2 px-3 py-1.5 max-[479px]:h-8",
16765
+ variant: "outline",
16766
+ children: [
16767
+ /* @__PURE__ */ jsxs70("span", { className: "flex items-center gap-2", children: [
16768
+ /* @__PURE__ */ jsx91("span", { className: "hidden min-[480px]:inline-block", children: (() => {
16769
+ const labels = {
16770
+ month: "M\xEAs",
16771
+ week: "Semana",
16772
+ day: "Dia",
16773
+ agenda: "Agenda"
16774
+ };
16775
+ return labels[view] || view;
16776
+ })() }),
16777
+ /* @__PURE__ */ jsx91("span", { className: "min-[480px]:hidden", children: (() => {
16778
+ const labels = {
16779
+ month: "M",
16780
+ week: "S",
16781
+ day: "D",
16782
+ agenda: "A"
16783
+ };
16784
+ return labels[view] || view;
16785
+ })() })
16786
+ ] }),
16787
+ /* @__PURE__ */ jsx91(
16788
+ CaretDownIcon6,
16789
+ {
16790
+ "aria-hidden": "true",
16791
+ className: "-me-1 opacity-60",
16792
+ size: 16
16793
+ }
16794
+ )
16795
+ ]
16796
+ }
16797
+ ) }),
16798
+ mode === "agenda-only" ? null : /* @__PURE__ */ jsxs70(
16799
+ DropDownMenuContentBase,
16800
+ {
16801
+ align: "end",
16802
+ className: "min-w-32 rounded-md p-1",
16803
+ children: [
16804
+ /* @__PURE__ */ jsxs70(
16805
+ DropDownMenuItemBase,
16806
+ {
16807
+ onClick: () => changeView("month"),
16808
+ className: cn(
16809
+ "flex items-center justify-between gap-2 px-3 py-2 rounded",
16810
+ view === "month"
16811
+ ),
16812
+ children: [
16813
+ /* @__PURE__ */ jsx91("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsx91("span", { children: " M\xEAs " }) }),
16814
+ /* @__PURE__ */ jsx91("div", { className: "flex items-center gap-2", children: view === "month" ? /* @__PURE__ */ jsx91(Check2, { "aria-hidden": true, className: "opacity-80", size: 14 }) : /* @__PURE__ */ jsx91(DropDownMenuShortcutBase, { children: "M" }) })
16815
+ ]
16816
+ }
16817
+ ),
16818
+ /* @__PURE__ */ jsxs70(
16819
+ DropDownMenuItemBase,
16820
+ {
16821
+ onClick: () => changeView("week"),
16822
+ className: cn(
16823
+ "flex items-center justify-between gap-2 px-3 py-2 rounded",
16824
+ view === "week"
16825
+ ),
16826
+ children: [
16827
+ /* @__PURE__ */ jsx91("div", { className: "flex items-center gap-2", children: "Semana" }),
16828
+ /* @__PURE__ */ jsx91("div", { className: "flex items-center gap-2", children: view === "week" ? /* @__PURE__ */ jsx91(Check2, { "aria-hidden": true, className: "opacity-80", size: 14 }) : /* @__PURE__ */ jsx91(DropDownMenuShortcutBase, { children: "S" }) })
16829
+ ]
16830
+ }
16831
+ ),
16832
+ /* @__PURE__ */ jsxs70(
16833
+ DropDownMenuItemBase,
16834
+ {
16835
+ onClick: () => changeView("day"),
16836
+ className: cn(
16837
+ "flex items-center justify-between gap-2 px-3 py-2 rounded",
16838
+ view === "day"
16839
+ ),
16840
+ children: [
16841
+ /* @__PURE__ */ jsx91("div", { className: "flex items-center gap-2", children: "Dia" }),
16842
+ /* @__PURE__ */ jsx91("div", { className: "flex items-center gap-2", children: view === "day" ? /* @__PURE__ */ jsx91(Check2, { "aria-hidden": true, className: "opacity-80", size: 14 }) : /* @__PURE__ */ jsx91(DropDownMenuShortcutBase, { children: "D" }) })
16843
+ ]
16844
+ }
16845
+ ),
16846
+ /* @__PURE__ */ jsxs70(
16847
+ DropDownMenuItemBase,
16848
+ {
16849
+ onClick: () => changeView("agenda"),
16850
+ className: cn(
16851
+ "flex items-center justify-between gap-2 px-3 py-2 rounded",
16852
+ view === "agenda"
16853
+ ),
16854
+ children: [
16855
+ /* @__PURE__ */ jsx91("div", { className: "flex items-center gap-2", children: "Agenda" }),
16856
+ /* @__PURE__ */ jsx91("div", { className: "flex items-center gap-2", children: view === "agenda" ? /* @__PURE__ */ jsx91(Check2, { "aria-hidden": true, className: "opacity-80", size: 14 }) : /* @__PURE__ */ jsx91(DropDownMenuShortcutBase, { children: "A" }) })
16857
+ ]
16858
+ }
16859
+ )
16860
+ ]
16861
+ }
16862
+ )
16863
+ ] }) }) })
16864
+ ]
16865
+ }
16866
+ ),
16867
+ /* @__PURE__ */ jsxs70(
16868
+ "div",
16869
+ {
16870
+ className: cn(
16871
+ "flex flex-1 flex-col transition-all duration-200 ease-in-out",
16872
+ isFading ? "opacity-0 -translate-y-2 pointer-events-none" : isPaging ? pageDirection === "left" ? "-translate-x-4 opacity-0 pointer-events-none" : "translate-x-4 opacity-0 pointer-events-none" : "opacity-100 translate-y-0"
16873
+ ),
16874
+ "aria-live": "polite",
16875
+ children: [
16876
+ view === "month" && /* @__PURE__ */ jsx91(
16877
+ MonthViewAgenda,
16878
+ {
16879
+ currentDate,
16880
+ events,
16881
+ onEventSelect: handleEventSelect
16882
+ }
16883
+ ),
16884
+ view === "week" && /* @__PURE__ */ jsx91(
16885
+ WeekViewAgenda,
16886
+ {
16887
+ currentDate,
16888
+ events,
16889
+ onEventSelect: handleEventSelect
16890
+ }
16891
+ ),
16892
+ view === "day" && /* @__PURE__ */ jsx91(
16893
+ DayViewAgenda,
16894
+ {
16895
+ currentDate,
16896
+ events,
16897
+ onEventSelect: handleEventSelect
16898
+ }
16899
+ ),
16900
+ view === "agenda" && /* @__PURE__ */ jsx91(
16901
+ Agenda,
16902
+ {
16903
+ currentDate,
16904
+ events,
16905
+ onEventSelect: handleEventSelect
16906
+ }
16907
+ )
16908
+ ]
16909
+ }
16910
+ )
16911
+ ] });
16912
+ return /* @__PURE__ */ jsx91(
16913
+ "div",
16914
+ {
16915
+ className: "flex flex-col rounded-lg border has-data-[slot=month-view]:flex-1 px-6",
16916
+ style: {
16917
+ "--event-gap": `${EventGapAgenda}px`,
16918
+ "--event-height": `${EventHeightAgenda}px`,
16919
+ "--week-cells-height": `${WeekCellsHeightAgenda}px`
16920
+ },
16921
+ children: /* @__PURE__ */ jsx91(CalendarDndProviderAgenda, { onEventUpdate: handleEventUpdate, children: calendarContent })
16922
+ }
16923
+ );
16924
+ }
16925
+
16926
+ // src/components/event-calendar-view/UndatedEvents.tsx
16927
+ import { useMemo as useMemo23 } from "react";
16928
+ import { jsx as jsx92, jsxs as jsxs71 } from "react/jsx-runtime";
16929
+ var isValidDate5 = (d) => {
16930
+ try {
16931
+ const t = d instanceof Date ? d.getTime() : new Date(String(d)).getTime();
16932
+ return !isNaN(t);
16933
+ } catch {
16934
+ return false;
16935
+ }
16936
+ };
16937
+ function UndatedEvents({
16938
+ events,
16939
+ onEventSelect,
16940
+ className,
16941
+ title = "Data de Atendimento n\xE3o Prevista",
16942
+ show = true
16943
+ }) {
16944
+ const undatedEvents = useMemo23(
16945
+ () => events.filter(
16946
+ (e) => !(isValidDate5(e.start) && isValidDate5(e.end)) && !isValidDate5(e.attend_date)
16947
+ ),
16948
+ [events]
16949
+ );
16950
+ if (!show || undatedEvents.length === 0) return null;
16951
+ return /* @__PURE__ */ jsx92("div", { className, children: /* @__PURE__ */ jsxs71("div", { className: "relative border-border/70 border-t", children: [
16952
+ /* @__PURE__ */ jsx92("span", { className: "-top-3 absolute left-0 flex h-6 items-center bg-background pe-4 uppercase sm:pe-4 text-lg", children: title }),
16953
+ /* @__PURE__ */ jsx92("div", { className: "mt-6 space-y-2", children: undatedEvents.map((event) => /* @__PURE__ */ jsx92(
16954
+ EventItemAgenda,
16955
+ {
16956
+ event,
16957
+ onClick: onEventSelect ? () => onEventSelect(event) : void 0,
16958
+ view: "agenda",
16959
+ agendaOnly: true,
16960
+ className: "cursor-default hover:shadow-none hover:scale-100 bg-gray-200/50 hover:bg-gray-200/40 text-gray-900/80 dark:bg-gray-700/25 dark:text-gray-200/90 shadow-none "
16961
+ },
16962
+ event.id
16963
+ )) })
16964
+ ] }) });
16965
+ }
16966
+
16967
+ // src/components/event-calendar-view/hooks/use-event-visibility.ts
16968
+ import { useLayoutEffect as useLayoutEffect3, useMemo as useMemo24, useRef as useRef16, useState as useState34 } from "react";
16969
+ function useEventVisibilityAgenda({
16970
+ eventHeight,
16971
+ eventGap
16972
+ }) {
16973
+ const contentRef = useRef16(null);
16974
+ const observerRef = useRef16(null);
16975
+ const [contentHeight, setContentHeight] = useState34(null);
16976
+ useLayoutEffect3(() => {
16977
+ if (!contentRef.current) return;
16978
+ const updateHeight = () => {
16979
+ if (contentRef.current) {
16980
+ setContentHeight(contentRef.current.clientHeight);
16981
+ }
16982
+ };
16983
+ updateHeight();
16984
+ if (!observerRef.current) {
16985
+ observerRef.current = new ResizeObserver(() => {
16986
+ updateHeight();
16987
+ });
16988
+ }
16989
+ observerRef.current.observe(contentRef.current);
16990
+ return () => {
16991
+ if (observerRef.current) {
16992
+ observerRef.current.disconnect();
16993
+ }
16994
+ };
16995
+ }, []);
16996
+ const getVisibleEventCount = useMemo24(() => {
16997
+ return (totalEvents) => {
16998
+ if (!contentHeight) return totalEvents;
16999
+ const maxEvents = Math.floor(contentHeight / (eventHeight + eventGap));
17000
+ if (totalEvents <= maxEvents) {
17001
+ return totalEvents;
17002
+ }
17003
+ return maxEvents > 0 ? maxEvents - 1 : 0;
17004
+ };
17005
+ }, [contentHeight, eventHeight, eventGap]);
17006
+ return {
17007
+ contentHeight,
17008
+ contentRef,
17009
+ getVisibleEventCount
17010
+ };
17011
+ }
17012
+
17013
+ // src/components/event-calendar-view/MonthView.tsx
17014
+ import {
17015
+ addDays as addDays6,
17016
+ eachDayOfInterval as eachDayOfInterval3,
17017
+ endOfMonth as endOfMonth2,
17018
+ endOfWeek as endOfWeek7,
17019
+ format as format15,
17020
+ isSameDay as isSameDay10,
17021
+ isSameMonth as isSameMonth4,
17022
+ isToday as isToday5,
17023
+ startOfMonth as startOfMonth2,
17024
+ startOfWeek as startOfWeek7
17025
+ } from "date-fns";
17026
+ import { ptBR as ptBR13 } from "date-fns/locale";
17027
+ import { useEffect as useEffect28, useMemo as useMemo25, useState as useState35 } from "react";
17028
+ import { twMerge as twMerge3 } from "tailwind-merge";
17029
+ import { jsx as jsx93, jsxs as jsxs72 } from "react/jsx-runtime";
17030
+ function MonthViewAgenda({
17031
+ currentDate,
17032
+ events,
17033
+ onEventSelect,
17034
+ showUndatedEvents
17035
+ }) {
17036
+ const days = useMemo25(() => {
17037
+ const monthStart = startOfMonth2(currentDate);
17038
+ const monthEnd = endOfMonth2(monthStart);
17039
+ const calendarStart = startOfWeek7(monthStart, { weekStartsOn: 0 });
17040
+ const calendarEnd = endOfWeek7(monthEnd, { weekStartsOn: 0 });
17041
+ return eachDayOfInterval3({ end: calendarEnd, start: calendarStart });
17042
+ }, [currentDate]);
17043
+ const weekdays = useMemo25(() => {
17044
+ return Array.from({ length: 7 }).map((_, i) => {
17045
+ const date = addDays6(startOfWeek7(/* @__PURE__ */ new Date(), { weekStartsOn: 0 }), i);
17046
+ const short = format15(date, "EEE", { locale: ptBR13 });
17047
+ return short.charAt(0).toUpperCase() + short.slice(1);
17048
+ });
17049
+ }, []);
17050
+ const weeks = useMemo25(() => {
17051
+ const result = [];
17052
+ let week = [];
17053
+ for (let i = 0; i < days.length; i++) {
17054
+ week.push(days[i]);
17055
+ if (week.length === 7 || i === days.length - 1) {
17056
+ result.push(week);
17057
+ week = [];
17058
+ }
17059
+ }
17060
+ return result;
17061
+ }, [days]);
17062
+ const handleEventClick = (event, e) => {
17063
+ e.stopPropagation();
17064
+ onEventSelect(event);
17065
+ };
17066
+ const [isMounted, setIsMounted] = useState35(false);
17067
+ const { contentRef, getVisibleEventCount } = useEventVisibilityAgenda({
17068
+ eventGap: EventGapAgenda,
17069
+ eventHeight: EventHeightAgenda
17070
+ });
17071
+ useEffect28(() => {
17072
+ setIsMounted(true);
17073
+ }, []);
17074
+ return /* @__PURE__ */ jsxs72("div", { className: "contents", "data-slot": "month-view", children: [
17075
+ /* @__PURE__ */ jsx93("div", { className: "grid grid-cols-7 border-border/70 border-b", children: weekdays.map((day) => /* @__PURE__ */ jsx93(
17076
+ "div",
17077
+ {
17078
+ className: "py-2 text-center text-muted-foreground/70 text-sm uppercase tracking-wide bg-muted/5",
17079
+ children: day
17080
+ },
17081
+ day
17082
+ )) }),
17083
+ /* @__PURE__ */ jsx93("div", { className: "grid flex-1 auto-rows-fr", children: weeks.map((week, weekIndex) => /* @__PURE__ */ jsx93(
17084
+ "div",
17085
+ {
17086
+ className: "grid grid-cols-7 [&:last-child>*]:border-b-0",
17087
+ children: week.map((day, dayIndex) => {
17088
+ if (!day) return null;
17089
+ const dayEvents = getEventsForDayAgenda(events, day);
17090
+ const spanningEvents = getSpanningEventsForDayAgenda(events, day);
17091
+ const isCurrentMonth = isSameMonth4(day, currentDate);
17092
+ const cellId = `month-cell-${day.toISOString()}`;
17093
+ const allDayEvents = [...spanningEvents, ...dayEvents];
17094
+ const allEvents = getAllEventsForDayAgenda(events, day);
17095
+ const isReferenceCell = weekIndex === 0 && dayIndex === 0;
17096
+ const visibleCount = isMounted ? getVisibleEventCount(allDayEvents.length) : void 0;
17097
+ const hasMore = visibleCount !== void 0 && allDayEvents.length > visibleCount;
17098
+ const remainingCount = hasMore ? allDayEvents.length - visibleCount : 0;
17099
+ return /* @__PURE__ */ jsx93(
17100
+ "div",
17101
+ {
17102
+ className: "group border-border/70 border-r border-b last:border-r-0 data-outside-cell:bg-muted/25 data-outside-cell:text-muted-foreground/70 hover:bg-muted/5 transition-colors p-2 ",
17103
+ "data-outside-cell": !isCurrentMonth || void 0,
17104
+ "data-today": isToday5(day) || void 0,
17105
+ children: /* @__PURE__ */ jsxs72(
17106
+ DroppableCellAgenda,
17107
+ {
17108
+ date: day,
17109
+ id: cellId,
17110
+ onClick: () => {
17111
+ const startTime = new Date(day);
17112
+ startTime.setHours(DefaultStartHourAgenda, 0, 0);
17113
+ },
17114
+ children: [
17115
+ /* @__PURE__ */ jsx93(
17116
+ "div",
17117
+ {
17118
+ className: twMerge3(
17119
+ `mt-1 inline-flex w-7 h-7 items-center justify-center rounded-full text-sm font-semibold text-muted-foreground`,
17120
+ isToday5(day) ? "bg-blue-500 text-white" : ""
17121
+ ),
17122
+ children: format15(day, "d")
17123
+ }
17124
+ ),
17125
+ /* @__PURE__ */ jsxs72(
17126
+ "div",
17127
+ {
17128
+ className: "min-h-[calc((var(--event-height)+var(--event-gap))*2)] sm:min-h-[calc((var(--event-height)+var(--event-gap))*3)] lg:min-h-[calc((var(--event-height)+var(--event-gap))*4)] px-1 py-1",
17129
+ ref: isReferenceCell ? contentRef : null,
17130
+ children: [
17131
+ sortEventsAgenda(allDayEvents).map((event, index) => {
17132
+ const eventStart = new Date(
17133
+ event.start ?? event.attend_date ?? event.end ?? Date.now()
17134
+ );
17135
+ const eventEnd = new Date(
17136
+ event.end ?? event.attend_date ?? event.start ?? Date.now()
17137
+ );
17138
+ const isFirstDay = isSameDay10(day, eventStart);
17139
+ const isLastDay = isSameDay10(day, eventEnd);
17140
+ const isHidden = isMounted && visibleCount && index >= visibleCount;
17141
+ if (!visibleCount) return null;
17142
+ if (!isFirstDay) {
17143
+ return /* @__PURE__ */ jsx93(
17144
+ "div",
17145
+ {
17146
+ "aria-hidden": isHidden ? "true" : void 0,
17147
+ className: "aria-hidden:hidden",
17148
+ children: /* @__PURE__ */ jsx93(
17149
+ EventItemAgenda,
17150
+ {
17151
+ event,
17152
+ isFirstDay,
17153
+ isLastDay,
17154
+ onClick: (e) => handleEventClick(event, e),
17155
+ view: "month",
17156
+ children: /* @__PURE__ */ jsxs72("div", { "aria-hidden": true, className: "invisible", children: [
17157
+ !event.allDay && /* @__PURE__ */ jsxs72("span", { children: [
17158
+ format15(eventStart, "HH:mm"),
17159
+ " "
17160
+ ] }),
17161
+ event.title
17162
+ ] })
17163
+ }
17164
+ )
17165
+ },
17166
+ `spanning-${event.id}-${day.toISOString().slice(0, 10)}`
17167
+ );
17168
+ }
17169
+ return /* @__PURE__ */ jsx93(
17170
+ "div",
17171
+ {
17172
+ "aria-hidden": isHidden ? "true" : void 0,
17173
+ className: "aria-hidden:hidden",
17174
+ children: /* @__PURE__ */ jsx93(
17175
+ EventItemAgenda,
17176
+ {
17177
+ className: "cursor-default",
17178
+ event,
17179
+ isFirstDay,
17180
+ isLastDay,
17181
+ onClick: (e) => handleEventClick(event, e),
17182
+ view: "month",
17183
+ children: /* @__PURE__ */ jsxs72("span", { className: "flex items-center gap-2 truncate", children: [
17184
+ !event.allDay && /* @__PURE__ */ jsx93("span", { className: "truncate font-normal opacity-80 sm:text-[11px] bg-white/10 px-2 py-0.5 rounded-full text-[11px]", children: format15(eventStart, "HH:mm") }),
17185
+ /* @__PURE__ */ jsx93("span", { className: "truncate font-medium", children: event.title })
17186
+ ] })
17187
+ }
17188
+ )
17189
+ },
17190
+ event.id
17191
+ );
17192
+ }),
17193
+ hasMore && /* @__PURE__ */ jsxs72(PopoverBase, { modal: true, children: [
17194
+ /* @__PURE__ */ jsx93(PopoverTriggerBase, { asChild: true, children: /* @__PURE__ */ jsxs72(
17195
+ "button",
17196
+ {
17197
+ className: "mt-[var(--event-gap)] flex h-[var(--event-height)] w-full select-none items-center overflow-hidden px-2 text-left text-[10px] text-muted-foreground outline-none backdrop-blur-md rounded-md transition hover:bg-muted/60 hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 sm:text-xs",
17198
+ onClick: (e) => e.stopPropagation(),
17199
+ type: "button",
17200
+ "aria-label": `Show ${remainingCount} more events on ${format15(
17201
+ day,
17202
+ "PPP",
17203
+ { locale: ptBR13 }
17204
+ )}`,
17205
+ children: [
17206
+ /* @__PURE__ */ jsxs72("span", { className: "font-medium", children: [
17207
+ "+ ",
17208
+ remainingCount
17209
+ ] }),
17210
+ /* @__PURE__ */ jsx93("span", { className: "sr-only", children: " more" })
17211
+ ]
17212
+ }
17213
+ ) }),
17214
+ /* @__PURE__ */ jsx93(
17215
+ PopoverContentBase,
17216
+ {
17217
+ align: "center",
17218
+ className: "max-w-52 p-3",
17219
+ style: {
17220
+ "--event-height": `${EventHeightAgenda}px`
17221
+ },
17222
+ children: /* @__PURE__ */ jsxs72("div", { className: "space-y-2", children: [
17223
+ /* @__PURE__ */ jsx93("div", { className: "font-medium text-sm", children: format15(day, "EEE d", { locale: ptBR13 }) }),
17224
+ /* @__PURE__ */ jsx93("div", { className: "space-y-1", children: sortEventsAgenda(allEvents).map((event) => {
17225
+ const eventStart = new Date(
17226
+ event.start ?? event.end ?? Date.now()
17227
+ );
17228
+ const eventEnd = new Date(
17229
+ event.end ?? event.start ?? Date.now()
17230
+ );
17231
+ const isFirstDay = isSameDay10(day, eventStart);
17232
+ const isLastDay = isSameDay10(day, eventEnd);
17233
+ return /* @__PURE__ */ jsx93(
17234
+ EventItemAgenda,
17235
+ {
17236
+ event,
17237
+ isFirstDay,
17238
+ isLastDay,
17239
+ onClick: (e) => handleEventClick(event, e),
17240
+ view: "month"
17241
+ },
17242
+ event.id
17243
+ );
17244
+ }) })
17245
+ ] })
17246
+ }
17247
+ )
17248
+ ] })
17249
+ ]
17250
+ }
17251
+ )
17252
+ ]
17253
+ }
17254
+ )
17255
+ },
17256
+ day.toString()
17257
+ );
17258
+ })
17259
+ },
17260
+ `week-${week}`
17261
+ )) }),
17262
+ /* @__PURE__ */ jsx93(
17263
+ UndatedEvents,
17264
+ {
17265
+ events,
17266
+ onEventSelect,
17267
+ className: "my-12",
17268
+ show: showUndatedEvents
17269
+ }
17270
+ )
17271
+ ] });
17272
+ }
17273
+
17274
+ // src/components/event-calendar-view/WeekView.tsx
17275
+ import {
17276
+ addHours as addHours6,
17277
+ areIntervalsOverlapping as areIntervalsOverlapping4,
17278
+ differenceInMinutes as differenceInMinutes8,
17279
+ eachDayOfInterval as eachDayOfInterval4,
17280
+ eachHourOfInterval as eachHourOfInterval4,
17281
+ endOfWeek as endOfWeek8,
17282
+ format as format16,
17283
+ getHours as getHours4,
17284
+ getMinutes as getMinutes4,
17285
+ isBefore as isBefore3,
17286
+ isSameDay as isSameDay11,
17287
+ isToday as isToday6,
17288
+ startOfDay as startOfDay4,
17289
+ startOfWeek as startOfWeek8
17290
+ } from "date-fns";
17291
+ import { endOfDay as endOfDay2 } from "date-fns";
17292
+ import { ptBR as ptBR14 } from "date-fns/locale";
17293
+ import { useMemo as useMemo26 } from "react";
17294
+
17295
+ // src/components/event-calendar-view/DraggablaEvent.tsx
17296
+ import { useDraggable as useDraggable2 } from "@dnd-kit/core";
17297
+ import { CSS as CSS2 } from "@dnd-kit/utilities";
17298
+ import { differenceInDays as differenceInDays2 } from "date-fns";
17299
+ import { useRef as useRef17, useState as useState36 } from "react";
17300
+ import { jsx as jsx94 } from "react/jsx-runtime";
17301
+ function DraggableEvent2({
17302
+ event,
17303
+ view,
17304
+ showTime,
17305
+ onClick,
17306
+ height,
17307
+ isMultiDay,
17308
+ multiDayWidth,
17309
+ isFirstDay = true,
17310
+ isLastDay = true,
17311
+ "aria-hidden": ariaHidden
17312
+ }) {
17313
+ const { activeId } = useCalendarDndAgenda();
17314
+ const elementRef = useRef17(null);
17315
+ const [dragHandlePosition, setDragHandlePosition] = useState36(null);
17316
+ const eventStart = new Date(event.start ?? Date.now());
17317
+ const eventEnd = new Date(event.end ?? Date.now());
17318
+ const isMultiDayEvent2 = isMultiDay || event.allDay || differenceInDays2(eventEnd, eventStart) >= 1;
17319
+ const { attributes, listeners, setNodeRef, transform, isDragging } = useDraggable2({
17320
+ data: {
17321
+ dragHandlePosition,
17322
+ event,
17323
+ height: height || elementRef.current?.offsetHeight || null,
17324
+ isFirstDay,
17325
+ isLastDay,
17326
+ isMultiDay: isMultiDayEvent2,
17327
+ multiDayWidth,
17328
+ view
17329
+ },
17330
+ id: `${event.id}-${view}`
17331
+ });
17332
+ const handleMouseDown = (e) => {
17333
+ if (elementRef.current) {
17334
+ const rect = elementRef.current.getBoundingClientRect();
17335
+ setDragHandlePosition({
17336
+ x: e.clientX - rect.left,
17337
+ y: e.clientY - rect.top
17338
+ });
17339
+ }
17340
+ };
17341
+ if (isDragging || activeId === `${event.id}-${view}`) {
17342
+ return /* @__PURE__ */ jsx94(
17343
+ "div",
17344
+ {
17345
+ className: "opacity-0",
17346
+ ref: setNodeRef,
17347
+ style: { height: height || "auto" }
17348
+ }
17349
+ );
17350
+ }
17351
+ const style = transform ? {
17352
+ height: height || "auto",
17353
+ transform: CSS2.Translate.toString(transform),
17354
+ width: isMultiDayEvent2 && multiDayWidth ? `${multiDayWidth}%` : void 0
17355
+ } : {
17356
+ height: height || "auto",
17357
+ width: isMultiDayEvent2 && multiDayWidth ? `${multiDayWidth}%` : void 0
17358
+ };
17359
+ const handleTouchStart = (e) => {
17360
+ if (elementRef.current) {
17361
+ const rect = elementRef.current.getBoundingClientRect();
17362
+ const touch = e.touches[0];
17363
+ if (touch) {
17364
+ setDragHandlePosition({
17365
+ x: touch.clientX - rect.left,
17366
+ y: touch.clientY - rect.top
17367
+ });
17368
+ }
17369
+ }
17370
+ };
17371
+ return /* @__PURE__ */ jsx94(
17372
+ "div",
17373
+ {
17374
+ className: "touch-none",
17375
+ ref: (node) => {
17376
+ setNodeRef(node);
17377
+ if (elementRef) elementRef.current = node;
17378
+ },
17379
+ style,
17380
+ children: /* @__PURE__ */ jsx94(
17381
+ EventItemAgenda,
17382
+ {
17383
+ "aria-hidden": ariaHidden,
17384
+ dndAttributes: attributes,
17385
+ dndListeners: listeners,
17386
+ event,
17387
+ isDragging,
17388
+ isFirstDay,
17389
+ isLastDay,
17390
+ onClick,
17391
+ onMouseDown: handleMouseDown,
17392
+ onTouchStart: handleTouchStart,
17393
+ showTime,
17394
+ view
17395
+ }
17396
+ )
17397
+ }
17398
+ );
17399
+ }
17400
+
17401
+ // src/components/event-calendar-view/WeekView.tsx
17402
+ import { jsx as jsx95, jsxs as jsxs73 } from "react/jsx-runtime";
17403
+ function WeekViewAgenda({
17404
+ currentDate,
17405
+ events,
17406
+ onEventSelect,
17407
+ onEventCreate
17408
+ }) {
17409
+ const days = useMemo26(() => {
17410
+ const weekStart2 = startOfWeek8(currentDate, { weekStartsOn: 0 });
17411
+ const weekEnd = endOfWeek8(currentDate, { weekStartsOn: 0 });
17412
+ return eachDayOfInterval4({ end: weekEnd, start: weekStart2 });
17413
+ }, [currentDate]);
17414
+ const weekStart = useMemo26(
17415
+ () => startOfWeek8(currentDate, { weekStartsOn: 0 }),
17416
+ [currentDate]
17417
+ );
17418
+ const hours = useMemo26(() => {
17419
+ const dayStart = startOfDay4(currentDate);
17420
+ return eachHourOfInterval4({
17421
+ end: addHours6(dayStart, EndHour - 1),
17422
+ start: addHours6(dayStart, StartHour)
17423
+ });
17424
+ }, [currentDate]);
17425
+ const allDayEvents = useMemo26(() => {
17426
+ return events.filter((event) => {
17427
+ return event.allDay || isMultiDayEventAgenda(event);
17428
+ }).filter((event) => {
17429
+ const eventStart = event.start ? new Date(event.start) : void 0;
17430
+ const eventEnd = event.end ? new Date(event.end) : void 0;
17431
+ return days.some((day) => {
17432
+ if (eventStart && isSameDay11(day, eventStart)) return true;
17433
+ if (eventEnd && isSameDay11(day, eventEnd)) return true;
17434
+ if (eventStart && eventEnd && day > eventStart && day < eventEnd) return true;
17435
+ return false;
17436
+ });
17437
+ });
17438
+ }, [events, days]);
17439
+ const processedDayEvents = useMemo26(() => {
17440
+ const result = days.map((day) => {
17441
+ const dayEventsWithIntervals = events.filter((event) => !event.allDay && !isMultiDayEventAgenda(event)).map((event) => {
17442
+ let eventStart = event.start != null ? new Date(event.start) : void 0;
17443
+ let eventEnd = event.end != null ? new Date(event.end) : void 0;
17444
+ if ((!eventStart || !eventEnd) && event.attend_date) {
17445
+ try {
17446
+ const ad = new Date(event.attend_date);
17447
+ const hasTime = ad.getHours() !== 0 || ad.getMinutes() !== 0 || ad.getSeconds() !== 0 || ad.getMilliseconds() !== 0;
17448
+ if (hasTime) {
17449
+ if (!eventStart) eventStart = ad;
17450
+ if (!eventEnd) eventEnd = addHours6(ad, 1);
17451
+ }
17452
+ } catch {
17453
+ }
17454
+ }
17455
+ return { event, eventStart, eventEnd };
17456
+ }).filter(({ eventStart, eventEnd }) => !!eventStart && !!eventEnd).filter(({ eventStart, eventEnd }) => {
17457
+ const dayStart2 = startOfDay4(day);
17458
+ const dayEnd = endOfDay2(day);
17459
+ return areIntervalsOverlapping4(
17460
+ { start: eventStart, end: eventEnd },
17461
+ { start: dayStart2, end: dayEnd }
17462
+ );
17463
+ });
17464
+ const sortedEvents = [...dayEventsWithIntervals].sort((a, b) => {
17465
+ const aStart = a.eventStart.getTime();
17466
+ const bStart = b.eventStart.getTime();
17467
+ if (aStart < bStart) return -1;
17468
+ if (aStart > bStart) return 1;
17469
+ const aDuration = differenceInMinutes8(
17470
+ a.eventEnd,
17471
+ a.eventStart
17472
+ );
17473
+ const bDuration = differenceInMinutes8(
17474
+ b.eventEnd,
17475
+ b.eventStart
17476
+ );
17477
+ return bDuration - aDuration;
17478
+ });
17479
+ const positionedEvents = [];
17480
+ const dayStart = startOfDay4(day);
17481
+ const columns = [];
17482
+ for (const item of sortedEvents) {
17483
+ const event = item.event;
17484
+ const eventStart = item.eventStart;
17485
+ const eventEnd = item.eventEnd;
17486
+ const adjustedStart = isSameDay11(day, eventStart) ? eventStart : dayStart;
17487
+ const adjustedEnd = isSameDay11(day, eventEnd) ? eventEnd : addHours6(dayStart, 24);
17488
+ const startHour = getHours4(adjustedStart) + getMinutes4(adjustedStart) / 60;
17489
+ const endHour = getHours4(adjustedEnd) + getMinutes4(adjustedEnd) / 60;
17490
+ const top = (startHour - StartHour) * WeekCellsHeightAgenda;
17491
+ const height = (endHour - startHour) * WeekCellsHeightAgenda;
17492
+ let columnIndex = 0;
17493
+ let placed = false;
17494
+ while (!placed) {
17495
+ const col = columns[columnIndex] || [];
17496
+ if (col.length === 0) {
17497
+ columns[columnIndex] = col;
17498
+ placed = true;
17499
+ } else {
17500
+ const overlaps = col.some(
17501
+ (c) => areIntervalsOverlapping4(
17502
+ { end: adjustedEnd, start: adjustedStart },
17503
+ { end: c.end, start: c.start }
17504
+ )
17505
+ );
17506
+ if (!overlaps) {
17507
+ placed = true;
17508
+ } else {
17509
+ columnIndex++;
17510
+ }
17511
+ }
17512
+ }
17513
+ const currentColumn = columns[columnIndex] || [];
17514
+ columns[columnIndex] = currentColumn;
17515
+ currentColumn.push({ start: adjustedStart, end: adjustedEnd, event });
17516
+ const width = columnIndex === 0 ? 1 : 0.7;
17517
+ const left = columnIndex === 0 ? 0 : columnIndex * 0.3;
17518
+ positionedEvents.push({
17519
+ event,
17520
+ height,
17521
+ left,
17522
+ top,
17523
+ width,
17524
+ zIndex: 10 + columnIndex
17525
+ });
17526
+ }
17527
+ return positionedEvents;
17528
+ });
17529
+ return result;
17530
+ }, [days, events]);
17531
+ const handleEventClick = (event, e) => {
17532
+ e.stopPropagation();
17533
+ onEventSelect(event);
17534
+ };
17535
+ const showAllDaySection = allDayEvents.length > 0;
17536
+ const { currentTimePosition, currentTimeVisible } = useCurrentTimeIndicatorAgenda(
17537
+ currentDate,
17538
+ "week"
17539
+ );
17540
+ return /* @__PURE__ */ jsxs73("div", { className: "flex h-full flex-col", "data-slot": "week-view", children: [
17541
+ /* @__PURE__ */ jsxs73("div", { className: "sticky top-0 z-30 grid grid-cols-8 border-border/70 border-b bg-background", children: [
17542
+ /* @__PURE__ */ jsx95("div", { className: "py-2 text-center text-muted-foreground/70 text-sm", children: /* @__PURE__ */ jsx95("span", { className: "max-[479px]:sr-only", children: format16(/* @__PURE__ */ new Date(), "O") }) }),
17543
+ days.map((day) => /* @__PURE__ */ jsxs73(
17544
+ "div",
17545
+ {
17546
+ className: "py-2 text-center text-muted-foreground/70 text-sm data-today:font-medium data-today:text-foreground",
17547
+ "data-today": isToday6(day) || void 0,
17548
+ children: [
17549
+ /* @__PURE__ */ jsxs73("span", { "aria-hidden": "true", className: "sm:hidden", children: [
17550
+ format16(day, "EEE", { locale: ptBR14 })[0],
17551
+ " ",
17552
+ format16(day, "d", { locale: ptBR14 })
17553
+ ] }),
17554
+ /* @__PURE__ */ jsx95("span", { className: "max-sm:hidden", children: format16(day, "EEE dd", { locale: ptBR14 }) })
17555
+ ]
17556
+ },
17557
+ day.toString()
17558
+ ))
17559
+ ] }),
17560
+ showAllDaySection && /* @__PURE__ */ jsx95("div", { className: "border-border/70 border-b bg-muted/50", children: /* @__PURE__ */ jsxs73("div", { className: "grid grid-cols-8", children: [
17561
+ /* @__PURE__ */ jsx95("div", { className: "relative border-border/70 border-r", children: /* @__PURE__ */ jsx95("span", { className: "absolute bottom-0 left-0 h-6 w-16 max-w-full pe-2 text-right text-[10px] text-muted-foreground/70 sm:pe-4 sm:text-xs", children: "All day" }) }),
17562
+ days.map((day, dayIndex) => {
17563
+ const dayAllDayEvents = allDayEvents.filter((event) => {
17564
+ const eventStart = event.start ? new Date(event.start) : void 0;
17565
+ const eventEnd = event.end ? new Date(event.end) : void 0;
17566
+ if (!eventStart && !eventEnd) return false;
17567
+ return eventStart && isSameDay11(day, eventStart) || eventStart && eventEnd && day > eventStart && day < eventEnd || eventEnd && isSameDay11(day, eventEnd);
17568
+ });
17569
+ return /* @__PURE__ */ jsx95(
17570
+ "div",
17571
+ {
17572
+ className: "relative border-border/70 border-r p-1 last:border-r-0",
17573
+ "data-today": isToday6(day) || void 0,
17574
+ children: dayAllDayEvents.map((event) => {
17575
+ const eventStart = event.start ? new Date(event.start) : void 0;
17576
+ const eventEnd = event.end ? new Date(event.end) : void 0;
17577
+ const isFirstDay = eventStart ? isSameDay11(day, eventStart) : false;
17578
+ const isLastDay = eventEnd ? isSameDay11(day, eventEnd) : false;
17579
+ const isFirstVisibleDay = eventStart ? dayIndex === 0 && isBefore3(eventStart, weekStart) : false;
17580
+ const shouldShowTitle = isFirstDay || isFirstVisibleDay;
17581
+ return /* @__PURE__ */ jsx95(
17582
+ EventItemAgenda,
17583
+ {
17584
+ event,
17585
+ isFirstDay,
17586
+ isLastDay,
17587
+ onClick: (e) => handleEventClick(event, e),
17588
+ view: "month",
17589
+ children: /* @__PURE__ */ jsx95(
17590
+ "div",
17591
+ {
17592
+ "aria-hidden": !shouldShowTitle,
17593
+ className: cn(
17594
+ "truncate",
17595
+ !shouldShowTitle && "invisible"
17596
+ ),
17597
+ children: event.title
17598
+ }
17599
+ )
17600
+ },
17601
+ `spanning-${event.id}`
17602
+ );
17603
+ })
17604
+ },
17605
+ day.toString()
17606
+ );
17607
+ })
17608
+ ] }) }),
17609
+ /* @__PURE__ */ jsxs73("div", { className: "grid flex-1 grid-cols-8 overflow-hidden", children: [
17610
+ /* @__PURE__ */ jsx95("div", { className: "grid auto-cols-fr border-border/70 border-r", children: hours.map((hour, index) => /* @__PURE__ */ jsx95(
17611
+ "div",
17612
+ {
17613
+ className: "relative min-h-[var(--week-cells-height)] border-border/70 border-b last:border-b-0",
17614
+ children: index > 0 && /* @__PURE__ */ jsx95("span", { className: "-top-3 absolute left-0 flex h-6 w-16 max-w-full items-center justify-end bg-background pe-2 text-[10px] text-muted-foreground/70 sm:pe-4 sm:text-xs", children: format16(hour, "HH:mm") })
17615
+ },
17616
+ hour.toString()
17617
+ )) }),
17618
+ days.map((day, dayIndex) => /* @__PURE__ */ jsxs73(
17619
+ "div",
17620
+ {
17621
+ className: "relative grid auto-cols-fr border-border/70 border-r last:border-r-0",
17622
+ "data-today": isToday6(day) || void 0,
17623
+ children: [
17624
+ (processedDayEvents[dayIndex] ?? []).map((positionedEvent) => /* @__PURE__ */ jsx95(
17625
+ "div",
17626
+ {
17627
+ className: "absolute z-10 px-0.5",
17628
+ onClick: (e) => e.stopPropagation(),
17629
+ style: {
17630
+ height: `${positionedEvent.height}px`,
17631
+ left: `${positionedEvent.left * 100}%`,
17632
+ top: `${positionedEvent.top}px`,
17633
+ width: `${positionedEvent.width * 100}%`,
17634
+ zIndex: positionedEvent.zIndex
17635
+ },
17636
+ children: /* @__PURE__ */ jsx95("div", { className: "size-full", children: /* @__PURE__ */ jsx95(
17637
+ DraggableEvent2,
17638
+ {
17639
+ event: positionedEvent.event,
17640
+ height: positionedEvent.height,
17641
+ onClick: (e) => handleEventClick(positionedEvent.event, e),
17642
+ showTime: true,
17643
+ view: "week"
17644
+ }
17645
+ ) })
17646
+ },
17647
+ positionedEvent.event.id
17648
+ )),
17649
+ currentTimeVisible && isToday6(day) && /* @__PURE__ */ jsx95(
17650
+ "div",
17651
+ {
17652
+ className: "pointer-events-none absolute right-0 left-0 z-20",
17653
+ style: { top: `${currentTimePosition}%` },
17654
+ children: /* @__PURE__ */ jsxs73("div", { className: "relative flex items-center", children: [
17655
+ /* @__PURE__ */ jsx95("div", { className: "-left-1 absolute h-2 w-2 rounded-full bg-primary" }),
17656
+ /* @__PURE__ */ jsx95("div", { className: "h-[2px] w-full bg-primary" })
17657
+ ] })
17658
+ }
17659
+ ),
17660
+ hours.map((hour) => {
17661
+ const hourValue = getHours4(hour);
17662
+ return /* @__PURE__ */ jsx95(
17663
+ "div",
17664
+ {
17665
+ className: "relative min-h-[var(--week-cells-height)] border-border/70 border-b last:border-b-0",
17666
+ children: [0, 1, 2, 3].map((quarter) => {
17667
+ const quarterHourTime = hourValue + quarter * 0.25;
17668
+ return /* @__PURE__ */ jsx95(
17669
+ DroppableCellAgenda,
17670
+ {
17671
+ className: cn(
17672
+ "absolute h-[calc(var(--week-cells-height)/4)] w-full",
17673
+ quarter === 0 && "top-0",
17674
+ quarter === 1 && "top-[calc(var(--week-cells-height)/4)]",
17675
+ quarter === 2 && "top-[calc(var(--week-cells-height)/4*2)]",
17676
+ quarter === 3 && "top-[calc(var(--week-cells-height)/4*)]"
17677
+ ),
17678
+ date: day,
17679
+ id: `week-cell-${day.toISOString()}-${quarterHourTime}`,
17680
+ onClick: () => {
17681
+ const startTime = new Date(day);
17682
+ startTime.setHours(hourValue);
17683
+ startTime.setMinutes(quarter * 15);
17684
+ if (onEventCreate) onEventCreate(startTime);
17685
+ },
17686
+ time: quarterHourTime
17687
+ },
17688
+ `${hour.toString()}-${quarter}`
17689
+ );
17690
+ })
17691
+ },
17692
+ hour.toString()
17693
+ );
17694
+ })
17695
+ ]
17696
+ },
17697
+ day.toString()
17698
+ ))
17699
+ ] })
17700
+ ] });
17701
+ }
17702
+
17703
+ // src/components/ui/data/Banner.tsx
17704
+ import { RocketIcon, XIcon as XIcon13 } from "@phosphor-icons/react";
17705
+ import React45, { useState as useState37 } from "react";
17706
+ import { jsx as jsx96, jsxs as jsxs74 } from "react/jsx-runtime";
17707
+
17708
+ // src/hooks/use-drag.tsx
17709
+ import { useState as useState38, useCallback as useCallback17, useRef as useRef18, useEffect as useEffect29 } from "react";
17710
+ var useDrag = (options = {}) => {
17711
+ const [isDragging, setIsDragging] = useState38(null);
17712
+ const [positions, setPositions] = useState38({});
17713
+ const dragStartPos = useRef18(null);
17714
+ const dragId = useRef18(null);
17715
+ const handleMouseDown = useCallback17((id, e) => {
17716
+ e.preventDefault();
17717
+ const currentPosition = positions[id] || { top: 0, left: 0 };
17718
+ dragStartPos.current = {
17719
+ x: e.clientX,
17720
+ y: e.clientY,
17721
+ elementX: currentPosition.left,
17722
+ elementY: currentPosition.top
17723
+ };
17724
+ dragId.current = id;
17725
+ setIsDragging(id);
17726
+ options.onDragStart?.(id);
17727
+ }, [positions, options]);
17728
+ const handleMouseMove = useCallback17((e) => {
17729
+ if (!isDragging || !dragStartPos.current || !dragId.current) return;
17730
+ const deltaX = e.clientX - dragStartPos.current.x;
17731
+ const deltaY = e.clientY - dragStartPos.current.y;
17732
+ const newPosition = {
17733
+ left: dragStartPos.current.elementX + deltaX,
17734
+ top: dragStartPos.current.elementY + deltaY
17735
+ };
17736
+ newPosition.left = Math.max(0, Math.min(window.innerWidth - 300, newPosition.left));
17737
+ newPosition.top = Math.max(0, Math.min(window.innerHeight - 200, newPosition.top));
17738
+ setPositions((prev) => ({
17739
+ ...prev,
17740
+ [dragId.current]: newPosition
17741
+ }));
17742
+ options.onDrag?.(dragId.current, newPosition);
17743
+ }, [isDragging, options]);
17744
+ const handleMouseUp = useCallback17(() => {
17745
+ if (dragId.current) {
17746
+ options.onDragEnd?.(dragId.current);
17747
+ }
17748
+ setIsDragging(null);
17749
+ dragStartPos.current = null;
17750
+ dragId.current = null;
17751
+ }, [options]);
17752
+ useEffect29(() => {
15459
17753
  if (isDragging) {
15460
17754
  document.addEventListener("mousemove", handleMouseMove);
15461
17755
  document.addEventListener("mouseup", handleMouseUp);
@@ -15467,16 +17761,16 @@ var useDrag = (options = {}) => {
15467
17761
  };
15468
17762
  }
15469
17763
  }, [isDragging, handleMouseMove, handleMouseUp]);
15470
- const setPosition = useCallback16((id, position) => {
17764
+ const setPosition = useCallback17((id, position) => {
15471
17765
  setPositions((prev) => ({
15472
17766
  ...prev,
15473
17767
  [id]: position
15474
17768
  }));
15475
17769
  }, []);
15476
- const getPosition = useCallback16((id) => {
17770
+ const getPosition = useCallback17((id) => {
15477
17771
  return positions[id] || { top: 0, left: 0 };
15478
17772
  }, [positions]);
15479
- const isElementDragging = useCallback16((id) => {
17773
+ const isElementDragging = useCallback17((id) => {
15480
17774
  return isDragging === id;
15481
17775
  }, [isDragging]);
15482
17776
  return {
@@ -15489,7 +17783,9 @@ var useDrag = (options = {}) => {
15489
17783
  };
15490
17784
  export {
15491
17785
  AddButton,
17786
+ Agenda,
15492
17787
  AgendaDaysToShow,
17788
+ AgendaDaysToShowAgenda,
15493
17789
  AgendaView,
15494
17790
  AlertDialogActionBase,
15495
17791
  AlertDialogBase,
@@ -15520,6 +17816,7 @@ export {
15520
17816
  ButtonGroupBase,
15521
17817
  CalendarBase,
15522
17818
  CalendarDndProvider,
17819
+ CalendarDndProviderAgenda,
15523
17820
  CardBase,
15524
17821
  CardContentBase,
15525
17822
  CardDescriptionBase,
@@ -15570,9 +17867,12 @@ export {
15570
17867
  CopyButton,
15571
17868
  DateTimePicker,
15572
17869
  DayView,
17870
+ DayViewAgenda,
15573
17871
  DebouncedInput,
15574
17872
  DefaultEndHour,
17873
+ DefaultEndHourAgenda,
15575
17874
  DefaultStartHour,
17875
+ DefaultStartHourAgenda,
15576
17876
  DestructiveDialog,
15577
17877
  DialogBase,
15578
17878
  DialogCloseBase,
@@ -15613,14 +17913,20 @@ export {
15613
17913
  DropDownMenuSubTriggerBase,
15614
17914
  DropDownMenuTriggerBase,
15615
17915
  DroppableCell,
17916
+ DroppableCellAgenda,
15616
17917
  EditButton,
15617
17918
  EndHour,
17919
+ EndHourAgenda,
15618
17920
  ErrorMessage_default as ErrorMessage,
17921
+ EventAgenda,
15619
17922
  EventCalendar,
15620
17923
  EventDialog,
15621
17924
  EventGap,
17925
+ EventGapAgenda,
15622
17926
  EventHeight,
17927
+ EventHeightAgenda,
15623
17928
  EventItem,
17929
+ EventItemAgenda,
15624
17930
  EventsPopup,
15625
17931
  FavoriteButton,
15626
17932
  FileUploader,
@@ -15652,6 +17958,7 @@ export {
15652
17958
  ModalTriggerBase,
15653
17959
  ModeToggleBase,
15654
17960
  MonthView,
17961
+ MonthViewAgenda,
15655
17962
  MoreButton,
15656
17963
  MultiCombobox,
15657
17964
  MultiSelectBase,
@@ -15737,6 +18044,7 @@ export {
15737
18044
  SkeletonBase,
15738
18045
  SlideBase,
15739
18046
  StartHour,
18047
+ StartHourAgenda,
15740
18048
  StatusIndicator,
15741
18049
  SwitchBase,
15742
18050
  TableBase,
@@ -15762,6 +18070,7 @@ export {
15762
18070
  TooltipSimple_default as TooltipSimple,
15763
18071
  TooltipTriggerBase,
15764
18072
  TooltipWithTotal_default as TooltipWithTotal,
18073
+ UndatedEvents,
15765
18074
  UniversalTooltipRenderer,
15766
18075
  UnlockButton,
15767
18076
  UploadButton,
@@ -15769,8 +18078,11 @@ export {
15769
18078
  ViewButton,
15770
18079
  VisibilityButton,
15771
18080
  WeekCellsHeight,
18081
+ WeekCellsHeightAgenda,
15772
18082
  WeekView,
18083
+ WeekViewAgenda,
15773
18084
  addHoursToDate,
18085
+ addHoursToDateAgenda,
15774
18086
  badgeVariants,
15775
18087
  buttonVariantsBase,
15776
18088
  compactTick,
@@ -15781,13 +18093,19 @@ export {
15781
18093
  formatFieldName,
15782
18094
  generateAdditionalColors,
15783
18095
  getAgendaEventsForDay,
18096
+ getAgendaEventsForDayAgenda,
15784
18097
  getAllEventsForDay,
18098
+ getAllEventsForDayAgenda,
15785
18099
  getArrowByType,
15786
18100
  getBorderRadiusClasses,
18101
+ getBorderRadiusClassesAgenda,
15787
18102
  getDateByType,
15788
18103
  getEventColorClasses,
18104
+ getEventColorClassesAgenda,
15789
18105
  getEventsForDay,
18106
+ getEventsForDayAgenda,
15790
18107
  getSpanningEventsForDay,
18108
+ getSpanningEventsForDayAgenda,
15791
18109
  getValid12Hour,
15792
18110
  getValidArrow12Hour,
15793
18111
  getValidArrowHour,
@@ -15797,10 +18115,12 @@ export {
15797
18115
  getValidMinuteOrSecond,
15798
18116
  getValidNumber,
15799
18117
  isMultiDayEvent,
18118
+ isMultiDayEventAgenda,
15800
18119
  isValid12Hour,
15801
18120
  isValidHour,
15802
18121
  isValidMinuteOrSecond,
15803
18122
  niceCeil,
18123
+ normalizeAttendDate,
15804
18124
  renderInsideBarLabel,
15805
18125
  pillLabelRenderer_default as renderPillLabel,
15806
18126
  resolveChartMargins,
@@ -15811,12 +18131,16 @@ export {
15811
18131
  setMinutes,
15812
18132
  setSeconds,
15813
18133
  sortEvents,
18134
+ sortEventsAgenda,
15814
18135
  toast2 as toast,
15815
18136
  useCalendarDnd,
18137
+ useCalendarDndAgenda,
15816
18138
  useChartHighlights,
15817
18139
  useCurrentTimeIndicator,
18140
+ useCurrentTimeIndicatorAgenda,
15818
18141
  useDrag,
15819
18142
  useEventVisibility,
18143
+ useEventVisibilityAgenda,
15820
18144
  useIsMobile,
15821
18145
  useTheme
15822
18146
  };