@medplum/react-scheduling 5.1.36 → 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.
- package/dist/cjs/index.cjs +3 -2
- package/dist/cjs/index.cjs.map +4 -4
- package/dist/cjs/index.css +1 -1
- package/dist/cjs/index.css.map +3 -3
- package/dist/cjs/index.d.ts +190 -72
- package/dist/esm/index.css +1 -1
- package/dist/esm/index.css.map +3 -3
- package/dist/esm/index.d.ts +190 -72
- package/dist/esm/index.mjs +3 -2
- package/dist/esm/index.mjs.map +4 -4
- package/package.json +22 -19
package/dist/cjs/index.d.ts
CHANGED
|
@@ -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
|
|
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<
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
|
@@ -192,6 +196,18 @@ export declare interface AppointmentProposalFormProps {
|
|
|
192
196
|
readonly onToggleTimeFinder?: (open: boolean) => void;
|
|
193
197
|
/** Called with the visit type as it changes. */
|
|
194
198
|
readonly onChangeService?: (service: WithId<HealthcareService> | undefined) => void;
|
|
199
|
+
/**
|
|
200
|
+
* Called with the time chosen, and with `undefined` once it is dropped.
|
|
201
|
+
*
|
|
202
|
+
* Every answer above the time drops it — a different day, a different provider —
|
|
203
|
+
* so a host pointing at the time on a calendar of its own takes the marker down
|
|
204
|
+
* rather than leaving it on a time nobody chose.
|
|
205
|
+
*/
|
|
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;
|
|
195
211
|
/**
|
|
196
212
|
* Performs the booking with the proposal the form assembled.
|
|
197
213
|
*
|
|
@@ -246,23 +262,41 @@ export declare function AppointmentSlotGroupCard(props: AppointmentSlotGroupCard
|
|
|
246
262
|
export declare interface AppointmentSlotGroupCardProps {
|
|
247
263
|
readonly group: AppointmentSlotGroup;
|
|
248
264
|
readonly onSelectAppointment: (appointment: Appointment) => void;
|
|
249
|
-
/**
|
|
265
|
+
/** Timezone the times are shown in. */
|
|
250
266
|
readonly timezone?: string;
|
|
267
|
+
/** The viewer's own timezone. */
|
|
268
|
+
readonly viewerTimezone?: string;
|
|
251
269
|
readonly selected?: Appointment;
|
|
252
270
|
readonly disabled?: boolean;
|
|
253
271
|
}
|
|
254
272
|
|
|
255
273
|
/**
|
|
256
|
-
* 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.
|
|
257
276
|
*
|
|
258
|
-
*
|
|
259
|
-
* a
|
|
260
|
-
*
|
|
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.
|
|
261
285
|
*/
|
|
262
|
-
export declare const BOOKABLE_ACTOR_TYPES:
|
|
286
|
+
export declare const BOOKABLE_ACTOR_TYPES: ["Practitioner", "Location", "Device"];
|
|
263
287
|
|
|
264
288
|
export declare type BookableActorType = (typeof BOOKABLE_ACTOR_TYPES)[number];
|
|
265
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
|
+
|
|
266
300
|
export declare function Calendar(props: CalendarProps): JSX.Element;
|
|
267
301
|
|
|
268
302
|
export declare interface CalendarProps {
|
|
@@ -302,6 +336,14 @@ export declare type DateTimeRange = {
|
|
|
302
336
|
end: Date;
|
|
303
337
|
};
|
|
304
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
|
+
|
|
305
347
|
/**
|
|
306
348
|
* Returns the last instant of a day, so that a range covers the whole of it.
|
|
307
349
|
* @param date - Any instant during the day.
|
|
@@ -352,13 +394,6 @@ export declare interface FilterCandidatesOptions {
|
|
|
352
394
|
readonly signal?: AbortSignal;
|
|
353
395
|
}
|
|
354
396
|
|
|
355
|
-
/**
|
|
356
|
-
* Says in words which days a search covers.
|
|
357
|
-
* @param range - The days asked for.
|
|
358
|
-
* @returns The range as a phrase, or undefined when both ends are open.
|
|
359
|
-
*/
|
|
360
|
-
export declare function formatDateRange(range: DateRange): string | undefined;
|
|
361
|
-
|
|
362
397
|
/**
|
|
363
398
|
* Formats a calendar day as a heading (e.g. "Monday, July 27").
|
|
364
399
|
* @param date - Local midnight of the day.
|
|
@@ -366,13 +401,26 @@ export declare function formatDateRange(range: DateRange): string | undefined;
|
|
|
366
401
|
*/
|
|
367
402
|
export declare function formatDayHeading(date: Date): string;
|
|
368
403
|
|
|
404
|
+
/**
|
|
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.
|
|
408
|
+
*/
|
|
409
|
+
export declare function formatTimezoneLabel(timezone?: string): string;
|
|
410
|
+
|
|
369
411
|
/**
|
|
370
412
|
* Formats an instant's time of day in a given timezone (e.g. "12:30 PM").
|
|
371
413
|
* @param date - The instant to format.
|
|
372
414
|
* @param timezone - IANA timezone identifier. Defaults to the browser's.
|
|
415
|
+
* @param options - Whether to name the zone as well.
|
|
373
416
|
* @returns The formatted time.
|
|
374
417
|
*/
|
|
375
|
-
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
|
+
}
|
|
376
424
|
|
|
377
425
|
/**
|
|
378
426
|
* Builds the sets of actors an appointment could be held on.
|
|
@@ -394,22 +442,31 @@ export declare function getActorCombinations(selections: ActorSelections): Actor
|
|
|
394
442
|
export declare function getActorGroupKey(appointment: Appointment): string;
|
|
395
443
|
|
|
396
444
|
/**
|
|
397
|
-
*
|
|
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.
|
|
398
453
|
*
|
|
399
|
-
*
|
|
400
|
-
*
|
|
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" }`)
|
|
401
457
|
*
|
|
402
|
-
* @param
|
|
403
|
-
* @returns The
|
|
458
|
+
* @param reference - A Reference to a schedulable resource
|
|
459
|
+
* @returns The type that the reference refers to.
|
|
404
460
|
*/
|
|
405
|
-
export declare function
|
|
461
|
+
export declare function getActorType(reference: SchedulingActor): SchedulingActorType;
|
|
406
462
|
|
|
407
463
|
/**
|
|
408
|
-
*
|
|
409
|
-
*
|
|
410
|
-
* @
|
|
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
|
|
411
468
|
*/
|
|
412
|
-
export declare function
|
|
469
|
+
export declare function getActorTypeLabel(resourceType: SchedulingActorType): string;
|
|
413
470
|
|
|
414
471
|
/**
|
|
415
472
|
* Returns a key uniquely identifying a proposed appointment.
|
|
@@ -422,6 +479,19 @@ export declare function getActorsKey(actors: readonly Reference[]): string;
|
|
|
422
479
|
*/
|
|
423
480
|
export declare function getAppointmentKey(appointment: Appointment): string;
|
|
424
481
|
|
|
482
|
+
/**
|
|
483
|
+
* The IANA timezone the browser is set to.
|
|
484
|
+
* @returns The viewer's own timezone identifier.
|
|
485
|
+
*/
|
|
486
|
+
export declare function getBrowserTimezone(): string;
|
|
487
|
+
|
|
488
|
+
/**
|
|
489
|
+
* Returns the actor a candidate's schedule is held on.
|
|
490
|
+
* @param candidate - The candidate to read.
|
|
491
|
+
* @returns Its schedule's only actor.
|
|
492
|
+
*/
|
|
493
|
+
export declare function getCandidateActor(candidate: ScheduleCandidate): SchedulingActor;
|
|
494
|
+
|
|
425
495
|
/**
|
|
426
496
|
* Names a candidate's actor, for use in plain-text option lists.
|
|
427
497
|
* @param candidate - The candidate to name.
|
|
@@ -430,11 +500,12 @@ export declare function getAppointmentKey(appointment: Appointment): string;
|
|
|
430
500
|
export declare function getCandidateDisplay(candidate: ScheduleCandidate): string;
|
|
431
501
|
|
|
432
502
|
/**
|
|
433
|
-
*
|
|
434
|
-
* @param
|
|
435
|
-
* @
|
|
503
|
+
* Counts the days a window covers, a part of a day counting as a whole one.
|
|
504
|
+
* @param start - The first instant of the window.
|
|
505
|
+
* @param end - Its last instant.
|
|
506
|
+
* @returns The number of days the window reaches over.
|
|
436
507
|
*/
|
|
437
|
-
export declare function
|
|
508
|
+
export declare function getDayCount(start: Date, end: Date): number;
|
|
438
509
|
|
|
439
510
|
/**
|
|
440
511
|
* Returns an appointment's length in whole minutes.
|
|
@@ -486,16 +557,9 @@ export declare function getFindWindowError(range: DateRange): string | undefined
|
|
|
486
557
|
export declare function getNativeInputType(type: 'date' | 'time'): string;
|
|
487
558
|
|
|
488
559
|
/**
|
|
489
|
-
* Returns
|
|
490
|
-
* @param actorType - A `Schedule.actor` resource type.
|
|
491
|
-
* @returns The role that actor fills.
|
|
492
|
-
*/
|
|
493
|
-
export declare function getSchedulingRole(actorType: SchedulingActorType): SchedulingRole;
|
|
494
|
-
|
|
495
|
-
/**
|
|
496
|
-
* Returns everything chosen, across roles.
|
|
560
|
+
* Returns everything chosen, across actor types
|
|
497
561
|
* @param selections - What has been chosen.
|
|
498
|
-
* @returns The chosen candidates
|
|
562
|
+
* @returns The chosen candidates in `BOOKABLE_ACTOR_TYPES` order
|
|
499
563
|
*/
|
|
500
564
|
export declare function getSelectedCandidates(selections: ActorSelections): ScheduleCandidate[];
|
|
501
565
|
|
|
@@ -506,34 +570,59 @@ export declare function getSelectedCandidates(selections: ActorSelections): Sche
|
|
|
506
570
|
*/
|
|
507
571
|
export declare function getSelectionError(selections: ActorSelections): string | undefined;
|
|
508
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
|
+
|
|
509
581
|
/**
|
|
510
582
|
* Groups proposed appointments into days, and each day into the sets of actors
|
|
511
583
|
* offering those times.
|
|
512
584
|
*
|
|
513
585
|
* @param appointments - Proposed appointments from `$find`.
|
|
514
586
|
* @param timezone - IANA timezone identifier. Defaults to the browser's.
|
|
587
|
+
* @param searched - Days to list whether or not they offer anything, so a searched day
|
|
588
|
+
* that came back empty still shows up rather than going missing. Read on the local
|
|
589
|
+
* calendar, matching how a day is picked.
|
|
515
590
|
* @returns Days in ascending order, each holding its groups.
|
|
516
591
|
*/
|
|
517
|
-
export declare function groupAppointmentsByDay(appointments: readonly Appointment[], timezone?: string): AppointmentDay[];
|
|
592
|
+
export declare function groupAppointmentsByDay(appointments: readonly Appointment[], timezone?: string, searched?: DateRange): AppointmentDay[];
|
|
518
593
|
|
|
519
|
-
|
|
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;
|
|
520
601
|
|
|
521
602
|
/**
|
|
522
|
-
* Reports whether
|
|
523
|
-
* @param
|
|
603
|
+
* Reports whether an actorType has to be chosen to be a valid booking
|
|
604
|
+
* @param actorType - The actor type being chosen.
|
|
524
605
|
* @returns Whether a search can run without it.
|
|
525
606
|
*/
|
|
526
|
-
export declare function
|
|
607
|
+
export declare function isActorTypeRequired(actorType: SchedulingActorType): boolean;
|
|
608
|
+
|
|
609
|
+
export declare function isBookableActorType(value: string | undefined): value is BookableActorType;
|
|
527
610
|
|
|
528
611
|
/**
|
|
529
|
-
*
|
|
530
|
-
* @param
|
|
531
|
-
* @param
|
|
532
|
-
* @returns True when
|
|
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.
|
|
533
616
|
*/
|
|
534
|
-
export declare function
|
|
617
|
+
export declare function isRequirementAnswered(requirement: SchedulingRequirement, values: BookingRequirementValues): boolean;
|
|
535
618
|
|
|
536
|
-
|
|
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;
|
|
537
626
|
|
|
538
627
|
/**
|
|
539
628
|
* The longest window `Appointment/$find` accepts. Requests wider than this are
|
|
@@ -591,7 +680,13 @@ export declare function parseDayKey(key: string): Date;
|
|
|
591
680
|
*/
|
|
592
681
|
export declare function parseZonedTime(day: Date, time: string, timezone?: string): Date | undefined;
|
|
593
682
|
|
|
594
|
-
|
|
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>;
|
|
595
690
|
|
|
596
691
|
/**
|
|
597
692
|
* Edits weekly availability for one visit service type, either as a Schedule's
|
|
@@ -633,27 +728,13 @@ export declare interface ScheduleOverrideEditorProps extends CommonProps {
|
|
|
633
728
|
readonly onSave: (updatedSchedule: Schedule) => void | Promise<void>;
|
|
634
729
|
}
|
|
635
730
|
|
|
636
|
-
/** Resource types that may appear in `Schedule.actor`. */
|
|
637
|
-
export declare const SCHEDULING_ACTOR_TYPES: readonly ["Practitioner", "PractitionerRole", "Location", "Device"];
|
|
638
|
-
|
|
639
|
-
/**
|
|
640
|
-
* The parts of an appointment a user chooses, in the order they are asked about.
|
|
641
|
-
*
|
|
642
|
-
* Each role becomes one question, because `$find` intersects the schedules it is
|
|
643
|
-
* given: a time is offered only when the provider *and* the room *and* the
|
|
644
|
-
* device are all free for it.
|
|
645
|
-
*/
|
|
646
|
-
export declare const SCHEDULING_ROLES: readonly ["provider", "room", "device"];
|
|
647
|
-
|
|
648
731
|
/**
|
|
649
732
|
* A reference to something a Schedule belongs to. The same union an Appointment
|
|
650
733
|
* accepts as a participant, so an actor can be carried straight across.
|
|
651
734
|
*/
|
|
652
735
|
export declare type SchedulingActor = Schedule['actor'][number];
|
|
653
736
|
|
|
654
|
-
export declare type SchedulingActorType =
|
|
655
|
-
|
|
656
|
-
export declare type SchedulingRole = (typeof SCHEDULING_ROLES)[number];
|
|
737
|
+
export declare type SchedulingActorType = Dereference<SchedulingActor>['resourceType'];
|
|
657
738
|
|
|
658
739
|
/**
|
|
659
740
|
* A data-coordination component pairing {@link CalendarsPanel} with {@link MultiCalendar}.
|
|
@@ -665,6 +746,13 @@ export declare type SchedulingRole = (typeof SCHEDULING_ROLES)[number];
|
|
|
665
746
|
* The form writes the booking and announces what it wrote, which is what puts the
|
|
666
747
|
* new appointment on the calendar beside it — a host supplies no data for any of it.
|
|
667
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.
|
|
752
|
+
* - Highlights the time last chosen, wherever it was chosen: the click that opened the
|
|
753
|
+
* pane, then whatever the form's time search settles on, and nothing while the form
|
|
754
|
+
* holds no time. The calendar is never moved to reach it — a highlight off the week
|
|
755
|
+
* on screen is kept, and is drawn again on paging back to it.
|
|
668
756
|
*
|
|
669
757
|
* @param props - Component props
|
|
670
758
|
* @returns A React Node with the coordinated Calendars panel + calendar UI in it
|
|
@@ -673,7 +761,17 @@ export declare function SchedulingWorkspace(props: SchedulingWorkspaceProps): JS
|
|
|
673
761
|
|
|
674
762
|
export declare interface SchedulingWorkspaceProps {
|
|
675
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;
|
|
676
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;
|
|
677
775
|
}
|
|
678
776
|
|
|
679
777
|
/**
|
|
@@ -689,8 +787,8 @@ export declare function searchScheduleCandidates(medplum: MedplumClient, service
|
|
|
689
787
|
|
|
690
788
|
export declare interface SearchScheduleCandidatesOptions {
|
|
691
789
|
/** Which of the service's actors to offer. */
|
|
692
|
-
readonly
|
|
693
|
-
/** What the user typed. Empty offers whatever the
|
|
790
|
+
readonly actorType: SchedulingActorType;
|
|
791
|
+
/** What the user typed. Empty offers whatever the actor type has, unfiltered by name. */
|
|
694
792
|
readonly query: string;
|
|
695
793
|
/**
|
|
696
794
|
* The site being booked at. Actors sited elsewhere are left out: a room or a
|
|
@@ -738,10 +836,28 @@ export declare interface ServiceDefaultEditorProps extends CommonProps {
|
|
|
738
836
|
*/
|
|
739
837
|
export declare function setScheduleAvailability(schedule: Schedule, service: WithId<HealthcareService>, availableTime: HealthcareServiceAvailableTime[]): Schedule;
|
|
740
838
|
|
|
839
|
+
/**
|
|
840
|
+
* Returns the first instant of a day, so that a range opens at the top of it.
|
|
841
|
+
* @param date - Any instant during the day.
|
|
842
|
+
* @returns Local midnight at the start of that day.
|
|
843
|
+
*/
|
|
844
|
+
export declare function startOfDay(date: Date): Date;
|
|
845
|
+
|
|
741
846
|
export declare type TimeOfDay = 'any' | 'morning' | 'afternoon';
|
|
742
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
|
+
|
|
743
855
|
/**
|
|
744
856
|
* Searches for the times an appointment could be held at.
|
|
857
|
+
*
|
|
858
|
+
* A window `$find` would refuse is caught here rather than sent: this is the layer that
|
|
859
|
+
* decides whether the request is made, so it is the layer that says why it was not.
|
|
860
|
+
*
|
|
745
861
|
* @param options - The service, actor combinations, days, and page size.
|
|
746
862
|
* @returns The times offered, plus load and error state.
|
|
747
863
|
*/
|
|
@@ -768,6 +884,8 @@ export declare interface UseProposedAppointmentsResult {
|
|
|
768
884
|
readonly loading: boolean;
|
|
769
885
|
/** Set only when every combination failed. */
|
|
770
886
|
readonly error: Error | undefined;
|
|
887
|
+
/** A window `$find` will not answer, caught before the request is made. */
|
|
888
|
+
readonly windowError: string | undefined;
|
|
771
889
|
}
|
|
772
890
|
|
|
773
891
|
/**
|
package/dist/esm/index.css
CHANGED
|
@@ -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}.AppointmentFinder_form{flex:1 1 300px;min-width:0;max-width:420px}.AppointmentFinder_results{flex:1 1 380px;min-width: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_interactiveEvent,.CalendarBase_selectableDay{cursor:pointer}.CalendarBase_selectableDay:hover{background-color:light-dark(#0000000a,#ffffff14)}.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;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 */
|