@nylas/web-elements 2.0.1 → 2.0.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/nylas-scheduler-editor/nylas-scheduler-editor.es.js +191 -95
- package/dist/cdn/nylas-scheduling/nylas-scheduling.es.js +10418 -10260
- package/dist/cjs/{abstract-provider-ca4f7e4f.js → abstract-provider-f84a6735.js} +2 -2
- package/dist/cjs/{abstract-provider-ca4f7e4f.js.map → abstract-provider-f84a6735.js.map} +1 -1
- package/dist/cjs/app-globals-ee500b74.js.map +1 -1
- package/dist/cjs/calendar-agenda-fill-icon_36.cjs.entry.js +36 -21
- package/dist/cjs/calendar-agenda-fill-icon_36.cjs.entry.js.map +1 -1
- package/dist/cjs/{calendar-check-icon_2.cjs.entry.js → calendar-check-icon.cjs.entry.js} +3 -19
- package/dist/cjs/calendar-check-icon.cjs.entry.js.map +1 -0
- package/dist/cjs/checkbox-component_2.cjs.entry.js +1 -1
- package/dist/cjs/checkbox-group_4.cjs.entry.js +3 -3
- package/dist/cjs/checkmark-circle-icon.cjs.entry.js +24 -0
- package/dist/cjs/checkmark-circle-icon.cjs.entry.js.map +1 -0
- package/dist/cjs/checkmark-icon_15.cjs.entry.js +11 -7
- package/dist/cjs/checkmark-icon_15.cjs.entry.js.map +1 -1
- package/dist/cjs/{customParseFormat-bb3a23c5.js → customParseFormat-95790293.js} +2 -2
- package/dist/cjs/{customParseFormat-bb3a23c5.js.map → customParseFormat-95790293.js.map} +1 -1
- package/dist/cjs/{feedbackSync-1c5ec9aa.js → feedbackSync-4ed99749.js} +2 -2
- package/dist/cjs/{feedbackSync-1c5ec9aa.js.map → feedbackSync-4ed99749.js.map} +1 -1
- package/dist/cjs/globe-icon_2.cjs.entry.js +2 -2
- package/dist/cjs/google-logo-icon_6.cjs.entry.js +8 -8
- package/dist/cjs/index-e07e3a7e.js +6 -2
- package/dist/cjs/index.cjs.js +2 -2
- package/dist/cjs/{index.es-c563f3ba.js → index.es-62161daa.js} +2 -2
- package/dist/cjs/{index.es-c563f3ba.js.map → index.es-62161daa.js.map} +1 -1
- package/dist/cjs/input-component.cjs.entry.js +1 -1
- package/dist/cjs/input-dropdown_2.cjs.entry.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/multi-select-dropdown.cjs.entry.js +1 -1
- package/dist/cjs/{nylas-api-request-4d148ff1.js → nylas-api-request-03d7f604.js} +2 -2
- package/dist/cjs/{nylas-api-request-4d148ff1.js.map → nylas-api-request-03d7f604.js.map} +1 -1
- package/dist/cjs/nylas-booked-event-card_11.cjs.entry.js +82 -25
- package/dist/cjs/nylas-booked-event-card_11.cjs.entry.js.map +1 -1
- package/dist/cjs/nylas-form-card.cjs.entry.js +2 -2
- package/dist/cjs/nylas-notification_2.cjs.entry.js +1 -1
- package/dist/cjs/nylas-scheduler-editor.cjs.entry.js +6 -6
- package/dist/cjs/nylas-scheduling.cjs.entry.js +42 -14
- package/dist/cjs/nylas-scheduling.cjs.entry.js.map +1 -1
- package/dist/cjs/nylas-web-elements.cjs.js +1 -1
- package/dist/cjs/{register-component-70744713.js → register-component-f4ad9751.js} +2 -2
- package/dist/cjs/{register-component-70744713.js.map → register-component-f4ad9751.js.map} +1 -1
- package/dist/cjs/textarea-component.cjs.entry.js +1 -1
- package/dist/cjs/{utils-dd3b6f4c.js → utils-03b13826.js} +154 -55
- package/dist/cjs/utils-03b13826.js.map +1 -0
- package/dist/collection/components/scheduler/nylas-booked-event-card/nylas-booked-event-card.js +11 -3
- package/dist/collection/components/scheduler/nylas-booked-event-card/nylas-booked-event-card.js.map +1 -1
- package/dist/collection/components/scheduler/nylas-booking-form/nylas-booking-form.js +49 -4
- package/dist/collection/components/scheduler/nylas-booking-form/nylas-booking-form.js.map +1 -1
- package/dist/collection/components/scheduler/nylas-booking-form/test/nylas-booking-form.spec.js +3 -3
- package/dist/collection/components/scheduler/nylas-booking-form/test/nylas-booking-form.spec.js.map +1 -1
- package/dist/collection/components/scheduler/nylas-cancel-booking-form/nylas-cancel-booking-form.js +37 -1
- package/dist/collection/components/scheduler/nylas-cancel-booking-form/nylas-cancel-booking-form.js.map +1 -1
- package/dist/collection/components/scheduler/nylas-cancelled-event-card/nylas-cancelled-event-card.js +34 -2
- package/dist/collection/components/scheduler/nylas-cancelled-event-card/nylas-cancelled-event-card.js.map +1 -1
- package/dist/collection/components/scheduler/nylas-confirmed-event-card/nylas-confirmed-event-card.css +1 -1
- package/dist/collection/components/scheduler/nylas-confirmed-event-card/nylas-confirmed-event-card.js +34 -1
- package/dist/collection/components/scheduler/nylas-confirmed-event-card/nylas-confirmed-event-card.js.map +1 -1
- package/dist/collection/components/scheduler/nylas-date-picker/nylas-date-picker.js +10 -4
- package/dist/collection/components/scheduler/nylas-date-picker/nylas-date-picker.js.map +1 -1
- package/dist/collection/components/scheduler/nylas-organizer-confirmation-card/nylas-organizer-confirmation-card.js +10 -2
- package/dist/collection/components/scheduler/nylas-organizer-confirmation-card/nylas-organizer-confirmation-card.js.map +1 -1
- package/dist/collection/components/scheduler/nylas-scheduling/nylas-scheduling.css +13 -0
- package/dist/collection/components/scheduler/nylas-scheduling/nylas-scheduling.js +66 -7
- package/dist/collection/components/scheduler/nylas-scheduling/nylas-scheduling.js.map +1 -1
- package/dist/collection/components/scheduler/nylas-scheduling/test/nylas-scheduling.spec.js +33 -0
- package/dist/collection/components/scheduler/nylas-scheduling/test/nylas-scheduling.spec.js.map +1 -1
- package/dist/collection/components/scheduler/nylas-selected-event-card/nylas-selected-event-card.js +20 -5
- package/dist/collection/components/scheduler/nylas-selected-event-card/nylas-selected-event-card.js.map +1 -1
- package/dist/collection/components/scheduler/nylas-timeslot-picker/nylas-timeslot-picker.js.map +1 -1
- package/dist/collection/components/scheduler-editor/nylas-additional-participants/nylas-additional-participants.js +12 -6
- package/dist/collection/components/scheduler-editor/nylas-additional-participants/nylas-additional-participants.js.map +1 -1
- package/dist/collection/components/scheduler-editor/nylas-availability-picker/nylas-availability-picker.js +1 -1
- package/dist/collection/components/scheduler-editor/nylas-booking-confirmation-redirect/nylas-booking-confirmation-redirect.js +12 -6
- package/dist/collection/components/scheduler-editor/nylas-booking-confirmation-redirect/nylas-booking-confirmation-redirect.js.map +1 -1
- package/dist/collection/components/scheduler-editor/nylas-confirmation-email/nylas-confirmation-email.js +6 -3
- package/dist/collection/components/scheduler-editor/nylas-confirmation-email/nylas-confirmation-email.js.map +1 -1
- package/dist/collection/components/scheduler-editor/nylas-custom-event-slug/nylas-custom-event-slug.js +14 -8
- package/dist/collection/components/scheduler-editor/nylas-custom-event-slug/nylas-custom-event-slug.js.map +1 -1
- package/dist/collection/components/scheduler-editor/nylas-editor-tabs/nylas-editor-tabs.js +3 -3
- package/dist/collection/components/scheduler-editor/nylas-event-calendar/nylas-event-calendar.js +1 -1
- package/dist/collection/components/scheduler-editor/nylas-reminder-emails/nylas-reminder-emails.js +8 -4
- package/dist/collection/components/scheduler-editor/nylas-reminder-emails/nylas-reminder-emails.js.map +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/nylas-additional-participants2.js +12 -6
- package/dist/components/nylas-additional-participants2.js.map +1 -1
- package/dist/components/nylas-booked-event-card2.js +13 -6
- package/dist/components/nylas-booked-event-card2.js.map +1 -1
- package/dist/components/nylas-booking-confirmation-redirect2.js +12 -6
- package/dist/components/nylas-booking-confirmation-redirect2.js.map +1 -1
- package/dist/components/nylas-booking-form2.js +28 -6
- package/dist/components/nylas-booking-form2.js.map +1 -1
- package/dist/components/nylas-cancel-booking-form2.js +13 -3
- package/dist/components/nylas-cancel-booking-form2.js.map +1 -1
- package/dist/components/nylas-cancelled-event-card2.js +12 -3
- package/dist/components/nylas-cancelled-event-card2.js.map +1 -1
- package/dist/components/nylas-confirmation-email2.js +6 -3
- package/dist/components/nylas-confirmation-email2.js.map +1 -1
- package/dist/components/nylas-confirmed-event-card2.js +18 -8
- package/dist/components/nylas-confirmed-event-card2.js.map +1 -1
- package/dist/components/nylas-custom-event-slug2.js +15 -9
- package/dist/components/nylas-custom-event-slug2.js.map +1 -1
- package/dist/components/nylas-date-picker2.js +1 -1
- package/dist/components/nylas-date-picker2.js.map +1 -1
- package/dist/components/nylas-editor-tabs-group2.js +2 -2
- package/dist/components/nylas-editor-tabs2.js +2 -2
- package/dist/components/nylas-organizer-confirmation-card2.js +12 -5
- package/dist/components/nylas-organizer-confirmation-card2.js.map +1 -1
- package/dist/components/nylas-reminder-emails2.js +8 -4
- package/dist/components/nylas-reminder-emails2.js.map +1 -1
- package/dist/components/nylas-scheduler-editor.js +2 -2
- package/dist/components/nylas-scheduling.js +42 -12
- package/dist/components/nylas-scheduling.js.map +1 -1
- package/dist/components/nylas-selected-event-card2.js +12 -5
- package/dist/components/nylas-selected-event-card2.js.map +1 -1
- package/dist/components/nylas-timeslot-picker2.js.map +1 -1
- package/dist/components/utils.js +153 -54
- package/dist/components/utils.js.map +1 -1
- package/dist/esm/{abstract-provider-efe136bd.js → abstract-provider-bdb7d9b4.js} +2 -2
- package/dist/esm/{abstract-provider-efe136bd.js.map → abstract-provider-bdb7d9b4.js.map} +1 -1
- package/dist/esm/app-globals-295a87be.js.map +1 -1
- package/dist/esm/calendar-agenda-fill-icon_36.entry.js +36 -21
- package/dist/esm/calendar-agenda-fill-icon_36.entry.js.map +1 -1
- package/dist/esm/{calendar-check-icon_2.entry.js → calendar-check-icon.entry.js} +4 -19
- package/dist/esm/calendar-check-icon.entry.js.map +1 -0
- package/dist/esm/checkbox-component_2.entry.js +1 -1
- package/dist/esm/checkbox-group_4.entry.js +3 -3
- package/dist/esm/checkmark-circle-icon.entry.js +20 -0
- package/dist/esm/checkmark-circle-icon.entry.js.map +1 -0
- package/dist/esm/checkmark-icon_15.entry.js +11 -7
- package/dist/esm/checkmark-icon_15.entry.js.map +1 -1
- package/dist/esm/{customParseFormat-edc38d83.js → customParseFormat-f0d21eb3.js} +2 -2
- package/dist/esm/{customParseFormat-edc38d83.js.map → customParseFormat-f0d21eb3.js.map} +1 -1
- package/dist/esm/{feedbackSync-e4378c0b.js → feedbackSync-b9c9e719.js} +2 -2
- package/dist/esm/{feedbackSync-e4378c0b.js.map → feedbackSync-b9c9e719.js.map} +1 -1
- package/dist/esm/globe-icon_2.entry.js +2 -2
- package/dist/esm/google-logo-icon_6.entry.js +8 -8
- package/dist/esm/index-091600eb.js +6 -2
- package/dist/esm/{index.es-6a9d55cf.js → index.es-ccb2a286.js} +2 -2
- package/dist/esm/{index.es-6a9d55cf.js.map → index.es-ccb2a286.js.map} +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/input-component.entry.js +1 -1
- package/dist/esm/input-dropdown_2.entry.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/multi-select-dropdown.entry.js +1 -1
- package/dist/esm/{nylas-api-request-f2e4e9b6.js → nylas-api-request-7d702661.js} +2 -2
- package/dist/esm/{nylas-api-request-f2e4e9b6.js.map → nylas-api-request-7d702661.js.map} +1 -1
- package/dist/esm/nylas-booked-event-card_11.entry.js +82 -25
- package/dist/esm/nylas-booked-event-card_11.entry.js.map +1 -1
- package/dist/esm/nylas-form-card.entry.js +2 -2
- package/dist/esm/nylas-notification_2.entry.js +1 -1
- package/dist/esm/nylas-scheduler-editor.entry.js +6 -6
- package/dist/esm/nylas-scheduling.entry.js +43 -15
- package/dist/esm/nylas-scheduling.entry.js.map +1 -1
- package/dist/esm/nylas-web-elements.js +1 -1
- package/dist/esm/{register-component-a1c3d7b4.js → register-component-9d4ceee5.js} +2 -2
- package/dist/esm/{register-component-a1c3d7b4.js.map → register-component-9d4ceee5.js.map} +1 -1
- package/dist/esm/textarea-component.entry.js +1 -1
- package/dist/esm/{utils-b7f9cbcc.js → utils-fb8a9ce4.js} +154 -55
- package/dist/esm/utils-fb8a9ce4.js.map +1 -0
- package/dist/nylas-web-elements/index.esm.js +1 -1
- package/dist/nylas-web-elements/nylas-web-elements.esm.js +1 -1
- package/dist/nylas-web-elements/nylas-web-elements.esm.js.map +1 -1
- package/dist/nylas-web-elements/{p-3ce8e281.js → p-094be30f.js} +2 -2
- package/dist/nylas-web-elements/p-18c58ea1.entry.js +2 -0
- package/dist/nylas-web-elements/p-18c58ea1.entry.js.map +1 -0
- package/dist/nylas-web-elements/{p-c12c18b2.entry.js → p-1dbaf879.entry.js} +2 -2
- package/dist/nylas-web-elements/p-2830522f.entry.js +2 -0
- package/dist/nylas-web-elements/p-2830522f.entry.js.map +1 -0
- package/dist/nylas-web-elements/{p-35297f33.entry.js → p-3b56d656.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-8e7882a1.js → p-3c8b7ba1.js} +2 -2
- package/dist/nylas-web-elements/{p-3204882f.entry.js → p-3f5e1e6b.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-5aae729f.js → p-4c1fafb4.js} +2 -2
- package/dist/nylas-web-elements/p-522270a2.entry.js +2 -0
- package/dist/nylas-web-elements/p-522270a2.entry.js.map +1 -0
- package/dist/nylas-web-elements/p-67e936ce.entry.js +2 -0
- package/dist/nylas-web-elements/p-67e936ce.entry.js.map +1 -0
- package/dist/nylas-web-elements/{p-9e11eb2c.js → p-6d8e2c6b.js} +2 -2
- package/dist/nylas-web-elements/{p-3362cf82.entry.js → p-8f82f281.entry.js} +2 -2
- package/dist/nylas-web-elements/p-920812bd.entry.js +8 -0
- package/dist/nylas-web-elements/p-920812bd.entry.js.map +1 -0
- package/dist/nylas-web-elements/{p-b40f7a77.entry.js → p-a42f41f7.entry.js} +2 -2
- package/dist/nylas-web-elements/p-a6e2e49c.js.map +1 -1
- package/dist/nylas-web-elements/{p-8340d845.entry.js → p-aad611b4.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-6e56eb3f.js → p-ab88518b.js} +2 -2
- package/dist/nylas-web-elements/{p-5cf6301e.entry.js → p-b3500bf1.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-4d8f9740.entry.js → p-b6d863e0.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-50c255fa.entry.js → p-b8cf836f.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-996c827d.entry.js → p-bf37be06.entry.js} +2 -2
- package/dist/nylas-web-elements/p-de4b01ac.entry.js +2 -0
- package/dist/nylas-web-elements/p-de4b01ac.entry.js.map +1 -0
- package/dist/nylas-web-elements/{p-308e7adb.entry.js → p-f42e87c6.entry.js} +3 -3
- package/dist/nylas-web-elements/{p-dea32251.js → p-f4825eb1.js} +2 -2
- package/dist/nylas-web-elements/p-faa30369.js +14 -0
- package/dist/nylas-web-elements/{p-59e4ab2d.js.map → p-faa30369.js.map} +1 -1
- package/dist/types/components/scheduler/nylas-booked-event-card/nylas-booked-event-card.d.ts +2 -0
- package/dist/types/components/scheduler/nylas-booking-form/nylas-booking-form.d.ts +7 -0
- package/dist/types/components/scheduler/nylas-cancel-booking-form/nylas-cancel-booking-form.d.ts +3 -0
- package/dist/types/components/scheduler/nylas-cancelled-event-card/nylas-cancelled-event-card.d.ts +3 -1
- package/dist/types/components/scheduler/nylas-confirmed-event-card/nylas-confirmed-event-card.d.ts +3 -1
- package/dist/types/components/scheduler/nylas-date-picker/nylas-date-picker.d.ts +2 -1
- package/dist/types/components/scheduler/nylas-organizer-confirmation-card/nylas-organizer-confirmation-card.d.ts +2 -0
- package/dist/types/components/scheduler/nylas-scheduling/nylas-scheduling.d.ts +6 -0
- package/dist/types/components/scheduler/nylas-selected-event-card/nylas-selected-event-card.d.ts +3 -1
- package/dist/types/components/scheduler/nylas-timeslot-picker/nylas-timeslot-picker.d.ts +2 -1
- package/dist/types/components/scheduler-editor/nylas-additional-participants/nylas-additional-participants.d.ts +2 -0
- package/dist/types/components/scheduler-editor/nylas-booking-confirmation-redirect/nylas-booking-confirmation-redirect.d.ts +2 -0
- package/dist/types/components/scheduler-editor/nylas-custom-event-slug/nylas-custom-event-slug.d.ts +2 -0
- package/dist/types/components.d.ts +46 -6
- package/package.json +3 -5
- package/dist/cjs/calendar-check-icon_2.cjs.entry.js.map +0 -1
- package/dist/cjs/utils-dd3b6f4c.js.map +0 -1
- package/dist/esm/calendar-check-icon_2.entry.js.map +0 -1
- package/dist/esm/utils-b7f9cbcc.js.map +0 -1
- package/dist/nylas-web-elements/p-2b52b854.entry.js +0 -2
- package/dist/nylas-web-elements/p-2b52b854.entry.js.map +0 -1
- package/dist/nylas-web-elements/p-59e4ab2d.js +0 -14
- package/dist/nylas-web-elements/p-8a3965ba.entry.js +0 -2
- package/dist/nylas-web-elements/p-8a3965ba.entry.js.map +0 -1
- package/dist/nylas-web-elements/p-97128be4.entry.js +0 -8
- package/dist/nylas-web-elements/p-97128be4.entry.js.map +0 -1
- package/dist/nylas-web-elements/p-d69f9d47.entry.js +0 -2
- package/dist/nylas-web-elements/p-d69f9d47.entry.js.map +0 -1
- package/dist/nylas-web-elements/p-dcc8ca35.entry.js +0 -2
- package/dist/nylas-web-elements/p-dcc8ca35.entry.js.map +0 -1
- /package/dist/nylas-web-elements/{p-3ce8e281.js.map → p-094be30f.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-c12c18b2.entry.js.map → p-1dbaf879.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-35297f33.entry.js.map → p-3b56d656.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-8e7882a1.js.map → p-3c8b7ba1.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-3204882f.entry.js.map → p-3f5e1e6b.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-5aae729f.js.map → p-4c1fafb4.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-9e11eb2c.js.map → p-6d8e2c6b.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-3362cf82.entry.js.map → p-8f82f281.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-b40f7a77.entry.js.map → p-a42f41f7.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-8340d845.entry.js.map → p-aad611b4.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-6e56eb3f.js.map → p-ab88518b.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-5cf6301e.entry.js.map → p-b3500bf1.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-4d8f9740.entry.js.map → p-b6d863e0.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-50c255fa.entry.js.map → p-b8cf836f.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-996c827d.entry.js.map → p-bf37be06.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-308e7adb.entry.js.map → p-f42e87c6.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-dea32251.js.map → p-f4825eb1.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["iconCss","CheckmarkIconStyle0","CheckmarkIcon","render","h","key","width","this","height","viewBox","fill","xmlns","d","CopyIconStyle0","CopyIcon","DragableIconStyle0","DragableIcon","EyeIconStyle0","EyeIcon","FeedbackIconStyle0","FeedbackIcon","stroke","inputColorPickerCss","InputColorPickerStyle0","InputColorPicker","componentType","defaultSelectedColor","componentWillLoad","selectedColor","el","setAttribute","handleFocus","isOpen","handleBlur","handleInput","event","target","value","handleChange","nylasFormDropdownChanged","emit","name","error","errorMessage","handleKeyDown","code","preventDefault","inputRef","click","handleOutsideClick","path","composedPath","isClickInside","includes","class","part","tabindex","onKeyDown","e","type","ref","id","onFocus","onBlur","onInput","onChange","htmlFor","labelBtn","open","closed","chevron","inputImageUrlCss","InputImageUrlStyle0","InputImageUrl","imageUrl","connectedCallback","debug","disconnectedCallback","host","componentDidLoad","currentImageUrl","setImage","componentWillUpdate","componentDidUpdate","componentWillRender","componentDidRender","elementNameChangedHandler","newValue","errorMessageChangedHandler","nylasFormInputChangedHandler","detail","nylasFormInputBlurHandler","valueChanged","isValidImage","then","internals","setValidity","setFormValue","catch","nylasFormInputImageUrlInvalid","customError","Host","required","exportparts","defaultValue","src","alt","__decorate","RegisterComponent","eventToProps","async","_nylasSchedulerConfigConnector","nylasAdditionalParticipantsCss","NylasAdditionalParticipantsStyle0","NylasAdditionalParticipants","eventParticipants","selectedConfigurationAndCurrentUserChangedHandler","_oldValue","propName","currentUser","updateState","selectedConfiguration","selectedLanguageChangedHandler","newVal","oldVal","i18next","changeLanguage","t","participants","isRoundRobinConfig","roundRobinConfig","updateFormValue","selectedConfig","availability","availability_rules","availability_method","includeOrganizerAsParticipant","find","p","email","updateOrganizerAsParticipant","isInternalsAvailable","undefined","onInputOptionChanged","EMAIL_REGEX","index","participant","participantOptions","participantErrors","is_valid","test","primaryCalendar","calendars","calendar","is_primary","calendar_ids","booking","calendar_id","findCurrentUserInParticipants","bookingCalendarDefault","currentUserCalendars","is_organizer","addParticipant","removeParticipant","filter","_","i","length","JSON","stringify","getArrayDifference","array1","array2","filtered","participant1","some","participant2","map","label","slot","organizer","readOnly","onClick","checked","filterable","inputValue","options","context","stateToProps","Map","fireRegisterEvent","nylasEventDescriptionCss","NylasEventDescriptionStyle0","NylasEventDescription","event_booking","description","eventDescription","eventDescriptionTokens","token","labelHTML","availableTokens","$value","fullText","focusOffset","selectedConfigurationChangedHandler","additionalFields","scheduler","additional_fields","newKeys","Object","keys","newTokens","additionalFieldTokens","filteredTokens","updateEventDescriptionFromProp","titleTokens","$invitee","$invitee_email","$duration","valueChangedHandler","parse","toString","descriptionRef","innerHTML","highlightTokens","outputHtml","forEach","tokenObj","regex","RegExp","replace","getCurrentSelectionForBrowser","getSelectionTextData","nodeValue","offset","node","allSelected","text","dollarIndex","lastIndexOf","lastWord","substring","split","currentText","isAllSelected","selection","anchorOffset","focusNode","currentBrowser","getBrowser","shadowRootSelection","shadowRoot","getSelection","focusNodeValue","document","anchorNodeValue","anchorNode","allSelectedFirefox","windowSelection","window","getComposedRanges","startContainer","allSelectedSafari","endOffset","console","warn","textContent","sanitize","currentSelection","updateEventDescription","resetDropdown","startsWith","showTokens","currentWord","populateSuggestionsDropdown","handleInputKeyDown","isNonPrintableKey","activeOption","getElementById","ariaActivedescendant","textNode","childNodes","newTextNode","createTextNode","insertBefore","firstChild","range","createRange","setStart","collapse","sel","removeAllRanges","addRange","nodeType","Node","TEXT_NODE","newText","slice","focus","nextOption","nextElementSibling","prevOption","previousElementSibling","parentNode","nodeName","removeChild","remove","selectOption","option","word","dollarWord","currentNode","currentNodeText","wordText","nextSibling","indexOf","textBefore","textAfter","newRange","tagSpan","createElement","classList","add","newTextNodeAfter","replaceWith","afterNode","query","obj","getLabelHTML","handleAddAdditionalFields","baseDescription","startMarker","endMarker","startIndex","endIndex","additionalFieldsBlock","contentEditable","noTemplates","role","active","field","hideAutoPopulateButton","variant","nylasEventInfoCss","NylasEventInfoStyle0","NylasEventInfo","checkForMissingSlots","nylasEventLocationCss","NylasEventLocationStyle0","NylasEventLocation","eventLocation","eventConferencing","setDefaultGrantID","userProvider","provider","configLocation","location","configConferencing","conferencing","selectedLocationOption","setDefaultLocationOption","grantId","currentUserChangedHandler","userProviderState","setLocationOptionsForProvider","conferenceProvidersChanged","locationOptions","push","locOptionValues","findIndex","formElement","form","formData","FormData","set","getConferencePayload","conferenceProviders","payload","PROVIDER_CONFERENCE_MAP","autocreate","conf_grant_id","nylasFormDropdownChangedHandler","googleConfGrantId","google","microsoftConfGrantId","microsoft","zoomConfGrantId","zoom","CONFERENCE_PROVIDER_MAP","getIcon","style","display","alignItems","gap","fontSize","fontWeight","defaultOption","withSearch","defaultSelectedOption","maxlength","nylasEventTitleCss","NylasEventTitleStyle0","NylasEventTitle","title","eventTitleTokens","ariaActivedescendantChangedHandler","querySelectorAll","configChangedHandler","configEventTitle","updateEventTitleFromProp","eventTitle","updateEventTitle","formSubmittedHandler","validity","valid","validationError","titleRef","noValue","nylasFeedbackFormCss","NylasFeedbackFormStyle0","NylasFeedbackForm","handleConfirmBookingButtonClicked","validationEvent","triggerValidation","defaultPrevented","feedbackSubmitted","feedback","feedbackMessage","applyThemeConfig","themeConfig","entries","setProperty","handleFormInputChanged","closeModal","stopImmediatePropagation","feedbackModalClosed","tooltip","maxLength","placeholder","href","rel","footer","_event","_nylasSchedulerConnector","localPropsToProp","nylasReminderTimeCss","NylasReminderTimeStyle0","NylasReminderTime","eventReminderTimeMinutesChangedHandler","updateNumberAndPeriodFromMinutes","eventReminderTimeMinutes","nylasSuggestReminderMinutesHandler","minutes","errorState","setTimeout","timePeriodChangedHandler","number","period","totalMinutes","minutesInHour","minutesInDay","minutesInWeek","minutesInMonth","Math","floor","selectedNumber","selectedPeriod","showTimePeriodSelector","hasError","timePeriods","defaultSelectedNumber","defaultSelectedPeriod","TrashIconStyle0","TrashIcon"],"sources":["src/common/icons/icon.css?tag=checkmark-icon&encapsulation=scoped","src/common/icons/checkmark.tsx","src/common/icons/icon.css?tag=copy-icon&encapsulation=scoped","src/common/icons/copy.tsx","src/common/icons/icon.css?tag=dragable-icon&encapsulation=scoped","src/common/icons/dragable.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/components/design-system/input-color-picker/input-color-picker.scss?tag=input-color-picker&encapsulation=shadow","src/components/design-system/input-color-picker/input-color-picker.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/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-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-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-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-reminder-time/nylas-reminder-time.scss?tag=nylas-reminder-time&encapsulation=shadow","src/components/scheduler-editor/nylas-reminder-time/nylas-reminder-time.tsx","src/common/icons/icon.css?tag=trash-icon&encapsulation=scoped","src/common/icons/trash.tsx"],"sourcesContent":[":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: 'copy-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class CopyIcon {\n @Prop() width: string = '16';\n @Prop() height: string = '16';\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=\"M4 0.75C2.89543 0.75 2 1.64543 2 2.75V12.75C2 13.8546 2.89543 14.75 4 14.75H10C11.1046 14.75 12 13.8546 12 12.75V2.75C12 1.64543 11.1046 0.75 10 0.75H4ZM3 2.75C3 2.19772 3.44772 1.75 4 1.75H10C10.5523 1.75 11 2.19772 11 2.75V12.75C11 13.3023 10.5523 13.75 10 13.75H4C3.44772 13.75 3 13.3023 3 12.75V2.75ZM0 4.75001C0 4.00973 0.402199 3.36339 1 3.01758V13.25C1 14.6307 2.11929 15.75 3.5 15.75H9.73244C9.38663 16.3478 8.74028 16.75 8 16.75H3.5C1.567 16.75 0 15.183 0 13.25V4.75001Z\"\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: '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: '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","@import '../../../common/styles/variables.scss';\n@import '../../../common/mixins/inputs.scss';\n\n:host {\n display: block;\n position: relative;\n\n @media #{$mobile} {\n position: unset;\n }\n\n @include default-css-variables;\n width: 100%;\n}\n\nlabel {\n @include input-label;\n flex-direction: column;\n gap: 4px;\n font-family: var(--nylas-font-family);\n font-size: 16px;\n color: var(--nylas-base-800);\n\n p {\n margin: 0;\n }\n\n .error {\n color: var(--nylas-error);\n }\n}\n\n.color-picker-container {\n @include textfield;\n width: -moz-available;\n width: -webkit-fill-available;\n padding-left: 0;\n gap: 0;\n overflow: hidden;\n\n input {\n display: flex;\n align-items: center;\n height: 100%;\n appearance: none;\n border: none;\n border-right: 1px solid var(--nylas-base-200);\n background: transparent;\n\n &::-webkit-color-swatch {\n min-width: 30px;\n border-radius: 0.25rem;\n border: 1px solid var(--nylas-base-200);\n margin: 0.25rem;\n }\n\n &::-moz-color-swatch {\n min-width: 30px;\n border-radius: 0.25rem;\n border: 1px solid var(--nylas-base-200);\n margin: 0.25rem;\n }\n }\n\n &.error {\n border: 1px solid var(--nylas-error);\n }\n\n &:hover,\n &:active {\n outline: 1px solid var(--nylas-primary);\n }\n\n &:active {\n outline: 2px solid var(--nylas-primary);\n }\n\n label {\n width: 100%;\n }\n}\n\n.labelBtn {\n color: var(--nylas-base-800);\n padding: 14px;\n font-size: 16px;\n font-family: var(--nylas-font-family);\n cursor: pointer;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n width: 100%;\n gap: 0.5rem;\n background: transparent;\n border: none;\n\n &.error {\n border: 1px solid var(--nylas-error);\n }\n\n &.focus {\n background: transparent;\n }\n\n &:hover,\n &:active {\n outline: 1px solid var(--nylas-primary);\n }\n\n span {\n &.chevron {\n display: flex;\n align-self: center;\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.selected-option {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n max-width: 144px;\n font-size: 14px;\n line-height: 20px;\n\n @media #{$mobile} {\n max-width: 124px;\n font-size: 16px;\n }\n }\n }\n}\n","import { Component, Element, Event, EventEmitter, h, Listen, Prop, State } from '@stencil/core';\n\n/**\n * The `input-color-picker` component is a dropdown that allows users to select an accent color from either RGB inputs or an interactive color picker and converts them to a hex value.\n * This component is used in the scheduling form to input dropdown type inputs.\n * @part icp_color-picker - The dropdown container\n * @part icp_color-picker-button - The dropdown button\n * @part icp_color-picker-button-selected-label - The selected option label\n * @part icp_color-picker-label - The dropdown label\n */\n@Component({\n tag: 'input-color-picker',\n styleUrl: 'input-color-picker.scss',\n shadow: true,\n})\nexport class InputColorPicker {\n @Element() el!: HTMLElement;\n private readonly componentType: string = 'color-picker';\n\n private inputRef?: HTMLInputElement;\n\n // Props\n /**\n * The name of the dropdown\n */\n @Prop() name!: string;\n /**\n * The default selected color\n */\n @Prop({ attribute: 'default-selected-color' }) defaultSelectedColor?: string;\n\n // States\n /**\n * The selected option\n */\n @State() selectedColor: string | undefined = this.defaultSelectedColor;\n /**\n * The open state of the dropdown\n */\n @State() isOpen: boolean = false;\n /**\n * The aria-activedescendant attribute for the listbox element to indicate the currently active\n * option in the list box to screen readers. The value of aria-activedescendant is the ID of\n * the active option.\n */\n @State() ariaActivedescendant: string = '';\n\n /**\n * The error message to display when the value is empty or null and the dropdown is required\n */\n @State() errorMessage: string = '';\n\n // Events\n /**\n * This event is fired when the selected option is changed\n */\n @Event({ bubbles: true, composed: true }) nylasFormDropdownChanged!: EventEmitter<{\n value: string;\n name: string;\n error?: string;\n label?: string;\n }>;\n\n // Lifecycle events\n componentWillLoad() {\n this.selectedColor = this.defaultSelectedColor;\n this.el.setAttribute('component-type', this.componentType);\n }\n\n // Methods\n handleFocus() {\n this.isOpen = true;\n }\n handleBlur() {\n this.isOpen = false;\n }\n\n // handle input separately from change to allow for live updates in label\n handleInput(event: Event) {\n this.selectedColor = (event.target as HTMLInputElement).value;\n }\n\n handleChange(event: Event) {\n this.selectedColor = (event.target as HTMLInputElement).value;\n this.nylasFormDropdownChanged.emit({\n value: this.selectedColor,\n name: this.name,\n error: this.errorMessage,\n });\n }\n\n handleKeyDown(event: KeyboardEvent) {\n if (event.code === 'Enter' || event.code === 'Space') {\n event.preventDefault();\n this.inputRef?.click();\n }\n }\n\n // Event listeners\n @Listen('click', { target: 'document', capture: true })\n handleOutsideClick(event: MouseEvent) {\n // Get the path of the event\n const path = event.composedPath();\n const isClickInside = path.includes(this.el);\n\n if (!isClickInside && this.isOpen) {\n this.isOpen = false;\n }\n }\n\n render() {\n return (\n <div class=\"color-picker-container\" part=\"icp_color-picker\" tabindex=\"0\" onKeyDown={e => this.handleKeyDown(e)}>\n <input\n type=\"color\"\n ref={el => (this.inputRef = el as HTMLInputElement)}\n id={this.name}\n name={this.name}\n value={this.selectedColor}\n tabindex=\"-1\"\n onFocus={() => this.handleFocus()}\n onBlur={() => this.handleBlur()}\n onInput={e => this.handleInput(e)}\n onChange={e => this.handleChange(e)}\n onKeyDown={e => this.handleKeyDown(e)}\n />\n <label\n part=\"icp_color-picker-button\"\n htmlFor={this.name}\n class={{ labelBtn: true, open: this.isOpen, error: !!this.errorMessage }}\n aria-haspopup=\"listbox\"\n aria-expanded={this.isOpen ? 'true' : 'false'}\n aria-label={this.name}\n >\n <span class=\"selected-option\" part=\"icp_color-picker-button-selected-label\">\n {this.selectedColor || 'Select a color'}\n </span>\n <span\n class={{\n open: this.isOpen,\n closed: !this.isOpen,\n chevron: true,\n }}\n aria-hidden=\"true\"\n >\n <chevron-icon width=\"16\" height=\"16\" />\n </span>\n {this.errorMessage && <span class=\"error help-text\">{this.errorMessage}</span>}\n </label>\n </div>\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 /**\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 * The error message\n */\n @State() error: string = '';\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, false);\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 @Watch('errorMessage')\n errorMessageChangedHandler(newValue: string) {\n debug('nylas-image-input', 'errorMessageChangedHandler', newValue);\n if (this.error) {\n this.error = newValue;\n }\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, valueChanged: boolean = true) {\n this.error = '';\n\n isValidImage(value)\n .then(() => {\n this.currentImageUrl = value;\n\n this.internals.setValidity({});\n this.internals.setFormValue(this.currentImageUrl, this.name);\n if (valueChanged) {\n this.valueChanged.emit({ value: this.currentImageUrl, name: this.name });\n }\n })\n .catch(() => {\n this.error = this.errorMessage || 'Invalid image URL.';\n this.nylasFormInputImageUrlInvalid.emit({ value: this.error, name: this.name });\n if (typeof this.internals.setValidity === 'function') {\n this.internals.setValidity({ customError: true }, this.error);\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.error && <span class=\"error-message\">{this.error}</span>}\n </div>\n\n {this.currentImageUrl && !this.error && (\n <div class=\"logo\">\n <img src={this.currentImageUrl} alt=\"Logo\" />\n </div>\n )}\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-additional-participants__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-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 span.org-as-participant {\n width: max-content;\n }\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';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\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 nadtnlpart__title - The title of the component.\n * @part nadtnlpart__subtitle - The subtitle of the component.\n * @part nadtnlpart__content - The content of the component.\n * @part nadtnlpart__input_group - The input group of the component.\n * @part nadtnlpart__input_wrapper - The input wrapper of the component.\n * @part nadtnlpart__input - The input of the component.\n * @part nadtnlpart__remove-participant - The remove participant button of the component.\n * @part nadtnlpart__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 * @standalone\n * If the config is round robin\n */\n @Prop() roundRobinConfig?: boolean;\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\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, false);\n } else if (propName === 'currentUser') {\n this.updateState(this.selectedConfiguration, newValue as User, false);\n }\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n if (this.error) {\n this.error = i18next.t('nylasAdditionalParticipants.error');\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 if (this.selectedConfiguration) {\n this.updateState(this.selectedConfiguration, this.currentUser, false);\n } else if (this.eventParticipants) {\n this.participants = this.eventParticipants || [];\n this.isRoundRobinConfig = this.roundRobinConfig || false;\n this.updateFormValue(true);\n }\n }\n\n disconnectedCallback() {\n debug('nylas-additional-participants', 'disconnectedCallback');\n }\n\n private updateState(selectedConfig?: Configuration, currentUser?: User, valueChanged: boolean = true) {\n this.isRoundRobinConfig = selectedConfig?.availability?.availability_rules?.availability_method\n ? selectedConfig?.availability?.availability_rules?.availability_method !== 'collective'\n : false;\n this.participants = selectedConfig?.participants || this.eventParticipants || [];\n this.includeOrganizerAsParticipant = this.isRoundRobinConfig && this.participants.find(p => p.email === currentUser?.email) ? true : false;\n this.updateOrganizerAsParticipant(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' && 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 is_primary calendar if available, otherwise first calendar for all participants\n const primaryCalendar = participant?.calendars?.find(calendar => calendar.is_primary);\n this.participants[index].availability =\n participant && primaryCalendar?.id ? { calendar_ids: [primaryCalendar.id] } : participant?.calendars[0]?.id ? { calendar_ids: [participant.calendars[0].id] } : undefined;\n // If round-robin config, set booking calendar to is_primary if available, otherwise first calendar for all participants\n this.participants[index].booking =\n participant && this.isRoundRobinConfig && primaryCalendar?.id\n ? { calendar_id: primaryCalendar.id }\n : this.isRoundRobinConfig && participant?.calendars[0]?.id\n ? { calendar_id: participant.calendars[0].id }\n : undefined;\n this.participants[index].name = participant?.name || event.detail.value;\n this.participants = [...this.participants];\n this.updateFormValue();\n }\n\n updateOrganizerAsParticipant(valueChanged: boolean = true) {\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(valueChanged);\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(valueChanged = true) {\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.error = i18next.t('nylasAdditionalParticipants.error');\n this.isInternalsAvailable && this.internals.setValidity({ customError: true }, this.error);\n } else {\n this.isInternalsAvailable && this.internals.setValidity({});\n this.error = '';\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(participants), this.name);\n if (valueChanged) {\n this.valueChanged.emit({ value: JSON.stringify(participants), name: this.name });\n }\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 ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host part=\"nadtnlpart\">\n <nylas-form-card exportparts=\"nfc, nfc__header\">\n <h3 slot=\"header-title\" class=\"nylas-additional-participants__title\" part=\"nadtnlpart__title\">\n {i18next.t('nylasAdditionalParticipants.headerTitle')}\n </h3>\n <p slot=\"header-subtitle\" class=\"nylas-additional-participants__subtitle\" part=\"nadtnlpart__subtitle\">\n {i18next.t('nylasAdditionalParticipants.headerSubTitle')}\n </p>\n <div slot=\"content\" class=\"nylas-additional-participants__content\" part=\"nadtnlpart__content\">\n <div>\n {this.participants.map((participant, index) => {\n return (\n <div class={'nylas-additional-participants__input_group'} part=\"nadtnlpart__input_group\">\n {!participant.is_organizer && <label>{`${i18next.t('nylasAdditionalParticipants.participant')} ${index}`}</label>}\n <div\n part=\"nadtnlpart__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=\"nadtnlpart__input\">\n {participant.is_organizer ? (\n <input-component\n class={'label-input'}\n name={`${index}`}\n key={index}\n label={i18next.t('nylasAdditionalParticipants.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 <span class=\"org-as-participant\" part=\"nadtnlpart__org-as-participant\">\n {i18next.t('nylasAdditionalParticipants.organizerAsParticipant')}\n </span>\n <tooltip-component id=\"organizer_participant_tooltip\">\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">\n <strong>{i18next.t('nylasAdditionalParticipants.tooltip.includeOrganizer')}:</strong>{' '}\n {i18next.t('nylasAdditionalParticipants.tooltip.includeOrganizerDesc')} <br />\n <strong>{i18next.t('nylasAdditionalParticipants.tooltip.excludeOrganizer')}:</strong>{' '}\n {i18next.t('nylasAdditionalParticipants.tooltip.excludeOrganizerDesc')}\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=\"nadtnlpart__remove-participant\">\n <close-icon />\n </button>\n )}\n </div>\n </div>\n {!participant.is_valid && (\n <p class=\"nylas-additional-participants__error\" part=\"nadtnlpart__error\">\n {this.participantErrors[index]}\n </p>\n )}\n </div>\n );\n })}\n <p class=\"nylas-additional-participants__error\" part=\"nadtnlpart__error\">\n {this.error}\n </p>\n </div>\n <button class=\"nylas-additional-participants__add\" part=\"nadtnlpart__add-participant\" onClick={() => this.addParticipant()}>\n <add-circle-icon />{' '}\n <span>\n {this.participants.length > 1\n ? i18next.t('nylasAdditionalParticipants.addParticipant', { context: 'next' })\n : i18next.t('nylasAdditionalParticipants.addParticipant', { context: 'first' })}\n </span>\n </button>\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-description {\n display: flex;\n flex-direction: column;\n gap: 4px;\n position: relative;\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 div.event-description {\n padding: 12px 16px;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n white-space: nowrap;\n scrollbar-width: thin;\n min-height: 50px;\n overflow-y: auto;\n white-space: pre-wrap;\n line-height: 1.5;\n\n /* Preserves line breaks */\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 span.add-additional-fields {\n display: flex;\n align-items: center;\n gap: 8px;\n\n button-component {\n button {\n height: 35px;\n }\n }\n }\n\n span.help-text {\n display: inline-block;\n gap: 4px;\n align-items: center;\n color: var(--nylas-base-500);\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 21px;\n position: relative;\n\n span.label-icon {\n display: inline-block;\n\n tooltip-component {\n &::part(tc__container) {\n position: unset;\n }\n\n &::part(tc__content) {\n position: absolute;\n top: 4px;\n left: 50%;\n transform: translateX(-50%);\n }\n }\n }\n }\n\n .highlighted-tag {\n background-color: var(--nylas-base-200);\n border-radius: var(--nylas-border-radius);\n padding: 2px 5px;\n margin-left: 4px;\n margin-bottom: 4px;\n display: inline-block;\n vertical-align: baseline;\n }\n\n .token-options {\n display: block;\n background-color: var(--nylas-base-0);\n width: 100%;\n max-height: 336px;\n margin-top: 28px;\n overflow: auto;\n z-index: 1;\n border-radius: 4px;\n position: absolute;\n bottom: 108px;\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: var(--nylas-base-900);\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}\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 { Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\nimport { EVENT_TITLE_TOKENS as eventDescriptionTokens } from '@/common/constants';\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-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 = this.selectedConfiguration?.event_booking?.description;\n\n /**\n * @standalone\n * The name of the event description input.\n */\n @Prop() name: string = 'description';\n\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * Hide the auto popolate button\n */\n @Prop() hideAutoPopulateButton: boolean = false;\n\n /**\n * Whether to show the tokens dropdown.\n */\n @Prop() noTemplates: boolean = false;\n\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 @State() showTokens: boolean = false;\n /**\n * The available token options for the dropdown.\n */\n @State() availableTokens: { label: string; value: string; labelHTML: Token }[] = eventDescriptionTokens.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 description 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\n @State() additionalFieldTokens: Token[] = [];\n // Reference to the description textarea element\n private descriptionRef!: HTMLDivElement;\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-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 const description = newValue?.event_booking?.description || this.eventDescription || '';\n const additionalFields = newValue?.scheduler?.additional_fields || {};\n const newKeys = Object.keys(additionalFields) || [];\n const newTokens = newKeys.map(key => {\n return {\n token: `$${key}`,\n value: `\\${${key}}`,\n description: additionalFields[key].label || '',\n };\n });\n this.additionalFieldTokens = [...newTokens];\n this.availableTokens = [...eventDescriptionTokens, ...newTokens].map(token => ({\n label: token.token,\n value: token.value,\n labelHTML: token,\n }));\n this.filteredTokens = [...this.availableTokens];\n this.description = description;\n if (description) {\n this.updateEventDescriptionFromProp(description);\n }\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n const titleTokens = {\n $invitee: 'invitee',\n $invitee_email: 'inviteeEmail',\n $duration: 'duration',\n };\n this.availableTokens = this.availableTokens.map(token => {\n if (titleTokens[token.label]) {\n token.labelHTML.description = i18next.t(`nylasEventTitle.eventTitleTokenDescription.${titleTokens[token.label]}`);\n }\n return token;\n });\n this.filteredTokens = [...this.availableTokens];\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 this.updateEventDescriptionFromProp(this.description);\n }\n }\n\n disconnectedCallback() {\n debug('nylas-event-description', 'disconnectedCallback');\n }\n\n @Listen('valueChanged', { target: 'document' })\n valueChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { name, value } = event.detail;\n if (name === 'additional-fields') {\n const additionalFields = JSON.parse(value.toString());\n const newKeys = Object.keys(additionalFields) || [];\n const newTokens = newKeys.map(key => {\n return {\n token: `$${key}`,\n value: `\\${${key}}`,\n description: additionalFields[key].label || '',\n };\n });\n this.additionalFieldTokens = [...newTokens];\n this.availableTokens = [...eventDescriptionTokens, ...newTokens].map(token => ({\n label: token.token,\n value: token.value,\n labelHTML: token,\n }));\n this.filteredTokens = [...this.availableTokens];\n }\n }\n\n updateEventDescriptionFromProp(newValue: string) {\n debug('nylas-event-description', 'updateEventDescriptionFromProp', newValue);\n const description = newValue || this.description;\n if (this.descriptionRef) {\n this.descriptionRef.innerHTML = this.highlightTokens(description);\n }\n }\n\n highlightTokens(description: string) {\n let outputHtml = description;\n [...eventDescriptionTokens, ...this.additionalFieldTokens].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 }\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 }\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 }\n default: {\n console.warn('Browser not supported');\n return null;\n }\n }\n }\n\n handleChange(event: Event) {\n let textContent = (event.target as HTMLDivElement).textContent || '';\n textContent = sanitize(textContent);\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.updateEventDescription(textContent);\n this.resetDropdown();\n return;\n }\n const { focusOffset, dollarIndex, lastWord, currentText } = currentSelection;\n\n if (dollarIndex === -1 || focusOffset < dollarIndex) {\n this.updateEventDescription(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 description 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.updateEventDescription(textContent);\n }\n\n handleInputKeyDown(event) {\n const selection = this.getCurrentSelectionForBrowser();\n\n // If no text is remaining in the description, reset the description to an empty string\n if (selection?.allSelected && !isNonPrintableKey(event)) {\n this.descriptionRef.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 } else {\n const textNode = selection?.node;\n const offset = selection?.focusOffset || 0;\n\n if (!textNode || offset === -1 || this.descriptionRef.childNodes.length === 0) {\n // If no text node exists or invalid selection, create new line at start\n const newTextNode = document.createTextNode('\\n');\n this.descriptionRef.insertBefore(newTextNode, this.descriptionRef.firstChild);\n\n // Set cursor after newline\n const range = document.createRange();\n range.setStart(newTextNode, 1);\n range.collapse(true);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n } else if (textNode.nodeType === Node.TEXT_NODE) {\n const text = textNode.nodeValue || '';\n // Insert newline at cursor position\n const newText = text.slice(0, offset) + '\\n' + text.slice(offset);\n textNode.nodeValue = newText;\n\n // Move cursor after the newline\n const range = document.createRange();\n range.setStart(textNode, offset + 1);\n range.collapse(true);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n }\n this.descriptionRef.focus();\n }\n } else if (event.key === 'ArrowDown') {\n if (this.showTokens) {\n event.preventDefault();\n }\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 if (this.showTokens) {\n event.preventDefault();\n }\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 && parentNode.nodeName === 'SPAN') {\n event.preventDefault();\n parentNode.removeChild(selection.node);\n parentNode.remove();\n this.resetDropdown();\n }\n if (this.descriptionRef.textContent === '' || selection?.allSelected) {\n this.descriptionRef.innerHTML = '';\n this.updateEventDescription('');\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.descriptionRef.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.descriptionRef.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 description with the selected token\n this.updateEventDescription(this.descriptionRef.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 updateEventDescription(text: string) {\n const value = text.replace(/ +/g, ' ');\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 handleAddAdditionalFields() {\n if (this.additionalFieldTokens.length === 0) {\n return;\n }\n\n // Remove any existing additional fields section while preserving content before and after\n const baseDescription = this.descriptionRef.innerHTML;\n const startMarker = '--- Additional Fields ---';\n const endMarker = '--- End Additional Fields ---';\n\n const startIndex = baseDescription.indexOf(startMarker);\n const endIndex = baseDescription.indexOf(endMarker);\n\n // Add the additional fields block with start and end markers\n let additionalFieldsBlock = startMarker + '\\n';\n this.additionalFieldTokens.forEach(token => {\n additionalFieldsBlock += `${token.description}: ${token.value}\\n`;\n });\n additionalFieldsBlock += endMarker;\n\n let description;\n if (startIndex !== -1 && endIndex !== -1) {\n // Replace existing block while maintaining text positions\n description = baseDescription.substring(0, startIndex) + additionalFieldsBlock + baseDescription.substring(endIndex + endMarker.length);\n } else {\n // First time adding the block\n description = baseDescription + additionalFieldsBlock;\n }\n\n this.updateEventDescriptionFromProp(description);\n this.updateEventDescription(description);\n }\n\n @RegisterComponent<NylasEventDescription, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-event-description',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\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 {i18next.t('nylasEventDescription.headerTitle')}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasEventDescription.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n </label>\n <div\n id=\"event-description\"\n class={{ 'event-description': true }}\n part=\"nedesc__textarea\"\n contentEditable=\"true\"\n onInput={e => this.handleChange(e)}\n onKeyDown={event => this.handleInputKeyDown(event)}\n ref={el => (this.descriptionRef = el as HTMLDivElement)}\n ></div>\n {!this.noTemplates && this.showTokens && this.filteredTokens?.length > 0 && (\n <div class=\"token-options\" part=\"nedesc__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 {!this.noTemplates && (\n <span class=\"help-text\">\n {i18next.t('nylasEventTitle.helpText', { context: 'start', field: i18next.t('nylasEventTitle.description') })} <code>$</code>{' '}\n {i18next.t('nylasEventTitle.helpText', { context: 'end' })}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" width=\"13\" height=\"13\" />\n <span slot=\"tooltip-content\">\n {i18next.t('nylasEventTitle.tooltip.desc')} <code>{'${invitee}'}</code>\n </span>\n </tooltip-component>\n </span>\n </span>\n )}\n {!this.noTemplates && !this.hideAutoPopulateButton && (\n <span class=\"add-additional-fields\">\n <button-component variant=\"basic\" onClick={() => this.handleAddAdditionalFields()}>\n {i18next.t('nylasEventDescription.addAdditionalFields.buttonText')}\n </button-component>\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">\n {i18next.t('nylasEventDescription.addAdditionalFields.tooltip.desc')} <code>{'${invitee}'}</code>\n </span>\n </tooltip-component>\n </span>\n </span>\n )}\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;\n /* 125% */\n margin: 0;\n text-align: left;\n}\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;\n /* 142.857% */\n margin: 0.25rem 0px 0px;\n text-align: left;\n}\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, Prop, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\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 selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n }\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 stateToProps: new Map([['schedulerConfig.selectedLanguage', 'selectedLanguage']]),\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 {i18next.t('nylasEventInfo.headerTitle')}\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 @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';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\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 /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\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: i18next.t('nylasEventLocation.conferenceOptions.none'), labelHTML: this.getLabelHTML('none') },\n { value: 'custom', label: i18next.t('nylasEventLocation.conferenceOptions.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 || this.eventLocation;\n const configConferencing = newValue?.event_booking?.conferencing || this.eventConferencing;\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: i18next.t('nylasEventLocation.conferenceOptions.zoom'), labelHTML: this.getLabelHTML('zoom') });\n }\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n const locOptionValues = this.locationOptions.map(option => option.value);\n locOptionValues.forEach(option => {\n const index = this.locationOptions.findIndex(i => i.value === option);\n this.locationOptions[index].label = i18next.t(`nylasEventLocation.conferenceOptions.${option}`);\n this.locationOptions[index].labelHTML = this.getLabelHTML(option);\n });\n this.locationOptions = [...this.locationOptions];\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?.event_booking) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.selectedLocationOption = this.setDefaultLocationOption(this.eventConferencing || null, this.eventLocation ?? '');\n this.location = this.eventLocation ?? '';\n }\n\n this.userProviderState = this.userProvider ?? this.currentUser?.provider ?? '';\n this.setLocationOptionsForProvider(this.userProviderState);\n const formElement = this.internals?.form;\n // Set the initial form value\n if (formElement) {\n const formData = new FormData(formElement);\n formData.set('conference', this.getConferencePayload());\n formData.set(this.name, this.location);\n }\n\n if (this.conferenceProviders?.['zoom'] && !this.locationOptions.some(option => option.value === 'zoom')) {\n this.locationOptions.push({ value: 'zoom', label: i18next.t('nylasEventLocation.conferenceOptions.zoom'), labelHTML: this.getLabelHTML('zoom') });\n }\n }\n\n disconnectedCallback() {\n debug('nylas-event-location', 'disconnectedCallback');\n }\n\n getConferencePayload() {\n if (this.selectedLocationOption === 'custom' || this.selectedLocationOption === 'none') {\n return JSON.stringify(null);\n }\n const grantId = this.conferenceProviders?.[this.selectedLocationOption];\n const payload = {\n provider: PROVIDER_CONFERENCE_MAP[this.selectedLocationOption],\n autocreate: grantId\n ? {\n conf_grant_id: grantId,\n }\n : {},\n };\n return JSON.stringify(payload);\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 }\n case 'custom': {\n this.valueChanged.emit({ value: JSON.stringify(null), name: 'conference' });\n break;\n }\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 }\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 }\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\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: i18next.t('nylasEventLocation.conferenceOptions.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: i18next.t('nylasEventLocation.conferenceOptions.google'), labelHTML: this.getLabelHTML('microsoft') });\n }\n break;\n }\n }\n\n setDefaultLocationOption(eventConferencing: Conference | null, eventLocation: string) {\n if (eventConferencing != null && eventConferencing?.provider != 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 {i18next.t(`nylasEventLocation.conferenceOptions.${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 ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\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 {i18next.t('nylasEventLocation.headerTitle')}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasEventLocation.tooltip.desc')}</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: auto;\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: inline-block;\n gap: 4px;\n align-items: center;\n color: var(--nylas-base-500);\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 21px;\n position: relative;\n\n span.label-icon {\n display: inline-block;\n\n tooltip-component {\n &::part(tc__container) {\n position: unset;\n }\n\n &::part(tc__content) {\n position: absolute;\n top: 4px;\n left: 50%;\n transform: translateX(-50%);\n }\n }\n }\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: var(--nylas-base-900);\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';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\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 * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * Whether to show the tokens dropdown.\n */\n @Prop() noTemplates: boolean = false;\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 @State() additionalFieldTokens: Token[] = [];\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: Configuration) {\n const title = newVal?.event_booking?.title;\n const additionalFields = newVal?.scheduler?.additional_fields || {};\n const newKeys = Object.keys(additionalFields) || [];\n const newTokens = newKeys.map(key => {\n return {\n token: `$${key}`,\n value: `\\${${key}}`,\n description: additionalFields[key].label || '',\n };\n });\n this.additionalFieldTokens = [...newTokens];\n this.availableTokens = [...eventTitleTokens, ...newTokens].map(token => ({\n label: token.token,\n value: token.value,\n labelHTML: token,\n }));\n this.filteredTokens = [...this.availableTokens];\n if (title) {\n this.configEventTitle = title;\n this.updateEventTitleFromProp(title);\n }\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n const titleTokens = {\n $invitee: 'invitee',\n $invitee_email: 'inviteeEmail',\n $duration: 'duration',\n };\n this.availableTokens = this.availableTokens.map(token => {\n if (titleTokens[token.label]) {\n token.labelHTML.description = i18next.t(`nylasEventTitle.eventTitleTokenDescription.${titleTokens[token.label]}`);\n }\n return token;\n });\n this.filteredTokens = [...this.availableTokens];\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 let title = this.eventTitle || this.configEventTitle;\n if (this.selectedConfiguration?.event_booking?.title) {\n title = this.selectedConfiguration?.event_booking?.title;\n }\n if (title) {\n this.updateEventTitleFromProp(title);\n this.updateEventTitle(title, true);\n }\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 = 'eventTitleRequired';\n } else {\n this.validationError = '';\n }\n }\n\n @Listen('valueChanged', { target: 'document' })\n valueChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { name, value } = event.detail;\n if (name === 'additional-fields') {\n const additionalFields = JSON.parse(value.toString());\n const newKeys = Object.keys(additionalFields) || [];\n const newTokens = newKeys.map(key => {\n return {\n token: `$${key}`,\n value: `\\${${key}}`,\n description: additionalFields[key].label || '',\n };\n });\n this.additionalFieldTokens = [...newTokens];\n this.availableTokens = [...eventTitleTokens, ...newTokens].map(token => ({\n label: token.token,\n value: token.value,\n labelHTML: token,\n }));\n this.filteredTokens = [...this.availableTokens];\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 if (typeof this.internals.setValidity === 'function') {\n if (!title || title === '') {\n this.titleRef.focus();\n this.internals?.setValidity({ customError: true }, `Event title is required`, this.titleRef);\n } else {\n this.internals?.setValidity({ customError: false });\n this.isInternalsAvailable && this.internals?.setFormValue(title, this.name);\n }\n }\n }\n }\n\n highlightTokens(title: string) {\n let outputHtml = title;\n [...eventTitleTokens, ...this.additionalFieldTokens].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 }\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 }\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 }\n default: {\n console.warn('Browser not supported');\n return null;\n }\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 && parentNode.nodeName === 'SPAN') {\n event.preventDefault();\n parentNode.removeChild(selection.node);\n parentNode.remove();\n this.resetDropdown();\n this.updateEventTitle(this.titleRef?.textContent || '');\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, noValue: boolean = false) {\n const value = text.replace(/ +/g, ' ');\n if (value === '' || /^[\\s]*$/.test(value)) {\n this.validationError = 'eventTitleRequired';\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\n this.isInternalsAvailable && this.internals?.setFormValue(value, this.name);\n if (!noValue) {\n this.valueChanged.emit({ value: value, name: this.name });\n }\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([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\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 {i18next.t('nylasEventTitle.headerTitle')}\n <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.noTemplates && 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 {!this.noTemplates && (\n <span class=\"help-text\">\n {i18next.t('nylasEventTitle.helpText', { context: 'start', field: i18next.t('nylasEventTitle.title') })} <code>$</code>{' '}\n {i18next.t('nylasEventTitle.helpText', { context: 'end' })}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">\n {i18next.t('nylasEventTitle.tooltip.desc')} <code>{'${invitee}'}</code>\n </span>\n </tooltip-component>\n </span>\n </span>\n )}\n {this.validationError != '' && <span class=\"error-message\">{i18next.t(`nylasEventTitle.${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: 16px;\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 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 justify-content: flex-end;\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 {\n width: 80px;\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 }\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 { 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 i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\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__number-dropdown - The number dropdown container\n * @part nrt__number-dropdown-button - The number dropdown button\n * @part nrt__number-dropdown-content - The number dropdown content\n * @part nrt__period-dropdown - The period dropdown container\n * @part nrt__period-dropdown-button - The period dropdown button\n * @part nrt__period-dropdown-content - The period dropdown content\n * @part nrt__time-period-selector - The time period selector\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 language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * The selected number for the reminder time.\n */\n @State() selectedNumber;\n\n /**\n * The selected period for the reminder time.\n */\n @State() selectedPeriod;\n\n /**\n * The error state to show the error message when the minutes selected is invalid (not divisible by 5).\n */\n @State() errorState: boolean = false;\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('eventReminderTimeMinutes')\n eventReminderTimeMinutesChangedHandler(newValue: number, _oldValue: number) {\n debug('nylas-reminder-time', 'eventReminderTimeMinutesChangedHandler', newValue);\n this.updateNumberAndPeriodFromMinutes(newValue);\n this.isInternalsAvailable && this.internals.setFormValue(newValue?.toString(), this.name);\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\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.updateNumberAndPeriodFromMinutes(this.eventReminderTimeMinutes || 30);\n }\n\n disconnectedCallback() {\n debug('nylas-reminder-time', 'disconnectedCallback');\n }\n\n @Listen('nylasSuggestReminderMinutes', { target: 'document' })\n nylasSuggestReminderMinutesHandler(event: CustomEvent<{ minutes: number }>) {\n const { minutes } = event.detail;\n this.errorState = false;\n this.valueChanged.emit({ value: minutes.toString(), name: this.name });\n this.isInternalsAvailable && this.internals.setFormValue(minutes.toString(), this.name);\n // Workaround: Force the time-period-selector to the next rounded multiple of 5\n // instead of the current rounded multiple. This handles cases where the user re-enters\n // the same number, ensuring the selector correctly updates to the intended rounded value.\n this.updateNumberAndPeriodFromMinutes(minutes + 7);\n setTimeout(() => {\n this.updateNumberAndPeriodFromMinutes(minutes);\n }, 10);\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.errorState = totalMinutes % 5 !== 0;\n this.valueChanged.emit({ value: totalMinutes, name: this.name });\n this.isInternalsAvailable && 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\n if (minutes === 0) {\n number = 0;\n period = 'minute';\n } else if (minutes >= minutesInMonth && minutes % minutesInMonth === 0) {\n number = Math.floor(minutes / minutesInMonth);\n period = 'month';\n } else if (minutes >= minutesInWeek && minutes % minutesInWeek === 0) {\n number = Math.floor(minutes / minutesInWeek);\n period = 'week';\n } else if (minutes >= minutesInDay && minutes % minutesInDay === 0) {\n number = Math.floor(minutes / minutesInDay);\n period = 'day';\n } else if (minutes >= minutesInHour && minutes % minutesInHour === 0) {\n number = Math.floor(minutes / minutesInHour);\n period = 'hour';\n } else {\n number = minutes;\n period = 'minute';\n }\n\n this.selectedNumber = number;\n this.selectedPeriod = period;\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' && typeof this.internals.setValidity === 'function';\n }\n\n @RegisterComponent<NylasReminderTime, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-reminder-time',\n stateToProps: new Map([['schedulerConfig.selectedLanguage', 'selectedLanguage']]),\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-reminder-time\" part=\"nrt\">\n <div class=\"nylas-reminder-time__wrapper\">\n {showTimePeriodSelector && (\n <time-period-selector\n id=\"limit-future-bookings\"\n part=\"nrt__time-period-selector\"\n hasError={this.errorState}\n timePeriods={[\n { value: 'minute', label: i18next.t('timeDuration', { context: 'minute' }) },\n { value: 'hour', label: i18next.t('timeDuration', { context: 'hour' }) },\n { value: 'day', label: i18next.t('timePeriod', { context: 'day' }) },\n ]}\n exportparts=\"tps__number-dropdown: nrt__number-dropdown, tps__number-dropdown-button: nrt__number-dropdown-button, tps__number-dropdown-content: nrt__number-dropdown-content, tps__period-dropdown: nrt__period-dropdown, tps__period-dropdown-button: nrt__period-dropdown-button, tps__period-dropdown-content: nrt__period-dropdown-content\"\n defaultSelectedNumber={this.selectedNumber}\n defaultSelectedPeriod={this.selectedPeriod}\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: '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"],"mappings":"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"}
|