@nylas/web-elements 1.3.2 → 1.3.3
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/cdn/checkbox-component/checkbox-component.es.js +48 -38
- package/dist/cdn/multi-select-dropdown/multi-select-dropdown.es.js +554 -535
- package/dist/cdn/nylas-additional-participants/nylas-additional-participants.es.js +2 -2
- package/dist/cdn/nylas-booking-form/nylas-booking-form.es.js +25 -9
- package/dist/cdn/nylas-booking-form-config/nylas-booking-form-config.es.js +2182 -2171
- package/dist/cdn/nylas-buffer-time/nylas-buffer-time.es.js +13 -14
- package/dist/cdn/nylas-calendar-picker/nylas-calendar-picker.es.js +571 -552
- package/dist/cdn/nylas-connected-calendars/nylas-connected-calendars.es.js +26 -7
- package/dist/cdn/nylas-customize-booking-settings/nylas-customize-booking-settings.es.js +12 -2
- package/dist/cdn/nylas-date-component/nylas-date-component.es.js +13 -7
- package/dist/cdn/nylas-editor-tabs/nylas-editor-tabs.es.js +3550 -3473
- package/dist/cdn/nylas-event-location/nylas-event-location.es.js +633 -621
- package/dist/cdn/nylas-limit-future-bookings/nylas-limit-future-bookings.es.js +25 -2
- package/dist/cdn/nylas-min-booking-notice/nylas-min-booking-notice.es.js +25 -2
- package/dist/cdn/nylas-min-cancellation-notice/nylas-min-cancellation-notice.es.js +163 -140
- package/dist/cdn/nylas-page-styling/nylas-page-styling.es.js +5 -3
- package/dist/cdn/nylas-participants-custom-availability/nylas-participants-custom-availability.es.js +4 -3
- package/dist/cdn/nylas-provider/nylas-provider.es.js +1 -1
- package/dist/cdn/nylas-scheduler-editor/nylas-scheduler-editor.es.js +173 -96
- package/dist/cdn/nylas-scheduling/nylas-scheduling.es.js +28 -12
- package/dist/cdn/scheduler-store/scheduler-store.es.js +1 -1
- package/dist/cdn/time-period-selector/time-period-selector.es.js +25 -2
- package/dist/cjs/calendar-agenda-fill-icon_53.cjs.entry.js +88 -57
- package/dist/cjs/calendar-agenda-fill-icon_53.cjs.entry.js.map +1 -1
- package/dist/cjs/checkbox-component.cjs.entry.js +9 -1
- package/dist/cjs/checkbox-component.cjs.entry.js.map +1 -1
- package/dist/cjs/checkbox-component_3.cjs.entry.js +21 -8
- package/dist/cjs/checkbox-component_3.cjs.entry.js.map +1 -1
- package/dist/cjs/google-logo-icon_4.cjs.entry.js +2 -2
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/multi-select-dropdown.cjs.entry.js +19 -1
- package/dist/cjs/multi-select-dropdown.cjs.entry.js.map +1 -1
- package/dist/cjs/nylas-additional-participants.cjs.entry.js +1 -1
- package/dist/cjs/nylas-additional-participants.cjs.entry.js.map +1 -1
- package/dist/cjs/nylas-booking-form-config.cjs.entry.js +34 -27
- package/dist/cjs/nylas-booking-form-config.cjs.entry.js.map +1 -1
- package/dist/cjs/nylas-buffer-time.cjs.entry.js +13 -12
- package/dist/cjs/nylas-buffer-time.cjs.entry.js.map +1 -1
- package/dist/cjs/nylas-connected-calendars.cjs.entry.js +2 -2
- package/dist/cjs/nylas-connected-calendars.cjs.entry.js.map +1 -1
- package/dist/cjs/nylas-date-component.cjs.entry.js +12 -7
- package/dist/cjs/nylas-date-component.cjs.entry.js.map +1 -1
- package/dist/cjs/nylas-editor-tabs.cjs.entry.js +2 -2
- package/dist/cjs/nylas-event-location.cjs.entry.js +32 -11
- package/dist/cjs/nylas-event-location.cjs.entry.js.map +1 -1
- package/dist/cjs/nylas-page-styling.cjs.entry.js +3 -2
- package/dist/cjs/nylas-page-styling.cjs.entry.js.map +1 -1
- package/dist/cjs/nylas-participants-custom-availability.cjs.entry.js +3 -2
- package/dist/cjs/nylas-participants-custom-availability.cjs.entry.js.map +1 -1
- package/dist/cjs/nylas-provider.cjs.entry.js +1 -1
- package/dist/cjs/nylas-scheduling.cjs.entry.js +3 -3
- package/dist/cjs/nylas-web-elements.cjs.js +1 -1
- package/dist/cjs/{scheduler-store-37a0e152.js → scheduler-store-2cd220d1.js} +2 -2
- package/dist/cjs/{scheduler-store-37a0e152.js.map → scheduler-store-2cd220d1.js.map} +1 -1
- package/dist/cjs/{scheduler-store-373adf03.js → scheduler-store-70af2279.js} +2 -2
- package/dist/cjs/{scheduler-store-373adf03.js.map → scheduler-store-70af2279.js.map} +1 -1
- package/dist/cjs/time-period-selector.cjs.entry.js +21 -1
- package/dist/cjs/time-period-selector.cjs.entry.js.map +1 -1
- package/dist/collection/components/design-system/checkbox-component/checkbox-component.js +12 -1
- package/dist/collection/components/design-system/checkbox-component/checkbox-component.js.map +1 -1
- package/dist/collection/components/design-system/multi-select-dropdown/multi-select-dropdown.js +22 -1
- package/dist/collection/components/design-system/multi-select-dropdown/multi-select-dropdown.js.map +1 -1
- package/dist/collection/components/design-system/nylas-date-component/nylas-date-component.js +14 -8
- package/dist/collection/components/design-system/nylas-date-component/nylas-date-component.js.map +1 -1
- package/dist/collection/components/design-system/nylas-date-component/test/nylas-date-component.spec.js +39 -0
- package/dist/collection/components/design-system/nylas-date-component/test/nylas-date-component.spec.js.map +1 -0
- package/dist/collection/components/design-system/time-period-selector/time-period-selector.js +28 -1
- package/dist/collection/components/design-system/time-period-selector/time-period-selector.js.map +1 -1
- package/dist/collection/components/scheduler/nylas-date-picker/test/nylas-date-picker.spec.js +3 -1
- package/dist/collection/components/scheduler/nylas-date-picker/test/nylas-date-picker.spec.js.map +1 -1
- package/dist/collection/components/scheduler-editor/nylas-additional-participants/nylas-additional-participants.js +1 -1
- package/dist/collection/components/scheduler-editor/nylas-additional-participants/nylas-additional-participants.js.map +1 -1
- package/dist/collection/components/scheduler-editor/nylas-booking-form-config/nylas-booking-form-config.js +36 -27
- package/dist/collection/components/scheduler-editor/nylas-booking-form-config/nylas-booking-form-config.js.map +1 -1
- package/dist/collection/components/scheduler-editor/nylas-booking-form-config/test/nylas-booking-form-config.spec.js +23 -0
- package/dist/collection/components/scheduler-editor/nylas-booking-form-config/test/nylas-booking-form-config.spec.js.map +1 -1
- package/dist/collection/components/scheduler-editor/nylas-buffer-time/nylas-buffer-time.js +13 -12
- package/dist/collection/components/scheduler-editor/nylas-buffer-time/nylas-buffer-time.js.map +1 -1
- package/dist/collection/components/scheduler-editor/nylas-calendar-picker/test/nylas-calendar-picker.spec.js +13 -0
- package/dist/collection/components/scheduler-editor/nylas-calendar-picker/test/nylas-calendar-picker.spec.js.map +1 -1
- package/dist/collection/components/scheduler-editor/nylas-connected-calendars/nylas-connected-calendars.js +2 -2
- package/dist/collection/components/scheduler-editor/nylas-connected-calendars/nylas-connected-calendars.js.map +1 -1
- package/dist/collection/components/scheduler-editor/nylas-event-location/nylas-event-location.js +35 -10
- package/dist/collection/components/scheduler-editor/nylas-event-location/nylas-event-location.js.map +1 -1
- package/dist/collection/components/scheduler-editor/nylas-page-styling/nylas-page-styling.js +4 -1
- package/dist/collection/components/scheduler-editor/nylas-page-styling/nylas-page-styling.js.map +1 -1
- package/dist/collection/components/scheduler-editor/nylas-participants-custom-availability/nylas-participants-custom-availability.js +3 -2
- package/dist/collection/components/scheduler-editor/nylas-participants-custom-availability/nylas-participants-custom-availability.js.map +1 -1
- package/dist/components/checkbox-component2.js +12 -2
- package/dist/components/checkbox-component2.js.map +1 -1
- package/dist/components/multi-select-dropdown2.js +22 -2
- package/dist/components/multi-select-dropdown2.js.map +1 -1
- package/dist/components/nylas-additional-participants2.js +1 -1
- package/dist/components/nylas-additional-participants2.js.map +1 -1
- package/dist/components/nylas-booking-form-config2.js +35 -27
- package/dist/components/nylas-booking-form-config2.js.map +1 -1
- package/dist/components/nylas-buffer-time2.js +13 -12
- package/dist/components/nylas-buffer-time2.js.map +1 -1
- package/dist/components/nylas-connected-calendars2.js +2 -2
- package/dist/components/nylas-connected-calendars2.js.map +1 -1
- package/dist/components/nylas-date-component2.js +14 -8
- package/dist/components/nylas-date-component2.js.map +1 -1
- package/dist/components/nylas-editor-tabs2.js +2 -2
- package/dist/components/nylas-event-location2.js +35 -12
- package/dist/components/nylas-event-location2.js.map +1 -1
- package/dist/components/nylas-page-styling2.js +5 -3
- package/dist/components/nylas-page-styling2.js.map +1 -1
- package/dist/components/nylas-participants-custom-availability2.js +3 -2
- package/dist/components/nylas-participants-custom-availability2.js.map +1 -1
- package/dist/components/nylas-scheduling.js +2 -2
- package/dist/components/scheduler-store.js +1 -1
- package/dist/components/time-period-selector2.js +26 -2
- package/dist/components/time-period-selector2.js.map +1 -1
- package/dist/esm/calendar-agenda-fill-icon_53.entry.js +88 -57
- package/dist/esm/calendar-agenda-fill-icon_53.entry.js.map +1 -1
- package/dist/esm/checkbox-component.entry.js +9 -1
- package/dist/esm/checkbox-component.entry.js.map +1 -1
- package/dist/esm/checkbox-component_3.entry.js +21 -8
- package/dist/esm/checkbox-component_3.entry.js.map +1 -1
- package/dist/esm/google-logo-icon_4.entry.js +2 -2
- package/dist/esm/loader.js +1 -1
- package/dist/esm/multi-select-dropdown.entry.js +19 -1
- package/dist/esm/multi-select-dropdown.entry.js.map +1 -1
- package/dist/esm/nylas-additional-participants.entry.js +1 -1
- package/dist/esm/nylas-additional-participants.entry.js.map +1 -1
- package/dist/esm/nylas-booking-form-config.entry.js +34 -27
- package/dist/esm/nylas-booking-form-config.entry.js.map +1 -1
- package/dist/esm/nylas-buffer-time.entry.js +13 -12
- package/dist/esm/nylas-buffer-time.entry.js.map +1 -1
- package/dist/esm/nylas-connected-calendars.entry.js +2 -2
- package/dist/esm/nylas-connected-calendars.entry.js.map +1 -1
- package/dist/esm/nylas-date-component.entry.js +12 -7
- package/dist/esm/nylas-date-component.entry.js.map +1 -1
- package/dist/esm/nylas-editor-tabs.entry.js +2 -2
- package/dist/esm/nylas-event-location.entry.js +32 -11
- package/dist/esm/nylas-event-location.entry.js.map +1 -1
- package/dist/esm/nylas-page-styling.entry.js +3 -2
- package/dist/esm/nylas-page-styling.entry.js.map +1 -1
- package/dist/esm/nylas-participants-custom-availability.entry.js +3 -2
- package/dist/esm/nylas-participants-custom-availability.entry.js.map +1 -1
- package/dist/esm/nylas-provider.entry.js +1 -1
- package/dist/esm/nylas-scheduling.entry.js +3 -3
- package/dist/esm/nylas-web-elements.js +1 -1
- package/dist/esm/{scheduler-store-20151a77.js → scheduler-store-3acf4d70.js} +2 -2
- package/dist/esm/{scheduler-store-20151a77.js.map → scheduler-store-3acf4d70.js.map} +1 -1
- package/dist/esm/{scheduler-store-b6d12f40.js → scheduler-store-79dc16cc.js} +2 -2
- package/dist/esm/{scheduler-store-b6d12f40.js.map → scheduler-store-79dc16cc.js.map} +1 -1
- package/dist/esm/time-period-selector.entry.js +21 -1
- package/dist/esm/time-period-selector.entry.js.map +1 -1
- package/dist/nylas-web-elements/checkbox-component.entry.js +9 -1
- package/dist/nylas-web-elements/checkbox-component.entry.js.map +1 -1
- package/dist/nylas-web-elements/multi-select-dropdown.entry.js +19 -1
- package/dist/nylas-web-elements/multi-select-dropdown.entry.js.map +1 -1
- package/dist/nylas-web-elements/nylas-additional-participants.entry.js +1 -1
- package/dist/nylas-web-elements/nylas-additional-participants.entry.js.map +1 -1
- package/dist/nylas-web-elements/nylas-booking-form-config.entry.js +34 -27
- package/dist/nylas-web-elements/nylas-booking-form-config.entry.js.map +1 -1
- package/dist/nylas-web-elements/nylas-buffer-time.entry.js +13 -12
- package/dist/nylas-web-elements/nylas-buffer-time.entry.js.map +1 -1
- package/dist/nylas-web-elements/nylas-connected-calendars.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-connected-calendars.entry.js.map +1 -1
- package/dist/nylas-web-elements/nylas-date-component.entry.js +12 -7
- package/dist/nylas-web-elements/nylas-date-component.entry.js.map +1 -1
- package/dist/nylas-web-elements/nylas-editor-tabs.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-event-location.entry.js +32 -11
- package/dist/nylas-web-elements/nylas-event-location.entry.js.map +1 -1
- package/dist/nylas-web-elements/nylas-page-styling.entry.js +3 -2
- package/dist/nylas-web-elements/nylas-page-styling.entry.js.map +1 -1
- package/dist/nylas-web-elements/nylas-participants-custom-availability.entry.js +3 -2
- package/dist/nylas-web-elements/nylas-participants-custom-availability.entry.js.map +1 -1
- package/dist/nylas-web-elements/nylas-provider.entry.js +1 -1
- package/dist/nylas-web-elements/nylas-scheduling.entry.js +3 -3
- package/dist/nylas-web-elements/nylas-web-elements.esm.js +1 -1
- package/dist/nylas-web-elements/p-040b8553.entry.js +2 -0
- package/dist/nylas-web-elements/p-040b8553.entry.js.map +1 -0
- package/dist/nylas-web-elements/p-13a83f9a.entry.js +8 -0
- package/dist/nylas-web-elements/p-13a83f9a.entry.js.map +1 -0
- package/dist/nylas-web-elements/p-1a9fc29a.entry.js +2 -0
- package/dist/nylas-web-elements/p-1a9fc29a.entry.js.map +1 -0
- package/dist/nylas-web-elements/{p-e543a827.entry.js → p-1dedce7c.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-284c14bb.js → p-53f7b360.js} +2 -2
- package/dist/nylas-web-elements/p-7f100474.entry.js +2 -0
- package/dist/nylas-web-elements/p-7f100474.entry.js.map +1 -0
- package/dist/nylas-web-elements/{p-70d36207.entry.js → p-84e69241.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-36c73819.entry.js → p-ad7f8831.entry.js} +2 -2
- package/dist/nylas-web-elements/{scheduler-store-b6d12f40.js → scheduler-store-79dc16cc.js} +2 -2
- package/dist/nylas-web-elements/{scheduler-store-b6d12f40.js.map → scheduler-store-79dc16cc.js.map} +1 -1
- package/dist/nylas-web-elements/time-period-selector.entry.js +21 -1
- package/dist/nylas-web-elements/time-period-selector.entry.js.map +1 -1
- package/dist/types/components/design-system/checkbox-component/checkbox-component.d.ts +1 -0
- package/dist/types/components/design-system/multi-select-dropdown/multi-select-dropdown.d.ts +2 -0
- package/dist/types/components/design-system/nylas-date-component/nylas-date-component.d.ts +1 -0
- package/dist/types/components/design-system/time-period-selector/time-period-selector.d.ts +3 -0
- package/dist/types/components/scheduler-editor/nylas-booking-form-config/nylas-booking-form-config.d.ts +2 -0
- package/dist/types/components/scheduler-editor/nylas-buffer-time/nylas-buffer-time.d.ts +2 -0
- package/dist/types/components/scheduler-editor/nylas-event-location/nylas-event-location.d.ts +3 -0
- package/dist/types/components/scheduler-editor/nylas-participants-custom-availability/nylas-participants-custom-availability.d.ts +2 -2
- package/package.json +1 -1
- package/dist/nylas-web-elements/p-2fa604d7.entry.js +0 -2
- package/dist/nylas-web-elements/p-2fa604d7.entry.js.map +0 -1
- package/dist/nylas-web-elements/p-52b9c0cb.entry.js +0 -2
- package/dist/nylas-web-elements/p-52b9c0cb.entry.js.map +0 -1
- package/dist/nylas-web-elements/p-9db69aed.entry.js +0 -2
- package/dist/nylas-web-elements/p-9db69aed.entry.js.map +0 -1
- package/dist/nylas-web-elements/p-a1a75dc7.entry.js +0 -8
- package/dist/nylas-web-elements/p-a1a75dc7.entry.js.map +0 -1
- /package/dist/nylas-web-elements/{p-e543a827.entry.js.map → p-1dedce7c.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-284c14bb.js.map → p-53f7b360.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-70d36207.entry.js.map → p-84e69241.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-36c73819.entry.js.map → p-ad7f8831.entry.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["iconCss","CalendarAgendaFillIconStyle0","CalendarAgendaFillIcon","render","h","key","width","this","height","fill","xmlns","d","CalendarAgendaIconStyle0","CalendarAgendaIcon","CalendarInfoIconStyle0","CalendarInfoIcon","CalendarPatternsIconStyle0","CalendarPatternsIcon","CheckmarkIconStyle0","CheckmarkIcon","viewBox","DragableIconStyle0","DragableIcon","EnvelopeFillIconStyle0","EnvelopeFillIcon","EnvelopeIconStyle0","EnvelopeIcon","EyeIconStyle0","EyeIcon","FeedbackIconStyle0","FeedbackIcon","stroke","FlowIconStyle0","FlowIcon","GoogleMeetIconStyle0","GoogleMeetIcon","id","inputImageUrlCss","InputImageUrlStyle0","InputImageUrl","componentType","imageUrl","connectedCallback","debug","disconnectedCallback","componentWillLoad","host","setAttribute","name","componentDidLoad","currentImageUrl","setImage","componentWillUpdate","componentDidUpdate","componentWillRender","componentDidRender","elementNameChangedHandler","newValue","nylasFormInputChangedHandler","event","value","detail","nylasFormInputBlurHandler","errorMessage","isValidImage","then","internals","setValidity","setFormValue","valueChanged","emit","catch","nylasFormInputImageUrlInvalid","customError","Host","class","type","required","exportparts","defaultValue","src","alt","__decorate","RegisterComponent","eventToProps","async","_nylasSchedulerConfigConnector","LocationIconStyle0","LocationIcon","LocationOffIconStyle0","LocationOffIcon","MicrosoftTeamsIconStyle0","opacity","x1","y1","x2","y2","gradientUnits","offset","nylasAdditionalParticipantsCss","NylasAdditionalParticipantsStyle0","NylasAdditionalParticipants","eventParticipants","selectedConfigurationAndCurrentUserChangedHandler","_oldValue","propName","currentUser","updateState","selectedConfiguration","selectedConfig","isRoundRobinConfig","availability","availability_rules","availability_method","participants","includeOrganizerAsParticipant","find","p","email","updateOrganizerAsParticipant","isInternalsAvailable","undefined","onInputOptionChanged","EMAIL_REGEX","index","participant","participantOptions","participantErrors","is_valid","test","calendars","calendar_ids","booking","calendar_id","updateFormValue","findCurrentUserInParticipants","bookingCalendarDefault","currentUserCalendars","calendar","is_primary","is_organizer","addParticipant","removeParticipant","filter","_","i","length","error","JSON","stringify","getArrayDifference","array1","array2","filtered","participant1","some","participant2","map","label","part","slot","organizer","readOnly","onClick","checked","htmlFor","filterable","inputValue","options","stateToProps","Map","fireRegisterEvent","nylasAvailabilityPickerCss","NylasAvailabilityPickerStyle0","NylasAvailabilityPicker","Intl","DateTimeFormat","resolvedOptions","timeZone","SUN","MON","start","end","TUE","WED","THU","FRI","SAT","configChangedHandler","newConfig","defaultOpenHours","default_open_hours","DEFAULT_OPEN_HOURS","defaultOpenHoursTimezone","event_booking","timezone","defaultTimezone","openHours","openHoursToSchedule","scheduleChanged","oldValue","overlapDays","Object","keys","forEach","dayTimeRanges","overlaps","getOverlaps","element","shadowRoot","getElementById","scheduleToOpenHours","schedule","nylasFormDropdownChangedHandler","updateValue","timeRanges","timeRangesInMinutes","range","timeToMinutes","originalIndex","sort","a","b","includes","push","addTimeRange","day","currentTimeRanges","dayStart","dayEnd","lastRangeEnd","convertTo12HourFormat","minutesToTime","gapFound","currentEnd","nextStart","removeTimeRange","splice","setTime","dayIndex","timeType","split","setFormError","newSchedule","openHour","days","dayKey","getDayKey","start12hr","end12hr","timeRange","timeRangeExists","dayKeys","openHoursMap","start24hr","convertTo24HourFormat","end24hr","has","set","entry","get","selectedOpenHours","_key","timezoneOptions","TIMEZONE_MAP","selectedTimezoneOption","hideHeader","defaultSelectedOption","timeRangeIndex","startKey","endKey","hasError","time","minimumStartTime","nylasBookingCalendarPickerCss","NylasBookingCalendarPickerStyle0","NylasBookingCalendarPicker","primaryCalendar","firstCalendar","defaultBookingCalendar","toString","selectedCalendar","currentUserCalendarsChangedHandler","currentUserCalendarOptions","optionsFromCalendars","calendarOptions","defaultOption","cal","withSearch","expressFlow","emptyValue","nylasBookingConfirmationRedirectCss","NylasBookingConfirmationRedirectStyle0","NylasBookingConfirmationRedirect","selectedConfigurationChangedHandler","scheduler","confirmation_redirect_url","currentRedirectUrl","acceptUrl","redirectUrl","componentLoaded","redirectUrlErrorMessage","isValidUrl","formSubmittedHandler","_event","redirectOptions","option","placeholder","nylasBookingConfirmationTypeCss","NylasBookingConfirmationTypeStyle0","NylasBookingConfirmationType","booking_type","selectedBookingType","showDropdown","organizer_confirmation_url","bookingType","showComponent","bookingOptions","ownKeys","object","enumerableOnly","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","enumerable","apply","_objectSpread2","target","arguments","source","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_typeof","obj","Symbol","iterator","constructor","prototype","configurable","writable","_extends","assign","hasOwnProperty","call","_objectWithoutPropertiesLoose","excluded","sourceKeys","indexOf","_objectWithoutProperties","sourceSymbolKeys","propertyIsEnumerable","version","userAgent","pattern","window","navigator","match","IE11OrLess","Edge","FireFox","Safari","IOS","ChromeForAndroid","captureMode","capture","passive","on","el","fn","addEventListener","off","removeEventListener","matches","selector","substring","msMatchesSelector","webkitMatchesSelector","getParentOrHost","document","nodeType","parentNode","closest","ctx","includeCTX","R_SPACE","toggleClass","state","classList","className","replace","css","prop","val","style","defaultView","getComputedStyle","currentStyle","matrix","selfOnly","appliedTransforms","transform","matrixFn","DOMMatrix","WebKitCSSMatrix","CSSMatrix","MSCSSMatrix","tagName","list","getElementsByTagName","n","getWindowScrollingElement","scrollingElement","documentElement","getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","container","getBoundingClientRect","elRect","top","left","bottom","right","innerHeight","innerWidth","containerRect","parseInt","elMatrix","scaleX","scaleY","isScrolledPast","elSide","parentSide","parent","getParentAutoScrollElement","elSideVal","parentSideVal","visible","getChild","childNum","includeDragEl","currentChild","children","display","Sortable","ghost","dragged","draggable","lastChild","last","lastElementChild","previousElementSibling","nodeName","toUpperCase","clone","getRelativeScrollOffset","offsetLeft","offsetTop","winScroller","scrollLeft","scrollTop","indexOfObject","arr","Number","includeSelf","elem","gotSelf","clientWidth","scrollWidth","clientHeight","scrollHeight","elemCSS","overflowX","overflowY","body","extend","dst","isRectEqual","rect1","rect2","Math","round","_throttleTimeout","throttle","callback","ms","args","_this","setTimeout","cancelThrottle","clearTimeout","scrollBy","x","y","Polymer","$","jQuery","Zepto","dom","cloneNode","getChildContainingRectFromElement","ghostEl","rect","Array","from","child","_rect$left","_rect$top","_rect$right","_rect$bottom","animated","childRect","min","Infinity","max","expando","Date","getTime","AnimationStateManager","animationStates","animationCallbackId","captureAnimationState","animation","slice","fromRect","thisAnimationDuration","childMatrix","f","e","addAnimationState","removeAnimationState","animateAll","animating","animationTime","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","calculateRealTime","animate","animationResetTimer","currentRect","duration","translateX","translateY","animatingX","animatingY","forRepaintDummy","repaint","easing","offsetWidth","sqrt","pow","plugins","defaults","initializeByDefault","PluginManager","mount","plugin","pluginName","concat","pluginEvent","eventName","sortable","evt","eventCanceled","cancel","eventNameGlobal","initializePlugins","initialized","modified","modifyOption","getEventProperties","eventProperties","modifiedValue","optionListeners","dispatchEvent","_ref","rootEl","targetEl","cloneEl","toEl","fromEl","oldIndex","newIndex","oldDraggableIndex","newDraggableIndex","originalEvent","putSortable","extraEventProperties","onName","charAt","substr","CustomEvent","bubbles","cancelable","createEvent","initEvent","to","item","pullMode","lastPutMode","allEventProperties","_excluded","data","bind","dragEl","parentEl","nextEl","lastDownEl","cloneHidden","dragStarted","moved","activeSortable","active","hideGhostForTarget","_hideGhostForTarget","unhideGhostForTarget","_unhideGhostForTarget","cloneNowHidden","cloneNowShown","dispatchSortableEvent","_dispatchEvent","info","activeGroup","awaitingDragStarted","ignoreNextClick","sortables","tapEvt","touchEvt","lastDx","lastDy","tapDistanceLeft","tapDistanceTop","lastTarget","lastDirection","pastFirstInvertThresh","isCircumstantialInvert","targetMoveDistance","ghostRelativeParent","ghostRelativeParentInitialScroll","_silent","savedInputChecked","documentExists","PositionGhostAbsolutely","CSSFloatProperty","supportDraggable","createElement","supportCssPointerEvents","cssText","pointerEvents","_detectDirection","elCSS","elWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","marginLeft","marginRight","secondChildWidth","flexDirection","gridTemplateColumns","touchingSideChild2","clear","_dragElInRowColumn","dragRect","targetRect","vertical","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","_detectNearestEmptySortable","ret","threshold","emptyInsertThreshold","insideHorizontally","insideVertically","_prepareGroup","toFn","pull","sameGroup","group","otherGroup","join","originalGroup","checkPull","checkPut","put","revertClone","preventDefault","stopPropagation","stopImmediatePropagation","nearestEmptyInsertDetectEvent","touches","nearest","clientX","clientY","_onDragOver","_checkOutsideTargetEl","_isOutsideThisEl","disabled","store","handle","swapThreshold","invertSwap","invertedSwapThreshold","removeCloneOnHide","direction","ghostClass","chosenClass","dragClass","ignore","preventOnFilter","setData","dataTransfer","textContent","dropBubble","dragoverBubble","dataIdAttr","delay","delayOnTouchOnly","touchStartThreshold","devicePixelRatio","forceFallback","fallbackClass","fallbackOnBody","fallbackTolerance","fallbackOffset","supportPointer","nativeDraggable","_onTapStart","contains","_getDirection","touch","pointerType","originalTarget","path","composedPath","_saveInputCheckedState","button","isContentEditable","criteria","trim","_prepareDragStart","ownerDocument","dragStartFn","nextSibling","_lastX","_lastY","_onDrop","_disableDelayedDragEvents","_triggerDragStart","_disableDraggable","_disableDelayedDrag","_delayedDragTouchMoveHandler","_dragStartTimer","abs","floor","_onTouchMove","_onDragStart","selection","_nextTick","empty","getSelection","removeAllRanges","err","_dragStarted","fallback","_appendGhost","_nulling","_emulateDragOver","elementFromPoint","inserted","ghostMatrix","relativeScrollOffset","dx","dy","c","cssMatrix","appendChild","removeAttribute","_hideClone","cloneId","insertBefore","_loopId","setInterval","effectAllowed","_dragStartId","revert","isOwner","canSort","fromSortable","completedFired","dragOverEvent","extra","axis","completed","onMove","after","_onMove","changed","insertion","_showClone","_ignoreWhileAnimating","elLastChild","_ghostIsLast","_ghostIsFirst","firstChild","targetBeforeFirstSwap","differentLevel","differentRowCol","side1","scrolledPastTop","scrollBefore","_getSwapDirection","sibling","dragIndex","nextElementSibling","moveVector","_unsilent","_offMoveEvents","_offUpEvents","clearInterval","_cancelNextTick","removeChild","save","handleEvent","_globalDragOver","toArray","order","getAttribute","_generateId","useAnimation","items","closest$1","destroy","querySelectorAll","dropEffect","willInsertAfter","onMoveFn","retVal","draggedRect","related","relatedRect","firstElRect","childContainingRect","spacer","lastElRect","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","_getInsertDirection","str","href","sum","charCodeAt","root","inputs","idx","utils","is","nextTick","cancelNextTick","detectDirection","_len","create","autoScrolls","scrollEl","scrollRootEl","scrolling","lastAutoScrollX","lastAutoScrollY","touchEvt$1","pointerElemChangedInterval","AutoScrollPlugin","AutoScroll","scroll","forceAutoScrollFallback","scrollSensitivity","scrollSpeed","bubbleScroll","_handleAutoScroll","_handleFallbackAutoScroll","dragOverCompleted","_ref2","dragOverBubble","drop","clearPointerElemChangedInterval","clearAutoScrolls","nulling","autoScroll","ogElemScroller","newElem","pid","isFallback","sens","speed","scrollThisInstance","scrollCustomFn","scrollFn","layersOut","currentParent","canScrollX","canScrollY","scrollPosX","scrollPosY","vx","vy","layer","scrollOffsetY","scrollOffsetX","toSortable","changedTouches","onSpill","Revert","startIndex","dragStart","_ref3","Remove","_ref4","parentSortable","nylasBookingFormConfigCss","NylasBookingFormConfigStyle0","staticFields","typeLabel","readonly","isOpen","NylasBookingFormConfig","updateFormFields","formFields","config","additionalFields","entries","additional_fields","field","fieldType","FIELD_TYPES","swap","swapClass","onEnd","swapFields","watchHandler","sortedFields","default","addFieldsMap","reduce","acc","findNextMissingNumber","numbers","parts","lastPart","pop","parsedNumber","isNaN","num","maxOrder","existingFieldKeys","next","newField","startsWith","fieldIndex","fieldDefaultValueChanged","optionIndex","fieldOptionChange","fieldLabelChange","newArray","fieldToggle","fieldRemove","fieldRequired","ind","fieldCopy","existingKey","indexNumber","fieldOptionAdd","fieldOptionRemove","o","DEFAULT_FORM_FIELD_TYPES","withChevron","dropdownButtonText","j","nylasBufferTimeCss","NylasBufferTimeStyle0","NylasBufferTime","buffer","before","selectedBeforeBufferTime","selectedAfterBufferTime","bufferTime","renderPreview","totalSlots","slotHeight","eventSlotHeight","slotFill","minutes","fullSlots","partialFillHeight","createBeforeSlots","isActive","isPartial","slotStyle","backgroundColor","background","createAfterSlots","minuteOptions","nylasCalendarPickerCss","NylasCalendarPickerStyle0","NylasCalendarPicker","defaultSelectedCalendars","selectedOptionsChangedHandler","valueChangedHandler","selectedCalendars","selected","nylasCancellationPolicyCss","NylasCancellationPolicyStyle0","NylasCancellationPolicy","message","cancellation_policy","cancellationPolicy","handleChange","sanitize","maxlength","onInput","nylasConfirmationEmailCss","NylasConfirmationEmailStyle0","NylasConfirmationEmail","confirmationEmail","confirmationEmailTemplate","show_nylas_branding","isConfirmationEmailOpen","participantsState","email_template","reminders","nylasFormInputChangeHandler","booking_confirmed","title","handleEmailBodyChange","logo","nylasFormInputImageUrlInvalidHandler","nyalsFormSwitchToggledHandler","updateConfirmationFormValue","toggleConfirmationEmail","organizerName","variant","clickHandler","maxLength","tooltip","nylasConnectedCalendarsCss","NylasConnectedCalendarsStyle0","NylasConnectedCalendars","setParticipants","calendarsChangedHandler","participantCalendars","getParticipantCalendarOptions","participantsChangedHandler","participantOptionsChangedHandler","addedParticipants","availableParticipantOptions","availableParticipant","remainingParticipants","participantOption","participantDefaultSelectedCalendars","calendarId","handleValueChanged","connectedCalendarsFormRef","checkValidity","participantsCalendars","selectedParticipants","ref","nylasCustomBookingFlowCss","NylasCustomBookingFlowStyle0","NylasCustomBookingFlow","checkForMissingSlots","nylasCustomEventSlugCss","NylasCustomEventSlugStyle0","NylasCustomEventSlug","console","log","urlSlug","defaultUrlSlug","slug","nylasFormInputFocusHandler","focus","slugErrorMessage","requiresSlug","toggleDrawer","copyToClipboard","clipboard","writeText","copied","isComponentReady","icon","nylasCustomizeBookingSettingsCss","NylasCustomizeBookingSettingsStyle0","NylasCustomizeBookingSettings","hide_additional_guests","hide_cancellation_options","hide_rescheduling_options","allowGuestsToInvite","hideCancellationOptions","hideReschedulingOptions","defaultHideAdditionalGuests","defaultHideCancellationOptions","defaultHideReschedulingOptions","checkboxToggledHandler","additionalGuestsHidden","nylasEventDescriptionCss","NylasEventDescriptionStyle0","NylasEventDescription","eventDescription","description","nylasEventDurationCss","NylasEventDurationStyle0","NylasEventDuration","eventDurationMinutes","newVal","configDuration","duration_minutes","durationMinutes","durationIncrement","durationMinutesChangedHandler","setDurationMintueOptions","durationMinutesOptions","inputOptionChangedHandler","durationOptions","defaultInputOption","pluralizedLabel","nylasEventInfoCss","NylasEventInfoStyle0","NylasEventInfo","nylasEventLimitsCss","NylasEventLimitsStyle0","NylasEventLimits","nylasEventLocationCss","NylasEventLocationStyle0","labels","none","custom","google","microsoft","zoom","NylasEventLocation","eventLocation","eventConferencing","setDefaultGrantID","userProvider","provider","labelHTML","getLabelHTML","configLocation","location","configConferencing","conferencing","selectedLocationOption","setDefaultLocationOption","grantId","currentUserChangedHandler","userProviderState","setLocationOptionsForProvider","conferenceProvidersChanged","locationOptions","conferenceProviders","payload","googleConfGrantId","PROVIDER_CONFERENCE_MAP","autocreate","conf_grant_id","microsoftConfGrantId","zoomConfGrantId","CONFERENCE_PROVIDER_MAP","getIcon","alignItems","gap","fontSize","fontWeight","nylasEventTitleCss","NylasEventTitleStyle0","NylasEventTitle","eventTitleTokens","token","availableTokens","$value","fullText","focusOffset","ariaActivedescendantChangedHandler","activeOption","add","remove","configEventTitle","updateEventTitleFromProp","eventTitle","validity","valid","validationError","titleRef","innerHTML","highlightTokens","outputHtml","tokenObj","regex","RegExp","getCurrentSelectionForBrowser","getSelectionTextData","nodeValue","node","allSelected","text","dollarIndex","lastIndexOf","lastWord","currentText","isAllSelected","anchorOffset","focusNode","currentBrowser","getBrowser","shadowRootSelection","focusNodeValue","anchorNodeValue","anchorNode","allSelectedFirefox","windowSelection","getComposedRanges","startContainer","allSelectedSafari","endOffset","warn","currentSelection","updateEventTitle","resetDropdown","showTokens","currentWord","populateSuggestionsDropdown","handleInputKeyDown","isNonPrintableKey","ariaActivedescendant","click","nextOption","filteredTokens","prevOption","selectOption","word","dollarWord","currentNode","textNode","currentNodeText","wordText","textBefore","textAfter","newTextNode","createTextNode","newRange","createRange","tagSpan","newTextNodeAfter","replaceWith","setStart","afterNode","sel","collapse","addRange","query","contentEditable","onKeyDown","tabindex","role","nylasFeedbackFormCss","NylasFeedbackFormStyle0","NylasFeedbackForm","handleConfirmBookingButtonClicked","validationEvent","triggerValidation","defaultPrevented","feedbackSubmitted","feedback","feedbackMessage","applyThemeConfig","themeConfig","setProperty","handleFormInputChanged","closeModal","feedbackModalClosed","i18next","t","rel","footer","_nylasSchedulerConnector","localPropsToProp","nylasLimitFutureBookingsCss","NylasLimitFutureBookingsStyle0","NylasLimitFutureBookings","daysInFuture","available_days_in_future","availableDaysInFuture","updateNumberAndPeriodFromDays","timePeriodChangedHandler","number","period","selectedNumber","selectedPeriod","showTImePeriodSelector","timePeriods","defaultSelectedNumber","defaultSelectedPeriod","nylasMinBookingNoticeCss","NylasMinBookingNoticeStyle0","NylasMinBookingNotice","minBookingNotice","min_booking_notice","updateNumberAndPeriodFromMinutes","totalMinutes","minutesInHour","minutesInDay","minutesInWeek","minutesInMonth","nylasMinCancellationNoticeCss","NylasMinCancellationNoticeStyle0","NylasMinCancellationNotice","minCancellationNotice","min_cancellation_notice","showTimePeriodSelector","nylasPageNameCss","NylasPageNameStyle0","NylasPageName","currentPageName","pageName","showToggle","nylasPageStylingCss","NylasPageStylingStyle0","NylasPageStyling","customInputsSlotChangedHandler","appearance","currentAppearance","updateInputDefaultValues","hasAttribute","selectedOption","parse","childNodes","Node","ELEMENT_NODE","cloneAndCopyProps","clonedElement","parsedOptions","clonedChild","TEXT_NODE","editor","querySelector","slotElement","divElement","slottedElements","assignedElements","flatten","bodyElement","slotContainer","customInputsSlot","checkIfElementIsInSlot","findElement","submit_button_label","thank_you_message","color","company_logo_url","radioChangedHandler","subsection","hide","nylasParticipantBookingCalendarsCss","NylasParticipantBookingCalendarsStyle0","NylasParticipantBookingCalendars","showAdditionalParticipantBookingCalendars","participantDefaultSelectedCalendar","bookingCalendarsFormRef","nylasParticipantsCustomAvailabilityCss","NylasParticipantsCustomAvailabilityStyle0","NylasParticipantsCustomAvailability","nylasFormSwitchToggledHandler","existingParticipant","existingOpenHours","open_hours","at","participantFormRef","jsonValue","participantOpenHours","setCustom","Boolean","nylasReminderEmailsCss","NylasReminderEmailsStyle0","NylasReminderEmails","eventReminders","updateRemindersFormValue","reminderIndex","updatedReminders","minutes_before_event","handleNylasFormDropdownChanged","recipient","handleNylasFormInputChanged","email_subject","addReminder","editing","deleteReminder","reminder","rem","formatReminderTime","reminderTime","recipientOptions","eventReminderTimeMinutes","nylasReminderTimeCss","NylasReminderTimeStyle0","reminderTimeOptions","getInitialTimeValue","timeInMinutes","getInitialTimeIncrement","NylasReminderTime","REMINDER_MINUTE_OPTIONS","reminderTimeMinutesChangedHandler","setReminderTimeMinuteOptions","reminderTimeincrement","reminderTimeMinutesOptions","REMINDER_HOUR_OPTIONS","REMINDER_DAY_OPTIONS","reminderTimeMinutes","nylasSchedulingMethodCss","NylasSchedulingMethodStyle0","NylasSchedulingMethod","bookingtType","bookingTypeOptions","defaultBookingType","hasAdditionalParticipants","nylasTimeslotIntervalCss","NylasTimeslotIntervalStyle0","defaultRoundToMinutes","NylasTimeslotInterval","internalEventDurationMinutes","internalIntervalMinutes","interval_minutes","selectedInterval","roundToMinutes","round_to","selectedRoundTo","interval","roundTo","nylasFormRadioChangedHandler","intervalPreferenceOptions","defaultSelectedInterval","op","defaultSelectedValue","PaintbrushFillIconStyle0","PaintbrushFillIcon","PaintbrushIconStyle0","PaintbrushIcon","PeopleIconStyle0","PeopleIcon","TrashIconStyle0","TrashIcon","ZoomIconStyle0","ZoomIcon"],"sources":["src/common/icons/icon.css?tag=calendar-agenda-fill-icon&encapsulation=scoped","src/common/icons/calendar-agenda-fill.tsx","src/common/icons/icon.css?tag=calendar-agenda-icon&encapsulation=scoped","src/common/icons/calendar-agenda.tsx","src/common/icons/icon.css?tag=calendar-info-icon&encapsulation=scoped","src/common/icons/calendar-info.tsx","src/common/icons/icon.css?tag=calendar-patterns-icon&encapsulation=scoped","src/common/icons/calendar-patterns.tsx","src/common/icons/icon.css?tag=checkmark-icon&encapsulation=scoped","src/common/icons/checkmark.tsx","src/common/icons/icon.css?tag=dragable-icon&encapsulation=scoped","src/common/icons/dragable.tsx","src/common/icons/icon.css?tag=envelope-fill-icon&encapsulation=scoped","src/common/icons/envelope-fill.tsx","src/common/icons/icon.css?tag=envelope-icon&encapsulation=scoped","src/common/icons/envelope.tsx","src/common/icons/icon.css?tag=eye-icon&encapsulation=scoped","src/common/icons/eye.tsx","src/common/icons/icon.css?tag=feedback-icon&encapsulation=scoped","src/common/icons/feedback-icon.tsx","src/common/icons/icon.css?tag=flow-icon&encapsulation=scoped","src/common/icons/flow.tsx","src/common/icons/icon.css?tag=google-meet-icon&encapsulation=scoped","src/common/icons/google-meet.tsx","src/components/design-system/input-image-url/input-image-url.scss?tag=input-image-url&encapsulation=shadow","src/components/design-system/input-image-url/input-image-url.tsx","src/common/icons/icon.css?tag=location-icon&encapsulation=scoped","src/common/icons/location.tsx","src/common/icons/icon.css?tag=location-off-icon&encapsulation=scoped","src/common/icons/location-off.tsx","src/common/icons/icon.css?tag=microsoft-teams-icon&encapsulation=scoped","src/common/icons/microsof-teams.tsx","src/components/scheduler-editor/nylas-additional-participants/nylas-additional-participants.scss?tag=nylas-additional-participants&encapsulation=shadow","src/components/scheduler-editor/nylas-additional-participants/nylas-additional-participants.tsx","src/components/scheduler-editor/nylas-availability-picker/nylas-availability-picker.scss?tag=nylas-availability-picker&encapsulation=shadow","src/components/scheduler-editor/nylas-availability-picker/nylas-availability-picker.tsx","src/components/scheduler-editor/nylas-booking-calendar-picker/nylas-booking-calendar-picker.scss?tag=nylas-booking-calendar-picker&encapsulation=shadow","src/components/scheduler-editor/nylas-booking-calendar-picker/nylas-booking-calendar-picker.tsx","src/components/scheduler-editor/nylas-booking-confirmation-redirect/nylas-booking-confirmation-redirect.scss?tag=nylas-booking-confirmation-redirect&encapsulation=shadow","src/components/scheduler-editor/nylas-booking-confirmation-redirect/nylas-booking-confirmation-redirect.tsx","src/components/scheduler-editor/nylas-booking-confirmation-type/nylas-booking-confirmation-type.scss?tag=nylas-booking-confirmation-type&encapsulation=shadow","src/components/scheduler-editor/nylas-booking-confirmation-type/nylas-booking-confirmation-type.tsx","../../node_modules/.pnpm/sortablejs@1.15.2/node_modules/sortablejs/modular/sortable.esm.js","src/components/scheduler-editor/nylas-booking-form-config/nylas-booking-form-config.scss?tag=nylas-booking-form-config&encapsulation=shadow","src/components/scheduler-editor/nylas-booking-form-config/nylas-booking-form-config.tsx","src/components/scheduler-editor/nylas-buffer-time/nylas-buffer-time.scss?tag=nylas-buffer-time&encapsulation=shadow","src/components/scheduler-editor/nylas-buffer-time/nylas-buffer-time.tsx","src/components/scheduler-editor/nylas-calendar-picker/nylas-calendar-picker.scss?tag=nylas-calendar-picker&encapsulation=shadow","src/components/scheduler-editor/nylas-calendar-picker/nylas-calendar-picker.tsx","src/components/scheduler-editor/nylas-cancellation-policy/nylas-cancellation-policy.scss?tag=nylas-cancellation-policy&encapsulation=shadow","src/components/scheduler-editor/nylas-cancellation-policy/nylas-cancellation-policy.tsx","src/components/scheduler-editor/nylas-confirmation-email/nylas-confirmation-email.scss?tag=nylas-confirmation-email&encapsulation=shadow","src/components/scheduler-editor/nylas-confirmation-email/nylas-confirmation-email.tsx","src/components/scheduler-editor/nylas-connected-calendars/nylas-connected-calendars.scss?tag=nylas-connected-calendars&encapsulation=shadow","src/components/scheduler-editor/nylas-connected-calendars/nylas-connected-calendars.tsx","src/components/scheduler-editor/nylas-custom-booking-flow/nylas-custom-booking-flow.scss?tag=nylas-custom-booking-flow&encapsulation=shadow","src/components/scheduler-editor/nylas-custom-booking-flow/nylas-custom-booking-flow.tsx","src/components/scheduler-editor/nylas-custom-event-slug/nylas-custom-event-slug.scss?tag=nylas-custom-event-slug&encapsulation=shadow","src/components/scheduler-editor/nylas-custom-event-slug/nylas-custom-event-slug.tsx","src/components/scheduler-editor/nylas-customize-booking-settings/nylas-customize-booking-settings.scss?tag=nylas-customize-booking-settings&encapsulation=shadow","src/components/scheduler-editor/nylas-customize-booking-settings/nylas-customize-booking-settings.tsx","src/components/scheduler-editor/nylas-event-description/nylas-event-description.scss?tag=nylas-event-description&encapsulation=shadow","src/components/scheduler-editor/nylas-event-description/nylas-event-description.tsx","src/components/scheduler-editor/nylas-event-duration/nylas-event-duration.scss?tag=nylas-event-duration&encapsulation=shadow","src/components/scheduler-editor/nylas-event-duration/nylas-event-duration.tsx","src/components/scheduler-editor/nylas-event-info/nylas-event-info.scss?tag=nylas-event-info&encapsulation=shadow","src/components/scheduler-editor/nylas-event-info/nylas-event-info.tsx","src/components/scheduler-editor/nylas-event-limits/nylas-event-limits.scss?tag=nylas-event-limits&encapsulation=shadow","src/components/scheduler-editor/nylas-event-limits/nylas-event-limits.tsx","src/components/scheduler-editor/nylas-event-location/nylas-event-location.scss?tag=nylas-event-location&encapsulation=shadow","src/components/scheduler-editor/nylas-event-location/nylas-event-location.tsx","src/components/scheduler-editor/nylas-event-title/nylas-event-title.scss?tag=nylas-event-title&encapsulation=shadow","src/components/scheduler-editor/nylas-event-title/nylas-event-title.tsx","src/components/scheduler/nylas-feedback-form/nylas-feedback-form.scss?tag=nylas-feedback-form&encapsulation=shadow","src/components/scheduler/nylas-feedback-form/nylas-feedback-form.tsx","src/components/scheduler-editor/nylas-limit-future-bookings/nylas-limit-future-bookings.scss?tag=nylas-limit-future-bookings&encapsulation=shadow","src/components/scheduler-editor/nylas-limit-future-bookings/nylas-limit-future-bookings.tsx","src/components/scheduler-editor/nylas-min-booking-notice/nylas-min-booking-notice.scss?tag=nylas-min-booking-notice&encapsulation=shadow","src/components/scheduler-editor/nylas-min-booking-notice/nylas-min-booking-notice.tsx","src/components/scheduler-editor/nylas-min-cancellation-notice/nylas-min-cancellation-notice.scss?tag=nylas-min-cancellation-notice&encapsulation=shadow","src/components/scheduler-editor/nylas-min-cancellation-notice/nylas-min-cancellation-notice.tsx","src/components/scheduler-editor/nylas-page-name/nylas-page-name.scss?tag=nylas-page-name&encapsulation=shadow","src/components/scheduler-editor/nylas-page-name/nylas-page-name.tsx","src/components/scheduler-editor/nylas-page-styling/nylas-page-styling.scss?tag=nylas-page-styling&encapsulation=shadow","src/components/scheduler-editor/nylas-page-styling/nylas-page-styling.tsx","src/components/scheduler-editor/nylas-participant-booking-calendars/nylas-participant-booking-calendars.scss?tag=nylas-participant-booking-calendars&encapsulation=shadow","src/components/scheduler-editor/nylas-participant-booking-calendars/nylas-participant-booking-calendars.tsx","src/components/scheduler-editor/nylas-participants-custom-availability/nylas-participants-custom-availability.scss?tag=nylas-participants-custom-availability&encapsulation=shadow","src/components/scheduler-editor/nylas-participants-custom-availability/nylas-participants-custom-availability.tsx","src/components/scheduler-editor/nylas-reminder-emails/nylas-reminder-emails.scss?tag=nylas-reminder-emails&encapsulation=shadow","src/components/scheduler-editor/nylas-reminder-emails/nylas-reminder-emails.tsx","src/components/scheduler-editor/nylas-reminder-time/nylas-reminder-time.scss?tag=nylas-reminder-time&encapsulation=shadow","src/components/scheduler-editor/nylas-reminder-time/nylas-reminder-time.tsx","src/components/scheduler-editor/nylas-scheduling-method/nylas-scheduling-method.scss?tag=nylas-scheduling-method&encapsulation=shadow","src/components/scheduler-editor/nylas-scheduling-method/nylas-scheduling-method.tsx","src/components/scheduler-editor/nylas-timeslot-interval/nylas-timeslot-interval.scss?tag=nylas-timeslot-interval&encapsulation=shadow","src/components/scheduler-editor/nylas-timeslot-interval/nylas-timeslot-interval.tsx","src/common/icons/icon.css?tag=paintbrush-fill-icon&encapsulation=scoped","src/common/icons/paintbrush-fill.tsx","src/common/icons/icon.css?tag=paintbrush-icon&encapsulation=scoped","src/common/icons/paintbrush.tsx","src/common/icons/icon.css?tag=people-icon&encapsulation=scoped","src/common/icons/people.tsx","src/common/icons/icon.css?tag=trash-icon&encapsulation=scoped","src/common/icons/trash.tsx","src/common/icons/icon.css?tag=zoom-icon&encapsulation=scoped","src/common/icons/zoom.tsx"],"sourcesContent":[":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'calendar-agenda-fill-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class CalendarAgendaFillIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '20';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 11.5C14 12.8807 12.8807 14 11.5 14H2.5C1.11929 14 0 12.8807 0 11.5V2.5C0 1.11929 1.11929 0 2.5 0H11.5C12.8807 0 14 1.11929 14 2.5V11.5ZM11 3.5C11 3.25454 10.8231 3.05039 10.5899 3.00806L10.5 3H3.5L3.41012 3.00806C3.17688 3.05039 3 3.25454 3 3.5C3 3.74546 3.17688 3.94961 3.41012 3.99194L3.5 4H10.5L10.5899 3.99194C10.8231 3.94961 11 3.74546 11 3.5ZM11 7C11 6.75454 10.8231 6.55039 10.5899 6.50806L10.5 6.5H3.5L3.41012 6.50806C3.17688 6.55039 3 6.75454 3 7C3 7.24546 3.17688 7.44961 3.41012 7.49194L3.5 7.5H10.5L10.5899 7.49194C10.8231 7.44961 11 7.24546 11 7ZM11 10.5C11 10.2545 10.8231 10.0504 10.5899 10.0081L10.5 10H3.5L3.41012 10.0081C3.17688 10.0504 3 10.2545 3 10.5C3 10.7455 3.17688 10.9496 3.41012 10.9919L3.5 11H10.5L10.5899 10.9919C10.8231 10.9496 11 10.7455 11 10.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'calendar-agenda-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class CalendarAgendaIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '20';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 11.5C14 12.8807 12.8807 14 11.5 14H2.5C1.11929 14 0 12.8807 0 11.5V2.5C0 1.11929 1.11929 0 2.5 0H11.5C12.8807 0 14 1.11929 14 2.5V11.5ZM13 11.5V2.5C13 1.67157 12.3284 1 11.5 1H2.5C1.67157 1 1 1.67157 1 2.5V11.5C1 12.3284 1.67157 13 2.5 13H11.5C12.3284 13 13 12.3284 13 11.5ZM11 3.5C11 3.74546 10.8231 3.94961 10.5899 3.99194L10.5 4H3.5C3.22386 4 3 3.77614 3 3.5C3 3.25454 3.17688 3.05039 3.41012 3.00806L3.5 3H10.5C10.7761 3 11 3.22386 11 3.5ZM11 7C11 7.24546 10.8231 7.44961 10.5899 7.49194L10.5 7.5H3.5C3.22386 7.5 3 7.27614 3 7C3 6.75454 3.17688 6.55039 3.41012 6.50806L3.5 6.5H10.5C10.7761 6.5 11 6.72386 11 7ZM11 10.5C11 10.7455 10.8231 10.9496 10.5899 10.9919L10.5 11H3.5C3.22386 11 3 10.7761 3 10.5C3 10.2545 3.17688 10.0504 3.41012 10.0081L3.5 10H10.5C10.7761 10 11 10.2239 11 10.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'calendar-info-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class CalendarInfoIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '20';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 0C13.3807 0 14.5 1.11929 14.5 2.5V6.59971C14.1832 6.43777 13.8486 6.30564 13.5 6.20703V4H1.5V11.5C1.5 12.3284 2.17157 13 3 13H6.70703C6.80564 13.3486 6.93777 13.6832 7.09971 14H3C1.61929 14 0.5 12.8807 0.5 11.5V2.5C0.5 1.11929 1.61929 0 3 0H12ZM12 1H3C2.17157 1 1.5 1.67157 1.5 2.5V3H13.5V2.5C13.5 1.67157 12.8284 1 12 1ZM11.375 9.5C11.375 9.15482 11.6548 8.875 12 8.875C12.3452 8.875 12.625 9.15482 12.625 9.5C12.625 9.84518 12.3452 10.125 12 10.125C11.6548 10.125 11.375 9.84518 11.375 9.5ZM12.5 13.5C12.5 13.7761 12.2761 14 12 14C11.7239 14 11.5 13.7761 11.5 13.5V11.5C11.5 11.2239 11.7239 11 12 11C12.2761 11 12.5 11.2239 12.5 11.5V13.5ZM7.5 11.5C7.5 9.01472 9.51472 7 12 7C14.4853 7 16.5 9.01472 16.5 11.5C16.5 13.9853 14.4853 16 12 16C9.51472 16 7.5 13.9853 7.5 11.5ZM8.5 11.5C8.5 13.433 10.067 15 12 15C13.933 15 15.5 13.433 15.5 11.5C15.5 9.567 13.933 8 12 8C10.067 8 8.5 9.567 8.5 11.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'calendar-patterns-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class CalendarPatternsIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '20';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M3.25 0H11.75C13.2688 0 14.5 1.23122 14.5 2.75V11.25C14.5 12.7688 13.2688 14 11.75 14H3.25C1.73122 14 0.5 12.7688 0.5 11.25V2.75C0.5 1.23122 1.73122 0 3.25 0ZM2 2.75V4H13V2.75C13 2.05964 12.4404 1.5 11.75 1.5H3.25C2.55964 1.5 2 2.05964 2 2.75ZM12.2071 5L8.20711 9H10.7929L13 6.79289V5H12.2071ZM10.7929 5H8.20711L4.20711 9H6.79289L10.7929 5ZM2.79289 9L6.79289 5H4.20711L2 7.20711V9H2.79289ZM2 5.79289L2.79289 5H2V5.79289ZM12.2071 9H13V8.20711L12.2071 9Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'checkmark-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class CheckmarkIcon {\n @Prop() width: string = '18';\n @Prop() height: string = '14';\n\n render() {\n return (\n <svg width={this.width} height={this.height} viewBox=\"0 0 18 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M1.53033 7.46967C1.23744 7.17678 0.762563 7.17678 0.46967 7.46967C0.176777 7.76256 0.176777 8.23744 0.46967 8.53033L4.96967 13.0303C5.26256 13.3232 5.73744 13.3232 6.03033 13.0303L17.0303 2.03033C17.3232 1.73744 17.3232 1.26256 17.0303 0.96967C16.7374 0.676777 16.2626 0.676777 15.9697 0.96967L5.5 11.4393L1.53033 7.46967Z\"\n fill=\"#293056\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'dragable-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class DragableIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '20';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15.5 18C16.3284 18 17 18.6716 17 19.5C17 20.3284 16.3284 21 15.5 21C14.6716 21 14 20.3284 14 19.5C14 18.6716 14.6716 18 15.5 18ZM8.5 18C9.32843 18 10 18.6716 10 19.5C10 20.3284 9.32843 21 8.5 21C7.67157 21 7 20.3284 7 19.5C7 18.6716 7.67157 18 8.5 18ZM15.5 11C16.3284 11 17 11.6716 17 12.5C17 13.3284 16.3284 14 15.5 14C14.6716 14 14 13.3284 14 12.5C14 11.6716 14.6716 11 15.5 11ZM8.5 11C9.32843 11 10 11.6716 10 12.5C10 13.3284 9.32843 14 8.5 14C7.67157 14 7 13.3284 7 12.5C7 11.6716 7.67157 11 8.5 11ZM15.5 4C16.3284 4 17 4.67157 17 5.5C17 6.32843 16.3284 7 15.5 7C14.6716 7 14 6.32843 14 5.5C14 4.67157 14.6716 4 15.5 4ZM8.5 4C9.32843 4 10 4.67157 10 5.5C10 6.32843 9.32843 7 8.5 7C7.67157 7 7 6.32843 7 5.5C7 4.67157 7.67157 4 8.5 4Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'envelope-fill-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class EnvelopeFillIcon {\n @Prop() width: string = '16';\n @Prop() height: string = '13';\n\n render() {\n return (\n <svg width=\"16\" height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M16.0001 3.373V10.5C16.0001 11.8807 14.8808 13 13.5001 13H2.50008C1.11937 13 0 11.8807 0 10.5V3.373L7.74657 7.93097C7.90304 8.02301 8.09711 8.02301 8.25359 7.93097L16.0001 3.373ZM13.5001 0C14.7871 0 15.847 0.972604 15.9849 2.22293L8.00008 6.91991L0.0152595 2.22293C0.153116 0.972604 1.21302 0 2.50008 0H13.5001Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'envelope-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class EnvelopeIcon {\n @Prop() width: string = '16';\n @Prop() height: string = '13';\n\n render() {\n return (\n <svg width=\"16\" height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13.5 0C14.8807 0 16 1.11929 16 2.5V10.5C16 11.8807 14.8807 13 13.5 13H2.5C1.11929 13 0 11.8807 0 10.5V2.5C0 1.11929 1.11929 0 2.5 0H13.5ZM15 3.961L8.25351 7.93097C8.12311 8.00767 7.96661 8.02045 7.82751 7.96932L7.74649 7.93097L1 3.963V10.5C1 11.3284 1.67157 12 2.5 12H13.5C14.3284 12 15 11.3284 15 10.5V3.961ZM13.5 1H2.5C1.67157 1 1 1.67157 1 2.5V2.802L8 6.91991L15 2.801V2.5C15 1.67157 14.3284 1 13.5 1Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'eye-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class EyeIcon {\n @Prop() width: string = '17';\n @Prop() height: string = '10';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M1.75909 6.60214C2.44254 3.32689 5.29437 1 8.50002 1C11.7057 1 14.5574 3.32688 15.2409 6.60215C15.2974 6.87246 15.5622 7.04587 15.8325 6.98946C16.1029 6.93304 16.2763 6.66817 16.2199 6.39785C15.4425 2.67312 12.1934 0 8.50002 0C4.8066 0 1.55742 2.67311 0.780175 6.39786C0.723767 6.66818 0.897177 6.93305 1.1675 6.98946C1.43782 7.04587 1.70268 6.87246 1.75909 6.60214ZM8.5 3C6.567 3 5 4.567 5 6.5C5 8.433 6.567 10 8.5 10C10.433 10 12 8.433 12 6.5C12 4.567 10.433 3 8.5 3ZM6 6.5C6 5.11929 7.11929 4 8.5 4C9.88071 4 11 5.11929 11 6.5C11 7.88071 9.88071 9 8.5 9C7.11929 9 6 7.88071 6 6.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'feedback-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class FeedbackIcon {\n @Prop() width: string = '11';\n @Prop() height: string = '14';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M0.5 8.875C0.5 8.875 1.125 8.25 3 8.25C4.875 8.25 6.125 9.5 8 9.5C9.875 9.5 10.5 8.875 10.5 8.875V1.375C10.5 1.375 9.875 2 8 2C6.125 2 4.875 0.75 3 0.75C1.125 0.75 0.5 1.375 0.5 1.375V8.875ZM0.5 8.875V13.25\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'flow-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class FlowIcon {\n @Prop() width: string = '16';\n @Prop() height: string = '12';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13 1.66211C11.8954 1.66211 11 2.55754 11 3.66211C11 4.76668 11.8954 5.66211 13 5.66211C14.1046 5.66211 15 4.76668 15 3.66211C15 2.55754 14.1046 1.66211 13 1.66211ZM10.0407 3.16678C10.2768 1.74563 11.5119 0.662109 13 0.662109C14.6569 0.662109 16 2.00526 16 3.66211C16 5.31896 14.6569 6.66211 13 6.66211C11.5162 6.66211 10.2839 5.58482 10.0428 4.16971C9.37629 4.23688 8.82682 4.7426 8.71466 5.41551L8.27173 8.07311C8.07929 9.22776 7.11428 10.087 5.9593 10.1574C5.72319 11.5786 4.48813 12.6621 3 12.6621C1.34315 12.6621 0 11.319 0 9.66211C0 8.00526 1.34315 6.66211 3 6.66211C4.48384 6.66211 5.71607 7.73939 5.95724 9.15451C6.62371 9.08734 7.17318 8.58162 7.28534 7.90871L7.72827 5.25111C7.92071 4.09646 8.88571 3.23718 10.0407 3.16678ZM3 7.66211C1.89543 7.66211 1 8.55754 1 9.66211C1 10.7667 1.89543 11.6621 3 11.6621C4.10457 11.6621 5 10.7667 5 9.66211C5 8.55754 4.10457 7.66211 3 7.66211Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'google-meet-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class GoogleMeetIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '20';\n\n render() {\n // Spam icon svg\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_22_6251)\">\n <path d=\"M11.3145 10.1036L13.2642 12.3321L15.8859 14.0076L16.343 10.1173L15.8859 6.31384L13.2139 7.78584L11.3145 10.1036Z\" fill=\"#00832D\" />\n <path d=\"M0 13.6464V16.9607C0 17.7184 0.613714 18.3321 1.37143 18.3321H4.68571L5.37143 15.827L4.68571 13.6464L2.41143 12.9607L0 13.6464Z\" fill=\"#0066DA\" />\n <path d=\"M4.68571 1.875L0 6.56071L2.41143 7.24643L4.68571 6.56071L5.36 4.40986L4.68571 1.875Z\" fill=\"#E94235\" />\n <path d=\"M4.68571 6.56067H0V13.6464H4.68571V6.56067Z\" fill=\"#2684FC\" />\n <path\n d=\"M18.8798 3.85895L15.8855 6.31381V14.0075L18.8935 16.4738C19.3438 16.8258 20.0021 16.5047 20.0021 15.9321V4.38923C20.0021 3.80981 19.329 3.49209 18.8798 3.85895ZM11.3141 10.1035V13.6464H4.68555V18.3321H14.5141C15.2718 18.3321 15.8855 17.7184 15.8855 16.9607V14.0075L11.3141 10.1035Z\"\n fill=\"#00AC47\"\n />\n <path d=\"M14.5141 1.875H4.68555V6.56071H11.3141V10.1036L15.8855 6.31614V3.24643C15.8855 2.48871 15.2718 1.875 14.5141 1.875Z\" fill=\"#FFBA00\" />\n </g>\n <defs>\n <clipPath id=\"clip0_22_6251\">\n <rect width=\"20\" height=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.logo-container {\n display: flex;\n flex-direction: row;\n gap: 2rem;\n\n .input-container {\n flex: 1;\n\n span.error-message {\n color: var(--nylas-error);\n }\n }\n\n .logo {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 200px;\n height: 100px;\n border: var(--nylas-base-200) solid 1px;\n border-radius: var(--nylas-border-radius-2x);\n overflow: hidden;\n padding: 10px;\n\n img {\n max-height: 100%;\n max-width: 100%;\n object-fit: contain;\n object-position: center;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug, isValidImage } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../../scheduler-editor/nylas-scheduler-editor/nylas-scheduler-editor';\n\n/**\n * The `nylas-image-input` component is a UI component that allows users input an image URL and see a preview of the image.\n *\n * @part iiu__logo-input-textfield - The image input textfield\n */\n@Component({\n tag: 'input-image-url',\n styleUrl: 'input-image-url.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class InputImageUrl {\n @Element() host!: HTMLInputImageUrlElement;\n private readonly componentType: string = 'image-url';\n\n /**\n * Image\n */\n @Prop({ attribute: 'image-url' }) imageUrl: string = '';\n /**\n * Error message to display when the image URL is invalid.\n */\n @Prop() errorMessage: string = '';\n /**\n * The name of the component\n */\n @Prop() name: string = 'input-image-url';\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The current image URL state.\n */\n @State() currentImageUrl: string = this.imageUrl;\n\n /**\n * This event is fired when the image url is changed and the image is invalid.\n */\n @Event() readonly nylasFormInputImageUrlInvalid!: EventEmitter<{ value: string; name: string }>;\n /**\n * This event is fired when the image URL is changed\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-image-input', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-image-input', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-image-input', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n this.host.setAttribute('component-type', this.componentType);\n }\n\n componentDidLoad() {\n debug('nylas-image-input', 'componentDidLoad');\n this.currentImageUrl = this.imageUrl;\n this.setImage(this.imageUrl);\n }\n\n componentWillUpdate() {\n debug('nylas-image-input', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-image-input', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-image-input', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-image-input', 'componentDidRender');\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-image-input', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Listen('nylasFormInputChanged')\n async nylasFormInputChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { name, value } = event.detail;\n\n if (name === this.name) {\n this.setImage(value);\n }\n }\n\n @Listen('nylasFormInputBlurred')\n async nylasFormInputBlurHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { name, value } = event.detail;\n\n if (name === this.name) {\n this.setImage(value);\n }\n }\n\n setImage(value: string) {\n this.errorMessage = '';\n\n isValidImage(value)\n .then(() => {\n this.currentImageUrl = value;\n\n this.internals.setValidity({});\n this.internals.setFormValue(this.currentImageUrl, this.name);\n this.valueChanged.emit({ value: this.currentImageUrl, name: this.name });\n })\n .catch(() => {\n this.errorMessage = 'Invalid image URL.';\n this.nylasFormInputImageUrlInvalid.emit({ value: 'Invalid image URL.', name: this.name });\n if (typeof this.internals.setValidity === 'function') {\n this.internals.setValidity({ customError: true }, 'Invalid image URL.');\n }\n });\n }\n\n @RegisterComponent<InputImageUrl, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-image-input',\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n })\n render() {\n return (\n <Host>\n <div class=\"logo-container\">\n <div class=\"input-container\">\n <input-component name={this.name} id={this.name} type=\"text\" required={false} exportparts=\"ic_input: iiu__logo-input-textfield\" defaultValue={this.imageUrl ?? ''} />\n {this.errorMessage && <span class=\"error-message\">{this.errorMessage}</span>}\n </div>\n\n {this.currentImageUrl && !this.errorMessage && (\n <div class=\"logo\">\n <img src={this.currentImageUrl} alt=\"Logo\" />\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'location-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class LocationIcon {\n @Prop() width: string = '16';\n @Prop() height: string = '18';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10 7.66211C10 9.31896 8.65685 10.6621 7 10.6621C5.34315 10.6621 4 9.31896 4 7.66211C4 6.00526 5.34315 4.66211 7 4.66211C8.65685 4.66211 10 6.00526 10 7.66211ZM9 7.66211C9 6.55754 8.10457 5.66211 7 5.66211C5.89543 5.66211 5 6.55754 5 7.66211C5 8.76668 5.89543 9.66211 7 9.66211C8.10457 9.66211 9 8.76668 9 7.66211ZM11.9497 12.6171C14.6834 9.88221 14.6834 5.44812 11.9497 2.71326C9.21608 -0.0216067 4.78392 -0.0216067 2.05025 2.71326C-0.683418 5.44812 -0.683418 9.88221 2.05025 12.6171L3.57128 14.1159L5.61408 16.101L5.74691 16.2188C6.52168 16.8468 7.65623 16.8076 8.38611 16.1012L10.8223 13.7312L11.9497 12.6171ZM2.75499 3.4183C5.09944 1.07282 8.90055 1.07282 11.245 3.4183C13.5294 5.70364 13.5879 9.3725 11.4207 11.7288L11.245 11.912L9.92371 13.216L7.69315 15.3846L7.60016 15.4642C7.24594 15.732 6.7543 15.732 6.40012 15.4642L6.30713 15.3845L3.3263 12.4791L2.75499 11.912L2.57927 11.7288C0.412077 9.3725 0.47065 5.70364 2.75499 3.4183Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'location-off-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class LocationOffIcon {\n @Prop() width: string = '16';\n @Prop() height: string = '18';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M0.146447 0.808556C0.341709 0.613294 0.658291 0.613294 0.853553 0.808556L15.8536 15.8086C16.0488 16.0038 16.0488 16.3204 15.8536 16.5157C15.6583 16.7109 15.3417 16.7109 15.1464 16.5157L12.0938 13.463L11.8223 13.7312L9.38611 16.1012C8.65623 16.8076 7.52168 16.8468 6.74691 16.2188L6.61408 16.101L4.57128 14.1159L3.05025 12.6171C0.607421 10.1732 0.347525 6.37239 2.27056 3.63976L0.146447 1.51566C-0.0488155 1.3204 -0.0488155 1.00382 0.146447 0.808556ZM9.07768 10.4469C8.74346 10.576 8.38024 10.6468 8.0005 10.6468C6.34839 10.6468 5.00909 9.30689 5.00909 7.65406C5.00909 7.27461 5.07967 6.91166 5.20843 6.57763L2.98793 4.35713C1.49206 6.62038 1.68917 9.67377 3.57927 11.7288L3.75499 11.912L4.3263 12.4791L7.30713 15.3845L7.40012 15.4642C7.7543 15.732 8.24594 15.732 8.60016 15.4642L8.69315 15.3846L10.9237 13.216L11.3883 12.7575L9.07768 10.4469ZM9.85409 8.39486L10.5983 9.13904C10.8487 8.70143 10.9919 8.19447 10.9919 7.65406C10.9919 6.00122 9.65261 4.66134 8.0005 4.66134C7.45986 4.66134 6.95271 4.80482 6.51504 5.05581L7.25921 5.79998C7.48839 5.70819 7.73855 5.6577 8.0005 5.6577C9.10258 5.6577 9.99599 6.5515 9.99599 7.65406C9.99599 7.91581 9.94564 8.16581 9.85409 8.39486ZM4.35291 2.89368C6.70671 1.08827 10.0908 1.26314 12.245 3.4183C14.3986 5.57283 14.5739 8.95702 12.771 11.3118L13.4812 12.022C15.6702 9.27273 15.493 5.25762 12.9497 2.71326C10.4058 0.168159 6.39081 -0.00843871 3.64269 2.18347L4.35291 2.89368Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'microsoft-teams-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class GoogleMeetIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '20';\n\n render() {\n // Spam icon svg\n return (\n <svg width={this.width} height={this.height} viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_22_6280)\">\n <path\n d=\"M13.7109 7.60168H18.8769C19.365 7.60168 19.7607 7.99734 19.7607 8.4854V13.191C19.7607 14.9848 18.3065 16.4389 16.5127 16.4389H16.4974C14.7036 16.4391 13.2493 14.9852 13.249 13.1914C13.249 13.1913 13.249 13.1911 13.249 13.191V8.06355C13.249 7.80847 13.4558 7.60168 13.7109 7.60168Z\"\n fill=\"#5059C9\"\n />\n <path\n d=\"M17.2024 6.67152C18.3583 6.67152 19.2954 5.73444 19.2954 4.5785C19.2954 3.42255 18.3583 2.48547 17.2024 2.48547C16.0465 2.48547 15.1094 3.42255 15.1094 4.5785C15.1094 5.73444 16.0465 6.67152 17.2024 6.67152Z\"\n fill=\"#5059C9\"\n />\n <path\n d=\"M10.6912 6.67152C12.3609 6.67152 13.7145 5.31796 13.7145 3.64826C13.7145 1.97856 12.3609 0.625 10.6912 0.625C9.02153 0.625 7.66797 1.97856 7.66797 3.64826C7.66797 5.31796 9.02153 6.67152 10.6912 6.67152Z\"\n fill=\"#7B83EB\"\n />\n <path\n d=\"M14.7223 7.60168H6.19482C5.71257 7.61362 5.33108 8.01384 5.34227 8.49611V13.8631C5.27492 16.7571 7.56457 19.1588 10.4586 19.2296C13.3525 19.1588 15.6422 16.7571 15.5748 13.8631V8.49611C15.586 8.01384 15.2045 7.61362 14.7223 7.60168Z\"\n fill=\"#7B83EB\"\n />\n <path\n opacity=\"0.1\"\n d=\"M10.9234 7.60168V15.1226C10.9211 15.4675 10.7121 15.7773 10.3932 15.9087C10.2917 15.9516 10.1825 15.9738 10.0723 15.9738H5.75134C5.69088 15.8203 5.63507 15.6668 5.58855 15.5087C5.42574 14.975 5.34267 14.4201 5.34204 13.8622V8.49471C5.33086 8.01321 5.71172 7.61362 6.1932 7.60168H10.9234Z\"\n fill=\"black\"\n />\n <path\n opacity=\"0.2\"\n d=\"M10.4583 7.60168V15.5877C10.4583 15.698 10.4362 15.8071 10.3932 15.9087C10.2619 16.2276 9.95205 16.4366 9.60717 16.4389H5.96995C5.89088 16.2854 5.81646 16.1319 5.75134 15.9738C5.68623 15.8156 5.63507 15.6668 5.58855 15.5087C5.42574 14.975 5.34267 14.4201 5.34204 13.8622V8.49471C5.33086 8.01321 5.71172 7.61362 6.1932 7.60168H10.4583Z\"\n fill=\"black\"\n />\n <path\n opacity=\"0.2\"\n d=\"M10.4583 7.60168V14.6575C10.4548 15.1261 10.0758 15.5051 9.60716 15.5087H5.58855C5.42574 14.975 5.34267 14.4201 5.34204 13.8622V8.49471C5.33086 8.01321 5.71172 7.61362 6.1932 7.60168H10.4583Z\"\n fill=\"black\"\n />\n <path\n opacity=\"0.2\"\n d=\"M9.9932 7.60168V14.6575C9.98965 15.1261 9.61065 15.5051 9.14203 15.5087H5.58855C5.42574 14.975 5.34267 14.4201 5.34204 13.8622V8.49471C5.33086 8.01321 5.71172 7.61362 6.1932 7.60168H9.9932Z\"\n fill=\"black\"\n />\n <path\n opacity=\"0.1\"\n d=\"M10.9241 5.1971V6.66222C10.845 6.66687 10.7706 6.67152 10.6915 6.67152C10.6124 6.67152 10.538 6.66687 10.4589 6.66222C10.3019 6.6518 10.1462 6.62689 9.99382 6.5878C9.05195 6.36475 8.27382 5.70421 7.90079 4.81106C7.83661 4.66107 7.78678 4.50533 7.75195 4.34595H10.0729C10.5422 4.34772 10.9223 4.72775 10.9241 5.1971Z\"\n fill=\"black\"\n />\n <path\n opacity=\"0.2\"\n d=\"M10.4585 5.66219V6.66219C10.3015 6.65177 10.1458 6.62686 9.99341 6.58778C9.05155 6.36473 8.27342 5.70418 7.90039 4.81104H9.60736C10.0767 4.81281 10.4567 5.19285 10.4585 5.66219Z\"\n fill=\"black\"\n />\n <path\n opacity=\"0.2\"\n d=\"M10.4585 5.66219V6.66219C10.3015 6.65177 10.1458 6.62686 9.99341 6.58778C9.05155 6.36473 8.27342 5.70418 7.90039 4.81104H9.60736C10.0767 4.81281 10.4567 5.19285 10.4585 5.66219Z\"\n fill=\"black\"\n />\n <path opacity=\"0.2\" d=\"M9.99341 5.6622V6.58778C9.05155 6.36473 8.27342 5.70418 7.90039 4.81104H9.14225C9.6116 4.81282 9.99163 5.19286 9.99341 5.6622Z\" fill=\"black\" />\n <path\n d=\"M0.613296 4.81104H9.14074C9.61159 4.81104 9.99329 5.19274 9.99329 5.66359V14.191C9.99329 14.6619 9.61158 15.0436 9.14074 15.0436H0.613296C0.14244 15.0436 -0.239258 14.6619 -0.239258 14.191V5.66359C-0.239258 5.19274 0.142449 4.81104 0.613296 4.81104Z\"\n fill=\"url(#paint0_linear_22_6280)\"\n />\n <path d=\"M7.12025 8.05659H5.4156V12.6985H4.32956V8.05659H2.63281V7.15613H7.12025V8.05659Z\" fill=\"white\" />\n </g>\n <defs>\n <linearGradient id=\"paint0_linear_22_6280\" x1=\"1.53835\" y1=\"4.14486\" x2=\"8.2157\" y2=\"15.7098\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#5A62C3\" />\n <stop offset=\"0.5\" stop-color=\"#4D55BD\" />\n <stop offset=\"1\" stop-color=\"#3940AB\" />\n </linearGradient>\n <clipPath id=\"clip0_22_6280\">\n <rect width=\"20\" height=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n margin: 1rem;\n @include default-css-variables;\n}\n\n.nylas-additional-participants__title {\n color: var(--nylas-base-nylas-base-900-aaa, #101323);\n font-size: 16px;\n font-style: normal;\n font-weight: 600;\n line-height: 20px;\n /* 125% */\n margin: 0;\n text-align: left;\n}\n\n.nylas-additional-participants__subtitle {\n color: var(--nylas-base-600);\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n /* 142.857% */\n margin: 0.25rem 0px 0px;\n text-align: left;\n}\n\n.nylas-additional-participants__content {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.nylas-additional-participants__input_group {\n padding-top: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%;\n }\n}\n\n.nylas-additional-participants__error {\n color: var(--nylas-error);\n font-size: 14px;\n font-family: var(--nylas-font-family);\n font-weight: 400;\n line-height: 16px;\n margin: 0;\n text-align: left;\n}\n\n.nylas-additional-participants__input_wrapper {\n display: flex;\n border-width: 1;\n border-radius: 8px;\n border: 1px solid var(--nylas-base-300);\n\n &.error {\n border-color: var(--nylas-error);\n }\n\n button {\n padding: 12px;\n border: none;\n border-left: 1px solid var(--nylas-base-300);\n background: none;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n }\n}\n\n.nylas-additional-participants__input_wrapper_organizer {\n border: none;\n}\n\n.nylas-additional-participants__input {\n flex: 1;\n display: flex;\n justify-content: space-between;\n\n input {\n border: none;\n outline: none;\n background: none;\n width: 100%;\n }\n\n input-dropdown {\n width: 100%;\n }\n\n input-dropdown::part(id_dropdown) {\n width: 100%;\n height: 100%;\n }\n\n input-dropdown::part(id_dropdown-input) {\n height: 100%;\n border-radius: var(--nylas-border-radius-2x);\n border: none;\n border-top-right-radius: initial;\n border-bottom-right-radius: initial;\n padding-left: 16px;\n }\n\n input-component::part(ic__input) {\n background: var(--nylas-base-50);\n }\n\n input-component::part(ic__label) {\n font-size: 14px;\n }\n\n input-component {\n div.required-input {\n display: flex;\n gap: 4px;\n\n label {\n display: flex;\n gap: 4px;\n align-items: center;\n\n tooltip-component#organizer_participant_tooltip::part(tc__content) {\n left: -84px;\n }\n }\n }\n }\n}\n\n.nylas-additional-participants__add {\n padding: 12px;\n display: flex;\n align-items: center;\n border: none;\n background: none;\n cursor: pointer;\n\n span {\n padding: 0 8px;\n font-size: 16px;\n font-style: normal;\n font-weight: 500;\n }\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Host, Prop, State, Watch, h, Element, Listen, EventEmitter } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Event } from '@stencil/core';\nimport { AdditionalParticipant, Calendar, Configuration } from '@nylas/core';\nimport { User } from '@/common/nylas-api-request';\n\ntype Participant = {\n name?: string;\n email: string;\n is_valid?: boolean;\n is_organizer?: boolean;\n availability?: Availability;\n booking?: Booking;\n};\ntype Availability = {\n calendar_ids: string[];\n};\ntype Booking = {\n calendar_id: string;\n};\n\n/**\n * The `nylas-additional-participants` component is a form input for adding additional participants to an event.\n *\n * @part nap__title - The title of the component.\n * @part nap__subtitle - The subtitle of the component.\n * @part nap__content - The content of the component.\n * @part nap__input_group - The input group of the component.\n * @part nap__input_wrapper - The input wrapper of the component.\n * @part nap__input - The input of the component.\n * @part nap__remove-participant - The remove participant button of the component.\n * @part nap__add-participant - The add participant button of the component.\n *\n */\n@Component({\n tag: 'nylas-additional-participants',\n styleUrl: 'nylas-additional-participants.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasAdditionalParticipants {\n @Element() host!: HTMLNylasAdditionalParticipantsElement;\n /**\n * @standalone\n * The name of the component\n */\n @Prop() name: string = 'participants';\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The logged in user\n */\n @Prop() currentUser?: User;\n /**\n * @standalone\n * The list of user's calendars.\n */\n @Prop() currentUserCalendars?: Calendar[];\n /**\n * @standalone\n * The additional participants options from the config\n */\n @Prop() participantOptions?: AdditionalParticipant[];\n /**\n * @standalone\n * The event participants\n */\n @Prop() eventParticipants?: Participant[];\n\n @AttachInternals() internals!: ElementInternals;\n @State() participants: Participant[] = this.eventParticipants ?? [];\n @State() participantErrors: { [key: string]: string } = {};\n @State() includeOrganizerAsParticipant: boolean = true;\n @State() isRoundRobinConfig: boolean = false;\n @State() error: string = '';\n\n /**\n * This event is fired when the selected participants change.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-additional-participants', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('currentUser')\n @Watch('selectedConfiguration')\n selectedConfigurationAndCurrentUserChangedHandler(newValue: unknown, _oldValue: unknown, propName: string) {\n debug('nylas-additional-participants', 'selectedConfigurationAndCurrentUserChangedHandler', newValue, this.currentUser);\n\n if (propName === 'selectedConfiguration') {\n this.updateState(newValue as Configuration, this.currentUser);\n } else if (propName === 'currentUser') {\n this.updateState(this.selectedConfiguration, newValue as User);\n }\n }\n\n connectedCallback() {\n debug('nylas-additional-participants', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-additional-participants', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-additional-participants', 'componentDidLoad');\n this.updateState(this.selectedConfiguration, this.currentUser);\n }\n\n disconnectedCallback() {\n debug('nylas-additional-participants', 'disconnectedCallback');\n }\n\n private updateState(selectedConfig?: Configuration, currentUser?: User) {\n this.isRoundRobinConfig = selectedConfig?.availability?.availability_rules?.availability_method\n ? selectedConfig?.availability?.availability_rules?.availability_method !== 'collective'\n : false;\n this.participants = selectedConfig?.participants || [];\n this.includeOrganizerAsParticipant = this.isRoundRobinConfig && this.participants.find(p => p.email === currentUser?.email) ? true : false;\n this.updateOrganizerAsParticipant();\n }\n\n /**\n * This method is essentially a workaround to check if the internals are available because\n * the unit tests in stencil do not support the internals.\n * @returns boolean\n */\n get isInternalsAvailable() {\n return this.internals !== undefined && typeof this.internals.setFormValue === 'function' && typeof this.internals.setValidity === 'function';\n }\n\n @Listen('inputOptionChanged')\n onInputOptionChanged(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-additional-participants', 'onInputOptionChanged');\n const EMAIL_REGEX = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\n const index = event.detail.name;\n const participant = this.participantOptions?.find(participant => participant.email === event.detail.value);\n\n if (!participant && this.isRoundRobinConfig) {\n this.isInternalsAvailable && this.internals.setValidity({ customError: true }, 'For round robin configuration, participant should be selected from the dropdown.');\n this.participantErrors[index] = 'For round robin page, participant should be selected from the dropdown.';\n this.participants[index].is_valid = false;\n this.participants = [...this.participants];\n return;\n } else if (!participant && !EMAIL_REGEX.test(event.detail.value)) {\n this.isInternalsAvailable && this.internals.setValidity({ customError: true }, 'Please enter a valid email address');\n this.participantErrors[index] = 'Please enter a valid email address';\n this.participants[index].is_valid = false;\n this.participants = [...this.participants];\n return;\n } else {\n this.participantErrors[index] = '';\n this.participants[index].is_valid = true;\n this.isInternalsAvailable && this.internals.setValidity({});\n }\n this.participants[index].email = event.detail.value;\n // Default to the first calendar if participant was picked from the dropdown options\n this.participants[index].availability = participant && participant.calendars[0].id ? { calendar_ids: [participant.calendars[0].id] } : undefined;\n // If round-robin config, set booking calendar to first calendar for all participants\n this.participants[index].booking = participant && this.isRoundRobinConfig && participant.calendars[0].id ? { calendar_id: participant.calendars[0].id } : undefined;\n this.participants[index].name = participant?.name || event.detail.value;\n this.participants = [...this.participants];\n this.updateFormValue();\n }\n\n updateOrganizerAsParticipant() {\n const findCurrentUserInParticipants = this.participants.find(p => p.email === this.currentUser?.email);\n if (this.isRoundRobinConfig && !findCurrentUserInParticipants && this.currentUser?.email) {\n const bookingCalendarDefault = this.currentUserCalendars?.find(calendar => calendar.is_primary)?.id || this.currentUserCalendars?.[0]?.id || 'primary';\n this.participants = [\n {\n name: this.currentUser?.name,\n email: this.currentUser?.email,\n is_organizer: true,\n availability: {\n calendar_ids: [bookingCalendarDefault],\n },\n booking: {\n calendar_id: bookingCalendarDefault,\n },\n },\n ...this.participants,\n ];\n }\n this.updateFormValue();\n }\n\n addParticipant() {\n debug('nylas-additional-participants', 'addParticipant');\n this.participants = [...this.participants, { name: '', email: '', is_organizer: false }];\n this.updateFormValue();\n }\n removeParticipant(index: number) {\n debug('nylas-additional-participants', 'removeParticipant');\n this.participants = this.participants.filter((_, i) => i !== index);\n this.updateFormValue();\n }\n\n updateFormValue() {\n debug('nylas-additional-participants', 'updateFormValue');\n const participants = this.isRoundRobinConfig ? (this.includeOrganizerAsParticipant ? this.participants : this.participants.filter(p => !p.is_organizer)) : this.participants;\n if (participants.length === 0) {\n this.isInternalsAvailable && this.internals.setValidity({ customError: true }, 'Please add at least one participant');\n this.error = 'Please add at least one participant';\n } else {\n this.isInternalsAvailable && this.internals.setValidity({});\n this.error = '';\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(participants), this.name);\n this.valueChanged.emit({ value: JSON.stringify(participants), name: this.name });\n }\n }\n\n // Filter out the participants that are already added\n getArrayDifference(array1: AdditionalParticipant[], array2: Participant[]) {\n const filtered = array1.filter(participant1 => !array2.some(participant2 => participant1.email === participant2.email));\n return filtered.map(participant => {\n return { value: participant.email, label: participant.email };\n });\n }\n\n @RegisterComponent<NylasAdditionalParticipants, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-additional-participants',\n stateToProps: new Map([\n ['schedulerConfig.additionalParticipants', 'participantOptions'],\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.currentUser', 'currentUser'],\n ['schedulerConfig.calendars', 'currentUserCalendars'],\n ]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host part=\"nap\">\n <nylas-form-card>\n <h3 slot=\"header-title\" class=\"nylas-additional-participants__title\" part=\"nap__title\">\n Participants\n </h3>\n <p slot=\"header-subtitle\" class=\"nylas-additional-participants__subtitle\" part=\"nap__subtitle\">\n Add people in your team or organization to join the event.\n </p>\n <div slot=\"content\" class=\"nylas-additional-participants__content\">\n <div>\n {this.participants.map((participant, index) => {\n return (\n <div class={'nylas-additional-participants__input_group'} part=\"nap__input_group\">\n {!participant.is_organizer && <label>{`Participant ${index}`}</label>}\n <div\n part=\"nap__input_wrapper\"\n class={{\n 'nylas-additional-participants__input_wrapper': true,\n 'nylas-additional-participants__input_wrapper_organizer': participant?.is_organizer === true,\n 'nylas-additional-participants__input_wrapper_invalid': participant.is_valid === false,\n 'error': participant.is_valid === false,\n }}\n >\n <div class={{ 'nylas-additional-participants__input': true, 'organizer': participant?.is_organizer === true }} part=\"nap__input\">\n {participant.is_organizer ? (\n <input-component\n class={'label-input'}\n name={`${index}`}\n key={index}\n label=\"Organizer\"\n required={false}\n readOnly={participant.is_organizer}\n defaultValue={participant.email}\n >\n {this.isRoundRobinConfig && (\n <div class=\"required-input\" slot=\"additional-input\">\n <input\n type=\"checkbox\"\n name={`organizer_participant`}\n id={`organizer_participant`}\n onClick={() => {\n this.includeOrganizerAsParticipant = !this.includeOrganizerAsParticipant;\n this.updateFormValue();\n }}\n checked={this.includeOrganizerAsParticipant}\n />\n <label htmlFor={`organizer_participant`} aria-label=\"Include as participant\">\n Participant\n <tooltip-component id=\"organizer_participant_tooltip\">\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">\n <strong>Include Organizer:</strong> The organizer (you) will be included in the round-robin rotation. <br />\n <strong>Exclude Organizer:</strong> The organizer (you) will not be included in the round-robin rotation.\n </span>\n </tooltip-component>\n </label>\n </div>\n )}\n </input-component>\n ) : (\n <input-dropdown\n id={`${index}`}\n name={`${index}`}\n filterable={true}\n inputValue={participant.email}\n options={this.getArrayDifference(this.participantOptions || [], this.participants)}\n />\n )}\n {!participant.is_organizer && (\n <button onClick={() => this.removeParticipant(index)} part=\"nap__remove-participant\">\n <close-icon />\n </button>\n )}\n </div>\n </div>\n {!participant.is_valid && (\n <p class=\"nylas-additional-participants__error\" part=\"nap__error\">\n {this.participantErrors[index]}\n </p>\n )}\n </div>\n );\n })}\n <p class=\"nylas-additional-participants__error\" part=\"nap__error\">\n {this.error}\n </p>\n </div>\n <button class=\"nylas-additional-participants__add\" part=\"nap__add-participant\" onClick={() => this.addParticipant()}>\n <add-circle-icon /> <span>Add {this.participants.length > 1 ? 'another' : 'a'} participant</span>\n </button>\n </div>\n </nylas-form-card>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-availability-picker {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n\n .header {\n padding: 1rem;\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n }\n\n .content {\n padding: 1rem;\n color: var(--nylas-base-900);\n font-size: 16px;\n font-family: var(--nylas-font-family);\n border-top: 1px solid var(--nylas-base-200);\n\n @media #{$small-mobile} {\n font-size: 15px;\n }\n\n .select-timezone {\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid var(--nylas-base-200);\n padding-bottom: 1rem;\n gap: 1rem;\n\n h4 {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n margin: 0;\n font-size: 16px;\n\n @media #{$small-mobile} {\n font-size: 15px;\n }\n\n font-weight: 500;\n line-height: 20px;\n }\n }\n\n .availability {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 0 0.5rem;\n\n @media #{$small-mobile} {\n gap: 0.5rem;\n padding: 0;\n }\n\n margin: 1rem 0;\n\n .availability-day {\n display: grid;\n grid-template-columns: minmax(auto, 65px) 1fr minmax(auto, 40px);\n\n @media #{$mobile} {\n grid-template-columns: 78px 1fr auto;\n }\n\n @media #{$small-mobile} {\n display: inline-grid;\n gap: 8px;\n grid-template-columns: 60px 1fr auto;\n }\n\n gap: 1rem;\n align-items: baseline;\n\n .day {\n display: flex;\n gap: 0.5rem;\n\n @media #{$small-mobile} {\n gap: 0.25rem;\n }\n\n align-items: center;\n\n input[type='checkbox'] {\n transform: scale(1.3);\n }\n }\n\n .time-ranges {\n span.unavailable {\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .time-range {\n display: flex;\n gap: 1.5rem;\n justify-content: space-between;\n align-items: baseline;\n\n @media #{$small-mobile} {\n justify-content: unset;\n gap: 0.5rem;\n }\n\n .pickers {\n display: flex;\n gap: 1rem;\n\n @media #{$small-mobile} {\n gap: 0.5rem;\n }\n\n span {\n margin-top: 0.75rem;\n }\n }\n\n &:not(:last-of-type) {\n margin-bottom: 1rem;\n }\n }\n\n p.error {\n color: var(--nylas-error);\n }\n }\n\n button {\n border: none;\n background: transparent;\n height: 40px;\n cursor: pointer;\n color: var(--nylas-base-800);\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n }\n }\n }\n }\n}\n\nselect-dropdown {\n width: auto;\n}\n\nselect-dropdown::part(sd_dropdown-button) {\n justify-content: initial;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { convertTo12HourFormat, convertTo24HourFormat, debug, minutesToTime, timeToMinutes } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { DEFAULT_OPEN_HOURS, TIMEZONE_MAP } from '@/common/constants';\nimport { Configuration } from '@nylas/core';\n\nexport type OpenHours = {\n days: number[];\n start: string;\n end: string;\n timezone: string;\n};\n\nexport type Schedule = {\n SUN: { start: string; end: string }[];\n MON: { start: string; end: string }[];\n TUE: { start: string; end: string }[];\n WED: { start: string; end: string }[];\n THU: { start: string; end: string }[];\n FRI: { start: string; end: string }[];\n SAT: { start: string; end: string }[];\n};\n\n/**\n * The `nylas-availability-picker` component is a form input for selecting availability (open hours).\n * @part nap__header - The header of the availability picker\n * @part nap__select-timezone - The timezone selection container\n * @part nap__select-timezone-button - The timezone selection button\n * @part nap__select-timezone-dropdown-content - The timezone selection dropdown content\n * @part nap__availability - The availability container\n * @part nap__day - The day container\n * @part nap__time-ranges - The time ranges container\n * @part nap__time-range - The time range container\n * @part nap__add-time-range - The add time range button\n * @part nap__time-picker-container - The time picker container\n * @part nap__time-picker-input - The time picker input\n * @part nap__time-picker-times - The time picker times\n */\n@Component({\n tag: 'nylas-availability-picker',\n styleUrl: 'nylas-availability-picker.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasAvailabilityPicker {\n /**\n * The element <nylas-availability-picker> itself.\n */\n @Element() host!: HTMLNylasAvailabilityPickerElement;\n /**\n * @standalone\n * The name of the availability picker.\n */\n @Prop() name: string = 'availability';\n /**\n * @standalone\n * The selected configuration.\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The open hours to display.\n */\n @Prop() openHours?: OpenHours[];\n /**\n * @standalone\n * The default timezone or preset timezone.\n */\n @Prop() defaultTimezone: string = Intl.DateTimeFormat().resolvedOptions().timeZone;\n /**\n * @standalone\n * Hide the header of the availability picker.\n */\n @Prop() hideHeader: boolean = false;\n\n /**\n * This event is fired when the selected availability / open hours change.\n * The value is a stringified JSON object with the open hours and timezone.\n ```\n {\n openHours: OpenHours[],\n timezone: string\n }\n ```\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n @State() schedule = {\n SUN: [],\n MON: [{ start: '09:00am', end: '05:00pm' }],\n TUE: [{ start: '09:00am', end: '05:00pm' }],\n WED: [{ start: '09:00am', end: '05:00pm' }],\n THU: [{ start: '09:00am', end: '05:00pm' }],\n FRI: [{ start: '09:00am', end: '05:00pm' }],\n SAT: [],\n };\n /**\n * The selected timezone state.\n */\n @State() timezone: string = '';\n\n /**\n * The overlapping time ranges state. This is used to display an error message when there are overlapping time ranges.\n */\n @State() overlapDays: { [key: string]: number[] } = {};\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-calendar-picker', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n configChangedHandler(newConfig: Configuration) {\n const defaultOpenHours = newConfig?.availability?.availability_rules?.default_open_hours ?? DEFAULT_OPEN_HOURS;\n // If the name is `availability`, we are setting the default open hours. If the name is `participant-****`, we are setting the participant's custom availability.\n // Set the timezone accordingly.\n const defaultOpenHoursTimezone = newConfig?.event_booking?.timezone ?? this.defaultTimezone;\n this.timezone = this.name === 'availability' ? defaultOpenHoursTimezone : this.defaultTimezone;\n if (this.openHours) {\n this.openHoursToSchedule(this.openHours);\n } else if (defaultOpenHours) {\n this.openHoursToSchedule(defaultOpenHours);\n }\n }\n\n @Watch('schedule')\n scheduleChanged(newValue: Schedule, oldValue: Schedule) {\n if (newValue !== oldValue) {\n let overlapDays: { [key: string]: number[] } = {};\n Object.keys(newValue).forEach(key => {\n const dayTimeRanges = newValue[key];\n if (dayTimeRanges.length > 0) {\n const overlaps = this.getOverlaps(dayTimeRanges);\n if (overlaps.length > 0) {\n overlapDays[key] = overlaps;\n }\n }\n });\n this.overlapDays = overlapDays;\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n if (Object.keys(overlapDays).length > 0) {\n const element = this.host.shadowRoot?.getElementById(Object.keys(overlapDays)[0]) as HTMLInputElement;\n if (element) {\n debug('nylas-availability-picker', 'The time ranges are overlapping. Overlap: ', overlapDays);\n this.internals.setValidity({ customError: true }, 'Overlapping time ranges found', element);\n }\n } else {\n this.internals.setValidity({ customError: false });\n this.internals.setFormValue(\n JSON.stringify({\n openHours: this.scheduleToOpenHours(this.schedule),\n timezone: this.timezone,\n }),\n );\n }\n this.valueChanged.emit({\n value: JSON.stringify({\n openHours: this.scheduleToOpenHours(newValue),\n timezone: this.timezone,\n }),\n name: this.name,\n });\n }\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(\n event: CustomEvent<{\n value: string;\n name: string;\n }>,\n ) {\n const { name, value } = event.detail;\n if (name === 'timezone') {\n this.timezone = value;\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n const updateValue = {\n openHours: this.scheduleToOpenHours(this.schedule),\n timezone: this.timezone,\n };\n this.internals.setFormValue(JSON.stringify(updateValue));\n this.valueChanged.emit({\n value: JSON.stringify(updateValue),\n name: this.name,\n });\n }\n }\n\n connectedCallback() {\n debug('nylas-availability-picker', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-availability-picker', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-availability-picker', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-availability-picker', 'componentDidLoad');\n\n if (this.selectedConfiguration) {\n this.configChangedHandler(this.selectedConfiguration);\n } else {\n this.timezone = this.defaultTimezone;\n }\n\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n const updateValue = {\n openHours: this.scheduleToOpenHours(this.schedule),\n timezone: this.timezone,\n };\n this.internals.setFormValue(JSON.stringify(updateValue));\n this.valueChanged.emit({\n value: JSON.stringify(updateValue),\n name: this.name,\n });\n }\n\n getOverlaps(timeRanges) {\n // Convert times to minutes and add to the array\n let timeRangesInMinutes = timeRanges.map((range, index) => ({\n start: timeToMinutes(range.start),\n end: timeToMinutes(range.end),\n originalIndex: index,\n }));\n\n // Sort by start time\n timeRangesInMinutes.sort((a, b) => a.start - b.start);\n let overlaps: number[] = [];\n // Check for overlap\n for (let i = 1; i < timeRangesInMinutes.length; i++) {\n if (timeRangesInMinutes[i].start < timeRangesInMinutes[i - 1].end) {\n // Add both overlapping time range indices if they are not already included\n if (!overlaps.includes(timeRangesInMinutes[i].originalIndex)) {\n overlaps.push(timeRangesInMinutes[i].originalIndex);\n }\n if (!overlaps.includes(timeRangesInMinutes[i - 1].originalIndex)) {\n overlaps.push(timeRangesInMinutes[i - 1].originalIndex);\n }\n }\n }\n return overlaps.sort((a, b) => a - b); // Return sorted list of indices\n }\n\n addTimeRange(day) {\n const currentTimeRanges = this.schedule[day];\n\n // Default working hours are from 00:00 to 23:45 for calculation purposes\n const dayStart = 0; // Start of the day in minutes (00:00)\n const dayEnd = 1425; // End of the day in minutes (23:45)\n\n if (currentTimeRanges.length === 0) {\n // If there are no existing time ranges, add one at the start of the day\n this.schedule[day] = [{ start: '09:00am', end: '05:00pm' }]; // Example range\n } else {\n // Convert all time ranges to minutes for comparison\n const timeRangesInMinutes = currentTimeRanges\n .map(range => ({\n start: timeToMinutes(range.start),\n end: timeToMinutes(range.end),\n }))\n .sort((a, b) => a.start - b.start); // Sort by start time\n\n // Attempt to add a new time range at the end of the day\n const lastRangeEnd = timeRangesInMinutes[timeRangesInMinutes.length - 1].end;\n if (lastRangeEnd + 60 <= dayEnd) {\n // There's room at the end of the day\n this.schedule[day].push({\n start: convertTo12HourFormat(minutesToTime(lastRangeEnd)),\n end: convertTo12HourFormat(minutesToTime(lastRangeEnd + 60)),\n });\n } else {\n // No room at the end, look for gaps at the beginning of the day\n let gapFound = false;\n if (timeRangesInMinutes[0].start > dayStart + 60) {\n // There's room for at least a 1-hour meeting at the beginning of the day\n this.schedule[day].push({\n start: convertTo12HourFormat(minutesToTime(dayStart)),\n end: convertTo12HourFormat(minutesToTime(dayStart + 60)),\n });\n gapFound = true;\n }\n\n if (!gapFound) {\n // Search for gaps between scheduled time ranges\n for (let i = 0; i < timeRangesInMinutes.length - 1; i++) {\n const currentEnd = timeRangesInMinutes[i].end;\n const nextStart = timeRangesInMinutes[i + 1].start;\n\n if (nextStart - currentEnd >= 60) {\n // Found a gap\n this.schedule[day].push({\n start: convertTo12HourFormat(minutesToTime(currentEnd)),\n end: convertTo12HourFormat(minutesToTime(currentEnd + 60)),\n });\n break; // Exit the loop after adding a time range\n }\n }\n }\n }\n }\n\n // Sort the updated schedule to maintain order\n this.schedule[day].sort((a, b) => timeToMinutes(a.start) - timeToMinutes(b.start));\n\n this.schedule = { ...this.schedule };\n }\n\n removeTimeRange(day, index) {\n this.schedule[day].splice(index, 1);\n this.schedule = { ...this.schedule };\n }\n\n @Listen('timeChange')\n setTime(event: CustomEvent<{ key: string; value: string }>) {\n const { key, value } = event.detail;\n const [dayIndex, timeType] = key.split('_');\n const [day, index] = dayIndex.split(':');\n\n if (timeType === 'start') {\n this.schedule[day][index].start = value;\n } else if (timeType === 'end') {\n this.schedule[day][index].end = value;\n }\n this.internals.setValidity({ customError: false });\n this.schedule = { ...this.schedule };\n }\n\n @Listen('formError')\n setFormError(event: CustomEvent<{ key: string; message: string }>) {\n const { key } = event.detail;\n const [_, timeType] = key.split('_');\n const element = this.host.shadowRoot?.getElementById(key);\n if (element) {\n this.internals.setValidity({ customError: true }, `Invalid ${timeType} time`, element as HTMLInputElement);\n }\n }\n\n openHoursToSchedule(openHours: OpenHours[]) {\n const newSchedule = {\n SUN: [],\n MON: [],\n TUE: [],\n WED: [],\n THU: [],\n FRI: [],\n SAT: [],\n };\n openHours.forEach(openHour => {\n openHour.days.forEach(day => {\n const dayKey = this.getDayKey(day);\n const start12hr = convertTo12HourFormat(openHour.start);\n const end12hr = convertTo12HourFormat(openHour.end);\n const timeRange = { start: start12hr, end: end12hr };\n\n // Check if the time range already exists for the day\n let timeRangeExists = false;\n if (newSchedule[dayKey]) {\n // Search for an existing time range that matches the current one\n timeRangeExists = newSchedule[dayKey].some(range => range.start === timeRange.start && range.end === timeRange.end);\n }\n\n if (!timeRangeExists) {\n if (newSchedule[dayKey]) {\n newSchedule[dayKey].push(timeRange);\n } else {\n newSchedule[dayKey] = [timeRange];\n }\n }\n });\n });\n\n this.schedule = newSchedule;\n }\n\n getDayKey(dayIndex: number): string {\n const days = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];\n return days[dayIndex];\n }\n\n scheduleToOpenHours(schedule: Schedule): OpenHours[] {\n const dayKeys = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];\n let openHoursMap: Map<string, { days: number[]; start: string; end: string }> = new Map();\n\n dayKeys.forEach((dayKey, index) => {\n if (schedule[dayKey]) {\n // Check if schedule for the day exists\n schedule[dayKey].forEach(timeRange => {\n const start24hr = convertTo24HourFormat(timeRange.start);\n const end24hr = convertTo24HourFormat(timeRange.end);\n const key = `${start24hr}-${end24hr}`;\n\n if (!openHoursMap.has(key)) {\n openHoursMap.set(key, { days: [index], start: start24hr, end: end24hr });\n } else {\n let entry = openHoursMap.get(key);\n if (entry) {\n entry.days.push(index);\n openHoursMap.set(key, entry);\n }\n }\n });\n }\n });\n\n let selectedOpenHours: OpenHours[] = [];\n openHoursMap.forEach((value, _key) => {\n selectedOpenHours.push({\n days: value.days,\n start: value.start,\n end: value.end,\n timezone: this.timezone,\n });\n });\n\n return selectedOpenHours;\n }\n\n @RegisterComponent<NylasAvailabilityPicker, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-availability-picker',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n fireRegisterEvent: true,\n })\n render() {\n const timezoneOptions = Object.keys(TIMEZONE_MAP).map(key => ({\n label: TIMEZONE_MAP[key],\n value: key,\n }));\n const selectedTimezoneOption = timezoneOptions.find(i => i.value === this.timezone);\n\n return (\n <Host>\n <div class=\"nylas-availability-picker\" part=\"nap\">\n {!this.hideHeader && (\n <div class=\"header\" part=\"nap__header\">\n <h3>Default open hours</h3>\n <p>\n Set when you're regularly available for event bookings.\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">This is the default availability for participants who don’t have availability set on the Participants tab.</span>\n </tooltip-component>\n </p>\n </div>\n )}\n <div class=\"content\">\n <div class=\"select-timezone\" part=\"nap__select-timezone\">\n <h4 class=\"sub-header\">Select timezone</h4>\n {selectedTimezoneOption?.label && (\n <select-dropdown\n name=\"timezone\"\n exportparts=\"sd_dropdown: nap__timezone-container, sd_dropdown-button: nap__timezone-button, sd_dropdown-content: nap__timezone-dropdown-content\"\n options={timezoneOptions}\n defaultSelectedOption={selectedTimezoneOption}\n >\n <span slot=\"select-icon\">\n <globe-icon width=\"20\" height=\"20\" />\n </span>\n </select-dropdown>\n )}\n </div>\n <div class=\"availability\" part=\"nap__availability\">\n {Object.keys(this.schedule).map(key => {\n const day = key;\n const timeRanges = this.schedule[key] as { start: string; end: string }[];\n return (\n <div class=\"availability-day\">\n <div class=\"day\" part=\"nap__day\">\n <input\n type=\"checkbox\"\n name={day}\n id={day}\n checked={timeRanges.length > 0}\n onClick={() => {\n if (timeRanges.length > 0) {\n this.schedule[day] = [];\n } else {\n this.schedule[day] = [{ start: '09:00am', end: '05:00pm' }];\n }\n this.schedule = { ...this.schedule };\n }}\n />\n <label htmlFor={day} aria-label=\"Select day\">\n {day}\n </label>\n </div>\n <div class=\"time-ranges\" part=\"nap__time-ranges\">\n {timeRanges.length ? null : <span class=\"unavailable\">Unavailable</span>}\n {timeRanges.length > 0 &&\n timeRanges.map((timeRange, timeRangeIndex) => {\n const startKey = `${key}:${timeRangeIndex}_start`;\n const endKey = `${key}:${timeRangeIndex}_end`;\n return (\n <div class=\"time-range\" part=\"nap__time-range\">\n <div class=\"pickers\">\n <nylas-time-window-picker\n id={startKey}\n hasError={this.overlapDays[day]?.includes(timeRangeIndex)}\n time={timeRange.start}\n name={startKey}\n key={startKey}\n exportparts=\"time-picker: nap__time-picker-container, time-input: nap__time-picker-input, times: nap__time-picker-times\"\n />\n <span> - </span>\n <nylas-time-window-picker\n id={endKey}\n hasError={this.overlapDays[day]?.includes(timeRangeIndex)}\n time={timeRange.end}\n name={endKey}\n key={endKey}\n minimumStartTime={timeRange.start}\n exportparts=\"time-picker: nap__time-picker-container, time-input: nap__time-picker-input, times: nap__time-picker-times\"\n />\n </div>\n <button onClick={() => this.removeTimeRange(day, timeRangeIndex)}>\n <close-icon />\n </button>\n </div>\n );\n })}\n <p class=\"error\">{this.overlapDays[day] ? 'Overlapping time ranges' : ''}</p>\n </div>\n <div>\n {timeRanges.length > 0 ? (\n <button onClick={() => this.addTimeRange(day)} part=\"nap__add-time-range\">\n <add-circle-icon />\n </button>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-booking-calendar-picker {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n\n .header {\n padding: 1rem;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n }\n\n .nylas-booking-calendar-picker__loading {\n padding-bottom: 1rem;\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n .label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 1rem 1rem 0;\n color: var(--nylas-base-800);\n }\n\n .loading-button {\n margin: 0 1rem;\n padding: 0;\n width: inherit;\n height: 48px;\n color: black;\n font-size: 1rem;\n cursor: not-allowed;\n display: flex;\n gap: 0.5rem;\n justify-content: space-between;\n align-items: center;\n background: transparent;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n\n span {\n padding: 0 1rem;\n }\n }\n }\n\n .nylas-booking-calendar-picker__dropdown {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n span.label {\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--nylas-base-800);\n\n tooltip-component {\n display: flex;\n }\n }\n\n select-dropdown::part(sd_dropdown) {\n width: 100%;\n }\n\n select-dropdown::part(sd_dropdown-content) {\n width: 100%;\n max-width: unset;\n }\n\n select-dropdown::part(sd_dropdown-button) {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n }\n\n select-dropdown::part(sd_dropdown-button-selected-label) {\n max-width: calc(100% - 2rem);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { Calendar } from '@nylas/core';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { User } from '@/common/nylas-api-request';\n\n/**\n * The `nylas-booking-calendar-picker` component is a UI component that displays the booking calendar picker.\n * @part nbcp - The booking calendar picker container\n * @part nbcp__header - The header of the booking calendar picker\n * @part nbcp__input-label - The input label of the booking calendar picker\n * @part nbcp__dropdown - The dropdown container\n * @part nbcp__dropdown-button - The dropdown button\n * @part nbcp__dropdown-content - The dropdown content\n */\n@Component({\n tag: 'nylas-booking-calendar-picker',\n styleUrl: 'nylas-booking-calendar-picker.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasBookingCalendarPicker {\n @Element() host!: HTMLNylasCalendarPickerElement;\n /**\n * @standalone\n * The calendars to choose from.\n */\n @Prop() calendars?: Calendar[];\n /**\n * @standalone\n * The current logged in user.\n */\n @Prop() currentUser?: User;\n /**\n * @standalone\n * The list of user's calendars.\n */\n @Prop() currentUserCalendars?: Calendar[];\n /**\n * @standalone\n * The name of the calendar picker.\n */\n @Prop() name: string = 'booking-calendar';\n /**\n * @standalone\n * The default selected calendar.\n */\n @Prop() defaultBookingCalendar: string = '';\n /**\n * The prop to hide the header.\n */\n @Prop() hideHeader: boolean = false;\n /**\n * Prop for express flow when creating a config\n */\n @Prop() expressFlow: boolean = false;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The selected calendars.\n */\n @State() selectedCalendar: string = '';\n\n /**\n * This event is fired when the selected booking calendar changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-booking-calendar-picker', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-booking-calendar-picker', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-booking-calendar-picker', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-booking-calendar-picker', 'componentDidLoad');\n const primaryCalendar = this.calendars?.find(calendar => calendar.is_primary)?.id;\n const firstCalendar = this.calendars?.[0]?.id;\n this.defaultBookingCalendar = this.defaultBookingCalendar || primaryCalendar || firstCalendar || '';\n this.isInternalsAvailable && this.internals.setFormValue(this.defaultBookingCalendar.toString(), this.name);\n this.selectedCalendar = this.defaultBookingCalendar;\n }\n\n componentWillUpdate() {\n debug('nylas-booking-calendar-picker', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-booking-calendar-picker', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-booking-calendar-picker', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-booking-calendar-picker', 'componentDidRender');\n }\n\n get isInternalsAvailable() {\n return this.internals !== undefined && typeof this.internals.setFormValue === 'function';\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-booking-calendar-picker', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('currentUserCalendars')\n currentUserCalendarsChangedHandler(newValue: Calendar[]) {\n debug('nylas-booking-calendar-picker', 'currentUserCalendarsChangedHandler', newValue);\n this.currentUserCalendars = newValue;\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-booking-calendar-picker', 'nylasFormDropdownChangedHandler', event.detail);\n // Pass as handler so that if event.defaultPrevented by parent app, this will be skipped.\n this.isInternalsAvailable && this.internals.setValidity({});\n const valueChanged = (event: CustomEvent<{ value: string; name: string }>) => {\n const { value } = event.detail;\n this.selectedCalendar = value;\n this.isInternalsAvailable && this.internals.setFormValue(value.toString(), this.name);\n };\n this.valueChanged.emit({ value: event.detail.value, name: this.name, valueChanged });\n }\n\n @RegisterComponent<NylasBookingCalendarPicker, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-booking-calendar-picker',\n stateToProps: new Map([\n ['schedulerConfig.calendars', 'currentUserCalendars'],\n ['schedulerConfig.currentUser', 'currentUser'],\n ]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const currentUserCalendarOptions =\n this.currentUserCalendars?.map(calendar => {\n return {\n value: calendar.id,\n label: calendar.name,\n };\n }) ?? [];\n\n const optionsFromCalendars =\n this.calendars?.map(calendar => {\n return {\n value: calendar.id,\n label: calendar.name,\n };\n }) ?? [];\n const calendarOptions = optionsFromCalendars?.length > 0 ? optionsFromCalendars : currentUserCalendarOptions || [];\n const defaultOption = calendarOptions.find(cal => cal.value == this.defaultBookingCalendar);\n return (\n <Host>\n <div class=\"nylas-booking-calendar-picker\" part=\"nbcp\">\n {!this.hideHeader && (\n <div class=\"header\" part=\"nbcp__header\">\n <h3>Calendar booking</h3>\n <p>\n Select the calendar where you want to add event bookings.\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">The calendar will be used to create events.</span>\n </tooltip-component>\n </p>\n </div>\n )}\n {calendarOptions.length > 0 ? (\n <div class=\"nylas-booking-calendar-picker__dropdown\">\n <select-dropdown\n name=\"booking-calendar\"\n options={[{ value: '', label: 'Select an option' }, ...calendarOptions]}\n withSearch={false}\n required={this.expressFlow}\n emptyValue={'Select an option'}\n errorMessage=\"Please select a calendar\"\n exportparts=\"sd_dropdown: nbcp__dropdown, sd_dropdown-button: nbcp__dropdown-button, sd_dropdown-content: nbcp__dropdown-content\"\n defaultSelectedOption={defaultOption ? defaultOption : null}\n />\n </div>\n ) : (\n <div class=\"nylas-booking-calendar-picker__loading\">\n <span class=\"label\">\n Select a calendar to book meetings on <info-icon />\n </span>\n <div class=\"loading-button\">\n <span>Loading...</span>\n </div>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-booking-confirmation-redirect {\n width: inherit;\n display: flex;\n flex-direction: column;\n\n .nylas-booking-confirmation-redirect__dropdown {\n span.label {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-bottom: 4px;\n color: var(--nylas-base-800);\n\n tooltip-component {\n display: flex;\n }\n }\n\n select-dropdown::part(sd_dropdown) {\n width: 100%;\n }\n\n select-dropdown::part(sd_dropdown-button) {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 1rem;\n }\n\n select-dropdown::part(sd_dropdown-content) {\n width: 100%;\n max-width: unset;\n }\n\n select-dropdown::part(sd_dropdown-button-selected-label) {\n max-width: calc(100% - 2rem);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n\n input-component::part(ic__input_wrapper) {\n margin-top: 1rem;\n }\n\n span.error-message {\n color: var(--nylas-error);\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { isValidUrl } from '@/utils/utils';\nimport { Configuration } from '@nylas/core';\n\n/**\n * The `nylas-booking-confirmation-redirect` component is a UI component that allows the user to choose a custom redirect URL after a booking is confirmed.\n * @part nbcr - The booking redirect container\n * @part nbcr__header - The header of the booking redirect\n * @part nbcr__dropdown - The dropdown container\n * @part nbcr__dropdown-button - The dropdown button\n * @part nbcr__dropdown-content - The dropdown content\n * @part nbcr__input-textfield - The input field content\n */\n@Component({\n tag: 'nylas-booking-confirmation-redirect',\n styleUrl: 'nylas-booking-confirmation-redirect.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasBookingConfirmationRedirect {\n @Element() host!: HTMLNylasBookingConfirmationRedirectElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The name of the confirmation redirect link.\n */\n @Prop() name: string = 'confirmation-redirect';\n /**\n * @standalone\n * The custom redirect URL.\n */\n @Prop() redirectUrl: string = '';\n /**\n * @standalone\n * The custom redirect URL error message\n */\n @Prop() redirectUrlErrorMessage: string = '';\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The current redirect URL.\n */\n @State() currentRedirectUrl: string = '';\n /**\n * The state for whether a custom URL can be added.\n */\n @State() acceptUrl!: boolean;\n\n @State() componentLoaded: boolean = false;\n\n /**\n * This event is fired when the current redirect URL changes and is valid.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-booking-confirmation-redirect', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-booking-confirmation-redirect', 'selectedConfigurationChangedHandler', newValue);\n if (newValue?.scheduler?.confirmation_redirect_url) {\n this.currentRedirectUrl = newValue?.scheduler?.confirmation_redirect_url;\n this.acceptUrl = newValue?.scheduler?.confirmation_redirect_url !== '';\n }\n }\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-booking-confirmation-redirect', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-booking-confirmation-redirect', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-booking-confirmation-redirect', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-booking-confirmation-redirect', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.currentRedirectUrl = this.redirectUrl;\n this.acceptUrl = this.redirectUrl !== '';\n }\n this.componentLoaded = true;\n if (typeof this.internals.setFormValue === 'function') {\n this.internals.setFormValue(this.currentRedirectUrl.toString(), this.name);\n }\n }\n\n componentWillUpdate() {\n debug('nylas-booking-confirmation-redirect', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-booking-confirmation-redirect', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-booking-confirmation-redirect', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-booking-confirmation-redirect', 'componentDidRender');\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-booking-confirmation-redirect', 'nylasFormDropdownChangedHandler', event.detail);\n\n const { name, value } = event.detail;\n\n if (name === 'confirmation-redirect-dropdown') {\n if (value === 'custom') {\n this.acceptUrl = true;\n } else {\n this.acceptUrl = false;\n\n // Submit empty string to clear redirect URL\n this.internals.setFormValue('', this.name);\n this.valueChanged.emit({ name: this.name, value: '' });\n }\n }\n }\n\n @Listen('nylasFormInputBlurred')\n nylasFormInputBlurHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { name, value } = event.detail;\n this.currentRedirectUrl = value;\n\n if (this.acceptUrl && name === 'confirmation-redirect') {\n this.redirectUrlErrorMessage = '';\n\n if (!isValidUrl(this.currentRedirectUrl)) {\n this.internals.setValidity({ customError: true }, 'Please enter a valid URL.');\n this.redirectUrlErrorMessage = 'Please enter a valid URL.';\n return;\n }\n this.internals.setValidity({});\n\n // Pass as handler so that if event.defaultPrevented by parent app, this will be skipped.\n const valueChanged = (event: CustomEvent<{ value: string; name: string }>) => {\n const { value } = event.detail;\n this.internals.setFormValue(value.toString(), this.name);\n };\n this.valueChanged.emit({ ...event.detail, valueChanged });\n }\n }\n\n @Listen('formSubmitted', { target: 'document' })\n formSubmittedHandler(_event: CustomEvent) {\n if (this.acceptUrl && !isValidUrl(this.currentRedirectUrl)) {\n this.internals.setValidity({ customError: true }, 'Please enter a valid URL.');\n this.redirectUrlErrorMessage = 'Please enter a valid URL.';\n } else {\n this.internals.setValidity({});\n }\n }\n\n @RegisterComponent<NylasBookingConfirmationRedirect, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-booking-confirmation-redirect',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const redirectOptions = [\n {\n label: 'Display default confirmation page',\n value: 'default',\n },\n {\n label: 'Redirect to custom URL',\n value: 'custom',\n },\n ];\n\n return (\n <Host>\n <div class=\"nylas-booking-confirmation-redirect\" part=\"nbcr\">\n {redirectOptions.length > 0 && (\n <div class=\"nylas-booking-confirmation-redirect__dropdown\">\n <span class=\"label\">\n When a booking is confirmed\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">You can either display the default confirmation page or redirect users to your own confirmation page.</span>\n </tooltip-component>\n </span>\n {this.componentLoaded && (\n <select-dropdown\n name=\"confirmation-redirect-dropdown\"\n options={redirectOptions}\n withSearch={false}\n defaultSelectedOption={redirectOptions.find(option => option.value === (this.acceptUrl ? 'custom' : 'default'))}\n exportparts=\"sd_dropdown: nbcr__dropdown, sd_dropdown-button: nbcr__dropdown-button, sd_dropdown-content: nbcr__dropdown-content\"\n />\n )}\n {this.acceptUrl && (\n <div>\n <input-component\n name=\"confirmation-redirect\"\n id=\"confirmation-redirect\"\n type=\"text\"\n placeholder=\"Enter custom redirect URL\"\n required={false}\n part=\"ic__input_wrapper: nbcr__input-textfield\"\n defaultValue={this.currentRedirectUrl}\n />\n {this.redirectUrlErrorMessage && <span class=\"error-message\">{this.redirectUrlErrorMessage}</span>}\n </div>\n )}\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-booking-confirmation-type {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin-bottom: 1rem;\n\n .nylas-booking-confirmation-type__dropdown {\n span.label {\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--nylas-base-800);\n\n tooltip-component {\n display: flex;\n }\n }\n\n select-dropdown::part(sd_dropdown) {\n width: 100%;\n }\n\n select-dropdown::part(sd_dropdown-button) {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 1rem;\n }\n\n select-dropdown::part(sd_dropdown-content) {\n width: 100%;\n max-width: unset;\n }\n\n select-dropdown::part(sd_dropdown-button-selected-label) {\n max-width: calc(100% - 2rem);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\n\n/**\n * The `nylas-booking-confirmation-type` component is a UI component that allows the user to choose a custom redirect URL after a booking is confirmed.\n * @part nbct - The custom booking flow container\n * @part nbct__header - The header of the custom booking flow\n * @part nbct__dropdown - The dropdown container\n * @part nbct__dropdown-button - The dropdown button\n * @part nbct__dropdown-content - The dropdown content\n */\n@Component({\n tag: 'nylas-booking-confirmation-type',\n styleUrl: 'nylas-booking-confirmation-type.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasBookingConfirmationType {\n @Element() host!: HTMLNylasBookingConfirmationTypeElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n\n /**\n * @standalone\n * The name of the confirmation redirect link.\n */\n @Prop() name: string = 'confirmation-type';\n /**\n * @standalone\n * The booking type.\n */\n @Prop() bookingType: string = 'booking';\n /**\n * @standalone\n * Show or hide the confirmation type.\n * This prop is automatically determined based on the value of selectedConfiguration in the config,\n * making it unnecessary to set this prop manually.\n */\n @Prop() showComponent: boolean = this.selectedConfiguration?.event_booking?.booking_type !== 'custom-confirmation';\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The selected bookingType.\n */\n @State() selectedBookingType!: string;\n\n /**\n * The open/close state of the booking confirmation type dropdown.\n */\n @State() showDropdown!: boolean;\n /**\n * This event is fired when the selected bookingType changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-booking-confirmation-type', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-booking-confirmation-type', 'selectedConfigurationChangedHandler', newValue);\n if (newValue?.event_booking?.booking_type) {\n this.selectedBookingType = newValue?.event_booking?.booking_type;\n this.showDropdown = newValue?.event_booking?.booking_type !== 'custom-confirmation' && !!newValue?.scheduler?.organizer_confirmation_url;\n }\n }\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-booking-confirmation-type', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-booking-confirmation-type', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-booking-confirmation-type', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-booking-confirmation-type', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.selectedBookingType = this.bookingType || 'booking';\n this.showDropdown = this.showComponent;\n }\n this.internals.setFormValue(this.selectedBookingType.toString(), this.name);\n }\n\n componentWillUpdate() {\n debug('nylas-booking-confirmation-type', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-booking-confirmation-type', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-booking-confirmation-type', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-booking-confirmation-type', 'componentDidRender');\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-booking-confirmation-type', 'nylasFormDropdownChangedHandler', event.detail);\n // Pass as handler so that if event.defaultPrevented by parent app, this will be skipped.\n const valueChanged = (event: CustomEvent<{ value: string; name: string }>) => {\n const { value } = event.detail;\n this.selectedBookingType = value;\n this.internals.setFormValue(value.toString(), this.name);\n };\n this.valueChanged.emit({ ...event.detail, valueChanged });\n }\n\n @RegisterComponent<NylasBookingConfirmationType, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-booking-confirmation-type',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const bookingOptions = [\n {\n label: 'Automatically accept bookings',\n value: 'booking',\n },\n {\n label: 'Manually accept bookings',\n value: 'organizer-confirmation',\n },\n ];\n\n return (\n <Host>\n {this.showDropdown && (\n <div class=\"nylas-booking-confirmation-type\" part=\"nbct\">\n {bookingOptions.length > 0 && (\n <div class=\"nylas-booking-confirmation-type__dropdown\">\n <span class=\"label\">\n When a booking is requested\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">Manually accept bookings allows you to review and either accept or decline each booking request.</span>\n </tooltip-component>\n </span>\n {this.selectedBookingType && (\n <select-dropdown\n name=\"booking-type\"\n options={bookingOptions}\n withSearch={false}\n exportparts=\"sd_dropdown: nbct__dropdown, sd_dropdown-button: nbct__dropdown-button, sd_dropdown-content: nbct__dropdown-content\"\n defaultSelectedOption={bookingOptions.find(cal => cal.value == this.selectedBookingType)}\n />\n )}\n </div>\n )}\n </div>\n )}\n </Host>\n );\n }\n}\n","/**!\n * Sortable 1.15.2\n * @author\tRubaXa <trash@rubaxa.org>\n * @author\towenm <owen23355@gmail.com>\n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.15.2\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n return false;\n}\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\nfunction css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n } while (!selfOnly && (el = el.parentNode));\n }\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n return list;\n }\n return [];\n}\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect();\n\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n } while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n\n /* jshint boss:true */\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n currentChild++;\n }\n i++;\n }\n return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) {\n return -1;\n }\n\n /* jshint boss:true */\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n } while (elem = elem.parentNode);\n return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function (child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n }\n\n // if fromRect != toRect: animate\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) {\n time = _this.options.animation;\n }\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction repaint(target) {\n return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n\n // Add default options from plugin\n _extends(defaults, initialized.defaults);\n });\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\n ghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n\n _silent = false,\n savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return;\n // false when <= IE11\n if (IE11OrLess) {\n return false;\n }\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n }(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n },\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n },\n /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\n _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n },\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n },\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n },\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[expando]._onDragOver(event);\n }\n }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n this.el = el; // root element\n this.options = options = _extends({}, options);\n\n // Export instance\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults);\n\n // Set default options\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n _prepareGroup(options);\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n }\n\n // Bind events\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n sortables.push(this.el);\n\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n // Add animation state manager\n _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n if (!evt.cancelable) return;\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n _saveInputCheckedState(el);\n\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if (dragEl) {\n return;\n }\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n }\n\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) {\n return;\n }\n\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n target = closest(target, options.draggable, el, false);\n if (target && target.animated) {\n return;\n }\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n }\n\n // Get the index of the dragged element within its parent\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable);\n\n // Check filter\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n }\n\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n }\n\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n\n // Drag start event\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n });\n\n // Chosen item\n toggleClass(dragEl, options.chosenClass, true);\n };\n\n // Disable \"draggable\"\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop);\n\n // Make dragEl draggable (must be before delay for FireFox)\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n pluginEvent('delayStart', this, {\n evt: evt\n });\n\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n try {\n if (document.selection) {\n // Timeout neccessary for IE9\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n awaitingDragStarted = false;\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n var options = this.options;\n\n // Apply effect\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost();\n\n // Drag start event\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n _hideGhostForTarget();\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n target = parent; // store last element\n }\n /* jshint boss:true */ while (parent = parent.parentNode);\n }\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n // only set the status to dragging, when we are actually dragging\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n this._onDragStart(evt, true);\n }\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options;\n\n // Position absolutely\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl);\n\n // Set transform-origin\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n pluginEvent('setupClone', this);\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.removeAttribute(\"id\");\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n this._hideClone();\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n }\n\n // #1143: IFrame support workaround\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n _this._hideClone();\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true);\n\n // Set proper drop events\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n on(document, 'drop', _this);\n\n // #1276 fix:\n css(dragEl, 'transform', 'translateZ(0)');\n }\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver( /**Event*/evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n if (_silent) return;\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n\n // Capture animation state\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n _this.captureAnimationState();\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n }\n\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n }\n\n // Animation\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n\n // Null lastTarget if it is not inside a previously swapped element\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n }\n\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n // Do not detect for empty insert if already inserted\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n\n // Call when dragEl has been inserted\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n if (revert) {\n parentEl = rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent('revert');\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n return completed(true);\n }\n var elLastChild = lastChild(el, options.draggable);\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n }\n\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n if (target) {\n targetRect = getRect(target);\n }\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) {\n // the last draggable element is not the last node\n el.insertBefore(dragEl, elLastChild.nextSibling);\n } else {\n el.appendChild(dragEl);\n }\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n if (firstChild === dragEl) {\n return completed(false);\n }\n target = firstChild;\n targetRect = getRect(target);\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n }\n\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n parentEl = dragEl.parentNode; // actualization\n\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n changed();\n return completed(true);\n }\n }\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop( /**Event*/evt) {\n var el = this.el,\n options = this.options;\n\n // Get the index of the dragged element within its parent\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode;\n\n // Get again after plugin event\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n if (Sortable.eventCanceled) {\n this._nulling();\n return;\n }\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n _cancelNextTick(this.cloneId);\n _cancelNextTick(this._dragStartId);\n\n // Unbind events\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n css(dragEl, 'transform', '');\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n _disableDraggable(dragEl);\n dragEl.style['will-change'] = '';\n\n // Remove classes\n // ghostClass is added in dragStarted\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n toggleClass(dragEl, this.options.chosenClass, false);\n\n // Drag stop event\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n // Remove event\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // drag from one list and drop into another\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent( /**Event*/evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n break;\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n _globalDragOver(evt);\n }\n break;\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n for (; i < n; i++) {\n el = children[i];\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\n option: function option(name, value) {\n var options = this.options;\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n /**\r\n * Destroy\r\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n return;\n }\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return;\n\n // show clone at dragEl or original position\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\nfunction _globalDragOver( /**Event*/evt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n return retVal;\n}\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\nfunction _unsilent() {\n _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n while (i--) {\n sum += str.charCodeAt(i);\n }\n return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n}\n\n// Export utils\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\nSortable.get = function (element) {\n return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt;\n\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback);\n\n // Listener for pointer element change\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn;\n\n // New scroll root, set scrollEl\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n var layersOut = 0;\n var currentParent = scrollEl;\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n }\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction Revert() {}\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n this.sortable.animateAll();\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\n multiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\n folding = false,\n // Folding any other time\n dragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n }\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n dataTransfer.setData('Text', data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n });\n\n // Sort multi-drag elements\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n\n sortable.captureAnimationState();\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n }\n\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute);\n\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n }\n\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n activeSortable._showClone(sortable);\n\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children;\n\n // Multi-drag selection\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvent: evt\n });\n }\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n }\n }\n\n // Multi-drag drop\n if (dragStarted && this.isMultiDrag) {\n folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n multiDragIndex++;\n });\n\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent('update');\n dispatchSortableEvent('sort');\n }\n }\n }\n\n // Must be done after capturing individual rects (scroll bar)\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n multiDragSortable = toSortable;\n }\n\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n // Only deselect if selection is in this sortable\n if (multiDragSortable !== this.sortable) return;\n\n // Only deselect if target is not item in this sortable\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n multiDragSortable = sortable;\n }\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n\n // multiDragElements will already be sorted if folding\n var newIndex;\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n return key;\n }\n }\n });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-booking-form-config {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n\n .header {\n padding: 1rem;\n display: flex;\n justify-content: space-between;\n border-bottom: 1px solid var(--nylas-base-200);\n\n .header_text {\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 500;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n\n .header_action {\n display: flex;\n\n select-dropdown::part(sd_dropdown-button) {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 1rem;\n }\n }\n }\n\n .content {\n padding: 1rem;\n color: var(--nylas-base-900);\n font-size: 16px;\n font-family: var(--nylas-font-family);\n\n @media #{$small-mobile} {\n font-size: 15px;\n }\n\n .additional_fields {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n @media #{$small-mobile} {\n gap: 0.5rem;\n padding: 0;\n }\n\n position: relative;\n overflow: auto;\n\n .form-field {\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n padding: 1rem;\n user-select: none;\n background-color: white;\n /* Prevent text selection */\n position: relative;\n\n &.highlight {\n background-color: var(--nylas-base-200);\n }\n\n .form-field_header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n .dragable {\n cursor: move;\n }\n\n .form-field_header_text {\n flex: 1;\n text-align: left;\n padding-left: 1rem;\n\n h4 {\n margin: 0;\n font-size: 16px;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n\n .form-field_header_actions {\n display: flex;\n align-items: center;\n\n .is-required {\n color: var(--nylas-base-500);\n background-color: var(--nylas-base-50);\n font-weight: 600;\n padding: 4px 8px;\n border-radius: var(--nylas-border-radius-2x);\n }\n\n button {\n border: none;\n background: transparent;\n height: 40px;\n margin: 0 1rem;\n cursor: pointer;\n color: var(--nylas-base-800);\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n }\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n }\n }\n }\n\n .form-field_content {\n padding: 1.5rem 0 0 2.7rem;\n\n &.hidden {\n display: none;\n }\n\n .inputs {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n\n .label-input {\n padding: 0 1rem 0 0;\n }\n\n .required-input {\n display: flex;\n\n label {\n padding: 0.5rem;\n }\n\n input[type='checkbox'] {\n transform: scale(1.3);\n }\n }\n }\n\n .options-container {\n h4 {\n margin: 0;\n font-size: 16px;\n line-height: 20px;\n font-weight: 500;\n padding: 0.5rem 0;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n button {\n border: none;\n background: transparent;\n height: 40px;\n margin: 1rem 0;\n cursor: pointer;\n color: var(--nylas-base-800);\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n }\n\n .options {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n .option {\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n button {\n border: none;\n background: transparent;\n height: 40px;\n margin: 0 1rem;\n cursor: pointer;\n color: var(--nylas-base-800);\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n }\n }\n }\n }\n }\n }\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { DEFAULT_FORM_FIELD_TYPES, FIELD_TYPES } from '@/common/constants';\nimport { Configuration } from '@nylas/core';\nimport Sortable from 'sortablejs';\n\ninterface AdditionalFields {\n type: string;\n required: boolean;\n label: string;\n order: number;\n options?: string[];\n key: string;\n default?: string;\n}\ninterface AdditionalFieldsInternal extends AdditionalFields {\n isOpen: boolean;\n readonly?: boolean;\n typeLabel: string;\n}\n\nconst staticFields = [\n {\n type: 'text',\n label: 'Your name',\n key: 'your_name',\n typeLabel: 'Short text',\n readonly: true,\n required: true,\n isOpen: false,\n order: 0,\n },\n {\n type: 'email',\n label: 'Your Email',\n key: 'your_email',\n typeLabel: 'Email',\n readonly: true,\n isOpen: false,\n required: true,\n order: 1,\n },\n];\n\n/**\n * The `nylas-booking-form-config` component is a form input for adding additional fields to the booking form.\n * @part nbfc__header - The header of the booking form\n * @part nbfc__add_field - The add field selection container\n * @part nbfc__add_field-button - The add field selection button\n * @part nbfc__add_field-content - The add field selection dropdown content\n * @part nbfc__additional_fields - The aditional fields container\n * @part nbfc__form-field - The single form container\n * @part nbfc__form-field-header - The single form header\n * @part nbfc__form-field-content - The single form content\n */\n@Component({\n tag: 'nylas-booking-form-config',\n styleUrl: 'nylas-booking-form-config.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasBookingFormConfig {\n /**\n * The element <nylas-booking-form-config> itself.\n */\n @Element() host!: HTMLNylasBookingFormConfigElement;\n\n /**\n * @internal\n * The selected configuration.\n */\n @Prop() selectedConfiguration?: Configuration;\n\n /**\n * The name of the booking form config.\n */\n @Prop() name: string = 'booking-form-config';\n\n /**\n * The additional fields to be displayed on the booking form.\n */\n @Prop() additionalFields?: AdditionalFields[];\n\n /**\n * This event is fired when the selected availability / open hours change.\n */\n @Event() valueChanged!: EventEmitter<{\n value: Record<string, AdditionalFields>;\n name: string;\n }>;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n @State() formFields!: AdditionalFieldsInternal[];\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-calendar-picker', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n this.updateFormFields(newValue);\n }\n\n connectedCallback() {\n debug('nylas-booking-form-config', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-booking-form-config', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-booking-form-config', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n this.formFields = [...staticFields];\n }\n\n componentDidLoad() {\n debug('nylas-booking-form-config', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.updateFormFields(this.selectedConfiguration);\n }\n }\n\n updateFormFields(config: Configuration) {\n const additionalFields =\n Object.entries(config?.scheduler?.additional_fields || {}).map(([id, field]) => ({ ...(field as AdditionalFields), key: id })) || this.additionalFields || [];\n this.formFields = [\n ...staticFields,\n ...additionalFields\n .sort((a, b) => a.order - b.order)\n .map((f: AdditionalFields, i) => {\n const fieldType = FIELD_TYPES.find(field => field.type === f.type);\n if (!fieldType) {\n return { ...f, isOpen: false, typeLabel: 'Unknown' };\n }\n const typeLabel = fieldType.label;\n f.order = i + 2;\n return { ...f, isOpen: false, typeLabel };\n }),\n ];\n\n const container = this.host.shadowRoot?.getElementById('fields');\n Sortable.create(container, {\n animation: 150,\n swap: true, // Enable swap plugin\n swapClass: 'highlight', // The class applied to the hovered swap item\n onEnd: this.swapFields.bind(this),\n filter: '.fixed', // Disable dragging for elements with the 'fixed' class\n onMove: evt => !evt.related.classList.contains('fixed'), // Prevent moving if target has 'fixed' class\n });\n }\n\n @Watch('formFields')\n watchHandler(newValue: AdditionalFieldsInternal[]) {\n const additionalFields = newValue;\n // Remove readonly fields, sort by order\n const sortedFields = additionalFields\n .filter(f => !f.readonly)\n .sort((a, b) => a.order - b.order)\n .map((f, i) => {\n const field: AdditionalFields = {\n type: f.type,\n required: f.required,\n label: f.label,\n order: i + 1,\n options: f.options,\n key: f.key,\n default: f.default,\n };\n return { ...field };\n });\n // Map fields to object\n const addFieldsMap = sortedFields.reduce((acc, field) => {\n acc[field.key] = {\n type: field.type,\n required: field.required,\n order: field.order,\n options: field.options,\n label: field.label,\n default: field.default,\n };\n return acc;\n }, {});\n this.valueChanged.emit({\n value: addFieldsMap,\n name: this.name,\n });\n }\n\n /**\n * This function finds the next missing number in an array of strings (keys of additional_fields).\n * We use this function to generate the next consecutive index number for the key.\n * For example,\n * - If the keys are ['dropdown_another-one_1', 'dropdown_Whatever-choose-one_3'] the function will return 2.\n * - If the array is empty, the function will return 1.\n * - If there are no missing numbers in between, the function will return the next number after the last element.\n *\n * @param arr of keys stored in the formFields for the given field type\n * @returns a number that is the next (consecutive) missing number in the array\n */\n findNextMissingNumber(arr: string[]): number {\n if (arr.length === 0) {\n return 1; // If the array is empty, the first number is 1\n }\n\n // Extract numbers from strings by splitting on underscore and popping the last element\n const numbers = arr\n .map(item => {\n const parts = item.split('_'); // Split the string by '_'\n const lastPart = parts.pop(); // Get the last part (should be the number)\n const parsedNumber = parseInt(lastPart || '', 10);\n return isNaN(parsedNumber) ? null : parsedNumber; // Return the parsed number or null if not a valid number\n })\n .filter((num): num is number => num !== null) // Filter out any null values and assert that the result is a number\n .sort((a, b) => a - b); // Sort numbers in ascending order\n\n // Iterate through the sorted numbers to find the missing number\n for (let i = 0; i < numbers.length - 1; i++) {\n if (numbers[i + 1] !== numbers[i] + 1) {\n return numbers[i] + 1; // Return the missing number\n }\n }\n\n // If no number is missing in between, return the next number after the last element\n return numbers.length > 0 ? numbers[numbers.length - 1] + 1 : 1;\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(\n event: CustomEvent<{\n value: string;\n name: string;\n }>,\n ) {\n const { name, value } = event.detail;\n if (name === 'add-field') {\n const field = FIELD_TYPES.find(f => f.type === value);\n const maxOrder = Math.max(...this.formFields.map(f => f.order));\n const existingFieldKeys = this.formFields.filter(f => f.type === field.type).map(f => f.key);\n const next = this.findNextMissingNumber(existingFieldKeys);\n const newField = { ...field, label: field.label, key: `${field.type}_${field.label.split(' ').join('-')}_${next}`, order: maxOrder + 1 }; // Copy object + Ensure unique order\n this.formFields = [...this.formFields, newField];\n }\n }\n\n @Listen('nylasFormInputChanged')\n nylasFormInputChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { name } = event.detail;\n if (name.startsWith('default-value-')) {\n const fieldIndex = parseInt(name.split('-').pop() || '0');\n this.fieldDefaultValueChanged(fieldIndex, event);\n } else {\n const [fieldIndex, optionIndex] = name.split('_');\n if (optionIndex) {\n this.fieldOptionChange(parseInt(fieldIndex), parseInt(optionIndex), event);\n } else {\n this.fieldLabelChange(parseInt(fieldIndex), event);\n }\n }\n }\n\n swapFields(event) {\n const { oldIndex, newIndex } = event;\n if (oldIndex !== undefined && newIndex !== undefined && oldIndex !== newIndex) {\n const newArray = [...this.formFields].map(f => {\n if (f.order === oldIndex) {\n return {\n ...f,\n order: newIndex,\n };\n }\n if (f.order === newIndex) {\n return {\n ...f,\n order: oldIndex,\n };\n }\n return f;\n });\n this.formFields = newArray;\n }\n }\n\n fieldToggle(index) {\n this.formFields = this.formFields.map((f, i) => {\n if (index == i) {\n f.isOpen = !f.isOpen;\n }\n return f;\n });\n }\n fieldRemove(index) {\n this.formFields = this.formFields.filter((_, i) => i !== index);\n }\n\n fieldRequired(index) {\n this.formFields = this.formFields.map((field, i) => {\n if (i === index) {\n field.required = !field.required;\n }\n return field;\n });\n }\n fieldLabelChange(ind, event) {\n const target = event.detail;\n let fieldCopy = {} as AdditionalFieldsInternal;\n this.formFields = this.formFields.map((field, i) => {\n if (i === ind) {\n const existingKey = field.key;\n const indexNumber = existingKey.split('_').pop();\n const label = target.value;\n fieldCopy = {\n ...field,\n label: label,\n key: `${field.type}_${label.split(' ').join('-')}_${indexNumber}`,\n };\n return fieldCopy;\n }\n return field;\n });\n }\n fieldOptionAdd(index) {\n this.formFields = this.formFields.map((field, i) => {\n if (i === index) {\n if (!field.options) {\n field.options = [];\n }\n field.options = [...field.options, ''];\n }\n return field;\n });\n }\n\n fieldOptionRemove(fieldIndex, index) {\n this.formFields = this.formFields.map((field, i) => {\n if (i === fieldIndex) {\n if (!field.options) {\n field.options = [];\n }\n field.options = field.options.filter((_, i) => i !== index);\n }\n return field;\n });\n }\n fieldOptionChange(fieldIndex, index, event) {\n this.formFields = this.formFields.map((field, i) => {\n if (i === fieldIndex) {\n if (!field.options) {\n field.options = [];\n }\n field.options = field.options.map((o, i) => {\n if (i === index) {\n o = event.detail.value;\n }\n return o;\n });\n }\n return field;\n });\n }\n\n fieldDefaultValueChanged(index, event) {\n this.formFields = this.formFields.map((field, i) => {\n if (i === index) {\n field.default = event.detail.value;\n }\n return field;\n });\n }\n\n @RegisterComponent<NylasBookingFormConfig, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-booking-form-config',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div class=\"nylas-booking-form-config\" part=\"nbfc\">\n <div class=\"header\" part=\"nbfc__header\">\n <div class=\"header_text\">\n <h3>Booking form</h3>\n <p>Add custom fields to the booking form.</p>\n </div>\n <div class=\"header_action\">\n <select-dropdown\n name=\"add-field\"\n exportparts=\"sd_dropdown: nbfc__add_field, sd_dropdown-button: nbfc__add_field-button, sd_dropdown-content: nbfc__add_field-dropdown-content\"\n options={DEFAULT_FORM_FIELD_TYPES}\n withSearch={false}\n withChevron={false}\n dropdownButtonText=\"Add new field\"\n >\n <span slot=\"select-icon\">\n <plus-icon width=\"15\" height=\"15\"></plus-icon>\n </span>\n </select-dropdown>\n </div>\n </div>\n <div class=\"content\">\n <div id=\"fields\" class=\"additional_fields\" part=\"nbfc__additional_fields\">\n {this.formFields.map((field, i) => {\n return (\n <div class={`form-field draggable ${field.readonly && 'fixed'}`} part=\"nbfc__form_field\" key={i}>\n <div class=\"form-field_header\" part=\"nbfc__form_field-header\">\n <span class=\"dragable\">\n <dragable-icon width=\"24\" height=\"25\"></dragable-icon>\n </span>\n <div class=\"form-field_header_text\">\n <h4>{field.label}</h4>\n <p>{field.typeLabel}</p>\n </div>\n <div class=\"form-field_header_actions\">\n <span class={`is-required`}>{field.required ? 'Required' : 'Optional'}</span>\n {!field.readonly && (\n <button\n onClick={() => {\n this.fieldRemove(i);\n }}\n >\n <close-icon />\n </button>\n )}\n <span\n class={`chevron ${field.isOpen ? 'open' : 'closed'}`}\n onClick={() => {\n this.fieldToggle(i);\n }}\n >\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n </div>\n <div class={`form-field_content ${!field.isOpen && 'hidden'}`} part=\"nbfc__form_field-content\">\n <div class=\"inputs\">\n <input-component class={'label-input'} name={`${i}`} key={i} label=\"Label\" required={false} readOnly={field.readonly} defaultValue={field.label}>\n <div class=\"required-input\" slot=\"additional-input\">\n <input\n type=\"checkbox\"\n name={`required_${field.order}`}\n id={`required_${field.order}`}\n onClick={() => {\n this.fieldRequired(i);\n }}\n checked={field.required}\n disabled={field.readonly}\n />\n\n <label htmlFor={`required_${field.order}`} aria-label=\"Required\">\n Required\n </label>\n </div>\n </input-component>\n {!field.readonly && field.type !== 'date' && (\n <input-component\n class={'default-value'}\n name={`default-value-${i}`}\n key={i}\n label=\"Default value\"\n required={false}\n readOnly={field.readonly}\n defaultValue={field.default}\n />\n )}\n {!field.readonly && field.type === 'date' && (\n <nylas-date-component\n class={'default-value'}\n name={`default-value-${i}`}\n key={i}\n label=\"Default value\"\n required={false}\n readOnly={field.readonly}\n defaultValue={field.default}\n />\n )}\n </div>\n {field.options != undefined && (\n <div class=\"options-container\">\n <h4>ALL OPTIONS</h4>\n <div class=\"options\">\n {field.options.map((o, j) => {\n return (\n <div class=\"option\">\n <input-component key={j} name={`${i}_${j}`} label={field.typeLabel + ' option ' + (j + 1)} required={true} defaultValue={o}>\n {j > 1 && (\n <div class=\"required-input\" slot=\"additional-input\">\n <button\n onClick={() => {\n this.fieldOptionRemove(i, j);\n }}\n >\n <close-icon />\n </button>\n </div>\n )}\n </input-component>\n </div>\n );\n })}\n </div>\n <button\n onClick={() => {\n this.fieldOptionAdd(i);\n }}\n part=\"nap__add-time-range\"\n >\n <add-circle-icon /> Add an option\n </button>\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-buffer-time {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n text-align: left;\n\n .header {\n padding: 1rem;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n display: flex;\n gap: 4px;\n align-items: center;\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n\n .nylas-buffer-time__body {\n display: grid;\n grid-template-columns: 1fr auto;\n\n @media #{$mobile} {\n grid-template-columns: 1fr;\n }\n\n .nylas-buffer-time__dropdown {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n border-right: 1px solid var(--nylas-base-200);\n color: var(--nylas-base-800);\n\n @media #{$mobile} {\n border: none;\n }\n\n .nylas-buffer-time__row {\n display: grid;\n grid-template-columns: auto 1fr;\n align-items: center;\n gap: 1rem;\n\n label {\n width: 200px;\n }\n\n .dropdown-container {\n display: flex;\n gap: 1rem;\n align-items: center;\n justify-content: flex-end;\n }\n }\n }\n\n .nylas-buffer-time__preview {\n width: 208px;\n background: var(--nylas-base-25);\n border-bottom-right-radius: var(--nylas-border-radius-2x);\n\n @media #{$mobile} {\n width: inherit;\n border-bottom-left-radius: var(--nylas-border-radius-2x);\n }\n\n h4 {\n font-size: 14px;\n line-height: 24px;\n color: var(--nylas-base-600);\n font-family: var(--nylas-font-family);\n font-weight: 500;\n text-align: center;\n margin: 0.75rem 0;\n }\n\n .preview-container {\n padding: 0 2rem 1rem;\n\n .slot {\n background-color: transparent;\n border-top: 1px solid var(--nylas-base-300);\n\n &.active {\n background-color: var(--nylas-base-100);\n }\n\n &:last-of-type {\n border-bottom: 1px solid var(--nylas-base-300);\n }\n }\n\n .event-slot {\n background-color: var(--nylas-base-600);\n border-top: 1px solid var(--nylas-base-300);\n }\n }\n }\n }\n\n .nylas-buffer-time__dropdown {\n select-dropdown::part(sd_dropdown-button) {\n width: 104px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 1rem;\n }\n\n select-dropdown::part(sd_dropdown-content) {\n width: 100%;\n }\n\n select-dropdown::part(sd_dropdown-button-selected-label) {\n max-width: calc(100% - 2rem);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\n\n/**\n * The `nylas-buffer-time` component is a UI component that allows users to set buffer time before and after an event.\n *\n * @part nbt - The buffer time container\n * @part nbt__header - The header of the buffer time\n * @part nbt__body - The body of the buffer time\n * @part nbt__dropdown-before - The dropdown container for the before buffer time\n * @part nbt__dropdown-button-before - The dropdown button for the before buffer time\n * @part nbt__dropdown-content-before - The dropdown content for the before buffer time\n * @part nbt__dropdown-after - The dropdown container for the after buffer time\n * @part nbt__dropdown-button-after - The dropdown button for the after buffer time\n * @part nbt__dropdown-content-after - The dropdown content for the after buffer time\n * @part nbt__preview - The preview container\n */\n@Component({\n tag: 'nylas-buffer-time',\n styleUrl: 'nylas-buffer-time.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasBufferTime {\n @Element() host!: HTMLNylasCalendarPickerElement;\n /**\n * @internal\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * The name of the calendar picker.\n */\n @Prop() name: string = 'buffer-time';\n /**\n * @standalone\n * The buffer time\n */\n @Prop() buffer: { before: number; after: number } = this.selectedConfiguration?.availability?.availability_rules?.buffer ?? { before: 0, after: 0 };\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The selected before buffer time.\n */\n @State() selectedBeforeBufferTime: number = this.buffer.before;\n\n /**\n * The selected after buffer time.\n */\n @State() selectedAfterBufferTime: number = this.buffer.after;\n\n @State() componentLoaded: boolean = false;\n\n /**\n * This event is fired when the selected buffer time is changed.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-buffer-time', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-buffer-time', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-buffer-time', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-buffer-time', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.selectedBeforeBufferTime = this.buffer.before;\n this.selectedAfterBufferTime = this.buffer.after;\n }\n this.updateFormValue();\n this.componentLoaded = true;\n }\n\n componentWillUpdate() {\n debug('nylas-buffer-time', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-buffer-time', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-buffer-time', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-buffer-time', 'componentDidRender');\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-buffer-time', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-buffer-time', 'selectedConfigurationChangedHandler', newValue);\n const buffer = newValue?.availability?.availability_rules?.buffer;\n this.selectedAfterBufferTime = buffer?.after ? buffer.after : this.buffer.after;\n this.selectedBeforeBufferTime = buffer?.before ? buffer.before : this.buffer.before;\n this.updateFormValue();\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-buffer-time', 'nylasFormDropdownChangedHandler', event.detail);\n // Pass as handler so that if event.defaultPrevented by parent app, this will be skipped.\n const valueChanged = (event: CustomEvent<{ value: string; name: string }>) => {\n const { value, name } = event.detail;\n if (name === 'before-buffer-time') {\n this.selectedBeforeBufferTime = parseInt(value);\n } else if (name === 'after-buffer-time') {\n this.selectedAfterBufferTime = parseInt(value);\n }\n this.updateFormValue();\n };\n this.valueChanged.emit({ ...event.detail, valueChanged });\n }\n\n /**\n * This method is essentially a workaround to check if the internals are available because\n * the unit tests in stencil do not support the internals.\n * @returns boolean\n */\n get isInternalsAvailable() {\n return this.internals !== undefined && typeof this.internals.setFormValue === 'function';\n }\n\n updateFormValue() {\n const bufferTime = {\n before: this.selectedBeforeBufferTime,\n after: this.selectedAfterBufferTime,\n };\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(bufferTime), this.name);\n }\n\n renderPreview() {\n const totalSlots = 4;\n const slotHeight = 10; // The height for each 30-minute slot\n\n // Event slot height is constant\n const eventSlotHeight = slotHeight * 2;\n\n // Helper function to determine the fill of a slot based on the minutes selected\n const slotFill = minutes => {\n const fullSlots = Math.floor(minutes / 30);\n const partialFillHeight = ((minutes % 30) / 30) * slotHeight;\n\n return {\n fullSlots,\n partialFillHeight,\n };\n };\n\n // Helper function to create before slots\n const createBeforeSlots = () => {\n const { fullSlots, partialFillHeight } = slotFill(this.selectedBeforeBufferTime);\n\n return Array.from({ length: totalSlots }, (_, index) => {\n // Slot is active if its index is greater than the total slots minus the full slots minus one\n // and there are some minutes selected.\n const isActive = this.selectedBeforeBufferTime > 0 && index > totalSlots - fullSlots - 1;\n const isPartial = this.selectedBeforeBufferTime > 0 && index === totalSlots - fullSlots - 1 && partialFillHeight > 0;\n\n let slotStyle: {\n backgroundColor?: string;\n background?: string;\n } = {};\n if (isActive && !isPartial) {\n slotStyle.backgroundColor = 'var(--nylas-base-100)';\n } else if (isPartial) {\n slotStyle.background = `linear-gradient(to top, var(--nylas-base-100) ${partialFillHeight}px, transparent 0)`;\n }\n\n return (\n <div\n key={index}\n class={`slot ${isActive ? 'active' : ''}`}\n style={{\n height: `${slotHeight}px`,\n ...slotStyle,\n }}\n ></div>\n );\n });\n };\n\n // Helper function to create after slots\n const createAfterSlots = () => {\n const { fullSlots, partialFillHeight } = slotFill(this.selectedAfterBufferTime);\n\n return Array.from({ length: totalSlots }, (_, index) => {\n const isActive = this.selectedAfterBufferTime > 0 && index < fullSlots;\n const isPartial = index === fullSlots && partialFillHeight > 0;\n\n let slotStyle: {\n backgroundColor?: string;\n background?: string;\n } = {};\n if (isActive && !isPartial) {\n slotStyle.backgroundColor = 'var(--nylas-base-100)';\n } else if (isPartial) {\n slotStyle.background = `linear-gradient(to bottom, var(--nylas-base-100) ${partialFillHeight}px, transparent 0)`;\n }\n\n return (\n <div\n key={index}\n class={`slot ${isActive ? 'active' : ''}`}\n style={{\n height: `${slotHeight}px`,\n ...slotStyle,\n }}\n ></div>\n );\n });\n };\n\n return (\n <div class=\"preview-container\">\n {createBeforeSlots()}\n <div class=\"event-slot\" style={{ height: `${eventSlotHeight}px` }}></div>\n {createAfterSlots()}\n </div>\n );\n }\n\n @RegisterComponent<NylasBufferTime, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-buffer-time',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const minuteOptions = Array.from({ length: 25 }, (_, i) => {\n const value = i * 5;\n return {\n label: value.toString(),\n value: value,\n };\n });\n\n return (\n <Host>\n <div class=\"nylas-buffer-time\" part=\"nbt\">\n <div class=\"header\" part=\"nbt__header\">\n <h3>Buffer time</h3>\n <p>\n Require empty buffer time before and after an event.\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">Scheduler does not book the buffer time.</span>\n </tooltip-component>\n </p>\n </div>\n <div class=\"nylas-buffer-time__body\" part=\"nbt__body\">\n <div class=\"nylas-buffer-time__dropdown\">\n <div class=\"nylas-buffer-time__row\">\n <label>Before the event</label>\n <div class=\"dropdown-container\">\n {this.componentLoaded && (\n <select-dropdown\n id=\"before-buffer-time\"\n withSearch={false}\n name=\"before-buffer-time\"\n exportparts=\"sd_dropdown: nbt__dropdown-before, sd_dropdown-button: nbt__dropdown-button-before, sd_dropdown-content: nbt__dropdown-content-before\"\n options={minuteOptions}\n defaultSelectedOption={minuteOptions.find(min => min.value == this.selectedBeforeBufferTime)}\n />\n )}\n <span>mins</span>\n </div>\n </div>\n <div class=\"nylas-buffer-time__row\">\n <label>After the event</label>\n <div class=\"dropdown-container\">\n {this.componentLoaded && (\n <select-dropdown\n id=\"after-buffer-time\"\n withSearch={false}\n name=\"after-buffer-time\"\n exportparts=\"sd_dropdown: nbt__dropdown-after, sd_dropdown-button: nbt__dropdown-button-after, sd_dropdown-content: nbt__dropdown-content-after\"\n options={minuteOptions}\n defaultSelectedOption={minuteOptions.find(min => min.value == this.selectedAfterBufferTime)}\n />\n )}\n <span>mins</span>\n </div>\n </div>\n </div>\n <div class=\"nylas-buffer-time__preview\" part=\"nbt__preview\">\n <h4>PREVIEW</h4>\n {this.renderPreview()}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-calendar-picker {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n .nylas-calendar-picker__loading {\n padding-bottom: 1rem;\n display: flex;\n flex-direction: column;\n gap: 4px;\n .label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 1rem 1rem 0;\n color: var(--nylas-base-800);\n tooltip-component {\n display: flex;\n }\n }\n .loading-button {\n margin: 0 1rem;\n padding: 0;\n width: inherit;\n height: 48px;\n color: black;\n font-size: 1rem;\n cursor: not-allowed;\n display: flex;\n gap: 0.5rem;\n justify-content: space-between;\n align-items: center;\n background: transparent;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n span {\n padding: 0 1rem;\n }\n }\n }\n .nylas-calendar-picker__dropdown {\n padding: 1rem;\n multi-select-dropdown::part(msd_dropdown) {\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n multi-select-dropdown::part(msd_dropdown-button) {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 1rem;\n }\n multi-select-dropdown::part(msd_dropdown-button--error) {\n border: 1px solid var(--nylas-error);\n }\n multi-select-dropdown::part(msd_dropdown-content) {\n width: 100%;\n max-width: unset;\n }\n multi-select-dropdown::part(msd_dropdown-button-selected-label) {\n max-width: calc(100% - 2rem);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { Calendar } from '@nylas/core';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { User } from '@/common/nylas-api-request';\n\n/**\n * The `nylas-calendar-picker` component is a form input for selecting calendars to check availability.\n *\n * @part ncp - The calendar picker container\n * @part ncp__dropdown - The dropdown container\n * @part ncp__dropdown-button - The dropdown button\n * @part ncp__dropdown-content - The dropdown content\n */\n@Component({\n tag: 'nylas-calendar-picker',\n styleUrl: 'nylas-calendar-picker.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasCalendarPicker {\n @Element() host!: HTMLNylasCalendarPickerElement;\n /**\n * @standalone\n * The name of the calendar picker.\n */\n @Prop() name: string = 'calendar';\n /**\n * @standalone\n * The logged in user.\n */\n @Prop() currentUser?: User;\n /**\n * @standalone\n * The calendars to choose from.\n */\n @Prop() calendars?: Calendar[];\n /**\n * @standalone\n * The default selected calendars.\n */\n @Prop() defaultSelectedCalendars: string[] = [];\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The selected calendars.\n */\n @State() selectedCalendars: string[] = [];\n\n /**\n * The error message to display.\n */\n @State() error: string = '';\n\n /**\n * This event is fired when the selected calendars change.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string[];\n name: string;\n valueChangedHandler?: (event: CustomEvent<{ value: string[]; name: string }>) => void;\n }>;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-calendar-picker', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-calendar-picker', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-calendar-picker', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-calendar-picker', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-calendar-picker', 'componentDidLoad');\n // TODO: Remove this when the internals in tests are fixed.\n if (typeof this.internals.setFormValue === 'function') {\n this.internals.setFormValue(this.defaultSelectedCalendars.toString(), 'calendar');\n this.valueChanged.emit({ value: this.defaultSelectedCalendars, name: this.name });\n }\n }\n\n componentWillUpdate() {\n debug('nylas-calendar-picker', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-calendar-picker', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-calendar-picker', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-calendar-picker', 'componentDidRender');\n }\n\n @Listen('selectedOptionsChanged')\n selectedOptionsChangedHandler(event: CustomEvent<{ value: string[]; name: string }>) {\n debug('nylas-calendar-picker', 'nylasFormDropdownChangedHandler', event.detail);\n // Pass as handler so that if event.defaultPrevented by parent app, this will be skipped.\n const valueChangedHandler = (event: CustomEvent<{ value: string[]; name: string }>) => {\n const { value } = event.detail;\n this.selectedCalendars = [...value];\n if (this.selectedCalendars.length === 0) {\n this.error = `Select at least one calendar.`;\n this.internals.setValidity({ customError: true }, `Select at least one calendar.`);\n } else {\n this.error = '';\n this.internals.setValidity({});\n }\n this.internals.setFormValue(value.toString(), this.name);\n };\n this.valueChanged.emit({ ...event.detail, name: this.name, valueChangedHandler });\n }\n\n @RegisterComponent<NylasCalendarPicker, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-calendar-picker',\n stateToProps: new Map([['schedulerConfig.currentUser', 'currentUser']]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string[]; name: string; valueChangedHandler?: (event: CustomEvent<{ value: string[]; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChangedHandler } = event.detail;\n // If a handler is passed, call it.\n if (valueChangedHandler) {\n valueChangedHandler(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const calendarOptions =\n this.calendars?.map(calendar => {\n return {\n value: calendar.id,\n label: calendar.name,\n selected:\n this.defaultSelectedCalendars?.includes(calendar.id) ||\n (this.defaultSelectedCalendars?.includes('primary') || this.defaultSelectedCalendars?.length === 0\n ? calendar.id === this.currentUser?.email || calendar.id === this.name.split('participant-')[1]\n : false),\n };\n }) ?? [];\n\n return (\n <Host>\n <div class=\"nylas-calendar-picker\" part=\"ncp\">\n {calendarOptions.length > 0 ? (\n <div class=\"nylas-calendar-picker__dropdown\">\n <multi-select-dropdown\n name={this.name}\n options={calendarOptions}\n error={this.error}\n exportparts=\"msd_dropdown: ncp__dropdown, msd_dropdown-button: ncp__dropdown-button, msd_dropdown-content: ncp__dropdown-content\"\n ></multi-select-dropdown>\n </div>\n ) : (\n <div class=\"nylas-calendar-picker__loading\">\n <span class=\"label\">\n Select calendars that will be checked for availability <info-icon />\n </span>\n <div class=\"loading-button\">\n <span>Loading...</span>\n </div>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n @include default-css-variables;\n}\n\n.nylas-cancellation-policy {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%;\n\n /* 21px */\n span.label-icon {\n margin-left: 4px;\n\n tooltip-component {\n display: flex;\n }\n }\n }\n\n textarea {\n padding: 12px 16px;\n border-width: 1;\n resize: vertical;\n border-radius: 8px;\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n border: 1px solid var(--nylas-base-200);\n\n &::-webkit-resizer {\n display: none;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug, sanitize } from '@/utils/utils';\nimport { AttachInternals, Component, Host, State, h, Element, Prop, Watch, Event, EventEmitter } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\n\n/**\n * The `nylas-cancellation-policy` component is a form input for the cancellation policy message of an event.\n * @part ncpolicy - The cancellation policy container\n * @part ncpolicy__textarea - The cancellation policy textarea\n */\n@Component({\n tag: 'nylas-cancellation-policy',\n styleUrl: 'nylas-cancellation-policy.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasCancellationPolicy {\n /**\n * The host element <nylas-cancellation-policy>\n */\n @Element() host!: HTMLElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n\n /**\n * @standalone\n * The cancellation policy stored in the configuration\n */\n @Prop() cancellationPolicy?: string;\n\n /**\n * @standalone\n * The name of the cancellation policy input.\n */\n @Prop() name: string = 'cancelation-policy';\n /**\n * The selected cancellation policy state. This defaults to the cancellation policy from the configuration or an empty string.\n */\n @State() message!: string;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-cancellation-policy', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-custom-booking-flow', 'selectedConfigurationChangedHandler', newValue);\n this.message = newValue?.scheduler?.cancellation_policy || this.cancellationPolicy || '';\n }\n\n /**\n * Event emitted when the cancellation policy message changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n connectedCallback() {\n debug('nylas-cancellation-policy', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-cancellation-policy', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-cancellation-policy', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.message = this.cancellationPolicy || '';\n }\n }\n\n disconnectedCallback() {\n debug('nylas-cancellation-policy', 'disconnectedCallback');\n }\n\n handleChange(event) {\n const value = sanitize(event.target.value);\n this.message = value;\n this.internals.setFormValue(value, this.name);\n this.valueChanged.emit({ value: value, name: this.name });\n }\n\n @RegisterComponent<NylasCancellationPolicy, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-cancellation-policy',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div class=\"nylas-cancellation-policy\" part=\"ncpolicy\">\n <label htmlFor={this.name}>\n Cancellation policy message\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">Attendees receive this message if trying to cancel the event. Attendees are asked to provide a reason for cancellation.</span>\n </tooltip-component>\n </span>\n </label>\n <textarea id={this.name} part=\"ncpolicy__textarea\" name={this.name} value={this.message} maxlength=\"250\" onInput={e => this.handleChange(e)}></textarea>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-confirmation-email {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n text-align: left;\n\n .header {\n padding: 1rem;\n display: grid;\n grid-template-columns: 1fr auto;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n border-radius: var(--nylas-border-radius-2x);\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n\n .confirmation-email-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n\n .nylas-confirmation-email__body {\n display: grid;\n grid-template-columns: 1fr auto;\n background-color: var(--nylas-base-25);\n border-radius: var(--nylas-border-radius-2x);\n\n @media #{$mobile} {\n grid-template-columns: 1fr;\n }\n\n .nylas-confirmation-email__section {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n color: var(--nylas-base-800);\n\n @media #{$mobile} {\n border: none;\n }\n\n .nylas-confirmation-email__row {\n display: grid;\n grid-template-columns: 1fr auto;\n align-items: center;\n gap: 1rem;\n\n &.full-width-col {\n grid-template-columns: 1fr;\n border-top: 1px solid var(--nylas-base-200);\n padding-top: 1.25rem;\n margin: 0.25rem 0;\n }\n\n label {\n display: flex;\n align-items: center;\n\n span.required {\n color: var(--nylas-error, #cc4841);\n }\n\n span.label-icon {\n margin-left: 4px;\n\n tooltip-component {\n display: flex;\n }\n }\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 1rem;\n font-weight: 500;\n line-height: 24px;\n color: var(--nylas-base-900);\n }\n\n .company-logo-container {\n display: flex;\n gap: 32px;\n width: 100%;\n\n .input-container {\n display: flex;\n flex-direction: column;\n flex: 1;\n }\n\n .company-logo {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 200px;\n height: 100px;\n border: var(--nylas-base-200) solid 1px;\n border-radius: var(--nylas-border-radius-2x);\n overflow: hidden;\n padding: 10px;\n }\n\n .company-logo img {\n max-height: 100%;\n max-width: 100%;\n object-fit: contain;\n object-position: center;\n }\n }\n\n span.selected-value {\n font-weight: 500;\n }\n }\n\n .subsection {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n .input-container {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n\n textarea {\n padding: 12px 16px;\n border-width: 1;\n resize: vertical;\n border-radius: 8px;\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n border: 1px solid var(--nylas-base-200);\n }\n }\n }\n }\n\n .nylas-confirmation-email__preview {\n width: 208px;\n background: var(--nylas-base-25);\n border-bottom-right-radius: var(--nylas-border-radius-2x);\n\n @media #{$mobile} {\n width: inherit;\n border-bottom-left-radius: var(--nylas-border-radius-2x);\n }\n\n h4 {\n font-size: 14px;\n line-height: 24px;\n color: var(--nylas-base-600);\n font-family: var(--nylas-font-family);\n font-weight: 500;\n text-align: center;\n margin: 0.75rem 0;\n }\n\n .preview-container {\n padding: 0 2rem 1rem;\n\n .slot {\n background-color: transparent;\n border-top: 1px solid var(--nylas-base-300);\n\n &.active {\n background-color: var(--nylas-base-100);\n }\n\n &:last-of-type {\n border-bottom: 1px solid var(--nylas-base-300);\n }\n }\n\n .event-slot {\n background-color: var(--nylas-base-600);\n border-top: 1px solid var(--nylas-base-300);\n }\n }\n }\n\n span.error-message {\n color: var(--nylas-error);\n }\n\n span.help-text {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n\n .nylas-confirmation-email__summary {\n padding: 0.75rem 1rem;\n display: grid;\n grid-template-columns: auto 1fr;\n column-gap: 1rem;\n\n p {\n margin: 0;\n display: flex;\n align-items: center;\n column-gap: 4px;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 21px;\n color: var(--nylas-base-600);\n text-align: left;\n\n span.summary-icon {\n display: flex;\n justify-content: center;\n min-width: 20px;\n }\n }\n }\n}\n\ntoggle-switch {\n padding-right: 8px;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug, sanitize } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration, EmailTemplate, Participant } from '@nylas/core';\n\n/**\n * The `nylas-confirmation-email` component is a UI component that allows users to set buffer time before and after an event.\n *\n * @part nce__tab-heading - The nylas-confirmation-email main tab heading\n * @part nce - The nylas-confirmation-email container\n * @part nce__header - The header of the event communication section\n * @part nce__body - The body of the event communication section\n * @part nce__confirmation-email-toggle--container - The confirmation email drawer toggle container\n * @part nce__input-image-url - The input image URL container\n * @part nce__summary - The confirmation card summary container\n */\n@Component({\n tag: 'nylas-confirmation-email',\n styleUrl: 'nylas-confirmation-email.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasConfirmationEmail {\n @Element() host!: HTMLNylasConfirmationEmailElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The confirmation email template data to display\n */\n @Prop() confirmationEmailTemplate: EmailTemplate = {} as EmailTemplate;\n /**\n * @standalone\n * List of participants\n */\n @Prop() participants: Participant[] = [];\n /**\n * @standalone\n * The name of the component\n */\n @Prop() name: string = 'confirmation-email-template';\n /**\n * Is the confirmation email card open\n */\n @Prop() isOpen: boolean = false;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The confirmation email template state.\n */\n @State() confirmationEmail!: EmailTemplate;\n\n /**\n * The internal state to store the isOpen state.\n */\n @State() isConfirmationEmailOpen: boolean = this.isOpen;\n\n /**\n * The internal state to store the participants.\n */\n @State() participantsState: Participant[] = this.participants;\n\n /**\n * This event is fired when the email reminders change.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-confirmation-email', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-confirmation-email', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-confirmation-email', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-confirmation-email', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.confirmationEmail = this.confirmationEmailTemplate;\n if (!this.confirmationEmail?.show_nylas_branding) {\n this.confirmationEmail = { ...this.confirmationEmail, show_nylas_branding: true };\n }\n this.isConfirmationEmailOpen = this.isOpen;\n this.participantsState = this.participants;\n }\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-confirmation-email', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-confirmation-email', 'selectedConfigurationChangedHandler', newValue);\n this.confirmationEmail = newValue?.scheduler?.email_template || this.confirmationEmailTemplate;\n if (typeof this.confirmationEmail?.show_nylas_branding === 'undefined') {\n this.confirmationEmail = { ...this.confirmationEmail, show_nylas_branding: true };\n }\n this.isConfirmationEmailOpen = !newValue?.event_booking?.reminders?.length;\n this.participantsState = newValue?.participants || this.participants;\n }\n\n @Listen('nylasFormInputChanged')\n async nylasFormInputChangeHandler(event: CustomEvent<{ value: string; name: string; type?: string }>) {\n const { name, value } = event.detail;\n const type = event.detail?.type;\n if (name === 'confirmation-email-title') {\n this.confirmationEmail = { ...this.confirmationEmail, booking_confirmed: { ...(this.confirmationEmail?.booking_confirmed || {}), title: value } };\n this.internals.setFormValue(JSON.stringify(this.confirmationEmail), this.name);\n this.valueChanged.emit({ value: JSON.stringify(this.confirmationEmail), name: this.name });\n } else if (name === 'confirmation-email-body' && type === 'multi_line_text') {\n this.handleEmailBodyChange(event);\n }\n }\n\n @Listen('valueChanged')\n valueChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-confirmation-email', 'valueChangedHandler', event.detail);\n const { value, name } = event.detail;\n\n if (name === 'confirmation-email-logo') {\n this.confirmationEmail = { ...this.confirmationEmail, logo: value };\n this.valueChanged.emit({ value: JSON.stringify(this.confirmationEmail), name: this.name });\n if (typeof this.internals.setValidity === 'function' && typeof this.internals.setFormValue === 'function') {\n this.internals.setFormValue(JSON.stringify(this.confirmationEmail), this.name);\n this.internals.setValidity({});\n }\n }\n }\n\n @Listen('nylasFormInputImageUrlInvalid')\n async nylasFormInputImageUrlInvalidHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { value, name } = event.detail;\n if (name === 'confirmation-email-logo' && typeof this.internals.setValidity === 'function') {\n this.internals.setValidity({ customError: true }, value || 'Invalid image URL.');\n }\n }\n\n @Listen('nylasFormSwitchToggled')\n nyalsFormSwitchToggledHandler(event: CustomEvent<{ checked: boolean; name: string; label: boolean }>) {\n debug('nylas-confirmation-email', 'nyalsFormSwitchToggledHandler', event.detail);\n if (event.detail.name === 'confirmation-email-show-branding') {\n this.confirmationEmail = { ...this.confirmationEmail, show_nylas_branding: event.detail.checked };\n this.internals.setFormValue(JSON.stringify(this.confirmationEmail), this.name);\n this.valueChanged.emit({ value: JSON.stringify(this.confirmationEmail), name: this.name });\n }\n }\n\n updateConfirmationFormValue() {\n debug('nylas-confirmation-email', 'updateConfirmationFormValue');\n this.internals.setFormValue(JSON.stringify(this.confirmationEmail), this.name);\n this.valueChanged.emit({ value: JSON.stringify(this.confirmationEmail), name: this.name });\n }\n\n toggleConfirmationEmail() {\n this.isConfirmationEmailOpen = !this.isConfirmationEmailOpen;\n }\n\n handleEmailBodyChange(event) {\n const value = sanitize(event.detail.value);\n this.confirmationEmail = { ...this.confirmationEmail, booking_confirmed: { ...(this.confirmationEmail?.booking_confirmed || {}), body: value } };\n this.internals.setFormValue(JSON.stringify(this.confirmationEmail), this.name);\n this.valueChanged.emit({ value: JSON.stringify(this.confirmationEmail), name: this.name });\n }\n\n @RegisterComponent<NylasConfirmationEmail, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-confirmation-email',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const organizer = this.participantsState.find(p => p.is_organizer);\n const organizerName = organizer?.name || organizer?.email;\n\n return (\n <Host>\n <div class=\"nylas-confirmation-email\" part=\"nce\">\n <div class=\"header\" part=\"nce__header\">\n <div>\n <h3>{this.confirmationEmail?.booking_confirmed?.title ?? `Booking confirmed with ${organizerName ? ` ${organizerName}` : ''}`}</h3>\n <p>Booking confirmation email</p>\n </div>\n {this.isConfirmationEmailOpen ? (\n <div class=\"confirmation-email-toggle\" part=\"nce__confirmation-email-toggle--container\">\n <span class={`chevron ${this.isConfirmationEmailOpen ? 'open' : 'closed'} `} onClick={() => this.toggleConfirmationEmail()}>\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n ) : (\n <button-component\n variant={'basic'}\n clickHandler={event => {\n event.preventDefault();\n this.toggleConfirmationEmail();\n }}\n >\n <edit-icon width=\"16\" height=\"16\"></edit-icon>\n Edit\n </button-component>\n )}\n </div>\n\n {this.isConfirmationEmailOpen ? (\n <div class=\"nylas-confirmation-email__body\" part=\"nce__body\">\n <div class=\"nylas-confirmation-email__section\">\n <div class=\"nylas-confirmation-email__row\">\n <label>\n Send confirmation email\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">You and your guests will receive a confirmation email immediately upon booking.</span>\n </tooltip-component>\n </span>\n </label>\n <span class=\"selected-value\">Immediately upon booking</span>\n </div>\n <div class=\"nylas-confirmation-email__row\">\n <label>\n Show Nylas branding\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">Uncheck this to hide the footer in the email communication.</span>\n </tooltip-component>\n </span>\n </label>\n <toggle-switch\n exportparts=\"ts_label: nce__toggle-label, ts_input: nce_toggle-input, ts_slider: nce_toggle-slider\"\n name={`confirmation-email-show-branding`}\n checked={this.confirmationEmail?.show_nylas_branding}\n />\n </div>\n <div class=\"nylas-confirmation-email__row\">\n <div class=\"subsection\">\n <div class=\"input-container\">\n <label>\n Company logo URL\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">\n This logo appears in the booking confirmation email. The URL must be publicly accessible. The image will be scaled down to a max size of 200px x\n 100px.\n </span>\n </tooltip-component>\n </span>\n </label>\n\n {this.confirmationEmail && (\n <input-image-url\n name=\"confirmation-email-logo\"\n exportparts=\"iiu__logo-input-textfield: nce__input-image-url\"\n imageUrl={this.confirmationEmail?.logo ?? ''}\n />\n )}\n </div>\n </div>\n </div>\n <div class=\"nylas-confirmation-email__row full-width-col\">\n <div class=\"subsection\">\n <h3>Email message</h3>\n <div class=\"input-container\">\n <label htmlFor=\"title\">\n Custom email title\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">An email title is a headline within the body of the email. This doesn't change the subject line.</span>\n </tooltip-component>\n </span>\n </label>\n <input-component\n name=\"confirmation-email-title\"\n maxLength={60}\n placeholder={`Booking confirmed ${organizerName ? `with ${organizerName}` : ''}`}\n defaultValue={this.confirmationEmail?.booking_confirmed?.title ?? ''}\n ></input-component>\n </div>\n <div class=\"input-container\">\n {/* <label htmlFor=\"title\">Email body</label> */}\n <textarea-component\n label=\"Additional info\"\n name=\"confirmation-email-body\"\n id=\"confirmation-email-body\"\n placeholder=\"Default body\"\n tooltip=\"Scheduler adds the content of the box to the email body.\"\n maxLength={500}\n defaultValue={this.confirmationEmail?.booking_confirmed?.body ?? ''}\n ></textarea-component>\n\n {/* <textarea\n id=\"description\"\n part=\"nrt__textarea\"\n name=\"confirmation-email-body\"\n placeholder='Default body'\n value={this.confirmationEmail?.booking_confirmed?.body ?? ''}\n maxlength=\"500\"\n rows={2}\n onInput={e => this.handleEmailBodyChange(e)}\n ></textarea> */}\n </div>\n </div>\n </div>\n </div>\n </div>\n ) : (\n <div class=\"nylas-confirmation-email__summary\" part=\"nce__summary\">\n <p>\n <span class=\"summary-icon\">\n <person-clipboard-icon></person-clipboard-icon>\n </span>\n All host & guests\n </p>\n <p>\n <span class=\"summary-icon\">\n <clock-icon></clock-icon>\n </span>\n Immediately on booking\n </p>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-connected-calendars {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n\n .header {\n padding: 1rem;\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n }\n\n .content {\n .participant-container {\n padding-top: 12px;\n border-top: 1px solid var(--nylas-base-200);\n\n .participant-title {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 16px 16px;\n\n p {\n margin: 0;\n }\n\n .participant-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n }\n }\n}\n\nnylas-calendar-picker::part(ncp) {\n margin: 0;\n border: none;\n border-top: 1px solid var(--nylas-base-200);\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { AdditionalParticipant, Calendar, Configuration, Participant } from '@nylas/core';\n\n/**\n * The `nylas-connected-calendars` component is a form input for selecting calendars to check availability for participants.\n * @part nccals - The connected calendars host.\n * @part nccals__header - The header.\n * @part nccals__content - The content.\n * @part nccals__container - The container.\n * @part nccals__title - The title.\n * @part nccals__toggle-container - The toggle container.\n */\n@Component({\n tag: 'nylas-connected-calendars',\n styleUrl: 'nylas-connected-calendars.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasConnectedCalendars {\n @Element() host!: HTMLNylasConnectedCalendarsElement;\n private connectedCalendarsFormRef!: HTMLFormElement;\n\n /**\n * The name of the participants custom availability.\n */\n @Prop() name: string = 'connected-calendars';\n\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n\n /**\n * @standalone\n * The participants selected in the add participants section.\n */\n @Prop() participants: Participant[] = this.selectedConfiguration?.participants || [];\n\n /**\n * @standalone\n * The calendars to choose from for the organizer / logged in user.\n */\n @Prop() calendars?: Calendar[];\n\n /**\n * @standalone\n * The participant options passed in the additionalParticipants prop\n * from the nylas-scheduler-editor component.\n */\n @Prop() participantOptions?: AdditionalParticipant[];\n\n /**\n * This event is fired when the participants custom availability changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The state to store the custom availability setting for participants.\n */\n @State() selectedCalendars: {\n [key: string]: {\n isOpen: boolean;\n name: string;\n calendars?: Calendar[];\n };\n } = this.setParticipants(this.participants);\n\n /**\n * Participants calendar options.\n */\n @State() participantCalendars: {\n [key: string]: Calendar[];\n } = {};\n\n /**\n * The state to store the default selected calendars for each participant\n */\n @State() participantDefaultSelectedCalendars: {\n [key: string]: string[];\n } = {};\n\n // Watchers\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-connected-calendars', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('calendars')\n calendarsChangedHandler(newValue: Calendar[]) {\n debug('nylas-connected-calendars', 'calendarsChangedHandler', newValue);\n this.selectedCalendars = this.setParticipants(this.participants);\n this.participantCalendars = this.getParticipantCalendarOptions(this.participants, this.participantOptions);\n }\n\n @Watch('participants')\n participantsChangedHandler(newValue: Participant[]) {\n debug('nylas-connected-calendars', 'participantsChangedHandler', newValue);\n this.selectedCalendars = this.setParticipants(newValue);\n this.participantCalendars = this.getParticipantCalendarOptions(newValue, this.participantOptions);\n }\n\n @Watch('participantOptions')\n participantOptionsChangedHandler(newValue: AdditionalParticipant[]) {\n debug('nylas-calendar-picker', 'participantOptionsChangedHandler', newValue);\n this.selectedCalendars = this.setParticipants(this.participants);\n this.participantCalendars = this.getParticipantCalendarOptions(this.participants, newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-calendar-picker', 'selectedConfigurationChangedHandler', newValue);\n const participants = newValue?.participants || this.participants;\n if (participants && participants.length > 0) {\n this.selectedCalendars = this.setParticipants(participants);\n this.participantCalendars = this.getParticipantCalendarOptions(participants, this.participantOptions);\n }\n }\n\n getParticipantCalendarOptions(addedParticipants: Participant[], availableParticipantOptions: AdditionalParticipant[] | undefined) {\n // Get the participants from the availableParticipantOptions prop that are in the addedParticipants prop\n const organizer = addedParticipants?.find(participant => participant.is_organizer);\n const isRoundRobinConfig = this.selectedConfiguration?.availability?.availability_rules?.availability_method !== 'collective';\n const participantCalendars = {};\n if (availableParticipantOptions) {\n const participants = addedParticipants?.filter(participant => availableParticipantOptions.some(availableParticipant => availableParticipant.email === participant.email));\n const remainingParticipants = addedParticipants?.filter(\n participant => !availableParticipantOptions.some(availableParticipant => availableParticipant.email === participant.email),\n );\n\n // Get the calendar options for each participant with email as the key\n participants?.forEach(participant => {\n const participantOption = availableParticipantOptions?.find(participantOption => participantOption.email === participant.email);\n if (!participantOption) return;\n this.participantDefaultSelectedCalendars[participant.email] = participant.availability?.calendar_ids || [];\n const calendars = participantOption.calendars ?? [];\n participant.availability?.calendar_ids?.forEach(calendarId => {\n if (!calendars?.some(calendar => calendar.id === calendarId) && calendarId !== 'primary') {\n calendars.push({ id: calendarId, name: calendarId });\n }\n });\n participantCalendars[participant.email] = calendars;\n });\n if (isRoundRobinConfig) {\n // If it is round robin config, add the remaining participant calendars to the participantCalendars\n // (Round-robin does not have an organizer, and we filtered out the participants not passed in the participantOptions prop,\n // so we need to add the remaining participants calendars to the participantCalendars)\n remainingParticipants?.forEach(participant => {\n if (participant?.availability?.calendar_ids && participant?.availability?.calendar_ids?.length > 0 && !participant.is_organizer) {\n participantCalendars[participant.email] = this.calendars ?? [{ id: 'primary', name: participant.email }];\n this.participantDefaultSelectedCalendars[participant.email] = participant.availability?.calendar_ids || [];\n }\n });\n }\n }\n\n // Add the organizer's calendars to the participantCalendars\n if (organizer) {\n participantCalendars[organizer.email] = this.calendars ?? [{ id: 'primary', name: organizer.email }];\n this.participantDefaultSelectedCalendars[organizer.email] = organizer.availability?.calendar_ids || [];\n }\n return participantCalendars;\n }\n\n // Lifecycle Methods\n connectedCallback() {\n debug('nylas-connected-calendars', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-connected-calendars', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-connected-calendars', 'componentWillLoad');\n }\n\n componentDidLoad() {\n debug('nylas-connected-calendars', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedCalendars = this.setParticipants(this.selectedConfiguration?.participants);\n this.participantCalendars = this.getParticipantCalendarOptions(this.selectedConfiguration?.participants, this.participantOptions);\n } else {\n this.selectedCalendars = this.setParticipants(this.participants);\n this.participantCalendars = this.getParticipantCalendarOptions(this.participants, this.participantOptions);\n }\n }\n\n @Listen('valueChanged')\n handleValueChanged(event: CustomEvent) {\n debug('[nylas-editor-tabs]', 'handleValueChanged', event);\n const { name, value } = event.detail;\n if (!name.startsWith('participant-')) {\n return;\n }\n // Validate the form\n if (!this.connectedCalendarsFormRef.checkValidity()) {\n this.internals.setValidity({ customError: true }, 'Please select at least one calendar for each participant.');\n return;\n } else {\n this.internals.setValidity({});\n }\n\n const key = name.split('participant-')[1];\n if (!this.selectedCalendars[key]) return;\n this.selectedCalendars[key]['calendars'] = value;\n this.selectedCalendars = { ...this.selectedCalendars };\n\n const participantsCalendars = {};\n Object.keys(this.selectedCalendars).forEach(key => {\n participantsCalendars[key] = this.selectedCalendars[key].calendars;\n });\n this.internals.setFormValue(JSON.stringify(participantsCalendars), this.name);\n this.valueChanged.emit({ value: JSON.stringify(participantsCalendars), name: this.name });\n }\n\n setParticipants(participants: Participant[]) {\n const selectedParticipants = {};\n participants?.forEach(participant => {\n if (participant?.availability?.calendar_ids && participant?.availability?.calendar_ids?.length > 0) {\n const isOpen = participant.is_organizer ? true : false;\n selectedParticipants[participant.email] = {\n isOpen: isOpen,\n name: participant.name || participant.email,\n calendars: participant.availability?.calendar_ids,\n };\n }\n });\n return selectedParticipants;\n }\n @RegisterComponent<NylasConnectedCalendars, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-connected-calendars',\n stateToProps: new Map([\n ['schedulerConfig.additionalParticipants', 'participantOptions'],\n ['schedulerConfig.calendars', 'calendars'],\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div class=\"nylas-connected-calendars\" part=\"nccals\">\n <div class=\"header\" part=\"nccals__header\">\n <h3>Connected Calendars</h3>\n <p>\n Select the calendars to use for checking your availability.\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">\n Check availability across one or more calendars. If you select multiple calendars for a participant, the participant must be available across all of their\n calendars to be considered available.\n </span>\n </tooltip-component>\n </p>\n </div>\n <div class=\"content\" part=\"nccals__content\">\n <form ref={el => (this.connectedCalendarsFormRef = el as HTMLFormElement)}>\n {Object.keys(this.participantCalendars).map((key, index) => {\n const participant = this.selectedCalendars[key];\n const participantCalendars = this.participantCalendars[key];\n if (!participant || !participant.name) return;\n return (\n <div class=\"participant-container\" part=\"nccals__container\" key={`participant-conatiner-${index}`}>\n <div class=\"participant-title\" part=\"nccals__title\">\n <p>{participant.name}'s connected calendars</p>\n <div class=\"participant-toggle\" part=\"nccals__toggle-container\">\n <span\n class={`chevron ${participant.isOpen ? 'open' : 'closed'}`}\n onClick={() => {\n this.selectedCalendars[key].isOpen = !participant.isOpen;\n this.selectedCalendars = { ...this.selectedCalendars };\n }}\n >\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n </div>\n {participant.isOpen && (\n <nylas-calendar-picker\n key={key}\n name={`participant-${key}`}\n calendars={participantCalendars}\n defaultSelectedCalendars={this.participantDefaultSelectedCalendars[key]}\n />\n )}\n </div>\n );\n })}\n </form>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n margin: 1rem;\n @include default-css-variables;\n}\n\n.nylas-custom-booking-flow__title {\n color: var(--nylas-base-900);\n font-size: 16px;\n font-style: normal;\n font-weight: 600;\n line-height: 20px;\n /* 125% */\n margin: 0;\n text-align: left;\n}\n\n.nylas-custom-booking-flow__subtitle {\n color: var(--nylas-base-600);\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n /* 142.857% */\n margin: 0.25rem 0px 0px;\n text-align: left;\n}\n\n.nylas-custom-booking-flow__content {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.nylas-custom-booking-flow__block {\n display: flex;\n justify-content: space-between;\n gap: 0.5rem;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { checkForMissingSlots, debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Host, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\n\n/**\n * The `nylas-custom-booking-flow` component is an input form for booking type (automatically or manually accept bookings) and confirmation redirect URL (default or custom).\n * This component is a container for the `nylas-booking-confirmation-type`, `nylas-booking-confirmation-redirect` components.\n *\n * ```html\n * <nylas-custom-booking-flow>\n * <div slot=\"inputs\">\n * <nylas-booking-confirmation-type></nylas-booking-confirmation-type>\n * <nylas-booking-confirmation-redirect></nylas-booking-confirmation-redirect>\n * </div>\n * </nylas-custom-booking-flow>\n * ```\n *\n * @slot inputs - The custom booking flow inputs. This includes the booking type, confirmation redirect type, and custom redirect URL components.\n */\n@Component({\n tag: 'nylas-custom-booking-flow',\n styleUrl: 'nylas-custom-booking-flow.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasCustomBookingFlow {\n @Element() el!: HTMLElement;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-custom-booking-flow', 'connectedCallback');\n }\n disconnectedCallback() {\n debug('nylas-custom-booking-flow', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-custom-booking-flow', 'componentWillLoad');\n }\n\n componentDidLoad() {\n debug('nylas-custom-booking-flow', 'componentDidLoad');\n checkForMissingSlots(['inputs'], this.el);\n }\n\n @RegisterComponent<NylasCustomBookingFlow, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-custom-booking-flow',\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host part=\"ncbflow\">\n <nylas-form-card exportparts=\"nfc__header: ncbflow__header\">\n <h1 slot=\"header-title\" class=\"nylas-custom-booking-flow__title\" part=\"ncbflow__title\">\n Custom booking flow\n </h1>\n <div slot=\"content\" class=\"nylas-custom-booking-flow__content\" part=\"ncbflow__content\">\n <slot name=\"inputs\"></slot>\n </div>\n </nylas-form-card>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n@import '../../../common/mixins/inputs.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-custom-event-slug {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n text-align: left;\n\n .header {\n padding: 1rem;\n display: grid;\n grid-template-columns: 1fr auto;\n\n h3 {\n border-radius: var(--nylas-border-radius-2x);\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n\n .drawer-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n\n .nylas-custom-event-slug__body {\n display: grid;\n grid-template-columns: 1fr;\n background-color: var(--nylas-base-25);\n border-radius: 0 0 var(--nylas-border-radius-2x) var(--nylas-border-radius-2x);\n border-top: 1px solid var(--nylas-base-200);\n\n @media #{$mobile} {\n grid-template-columns: 1fr;\n }\n\n .nylas-custom-event-slug__section {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n color: var(--nylas-base-800);\n\n @media #{$mobile} {\n border: none;\n }\n\n .nylas-custom-event-slug__row {\n display: flex;\n align-items: center;\n gap: 1rem;\n\n label {\n display: flex;\n align-items: center;\n\n span.required {\n color: var(--nylas-error, #cc4841);\n }\n\n span.label-icon {\n margin-left: 4px;\n\n tooltip-component {\n display: flex;\n }\n }\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 1rem;\n font-weight: 500;\n line-height: 24px;\n color: var(--nylas-base-900);\n }\n\n .input-container {\n width: 100%;\n }\n }\n }\n\n span.error-message {\n color: var(--nylas-error);\n }\n\n span.help-text {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n\n .nylas-custom-event-slug__input-wrapper {\n @include textfield;\n width: -moz-available;\n width: -webkit-fill-available;\n display: flex;\n flex-direction: row;\n gap: 0.125rem;\n border-radius: var(--nylas-border-radius-2x);\n z-index: 1;\n\n &.focus {\n outline: 2px solid var(--nylas-primary);\n }\n\n &.error {\n border-color: var(--nylas-error);\n outline: none;\n }\n\n input-component::part(ic__input) {\n outline: none;\n border: none;\n width: 100%;\n font-size: 1rem;\n height: auto;\n padding-left: 0px;\n }\n\n .prefix {\n z-index: 0;\n margin-top: 1px;\n color: var(--nylas-base-400);\n font-weight: 500;\n font-size: 24px;\n }\n\n .icon {\n margin-right: 0.25rem;\n padding: 0 0.75rem;\n height: 100%;\n display: flex;\n align-items: center;\n right: 0;\n cursor: pointer;\n user-select: none;\n\n &.disabled {\n cursor: not-allowed;\n }\n\n &:hover {\n svg path {\n fill: var(--nylas-primary);\n }\n }\n\n &:active {\n svg path {\n fill: var(--nylas-base-500);\n }\n }\n\n .copied {\n display: flex;\n align-items: center;\n font-size: 0.875rem;\n gap: 0.125rem;\n }\n }\n }\n}","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\n\n/**\n * The `nylas-custom-event-slug` component is a UI component that allows users to add a custom URL slug for their event link.\n *\n * @part nces - The nylas-custom-event-slug container\n * @part nces__body - The body of the event communication section\n * @part nces__header - The header of the event communication section\n * @part nces__drawer-toggle--container - The card's drawer toggle container\n * @part nces__input-textfield - The custom slug input textfield\n */\n@Component({\n tag: 'nylas-custom-event-slug',\n styleUrl: 'nylas-custom-event-slug.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasCustomEventSlug {\n @Element() host!: HTMLNylasCustomEventSlugElement;\n /**\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * The default custom event slug\n */\n @Prop() defaultUrlSlug?: string;\n /**\n * Is the custom event slug card expanded\n */\n @Prop() isOpen: boolean = true;\n /**\n * Slug error message\n */\n @Prop() slugErrorMessage: string = '';\n /**\n * The name of the component\n */\n @Prop() name: string = 'custom-event-slug';\n /**\n * Indicates if a slug is required for the configuration.\n * When set to true, the user must enter a slug when creating or editing a configuration.\n * The slug is used for hosted pages that are public.\n */\n @Prop() requiresSlug: boolean = false;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The URL slug state\n */\n @State() urlSlug!: string;\n\n /**\n * The focus state of the input container.\n */\n @State() focus = false;\n\n /**\n * The copied state for the copy to clipboard button\n */\n @State() copied = false;\n\n /**\n * This event is fired when the slug value changes\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-custom-event-slug', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-custom-event-slug', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-custom-event-slug', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-custom-event-slug', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n console.log('No selected configuration found');\n this.urlSlug = this.defaultUrlSlug || '';\n }\n }\n\n componentWillUpdate() {\n debug('nylas-custom-event-slug', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-custom-event-slug', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-custom-event-slug', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-custom-event-slug', 'componentDidRender');\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-custom-event-slug', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-custom-booking-flow', 'selectedConfigurationChangedHandler', newValue);\n this.urlSlug = newValue?.slug || this.defaultUrlSlug || '';\n }\n\n @Listen('nylasFormInputChanged')\n async nylasFormInputChangeHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { name, value } = event.detail;\n this.internals.setValidity({});\n\n if (name === 'event-slug') {\n this.urlSlug = value;\n this.internals.setFormValue(JSON.stringify(value), this.name);\n this.valueChanged.emit({ value: JSON.stringify(value), name: this.name });\n }\n }\n\n @Listen('nylasFormInputFocused')\n async nylasFormInputFocusHandler() {\n this.focus = true;\n }\n\n @Listen('nylasFormInputBlurred')\n async nylasFormInputBlurHandler() {\n this.slugErrorMessage = '';\n this.internals.setValidity({});\n this.focus = false;\n if (this.requiresSlug && this.urlSlug === '') {\n this.internals.setValidity({ customError: true }, 'Slug is required');\n this.slugErrorMessage = 'Slug cannot be blank';\n return;\n }\n if (!/^[A-Za-z0-9-]*$/.test(this.urlSlug)) {\n this.internals.setValidity({ customError: true }, 'Invalid slug: Only letters, numbers, and hyphens are allowed.');\n this.slugErrorMessage = 'Invalid slug: Only letters, numbers, and hyphens are allowed.';\n }\n }\n\n @Listen('formSubmitted', { target: 'window' })\n formSubmittedHandler(event: CustomEvent) {\n debug('nylas-event-title', 'formSubmittedHandler', event);\n this.nylasFormInputBlurHandler();\n }\n\n toggleDrawer() {\n this.isOpen = !this.isOpen;\n }\n\n async copyToClipboard() {\n try {\n await navigator.clipboard.writeText(`${this.urlSlug}`);\n\n this.copied = true;\n setTimeout(() => {\n this.copied = false;\n }, 1000);\n } catch (err) {\n console.error('Failed to copy: ', err);\n }\n }\n\n @RegisterComponent<NylasCustomEventSlug, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-custom-event-slug',\n stateToProps: new Map([\n ['schedulerConfig.requiresSlug', 'requiresSlug'],\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n if (!this.requiresSlug) return null;\n const isComponentReady = typeof this.urlSlug !== 'undefined';\n return (\n <Host>\n <div class=\"nylas-custom-event-slug\" part=\"nces\">\n <div class=\"header\" part=\"nces__header\">\n <div>\n <h3>Custom event slug</h3>\n <p>Create a custom URL slug for this event</p>\n </div>\n <div class=\"drawer-toggle\" part=\"nces__drawer-toggle--container\">\n <span class={`chevron ${this.isOpen ? 'open' : 'closed'} `} onClick={() => this.toggleDrawer()}>\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n </div>\n\n {this.isOpen && (\n <div class=\"nylas-custom-event-slug__body\" part=\"nces__body\">\n <div class=\"nylas-custom-event-slug__section\">\n <div class=\"nylas-custom-event-slug__row\">\n <div class=\"input-container\">\n <label>\n Event URL slug\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">Provide a custom slug for your URL to help uniquely identify your event (letters, numbers, and hyphens only)</span>\n </tooltip-component>\n </span>\n </label>\n\n <div class={{ 'nylas-custom-event-slug__input-wrapper': true, 'focus': this.focus, 'error': !!this.slugErrorMessage }}>\n <div slot=\"prefix\" class=\"prefix\">\n /\n </div>\n {isComponentReady && (\n <input-component\n name=\"event-slug\"\n id=\"event-slug\"\n type=\"text\"\n required={false}\n placeholder=\"my-link-name\"\n exportparts=\"ic_input: nces__input-textfield\"\n defaultValue={this.urlSlug}\n />\n )}\n <div slot=\"icon\" class={{ icon: true, disabled: !this.urlSlug }} onClick={() => !this.copied && !!this.urlSlug && this.copyToClipboard()}>\n {this.copied ? (\n <div class=\"copied\">\n <checkmark-icon width=\"12\" height=\"18\" /> Copied!\n </div>\n ) : (\n <copy-icon width=\"12\" height=\"18\" />\n )}\n </div>\n </div>\n {this.slugErrorMessage && <span class=\"error-message\">{this.slugErrorMessage}</span>}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-customize-booking-settings {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n .header {\n padding: 1rem;\n border-bottom: 1px solid var(--nylas-base-200);\n h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n .nylas-customize-booking-settings__settings {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1rem;\n margin: 1rem 0;\n .nylas-customize-booking-settings__settings-div {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n }\n}\n\n.label {\n margin-left: 32px;\n font-size: 16px;\n font-weight: 400;\n color: var(--nylas-base-800);\n line-height: 24px;\n .label-contents {\n margin: 0;\n display: inline-block;\n @media #{$mobile} {\n display: block;\n }\n }\n tooltip-component {\n display: inline-block;\n }\n}\n\ntooltip-component#guests::part(tc__content) {\n @media #{$mobile} {\n left: 58px;\n }\n}\n\ntooltip-component#reschedule::part(tc__content) {\n left: 58px;\n @media #{$mobile} {\n left: 58px;\n }\n}\n\ntooltip-component#cancel::part(tc__content) {\n left: -58px;\n @media #{$mobile} {\n left: 58px;\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\n\n/**\n * The `nylas-customize-booking-settings` component is a UI component that displays the booking calendar picker.\n * @part ncbs - The booking calendar picker container\n * @part ncbs__header - The header of the booking calendar picker\n * @part ncbs__settings - The settings container\n * @part ncbs__settings-div - The div inside the settings container that contains the checkbox and tooltip for each setting\n * @part ncbs__additional_guests - The additional guests setting\n * @part ncbs__cancellation_options - The cancellation options setting\n * @part ncbs__rescheduling_options - The rescheduling options setting\n */\n@Component({\n tag: 'nylas-customize-booking-settings',\n styleUrl: 'nylas-customize-booking-settings.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasCustomizeBookingSettings {\n @Element() host!: HTMLNylasCustomizeBookingSettingsElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The default additional guests hidden setting as set in the configuration.\n */\n @Prop() defaultHideAdditionalGuests: boolean = this.selectedConfiguration?.scheduler?.hide_additional_guests ?? false;\n\n /**\n * @standalone\n * The default hide cancellation options setting as set in the configuration.\n */\n @Prop() defaultHideCancellationOptions: boolean = this.selectedConfiguration?.scheduler?.hide_cancellation_options ?? false;\n\n /**\n * @standalone\n * The default hide rescheduling options setting as set in the configuration.\n */\n @Prop() defaultHideReschedulingOptions: boolean = this.selectedConfiguration?.scheduler?.hide_rescheduling_options ?? false;\n\n /**\n * @standalone\n * The name of the calendar picker.\n */\n @Prop() name: string = 'customize-booking-settings';\n\n /**\n * State to store the allowed additional guests setting.\n */\n @State() allowGuestsToInvite!: boolean;\n\n /**\n * State to store the hide cancel booking setting.\n */\n @State() hideCancellationOptions!: boolean;\n\n /**\n * State to store the hide reschedule booking setting.\n */\n @State() hideReschedulingOptions!: boolean;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * This event is fired when the selected booking calendar changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-customize-booking-settings', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-customize-booking-settings', 'selectedConfigurationChangedHandler', newValue);\n this.allowGuestsToInvite = !newValue?.scheduler?.hide_additional_guests;\n this.hideCancellationOptions = newValue?.scheduler?.hide_cancellation_options ?? false;\n this.hideReschedulingOptions = newValue?.scheduler?.hide_rescheduling_options ?? false;\n }\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-customize-booking-settings', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-customize-booking-settings', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-customize-booking-settings', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-customize-booking-settings', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n // Set the default values if the selected configuration is not available\n this.allowGuestsToInvite = !this.defaultHideAdditionalGuests;\n this.hideCancellationOptions = this.defaultHideCancellationOptions;\n this.hideReschedulingOptions = this.defaultHideReschedulingOptions;\n }\n }\n\n componentWillUpdate() {\n debug('nylas-customize-booking-settings', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-customize-booking-settings', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-customize-booking-settings', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-customize-booking-settings', 'componentDidRender');\n }\n\n @Listen('nylasFormCheckboxToggled')\n checkboxToggledHandler(event: CustomEvent<{ name: string; checked: boolean }>) {\n const { name, checked } = event.detail;\n switch (name) {\n case 'hide_additional_guests':\n this.allowGuestsToInvite = checked;\n break;\n case 'hide_cancellation_options':\n this.hideCancellationOptions = checked;\n break;\n case 'hide_rescheduling_options':\n this.hideReschedulingOptions = checked;\n break;\n }\n this.valueChanged.emit({\n value: JSON.stringify({\n additionalGuestsHidden: !this.allowGuestsToInvite,\n hideCancellationOptions: this.hideCancellationOptions,\n hideReschedulingOptions: this.hideReschedulingOptions,\n }),\n name: this.name,\n });\n this.internals.setFormValue(\n JSON.stringify({\n additionalGuestsHidden: !this.allowGuestsToInvite,\n hideCancellationOptions: this.hideCancellationOptions,\n hideReschedulingOptions: this.hideReschedulingOptions,\n }),\n this.name,\n );\n }\n\n @RegisterComponent<NylasCustomizeBookingSettings, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-customize-booking-settings',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n fireRegisterEvent: true,\n })\n render() {\n const showComponent = typeof this.hideCancellationOptions === 'boolean' && typeof this.hideReschedulingOptions === 'boolean' && typeof this.allowGuestsToInvite === 'boolean';\n\n return (\n <Host>\n {showComponent && (\n <div class=\"nylas-customize-booking-settings\" part=\"ncbs\">\n <div class=\"header\" part=\"ncbs__header\">\n <h3>Additional settings</h3>\n <p>Booking settings for the event.</p>\n </div>\n\n <div class=\"nylas-customize-booking-settings__settings\" part=\"ncbs__settings\">\n <div class=\"nylas-customize-booking-settings__settings-div\" part=\"ncbs__settings-div , ncbs__additional_guests\">\n <checkbox-component name=\"hide_additional_guests\" label=\"Allow guests to invite additional guests.\" checked={this.allowGuestsToInvite}>\n <span slot=\"label\" class=\"label\">\n <p class=\"label-contents\">Allow guests to invite additional guests.</p>\n </span>\n </checkbox-component>\n </div>\n <div class=\"nylas-customize-booking-settings__settings-div\" part=\"ncbs__settings-div , ncbs__rescheduling_options\">\n <checkbox-component name=\"hide_rescheduling_options\" label=\"Hide 'Reschedule' option on booking page and emails.\" checked={this.hideReschedulingOptions}>\n <span slot=\"label\" class=\"label\">\n <p class=\"label-contents\">Hide rescheduling option.</p>\n <tooltip-component id=\"reschedule\">\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">\n Hide the <strong>Reschedule</strong> button in the booking confirmation and email notifications.\n </span>\n </tooltip-component>\n </span>\n </checkbox-component>\n </div>\n <div class=\"nylas-customize-booking-settings__settings-div\" part=\"ncbs__settings-div , ncbs__cancellation_options\">\n <checkbox-component name=\"hide_cancellation_options\" label=\"Hide 'Cancel' option on booking page and emails.\" checked={this.hideCancellationOptions}>\n <span slot=\"label\" class=\"label\">\n <p class=\"label-contents\">Hide cancellation option.</p>\n <tooltip-component id=\"cancel\">\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">\n Hide the <strong>Cancel</strong> button in the booking confirmation and email notifications.\n </span>\n </tooltip-component>\n </span>\n </checkbox-component>\n </div>\n </div>\n </div>\n )}\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n @include default-css-variables;\n}\n\n.nylas-event-description {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%; /* 21px */\n span.label-icon {\n margin-left: 4px;\n tooltip-component {\n display: flex;\n }\n }\n }\n textarea {\n padding: 12px 16px;\n border-width: 1;\n resize: vertical;\n border-radius: 8px;\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n border: 1px solid var(--nylas-base-200);\n &::-webkit-resizer {\n display: none;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug, sanitize } from '@/utils/utils';\nimport { AttachInternals, Component, Host, State, h, Element, Prop, Watch, Event, EventEmitter } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\n\n/**\n * The `nylas-event-description` component is a form input for the description of an event.\n * @part nedesc - The event description container\n * @part nedesc__textarea - The event description textarea\n */\n@Component({\n tag: 'nylas-event-description',\n styleUrl: 'nylas-event-description.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasEventDescription {\n /**\n * The host element <nylas-event-description>\n */\n @Element() host!: HTMLElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n\n /**\n * @standalone\n * The event description stored in the configuration\n */\n @Prop() eventDescription?: string;\n\n /**\n * @standalone\n * The name of the event description input.\n */\n @Prop() name: string = 'description';\n /**\n * The selected event description state. This defaults to the event description from the configuration or an empty string.\n */\n @State() description: string = this.eventDescription || this.selectedConfiguration?.event_booking?.description || '';\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-event-description', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-custom-booking-flow', 'selectedConfigurationChangedHandler', newValue);\n if (newValue?.event_booking?.description) {\n this.description = newValue?.event_booking?.description;\n }\n }\n\n /**\n * Event emitted when the event description changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n connectedCallback() {\n debug('nylas-event-description', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-event-description', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-event-description', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.description = this.eventDescription || '';\n }\n }\n\n disconnectedCallback() {\n debug('nylas-event-description', 'disconnectedCallback');\n }\n\n handleChange(event) {\n const value = sanitize(event.target.value);\n this.description = value;\n this.internals.setFormValue(value, 'description');\n this.valueChanged.emit({ value: value, name: this.name });\n }\n\n @RegisterComponent<NylasEventDescription, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-event-description',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div class=\"nylas-event-description\" part=\"nedesc\">\n <label htmlFor=\"description\">\n Event description\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">The event description appears in the Scheduler Editor’s manager view and in the response payload when a booking is created.</span>\n </tooltip-component>\n </span>\n </label>\n <textarea id=\"description\" part=\"nedesc__textarea\" name=\"description\" value={this.description} maxlength=\"8192\" onInput={e => this.handleChange(e)}></textarea>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n}\n\n.nylas-event-duration {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%; /* 21px */\n span.required {\n color: var(--nylas-error, #cc4841);\n }\n span.label-icon {\n margin-left: 4px;\n tooltip-component {\n display: flex;\n }\n }\n }\n}\n.nylas-event-duration__wrapper {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n input {\n padding: 12px 16px;\n border-width: 1;\n border-radius: 8px;\n border: 1px solid var(--nylas-base-200);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n width: 48px;\n }\n input-dropdown::part(id_dropdown-input) {\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 14px 16px;\n width: 50px;\n }\n input-dropdown::part(id_dropdown-content) {\n width: 100%;\n min-width: unset;\n height: 200px;\n }\n\n select-dropdown {\n width: 120px;\n @media #{$mobile} {\n width: 100%;\n }\n }\n\n select-dropdown::part(sd_dropdown-button) {\n border: 1px solid var(--nylas-base-200);\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Host, Listen, State, h, Element, Prop, Watch, Event, EventEmitter } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\n\n/**\n * The `nylas-event-duration` component is a form input for the duration of an event.\n *\n * @part ned - The event duration container\n * @part ned__dropdown - The dropdown container for the duration increment\n * @part ned__dropdown-button - The dropdown button for the duration increment\n * @part ned__dropdown-content - The dropdown content for the duration increment\n * @part ned__input_dropdown - The input dropdown container for the duration minutes\n * @part ned__input_dropdown-input - The input for the duration minutes\n * @part ned__input_dropdown-content - The dropdown content for the input duration minutes\n */\n@Component({\n tag: 'nylas-event-duration',\n styleUrl: 'nylas-event-duration.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasEventDuration {\n /**\n * The host element <nylas-event-duration>\n */\n @Element() host!: HTMLElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n\n /**\n * @standalone\n * The name of the event duration. Default is 'duration'.\n */\n @Prop() name: string = 'duration';\n /**\n * @standalone\n * The event duration in minutes as set in the configuration.\n */\n @Prop() eventDurationMinutes?: number;\n\n /**\n * The selected event duration state. This defaults to the event duration from the configuration or 30 minutes.\n */\n @State() duration: number = this.eventDurationMinutes ? (this.eventDurationMinutes >= 60 ? this.eventDurationMinutes / 60 : this.eventDurationMinutes) : 30;\n /**\n * The duration in minutes. This defaults to the event duration from the configuration or 30 minutes.\n */\n @State() durationMinutes!: number;\n /**\n * The duration increment. This defaults to minute(s).\n */\n @State() durationIncrement!: number;\n /**\n * The durationMinutesOptions for the dropdown.\n */\n @State() durationMinutesOptions = [\n { value: 15, label: '15' },\n { value: 30, label: '30' },\n { value: 45, label: '45' },\n { value: 60, label: '60' },\n ];\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-event-duration', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newVal: Configuration) {\n const configDuration = newVal?.availability?.duration_minutes;\n if (configDuration) {\n this.duration = configDuration >= 60 ? configDuration / 60 : configDuration;\n this.durationMinutes = configDuration ? configDuration : 30;\n this.durationIncrement = configDuration >= 60 ? 60 : 1;\n }\n }\n\n @Watch('durationMinutes')\n durationMinutesChangedHandler(newValue: number, oldValue: number) {\n debug('nylas-event-duration', 'durationMinutesChangedHandler', newValue);\n if (newValue === oldValue) {\n return;\n }\n this.valueChanged.emit({ value: newValue.toString(), name: this.name });\n }\n\n /**\n * Event emitted when the event duration changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n connectedCallback() {\n debug('nylas-event-duration', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-event-duration', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-event-duration', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n }\n this.duration = this.duration ? this.duration : this.eventDurationMinutes ? (this.eventDurationMinutes >= 60 ? this.eventDurationMinutes / 60 : this.eventDurationMinutes) : 30;\n this.durationMinutes = this.durationMinutes ? this.durationMinutes : this.duration ? this.duration : 30;\n this.durationIncrement = this.durationIncrement ? this.durationIncrement : this.duration >= 60 ? 60 : 1;\n this.setDurationMintueOptions();\n this.isInternalsAvailable && this.internals.setFormValue(this.durationMinutes.toString(), 'duration');\n }\n\n disconnectedCallback() {\n debug('nylas-event-duration', 'disconnectedCallback');\n }\n\n get isInternalsAvailable() {\n return typeof this.internals !== 'undefined' && typeof this.internals.setFormValue === 'function';\n }\n\n setDurationMintueOptions() {\n if (this.durationIncrement === 1) {\n this.durationMinutesOptions = [\n { value: 15, label: '15' },\n { value: 30, label: '30' },\n { value: 45, label: '45' },\n { value: 60, label: '60' },\n ];\n } else {\n this.durationMinutesOptions = Array.from({ length: 23 }, (_, i) => ({ value: i + 1, label: (i + 1).toString() }));\n }\n return this.durationMinutesOptions;\n }\n\n handleChange(event) {\n this.duration = event.target.value;\n this.durationMinutes = this.duration * this.durationIncrement;\n this.isInternalsAvailable && this.internals.setFormValue(this.durationMinutes.toString(), this.name);\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-calendar-picker', 'nylasFormDropdownChangedHandler', event.detail);\n const { value } = event.detail;\n this.durationIncrement = parseInt(value);\n if (this.durationIncrement === 1) {\n this.duration = 60;\n } else {\n this.duration = 1;\n }\n this.setDurationMintueOptions();\n this.durationMinutes = this.duration * this.durationIncrement;\n this.isInternalsAvailable && this.internals.setFormValue(this.durationMinutes.toString(), 'duration');\n }\n\n @Listen('inputOptionChanged')\n inputOptionChangedHandler(event: CustomEvent<{ value: number; name: string }>) {\n debug('nylas-calendar-picker', 'inputOptionChangedHandler', event.detail);\n const { value } = event.detail;\n this.duration = value;\n this.durationMinutes = this.duration * this.durationIncrement;\n this.isInternalsAvailable && this.internals.setFormValue(this.durationMinutes.toString(), this.name);\n }\n\n @RegisterComponent<NylasEventDuration, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-event-duration',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n const durationOptions = [\n { value: 1, label: 'minute' },\n { value: 60, label: 'hour' },\n ];\n\n return (\n <Host>\n <div class=\"nylas-event-duration\" part=\"ned\">\n <label htmlFor=\"duration\">\n Event duration<span class=\"required\">*</span>\n </label>\n <div class=\"nylas-event-duration__wrapper\">\n <input-dropdown\n name={'event-duration'}\n options={this.durationMinutesOptions}\n inputValue={this.duration.toString()}\n exportparts=\"id_dropdown: ned__input_dropdown, id_dropdown-input: ned__input_dropdown-input, id_dropdown-content: ned__input_dropdown-content\"\n defaultInputOption={this.durationMinutesOptions.find(i => i.value == this.duration)}\n />\n {this.durationIncrement && (\n <select-dropdown\n name={'event-duration'}\n options={durationOptions}\n pluralizedLabel={this.duration > 1 ? 's' : ''}\n exportparts=\"sd_dropdown: ned__dropdown, sd_dropdown-button: ned__dropdown-button, sd_dropdown-content: ned__dropdown-content\"\n defaultSelectedOption={durationOptions.find(i => i.value == this.durationIncrement)}\n withSearch={false}\n />\n )}\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n margin: 1rem;\n @include default-css-variables;\n}\n\n.nylas-event-info__title {\n color: var(--nylas-base-900);\n font-size: 16px;\n font-style: normal;\n font-weight: 600;\n line-height: 20px; /* 125% */\n margin: 0;\n text-align: left;\n}\n.nylas-event-info__subtitle {\n color: var(--nylas-base-600);\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px; /* 142.857% */\n margin: 0.25rem 0px 0px;\n text-align: left;\n}\n.nylas-event-info__content {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.nylas-event-info__block {\n display: flex;\n justify-content: space-between;\n gap: 0.5rem;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { checkForMissingSlots, debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Host, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\n\n/**\n * The `nylas-event-info` component is an input form for event information such as title, description, duration, location.\n * This component is a container for the `nylas-event-title`, `nylas-event-description`, `nylas-event-duration`, and `nylas-event-location` components.\n *\n * ```html\n * <nylas-event-info>\n * <div slot=\"inputs\">\n * <nylas-event-title></nylas-event-title>\n * <nylas-event-description></nylas-event-description>\n * <nylas-event-duration></nylas-event-duration>\n * <nylas-lcation-component></nylas-event-location>\n * </div>\n * </nylas-event-info>\n * ```\n *\n * @slot inputs - The event information inputs. This includes the event title, description, duration, and location components.\n */\n@Component({\n tag: 'nylas-event-info',\n styleUrl: 'nylas-event-info.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasEventInfo {\n @Element() el!: HTMLElement;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n connectedCallback() {\n debug('nylas-event-info', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-event-info', 'componentWillLoad');\n }\n\n componentDidLoad() {\n debug('nylas-event-info', 'componentDidLoad');\n checkForMissingSlots(['inputs'], this.el);\n }\n\n disconnectedCallback() {\n debug('nylas-event-info', 'disconnectedCallback');\n }\n\n @RegisterComponent<NylasEventInfo, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-event-info',\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <nylas-form-card exportparts=\"nfc__header: nei__header\">\n <h1 slot=\"header-title\" class=\"nylas-event-info__title\" part=\"nei__title\">\n Event information\n </h1>\n <div slot=\"content\" class=\"nylas-event-info__content\">\n <slot name=\"inputs\"></slot>\n </div>\n </nylas-form-card>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n margin: 1rem;\n @include default-css-variables;\n}\n\n.nylas-event-limits__title {\n color: var(--nylas-base-900);\n font-size: 16px;\n font-style: normal;\n font-weight: 600;\n line-height: 20px; /* 125% */\n margin: 0;\n text-align: left;\n}\n.nylas-event-limits__subtitle {\n color: var(--nylas-base-600);\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px; /* 142.857% */\n margin: 0.25rem 0px 0px;\n text-align: left;\n}\n.nylas-event-limits__content {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.nylas-event-limits__block {\n display: flex;\n justify-content: space-between;\n gap: 0.5rem;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { checkForMissingSlots, debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Host, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\n\n/**\n * The `nylas-event-limits` component is an input form for event limits, such as the number of available days in the future and\n * the minimum period of notice that a guest must provide to cancel a booking.\n * This component is a container for the `nylas-limit-future-bookings` and `nylas-min-cancellation-notice` components.\n *\n * ```html\n * <nylas-event-limits>\n * <div slot=\"inputs\">\n * <nylas-limit-future-bookings></nylas-limit-future-bookings>\n * <nylas-min-cancellation-notice></nylas-min-cancellation-notice>\n * </div>\n * </nylas-event-limits>\n * ```\n *\n * @slot inputs - The event information inputs. This includes the limit future bookings and minimum cancellation notice components.\n */\n@Component({\n tag: 'nylas-event-limits',\n styleUrl: 'nylas-event-limits.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasEventLimits {\n @Element() el!: HTMLElement;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n connectedCallback() {\n debug('nylas-event-limits', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-event-limits', 'componentWillLoad');\n }\n\n componentDidLoad() {\n debug('nylas-event-limits', 'componentDidLoad');\n checkForMissingSlots(['inputs'], this.el);\n }\n\n disconnectedCallback() {\n debug('nylas-event-limits', 'disconnectedCallback');\n }\n\n @RegisterComponent<NylasEventLimits, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-event-limits',\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <nylas-form-card exportparts=\"nfc__header: nel__header\">\n <h1 slot=\"header-title\" class=\"nylas-event-limits__title\">\n Event limits\n </h1>\n <div slot=\"content\" class=\"nylas-event-limits__content\">\n <slot name=\"inputs\"></slot>\n </div>\n </nylas-form-card>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n @include default-css-variables;\n}\n\n.nylas-event-location {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-family: var(--nylas-font-family);\n\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%; /* 21px */\n span.label-icon {\n margin-left: 4px;\n tooltip-component {\n display: flex;\n }\n }\n }\n\n span[slot='select-icon'] {\n border-right: 1px solid var(--nylas-base-200);\n padding: 16px 0.75rem 16px 0.5rem;\n border-radius: var(--nylas-border-radius-2x);\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n height: 20px;\n }\n div.location-input {\n display: grid;\n grid-template-columns: auto 1fr;\n width: 100%;\n gap: 0.5rem;\n @media #{$mobile} {\n grid-template-columns: 1fr;\n }\n input {\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 12px 16px;\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n }\n select-dropdown {\n width: 208px;\n @media #{$mobile} {\n width: 100%;\n }\n }\n select-dropdown::part(sd_dropdown) {\n width: 100%;\n }\n select-dropdown::part(sd_dropdown-content) {\n left: calc(35px + 0.5rem);\n }\n select-dropdown::part(sd_dropdown-button) {\n display: flex;\n justify-content: space-between;\n width: 100%;\n border: 1px solid var(--nylas-base-200);\n padding: 0 0.5rem;\n }\n select-dropdown::part(sd_dropdown-button-selected-label) {\n display: inline-flex;\n align-self: center;\n padding: 14px 0;\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug, sanitize } from '@/utils/utils';\nimport { AttachInternals, Component, Host, State, h, Element, Prop, Watch, Event, EventEmitter, Listen } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Conference, Configuration } from '@nylas/core';\nimport { CONFERENCE_PROVIDER_MAP, PROVIDER_CONFERENCE_MAP } from '@/common/constants';\nimport { User } from '@/common/nylas-api-request';\n\nconst labels = {\n none: 'None',\n custom: 'Custom location',\n google: 'Google Meet',\n microsoft: 'Microsoft Teams',\n zoom: 'Zoom Meeting',\n};\n\n/**\n * The `nylas-event-location` component is a form input for the location of an event.\n *\n * @part nel - The event location container\n * @part nel__location - The event location input\n * @part nel__dropdown - The dropdown container\n * @part nel__dropdown-button - The dropdown button\n * @part nel__dropdown-content - The dropdown content\n */\n@Component({\n tag: 'nylas-event-location',\n styleUrl: 'nylas-event-location.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasEventLocation {\n /*\n * The host element <nylas-event-location>\n */\n @Element() host!: HTMLElement;\n /**\n * @standalone\n * The name of the event location input.\n */\n @Prop() name: string = 'location';\n\n /**\n * @standalone\n * The current user\n */\n @Prop() currentUser?: User;\n /**\n * @standalone\n * The users provider\n */\n @Prop() userProvider?: string;\n /**\n * @standalone\n * The event conferencing stored in the configuration\n */\n @Prop() eventConferencing?: Conference;\n /**\n * @standalone\n * The conference providers where the key is the provider name ('zoom') and the value is the grant id.\n * We currently support same provider ('google', 'microsoft') for all participants and 'zoom' for cross-provider conferencing.\n */\n @Prop() conferenceProviders?: Record<string, string>;\n\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n\n /**\n * @standalone\n * The event location stored in the configuration\n */\n @Prop() eventLocation?: string;\n /**\n * The selected event location state. This defaults to the event location from the configuration or an empty string.\n */\n @State() location: string = this.eventLocation ?? '';\n /**\n * The grant id for the conferencing of non-default conferencing options.\n */\n @State() grantId: string = this.eventConferencing ? this.setDefaultGrantID(this.eventConferencing) : '';\n /**\n * The selected location option. This defaults to 'none'.\n */\n @State() selectedLocationOption!: string;\n /**\n * The current user provider state.\n */\n @State() userProviderState: string = this.userProvider ?? this.currentUser?.provider ?? '';\n\n /**\n * The state to store location options.\n */\n @State() locationOptions = [\n { value: 'none', label: labels['none'], labelHTML: this.getLabelHTML('none') },\n { value: 'custom', label: labels['custom'], labelHTML: this.getLabelHTML('custom') },\n ];\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-event-location', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-custom-booking-flow', 'selectedConfigurationChangedHandler', newValue);\n const configLocation = newValue?.event_booking?.location;\n const configConferencing = newValue?.event_booking?.conferencing;\n if (configConferencing?.provider) {\n this.selectedLocationOption = this.setDefaultLocationOption(configConferencing, configLocation ?? '');\n this.grantId = this.setDefaultGrantID(configConferencing);\n this.location = configLocation ? configLocation : '';\n } else if (configLocation) {\n this.selectedLocationOption = configLocation ? 'custom' : 'none';\n this.location = configLocation;\n } else {\n this.selectedLocationOption = 'none';\n this.location = '';\n }\n }\n\n @Watch('currentUser')\n currentUserChangedHandler(newValue: User) {\n debug('nylas-custom-booking-flow', 'currentUserChangedHandler', newValue);\n if (newValue?.provider) {\n this.userProviderState = newValue?.provider;\n this.setLocationOptionsForProvider(this.userProviderState);\n }\n }\n\n @Watch('conferenceProviders')\n conferenceProvidersChanged(newValue: Record<string, string>) {\n if (newValue?.['zoom'] && !this.locationOptions.some(option => option.value === 'zoom')) {\n this.locationOptions.push({ value: 'zoom', label: labels['zoom'], labelHTML: this.getLabelHTML('zoom') });\n }\n }\n\n /**\n * This event is fired when the value of the event location changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n connectedCallback() {\n debug('nylas-event-location', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-event-location', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-event-location', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.selectedLocationOption = this.setDefaultLocationOption(this.eventConferencing || null, this.eventLocation ?? '');\n }\n\n this.userProviderState = this.userProvider ?? this.currentUser?.provider ?? '';\n this.setLocationOptionsForProvider(this.userProviderState);\n\n if (this.conferenceProviders?.['zoom'] && !this.locationOptions.some(option => option.value === 'zoom')) {\n this.locationOptions.push({ value: 'zoom', label: labels['zoom'], labelHTML: this.getLabelHTML('zoom') });\n }\n }\n\n disconnectedCallback() {\n debug('nylas-event-location', 'disconnectedCallback');\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string }>) {\n this.selectedLocationOption = event.detail.value;\n let payload;\n switch (this.selectedLocationOption) {\n case 'none':\n this.location = '';\n this.setFormValue('', this.name);\n this.valueChanged.emit({ value: '', name: this.name });\n this.valueChanged.emit({ value: JSON.stringify(null), name: 'conference' });\n break;\n case 'custom':\n this.valueChanged.emit({ value: JSON.stringify(null), name: 'conference' });\n break;\n case 'google':\n this.location = '';\n this.setFormValue('', this.name);\n const googleConfGrantId = this.conferenceProviders?.['google'];\n payload = {\n provider: PROVIDER_CONFERENCE_MAP.google,\n autocreate: googleConfGrantId\n ? {\n conf_grant_id: googleConfGrantId,\n }\n : {},\n };\n this.valueChanged.emit({ value: JSON.stringify(payload), name: 'conference' });\n this.valueChanged.emit({ value: '', name: this.name });\n break;\n case 'microsoft':\n this.location = '';\n this.setFormValue('', this.name);\n const microsoftConfGrantId = this.conferenceProviders?.['microsoft'];\n payload = {\n provider: PROVIDER_CONFERENCE_MAP.microsoft,\n autocreate: microsoftConfGrantId\n ? {\n conf_grant_id: microsoftConfGrantId,\n }\n : {},\n };\n this.valueChanged.emit({ value: JSON.stringify(payload), name: 'conference' });\n this.valueChanged.emit({ value: '', name: this.name });\n break;\n case 'zoom':\n this.location = '';\n this.setFormValue('', this.name);\n const zoomConfGrantId = this.conferenceProviders?.['zoom'];\n payload = {\n provider: PROVIDER_CONFERENCE_MAP.zoom,\n autocreate: zoomConfGrantId\n ? {\n conf_grant_id: zoomConfGrantId,\n }\n : {},\n };\n this.valueChanged.emit({ value: JSON.stringify(payload), name: 'conference' });\n this.valueChanged.emit({ value: '', name: this.name });\n break;\n }\n }\n\n setLocationOptionsForProvider(provider: string) {\n switch (provider) {\n case 'google':\n if (!this.locationOptions.some(option => option.value === 'google')) {\n this.locationOptions.push({ value: 'google', label: labels['google'], labelHTML: this.getLabelHTML('google') });\n }\n break;\n case 'microsoft':\n if (!this.locationOptions.some(option => option.value === 'microsoft')) {\n this.locationOptions.push({ value: 'microsoft', label: labels['microsoft'], labelHTML: this.getLabelHTML('microsoft') });\n }\n break;\n }\n }\n\n setDefaultLocationOption(eventConferencing: Conference | null, eventLocation: string) {\n if (eventConferencing != null && eventConferencing?.provider != null && eventConferencing?.autocreate != null) {\n return CONFERENCE_PROVIDER_MAP[eventConferencing?.provider];\n }\n return eventLocation ? 'custom' : 'none';\n }\n setDefaultGrantID(eventConferencing: Conference) {\n if (eventConferencing != null && eventConferencing?.autocreate != null) {\n return eventConferencing?.autocreate?.conf_grant_id;\n }\n return '';\n }\n\n setFormValue(value: string, name: string) {\n if (typeof this.internals.setFormValue === 'function') {\n this.internals.setFormValue(value, name);\n }\n }\n\n handleChange(event) {\n const value = sanitize(event.target.value);\n this.location = value;\n this.setFormValue(value, this.name);\n this.valueChanged.emit({ value: value, name: this.name });\n }\n\n getIcon(location: string) {\n switch (location) {\n case 'none':\n return <location-off-icon />;\n case 'custom':\n return <location-icon />;\n case 'google':\n return <google-meet-icon />;\n case 'microsoft':\n return <microsoft-teams-icon />;\n case 'zoom':\n return <zoom-icon />;\n }\n }\n\n getLabelHTML(location: string) {\n return (\n <span\n class=\"location-label\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '16px',\n width: '-webkit-fill-available',\n }}\n >\n {this.getIcon(location)}\n <span\n class=\"location-text\"\n style={{\n fontSize: '14px',\n fontWeight: '400',\n }}\n >\n {labels[location]}\n </span>\n </span>\n );\n }\n\n @RegisterComponent<NylasEventLocation, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-event-location',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.conferenceProviders', 'conferenceProviders'],\n ['schedulerConfig.currentUser', 'currentUser'],\n ]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n const defaultOption = typeof this.selectedLocationOption !== 'undefined' ? this.locationOptions.find(i => i.value == this.selectedLocationOption) : null;\n return (\n <Host>\n <div class=\"nylas-event-location\" part=\"nel\">\n <label htmlFor=\"location\">\n Event meeting or location\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">Select a conferencing option or add a custom location.</span>\n </tooltip-component>\n </span>\n </label>\n <div class=\"location-input\">\n {defaultOption && defaultOption?.label && (\n <select-dropdown\n withSearch={false}\n name=\"location\"\n options={this.locationOptions}\n defaultSelectedOption={defaultOption}\n exportparts=\"sd_dropdown: nel__dropdown, sd_dropdown-button: nel__dropdown-button, sd_dropdown-content: nel__dropdown-content\"\n >\n <span slot=\"select-icon\">{this.getIcon(this.selectedLocationOption)}</span>\n </select-dropdown>\n )}\n {this.selectedLocationOption === 'custom' && (\n <input type=\"text\" part=\"nel__location\" id=\"location\" name=\"location\" maxlength=\"1024\" value={this.location} onInput={e => this.handleChange(e)} />\n )}\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n}\n\n.nylas-event-title {\n display: flex;\n flex-direction: column;\n gap: 4px;\n position: relative;\n text-align: left;\n\n div.title {\n padding: 12px 16px;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n overflow: scroll;\n white-space: nowrap;\n scrollbar-width: thin;\n\n &::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n\n &.error {\n border-color: var(--nylas-error);\n border-width: 2px;\n outline: none;\n }\n }\n\n input {\n padding: 12px 16px;\n border-width: 1;\n border-radius: 8px;\n border: 1px solid var(--nylas-base-200);\n }\n\n span.help-text {\n display: flex;\n gap: 4px;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 21px;\n }\n\n span.error-message {\n color: var(--nylas-error);\n }\n\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%;\n\n /* 21px */\n span.required {\n color: var(--nylas-error, #cc4841);\n }\n\n span.label-icon {\n margin-left: 4px;\n\n tooltip-component {\n display: flex;\n }\n }\n }\n}\n\n.highlighted-tag {\n background-color: var(--nylas-base-200);\n border-radius: var(--nylas-border-radius);\n padding: 5px;\n margin-left: 4px;\n}\n\n.token-options {\n display: block;\n background-color: var(--nylas-base-0);\n width: 100%;\n max-height: 336px;\n overflow: auto;\n z-index: 1;\n border-radius: 4px;\n position: absolute;\n top: calc(48px + 24px + 8px); // 48px is the height of the input, 24px is the height of the label, 8px is the gap between the label and the input\n\n @media #{$mobile} {\n right: 0;\n width: 325px;\n max-width: unset;\n }\n\n box-shadow: 0px 4px 6px -2px #0000000d;\n box-shadow: 0px 10px 15px -3px #0000001a;\n\n ul {\n padding: 0;\n list-style-type: none;\n color: var(--nylas-base-900);\n max-height: 336px;\n margin: 0;\n\n li {\n padding: 16px, 12px, 16px, 12px;\n color: black;\n padding: 12px 16px;\n text-decoration: none;\n display: block;\n font-family: inherit;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n letter-spacing: 0px;\n text-align: left;\n cursor: pointer;\n\n .token-label {\n display: flex;\n flex-direction: column;\n font-weight: 400;\n\n .token {\n color: var(--nylas-abse-900);\n font-size: 16px;\n line-height: 24px;\n }\n\n .description {\n color: var(--nylas-base-600);\n font-size: 14px;\n line-height: 21px;\n }\n }\n\n &:hover,\n &:focus,\n &:active,\n &.active {\n background-color: var(--nylas-base-100);\n\n .token-label {\n .token {\n color: var(--nylas-primary);\n }\n }\n }\n }\n }\n\n .selected {\n background-color: var(--nylas-base-100);\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug, getBrowser, isNonPrintableKey, sanitize } from '@/utils/utils';\nimport { AttachInternals, Component, Host, State, h, Element, Prop, Watch, Event, EventEmitter, Listen } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { EVENT_TITLE_TOKENS as eventTitleTokens } from '@/common/constants';\nimport { Configuration } from '@nylas/core';\n\ninterface CustomShadowRoot extends ShadowRoot {\n getSelection: () => Selection | null;\n}\n\ntype Token = {\n token: string;\n value: string;\n description: string;\n};\n\n/**\n * The `nylas-event-title` component is a form input for the title of an event.\n * @part net - The event title container\n * @part net__title - The event title input\n * @part net__dropdown-content - The token options container\n */\n@Component({\n tag: 'nylas-event-title',\n styleUrl: 'nylas-event-title.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasEventTitle {\n @Element() host!: HTMLElement;\n @AttachInternals() internals!: ElementInternals;\n\n // Properties\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The title of the event from the cofiguration.\n */\n @Prop() eventTitle?: string = this.selectedConfiguration?.event_booking?.title;\n /**\n * @standalone\n * The name attribute of this component.\n */\n @Prop() name: string = 'title';\n\n // State variables\n /**\n * Whether to show the tokens dropdown.\n */\n @State() showTokens: boolean = false;\n /**\n * The available token options for the dropdown.\n */\n @State() availableTokens: { label: string; value: string; labelHTML: Token }[] = eventTitleTokens.map(token => ({\n label: token.token,\n value: token.value,\n labelHTML: token,\n }));\n /**\n * The filtered token options for the dropdown based on the current query.\n */\n @State() filteredTokens: { label: string; value: string; labelHTML: Token }[] = this.availableTokens;\n /**\n * The aria-activedescendant attribute value. This is used to indicate the\n * currently active descendant in the tokens dropdown.\n */\n @State() ariaActivedescendant: string = '';\n /**\n * Stores the reference to the current word being typed.\n * This is used to update the event title with the selected token tag when\n * an option is selected from the dropdown by clicking on it.\n */\n @State() currentWord: {\n $value: string;\n fullText: string;\n index: number;\n focusOffset: number;\n } = { $value: '', fullText: '', index: -1, focusOffset: -1 };\n\n @State() validationError: string = '';\n @State() configEventTitle: string = '';\n\n // Reference to the title div element\n private titleRef!: HTMLDivElement;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-event-title', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('ariaActivedescendant')\n ariaActivedescendantChangedHandler(newValue: string) {\n debug('nylas-event-title', 'ariaActivedescendantChangedHandler', newValue);\n if (newValue !== '') {\n const activeOption = this.host.shadowRoot?.getElementById(newValue);\n activeOption?.classList.add('active');\n } else {\n const options = this.host.shadowRoot?.querySelectorAll('.token-options li.active');\n options?.forEach(option => option.classList.remove('active'));\n }\n }\n\n @Watch('selectedConfiguration')\n configChangedHandler(newVal) {\n const title = newVal?.event_booking?.title;\n this.configEventTitle = title;\n if (title) {\n this.updateEventTitleFromProp(title);\n }\n }\n\n // Events\n /**\n * This event is fired when the value of the event title changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-event-title', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-event-title', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-event-title', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.eventTitle = this.selectedConfiguration?.event_booking?.title;\n }\n this.updateEventTitleFromProp(this.eventTitle || '');\n }\n\n disconnectedCallback() {\n debug('nylas-event-title', 'disconnectedCallback');\n }\n\n @Listen('formSubmitted', { target: 'window' })\n formSubmittedHandler(event: CustomEvent) {\n debug('nylas-event-title', 'formSubmittedHandler', event);\n if (!this.internals?.validity?.valid) {\n this.validationError = 'Event title is required';\n } else {\n this.validationError = '';\n }\n }\n\n updateEventTitleFromProp(newValue: string) {\n debug('nylas-event-title', 'eventTitleChangedHandler', newValue);\n const title = newValue || this.configEventTitle;\n if (this.titleRef) {\n this.titleRef.innerHTML = this.highlightTokens(title);\n this.titleRef.focus();\n if (typeof this.internals.setValidity === 'function') {\n if (!title || title === '') {\n this.internals?.setValidity({ customError: true }, `Event title is required`, this.titleRef);\n } else {\n this.internals?.setValidity({ customError: false });\n }\n }\n }\n }\n\n highlightTokens(title: string) {\n let outputHtml = title;\n\n eventTitleTokens.forEach(tokenObj => {\n const token = tokenObj.value;\n // Create a regular expression that matches the token as a whole word\n const regex = new RegExp(`(\\\\${token})(?!\\\\w)`, 'g');\n // Replace the token with a span element\n outputHtml = outputHtml?.replace(regex, '<span class=\"highlighted-tag\">$1</span>') || '';\n });\n return outputHtml;\n }\n\n getCurrentSelectionForBrowser() {\n const getSelectionTextData = (nodeValue, offset, node, allSelected) => {\n // Remove zero-width space characters from the text, because they are not visible and cause issues with the selection\n const text = nodeValue.replace(/[\\u200B-\\u200D\\uFEFF]/g, '');\n const dollarIndex = text.lastIndexOf('$');\n const lastWord = text.substring(dollarIndex).split(' ')[0];\n return {\n focusOffset: offset,\n dollarIndex,\n lastWord,\n currentText: text,\n node,\n allSelected,\n };\n };\n\n // Check if the selection has selected all the text in the node, we need this to handle the case where the user selects all the text and then types or deletes\n const isAllSelected = (selection: Selection) => selection.anchorOffset === 0 && selection.focusOffset === selection.focusNode?.nodeValue?.length;\n\n const currentBrowser = getBrowser();\n switch (currentBrowser) {\n case 'Chrome':\n const shadowRootSelection = (this.host.shadowRoot as CustomShadowRoot)?.getSelection();\n const focusNode = shadowRootSelection?.focusNode;\n const focusNodeValue = focusNode?.nodeValue || '';\n const allSelected = shadowRootSelection && isAllSelected(shadowRootSelection);\n return getSelectionTextData(focusNodeValue, shadowRootSelection?.focusOffset || -1, focusNode, allSelected);\n case 'Firefox':\n const selection = document.getSelection();\n const anchorNodeValue = selection?.anchorNode?.nodeValue || '';\n const allSelectedFirefox = selection && isAllSelected(selection);\n return getSelectionTextData(anchorNodeValue, selection?.focusOffset || -1, selection?.anchorNode, allSelectedFirefox);\n case 'Safari':\n const windowSelection = window.getSelection();\n const anchorNode = (windowSelection as any)?.getComposedRanges(this.host.shadowRoot as CustomShadowRoot)[0];\n const currentText = anchorNode?.startContainer?.nodeValue || '';\n const allSelectedSafari = windowSelection && isAllSelected(windowSelection);\n return getSelectionTextData(currentText, anchorNode?.endOffset || -1, anchorNode?.startContainer, allSelectedSafari);\n default:\n console.warn('Browser not supported');\n return null;\n }\n }\n\n handleChange(event: Event) {\n let textContent = (event.target as HTMLDivElement).textContent || '';\n textContent = sanitize(textContent);\n\n // All browsers handle Selection within Shadow DOM differently, so get the current selection based on the browser\n const currentSelection = this.getCurrentSelectionForBrowser();\n if (!currentSelection) {\n this.updateEventTitle(textContent);\n this.resetDropdown();\n return;\n }\n const { focusOffset, dollarIndex, lastWord, currentText } = currentSelection;\n\n if (dollarIndex === -1 || focusOffset < dollarIndex) {\n this.updateEventTitle(textContent);\n this.resetDropdown();\n return;\n }\n if (lastWord.startsWith('$')) {\n this.showTokens = true;\n // Update the current word being typed, we need this reference to update the event title with the selected token\n // because the user can select an option from the dropdown by clicking on it, which will not trigger the input event.\n this.currentWord = {\n $value: lastWord,\n fullText: currentText,\n index: dollarIndex,\n focusOffset,\n };\n this.populateSuggestionsDropdown(lastWord);\n } else {\n this.resetDropdown();\n }\n this.updateEventTitle(textContent);\n }\n\n handleInputKeyDown(event) {\n const selection = this.getCurrentSelectionForBrowser();\n\n // If no text is remaining in the title, reset the title to an empty string\n if (selection?.allSelected && !isNonPrintableKey(event)) {\n this.titleRef.innerHTML = '';\n }\n\n if (event.key === 'Enter') {\n event.preventDefault();\n const activeOption = this.host.shadowRoot?.getElementById(this.ariaActivedescendant);\n if (activeOption) {\n activeOption.click();\n this.ariaActivedescendant = '';\n }\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n const activeOption = this.host.shadowRoot?.getElementById(this.ariaActivedescendant);\n if (activeOption) {\n const nextOption = activeOption.nextElementSibling;\n if (nextOption) {\n this.ariaActivedescendant = nextOption.id;\n } else {\n this.ariaActivedescendant = this.filteredTokens[0].label;\n }\n } else {\n this.ariaActivedescendant = this.filteredTokens[0].label;\n }\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n const activeOption = this.host.shadowRoot?.getElementById(this.ariaActivedescendant);\n if (activeOption) {\n const prevOption = activeOption.previousElementSibling;\n if (prevOption) {\n this.ariaActivedescendant = prevOption.id;\n } else {\n this.ariaActivedescendant = this.filteredTokens[this.filteredTokens.length - 1].label;\n }\n } else {\n this.ariaActivedescendant = this.filteredTokens[this.filteredTokens.length - 1].label;\n }\n } else if (event.key === 'Escape') {\n event.preventDefault();\n this.resetDropdown();\n } else if (event.key === 'Backspace' || event.key === 'Delete') {\n const parentNode = selection?.node?.parentNode;\n if (selection?.currentText.startsWith('${') && parentNode) {\n event.preventDefault();\n parentNode.removeChild(selection.node);\n parentNode.remove();\n this.resetDropdown();\n }\n if (this.titleRef.textContent === '' || selection?.allSelected) {\n this.titleRef.innerHTML = '';\n this.updateEventTitle('');\n }\n }\n }\n\n selectOption(e: Event, option: { label: string; value: string; labelHTML: Token }) {\n e.preventDefault();\n const word = this.currentWord.fullText;\n const dollarWord = this.currentWord.$value;\n\n // Traverse the DOM to find the text node that contains the current word fullText\n let currentNode = this.titleRef.firstChild;\n let textNode: ChildNode | null = null;\n\n while (currentNode) {\n if (currentNode.nodeType === 3) {\n const currentNodeText = currentNode.textContent?.replace(/[\\u200B-\\u200D\\uFEFF]/g, '') || '';\n const wordText = word.replace(/[\\u200B-\\u200D\\uFEFF]/g, '');\n if (currentNodeText.includes(wordText)) {\n textNode = currentNode;\n break;\n }\n }\n currentNode = currentNode.nextSibling;\n }\n\n if (!textNode) {\n return;\n }\n // Split the text node into three parts: text before the token, the token, and text after the token\n const text = textNode.textContent || '';\n const index = text.indexOf(dollarWord);\n const textBefore = text.substring(0, index);\n const textAfter = text.substring(index + dollarWord.length);\n const newTextNode = document.createTextNode(textBefore);\n const newRange = document.createRange();\n\n // Create a new span element to replace the text node\n const tagSpan = document.createElement('span');\n tagSpan.classList.add('highlighted-tag');\n tagSpan.textContent = `${option.value}`;\n const newTextNodeAfter = document.createTextNode(textAfter);\n\n if (textAfter !== '') {\n // If there is text after the token, add it to the new span element\n textNode.replaceWith(newTextNode, tagSpan, newTextNodeAfter);\n newRange.setStart(newTextNodeAfter, 1);\n } else {\n // If there is no text after the token, add a zero-width space character (Without this, the cursor will not move outside the highlighted span element)\n const afterNode = document.createTextNode('\\u200B');\n textNode.replaceWith(newTextNode, tagSpan, afterNode);\n newRange.setStart(afterNode, 1);\n }\n\n // Hide the dropdown\n this.resetDropdown();\n this.titleRef.focus();\n\n // Set the focus to the new span element\n const sel = window.getSelection();\n newRange.collapse(true);\n sel?.removeAllRanges();\n sel?.addRange(newRange);\n\n // Update the event title with the selected token\n this.updateEventTitle(this.titleRef.textContent || '');\n }\n\n populateSuggestionsDropdown(query: string = '') {\n this.filteredTokens = this.availableTokens.filter(obj => {\n return obj.label.startsWith(query.toString()) || obj.value.startsWith(query.toString());\n });\n\n // Set the first option as the active descendant\n if (this.filteredTokens.length > 0) {\n this.ariaActivedescendant = this.filteredTokens[0].label;\n }\n }\n\n get isInternalsAvailable() {\n return typeof this.internals !== 'undefined' && typeof this.internals.setValidity === 'function' && typeof this.internals.setFormValue === 'function';\n }\n\n updateEventTitle(text: string) {\n const value = text.replace(/ +/g, ' ');\n if (value === '' || /^[\\s]*$/.test(value)) {\n this.validationError = 'Event title is required';\n this.isInternalsAvailable && this.internals?.setValidity({ customError: true }, `Event title is required`, this.titleRef);\n } else {\n this.validationError = '';\n this.isInternalsAvailable && this.internals?.setValidity({ customError: false });\n }\n this.isInternalsAvailable && this.internals?.setFormValue(value, this.name);\n this.valueChanged.emit({ value: value, name: this.name });\n }\n\n resetDropdown() {\n this.showTokens = false;\n this.ariaActivedescendant = '';\n }\n\n getLabelHTML(token: { token: string; description: string }) {\n return (\n <div class=\"token-label\">\n <span class=\"token\">{token.token}</span>\n <span class=\"description\">{token.description}</span>\n </div>\n );\n }\n\n @RegisterComponent<NylasEventTitle, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-event-title',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div class=\"nylas-event-title\" part=\"net\">\n <label htmlFor=\"title\">\n Event title<span class=\"required\">*</span>\n </label>\n <div\n class={{\n title: true,\n error: this.validationError !== '',\n }}\n part=\"net__title\"\n ref={el => (this.titleRef = el as HTMLDivElement)}\n contentEditable=\"true\"\n onInput={e => this.handleChange(e)}\n onKeyDown={event => this.handleInputKeyDown(event)}\n ></div>\n {this.showTokens && this.filteredTokens?.length > 0 && (\n <div class=\"token-options\" part=\"net__dropdown-content\">\n <ul tabindex=\"-1\" role=\"listbox\" aria-label={this.name} aria-activedescendant={this.ariaActivedescendant}>\n {this.filteredTokens.map(option => (\n <li\n tabindex=\"0\"\n key={option.label}\n id={option.label}\n class={{ active: this.ariaActivedescendant === option.label }}\n onClick={e => this.selectOption(e, option)}\n role=\"option\"\n >\n {this.getLabelHTML(option.labelHTML)}\n </li>\n ))}\n </ul>\n </div>\n )}\n <span class=\"help-text\">\n Create a dynamic templated event title by typing <code>$</code> and selecting a template item.\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">\n For example, Interview with <code>{'${invitee}'}</code>\n </span>\n </tooltip-component>\n </span>\n </span>\n {this.validationError != '' && <span class=\"error-message\">{this.validationError}</span>}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n}\n\n.card-wrapper {\n background: var(--nylas-base-0);\n display: flex;\n flex-direction: column;\n font-family: var(--nylas-font-family);\n background-color: var(--nylas-base-0);\n color: var(--nylas-base-900);\n border-radius: var(--nylas-border-radius-3x);\n position: relative;\n padding: 32px;\n width: 562px;\n\n @media #{$mobile} {\n width: 100%;\n border-radius: 0px;\n }\n\n box-shadow:\n 0px 1px 4px rgba(0, 0, 0, 0.1),\n 0px 3px 6px rgba(0, 0, 0, 0.06);\n}\n\n.header {\n overflow-wrap: anywhere;\n display: flex;\n flex-direction: column;\n font-size: 1rem;\n font-weight: 400;\n\n h2 {\n color: var(--nylas-base-900);\n font-size: 24px;\n font-weight: 600;\n text-align: left;\n margin: 0;\n }\n}\n\n.description {\n &.title-desc {\n margin-bottom: 2rem;\n }\n\n &.footer-desc {\n margin-top: 2rem;\n\n a {\n color: var(--nylas-primary);\n text-decoration: none;\n }\n }\n\n p {\n margin: 0;\n font-size: 18px;\n color: var(--nylas-base-600);\n }\n}\n\n.footer {\n margin-top: 1rem;\n padding-top: 1rem;\n display: flex;\n justify-content: flex-end;\n gap: 0.5rem;\n box-sizing: border-box;\n background-color: var(--nylas-base-25);\n width: 100%;\n border-radius: 0 0 var(--nylas-border-radius-2x) var(--nylas-border-radius-2x);\n}\n\n.close-button {\n width: 100%;\n display: flex;\n justify-content: flex-end;\n\n button-component {\n button {\n padding: 0;\n height: auto;\n\n &:hover {\n background-color: transparent !important;\n }\n }\n }\n}\n\nbutton-component {\n --dot-color: var(--nylas-base-700);\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { Component, Element, EventEmitter, h, Host, Listen, Prop, State } from '@stencil/core';\nimport { NylasSchedulerConnector } from '../../..';\nimport { NylasScheduling } from '../nylas-scheduling/nylas-scheduling';\nimport { debug } from '@/utils/utils';\nimport { Event } from '@stencil/core';\nimport i18next from '@/utils/i18n';\nimport { ThemeConfig } from '@nylas/core';\n\n/**\n * The `nylas-feedback-form` component is a UI component that displays the booked event card.\n *\n * @part nfbf - The booked event card host.\n * @part nfbf__card - The booked event card.\n * @part nfbf__title - The title of the booked event card.\n * @part nfbf__description - The description of the booked event card.\n * @part nfbf__button-outline - The cancel & reschedule button CTA.\n * @part nfbf__cancel-cta - The cancel button CTA.\n * @part nfbf__reschedule-cta - The reschedule button CTA.\n */\n@Component({\n tag: 'nylas-feedback-form',\n styleUrl: 'nylas-feedback-form.scss',\n shadow: true,\n})\nexport class NylasFeedbackForm {\n /**\n * The host element.\n */\n @Element() host!: HTMLNylasFeedbackFormElement;\n /**\n * @standalone\n * The theme configuration.\n */\n @Prop({ attribute: 'theme-config' }) readonly themeConfig?: any;\n\n /**\n * Feedback modal close event.\n */\n @Event() readonly feedbackModalClosed!: EventEmitter<void>;\n\n /**\n * Feedback submitted event.\n */\n @Event() readonly feedbackSubmitted!: EventEmitter<{ feedback: string }>;\n\n /**\n * This is an internal event that is used to trigger validation on the form.\n */\n @Event() readonly triggerValidation!: EventEmitter<void>;\n\n /**\n * The state to hold the feedback message.\n */\n @State() feedbackMessage: string = '';\n\n connectedCallback() {}\n\n disconnectedCallback() {}\n\n async componentWillLoad() {\n debug(`[nylas-feedback-form] Component will load`);\n }\n\n async componentDidLoad() {\n debug(`[nylas-feedback-form] Component did load`);\n this.applyThemeConfig(this.themeConfig);\n }\n\n applyThemeConfig(themeConfig?: ThemeConfig) {\n if (themeConfig) {\n for (const [key, value] of Object.entries(themeConfig)) {\n this.host.style.setProperty(`${key}`, value);\n }\n }\n }\n\n @Listen('nylasFormInputChanged', { target: 'document' })\n handleFormInputChanged(event: CustomEvent<{ name: string; value: string }>) {\n debug(`[nylas-feedback-form] Form input changed`);\n if (!event.detail.value) {\n return;\n }\n this.triggerValidation.emit();\n if (event.detail.name === 'feedback') {\n this.feedbackMessage = event.detail.value;\n }\n }\n\n private handleConfirmBookingButtonClicked = () => {\n // TODO: Implement feedback submission\n const validationEvent = this.triggerValidation.emit();\n if (validationEvent.defaultPrevented) {\n return;\n }\n this.feedbackSubmitted.emit({ feedback: this.feedbackMessage });\n };\n\n private closeModal(e: Event) {\n e.preventDefault();\n e.stopImmediatePropagation();\n this.feedbackModalClosed.emit();\n }\n\n @RegisterComponent<NylasFeedbackForm, NylasSchedulerConnector, Exclude<NylasScheduling['stores'], undefined>>({\n name: 'nylas-feedback-form',\n stateToProps: new Map([]),\n eventToProps: {\n feedbackSubmitted: async (_event: CustomEvent<{ feedback: string }>, _nylasSchedulerConnector: NylasSchedulerConnector) => {\n // TODO: Implement feedback submission\n },\n },\n localPropsToProp: new Map([['themeConfig', 'themeConfig']]),\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host part=\"nfbf\">\n <div class=\"card-wrapper\" part=\"nfbfc__card\">\n <div class=\"close-button\">\n <button-component tooltip=\"Close\" id=\"close\" variant={'invisible'} onClick={e => this.closeModal(e)} part=\"nfbf__close-button\">\n <close-icon />\n </button-component>\n </div>\n <div class=\"header\">\n <h2 slot=\"card-title\" part=\"nfbf__title\">\n {i18next.t('feedbackFormTitle')}\n </h2>\n </div>\n <div class=\"description title-desc\">\n <p>{i18next.t('feedbackFormDescription')}</p>\n </div>\n <textarea-component\n label={i18next.t('feedbackMessageLabel')}\n required={true}\n maxLength={500}\n part=\"nfbf__description\"\n name=\"feedback\"\n placeholder={i18next.t('feedbackMessagePlaceholder')}\n />\n <div class={'description footer-desc'}>\n <p>\n By sending this report, you agree to Nylas’ access to the data necessary to respond to this issue, subject to Nylas’{' '}\n <a href=\"https://www.nylas.com/privacy-policy/\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">\n Privacy Policy\n </a>\n .\n </p>\n </div>\n <div\n class={{\n footer: true,\n }}\n >\n <button-component variant={'invisible'} onClick={e => this.closeModal(e)} part=\"nfbf__button-outline nfbf__cancel-cta\">\n {`${i18next.t('feedbackModalCloseButton')}`}\n </button-component>\n <button-component variant={'primary'} onClick={this.handleConfirmBookingButtonClicked} part=\"nfbf__button-outline nfbf__reschedule-cta\">\n {`${i18next.t('feedbackModalSubmitButton')}`}\n </button-component>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n @include default-css-variables;\n}\n\n.nylas-limit-future-bookings {\n display: flex;\n justify-content: space-between;\n font-family: var(--nylas-font-family);\n @media #{$mobile} {\n flex-direction: column;\n gap: 0.5rem;\n }\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%; /* 21px */\n span.label-icon {\n margin-left: 4px;\n tooltip-component {\n display: flex;\n }\n }\n }\n}\n\nselect-dropdown::part(sd_dropdown-button) {\n border: none;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Host, State, h, Element, Prop, Watch, Event, EventEmitter, Listen } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\n\n/**\n * The `nylas-limit-future-bookings` component is a form input for the number of days in the future a guest is allowed to book an event.\n *\n * @part nlfb - The limit future bookings container\n * @part nlfb__number-dropdown - The number dropdown container\n * @part nlfb__number-dropdown-button - The number dropdown button\n * @part nlfb__number-dropdown-content - The number dropdown content\n * @part nlfb__period-dropdown - The period dropdown container\n * @part nlfb__period-dropdown-button - The period dropdown button\n * @part nlfb__period-dropdown-content - The period dropdown content\n */\n@Component({\n tag: 'nylas-limit-future-bookings',\n styleUrl: 'nylas-limit-future-bookings.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasLimitFutureBookings {\n /**\n * The host element <nylas-limit-future-bookings>\n */\n @Element() host!: HTMLElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The number of days into the future that invitees will see availability, as set in the configuration.\n */\n @Prop() availableDaysInFuture?: number;\n /**\n * @standalone\n * The name of the limit future bookings input.\n */\n @Prop() name: string = 'limit-future-bookings';\n\n /**\n * The selected number for the available days in the future.\n */\n @State() selectedNumber;\n /**\n * The selected period for the available days in the future.\n */\n @State() selectedPeriod;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-limit-future-bookings', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newVal: Configuration) {\n const daysInFuture = newVal?.scheduler?.available_days_in_future || this.availableDaysInFuture || 1;\n if (daysInFuture) {\n this.updateNumberAndPeriodFromDays(daysInFuture);\n }\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n this.internals.setFormValue(daysInFuture?.toString(), this.name);\n }\n\n /**\n * Event emitted when the future booking limit changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n connectedCallback() {\n debug('nylas-limit-future-bookings', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-limit-future-bookings', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-limit-future-bookings', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.updateNumberAndPeriodFromDays(this.availableDaysInFuture || 1);\n }\n }\n\n disconnectedCallback() {\n debug('nylas-limit-future-bookings', 'disconnectedCallback');\n }\n\n @Listen('timePeriodChanged')\n timePeriodChangedHandler(\n event: CustomEvent<{\n number: number;\n period: string;\n }>,\n ) {\n const { number, period } = event.detail;\n let availableDaysInFuture;\n if (period === 'day') {\n availableDaysInFuture = number;\n } else if (period === 'week') {\n availableDaysInFuture = number * 7;\n } else {\n availableDaysInFuture = number * 30;\n }\n this.valueChanged.emit({ value: availableDaysInFuture, name: 'availableDaysInFuture' });\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n this.internals.setFormValue(availableDaysInFuture.toString(), this.name);\n }\n\n updateNumberAndPeriodFromDays(days: number): void {\n let number, period;\n if (days >= 30 && days % 30 === 0) {\n number = days / 30;\n period = 'month';\n } else if (days >= 7 && days % 7 === 0) {\n number = days / 7;\n period = 'week';\n } else {\n number = days;\n period = 'day';\n }\n this.selectedNumber = number;\n this.selectedPeriod = period;\n }\n\n @RegisterComponent<NylasLimitFutureBookings, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-limit-future-bookings',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n const showTImePeriodSelector = typeof this.selectedNumber == 'number' && typeof this.selectedPeriod == 'string';\n return (\n <Host>\n <div class=\"nylas-limit-future-bookings\" part=\"nlfb\">\n <label>\n Limit future bookings\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">The limit on how far in the future bookings can be made.</span>\n </tooltip-component>\n </span>\n </label>\n {showTImePeriodSelector && (\n <time-period-selector\n id=\"limit-future-bookings\"\n timePeriods={['day', 'week', 'month']}\n exportparts=\"tps__number-dropdown: nlfb__number-dropdown, tps__number-dropdown-button: nlfb__number-dropdown-button, tps__number-dropdown-content: nlfb__number-dropdown-content, tps__period-dropdown: nlfb__period-dropdown, tps__period-dropdown-button: nlfb__period-dropdown-button, tps__period-dropdown-content: nlfb__period-dropdown-content\"\n defaultSelectedNumber={this.selectedNumber}\n defaultSelectedPeriod={this.selectedPeriod}\n />\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n @include default-css-variables;\n}\n\n.nylas-min-booking-notice {\n display: flex;\n justify-content: space-between;\n font-family: var(--nylas-font-family);\n @media #{$mobile} {\n flex-direction: column;\n gap: 0.5rem;\n }\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%; /* 21px */\n span.label-icon {\n margin-left: 4px;\n tooltip-component {\n display: flex;\n }\n }\n }\n}\n\nselect-dropdown::part(sd_dropdown-button) {\n border: none;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Host, State, h, Element, Prop, Watch, Event, EventEmitter, Listen } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\n\n/**\n * The `nylas-min-booking-notice` component is a form input for the minimum period of notice (minutes) that a guest must\n * provide to book an event.\n *\n * @part nmbn - The minimum booking notice container\n * @part nmbn__number-dropdown - The number dropdown container\n * @part nmbn__number-dropdown-button - The number dropdown button\n * @part nmbn__number-dropdown-content - The number dropdown content\n * @part nmbn__period-dropdown - The period dropdown container\n * @part nmbn__period-dropdown-button - The period dropdown button\n * @part nmbn__period-dropdown-content - The period dropdown content\n */\n@Component({\n tag: 'nylas-min-booking-notice',\n styleUrl: 'nylas-min-booking-notice.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasMinBookingNotice {\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The name of the min booking notice input.\n */\n @Prop() name: string = 'min-booking-notice';\n /**\n * @standalone\n * The minimum booking notice (minutes) stored in the configuration\n */\n @Prop() minBookingNotice?: number;\n /**\n *\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n /**\n * The host element <nylas-min-booking-notice>\n */\n @Element() host!: HTMLElement;\n\n /**\n * The selected number of minutes for the min booking notice.\n */\n @State() selectedNumber;\n /**\n * The selected period for the min booking notice.\n */\n @State() selectedPeriod;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-min-booking-notice', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newVal: Configuration) {\n const minBookingNotice = newVal?.scheduler?.min_booking_notice || this.minBookingNotice || 1;\n if (minBookingNotice) {\n this.updateNumberAndPeriodFromMinutes(minBookingNotice);\n }\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n this.internals.setFormValue(minBookingNotice?.toString(), this.name);\n }\n\n /**\n * This event is fired when the value of the min booking notice changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n connectedCallback() {\n debug('nylas-min-booking-notice', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-min-booking-notice', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-min-booking-notice', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.updateNumberAndPeriodFromMinutes(this.minBookingNotice || 1);\n }\n }\n\n disconnectedCallback() {\n debug('nylas-min-booking-notice', 'disconnectedCallback');\n }\n\n @Listen('timePeriodChanged')\n timePeriodChangedHandler(\n event: CustomEvent<{\n number: number;\n period: string;\n }>,\n ) {\n const { number, period } = event.detail;\n let totalMinutes;\n const minutesInHour = 60;\n const minutesInDay = minutesInHour * 24;\n const minutesInWeek = minutesInDay * 7;\n const minutesInMonth = minutesInDay * 30; // Assuming 30 days in a month for simplification\n\n if (period === 'minute') {\n totalMinutes = number;\n } else if (period === 'hour') {\n totalMinutes = number * minutesInHour;\n } else if (period === 'day') {\n totalMinutes = number * minutesInDay;\n } else if (period === 'week') {\n totalMinutes = number * minutesInWeek;\n } else if (period === 'month') {\n totalMinutes = number * minutesInMonth;\n } else {\n totalMinutes = 0;\n }\n this.valueChanged.emit({ value: totalMinutes, name: 'minBookingNotice' });\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n this.internals.setFormValue(totalMinutes.toString(), this.name);\n }\n\n private updateNumberAndPeriodFromMinutes(minutes: number): void {\n const minutesInHour = 60;\n const minutesInDay = minutesInHour * 24;\n const minutesInWeek = minutesInDay * 7;\n const minutesInMonth = minutesInDay * 30; // Assuming 30 days in a month for simplification\n let number, period;\n if (minutes >= minutesInMonth) {\n number = Math.floor(minutes / minutesInMonth);\n period = 'month';\n } else if (minutes >= minutesInWeek) {\n number = Math.floor(minutes / minutesInWeek);\n period = 'week';\n } else if (minutes >= minutesInDay) {\n number = Math.floor(minutes / minutesInDay);\n period = 'day';\n } else if (minutes >= minutesInHour) {\n number = Math.floor(minutes / minutesInHour);\n period = 'hour';\n } else {\n number = minutes;\n period = 'minute';\n }\n this.selectedNumber = number;\n this.selectedPeriod = period;\n }\n\n @RegisterComponent<NylasMinBookingNotice, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-min-booking-notice',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n const showTImePeriodSelector = typeof this.selectedNumber == 'number' && typeof this.selectedPeriod == 'string';\n return (\n <Host>\n <div class=\"nylas-min-booking-notice\" part=\"nmbn\">\n <label>\n Minimum booking notice\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">The minimum amount of time in the future that a new booking can be made.</span>\n </tooltip-component>\n </span>\n </label>\n {showTImePeriodSelector && (\n <time-period-selector\n id=\"min-booking-notice\"\n exportparts=\"tps__number-dropdown: nmbn__number-dropdown, tps__number-dropdown-button: nmbn__number-dropdown-button, tps__number-dropdown-content: nmbn__number-dropdown-content, tps__period-dropdown: nmbn__period-dropdown, tps__period-dropdown-button: nmbn__period-dropdown-button, tps__period-dropdown-content: nmbn__period-dropdown-content\"\n timePeriods={['minute', 'hour', 'day', 'week']}\n defaultSelectedNumber={this.selectedNumber}\n defaultSelectedPeriod={this.selectedPeriod}\n />\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n @include default-css-variables;\n}\n\n.nylas-min-cancellation-notice {\n display: flex;\n justify-content: space-between;\n font-family: var(--nylas-font-family);\n @media #{$mobile} {\n flex-direction: column;\n gap: 0.5rem;\n }\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%; /* 21px */\n span.label-icon {\n margin-left: 4px;\n tooltip-component {\n display: flex;\n }\n }\n }\n}\n\nselect-dropdown::part(sd_dropdown-button) {\n border: none;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Host, State, h, Element, Prop, Watch, Event, EventEmitter, Listen } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\n\n/**\n * The `nylas-min-cancellation-notice` component is a form input for the minimum period of notice (minutes) that a guest must\n * provide to cancel a booked event.\n *\n * @part nmcn - The minimum cancellation notice container\n * @part nmcn__number-dropdown - The number dropdown container\n * @part nmcn__number-dropdown-button - The number dropdown button\n * @part nmcn__number-dropdown-content - The number dropdown content\n * @part nmcn__period-dropdown - The period dropdown container\n * @part nmcn__period-dropdown-button - The period dropdown button\n * @part nmcn__period-dropdown-content - The period dropdown content\n */\n@Component({\n tag: 'nylas-min-cancellation-notice',\n styleUrl: 'nylas-min-cancellation-notice.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasMinCancellationNotice {\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The name of the min cancellation notice input.\n */\n @Prop() name: string = 'min-cancellation-notice';\n /**\n * @standalone\n * The minimum cancellation notice (minutes) stored in the configuration\n */\n @Prop() minCancellationNotice?: number;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n /**\n * The host element <nylas-min-cancellation-notice>\n */\n @Element() host!: HTMLElement;\n /**\n * The selected number of minutes for the min cancellation notice.\n */\n @State() selectedNumber;\n /**\n * The selected period for the min cancellation notice.\n */\n @State() selectedPeriod;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-min-cancellation-notice', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newVal: Configuration) {\n const minCancellationNotice = typeof newVal?.scheduler?.min_cancellation_notice !== 'undefined' ? newVal?.scheduler?.min_cancellation_notice : this.minCancellationNotice || 0;\n if (typeof minCancellationNotice === 'number') {\n this.updateNumberAndPeriodFromMinutes(minCancellationNotice);\n }\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n this.internals.setFormValue(minCancellationNotice?.toString(), this.name);\n }\n\n /**\n * This event is fired when the value of the min cancellation notice changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n connectedCallback() {\n debug('nylas-min-cancellation-notice', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-min-cancellation-notice', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-min-cancellation-notice', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.updateNumberAndPeriodFromMinutes(this.minCancellationNotice || 0);\n }\n }\n\n disconnectedCallback() {\n debug('nylas-min-cancellation-notice', 'disconnectedCallback');\n }\n\n @Listen('timePeriodChanged')\n timePeriodChangedHandler(\n event: CustomEvent<{\n number: number;\n period: string;\n }>,\n ) {\n const { number, period } = event.detail;\n let totalMinutes;\n const minutesInHour = 60;\n const minutesInDay = minutesInHour * 24;\n const minutesInWeek = minutesInDay * 7;\n const minutesInMonth = minutesInDay * 30; // Assuming 30 days in a month for simplification\n\n if (period === 'minute') {\n totalMinutes = number;\n } else if (period === 'hour') {\n totalMinutes = number * minutesInHour;\n } else if (period === 'day') {\n totalMinutes = number * minutesInDay;\n } else if (period === 'week') {\n totalMinutes = number * minutesInWeek;\n } else if (period === 'month') {\n totalMinutes = number * minutesInMonth;\n } else {\n totalMinutes = 0;\n }\n this.valueChanged.emit({ value: totalMinutes, name: 'minCancellationNotice' });\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n this.internals.setFormValue(totalMinutes.toString(), this.name);\n }\n\n private updateNumberAndPeriodFromMinutes(minutes: number): void {\n const minutesInHour = 60;\n const minutesInDay = minutesInHour * 24;\n const minutesInWeek = minutesInDay * 7;\n const minutesInMonth = minutesInDay * 30; // Assuming 30 days in a month for simplification\n let number, period;\n if (minutes == 0) {\n number = 0;\n period = 'minute';\n } else if (minutes >= minutesInMonth) {\n number = Math.floor(minutes / minutesInMonth);\n period = 'month';\n } else if (minutes >= minutesInWeek) {\n number = Math.floor(minutes / minutesInWeek);\n period = 'week';\n } else if (minutes >= minutesInDay) {\n number = Math.floor(minutes / minutesInDay);\n period = 'day';\n } else if (minutes >= minutesInHour) {\n number = Math.floor(minutes / minutesInHour);\n period = 'hour';\n } else {\n number = minutes;\n period = 'minute';\n }\n this.selectedNumber = number;\n this.selectedPeriod = period;\n }\n\n @RegisterComponent<NylasMinCancellationNotice, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-min-cancellation-notice',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n const showTimePeriodSelector = typeof this.selectedNumber == 'number' && typeof this.selectedPeriod == 'string';\n return (\n <Host>\n <div class=\"nylas-min-cancellation-notice\" part=\"nmcn\">\n <label>\n Minimum cancellation notice\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">The minimum amount of time required to cancel a booking.</span>\n </tooltip-component>\n </span>\n </label>\n {showTimePeriodSelector && (\n <time-period-selector\n id=\"min-cancellation-notice\"\n exportparts=\"tps__number-dropdown: nmcn__number-dropdown, tps__number-dropdown-button: nmcn__number-dropdown-button, tps__number-dropdown-content: nmcn__number-dropdown-content, tps__period-dropdown: nmcn__period-dropdown, tps__period-dropdown-button: nmcn__period-dropdown-button, tps__period-dropdown-content: nmcn__period-dropdown-content\"\n timePeriods={['minute', 'hour', 'day', 'week']}\n defaultSelectedNumber={this.selectedNumber}\n defaultSelectedPeriod={this.selectedPeriod}\n />\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n@import '../../../common/mixins/inputs.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-page-name {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n text-align: left;\n\n .header {\n padding: 1rem;\n display: grid;\n grid-template-columns: 1fr auto;\n\n h3 {\n border-radius: var(--nylas-border-radius-2x);\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n display: flex;\n gap: 4px;\n align-items: center;\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n\n .drawer-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n\n .nylas-page-name__body {\n display: grid;\n grid-template-columns: 1fr;\n background-color: var(--nylas-base-25);\n border-radius: 0 0 var(--nylas-border-radius-2x) var(--nylas-border-radius-2x);\n border-top: 1px solid var(--nylas-base-200);\n\n @media #{$mobile} {\n grid-template-columns: 1fr;\n }\n\n .nylas-page-name__section {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n color: var(--nylas-base-800);\n\n @media #{$mobile} {\n border: none;\n }\n\n .nylas-page-name__row {\n display: flex;\n align-items: center;\n gap: 1rem;\n\n label {\n display: flex;\n align-items: center;\n\n span.required {\n color: var(--nylas-error, #cc4841);\n }\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 1rem;\n font-weight: 500;\n line-height: 24px;\n color: var(--nylas-base-900);\n }\n\n .input-container {\n width: 100%;\n }\n }\n }\n }\n\n .nylas-page-name__input-wrapper {\n @include textfield;\n width: -moz-available;\n width: -webkit-fill-available;\n display: flex;\n flex-direction: row;\n gap: 0.125rem;\n border-radius: var(--nylas-border-radius-2x);\n z-index: 1;\n\n input-component::part(ic__input) {\n outline: none;\n border: none;\n width: 100%;\n font-size: 1rem;\n height: auto;\n padding-left: 0px;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\n\n/**\n * The `nylas-page-name` component is a UI component that allows users to add a custom page name which will appear in the top left corner of the date picker.\n *\n * @part npn - The nylas-page-name container\n * @part npn__body - The body of the event communication section\n * @part npn__header - The header of the event communication section\n * @part npn__drawer-toggle--container - The card's drawer toggle container\n * @part npn__input-textfield - The page name input textfield\n */\n@Component({\n tag: 'nylas-page-name',\n styleUrl: 'nylas-page-name.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasPageName {\n @Element() host!: HTMLNylasPageNameElement;\n\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The name of the component\n */\n @Prop() name: string = 'page-name';\n /**\n * @standalone\n * The default page name\n */\n @Prop() pageName?: string;\n /**\n * @standalone\n * Show toggle button that allows users to expand or collapse the card\n */\n @Prop() showToggle: boolean = true;\n /**\n * @standalone\n * Is the page name container card expanded\n */\n @Prop() isOpen: boolean = true;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The current page name state\n */\n @State() currentPageName!: string;\n\n /**\n * This event is fired when the page name value changes\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-page-name', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-page-name', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-page-name', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-page-name', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.currentPageName = this.pageName ?? '';\n }\n }\n\n componentWillUpdate() {\n debug('nylas-page-name', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-page-name', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-page-name', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-page-name', 'componentDidRender');\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-page-name', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-custom-booking-flow', 'selectedConfigurationChangedHandler', newValue);\n this.currentPageName = newValue?.name ?? this.pageName ?? '';\n }\n\n @Listen('nylasFormInputChanged')\n async nylasFormInputChangeHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { name, value } = event.detail;\n\n if (name === 'page-name') {\n this.currentPageName = value;\n this.internals.setFormValue(JSON.stringify(value), this.name);\n this.valueChanged.emit({ value: JSON.stringify(value), name: this.name });\n }\n }\n\n toggleDrawer() {\n this.isOpen = !this.isOpen;\n }\n\n @RegisterComponent<NylasPageName, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-page-name',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const isComponentReady = typeof this.currentPageName !== 'undefined';\n return (\n <Host>\n <div class=\"nylas-page-name\" part=\"nces\">\n <div class=\"header\" part=\"nces__header\">\n <div>\n <h3>Page name</h3>\n <p>\n Set the Scheduling Page name.\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">\n By default, Scheduling Pages use your user name as the Page name. The Page name is displayed in the top-left corner of the calendar view.\n </span>\n </tooltip-component>\n </p>\n </div>\n\n {this.showToggle && (\n <div class=\"drawer-toggle\" part=\"nces__drawer-toggle--container\">\n <span class={`chevron ${this.isOpen ? 'open' : 'closed'} `} onClick={() => this.toggleDrawer()}>\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n )}\n </div>\n\n {this.isOpen && (\n <div class=\"nylas-page-name__body\" part=\"nces__body\">\n <div class=\"nylas-page-name__section\">\n <div class=\"nylas-page-name__row\">\n <div class=\"input-container\">\n <div class=\"nylas-page-name__input-wrapper\">\n {isComponentReady && (\n <input-component\n name=\"page-name\"\n id=\"page-name\"\n type=\"text\"\n required={false}\n exportparts=\"ic_input: npn__input-textfield\"\n defaultValue={this.currentPageName ?? ''}\n />\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-page-styling {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n text-align: left;\n\n &.no-border {\n border: none;\n }\n\n .header {\n padding: 1rem;\n display: grid;\n grid-template-columns: 1fr auto;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n border-radius: var(--nylas-border-radius-2x);\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n\n .drawer-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n\n .nylas-page-styling__body {\n display: grid;\n grid-template-columns: 1fr auto;\n background-color: var(--nylas-base-25);\n border-radius: 0 0 var(--nylas-border-radius-2x);\n\n @media #{$mobile} {\n grid-template-columns: 1fr;\n }\n\n .nylas-page-styling__section {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n color: var(--nylas-base-800);\n\n &.no-padding {\n padding: 0;\n }\n\n @media #{$mobile} {\n border: none;\n }\n\n .nylas-page-styling__row {\n display: grid;\n grid-template-columns: 1fr;\n align-items: center;\n\n label {\n display: flex;\n align-items: center;\n\n span.required {\n color: var(--nylas-error, #cc4841);\n }\n\n span.label-icon {\n margin-left: 4px;\n\n tooltip-component {\n display: flex;\n }\n }\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 1rem;\n font-weight: 500;\n line-height: 24px;\n color: var(--nylas-base-900);\n }\n\n .subsection {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n &.hide {\n display: none;\n }\n\n h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n .input-container,\n > * {\n display: flex;\n flex-direction: column;\n column-gap: 2rem;\n row-gap: 0.25rem;\n width: 100%;\n flex: 1;\n\n textarea {\n padding: 12px 16px;\n border-width: 1;\n resize: vertical;\n border-radius: 8px;\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n border: 1px solid var(--nylas-base-200);\n }\n }\n }\n }\n }\n\n span.error-message {\n color: var(--nylas-error);\n }\n\n span.help-text {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug, sanitize } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Appearance, Configuration } from '@nylas/core';\n\n/**\n * The `nylas-page-styling` component is a UI component that allows users to customize the styling of the scheduling page.\n * To use this component, pass a slot `custom-page-style-inputs` to the `nylas-scheduler-editor` component with the input\n * fields you want to display. The component will automatically update the appearance object when the input fields are changed.\n * Ensure that the input fields have the `name` attribute set to the key in the appearance object.\n *\n * If you want to style the Nylas hosted scheduler page, you can use this component to customize the appearance of the page.\n * The fields that can be customized in the Nylas hosted scheduler page are:\n * - Primary color: (name: color)\n * - Company logo: (name: company_logo_url)\n * - Submit button label: (name: submit_button_label)\n * - Thank you message: (name: thank_you_message)\n *\n * This component cannot be used as an independent component. It must be used within the `nylas-scheduler-editor` component.\n *\n * @slot custom-page-style-inputs - This slot is used to pass a custom page style form to the Nylas Scheduler Editor component.\n * @part nps - The nylas-page-styling container\n * @part nps__header - The header of the page styling section\n * @part nps__drawer-toggle--container - The page styling drawer toggle container\n * @part nps__body - The body of the page styling section\n * @part nps__title-input-textfield - The page styling page title input textfield\n * @part nps__company-name-input-textfield - The page styling company name input textfield\n * @part nps__input-image-url - The page styling company logo input textfield\n * @part nps__color-picker - The page styling color picker\n * @part nps__color-picker-button - The page styling color picker button\n * @part nps__color-picker-button-label - The page styling color input field label *\n * @part nps__color-picker-button-selected-label - The page styling color picker label denoting which color is selected\n * @part nps__submit-button-label-input-textfield - The page styling submut button label input textfield\n * @part nps__message-textarea - The page styling thank you message textarea\n */\n@Component({\n tag: 'nylas-page-styling',\n styleUrl: 'nylas-page-styling.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasPageStyling {\n @Element() host!: HTMLNylasPageStylingElement;\n /**\n * @internal\n * The selected configuration.\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @internal\n * The name of the component\n */\n @Prop() name: string = 'page-styling';\n /**\n * @internal\n * The appearance data to display\n */\n @Prop() appearance?: Appearance;\n /**\n * @internal\n * Is the page styling card open\n */\n @Prop() isOpen: boolean = true;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The confirmation email template state.\n */\n @State() currentAppearance!: Appearance;\n /**\n * The confirmation email template state.\n */\n @State() customInputsSlot: Element | null = null;\n\n /**\n * This event is fired when the email reminders change.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n /**\n * This event is fired when the form is submitted in the parent component.\n */\n @Event() bookingFormSubmitted!: EventEmitter<void>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-page-styling', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-page-styling', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-page-styling', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-page-styling', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n }\n }\n\n componentWillUpdate() {\n debug('nylas-page-styling', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-page-styling', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-page-styling', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-page-styling', 'componentDidRender');\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-page-styling', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n customInputsSlotChangedHandler(newValue: Element | null) {\n debug('nylas-page-styling', 'customInputsSlotChangedHandler', newValue);\n\n const appearance = this.currentAppearance;\n\n function updateInputDefaultValues(element: HTMLElement) {\n // Process elements with a 'name' attribute\n if (element.hasAttribute && element.hasAttribute('name')) {\n const key = element.getAttribute('name');\n if (appearance && key && key in appearance && appearance[key] !== undefined) {\n // Update attributes based on component type\n const componentType = element.getAttribute('component-type');\n\n element.setAttribute('data-page-styling', 'true');\n\n if (componentType === 'checkbox') {\n element.setAttribute('checked', appearance[key]);\n } else if (componentType === 'radio-group') {\n element.setAttribute('default-selected-value', appearance[key]);\n } else if (componentType === 'color-picker') {\n element.setAttribute('default-selected-color', appearance[key]);\n } else if (componentType === 'select-dropdown') {\n const options = element.getAttribute('options');\n const selectedOption = options ? JSON.parse(options).find((option: { value: string }) => option.value === appearance[key]) : null;\n element.setAttribute('default-selected-option', JSON.stringify(selectedOption));\n } else if (componentType === 'image-url') {\n element.setAttribute('image-url', appearance[key]);\n } else {\n // Default case: set the default value\n element.setAttribute('default-value', appearance[key]);\n }\n }\n }\n\n // Recursively process child elements (skip text nodes)\n element.childNodes.forEach(child => {\n if (child.nodeType === Node.ELEMENT_NODE) {\n updateInputDefaultValues(child as HTMLElement); // Cast child to HTMLElement\n }\n });\n }\n\n // Start the recursive process with the cloned element (newValue)\n if (newValue) {\n updateInputDefaultValues(newValue as HTMLElement);\n }\n }\n\n cloneAndCopyProps(element: HTMLElement): HTMLElement {\n // Clone the current element\n const clonedElement = element.cloneNode(false) as HTMLElement; // Do a shallow clone first\n const componentType = element.getAttribute('component-type');\n const key = element.getAttribute('name');\n\n // Copy properties like 'options' and 'value' for custom elements\n if ((element as any).options) {\n const options = (element as any).getAttribute('options');\n console.log('page-styling options', element, options);\n if (typeof options === 'string') {\n try {\n const parsedOptions = JSON.parse(options);\n (clonedElement as any).options = parsedOptions; // Parse the 'options' string\n if (componentType === 'select-dropdown' && key && key in this.currentAppearance) {\n const selectedOption = parsedOptions.find((option: { value: string }) => option.value === this.currentAppearance[key]);\n (clonedElement as any).setAttribute('default-selected-option', JSON.stringify(selectedOption));\n }\n } catch (e) {\n console.error('Error parsing options', e);\n }\n } else {\n (clonedElement as any).options = (element as any).options; // Copy 'options' property\n }\n }\n\n if ((element as any).value) {\n (clonedElement as any).value = (element as any).value; // Copy 'value' property\n }\n\n // Recursively process child elements\n element.childNodes.forEach(child => {\n if (child.nodeType === Node.ELEMENT_NODE) {\n // If the child is an element, recursively clone and process it\n const clonedChild = this.cloneAndCopyProps(child as HTMLElement);\n clonedElement.appendChild(clonedChild); // Append the cloned child to the parent clone\n } else if (child.nodeType === Node.TEXT_NODE) {\n // For text nodes, just clone and append the text content\n clonedElement.appendChild(child.cloneNode(true));\n }\n });\n\n return clonedElement; // Return the cloned element with its children\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-page-styling', 'selectedConfigurationChangedHandler', newValue);\n this.currentAppearance = newValue?.appearance || {};\n // Get the slot element\n const editor = document.querySelector('nylas-scheduler-editor');\n const slotElement = editor?.shadowRoot?.querySelector('slot[name=\"custom-page-style-inputs\"]') as HTMLSlotElement;\n if (!slotElement) {\n return;\n }\n\n const divElement = document.createElement('div');\n\n // Get the slotted content (the nodes passed into the slot)\n const slottedElements = slotElement?.assignedElements({ flatten: true });\n // Clone each of the slotted nodes and append them to the cloned slot\n slottedElements?.forEach(element => {\n const clonedElement = this.cloneAndCopyProps(element as HTMLElement); // Clone recursively and copy properties\n\n // Clone the slotted element (deep clone)\n this.customInputsSlotChangedHandler(clonedElement);\n // Append the cloned element to the document fragment\n divElement.appendChild(clonedElement);\n });\n\n // Replace the original content with the new cloned and updated content\n const bodyElement = this.host.shadowRoot?.querySelector('.nylas-page-styling');\n const slotContainer = bodyElement?.querySelector('.nylas-page-styling__body .subsection');\n\n if (slotContainer) {\n // Remove existing children (if necessary) and append the new content\n slotContainer.innerHTML = ''; // Clear existing content\n divElement.childNodes.forEach(child => {\n slotContainer.appendChild(child); // Append each child of divElement\n });\n this.customInputsSlot = divElement;\n }\n }\n\n checkIfElementIsInSlot(name: string): boolean {\n const findElement = document?.querySelector(`[slot=\"custom-page-style-inputs\"] [name=\"${name}\"]`);\n return findElement ? true : false;\n }\n\n @Listen('nylasFormInputChanged', { target: 'document' })\n async nylasFormInputChangeHandler(event: CustomEvent<{ value: string; name: string; type?: string }>) {\n const { name, value } = event.detail;\n const type = event.detail?.type;\n\n if (!this.checkIfElementIsInSlot(name)) {\n return;\n }\n switch (name) {\n case 'submit_button_label':\n this.currentAppearance = { ...this.currentAppearance, submit_button_label: value };\n break;\n case 'thank_you_message':\n if (type === 'multi_line_text') {\n const value = sanitize(event.detail.value);\n this.currentAppearance = { ...this.currentAppearance, thank_you_message: value };\n }\n break;\n default:\n this.currentAppearance = { ...this.currentAppearance, [name]: value };\n break;\n }\n this.updateConfirmationFormValue();\n }\n\n @Listen('nylasFormDropdownChanged', { target: 'document' })\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-page-styling', 'nylasFormDropdownChangedHandler', event.detail);\n const { value, name } = event.detail;\n\n if (!this.checkIfElementIsInSlot(name)) {\n return;\n }\n if (name === 'color') {\n this.currentAppearance = { ...this.currentAppearance, color: value };\n } else {\n this.currentAppearance = { ...this.currentAppearance, [name]: value };\n }\n this.updateConfirmationFormValue();\n }\n\n @Listen('valueChanged', { target: 'document' })\n valueChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-page-styling', 'valueChangedHandler', event.detail);\n const { value, name } = event.detail;\n\n if (!this.checkIfElementIsInSlot(name)) {\n return;\n }\n if (name === 'company_logo_url') {\n this.currentAppearance = { ...this.currentAppearance, company_logo_url: value };\n } else {\n this.currentAppearance = { ...this.currentAppearance, [name]: value };\n }\n this.updateConfirmationFormValue();\n }\n\n @Listen('nylasFormCheckboxToggled', { target: 'document' })\n checkboxToggledHandler(event: CustomEvent<{ checked: boolean; name: string; label: string }>) {\n const { checked, name } = event.detail;\n if (!this.checkIfElementIsInSlot(name)) {\n return;\n }\n this.currentAppearance = { ...this.currentAppearance, [name]: checked };\n this.updateConfirmationFormValue();\n }\n\n @Listen('nylasFormRadioChanged', { target: 'document' })\n radioChangedHandler(event: CustomEvent<{ value: string; name: string; label: string; type: string }>) {\n const { value, name } = event.detail;\n if (!this.checkIfElementIsInSlot(name)) {\n return;\n }\n this.currentAppearance = { ...this.currentAppearance, [name]: value };\n this.updateConfirmationFormValue();\n }\n\n updateConfirmationFormValue() {\n debug('nylas-page-styling', 'updateConfirmationFormValue');\n this.internals.setFormValue(JSON.stringify(this.currentAppearance), this.name);\n this.valueChanged.emit({ value: JSON.stringify(this.currentAppearance), name: this.name });\n }\n\n toggleConfirmationEmail() {\n this.isOpen = !this.isOpen;\n }\n\n @RegisterComponent<NylasPageStyling, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-page-styling',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div part=\"nps\" class={{ 'nylas-page-styling': true, 'no-border': !this.customInputsSlot }}>\n {this.customInputsSlot ? (\n <div class=\"header\" part=\"nps__header\">\n <div>\n <h3>Page styling and customization</h3>\n </div>\n <div class=\"drawer-toggle\" part=\"nps__drawer-toggle--container\">\n <span class={`chevron ${this.isOpen ? 'open' : 'closed'} `} onClick={() => this.toggleConfirmationEmail()}>\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n </div>\n ) : null}\n\n <div id=\"nylas-page-styling__body\" class=\"nylas-page-styling__body\" part=\"nps__body\">\n <div class={{ 'nylas-page-styling__section': true, 'no-padding': !this.customInputsSlot }}>\n <div class=\"nylas-page-styling__row\">\n <div class={{ subsection: true, hide: !this.isOpen }}></div>\n </div>\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-participant-booking-calendars {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n\n .header {\n padding: 1rem;\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n }\n\n .content {\n .participant-container {\n padding-top: 12px;\n border-top: 1px solid var(--nylas-base-200);\n\n .participant-title {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 16px 16px;\n\n p {\n margin: 0;\n }\n\n .participant-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n }\n }\n}\n\nnylas-booking-calendar-picker::part(nbcp) {\n margin: 0;\n border: none;\n border-top: 1px solid var(--nylas-base-200);\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { AdditionalParticipant, Calendar, Configuration, Participant } from '@nylas/core';\n\n/**\n * The `nylas-participant-booking-calendars` component is a form input for selecting calendars to check availability for participants.\n *\n * @part npbc - The participant booking calendars host.\n * @part npbc__header - The header.\n * @part npbc__content - The content.\n * @part npbc__participant-container - The participant container.\n * @part npbc__participant-title - The participant title.\n * @part npbc__participant-toggle-container - The participant toggle container.\n */\n@Component({\n tag: 'nylas-participant-booking-calendars',\n styleUrl: 'nylas-participant-booking-calendars.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasParticipantBookingCalendars {\n @Element() host!: HTMLNylasParticipantBookingCalendarsElement;\n private bookingCalendarsFormRef!: HTMLFormElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The name of the participants custom availability.\n */\n @Prop() name: string = 'participant-booking-calendars';\n\n /**\n * @standalone\n * The participants selected in the add participants section.\n */\n @Prop() participants: Participant[] = this.selectedConfiguration?.participants || [];\n\n /**\n * @standalone\n * The calendars to choose from for the organizer / logged in user.\n */\n @Prop() calendars?: Calendar[];\n\n /**\n * @standalone\n * The participant options passed in the additionalParticipants prop\n * from the nylas-scheduler-editor component.\n */\n @Prop() participantOptions?: AdditionalParticipant[];\n\n /**\n * This event is fired when the participants custom availability changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The state to store the custom availability setting for participants.\n */\n @State() selectedCalendars: {\n [key: string]: {\n isOpen: boolean;\n name: string;\n calendar?: Calendar;\n };\n } = this.setParticipants(this.participants);\n\n /**\n * Participants calendar options.\n */\n @State() participantCalendars: {\n [key: string]: Calendar[];\n } = {};\n\n /**\n * The state to store the default selected calendars for each participant\n */\n @State() participantDefaultSelectedCalendar: {\n [key: string]: string;\n } = {};\n\n // Watchers\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-participant-booking-calendars', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('calendars')\n calendarsChangedHandler(newValue: Calendar[]) {\n debug('nylas-participant-booking-calendars', 'calendarsChangedHandler', newValue);\n this.participantCalendars = this.getParticipantCalendarOptions(this.participants, this.participantOptions);\n }\n\n @Watch('participants')\n participantsChangedHandler(newValue: Participant[]) {\n debug('nylas-participant-booking-calendars', 'participantsChangedHandler', newValue);\n this.selectedCalendars = this.setParticipants(newValue);\n this.participantCalendars = this.getParticipantCalendarOptions(newValue, this.participantOptions);\n }\n\n @Watch('participantOptions')\n participantOptionsChangedHandler(newValue: AdditionalParticipant[]) {\n debug('nylas-calendar-picker', 'participantOptionsChangedHandler', newValue);\n this.participantCalendars = this.getParticipantCalendarOptions(this.participants, newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-participant-booking-calendars', 'selectedConfigurationChangedHandler', newValue);\n const participants = newValue?.participants || this.participants;\n if (participants && participants.length > 0) {\n this.selectedCalendars = this.setParticipants(participants);\n this.participantCalendars = this.getParticipantCalendarOptions(participants, this.participantOptions);\n }\n }\n\n getParticipantCalendarOptions(addedParticipants: Participant[], availableParticipantOptions: AdditionalParticipant[] | undefined) {\n // Get the participants from the availableParticipantOptions prop that are in the addedParticipants prop\n const organizer = addedParticipants?.find(participant => participant.is_organizer);\n const participantCalendars = {};\n const showAdditionalParticipantBookingCalendars = this.selectedConfiguration?.availability?.availability_rules?.availability_method !== 'collective';\n if (availableParticipantOptions && showAdditionalParticipantBookingCalendars) {\n const participants = addedParticipants?.filter(participant => availableParticipantOptions.some(availableParticipant => availableParticipant.email === participant.email));\n const remainingParticipants = addedParticipants?.filter(\n participant => !availableParticipantOptions.some(availableParticipant => availableParticipant.email === participant.email),\n );\n\n // Get the calendar options for each participant with email as the key\n participants?.forEach(participant => {\n const participantOption = availableParticipantOptions?.find(participantOption => participantOption.email === participant.email);\n if (!participantOption) return;\n this.participantDefaultSelectedCalendar[participant.email] = participant.booking?.calendar_id ?? 'primary';\n const calendars = participantOption.calendars ?? [];\n participantCalendars[participant.email] = calendars;\n });\n // If it is round robin config, add the remaining participant calendars to the participantCalendars\n // (Round-robin does not have an organizer, and we filtered out the participants not passed in the participantOptions prop,\n // so we need to add the remaining participants calendars to the participantCalendars)\n remainingParticipants?.forEach(participant => {\n if (participant?.booking?.calendar_id) {\n participantCalendars[participant.email] = this.calendars ?? [{ id: 'primary', name: participant.email }];\n this.participantDefaultSelectedCalendar[participant.email] = participant?.booking?.calendar_id ?? 'primary';\n }\n });\n }\n // Add the organizer's calendars to the participantCalendars\n if (organizer) {\n participantCalendars[organizer.email] = this.calendars ?? [{ id: 'primary', name: organizer.email }];\n this.participantDefaultSelectedCalendar[organizer.email] = organizer?.booking?.calendar_id ?? 'primary';\n }\n return participantCalendars;\n }\n\n // Lifecycle Methods\n connectedCallback() {\n debug('nylas-participant-booking-calendars', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-participant-booking-calendars', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-participant-booking-calendars', 'componentWillLoad');\n }\n\n componentDidLoad() {\n debug('nylas-participant-booking-calendars', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedCalendars = this.setParticipants(this.selectedConfiguration?.participants);\n this.participantCalendars = this.getParticipantCalendarOptions(this.selectedConfiguration?.participants, this.participantOptions);\n } else {\n this.selectedCalendars = this.setParticipants(this.participants);\n this.participantCalendars = this.getParticipantCalendarOptions(this.participants, this.participantOptions);\n }\n }\n\n @Listen('valueChanged')\n handleValueChanged(event: CustomEvent) {\n debug('[nylas-editor-tabs]', 'handleValueChanged', event);\n const { name, value } = event.detail;\n if (!name.startsWith('participant-booking-')) {\n return;\n }\n // Validate the form\n if (!this.bookingCalendarsFormRef.checkValidity()) {\n this.internals.setValidity({ customError: true }, 'Please select at least one calendar for each participant.');\n return;\n } else {\n this.internals.setValidity({});\n }\n\n const key = name.split('participant-booking-')[1];\n if (!this.selectedCalendars[key]) return;\n this.selectedCalendars[key]['calendar'] = value;\n this.selectedCalendars = { ...this.selectedCalendars };\n\n const participantsCalendars = {};\n Object.keys(this.selectedCalendars).forEach(key => {\n participantsCalendars[key] = this.selectedCalendars[key]?.calendar;\n });\n this.internals.setFormValue(JSON.stringify(participantsCalendars), this.name);\n this.valueChanged.emit({ value: JSON.stringify(participantsCalendars), name: this.name });\n }\n\n setParticipants(participants: Participant[]) {\n const selectedParticipants = {};\n participants?.forEach(participant => {\n if (participant?.booking?.calendar_id) {\n const isOpen = participant.is_organizer ? true : false;\n selectedParticipants[participant.email] = {\n isOpen: isOpen,\n calendar: participant.booking?.calendar_id || 'primary',\n name: participant.name || participant.email,\n };\n }\n });\n return selectedParticipants;\n }\n @RegisterComponent<NylasParticipantBookingCalendars, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-participant-booking-calendars',\n stateToProps: new Map([\n ['schedulerConfig.additionalParticipants', 'participantOptions'],\n ['schedulerConfig.calendars', 'calendars'],\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div class=\"nylas-participant-booking-calendars\" part=\"npbc\">\n <div class=\"header\" part=\"npbc__header\">\n <h3>Book to this calendar</h3>\n <p>Select the calendar where you want to add event bookings.</p>\n </div>\n <div class=\"content\" part=\"npbc__content\">\n <form ref={el => (this.bookingCalendarsFormRef = el as HTMLFormElement)}>\n {this.participantCalendars &&\n Object.keys(this.participantCalendars).map((key, index) => {\n const participant = this.selectedCalendars[key];\n const participantCalendars = this.participantCalendars[key];\n\n if (!participant || !participant.name) return;\n return (\n <div class=\"participant-container\" part=\"npbc__participant-container\" key={`participant-conatiner-${index}`}>\n <div class=\"participant-title\" part=\"npbc__participant-title\">\n <p>{participant.name}'s booking calendar</p>\n <div class=\"participant-toggle\" part=\"npbc__participant-toggle-container\">\n <span\n class={`chevron ${participant.isOpen ? 'open' : 'closed'}`}\n onClick={() => {\n this.selectedCalendars[key].isOpen = !participant.isOpen;\n this.selectedCalendars = { ...this.selectedCalendars };\n }}\n >\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n </div>\n {participant.isOpen && (\n <nylas-booking-calendar-picker\n key={key}\n name={`participant-booking-${key}`}\n calendars={participantCalendars}\n hideHeader={true}\n defaultBookingCalendar={this.participantDefaultSelectedCalendar[key]}\n />\n )}\n </div>\n );\n })}\n </form>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-participants-custom-availability {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n .header {\n padding: 1rem;\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n .content {\n .participant-container {\n padding-top: 8px;\n border-top: 1px solid var(--nylas-base-200);\n .participant-title {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 16px 12px;\n p {\n margin: 0;\n }\n .participant-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n nylas-availability-picker::part(nap) {\n margin: 0;\n border: none;\n }\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration, OpenHours, Participant, ParticipantAvailability } from '@nylas/core';\nimport { DEFAULT_OPEN_HOURS } from '@/common/constants';\n\n/**\n * The `nylas-participants-custom-availability` component is a form input for setting custom availability for participants.\n *\n * @part npca - The participants custom availability container\n * @part npca__header - The header of the participants custom availability\n * @part npca__content - The content of the participants custom availability\n * @part npca__participant-container - The participant container\n * @part npca__participant-title - The title of the participant\n * @part npca__participant-toggle--container - The toggle container for the participant\n * @part npca__toggle-label - The label of the toggle\n * @part npca_toggle-input - The input of the toggle\n * @part npca_toggle-slider - The slider of the toggle\n */\n@Component({\n tag: 'nylas-participants-custom-availability',\n styleUrl: 'nylas-participants-custom-availability.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasParticipantsCustomAvailability {\n @Element() host!: HTMLNylasParticipantsCustomAvailabilityElement;\n private participantFormRef!: HTMLFormElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n\n /**\n * @standalone\n * The name of the participants custom availability.\n */\n @Prop() name: string = 'participant-custom-availability';\n\n /**\n * @standalone\n * The participants selected in the add participants section.\n */\n @Prop() participants: Participant[] = this.selectedConfiguration?.participants || [];\n\n /**\n * This event is fired when the participants custom availability changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The state to store the custom availability setting for participants.\n */\n @State() selectedParticipants: {\n [key: string]: {\n setCustom: boolean;\n isOpen: boolean;\n openHours: OpenHours[];\n name: string;\n availability?: ParticipantAvailability;\n timezone?: string;\n };\n } = this.setParticipants(this.participants);\n\n // Watchers\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-participants-custom-availability', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('participants')\n participantsChangedHandler(newValue: Participant[], oldValue: Participant[]) {\n debug('nylas-participants-custom-availability', 'participantsChangedHandler', newValue, oldValue);\n this.selectedParticipants = this.setParticipants(newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration, oldValue: Configuration) {\n debug('nylas-participants-custom-availability', 'selectedConfigurationChangedHandler', newValue, oldValue);\n if (newValue?.participants) {\n this.selectedParticipants = this.setParticipants(newValue?.participants);\n }\n }\n\n // Lifecycle Methods\n connectedCallback() {\n debug('nylas-participants-custom-availability', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-participants-custom-availability', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-participants-custom-availability', 'componentWillLoad');\n }\n\n componentDidLoad() {\n debug('nylas-participants-custom-availability', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedParticipants = this.setParticipants(this.selectedConfiguration?.participants);\n } else {\n this.selectedParticipants = this.setParticipants(this.participants);\n }\n }\n\n // Event Handlers\n @Listen('nylasFormSwitchToggled')\n nylasFormSwitchToggledHandler(event: CustomEvent<{ checked: boolean; name: string; label: boolean }>) {\n debug('nylas-participants-custom-availability', 'nylasFormSwitchToggledHandler', event.detail);\n const existingParticipant = this.selectedConfiguration?.participants.find(participant => participant.email === event.detail.name);\n const existingOpenHours = existingParticipant?.availability?.open_hours;\n const openHours = existingOpenHours || this.selectedConfiguration?.availability?.availability_rules?.default_open_hours || [];\n const timeZone =\n existingOpenHours && existingOpenHours.length > 0\n ? existingParticipant?.timezone\n : this.selectedConfiguration?.availability?.availability_rules?.default_open_hours?.at(0)?.timezone ||\n this.selectedConfiguration?.event_booking?.timezone ||\n window.Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n this.selectedParticipants[event.detail.name]['isOpen'] = event.detail.checked;\n this.selectedParticipants[event.detail.name]['setCustom'] = event.detail.checked;\n this.selectedParticipants[event.detail.name]['openHours'] = event.detail.checked ? (openHours?.length > 0 ? openHours : DEFAULT_OPEN_HOURS) : [];\n this.selectedParticipants[event.detail.name]['timezone'] = event.detail.checked ? timeZone : undefined;\n this.selectedParticipants = { ...this.selectedParticipants };\n this.updateFormValue();\n }\n\n @Listen('valueChanged')\n handleValueChanged(event: CustomEvent) {\n debug('[nylas-editor-tabs]', 'handleValueChanged', event);\n const { name, value } = event.detail;\n if (!name.startsWith('participant-')) {\n return;\n }\n // Validate the form\n if (this.isInternalsAvailable) {\n if (!this.participantFormRef.checkValidity()) {\n this.internals.setValidity({ customError: true }, 'Please fix the overlapping time ranges.');\n return;\n } else {\n this.internals.setValidity({});\n }\n }\n\n const jsonValue = JSON.parse(value);\n\n const key = name.split('-')[2];\n if (!this.selectedParticipants[key]) return;\n this.selectedParticipants[key]['openHours'] = jsonValue.openHours;\n this.selectedParticipants = { ...this.selectedParticipants };\n\n this.updateFormValue();\n }\n\n updateFormValue() {\n const participantOpenHours = {};\n const participants = this.selectedConfiguration?.participants || this.participants;\n participants.forEach(participant => {\n participantOpenHours[participant.email] = this.selectedParticipants[participant.email].openHours;\n });\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(participantOpenHours), this.name);\n this.valueChanged.emit({ value: JSON.stringify(participantOpenHours), name: this.name });\n }\n\n setParticipants(participants: Participant[]) {\n const selectedParticipants = {};\n participants?.forEach(participant => {\n selectedParticipants[participant.email] = {\n isOpen: false,\n setCustom: Boolean(participant.availability?.open_hours),\n openHours: participant.availability?.open_hours || [],\n name: participant.name || participant.email,\n availability: participant.availability,\n timezone: participant.timezone,\n };\n });\n return selectedParticipants;\n }\n\n /**\n * This method is essentially a workaround to check if the internals are available because\n * the unit tests in stencil do not support the internals.\n * @returns boolean\n */\n get isInternalsAvailable() {\n return this.internals !== undefined && typeof this.internals.setFormValue === 'function' && typeof this.internals.setValidity === 'function';\n }\n\n @RegisterComponent<NylasParticipantsCustomAvailability, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-participants-custom-availability',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div class=\"nylas-participants-custom-availability\" part=\"npca\">\n <div class=\"header\" part=\"npca__header\">\n <h3>Participant open hours</h3>\n <p>If not set, the default open hours will be used to calculate availability for this participant.</p>\n </div>\n <div class=\"content\" part=\"npca__content\">\n <form ref={el => (this.participantFormRef = el as HTMLFormElement)}>\n {Object.keys(this.selectedParticipants).map((key, index) => {\n const participant = this.selectedParticipants[key];\n const participantOpenHours = participant.availability?.open_hours || [];\n if (!participant || !participant.name || !participant.availability) return;\n return (\n <div class=\"participant-container\" part=\"npca__participant-container\" key={`participant-conatiner-${index}`}>\n <div class=\"participant-title\" part=\"npca__participant-title\">\n <p>{participant.name}'s open hours</p>\n <div class=\"participant-toggle\" part=\"npca__participant-toggle--container\">\n <toggle-switch\n exportparts=\"ts_label: npca__toggle-label, ts_input: npca_toggle-input, ts_slider: npca_toggle-slider\"\n name={key}\n checked={!!participant?.openHours && participant?.openHours.length > 0}\n />\n <span\n class={`chevron ${participant.isOpen ? 'open' : 'closed'} ${participant.setCustom ? '' : 'disabled'}`}\n onClick={() => {\n if (!participant.setCustom) return;\n this.selectedParticipants[key].isOpen = !participant.isOpen;\n this.selectedParticipants = { ...this.selectedParticipants };\n }}\n >\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n </div>\n {participant.isOpen && (\n <nylas-availability-picker\n key={index}\n name={`participant-${index}-${key}`}\n openHours={participantOpenHours}\n defaultTimezone={participant.timezone}\n hideHeader={true}\n />\n )}\n </div>\n );\n })}\n </form>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.cards-container {\n margin-bottom: 4rem;\n\n .nylas-reminder-email {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n text-align: left;\n\n .reminder-open-close-toggle {\n display: flex;\n gap: 16px;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n\n .header {\n padding: 1rem;\n display: grid;\n grid-template-columns: 1fr auto;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n border-radius: var(--nylas-border-radius-2x);\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n\n .confirmation-email-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n\n .nylas-reminder-email__body {\n display: grid;\n grid-template-columns: 1fr auto;\n background-color: var(--nylas-base-25);\n border-radius: var(--nylas-border-radius-2x);\n\n @media #{$mobile} {\n grid-template-columns: 1fr;\n }\n\n .nylas-reminder-email__section {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n color: var(--nylas-base-800);\n\n @media #{$mobile} {\n border: none;\n }\n\n .nylas-reminder-email__block {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n border-top: 1px solid var(--nylas-base-200);\n padding-top: 1rem;\n margin-top: 0.5rem;\n }\n\n .nylas-reminder-email__row {\n display: grid;\n grid-template-columns: 1fr auto;\n align-items: center;\n gap: 1rem;\n\n &.full-width-col {\n grid-template-columns: 1fr;\n }\n\n label {\n display: flex;\n align-items: center;\n\n span.required {\n color: var(--nylas-error, #cc4841);\n }\n\n span.label-icon {\n margin-left: 4px;\n\n tooltip-component {\n display: flex;\n }\n }\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 1rem;\n font-weight: 500;\n line-height: 24px;\n color: var(--nylas-base-900);\n }\n\n .company-logo-container {\n display: flex;\n gap: 32px;\n width: 100%;\n\n .input-container {\n display: flex;\n flex-direction: column;\n flex: 1;\n }\n\n .company-logo {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 200px;\n height: 100px;\n border: var(--nylas-base-200) solid 1px;\n border-radius: var(--nylas-border-radius-2x);\n overflow: hidden;\n padding: 10px;\n }\n\n .company-logo img {\n max-height: 100%;\n max-width: 100%;\n object-fit: contain;\n object-position: center;\n }\n }\n\n span.selected-value {\n font-weight: 500;\n }\n }\n\n .subsection {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n .input-container {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n\n textarea {\n padding: 12px 16px;\n border-width: 1;\n resize: vertical;\n border-radius: 8px;\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n border: 1px solid var(--nylas-base-200);\n }\n }\n }\n }\n\n .nylas-reminder-email__preview {\n width: 208px;\n background: var(--nylas-base-25);\n border-bottom-right-radius: var(--nylas-border-radius-2x);\n\n @media #{$mobile} {\n width: inherit;\n border-bottom-left-radius: var(--nylas-border-radius-2x);\n }\n\n h4 {\n font-size: 14px;\n line-height: 24px;\n color: var(--nylas-base-600);\n font-family: var(--nylas-font-family);\n font-weight: 500;\n text-align: center;\n margin: 0.75rem 0;\n }\n\n .preview-container {\n padding: 0 2rem 1rem;\n\n .slot {\n background-color: transparent;\n border-top: 1px solid var(--nylas-base-300);\n\n &.active {\n background-color: var(--nylas-base-100);\n }\n\n &:last-of-type {\n border-bottom: 1px solid var(--nylas-base-300);\n }\n }\n\n .event-slot {\n background-color: var(--nylas-base-600);\n border-top: 1px solid var(--nylas-base-300);\n }\n }\n }\n\n span.error-message {\n color: var(--nylas-error);\n }\n\n span.help-text {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n\n .nylas-reminder-email__summary {\n padding: 0.75rem 1rem;\n display: grid;\n grid-template-columns: auto 1fr;\n column-gap: 1rem;\n\n p {\n margin: 0;\n display: flex;\n align-items: center;\n column-gap: 4px;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 21px;\n color: var(--nylas-base-600);\n text-align: left;\n\n span.summary-icon {\n display: flex;\n justify-content: center;\n min-width: 20px;\n }\n }\n }\n }\n}\n\nsp-divider {\n background-color: var(--nylas-base-200);\n height: 1px;\n margin: 0.25rem 0;\n}\n\nbutton-component.create-reminder button {\n margin: 1rem;\n width: calc(100% - 2rem);\n}\n\nbutton-component.delete-btn button {\n color: var(--nylas-error) !important;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration, EventReminder, Participant } from '@nylas/core';\n/**\n * The `nylas-reminder-emails` component is a UI component that allows users to set buffer time before and after an event.\n *\n * @part nre__tab-heading - The nylas-reminder-emails main tab heading\n * @part nre - The nylas-reminder-emails container\n * @part nre__header - The header of the event communication section\n * @part nre__body - The body of the event communication section\n * @part nre__summary - The reminder card summary container\n * @part nre__reminder-input_dropdown - The dropdown container for selecting reminder time\n * @part nre__reminder-input_dropdown-input - The dropdown for selecting reminder time value\n * @part nre__reminder-input_dropdown-content - The dropdown for selecting reminder time unit (e.g. min, hrs, days)\n */\n@Component({\n tag: 'nylas-reminder-emails',\n styleUrl: 'nylas-reminder-emails.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasReminderEmails {\n @Element() host!: HTMLNylasReminderEmailsElement;\n\n /**\n * The selected configuration.\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * The event reminders prop.\n */\n @Prop() eventReminders?: (EventReminder & { editing?: boolean })[];\n /**\n * The name of the component\n */\n @Prop() name: string = 'reminder-overrides';\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The event reminders state. Defaults to an empty array if no event reminders are present.\n */\n @State() reminders: (EventReminder & { editing?: boolean })[] = this.selectedConfiguration?.event_booking?.reminders ?? this.eventReminders ?? [];\n @State() reminderErrors: { [key: string]: string } = {};\n @State() participants: Participant[] = this.selectedConfiguration?.participants ?? [];\n\n /**\n * This event is fired when the email reminders change.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-reminder-emails', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-reminder-emails', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-reminder-emails', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-reminder-emails', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.reminders = this.eventReminders ?? [];\n this.updateRemindersFormValue();\n }\n }\n\n componentWillUpdate() {\n debug('nylas-reminder-emails', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-reminder-emails', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-reminder-emails', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-reminder-emails', 'componentDidRender');\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-reminder-emails', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newVal: Configuration) {\n debug('nylas-reminder-emails', 'selectedConfigurationChangedHandler', newVal);\n this.reminders = newVal?.event_booking?.reminders ?? [];\n this.participants = newVal?.participants ?? [];\n this.updateRemindersFormValue();\n }\n\n @Listen('valueChanged')\n handleValueChanged(event: CustomEvent) {\n debug('nylas-reminder-emails', 'handleValueChanged', event);\n const { name, value } = event.detail;\n\n if (name.startsWith('reminder-time-')) {\n // Extract the reminder index from the name attribute (e.g. reminder-time-0)\n const [_, reminderIndex] = name.split(/(\\d+)/);\n const updatedReminders = [...this.reminders];\n updatedReminders[reminderIndex].minutes_before_event = parseInt(value);\n this.reminders = [...updatedReminders];\n this.updateRemindersFormValue();\n }\n }\n\n @Listen('nylasFormDropdownChanged')\n handleNylasFormDropdownChanged(event: CustomEvent) {\n debug('nylas-reminder-emails', 'handleNylasFormDropdownChanged', event);\n const { name, value } = event.detail;\n if (!name.startsWith('recipient-')) {\n return;\n }\n // Extract the reminder index from the name attribute (e.g. recipient-0)\n const [_, reminderIndex] = name.split(/(\\d+)/);\n const updatedReminders = [...this.reminders];\n updatedReminders[reminderIndex].recipient = value;\n this.reminders = [...updatedReminders];\n this.updateRemindersFormValue();\n }\n\n @Listen('nylasFormInputChanged')\n handleNylasFormInputChanged(event: CustomEvent) {\n debug('nylas-reminder-emails', 'handleNylasFormInputChanged', event);\n const { name, value } = event.detail;\n if (!name.startsWith('reminder-subject-')) {\n return;\n }\n // Extract the reminder index from the name attribute (e.g. reminder-subject-0)\n const [_, reminderIndex] = name.split(/(\\d+)/);\n const updatedReminders = [...this.reminders];\n updatedReminders[reminderIndex].email_subject = value;\n this.reminders = [...updatedReminders];\n this.updateRemindersFormValue();\n }\n\n addReminder() {\n debug('nylas-reminder-emails', 'addReminder');\n this.reminders = [\n ...this.reminders,\n {\n type: 'email',\n minutes_before_event: 30,\n editing: true,\n recipient: 'all',\n },\n ];\n this.updateRemindersFormValue();\n }\n\n deleteReminder(index: number) {\n this.reminders = this.reminders.filter((_, i) => i !== index).map(p => ({ ...p }));\n this.updateRemindersFormValue();\n }\n\n get isInternalsAvailable() {\n return this.internals !== undefined && typeof this.internals.setFormValue === 'function';\n }\n\n updateRemindersFormValue() {\n debug('nylas-reminder-emails', 'updateRemindersFormValue');\n const eventReminders = this.reminders.map(reminder => {\n const rem = { ...reminder };\n rem?.editing && delete rem.editing;\n return rem;\n });\n this.valueChanged.emit({\n value: JSON.stringify(eventReminders),\n name: 'reminder-overrides',\n });\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(eventReminders), 'reminder-overrides');\n }\n\n formatReminderTime(reminderTime: number) {\n switch (true) {\n case reminderTime > 24 * 60:\n return `${reminderTime / 60 / 24} days`;\n case reminderTime === 24 * 60:\n return '1 day';\n case reminderTime > 90 || reminderTime === 60:\n return `${reminderTime / 60} hours`;\n default:\n return `${reminderTime} minute${reminderTime > 1 ? 's' : ''} `;\n }\n }\n\n @RegisterComponent<NylasReminderEmails, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-reminder-emails',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const organizerName = this.participants.find(p => p.is_organizer)?.name;\n const recipientOptions = [\n {\n label: 'All host & guests',\n value: 'all',\n },\n {\n label: 'All event guests',\n value: 'guest',\n },\n {\n label: 'Only event host',\n value: 'host',\n },\n ];\n\n return (\n <Host>\n <div class=\"cards-container\">\n {this.reminders.map((reminder, index) => {\n return reminder.type !== 'webhook' ? (\n <div class=\"nylas-reminder-email\" part=\"nre\">\n <div class=\"header\" part=\"nre__header\">\n <div>\n <h3>Upcoming meeting{organizerName ? ` with ${organizerName} ` : ''}</h3>\n <p>Reminder before event</p>\n </div>\n {!reminder.editing ? (\n <button-component\n variant={'basic'}\n key={`edit-${index} `}\n clickHandler={event => {\n event.preventDefault();\n reminder.editing = true;\n this.reminders = [...this.reminders];\n }}\n >\n <edit-icon width=\"16\" height=\"16\"></edit-icon>\n Edit\n </button-component>\n ) : (\n <div class=\"reminder-open-close-toggle\">\n <button-component\n variant={'basic'}\n class=\"delete-btn\"\n tooltip=\"Delete reminder\"\n key={`delete -${index} `}\n clickHandler={event => {\n event.preventDefault();\n this.deleteReminder(index);\n }}\n >\n <trash-icon width=\"16\" height=\"16\"></trash-icon>\n </button-component>\n <span\n class={`chevron ${reminder.editing ? 'open' : 'closed'}`}\n onClick={() => {\n reminder.editing = !reminder.editing;\n this.reminders = [...this.reminders];\n }}\n >\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n )}\n </div>\n\n {reminder.editing ? (\n <div class=\"nylas-reminder-email__body\" part=\"nre__body\">\n <div class=\"nylas-reminder-email__section\">\n <div class=\"nylas-reminder-email__row\">\n <label>Email recipients</label>\n <select-dropdown\n name={`recipient-${index}`}\n options={recipientOptions}\n defaultSelectedOption={recipientOptions.find(i => i.value === reminder.recipient) ?? recipientOptions[0]}\n withSearch={false}\n />\n </div>\n <div class=\"nylas-reminder-email__row\">\n <label>\n Send confirmation email when\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">The recipients will receive a reminder email at the specified time before the event.</span>\n </tooltip-component>\n </span>\n </label>\n <nylas-reminder-time\n name={`reminder-time-${index}`}\n eventReminderTimeMinutes={reminder.minutes_before_event}\n exportparts=\"nrt, nrt__input_dropdown: nre__reminder-input_dropdown,\n nrt__input_dropdown-input: nre__reminder-input_dropdown-input,\n nrt__input_dropdown-content: nre__reminder-input_dropdown-content,\n \"\n />\n </div>\n <div class=\"nylas-reminder-email__block\">\n <label>Email subject</label>\n <input-component\n name={`reminder-subject-${index}`}\n maxLength={60}\n placeholder={`Upcoming meeting ${organizerName ? `with ${organizerName}` : ''}`}\n defaultValue={reminder?.email_subject || ''}\n />\n </div>\n </div>\n </div>\n ) : (\n <div class=\"nylas-reminder-email__summary\" part=\"nre__summary\">\n <p>\n <span class=\"summary-icon\">\n <person-clipboard-icon></person-clipboard-icon>\n </span>\n {recipientOptions.find(i => i.value === reminder.recipient)?.label}\n </p>\n <p>\n <span class=\"summary-icon\">\n <clock-icon></clock-icon>\n </span>\n {this.formatReminderTime(reminder.minutes_before_event)} before the event\n </p>\n </div>\n )}\n </div>\n ) : null;\n })}\n </div>\n\n <button-component\n class=\"create-reminder\"\n variant={'basic'}\n clickHandler={event => {\n event.preventDefault();\n this.addReminder();\n }}\n >\n <plus-icon width=\"16\" height=\"16\"></plus-icon>\n New reminder\n </button-component>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n}\n\n.nylas-reminder-time {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%;\n\n /* 21px */\n span.required {\n color: var(--nylas-error, #cc4841);\n }\n\n span.label-icon {\n margin-left: 4px;\n\n tooltip-component {\n display: flex;\n }\n }\n }\n}\n\n.nylas-reminder-time__wrapper {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n input {\n padding: 12px 16px;\n border-width: 1;\n border-radius: 8px;\n border: 1px solid var(--nylas-base-200);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n width: 48px;\n }\n\n input-dropdown::part(id_dropdown-input) {\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 14px 16px;\n width: 50px;\n }\n\n input-dropdown::part(id_dropdown-content) {\n width: 100%;\n min-width: unset;\n height: 160px;\n }\n\n select-dropdown {\n width: 120px;\n\n @media #{$mobile} {\n width: 100%;\n }\n }\n\n select-dropdown::part(sd_dropdown-button) {\n border: 1px solid var(--nylas-base-200);\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { REMINDER_MINUTE_OPTIONS, REMINDER_HOUR_OPTIONS, REMINDER_DAY_OPTIONS } from '@/common/constants';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Host, Listen, State, h, Element, Prop, Watch, Event, EventEmitter } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\n\nconst reminderTimeOptions = [\n { value: 60 * 24, label: 'day' },\n { value: 60, label: 'hour' },\n { value: 1, label: 'minute' },\n];\n\nfunction getInitialTimeValue(timeInMinutes: number | undefined) {\n if (!timeInMinutes) return 30; // Default to 30 minutes if undefined\n\n // Loop through the reminderTimeOptions to find the appropriate division\n for (const option of reminderTimeOptions) {\n if (timeInMinutes % option.value === 0) {\n return timeInMinutes / option.value; // Return the divided value\n }\n }\n\n // If no exact division is found, return the time in minutes\n return timeInMinutes;\n}\n\nfunction getInitialTimeIncrement(timeInMinutes: number | undefined) {\n if (!timeInMinutes) return 1; // Default to minutes if undefined\n\n // Loop through the reminderTimeOptions and check divisibility\n for (const option of reminderTimeOptions) {\n if (timeInMinutes % option.value === 0) {\n return option.value;\n }\n }\n\n // If no suitable option is found, default to minutes\n return 1;\n}\n\n/**\n * The `nylas-reminder-time` component is a form input for the reminder time before an event.\n *\n * @part nrt - The event reminder container\n * @part nrt - The dropdown container for the reminder time increment\n * @part nrt__dropdown-button - The dropdown button for the reminder time increment\n * @part nrt__dropdown-content - The dropdown content for the reminder time increment\n * @part nrt__input_dropdown - The input dropdown container for the reminder time minutes\n * @part nrt__input_dropdown-input - The input for the reminder time minutes\n * @part nrt__input_dropdown-content - The dropdown content for the input reminder time minutes\n */\n@Component({\n tag: 'nylas-reminder-time',\n styleUrl: 'nylas-reminder-time.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasReminderTime {\n /**\n * The host element <nylas-reminder-time>\n */\n @Element() host!: HTMLElement;\n /**\n * The name of the reminder time. Default is 'reminder time'.\n */\n @Prop() name: string = 'reminder-time';\n /**\n * The event reminder time in minutes as set in the configuration.\n */\n @Prop() eventReminderTimeMinutes?: number;\n /**\n * The selected event reminder time state. This defaults to the reminder time from the configuration or 30 minutes.\n */\n @State() reminderTime: number = getInitialTimeValue(this.eventReminderTimeMinutes);\n /**\n * The reminder time in minutes. This defaults to the reminder time from the configuration or 30 minutes.\n */\n @State() reminderTimeMinutes: number = this.eventReminderTimeMinutes ?? 30;\n /**\n * The reminder time increment. This defaults to minute(s).\n */\n @State() reminderTimeincrement: number = getInitialTimeIncrement(this.eventReminderTimeMinutes);\n /**\n * The reminderTimeMinutesOptions for the dropdown.\n */\n @State() reminderTimeMinutesOptions = REMINDER_MINUTE_OPTIONS;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-reminder-time', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('reminderTimeMinutes')\n reminderTimeMinutesChangedHandler(newValue: number, oldValue: number) {\n debug('nylas-reminder-time', 'reminderTimeMinutesChangedHandler', newValue);\n if (newValue === oldValue) {\n return;\n }\n this.valueChanged.emit({ value: newValue.toString(), name: this.name });\n }\n\n /**\n * Event emitted when the event reminder time changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n connectedCallback() {\n debug('nylas-reminder-time', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-reminder-time', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-reminder-time', 'componentDidLoad');\n this.setReminderTimeMinuteOptions();\n }\n\n disconnectedCallback() {\n debug('nylas-reminder-time', 'disconnectedCallback');\n }\n\n /**\n * The unit tests in stencil does not support the internals API.\n * This method checks if the internals API is available.\n * @returns boolean\n */\n get isInternalsAvailable() {\n return this.internals !== undefined && typeof this.internals.setFormValue === 'function';\n }\n\n setReminderTimeMinuteOptions() {\n if (this.reminderTimeincrement === 1) {\n this.reminderTimeMinutesOptions = REMINDER_MINUTE_OPTIONS;\n } else if (this.reminderTimeincrement === 60) {\n this.reminderTimeMinutesOptions = REMINDER_HOUR_OPTIONS;\n } else this.reminderTimeMinutesOptions = REMINDER_DAY_OPTIONS;\n return this.reminderTimeMinutesOptions;\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-calendar-picker', 'nylasFormDropdownChangedHandler', event.detail);\n const { value } = event.detail;\n this.reminderTimeincrement = parseInt(value);\n\n if (this.reminderTimeincrement === 1) {\n this.reminderTime = 60;\n } else {\n this.reminderTime = 1;\n }\n\n this.setReminderTimeMinuteOptions();\n this.reminderTimeMinutes = this.reminderTime * this.reminderTimeincrement;\n this.isInternalsAvailable && this.internals.setFormValue(this.reminderTimeMinutes.toString(), this.name);\n }\n\n @Listen('inputOptionChanged')\n inputOptionChangedHandler(event: CustomEvent<{ value: number; name: string }>) {\n debug('nylas-calendar-picker', 'inputOptionChangedHandler', event.detail);\n const { value } = event.detail;\n this.reminderTime = value;\n this.reminderTimeMinutes = this.reminderTime * this.reminderTimeincrement;\n this.isInternalsAvailable && this.internals.setFormValue(this.reminderTimeMinutes.toString(), this.name);\n }\n\n @RegisterComponent<NylasReminderTime, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-reminder-time',\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div class=\"nylas-reminder-time\" part=\"nrt\">\n <div class=\"nylas-reminder-time__wrapper\">\n <input-dropdown\n name={'reminder-time'}\n options={this.reminderTimeMinutesOptions}\n inputValue={this.reminderTime.toString()}\n exportparts=\"id_dropdown: nrt__input_dropdown, id_dropdown-input: nrt__input_dropdown-input, id_dropdown-content: nrt__input_dropdown-content\"\n defaultInputOption={this.reminderTimeMinutesOptions.find(i => i.value == this.reminderTime) ?? reminderTimeOptions[0]}\n />\n <select-dropdown\n name={'reminder-time-unit'}\n options={[...reminderTimeOptions].sort((a, b) => a.value - b.value)}\n pluralizedLabel={this.reminderTime > 1 ? 's' : ''}\n exportparts=\"sd_dropdown: nrt__dropdown, sd_dropdown-button: nrt__dropdown-button, sd_dropdown-content: nrt__dropdown-content\"\n defaultSelectedOption={reminderTimeOptions.find(i => i.value == this.reminderTimeincrement) ?? reminderTimeOptions[0]}\n withSearch={false}\n />\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-scheduling-method {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n\n .header {\n padding: 1rem;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n }\n\n .nylas-scheduling-method__dropdown {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n span.nylas-scheduling-method__dropdown-label {\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--nylas-base-800);\n margin: 0.25rem 0 0 0;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n text-align: left;\n\n tooltip-component {\n display: flex;\n }\n }\n\n select-dropdown::part(sd_dropdown) {\n width: 100%;\n }\n\n select-dropdown::part(sd_dropdown-content) {\n width: 100%;\n max-width: unset;\n }\n\n select-dropdown::part(sd_dropdown-button) {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n }\n\n select-dropdown::part(sd_dropdown-button-selected-label) {\n max-width: calc(100% - 2rem);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n\n input-component::part(ic__input) {\n background: var(--nylas-base-50);\n outline: none;\n cursor: not-allowed;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AdditionalParticipant, Configuration } from '@nylas/core';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\n\n/**\n * The `nylas-scheduling-method` component is a UI component that displays the booking calendar picker.\n * @part nsm - The booking calendar picker container\n * @part nsm__header - The header of the booking calendar picker\n * @part nsm__input-label - The input label of the booking calendar picker\n * @part nsm__dropdown - The dropdown container\n * @part nsm__dropdown-button - The dropdown button\n * @part nsm__dropdown-content - The dropdown content\n */\n@Component({\n tag: 'nylas-scheduling-method',\n styleUrl: 'nylas-scheduling-method.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasSchedulingMethod {\n @Element() host!: HTMLNylasSchedulingMethodElement;\n\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The name of the booking type picker.\n */\n @Prop() name: string = 'availability-method';\n /**\n * @standalone\n * The participant options passed in the additionalParticipants prop\n * from the nylas-scheduler-editor component.\n */\n @Prop() participantOptions?: AdditionalParticipant[];\n /**\n * This prop is used to display the component in a disabled state / read-only mode.\n */\n @Prop() readOnly: boolean = false;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The selected booking type.\n */\n @State() selectedBookingType: string = '';\n\n /**\n * This event is fired when the selected booking calendar changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-scheduling-method', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-scheduling-method', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-scheduling-method', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-scheduling-method', 'componentDidLoad');\n const bookingtType = this.selectedConfiguration?.availability?.availability_rules?.availability_method?.toString();\n\n // TODO: Remove this when the internals in tests are fixed.\n if (bookingtType && typeof this.internals.setFormValue === 'function') {\n this.internals.setFormValue(bookingtType, 'booking-calendar');\n }\n this.selectedBookingType = bookingtType || 'collective';\n this.valueChanged.emit({ value: this.selectedBookingType, name: this.name });\n }\n\n componentWillUpdate() {\n debug('nylas-scheduling-method', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-scheduling-method', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-scheduling-method', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-scheduling-method', 'componentDidRender');\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-scheduling-method', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-scheduling-method', 'nylasFormDropdownChangedHandler', event.detail);\n // Pass as handler so that if event.defaultPrevented by parent app, this will be skipped.\n const valueChanged = (event: CustomEvent<{ value: string; name: string }>) => {\n const { value } = event.detail;\n if (value) {\n this.selectedBookingType = value;\n this.internals.setFormValue(value, this.name);\n }\n };\n this.valueChanged.emit({ value: event.detail.value, name: this.name, valueChanged });\n }\n\n @RegisterComponent<NylasSchedulingMethod, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-scheduling-method',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n localPropsToProp: new Map([['additionalParticipants', 'participantOptions']]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const bookingTypeOptions = [\n { label: 'Standard booking', value: 'collective' },\n { label: 'Round-robin max fairness', value: 'max-fairness' },\n { label: 'Round-robin max availability', value: 'max-availability' },\n ];\n const defaultBookingType = this.selectedConfiguration?.availability?.availability_rules?.availability_method?.toString();\n const hasAdditionalParticipants =\n this.participantOptions &&\n this.participantOptions?.length > 0 &&\n !!this.participantOptions[0].email &&\n !!this.participantOptions[0].name &&\n !!this.participantOptions[0].calendars &&\n this.participantOptions[0].calendars.length > 0;\n\n // If a default availability method is set in the configuration (developer settings), do not show the booking type picker.\n // Or, if a default availability method is not set and there are no additional participants, do not show the booking type picker.\n if ((defaultBookingType || !hasAdditionalParticipants) && !this.readOnly) {\n return null;\n }\n\n return (\n <Host>\n <div class=\"nylas-scheduling-method\" part=\"nsm\">\n <div class=\"header\" part=\"nsm__header\">\n <h3>Scheduling method</h3>\n </div>\n <div class=\"nylas-scheduling-method__dropdown\">\n <span class=\"nylas-scheduling-method__dropdown-label\">\n Select a scheduling method for the event.\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">\n <strong>Standard Booking</strong>\n <br />\n - Allows 1:1 bookings, or n:1 bookings with additional participants.\n <br />\n <br />\n <strong>Round-Robin Maximize Fairness</strong>\n <br />\n - Rotates through the list of participants you select, displaying the participant with the fewest recent bookings.\n <br />\n <br />\n <strong>Round-Robin Maximize Availability</strong>\n <br />\n - Rotates through the list of participants you select, prioritizing participants with the fewest recent bookings, but making as many time-slots available as\n possible.\n <br />\n </span>\n </tooltip-component>\n </span>\n {this.readOnly ? (\n <input-component\n name=\"availability-method-read-only\"\n type=\"text\"\n exportparts=\"ic__label: nsm__input-label, ic__input: nsm__input, ic__input_wrapper: nsm__input_wrapper\"\n readOnly\n defaultValue={bookingTypeOptions.find(cal => cal.value == defaultBookingType)?.label ?? bookingTypeOptions[0].label}\n />\n ) : (\n <select-dropdown\n name={this.name}\n options={bookingTypeOptions}\n withSearch={false}\n exportparts=\"sd_dropdown: nsm__dropdown, sd_dropdown-button: nsm__dropdown-button, sd_dropdown-content: nsm__dropdown-content\"\n defaultSelectedOption={bookingTypeOptions.find(cal => cal.value == defaultBookingType) ?? bookingTypeOptions[0]}\n />\n )}\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-timeslot-interval {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n .header {\n padding: 1rem;\n border-bottom: 1px solid var(--nylas-base-200);\n h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n .nylas-timeslot-interval__dropdown {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 4px;\n span.label {\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--nylas-base-800);\n tooltip-component {\n display: flex;\n }\n }\n select-dropdown {\n margin-bottom: 1.5rem;\n }\n select-dropdown::part(sd_dropdown) {\n width: 100%;\n }\n select-dropdown::part(sd_dropdown-content) {\n width: 100%;\n max-width: unset;\n }\n select-dropdown::part(sd_dropdown-button) {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 1rem;\n }\n select-dropdown::part(sd_dropdown-button-selected-label) {\n max-width: calc(100% - 2rem);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\n\nconst defaultRoundToMinutes = 15;\n/**\n * The `nylas-timeslot-interval` component allows users to set their time slot interval preferences.\n * This component provides an option to set both `interval_minutes` and `round_to` in the configuration.\n *\n * @part nti - The timeslot interval container\n * @part nti__header - The header of the timeslot interval picker\n * @part nti__input-label - The input label of the timeslot interval picker\n * @part nti__dropdown - The dropdown container\n * @part nti__dropdown-button - The dropdown button\n * @part nti__dropdown-content - The dropdown content\n */\n@Component({\n tag: 'nylas-timeslot-interval',\n styleUrl: 'nylas-timeslot-interval.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasTimeslotInterval {\n @Element() host!: HTMLNylasTimeslotIntervalElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The name of the calendar picker.\n */\n @Prop() name: string = 'timeslot-picker';\n\n /**\n * @standalone\n * The event duration in minutes.\n */\n @Prop() eventDurationMinutes?: number = this.selectedConfiguration?.availability?.duration_minutes;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The internal event duration minutes state.\n */\n @State() internalEventDurationMinutes!: number;\n\n /**\n * The selected interval minutes.\n */\n @State() selectedInterval!: number;\n\n /**\n * The selected round to minutes.\n */\n @State() selectedRoundTo!: boolean;\n\n /***\n * The state to store that component is ready to render.\n */\n @State() componentLoaded: boolean = false;\n\n /**\n * This event is fired when the selected booking calendar changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-timeslot-interval', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-timeslot-interval', 'selectedConfigurationChangedHandler', newValue);\n this.internalEventDurationMinutes = newValue?.availability?.duration_minutes ?? this.eventDurationMinutes ?? 30;\n const internalIntervalMinutes = newValue?.availability?.interval_minutes ?? this.internalEventDurationMinutes ?? 30;\n this.selectedInterval = newValue?.availability?.interval_minutes ?? internalIntervalMinutes ?? 10;\n const roundToMinutes = newValue?.availability?.round_to || null;\n this.selectedRoundTo = roundToMinutes && roundToMinutes === internalIntervalMinutes ? true : false;\n }\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-timeslot-interval', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-timeslot-interval', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-timeslot-interval', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-timeslot-interval', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.internalEventDurationMinutes = this.eventDurationMinutes ?? 30;\n const internalIntervalMinutes = this.internalEventDurationMinutes;\n this.selectedInterval = internalIntervalMinutes ?? 10;\n this.selectedRoundTo = false;\n }\n this.componentLoaded = true;\n }\n\n componentWillUpdate() {\n debug('nylas-timeslot-interval', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-timeslot-interval', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-timeslot-interval', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-timeslot-interval', 'componentDidRender');\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-timeslot-interval', 'nylasFormDropdownChangedHandler', event.detail);\n const value = event.detail.value;\n if (value === 'duration') {\n this.selectedInterval = this.internalEventDurationMinutes ?? 10;\n } else {\n this.selectedInterval = parseInt(event.detail.value);\n }\n\n this.valueChanged.emit({\n value: JSON.stringify({\n interval: this.selectedInterval,\n roundTo: this.selectedRoundTo ? this.selectedInterval : defaultRoundToMinutes,\n }),\n name: this.name,\n });\n if (typeof this.internals.setFormValue === 'function') {\n this.internals.setFormValue(JSON.stringify({ interval: this.selectedInterval, roundTo: this.selectedRoundTo ? this.selectedInterval : defaultRoundToMinutes }), this.name);\n }\n }\n\n @Listen('nylasFormRadioChanged')\n nylasFormRadioChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-timeslot-interval', 'nylasFormRadioChangedHandler', event.detail);\n const value = event.detail.value;\n if (value === 'no-rounding') {\n this.selectedRoundTo = false;\n } else {\n this.selectedRoundTo = true;\n }\n\n this.valueChanged.emit({\n value: JSON.stringify({\n interval: this.selectedInterval,\n roundTo: this.selectedRoundTo ? this.selectedInterval : defaultRoundToMinutes,\n }),\n name: this.name,\n });\n if (typeof this.internals.setFormValue === 'function') {\n this.internals.setFormValue(JSON.stringify({ interval: this.selectedInterval, roundTo: this.selectedRoundTo ? this.selectedInterval : defaultRoundToMinutes }), this.name);\n }\n }\n\n @RegisterComponent<NylasTimeslotInterval, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-timeslot-interval',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n fireRegisterEvent: true,\n })\n render() {\n const intervalPreferenceOptions = [\n { value: 'duration', label: 'Length of the booking' },\n { value: '5', label: '5 mins' },\n { value: '10', label: '10 mins' },\n { value: '15', label: '15 mins' },\n { value: '20', label: '20 mins' },\n { value: '30', label: '30 mins' },\n { value: '45', label: '45 mins' },\n { value: '60', label: '60 mins' },\n ];\n\n const defaultSelectedInterval =\n typeof this.selectedInterval !== 'undefined'\n ? this.selectedInterval == this.internalEventDurationMinutes\n ? intervalPreferenceOptions[0]\n : intervalPreferenceOptions.find(op => op.value == this.selectedInterval.toString()) ?? intervalPreferenceOptions[0]\n : undefined;\n\n return (\n <Host>\n <div class=\"nylas-timeslot-interval\" part=\"nti\">\n <div class=\"header\" part=\"nti__header\">\n <h3>Time slot settings</h3>\n </div>\n\n <div class=\"nylas-timeslot-interval__dropdown\">\n <span class=\"label\" part=\"nti__input-label\">\n Time slot interval.\n </span>\n {defaultSelectedInterval?.label && (\n <select-dropdown\n name=\"interval-minutes\"\n options={intervalPreferenceOptions}\n withSearch={false}\n exportparts=\"sd_dropdown: nti__dropdown, sd_dropdown-button: nti__dropdown-button, sd_dropdown-content: nti__dropdown-content\"\n defaultSelectedOption={defaultSelectedInterval}\n />\n )}\n <span slot=\"label\" class=\"label\" part=\"nti__input-label\">\n Time slot rounding type\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">Select if you want to round the time slots to the nearest interval.</span>\n </tooltip-component>\n </span>\n {this.componentLoaded && (\n <radio-button-group\n name=\"interval-preference\"\n defaultSelectedValue={this.selectedRoundTo ? 'rounding' : 'no-rounding'}\n options={[\n { value: 'no-rounding', label: 'Default', description: 'Time slots will be rounded to the nearest quarter-hour.' },\n {\n value: 'rounding',\n label: 'Interval rounding',\n description: 'Time slots will begin at times rounded to the interval value.',\n },\n ]}\n />\n )}\n </div>\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'paintbrush-fill-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class PaintbrushFillIcon {\n @Prop() width: string = '16';\n @Prop() height: string = '13';\n\n render() {\n return (\n <svg width=\"16\" height=\"17\" viewBox=\"-3 0 16 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5 2.875V0.375H0.5C0.223858 0.375 0 0.598858 0 0.875V7.37585H10V0.875C10 0.598858 9.77614 0.375 9.5 0.375H8V3.87722C8 4.15337 7.77614 4.37722 7.5 4.37722C7.22386 4.37722 7 4.15337 7 3.87722V0.375H6V2.875C6 3.15114 5.77614 3.375 5.5 3.375C5.22386 3.375 5 3.15114 5 2.875ZM10 8.37585H0V9.37938C0 10.4839 0.895431 11.3794 2 11.3794H3.5V14.8767C3.5 15.7051 4.17157 16.3767 5 16.3767C5.82843 16.3767 6.5 15.7051 6.5 14.8767V11.3794H8C9.10457 11.3794 10 10.4839 10 9.37938V8.37585Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'paintbrush-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class PaintbrushIcon {\n @Prop() width: string = '16';\n @Prop() height: string = '13';\n\n render() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"-3 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M0.5 -0.000976562C0.223858 -0.000976562 0 0.222881 0 0.499023L1.90735e-05 9.00337C1.90735e-05 10.1079 0.89545 11.0034 2.00002 11.0034H3.00411V14.0007C3.00411 15.1053 3.89954 16.0007 5.00411 16.0007C6.10868 16.0007 7.00411 15.1053 7.00411 14.0007V11.0034H8.00002C9.10459 11.0034 10 10.1079 10 9.00337V7.50339L10 7.49897V0.499023C10 0.222881 9.77614 -0.000976562 9.5 -0.000976562H0.5ZM1.00002 8.00342H9.00002V9.00337C9.00002 9.55566 8.5523 10.0034 8.00002 10.0034H6.50411C6.22797 10.0034 6.00411 10.2272 6.00411 10.5034V14.0007C6.00411 14.553 5.5564 15.0007 5.00411 15.0007C4.45183 15.0007 4.00411 14.553 4.00411 14.0007V10.5034C4.00411 10.2272 3.78026 10.0034 3.50411 10.0034H2.00002C1.44773 10.0034 1.00002 9.55566 1.00002 9.00337V8.00342ZM9 7.00339H1V0.999023H5V2.49902C5 2.77517 5.22386 2.99902 5.5 2.99902C5.77614 2.99902 6 2.77517 6 2.49902V0.999023H7V3.50122C7 3.77736 7.22386 4.00122 7.5 4.00122C7.77614 4.00122 8 3.77736 8 3.50122V0.999023H9V7.00339Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'people-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class PeopleIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '20';\n\n render() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={this.width} height={this.height} fill=\"none\" viewBox=\"0 0 20 20\">\n <path\n fill=\"currentColor\"\n d=\"M11 10a2 2 0 0 1 2 2v1.5c0 2.054-2.088 3.5-5.5 3.5S2 15.554 2 13.5V12a2 2 0 0 1 2-2h7Zm0 1H4a1 1 0 0 0-1 1v1.5C3 14.907 4.579 16 7.5 16c2.921 0 4.5-1.093 4.5-2.5V12a1 1 0 0 0-1-1Zm5-1a2 2 0 0 1 2 2v.5c0 2.089-1.568 3.5-4.5 3.5-.141 0-.28-.003-.414-.01.208-.242.382-.502.522-.781l.097-.213h.039C15.976 14.931 17 13.96 17 12.5V12a1 1 0 0 0-1-1h-2.171a3 3 0 0 0-.594-1H16ZM7.5 2a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7Zm7 2a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5Zm-7-1a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5Zm7 2a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'trash-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class TrashIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '21';\n\n render() {\n // Trash icon svg\n return (\n <svg width={this.width} height={this.height} viewBox=\"0 0 20 21\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10 0.25C11.733 0.25 13.1492 1.60645 13.2449 3.31558L13.25 3.5H18.5C18.9142 3.5 19.25 3.83579 19.25 4.25C19.25 4.6297 18.9678 4.94349 18.6018 4.99315L18.5 5H17.704L16.4239 18.0192C16.2912 19.3683 15.1984 20.41 13.8626 20.4945L13.6871 20.5H6.31293C4.95734 20.5 3.81365 19.5145 3.59883 18.1934L3.57614 18.0192L2.295 5H1.5C1.1203 5 0.806509 4.71785 0.756847 4.35177L0.75 4.25C0.75 3.8703 1.03215 3.55651 1.39823 3.50685L1.5 3.5H6.75C6.75 1.70507 8.20507 0.25 10 0.25ZM16.197 5H3.802L5.06893 17.8724C5.12768 18.4696 5.60033 18.9343 6.18585 18.9936L6.31293 19H13.6871C14.2872 19 14.7959 18.5751 14.9123 17.9982L14.9311 17.8724L16.197 5ZM11.75 7.75C12.1297 7.75 12.4435 8.03215 12.4932 8.39823L12.5 8.5V15.5C12.5 15.9142 12.1642 16.25 11.75 16.25C11.3703 16.25 11.0565 15.9678 11.0068 15.6018L11 15.5V8.5C11 8.08579 11.3358 7.75 11.75 7.75ZM8.25 7.75C8.6297 7.75 8.94349 8.03215 8.99315 8.39823L9 8.5V15.5C9 15.9142 8.66421 16.25 8.25 16.25C7.8703 16.25 7.55651 15.9678 7.50685 15.6018L7.5 15.5V8.5C7.5 8.08579 7.83579 7.75 8.25 7.75ZM10 1.75C9.08183 1.75 8.32881 2.45711 8.2558 3.35647L8.25 3.5H11.75C11.75 2.5335 10.9665 1.75 10 1.75Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'zoom-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class ZoomIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '20';\n\n render() {\n // Spam icon svg\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M19.7495 6.85792C19.2077 3.4745 16.5255 0.792345 13.1421 0.250451C12.1175 0.0865155 11.0702 0 10 0C8.92992 0 7.88256 0.0865155 6.85797 0.250451C3.47453 0.792345 0.792373 3.4745 0.250478 6.85792C0.0865433 7.87796 0 8.92987 0 10C0 11.0701 0.0865433 12.1175 0.250478 13.1421C0.792373 16.5255 3.47453 19.2077 6.85797 19.7495C7.88256 19.9135 8.92992 20 10 20C11.0702 20 12.1175 19.9135 13.1421 19.7495C16.5255 19.2077 19.2077 16.5255 19.7495 13.1421C19.9135 12.122 20 11.0701 20 10C20 8.92987 19.9135 7.88251 19.7495 6.85792Z\"\n fill=\"url(#paint0_linear_22_6272)\"\n />\n <path\n d=\"M12.154 12.1676C12.154 12.7596 11.6759 13.2377 11.0839 13.2377H6.42995C5.24598 13.2377 4.28516 12.2769 4.28516 11.0929V7.87794C4.28516 7.28596 4.76328 6.80786 5.35527 6.80786H10.0092C11.1932 6.80786 12.154 7.7687 12.154 8.95267V12.1676ZM14.8589 7.09475L13.2879 8.27412C13.0193 8.47448 12.8598 8.79324 12.8598 9.13022V10.9153C12.8598 11.2523 13.0193 11.5711 13.2879 11.7714L14.8589 12.9508C15.2141 13.2149 15.715 12.9645 15.715 12.5228V7.5228C15.715 7.08109 15.2096 6.83063 14.8589 7.09475Z\"\n fill=\"white\"\n />\n <defs>\n <linearGradient id=\"paint0_linear_22_6272\" x1=\"10\" y1=\"19.9954\" x2=\"10\" y2=\"-0.00455379\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#003FAE\" />\n <stop offset=\"0.02\" stop-color=\"#0142B7\" />\n <stop offset=\"0.09\" stop-color=\"#044BD1\" />\n <stop offset=\"0.16\" stop-color=\"#0752E5\" />\n <stop offset=\"0.24\" stop-color=\"#0958F4\" />\n <stop offset=\"0.34\" stop-color=\"#0A5BFC\" />\n <stop offset=\"0.5\" stop-color=\"#0B5CFF\" />\n </linearGradient>\n </defs>\n </svg>\n );\n }\n}\n"],"mappings":"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"}
|