@medplum/react-scheduling 5.1.37 → 5.1.38

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.
@@ -1,4 +1,6 @@
1
1
  import type { Appointment } from '@medplum/fhirtypes';
2
+ import type { Coding } from '@medplum/fhirtypes';
3
+ import type { Dereference } from '@medplum/core';
2
4
  import type { HealthcareService } from '@medplum/fhirtypes';
3
5
  import type { HealthcareServiceAvailableTime } from '@medplum/fhirtypes';
4
6
  import type { JSX } from 'react';
@@ -10,7 +12,9 @@ import type { Patient } from '@medplum/fhirtypes';
10
12
  import type { Reference } from '@medplum/fhirtypes';
11
13
  import type { Resource } from '@medplum/fhirtypes';
12
14
  import type { Schedule } from '@medplum/fhirtypes';
15
+ import type { SchedulingRequirement } from '@medplum/core';
13
16
  import type { Slot } from '@medplum/fhirtypes';
17
+ import type { ValueSetExpansionContains } from '@medplum/fhirtypes';
14
18
  import type { WithId } from '@medplum/core';
15
19
 
16
20
  /**
@@ -27,15 +31,15 @@ export declare interface ActorCombination {
27
31
  }
28
32
 
29
33
  /**
30
- * What an appointment is being asked for: the schedules chosen, per role.
34
+ * What an appointment is being asked for: the schedules chosen, per actor type.
31
35
  * Everything named attends.
32
36
  */
33
- export declare type ActorSelections = Partial<Record<SchedulingRole, readonly ScheduleCandidate[]>>;
37
+ export declare type ActorSelections = Partial<Record<SchedulingActorType, readonly ScheduleCandidate[]>>;
34
38
 
35
39
  export declare function addDays(date: Date, days: number): Date;
36
40
 
37
41
  /**
38
- * Chooses the actors an appointment is held on, for one role.
42
+ * Chooses the actors an appointment is held on, for one actor type.
39
43
  *
40
44
  * Everything chosen attends: `$find` intersects the schedules behind them,
41
45
  * so naming a second actor narrows the times to the ones both are free for.
@@ -43,13 +47,12 @@ export declare function addDays(date: Date, days: number): Date;
43
47
  * Schedules are searched for as the name is typed (via `AsyncAutocomplete`).
44
48
  *
45
49
  * @param props - The React props.
46
- * @returns The field for one role.
50
+ * @returns The field for one actor type.
47
51
  */
48
52
  export declare function AppointmentActorSelect(props: AppointmentActorSelectProps): JSX.Element;
49
53
 
50
54
  export declare interface AppointmentActorSelectProps {
51
- /** The role being filled. */
52
- readonly role: SchedulingRole;
55
+ readonly actorType: BookableActorType;
53
56
  /** The service being booked. Nothing is offered until it resolves. */
54
57
  readonly service: Reference<HealthcareService> | WithId<HealthcareService> | undefined;
55
58
  /**
@@ -124,6 +127,7 @@ export declare interface AppointmentDayTimesProps {
124
127
  readonly onSelectAppointment: (appointment: Appointment) => void;
125
128
  /** IANA timezone the times are read in. Defaults to the browser's. */
126
129
  readonly timezone?: string;
130
+ readonly viewerTimezone?: string;
127
131
  readonly selected?: Appointment;
128
132
  }
129
133
 
@@ -200,6 +204,10 @@ export declare interface AppointmentProposalFormProps {
200
204
  * rather than leaving it on a time nobody chose.
201
205
  */
202
206
  readonly onChangeTime?: (time: DateTimeRange | undefined) => void;
207
+ /** The ValueSet the procedure code field binds to. Defaults to the full CPT value set. */
208
+ readonly procedureBinding?: string;
209
+ /** The ValueSet the diagnosis code field binds to. Defaults to the full ICD-10-CM value set. */
210
+ readonly diagnosisBinding?: string;
203
211
  /**
204
212
  * Performs the booking with the proposal the form assembled.
205
213
  *
@@ -254,23 +262,41 @@ export declare function AppointmentSlotGroupCard(props: AppointmentSlotGroupCard
254
262
  export declare interface AppointmentSlotGroupCardProps {
255
263
  readonly group: AppointmentSlotGroup;
256
264
  readonly onSelectAppointment: (appointment: Appointment) => void;
257
- /** IANA timezone the times are shown in. Defaults to the browser's. */
265
+ /** Timezone the times are shown in. */
258
266
  readonly timezone?: string;
267
+ /** The viewer's own timezone. */
268
+ readonly viewerTimezone?: string;
259
269
  readonly selected?: Appointment;
260
270
  readonly disabled?: boolean;
261
271
  }
262
272
 
263
273
  /**
264
- * Actor types whose schedules may be offered for booking.
274
+ * Actor types whose schedules may be offered for booking, in the order they are
275
+ * asked about.
265
276
  *
266
- * Does not include `PractitionerRole` to prevent double-booking
267
- * a `Practitioner` who holds multiple roles. See `getSchedulingRole` for how
268
- * `PractitionerRole` is still used to determine eligibility for a schedule.
277
+ * Each type becomes one question, because `$find` intersects the schedules it is
278
+ * given: a time is offered only when the practitioner *and* the location *and*
279
+ * the device are all free for it.
280
+ *
281
+ * Does not include `PractitionerRole` to prevent double-booking a `Practitioner`
282
+ * who holds multiple roles. A practitioner is booked on their `Practitioner`,
283
+ * but their `PractitionerRole`s still decide which schedules they are eligible
284
+ * for and where they practice.
269
285
  */
270
- export declare const BOOKABLE_ACTOR_TYPES: readonly ["Practitioner", "Location", "Device"];
286
+ export declare const BOOKABLE_ACTOR_TYPES: ["Practitioner", "Location", "Device"];
271
287
 
272
288
  export declare type BookableActorType = (typeof BOOKABLE_ACTOR_TYPES)[number];
273
289
 
290
+ /**
291
+ * What the booking form captures for a visit type's requirements: one value per requirement it
292
+ * can be asked for.
293
+ */
294
+ export declare interface BookingRequirementValues {
295
+ readonly procedure: readonly Coding[];
296
+ readonly diagnosis: readonly Coding[];
297
+ readonly medicalNecessity: boolean;
298
+ }
299
+
274
300
  export declare function Calendar(props: CalendarProps): JSX.Element;
275
301
 
276
302
  export declare interface CalendarProps {
@@ -310,6 +336,14 @@ export declare type DateTimeRange = {
310
336
  end: Date;
311
337
  };
312
338
 
339
+ /** The value set the diagnosis code field binds to when a host names none. */
340
+ export declare const DEFAULT_DIAGNOSIS_VALUE_SET = "http://hl7.org/fhir/sid/icd-10-cm/vs";
341
+
342
+ /** The value set the procedure code field binds to when a host names none. */
343
+ export declare const DEFAULT_PROCEDURE_VALUE_SET = "http://www.ama-assn.org/go/cpt/vs";
344
+
345
+ export declare const EMPTY_REQUIREMENT_VALUES: BookingRequirementValues;
346
+
313
347
  /**
314
348
  * Returns the last instant of a day, so that a range covers the whole of it.
315
349
  * @param date - Any instant during the day.
@@ -360,14 +394,6 @@ export declare interface FilterCandidatesOptions {
360
394
  readonly signal?: AbortSignal;
361
395
  }
362
396
 
363
- /**
364
- * Says in words which days a search covers.
365
- * @param range - The days asked for.
366
- * @param formatDay - How to name one day. Defaults to naming it with its weekday.
367
- * @returns The range as a phrase, or undefined when both ends are open.
368
- */
369
- export declare function formatDateRange(range: DateRange, formatDay?: (date: Date) => string): string | undefined;
370
-
371
397
  /**
372
398
  * Formats a calendar day as a heading (e.g. "Monday, July 27").
373
399
  * @param date - Local midnight of the day.
@@ -376,19 +402,25 @@ export declare function formatDateRange(range: DateRange, formatDay?: (date: Dat
376
402
  export declare function formatDayHeading(date: Date): string;
377
403
 
378
404
  /**
379
- * Names a calendar day without its weekday (e.g. "July 27").
380
- * @param date - Local midnight of the day.
381
- * @returns The formatted day.
405
+ * Names a timezone the short way it is written beside a time, e.g. "ET" or "GMT+2".
406
+ * @param timezone - IANA timezone identifier. Defaults to the browser's.
407
+ * @returns The zone's short name.
382
408
  */
383
- export declare function formatDayLabel(date: Date): string;
409
+ export declare function formatTimezoneLabel(timezone?: string): string;
384
410
 
385
411
  /**
386
412
  * Formats an instant's time of day in a given timezone (e.g. "12:30 PM").
387
413
  * @param date - The instant to format.
388
414
  * @param timezone - IANA timezone identifier. Defaults to the browser's.
415
+ * @param options - Whether to name the zone as well.
389
416
  * @returns The formatted time.
390
417
  */
391
- export declare function formatZonedTime(date: Date, timezone?: string): string;
418
+ export declare function formatZonedTime(date: Date, timezone?: string, options?: FormatZonedTimeOptions): string;
419
+
420
+ export declare interface FormatZonedTimeOptions {
421
+ /** Names the zone alongside the time, e.g. "12:30 PM ET". */
422
+ readonly withTimezone?: boolean;
423
+ }
392
424
 
393
425
  /**
394
426
  * Builds the sets of actors an appointment could be held on.
@@ -410,22 +442,31 @@ export declare function getActorCombinations(selections: ActorSelections): Actor
410
442
  export declare function getActorGroupKey(appointment: Appointment): string;
411
443
 
412
444
  /**
413
- * Names the role an actor is filling, from its own reference.
445
+ * Builds a key identifying a set of actors, independent of their order.
446
+ * @param actors - The actors to key.
447
+ * @returns The key.
448
+ */
449
+ export declare function getActorsKey(actors: readonly Reference[]): string;
450
+
451
+ /**
452
+ * Extracts the resource type from a reference to an actor.
414
453
  *
415
- * Needed where an actor is shown away from the field it was chosen in, which is
416
- * the only thing that would otherwise say which role it answers.
454
+ * Only supports references that may be used for Scheduling operations, which are
455
+ * those that have a qualified `reference` attribute. The attribute must be present,
456
+ * and may not be a reference to a "contained" resource (eg. `{ reference: "#cid" }`)
417
457
  *
418
- * @param actor - A reference to a scheduling actor.
419
- * @returns The role's label, or undefined for a reference of another type.
458
+ * @param reference - A Reference to a schedulable resource
459
+ * @returns The type that the reference refers to.
420
460
  */
421
- export declare function getActorRoleLabel(actor: Reference): string | undefined;
461
+ export declare function getActorType(reference: SchedulingActor): SchedulingActorType;
422
462
 
423
463
  /**
424
- * Builds a key identifying a set of actors, independent of their order.
425
- * @param actors - The actors to key.
426
- * @returns The key.
464
+ * Provides the label we use for scheduling resource types in this UI
465
+ *
466
+ * @param resourceType - A scheduling actor type
467
+ * @returns The type's label
427
468
  */
428
- export declare function getActorsKey(actors: readonly Reference[]): string;
469
+ export declare function getActorTypeLabel(resourceType: SchedulingActorType): string;
429
470
 
430
471
  /**
431
472
  * Returns a key uniquely identifying a proposed appointment.
@@ -439,18 +480,24 @@ export declare function getActorsKey(actors: readonly Reference[]): string;
439
480
  export declare function getAppointmentKey(appointment: Appointment): string;
440
481
 
441
482
  /**
442
- * Names a candidate's actor, for use in plain-text option lists.
443
- * @param candidate - The candidate to name.
444
- * @returns The name to show.
483
+ * The IANA timezone the browser is set to.
484
+ * @returns The viewer's own timezone identifier.
445
485
  */
446
- export declare function getCandidateDisplay(candidate: ScheduleCandidate): string;
486
+ export declare function getBrowserTimezone(): string;
447
487
 
448
488
  /**
449
- * Returns the role a candidate fills, from the type of its actor.
489
+ * Returns the actor a candidate's schedule is held on.
450
490
  * @param candidate - The candidate to read.
451
- * @returns The role, or undefined for an actor of a type nothing books against.
491
+ * @returns Its schedule's only actor.
492
+ */
493
+ export declare function getCandidateActor(candidate: ScheduleCandidate): SchedulingActor;
494
+
495
+ /**
496
+ * Names a candidate's actor, for use in plain-text option lists.
497
+ * @param candidate - The candidate to name.
498
+ * @returns The name to show.
452
499
  */
453
- export declare function getCandidateRole(candidate: ScheduleCandidate): SchedulingRole | undefined;
500
+ export declare function getCandidateDisplay(candidate: ScheduleCandidate): string;
454
501
 
455
502
  /**
456
503
  * Counts the days a window covers, a part of a day counting as a whole one.
@@ -510,16 +557,9 @@ export declare function getFindWindowError(range: DateRange): string | undefined
510
557
  export declare function getNativeInputType(type: 'date' | 'time'): string;
511
558
 
512
559
  /**
513
- * Returns the role an actor type is chosen as.
514
- * @param actorType - A `Schedule.actor` resource type.
515
- * @returns The role that actor fills.
516
- */
517
- export declare function getSchedulingRole(actorType: SchedulingActorType): SchedulingRole;
518
-
519
- /**
520
- * Returns everything chosen, across roles.
560
+ * Returns everything chosen, across actor types
521
561
  * @param selections - What has been chosen.
522
- * @returns The chosen candidates, in `SCHEDULING_ROLES` order.
562
+ * @returns The chosen candidates in `BOOKABLE_ACTOR_TYPES` order
523
563
  */
524
564
  export declare function getSelectedCandidates(selections: ActorSelections): ScheduleCandidate[];
525
565
 
@@ -530,6 +570,14 @@ export declare function getSelectedCandidates(selections: ActorSelections): Sche
530
570
  */
531
571
  export declare function getSelectionError(selections: ActorSelections): string | undefined;
532
572
 
573
+ /**
574
+ * Search window for a calendar day in the given timezone, starting from now if that day is already underway.
575
+ * @param day - The day to search, as local midnight. Bound to the site's timezone.
576
+ * @param timezone - IANA timezone identifier. Defaults to the browser's.
577
+ * @returns Range from the start of that day, or from now, through the next day's midnight.
578
+ */
579
+ export declare function getZonedDayRange(day: Date, timezone?: string): Required<DateRange>;
580
+
533
581
  /**
534
582
  * Groups proposed appointments into days, and each day into the sets of actors
535
583
  * offering those times.
@@ -543,24 +591,38 @@ export declare function getSelectionError(selections: ActorSelections): string |
543
591
  */
544
592
  export declare function groupAppointmentsByDay(appointments: readonly Appointment[], timezone?: string, searched?: DateRange): AppointmentDay[];
545
593
 
546
- export declare function isBookableActorType(value: string | undefined): value is BookableActorType;
594
+ /**
595
+ * Whether every requirement a visit type names has been answered.
596
+ * @param values - What the fields are holding.
597
+ * @param requirements - What the visit type requires, from its eligibility codes.
598
+ * @returns True once each required field holds a value. A value nothing asked for is not weighed.
599
+ */
600
+ export declare function hasRequiredValues(values: BookingRequirementValues, requirements: ReadonlySet<SchedulingRequirement>): boolean;
547
601
 
548
602
  /**
549
- * Reports whether a role has to be filled.
550
- * @param role - The role being filled.
603
+ * Reports whether an actorType has to be chosen to be a valid booking
604
+ * @param actorType - The actor type being chosen.
551
605
  * @returns Whether a search can run without it.
552
606
  */
553
- export declare function isRoleRequired(role: SchedulingRole): boolean;
607
+ export declare function isActorTypeRequired(actorType: SchedulingActorType): boolean;
608
+
609
+ export declare function isBookableActorType(value: string | undefined): value is BookableActorType;
554
610
 
555
611
  /**
556
- * Returns whether two instants fall on the same local day.
557
- * @param left - The first instant.
558
- * @param right - The second, or undefined when there is nothing to compare.
559
- * @returns True when both fall on the same local day.
612
+ * Whether one requirement has been answered.
613
+ * @param requirement - The requirement to weigh.
614
+ * @param values - What the fields are holding.
615
+ * @returns True when the field answering that requirement holds a value.
560
616
  */
561
- export declare function isSameDay(left: Date, right: Date | undefined): boolean;
617
+ export declare function isRequirementAnswered(requirement: SchedulingRequirement, values: BookingRequirementValues): boolean;
562
618
 
563
- export declare function isSchedulingActorType(value: string | undefined): value is SchedulingActorType;
619
+ /**
620
+ * Whether a timezone is the viewer's own.
621
+ * @param timezone - IANA timezone the times are in, or undefined when it could not be resolved.
622
+ * @param viewer - The viewer's IANA timezone. Defaults to the browser's
623
+ * @returns True when the zone is the viewer's, or when there is no zone to compare.
624
+ */
625
+ export declare function isViewerTimezone(timezone: string | undefined, viewer?: string): boolean;
564
626
 
565
627
  /**
566
628
  * The longest window `Appointment/$find` accepts. Requests wider than this are
@@ -618,7 +680,13 @@ export declare function parseDayKey(key: string): Date;
618
680
  */
619
681
  export declare function parseZonedTime(day: Date, time: string, timezone?: string): Date | undefined;
620
682
 
621
- export declare const ROLE_LABELS: Record<SchedulingRole, string>;
683
+ /**
684
+ * Actor types that must be chosen before a search can run.
685
+ *
686
+ * Locations and devices are left optional: a service may have location schedules
687
+ * configured without every booking needing to hold one.
688
+ */
689
+ export declare const REQUIRED_ACTOR_TYPES: ReadonlySet<SchedulingActorType>;
622
690
 
623
691
  /**
624
692
  * Edits weekly availability for one visit service type, either as a Schedule's
@@ -660,27 +728,13 @@ export declare interface ScheduleOverrideEditorProps extends CommonProps {
660
728
  readonly onSave: (updatedSchedule: Schedule) => void | Promise<void>;
661
729
  }
662
730
 
663
- /** Resource types that may appear in `Schedule.actor`. */
664
- export declare const SCHEDULING_ACTOR_TYPES: readonly ["Practitioner", "PractitionerRole", "Location", "Device"];
665
-
666
- /**
667
- * The parts of an appointment a user chooses, in the order they are asked about.
668
- *
669
- * Each role becomes one question, because `$find` intersects the schedules it is
670
- * given: a time is offered only when the provider *and* the room *and* the
671
- * device are all free for it.
672
- */
673
- export declare const SCHEDULING_ROLES: readonly ["provider", "room", "device"];
674
-
675
731
  /**
676
732
  * A reference to something a Schedule belongs to. The same union an Appointment
677
733
  * accepts as a participant, so an actor can be carried straight across.
678
734
  */
679
735
  export declare type SchedulingActor = Schedule['actor'][number];
680
736
 
681
- export declare type SchedulingActorType = (typeof SCHEDULING_ACTOR_TYPES)[number];
682
-
683
- export declare type SchedulingRole = (typeof SCHEDULING_ROLES)[number];
737
+ export declare type SchedulingActorType = Dereference<SchedulingActor>['resourceType'];
684
738
 
685
739
  /**
686
740
  * A data-coordination component pairing {@link CalendarsPanel} with {@link MultiCalendar}.
@@ -692,6 +746,9 @@ export declare type SchedulingRole = (typeof SCHEDULING_ROLES)[number];
692
746
  * The form writes the booking and announces what it wrote, which is what puts the
693
747
  * new appointment on the calendar beside it — a host supplies no data for any of it.
694
748
  * What was written is reported through `onBooked`, for a host that wants to say so.
749
+ * - Shows what is booked: clicking an appointment opens {@link AppointmentDetails} in a
750
+ * drawer over the calendar, describing the visit and offering to cancel it. Cancelling
751
+ * is what takes the time back off the calendar, again without a host supplying anything.
695
752
  * - Highlights the time last chosen, wherever it was chosen: the click that opened the
696
753
  * pane, then whatever the form's time search settles on, and nothing while the form
697
754
  * holds no time. The calendar is never moved to reach it — a highlight off the week
@@ -704,7 +761,17 @@ export declare function SchedulingWorkspace(props: SchedulingWorkspaceProps): JS
704
761
 
705
762
  export declare interface SchedulingWorkspaceProps {
706
763
  readonly className?: string;
764
+ /** The ValueSet the procedure code field binds to. Defaults to full CPT valueset. */
765
+ readonly procedureBinding?: string;
766
+ /** The ValueSet the diagnosis code field binds to. Defaults to full ICD-10-CM valueset. */
767
+ readonly diagnosisBinding?: string;
707
768
  readonly onBooked?: (booking: AppointmentBooking) => void | Promise<void>;
769
+ readonly onCancelled?: (appointment: WithId<Appointment>) => void | Promise<void>;
770
+ /**
771
+ * Overrides the value set the appointment detail view offers cancellation reasons
772
+ * from, for a host coding them against its own terminology.
773
+ */
774
+ readonly appointmentCancellationReasonValueSet?: string;
708
775
  }
709
776
 
710
777
  /**
@@ -720,8 +787,8 @@ export declare function searchScheduleCandidates(medplum: MedplumClient, service
720
787
 
721
788
  export declare interface SearchScheduleCandidatesOptions {
722
789
  /** Which of the service's actors to offer. */
723
- readonly role: SchedulingRole;
724
- /** What the user typed. Empty offers whatever the role has, unfiltered by name. */
790
+ readonly actorType: SchedulingActorType;
791
+ /** What the user typed. Empty offers whatever the actor type has, unfiltered by name. */
725
792
  readonly query: string;
726
793
  /**
727
794
  * The site being booked at. Actors sited elsewhere are left out: a room or a
@@ -778,6 +845,13 @@ export declare function startOfDay(date: Date): Date;
778
845
 
779
846
  export declare type TimeOfDay = 'any' | 'morning' | 'afternoon';
780
847
 
848
+ /**
849
+ * Reads the codes a field is holding into a list of codings.
850
+ * @param elements - What the field is holding.
851
+ * @returns The codings to record, dropping anything that never became a code.
852
+ */
853
+ export declare function toCodings(elements: readonly ValueSetExpansionContains[]): Coding[];
854
+
781
855
  /**
782
856
  * Searches for the times an appointment could be held at.
783
857
  *
@@ -1,2 +1,2 @@
1
- .AppointmentFinder_timeGrid{row-gap:var(--mantine-spacing-xs)}.AppointmentFinder_layout{display:flex;flex-wrap:wrap;gap:var(--mantine-spacing-lg);align-items:flex-start;flex:1 1 auto;min-height:0}.AppointmentFinder_form{flex:1 1 300px;min-width:0;max-width:420px;max-height:100%;overflow-y:auto}.AppointmentFinder_results{flex:1 1 380px;min-width:0;max-height:100%;overflow-y:auto}.AppointmentFinder_form>*,.AppointmentFinder_results>*{flex-shrink:0}:root{--fc-sticky-header-footer-z: 3;--fc-popover-z: 4}.fc-nH{z-index:var(--fc-popover-z)!important}.fc-7s{isolation:isolate}.fc-wa,.fc-wa *,.fc-wa *:before,.fc-wa *:after{box-sizing:border-box!important}.fc-4m,.fc-4m *{cursor:not-allowed!important}.fc-eM{-ms-overflow-style:none!important;scrollbar-width:none!important}.fc-eM::-webkit-scrollbar{display:none!important}.fc-Qo{flex-shrink:0!important}.fc-fi .fc-fl{display:flex!important;flex-direction:row!important;flex-wrap:wrap!important}.fc-Jf .fc-fl>*{float:left!important}[dir=rtl] .fc-Jf .fc-fl>*,.fc-Jf[dir=rtl] .fc-fl>*{float:right!important}.fc-Jf .fc-fl:after{content:""!important;display:block!important;clear:both!important}.fc-DP{cursor:pointer!important}.fc-An{cursor:n-resize!important}.fc-lZ{cursor:s-resize!important}.fc-9V{cursor:w-resize!important}[dir=rtl] .fc-9V,.fc-70{cursor:e-resize!important}[dir=rtl] .fc-70{cursor:w-resize!important}.fc-gQ{cursor:col-resize!important}.fc-mN,.fc-2d,.fc-B0{position:absolute!important;box-sizing:content-box!important;width:100%!important;height:100%!important}.fc-mN{padding:10px!important;margin:-10px!important}.fc-2d{padding-left:10px!important;padding-right:10px!important;margin-left:-10px!important;margin-right:-10px!important}.fc-B0{padding-top:10px!important;padding-bottom:10px!important;margin-top:-10px!important;margin-bottom:-10px!important}.fc-Z1{position:absolute;inset:0 -5px}.fc-1Y{-webkit-user-select:none;-moz-user-select:none;user-select:none}.fc-a9{visibility:hidden}.fc-Tu{border:0!important}.fc-hU{border-left:0!important;border-right:0!important;border-bottom:0!important}.fc-3e{border-top:0!important;border-left:0!important;border-right:0!important}.fc-PB,.fc-II{border-top:0!important;border-bottom:0!important}.fc-PB{border-inline-end:0!important}.fc-II{border-inline-start:0!important}.fc-MQ{border-left:0!important;border-right:0!important}.fc-Vo{border-top:0!important;border-bottom:0!important}.fc-2l{border-inline-start:1px solid transparent!important}.fc-Ao{display:flex!important;flex-direction:row!important}.fc-HH{display:flex!important;flex-direction:column!important}.fc-GV{flex-grow:1!important}.fc-g2{flex-grow:1!important;flex-basis:0!important;min-width:0!important;min-height:0!important}.fc-Ot{min-height:0!important}.fc-hp{flex-grow:1!important;flex-basis:0!important;min-width:0!important}.fc-fi .fc-uD,.fc-fi .fc-jM{display:flex!important;flex-direction:column!important}.fc-OJ{padding:0!important}.fc-oE{margin:0!important}.fc-V3{margin-top:0!important;margin-bottom:0!important}.fc-SS{margin-left:0!important;margin-right:0!important}.fc-y2{white-space:nowrap!important}.fc-CN{white-space:pre!important}.fc-gZ{overflow-anchor:none}.fc-FA{overflow:hidden!important}.fc-7T{white-space:nowrap!important;overflow:hidden!important}.fc-cc{position:relative!important}.fc-H0{position:absolute!important}.fc-6t{inset-inline-start:0!important}.fc-ct{position:absolute!important;inset:0!important}.fc-iv,.fc-Uu{position:absolute!important;left:0!important;right:0!important}.fc-7k,.fc-Yw{position:absolute!important;top:0!important;bottom:0!important}.fc-iv{top:0!important}.fc-Yw{left:0!important;right:0!important;width:0!important}@media not print{.fc-Ip{position:sticky!important}.fc-CS{position:sticky!important;top:0!important}.fc-tT{position:sticky!important;inset-inline-start:0!important}.fc-hy{position:sticky!important;top:0!important;z-index:var(--fc-sticky-header-footer-z)!important}}.fc-Np{box-sizing:content-box!important}.fc-aP{position:absolute!important;left:-10000px!important}.fc-6H{align-items:center!important}.fc-K8{align-items:flex-start!important}.fc-E3{align-items:flex-end!important}.fc-Px{position:sticky!important;bottom:0!important;z-index:var(--fc-sticky-header-footer-z)!important}.fc-J4>*{margin-top:-1px!important}.fc-J4>*>*{height:1px!important}.fc-Jf .fc-Yi{-moz-column-break-inside:avoid!important;break-inside:avoid!important}.fc-Jf .fc-uD{display:table!important;table-layout:fixed!important;width:100%!important;border-spacing:0!important;border-collapse:separate!important}.fc-Jf .fc-jM{display:table-header-group!important;-moz-column-break-inside:avoid!important;break-inside:avoid!important;background:#fff!important;z-index:9999!important;position:relative!important}.fc-fx{min-height:6em!important}.fc-BS{z-index:0}.fc-iu{z-index:1}.fc-Bk:focus-visible{z-index:2}:root{--fc-classic-button: #334155;--fc-classic-button-border: #334155;--fc-classic-button-strong: #1e293b;--fc-classic-button-strong-border: #0f172a;--fc-classic-button-outline: #47556980;--fc-classic-button-foreground: #fff;--fc-classic-primary: #3788d8;--fc-classic-primary-foreground: #fff;--fc-classic-event: var(--fc-classic-primary);--fc-classic-event-contrast: var(--fc-classic-primary-foreground);--fc-classic-background-event: #22c55e;--fc-classic-background-event-opacity: 15%;--fc-classic-background-event-foreground-opacity: 50%;--fc-classic-highlight: #cffafe66;--fc-classic-today: #facc1526;--fc-classic-now: #ef4444;--fc-classic-small-dot-width: 8px;--fc-classic-large-dot-width: 10px;--fc-classic-background: #ffffff;--fc-classic-faint: #0000000A;--fc-classic-muted: #00000014;--fc-classic-strong: #00000024;--fc-classic-foreground: #030712;--fc-classic-faint-foreground: #9ca3af;--fc-classic-muted-foreground: #6b7280;--fc-classic-border: #ddd;--fc-classic-strong-border: #9ca3af}@media not print{[data-color-scheme=dark]{--fc-classic-highlight: #3b82f633;--fc-classic-today: #fef08a1A;--fc-classic-background: #030712;--fc-classic-faint: #ffffff0A;--fc-classic-muted: #ffffff14;--fc-classic-strong: #ffffff24;--fc-classic-foreground: #fff;--fc-classic-faint-foreground: #4b5563;--fc-classic-muted-foreground: #9ca3af;--fc-classic-border: #1f2937;--fc-classic-strong-border: #374151}}.fc-classic-n5m{font-size:16px;line-height:1.5;--fc-classic-border-style: solid}.fc-classic-Z9U{appearance:button;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0;margin:0;border:0;padding:0}.fc-classic-JiE{color:inherit;text-decoration:inherit}.fc-classic-3Lc{pointer-events:none}.fc-classic-1EY{position:absolute}.fc-classic-eYX{position:relative}.fc-classic-OUe{position:sticky}.fc-classic-MaV{inset-inline:0}.fc-classic-AWB{inset-block:0}.fc-classic-11a{inset-inline-start:-4px}.fc-classic-rbS{inset-inline-start:0}.fc-classic-bEw{inset-inline-end:-4px}.fc-classic-2w8{inset-inline-end:2px}.fc-classic-dnf{inset-inline-end:-3px}.fc-classic-YDC{top:-4px}.fc-classic-n9G{top:0}.fc-classic-2ik{top:2px}.fc-classic-ERR{top:50%}.fc-classic-fJL{bottom:-4px}.fc-classic-jGI{bottom:0}.fc-classic-1V6{left:50%}.fc-classic-88I{order:-1}.fc-classic-gMS{margin:4px}.fc-classic-bvX{margin:8px}.fc-classic-jD5{margin:16px}.fc-classic-J04{margin-inline:-5px}.fc-classic-cKZ{margin-inline:2px}.fc-classic-rVY{margin-inline:4px}.fc-classic-fn8{margin-inline:8px}.fc-classic-148{margin-inline:1px}.fc-classic-cJ3{margin-block:2px}.fc-classic-V9v{margin-block:4px}.fc-classic-2tF{margin-block:8px}.fc-classic-Jzj{margin-inline-start:2px}.fc-classic-Mde{margin-inline-start:8px}.fc-classic-qvL{margin-inline-start:1px}.fc-classic-kp0{margin-inline-end:-4px}.fc-classic-3e1{margin-inline-end:2px}.fc-classic-B3G{margin-inline-end:2.5%}.fc-classic-9hC{margin-inline-end:1px}.fc-classic-Dq8{margin-top:-4px}.fc-classic-a10{margin-top:-5px}.fc-classic-Ika{margin-bottom:1px}.fc-classic-nHS{margin-bottom:-1px}.fc-classic-F99{margin-left:-4px}.fc-classic-eF2{display:contents}.fc-classic-I48{display:block}.fc-classic-dl1{display:flex}.fc-classic-i3N{display:grid}.fc-classic-pps{display:none}.fc-classic-3wQ{width:8px;height:8px}.fc-classic-vnf{width:16px;height:16px}.fc-classic-XUJ{width:20px;height:20px}.fc-classic-uuA{height:8px}.fc-classic-zrJ{height:12px}.fc-classic-84e{min-height:2px}.fc-classic-mhE{min-height:12px}.fc-classic-toR{min-height:1px}.fc-classic-roZ{width:50%}.fc-classic-hza{width:8px}.fc-classic-4Tv{width:5px}.fc-classic-kMV{max-width:200px}.fc-classic-2KU{min-width:0}.fc-classic-aNc{min-width:220px}.fc-classic-yi0{flex-shrink:0}.fc-classic-1Zl{flex-shrink:1}.fc-classic-OLq{flex-shrink:100}.fc-classic-1El{flex-grow:1}.fc-classic-jmT{rotate:180deg}.fc-classic-sgX{flex-direction:column}.fc-classic-1sP{flex-direction:row}.fc-classic-dNl{flex-wrap:wrap}.fc-classic-XpK{align-items:center}.fc-classic-N2M{justify-content:space-between}.fc-classic-E9P{justify-content:center}.fc-classic-LMv{justify-content:flex-end}.fc-classic-aTF{gap:2px}.fc-classic-NWN{gap:4px}.fc-classic-wwb{gap:12px}.fc-classic-yth{gap:20px}.fc-classic-sI7{align-self:flex-start}.fc-classic-pKG{overflow:hidden}.fc-classic-Ig4{border-radius:4px}.fc-classic-AAA{border-radius:3.40282e38px}.fc-classic-Fvv{border-radius:4px}.fc-classic-kmj{border-start-start-radius:4px;border-end-start-radius:4px}.fc-classic-Skl{border-start-end-radius:4px;border-end-end-radius:4px}.fc-classic-C2g{border-end-end-radius:4px}.fc-classic-Z7Q{border-top-left-radius:4px;border-top-right-radius:4px}.fc-classic-2qh{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.fc-classic-wsy{border-style:var(--fc-classic-border-style);border-width:1px}.fc-classic-5JF{border-style:var(--fc-classic-border-style);border-width:4px}.fc-classic-yDA{border-style:var(--fc-classic-border-style);border-width:5px}.fc-classic-Mjo{border-style:var(--fc-classic-border-style);border-width:calc(var(--fc-classic-small-dot-width) / 2)}.fc-classic-GOm{border-style:var(--fc-classic-border-style);border-width:calc(var(--fc-classic-large-dot-width) / 2)}.fc-classic-1Wx{border-inline-style:var(--fc-classic-border-style);border-inline-width:1px}.fc-classic-ybF{border-inline-style:var(--fc-classic-border-style);border-inline-width:5px}.fc-classic-JIC{border-block-style:var(--fc-classic-border-style);border-block-width:1px}.fc-classic-XM3{border-block-style:var(--fc-classic-border-style);border-block-width:5px}.fc-classic-3J4{border-inline-start-style:var(--fc-classic-border-style);border-inline-start-width:1px}.fc-classic-hhi{border-inline-start-style:var(--fc-classic-border-style);border-inline-start-width:5px}.fc-classic-jIH{border-inline-start-style:var(--fc-classic-border-style);border-inline-start-width:6px}.fc-classic-USt{border-inline-end-style:var(--fc-classic-border-style);border-inline-end-width:1px}.fc-classic-Bda{border-inline-end-style:var(--fc-classic-border-style);border-inline-end-width:5px}.fc-classic-ku3{border-top-style:var(--fc-classic-border-style);border-top-width:1px}.fc-classic-bLA{border-top-style:var(--fc-classic-border-style);border-top-width:6px}.fc-classic-zi1{border-bottom-style:var(--fc-classic-border-style);border-bottom-width:1px}.fc-classic-TN2{--fc-classic-border-style: dotted;border-style:dotted}.fc-classic-C1x{border-color:var(--fc-classic-border)}.fc-classic-sYT{border-color:var(--fc-classic-now)}.fc-classic-0Pr{border-color:var(--fc-classic-primary)}.fc-classic-vXO{border-color:var(--fc-classic-button-border)}.fc-classic-rQI{border-color:var(--fc-classic-button-strong-border)}.fc-classic-C0k{border-color:var(--fc-classic-strong-border)}.fc-classic-lNM{border-color:var(--fc-event-color)}.fc-classic-d0j{border-color:#0000}.fc-classic-Pqk{border-inline-color:#0000}.fc-classic-rif{border-block-color:#0000}.fc-classic-0qY{border-inline-start-color:var(--fc-classic-now)}.fc-classic-LaM{border-inline-start-color:#000}.fc-classic-5JV{border-inline-end-color:#000}.fc-classic-1Aa{border-top-color:var(--fc-classic-now)}.fc-classic-Jk3{background-color:var(--fc-classic-background)}.fc-classic-iYS{background-color:var(--fc-classic-faint)}.fc-classic-hLU{background-color:var(--fc-classic-highlight)}.fc-classic-k3f{background-color:var(--fc-classic-muted)}.fc-classic-YjJ{background-color:var(--fc-event-color)}@media not print{@supports (color:color-mix(in lab,red,red)){.fc-classic-hsC{background-color:color-mix(in oklab,var(--fc-event-color) var(--fc-classic-background-event-opacity),transparent)}}@supports not (color:color-mix(in lab,red,red)){.fc-classic-hsC{position:relative;isolation:isolate}.fc-classic-hsC:before{content:"";position:absolute;inset:0;background-color:var(--fc-event-color);opacity:var(--fc-classic-background-event-opacity);z-index:-1}}}.fc-classic-JWq{background-color:var(--fc-classic-button)}.fc-classic-Adi{background-color:var(--fc-classic-button-strong)}.fc-classic-KUX{padding:2px}.fc-classic-XJa{padding:6px}.fc-classic-3N5{padding:8px}.fc-classic-7A6{padding:1px}.fc-classic-oQ2{padding-inline:2px}.fc-classic-Eaq{padding-inline:10px}.fc-classic-Apf{padding-inline:12px}.fc-classic-F1o{padding-inline:1px}.fc-classic-2rx{padding-block:2px}.fc-classic-Jhn{padding-block:4px}.fc-classic-End{padding-block:6px}.fc-classic-dl6{padding-block:8px}.fc-classic-P9h{padding-block:60px}.fc-classic-z5u{padding-block:1px}.fc-classic-a7i{padding-inline-start:2px}.fc-classic-166{padding-top:2px}.fc-classic-8ub{padding-bottom:2px}.fc-classic-cM0{padding-bottom:16px}.fc-classic-HXA{text-align:center}.fc-classic-2HE{text-align:end}.fc-classic-AVD{font-size:24px;line-height:calc(2/1.5)}.fc-classic-vQz{font-size:11px;line-height:1.09091}.fc-classic-1Po{font-size:16px;line-height:1.5}.fc-classic-9yp{font-size:14px;line-height:calc(1.25/.875)}.fc-classic-a3B{font-size:12px;line-height:calc(1/.75)}.fc-classic-DIS{font-weight:700}.fc-classic-IPx{text-overflow:ellipsis}.fc-classic-TZ4{white-space:nowrap}.fc-classic-jm6{white-space:pre}.fc-classic-taq{color:var(--fc-classic-faint-foreground)}.fc-classic-m9h{color:var(--fc-classic-muted-foreground)}.fc-classic-GAX{color:var(--fc-classic-foreground)}.fc-classic-RnT{color:var(--fc-classic-button-foreground)}.fc-classic-i9F{color:var(--fc-event-contrast-color)}.fc-classic-L1Y{font-style:italic}.fc-classic-lMo{opacity:.5}.fc-classic-Q3Z{opacity:.65}.fc-classic-iTG{opacity:.75}.fc-classic-MGT{opacity:var(--fc-classic-background-event-foreground-opacity)}.fc-classic-1kP{box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a}.fc-classic-tkw{box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.fc-classic-qNs{box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a}.fc-classic-A3h{box-shadow:0 0 0 1px var(--fc-classic-ring-color, currentcolor)}.fc-classic-yKG{--fc-classic-ring-color: var(--fc-classic-background) }.fc-classic-2R2{outline-style:solid;outline-width:1px}.fc-classic-0Bj{outline-style:solid;outline-width:2px}.fc-classic-fFh{outline-offset:-2px}.fc-classic-3Xj{outline-offset:2px}.fc-classic-lYz{outline-color:var(--fc-classic-button-outline)}.fc-classic-zIi{outline-color:var(--fc-classic-primary)}.fc-classic-SDU{background:linear-gradient(var(--fc-classic-muted),var(--fc-classic-muted))var(--fc-classic-background)}.fc-classic-BaR{background:linear-gradient(var(--fc-classic-strong),var(--fc-classic-strong))var(--fc-classic-background)}.fc-classic-mAY:not(:is(:where(.fc-classic-bCs):hover *)){opacity:.65}@media not all and (hover:hover){.fc-classic-mAY{opacity:.65}}@media not print{.fc-classic-hbn{background-color:var(--fc-classic-today)}}@media(hover:hover){.fc-classic-vs6:is(:where(.fc-classic-bCs):hover *){display:block}.fc-classic-Ogp:is(:where(.fc-classic-bCs):hover *){text-decoration-line:underline}}.fc-classic-uk6:first-child{border-start-start-radius:4px;border-end-start-radius:4px}.fc-classic-Tuc:last-child{border-start-end-radius:4px;border-end-end-radius:4px}@media(hover:hover){.fc-classic-bqK:hover{border-color:var(--fc-classic-button-strong-border)}.fc-classic-9Rj:hover{background-color:var(--fc-classic-button-strong)}.fc-classic-Ubk:hover{background-color:var(--fc-classic-faint)}.fc-classic-4yP:hover{background-color:var(--fc-classic-muted)}.fc-classic-Eu0:hover{text-decoration-line:underline}}.fc-classic-OIx:focus-visible{background-color:var(--fc-classic-faint)}.fc-classic-tCP:focus-visible{background-color:var(--fc-classic-muted)}.fc-classic-uqo:focus-visible{outline-style:solid;outline-width:2px}.fc-classic-sOR:focus-visible{outline-style:solid;outline-width:3px}.fc-classic-aIH:active{border-color:var(--fc-classic-button-strong-border)}.fc-classic-5ky:active{background-color:var(--fc-classic-button-strong)}.fc-classic-28F:active{background-color:var(--fc-classic-muted)}.fc-classic-8gz:active{background-color:var(--fc-classic-strong)}@media print{.fc-classic-jsy{border-width:1px}.fc-classic-nQ5{border-color:var(--fc-classic-button-strong-border)}.fc-classic-DO7{border-color:var(--fc-event-color)}.fc-classic-4MR{border-color:#000}.fc-classic-vwH{background-color:#fff}.fc-classic-cfp{color:#000}}[dir=rtl] .fc-classic-jY6{rotate:none}[dir=rtl] .fc-classic-asP{rotate:180deg}.CalendarBase_wrapper{height:100%;display:flex;flex-direction:column}.CalendarBase_calendar{flex-grow:1;min-width:0}.dayGridMonth.CalendarBase_calendar,.timeGridWeek.CalendarBase_calendar{min-width:480px}.dayGridMonth.CalendarBase_calendar .CalendarBase_listItemEventBefore{display:none}.CalendarBase_clickable{cursor:pointer}.CalendarBase_selectedRange{background-color:light-dark(#228be62e,#4dabf73d)}.CalendarBase_eventTitle{order:1}.CalendarBase_eventTime{order:2}.CalendarBase_eventInner{overflow:hidden}.CalendarBase_eventTitle{white-space:normal;overflow:visible}.CalendarBase_eventTitle{font-weight:500}.CalendarBase_eventTime{font-size:10px}.CalendarBase_shortEvent{.CalendarBase_eventInner{flex-direction:column;align-items:inherit}}.CalendarBase_backgroundEventInner>div{opacity:1}.CalendarBase_backgroundEvent{container-type:size}@container (height < 50px){.CalendarBase_backgroundEventInner>div{font-size:10px;padding-top:2px}}.CalendarBase_backgroundEvent{border-radius:var(--mantine-radius-sm)}:root{--fc-classic-today: #b8e0ff4d;[data-color-scheme=dark]{--fc-classic-today: #406e934d}}.CalendarBase_nonBusinessHours{background-color:light-dark(#0000000A,#FFFFFF2A)}.dayGridMonth .CalendarBase_event{background-color:var(--fc-event-color);.CalendarBase_eventInner{color:var(--fc-event-contrast-color)}}.Calendar_wrapper{.appointment{--cal-color: light-dark(var(--mantine-color-white), var(--mantine-color-white));--cal-background-color: light-dark(var(--mantine-color-blue-6), var(--mantine-color-blue-8))}.slot{--cal-color: light-dark(var(--mantine-color-dark-4), var(--mantine-color-gray-4));--cal-background-color: light-dark(var(--mantine-color-gray-4), var(--mantine-color-gray-7))}.dayGridMonth .Calendar_event:hover{background-color:var(--cal-background-color)}.appointment.pending{--cal-color: light-dark(var(--mantine-color-blue-8), var(--mantine-color-blue-6));--cal-background-color: light-dark(var(--mantine-color-white), var(--mantine-color-black));border:1px solid var(--cal-color)}.slot.free{--cal-color: light-dark(var(--mantine-color-dark-7), var(--mantine-color-gray-1));--cal-background-color: light-dark(var(--mantine-color-green-1), var(--mantine-color-green-9))}.Calendar_event,.Calendar_backgroundEvent{background-color:var(--cal-background-color);.Calendar_eventInner{color:var(--cal-color)}.Calendar_backgroundEventInner>div{color:var(--cal-color)}}.Calendar_eventTitle:after{opacity:.7}.appointment.proposed{.Calendar_eventTitle:after{content:" (proposed)"}}.appointment.cancelled{.Calendar_eventTitle:after{content:" (cancelled)"}}.appointment.noshow{.Calendar_eventTitle:after{content:" (no show)"}}.appointment.entered-in-error{.Calendar_eventTitle:after{content:" (entered in error)"}}.appointment.checked-in{.Calendar_eventTitle:after{content:" (checked in)"}}.appointment.waitlist{.Calendar_eventTitle:after{content:" (waitlist)"}}}.appointment .MultiCalendar_eventInner{margin-left:8px;&:before{content:"";width:4px;position:absolute;top:2px;left:2px;bottom:2px;border-radius:8px;background-color:var(--status-color)}}.appointment.pending,.appointment.proposed{--status-color: var(--mantine-color-yellow-3)}.appointment.booked,.appointment.arrived,.appointment.fulfilled,.appointment.checked-in{--status-color: var(--mantine-color-blue-3)}.appointment.cancelled,.appointment.noshow{--status-color: var(--mantine-color-red-3)}.MultiCalendar_eventTime{color:var(--mantine-color-gray-2)}.ScheduleAvailabilityEditor_week{display:grid;grid-template-columns:repeat(5,max-content) 1fr;align-items:center;column-gap:var(--mantine-spacing-xs);row-gap:var(--mantine-spacing-xs);grid-auto-rows:minmax(calc(2.25rem * var(--mantine-scale)),auto)}.ScheduleAvailabilityEditor_dayCell{grid-column:1;padding-right:var(--mantine-spacing-sm)}.ScheduleAvailabilityEditor_rangeStart{grid-column:2}.ScheduleAvailabilityEditor_rangeSeparator{grid-column:3}.ScheduleAvailabilityEditor_rangeEnd{grid-column:4}.ScheduleAvailabilityEditor_addAction{grid-column:5}.ScheduleAvailabilityEditor_removeAction{grid-column:6}.ScheduleAvailabilityEditor_unavailable{grid-column:2 / -1}.ScheduleAvailabilityEditor_overrideToggle{min-height:calc(2.25rem * var(--mantine-scale))}.CalendarRow_row{width:100%;padding:6px 8px;border-radius:var(--mantine-radius-sm);text-align:left}.CalendarRow_row[data-interactive]{cursor:pointer}.CalendarRow_row[data-interactive]:hover{background-color:light-dark(var(--mantine-color-gray-0),var(--mantine-color-dark-6))}.CalendarRow_eyeSlot{display:flex}.CalendarRow_eyeOff{color:light-dark(var(--mantine-color-gray-5),var(--mantine-color-dark-2))}.CalendarRow_eyeHint{color:light-dark(var(--mantine-color-gray-5),var(--mantine-color-dark-2));opacity:0;transition:opacity .15s ease}.CalendarRow_row:hover .CalendarRow_eyeHint{opacity:1}.SectionHeader_chevron{transition:transform .2s ease;cursor:pointer;color:light-dark(var(--mantine-color-gray-7),var(--mantine-color-dark-1))}.SectionHeader_chevron[data-collapsed]{transform:rotate(-90deg)}.SectionHeader_chevron:hover{background-color:light-dark(var(--mantine-color-gray-0),var(--mantine-color-dark-6))}.SectionHeader_title{cursor:pointer}.SchedulingWorkspace_root{display:flex;align-items:stretch;gap:var(--mantine-spacing-md);height:100%;width:100%}.SchedulingWorkspace_sidebar{flex-shrink:0;width:300px;overflow-y:auto}.SchedulingWorkspace_calendar{position:relative;flex:1;min-width:0;overflow-x:auto}.SchedulingWorkspace_bookingPane{flex-shrink:0;width:320px;display:flex;flex-direction:column;overflow-y:auto}.SchedulingWorkspace_bookingPaneWide{width:760px}.SchedulingWorkspace_alert{margin-bottom:var(--mantine-spacing-xs)}
1
+ .AppointmentFinder_timeGrid{row-gap:var(--mantine-spacing-xs)}.AppointmentFinder_layout{display:flex;flex-wrap:wrap;gap:var(--mantine-spacing-lg);align-items:flex-start;flex:1 1 auto;min-height:0}.AppointmentFinder_form{flex:1 1 300px;min-width:0;max-width:420px;max-height:100%;overflow-y:auto}.AppointmentFinder_results{flex:1 1 380px;min-width:0;max-height:100%;overflow-y:auto}.AppointmentFinder_form>*,.AppointmentFinder_results>*{flex-shrink:0}.AppointmentFinder_codePill{max-width:14rem}.AppointmentFinder_requiredLabel:after{content:" *";color:var(--mantine-color-error)}:root{--fc-sticky-header-footer-z: 3;--fc-popover-z: 4}.fc-ZK{z-index:var(--fc-popover-z)!important}.fc-5R{isolation:isolate}.fc-O6,.fc-O6 *,.fc-O6 *:before,.fc-O6 *:after{box-sizing:border-box!important}.fc-fF,.fc-fF *{cursor:not-allowed!important}.fc-Rp{-ms-overflow-style:none!important;scrollbar-width:none!important}.fc-Rp::-webkit-scrollbar{display:none!important}.fc-tp{flex-shrink:0!important}.fc-MU .fc-rr{display:flex!important;flex-direction:row!important;flex-wrap:wrap!important}.fc-ob .fc-rr>*{float:left!important}[dir=rtl] .fc-ob .fc-rr>*,.fc-ob[dir=rtl] .fc-rr>*{float:right!important}.fc-ob .fc-rr:after{content:""!important;display:block!important;clear:both!important}.fc-iz{cursor:pointer!important}.fc-W6{cursor:n-resize!important}.fc-9e{cursor:s-resize!important}.fc-wb{cursor:w-resize!important}[dir=rtl] .fc-wb,.fc-0b{cursor:e-resize!important}[dir=rtl] .fc-0b{cursor:w-resize!important}.fc-Gz{cursor:col-resize!important}.fc-wZ,.fc-oJ,.fc-9A{position:absolute!important;box-sizing:content-box!important;width:100%!important;height:100%!important}.fc-wZ{padding:10px!important;margin:-10px!important}.fc-oJ{padding-left:10px!important;padding-right:10px!important;margin-left:-10px!important;margin-right:-10px!important}.fc-9A{padding-top:10px!important;padding-bottom:10px!important;margin-top:-10px!important;margin-bottom:-10px!important}.fc-Yf{position:absolute;inset:0 -5px}.fc-AQ{-webkit-user-select:none;-moz-user-select:none;user-select:none}.fc-MJ{visibility:hidden}.fc-Yq{border:0!important}.fc-3R{border-left:0!important;border-right:0!important}.fc-dv{border-top:0!important;border-bottom:0!important}.fc-Yk{border-top:0!important}.fc-b1{border-bottom:0!important}.fc-W7{border-inline-start:0!important}.fc-Eu{border-inline-end:0!important}.fc-bH{display:flex!important;flex-direction:row!important}.fc-Ih{display:flex!important;flex-direction:column!important}.fc-BH{flex-grow:1!important}.fc-1Y{flex-grow:1!important;flex-basis:0!important;min-width:0!important;min-height:0!important}.fc-Ux{min-height:0!important}.fc-ZM{flex-grow:1!important;flex-basis:0!important;min-width:0!important}.fc-Gx{width:100%!important;table-layout:fixed!important;border:0!important;border-collapse:separate!important;border-spacing:0!important}.fc-Gx>thead{-moz-column-break-inside:avoid!important;break-inside:avoid!important;page-break-inside:avoid!important}.fc-Gx>tbody{background:transparent!important}.fc-Gx>thead>tr>th,.fc-Gx>tbody>tr>th,.fc-Gx>tbody>tr>td{vertical-align:top!important;font-weight:inherit;text-align:inherit}.fc-33{padding:0!important}.fc-5V{padding-top:0!important;padding-bottom:0!important}.fc-b4{margin:0!important}.fc-H8{margin-top:0!important;margin-bottom:0!important}.fc-Oq{margin-left:0!important;margin-right:0!important}.fc-oX{white-space:nowrap!important}.fc-LF{white-space:pre!important}.fc-Gg{overflow-anchor:none}.fc-87{pointer-events:none!important}.fc-5o{overflow:hidden!important}.fc-7P{white-space:nowrap!important;overflow:hidden!important}.fc-XV{position:relative!important}.fc-Ew{position:absolute!important}.fc-bN{inset-inline-start:0!important}.fc-cH{inset-inline-end:0!important}.fc-wd{position:absolute!important;inset:0!important}.fc-sd,.fc-ar{position:absolute!important;left:0!important;right:0!important}.fc-0H,.fc-63{position:absolute!important;top:0!important;bottom:0!important}.fc-sd{top:0!important}.fc-63{left:0!important;right:0!important;width:0!important}@media not print{.fc-WL{position:sticky!important}.fc-i6{position:sticky!important;top:0!important}.fc-n4{position:sticky!important;inset-inline-start:0!important}.fc-q0{position:sticky!important;top:0!important;z-index:var(--fc-sticky-header-footer-z)!important}}.fc-F2{box-sizing:content-box!important}.fc-rZ{position:absolute!important;left:-10000px!important}.fc-dG{align-items:center!important}.fc-jB{align-items:flex-start!important}.fc-6B{align-items:flex-end!important}.fc-89{position:sticky!important;bottom:0!important;z-index:var(--fc-sticky-header-footer-z)!important}.fc-Se>*{margin-top:-1px!important}.fc-Se>*>*{height:1px!important}.fc-qu{-moz-column-break-inside:avoid!important;break-inside:avoid!important;page-break-inside:avoid!important}.fc-sn{min-height:4em!important}.fc-os{display:flow-root!important}.fc-P0{z-index:0}.fc-hB{z-index:1}.fc-b7{z-index:2}.fc-BR{z-index:3}.fc-eM{z-index:4}.fc-zy{z-index:5}.fc-xI{z-index:1000}.fc-hJ{z-index:9999}.fc-0t:focus-visible{z-index:2}:root{--fc-classic-button: #334155;--fc-classic-button-border: #334155;--fc-classic-button-strong: #1e293b;--fc-classic-button-strong-border: #0f172a;--fc-classic-button-outline: #47556980;--fc-classic-button-foreground: #fff;--fc-classic-primary: #3788d8;--fc-classic-primary-foreground: #fff;--fc-classic-event: var(--fc-classic-primary);--fc-classic-event-contrast: var(--fc-classic-primary-foreground);--fc-classic-background-event: #22c55e;--fc-classic-background-event-opacity: 15%;--fc-classic-background-event-foreground-opacity: 50%;--fc-classic-highlight: #cffafe66;--fc-classic-today: #facc1526;--fc-classic-now: #ef4444;--fc-classic-small-dot-width: 8px;--fc-classic-large-dot-width: 10px;--fc-classic-background: #ffffff;--fc-classic-faint: #0000000A;--fc-classic-muted: #00000014;--fc-classic-strong: #00000024;--fc-classic-foreground: #030712;--fc-classic-faint-foreground: #9ca3af;--fc-classic-muted-foreground: #6b7280;--fc-classic-border: #ddd;--fc-classic-strong-border: #9ca3af}@media not print{[data-color-scheme=dark]{--fc-classic-highlight: #3b82f633;--fc-classic-today: #fef08a1A;--fc-classic-background: #030712;--fc-classic-faint: #ffffff0A;--fc-classic-muted: #ffffff14;--fc-classic-strong: #ffffff24;--fc-classic-foreground: #fff;--fc-classic-faint-foreground: #4b5563;--fc-classic-muted-foreground: #9ca3af;--fc-classic-border: #1f2937;--fc-classic-strong-border: #374151}}.fc-classic-n5m{font-size:16px;line-height:1.5;--fc-classic-border-style: solid}.fc-classic-Z9U{appearance:button;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0;margin:0;border:0;padding:0}.fc-classic-JiE{color:inherit;text-decoration:inherit}.fc-classic-3Lc{pointer-events:none}.fc-classic-1EY{position:absolute}.fc-classic-eYX{position:relative}.fc-classic-OUe{position:sticky}.fc-classic-MaV{inset-inline:0}.fc-classic-AWB{inset-block:0}.fc-classic-11a{inset-inline-start:-4px}.fc-classic-rbS{inset-inline-start:0}.fc-classic-bEw{inset-inline-end:-4px}.fc-classic-2w8{inset-inline-end:2px}.fc-classic-dnf{inset-inline-end:-3px}.fc-classic-YDC{top:-4px}.fc-classic-n9G{top:0}.fc-classic-2ik{top:2px}.fc-classic-ERR{top:50%}.fc-classic-fJL{bottom:-4px}.fc-classic-jGI{bottom:0}.fc-classic-1V6{left:50%}.fc-classic-88I{order:-1}.fc-classic-gMS{margin:4px}.fc-classic-bvX{margin:8px}.fc-classic-jD5{margin:16px}.fc-classic-J04{margin-inline:-5px}.fc-classic-cKZ{margin-inline:2px}.fc-classic-rVY{margin-inline:4px}.fc-classic-fn8{margin-inline:8px}.fc-classic-148{margin-inline:1px}.fc-classic-cJ3{margin-block:2px}.fc-classic-V9v{margin-block:4px}.fc-classic-2tF{margin-block:8px}.fc-classic-Jzj{margin-inline-start:2px}.fc-classic-Mde{margin-inline-start:8px}.fc-classic-qvL{margin-inline-start:1px}.fc-classic-kp0{margin-inline-end:-4px}.fc-classic-3e1{margin-inline-end:2px}.fc-classic-B3G{margin-inline-end:2.5%}.fc-classic-9hC{margin-inline-end:1px}.fc-classic-Dq8{margin-top:-4px}.fc-classic-a10{margin-top:-5px}.fc-classic-Ika{margin-bottom:1px}.fc-classic-nHS{margin-bottom:-1px}.fc-classic-F99{margin-left:-4px}.fc-classic-eF2{display:contents}.fc-classic-I48{display:block}.fc-classic-dl1{display:flex}.fc-classic-i3N{display:grid}.fc-classic-pps{display:none}.fc-classic-3wQ{width:8px;height:8px}.fc-classic-vnf{width:16px;height:16px}.fc-classic-XUJ{width:20px;height:20px}.fc-classic-uuA{height:8px}.fc-classic-zrJ{height:12px}.fc-classic-84e{min-height:2px}.fc-classic-mhE{min-height:12px}.fc-classic-toR{min-height:1px}.fc-classic-roZ{width:50%}.fc-classic-hza{width:8px}.fc-classic-4Tv{width:5px}.fc-classic-kMV{max-width:200px}.fc-classic-2KU{min-width:0}.fc-classic-aNc{min-width:220px}.fc-classic-yi0{flex-shrink:0}.fc-classic-1Zl{flex-shrink:1}.fc-classic-OLq{flex-shrink:100}.fc-classic-1El{flex-grow:1}.fc-classic-jmT{rotate:180deg}.fc-classic-sgX{flex-direction:column}.fc-classic-1sP{flex-direction:row}.fc-classic-dNl{flex-wrap:wrap}.fc-classic-XpK{align-items:center}.fc-classic-N2M{justify-content:space-between}.fc-classic-E9P{justify-content:center}.fc-classic-LMv{justify-content:flex-end}.fc-classic-aTF{gap:2px}.fc-classic-NWN{gap:4px}.fc-classic-wwb{gap:12px}.fc-classic-yth{gap:20px}.fc-classic-sI7{align-self:flex-start}.fc-classic-pKG{overflow:hidden}.fc-classic-Ig4{border-radius:4px}.fc-classic-AAA{border-radius:3.40282e38px}.fc-classic-Fvv{border-radius:4px}.fc-classic-kmj{border-start-start-radius:4px;border-end-start-radius:4px}.fc-classic-Skl{border-start-end-radius:4px;border-end-end-radius:4px}.fc-classic-C2g{border-end-end-radius:4px}.fc-classic-Z7Q{border-top-left-radius:4px;border-top-right-radius:4px}.fc-classic-2qh{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.fc-classic-wsy{border-style:var(--fc-classic-border-style);border-width:1px}.fc-classic-5JF{border-style:var(--fc-classic-border-style);border-width:4px}.fc-classic-yDA{border-style:var(--fc-classic-border-style);border-width:5px}.fc-classic-Mjo{border-style:var(--fc-classic-border-style);border-width:calc(var(--fc-classic-small-dot-width) / 2)}.fc-classic-GOm{border-style:var(--fc-classic-border-style);border-width:calc(var(--fc-classic-large-dot-width) / 2)}.fc-classic-1Wx{border-inline-style:var(--fc-classic-border-style);border-inline-width:1px}.fc-classic-ybF{border-inline-style:var(--fc-classic-border-style);border-inline-width:5px}.fc-classic-JIC{border-block-style:var(--fc-classic-border-style);border-block-width:1px}.fc-classic-XM3{border-block-style:var(--fc-classic-border-style);border-block-width:5px}.fc-classic-3J4{border-inline-start-style:var(--fc-classic-border-style);border-inline-start-width:1px}.fc-classic-hhi{border-inline-start-style:var(--fc-classic-border-style);border-inline-start-width:5px}.fc-classic-jIH{border-inline-start-style:var(--fc-classic-border-style);border-inline-start-width:6px}.fc-classic-USt{border-inline-end-style:var(--fc-classic-border-style);border-inline-end-width:1px}.fc-classic-Bda{border-inline-end-style:var(--fc-classic-border-style);border-inline-end-width:5px}.fc-classic-ku3{border-top-style:var(--fc-classic-border-style);border-top-width:1px}.fc-classic-bLA{border-top-style:var(--fc-classic-border-style);border-top-width:6px}.fc-classic-zi1{border-bottom-style:var(--fc-classic-border-style);border-bottom-width:1px}.fc-classic-TN2{--fc-classic-border-style: dotted;border-style:dotted}.fc-classic-C1x{border-color:var(--fc-classic-border)}.fc-classic-sYT{border-color:var(--fc-classic-now)}.fc-classic-0Pr{border-color:var(--fc-classic-primary)}.fc-classic-vXO{border-color:var(--fc-classic-button-border)}.fc-classic-rQI{border-color:var(--fc-classic-button-strong-border)}.fc-classic-C0k{border-color:var(--fc-classic-strong-border)}.fc-classic-lNM{border-color:var(--fc-event-color)}.fc-classic-d0j{border-color:#0000}.fc-classic-Pqk{border-inline-color:#0000}.fc-classic-rif{border-block-color:#0000}.fc-classic-0qY{border-inline-start-color:var(--fc-classic-now)}.fc-classic-LaM{border-inline-start-color:#000}.fc-classic-5JV{border-inline-end-color:#000}.fc-classic-1Aa{border-top-color:var(--fc-classic-now)}.fc-classic-Jk3{background-color:var(--fc-classic-background)}.fc-classic-iYS{background-color:var(--fc-classic-faint)}.fc-classic-hLU{background-color:var(--fc-classic-highlight)}.fc-classic-k3f{background-color:var(--fc-classic-muted)}.fc-classic-YjJ{background-color:var(--fc-event-color)}@media not print{@supports (color:color-mix(in lab,red,red)){.fc-classic-hsC{background-color:color-mix(in oklab,var(--fc-event-color) var(--fc-classic-background-event-opacity),transparent)}}@supports not (color:color-mix(in lab,red,red)){.fc-classic-hsC{position:relative;isolation:isolate}.fc-classic-hsC:before{content:"";position:absolute;inset:0;background-color:var(--fc-event-color);opacity:var(--fc-classic-background-event-opacity);z-index:-1}}}.fc-classic-JWq{background-color:var(--fc-classic-button)}.fc-classic-Adi{background-color:var(--fc-classic-button-strong)}.fc-classic-KUX{padding:2px}.fc-classic-XJa{padding:6px}.fc-classic-3N5{padding:8px}.fc-classic-7A6{padding:1px}.fc-classic-oQ2{padding-inline:2px}.fc-classic-Eaq{padding-inline:10px}.fc-classic-Apf{padding-inline:12px}.fc-classic-F1o{padding-inline:1px}.fc-classic-2rx{padding-block:2px}.fc-classic-Jhn{padding-block:4px}.fc-classic-End{padding-block:6px}.fc-classic-dl6{padding-block:8px}.fc-classic-P9h{padding-block:60px}.fc-classic-z5u{padding-block:1px}.fc-classic-a7i{padding-inline-start:2px}.fc-classic-166{padding-top:2px}.fc-classic-8ub{padding-bottom:2px}.fc-classic-cM0{padding-bottom:16px}.fc-classic-HXA{text-align:center}.fc-classic-2HE{text-align:end}.fc-classic-AVD{font-size:24px;line-height:calc(2/1.5)}.fc-classic-vQz{font-size:11px;line-height:1.09091}.fc-classic-1Po{font-size:16px;line-height:1.5}.fc-classic-9yp{font-size:14px;line-height:calc(1.25/.875)}.fc-classic-a3B{font-size:12px;line-height:calc(1/.75)}.fc-classic-DIS{font-weight:700}.fc-classic-IPx{text-overflow:ellipsis}.fc-classic-TZ4{white-space:nowrap}.fc-classic-jm6{white-space:pre}.fc-classic-taq{color:var(--fc-classic-faint-foreground)}.fc-classic-m9h{color:var(--fc-classic-muted-foreground)}.fc-classic-GAX{color:var(--fc-classic-foreground)}.fc-classic-RnT{color:var(--fc-classic-button-foreground)}.fc-classic-i9F{color:var(--fc-event-contrast-color)}.fc-classic-L1Y{font-style:italic}.fc-classic-lMo{opacity:.5}.fc-classic-Q3Z{opacity:.65}.fc-classic-iTG{opacity:.75}.fc-classic-MGT{opacity:var(--fc-classic-background-event-foreground-opacity)}.fc-classic-1kP{box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a}.fc-classic-tkw{box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.fc-classic-qNs{box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a}.fc-classic-A3h{box-shadow:0 0 0 1px var(--fc-classic-ring-color, currentcolor)}.fc-classic-yKG{--fc-classic-ring-color: var(--fc-classic-background) }.fc-classic-2R2{outline-style:solid;outline-width:1px}.fc-classic-0Bj{outline-style:solid;outline-width:2px}.fc-classic-fFh{outline-offset:-2px}.fc-classic-3Xj{outline-offset:2px}.fc-classic-lYz{outline-color:var(--fc-classic-button-outline)}.fc-classic-zIi{outline-color:var(--fc-classic-primary)}.fc-classic-SDU{background:linear-gradient(var(--fc-classic-muted),var(--fc-classic-muted))var(--fc-classic-background)}.fc-classic-BaR{background:linear-gradient(var(--fc-classic-strong),var(--fc-classic-strong))var(--fc-classic-background)}.fc-classic-mAY:not(:is(:where(.fc-classic-bCs):hover *)){opacity:.65}@media not all and (hover:hover){.fc-classic-mAY{opacity:.65}}@media not print{.fc-classic-hbn{background-color:var(--fc-classic-today)}}@media(hover:hover){.fc-classic-vs6:is(:where(.fc-classic-bCs):hover *){display:block}.fc-classic-Ogp:is(:where(.fc-classic-bCs):hover *){text-decoration-line:underline}}.fc-classic-uk6:first-child{border-start-start-radius:4px;border-end-start-radius:4px}.fc-classic-Tuc:last-child{border-start-end-radius:4px;border-end-end-radius:4px}@media(hover:hover){.fc-classic-bqK:hover{border-color:var(--fc-classic-button-strong-border)}.fc-classic-9Rj:hover{background-color:var(--fc-classic-button-strong)}.fc-classic-Ubk:hover{background-color:var(--fc-classic-faint)}.fc-classic-4yP:hover{background-color:var(--fc-classic-muted)}.fc-classic-Eu0:hover{text-decoration-line:underline}}.fc-classic-OIx:focus-visible{background-color:var(--fc-classic-faint)}.fc-classic-tCP:focus-visible{background-color:var(--fc-classic-muted)}.fc-classic-uqo:focus-visible{outline-style:solid;outline-width:2px}.fc-classic-sOR:focus-visible{outline-style:solid;outline-width:3px}.fc-classic-aIH:active{border-color:var(--fc-classic-button-strong-border)}.fc-classic-5ky:active{background-color:var(--fc-classic-button-strong)}.fc-classic-28F:active{background-color:var(--fc-classic-muted)}.fc-classic-8gz:active{background-color:var(--fc-classic-strong)}@media print{.fc-classic-jsy{border-width:1px}.fc-classic-nQ5{border-color:var(--fc-classic-button-strong-border)}.fc-classic-DO7{border-color:var(--fc-event-color)}.fc-classic-4MR{border-color:#000}.fc-classic-vwH{background-color:#fff}.fc-classic-cfp{color:#000}}[dir=rtl] .fc-classic-jY6{rotate:none}[dir=rtl] .fc-classic-asP{rotate:180deg}.CalendarBase_wrapper{height:100%;display:flex;flex-direction:column}.CalendarBase_calendar{flex-grow:1;min-width:0}.dayGridMonth.CalendarBase_calendar,.timeGridWeek.CalendarBase_calendar{min-width:480px}.dayGridMonth.CalendarBase_calendar .CalendarBase_listItemEventBefore{display:none}.CalendarBase_clickable{cursor:pointer}.CalendarBase_selectedRange{background-color:light-dark(#228be62e,#4dabf73d)}.CalendarBase_eventTitle{order:1}.CalendarBase_eventTime{order:2}.CalendarBase_eventInner{overflow:hidden}.CalendarBase_eventTitle{white-space:normal;overflow:visible}.CalendarBase_eventTitle{font-weight:500}.CalendarBase_eventTime{font-size:10px}.CalendarBase_shortEvent{.CalendarBase_eventInner{flex-direction:column;align-items:inherit}}.CalendarBase_backgroundEventInner>div{opacity:1}.CalendarBase_backgroundEvent{container-type:size}@container (height < 50px){.CalendarBase_backgroundEventInner>div{font-size:10px;padding-top:2px}}.CalendarBase_backgroundEvent{border-radius:var(--mantine-radius-sm)}:root{--fc-classic-today: #b8e0ff4d;[data-color-scheme=dark]{--fc-classic-today: #406e934d}}.CalendarBase_nonBusinessHours{background-color:light-dark(#0000000A,#FFFFFF2A)}.dayGridMonth .CalendarBase_event{background-color:var(--fc-event-color);.CalendarBase_eventInner{color:var(--fc-event-contrast-color)}}.Calendar_wrapper{.appointment{--cal-color: light-dark(var(--mantine-color-white), var(--mantine-color-white));--cal-background-color: light-dark(var(--mantine-color-blue-6), var(--mantine-color-blue-8))}.slot{--cal-color: light-dark(var(--mantine-color-dark-4), var(--mantine-color-gray-4));--cal-background-color: light-dark(var(--mantine-color-gray-4), var(--mantine-color-gray-7))}.dayGridMonth .Calendar_event:hover{background-color:var(--cal-background-color)}.appointment.proposed{.Calendar_eventTitle:after{content:" (proposed)"}}.appointment.pending{--cal-color: light-dark(var(--mantine-color-blue-8), var(--mantine-color-blue-6));--cal-background-color: light-dark(var(--mantine-color-white), var(--mantine-color-black));border:1px solid var(--cal-color)}.appointment.waitlist{.Calendar_eventTitle:after{content:" (waitlist)"}}.appointment.checked-in{.Calendar_eventTitle:after{content:" (checked in)"}}.appointment.cancelled{.Calendar_eventTitle:after{content:" (cancelled)"}--cal-color: light-dark(var(--mantine-color-black), var(--mantine-color-white));--cal-background-color: light-dark(var(--mantine-color-red-3), var(--mantine-color-red-8))}.appointment.noshow{.Calendar_eventTitle:after{content:" (no show)"}}.appointment.entered-in-error{.Calendar_eventTitle:after{content:" (entered in error)"}}.slot.free{--cal-color: light-dark(var(--mantine-color-dark-7), var(--mantine-color-gray-1));--cal-background-color: light-dark(var(--mantine-color-green-1), var(--mantine-color-green-9))}.slot.entered-in-error{--cal-color: light-dark(var(--mantine-color-dark-7), var(--mantine-color-black));--cal-background-color: light-dark(var(--mantine-color-red-1), var(--mantine-color-red-3))}.Calendar_event,.Calendar_backgroundEvent{background-color:var(--cal-background-color);.Calendar_eventInner{color:var(--cal-color)}.Calendar_backgroundEventInner>div{color:var(--cal-color)}}.Calendar_eventTitle:after{opacity:.7}}.appointment .MultiCalendar_eventInner{margin-left:8px;&:before{content:"";width:4px;position:absolute;top:2px;left:2px;bottom:2px;border-radius:8px;background-color:var(--status-color)}}.appointment.pending,.appointment.proposed{--status-color: var(--mantine-color-yellow-3)}.appointment.booked,.appointment.arrived,.appointment.fulfilled,.appointment.checked-in{--status-color: var(--mantine-color-blue-3)}.appointment.cancelled,.appointment.noshow,.appointment.entered-in-error{--status-color: var(--mantine-color-red-3)}.appointment.waitlist{--status-color: var(--mantine-color-gray-3)}.MultiCalendar_eventTime{color:var(--mantine-color-gray-2)}.ScheduleAvailabilityEditor_week{display:grid;grid-template-columns:repeat(5,max-content) 1fr;align-items:center;column-gap:var(--mantine-spacing-xs);row-gap:var(--mantine-spacing-xs);grid-auto-rows:minmax(calc(2.25rem * var(--mantine-scale)),auto)}.ScheduleAvailabilityEditor_dayCell{grid-column:1;padding-right:var(--mantine-spacing-sm)}.ScheduleAvailabilityEditor_rangeStart{grid-column:2}.ScheduleAvailabilityEditor_rangeSeparator{grid-column:3}.ScheduleAvailabilityEditor_rangeEnd{grid-column:4}.ScheduleAvailabilityEditor_addAction{grid-column:5}.ScheduleAvailabilityEditor_removeAction{grid-column:6}.ScheduleAvailabilityEditor_unavailable{grid-column:2 / -1}.ScheduleAvailabilityEditor_overrideToggle{min-height:calc(2.25rem * var(--mantine-scale))}.CalendarRow_row{width:100%;padding:6px 8px;border-radius:var(--mantine-radius-sm);text-align:left}.CalendarRow_row[data-interactive]{cursor:pointer}.CalendarRow_row[data-interactive]:hover{background-color:light-dark(var(--mantine-color-gray-0),var(--mantine-color-dark-6))}.CalendarRow_eyeSlot{display:flex}.CalendarRow_eyeOff{color:light-dark(var(--mantine-color-gray-5),var(--mantine-color-dark-2))}.CalendarRow_eyeHint{color:light-dark(var(--mantine-color-gray-5),var(--mantine-color-dark-2));opacity:0;transition:opacity .15s ease}.CalendarRow_row:hover .CalendarRow_eyeHint{opacity:1}.SectionHeader_chevron{transition:transform .2s ease;cursor:pointer;color:light-dark(var(--mantine-color-gray-7),var(--mantine-color-dark-1))}.SectionHeader_chevron[data-collapsed]{transform:rotate(-90deg)}.SectionHeader_chevron:hover{background-color:light-dark(var(--mantine-color-gray-0),var(--mantine-color-dark-6))}.SectionHeader_title{cursor:pointer}.SchedulingWorkspace_root{display:flex;align-items:stretch;gap:var(--mantine-spacing-md);height:100%;width:100%}.SchedulingWorkspace_sidebar{flex-shrink:0;width:300px;overflow-y:auto}.SchedulingWorkspace_calendar{position:relative;display:flex;flex-direction:column;flex:1;min-width:0;overflow-x:auto}.SchedulingWorkspace_multiCalendar{flex:1;min-height:0}.SchedulingWorkspace_timezoneNotice{flex-shrink:0;margin-top:var(--mantine-spacing-xs)}.SchedulingWorkspace_bookingPane{flex-shrink:0;width:320px;display:flex;flex-direction:column;overflow-y:auto}.SchedulingWorkspace_bookingPaneWide{width:760px}.SchedulingWorkspace_alert{margin-bottom:var(--mantine-spacing-xs)}
2
2
  /*# sourceMappingURL=index.css.map */