@stfrigerio/sito-template 0.1.33 → 0.1.35

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.
@@ -71,6 +71,8 @@ export interface CalendarProps {
71
71
  week?: (date: Date) => void;
72
72
  day?: (date: Date) => void;
73
73
  };
74
+ /** Callback when a time slot is clicked in day view */
75
+ onTimeSlotClick?: (date: Date, hour: number, time: string) => void;
74
76
  /** Initial view mode */
75
77
  viewMode?: 'month' | 'week' | 'day';
76
78
  /** Initial date to display */
@@ -117,5 +119,5 @@ export interface CalendarProps {
117
119
  * onEventClick={handleEventClick}
118
120
  * />
119
121
  */
120
- export declare function Calendar({ events, onEventClick, onDateClick, onEventClickByView, onDateClickByView, viewMode, initialDate, config, className, style, loading, emptyState, hideHeader }: CalendarProps): import("react/jsx-runtime").JSX.Element;
122
+ export declare function Calendar({ events, onEventClick, onDateClick, onEventClickByView, onDateClickByView, onTimeSlotClick, viewMode, initialDate, config, className, style, loading, emptyState, hideHeader }: CalendarProps): import("react/jsx-runtime").JSX.Element;
121
123
  //# sourceMappingURL=Calendar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../../src/components/organisms/Calendar/Calendar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../../src/components/organisms/Calendar/Calendar.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MoodChart.d.ts","sourceRoot":"","sources":["../../../../../src/components/organisms/charts/MoodChart/MoodChart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAA;AAInE,UAAU,YAAY;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD,UAAU,cAAc;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB;AAID,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAuL9C,CAAA"}
1
+ {"version":3,"file":"MoodChart.d.ts","sourceRoot":"","sources":["../../../../../src/components/organisms/charts/MoodChart/MoodChart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAA;AAInE,UAAU,YAAY;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD,UAAU,cAAc;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB;AAID,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAoN9C,CAAA"}
package/dist/index.esm.js CHANGED
@@ -2669,7 +2669,7 @@ var styles$8 = {"calendar":"Calendar-module_calendar__3mIJS","loading":"Calendar
2669
2669
  * onEventClick={handleEventClick}
2670
2670
  * />
2671
2671
  */
2672
- function Calendar({ events, onEventClick, onDateClick, onEventClickByView, onDateClickByView, viewMode = 'month', initialDate = new Date(), config = {}, className = '', style = {}, loading = false, emptyState, hideHeader = false }) {
2672
+ function Calendar({ events, onEventClick, onDateClick, onEventClickByView, onDateClickByView, onTimeSlotClick, viewMode = 'month', initialDate = new Date(), config = {}, className = '', style = {}, loading = false, emptyState, hideHeader = false }) {
2673
2673
  const [currentDate, setCurrentDate] = useState(initialDate);
2674
2674
  const [currentViewMode, setCurrentViewMode] = useState(viewMode);
2675
2675
  const dayViewScrollRef = useRef(null);
@@ -2862,6 +2862,16 @@ function Calendar({ events, onEventClick, onDateClick, onEventClickByView, onDat
2862
2862
  onDateClick(date);
2863
2863
  }
2864
2864
  };
2865
+ const handleTimeSlotClick = (hour) => {
2866
+ if (onTimeSlotClick) {
2867
+ // Create a date object with the current date and the clicked hour
2868
+ const slotDate = new Date(currentDate);
2869
+ slotDate.setHours(hour, 0, 0, 0);
2870
+ // Format time as HH:00
2871
+ const timeString = `${hour.toString().padStart(2, '0')}:00`;
2872
+ onTimeSlotClick(slotDate, hour, timeString);
2873
+ }
2874
+ };
2865
2875
  const isToday = (date) => {
2866
2876
  const today = new Date();
2867
2877
  return date.toDateString() === today.toDateString();
@@ -2896,7 +2906,13 @@ function Calendar({ events, onEventClick, onDateClick, onEventClickByView, onDat
2896
2906
  const eventHour = parseInt(event.time.split(':')[0]);
2897
2907
  return eventHour === hour;
2898
2908
  });
2899
- return (jsxs("div", { className: styles$8.hourSlot, children: [jsx("div", { className: styles$8.hourLine }), hourEvents.map((event, eventIndex) => (jsxs(motion.div, { className: `${styles$8.dayEvent} ${event.status === 'completed' ? styles$8.completed : ''}`, style: {
2909
+ return (jsxs("div", { className: styles$8.hourSlot, onClick: (e) => {
2910
+ // Only trigger if clicking on the slot itself, not on an event
2911
+ if (e.target === e.currentTarget ||
2912
+ e.target.classList.contains(styles$8.hourLine)) {
2913
+ handleTimeSlotClick(hour);
2914
+ }
2915
+ }, style: { cursor: 'pointer' }, children: [jsx("div", { className: styles$8.hourLine }), hourEvents.map((event, eventIndex) => (jsxs(motion.div, { className: `${styles$8.dayEvent} ${event.status === 'completed' ? styles$8.completed : ''}`, style: {
2900
2916
  backgroundColor: getEventColor(event),
2901
2917
  color: getEventTextColor(event),
2902
2918
  opacity: event.status === 'completed' ? 0.7 : 1
@@ -3020,8 +3036,10 @@ var styles$7 = {"container":"MoodChart-module_container__MB1Vr","chart":"MoodCha
3020
3036
  const MoodChart = ({ moodData, width = 800, height = 400 }) => {
3021
3037
  const svgRef = useRef(null);
3022
3038
  const containerRef = useRef(null);
3039
+ const tooltipRef = useRef(null);
3023
3040
  const [selectedMood, setSelectedMood] = useState(null);
3024
3041
  const [tooltipPosition, setTooltipPosition] = useState({ x: 0, y: 0 });
3042
+ const [isHoveringTooltip, setIsHoveringTooltip] = useState(false);
3025
3043
  const margin = { top: 20, right: 20, bottom: 50, left: 40 };
3026
3044
  const chartWidth = width - margin.left - margin.right;
3027
3045
  const chartHeight = height - margin.top - margin.bottom;
@@ -3099,11 +3117,26 @@ const MoodChart = ({ moodData, width = 800, height = 400 }) => {
3099
3117
  .style('cursor', 'pointer')
3100
3118
  .on('mouseenter', (event, d) => {
3101
3119
  const rect = svgRef.current?.getBoundingClientRect();
3102
- if (rect) {
3103
- setTooltipPosition({
3104
- x: event.clientX - rect.left + 20,
3105
- y: event.clientY - rect.top - 10
3106
- });
3120
+ const containerRect = containerRef.current?.getBoundingClientRect();
3121
+ if (rect && containerRect) {
3122
+ let x = event.clientX - rect.left + 10;
3123
+ let y = event.clientY - rect.top - 10;
3124
+ // Check if tooltip would overflow on the right
3125
+ const estimatedTooltipWidth = 250; // Approximate tooltip width
3126
+ const rightEdgeBuffer = 20; // Buffer from the right edge
3127
+ if (x + estimatedTooltipWidth > chartWidth + margin.left - rightEdgeBuffer) {
3128
+ // Position tooltip to the left of the cursor, but keep it close
3129
+ x = event.clientX - rect.left - estimatedTooltipWidth - 10;
3130
+ // Ensure it doesn't go off the left edge
3131
+ if (x < 0) {
3132
+ x = 10;
3133
+ }
3134
+ }
3135
+ // Ensure tooltip doesn't go above the container
3136
+ if (y < 0) {
3137
+ y = 10;
3138
+ }
3139
+ setTooltipPosition({ x, y });
3107
3140
  }
3108
3141
  setSelectedMood(d);
3109
3142
  d3.select(event.currentTarget)
@@ -3112,28 +3145,33 @@ const MoodChart = ({ moodData, width = 800, height = 400 }) => {
3112
3145
  .attr('r', 8);
3113
3146
  })
3114
3147
  .on('mouseleave', (event) => {
3115
- // Use a timeout to ensure the event fires
3148
+ // Add delay to allow mouse to move to tooltip
3116
3149
  setTimeout(() => {
3117
- setSelectedMood(null);
3118
- }, 0);
3150
+ if (!isHoveringTooltip) {
3151
+ setSelectedMood(null);
3152
+ }
3153
+ }, 250);
3119
3154
  d3.select(event.currentTarget)
3120
3155
  .transition()
3121
3156
  .duration(200)
3122
3157
  .attr('r', 5);
3123
3158
  });
3124
- }, [processedData, chartWidth, chartHeight, colorScale, margin]);
3159
+ }, [processedData, chartWidth, chartHeight, colorScale, margin, isHoveringTooltip]);
3125
3160
  // Clean up tooltip on unmount
3126
3161
  useEffect(() => {
3127
3162
  return () => {
3128
3163
  setSelectedMood(null);
3129
3164
  };
3130
3165
  }, []);
3131
- return (jsxs("div", { className: styles$7.container, ref: containerRef, onMouseLeave: () => setSelectedMood(null), children: [jsx("svg", { ref: svgRef, width: width, height: height, className: styles$7.chart }), selectedMood && (jsxs("div", { className: styles$7.tooltip, style: {
3166
+ return (jsxs("div", { className: styles$7.container, ref: containerRef, children: [jsx("svg", { ref: svgRef, width: width, height: height, className: styles$7.chart }), selectedMood && (jsxs("div", { ref: tooltipRef, className: styles$7.tooltip, style: {
3132
3167
  position: 'absolute',
3133
- pointerEvents: 'none',
3168
+ pointerEvents: 'auto',
3134
3169
  left: tooltipPosition.x,
3135
3170
  top: tooltipPosition.y,
3136
3171
  zIndex: 1000
3172
+ }, onMouseEnter: () => setIsHoveringTooltip(true), onMouseLeave: () => {
3173
+ setIsHoveringTooltip(false);
3174
+ setSelectedMood(null);
3137
3175
  }, children: [jsxs("div", { className: styles$7.tooltipHeader, children: [jsx("div", { className: styles$7.tooltipDate, children: selectedMood.date.toLocaleDateString() }), jsxs("div", { className: styles$7.tooltipRating, children: [jsx("span", { className: styles$7.ratingValue, children: selectedMood.rating }), jsx("span", { className: styles$7.ratingMax, children: "/10" })] })] }), selectedMood.tags.length > 0 && (jsx("div", { className: styles$7.tooltipTags, children: selectedMood.tags.map((tag, index) => (jsx("span", { className: styles$7.tag, children: tag }, index))) })), selectedMood.comment && (jsx("div", { className: styles$7.tooltipComment, children: selectedMood.comment }))] }))] }));
3138
3176
  };
3139
3177