@mantine/schedule 9.6.2 → 9.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/cjs/components/DayView/DayView.cjs +45 -30
  2. package/cjs/components/DayView/DayView.cjs.map +1 -1
  3. package/cjs/components/DayView/DayView.module.cjs.map +1 -1
  4. package/cjs/components/MobileMonthView/get-mobile-month-view-events.cjs +10 -2
  5. package/cjs/components/MobileMonthView/get-mobile-month-view-events.cjs.map +1 -1
  6. package/cjs/components/MonthView/MonthView.cjs +11 -4
  7. package/cjs/components/MonthView/MonthView.cjs.map +1 -1
  8. package/cjs/components/ResourcesDayView/ResourcesDayView.cjs +74 -59
  9. package/cjs/components/ResourcesDayView/ResourcesDayView.cjs.map +1 -1
  10. package/cjs/components/ResourcesDayView/ResourcesDayView.module.cjs.map +1 -1
  11. package/cjs/components/ResourcesMonthView/ResourcesMonthView.cjs +18 -6
  12. package/cjs/components/ResourcesMonthView/ResourcesMonthView.cjs.map +1 -1
  13. package/cjs/components/ResourcesSchedule/ResourcesSchedule.cjs +6 -1
  14. package/cjs/components/ResourcesSchedule/ResourcesSchedule.cjs.map +1 -1
  15. package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs +84 -57
  16. package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs.map +1 -1
  17. package/cjs/components/ResourcesWeekView/ResourcesWeekView.module.cjs.map +1 -1
  18. package/cjs/components/Schedule/Schedule.cjs +14 -1
  19. package/cjs/components/Schedule/Schedule.cjs.map +1 -1
  20. package/cjs/components/ScheduleEvent/ScheduleEvent.module.cjs.map +1 -1
  21. package/cjs/components/WeekView/WeekView.cjs +67 -45
  22. package/cjs/components/WeekView/WeekView.cjs.map +1 -1
  23. package/cjs/components/WeekView/WeekView.module.cjs.map +1 -1
  24. package/cjs/hooks/use-day-grid-event-resize.cjs +38 -8
  25. package/cjs/hooks/use-day-grid-event-resize.cjs.map +1 -1
  26. package/cjs/hooks/use-drag-drop-handlers.cjs +126 -10
  27. package/cjs/hooks/use-drag-drop-handlers.cjs.map +1 -1
  28. package/cjs/hooks/use-event-resize.cjs +36 -12
  29. package/cjs/hooks/use-event-resize.cjs.map +1 -1
  30. package/cjs/hooks/use-horizontal-event-resize.cjs +37 -12
  31. package/cjs/hooks/use-horizontal-event-resize.cjs.map +1 -1
  32. package/cjs/hooks/validate-event-resize.cjs +37 -0
  33. package/cjs/hooks/validate-event-resize.cjs.map +1 -0
  34. package/cjs/index.cjs +2 -0
  35. package/cjs/utils/is-event-placement-allowed/is-event-placement-allowed.cjs +52 -0
  36. package/cjs/utils/is-event-placement-allowed/is-event-placement-allowed.cjs.map +1 -0
  37. package/esm/components/DayView/DayView.mjs +45 -30
  38. package/esm/components/DayView/DayView.mjs.map +1 -1
  39. package/esm/components/DayView/DayView.module.mjs.map +1 -1
  40. package/esm/components/MobileMonthView/get-mobile-month-view-events.mjs +10 -2
  41. package/esm/components/MobileMonthView/get-mobile-month-view-events.mjs.map +1 -1
  42. package/esm/components/MonthView/MonthView.mjs +11 -4
  43. package/esm/components/MonthView/MonthView.mjs.map +1 -1
  44. package/esm/components/ResourcesDayView/ResourcesDayView.mjs +74 -59
  45. package/esm/components/ResourcesDayView/ResourcesDayView.mjs.map +1 -1
  46. package/esm/components/ResourcesDayView/ResourcesDayView.module.mjs.map +1 -1
  47. package/esm/components/ResourcesMonthView/ResourcesMonthView.mjs +18 -6
  48. package/esm/components/ResourcesMonthView/ResourcesMonthView.mjs.map +1 -1
  49. package/esm/components/ResourcesSchedule/ResourcesSchedule.mjs +6 -1
  50. package/esm/components/ResourcesSchedule/ResourcesSchedule.mjs.map +1 -1
  51. package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs +84 -57
  52. package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs.map +1 -1
  53. package/esm/components/ResourcesWeekView/ResourcesWeekView.module.mjs.map +1 -1
  54. package/esm/components/Schedule/Schedule.mjs +14 -1
  55. package/esm/components/Schedule/Schedule.mjs.map +1 -1
  56. package/esm/components/ScheduleEvent/ScheduleEvent.module.mjs.map +1 -1
  57. package/esm/components/WeekView/WeekView.mjs +67 -45
  58. package/esm/components/WeekView/WeekView.mjs.map +1 -1
  59. package/esm/components/WeekView/WeekView.module.mjs.map +1 -1
  60. package/esm/hooks/use-day-grid-event-resize.mjs +38 -8
  61. package/esm/hooks/use-day-grid-event-resize.mjs.map +1 -1
  62. package/esm/hooks/use-drag-drop-handlers.mjs +126 -10
  63. package/esm/hooks/use-drag-drop-handlers.mjs.map +1 -1
  64. package/esm/hooks/use-event-resize.mjs +36 -12
  65. package/esm/hooks/use-event-resize.mjs.map +1 -1
  66. package/esm/hooks/use-horizontal-event-resize.mjs +37 -12
  67. package/esm/hooks/use-horizontal-event-resize.mjs.map +1 -1
  68. package/esm/hooks/validate-event-resize.mjs +37 -0
  69. package/esm/hooks/validate-event-resize.mjs.map +1 -0
  70. package/esm/index.mjs +2 -1
  71. package/esm/utils/is-event-placement-allowed/is-event-placement-allowed.mjs +50 -0
  72. package/esm/utils/is-event-placement-allowed/is-event-placement-allowed.mjs.map +1 -0
  73. package/lib/components/DayView/DayView.d.ts +11 -1
  74. package/lib/components/MonthView/MonthView.d.ts +9 -1
  75. package/lib/components/ResourcesDayView/ResourcesDayView.d.ts +11 -1
  76. package/lib/components/ResourcesMonthView/ResourcesMonthView.d.ts +11 -1
  77. package/lib/components/ResourcesSchedule/ResourcesSchedule.d.ts +12 -2
  78. package/lib/components/ResourcesWeekView/ResourcesWeekView.d.ts +11 -1
  79. package/lib/components/Schedule/Schedule.d.ts +12 -2
  80. package/lib/components/WeekView/WeekView.d.ts +11 -1
  81. package/lib/hooks/use-day-grid-event-resize.d.ts +4 -2
  82. package/lib/hooks/use-drag-drop-handlers.d.ts +17 -1
  83. package/lib/hooks/use-event-resize.d.ts +4 -2
  84. package/lib/hooks/use-horizontal-event-resize.d.ts +4 -2
  85. package/lib/hooks/validate-event-resize.d.ts +33 -0
  86. package/lib/types.d.ts +65 -0
  87. package/lib/utils/index.d.ts +2 -0
  88. package/lib/utils/is-event-placement-allowed/is-event-placement-allowed.d.ts +22 -0
  89. package/package.json +6 -6
  90. package/styles.css +29 -0
  91. package/styles.layer.css +29 -0
@@ -1,6 +1,7 @@
1
1
  import { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types';
2
+ import { EventResizeValidationOptions } from './validate-event-resize';
2
3
  type ResizeEdge = 'top' | 'bottom';
3
- export interface UseEventResizeInput {
4
+ export interface UseEventResizeInput extends EventResizeValidationOptions {
4
5
  enabled?: boolean;
5
6
  mode?: ScheduleMode;
6
7
  startTime: string;
@@ -16,7 +17,7 @@ export interface UseEventResizeInput {
16
17
  canResizeEvent?: (event: ScheduleEventData) => boolean;
17
18
  withBackgroundEvents?: boolean;
18
19
  }
19
- export declare function useEventResize({ enabled, mode, startTime, endTime, intervalMinutes, resizeIntervalMinutes, onEventResize, canResizeEvent, withBackgroundEvents, }: UseEventResizeInput): {
20
+ export declare function useEventResize({ enabled, mode, startTime, endTime, intervalMinutes, resizeIntervalMinutes, onEventResize, canResizeEvent, events, preventEventOverlap, canResizeEventTo, onEventPlacementRejected, withBackgroundEvents, }: UseEventResizeInput): {
20
21
  handleResizeStart: ({ event, edge, container, originalTop, originalHeight, eventDate, pointerEvent, }: {
21
22
  event: ScheduleEventData;
22
23
  edge: ResizeEdge;
@@ -34,5 +35,6 @@ export declare function useEventResize({ enabled, mode, startTime, endTime, inte
34
35
  } | null;
35
36
  isResizableEvent: (event: ScheduleEventData) => boolean;
36
37
  wasResizing: () => boolean;
38
+ resizeValid: boolean;
37
39
  };
38
40
  export {};
@@ -1,6 +1,7 @@
1
1
  import { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types';
2
+ import { EventResizeValidationOptions } from './validate-event-resize';
2
3
  type ResizeEdge = 'start' | 'end';
3
- export interface UseHorizontalEventResizeInput {
4
+ export interface UseHorizontalEventResizeInput extends EventResizeValidationOptions {
4
5
  enabled?: boolean;
5
6
  mode?: ScheduleMode;
6
7
  startTime: string;
@@ -16,7 +17,7 @@ export interface UseHorizontalEventResizeInput {
16
17
  canResizeEvent?: (event: ScheduleEventData) => boolean;
17
18
  withBackgroundEvents?: boolean;
18
19
  }
19
- export declare function useHorizontalEventResize({ enabled, mode, startTime, endTime, intervalMinutes, resizeIntervalMinutes, onEventResize, canResizeEvent, withBackgroundEvents, }: UseHorizontalEventResizeInput): {
20
+ export declare function useHorizontalEventResize({ enabled, mode, startTime, endTime, intervalMinutes, resizeIntervalMinutes, onEventResize, canResizeEvent, events, preventEventOverlap, canResizeEventTo, onEventPlacementRejected, withBackgroundEvents, }: UseHorizontalEventResizeInput): {
20
21
  handleResizeStart: ({ event, edge, container, originalLeft, originalWidth, eventDate, dayIndex, dayCount, pointerEvent, }: {
21
22
  event: ScheduleEventData;
22
23
  edge: ResizeEdge;
@@ -37,5 +38,6 @@ export declare function useHorizontalEventResize({ enabled, mode, startTime, end
37
38
  } | null;
38
39
  isResizableEvent: (event: ScheduleEventData) => boolean;
39
40
  wasResizing: () => boolean;
41
+ resizeValid: boolean;
40
42
  };
41
43
  export {};
@@ -0,0 +1,33 @@
1
+ import { DateTimeStringValue, PreventEventOverlap, ScheduleCanResizeEventToData, ScheduleEventData } from '../types';
2
+ export interface EventResizeValidationOptions {
3
+ /** Events the candidate range is checked against when `preventEventOverlap` is set */
4
+ events?: ScheduleEventData[];
5
+ /** If set, resizes that would make the event overlap another event are rejected */
6
+ preventEventOverlap?: PreventEventOverlap;
7
+ /** Called on every pointer move to compute live feedback and again before the resize is committed, return `false` to reject the new size */
8
+ canResizeEventTo?: (data: ScheduleCanResizeEventToData) => boolean;
9
+ /** Called when a resize is rejected */
10
+ onEventPlacementRejected?: (data: {
11
+ action: 'resize';
12
+ event: ScheduleEventData;
13
+ start: DateTimeStringValue;
14
+ end: DateTimeStringValue;
15
+ edge: 'start' | 'end';
16
+ resourceId?: string | number;
17
+ conflicts: ScheduleEventData[];
18
+ reason: 'overlap' | 'rejected';
19
+ }) => void;
20
+ }
21
+ export interface ValidateEventResizeInput extends EventResizeValidationOptions {
22
+ event: ScheduleEventData;
23
+ start: DateTimeStringValue;
24
+ end: DateTimeStringValue;
25
+ edge: 'start' | 'end';
26
+ resourceId?: string | number;
27
+ }
28
+ export interface ValidateEventResizeResult {
29
+ valid: boolean;
30
+ conflicts: ScheduleEventData[];
31
+ reason: 'overlap' | 'rejected' | null;
32
+ }
33
+ export declare function validateEventResize({ event, start, end, edge, events, preventEventOverlap, canResizeEventTo, resourceId, }: ValidateEventResizeInput): ValidateEventResizeResult;
package/lib/types.d.ts CHANGED
@@ -160,4 +160,69 @@ export interface DropTarget {
160
160
  /** Target slot index (for DayView/WeekView) */
161
161
  slotIndex?: number;
162
162
  }
163
+ /** Controls whether a drop or resize that would overlap another event is rejected */
164
+ export type PreventEventOverlap = boolean | ((stillEvent: ScheduleEventData, movingEvent: ScheduleEventData) => boolean);
165
+ /** Data passed to `canDropEvent` while an event is dragged over a target and again before the drop is committed */
166
+ export interface ScheduleCanDropEventData {
167
+ /** Event that is being dragged */
168
+ event: ScheduleEventData;
169
+ /** Candidate start of the event */
170
+ start: DateTimeStringValue;
171
+ /** Candidate end of the event */
172
+ end: DateTimeStringValue;
173
+ /** Target resource, only in `Resources*` views */
174
+ resourceId?: string | number;
175
+ }
176
+ /** Data passed to `canDropExternalEvent` while an external item is dragged over a target and again before the drop is committed */
177
+ export interface ScheduleCanDropExternalEventData {
178
+ /** Data transfer of the drag event */
179
+ dataTransfer: DataTransfer;
180
+ /** Datetime the external item is dropped at */
181
+ start: DateTimeStringValue;
182
+ /** Target resource, only in `Resources*` views */
183
+ resourceId?: string | number;
184
+ }
185
+ /** Data passed to `canResizeEventTo` on every pointer move while an event is resized and again before the resize is committed */
186
+ export interface ScheduleCanResizeEventToData {
187
+ /** Event that is being resized */
188
+ event: ScheduleEventData;
189
+ /** Candidate start of the event */
190
+ start: DateTimeStringValue;
191
+ /** Candidate end of the event */
192
+ end: DateTimeStringValue;
193
+ /** Edge of the event that is being dragged */
194
+ edge: 'start' | 'end';
195
+ }
196
+ interface ScheduleEventPlacementRejectedBase {
197
+ /** Candidate start of the event, for `external-drop` the datetime the item was dropped at */
198
+ start: DateTimeStringValue;
199
+ /** Candidate end of the event, not present on `external-drop` */
200
+ end: DateTimeStringValue;
201
+ /** Events the placement collided with, empty when the rejection came from a callback */
202
+ conflicts: ScheduleEventData[];
203
+ /** `'overlap'` when `preventEventOverlap` found a conflict, `'rejected'` when a callback returned `false` */
204
+ reason: 'overlap' | 'rejected';
205
+ /** Only in `Resources*` views: the target resource for `drop` and `external-drop`, the resized event resource for `resize` */
206
+ resourceId?: string | number;
207
+ }
208
+ /** Data passed to `onEventPlacementRejected` when a drop, resize or external drop is rejected. External drops have no `end`: the schedule does not know the duration of an external item. */
209
+ export type ScheduleEventPlacementRejectedData = (ScheduleEventPlacementRejectedBase & {
210
+ action: 'drop';
211
+ /** Event that was being dragged */
212
+ event: ScheduleEventData;
213
+ }) | (ScheduleEventPlacementRejectedBase & {
214
+ action: 'resize';
215
+ /** Event that was being resized */
216
+ event: ScheduleEventData;
217
+ /** Edge of the event that was being dragged */
218
+ edge: 'start' | 'end';
219
+ }) | (Omit<ScheduleEventPlacementRejectedBase, 'end'> & {
220
+ action: 'external-drop';
221
+ /** Data transfer of the drag event */
222
+ dataTransfer: DataTransfer;
223
+ /** Always `'rejected'`, `preventEventOverlap` does not apply to external drops */
224
+ reason: 'rejected';
225
+ /** Always empty, external drops carry no duration and are not checked for overlap */
226
+ conflicts: [];
227
+ });
163
228
  export {};
@@ -50,3 +50,5 @@ export { getDayRelativePercent } from './get-day-relative-percent/get-day-relati
50
50
  export { getOverlapClusters } from './get-overlap-clusters/get-overlap-clusters';
51
51
  export { applyCascadeLayout } from './apply-cascade-layout/apply-cascade-layout';
52
52
  export type { CascadePositionedEvent } from './apply-cascade-layout/apply-cascade-layout';
53
+ export { isEventPlacementAllowed } from './is-event-placement-allowed/is-event-placement-allowed';
54
+ export type { IsEventPlacementAllowedInput, IsEventPlacementAllowedResult, } from './is-event-placement-allowed/is-event-placement-allowed';
@@ -0,0 +1,22 @@
1
+ import { DateTimeStringValue, PreventEventOverlap, ScheduleEventData } from '../../types';
2
+ export interface IsEventPlacementAllowedInput {
3
+ /** Event that is being moved or resized */
4
+ event: ScheduleEventData;
5
+ /** Candidate start of the event */
6
+ start: DateTimeStringValue;
7
+ /** Candidate end of the event */
8
+ end: DateTimeStringValue;
9
+ /** Events the candidate range is checked against */
10
+ events: ScheduleEventData[];
11
+ /** If set, placements that overlap another event are rejected */
12
+ preventEventOverlap?: PreventEventOverlap;
13
+ /** Target resource, limits the check to events of that resource */
14
+ resourceId?: string | number;
15
+ }
16
+ export interface IsEventPlacementAllowedResult {
17
+ /** True if the candidate range does not conflict with any event */
18
+ allowed: boolean;
19
+ /** Events the candidate range collided with */
20
+ conflicts: ScheduleEventData[];
21
+ }
22
+ export declare function isEventPlacementAllowed({ event, start, end, events, preventEventOverlap, resourceId, }: IsEventPlacementAllowedInput): IsEventPlacementAllowedResult;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mantine/schedule",
3
- "version": "9.6.2",
3
+ "version": "9.7.0",
4
4
  "description": "Schedule Mantine component",
5
5
  "homepage": "https://mantine.dev/",
6
6
  "license": "MIT",
@@ -35,9 +35,9 @@
35
35
  "directory": "packages/@mantine/schedule"
36
36
  },
37
37
  "peerDependencies": {
38
- "@mantine/core": "9.6.2",
39
- "@mantine/dates": "9.6.2",
40
- "@mantine/hooks": "9.6.2",
38
+ "@mantine/core": "9.7.0",
39
+ "@mantine/dates": "9.7.0",
40
+ "@mantine/hooks": "9.7.0",
41
41
  "react": "^19.2.0",
42
42
  "react-dom": "^19.2.0"
43
43
  },
@@ -50,7 +50,7 @@
50
50
  "@mantine/dates": "workspace:*",
51
51
  "@mantine/hooks": "workspace:*",
52
52
  "dayjs": "^1.11.23",
53
- "react": "19.2.8",
54
- "react-dom": "19.2.8"
53
+ "react": "19.3.0",
54
+ "react-dom": "19.3.0"
55
55
  }
56
56
  }
package/styles.css CHANGED
@@ -194,6 +194,11 @@
194
194
  cursor: grabbing;
195
195
  }
196
196
 
197
+ .m_1ac94670:where([data-invalid]) .m_71699dc6 {
198
+ border: 1px solid var(--mantine-color-error);
199
+ opacity: 0.6;
200
+ }
201
+
197
202
  .m_1ac94670:where([data-dragging]) {
198
203
  opacity: 0.2;
199
204
  }
@@ -1084,6 +1089,12 @@
1084
1089
  opacity: 0.6;
1085
1090
  }
1086
1091
 
1092
+ .m_2d4819df:where([data-invalid]) {
1093
+ border-color: var(--mantine-color-error);
1094
+ background-color: transparent;
1095
+ opacity: 0.4;
1096
+ }
1097
+
1087
1098
  .m_70d87f99 {
1088
1099
  --mobile-month-view-radius: var(--schedule-radius, var(--mantine-radius-default));
1089
1100
  --week-numbers-offset: 0rem;
@@ -2216,6 +2227,12 @@
2216
2227
  opacity: 0.6;
2217
2228
  }
2218
2229
 
2230
+ .m_e0da287:where([data-invalid]) {
2231
+ border-color: var(--mantine-color-error);
2232
+ background-color: transparent;
2233
+ opacity: 0.4;
2234
+ }
2235
+
2219
2236
  .m_7301354d {
2220
2237
  --year-view-radius: var(--schedule-radius, var(--mantine-radius-default));
2221
2238
  --year-view-font-size: var(--mantine-font-size-sm);
@@ -3093,6 +3110,12 @@
3093
3110
  opacity: 0.6;
3094
3111
  }
3095
3112
 
3113
+ .m_969d1c27:where([data-invalid]) {
3114
+ border-color: var(--mantine-color-error);
3115
+ background-color: transparent;
3116
+ opacity: 0.4;
3117
+ }
3118
+
3096
3119
  .m_ed4c47cf {
3097
3120
  --resources-week-view-radius: var(--schedule-radius, var(--mantine-radius-default));
3098
3121
  --resources-week-view-resource-label-width: calc(7.5rem * var(--mantine-scale));
@@ -3647,6 +3670,12 @@
3647
3670
  opacity: 0.6;
3648
3671
  }
3649
3672
 
3673
+ .m_27f284a5:where([data-invalid]) {
3674
+ border-color: var(--mantine-color-error);
3675
+ background-color: transparent;
3676
+ opacity: 0.4;
3677
+ }
3678
+
3650
3679
  .m_652b3acd {
3651
3680
  --resources-month-view-radius: var(--schedule-radius, var(--mantine-radius-default));
3652
3681
  --resources-month-view-resource-label-width: calc(7.5rem * var(--mantine-scale));
package/styles.layer.css CHANGED
@@ -194,6 +194,11 @@
194
194
  cursor: grabbing;
195
195
  }
196
196
 
197
+ .m_1ac94670:where([data-invalid]) .m_71699dc6 {
198
+ border: 1px solid var(--mantine-color-error);
199
+ opacity: 0.6;
200
+ }
201
+
197
202
  .m_1ac94670:where([data-dragging]) {
198
203
  opacity: 0.2;
199
204
  }
@@ -1084,6 +1089,12 @@
1084
1089
  opacity: 0.6;
1085
1090
  }
1086
1091
 
1092
+ .m_2d4819df:where([data-invalid]) {
1093
+ border-color: var(--mantine-color-error);
1094
+ background-color: transparent;
1095
+ opacity: 0.4;
1096
+ }
1097
+
1087
1098
  .m_70d87f99 {
1088
1099
  --mobile-month-view-radius: var(--schedule-radius, var(--mantine-radius-default));
1089
1100
  --week-numbers-offset: 0rem;
@@ -2216,6 +2227,12 @@
2216
2227
  opacity: 0.6;
2217
2228
  }
2218
2229
 
2230
+ .m_e0da287:where([data-invalid]) {
2231
+ border-color: var(--mantine-color-error);
2232
+ background-color: transparent;
2233
+ opacity: 0.4;
2234
+ }
2235
+
2219
2236
  .m_7301354d {
2220
2237
  --year-view-radius: var(--schedule-radius, var(--mantine-radius-default));
2221
2238
  --year-view-font-size: var(--mantine-font-size-sm);
@@ -3093,6 +3110,12 @@
3093
3110
  opacity: 0.6;
3094
3111
  }
3095
3112
 
3113
+ .m_969d1c27:where([data-invalid]) {
3114
+ border-color: var(--mantine-color-error);
3115
+ background-color: transparent;
3116
+ opacity: 0.4;
3117
+ }
3118
+
3096
3119
  .m_ed4c47cf {
3097
3120
  --resources-week-view-radius: var(--schedule-radius, var(--mantine-radius-default));
3098
3121
  --resources-week-view-resource-label-width: calc(7.5rem * var(--mantine-scale));
@@ -3647,6 +3670,12 @@
3647
3670
  opacity: 0.6;
3648
3671
  }
3649
3672
 
3673
+ .m_27f284a5:where([data-invalid]) {
3674
+ border-color: var(--mantine-color-error);
3675
+ background-color: transparent;
3676
+ opacity: 0.4;
3677
+ }
3678
+
3650
3679
  .m_652b3acd {
3651
3680
  --resources-month-view-radius: var(--schedule-radius, var(--mantine-radius-default));
3652
3681
  --resources-month-view-resource-label-width: calc(7.5rem * var(--mantine-scale));