@nylas/web-elements 2.0.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/dist/cdn/nylas-scheduler-editor/nylas-scheduler-editor.es.js +191 -95
  2. package/dist/cdn/nylas-scheduling/nylas-scheduling.es.js +10418 -10260
  3. package/dist/cjs/{abstract-provider-ca4f7e4f.js → abstract-provider-f84a6735.js} +2 -2
  4. package/dist/cjs/{abstract-provider-ca4f7e4f.js.map → abstract-provider-f84a6735.js.map} +1 -1
  5. package/dist/cjs/calendar-agenda-fill-icon_36.cjs.entry.js +36 -21
  6. package/dist/cjs/calendar-agenda-fill-icon_36.cjs.entry.js.map +1 -1
  7. package/dist/cjs/{calendar-check-icon_2.cjs.entry.js → calendar-check-icon.cjs.entry.js} +3 -19
  8. package/dist/cjs/calendar-check-icon.cjs.entry.js.map +1 -0
  9. package/dist/cjs/checkbox-component_2.cjs.entry.js +1 -1
  10. package/dist/cjs/checkbox-group_4.cjs.entry.js +3 -3
  11. package/dist/cjs/checkmark-circle-icon.cjs.entry.js +24 -0
  12. package/dist/cjs/checkmark-circle-icon.cjs.entry.js.map +1 -0
  13. package/dist/cjs/checkmark-icon_15.cjs.entry.js +11 -7
  14. package/dist/cjs/checkmark-icon_15.cjs.entry.js.map +1 -1
  15. package/dist/cjs/{customParseFormat-bb3a23c5.js → customParseFormat-95790293.js} +2 -2
  16. package/dist/cjs/{customParseFormat-bb3a23c5.js.map → customParseFormat-95790293.js.map} +1 -1
  17. package/dist/cjs/{feedbackSync-1c5ec9aa.js → feedbackSync-4ed99749.js} +2 -2
  18. package/dist/cjs/{feedbackSync-1c5ec9aa.js.map → feedbackSync-4ed99749.js.map} +1 -1
  19. package/dist/cjs/globe-icon_2.cjs.entry.js +2 -2
  20. package/dist/cjs/google-logo-icon_6.cjs.entry.js +8 -8
  21. package/dist/cjs/index-e07e3a7e.js +6 -2
  22. package/dist/cjs/index.cjs.js +2 -2
  23. package/dist/cjs/{index.es-c563f3ba.js → index.es-62161daa.js} +2 -2
  24. package/dist/cjs/{index.es-c563f3ba.js.map → index.es-62161daa.js.map} +1 -1
  25. package/dist/cjs/input-component.cjs.entry.js +1 -1
  26. package/dist/cjs/input-dropdown_2.cjs.entry.js +1 -1
  27. package/dist/cjs/loader.cjs.js +1 -1
  28. package/dist/cjs/multi-select-dropdown.cjs.entry.js +1 -1
  29. package/dist/cjs/{nylas-api-request-4d148ff1.js → nylas-api-request-03d7f604.js} +2 -2
  30. package/dist/cjs/{nylas-api-request-4d148ff1.js.map → nylas-api-request-03d7f604.js.map} +1 -1
  31. package/dist/cjs/nylas-booked-event-card_11.cjs.entry.js +82 -25
  32. package/dist/cjs/nylas-booked-event-card_11.cjs.entry.js.map +1 -1
  33. package/dist/cjs/nylas-form-card.cjs.entry.js +2 -2
  34. package/dist/cjs/nylas-notification_2.cjs.entry.js +1 -1
  35. package/dist/cjs/nylas-scheduler-editor.cjs.entry.js +6 -6
  36. package/dist/cjs/nylas-scheduling.cjs.entry.js +42 -14
  37. package/dist/cjs/nylas-scheduling.cjs.entry.js.map +1 -1
  38. package/dist/cjs/nylas-web-elements.cjs.js +1 -1
  39. package/dist/cjs/{register-component-70744713.js → register-component-f4ad9751.js} +2 -2
  40. package/dist/cjs/{register-component-70744713.js.map → register-component-f4ad9751.js.map} +1 -1
  41. package/dist/cjs/textarea-component.cjs.entry.js +1 -1
  42. package/dist/cjs/{utils-dd3b6f4c.js → utils-03b13826.js} +154 -55
  43. package/dist/cjs/utils-03b13826.js.map +1 -0
  44. package/dist/collection/components/scheduler/nylas-booked-event-card/nylas-booked-event-card.js +11 -3
  45. package/dist/collection/components/scheduler/nylas-booked-event-card/nylas-booked-event-card.js.map +1 -1
  46. package/dist/collection/components/scheduler/nylas-booking-form/nylas-booking-form.js +49 -4
  47. package/dist/collection/components/scheduler/nylas-booking-form/nylas-booking-form.js.map +1 -1
  48. package/dist/collection/components/scheduler/nylas-booking-form/test/nylas-booking-form.spec.js +3 -3
  49. package/dist/collection/components/scheduler/nylas-booking-form/test/nylas-booking-form.spec.js.map +1 -1
  50. package/dist/collection/components/scheduler/nylas-cancel-booking-form/nylas-cancel-booking-form.js +37 -1
  51. package/dist/collection/components/scheduler/nylas-cancel-booking-form/nylas-cancel-booking-form.js.map +1 -1
  52. package/dist/collection/components/scheduler/nylas-cancelled-event-card/nylas-cancelled-event-card.js +34 -2
  53. package/dist/collection/components/scheduler/nylas-cancelled-event-card/nylas-cancelled-event-card.js.map +1 -1
  54. package/dist/collection/components/scheduler/nylas-confirmed-event-card/nylas-confirmed-event-card.css +1 -1
  55. package/dist/collection/components/scheduler/nylas-confirmed-event-card/nylas-confirmed-event-card.js +34 -1
  56. package/dist/collection/components/scheduler/nylas-confirmed-event-card/nylas-confirmed-event-card.js.map +1 -1
  57. package/dist/collection/components/scheduler/nylas-date-picker/nylas-date-picker.js +10 -4
  58. package/dist/collection/components/scheduler/nylas-date-picker/nylas-date-picker.js.map +1 -1
  59. package/dist/collection/components/scheduler/nylas-organizer-confirmation-card/nylas-organizer-confirmation-card.js +10 -2
  60. package/dist/collection/components/scheduler/nylas-organizer-confirmation-card/nylas-organizer-confirmation-card.js.map +1 -1
  61. package/dist/collection/components/scheduler/nylas-scheduling/nylas-scheduling.css +13 -0
  62. package/dist/collection/components/scheduler/nylas-scheduling/nylas-scheduling.js +66 -7
  63. package/dist/collection/components/scheduler/nylas-scheduling/nylas-scheduling.js.map +1 -1
  64. package/dist/collection/components/scheduler/nylas-scheduling/test/nylas-scheduling.spec.js +33 -0
  65. package/dist/collection/components/scheduler/nylas-scheduling/test/nylas-scheduling.spec.js.map +1 -1
  66. package/dist/collection/components/scheduler/nylas-selected-event-card/nylas-selected-event-card.js +20 -5
  67. package/dist/collection/components/scheduler/nylas-selected-event-card/nylas-selected-event-card.js.map +1 -1
  68. package/dist/collection/components/scheduler/nylas-timeslot-picker/nylas-timeslot-picker.js.map +1 -1
  69. package/dist/collection/components/scheduler-editor/nylas-additional-participants/nylas-additional-participants.js +12 -6
  70. package/dist/collection/components/scheduler-editor/nylas-additional-participants/nylas-additional-participants.js.map +1 -1
  71. package/dist/collection/components/scheduler-editor/nylas-booking-confirmation-redirect/nylas-booking-confirmation-redirect.js +12 -6
  72. package/dist/collection/components/scheduler-editor/nylas-booking-confirmation-redirect/nylas-booking-confirmation-redirect.js.map +1 -1
  73. package/dist/collection/components/scheduler-editor/nylas-confirmation-email/nylas-confirmation-email.js +6 -3
  74. package/dist/collection/components/scheduler-editor/nylas-confirmation-email/nylas-confirmation-email.js.map +1 -1
  75. package/dist/collection/components/scheduler-editor/nylas-custom-event-slug/nylas-custom-event-slug.js +14 -8
  76. package/dist/collection/components/scheduler-editor/nylas-custom-event-slug/nylas-custom-event-slug.js.map +1 -1
  77. package/dist/collection/components/scheduler-editor/nylas-reminder-emails/nylas-reminder-emails.js +8 -4
  78. package/dist/collection/components/scheduler-editor/nylas-reminder-emails/nylas-reminder-emails.js.map +1 -1
  79. package/dist/components/nylas-additional-participants2.js +12 -6
  80. package/dist/components/nylas-additional-participants2.js.map +1 -1
  81. package/dist/components/nylas-booked-event-card2.js +13 -6
  82. package/dist/components/nylas-booked-event-card2.js.map +1 -1
  83. package/dist/components/nylas-booking-confirmation-redirect2.js +12 -6
  84. package/dist/components/nylas-booking-confirmation-redirect2.js.map +1 -1
  85. package/dist/components/nylas-booking-form2.js +28 -6
  86. package/dist/components/nylas-booking-form2.js.map +1 -1
  87. package/dist/components/nylas-cancel-booking-form2.js +13 -3
  88. package/dist/components/nylas-cancel-booking-form2.js.map +1 -1
  89. package/dist/components/nylas-cancelled-event-card2.js +12 -3
  90. package/dist/components/nylas-cancelled-event-card2.js.map +1 -1
  91. package/dist/components/nylas-confirmation-email2.js +6 -3
  92. package/dist/components/nylas-confirmation-email2.js.map +1 -1
  93. package/dist/components/nylas-confirmed-event-card2.js +18 -8
  94. package/dist/components/nylas-confirmed-event-card2.js.map +1 -1
  95. package/dist/components/nylas-custom-event-slug2.js +15 -9
  96. package/dist/components/nylas-custom-event-slug2.js.map +1 -1
  97. package/dist/components/nylas-date-picker2.js +1 -1
  98. package/dist/components/nylas-date-picker2.js.map +1 -1
  99. package/dist/components/nylas-editor-tabs-group2.js +2 -2
  100. package/dist/components/nylas-editor-tabs2.js +2 -2
  101. package/dist/components/nylas-organizer-confirmation-card2.js +12 -5
  102. package/dist/components/nylas-organizer-confirmation-card2.js.map +1 -1
  103. package/dist/components/nylas-reminder-emails2.js +8 -4
  104. package/dist/components/nylas-reminder-emails2.js.map +1 -1
  105. package/dist/components/nylas-scheduler-editor.js +2 -2
  106. package/dist/components/nylas-scheduling.js +42 -12
  107. package/dist/components/nylas-scheduling.js.map +1 -1
  108. package/dist/components/nylas-selected-event-card2.js +12 -5
  109. package/dist/components/nylas-selected-event-card2.js.map +1 -1
  110. package/dist/components/nylas-timeslot-picker2.js.map +1 -1
  111. package/dist/components/utils.js +153 -54
  112. package/dist/components/utils.js.map +1 -1
  113. package/dist/esm/{abstract-provider-efe136bd.js → abstract-provider-bdb7d9b4.js} +2 -2
  114. package/dist/esm/{abstract-provider-efe136bd.js.map → abstract-provider-bdb7d9b4.js.map} +1 -1
  115. package/dist/esm/calendar-agenda-fill-icon_36.entry.js +36 -21
  116. package/dist/esm/calendar-agenda-fill-icon_36.entry.js.map +1 -1
  117. package/dist/esm/{calendar-check-icon_2.entry.js → calendar-check-icon.entry.js} +4 -19
  118. package/dist/esm/calendar-check-icon.entry.js.map +1 -0
  119. package/dist/esm/checkbox-component_2.entry.js +1 -1
  120. package/dist/esm/checkbox-group_4.entry.js +3 -3
  121. package/dist/esm/checkmark-circle-icon.entry.js +20 -0
  122. package/dist/esm/checkmark-circle-icon.entry.js.map +1 -0
  123. package/dist/esm/checkmark-icon_15.entry.js +11 -7
  124. package/dist/esm/checkmark-icon_15.entry.js.map +1 -1
  125. package/dist/esm/{customParseFormat-edc38d83.js → customParseFormat-f0d21eb3.js} +2 -2
  126. package/dist/esm/{customParseFormat-edc38d83.js.map → customParseFormat-f0d21eb3.js.map} +1 -1
  127. package/dist/esm/{feedbackSync-e4378c0b.js → feedbackSync-b9c9e719.js} +2 -2
  128. package/dist/esm/{feedbackSync-e4378c0b.js.map → feedbackSync-b9c9e719.js.map} +1 -1
  129. package/dist/esm/globe-icon_2.entry.js +2 -2
  130. package/dist/esm/google-logo-icon_6.entry.js +8 -8
  131. package/dist/esm/index-091600eb.js +6 -2
  132. package/dist/esm/{index.es-6a9d55cf.js → index.es-ccb2a286.js} +2 -2
  133. package/dist/esm/{index.es-6a9d55cf.js.map → index.es-ccb2a286.js.map} +1 -1
  134. package/dist/esm/index.js +2 -2
  135. package/dist/esm/input-component.entry.js +1 -1
  136. package/dist/esm/input-dropdown_2.entry.js +1 -1
  137. package/dist/esm/loader.js +1 -1
  138. package/dist/esm/multi-select-dropdown.entry.js +1 -1
  139. package/dist/esm/{nylas-api-request-f2e4e9b6.js → nylas-api-request-7d702661.js} +2 -2
  140. package/dist/esm/{nylas-api-request-f2e4e9b6.js.map → nylas-api-request-7d702661.js.map} +1 -1
  141. package/dist/esm/nylas-booked-event-card_11.entry.js +82 -25
  142. package/dist/esm/nylas-booked-event-card_11.entry.js.map +1 -1
  143. package/dist/esm/nylas-form-card.entry.js +2 -2
  144. package/dist/esm/nylas-notification_2.entry.js +1 -1
  145. package/dist/esm/nylas-scheduler-editor.entry.js +6 -6
  146. package/dist/esm/nylas-scheduling.entry.js +43 -15
  147. package/dist/esm/nylas-scheduling.entry.js.map +1 -1
  148. package/dist/esm/nylas-web-elements.js +1 -1
  149. package/dist/esm/{register-component-a1c3d7b4.js → register-component-9d4ceee5.js} +2 -2
  150. package/dist/esm/{register-component-a1c3d7b4.js.map → register-component-9d4ceee5.js.map} +1 -1
  151. package/dist/esm/textarea-component.entry.js +1 -1
  152. package/dist/esm/{utils-b7f9cbcc.js → utils-fb8a9ce4.js} +154 -55
  153. package/dist/esm/utils-fb8a9ce4.js.map +1 -0
  154. package/dist/nylas-web-elements/index.esm.js +1 -1
  155. package/dist/nylas-web-elements/nylas-web-elements.esm.js +1 -1
  156. package/dist/nylas-web-elements/nylas-web-elements.esm.js.map +1 -1
  157. package/dist/nylas-web-elements/{p-3ce8e281.js → p-094be30f.js} +2 -2
  158. package/dist/nylas-web-elements/p-18c58ea1.entry.js +2 -0
  159. package/dist/nylas-web-elements/p-18c58ea1.entry.js.map +1 -0
  160. package/dist/nylas-web-elements/{p-c12c18b2.entry.js → p-1dbaf879.entry.js} +2 -2
  161. package/dist/nylas-web-elements/p-2830522f.entry.js +2 -0
  162. package/dist/nylas-web-elements/p-2830522f.entry.js.map +1 -0
  163. package/dist/nylas-web-elements/{p-35297f33.entry.js → p-3b56d656.entry.js} +2 -2
  164. package/dist/nylas-web-elements/{p-8e7882a1.js → p-3c8b7ba1.js} +2 -2
  165. package/dist/nylas-web-elements/{p-3204882f.entry.js → p-3f5e1e6b.entry.js} +2 -2
  166. package/dist/nylas-web-elements/{p-5aae729f.js → p-4c1fafb4.js} +2 -2
  167. package/dist/nylas-web-elements/p-522270a2.entry.js +2 -0
  168. package/dist/nylas-web-elements/p-522270a2.entry.js.map +1 -0
  169. package/dist/nylas-web-elements/p-67e936ce.entry.js +2 -0
  170. package/dist/nylas-web-elements/p-67e936ce.entry.js.map +1 -0
  171. package/dist/nylas-web-elements/{p-9e11eb2c.js → p-6d8e2c6b.js} +2 -2
  172. package/dist/nylas-web-elements/{p-3362cf82.entry.js → p-8f82f281.entry.js} +2 -2
  173. package/dist/nylas-web-elements/p-920812bd.entry.js +8 -0
  174. package/dist/nylas-web-elements/p-920812bd.entry.js.map +1 -0
  175. package/dist/nylas-web-elements/{p-b40f7a77.entry.js → p-a42f41f7.entry.js} +2 -2
  176. package/dist/nylas-web-elements/{p-8340d845.entry.js → p-aad611b4.entry.js} +2 -2
  177. package/dist/nylas-web-elements/{p-6e56eb3f.js → p-ab88518b.js} +2 -2
  178. package/dist/nylas-web-elements/{p-5cf6301e.entry.js → p-b3500bf1.entry.js} +2 -2
  179. package/dist/nylas-web-elements/{p-4d8f9740.entry.js → p-b6d863e0.entry.js} +2 -2
  180. package/dist/nylas-web-elements/{p-50c255fa.entry.js → p-b8cf836f.entry.js} +2 -2
  181. package/dist/nylas-web-elements/{p-996c827d.entry.js → p-bf37be06.entry.js} +2 -2
  182. package/dist/nylas-web-elements/p-de4b01ac.entry.js +2 -0
  183. package/dist/nylas-web-elements/p-de4b01ac.entry.js.map +1 -0
  184. package/dist/nylas-web-elements/{p-308e7adb.entry.js → p-f42e87c6.entry.js} +3 -3
  185. package/dist/nylas-web-elements/{p-dea32251.js → p-f4825eb1.js} +2 -2
  186. package/dist/nylas-web-elements/p-faa30369.js +14 -0
  187. package/dist/nylas-web-elements/{p-59e4ab2d.js.map → p-faa30369.js.map} +1 -1
  188. package/dist/types/components/scheduler/nylas-booked-event-card/nylas-booked-event-card.d.ts +2 -0
  189. package/dist/types/components/scheduler/nylas-booking-form/nylas-booking-form.d.ts +7 -0
  190. package/dist/types/components/scheduler/nylas-cancel-booking-form/nylas-cancel-booking-form.d.ts +3 -0
  191. package/dist/types/components/scheduler/nylas-cancelled-event-card/nylas-cancelled-event-card.d.ts +3 -1
  192. package/dist/types/components/scheduler/nylas-confirmed-event-card/nylas-confirmed-event-card.d.ts +3 -1
  193. package/dist/types/components/scheduler/nylas-date-picker/nylas-date-picker.d.ts +2 -1
  194. package/dist/types/components/scheduler/nylas-organizer-confirmation-card/nylas-organizer-confirmation-card.d.ts +2 -0
  195. package/dist/types/components/scheduler/nylas-scheduling/nylas-scheduling.d.ts +6 -0
  196. package/dist/types/components/scheduler/nylas-selected-event-card/nylas-selected-event-card.d.ts +3 -1
  197. package/dist/types/components/scheduler/nylas-timeslot-picker/nylas-timeslot-picker.d.ts +2 -1
  198. package/dist/types/components/scheduler-editor/nylas-additional-participants/nylas-additional-participants.d.ts +2 -0
  199. package/dist/types/components/scheduler-editor/nylas-booking-confirmation-redirect/nylas-booking-confirmation-redirect.d.ts +2 -0
  200. package/dist/types/components/scheduler-editor/nylas-custom-event-slug/nylas-custom-event-slug.d.ts +2 -0
  201. package/dist/types/components.d.ts +46 -6
  202. package/package.json +1 -1
  203. package/dist/cjs/calendar-check-icon_2.cjs.entry.js.map +0 -1
  204. package/dist/cjs/utils-dd3b6f4c.js.map +0 -1
  205. package/dist/esm/calendar-check-icon_2.entry.js.map +0 -1
  206. package/dist/esm/utils-b7f9cbcc.js.map +0 -1
  207. package/dist/nylas-web-elements/p-2b52b854.entry.js +0 -2
  208. package/dist/nylas-web-elements/p-2b52b854.entry.js.map +0 -1
  209. package/dist/nylas-web-elements/p-59e4ab2d.js +0 -14
  210. package/dist/nylas-web-elements/p-8a3965ba.entry.js +0 -2
  211. package/dist/nylas-web-elements/p-8a3965ba.entry.js.map +0 -1
  212. package/dist/nylas-web-elements/p-97128be4.entry.js +0 -8
  213. package/dist/nylas-web-elements/p-97128be4.entry.js.map +0 -1
  214. package/dist/nylas-web-elements/p-d69f9d47.entry.js +0 -2
  215. package/dist/nylas-web-elements/p-d69f9d47.entry.js.map +0 -1
  216. package/dist/nylas-web-elements/p-dcc8ca35.entry.js +0 -2
  217. package/dist/nylas-web-elements/p-dcc8ca35.entry.js.map +0 -1
  218. /package/dist/nylas-web-elements/{p-3ce8e281.js.map → p-094be30f.js.map} +0 -0
  219. /package/dist/nylas-web-elements/{p-c12c18b2.entry.js.map → p-1dbaf879.entry.js.map} +0 -0
  220. /package/dist/nylas-web-elements/{p-35297f33.entry.js.map → p-3b56d656.entry.js.map} +0 -0
  221. /package/dist/nylas-web-elements/{p-8e7882a1.js.map → p-3c8b7ba1.js.map} +0 -0
  222. /package/dist/nylas-web-elements/{p-3204882f.entry.js.map → p-3f5e1e6b.entry.js.map} +0 -0
  223. /package/dist/nylas-web-elements/{p-5aae729f.js.map → p-4c1fafb4.js.map} +0 -0
  224. /package/dist/nylas-web-elements/{p-9e11eb2c.js.map → p-6d8e2c6b.js.map} +0 -0
  225. /package/dist/nylas-web-elements/{p-3362cf82.entry.js.map → p-8f82f281.entry.js.map} +0 -0
  226. /package/dist/nylas-web-elements/{p-b40f7a77.entry.js.map → p-a42f41f7.entry.js.map} +0 -0
  227. /package/dist/nylas-web-elements/{p-8340d845.entry.js.map → p-aad611b4.entry.js.map} +0 -0
  228. /package/dist/nylas-web-elements/{p-6e56eb3f.js.map → p-ab88518b.js.map} +0 -0
  229. /package/dist/nylas-web-elements/{p-5cf6301e.entry.js.map → p-b3500bf1.entry.js.map} +0 -0
  230. /package/dist/nylas-web-elements/{p-4d8f9740.entry.js.map → p-b6d863e0.entry.js.map} +0 -0
  231. /package/dist/nylas-web-elements/{p-50c255fa.entry.js.map → p-b8cf836f.entry.js.map} +0 -0
  232. /package/dist/nylas-web-elements/{p-996c827d.entry.js.map → p-bf37be06.entry.js.map} +0 -0
  233. /package/dist/nylas-web-elements/{p-308e7adb.entry.js.map → p-f42e87c6.entry.js.map} +0 -0
  234. /package/dist/nylas-web-elements/{p-dea32251.js.map → p-f4825eb1.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"names":["iconCss","CalendarAgendaFillIconStyle0","CalendarAgendaFillIcon","render","h","key","width","this","height","fill","xmlns","d","CalendarAgendaIconStyle0","CalendarAgendaIcon","CalendarInfoIconStyle0","CalendarInfoIcon","CalendarPatternsIconStyle0","CalendarPatternsIcon","EnvelopeFillIconStyle0","EnvelopeFillIcon","viewBox","EnvelopeIconStyle0","EnvelopeIcon","FlowIconStyle0","FlowIcon","nylasAvailabilityPickerCss","NylasAvailabilityPickerStyle0","NylasAvailabilityPicker","Intl","DateTimeFormat","resolvedOptions","timeZone","SUN","MON","start","end","TUE","WED","THU","FRI","SAT","elementNameChangedHandler","newValue","debug","host","setAttribute","configChangedHandler","newConfig","defaultOpenHours","availability","availability_rules","default_open_hours","DEFAULT_OPEN_HOURS","defaultOpenHoursTimezone","event_booking","timezone","defaultTimezone","name","openHours","length","openHoursToSchedule","scheduleChanged","valueChanged","overlapDays","Object","keys","forEach","dayTimeRanges","overlaps","getOverlaps","element","shadowRoot","getElementById","isInternalsAvailable","internals","setValidity","customError","setFormValue","JSON","stringify","scheduleToOpenHours","schedule","emit","value","selectedLanguageChangedHandler","newVal","oldVal","i18next","changeLanguage","nylasFormDropdownChangedHandler","event","detail","updateValue","connectedCallback","disconnectedCallback","componentWillLoad","componentDidLoad","selectedConfiguration","timeRanges","timeRangesInMinutes","map","range","index","timeToMinutes","originalIndex","sort","a","b","i","includes","push","addTimeRange","day","currentTimeRanges","dayStart","dayEnd","lastRangeEnd","convertTo12HourFormat","minutesToTime","gapFound","currentEnd","nextStart","removeTimeRange","splice","setTime","dayIndex","timeType","split","setFormError","_","newSchedule","openHour","days","dayKey","getDayKey","start12hr","end12hr","timeRange","timeRangeExists","some","dayKeys","openHoursMap","Map","start24hr","convertTo24HourFormat","end24hr","has","set","entry","get","selectedOpenHours","_key","timezoneOptions","TIMEZONE_MAP","label","selectedTimezoneOption","find","Host","class","part","hideHeader","t","slot","searchPlaceholder","exportparts","options","defaultSelectedOption","type","id","checked","onClick","htmlFor","timeRangeIndex","startKey","endKey","hasError","time","language","selectedLanguage","minimumStartTime","__decorate","RegisterComponent","stateToProps","fireRegisterEvent","nylasBookingCalendarPickerCss","NylasBookingCalendarPickerStyle0","NylasBookingCalendarPicker","primaryCalendar","calendars","calendar","is_primary","firstCalendar","defaultBookingCalendar","toString","selectedCalendar","componentWillUpdate","componentDidUpdate","componentWillRender","componentDidRender","undefined","currentUserCalendarsChangedHandler","currentUserCalendars","currentUserCalendarOptions","optionsFromCalendars","calendarOptions","defaultOption","cal","withSearch","required","expressFlow","emptyValue","errorMessage","eventToProps","async","_nylasSchedulerConfigConnector","nylasBookingConfirmationRedirectCss","NylasBookingConfirmationRedirectStyle0","NylasBookingConfirmationRedirect","selectedConfigurationChangedHandler","scheduler","confirmation_redirect_url","currentRedirectUrl","acceptUrl","redirectUrl","componentLoaded","nylasFormInputBlurHandler","redirectUrlErrorMessage","isValidUrl","formSubmittedHandler","_event","redirectOptions","context","option","placeholder","defaultValue","nylasBookingConfirmationTypeCss","NylasBookingConfirmationTypeStyle0","NylasBookingConfirmationType","booking_type","selectedBookingType","showDropdown","organizer_confirmation_url","bookingType","showComponent","bookingOptions","ownKeys","object","enumerableOnly","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","apply","_objectSpread2","target","arguments","source","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_typeof","obj","Symbol","iterator","constructor","prototype","configurable","writable","_extends","assign","hasOwnProperty","call","_objectWithoutPropertiesLoose","excluded","sourceKeys","indexOf","_objectWithoutProperties","sourceSymbolKeys","propertyIsEnumerable","version","userAgent","pattern","window","navigator","match","IE11OrLess","Edge","FireFox","Safari","IOS","ChromeForAndroid","captureMode","capture","passive","on","el","fn","addEventListener","off","removeEventListener","matches","selector","substring","msMatchesSelector","webkitMatchesSelector","getParentOrHost","document","nodeType","parentNode","closest","ctx","includeCTX","R_SPACE","toggleClass","state","classList","className","replace","css","prop","val","style","defaultView","getComputedStyle","currentStyle","matrix","selfOnly","appliedTransforms","transform","matrixFn","DOMMatrix","WebKitCSSMatrix","CSSMatrix","MSCSSMatrix","tagName","list","getElementsByTagName","n","getWindowScrollingElement","scrollingElement","documentElement","getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","container","getBoundingClientRect","elRect","top","left","bottom","right","innerHeight","innerWidth","containerRect","parseInt","elMatrix","scaleX","scaleY","isScrolledPast","elSide","parentSide","parent","getParentAutoScrollElement","elSideVal","parentSideVal","visible","getChild","childNum","includeDragEl","currentChild","children","display","Sortable","ghost","dragged","draggable","lastChild","last","lastElementChild","previousElementSibling","nodeName","toUpperCase","clone","getRelativeScrollOffset","offsetLeft","offsetTop","winScroller","scrollLeft","scrollTop","indexOfObject","arr","Number","includeSelf","elem","gotSelf","clientWidth","scrollWidth","clientHeight","scrollHeight","elemCSS","overflowX","overflowY","body","extend","dst","src","isRectEqual","rect1","rect2","Math","round","_throttleTimeout","throttle","callback","ms","args","_this","setTimeout","cancelThrottle","clearTimeout","scrollBy","x","y","Polymer","$","jQuery","Zepto","dom","cloneNode","getChildContainingRectFromElement","ghostEl","rect","Array","from","child","_rect$left","_rect$top","_rect$right","_rect$bottom","animated","childRect","min","Infinity","max","expando","Date","getTime","AnimationStateManager","animationStates","animationCallbackId","captureAnimationState","animation","slice","fromRect","thisAnimationDuration","childMatrix","f","e","addAnimationState","removeAnimationState","animateAll","animating","animationTime","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","calculateRealTime","animate","animationResetTimer","currentRect","duration","translateX","translateY","animatingX","animatingY","forRepaintDummy","repaint","easing","offsetWidth","sqrt","pow","plugins","defaults","initializeByDefault","PluginManager","mount","plugin","p","pluginName","concat","pluginEvent","eventName","sortable","evt","eventCanceled","cancel","eventNameGlobal","initializePlugins","initialized","modified","modifyOption","getEventProperties","eventProperties","modifiedValue","optionListeners","dispatchEvent","_ref","rootEl","targetEl","cloneEl","toEl","fromEl","oldIndex","newIndex","oldDraggableIndex","newDraggableIndex","originalEvent","putSortable","extraEventProperties","onName","charAt","substr","CustomEvent","bubbles","cancelable","createEvent","initEvent","to","item","pullMode","lastPutMode","allEventProperties","_excluded","data","bind","dragEl","parentEl","nextEl","lastDownEl","cloneHidden","dragStarted","moved","activeSortable","active","hideGhostForTarget","_hideGhostForTarget","unhideGhostForTarget","_unhideGhostForTarget","cloneNowHidden","cloneNowShown","dispatchSortableEvent","_dispatchEvent","info","activeGroup","awaitingDragStarted","ignoreNextClick","sortables","tapEvt","touchEvt","lastDx","lastDy","tapDistanceLeft","tapDistanceTop","lastTarget","lastDirection","pastFirstInvertThresh","isCircumstantialInvert","targetMoveDistance","ghostRelativeParent","ghostRelativeParentInitialScroll","_silent","savedInputChecked","documentExists","PositionGhostAbsolutely","CSSFloatProperty","supportDraggable","createElement","supportCssPointerEvents","cssText","pointerEvents","_detectDirection","elCSS","elWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","marginLeft","marginRight","secondChildWidth","flexDirection","gridTemplateColumns","touchingSideChild2","clear","_dragElInRowColumn","dragRect","targetRect","vertical","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","_detectNearestEmptySortable","ret","threshold","emptyInsertThreshold","insideHorizontally","insideVertically","_prepareGroup","toFn","pull","sameGroup","group","otherGroup","join","originalGroup","checkPull","checkPut","put","revertClone","preventDefault","stopPropagation","stopImmediatePropagation","nearestEmptyInsertDetectEvent","touches","nearest","clientX","clientY","_onDragOver","_checkOutsideTargetEl","_isOutsideThisEl","disabled","store","handle","test","swapThreshold","invertSwap","invertedSwapThreshold","removeCloneOnHide","direction","ghostClass","chosenClass","dragClass","ignore","preventOnFilter","setData","dataTransfer","textContent","dropBubble","dragoverBubble","dataIdAttr","delay","delayOnTouchOnly","touchStartThreshold","devicePixelRatio","forceFallback","fallbackClass","fallbackOnBody","fallbackTolerance","fallbackOffset","supportPointer","nativeDraggable","_onTapStart","contains","_getDirection","touch","pointerType","originalTarget","path","composedPath","_saveInputCheckedState","button","isContentEditable","criteria","trim","_prepareDragStart","ownerDocument","dragStartFn","nextSibling","_lastX","_lastY","_onDrop","_disableDelayedDragEvents","_triggerDragStart","_disableDraggable","_disableDelayedDrag","_delayedDragTouchMoveHandler","_dragStartTimer","abs","floor","_onTouchMove","_onDragStart","selection","_nextTick","empty","getSelection","removeAllRanges","err","_dragStarted","fallback","_appendGhost","_nulling","_emulateDragOver","elementFromPoint","inserted","ghostMatrix","relativeScrollOffset","dx","dy","c","cssMatrix","appendChild","removeAttribute","_hideClone","cloneId","insertBefore","_loopId","setInterval","effectAllowed","_dragStartId","revert","isOwner","canSort","fromSortable","completedFired","dragOverEvent","extra","axis","completed","onMove","after","_onMove","changed","insertion","_showClone","_ignoreWhileAnimating","elLastChild","_ghostIsLast","_ghostIsFirst","firstChild","targetBeforeFirstSwap","differentLevel","differentRowCol","side1","scrolledPastTop","scrollBefore","_getSwapDirection","sibling","dragIndex","nextElementSibling","moveVector","_unsilent","_offMoveEvents","_offUpEvents","clearInterval","_cancelNextTick","removeChild","save","handleEvent","_globalDragOver","toArray","order","getAttribute","_generateId","useAnimation","items","closest$1","destroy","querySelectorAll","dropEffect","willInsertAfter","onMoveFn","retVal","draggedRect","related","relatedRect","firstElRect","childContainingRect","spacer","lastElRect","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","_getInsertDirection","str","href","sum","charCodeAt","root","inputs","idx","utils","is","nextTick","cancelNextTick","detectDirection","_len","create","autoScrolls","scrollEl","scrollRootEl","scrolling","lastAutoScrollX","lastAutoScrollY","touchEvt$1","pointerElemChangedInterval","AutoScrollPlugin","AutoScroll","scroll","forceAutoScrollFallback","scrollSensitivity","scrollSpeed","bubbleScroll","_handleAutoScroll","_handleFallbackAutoScroll","dragOverCompleted","_ref2","dragOverBubble","drop","clearPointerElemChangedInterval","clearAutoScrolls","nulling","autoScroll","ogElemScroller","newElem","pid","isFallback","sens","speed","scrollThisInstance","scrollCustomFn","scrollFn","layersOut","currentParent","canScrollX","canScrollY","scrollPosX","scrollPosY","vx","vy","layer","scrollOffsetY","scrollOffsetX","toSortable","changedTouches","onSpill","Revert","startIndex","dragStart","_ref3","Remove","_ref4","parentSortable","nylasBookingFormConfigCss","NylasBookingFormConfigStyle0","fieldTypesWithOptions","fieldTypesWithMultipleOptions","NylasBookingFormConfig","typeLabel","readonly","isOpen","fieldLabelKey","DEFAULT_FORM_FIELD_TYPES","updateFormFields","fieldTypes","formFields","formFieldsChangedHandler","config","watchFields","title","description","additionalFields","entries","additional_fields","field","_i","fieldType","FIELD_TYPES","swap","swapClass","onEnd","swapFields","sortedFields","default","addFieldsMap","reduce","acc","findNextMissingNumber","numbers","parts","lastPart","pop","parsedNumber","isNaN","num","maxOrder","existingFieldKeys","next","newField","fieldIndex","fieldDefaultValueChanged","selectedOptionsChangedHandler","nylasFormInputChangedHandler","startsWith","optionIndex","fieldOptionChange","fieldLabelChange","valueChangedHandler","updatedFields","draggedItem","fieldToggle","staticFieldToggle","staticFields","fieldRemove","fieldRequired","ind","fieldOptionAdd","fieldOptionRemove","o","withChevron","dropdownButtonText","readOnly","error","selectAtLeastOneOptionLabel","multipleOptionsSelectedLabel","j","nylasBufferTimeCss","NylasBufferTimeStyle0","NylasBufferTime","buffer","before","selectedBeforeBufferTime","selectedAfterBufferTime","updateFormValue","bufferTime","renderPreview","totalSlots","slotHeight","eventSlotHeight","slotFill","minutes","fullSlots","partialFillHeight","createBeforeSlots","isActive","isPartial","slotStyle","backgroundColor","background","createAfterSlots","minuteOptions","nylasCalendarPickerCss","NylasCalendarPickerStyle0","NylasCalendarPicker","defaultSelectedCalendars","selectedCalendars","selected","currentUser","email","nylasCancellationPolicyCss","NylasCancellationPolicyStyle0","NylasCancellationPolicy","message","cancellation_policy","cancellationPolicy","handleChange","sanitize","maxlength","onInput","nylasConfirmationEmailCss","NylasConfirmationEmailStyle0","NylasConfirmationEmail","participants","confirmationEmail","confirmationEmailTemplate","show_nylas_branding","nylasBranding","isConfirmationEmailOpen","participantsState","email_template","reminders","nylasBrandingChangedHandler","invalidImageErrorMessage","nylasFormInputChangeHandler","booking_confirmed","handleEmailBodyChange","logo","nylasFormInputImageUrlInvalidHandler","nyalsFormSwitchToggledHandler","updateConfirmationFormValue","toggleConfirmationEmail","organizer","is_organizer","organizerName","variant","clickHandler","imageUrl","maxLength","tooltip","nylasConnectedCalendarsCss","NylasConnectedCalendarsStyle0","NylasConnectedCalendars","setParticipants","calendarsChangedHandler","participantCalendars","getParticipantCalendarOptions","participantOptions","setInternalFormValue","participantsChangedHandler","participantOptionsChangedHandler","addedParticipants","availableParticipantOptions","participant","isRoundRobinConfig","availability_method","availableParticipant","remainingParticipants","participantOption","participantDefaultSelectedCalendars","calendar_ids","calendarId","handleValueChanged","connectedCalendarsFormRef","checkValidity","participantsCalendars","selectedParticipants","ref","participantName","nylasCustomBookingFlowCss","NylasCustomBookingFlowStyle0","NylasCustomBookingFlow","checkForMissingSlots","nylasCustomEventSlugCss","NylasCustomEventSlugStyle0","NylasCustomEventSlug","console","log","urlSlug","defaultUrlSlug","slug","nylasFormInputFocusHandler","focus","slugErrorMessage","requiresSlug","toggleDrawer","copyToClipboard","clipboard","writeText","copied","isComponentReady","icon","nylasCustomizeBookingSettingsCss","NylasCustomizeBookingSettingsStyle0","NylasCustomizeBookingSettings","hide_additional_guests","hide_cancellation_options","hide_rescheduling_options","allowGuestsToInvite","hideCancellationOptions","hideReschedulingOptions","handleSettingValues","defaultHideAdditionalGuests","defaultHideCancellationOptions","defaultHideReschedulingOptions","checkboxToggledHandler","additionalGuestsHidden","showSettings","showHideAdditionalGuests","interpolation","escapeValue","escape","s","useRawValueToEscape","nylasDisableEmailsCss","NylasDisableEmailsStyle0","NylasDisableEmails","lang","organizer_locale","organizerLocale","isGroupConfig","group_booking","disableEmails","disable_emails","handleSettingValue","LANGUAGE_CODE","languageOptions","LANGUAGE_MAP","nylasEventDurationCss","NylasEventDurationStyle0","NylasEventDuration","eventDurationMinutes","configDuration","duration_minutes","durationMinutes","durationIncrement","validateDuration","setDurationMintueOptions","durationMinutesOptions","inputOptionChangedHandler","parseFloat","durationOptions","inputValue","defaultInputOption","pluralizedLabel","nylasEventLimitsCss","NylasEventLimitsStyle0","NylasEventLimits","nylasLimitFutureBookingsCss","NylasLimitFutureBookingsStyle0","NylasLimitFutureBookings","daysInFuture","available_days_in_future","availableDaysInFuture","updateNumberAndPeriodFromDays","timePeriodChangedHandler","number","period","selectedNumber","selectedPeriod","showTImePeriodSelector","timePeriods","defaultSelectedNumber","defaultSelectedPeriod","nylasMinBookingNoticeCss","NylasMinBookingNoticeStyle0","NylasMinBookingNotice","minBookingNotice","min_booking_notice","updateNumberAndPeriodFromMinutes","totalMinutes","minutesInHour","minutesInDay","minutesInWeek","minutesInMonth","showTimePeriodSelector","nylasMinCancellationNoticeCss","NylasMinCancellationNoticeStyle0","NylasMinCancellationNotice","minCancellationNotice","min_cancellation_notice","nylasPageNameCss","NylasPageNameStyle0","NylasPageName","currentPageName","pageName","requirePageName","pageNameErrorMessage","showToggle","nylasPageStylingCss","NylasPageStylingStyle0","NylasPageStyling","customInputsSlotChangedHandler","appearance","currentAppearance","updateInputDefaultValues","hasAttribute","componentType","selectedOption","parse","childNodes","Node","ELEMENT_NODE","cloneAndCopyProps","clonedElement","parsedOptions","clonedChild","TEXT_NODE","editor","querySelector","slotElement","divElement","slottedElements","assignedElements","flatten","bodyElement","slotContainer","innerHTML","customInputsSlot","checkIfElementIsInSlot","findElement","submit_button_label","thank_you_message","color","radioChangedHandler","subsection","hide","nylasParticipantBookingCalendarsCss","NylasParticipantBookingCalendarsStyle0","NylasParticipantBookingCalendars","showAdditionalParticipantBookingCalendars","participantDefaultSelectedCalendar","booking","calendar_id","bookingCalendarsFormRef","nylasParticipantsCustomAvailabilityCss","NylasParticipantsCustomAvailabilityStyle0","NylasParticipantsCustomAvailability","oldValue","nylasFormSwitchToggledHandler","existingParticipant","existingOpenHours","open_hours","at","participantFormRef","jsonValue","participantOpenHours","setCustom","Boolean","nylasReminderEmailsCss","NylasReminderEmailsStyle0","NylasReminderEmails","eventReminders","updateRemindersFormValue","configuration","groupConfiguration","remainder","reminderErrors","suggestion","reminderIndex","updatedReminders","minutes_before_event","handleNylasFormDropdownChanged","recipient","handleNylasFormInputChanged","email_subject","addReminder","editing","deleteReminder","reminder","rem","formatReminderTime","reminderTime","toFixed","recipientOptions","eventReminderTimeMinutes","_e","nylasSuggestReminderMinutes","nylasSchedulingMethodCss","NylasSchedulingMethodStyle0","NylasSchedulingMethod","_oldVal","bookingTypeOptions","defaultBookingType","hasAdditionalParticipants","showSubTitle","localPropsToProp","nylasTimeslotIntervalCss","NylasTimeslotIntervalStyle0","defaultRoundToMinutes","NylasTimeslotInterval","internalEventDurationMinutes","internalIntervalMinutes","interval_minutes","selectedInterval","roundToMinutes","round_to","selectedRoundTo","interval","roundTo","nylasFormRadioChangedHandler","intervalPreferenceOptions","defaultSelectedInterval","op","defaultSelectedValue","PaintbrushFillIconStyle0","PaintbrushFillIcon","PaintbrushIconStyle0","PaintbrushIcon","PeopleIconStyle0","PeopleIcon"],"sources":["src/common/icons/icon.css?tag=calendar-agenda-fill-icon&encapsulation=scoped","src/common/icons/calendar-agenda-fill.tsx","src/common/icons/icon.css?tag=calendar-agenda-icon&encapsulation=scoped","src/common/icons/calendar-agenda.tsx","src/common/icons/icon.css?tag=calendar-info-icon&encapsulation=scoped","src/common/icons/calendar-info.tsx","src/common/icons/icon.css?tag=calendar-patterns-icon&encapsulation=scoped","src/common/icons/calendar-patterns.tsx","src/common/icons/icon.css?tag=envelope-fill-icon&encapsulation=scoped","src/common/icons/envelope-fill.tsx","src/common/icons/icon.css?tag=envelope-icon&encapsulation=scoped","src/common/icons/envelope.tsx","src/common/icons/icon.css?tag=flow-icon&encapsulation=scoped","src/common/icons/flow.tsx","src/components/scheduler-editor/nylas-availability-picker/nylas-availability-picker.scss?tag=nylas-availability-picker&encapsulation=shadow","src/components/scheduler-editor/nylas-availability-picker/nylas-availability-picker.tsx","src/components/scheduler-editor/nylas-booking-calendar-picker/nylas-booking-calendar-picker.scss?tag=nylas-booking-calendar-picker&encapsulation=shadow","src/components/scheduler-editor/nylas-booking-calendar-picker/nylas-booking-calendar-picker.tsx","src/components/scheduler-editor/nylas-booking-confirmation-redirect/nylas-booking-confirmation-redirect.scss?tag=nylas-booking-confirmation-redirect&encapsulation=shadow","src/components/scheduler-editor/nylas-booking-confirmation-redirect/nylas-booking-confirmation-redirect.tsx","src/components/scheduler-editor/nylas-booking-confirmation-type/nylas-booking-confirmation-type.scss?tag=nylas-booking-confirmation-type&encapsulation=shadow","src/components/scheduler-editor/nylas-booking-confirmation-type/nylas-booking-confirmation-type.tsx","../../node_modules/.pnpm/sortablejs@1.15.6/node_modules/sortablejs/modular/sortable.esm.js","src/components/scheduler-editor/nylas-booking-form-config/nylas-booking-form-config.scss?tag=nylas-booking-form-config&encapsulation=shadow","src/components/scheduler-editor/nylas-booking-form-config/nylas-booking-form-config.tsx","src/components/scheduler-editor/nylas-buffer-time/nylas-buffer-time.scss?tag=nylas-buffer-time&encapsulation=shadow","src/components/scheduler-editor/nylas-buffer-time/nylas-buffer-time.tsx","src/components/scheduler-editor/nylas-calendar-picker/nylas-calendar-picker.scss?tag=nylas-calendar-picker&encapsulation=shadow","src/components/scheduler-editor/nylas-calendar-picker/nylas-calendar-picker.tsx","src/components/scheduler-editor/nylas-cancellation-policy/nylas-cancellation-policy.scss?tag=nylas-cancellation-policy&encapsulation=shadow","src/components/scheduler-editor/nylas-cancellation-policy/nylas-cancellation-policy.tsx","src/components/scheduler-editor/nylas-confirmation-email/nylas-confirmation-email.scss?tag=nylas-confirmation-email&encapsulation=shadow","src/components/scheduler-editor/nylas-confirmation-email/nylas-confirmation-email.tsx","src/components/scheduler-editor/nylas-connected-calendars/nylas-connected-calendars.scss?tag=nylas-connected-calendars&encapsulation=shadow","src/components/scheduler-editor/nylas-connected-calendars/nylas-connected-calendars.tsx","src/components/scheduler-editor/nylas-custom-booking-flow/nylas-custom-booking-flow.scss?tag=nylas-custom-booking-flow&encapsulation=shadow","src/components/scheduler-editor/nylas-custom-booking-flow/nylas-custom-booking-flow.tsx","src/components/scheduler-editor/nylas-custom-event-slug/nylas-custom-event-slug.scss?tag=nylas-custom-event-slug&encapsulation=shadow","src/components/scheduler-editor/nylas-custom-event-slug/nylas-custom-event-slug.tsx","src/components/scheduler-editor/nylas-customize-booking-settings/nylas-customize-booking-settings.scss?tag=nylas-customize-booking-settings&encapsulation=shadow","src/components/scheduler-editor/nylas-customize-booking-settings/nylas-customize-booking-settings.tsx","src/components/scheduler-editor/nylas-disable-emails/nylas-disable-emails.scss?tag=nylas-disable-emails&encapsulation=shadow","src/components/scheduler-editor/nylas-disable-emails/nylas-disable-emails.tsx","src/components/scheduler-editor/nylas-event-duration/nylas-event-duration.scss?tag=nylas-event-duration&encapsulation=shadow","src/components/scheduler-editor/nylas-event-duration/nylas-event-duration.tsx","src/components/scheduler-editor/nylas-event-limits/nylas-event-limits.scss?tag=nylas-event-limits&encapsulation=shadow","src/components/scheduler-editor/nylas-event-limits/nylas-event-limits.tsx","src/components/scheduler-editor/nylas-limit-future-bookings/nylas-limit-future-bookings.scss?tag=nylas-limit-future-bookings&encapsulation=shadow","src/components/scheduler-editor/nylas-limit-future-bookings/nylas-limit-future-bookings.tsx","src/components/scheduler-editor/nylas-min-booking-notice/nylas-min-booking-notice.scss?tag=nylas-min-booking-notice&encapsulation=shadow","src/components/scheduler-editor/nylas-min-booking-notice/nylas-min-booking-notice.tsx","src/components/scheduler-editor/nylas-min-cancellation-notice/nylas-min-cancellation-notice.scss?tag=nylas-min-cancellation-notice&encapsulation=shadow","src/components/scheduler-editor/nylas-min-cancellation-notice/nylas-min-cancellation-notice.tsx","src/components/scheduler-editor/nylas-page-name/nylas-page-name.scss?tag=nylas-page-name&encapsulation=shadow","src/components/scheduler-editor/nylas-page-name/nylas-page-name.tsx","src/components/scheduler-editor/nylas-page-styling/nylas-page-styling.scss?tag=nylas-page-styling&encapsulation=shadow","src/components/scheduler-editor/nylas-page-styling/nylas-page-styling.tsx","src/components/scheduler-editor/nylas-participant-booking-calendars/nylas-participant-booking-calendars.scss?tag=nylas-participant-booking-calendars&encapsulation=shadow","src/components/scheduler-editor/nylas-participant-booking-calendars/nylas-participant-booking-calendars.tsx","src/components/scheduler-editor/nylas-participants-custom-availability/nylas-participants-custom-availability.scss?tag=nylas-participants-custom-availability&encapsulation=shadow","src/components/scheduler-editor/nylas-participants-custom-availability/nylas-participants-custom-availability.tsx","src/components/scheduler-editor/nylas-reminder-emails/nylas-reminder-emails.scss?tag=nylas-reminder-emails&encapsulation=shadow","src/components/scheduler-editor/nylas-reminder-emails/nylas-reminder-emails.tsx","src/components/scheduler-editor/nylas-scheduling-method/nylas-scheduling-method.scss?tag=nylas-scheduling-method&encapsulation=shadow","src/components/scheduler-editor/nylas-scheduling-method/nylas-scheduling-method.tsx","src/components/scheduler-editor/nylas-timeslot-interval/nylas-timeslot-interval.scss?tag=nylas-timeslot-interval&encapsulation=shadow","src/components/scheduler-editor/nylas-timeslot-interval/nylas-timeslot-interval.tsx","src/common/icons/icon.css?tag=paintbrush-fill-icon&encapsulation=scoped","src/common/icons/paintbrush-fill.tsx","src/common/icons/icon.css?tag=paintbrush-icon&encapsulation=scoped","src/common/icons/paintbrush.tsx","src/common/icons/icon.css?tag=people-icon&encapsulation=scoped","src/common/icons/people.tsx"],"sourcesContent":[":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'calendar-agenda-fill-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class CalendarAgendaFillIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '20';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 11.5C14 12.8807 12.8807 14 11.5 14H2.5C1.11929 14 0 12.8807 0 11.5V2.5C0 1.11929 1.11929 0 2.5 0H11.5C12.8807 0 14 1.11929 14 2.5V11.5ZM11 3.5C11 3.25454 10.8231 3.05039 10.5899 3.00806L10.5 3H3.5L3.41012 3.00806C3.17688 3.05039 3 3.25454 3 3.5C3 3.74546 3.17688 3.94961 3.41012 3.99194L3.5 4H10.5L10.5899 3.99194C10.8231 3.94961 11 3.74546 11 3.5ZM11 7C11 6.75454 10.8231 6.55039 10.5899 6.50806L10.5 6.5H3.5L3.41012 6.50806C3.17688 6.55039 3 6.75454 3 7C3 7.24546 3.17688 7.44961 3.41012 7.49194L3.5 7.5H10.5L10.5899 7.49194C10.8231 7.44961 11 7.24546 11 7ZM11 10.5C11 10.2545 10.8231 10.0504 10.5899 10.0081L10.5 10H3.5L3.41012 10.0081C3.17688 10.0504 3 10.2545 3 10.5C3 10.7455 3.17688 10.9496 3.41012 10.9919L3.5 11H10.5L10.5899 10.9919C10.8231 10.9496 11 10.7455 11 10.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'calendar-agenda-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class CalendarAgendaIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '20';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 11.5C14 12.8807 12.8807 14 11.5 14H2.5C1.11929 14 0 12.8807 0 11.5V2.5C0 1.11929 1.11929 0 2.5 0H11.5C12.8807 0 14 1.11929 14 2.5V11.5ZM13 11.5V2.5C13 1.67157 12.3284 1 11.5 1H2.5C1.67157 1 1 1.67157 1 2.5V11.5C1 12.3284 1.67157 13 2.5 13H11.5C12.3284 13 13 12.3284 13 11.5ZM11 3.5C11 3.74546 10.8231 3.94961 10.5899 3.99194L10.5 4H3.5C3.22386 4 3 3.77614 3 3.5C3 3.25454 3.17688 3.05039 3.41012 3.00806L3.5 3H10.5C10.7761 3 11 3.22386 11 3.5ZM11 7C11 7.24546 10.8231 7.44961 10.5899 7.49194L10.5 7.5H3.5C3.22386 7.5 3 7.27614 3 7C3 6.75454 3.17688 6.55039 3.41012 6.50806L3.5 6.5H10.5C10.7761 6.5 11 6.72386 11 7ZM11 10.5C11 10.7455 10.8231 10.9496 10.5899 10.9919L10.5 11H3.5C3.22386 11 3 10.7761 3 10.5C3 10.2545 3.17688 10.0504 3.41012 10.0081L3.5 10H10.5C10.7761 10 11 10.2239 11 10.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'calendar-info-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class CalendarInfoIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '20';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 0C13.3807 0 14.5 1.11929 14.5 2.5V6.59971C14.1832 6.43777 13.8486 6.30564 13.5 6.20703V4H1.5V11.5C1.5 12.3284 2.17157 13 3 13H6.70703C6.80564 13.3486 6.93777 13.6832 7.09971 14H3C1.61929 14 0.5 12.8807 0.5 11.5V2.5C0.5 1.11929 1.61929 0 3 0H12ZM12 1H3C2.17157 1 1.5 1.67157 1.5 2.5V3H13.5V2.5C13.5 1.67157 12.8284 1 12 1ZM11.375 9.5C11.375 9.15482 11.6548 8.875 12 8.875C12.3452 8.875 12.625 9.15482 12.625 9.5C12.625 9.84518 12.3452 10.125 12 10.125C11.6548 10.125 11.375 9.84518 11.375 9.5ZM12.5 13.5C12.5 13.7761 12.2761 14 12 14C11.7239 14 11.5 13.7761 11.5 13.5V11.5C11.5 11.2239 11.7239 11 12 11C12.2761 11 12.5 11.2239 12.5 11.5V13.5ZM7.5 11.5C7.5 9.01472 9.51472 7 12 7C14.4853 7 16.5 9.01472 16.5 11.5C16.5 13.9853 14.4853 16 12 16C9.51472 16 7.5 13.9853 7.5 11.5ZM8.5 11.5C8.5 13.433 10.067 15 12 15C13.933 15 15.5 13.433 15.5 11.5C15.5 9.567 13.933 8 12 8C10.067 8 8.5 9.567 8.5 11.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'calendar-patterns-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class CalendarPatternsIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '20';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M3.25 0H11.75C13.2688 0 14.5 1.23122 14.5 2.75V11.25C14.5 12.7688 13.2688 14 11.75 14H3.25C1.73122 14 0.5 12.7688 0.5 11.25V2.75C0.5 1.23122 1.73122 0 3.25 0ZM2 2.75V4H13V2.75C13 2.05964 12.4404 1.5 11.75 1.5H3.25C2.55964 1.5 2 2.05964 2 2.75ZM12.2071 5L8.20711 9H10.7929L13 6.79289V5H12.2071ZM10.7929 5H8.20711L4.20711 9H6.79289L10.7929 5ZM2.79289 9L6.79289 5H4.20711L2 7.20711V9H2.79289ZM2 5.79289L2.79289 5H2V5.79289ZM12.2071 9H13V8.20711L12.2071 9Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'envelope-fill-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class EnvelopeFillIcon {\n @Prop() width: string = '16';\n @Prop() height: string = '13';\n\n render() {\n return (\n <svg width=\"16\" height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M16.0001 3.373V10.5C16.0001 11.8807 14.8808 13 13.5001 13H2.50008C1.11937 13 0 11.8807 0 10.5V3.373L7.74657 7.93097C7.90304 8.02301 8.09711 8.02301 8.25359 7.93097L16.0001 3.373ZM13.5001 0C14.7871 0 15.847 0.972604 15.9849 2.22293L8.00008 6.91991L0.0152595 2.22293C0.153116 0.972604 1.21302 0 2.50008 0H13.5001Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'envelope-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class EnvelopeIcon {\n @Prop() width: string = '16';\n @Prop() height: string = '13';\n\n render() {\n return (\n <svg width=\"16\" height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13.5 0C14.8807 0 16 1.11929 16 2.5V10.5C16 11.8807 14.8807 13 13.5 13H2.5C1.11929 13 0 11.8807 0 10.5V2.5C0 1.11929 1.11929 0 2.5 0H13.5ZM15 3.961L8.25351 7.93097C8.12311 8.00767 7.96661 8.02045 7.82751 7.96932L7.74649 7.93097L1 3.963V10.5C1 11.3284 1.67157 12 2.5 12H13.5C14.3284 12 15 11.3284 15 10.5V3.961ZM13.5 1H2.5C1.67157 1 1 1.67157 1 2.5V2.802L8 6.91991L15 2.801V2.5C15 1.67157 14.3284 1 13.5 1Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'flow-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class FlowIcon {\n @Prop() width: string = '16';\n @Prop() height: string = '12';\n\n render() {\n return (\n <svg width={this.width} height={this.height} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13 1.66211C11.8954 1.66211 11 2.55754 11 3.66211C11 4.76668 11.8954 5.66211 13 5.66211C14.1046 5.66211 15 4.76668 15 3.66211C15 2.55754 14.1046 1.66211 13 1.66211ZM10.0407 3.16678C10.2768 1.74563 11.5119 0.662109 13 0.662109C14.6569 0.662109 16 2.00526 16 3.66211C16 5.31896 14.6569 6.66211 13 6.66211C11.5162 6.66211 10.2839 5.58482 10.0428 4.16971C9.37629 4.23688 8.82682 4.7426 8.71466 5.41551L8.27173 8.07311C8.07929 9.22776 7.11428 10.087 5.9593 10.1574C5.72319 11.5786 4.48813 12.6621 3 12.6621C1.34315 12.6621 0 11.319 0 9.66211C0 8.00526 1.34315 6.66211 3 6.66211C4.48384 6.66211 5.71607 7.73939 5.95724 9.15451C6.62371 9.08734 7.17318 8.58162 7.28534 7.90871L7.72827 5.25111C7.92071 4.09646 8.88571 3.23718 10.0407 3.16678ZM3 7.66211C1.89543 7.66211 1 8.55754 1 9.66211C1 10.7667 1.89543 11.6621 3 11.6621C4.10457 11.6621 5 10.7667 5 9.66211C5 8.55754 4.10457 7.66211 3 7.66211Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-availability-picker {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n\n .header {\n padding: 1rem;\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n }\n\n .content {\n padding: 1rem;\n color: var(--nylas-base-900);\n font-size: 16px;\n font-family: var(--nylas-font-family);\n border-top: 1px solid var(--nylas-base-200);\n\n @media #{$small-mobile} {\n font-size: 15px;\n }\n\n .select-timezone {\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid var(--nylas-base-200);\n padding-bottom: 1rem;\n gap: 1rem;\n\n h4 {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n margin: 0;\n font-size: 16px;\n\n @media #{$small-mobile} {\n font-size: 15px;\n }\n\n font-weight: 500;\n line-height: 20px;\n }\n }\n\n .availability {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 0 0.5rem;\n\n @media #{$small-mobile} {\n gap: 0.5rem;\n padding: 0;\n }\n\n margin: 1rem 0;\n\n .availability-day {\n display: grid;\n grid-template-columns: minmax(auto, 65px) 1fr minmax(auto, 40px);\n\n @media #{$mobile} {\n grid-template-columns: 78px 1fr auto;\n }\n\n @media #{$small-mobile} {\n display: inline-grid;\n gap: 8px;\n grid-template-columns: 60px 1fr auto;\n }\n\n gap: 1rem;\n align-items: baseline;\n\n .day {\n display: flex;\n gap: 0.5rem;\n\n @media #{$small-mobile} {\n gap: 0.25rem;\n }\n\n align-items: center;\n\n input[type='checkbox'] {\n transform: scale(1.3);\n }\n }\n\n .time-ranges {\n span.unavailable {\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .time-range {\n display: flex;\n gap: 1.5rem;\n justify-content: space-between;\n align-items: baseline;\n\n @media #{$small-mobile} {\n justify-content: unset;\n gap: 0.5rem;\n }\n\n .pickers {\n display: flex;\n gap: 1rem;\n\n @media #{$small-mobile} {\n gap: 0.5rem;\n }\n\n span {\n margin-top: 0.75rem;\n }\n }\n\n &:not(:last-of-type) {\n margin-bottom: 1rem;\n }\n }\n\n p.error {\n color: var(--nylas-error);\n }\n }\n\n button {\n border: none;\n background: transparent;\n height: 40px;\n cursor: pointer;\n color: var(--nylas-base-800);\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n }\n }\n }\n }\n}\n\nselect-dropdown {\n width: auto;\n}\n\nselect-dropdown::part(sd_dropdown-button) {\n justify-content: initial;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { convertTo12HourFormat, convertTo24HourFormat, debug, minutesToTime, timeToMinutes } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { DEFAULT_OPEN_HOURS, TIMEZONE_MAP } from '@/common/constants';\nimport { Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\nexport type OpenHours = {\n days: number[];\n start: string;\n end: string;\n timezone: string;\n};\n\nexport type Schedule = {\n SUN: { start: string; end: string }[];\n MON: { start: string; end: string }[];\n TUE: { start: string; end: string }[];\n WED: { start: string; end: string }[];\n THU: { start: string; end: string }[];\n FRI: { start: string; end: string }[];\n SAT: { start: string; end: string }[];\n};\n\n/**\n * The `nylas-availability-picker` component is a form input for selecting availability (open hours).\n * @part nap__header - The header of the availability picker\n * @part nap__select-timezone - The timezone selection container\n * @part nap__select-timezone-button - The timezone selection button\n * @part nap__select-timezone-dropdown-content - The timezone selection dropdown content\n * @part nap__availability - The availability container\n * @part nap__day - The day container\n * @part nap__time-ranges - The time ranges container\n * @part nap__time-range - The time range container\n * @part nap__add-time-range - The add time range button\n * @part nap__time-picker-container - The time picker container\n * @part nap__time-picker-input - The time picker input\n * @part nap__time-picker-times - The time picker times\n */\n@Component({\n tag: 'nylas-availability-picker',\n styleUrl: 'nylas-availability-picker.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasAvailabilityPicker {\n /**\n * The element <nylas-availability-picker> itself.\n */\n @Element() host!: HTMLNylasAvailabilityPickerElement;\n /**\n * @standalone\n * The name of the availability picker.\n */\n @Prop() name: string = 'availability';\n /**\n * @standalone\n * The selected configuration.\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The open hours to display.\n */\n @Prop() openHours?: OpenHours[];\n /**\n * @standalone\n * The default timezone or preset timezone.\n */\n @Prop() defaultTimezone: string = Intl.DateTimeFormat().resolvedOptions().timeZone;\n /**\n * @standalone\n * Hide the header of the availability picker.\n */\n @Prop() hideHeader: boolean = false;\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * This event is fired when the selected availability / open hours change.\n * The value is a stringified JSON object with the open hours and timezone.\n ```\n {\n openHours: OpenHours[],\n timezone: string\n }\n ```\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n @State() schedule = {\n SUN: [],\n MON: [{ start: '09:00am', end: '05:00pm' }],\n TUE: [{ start: '09:00am', end: '05:00pm' }],\n WED: [{ start: '09:00am', end: '05:00pm' }],\n THU: [{ start: '09:00am', end: '05:00pm' }],\n FRI: [{ start: '09:00am', end: '05:00pm' }],\n SAT: [],\n };\n /**\n * The selected timezone state.\n */\n @State() timezone: string = '';\n\n /**\n * The overlapping time ranges state. This is used to display an error message when there are overlapping time ranges.\n */\n @State() overlapDays: { [key: string]: number[] } = {};\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-calendar-picker', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n configChangedHandler(newConfig: Configuration) {\n const defaultOpenHours = newConfig?.availability?.availability_rules?.default_open_hours ?? DEFAULT_OPEN_HOURS;\n // If the name is `availability`, we are setting the default open hours. If the name is `participant-****`, we are setting the participant's custom availability.\n // Set the timezone accordingly.\n const defaultOpenHoursTimezone = newConfig?.event_booking?.timezone || this.defaultTimezone;\n this.timezone = this.name === 'availability' ? defaultOpenHoursTimezone : this.defaultTimezone;\n if (this.openHours && this.openHours.length > 0) {\n this.openHoursToSchedule(this.openHours);\n } else if (defaultOpenHours) {\n this.openHoursToSchedule(defaultOpenHours);\n }\n }\n\n scheduleChanged(newValue: Schedule, valueChanged: boolean = true) {\n const overlapDays: { [key: string]: number[] } = {};\n Object.keys(newValue).forEach(key => {\n const dayTimeRanges = newValue[key];\n if (dayTimeRanges.length > 0) {\n const overlaps = this.getOverlaps(dayTimeRanges);\n if (overlaps.length > 0) {\n overlapDays[key] = overlaps;\n }\n }\n });\n this.overlapDays = overlapDays;\n\n if (Object.keys(overlapDays).length > 0) {\n const element = this.host.shadowRoot?.getElementById(Object.keys(overlapDays)[0]) as HTMLInputElement;\n if (element) {\n debug('nylas-availability-picker', 'The time ranges are overlapping. Overlap: ', overlapDays);\n this.isInternalsAvailable && this.internals.setValidity({ customError: true }, 'Overlapping time ranges found', element);\n }\n } else {\n this.isInternalsAvailable && this.internals.setValidity({ customError: false });\n this.isInternalsAvailable &&\n this.internals.setFormValue(\n JSON.stringify({\n openHours: this.scheduleToOpenHours(this.schedule),\n timezone: this.timezone,\n }),\n this.name,\n );\n }\n if (valueChanged) {\n this.valueChanged.emit({\n value: JSON.stringify({\n openHours: this.scheduleToOpenHours(newValue),\n timezone: this.timezone,\n }),\n name: this.name,\n });\n }\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(\n event: CustomEvent<{\n value: string;\n name: string;\n }>,\n ) {\n const { name, value } = event.detail;\n if (name === 'timezone') {\n this.timezone = value;\n const updateValue = {\n openHours: this.scheduleToOpenHours(this.schedule),\n timezone: this.timezone,\n };\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(updateValue), this.name);\n this.valueChanged.emit({\n value: JSON.stringify(updateValue),\n name: this.name,\n });\n }\n }\n\n connectedCallback() {\n debug('nylas-availability-picker', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-availability-picker', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-availability-picker', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-availability-picker', 'componentDidLoad');\n\n if (this.selectedConfiguration) {\n this.configChangedHandler(this.selectedConfiguration);\n } else {\n this.timezone = this.defaultTimezone;\n if (this.openHours) {\n this.openHoursToSchedule(this.openHours);\n }\n }\n\n const updateValue = {\n openHours: this.scheduleToOpenHours(this.schedule),\n timezone: this.timezone,\n };\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(updateValue), this.name);\n }\n\n get isInternalsAvailable() {\n return typeof this.internals.setFormValue === 'function';\n }\n\n getOverlaps(timeRanges) {\n // Convert times to minutes and add to the array\n const timeRangesInMinutes = timeRanges.map((range, index) => ({\n start: timeToMinutes(range.start),\n end: timeToMinutes(range.end),\n originalIndex: index,\n }));\n\n // Sort by start time\n timeRangesInMinutes.sort((a, b) => a.start - b.start);\n const overlaps: number[] = [];\n // Check for overlap\n for (let i = 1; i < timeRangesInMinutes.length; i++) {\n if (timeRangesInMinutes[i].start < timeRangesInMinutes[i - 1].end) {\n // Add both overlapping time range indices if they are not already included\n if (!overlaps.includes(timeRangesInMinutes[i].originalIndex)) {\n overlaps.push(timeRangesInMinutes[i].originalIndex);\n }\n if (!overlaps.includes(timeRangesInMinutes[i - 1].originalIndex)) {\n overlaps.push(timeRangesInMinutes[i - 1].originalIndex);\n }\n }\n }\n return overlaps.sort((a, b) => a - b); // Return sorted list of indices\n }\n\n addTimeRange(day) {\n const currentTimeRanges = this.schedule[day];\n\n // Default working hours are from 00:00 to 23:45 for calculation purposes\n const dayStart = 0; // Start of the day in minutes (00:00)\n const dayEnd = 1425; // End of the day in minutes (23:45)\n\n if (currentTimeRanges.length === 0) {\n // If there are no existing time ranges, add one at the start of the day\n this.schedule[day] = [{ start: '09:00am', end: '05:00pm' }]; // Example range\n } else {\n // Convert all time ranges to minutes for comparison\n const timeRangesInMinutes = currentTimeRanges\n .map(range => ({\n start: timeToMinutes(range.start),\n end: timeToMinutes(range.end),\n }))\n .sort((a, b) => a.start - b.start); // Sort by start time\n\n // Attempt to add a new time range at the end of the day\n const lastRangeEnd = timeRangesInMinutes[timeRangesInMinutes.length - 1].end;\n if (lastRangeEnd + 60 <= dayEnd) {\n // There's room at the end of the day\n this.schedule[day].push({\n start: convertTo12HourFormat(minutesToTime(lastRangeEnd)),\n end: convertTo12HourFormat(minutesToTime(lastRangeEnd + 60)),\n });\n } else {\n // No room at the end, look for gaps at the beginning of the day\n let gapFound = false;\n if (timeRangesInMinutes[0].start > dayStart + 60) {\n // There's room for at least a 1-hour meeting at the beginning of the day\n this.schedule[day].push({\n start: convertTo12HourFormat(minutesToTime(dayStart)),\n end: convertTo12HourFormat(minutesToTime(dayStart + 60)),\n });\n gapFound = true;\n }\n\n if (!gapFound) {\n // Search for gaps between scheduled time ranges\n for (let i = 0; i < timeRangesInMinutes.length - 1; i++) {\n const currentEnd = timeRangesInMinutes[i].end;\n const nextStart = timeRangesInMinutes[i + 1].start;\n\n if (nextStart - currentEnd >= 60) {\n // Found a gap\n this.schedule[day].push({\n start: convertTo12HourFormat(minutesToTime(currentEnd)),\n end: convertTo12HourFormat(minutesToTime(currentEnd + 60)),\n });\n break; // Exit the loop after adding a time range\n }\n }\n }\n }\n }\n\n // Sort the updated schedule to maintain order\n this.schedule[day].sort((a, b) => timeToMinutes(a.start) - timeToMinutes(b.start));\n\n this.schedule = { ...this.schedule };\n this.scheduleChanged(this.schedule);\n }\n\n removeTimeRange(day, index) {\n this.schedule[day].splice(index, 1);\n this.schedule = { ...this.schedule };\n this.scheduleChanged(this.schedule);\n }\n\n @Listen('timeChange')\n setTime(event: CustomEvent<{ key: string; value: string }>) {\n const { key, value } = event.detail;\n const [dayIndex, timeType] = key.split('_');\n const [day, index] = dayIndex.split(':');\n\n if (timeType === 'start') {\n this.schedule[day][index].start = value;\n } else if (timeType === 'end') {\n this.schedule[day][index].end = value;\n }\n this.internals.setValidity({ customError: false });\n this.schedule = { ...this.schedule };\n this.scheduleChanged(this.schedule);\n }\n\n @Listen('timeWindowFormError')\n setFormError(event: CustomEvent<{ key: string; message: string }>) {\n const { key } = event.detail;\n const [_, timeType] = key.split('_');\n const element = this.host.shadowRoot?.getElementById(key);\n if (element) {\n this.internals.setValidity({ customError: true }, `Invalid ${timeType} time`, element as HTMLInputElement);\n }\n }\n\n openHoursToSchedule(openHours: OpenHours[]) {\n const newSchedule = {\n SUN: [],\n MON: [],\n TUE: [],\n WED: [],\n THU: [],\n FRI: [],\n SAT: [],\n };\n openHours.forEach(openHour => {\n openHour.days.forEach(day => {\n const dayKey = this.getDayKey(day);\n const start12hr = convertTo12HourFormat(openHour.start);\n const end12hr = convertTo12HourFormat(openHour.end);\n const timeRange = { start: start12hr, end: end12hr };\n\n // Check if the time range already exists for the day\n let timeRangeExists = false;\n if (newSchedule[dayKey]) {\n // Search for an existing time range that matches the current one\n timeRangeExists = newSchedule[dayKey].some(range => range.start === timeRange.start && range.end === timeRange.end);\n }\n\n if (!timeRangeExists) {\n if (newSchedule[dayKey]) {\n newSchedule[dayKey].push(timeRange);\n } else {\n newSchedule[dayKey] = [timeRange];\n }\n }\n });\n });\n\n this.schedule = newSchedule;\n this.scheduleChanged(this.schedule, false);\n }\n\n getDayKey(dayIndex: number): string {\n const days = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];\n return days[dayIndex];\n }\n\n scheduleToOpenHours(schedule: Schedule): OpenHours[] {\n const dayKeys = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];\n const openHoursMap: Map<string, { days: number[]; start: string; end: string }> = new Map();\n\n dayKeys.forEach((dayKey, index) => {\n if (schedule[dayKey]) {\n // Check if schedule for the day exists\n schedule[dayKey].forEach(timeRange => {\n const start24hr = convertTo24HourFormat(timeRange.start);\n const end24hr = convertTo24HourFormat(timeRange.end);\n const key = `${start24hr}-${end24hr}`;\n\n if (!openHoursMap.has(key)) {\n openHoursMap.set(key, { days: [index], start: start24hr, end: end24hr });\n } else {\n const entry = openHoursMap.get(key);\n if (entry) {\n entry.days.push(index);\n openHoursMap.set(key, entry);\n }\n }\n });\n }\n });\n\n const selectedOpenHours: OpenHours[] = [];\n openHoursMap.forEach((value, _key) => {\n selectedOpenHours.push({\n days: value.days,\n start: value.start,\n end: value.end,\n timezone: this.timezone,\n });\n });\n\n return selectedOpenHours;\n }\n\n @RegisterComponent<NylasAvailabilityPicker, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-availability-picker',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n fireRegisterEvent: true,\n })\n render() {\n const timezoneOptions = Object.keys(TIMEZONE_MAP).map(key => ({\n label: TIMEZONE_MAP[key],\n value: key,\n }));\n const selectedTimezoneOption = timezoneOptions.find(i => i.value === this.timezone);\n\n return (\n <Host>\n <div class=\"nylas-availability-picker\" part=\"nap\">\n {!this.hideHeader && (\n <div class=\"header\" part=\"nap__header\">\n <h3>{i18next.t('nylasAvailabilityPicker.headerTitle')}</h3>\n <p>\n {i18next.t('nylasAvailabilityPicker.headerSubTitle')}\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasAvailabilityPicker.tooltip.desc')}</span>\n </tooltip-component>\n </p>\n </div>\n )}\n <div class=\"content\">\n <div class=\"select-timezone\" part=\"nap__select-timezone\">\n <h4 class=\"sub-header\">{i18next.t('nylasAvailabilityPicker.selectTimezone')}</h4>\n {selectedTimezoneOption?.label && (\n <select-dropdown\n name=\"timezone\"\n searchPlaceholder={i18next.t('search')}\n exportparts=\"sd_dropdown: nap__timezone-container, sd_dropdown-button: nap__timezone-button, sd_dropdown-content: nap__timezone-dropdown-content\"\n options={timezoneOptions}\n defaultSelectedOption={selectedTimezoneOption}\n >\n <span slot=\"select-icon\">\n <globe-icon width=\"20\" height=\"20\" />\n </span>\n </select-dropdown>\n )}\n </div>\n <div class=\"availability\" part=\"nap__availability\">\n {Object.keys(this.schedule).map(key => {\n const day = key;\n const timeRanges = this.schedule[key] as { start: string; end: string }[];\n return (\n <div class=\"availability-day\">\n <div class=\"day\" part=\"nap__day\">\n <input\n type=\"checkbox\"\n name={day}\n id={day}\n checked={timeRanges.length > 0}\n onClick={() => {\n if (timeRanges.length > 0) {\n this.schedule[day] = [];\n } else {\n this.schedule[day] = [{ start: '09:00am', end: '05:00pm' }];\n }\n this.schedule = { ...this.schedule };\n this.scheduleChanged(this.schedule);\n }}\n />\n <label htmlFor={day} aria-label=\"Select day\">\n {i18next.t(`nylasAvailabilityPicker.days.${day}`)}\n </label>\n </div>\n <div class=\"time-ranges\" part=\"nap__time-ranges\">\n {timeRanges.length ? null : <span class=\"unavailable\">{i18next.t('nylasAvailabilityPicker.unavailable')}</span>}\n {timeRanges.length > 0 &&\n timeRanges.map((timeRange, timeRangeIndex) => {\n const startKey = `${key}:${timeRangeIndex}_start`;\n const endKey = `${key}:${timeRangeIndex}_end`;\n return (\n <div class=\"time-range\" part=\"nap__time-range\">\n <div class=\"pickers\">\n <nylas-time-window-picker\n id={startKey}\n hasError={this.overlapDays[day]?.includes(timeRangeIndex)}\n time={timeRange.start}\n name={startKey}\n key={startKey}\n language={this.selectedLanguage}\n exportparts=\"time-picker: nap__time-picker-container, time-input: nap__time-picker-input, times: nap__time-picker-times\"\n />\n <span> - </span>\n <nylas-time-window-picker\n id={endKey}\n hasError={this.overlapDays[day]?.includes(timeRangeIndex)}\n time={timeRange.end}\n name={endKey}\n key={endKey}\n minimumStartTime={timeRange.start}\n language={this.selectedLanguage}\n exportparts=\"time-picker: nap__time-picker-container, time-input: nap__time-picker-input, times: nap__time-picker-times\"\n />\n </div>\n <button onClick={() => this.removeTimeRange(day, timeRangeIndex)}>\n <close-icon />\n </button>\n </div>\n );\n })}\n <p class=\"error\">{this.overlapDays[day] ? 'Overlapping time ranges' : ''}</p>\n </div>\n <div>\n {timeRanges.length > 0 ? (\n <button onClick={() => this.addTimeRange(day)} part=\"nap__add-time-range\">\n <add-circle-icon />\n </button>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-booking-calendar-picker {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n\n .header {\n padding: 1rem;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n }\n\n .nylas-booking-calendar-picker__loading {\n padding-bottom: 1rem;\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n .label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 1rem 1rem 0;\n color: var(--nylas-base-800);\n }\n\n .loading-button {\n margin: 0 1rem;\n padding: 0;\n width: inherit;\n height: 48px;\n color: var(--nylas-base-900);\n font-size: 16px;\n cursor: not-allowed;\n display: flex;\n gap: 0.5rem;\n justify-content: space-between;\n align-items: center;\n background: transparent;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n\n span {\n padding: 0 1rem;\n }\n }\n }\n\n .nylas-booking-calendar-picker__dropdown {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n span.label {\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--nylas-base-800);\n\n tooltip-component {\n display: flex;\n }\n }\n\n select-dropdown::part(sd_dropdown) {\n width: 100%;\n }\n\n select-dropdown::part(sd_dropdown-content) {\n width: 100%;\n max-width: unset;\n }\n\n select-dropdown::part(sd_dropdown-button) {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n }\n\n select-dropdown::part(sd_dropdown-button-selected-label) {\n max-width: calc(100% - 2rem);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { Calendar } from '@nylas/core';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { User } from '@/common/nylas-api-request';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-booking-calendar-picker` component is a UI component that displays the booking calendar picker.\n * @part nbcp - The booking calendar picker container\n * @part nbcp__header - The header of the booking calendar picker\n * @part nbcp__input-label - The input label of the booking calendar picker\n * @part nbcp__dropdown - The dropdown container\n * @part nbcp__dropdown-button - The dropdown button\n * @part nbcp__dropdown-content - The dropdown content\n */\n@Component({\n tag: 'nylas-booking-calendar-picker',\n styleUrl: 'nylas-booking-calendar-picker.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasBookingCalendarPicker {\n @Element() host!: HTMLNylasCalendarPickerElement;\n /**\n * @standalone\n * The calendars to choose from.\n */\n @Prop() calendars?: Calendar[];\n /**\n * @standalone\n * The current logged in user.\n */\n @Prop() currentUser?: User;\n /**\n * @standalone\n * The list of user's calendars.\n */\n @Prop() currentUserCalendars?: Calendar[];\n /**\n * @standalone\n * The name of the calendar picker.\n */\n @Prop() name: string = 'booking-calendar';\n /**\n * @standalone\n * The default selected calendar.\n */\n @Prop() defaultBookingCalendar: string = '';\n /**\n * The prop to hide the header.\n */\n @Prop() hideHeader: boolean = false;\n /**\n * Prop for express flow when creating a config\n */\n @Prop() expressFlow: boolean = false;\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The selected calendars.\n */\n @State() selectedCalendar: string = '';\n\n /**\n * This event is fired when the selected booking calendar changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-booking-calendar-picker', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-booking-calendar-picker', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-booking-calendar-picker', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-booking-calendar-picker', 'componentDidLoad');\n const primaryCalendar = this.calendars?.find(calendar => calendar.is_primary)?.id;\n const firstCalendar = this.calendars?.[0]?.id;\n this.defaultBookingCalendar = this.defaultBookingCalendar || primaryCalendar || firstCalendar || '';\n this.isInternalsAvailable && this.internals.setFormValue(this.defaultBookingCalendar.toString(), this.name);\n this.selectedCalendar = this.defaultBookingCalendar;\n }\n\n componentWillUpdate() {\n debug('nylas-booking-calendar-picker', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-booking-calendar-picker', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-booking-calendar-picker', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-booking-calendar-picker', 'componentDidRender');\n }\n\n get isInternalsAvailable() {\n return this.internals !== undefined && typeof this.internals.setFormValue === 'function';\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-booking-calendar-picker', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('currentUserCalendars')\n currentUserCalendarsChangedHandler(newValue: Calendar[]) {\n debug('nylas-booking-calendar-picker', 'currentUserCalendarsChangedHandler', newValue);\n this.currentUserCalendars = newValue;\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-booking-calendar-picker', 'nylasFormDropdownChangedHandler', event.detail);\n // Pass as handler so that if event.defaultPrevented by parent app, this will be skipped.\n this.isInternalsAvailable && this.internals.setValidity({});\n const valueChanged = (event: CustomEvent<{ value: string; name: string }>) => {\n const { value } = event.detail;\n this.selectedCalendar = value;\n this.isInternalsAvailable && this.internals.setFormValue(value.toString(), this.name);\n };\n this.valueChanged.emit({ value: event.detail.value, name: this.name, valueChanged });\n }\n\n @RegisterComponent<NylasBookingCalendarPicker, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-booking-calendar-picker',\n stateToProps: new Map([\n ['schedulerConfig.calendars', 'currentUserCalendars'],\n ['schedulerConfig.currentUser', 'currentUser'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const currentUserCalendarOptions =\n this.currentUserCalendars?.map(calendar => {\n return {\n value: calendar.id,\n label: calendar.name,\n };\n }) ?? [];\n\n const optionsFromCalendars =\n this.calendars?.map(calendar => {\n return {\n value: calendar.id,\n label: calendar.name,\n };\n }) ?? [];\n const calendarOptions = optionsFromCalendars?.length > 0 ? optionsFromCalendars : currentUserCalendarOptions || [];\n const defaultOption = calendarOptions.find(cal => cal.value == this.defaultBookingCalendar);\n return (\n <Host>\n <div class=\"nylas-booking-calendar-picker\" part=\"nbcp\">\n {!this.hideHeader && (\n <div class=\"header\" part=\"nbcp__header\">\n <h3>{i18next.t('nylasBookingCalendarPicker.headerTitle')}</h3>\n <p>\n {i18next.t('nylasBookingCalendarPicker.headerSubTitle')}\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasBookingCalendarPicker.tooltip.desc')}</span>\n </tooltip-component>\n </p>\n </div>\n )}\n {calendarOptions.length > 0 ? (\n <div class=\"nylas-booking-calendar-picker__dropdown\">\n <select-dropdown\n name=\"booking-calendar\"\n options={[{ value: '', label: i18next.t('nylasBookingCalendarPicker.selectOptionLabel') }, ...calendarOptions]}\n withSearch={false}\n required={this.expressFlow}\n emptyValue={i18next.t('nylasBookingCalendarPicker.selectOptionLabel')}\n errorMessage={i18next.t('nylasBookingCalendarPicker.selectCalendarErrorMessage')}\n exportparts=\"sd_dropdown: nbcp__dropdown, sd_dropdown-button: nbcp__dropdown-button, sd_dropdown-content: nbcp__dropdown-content\"\n defaultSelectedOption={defaultOption ? defaultOption : null}\n />\n </div>\n ) : (\n <div class=\"nylas-booking-calendar-picker__loading\">\n <span class=\"label\">\n {i18next.t('nylasBookingCalendarPicker.tooltip.desc')} <info-icon />\n </span>\n <div class=\"loading-button\">\n <span>{i18next.t('loading')}...</span>\n </div>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-booking-confirmation-redirect {\n width: inherit;\n display: flex;\n flex-direction: column;\n\n .nylas-booking-confirmation-redirect__dropdown {\n span.label {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-bottom: 4px;\n color: var(--nylas-base-800);\n\n tooltip-component {\n display: flex;\n }\n }\n\n select-dropdown::part(sd_dropdown) {\n width: 100%;\n }\n\n select-dropdown::part(sd_dropdown-button) {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 1rem;\n }\n\n select-dropdown::part(sd_dropdown-content) {\n width: 100%;\n max-width: unset;\n }\n\n select-dropdown::part(sd_dropdown-button-selected-label) {\n max-width: calc(100% - 2rem);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n\n input-component::part(ic__input_wrapper) {\n margin-top: 1rem;\n }\n\n span.error-message {\n color: var(--nylas-error);\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { isValidUrl } from '@/utils/utils';\nimport { Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-booking-confirmation-redirect` component is a UI component that allows the user to choose a custom redirect URL after a booking is confirmed.\n * @part nbcr - The booking redirect container\n * @part nbcr__header - The header of the booking redirect\n * @part nbcr__dropdown - The dropdown container\n * @part nbcr__dropdown-button - The dropdown button\n * @part nbcr__dropdown-content - The dropdown content\n * @part nbcr__input-textfield - The input field content\n */\n@Component({\n tag: 'nylas-booking-confirmation-redirect',\n styleUrl: 'nylas-booking-confirmation-redirect.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasBookingConfirmationRedirect {\n @Element() host!: HTMLNylasBookingConfirmationRedirectElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The name of the confirmation redirect link.\n */\n @Prop() name: string = 'confirmation-redirect';\n /**\n * @standalone\n * The custom redirect URL.\n */\n @Prop() redirectUrl: string = '';\n /**\n * @standalone\n * The custom redirect URL error message\n */\n @Prop() redirectUrlErrorMessage: string = '';\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The current redirect URL.\n */\n @State() currentRedirectUrl: string = '';\n /**\n * The state for whether a custom URL can be added.\n */\n @State() acceptUrl!: boolean;\n\n @State() componentLoaded: boolean = false;\n\n /**\n * This event is fired when the current redirect URL changes and is valid.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-booking-confirmation-redirect', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-booking-confirmation-redirect', 'selectedConfigurationChangedHandler', newValue);\n if (newValue?.scheduler?.confirmation_redirect_url) {\n this.currentRedirectUrl = newValue?.scheduler?.confirmation_redirect_url;\n this.acceptUrl = newValue?.scheduler?.confirmation_redirect_url !== '';\n }\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n }\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-booking-confirmation-redirect', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-booking-confirmation-redirect', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-booking-confirmation-redirect', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-booking-confirmation-redirect', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.currentRedirectUrl = this.redirectUrl;\n this.acceptUrl = this.redirectUrl !== '';\n }\n this.componentLoaded = true;\n if (typeof this.internals.setFormValue === 'function') {\n this.internals.setFormValue(this.currentRedirectUrl.toString(), this.name);\n }\n }\n\n componentWillUpdate() {\n debug('nylas-booking-confirmation-redirect', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-booking-confirmation-redirect', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-booking-confirmation-redirect', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-booking-confirmation-redirect', 'componentDidRender');\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-booking-confirmation-redirect', 'nylasFormDropdownChangedHandler', event.detail);\n\n const { name, value } = event.detail;\n\n if (name === 'confirmation-redirect-dropdown') {\n if (value === 'custom') {\n this.acceptUrl = true;\n } else {\n this.acceptUrl = false;\n\n // Submit empty string to clear redirect URL\n this.internals.setFormValue('', this.name);\n this.valueChanged.emit({ name: this.name, value: '' });\n }\n }\n }\n\n @Listen('nylasFormInputBlurred')\n nylasFormInputBlurHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { name, value } = event.detail;\n this.currentRedirectUrl = value;\n\n if (this.acceptUrl && name === 'confirmation-redirect') {\n this.redirectUrlErrorMessage = '';\n\n if (!isValidUrl(this.currentRedirectUrl)) {\n this.internals.setValidity({ customError: true }, 'Please enter a valid URL.');\n this.redirectUrlErrorMessage = 'Please enter a valid URL.';\n return;\n }\n this.internals.setValidity({});\n\n // Pass as handler so that if event.defaultPrevented by parent app, this will be skipped.\n const valueChanged = (event: CustomEvent<{ value: string; name: string }>) => {\n const { value } = event.detail;\n this.internals.setFormValue(value.toString(), this.name);\n };\n this.valueChanged.emit({ ...event.detail, valueChanged });\n }\n }\n\n @Listen('formSubmitted', { target: 'document' })\n formSubmittedHandler(_event: CustomEvent) {\n if (this.acceptUrl && !isValidUrl(this.currentRedirectUrl)) {\n this.internals.setValidity({ customError: true }, 'Please enter a valid URL.');\n this.redirectUrlErrorMessage = 'Please enter a valid URL.';\n } else {\n this.internals.setValidity({});\n }\n }\n\n @RegisterComponent<NylasBookingConfirmationRedirect, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-booking-confirmation-redirect',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const redirectOptions = [\n {\n label: i18next.t('nylasBookingConfirmationRedirect.redirectOption', { context: 'default' }),\n value: 'default',\n },\n {\n label: i18next.t('nylasBookingConfirmationRedirect.redirectOption', { context: 'custom' }),\n value: 'custom',\n },\n ];\n\n return (\n <Host>\n <div class=\"nylas-booking-confirmation-redirect\" part=\"nbcr\">\n {redirectOptions.length > 0 && (\n <div class=\"nylas-booking-confirmation-redirect__dropdown\">\n <span class=\"label\">\n {i18next.t('nylasBookingConfirmationRedirect.dropdownLabel')}\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasBookingConfirmationRedirect.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n {this.componentLoaded && (\n <select-dropdown\n name=\"confirmation-redirect-dropdown\"\n options={redirectOptions}\n withSearch={false}\n defaultSelectedOption={redirectOptions.find(option => option.value === (this.acceptUrl ? 'custom' : 'default'))}\n exportparts=\"sd_dropdown: nbcr__dropdown, sd_dropdown-button: nbcr__dropdown-button, sd_dropdown-content: nbcr__dropdown-content\"\n />\n )}\n {this.acceptUrl && (\n <div>\n <input-component\n name=\"confirmation-redirect\"\n id=\"confirmation-redirect\"\n type=\"text\"\n placeholder=\"Enter custom redirect URL\"\n required={false}\n part=\"ic__input_wrapper: nbcr__input-textfield\"\n defaultValue={this.currentRedirectUrl}\n />\n {this.redirectUrlErrorMessage && <span class=\"error-message\">{this.redirectUrlErrorMessage}</span>}\n </div>\n )}\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-booking-confirmation-type {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin-bottom: 1rem;\n\n .nylas-booking-confirmation-type__dropdown {\n span.label {\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--nylas-base-800);\n\n tooltip-component {\n display: flex;\n }\n }\n\n select-dropdown::part(sd_dropdown) {\n width: 100%;\n }\n\n select-dropdown::part(sd_dropdown-button) {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 1rem;\n }\n\n select-dropdown::part(sd_dropdown-content) {\n width: 100%;\n max-width: unset;\n }\n\n select-dropdown::part(sd_dropdown-button-selected-label) {\n max-width: calc(100% - 2rem);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-booking-confirmation-type` component is a UI component that allows the user to choose a custom redirect URL after a booking is confirmed.\n * @part nbct - The custom booking flow container\n * @part nbct__header - The header of the custom booking flow\n * @part nbct__dropdown - The dropdown container\n * @part nbct__dropdown-button - The dropdown button\n * @part nbct__dropdown-content - The dropdown content\n */\n@Component({\n tag: 'nylas-booking-confirmation-type',\n styleUrl: 'nylas-booking-confirmation-type.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasBookingConfirmationType {\n @Element() host!: HTMLNylasBookingConfirmationTypeElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n\n /**\n * @standalone\n * The name of the confirmation redirect link.\n */\n @Prop() name: string = 'confirmation-type';\n /**\n * @standalone\n * The booking type.\n */\n @Prop() bookingType: string = 'booking';\n /**\n * @standalone\n * Show or hide the confirmation type.\n * This prop is automatically determined based on the value of selectedConfiguration in the config,\n * making it unnecessary to set this prop manually.\n */\n @Prop() showComponent: boolean = this.selectedConfiguration?.event_booking?.booking_type !== 'custom-confirmation';\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The selected bookingType.\n */\n @State() selectedBookingType!: string;\n\n /**\n * The open/close state of the booking confirmation type dropdown.\n */\n @State() showDropdown!: boolean;\n /**\n * This event is fired when the selected bookingType changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-booking-confirmation-type', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-booking-confirmation-type', 'selectedConfigurationChangedHandler', newValue);\n if (newValue?.event_booking?.booking_type) {\n this.selectedBookingType = newValue?.event_booking?.booking_type;\n this.showDropdown = newValue?.event_booking?.booking_type !== 'custom-confirmation' && !!newValue?.scheduler?.organizer_confirmation_url;\n this.isInternalsAvailable && this.internals.setFormValue(this.selectedBookingType.toString(), this.name);\n }\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 // Lifecycle methods\n connectedCallback() {\n debug('nylas-booking-confirmation-type', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-booking-confirmation-type', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-booking-confirmation-type', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-booking-confirmation-type', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.selectedBookingType = this.bookingType || 'booking';\n this.showDropdown = this.showComponent;\n }\n this.isInternalsAvailable && this.internals.setFormValue(this.selectedBookingType.toString(), this.name);\n }\n\n componentWillUpdate() {\n debug('nylas-booking-confirmation-type', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-booking-confirmation-type', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-booking-confirmation-type', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-booking-confirmation-type', 'componentDidRender');\n }\n\n get isInternalsAvailable() {\n return typeof this.internals.setFormValue === 'function' && typeof this.internals.setFormValue === 'function';\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-booking-confirmation-type', 'nylasFormDropdownChangedHandler', event.detail);\n // Pass as handler so that if event.defaultPrevented by parent app, this will be skipped.\n const valueChanged = (event: CustomEvent<{ value: string; name: string }>) => {\n const { value } = event.detail;\n this.selectedBookingType = value;\n this.internals.setFormValue(value.toString(), this.name);\n };\n this.valueChanged.emit({ ...event.detail, valueChanged });\n }\n\n @RegisterComponent<NylasBookingConfirmationType, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-booking-confirmation-type',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const bookingOptions = [\n {\n label: i18next.t('nylasBookingConfirmationType.bookingOption', { context: 'booking' }),\n value: 'booking',\n },\n {\n label: i18next.t('nylasBookingConfirmationType.bookingOption', { context: 'organizerConfirmation' }),\n value: 'organizer-confirmation',\n },\n ];\n\n return (\n <Host>\n {this.showDropdown && (\n <div class=\"nylas-booking-confirmation-type\" part=\"nbct\">\n {bookingOptions.length > 0 && (\n <div class=\"nylas-booking-confirmation-type__dropdown\">\n <span class=\"label\">\n {i18next.t('nylasBookingConfirmationType.dropdownLabel')}\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasBookingConfirmationType.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n {this.selectedBookingType && (\n <select-dropdown\n name=\"booking-type\"\n options={bookingOptions}\n withSearch={false}\n exportparts=\"sd_dropdown: nbct__dropdown, sd_dropdown-button: nbct__dropdown-button, sd_dropdown-content: nbct__dropdown-content\"\n defaultSelectedOption={bookingOptions.find(cal => cal.value == this.selectedBookingType)}\n />\n )}\n </div>\n )}\n </div>\n )}\n </Host>\n );\n }\n}\n","/**!\n * Sortable 1.15.6\n * @author\tRubaXa <trash@rubaxa.org>\n * @author\towenm <owen23355@gmail.com>\n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.15.6\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n return false;\n}\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\nfunction css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n } while (!selfOnly && (el = el.parentNode));\n }\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n return list;\n }\n return [];\n}\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect();\n\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n } while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n\n /* jshint boss:true */\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n currentChild++;\n }\n i++;\n }\n return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) {\n return -1;\n }\n\n /* jshint boss:true */\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n } while (elem = elem.parentNode);\n return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function (child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n }\n\n // if fromRect != toRect: animate\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) {\n time = _this.options.animation;\n }\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction repaint(target) {\n return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n\n // Add default options from plugin\n _extends(defaults, initialized.defaults);\n });\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\n ghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n\n _silent = false,\n savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return;\n // false when <= IE11\n if (IE11OrLess) {\n return false;\n }\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n }(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n },\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n },\n /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\n _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n },\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n },\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n },\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[expando]._onDragOver(event);\n }\n }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n this.el = el; // root element\n this.options = options = _extends({}, options);\n\n // Export instance\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n // Disabled on Safari: #1571; Enabled on Safari IOS: #2244\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && (!Safari || IOS),\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults);\n\n // Set default options\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n _prepareGroup(options);\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n }\n\n // Bind events\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n sortables.push(this.el);\n\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n // Add animation state manager\n _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n if (!evt.cancelable) return;\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n _saveInputCheckedState(el);\n\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if (dragEl) {\n return;\n }\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n }\n\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) {\n return;\n }\n\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n target = closest(target, options.draggable, el, false);\n if (target && target.animated) {\n return;\n }\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n }\n\n // Get the index of the dragged element within its parent\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable);\n\n // Check filter\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n }\n\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n }\n\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n\n // Drag start event\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n });\n\n // Chosen item\n toggleClass(dragEl, options.chosenClass, true);\n };\n\n // Disable \"draggable\"\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n if (options.supportPointer) {\n on(ownerDocument, 'pointerup', _this._onDrop);\n // Native D&D triggers pointercancel\n !this.nativeDraggable && on(ownerDocument, 'pointercancel', _this._onDrop);\n } else {\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop);\n }\n\n // Make dragEl draggable (must be before delay for FireFox)\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n pluginEvent('delayStart', this, {\n evt: evt\n });\n\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n if (options.supportPointer) {\n on(ownerDocument, 'pointerup', _this._disableDelayedDrag);\n on(ownerDocument, 'pointercancel', _this._disableDelayedDrag);\n } else {\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n }\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'pointerup', this._disableDelayedDrag);\n off(ownerDocument, 'pointercancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n try {\n if (document.selection) {\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n awaitingDragStarted = false;\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n var options = this.options;\n\n // Apply effect\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost();\n\n // Drag start event\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n _hideGhostForTarget();\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n target = parent; // store last element\n }\n /* jshint boss:true */ while (parent = getParentOrHost(parent));\n }\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n // only set the status to dragging, when we are actually dragging\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n this._onDragStart(evt, true);\n }\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options;\n\n // Position absolutely\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl);\n\n // Set transform-origin\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n pluginEvent('setupClone', this);\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.removeAttribute(\"id\");\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n this._hideClone();\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n }\n\n // #1143: IFrame support workaround\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n _this._hideClone();\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true);\n\n // Set proper drop events\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n on(document, 'drop', _this);\n\n // #1276 fix:\n css(dragEl, 'transform', 'translateZ(0)');\n }\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n window.getSelection().removeAllRanges();\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver( /**Event*/evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n if (_silent) return;\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n\n // Capture animation state\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n _this.captureAnimationState();\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n }\n\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n }\n\n // Animation\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n\n // Null lastTarget if it is not inside a previously swapped element\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n }\n\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n // Do not detect for empty insert if already inserted\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n\n // Call when dragEl has been inserted\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n if (revert) {\n parentEl = rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent('revert');\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n return completed(true);\n }\n var elLastChild = lastChild(el, options.draggable);\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n }\n\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n if (target) {\n targetRect = getRect(target);\n }\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) {\n // the last draggable element is not the last node\n el.insertBefore(dragEl, elLastChild.nextSibling);\n } else {\n el.appendChild(dragEl);\n }\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n if (firstChild === dragEl) {\n return completed(false);\n }\n target = firstChild;\n targetRect = getRect(target);\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n }\n\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n parentEl = dragEl.parentNode; // actualization\n\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n changed();\n return completed(true);\n }\n }\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'pointercancel', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop( /**Event*/evt) {\n var el = this.el,\n options = this.options;\n\n // Get the index of the dragged element within its parent\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode;\n\n // Get again after plugin event\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n if (Sortable.eventCanceled) {\n this._nulling();\n return;\n }\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n _cancelNextTick(this.cloneId);\n _cancelNextTick(this._dragStartId);\n\n // Unbind events\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n css(dragEl, 'transform', '');\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n _disableDraggable(dragEl);\n dragEl.style['will-change'] = '';\n\n // Remove classes\n // ghostClass is added in dragStarted\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n toggleClass(dragEl, this.options.chosenClass, false);\n\n // Drag stop event\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n // Remove event\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // drag from one list and drop into another\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent( /**Event*/evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n break;\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n _globalDragOver(evt);\n }\n break;\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n for (; i < n; i++) {\n el = children[i];\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\n option: function option(name, value) {\n var options = this.options;\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n /**\r\n * Destroy\r\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n return;\n }\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return;\n\n // show clone at dragEl or original position\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\nfunction _globalDragOver( /**Event*/evt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n return retVal;\n}\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\nfunction _unsilent() {\n _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n while (i--) {\n sum += str.charCodeAt(i);\n }\n return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n}\n\n// Export utils\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild,\n expando: expando\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\nSortable.get = function (element) {\n return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt;\n\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback);\n\n // Listener for pointer element change\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn;\n\n // New scroll root, set scrollEl\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n var layersOut = 0;\n var currentParent = scrollEl;\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n }\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction Revert() {}\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n this.sortable.animateAll();\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\n multiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\n folding = false,\n // Folding any other time\n dragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n }\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n dataTransfer.setData('Text', data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n });\n\n // Sort multi-drag elements\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n\n sortable.captureAnimationState();\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n }\n\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute);\n\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n }\n\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n activeSortable._showClone(sortable);\n\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children;\n\n // Multi-drag selection\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n (function () {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n var filter = options.filter;\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n // Check if element is draggable\n if (!closest(children[i], options.draggable, parentEl, false)) continue;\n // Check if element is filtered\n var filtered = filter && (typeof filter === 'function' ? filter.call(sortable, evt, children[i], sortable) : filter.split(',').some(function (criteria) {\n return closest(children[i], criteria.trim(), parentEl, false);\n }));\n if (filtered) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvent: evt\n });\n }\n })();\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n }\n }\n\n // Multi-drag drop\n if (dragStarted && this.isMultiDrag) {\n folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n multiDragIndex++;\n });\n\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent('update');\n dispatchSortableEvent('sort');\n }\n }\n }\n\n // Must be done after capturing individual rects (scroll bar)\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n multiDragSortable = toSortable;\n }\n\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n // Only deselect if selection is in this sortable\n if (multiDragSortable !== this.sortable) return;\n\n // Only deselect if target is not item in this sortable\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n multiDragSortable = sortable;\n }\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n\n // multiDragElements will already be sorted if folding\n var newIndex;\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n return key;\n }\n }\n });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-booking-form-config {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n\n .header {\n padding: 1rem;\n display: flex;\n justify-content: space-between;\n border-bottom: 1px solid var(--nylas-base-200);\n\n .header_text {\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n\n .header_action {\n display: flex;\n\n select-dropdown::part(sd_dropdown-button) {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 1rem;\n }\n }\n }\n\n .content {\n padding: 1rem;\n color: var(--nylas-base-900);\n font-size: 16px;\n font-family: var(--nylas-font-family);\n\n @media #{$small-mobile} {\n font-size: 15px;\n }\n\n .additional_fields {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n &.static_fields {\n margin-bottom: 1rem;\n }\n @media #{$small-mobile} {\n gap: 0.5rem;\n padding: 0;\n }\n\n position: relative;\n overflow: auto;\n\n .form-field {\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n padding: 1rem;\n user-select: none;\n background-color: white;\n /* Prevent text selection */\n position: relative;\n\n &.highlight {\n background-color: var(--nylas-base-200);\n }\n\n .form-field_header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n .dragable {\n cursor: move;\n }\n\n .form-field_header_text {\n flex: 1;\n text-align: left;\n padding-left: 1rem;\n\n h4 {\n margin: 0;\n font-size: 16px;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n\n .form-field_header_actions {\n display: flex;\n align-items: center;\n\n .is-required {\n color: var(--nylas-base-500);\n background-color: var(--nylas-base-50);\n font-weight: 600;\n padding: 4px 8px;\n border-radius: var(--nylas-border-radius-2x);\n }\n\n button {\n border: none;\n background: transparent;\n height: 40px;\n margin: 0 1rem;\n cursor: pointer;\n color: var(--nylas-base-800);\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n }\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n }\n }\n }\n\n span.error {\n opacity: 1;\n color: var(--nylas-error);\n margin-top: 8px;\n transition: opacity 0.3s ease-out;\n\n &.fade-out {\n opacity: 0;\n }\n }\n\n .form-field_content {\n padding: 1.5rem 0 0 2.7rem;\n\n &.hidden {\n display: none;\n }\n\n .inputs {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n\n .label-input {\n padding: 0 1rem 0 0;\n }\n\n .required-input {\n display: flex;\n\n label {\n padding: 0.5rem;\n }\n\n input[type='checkbox'] {\n transform: scale(1.3);\n }\n }\n }\n\n .options-container {\n h4 {\n margin: 0;\n font-size: 16px;\n line-height: 20px;\n font-weight: 500;\n padding: 0.5rem 0;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n button {\n border: none;\n background: transparent;\n height: 40px;\n margin: 1rem 0;\n cursor: pointer;\n color: var(--nylas-base-800);\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n }\n\n .options {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n .option {\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n button {\n border: none;\n background: transparent;\n height: 40px;\n margin: 0 1rem;\n cursor: pointer;\n color: var(--nylas-base-800);\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n }\n }\n }\n }\n }\n }\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { DEFAULT_FORM_FIELD_TYPES, FIELD_TYPES } from '@/common/constants';\nimport { Configuration, AdditionalFields } from '@nylas/core';\nimport Sortable from 'sortablejs';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\ninterface AdditionalFieldsInternal extends AdditionalFields {\n isOpen: boolean;\n readonly?: boolean;\n typeLabel: string;\n key?: string; // Make optional\n error?: string; // Make optional\n fieldLabelKey?: string; // Make optional\n}\nconst fieldTypesWithOptions = ['dropdown', 'radio_button'];\nconst fieldTypesWithMultipleOptions = ['multi_select'];\n\n/**\n * The `nylas-booking-form-config` component is a form input for adding additional fields to the booking form.\n * @part nbfc__header - The header of the booking form\n * @part nbfc__add_field - The add field selection container\n * @part nbfc__add_field-button - The add field selection button\n * @part nbfc__add_field-content - The add field selection dropdown content\n * @part nbfc__additional_fields - The aditional fields container\n * @part nbfc__form-field - The single form container\n * @part nbfc__form-field-header - The single form header\n * @part nbfc__form-field-content - The single form content\n */\n@Component({\n tag: 'nylas-booking-form-config',\n styleUrl: 'nylas-booking-form-config.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasBookingFormConfig {\n /**\n * The element <nylas-booking-form-config> itself.\n */\n @Element() host!: HTMLNylasBookingFormConfigElement;\n\n /**\n * @internal\n * The selected configuration.\n */\n @Prop() selectedConfiguration?: Configuration;\n\n /**\n * The name of the booking form config.\n */\n @Prop() name: string = 'additional-fields';\n\n /**\n * The additional fields to be displayed on the booking form.\n */\n @Prop() additionalFields?: AdditionalFields[];\n\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * This event is fired when the selected availability / open hours change.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n @State() staticFields = [\n {\n type: 'text',\n label: 'Your name',\n key: 'your_name',\n typeLabel: 'Short text',\n readonly: true,\n required: true,\n isOpen: false,\n fieldLabelKey: 'your_name',\n order: 0,\n },\n {\n type: 'email',\n label: 'Your Email',\n key: 'your_email',\n typeLabel: 'Email',\n readonly: true,\n isOpen: false,\n required: true,\n fieldLabelKey: 'your_email',\n order: 1,\n },\n ];\n\n @State() formFields!: AdditionalFieldsInternal[];\n\n @State() formFieldsOrder!: AdditionalFieldsInternal[];\n\n @State() count: number = 0;\n\n @State() watchFields!: {\n title: string;\n description: string;\n };\n @State() fieldTypes = DEFAULT_FORM_FIELD_TYPES.map(f => {\n return { label: i18next.t(`nylasBookingFormConfig.fieldType.${f.value}`), value: f.value };\n });\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-calendar-picker', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n this.updateFormFields(newValue, false);\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n this.fieldTypes = DEFAULT_FORM_FIELD_TYPES.map(f => {\n return { label: i18next.t(`nylasBookingFormConfig.fieldType.${f.value}`), value: f.value };\n });\n }\n\n connectedCallback() {\n debug('nylas-booking-form-config', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-booking-form-config', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-booking-form-config', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n this.formFields = [];\n this.formFieldsChangedHandler(this.formFields, false);\n }\n\n componentDidLoad() {\n debug('nylas-booking-form-config', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.updateFormFields(this.selectedConfiguration, false);\n }\n }\n\n /**\n * This method is essentially a workaround to check if the internals are available because\n * the unit tests in stencil do not support the internals.\n * @returns boolean\n */\n get isInternalsAvailable() {\n return this.internals !== undefined && typeof this.internals.setFormValue === 'function';\n }\n\n updateFormFields(config: Configuration, valueChanged: boolean = true) {\n this.watchFields = {\n title: config?.event_booking?.title || '',\n description: config?.event_booking?.description || '',\n };\n const additionalFields =\n Object.entries(config?.scheduler?.additional_fields || {}).map(([id, field]) => ({ ...(field as AdditionalFields), key: id })) || this.additionalFields || [];\n\n this.formFields = [\n ...additionalFields\n .sort((a, b) => a.order - b.order)\n .map((f: AdditionalFields, _i) => {\n const fieldType = FIELD_TYPES.find(field => field.type === f.type);\n if (!fieldType) {\n return { ...f, isOpen: false, typeLabel: 'Unknown' };\n }\n const typeLabel = fieldType.label;\n const order = f.order || 0;\n return { ...f, order: order - 1, isOpen: false, typeLabel, fieldLabelKey: f.type };\n }),\n ];\n this.formFields = [...this.formFields];\n\n this.formFieldsChangedHandler(this.formFields, valueChanged);\n const container = this.host.shadowRoot?.getElementById('fields');\n Sortable.create(container, {\n animation: 150,\n swap: true, // Enable swap plugin\n swapClass: 'highlight', // The class applied to the hovered swap item\n onEnd: this.swapFields.bind(this),\n handle: '.form-field_header', // Only allow dragging by the header\n filter: '.fixed', // Disable dragging for elements with the 'fixed' class\n fallbackTolerance: 3, // So that we can select items on mobile\n onMove: evt => !evt.related.classList.contains('fixed'), // Prevent moving if target has 'fixed' class\n });\n }\n\n formFieldsChangedHandler(newValue: AdditionalFieldsInternal[], valueChanged: boolean = true) {\n const additionalFields = newValue || [];\n // Remove readonly fields, sort by order\n const sortedFields = additionalFields\n .filter(f => !f.readonly)\n .sort((a, b) => a.order - b.order)\n .map((f, i) => {\n const field: AdditionalFields = {\n type: f.type,\n required: f.required,\n label: f.label,\n order: i + 1,\n options: f.options,\n key: f.key,\n default: f.default,\n fieldLabelKey: f.fieldLabelKey,\n };\n return { ...field };\n });\n\n // Map fields to object\n const addFieldsMap = sortedFields.reduce((acc, field) => {\n if (field.key) {\n // Only add fields with defined keys\n acc[field.key] = {\n type: field.type,\n required: field.required,\n order: field.order,\n options: field.options,\n label: field.label,\n default: field.default,\n };\n }\n return acc;\n }, {});\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(addFieldsMap), this.name);\n\n if (valueChanged) {\n // Do not emit the valueChanged event on initial load\n this.valueChanged.emit({\n value: JSON.stringify(addFieldsMap),\n name: this.name,\n });\n }\n this.formFields = [...this.formFields];\n }\n\n /**\n * This function finds the next missing number in an array of strings (keys of additional_fields).\n * We use this function to generate the next consecutive index number for the key.\n * For example,\n * - If the keys are ['dropdown_another-one_1', 'dropdown_Whatever-choose-one_3'] the function will return 2.\n * - If the array is empty, the function will return 1.\n * - If there are no missing numbers in between, the function will return the next number after the last element.\n *\n * @param arr of keys stored in the formFields for the given field type\n * @returns a number that is the next (consecutive) missing number in the array\n */\n findNextMissingNumber(arr: string[]): number {\n if (arr.length === 0) {\n return 1; // If the array is empty, the first number is 1\n }\n\n // Extract numbers from strings by splitting on underscore and popping the last element\n const numbers = arr\n .map(item => {\n const parts = item.split('_'); // Split the string by '_'\n const lastPart = parts.pop(); // Get the last part (should be the number)\n const parsedNumber = parseInt(lastPart || '', 10);\n return isNaN(parsedNumber) ? null : parsedNumber; // Return the parsed number or null if not a valid number\n })\n .filter((num): num is number => num !== null) // Filter out any null values and assert that the result is a number\n .sort((a, b) => a - b); // Sort numbers in ascending order\n\n // Iterate through the sorted numbers to find the missing number\n for (let i = 0; i < numbers.length - 1; i++) {\n if (numbers[i + 1] !== numbers[i] + 1) {\n return numbers[i] + 1; // Return the missing number\n }\n }\n\n // If no number is missing in between, return the next number after the last element\n return numbers.length > 0 ? numbers[numbers.length - 1] + 1 : 1;\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(\n event: CustomEvent<{\n value: string;\n name: string;\n }>,\n ) {\n const { name, value } = event.detail;\n if (name === 'add-field') {\n const field = FIELD_TYPES.find(f => f.type === value);\n const maxOrder = Math.max(...this.formFields.map(f => f.order));\n const existingFieldKeys = this.formFields.filter(f => f.type === field.type && f.key !== undefined).map(f => f.key as string);\n const next = this.findNextMissingNumber(existingFieldKeys);\n const newField = { ...field, label: field.label, key: `${field.type}_${field.label.split(' ').join('-')}_${next}`, order: maxOrder + 1 }; // Copy object + Ensure unique order\n this.formFields = [...this.formFields, newField];\n this.formFieldsChangedHandler(this.formFields);\n } else if (name.includes('-default-value')) {\n const fieldIndex = parseInt(name.split('-')[0] || '0');\n let defaultValue = value;\n if (value === 'null') {\n defaultValue = '';\n }\n this.fieldDefaultValueChanged(fieldIndex, { detail: { value: defaultValue } });\n }\n }\n\n @Listen('selectedOptionsChanged')\n selectedOptionsChangedHandler(event: CustomEvent<{ value: string[]; name: string }>) {\n const { name, value } = event.detail;\n if (name.includes('-default-value')) {\n const fieldIndex = parseInt(name.split('-')[0] || '0');\n const defaultValue = value.join(', ');\n this.fieldDefaultValueChanged(fieldIndex, { detail: { value: defaultValue } });\n }\n }\n\n @Listen('nylasFormInputChanged')\n nylasFormInputChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { name } = event.detail;\n if (name.startsWith('default-value-')) {\n const fieldIndex = parseInt(name.split('-').pop() || '0');\n this.fieldDefaultValueChanged(fieldIndex, event);\n } else {\n const [fieldIndex, optionIndex] = name.split('_');\n if (optionIndex) {\n this.fieldOptionChange(parseInt(fieldIndex), parseInt(optionIndex), event);\n } else {\n this.fieldLabelChange(parseInt(fieldIndex), event);\n }\n }\n }\n\n @Listen('valueChanged', { target: 'document' })\n valueChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { name, value } = event.detail;\n if (name === 'title' || name === 'description') {\n this.watchFields = {\n ...this.watchFields,\n [name]: value,\n };\n }\n }\n\n swapFields(event) {\n const { oldIndex, newIndex } = event;\n if (oldIndex == null || newIndex == null || oldIndex === newIndex) {\n return;\n }\n // Create a copy of the current fields array\n const updatedFields = [...this.formFields];\n\n // Remove the dragged item from its old position\n const [draggedItem] = updatedFields.splice(oldIndex, 1);\n\n // Insert the dragged item at its new position\n updatedFields.splice(newIndex, 0, draggedItem);\n\n // Recalculate order for each field (starting at 1 as required)\n updatedFields.forEach((field, index) => {\n field.order = index + 1;\n });\n\n // Update state and trigger UI re-render\n this.formFields = updatedFields;\n this.formFieldsChangedHandler(this.formFields);\n }\n\n fieldToggle(index) {\n this.formFields = this.formFields.map((f, i) => {\n if (index == i) {\n f.isOpen = !f.isOpen;\n }\n return f;\n });\n this.formFieldsChangedHandler(this.formFields);\n }\n staticFieldToggle(index) {\n this.staticFields = this.staticFields.map((f, i) => {\n if (index == i) {\n f.isOpen = !f.isOpen;\n }\n return f;\n });\n this.staticFields = [...this.staticFields];\n }\n fieldRemove(index) {\n this.formFields = this.formFields.filter((_, i) => i !== index);\n this.formFieldsChangedHandler(this.formFields);\n }\n\n fieldRequired(index) {\n this.formFields = this.formFields.map((field, i) => {\n if (i === index) {\n field.required = !field.required;\n }\n return field;\n });\n this.formFieldsChangedHandler(this.formFields);\n }\n fieldLabelChange(ind, event) {\n const target = event.detail;\n this.formFields = this.formFields.map((field, i) => {\n if (i === ind) {\n const label = target.value;\n return {\n ...field,\n label: label,\n };\n }\n return field;\n });\n this.formFieldsChangedHandler(this.formFields);\n }\n fieldOptionAdd(index) {\n this.formFields = this.formFields.map((field, i) => {\n if (i === index) {\n if (!field.options) {\n field.options = [];\n }\n field.options = [...field.options, ''];\n }\n return field;\n });\n this.formFieldsChangedHandler(this.formFields);\n }\n\n fieldOptionRemove(fieldIndex, index) {\n this.formFields = this.formFields.map((field, i) => {\n if (i === fieldIndex) {\n if (!field.options) {\n field.options = [];\n }\n field.options = field.options.filter((_, i) => i !== index);\n }\n return field;\n });\n this.formFieldsChangedHandler(this.formFields);\n }\n fieldOptionChange(fieldIndex, index, event) {\n this.formFields = this.formFields.map((field, i) => {\n if (i === fieldIndex) {\n if (!field.options) {\n field.options = [];\n }\n field.options = field.options.map((o, i) => {\n if (i === index) {\n o = event.detail.value;\n }\n return o;\n });\n }\n return field;\n });\n this.formFieldsChangedHandler(this.formFields);\n }\n\n fieldDefaultValueChanged(index, event) {\n this.formFields = this.formFields.map((field, i) => {\n if (i === index) {\n field.default = event.detail.value;\n }\n return field;\n });\n this.formFieldsChangedHandler(this.formFields);\n }\n\n @RegisterComponent<NylasBookingFormConfig, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-booking-form-config',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div class=\"nylas-booking-form-config\" part=\"nbfc\">\n <div class=\"header\" part=\"nbfc__header\">\n <div class=\"header_text\">\n <h3>{i18next.t('nylasBookingFormConfig.headerTitle')}</h3>\n <p>{i18next.t('nylasBookingFormConfig.headerSubTitle')}</p>\n </div>\n <div class=\"header_action\">\n <select-dropdown\n name=\"add-field\"\n exportparts=\"sd_dropdown: nbfc__add_field, sd_dropdown-button: nbfc__add_field-button, sd_dropdown-content: nbfc__add_field-dropdown-content\"\n options={this.fieldTypes}\n withSearch={false}\n withChevron={false}\n dropdownButtonText={i18next.t('nylasBookingFormConfig.dropdownButtonText')}\n >\n <span slot=\"select-icon\">\n <plus-icon width=\"15\" height=\"15\"></plus-icon>\n </span>\n </select-dropdown>\n </div>\n </div>\n <div class=\"content\">\n <div class=\"additional_fields static_fields\" part=\"nbfc__static_fields\">\n {this.staticFields.map((field, i) => {\n return (\n <div class={`form-field draggable ${field.readonly && 'fixed'}`} part=\"nbfc__form_field\" key={i}>\n <div class=\"form-field_header\" part=\"nbfc__form_field-header\">\n <span class=\"dragable\">\n <dragable-icon width=\"24\" height=\"25\"></dragable-icon>\n </span>\n <div class=\"form-field_header_text\">\n <h4>{i18next.t(`nylasBookingFormConfig.fieldLabel.${field.fieldLabelKey}`)}</h4>\n <p>{i18next.t(`nylasBookingFormConfig.fieldType.${field.type}`)}</p>\n </div>\n <div class=\"form-field_header_actions\">\n <span class={`is-required`}>{field.required ? i18next.t('required') : i18next.t('optional')}</span>\n <span\n class={`chevron ${field.isOpen ? 'open' : 'closed'}`}\n onClick={() => {\n this.staticFieldToggle(i);\n }}\n >\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n </div>\n <div class={`form-field_content ${!field.isOpen && 'hidden'}`} part=\"nbfc__form_field-content\">\n <div class=\"inputs\">\n <input-component\n class={'label-input'}\n name={`${i}`}\n key={i}\n label={i18next.t('nylasBookingFormConfig.label')}\n required={false}\n readOnly={field.readonly}\n defaultValue={field.label}\n >\n <div class=\"required-input\" slot=\"additional-input\">\n <input\n type=\"checkbox\"\n name={`required_${field.order}`}\n id={`required_${field.order}`}\n onClick={() => {\n this.fieldRequired(i);\n }}\n checked={field.required}\n disabled={field.readonly}\n />\n\n <label htmlFor={`required_${field.order}`} aria-label=\"Required\">\n {i18next.t('required')}\n </label>\n </div>\n </input-component>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n <div id=\"fields\" class=\"additional_fields\" part=\"nbfc__additional_fields\">\n {this.formFields?.map((field, i) => {\n return (\n <div class={`form-field draggable ${field?.readonly ? 'fixed' : ''}`} part=\"nbfc__form_field\" key={field.key}>\n <div class=\"form-field_header\" part=\"nbfc__form_field-header\">\n <span class=\"dragable\">\n <dragable-icon width=\"24\" height=\"25\"></dragable-icon>\n </span>\n <div class=\"form-field_header_text\">\n <h4>{field.label || i18next.t(`nylasBookingFormConfig.fieldLabel.${field.fieldLabelKey}`)}</h4>\n <p>{i18next.t(`nylasBookingFormConfig.fieldType.${field.type}`)}</p>\n </div>\n <div class=\"form-field_header_actions\">\n <span class={`is-required`}>{field.required ? i18next.t('required') : i18next.t('optional')}</span>\n {!field.readonly && (\n <button\n onClick={() => {\n const title = this.watchFields.title;\n const description = this.watchFields.description;\n if (title && field.key && title.includes(field.key)) {\n field.error = i18next.t('nylasBookingFormConfig.fieldInTitleError');\n this.formFields = [...this.formFields];\n this.formFieldsChangedHandler(this.formFields);\n setTimeout(() => {\n field.error = '';\n this.formFields = [...this.formFields];\n this.formFieldsChangedHandler(this.formFields);\n }, 3000);\n return;\n }\n if (description && field.key && description.includes(field.key)) {\n field.error = i18next.t('nylasBookingFormConfig.fieldInDescriptionError');\n this.formFields = [...this.formFields];\n this.formFieldsChangedHandler(this.formFields);\n setTimeout(() => {\n field.error = '';\n this.formFields = [...this.formFields];\n this.formFieldsChangedHandler(this.formFields);\n }, 3000);\n return;\n }\n this.fieldRemove(i);\n }}\n >\n <close-icon />\n </button>\n )}\n <span\n class={`chevron ${field.isOpen ? 'open' : 'closed'}`}\n onClick={() => {\n this.fieldToggle(i);\n }}\n >\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n </div>\n <span\n class={{\n 'error': true,\n 'fade-out': !field?.error || field.error === '',\n }}\n >\n {field.error}\n </span>\n <div class={`form-field_content ${!field.isOpen && 'hidden'}`} part=\"nbfc__form_field-content\">\n <div class=\"inputs\">\n <input-component\n class={'label-input'}\n name={`${i}`}\n key={`${i}-${field.key}-label`}\n label={i18next.t('nylasBookingFormConfig.label')}\n required={false}\n readOnly={field.readonly}\n defaultValue={field.label}\n >\n <div class=\"required-input\" slot=\"additional-input\">\n <input\n type=\"checkbox\"\n name={`required_${i}`}\n id={`required_${i}`}\n onClick={() => {\n this.fieldRequired(i);\n }}\n checked={field.required}\n disabled={field.readonly}\n />\n\n <label htmlFor={`required_${i}`} aria-label=\"Required\">\n {i18next.t('required')}\n </label>\n </div>\n </input-component>\n {!field.readonly && fieldTypesWithOptions.includes(field.type) && (\n <select-dropdown\n name={`${i}-${field.key}-default-value`}\n key={`${i}-${field.key}-default-value`}\n label={i18next.t('nylasBookingFormConfig.defaultValue')}\n required={false}\n readOnly={field.readonly}\n options={[\n { value: 'null', label: i18next.t('nylasBookingCalendarPicker.selectOptionLabel') },\n ...(field.options?.map(o => ({ value: o, label: o })) || []),\n ]}\n emptyValue={i18next.t('nylasBookingCalendarPicker.selectOptionLabel')}\n withSearch={false}\n />\n )}\n {!field.readonly && field.type === 'checkbox' && (\n <select-dropdown\n name={`${i}-${field.key}-default-value`}\n key={`${i}-${field.key}-default-value`}\n label={i18next.t('nylasBookingFormConfig.defaultValue')}\n required={false}\n readOnly={field.readonly}\n options={[{ value: 'null', label: i18next.t('nylasBookingCalendarPicker.selectOptionLabel') }, ...['true', 'false'].map(o => ({ value: o, label: o }))]}\n emptyValue={i18next.t('nylasBookingCalendarPicker.selectOptionLabel')}\n withSearch={false}\n />\n )}\n {!field.readonly && fieldTypesWithMultipleOptions.includes(field.type) && (\n <multi-select-dropdown\n name={`${i}-${field.key}-default-value`}\n key={`${i}-${field.key}-default-value`}\n label={i18next.t('nylasBookingFormConfig.defaultValue')}\n required={false}\n selectAtLeastOneOptionLabel={i18next.t('selectOneOrMoreOptions')}\n multipleOptionsSelectedLabel={i18next.t('multipleOptionsSelected')}\n readOnly={field.readonly}\n options={field.options?.filter(o => !!o && o !== null).map(o => ({ value: o, label: o })) || []}\n />\n )}\n {!field.readonly &&\n field.type !== 'date' &&\n field.type !== 'checkbox' &&\n !fieldTypesWithOptions.includes(field.type) &&\n !fieldTypesWithMultipleOptions.includes(field.type) && (\n <input-component\n class={'default-value'}\n name={`default-value-${i}`}\n key={`${i}-${field.key}-default-value`}\n label={i18next.t('nylasBookingFormConfig.defaultValue')}\n required={false}\n readOnly={field.readonly}\n defaultValue={field.default}\n />\n )}\n {!field.readonly && field.type === 'date' && (\n <nylas-date-component\n class={'default-value'}\n name={`default-value-${i}`}\n key={`${i}-${field.key}-default-value`}\n label={i18next.t('nylasBookingFormConfig.defaultValue')}\n required={false}\n readOnly={field.readonly}\n defaultValue={field.default}\n />\n )}\n </div>\n {field.options != undefined && (\n <div class=\"options-container\">\n <h4>{i18next.t('nylasBookingFormConfig.allOptionsHeader')}</h4>\n <div class=\"options\">\n {field.options.map((o, j) => {\n return (\n <div class=\"option\">\n <input-component key={j} name={`${i}_${j}`} label={field.typeLabel + ' option ' + (j + 1)} required={true} defaultValue={o}>\n {j > 1 && (\n <div class=\"required-input\" slot=\"additional-input\">\n <button\n onClick={() => {\n this.fieldOptionRemove(i, j);\n }}\n >\n <close-icon />\n </button>\n </div>\n )}\n </input-component>\n </div>\n );\n })}\n </div>\n <button\n onClick={() => {\n this.fieldOptionAdd(i);\n }}\n part=\"nap__add-time-range\"\n >\n <add-circle-icon /> {i18next.t('nylasBookingFormConfig.addOption')}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-buffer-time {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n text-align: left;\n\n .header {\n padding: 1rem;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n display: flex;\n gap: 4px;\n align-items: center;\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n\n .nylas-buffer-time__body {\n display: grid;\n grid-template-columns: 1fr auto;\n\n @media #{$mobile} {\n grid-template-columns: 1fr;\n }\n\n .nylas-buffer-time__dropdown {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n border-right: 1px solid var(--nylas-base-200);\n color: var(--nylas-base-800);\n\n @media #{$mobile} {\n border: none;\n }\n\n .nylas-buffer-time__row {\n display: grid;\n grid-template-columns: auto 1fr;\n align-items: center;\n gap: 1rem;\n\n label {\n width: 200px;\n }\n\n .dropdown-container {\n display: flex;\n gap: 1rem;\n align-items: center;\n justify-content: flex-end;\n\n span {\n width: -webkit-fill-available;\n width: fill-available;\n width: -moz-available;\n text-align: end;\n }\n }\n }\n }\n\n .nylas-buffer-time__preview {\n width: 208px;\n background: var(--nylas-base-25);\n border-bottom-right-radius: var(--nylas-border-radius-2x);\n\n @media #{$mobile} {\n width: inherit;\n border-bottom-left-radius: var(--nylas-border-radius-2x);\n }\n\n h4 {\n font-size: 14px;\n line-height: 24px;\n color: var(--nylas-base-600);\n font-family: var(--nylas-font-family);\n font-weight: 500;\n text-align: center;\n margin: 0.75rem 0;\n }\n\n .preview-container {\n padding: 0 2rem 1rem;\n\n .slot {\n background-color: transparent;\n border-top: 1px solid var(--nylas-base-300);\n\n &.active {\n background-color: var(--nylas-base-100);\n }\n\n &:last-of-type {\n border-bottom: 1px solid var(--nylas-base-300);\n }\n }\n\n .event-slot {\n background-color: var(--nylas-base-600);\n border-top: 1px solid var(--nylas-base-300);\n }\n }\n }\n }\n\n .nylas-buffer-time__dropdown {\n select-dropdown::part(sd_dropdown-button) {\n width: 104px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 14px;\n }\n\n select-dropdown::part(sd_dropdown-content) {\n width: 100%;\n }\n\n select-dropdown::part(sd_dropdown-button-selected-label) {\n max-width: calc(100% - 2rem);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-buffer-time` component is a UI component that allows users to set buffer time before and after an event.\n *\n * @part nbt - The buffer time container\n * @part nbt__header - The header of the buffer time\n * @part nbt__body - The body of the buffer time\n * @part nbt__dropdown-before - The dropdown container for the before buffer time\n * @part nbt__dropdown-button-before - The dropdown button for the before buffer time\n * @part nbt__dropdown-content-before - The dropdown content for the before buffer time\n * @part nbt__dropdown-after - The dropdown container for the after buffer time\n * @part nbt__dropdown-button-after - The dropdown button for the after buffer time\n * @part nbt__dropdown-content-after - The dropdown content for the after buffer time\n * @part nbt__preview - The preview container\n */\n@Component({\n tag: 'nylas-buffer-time',\n styleUrl: 'nylas-buffer-time.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasBufferTime {\n @Element() host!: HTMLNylasCalendarPickerElement;\n /**\n * @internal\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * The name of the calendar picker.\n */\n @Prop() name: string = 'buffer-time';\n /**\n * @standalone\n * The buffer time\n */\n @Prop() buffer: { before: number; after: number } = this.selectedConfiguration?.availability?.availability_rules?.buffer ?? { before: 0, after: 0 };\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The selected before buffer time.\n */\n @State() selectedBeforeBufferTime: number = this.buffer.before;\n\n /**\n * The selected after buffer time.\n */\n @State() selectedAfterBufferTime: number = this.buffer.after;\n\n @State() componentLoaded: boolean = false;\n\n /**\n * This event is fired when the selected buffer time is changed.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-buffer-time', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-buffer-time', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-buffer-time', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-buffer-time', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.selectedBeforeBufferTime = this.buffer.before;\n this.selectedAfterBufferTime = this.buffer.after;\n }\n this.updateFormValue(false);\n this.componentLoaded = true;\n }\n\n componentWillUpdate() {\n debug('nylas-buffer-time', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-buffer-time', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-buffer-time', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-buffer-time', 'componentDidRender');\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-buffer-time', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-buffer-time', 'selectedConfigurationChangedHandler', newValue);\n const buffer = newValue?.availability?.availability_rules?.buffer;\n this.selectedAfterBufferTime = buffer?.after ? buffer.after : this.buffer.after;\n this.selectedBeforeBufferTime = buffer?.before ? buffer.before : this.buffer.before;\n this.updateFormValue(false);\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 @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-buffer-time', 'nylasFormDropdownChangedHandler', event.detail);\n const { value, name } = event.detail;\n if (name === 'before-buffer-time') {\n this.selectedBeforeBufferTime = parseInt(value);\n } else if (name === 'after-buffer-time') {\n this.selectedAfterBufferTime = parseInt(value);\n }\n this.updateFormValue();\n }\n\n /**\n * This method is essentially a workaround to check if the internals are available because\n * the unit tests in stencil do not support the internals.\n * @returns boolean\n */\n get isInternalsAvailable() {\n return this.internals !== undefined && typeof this.internals.setFormValue === 'function';\n }\n\n updateFormValue(valueChanged: boolean = true) {\n const bufferTime = {\n before: this.selectedBeforeBufferTime,\n after: this.selectedAfterBufferTime,\n };\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(bufferTime), this.name);\n if (valueChanged) {\n this.valueChanged.emit({ value: JSON.stringify(bufferTime), name: this.name });\n }\n }\n\n renderPreview() {\n const totalSlots = 4;\n const slotHeight = 10; // The height for each 30-minute slot\n\n // Event slot height is constant\n const eventSlotHeight = slotHeight * 2;\n\n // Helper function to determine the fill of a slot based on the minutes selected\n const slotFill = minutes => {\n const fullSlots = Math.floor(minutes / 30);\n const partialFillHeight = ((minutes % 30) / 30) * slotHeight;\n\n return {\n fullSlots,\n partialFillHeight,\n };\n };\n\n // Helper function to create before slots\n const createBeforeSlots = () => {\n const { fullSlots, partialFillHeight } = slotFill(this.selectedBeforeBufferTime);\n\n return Array.from({ length: totalSlots }, (_, index) => {\n // Slot is active if its index is greater than the total slots minus the full slots minus one\n // and there are some minutes selected.\n const isActive = this.selectedBeforeBufferTime > 0 && index > totalSlots - fullSlots - 1;\n const isPartial = this.selectedBeforeBufferTime > 0 && index === totalSlots - fullSlots - 1 && partialFillHeight > 0;\n\n const slotStyle: {\n backgroundColor?: string;\n background?: string;\n } = {};\n if (isActive && !isPartial) {\n slotStyle.backgroundColor = 'var(--nylas-base-100)';\n } else if (isPartial) {\n slotStyle.background = `linear-gradient(to top, var(--nylas-base-100) ${partialFillHeight}px, transparent 0)`;\n }\n\n return (\n <div\n key={index}\n class={`slot ${isActive ? 'active' : ''}`}\n style={{\n height: `${slotHeight}px`,\n ...slotStyle,\n }}\n ></div>\n );\n });\n };\n\n // Helper function to create after slots\n const createAfterSlots = () => {\n const { fullSlots, partialFillHeight } = slotFill(this.selectedAfterBufferTime);\n\n return Array.from({ length: totalSlots }, (_, index) => {\n const isActive = this.selectedAfterBufferTime > 0 && index < fullSlots;\n const isPartial = index === fullSlots && partialFillHeight > 0;\n\n const slotStyle: {\n backgroundColor?: string;\n background?: string;\n } = {};\n if (isActive && !isPartial) {\n slotStyle.backgroundColor = 'var(--nylas-base-100)';\n } else if (isPartial) {\n slotStyle.background = `linear-gradient(to bottom, var(--nylas-base-100) ${partialFillHeight}px, transparent 0)`;\n }\n\n return (\n <div\n key={index}\n class={`slot ${isActive ? 'active' : ''}`}\n style={{\n height: `${slotHeight}px`,\n ...slotStyle,\n }}\n ></div>\n );\n });\n };\n\n return (\n <div class=\"preview-container\">\n {createBeforeSlots()}\n <div class=\"event-slot\" style={{ height: `${eventSlotHeight}px` }}></div>\n {createAfterSlots()}\n </div>\n );\n }\n\n @RegisterComponent<NylasBufferTime, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-buffer-time',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const minuteOptions = Array.from({ length: 25 }, (_, i) => {\n const value = i * 5;\n return {\n label: value.toString(),\n value: value.toString(),\n };\n });\n\n return (\n <Host>\n <div class=\"nylas-buffer-time\" part=\"nbt\">\n <div class=\"header\" part=\"nbt__header\">\n <h3>{i18next.t('nylasBufferTime.headerTitle')}</h3>\n <p>\n {i18next.t('nylasBufferTime.headerSubTitle')}\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasBufferTime.tooltip.desc')}</span>\n </tooltip-component>\n </p>\n </div>\n <div class=\"nylas-buffer-time__body\" part=\"nbt__body\">\n <div class=\"nylas-buffer-time__dropdown\">\n <div class=\"nylas-buffer-time__row\">\n <label>{i18next.t('nylasBufferTime.beforeBufferLabel')}</label>\n <div class=\"dropdown-container\">\n {this.componentLoaded && (\n <select-dropdown\n id=\"before-buffer-time\"\n withSearch={false}\n name=\"before-buffer-time\"\n exportparts=\"sd_dropdown: nbt__dropdown-before, sd_dropdown-button: nbt__dropdown-button-before, sd_dropdown-content: nbt__dropdown-content-before\"\n options={minuteOptions}\n defaultSelectedOption={minuteOptions.find(min => min.value === this.selectedBeforeBufferTime.toString())}\n />\n )}\n <span>{i18next.t('nylasBufferTime.minutesShort')}</span>\n </div>\n </div>\n <div class=\"nylas-buffer-time__row\">\n <label>{i18next.t('nylasBufferTime.afterBufferLabel')}</label>\n <div class=\"dropdown-container\">\n {this.componentLoaded && (\n <select-dropdown\n id=\"after-buffer-time\"\n withSearch={false}\n name=\"after-buffer-time\"\n exportparts=\"sd_dropdown: nbt__dropdown-after, sd_dropdown-button: nbt__dropdown-button-after, sd_dropdown-content: nbt__dropdown-content-after\"\n options={minuteOptions}\n defaultSelectedOption={minuteOptions.find(min => min.value === this.selectedAfterBufferTime.toString())}\n />\n )}\n <span>{i18next.t('nylasBufferTime.minutesShort')}</span>\n </div>\n </div>\n </div>\n <div class=\"nylas-buffer-time__preview\" part=\"nbt__preview\">\n <h4>{i18next.t('nylasBufferTime.previewHeader')}</h4>\n {this.renderPreview()}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-calendar-picker {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n\n .nylas-calendar-picker__loading {\n padding-bottom: 1rem;\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n .label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 1rem 1rem 0;\n color: var(--nylas-base-800);\n\n tooltip-component {\n display: flex;\n }\n }\n\n .loading-button {\n margin: 0 1rem;\n padding: 0;\n width: inherit;\n height: 48px;\n color: var(--nylas-base-900);\n font-size: 16px;\n cursor: not-allowed;\n display: flex;\n gap: 0.5rem;\n justify-content: space-between;\n align-items: center;\n background: transparent;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n\n span {\n padding: 0 1rem;\n }\n }\n }\n\n .nylas-calendar-picker__dropdown {\n padding: 1rem;\n\n multi-select-dropdown::part(msd_dropdown) {\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n multi-select-dropdown::part(msd_dropdown-button) {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 1rem;\n }\n\n multi-select-dropdown::part(msd_dropdown-button--error) {\n border: 1px solid var(--nylas-error);\n }\n\n multi-select-dropdown::part(msd_dropdown-content) {\n width: 100%;\n max-width: unset;\n margin-top: -0.5rem;\n }\n\n multi-select-dropdown::part(msd_dropdown-button-selected-label) {\n max-width: calc(100% - 2rem);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n }\n}","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { Calendar } from '@nylas/core';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { User } from '@/common/nylas-api-request';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-calendar-picker` component is a form input for selecting calendars to check availability.\n *\n * @part ncp - The calendar picker container\n * @part ncp__dropdown - The dropdown container\n * @part ncp__dropdown-button - The dropdown button\n * @part ncp__dropdown-content - The dropdown content\n */\n@Component({\n tag: 'nylas-calendar-picker',\n styleUrl: 'nylas-calendar-picker.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasCalendarPicker {\n @Element() host!: HTMLNylasCalendarPickerElement;\n /**\n * @standalone\n * The name of the calendar picker.\n */\n @Prop() name: string = 'calendar';\n /**\n * @standalone\n * The logged in user.\n */\n @Prop() currentUser?: User;\n /**\n * @standalone\n * The calendars to choose from.\n */\n @Prop() calendars?: Calendar[];\n /**\n * @standalone\n * The default selected calendars.\n */\n @Prop() defaultSelectedCalendars: string[] = [];\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The selected calendars.\n */\n @State() selectedCalendars: string[] = [];\n\n /**\n * The error message to display.\n */\n @State() error: string = '';\n\n /**\n * This event is fired when the selected calendars change.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string[];\n name: string;\n valueChangedHandler?: (event: CustomEvent<{ value: string[]; name: string }>) => void;\n }>;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-calendar-picker', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @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('nylasCalendarPicker.selectAtLeastOneCalendar');\n }\n }\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-calendar-picker', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-calendar-picker', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-calendar-picker', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-calendar-picker', 'componentDidLoad');\n // TODO: Remove this when the internals in tests are fixed.\n if (typeof this.internals.setFormValue === 'function') {\n this.internals.setFormValue(this.defaultSelectedCalendars.toString(), this.name);\n }\n }\n\n componentWillUpdate() {\n debug('nylas-calendar-picker', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-calendar-picker', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-calendar-picker', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-calendar-picker', 'componentDidRender');\n }\n\n @Listen('selectedOptionsChanged')\n selectedOptionsChangedHandler(event: CustomEvent<{ value: string[]; name: string }>) {\n debug('nylas-calendar-picker', 'nylasFormDropdownChangedHandler', event.detail);\n // Pass as handler so that if event.defaultPrevented by parent app, this will be skipped.\n const valueChangedHandler = (event: CustomEvent<{ value: string[]; name: string }>) => {\n const { value } = event.detail;\n this.selectedCalendars = [...value];\n if (this.selectedCalendars.length === 0) {\n this.error = i18next.t('nylasCalendarPicker.selectAtLeastOneCalendar');\n this.internals.setValidity({ customError: true }, this.error);\n } else {\n this.error = '';\n this.internals.setValidity({});\n }\n this.internals.setFormValue(value.toString(), this.name);\n };\n this.valueChanged.emit({ ...event.detail, name: this.name, valueChangedHandler });\n }\n\n @RegisterComponent<NylasCalendarPicker, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-calendar-picker',\n stateToProps: new Map([\n ['schedulerConfig.currentUser', 'currentUser'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string[]; name: string; valueChangedHandler?: (event: CustomEvent<{ value: string[]; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChangedHandler } = event.detail;\n // If a handler is passed, call it.\n if (valueChangedHandler) {\n valueChangedHandler(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const calendarOptions =\n this.calendars?.map(calendar => {\n return {\n value: calendar.id,\n label: calendar.name,\n selected:\n this.defaultSelectedCalendars?.includes(calendar.id) ||\n (this.defaultSelectedCalendars?.includes('primary') || this.defaultSelectedCalendars?.length === 0\n ? calendar.id === this.currentUser?.email || calendar.id === this.name.split('participant-')[1]\n : false),\n };\n }) ?? [];\n\n return (\n <Host>\n <div class=\"nylas-calendar-picker\" part=\"ncp\">\n {calendarOptions.length > 0 ? (\n <div class=\"nylas-calendar-picker__dropdown\">\n <multi-select-dropdown\n name={this.name}\n options={calendarOptions}\n selectAtLeastOneOptionLabel={i18next.t('selectOneOrMoreOptions')}\n multipleOptionsSelectedLabel={i18next.t('multipleOptionsSelected')}\n error={this.error}\n exportparts=\"msd_dropdown: ncp__dropdown, msd_dropdown-button: ncp__dropdown-button, msd_dropdown-content: ncp__dropdown-content\"\n ></multi-select-dropdown>\n </div>\n ) : (\n <div class=\"nylas-calendar-picker__loading\">\n <span class=\"label\">\n {i18next.t('nylasCalendarPicker.calendarPickerLabel')} <info-icon />\n </span>\n <div class=\"loading-button\">\n <span>{i18next.t('loading')}...</span>\n </div>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n @include default-css-variables;\n}\n\n.nylas-cancellation-policy {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%;\n\n /* 21px */\n span.label-icon {\n margin-left: 4px;\n\n tooltip-component {\n display: flex;\n }\n }\n }\n\n textarea {\n padding: 12px 16px;\n border-width: 1;\n resize: vertical;\n border-radius: 8px;\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n border: 1px solid var(--nylas-base-200);\n\n &::-webkit-resizer {\n display: none;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug, sanitize } from '@/utils/utils';\nimport { AttachInternals, Component, Host, State, h, Element, Prop, Watch, Event, EventEmitter } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-cancellation-policy` component is a form input for the cancellation policy message of an event.\n * @part ncpolicy - The cancellation policy container\n * @part ncpolicy__textarea - The cancellation policy textarea\n */\n@Component({\n tag: 'nylas-cancellation-policy',\n styleUrl: 'nylas-cancellation-policy.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasCancellationPolicy {\n /**\n * The host element <nylas-cancellation-policy>\n */\n @Element() host!: HTMLElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n\n /**\n * @standalone\n * The cancellation policy stored in the configuration\n */\n @Prop() cancellationPolicy?: string;\n\n /**\n * @standalone\n * The name of the cancellation policy input.\n */\n @Prop() name: string = 'cancelation-policy';\n\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * The selected cancellation policy state. This defaults to the cancellation policy from the configuration or an empty string.\n */\n @State() message!: string;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-cancellation-policy', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-custom-booking-flow', 'selectedConfigurationChangedHandler', newValue);\n this.message = newValue?.scheduler?.cancellation_policy || this.cancellationPolicy || '';\n }\n\n @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 cancellation policy message changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n connectedCallback() {\n debug('nylas-cancellation-policy', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-cancellation-policy', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-cancellation-policy', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.message = this.cancellationPolicy || '';\n }\n }\n\n disconnectedCallback() {\n debug('nylas-cancellation-policy', 'disconnectedCallback');\n }\n\n handleChange(event) {\n const value = sanitize(event.target.value);\n this.message = value;\n this.internals.setFormValue(value, this.name);\n this.valueChanged.emit({ value: value, name: this.name });\n }\n\n @RegisterComponent<NylasCancellationPolicy, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-cancellation-policy',\n stateToProps: new Map([\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-cancellation-policy\" part=\"ncpolicy\">\n <label htmlFor={this.name}>\n {i18next.t('nylasCancellationPolicy.cancellationPolicyLabel')}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasCancellationPolicy.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n </label>\n <textarea id={this.name} part=\"ncpolicy__textarea\" name={this.name} value={this.message} maxlength=\"250\" onInput={e => this.handleChange(e)}></textarea>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-confirmation-email {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n text-align: left;\n\n .header {\n padding: 1rem;\n display: grid;\n grid-template-columns: 1fr auto;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n border-radius: var(--nylas-border-radius-2x);\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n\n .confirmation-email-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n\n .nylas-confirmation-email__body {\n display: grid;\n grid-template-columns: 1fr auto;\n background-color: var(--nylas-base-25);\n border-radius: var(--nylas-border-radius-2x);\n\n @media #{$mobile} {\n grid-template-columns: 1fr;\n }\n\n .nylas-confirmation-email__section {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n color: var(--nylas-base-800);\n\n @media #{$mobile} {\n border: none;\n }\n\n .nylas-confirmation-email__row {\n display: grid;\n grid-template-columns: 1fr auto;\n align-items: center;\n gap: 1rem;\n\n &.full-width-col {\n grid-template-columns: 1fr;\n border-top: 1px solid var(--nylas-base-200);\n padding-top: 1.25rem;\n margin: 0.25rem 0;\n }\n\n label {\n display: flex;\n align-items: center;\n\n span.required {\n color: var(--nylas-error, #cc4841);\n }\n\n span.label-icon {\n margin-left: 4px;\n\n tooltip-component {\n display: flex;\n }\n }\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 16px;\n font-weight: 500;\n line-height: 24px;\n color: var(--nylas-base-900);\n }\n\n .company-logo-container {\n display: flex;\n gap: 32px;\n width: 100%;\n\n .input-container {\n display: flex;\n flex-direction: column;\n flex: 1;\n }\n\n .company-logo {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 200px;\n height: 100px;\n border: var(--nylas-base-200) solid 1px;\n border-radius: var(--nylas-border-radius-2x);\n overflow: hidden;\n padding: 10px;\n }\n\n .company-logo img {\n max-height: 100%;\n max-width: 100%;\n object-fit: contain;\n object-position: center;\n }\n }\n\n span.selected-value {\n font-weight: 500;\n }\n }\n\n .subsection {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n .input-container {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n\n textarea {\n padding: 12px 16px;\n border-width: 1;\n resize: vertical;\n border-radius: 8px;\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n border: 1px solid var(--nylas-base-200);\n }\n }\n }\n }\n\n .nylas-confirmation-email__preview {\n width: 208px;\n background: var(--nylas-base-25);\n border-bottom-right-radius: var(--nylas-border-radius-2x);\n\n @media #{$mobile} {\n width: inherit;\n border-bottom-left-radius: var(--nylas-border-radius-2x);\n }\n\n h4 {\n font-size: 14px;\n line-height: 24px;\n color: var(--nylas-base-600);\n font-family: var(--nylas-font-family);\n font-weight: 500;\n text-align: center;\n margin: 0.75rem 0;\n }\n\n .preview-container {\n padding: 0 2rem 1rem;\n\n .slot {\n background-color: transparent;\n border-top: 1px solid var(--nylas-base-300);\n\n &.active {\n background-color: var(--nylas-base-100);\n }\n\n &:last-of-type {\n border-bottom: 1px solid var(--nylas-base-300);\n }\n }\n\n .event-slot {\n background-color: var(--nylas-base-600);\n border-top: 1px solid var(--nylas-base-300);\n }\n }\n }\n\n span.error-message {\n color: var(--nylas-error);\n }\n\n span.help-text {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n\n .nylas-confirmation-email__summary {\n padding: 0.75rem 1rem;\n display: grid;\n grid-template-columns: auto 1fr;\n column-gap: 1rem;\n\n p {\n margin: 0;\n display: flex;\n align-items: center;\n column-gap: 4px;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 21px;\n color: var(--nylas-base-600);\n text-align: left;\n\n span.summary-icon {\n display: flex;\n justify-content: center;\n min-width: 20px;\n }\n }\n }\n}\n\ntoggle-switch {\n padding-right: 8px;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug, sanitize } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration, EmailTemplate, Participant } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-confirmation-email` component is a UI component that allows users to set buffer time before and after an event.\n *\n * @part nce__tab-heading - The nylas-confirmation-email main tab heading\n * @part nce - The nylas-confirmation-email container\n * @part nce__header - The header of the event communication section\n * @part nce__body - The body of the event communication section\n * @part nce__confirmation-email-toggle--container - The confirmation email drawer toggle container\n * @part nce__input-image-url - The input image URL container\n * @part nce__summary - The confirmation card summary container\n */\n@Component({\n tag: 'nylas-confirmation-email',\n styleUrl: 'nylas-confirmation-email.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasConfirmationEmail {\n @Element() host!: HTMLNylasConfirmationEmailElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The confirmation email template data to display\n */\n @Prop() confirmationEmailTemplate: EmailTemplate = {} as EmailTemplate;\n /**\n * @standalone\n * List of participants\n */\n @Prop() participants: Participant[] = [];\n /**\n * @standalone\n * The name of the component\n */\n @Prop() name: string = 'confirmation-email-template';\n /**\n * @standalone\n * The nylas branding\n */\n @Prop() nylasBranding: boolean = true;\n /**\n * Is the confirmation email card open\n */\n @Prop() isOpen: boolean = false;\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The confirmation email template state.\n */\n @State() confirmationEmail!: EmailTemplate;\n\n /**\n * The internal state to store the isOpen state.\n */\n @State() isConfirmationEmailOpen: boolean = this.isOpen;\n\n /**\n * The internal state to store the participants.\n */\n @State() participantsState: Participant[] = this.participants;\n\n /**\n * The error message to display when the image URL is invalid.\n */\n @State() invalidImageErrorMessage: string = i18next.t('nylasConfirmationEmail.error.invalidImageUrl');\n\n /**\n * This event is fired when the email reminders change.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-confirmation-email', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-confirmation-email', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-confirmation-email', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-confirmation-email', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.confirmationEmail = { ...this.confirmationEmailTemplate };\n if (typeof this.confirmationEmail?.show_nylas_branding === 'undefined' && this.nylasBranding) {\n this.confirmationEmail = { ...this.confirmationEmail, show_nylas_branding: true };\n } else if (!this.nylasBranding) {\n this.confirmationEmail = { ...this.confirmationEmail, show_nylas_branding: false };\n }\n this.isConfirmationEmailOpen = this.isOpen;\n this.participantsState = this.participants;\n }\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-confirmation-email', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-confirmation-email', 'selectedConfigurationChangedHandler', newValue);\n this.confirmationEmail = { ...(newValue?.scheduler?.email_template || this.confirmationEmailTemplate) };\n if (typeof this.confirmationEmail?.show_nylas_branding === 'undefined' && this.nylasBranding) {\n this.confirmationEmail = { ...this.confirmationEmail, show_nylas_branding: true };\n } else if (!this.nylasBranding) {\n this.confirmationEmail = { ...this.confirmationEmail, show_nylas_branding: false };\n }\n this.isConfirmationEmailOpen = !newValue?.event_booking?.reminders?.length;\n this.participantsState = newValue?.participants || this.participants;\n }\n\n @Watch('nylasBranding')\n nylasBrandingChangedHandler(newValue: boolean) {\n debug('nylas-confirmation-email', 'nylasBrandingChangedHandler', newValue);\n if (typeof this.confirmationEmail?.show_nylas_branding === 'undefined' && newValue) {\n this.confirmationEmail = { ...this.confirmationEmail, show_nylas_branding: true };\n } else if (!newValue) {\n this.confirmationEmail = { ...this.confirmationEmail, show_nylas_branding: false };\n }\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n this.invalidImageErrorMessage = i18next.t('nylasConfirmationEmail.error.invalidImageUrl');\n i18next.changeLanguage(newVal);\n }\n\n @Listen('nylasFormInputChanged')\n async nylasFormInputChangeHandler(event: CustomEvent<{ value: string; name: string; type?: string }>) {\n const { name, value } = event.detail;\n const type = event.detail?.type;\n if (name === 'confirmation-email-title') {\n this.confirmationEmail = { ...this.confirmationEmail, booking_confirmed: { ...(this.confirmationEmail?.booking_confirmed || {}), title: value } };\n this.internals.setFormValue(JSON.stringify(this.confirmationEmail), this.name);\n this.valueChanged.emit({ value: JSON.stringify(this.confirmationEmail), name: this.name });\n } else if (name === 'confirmation-email-body' && type === 'multi_line_text') {\n this.handleEmailBodyChange(event);\n }\n }\n\n @Listen('valueChanged')\n valueChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-confirmation-email', 'valueChangedHandler', event.detail);\n const { value, name } = event.detail;\n\n if (name === 'confirmation-email-logo') {\n this.confirmationEmail = { ...this.confirmationEmail, logo: value };\n this.valueChanged.emit({ value: JSON.stringify(this.confirmationEmail), name: this.name });\n if (typeof this.internals.setValidity === 'function' && typeof this.internals.setFormValue === 'function') {\n this.internals.setFormValue(JSON.stringify(this.confirmationEmail), this.name);\n this.internals.setValidity({});\n }\n }\n }\n\n @Listen('nylasFormInputImageUrlInvalid')\n async nylasFormInputImageUrlInvalidHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { value, name } = event.detail;\n if (name === 'confirmation-email-logo' && typeof this.internals.setValidity === 'function') {\n this.internals.setValidity({ customError: true }, i18next.t('nylasConfirmationEmail.error.invalidImageUrl') || value);\n }\n }\n\n @Listen('nylasFormSwitchToggled')\n nyalsFormSwitchToggledHandler(event: CustomEvent<{ checked: boolean; name: string; label: boolean }>) {\n debug('nylas-confirmation-email', 'nyalsFormSwitchToggledHandler', event.detail);\n if (event.detail.name === 'confirmation-email-show-branding') {\n this.confirmationEmail = { ...this.confirmationEmail, show_nylas_branding: event.detail.checked };\n this.internals.setFormValue(JSON.stringify(this.confirmationEmail), this.name);\n this.valueChanged.emit({ value: JSON.stringify(this.confirmationEmail), name: this.name });\n }\n }\n\n updateConfirmationFormValue() {\n debug('nylas-confirmation-email', 'updateConfirmationFormValue');\n this.internals.setFormValue(JSON.stringify(this.confirmationEmail), this.name);\n this.valueChanged.emit({ value: JSON.stringify(this.confirmationEmail), name: this.name });\n }\n\n toggleConfirmationEmail() {\n this.isConfirmationEmailOpen = !this.isConfirmationEmailOpen;\n }\n\n handleEmailBodyChange(event) {\n const value = sanitize(event.detail.value);\n this.confirmationEmail = { ...this.confirmationEmail, booking_confirmed: { ...(this.confirmationEmail?.booking_confirmed || {}), body: value } };\n this.internals.setFormValue(JSON.stringify(this.confirmationEmail), this.name);\n this.valueChanged.emit({ value: JSON.stringify(this.confirmationEmail), name: this.name });\n }\n\n @RegisterComponent<NylasConfirmationEmail, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-confirmation-email',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ['schedulerConfig.nylasBranding', 'nylasBranding'],\n ]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const organizer = this.participantsState.find(p => p.is_organizer);\n const organizerName = organizer?.name || organizer?.email;\n\n return (\n <Host>\n <div class=\"nylas-confirmation-email\" part=\"nce\">\n <div class=\"header\" part=\"nce__header\">\n <div>\n <h3>\n {this.confirmationEmail?.booking_confirmed?.title ||\n i18next.t('nylasConfirmationEmail.headerTitle', { organizerName: `${organizerName ? ` with ${organizerName}` : ''}` })}\n </h3>\n <p>{i18next.t('nylasConfirmationEmail.headerSubTitle')}</p>\n </div>\n {this.isConfirmationEmailOpen ? (\n <div class=\"confirmation-email-toggle\" part=\"nce__confirmation-email-toggle--container\">\n <span class={`chevron ${this.isConfirmationEmailOpen ? 'open' : 'closed'} `} onClick={() => this.toggleConfirmationEmail()}>\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n ) : (\n <button-component\n variant={'basic'}\n clickHandler={event => {\n event.preventDefault();\n this.toggleConfirmationEmail();\n }}\n >\n <edit-icon width=\"16\" height=\"16\"></edit-icon>\n {i18next.t('nylasConfirmationEmail.editButtonText')}\n </button-component>\n )}\n </div>\n\n {this.isConfirmationEmailOpen ? (\n <div class=\"nylas-confirmation-email__body\" part=\"nce__body\">\n <div class=\"nylas-confirmation-email__section\">\n {this.nylasBranding && (\n <div class=\"nylas-confirmation-email__row\">\n <label>\n {i18next.t('nylasConfirmationEmail.nylasBranding.label')}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasConfirmationEmail.nylasBranding.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n </label>\n <toggle-switch\n exportparts=\"ts_label: nce__toggle-label, ts_input: nce_toggle-input, ts_slider: nce_toggle-slider\"\n name={`confirmation-email-show-branding`}\n checked={this.confirmationEmail?.show_nylas_branding}\n />\n </div>\n )}\n <div class=\"nylas-confirmation-email__row\">\n <div class=\"subsection\">\n <div class=\"input-container\">\n <label>\n {i18next.t('nylasConfirmationEmail.companyLogoUrl.label')}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasConfirmationEmail.companyLogoUrl.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n </label>\n\n {this.confirmationEmail && (\n <input-image-url\n name=\"confirmation-email-logo\"\n exportparts=\"iiu__logo-input-textfield: nce__input-image-url\"\n errorMessage={this.invalidImageErrorMessage}\n imageUrl={this.confirmationEmail?.logo ?? ''}\n />\n )}\n </div>\n </div>\n </div>\n <div class=\"nylas-confirmation-email__row full-width-col\">\n <div class=\"subsection\">\n <h3>{i18next.t('nylasConfirmationEmail.emailMessage.header')}</h3>\n <div class=\"input-container\">\n <label htmlFor=\"title\">\n {i18next.t('nylasConfirmationEmail.emailMessage.label')}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasConfirmationEmail.emailMessage.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n </label>\n <input-component\n name=\"confirmation-email-title\"\n maxLength={60}\n placeholder={i18next.t('nylasConfirmationEmail.headerTitle', { organizerName: `${organizerName ? ` with ${organizerName}` : ''}` })}\n defaultValue={this.confirmationEmail?.booking_confirmed?.title ?? ''}\n ></input-component>\n </div>\n <div class=\"input-container\">\n {/* <label htmlFor=\"title\">Email body</label> */}\n <textarea-component\n label={i18next.t('nylasConfirmationEmail.emailMessage.additionalInfoLabel')}\n name=\"confirmation-email-body\"\n id=\"confirmation-email-body\"\n placeholder={i18next.t('nylasConfirmationEmail.emailMessage.additionalInfoPlaceholder')}\n tooltip={i18next.t('nylasConfirmationEmail.emailMessage.additionalInfoTooltip')}\n maxLength={500}\n defaultValue={this.confirmationEmail?.booking_confirmed?.body ?? ''}\n ></textarea-component>\n\n {/* <textarea\n id=\"description\"\n part=\"nrt__textarea\"\n name=\"confirmation-email-body\"\n placeholder='Default body'\n value={this.confirmationEmail?.booking_confirmed?.body ?? ''}\n maxlength=\"500\"\n rows={2}\n onInput={e => this.handleEmailBodyChange(e)}\n ></textarea> */}\n </div>\n </div>\n </div>\n </div>\n </div>\n ) : (\n <div class=\"nylas-confirmation-email__summary\" part=\"nce__summary\">\n <p>\n <span class=\"summary-icon\">\n <person-clipboard-icon></person-clipboard-icon>\n </span>\n {i18next.t('nylasConfirmationEmail.allHosts')}\n </p>\n <p>\n <span class=\"summary-icon\">\n <clock-icon></clock-icon>\n </span>\n {i18next.t('nylasConfirmationEmail.immediatelyUponBooking')}\n </p>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-connected-calendars {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n\n .header {\n padding: 1rem;\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n }\n\n .content {\n .participant-container {\n padding-top: 12px;\n border-top: 1px solid var(--nylas-base-200);\n\n .participant-title {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 16px 16px;\n\n p {\n margin: 0;\n }\n\n .participant-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n }\n }\n}\n\nnylas-calendar-picker::part(ncp) {\n margin: 0;\n border: none;\n border-top: 1px solid var(--nylas-base-200);\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { AdditionalParticipant, Calendar, Configuration, Participant } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-connected-calendars` component is a form input for selecting calendars to check availability for participants.\n * @part nccals - The connected calendars host.\n * @part nccals__header - The header.\n * @part nccals__content - The content.\n * @part nccals__container - The container.\n * @part nccals__title - The title.\n * @part nccals__toggle-container - The toggle container.\n */\n@Component({\n tag: 'nylas-connected-calendars',\n styleUrl: 'nylas-connected-calendars.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasConnectedCalendars {\n @Element() host!: HTMLNylasConnectedCalendarsElement;\n private connectedCalendarsFormRef!: HTMLFormElement;\n\n /**\n * The name of the participants custom availability.\n */\n @Prop() name: string = 'connected-calendars';\n\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n\n /**\n * @standalone\n * The participants selected in the add participants section.\n */\n @Prop() participants: Participant[] = this.selectedConfiguration?.participants || [];\n\n /**\n * @standalone\n * The calendars to choose from for the organizer / logged in user.\n */\n @Prop() calendars?: Calendar[];\n\n /**\n * @standalone\n * The participant options passed in the additionalParticipants prop\n * from the nylas-scheduler-editor component.\n */\n @Prop() participantOptions?: AdditionalParticipant[];\n\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * This event is fired when the participants custom availability changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The state to store the custom availability setting for participants.\n */\n @State() selectedCalendars: {\n [key: string]: {\n isOpen: boolean;\n name: string;\n calendars?: Calendar[];\n };\n } = this.setParticipants(this.participants);\n\n /**\n * Participants calendar options.\n */\n @State() participantCalendars: {\n [key: string]: Calendar[];\n } = {};\n\n /**\n * The state to store the default selected calendars for each participant\n */\n @State() participantDefaultSelectedCalendars: {\n [key: string]: string[];\n } = {};\n\n // Watchers\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-connected-calendars', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('calendars')\n calendarsChangedHandler(newValue: Calendar[]) {\n debug('nylas-connected-calendars', 'calendarsChangedHandler', newValue);\n this.selectedCalendars = this.setParticipants(this.participants);\n this.participantCalendars = this.getParticipantCalendarOptions(this.participants, this.participantOptions);\n this.setInternalFormValue();\n }\n\n @Watch('participants')\n participantsChangedHandler(newValue: Participant[]) {\n debug('nylas-connected-calendars', 'participantsChangedHandler', newValue);\n this.selectedCalendars = this.setParticipants(newValue);\n this.participantCalendars = this.getParticipantCalendarOptions(newValue, this.participantOptions);\n }\n\n @Watch('participantOptions')\n participantOptionsChangedHandler(newValue: AdditionalParticipant[]) {\n debug('nylas-calendar-picker', 'participantOptionsChangedHandler', newValue);\n this.selectedCalendars = this.setParticipants(this.participants);\n this.participantCalendars = this.getParticipantCalendarOptions(this.participants, newValue);\n this.setInternalFormValue();\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-calendar-picker', 'selectedConfigurationChangedHandler', newValue);\n const participants = newValue?.participants || this.participants;\n if (participants && participants.length > 0) {\n this.selectedCalendars = this.setParticipants(participants);\n this.participantCalendars = this.getParticipantCalendarOptions(participants, this.participantOptions);\n this.setInternalFormValue();\n }\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 getParticipantCalendarOptions(addedParticipants: Participant[], availableParticipantOptions: AdditionalParticipant[] | undefined) {\n // Get the participants from the availableParticipantOptions prop that are in the addedParticipants prop\n const organizer = addedParticipants?.find(participant => participant.is_organizer);\n const isRoundRobinConfig = this.selectedConfiguration?.availability?.availability_rules?.availability_method !== 'collective';\n const participantCalendars = {};\n if (availableParticipantOptions) {\n const participants = addedParticipants?.filter(participant => availableParticipantOptions.some(availableParticipant => availableParticipant.email === participant.email));\n const remainingParticipants = addedParticipants?.filter(\n participant => !availableParticipantOptions.some(availableParticipant => availableParticipant.email === participant.email),\n );\n\n // Get the calendar options for each participant with email as the key\n participants?.forEach(participant => {\n const participantOption = availableParticipantOptions?.find(participantOption => participantOption.email === participant.email);\n if (!participantOption) return;\n this.participantDefaultSelectedCalendars[participant.email] = participant.availability?.calendar_ids || [];\n const calendars = participantOption.calendars ?? [];\n participant.availability?.calendar_ids?.forEach(calendarId => {\n if (!calendars?.some(calendar => calendar.id === calendarId) && calendarId !== 'primary') {\n calendars.push({ id: calendarId, name: calendarId });\n }\n });\n participantCalendars[participant.email] = calendars;\n });\n if (isRoundRobinConfig) {\n // If it is round robin config, add the remaining participant calendars to the participantCalendars\n // (Round-robin does not have an organizer, and we filtered out the participants not passed in the participantOptions prop,\n // so we need to add the remaining participants calendars to the participantCalendars)\n remainingParticipants?.forEach(participant => {\n if (participant?.availability?.calendar_ids && participant?.availability?.calendar_ids?.length > 0 && !participant.is_organizer) {\n participantCalendars[participant.email] = this.calendars ?? [{ id: 'primary', name: participant.email }];\n this.participantDefaultSelectedCalendars[participant.email] = participant.availability?.calendar_ids || [];\n }\n });\n }\n }\n\n // Add the organizer's calendars to the participantCalendars\n if (organizer) {\n participantCalendars[organizer.email] = this.calendars ?? [{ id: 'primary', name: organizer.email }];\n this.participantDefaultSelectedCalendars[organizer.email] = organizer.availability?.calendar_ids || [];\n }\n return participantCalendars;\n }\n\n // Lifecycle Methods\n connectedCallback() {\n debug('nylas-connected-calendars', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-connected-calendars', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-connected-calendars', 'componentWillLoad');\n }\n\n componentDidLoad() {\n debug('nylas-connected-calendars', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedCalendars = this.setParticipants(this.selectedConfiguration?.participants);\n this.participantCalendars = this.getParticipantCalendarOptions(this.selectedConfiguration?.participants, this.participantOptions);\n this.setInternalFormValue();\n } else {\n this.selectedCalendars = this.setParticipants(this.participants);\n this.participantCalendars = this.getParticipantCalendarOptions(this.participants, this.participantOptions);\n this.setInternalFormValue();\n }\n }\n\n /**\n * This method is essentially a workaround to check if the internals are available because\n * the unit tests in stencil do not support the internals.\n * @returns boolean\n */\n get isInternalsAvailable() {\n return this.internals !== undefined && typeof this.internals.setFormValue === 'function';\n }\n\n @Listen('valueChanged')\n handleValueChanged(event: CustomEvent) {\n debug('[nylas-editor-tabs]', 'handleValueChanged', event);\n const { name, value } = event.detail;\n if (!name.startsWith('participant-')) {\n return;\n }\n // Validate the form\n if (!this.connectedCalendarsFormRef.checkValidity()) {\n this.internals.setValidity({ customError: true }, i18next.t('nylasConnectedCalendars.selectAtLeastOneCalendar'));\n return;\n } else {\n this.internals.setValidity({});\n }\n\n const key = name.split('participant-')[1];\n if (!this.selectedCalendars[key]) return;\n this.selectedCalendars[key]['calendars'] = value;\n this.selectedCalendars = { ...this.selectedCalendars };\n\n const participantsCalendars = {};\n Object.keys(this.selectedCalendars).forEach(key => {\n participantsCalendars[key] = this.selectedCalendars[key].calendars;\n });\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(participantsCalendars), this.name);\n this.valueChanged.emit({ value: JSON.stringify(participantsCalendars), name: this.name });\n }\n\n setParticipants(participants: Participant[]) {\n const selectedParticipants = {};\n participants?.forEach(participant => {\n if (participant?.availability?.calendar_ids && participant?.availability?.calendar_ids?.length > 0) {\n const isOpen = participant.is_organizer ? true : false;\n selectedParticipants[participant.email] = {\n isOpen: isOpen,\n name: participant.name || participant.email,\n calendars: participant.availability?.calendar_ids,\n };\n }\n });\n return selectedParticipants;\n }\n\n setInternalFormValue() {\n const participantsCalendars = {};\n Object.keys(this.selectedCalendars).forEach(key => {\n participantsCalendars[key] = this.selectedCalendars[key].calendars;\n });\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(participantsCalendars), this.name);\n }\n\n @RegisterComponent<NylasConnectedCalendars, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-connected-calendars',\n stateToProps: new Map([\n ['schedulerConfig.additionalParticipants', 'participantOptions'],\n ['schedulerConfig.calendars', 'calendars'],\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div class=\"nylas-connected-calendars\" part=\"nccals\">\n <div class=\"header\" part=\"nccals__header\">\n <h3>{i18next.t('nylasConnectedCalendars.headerTitle')}</h3>\n <p>\n {i18next.t('nylasConnectedCalendars.headerSubTitle')}\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasConnectedCalendars.tooltip.desc')}</span>\n </tooltip-component>\n </p>\n </div>\n <div class=\"content\" part=\"nccals__content\">\n <form ref={el => (this.connectedCalendarsFormRef = el as HTMLFormElement)}>\n {Object.keys(this.participantCalendars).map((key, index) => {\n const participant = this.selectedCalendars[key];\n const participantCalendars = this.participantCalendars[key];\n if (!participant || !participant.name) return;\n return (\n <div class=\"participant-container\" part=\"nccals__container\" key={`participant-conatiner-${index}`}>\n <div class=\"participant-title\" part=\"nccals__title\">\n <p>{i18next.t('nylasConnectedCalendars.participantCalendarTitle', { participantName: participant.name })}</p>\n <div class=\"participant-toggle\" part=\"nccals__toggle-container\">\n <span\n class={`chevron ${participant.isOpen ? 'open' : 'closed'}`}\n onClick={() => {\n this.selectedCalendars[key].isOpen = !participant.isOpen;\n this.selectedCalendars = { ...this.selectedCalendars };\n }}\n >\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n </div>\n {participant.isOpen && (\n <nylas-calendar-picker\n key={key}\n name={`participant-${key}`}\n calendars={participantCalendars}\n defaultSelectedCalendars={this.participantDefaultSelectedCalendars[key]}\n />\n )}\n </div>\n );\n })}\n </form>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n margin: 1rem;\n @include default-css-variables;\n}\n\n.nylas-custom-booking-flow__title {\n color: var(--nylas-base-900);\n font-size: 16px;\n font-style: normal;\n font-weight: 600;\n line-height: 20px;\n /* 125% */\n margin: 0;\n text-align: left;\n}\n\n.nylas-custom-booking-flow__subtitle {\n color: var(--nylas-base-600);\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n /* 142.857% */\n margin: 0.25rem 0px 0px;\n text-align: left;\n}\n\n.nylas-custom-booking-flow__content {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.nylas-custom-booking-flow__block {\n display: flex;\n justify-content: space-between;\n gap: 0.5rem;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { checkForMissingSlots, debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Host, 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-custom-booking-flow` component is an input form for booking type (automatically or manually accept bookings) and confirmation redirect URL (default or custom).\n * This component is a container for the `nylas-booking-confirmation-type`, `nylas-booking-confirmation-redirect` components.\n *\n * ```html\n * <nylas-custom-booking-flow>\n * <div slot=\"inputs\">\n * <nylas-booking-confirmation-type></nylas-booking-confirmation-type>\n * <nylas-booking-confirmation-redirect></nylas-booking-confirmation-redirect>\n * </div>\n * </nylas-custom-booking-flow>\n * ```\n *\n * @slot inputs - The custom booking flow inputs. This includes the booking type, confirmation redirect type, and custom redirect URL components.\n */\n@Component({\n tag: 'nylas-custom-booking-flow',\n styleUrl: 'nylas-custom-booking-flow.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasCustomBookingFlow {\n @Element() el!: HTMLElement;\n\n /**\n * The 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 // Lifecycle methods\n connectedCallback() {\n debug('nylas-custom-booking-flow', 'connectedCallback');\n }\n disconnectedCallback() {\n debug('nylas-custom-booking-flow', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-custom-booking-flow', 'componentWillLoad');\n }\n\n componentDidLoad() {\n debug('nylas-custom-booking-flow', 'componentDidLoad');\n checkForMissingSlots(['inputs'], this.el);\n }\n\n @RegisterComponent<NylasCustomBookingFlow, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-custom-booking-flow',\n eventToProps: {},\n stateToProps: new Map([['schedulerConfig.selectedLanguage', 'selectedLanguage']]),\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host part=\"ncbflow\">\n <nylas-form-card exportparts=\"nfc__header: ncbflow__header\">\n <h1 slot=\"header-title\" class=\"nylas-custom-booking-flow__title\" part=\"ncbflow__title\">\n {i18next.t('nylasCustomBookingFlow.headerTitle')}\n </h1>\n <div slot=\"content\" class=\"nylas-custom-booking-flow__content\" part=\"ncbflow__content\">\n <slot name=\"inputs\"></slot>\n </div>\n </nylas-form-card>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n@import '../../../common/mixins/inputs.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-custom-event-slug {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n text-align: left;\n\n .header {\n padding: 1rem;\n display: grid;\n grid-template-columns: 1fr auto;\n\n h3 {\n border-radius: var(--nylas-border-radius-2x);\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n\n .drawer-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n\n .nylas-custom-event-slug__body {\n display: grid;\n grid-template-columns: 1fr;\n background-color: var(--nylas-base-25);\n border-radius: 0 0 var(--nylas-border-radius-2x) var(--nylas-border-radius-2x);\n border-top: 1px solid var(--nylas-base-200);\n\n @media #{$mobile} {\n grid-template-columns: 1fr;\n }\n\n .nylas-custom-event-slug__section {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n color: var(--nylas-base-800);\n\n @media #{$mobile} {\n border: none;\n }\n\n .nylas-custom-event-slug__row {\n display: flex;\n align-items: center;\n gap: 1rem;\n\n label {\n display: flex;\n align-items: center;\n\n span.required {\n color: var(--nylas-error, #cc4841);\n }\n\n span.label-icon {\n margin-left: 4px;\n\n tooltip-component {\n display: flex;\n }\n }\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 16px;\n font-weight: 500;\n line-height: 24px;\n color: var(--nylas-base-900);\n }\n\n .input-container {\n width: 100%;\n }\n }\n }\n\n span.error-message {\n color: var(--nylas-error);\n }\n\n span.help-text {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n\n .nylas-custom-event-slug__input-wrapper {\n @include textfield;\n width: -moz-available;\n width: -webkit-fill-available;\n display: flex;\n flex-direction: row;\n gap: 0.125rem;\n border-radius: var(--nylas-border-radius-2x);\n z-index: 1;\n\n &.focus {\n outline: 2px solid var(--nylas-primary);\n }\n\n &.error {\n border-color: var(--nylas-error);\n outline: none;\n }\n\n input-component::part(ic__input) {\n outline: none;\n border: none;\n width: 100%;\n font-size: 16px;\n height: auto;\n padding-left: 0px;\n }\n\n .prefix {\n z-index: 0;\n margin-top: 1px;\n color: var(--nylas-base-400);\n font-weight: 500;\n font-size: 24px;\n }\n\n .icon {\n margin-right: 0.25rem;\n padding: 0 0.75rem;\n height: 100%;\n display: flex;\n align-items: center;\n right: 0;\n cursor: pointer;\n user-select: none;\n\n &.disabled {\n cursor: not-allowed;\n }\n\n &:hover {\n svg path {\n fill: var(--nylas-primary);\n }\n }\n\n &:active {\n svg path {\n fill: var(--nylas-base-500);\n }\n }\n\n .copied {\n display: flex;\n align-items: center;\n font-size: 0.875rem;\n gap: 0.125rem;\n }\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-custom-event-slug` component is a UI component that allows users to add a custom URL slug for their event link.\n *\n * @part nces - The nylas-custom-event-slug container\n * @part nces__body - The body of the event communication section\n * @part nces__header - The header of the event communication section\n * @part nces__drawer-toggle--container - The card's drawer toggle container\n * @part nces__input-textfield - The custom slug input textfield\n */\n@Component({\n tag: 'nylas-custom-event-slug',\n styleUrl: 'nylas-custom-event-slug.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasCustomEventSlug {\n @Element() host!: HTMLNylasCustomEventSlugElement;\n /**\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * The default custom event slug\n */\n @Prop() defaultUrlSlug?: string;\n /**\n * Is the custom event slug card expanded\n */\n @Prop() isOpen: boolean = true;\n /**\n * Slug error message\n */\n @Prop() slugErrorMessage: string = '';\n /**\n * The name of the component\n */\n @Prop() name: string = 'custom-event-slug';\n /**\n * Indicates if a slug is required for the configuration.\n * When set to true, the user must enter a slug when creating or editing a configuration.\n * The slug is used for hosted pages that are public.\n */\n @Prop() requiresSlug: boolean = false;\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The URL slug state\n */\n @State() urlSlug!: string;\n\n /**\n * The focus state of the input container.\n */\n @State() focus = false;\n\n /**\n * The copied state for the copy to clipboard button\n */\n @State() copied = false;\n\n /**\n * This event is fired when the slug value changes\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-custom-event-slug', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-custom-event-slug', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-custom-event-slug', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-custom-event-slug', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n console.log('No selected configuration found');\n this.urlSlug = this.defaultUrlSlug || '';\n }\n }\n\n componentWillUpdate() {\n debug('nylas-custom-event-slug', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-custom-event-slug', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-custom-event-slug', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-custom-event-slug', 'componentDidRender');\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-custom-event-slug', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-custom-booking-flow', 'selectedConfigurationChangedHandler', newValue);\n this.urlSlug = newValue?.slug || this.defaultUrlSlug || '';\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n }\n\n @Listen('nylasFormInputChanged')\n async nylasFormInputChangeHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { name, value } = event.detail;\n this.internals.setValidity({});\n\n if (name === 'event-slug') {\n this.urlSlug = value;\n this.internals.setFormValue(JSON.stringify(value), this.name);\n this.valueChanged.emit({ value: JSON.stringify(value), name: this.name });\n }\n }\n\n @Listen('nylasFormInputFocused')\n async nylasFormInputFocusHandler() {\n this.focus = true;\n }\n\n @Listen('nylasFormInputBlurred')\n async nylasFormInputBlurHandler() {\n this.slugErrorMessage = '';\n this.internals.setValidity({});\n this.focus = false;\n if (this.requiresSlug && this.urlSlug === '') {\n this.internals.setValidity({ customError: true }, 'Slug is required');\n this.slugErrorMessage = 'Slug cannot be blank';\n return;\n }\n if (!/^[A-Za-z0-9_-]*$/.test(this.urlSlug)) {\n this.internals.setValidity({ customError: true }, 'Invalid slug: Only letters, numbers, and hyphens are allowed.');\n this.slugErrorMessage = 'Invalid slug: Only letters, numbers, and hyphens are allowed.';\n }\n }\n\n @Listen('formSubmitted', { target: 'window' })\n formSubmittedHandler(event: CustomEvent) {\n debug('nylas-event-title', 'formSubmittedHandler', event);\n this.nylasFormInputBlurHandler();\n }\n\n toggleDrawer() {\n this.isOpen = !this.isOpen;\n }\n\n async copyToClipboard() {\n try {\n await navigator.clipboard.writeText(`${this.urlSlug}`);\n\n this.copied = true;\n setTimeout(() => {\n this.copied = false;\n }, 1000);\n } catch (err) {\n console.error('Failed to copy: ', err);\n }\n }\n\n @RegisterComponent<NylasCustomEventSlug, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-custom-event-slug',\n stateToProps: new Map([\n ['schedulerConfig.requiresSlug', 'requiresSlug'],\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n if (!this.requiresSlug) return null;\n const isComponentReady = typeof this.urlSlug !== 'undefined';\n return (\n <Host>\n <div class=\"nylas-custom-event-slug\" part=\"nces\">\n <div class=\"header\" part=\"nces__header\">\n <div>\n <h3>{i18next.t('nylasCustomEventSlug.headerTitle')}</h3>\n <p>{i18next.t('nylasCustomEventSlug.headerSubTitle')}</p>\n </div>\n <div class=\"drawer-toggle\" part=\"nces__drawer-toggle--container\">\n <span class={`chevron ${this.isOpen ? 'open' : 'closed'} `} onClick={() => this.toggleDrawer()}>\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n </div>\n\n {this.isOpen && (\n <div class=\"nylas-custom-event-slug__body\" part=\"nces__body\">\n <div class=\"nylas-custom-event-slug__section\">\n <div class=\"nylas-custom-event-slug__row\">\n <div class=\"input-container\">\n <label>\n {i18next.t('nylasCustomEventSlug.eventSlugLabel')}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasCustomEventSlug.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n </label>\n\n <div class={{ 'nylas-custom-event-slug__input-wrapper': true, 'focus': this.focus, 'error': !!this.slugErrorMessage }}>\n <div slot=\"prefix\" class=\"prefix\">\n &#47;\n </div>\n {isComponentReady && (\n <input-component\n name=\"event-slug\"\n id=\"event-slug\"\n type=\"text\"\n required={false}\n placeholder=\"my-link-name\"\n exportparts=\"ic_input: nces__input-textfield\"\n defaultValue={this.urlSlug}\n />\n )}\n <div slot=\"icon\" class={{ icon: true, disabled: !this.urlSlug }} onClick={() => !this.copied && !!this.urlSlug && this.copyToClipboard()}>\n {this.copied ? (\n <div class=\"copied\">\n <checkmark-icon width=\"12\" height=\"18\" /> {i18next.t('nylasCustomEventSlug.copied')}\n </div>\n ) : (\n <copy-icon width=\"12\" height=\"18\" />\n )}\n </div>\n </div>\n {this.slugErrorMessage && <span class=\"error-message\">{this.slugErrorMessage}</span>}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-customize-booking-settings {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n\n .header {\n padding: 1rem;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n\n .nylas-customize-booking-settings__settings {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1rem;\n margin: 1rem 0;\n\n .nylas-customize-booking-settings__settings-div {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n }\n}\n\n.label {\n margin-left: 32px;\n font-size: 16px;\n font-weight: 400;\n color: var(--nylas-base-800);\n line-height: 24px;\n\n .label-contents {\n margin: 0;\n display: inline-block;\n\n @media #{$mobile} {\n display: block;\n }\n }\n\n tooltip-component {\n display: inline-block;\n }\n}\n\ntooltip-component#guests::part(tc__content) {\n @media #{$mobile} {\n left: 58px;\n }\n}\n\ntooltip-component#reschedule::part(tc__content) {\n left: 58px;\n\n @media #{$mobile} {\n left: 58px;\n }\n}\n\ntooltip-component#cancel::part(tc__content) {\n left: -58px;\n\n @media #{$mobile} {\n left: 58px;\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-customize-booking-settings` component is a UI component that displays the booking calendar picker.\n * @part ncbs - The booking calendar picker container\n * @part ncbs__header - The header of the booking calendar picker\n * @part ncbs__settings - The settings container\n * @part ncbs__settings-div - The div inside the settings container that contains the checkbox and tooltip for each setting\n * @part ncbs__additional_guests - The additional guests setting\n * @part ncbs__cancellation_options - The cancellation options setting\n * @part ncbs__rescheduling_options - The rescheduling options setting\n */\n@Component({\n tag: 'nylas-customize-booking-settings',\n styleUrl: 'nylas-customize-booking-settings.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasCustomizeBookingSettings {\n @Element() host!: HTMLNylasCustomizeBookingSettingsElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The default additional guests hidden setting as set in the configuration.\n */\n @Prop() defaultHideAdditionalGuests: boolean = this.selectedConfiguration?.scheduler?.hide_additional_guests ?? false;\n\n /**\n * @standalone\n * The default hide cancellation options setting as set in the configuration.\n */\n @Prop() defaultHideCancellationOptions: boolean = this.selectedConfiguration?.scheduler?.hide_cancellation_options ?? false;\n\n /**\n * @standalone\n * The default hide rescheduling options setting as set in the configuration.\n */\n @Prop() defaultHideReschedulingOptions: boolean = this.selectedConfiguration?.scheduler?.hide_rescheduling_options ?? false;\n\n /**\n * @standalone\n * The name of the calendar picker.\n */\n @Prop() name: string = 'customize-booking-settings';\n\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * This prop is used to determined which settings are visible in the component.\n */\n @Prop() showSettings: string[] = ['allowGuestsToInvite', 'hideCancellationOptions', 'hideReschedulingOptions'];\n\n /**\n * State to store the allowed additional guests setting.\n */\n @State() allowGuestsToInvite!: boolean;\n\n /**\n * State to store the hide cancel booking setting.\n */\n @State() hideCancellationOptions!: boolean;\n\n /**\n * State to store the hide reschedule booking setting.\n */\n @State() hideReschedulingOptions!: boolean;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * This event is fired when the selected booking calendar changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-customize-booking-settings', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-customize-booking-settings', 'selectedConfigurationChangedHandler', newValue);\n this.allowGuestsToInvite = !newValue?.scheduler?.hide_additional_guests;\n this.hideCancellationOptions = newValue?.scheduler?.hide_cancellation_options ?? false;\n this.hideReschedulingOptions = newValue?.scheduler?.hide_rescheduling_options ?? false;\n this.handleSettingValues(false);\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 // Lifecycle methods\n connectedCallback() {\n debug('nylas-customize-booking-settings', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-customize-booking-settings', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-customize-booking-settings', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-customize-booking-settings', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n // Set the default values if the selected configuration is not available\n this.allowGuestsToInvite = !this.defaultHideAdditionalGuests;\n this.hideCancellationOptions = this.defaultHideCancellationOptions;\n this.hideReschedulingOptions = this.defaultHideReschedulingOptions;\n this.handleSettingValues(false);\n }\n }\n\n componentWillUpdate() {\n debug('nylas-customize-booking-settings', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-customize-booking-settings', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-customize-booking-settings', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-customize-booking-settings', 'componentDidRender');\n }\n\n @Listen('nylasFormCheckboxToggled')\n checkboxToggledHandler(event: CustomEvent<{ name: string; checked: boolean }>) {\n const { name, checked } = event.detail;\n switch (name) {\n case 'hide_additional_guests':\n this.allowGuestsToInvite = checked;\n break;\n case 'hide_cancellation_options':\n this.hideCancellationOptions = checked;\n break;\n case 'hide_rescheduling_options':\n this.hideReschedulingOptions = checked;\n break;\n }\n this.handleSettingValues();\n }\n\n handleSettingValues(valueChanged: boolean = true) {\n if (valueChanged) {\n this.valueChanged.emit({\n value: JSON.stringify({\n additionalGuestsHidden: this.showSettings.includes('allowGuestsToInvite') ? !this.allowGuestsToInvite : undefined,\n hideCancellationOptions: this.hideCancellationOptions,\n hideReschedulingOptions: this.hideReschedulingOptions,\n }),\n name: this.name,\n });\n }\n this.isInternalsAvailable &&\n this.internals.setFormValue(\n JSON.stringify({\n additionalGuestsHidden: this.showSettings.includes('allowGuestsToInvite') ? !this.allowGuestsToInvite : undefined,\n hideCancellationOptions: this.hideCancellationOptions,\n hideReschedulingOptions: this.hideReschedulingOptions,\n }),\n this.name,\n );\n }\n\n /**\n * This method is essentially a workaround to check if the internals are available because\n * the unit tests in stencil do not support the internals.\n * @returns boolean\n */\n get isInternalsAvailable() {\n return this.internals !== undefined && typeof this.internals.setFormValue === 'function';\n }\n\n @RegisterComponent<NylasCustomizeBookingSettings, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-customize-booking-settings',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n fireRegisterEvent: true,\n })\n render() {\n const showComponent = typeof this.hideCancellationOptions === 'boolean' && typeof this.hideReschedulingOptions === 'boolean' && typeof this.allowGuestsToInvite === 'boolean';\n const showHideAdditionalGuests = this.showSettings.includes('allowGuestsToInvite');\n\n return (\n <Host>\n {showComponent && (\n <div class=\"nylas-customize-booking-settings\" part=\"ncbs\">\n <div class=\"header\" part=\"ncbs__header\">\n <h3>{i18next.t('nylasCustomizeBookingSettings.headerTitle')}</h3>\n <p>{i18next.t('nylasCustomizeBookingSettings.headerSubTitle')}</p>\n </div>\n\n <div class=\"nylas-customize-booking-settings__settings\" part=\"ncbs__settings\">\n {showHideAdditionalGuests && (\n <div class=\"nylas-customize-booking-settings__settings-div\" part=\"ncbs__settings-div , ncbs__additional_guests\">\n <checkbox-component name=\"hide_additional_guests\" label={i18next.t('nylasCustomizeBookingSettings.allowGuests.label')} checked={this.allowGuestsToInvite}>\n <span slot=\"label\" class=\"label\">\n <p class=\"label-contents\">\n {i18next.t('nylasCustomizeBookingSettings.allowGuests.label', { interpolation: { escapeValue: false, escape: s => `${s}`, useRawValueToEscape: true } })}\n </p>\n </span>\n </checkbox-component>\n </div>\n )}\n <div class=\"nylas-customize-booking-settings__settings-div\" part=\"ncbs__settings-div , ncbs__rescheduling_options\">\n <checkbox-component name=\"hide_rescheduling_options\" label=\"Hide 'Reschedule' option on booking page and emails.\" checked={this.hideReschedulingOptions}>\n <span slot=\"label\" class=\"label\">\n <p class=\"label-contents\">{i18next.t('nylasCustomizeBookingSettings.hideReschedule.label')}</p>\n <tooltip-component id=\"reschedule\">\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasCustomizeBookingSettings.hideReschedule.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n </checkbox-component>\n </div>\n <div class=\"nylas-customize-booking-settings__settings-div\" part=\"ncbs__settings-div , ncbs__cancellation_options\">\n <checkbox-component name=\"hide_cancellation_options\" label=\"Hide 'Cancel' option on booking page and emails.\" checked={this.hideCancellationOptions}>\n <span slot=\"label\" class=\"label\">\n <p class=\"label-contents\">{i18next.t('nylasCustomizeBookingSettings.hideCancel.label')}</p>\n <tooltip-component id=\"cancel\">\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasCustomizeBookingSettings.hideCancel.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n </checkbox-component>\n </div>\n </div>\n </div>\n )}\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n@import '../../../common/mixins/buttons.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-disable-emails {\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n margin: 1rem;\n}\n\n.header {\n padding: 1rem;\n display: grid;\n grid-template-columns: 1fr auto;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n border-radius: var(--nylas-border-radius-2x);\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n display: flex;\n gap: 4px;\n align-items: center;\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n\n .drawer-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n}\n\n.toggle {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0;\n margin: 16px;\n\n label {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n\n toggle-switch {\n margin-right: 12px;\n }\n select-dropdown {\n width: auto;\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE, LANGUAGE_MAP } from '@/common/constants';\nimport { Configuration, GroupConfiguration } from '@nylas/core';\n\n/**\n * The `nylas-disable-emails` component is a UI component that allows users to select the event type for the scheduler configuration.\n */\n@Component({\n tag: 'nylas-disable-emails',\n styleUrl: 'nylas-disable-emails.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasDisableEmails {\n @Element() host!: HTMLNylasDisableEmailsElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration | GroupConfiguration;\n\n /**\n * @standalone\n * The name of the component\n */\n @Prop() name: string = 'disable-emails';\n\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * The organizer locale.\n */\n @State() organizerLocale: string = this.selectedLanguage || 'en';\n\n /**\n * The disable emails value.\n */\n @State() disableEmails: boolean = false;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * This event is fired when the toggle switch to disable emails is toggled.\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-disable-emails', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-disable-emails', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-disable-emails', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-disable-emails', 'componentDidLoad');\n const lang = (this.selectedConfiguration as Configuration)?.scheduler?.email_template?.organizer_locale || this.selectedLanguage || 'en';\n this.organizerLocale = lang;\n const isGroupConfig = (this.selectedConfiguration as GroupConfiguration)?.group_booking !== undefined;\n const disableEmails = isGroupConfig\n ? (this.selectedConfiguration as GroupConfiguration)?.group_booking?.disable_emails\n : (this.selectedConfiguration as Configuration)?.event_booking?.disable_emails;\n this.disableEmails = disableEmails || false;\n this.handleSettingValue(false);\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-disable-emails', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\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 @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newVal: Configuration | GroupConfiguration, oldVal: Configuration | GroupConfiguration) {\n if (newVal === oldVal) return;\n this.organizerLocale = newVal.scheduler?.email_template?.organizer_locale || this.selectedLanguage || 'en';\n this.handleSettingValue(false);\n const isGroupConfig = (newVal as GroupConfiguration)?.group_booking !== undefined;\n const disableEmails = isGroupConfig ? (newVal as GroupConfiguration)?.group_booking?.disable_emails : (newVal as Configuration)?.event_booking?.disable_emails;\n this.disableEmails = disableEmails || false;\n this.handleSettingValue(false);\n }\n\n @Listen('nylasFormSwitchToggled')\n nyalsFormSwitchToggledHandler(event: CustomEvent<{ checked: boolean; name: string; label: boolean }>) {\n debug('nylas-confirmation-email', 'nyalsFormSwitchToggledHandler', event.detail);\n const { checked } = event.detail;\n if (event.detail.name === 'disable-emails') {\n this.disableEmails = !checked;\n this.handleSettingValue();\n }\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(\n event: CustomEvent<{\n value: string;\n name: string;\n }>,\n ) {\n const { name, value } = event.detail;\n if (name === 'organizer-locale') {\n const lang = LANGUAGE_CODE[value as LANGUAGE_CODE];\n this.organizerLocale = lang;\n this.handleSettingValue();\n }\n }\n\n handleSettingValue(valueChanged: boolean = true) {\n if (valueChanged) {\n this.valueChanged.emit({\n value: JSON.stringify({\n disableEmails: this.disableEmails,\n organizerLocale: this.organizerLocale,\n }),\n name: this.name,\n });\n }\n this.internals.setFormValue(\n JSON.stringify({\n disableEmails: this.disableEmails,\n organizerLocale: this.organizerLocale,\n }),\n this.name,\n );\n }\n\n @RegisterComponent<NylasDisableEmails, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-disable-emails',\n stateToProps: new Map([\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const languageOptions = Object.keys(LANGUAGE_MAP).map(key => ({\n label: LANGUAGE_MAP[key],\n value: key,\n }));\n const isGroupConfig = (this.selectedConfiguration as GroupConfiguration)?.group_booking !== undefined;\n const disableEmails = isGroupConfig\n ? (this.selectedConfiguration as GroupConfiguration)?.group_booking?.disable_emails\n : (this.selectedConfiguration as Configuration)?.event_booking?.disable_emails;\n return (\n <Host>\n <div class=\"nylas-disable-emails\" part=\"nde\">\n <div class=\"header\" part=\"nde__header\">\n <div>\n <h3>{i18next.t('eventCommunicationsTitle')}</h3>\n <p>{i18next.t('eventCommunicationsDescription')}</p>\n </div>\n </div>\n <div class=\"toggle\" part=\"nde__toggle\">\n <label>\n {i18next.t('nylasConfirmationEmail.confirmationEmail.label')}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\"> {i18next.t('nylasConfirmationEmail.confirmationEmail.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n </label>\n <toggle-switch exportparts=\"ts_label: nde__toggle-label, ts_input: nde_toggle-input, ts_slider: nde_toggle-slider\" name={`disable-emails`} checked={!disableEmails} />\n </div>\n <div class=\"toggle\" part=\"nde__toggle\">\n <label>\n {i18next.t('nylasConfirmationEmail.confirmationEmail.language')}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\"> {i18next.t('nylasConfirmationEmail.confirmationEmail.tooltip.language')}</span>\n </tooltip-component>\n </span>\n </label>\n <select-dropdown\n name=\"organizer-locale\"\n options={languageOptions}\n searchPlaceholder={i18next.t('search')}\n withChevron={false}\n defaultSelectedOption={languageOptions.find(lang => lang.value == this.organizerLocale)}\n exportparts=\"sd_dropdown: nse__language-dropdown, sd_dropdown-button: nse__language-drop-button, sd_dropdown-content: nse__language-drop-content, sd_dropdown_label: nse__language-drop-label\"\n >\n <span slot=\"select-icon\">\n <translate-icon width=\"20\" height=\"20\" />\n </span>\n </select-dropdown>\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-duration {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%; /* 21px */\n span.required {\n color: var(--nylas-error, #cc4841);\n }\n span.label-icon {\n margin-left: 4px;\n tooltip-component {\n display: flex;\n }\n }\n }\n}\n\n.nylas-event-duration__error-container {\n max-height: 0;\n opacity: 0;\n overflow: hidden;\n transition:\n max-height 0.3s ease,\n opacity 0.3s ease;\n\n &.visible {\n max-height: 20px;\n opacity: 1;\n }\n .nylas-event-duration__error {\n color: var(--nylas-error);\n font-family: var(--nylas-font-family);\n font-size: 12px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%; /* 18px */\n }\n}\n\n.nylas-event-duration__wrapper {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n input {\n padding: 12px 16px;\n border-width: 1;\n border-radius: 8px;\n border: 1px solid var(--nylas-base-200);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n width: 48px;\n }\n\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: 200px;\n }\n\n input-dropdown {\n width: 80px;\n\n &.error {\n &::part(id_dropdown-input) {\n border: 1px solid var(--nylas-error);\n }\n }\n }\n select-dropdown {\n width: 120px;\n @media #{$mobile} {\n width: 100%;\n }\n }\n\n select-dropdown::part(sd_dropdown-button) {\n border: 1px solid var(--nylas-base-200);\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Host, Listen, State, h, Element, Prop, Watch, Event, EventEmitter } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-event-duration` component is a form input for the duration of an event.\n *\n * @part ned - The event duration container\n * @part ned__dropdown - The dropdown container for the duration increment\n * @part ned__dropdown-button - The dropdown button for the duration increment\n * @part ned__dropdown-content - The dropdown content for the duration increment\n * @part ned__input_dropdown - The input dropdown container for the duration minutes\n * @part ned__input_dropdown-input - The input for the duration minutes\n * @part ned__input_dropdown-content - The dropdown content for the input duration minutes\n */\n@Component({\n tag: 'nylas-event-duration',\n styleUrl: 'nylas-event-duration.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasEventDuration {\n /**\n * The host element <nylas-event-duration>\n */\n @Element() host!: HTMLElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n\n /**\n * @standalone\n * The name of the event duration. Default is 'duration'.\n */\n @Prop() name: string = 'duration';\n /**\n * @standalone\n * The event duration in minutes as set in the configuration.\n */\n @Prop() eventDurationMinutes?: number;\n\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * The selected event duration state. This defaults to the event duration from the configuration or 30 minutes.\n */\n @State() duration: number = this.eventDurationMinutes ? (this.eventDurationMinutes >= 60 ? this.eventDurationMinutes / 60 : this.eventDurationMinutes) : 30;\n /**\n * The duration in minutes. This defaults to the event duration from the configuration or 30 minutes.\n */\n @State() durationMinutes!: number;\n /**\n * The duration increment. This defaults to minute(s).\n */\n @State() durationIncrement!: number;\n /**\n * The error message for the duration.\n */\n @State() error: string = '';\n /**\n * The durationMinutesOptions for the dropdown.\n */\n @State() durationMinutesOptions = [\n { value: (15).toString(), label: '15' },\n { value: (30).toString(), label: '30' },\n { value: (45).toString(), label: '45' },\n { value: (60).toString(), label: '60' },\n ];\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-event-duration', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newVal: Configuration) {\n const configDuration = newVal?.availability?.duration_minutes;\n if (configDuration) {\n this.duration = configDuration >= 60 ? configDuration / 60 : configDuration;\n this.durationMinutes = configDuration ? configDuration : 30;\n this.durationIncrement = configDuration >= 60 ? 60 : 1;\n this.isInternalsAvailable && this.internals.setFormValue(this.durationMinutes.toString(), 'duration');\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.validateDuration();\n }\n }\n\n /**\n * Event emitted when the event duration changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n connectedCallback() {\n debug('nylas-event-duration', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-event-duration', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-event-duration', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n }\n this.duration = this.duration ? this.duration : this.eventDurationMinutes ? (this.eventDurationMinutes >= 60 ? this.eventDurationMinutes / 60 : this.eventDurationMinutes) : 30;\n this.durationMinutes = this.durationMinutes ? this.durationMinutes : this.duration ? this.duration : 30;\n this.durationIncrement = this.durationIncrement ? this.durationIncrement : this.duration >= 60 ? 60 : 1;\n this.setDurationMintueOptions();\n this.isInternalsAvailable && this.internals.setFormValue(this.durationMinutes.toString(), 'duration');\n }\n\n disconnectedCallback() {\n debug('nylas-event-duration', 'disconnectedCallback');\n }\n\n get isInternalsAvailable() {\n return typeof this.internals !== 'undefined' && typeof this.internals.setFormValue === 'function';\n }\n\n setDurationMintueOptions() {\n if (this.durationIncrement === 1) {\n this.durationMinutesOptions = [\n { value: (15).toString(), label: '15' },\n { value: (30).toString(), label: '30' },\n { value: (45).toString(), label: '45' },\n { value: (60).toString(), label: '60' },\n ];\n } else {\n this.durationMinutesOptions = Array.from({ length: 23 }, (_, i) => ({ value: (i + 1).toString(), label: (i + 1).toString() }));\n }\n return this.durationMinutesOptions;\n }\n\n validateDuration() {\n if (this.durationMinutes % 5 !== 0) {\n this.error = i18next.t('nylasEventDuration.error.durationMustBeMultipleOf5');\n this.isInternalsAvailable && this.internals.setValidity({ customError: true }, this.error);\n } else if (this.durationMinutes <= 0) {\n this.error = i18next.t('nylasEventDuration.error.durationMustBeGreaterThan0');\n this.isInternalsAvailable && this.internals.setValidity({ customError: true }, this.error);\n } else {\n this.error = '';\n this.isInternalsAvailable && this.internals.setValidity({});\n }\n return this.error;\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-calendar-picker', 'nylasFormDropdownChangedHandler', event.detail);\n const { value } = event.detail;\n this.durationIncrement = parseInt(value.toString());\n if (this.durationIncrement === 1) {\n this.duration = 60;\n } else {\n this.duration = 1;\n }\n this.setDurationMintueOptions();\n this.durationMinutes = this.duration * this.durationIncrement;\n if (this.validateDuration() !== '') {\n return;\n }\n this.isInternalsAvailable && this.internals.setFormValue(this.durationMinutes.toString(), this.name);\n this.valueChanged.emit({ value: this.durationMinutes.toString(), name: this.name });\n }\n\n @Listen('inputOptionChanged')\n inputOptionChangedHandler(event: CustomEvent<{ value: number; name: string }>) {\n debug('nylas-calendar-picker', 'inputOptionChangedHandler', event.detail);\n const { value } = event.detail;\n this.duration = parseFloat(value.toString());\n this.durationMinutes = this.duration * this.durationIncrement;\n if (this.validateDuration() !== '') {\n return;\n }\n this.isInternalsAvailable && this.internals.setFormValue(this.durationMinutes.toString(), this.name);\n this.valueChanged.emit({ value: this.durationMinutes.toString(), name: this.name });\n }\n\n @RegisterComponent<NylasEventDuration, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-event-duration',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n const durationOptions = [\n { value: (1).toString(), label: i18next.t('timeDuration', { context: 'minute' }) },\n { value: (60).toString(), label: i18next.t('timeDuration', { context: 'hour' }) },\n ];\n\n return (\n <Host>\n <div class=\"nylas-event-duration\" part=\"ned\">\n <label htmlFor=\"duration\">\n {i18next.t('nylasEventDuration.headerTitle')}\n <span class=\"required\">*</span>\n </label>\n <div class=\"nylas-event-duration__wrapper\">\n <input-dropdown\n class={this.error ? 'error' : ''}\n name={'event-duration'}\n options={this.durationMinutesOptions}\n inputValue={this.duration.toString()}\n exportparts=\"id_dropdown: ned__input_dropdown, id_dropdown-input: ned__input_dropdown-input, id_dropdown-content: ned__input_dropdown-content\"\n defaultInputOption={this.durationMinutesOptions.find(i => i.value === this.duration.toString())}\n />\n {this.durationIncrement && (\n <select-dropdown\n name={'event-duration'}\n options={durationOptions}\n pluralizedLabel={\n this.duration > 1\n ? i18next.t(`time.${this.durationIncrement === 60 ? 'hours' : 'minutes'}`)\n : i18next.t(`time.${this.durationIncrement === 60 ? 'hour' : 'minute'}`)\n }\n exportparts=\"sd_dropdown: ned__dropdown, sd_dropdown-button: ned__dropdown-button, sd_dropdown-content: ned__dropdown-content\"\n defaultSelectedOption={durationOptions.find(i => i.value === this.durationIncrement.toString())}\n withSearch={false}\n />\n )}\n </div>\n <div class={`nylas-event-duration__error-container ${this.error ? 'visible' : ''}`} part=\"ned__error-container\">\n <div class=\"nylas-event-duration__error\" part=\"ned__error\">\n {this.error}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n margin: 1rem;\n @include default-css-variables;\n}\n\n.nylas-event-limits__title {\n color: var(--nylas-base-900);\n font-size: 16px;\n font-style: normal;\n font-weight: 600;\n line-height: 20px; /* 125% */\n margin: 0;\n text-align: left;\n}\n.nylas-event-limits__subtitle {\n color: var(--nylas-base-600);\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px; /* 142.857% */\n margin: 0.25rem 0px 0px;\n text-align: left;\n}\n.nylas-event-limits__content {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.nylas-event-limits__block {\n display: flex;\n justify-content: space-between;\n gap: 0.5rem;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { checkForMissingSlots, debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Host, 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-limits` component is an input form for event limits, such as the number of available days in the future and\n * the minimum period of notice that a guest must provide to cancel a booking.\n * This component is a container for the `nylas-limit-future-bookings` and `nylas-min-cancellation-notice` components.\n *\n * ```html\n * <nylas-event-limits>\n * <div slot=\"inputs\">\n * <nylas-limit-future-bookings></nylas-limit-future-bookings>\n * <nylas-min-cancellation-notice></nylas-min-cancellation-notice>\n * </div>\n * </nylas-event-limits>\n * ```\n *\n * @slot inputs - The event information inputs. This includes the limit future bookings and minimum cancellation notice components.\n */\n@Component({\n tag: 'nylas-event-limits',\n styleUrl: 'nylas-event-limits.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasEventLimits {\n @Element() el!: HTMLElement;\n\n /**\n * The 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-limits', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-event-limits', 'componentWillLoad');\n }\n\n componentDidLoad() {\n debug('nylas-event-limits', 'componentDidLoad');\n checkForMissingSlots(['inputs'], this.el);\n }\n\n disconnectedCallback() {\n debug('nylas-event-limits', 'disconnectedCallback');\n }\n\n @RegisterComponent<NylasEventLimits, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-event-limits',\n 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: nel__header\">\n <h1 slot=\"header-title\" class=\"nylas-event-limits__title\">\n {i18next.t('nylasEventLimits.headerTitle')}\n </h1>\n <div slot=\"content\" class=\"nylas-event-limits__content\">\n <slot name=\"inputs\"></slot>\n </div>\n </nylas-form-card>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n @include default-css-variables;\n}\n\n.nylas-limit-future-bookings {\n display: flex;\n justify-content: space-between;\n font-family: var(--nylas-font-family);\n @media #{$mobile} {\n flex-direction: column;\n gap: 0.5rem;\n }\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%; /* 21px */\n span.label-icon {\n margin-left: 4px;\n tooltip-component {\n display: flex;\n }\n }\n }\n}\n\nselect-dropdown::part(sd_dropdown-button) {\n border: none;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Host, State, h, Element, Prop, Watch, Event, EventEmitter, Listen } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-limit-future-bookings` component is a form input for the number of days in the future a guest is allowed to book an event.\n *\n * @part nlfb - The limit future bookings container\n * @part nlfb__number-dropdown - The number dropdown container\n * @part nlfb__number-dropdown-button - The number dropdown button\n * @part nlfb__number-dropdown-content - The number dropdown content\n * @part nlfb__period-dropdown - The period dropdown container\n * @part nlfb__period-dropdown-button - The period dropdown button\n * @part nlfb__period-dropdown-content - The period dropdown content\n */\n@Component({\n tag: 'nylas-limit-future-bookings',\n styleUrl: 'nylas-limit-future-bookings.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasLimitFutureBookings {\n /**\n * The host element <nylas-limit-future-bookings>\n */\n @Element() host!: HTMLElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The number of days into the future that invitees will see availability, as set in the configuration.\n */\n @Prop() availableDaysInFuture?: number;\n /**\n * @standalone\n * The name of the limit future bookings input.\n */\n @Prop() name: string = 'limit-future-bookings';\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n /**\n * The selected number for the available days in the future.\n */\n @State() selectedNumber;\n /**\n * The selected period for the available days in the future.\n */\n @State() selectedPeriod;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-limit-future-bookings', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newVal: Configuration) {\n const daysInFuture = newVal?.scheduler?.available_days_in_future || this.availableDaysInFuture || 1;\n if (daysInFuture) {\n this.updateNumberAndPeriodFromDays(daysInFuture);\n }\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n this.internals.setFormValue(daysInFuture?.toString(), this.name);\n }\n\n @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 future booking limit changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n connectedCallback() {\n debug('nylas-limit-future-bookings', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-limit-future-bookings', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-limit-future-bookings', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.updateNumberAndPeriodFromDays(this.availableDaysInFuture || 1);\n }\n }\n\n disconnectedCallback() {\n debug('nylas-limit-future-bookings', 'disconnectedCallback');\n }\n\n @Listen('timePeriodChanged')\n timePeriodChangedHandler(\n event: CustomEvent<{\n number: number;\n period: string;\n }>,\n ) {\n const { number, period } = event.detail;\n let availableDaysInFuture;\n if (period === 'day') {\n availableDaysInFuture = number;\n } else if (period === 'week') {\n availableDaysInFuture = number * 7;\n } else {\n availableDaysInFuture = number * 30;\n }\n this.valueChanged.emit({ value: availableDaysInFuture, name: this.name });\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n this.internals.setFormValue(availableDaysInFuture.toString(), this.name);\n }\n\n updateNumberAndPeriodFromDays(days: number): void {\n let number, period;\n if (days >= 30 && days % 30 === 0) {\n number = days / 30;\n period = 'month';\n } else if (days >= 7 && days % 7 === 0) {\n number = days / 7;\n period = 'week';\n } else {\n number = days;\n period = 'day';\n }\n this.selectedNumber = number;\n this.selectedPeriod = period;\n }\n\n @RegisterComponent<NylasLimitFutureBookings, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-limit-future-bookings',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n const showTImePeriodSelector = typeof this.selectedNumber == 'number' && typeof this.selectedPeriod == 'string';\n return (\n <Host>\n <div class=\"nylas-limit-future-bookings\" part=\"nlfb\">\n <label>\n {i18next.t('nylasLimitFutureBookings.headerTitle')}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasLimitFutureBookings.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n </label>\n {showTImePeriodSelector && (\n <time-period-selector\n id=\"limit-future-bookings\"\n timePeriods={[\n { value: 'day', label: i18next.t('timePeriod', { context: 'day' }) },\n { value: 'week', label: i18next.t('timePeriod', { context: 'week' }) },\n { value: 'month', label: i18next.t('timePeriod', { context: 'month' }) },\n ]}\n exportparts=\"tps__number-dropdown: nlfb__number-dropdown, tps__number-dropdown-button: nlfb__number-dropdown-button, tps__number-dropdown-content: nlfb__number-dropdown-content, tps__period-dropdown: nlfb__period-dropdown, tps__period-dropdown-button: nlfb__period-dropdown-button, tps__period-dropdown-content: nlfb__period-dropdown-content\"\n defaultSelectedNumber={this.selectedNumber}\n defaultSelectedPeriod={this.selectedPeriod}\n />\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n @include default-css-variables;\n}\n\n.nylas-min-booking-notice {\n display: flex;\n justify-content: space-between;\n font-family: var(--nylas-font-family);\n @media #{$mobile} {\n flex-direction: column;\n gap: 0.5rem;\n }\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%; /* 21px */\n span.label-icon {\n margin-left: 4px;\n tooltip-component {\n display: flex;\n }\n }\n }\n}\n\nselect-dropdown::part(sd_dropdown-button) {\n border: none;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Host, State, h, Element, Prop, Watch, Event, EventEmitter, Listen } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-min-booking-notice` component is a form input for the minimum period of notice (minutes) that a guest must\n * provide to book an event.\n *\n * @part nmbn - The minimum booking notice container\n * @part nmbn__number-dropdown - The number dropdown container\n * @part nmbn__number-dropdown-button - The number dropdown button\n * @part nmbn__number-dropdown-content - The number dropdown content\n * @part nmbn__period-dropdown - The period dropdown container\n * @part nmbn__period-dropdown-button - The period dropdown button\n * @part nmbn__period-dropdown-content - The period dropdown content\n */\n@Component({\n tag: 'nylas-min-booking-notice',\n styleUrl: 'nylas-min-booking-notice.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasMinBookingNotice {\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The name of the min booking notice input.\n */\n @Prop() name: string = 'min-booking-notice';\n /**\n * @standalone\n * The minimum booking notice (minutes) stored in the configuration\n */\n @Prop() minBookingNotice?: number;\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n /**\n *\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n /**\n * The host element <nylas-min-booking-notice>\n */\n @Element() host!: HTMLElement;\n\n /**\n * The selected number of minutes for the min booking notice.\n */\n @State() selectedNumber;\n /**\n * The selected period for the min booking notice.\n */\n @State() selectedPeriod;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-min-booking-notice', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newVal: Configuration) {\n const minBookingNotice = typeof newVal?.scheduler?.min_booking_notice !== 'undefined' ? newVal?.scheduler?.min_booking_notice : this.minBookingNotice || 1;\n this.updateNumberAndPeriodFromMinutes(minBookingNotice);\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n this.internals.setFormValue(minBookingNotice?.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 * This event is fired when the value of the min booking notice changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n connectedCallback() {\n debug('nylas-min-booking-notice', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-min-booking-notice', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-min-booking-notice', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.updateNumberAndPeriodFromMinutes(this.minBookingNotice || 1);\n }\n }\n\n disconnectedCallback() {\n debug('nylas-min-booking-notice', 'disconnectedCallback');\n }\n\n @Listen('timePeriodChanged')\n timePeriodChangedHandler(\n event: CustomEvent<{\n number: number;\n period: string;\n }>,\n ) {\n const { number, period } = event.detail;\n let totalMinutes;\n const minutesInHour = 60;\n const minutesInDay = minutesInHour * 24;\n const minutesInWeek = minutesInDay * 7;\n const minutesInMonth = minutesInDay * 30; // Assuming 30 days in a month for simplification\n\n if (period === 'minute') {\n totalMinutes = number;\n } else if (period === 'hour') {\n totalMinutes = number * minutesInHour;\n } else if (period === 'day') {\n totalMinutes = number * minutesInDay;\n } else if (period === 'week') {\n totalMinutes = number * minutesInWeek;\n } else if (period === 'month') {\n totalMinutes = number * minutesInMonth;\n } else {\n totalMinutes = 0;\n }\n this.valueChanged.emit({ value: totalMinutes, name: this.name });\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n this.internals.setFormValue(totalMinutes.toString(), this.name);\n }\n\n private updateNumberAndPeriodFromMinutes(minutes: number): void {\n const minutesInHour = 60;\n const minutesInDay = minutesInHour * 24;\n const minutesInWeek = minutesInDay * 7;\n const minutesInMonth = minutesInDay * 30; // Assuming 30 days in a month for simplification\n let number, period;\n if (minutes === 0) {\n number = 0;\n period = 'minute';\n } else if (minutes >= minutesInMonth && 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 this.selectedNumber = number;\n this.selectedPeriod = period;\n }\n\n @RegisterComponent<NylasMinBookingNotice, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-min-booking-notice',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n const showTimePeriodSelector = typeof this.selectedNumber == 'number' && typeof this.selectedPeriod == 'string';\n return (\n <Host>\n <div class=\"nylas-min-booking-notice\" part=\"nmbn\">\n <label>\n {i18next.t('nylasMinBookingNotice.headerTitle')}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasMinBookingNotice.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n </label>\n {showTimePeriodSelector && (\n <time-period-selector\n id=\"min-booking-notice\"\n exportparts=\"tps__number-dropdown: nmbn__number-dropdown, tps__number-dropdown-button: nmbn__number-dropdown-button, tps__number-dropdown-content: nmbn__number-dropdown-content, tps__period-dropdown: nmbn__period-dropdown, tps__period-dropdown-button: nmbn__period-dropdown-button, tps__period-dropdown-content: nmbn__period-dropdown-content\"\n timePeriods={[\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 { value: 'week', label: i18next.t('timePeriod', { context: 'week' }) },\n ]}\n defaultSelectedNumber={this.selectedNumber}\n defaultSelectedPeriod={this.selectedPeriod}\n />\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n @include default-css-variables;\n}\n\n.nylas-min-cancellation-notice {\n display: flex;\n justify-content: space-between;\n font-family: var(--nylas-font-family);\n @media #{$mobile} {\n flex-direction: column;\n gap: 0.5rem;\n }\n label {\n display: flex;\n align-items: center;\n color: var(--nylas-base-800);\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 150%; /* 21px */\n span.label-icon {\n margin-left: 4px;\n tooltip-component {\n display: flex;\n }\n }\n }\n}\n\nselect-dropdown::part(sd_dropdown-button) {\n border: none;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Host, State, h, Element, Prop, Watch, Event, EventEmitter, Listen } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-min-cancellation-notice` component is a form input for the minimum period of notice (minutes) that a guest must\n * provide to cancel a booked event.\n *\n * @part nmcn - The minimum cancellation notice container\n * @part nmcn__number-dropdown - The number dropdown container\n * @part nmcn__number-dropdown-button - The number dropdown button\n * @part nmcn__number-dropdown-content - The number dropdown content\n * @part nmcn__period-dropdown - The period dropdown container\n * @part nmcn__period-dropdown-button - The period dropdown button\n * @part nmcn__period-dropdown-content - The period dropdown content\n */\n@Component({\n tag: 'nylas-min-cancellation-notice',\n styleUrl: 'nylas-min-cancellation-notice.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasMinCancellationNotice {\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The name of the min cancellation notice input.\n */\n @Prop() name: string = 'min-cancellation-notice';\n /**\n * @standalone\n * The minimum cancellation notice (minutes) stored in the configuration\n */\n @Prop() minCancellationNotice?: number;\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n /**\n * The host element <nylas-min-cancellation-notice>\n */\n @Element() host!: HTMLElement;\n /**\n * The selected number of minutes for the min cancellation notice.\n */\n @State() selectedNumber;\n /**\n * The selected period for the min cancellation notice.\n */\n @State() selectedPeriod;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-min-cancellation-notice', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newVal: Configuration) {\n const minCancellationNotice = typeof newVal?.scheduler?.min_cancellation_notice !== 'undefined' ? newVal?.scheduler?.min_cancellation_notice : this.minCancellationNotice || 0;\n if (typeof minCancellationNotice === 'number') {\n this.updateNumberAndPeriodFromMinutes(minCancellationNotice);\n }\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n this.internals.setFormValue(minCancellationNotice?.toString(), this.name);\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n }\n\n /**\n * This event is fired when the value of the min cancellation notice changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n connectedCallback() {\n debug('nylas-min-cancellation-notice', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-min-cancellation-notice', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-min-cancellation-notice', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.updateNumberAndPeriodFromMinutes(this.minCancellationNotice || 0);\n }\n }\n\n disconnectedCallback() {\n debug('nylas-min-cancellation-notice', 'disconnectedCallback');\n }\n\n @Listen('timePeriodChanged')\n timePeriodChangedHandler(\n event: CustomEvent<{\n number: number;\n period: string;\n }>,\n ) {\n const { number, period } = event.detail;\n let totalMinutes;\n const minutesInHour = 60;\n const minutesInDay = minutesInHour * 24;\n const minutesInWeek = minutesInDay * 7;\n const minutesInMonth = minutesInDay * 30; // Assuming 30 days in a month for simplification\n\n if (period === 'minute') {\n totalMinutes = number;\n } else if (period === 'hour') {\n totalMinutes = number * minutesInHour;\n } else if (period === 'day') {\n totalMinutes = number * minutesInDay;\n } else if (period === 'week') {\n totalMinutes = number * minutesInWeek;\n } else if (period === 'month') {\n totalMinutes = number * minutesInMonth;\n } else {\n totalMinutes = 0;\n }\n this.valueChanged.emit({ value: totalMinutes, name: this.name });\n if (typeof this.internals.setFormValue !== 'function') {\n return;\n }\n this.internals.setFormValue(totalMinutes.toString(), this.name);\n }\n\n private updateNumberAndPeriodFromMinutes(minutes: number): void {\n const minutesInHour = 60;\n const minutesInDay = minutesInHour * 24;\n const minutesInWeek = minutesInDay * 7;\n const minutesInMonth = minutesInDay * 30; // Assuming 30 days in a month for simplification\n let number, period;\n\n if (minutes === 0) {\n number = 0;\n period = 'minute';\n } else if (minutes % minutesInMonth === 0 && minutes >= minutesInMonth) {\n number = minutes / minutesInMonth;\n period = 'month';\n } else if (minutes % minutesInWeek === 0 && minutes >= minutesInWeek) {\n number = minutes / minutesInWeek;\n period = 'week';\n } else if (minutes % minutesInDay === 0 && minutes >= minutesInDay) {\n number = minutes / minutesInDay;\n period = 'day';\n } else if (minutes % minutesInHour === 0 && minutes >= minutesInHour) {\n number = minutes / minutesInHour;\n period = 'hour';\n } else {\n number = minutes;\n period = 'minute';\n }\n this.selectedNumber = number;\n this.selectedPeriod = period;\n }\n\n @RegisterComponent<NylasMinCancellationNotice, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-min-cancellation-notice',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n const showTimePeriodSelector = typeof this.selectedNumber == 'number' && typeof this.selectedPeriod == 'string';\n return (\n <Host>\n <div class=\"nylas-min-cancellation-notice\" part=\"nmcn\">\n <label>\n {i18next.t('nylasMinCancellationNotice.headerTitle')}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasMinCancellationNotice.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n </label>\n {showTimePeriodSelector && (\n <time-period-selector\n id=\"min-cancellation-notice\"\n exportparts=\"tps__number-dropdown: nmcn__number-dropdown, tps__number-dropdown-button: nmcn__number-dropdown-button, tps__number-dropdown-content: nmcn__number-dropdown-content, tps__period-dropdown: nmcn__period-dropdown, tps__period-dropdown-button: nmcn__period-dropdown-button, tps__period-dropdown-content: nmcn__period-dropdown-content\"\n timePeriods={[\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 { value: 'week', label: i18next.t('timePeriod', { context: 'week' }) },\n ]}\n defaultSelectedNumber={this.selectedNumber}\n defaultSelectedPeriod={this.selectedPeriod}\n />\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n@import '../../../common/mixins/inputs.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-page-name {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n text-align: left;\n\n .header {\n padding: 1rem;\n display: grid;\n grid-template-columns: 1fr auto;\n\n h3 {\n border-radius: var(--nylas-border-radius-2x);\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n display: flex;\n gap: 4px;\n align-items: center;\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n\n .required-asterisk {\n color: var(--nylas-error);\n }\n }\n\n .drawer-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n\n .nylas-page-name__body {\n display: grid;\n grid-template-columns: 1fr;\n background-color: var(--nylas-base-25);\n border-radius: 0 0 var(--nylas-border-radius-2x) var(--nylas-border-radius-2x);\n border-top: 1px solid var(--nylas-base-200);\n\n @media #{$mobile} {\n grid-template-columns: 1fr;\n }\n\n .nylas-page-name__section {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n color: var(--nylas-base-800);\n\n @media #{$mobile} {\n border: none;\n }\n\n .nylas-page-name__row {\n display: flex;\n align-items: center;\n gap: 1rem;\n\n label {\n display: flex;\n align-items: center;\n\n span.required {\n color: var(--nylas-error, #cc4841);\n }\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 16px;\n font-weight: 500;\n line-height: 24px;\n color: var(--nylas-base-900);\n }\n\n .input-container {\n width: 100%;\n\n span.error-message {\n color: var(--nylas-error);\n }\n }\n }\n }\n }\n\n .nylas-page-name__input-wrapper {\n @include textfield;\n width: -moz-available;\n width: -webkit-fill-available;\n display: flex;\n flex-direction: row;\n gap: 0.125rem;\n border-radius: var(--nylas-border-radius-2x);\n z-index: 1;\n\n &.error {\n border: 1px solid var(--nylas-error);\n }\n\n input-component::part(ic__input) {\n outline: none;\n border: none;\n width: 100%;\n font-size: 16px;\n height: auto;\n padding-left: 0px;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-page-name` component is a UI component that allows users to add a custom page name which will appear in the top left corner of the date picker.\n *\n * @part npn - The nylas-page-name container\n * @part npn__body - The body of the event communication section\n * @part npn__header - The header of the event communication section\n * @part npn__drawer-toggle--container - The card's drawer toggle container\n * @part npn__input-textfield - The page name input textfield\n */\n@Component({\n tag: 'nylas-page-name',\n styleUrl: 'nylas-page-name.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasPageName {\n @Element() host!: HTMLNylasPageNameElement;\n\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The name of the component\n */\n @Prop() name: string = 'page-name';\n /**\n * @standalone\n * The default page name\n */\n @Prop() pageName?: string;\n /**\n * @standalone\n * Show toggle button that allows users to expand or collapse the card\n */\n @Prop() showToggle: boolean = true;\n /**\n * @standalone\n * Is the page name container card expanded\n */\n @Prop() isOpen: boolean = true;\n /**\n * Make the field required\n */\n @Prop() required: boolean = false;\n\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * The required property for the page name input\n */\n @Prop() requirePageName: boolean = false;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The current page name state\n */\n @State() currentPageName!: string;\n\n /**\n * The page name error message\n */\n @State() pageNameErrorMessage!: string;\n\n /**\n * This event is fired when the page name value changes\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-page-name', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-page-name', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-page-name', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-page-name', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.currentPageName = this.pageName ?? '';\n }\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(this.currentPageName), this.name);\n }\n\n componentWillUpdate() {\n debug('nylas-page-name', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-page-name', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-page-name', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-page-name', 'componentDidRender');\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-page-name', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-custom-booking-flow', 'selectedConfigurationChangedHandler', newValue);\n this.currentPageName = newValue?.name ?? this.pageName ?? '';\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(this.currentPageName), 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 * 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('nylasFormInputChanged')\n async nylasFormInputChangeHandler(event: CustomEvent<{ value: string; name: string }>) {\n const { name, value } = event.detail;\n if (!value && this.requirePageName) {\n this.isInternalsAvailable && this.internals.setValidity({ customError: true }, i18next.t('nylasPageName.pageNameError'));\n this.pageNameErrorMessage = i18next.t('nylasPageName.pageNameError');\n return;\n } else {\n this.isInternalsAvailable && this.internals.setValidity({ customError: false });\n this.pageNameErrorMessage = '';\n }\n if (name === 'page-name') {\n this.currentPageName = value;\n this.internals.setFormValue(JSON.stringify(value), this.name);\n this.valueChanged.emit({ value: JSON.stringify(value), name: this.name });\n }\n }\n\n toggleDrawer() {\n this.isOpen = !this.isOpen;\n }\n\n @RegisterComponent<NylasPageName, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-page-name',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const isComponentReady = typeof this.currentPageName !== 'undefined';\n return (\n <Host>\n <div class=\"nylas-page-name\" part=\"nces\">\n <div class=\"header\" part=\"nces__header\">\n <div>\n <h3>{i18next.t('nylasPageName.headerTitle')}</h3>\n <p>\n {i18next.t('nylasPageName.headerSubTitle')}\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasPageName.tooltip.desc')}</span>\n </tooltip-component>\n {this.requirePageName && <span class=\"required-asterisk\">*</span>}\n </p>\n </div>\n\n {this.showToggle && (\n <div class=\"drawer-toggle\" part=\"nces__drawer-toggle--container\">\n <span class={`chevron ${this.isOpen ? 'open' : 'closed'} `} onClick={() => this.toggleDrawer()}>\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n )}\n </div>\n\n {this.isOpen && (\n <div class=\"nylas-page-name__body\" part=\"nces__body\">\n <div class=\"nylas-page-name__section\">\n <div class=\"nylas-page-name__row\">\n <div class=\"input-container\">\n <div class={{ 'nylas-page-name__input-wrapper': true, 'error': !!this.pageNameErrorMessage }}>\n {isComponentReady && (\n <input-component\n name=\"page-name\"\n id=\"page-name\"\n type=\"text\"\n required={false}\n exportparts=\"ic_input: npn__input-textfield\"\n defaultValue={this.currentPageName ?? ''}\n />\n )}\n </div>\n {this.pageNameErrorMessage && <span class=\"error-message\">{this.pageNameErrorMessage}</span>}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-page-styling {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n text-align: left;\n\n .hidden {\n display: none;\n }\n\n &.no-border {\n border: none;\n }\n\n .header {\n padding: 1rem;\n display: grid;\n grid-template-columns: 1fr auto;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n border-radius: var(--nylas-border-radius-2x);\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n\n .drawer-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n\n .nylas-page-styling__body {\n display: grid;\n grid-template-columns: 1fr auto;\n background-color: var(--nylas-base-25);\n border-radius: 0 0 var(--nylas-border-radius-2x);\n\n @media #{$mobile} {\n grid-template-columns: 1fr;\n }\n\n .nylas-page-styling__section {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n color: var(--nylas-base-800);\n\n &.no-padding {\n padding: 0;\n }\n\n @media #{$mobile} {\n border: none;\n }\n\n .nylas-page-styling__row {\n display: grid;\n grid-template-columns: 1fr;\n align-items: center;\n\n label {\n display: flex;\n align-items: center;\n\n span.required {\n color: var(--nylas-error, #cc4841);\n }\n\n span.label-icon {\n margin-left: 4px;\n\n tooltip-component {\n display: flex;\n }\n }\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 16px;\n font-weight: 500;\n line-height: 24px;\n color: var(--nylas-base-900);\n }\n\n .subsection {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n &.hide {\n display: none;\n }\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n .input-container,\n >* {\n display: flex;\n flex-direction: column;\n column-gap: 2rem;\n row-gap: 0.25rem;\n width: 100%;\n flex: 1;\n\n textarea {\n padding: 12px 16px;\n border-width: 1;\n resize: vertical;\n border-radius: 8px;\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n border: 1px solid var(--nylas-base-200);\n }\n }\n }\n }\n }\n\n span.error-message {\n color: var(--nylas-error);\n }\n\n span.help-text {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n}","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug, sanitize } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Appearance, Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-page-styling` component is a UI component that allows users to customize the styling of the scheduling page.\n * To use this component, pass a slot `custom-page-style-inputs` to the `nylas-scheduler-editor` component with the input\n * fields you want to display. The component will automatically update the appearance object when the input fields are changed.\n * Ensure that the input fields have the `name` attribute set to the key in the appearance object.\n *\n * If you want to style the Nylas hosted scheduler page, you can use this component to customize the appearance of the page.\n * The fields that can be customized in the Nylas hosted scheduler page are:\n * - Primary color: (name: color)\n * - Company logo: (name: company_logo_url)\n * - Submit button label: (name: submit_button_label)\n * - Thank you message: (name: thank_you_message)\n *\n * This component cannot be used as an independent component. It must be used within the `nylas-scheduler-editor` component.\n *\n * @slot custom-page-style-inputs - This slot is used to pass a custom page style form to the Nylas Scheduler Editor component.\n * @part nps - The nylas-page-styling container\n * @part nps__header - The header of the page styling section\n * @part nps__drawer-toggle--container - The page styling drawer toggle container\n * @part nps__body - The body of the page styling section\n * @part nps__title-input-textfield - The page styling page title input textfield\n * @part nps__company-name-input-textfield - The page styling company name input textfield\n * @part nps__input-image-url - The page styling company logo input textfield\n * @part nps__color-picker - The page styling color picker\n * @part nps__color-picker-button - The page styling color picker button\n * @part nps__color-picker-button-label - The page styling color input field label *\n * @part nps__color-picker-button-selected-label - The page styling color picker label denoting which color is selected\n * @part nps__submit-button-label-input-textfield - The page styling submut button label input textfield\n * @part nps__message-textarea - The page styling thank you message textarea\n */\n@Component({\n tag: 'nylas-page-styling',\n styleUrl: 'nylas-page-styling.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasPageStyling {\n @Element() host!: HTMLNylasPageStylingElement;\n /**\n * @internal\n * The selected configuration.\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @internal\n * The name of the component\n */\n @Prop() name: string = 'page-styling';\n /**\n * @internal\n * The appearance data to display\n */\n @Prop() appearance?: Appearance;\n /**\n * @internal\n * Is the page styling card open\n */\n @Prop() isOpen: boolean = true;\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The confirmation email template state.\n */\n @State() currentAppearance!: Appearance;\n /**\n * The confirmation email template state.\n */\n @State() customInputsSlot: Element | null = null;\n\n /**\n * This event is fired when the email reminders change.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n /**\n * This event is fired when the form is submitted in the parent component.\n */\n @Event() bookingFormSubmitted!: EventEmitter<void>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-page-styling', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-page-styling', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-page-styling', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-page-styling', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n }\n }\n\n componentWillUpdate() {\n debug('nylas-page-styling', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-page-styling', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-page-styling', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-page-styling', 'componentDidRender');\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-page-styling', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n }\n\n customInputsSlotChangedHandler(newValue: Element | null) {\n debug('nylas-page-styling', 'customInputsSlotChangedHandler', newValue);\n\n const appearance = this.currentAppearance;\n\n function updateInputDefaultValues(element: HTMLElement) {\n // Process elements with a 'name' attribute\n if (element.hasAttribute && element.hasAttribute('name')) {\n const key = element.getAttribute('name');\n if (appearance && key && key in appearance && appearance[key] !== undefined) {\n // Update attributes based on component type\n const componentType = element.getAttribute('component-type');\n\n element.setAttribute('data-page-styling', 'true');\n\n if (componentType === 'checkbox') {\n element.setAttribute('checked', appearance[key]);\n } else if (componentType === 'radio-group') {\n element.setAttribute('default-selected-value', appearance[key]);\n } else if (componentType === 'color-picker') {\n element.setAttribute('default-selected-color', appearance[key]);\n } else if (componentType === 'select-dropdown') {\n const options = element.getAttribute('options');\n const selectedOption = options ? JSON.parse(options).find((option: { value: string }) => option.value === appearance[key]) : null;\n element.setAttribute('default-selected-option', JSON.stringify(selectedOption));\n } else if (componentType === 'image-url') {\n element.setAttribute('image-url', appearance[key]);\n } else {\n // Default case: set the default value\n element.setAttribute('default-value', appearance[key]);\n }\n }\n }\n\n // Recursively process child elements (skip text nodes)\n element.childNodes.forEach(child => {\n if (child.nodeType === Node.ELEMENT_NODE) {\n updateInputDefaultValues(child as HTMLElement); // Cast child to HTMLElement\n }\n });\n }\n\n // Start the recursive process with the cloned element (newValue)\n if (newValue) {\n updateInputDefaultValues(newValue as HTMLElement);\n }\n }\n\n cloneAndCopyProps(element: HTMLElement): HTMLElement {\n // Clone the current element\n const clonedElement = element.cloneNode(false) as HTMLElement; // Do a shallow clone first\n const componentType = element.getAttribute('component-type');\n const key = element.getAttribute('name');\n\n // Copy properties like 'options' and 'value' for custom elements\n if ((element as any).options) {\n const options = (element as any).getAttribute('options');\n console.log('page-styling options', element, options);\n if (typeof options === 'string') {\n try {\n const parsedOptions = JSON.parse(options);\n (clonedElement as any).options = parsedOptions; // Parse the 'options' string\n if (componentType === 'select-dropdown' && key && key in this.currentAppearance) {\n const selectedOption = parsedOptions.find((option: { value: string }) => option.value === this.currentAppearance[key]);\n (clonedElement as any).setAttribute('default-selected-option', JSON.stringify(selectedOption));\n }\n } catch (e) {\n console.error('Error parsing options', e);\n }\n } else {\n (clonedElement as any).options = (element as any).options; // Copy 'options' property\n }\n }\n\n if ((element as any).value) {\n (clonedElement as any).value = (element as any).value; // Copy 'value' property\n }\n\n // Recursively process child elements\n element.childNodes.forEach(child => {\n if (child.nodeType === Node.ELEMENT_NODE) {\n // If the child is an element, recursively clone and process it\n const clonedChild = this.cloneAndCopyProps(child as HTMLElement);\n clonedElement.appendChild(clonedChild); // Append the cloned child to the parent clone\n } else if (child.nodeType === Node.TEXT_NODE) {\n // For text nodes, just clone and append the text content\n clonedElement.appendChild(child.cloneNode(true));\n }\n });\n\n return clonedElement; // Return the cloned element with its children\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-page-styling', 'selectedConfigurationChangedHandler', newValue);\n this.currentAppearance = newValue?.appearance || {};\n // Get the slot element\n const editor = document.querySelector('nylas-scheduler-editor');\n const slotElement = editor?.shadowRoot?.querySelector('slot[name=\"custom-page-style-inputs\"]') as HTMLSlotElement;\n if (!slotElement) {\n return;\n }\n\n const divElement = document.createElement('div');\n\n // Get the slotted content (the nodes passed into the slot)\n const slottedElements = slotElement?.assignedElements({ flatten: true });\n // Clone each of the slotted nodes and append them to the cloned slot\n slottedElements?.forEach(element => {\n const clonedElement = this.cloneAndCopyProps(element as HTMLElement); // Clone recursively and copy properties\n\n // Clone the slotted element (deep clone)\n this.customInputsSlotChangedHandler(clonedElement);\n // Append the cloned element to the document fragment\n divElement.appendChild(clonedElement);\n });\n\n // Replace the original content with the new cloned and updated content\n const bodyElement = this.host.shadowRoot?.querySelector('.nylas-page-styling');\n const slotContainer = bodyElement?.querySelector('.nylas-page-styling__body .subsection');\n\n if (slotContainer) {\n // Remove existing children (if necessary) and append the new content\n slotContainer.innerHTML = ''; // Clear existing content\n divElement.childNodes.forEach(child => {\n slotContainer.appendChild(child); // Append each child of divElement\n });\n this.customInputsSlot = divElement;\n }\n }\n\n checkIfElementIsInSlot(name: string): boolean {\n const findElement = document?.querySelector(`[slot=\"custom-page-style-inputs\"] [name=\"${name}\"]`);\n return findElement ? true : false;\n }\n\n @Listen('nylasFormInputChanged', { target: 'document' })\n async nylasFormInputChangeHandler(event: CustomEvent<{ value: string; name: string; type?: string }>) {\n const { name, value } = event.detail;\n const type = event.detail?.type;\n\n if (!this.checkIfElementIsInSlot(name)) {\n return;\n }\n switch (name) {\n case 'submit_button_label':\n this.currentAppearance = { ...this.currentAppearance, submit_button_label: value };\n break;\n case 'thank_you_message':\n if (type === 'multi_line_text') {\n const value = sanitize(event.detail.value);\n this.currentAppearance = { ...this.currentAppearance, thank_you_message: value };\n }\n break;\n default:\n this.currentAppearance = { ...this.currentAppearance, [name]: value };\n break;\n }\n this.updateConfirmationFormValue();\n }\n\n @Listen('nylasFormDropdownChanged', { target: 'document' })\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-page-styling', 'nylasFormDropdownChangedHandler', event.detail);\n const { value, name } = event.detail;\n\n if (!this.checkIfElementIsInSlot(name)) {\n return;\n }\n if (name === 'color') {\n this.currentAppearance = { ...this.currentAppearance, color: value };\n } else {\n this.currentAppearance = { ...this.currentAppearance, [name]: value };\n }\n this.updateConfirmationFormValue();\n }\n\n @Listen('valueChanged', { target: 'document' })\n valueChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-page-styling', 'valueChangedHandler', event.detail);\n const { value, name } = event.detail;\n\n if (!this.checkIfElementIsInSlot(name)) {\n return;\n }\n this.currentAppearance = { ...this.currentAppearance, [name]: value };\n this.updateConfirmationFormValue(false);\n }\n\n @Listen('nylasFormCheckboxToggled', { target: 'document' })\n checkboxToggledHandler(event: CustomEvent<{ checked: boolean; name: string; label: string }>) {\n const { checked, name } = event.detail;\n if (!this.checkIfElementIsInSlot(name)) {\n return;\n }\n this.currentAppearance = { ...this.currentAppearance, [name]: checked };\n this.updateConfirmationFormValue();\n }\n\n @Listen('nylasFormRadioChanged', { target: 'document' })\n radioChangedHandler(event: CustomEvent<{ value: string; name: string; label: string; type: string }>) {\n const { value, name } = event.detail;\n if (!this.checkIfElementIsInSlot(name)) {\n return;\n }\n this.currentAppearance = { ...this.currentAppearance, [name]: value };\n this.updateConfirmationFormValue();\n }\n\n updateConfirmationFormValue(valueChanged: boolean = true) {\n debug('nylas-page-styling', 'updateConfirmationFormValue');\n this.internals.setFormValue(JSON.stringify(this.currentAppearance), this.name);\n if (valueChanged) {\n this.valueChanged.emit({ value: JSON.stringify(this.currentAppearance), name: this.name });\n }\n }\n\n toggleConfirmationEmail() {\n this.isOpen = !this.isOpen;\n }\n\n @RegisterComponent<NylasPageStyling, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-page-styling',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div part=\"nps\" class={{ 'nylas-page-styling': true, 'no-border': !this.customInputsSlot }}>\n {this.customInputsSlot ? (\n <div class=\"header\" part=\"nps__header\">\n <div>\n <h3>{i18next.t('nylasPageStyling.headerTitle')}</h3>\n </div>\n <div class=\"drawer-toggle\" part=\"nps__drawer-toggle--container\">\n <span class={`chevron ${this.isOpen ? 'open' : 'closed'} `} onClick={() => this.toggleConfirmationEmail()}>\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n </div>\n ) : null}\n <div class=\"hidden\">\n <input-color-picker name=\"color-picker\" />\n </div>\n <div id=\"nylas-page-styling__body\" class=\"nylas-page-styling__body\" part=\"nps__body\">\n <div class={{ 'nylas-page-styling__section': true, 'no-padding': !this.customInputsSlot }}>\n <div class=\"nylas-page-styling__row\">\n <div class={{ subsection: true, hide: !this.isOpen }}></div>\n </div>\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-participant-booking-calendars {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n\n .header {\n padding: 1rem;\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n }\n\n .content {\n .participant-container {\n padding-top: 12px;\n border-top: 1px solid var(--nylas-base-200);\n\n .participant-title {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 16px 16px;\n\n p {\n margin: 0;\n }\n\n .participant-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n }\n }\n}\n\nnylas-booking-calendar-picker::part(nbcp) {\n margin: 0;\n border: none;\n border-top: 1px solid var(--nylas-base-200);\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { AdditionalParticipant, Calendar, Configuration, Participant } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-participant-booking-calendars` component is a form input for selecting calendars to check availability for participants.\n *\n * @part npbc - The participant booking calendars host.\n * @part npbc__header - The header.\n * @part npbc__content - The content.\n * @part npbc__participant-container - The participant container.\n * @part npbc__participant-title - The participant title.\n * @part npbc__participant-toggle-container - The participant toggle container.\n */\n@Component({\n tag: 'nylas-participant-booking-calendars',\n styleUrl: 'nylas-participant-booking-calendars.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasParticipantBookingCalendars {\n @Element() host!: HTMLNylasParticipantBookingCalendarsElement;\n private bookingCalendarsFormRef!: HTMLFormElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The name of the participants custom availability.\n */\n @Prop() name: string = 'participant-booking-calendars';\n\n /**\n * @standalone\n * The participants selected in the add participants section.\n */\n @Prop() participants: Participant[] = this.selectedConfiguration?.participants || [];\n\n /**\n * @standalone\n * The calendars to choose from for the organizer / logged in user.\n */\n @Prop() calendars?: Calendar[];\n\n /**\n * @standalone\n * The participant options passed in the additionalParticipants prop\n * from the nylas-scheduler-editor component.\n */\n @Prop() participantOptions?: AdditionalParticipant[];\n\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * This event is fired when the participants custom availability changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The state to store the custom availability setting for participants.\n */\n @State() selectedCalendars: {\n [key: string]: {\n isOpen: boolean;\n name: string;\n calendar?: Calendar;\n };\n } = this.setParticipants(this.participants);\n\n /**\n * Participants calendar options.\n */\n @State() participantCalendars: {\n [key: string]: Calendar[];\n } = {};\n\n /**\n * The state to store the default selected calendars for each participant\n */\n @State() participantDefaultSelectedCalendar: {\n [key: string]: string;\n } = {};\n\n // Watchers\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-participant-booking-calendars', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('calendars')\n calendarsChangedHandler(newValue: Calendar[]) {\n debug('nylas-participant-booking-calendars', 'calendarsChangedHandler', newValue);\n this.participantCalendars = this.getParticipantCalendarOptions(this.participants, this.participantOptions);\n }\n\n @Watch('participants')\n participantsChangedHandler(newValue: Participant[]) {\n debug('nylas-participant-booking-calendars', 'participantsChangedHandler', newValue);\n this.selectedCalendars = this.setParticipants(newValue);\n this.participantCalendars = this.getParticipantCalendarOptions(newValue, this.participantOptions);\n }\n\n @Watch('participantOptions')\n participantOptionsChangedHandler(newValue: AdditionalParticipant[]) {\n debug('nylas-calendar-picker', 'participantOptionsChangedHandler', newValue);\n this.participantCalendars = this.getParticipantCalendarOptions(this.participants, newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-participant-booking-calendars', 'selectedConfigurationChangedHandler', newValue);\n const participants = newValue?.participants || this.participants;\n if (participants && participants.length > 0) {\n this.selectedCalendars = this.setParticipants(participants);\n this.participantCalendars = this.getParticipantCalendarOptions(participants, this.participantOptions);\n }\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n }\n\n getParticipantCalendarOptions(addedParticipants: Participant[], availableParticipantOptions: AdditionalParticipant[] | undefined) {\n // Get the participants from the availableParticipantOptions prop that are in the addedParticipants prop\n const organizer = addedParticipants?.find(participant => participant.is_organizer);\n const participantCalendars = {};\n const showAdditionalParticipantBookingCalendars = this.selectedConfiguration?.availability?.availability_rules?.availability_method !== 'collective';\n if (availableParticipantOptions && showAdditionalParticipantBookingCalendars) {\n const participants = addedParticipants?.filter(participant => availableParticipantOptions.some(availableParticipant => availableParticipant.email === participant.email));\n const remainingParticipants = addedParticipants?.filter(\n participant => !availableParticipantOptions.some(availableParticipant => availableParticipant.email === participant.email),\n );\n\n // Get the calendar options for each participant with email as the key\n participants?.forEach(participant => {\n const participantOption = availableParticipantOptions?.find(participantOption => participantOption.email === participant.email);\n if (!participantOption) return;\n this.participantDefaultSelectedCalendar[participant.email] = participant.booking?.calendar_id ?? 'primary';\n const calendars = participantOption.calendars ?? [];\n participantCalendars[participant.email] = calendars;\n });\n // If it is round robin config, add the remaining participant calendars to the participantCalendars\n // (Round-robin does not have an organizer, and we filtered out the participants not passed in the participantOptions prop,\n // so we need to add the remaining participants calendars to the participantCalendars)\n remainingParticipants?.forEach(participant => {\n if (participant?.booking?.calendar_id) {\n participantCalendars[participant.email] = this.calendars ?? [{ id: 'primary', name: participant.email }];\n this.participantDefaultSelectedCalendar[participant.email] = participant?.booking?.calendar_id ?? 'primary';\n }\n });\n }\n // Add the organizer's calendars to the participantCalendars\n if (organizer) {\n participantCalendars[organizer.email] = this.calendars ?? [{ id: 'primary', name: organizer.email }];\n this.participantDefaultSelectedCalendar[organizer.email] = organizer?.booking?.calendar_id ?? 'primary';\n }\n return participantCalendars;\n }\n\n // Lifecycle Methods\n connectedCallback() {\n debug('nylas-participant-booking-calendars', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-participant-booking-calendars', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-participant-booking-calendars', 'componentWillLoad');\n }\n\n componentDidLoad() {\n debug('nylas-participant-booking-calendars', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedCalendars = this.setParticipants(this.selectedConfiguration?.participants);\n this.participantCalendars = this.getParticipantCalendarOptions(this.selectedConfiguration?.participants, this.participantOptions);\n } else {\n this.selectedCalendars = this.setParticipants(this.participants);\n this.participantCalendars = this.getParticipantCalendarOptions(this.participants, this.participantOptions);\n }\n }\n\n @Listen('valueChanged')\n handleValueChanged(event: CustomEvent) {\n debug('[nylas-editor-tabs]', 'handleValueChanged', event);\n const { name, value } = event.detail;\n if (!name.startsWith('participant-booking-')) {\n return;\n }\n // Validate the form\n if (!this.bookingCalendarsFormRef.checkValidity()) {\n this.internals.setValidity({ customError: true }, i18next.t('nylasParticipantBookingCalendars.selectAtLeastOneCalendar'));\n return;\n } else {\n this.internals.setValidity({});\n }\n\n const key = name.split('participant-booking-')[1];\n if (!this.selectedCalendars[key]) return;\n this.selectedCalendars[key]['calendar'] = value;\n this.selectedCalendars = { ...this.selectedCalendars };\n\n const participantsCalendars = {};\n Object.keys(this.selectedCalendars).forEach(key => {\n participantsCalendars[key] = this.selectedCalendars[key]?.calendar;\n });\n this.internals.setFormValue(JSON.stringify(participantsCalendars), this.name);\n this.valueChanged.emit({ value: JSON.stringify(participantsCalendars), name: this.name });\n }\n\n setParticipants(participants: Participant[]) {\n const selectedParticipants = {};\n participants?.forEach(participant => {\n if (participant?.booking?.calendar_id) {\n const isOpen = participant.is_organizer ? true : false;\n selectedParticipants[participant.email] = {\n isOpen: isOpen,\n calendar: participant.booking?.calendar_id || 'primary',\n name: participant.name || participant.email,\n };\n }\n });\n return selectedParticipants;\n }\n @RegisterComponent<NylasParticipantBookingCalendars, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-participant-booking-calendars',\n stateToProps: new Map([\n ['schedulerConfig.additionalParticipants', 'participantOptions'],\n ['schedulerConfig.calendars', 'calendars'],\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div class=\"nylas-participant-booking-calendars\" part=\"npbc\">\n <div class=\"header\" part=\"npbc__header\">\n <h3>{i18next.t('nylasParticipantBookingCalendars.headerTitle')}</h3>\n <p>{i18next.t('nylasParticipantBookingCalendars.headerSubTitle')}</p>\n </div>\n <div class=\"content\" part=\"npbc__content\">\n <form ref={el => (this.bookingCalendarsFormRef = el as HTMLFormElement)}>\n {this.participantCalendars &&\n Object.keys(this.participantCalendars).map((key, index) => {\n const participant = this.selectedCalendars[key];\n const participantCalendars = this.participantCalendars[key];\n\n if (!participant || !participant.name) return;\n return (\n <div class=\"participant-container\" part=\"npbc__participant-container\" key={`participant-conatiner-${index}`}>\n <div class=\"participant-title\" part=\"npbc__participant-title\">\n <p>{i18next.t('nylasParticipantBookingCalendars.participantBookingCalendarTitle', { participantName: participant.name })}</p>\n <div class=\"participant-toggle\" part=\"npbc__participant-toggle-container\">\n <span\n class={`chevron ${participant.isOpen ? 'open' : 'closed'}`}\n onClick={() => {\n this.selectedCalendars[key].isOpen = !participant.isOpen;\n this.selectedCalendars = { ...this.selectedCalendars };\n }}\n >\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n </div>\n {participant.isOpen && (\n <nylas-booking-calendar-picker\n key={key}\n name={`participant-booking-${key}`}\n calendars={participantCalendars}\n hideHeader={true}\n defaultBookingCalendar={this.participantDefaultSelectedCalendar[key]}\n />\n )}\n </div>\n );\n })}\n </form>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-participants-custom-availability {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n .header {\n padding: 1rem;\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n .content {\n .participant-container {\n padding-top: 8px;\n border-top: 1px solid var(--nylas-base-200);\n .participant-title {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 16px 12px;\n p {\n margin: 0;\n }\n .participant-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n nylas-availability-picker::part(nap) {\n margin: 0;\n border: none;\n }\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration, OpenHours, Participant, ParticipantAvailability } from '@nylas/core';\nimport { DEFAULT_OPEN_HOURS } from '@/common/constants';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-participants-custom-availability` component is a form input for setting custom availability for participants.\n *\n * @part npca - The participants custom availability container\n * @part npca__header - The header of the participants custom availability\n * @part npca__content - The content of the participants custom availability\n * @part npca__participant-container - The participant container\n * @part npca__participant-title - The title of the participant\n * @part npca__participant-toggle--container - The toggle container for the participant\n * @part npca__toggle-label - The label of the toggle\n * @part npca_toggle-input - The input of the toggle\n * @part npca_toggle-slider - The slider of the toggle\n */\n@Component({\n tag: 'nylas-participants-custom-availability',\n styleUrl: 'nylas-participants-custom-availability.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasParticipantsCustomAvailability {\n @Element() host!: HTMLNylasParticipantsCustomAvailabilityElement;\n private participantFormRef!: HTMLFormElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n\n /**\n * @standalone\n * The name of the participants custom availability.\n */\n @Prop() name: string = 'participant-custom-availability';\n\n /**\n * @standalone\n * The participants selected in the add participants section.\n */\n @Prop() participants: Participant[] = this.selectedConfiguration?.participants || [];\n\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * This event is fired when the participants custom availability changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The state to store the custom availability setting for participants.\n */\n @State() selectedParticipants: {\n [key: string]: {\n setCustom: boolean;\n isOpen: boolean;\n openHours: OpenHours[];\n name: string;\n availability?: ParticipantAvailability;\n timezone?: string;\n };\n } = this.setParticipants(this.participants);\n\n // Watchers\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-participants-custom-availability', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('participants')\n participantsChangedHandler(newValue: Participant[], oldValue: Participant[]) {\n debug('nylas-participants-custom-availability', 'participantsChangedHandler', newValue, oldValue);\n if (!newValue || !oldValue || JSON.stringify(newValue) === JSON.stringify(oldValue)) {\n return;\n }\n this.selectedParticipants = this.setParticipants(newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration, oldValue: Configuration) {\n debug('nylas-participants-custom-availability', 'selectedConfigurationChangedHandler', newValue, oldValue);\n if (!newValue || !oldValue || JSON.stringify(newValue) === JSON.stringify(oldValue)) {\n return;\n }\n if (newValue?.participants) {\n this.selectedParticipants = this.setParticipants(newValue?.participants);\n }\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 // Lifecycle Methods\n connectedCallback() {\n debug('nylas-participants-custom-availability', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-participants-custom-availability', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-participants-custom-availability', 'componentWillLoad');\n }\n\n componentDidLoad() {\n debug('nylas-participants-custom-availability', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedParticipants = this.setParticipants(this.selectedConfiguration?.participants);\n } else {\n this.selectedParticipants = this.setParticipants(this.participants);\n }\n }\n\n // Event Handlers\n @Listen('nylasFormSwitchToggled')\n nylasFormSwitchToggledHandler(event: CustomEvent<{ checked: boolean; name: string; label: boolean }>) {\n debug('nylas-participants-custom-availability', 'nylasFormSwitchToggledHandler', event.detail);\n const existingParticipant = this.selectedConfiguration?.participants.find(participant => participant.email === event.detail.name);\n const existingOpenHours = existingParticipant?.availability?.open_hours || [];\n const openHours = existingOpenHours?.length > 0 ? existingOpenHours : this.selectedConfiguration?.availability?.availability_rules?.default_open_hours || [];\n const timeZone =\n existingOpenHours && existingOpenHours.length > 0\n ? existingParticipant?.timezone\n : this.selectedConfiguration?.availability?.availability_rules?.default_open_hours?.at(0)?.timezone ||\n this.selectedConfiguration?.event_booking?.timezone ||\n window.Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n this.selectedParticipants[event.detail.name]['isOpen'] = event.detail.checked;\n this.selectedParticipants[event.detail.name]['setCustom'] = event.detail.checked;\n this.selectedParticipants[event.detail.name]['openHours'] = event.detail.checked ? (openHours?.length > 0 ? openHours : DEFAULT_OPEN_HOURS) : [];\n this.selectedParticipants[event.detail.name]['timezone'] = event.detail.checked ? timeZone : undefined;\n this.selectedParticipants = { ...this.selectedParticipants };\n this.updateFormValue();\n }\n\n @Listen('valueChanged')\n handleValueChanged(event: CustomEvent) {\n debug('[nylas-editor-tabs]', 'handleValueChanged', event);\n const { name, value } = event.detail;\n if (!name.startsWith('participant-')) {\n return;\n }\n // Validate the form\n if (this.isInternalsAvailable) {\n if (!this.participantFormRef.checkValidity()) {\n this.internals.setValidity({ customError: true }, 'Please fix the overlapping time ranges.');\n return;\n } else {\n this.internals.setValidity({});\n }\n }\n\n const jsonValue = JSON.parse(value);\n\n const key = name.split('-')[2];\n if (!this.selectedParticipants[key]) return;\n const existingOpenHours = jsonValue.openHours || [];\n const openHours = existingOpenHours?.length > 0 ? existingOpenHours : this.selectedConfiguration?.availability?.availability_rules?.default_open_hours || [];\n this.selectedParticipants[key]['openHours'] = openHours;\n this.selectedParticipants = { ...this.selectedParticipants };\n\n this.updateFormValue();\n }\n\n updateFormValue() {\n const participantOpenHours = {};\n Object.keys(this.selectedParticipants).forEach(key => {\n participantOpenHours[key] = this.selectedParticipants[key].openHours;\n });\n\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(participantOpenHours), this.name);\n this.valueChanged.emit({ value: JSON.stringify(participantOpenHours), name: this.name });\n }\n\n setParticipants(participants: Participant[]) {\n const selectedParticipants = {};\n participants?.forEach(participant => {\n selectedParticipants[participant.email] = {\n isOpen: false,\n setCustom: Boolean(participant.availability?.open_hours),\n openHours: participant.availability?.open_hours || [],\n name: participant.name || participant.email,\n availability: participant.availability,\n timezone: participant.timezone,\n };\n });\n return selectedParticipants;\n }\n\n /**\n * This method is essentially a workaround to check if the internals are available because\n * the unit tests in stencil do not support the internals.\n * @returns boolean\n */\n get isInternalsAvailable() {\n return this.internals !== undefined && typeof this.internals.setFormValue === 'function' && typeof this.internals.setValidity === 'function';\n }\n\n @RegisterComponent<NylasParticipantsCustomAvailability, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-participants-custom-availability',\n stateToProps: new Map([\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-participants-custom-availability\" part=\"npca\">\n <div class=\"header\" part=\"npca__header\">\n <h3>{i18next.t('nylasParticipantCustomAvailability.headerTitle')}</h3>\n <p>{i18next.t('nylasParticipantCustomAvailability.headerSubTitle')}</p>\n </div>\n <div class=\"content\" part=\"npca__content\">\n <form ref={el => (this.participantFormRef = el as HTMLFormElement)}>\n {Object.keys(this.selectedParticipants).map((key, index) => {\n const participant = this.selectedParticipants[key];\n const participantOpenHours = participant.availability?.open_hours || [];\n if (!participant || !participant.name || !participant.availability) return;\n return (\n <div class=\"participant-container\" part=\"npca__participant-container\" key={`participant-conatiner-${index}`}>\n <div class=\"participant-title\" part=\"npca__participant-title\">\n <p>{i18next.t('nylasParticipantCustomAvailability.participantOpenHoursTitle', { participantName: participant.name })}</p>\n <div class=\"participant-toggle\" part=\"npca__participant-toggle--container\">\n <toggle-switch\n exportparts=\"ts_label: npca__toggle-label, ts_input: npca_toggle-input, ts_slider: npca_toggle-slider\"\n name={key}\n checked={!!participant?.openHours && participant?.openHours.length > 0}\n />\n <span\n class={`chevron ${participant.isOpen ? 'open' : 'closed'} ${participant.setCustom ? '' : 'disabled'}`}\n onClick={() => {\n if (!participant.setCustom) return;\n this.selectedParticipants[key].isOpen = !participant.isOpen;\n this.selectedParticipants = { ...this.selectedParticipants };\n }}\n >\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n </div>\n {participant.isOpen && (\n <nylas-availability-picker\n key={index}\n name={`participant-${index}-${key}`}\n openHours={participantOpenHours}\n defaultTimezone={participant.timezone}\n hideHeader={true}\n />\n )}\n </div>\n );\n })}\n </form>\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.cards-container {\n margin-bottom: 4rem;\n\n .nylas-reminder-email {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n text-align: left;\n\n .reminder-open-close-toggle {\n display: flex;\n gap: 16px;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n\n .header {\n padding: 1rem;\n display: grid;\n grid-template-columns: 1fr auto;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n border-radius: var(--nylas-border-radius-2x);\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n\n .confirmation-email-toggle {\n display: flex;\n gap: 24px;\n align-items: center;\n\n .chevron {\n display: flex;\n align-self: center;\n cursor: pointer;\n\n &:hover,\n &:active {\n color: var(--nylas-primary);\n }\n\n &.open {\n transform: rotate(90deg);\n }\n\n &.closed {\n transform: rotate(270deg);\n }\n\n &.disabled {\n cursor: not-allowed;\n color: var(--nylas-base-300);\n\n &:hover {\n color: var(--nylas-base-300);\n }\n }\n }\n }\n }\n\n .nylas-reminder-email__body {\n display: grid;\n grid-template-columns: 1fr auto;\n background-color: var(--nylas-base-25);\n border-radius: var(--nylas-border-radius-2x);\n\n @media #{$mobile} {\n grid-template-columns: 1fr;\n }\n\n .nylas-reminder-email__section {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n color: var(--nylas-base-800);\n\n @media #{$mobile} {\n border: none;\n }\n\n .nylas-reminder-email__block {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n border-top: 1px solid var(--nylas-base-200);\n padding-top: 1rem;\n margin-top: 0.5rem;\n }\n\n .nylas-reminder-email__row {\n display: grid;\n grid-template-columns: 1fr auto;\n align-items: center;\n gap: 1rem;\n\n &.full-width-col {\n grid-template-columns: 1fr;\n }\n\n label {\n display: flex;\n align-items: center;\n\n span.required {\n color: var(--nylas-error, #cc4841);\n }\n\n span.label-icon {\n margin-left: 4px;\n\n tooltip-component {\n display: flex;\n }\n }\n }\n\n p.error-message {\n color: var(--nylas-error);\n display: flex;\n align-items: center;\n\n button-component {\n button {\n color: blue;\n\n &:hover {\n color: var(--nylas-primary);\n }\n }\n }\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 16px;\n font-weight: 500;\n line-height: 24px;\n color: var(--nylas-base-900);\n }\n\n .company-logo-container {\n display: flex;\n gap: 32px;\n width: 100%;\n\n .input-container {\n display: flex;\n flex-direction: column;\n flex: 1;\n }\n\n .company-logo {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 200px;\n height: 100px;\n border: var(--nylas-base-200) solid 1px;\n border-radius: var(--nylas-border-radius-2x);\n overflow: hidden;\n padding: 10px;\n }\n\n .company-logo img {\n max-height: 100%;\n max-width: 100%;\n object-fit: contain;\n object-position: center;\n }\n }\n\n span.selected-value {\n font-weight: 500;\n }\n }\n\n .subsection {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n .input-container {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n\n textarea {\n padding: 12px 16px;\n border-width: 1;\n resize: vertical;\n border-radius: 8px;\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n border: 1px solid var(--nylas-base-200);\n }\n }\n }\n }\n\n .nylas-reminder-email__preview {\n width: 208px;\n background: var(--nylas-base-25);\n border-bottom-right-radius: var(--nylas-border-radius-2x);\n\n @media #{$mobile} {\n width: inherit;\n border-bottom-left-radius: var(--nylas-border-radius-2x);\n }\n\n h4 {\n font-size: 14px;\n line-height: 24px;\n color: var(--nylas-base-600);\n font-family: var(--nylas-font-family);\n font-weight: 500;\n text-align: center;\n margin: 0.75rem 0;\n }\n\n .preview-container {\n padding: 0 2rem 1rem;\n\n .slot {\n background-color: transparent;\n border-top: 1px solid var(--nylas-base-300);\n\n &.active {\n background-color: var(--nylas-base-100);\n }\n\n &:last-of-type {\n border-bottom: 1px solid var(--nylas-base-300);\n }\n }\n\n .event-slot {\n background-color: var(--nylas-base-600);\n border-top: 1px solid var(--nylas-base-300);\n }\n }\n }\n\n span.error-message {\n color: var(--nylas-error);\n }\n\n span.help-text {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n\n .nylas-reminder-email__summary {\n padding: 0.75rem 1rem;\n display: grid;\n grid-template-columns: auto 1fr;\n column-gap: 1rem;\n\n p {\n margin: 0;\n display: flex;\n align-items: center;\n column-gap: 4px;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 21px;\n color: var(--nylas-base-600);\n text-align: left;\n\n span.summary-icon {\n display: flex;\n justify-content: center;\n min-width: 20px;\n }\n }\n }\n }\n}\n\nsp-divider {\n background-color: var(--nylas-base-200);\n height: 1px;\n margin: 0.25rem 0;\n}\n\nbutton-component.create-reminder button {\n margin: 1rem;\n width: calc(100% - 2rem);\n}\n\nbutton-component.delete-btn button {\n color: var(--nylas-error) !important;\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration, EventReminder, GroupConfiguration, Participant } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-reminder-emails` component is a UI component that allows users to set buffer time before and after an event.\n *\n * @part nre__tab-heading - The nylas-reminder-emails main tab heading\n * @part nre - The nylas-reminder-emails container\n * @part nre__header - The header of the event communication section\n * @part nre__body - The body of the event communication section\n * @part nre__summary - The reminder card summary container\n * @part 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-emails',\n styleUrl: 'nylas-reminder-emails.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasReminderEmails {\n @Element() host!: HTMLNylasReminderEmailsElement;\n\n /**\n * The selected configuration.\n */\n @Prop() selectedConfiguration?: Configuration | GroupConfiguration;\n /**\n * The event reminders prop.\n */\n @Prop() eventReminders?: (EventReminder & { editing?: boolean })[];\n /**\n * The name of the component\n */\n @Prop() name: string = 'reminder-overrides';\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The event reminders state. Defaults to an empty array if no event reminders are present.\n */\n @State() reminders: (EventReminder & { editing?: boolean })[] =\n (this.selectedConfiguration as Configuration)?.event_booking?.reminders ??\n (this.selectedConfiguration as GroupConfiguration)?.group_booking?.reminders ??\n this.eventReminders ??\n [];\n @State() reminderErrors: {\n [key: string]: {\n error: string;\n suggestion: number;\n };\n } = {};\n @State() participants: Participant[] = (this.selectedConfiguration as Configuration)?.participants ?? [];\n\n /**\n * This event is fired when the email reminders change.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n @State() clearError: boolean = false;\n\n @Event() nylasSuggestReminderMinutes!: EventEmitter<{ minutes: number }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-reminder-emails', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-reminder-emails', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-reminder-emails', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-reminder-emails', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.reminders = this.eventReminders ?? [];\n this.updateRemindersFormValue(false);\n }\n }\n\n componentWillUpdate() {\n debug('nylas-reminder-emails', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-reminder-emails', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-reminder-emails', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-reminder-emails', 'componentDidRender');\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-reminder-emails', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newVal: Configuration | GroupConfiguration) {\n debug('nylas-reminder-emails', 'selectedConfigurationChangedHandler', newVal);\n const configuration = newVal as Configuration;\n const groupConfiguration = newVal as GroupConfiguration;\n this.reminders = configuration?.event_booking?.reminders ?? groupConfiguration?.group_booking?.reminders ?? [];\n this.participants = configuration?.participants ?? [];\n this.updateRemindersFormValue(false);\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 @Listen('valueChanged')\n handleValueChanged(event: CustomEvent) {\n debug('nylas-reminder-emails', 'handleValueChanged', event);\n const { name, value } = event.detail;\n\n if (name.startsWith('reminder-time-')) {\n const remainder = parseInt(value) % 5;\n if (remainder !== 0) {\n this.reminderErrors[name] = {\n error: i18next.t('nylasReminderEmails.reminderMinutesValidationError'),\n suggestion: parseInt(value) + (5 - remainder),\n };\n this.reminderErrors = { ...this.reminderErrors };\n this.internals.setValidity({ customError: true }, 'Reminder time must be a multiple of 5');\n return;\n } else {\n delete this.reminderErrors[name];\n this.reminderErrors = { ...this.reminderErrors };\n this.internals.setValidity({ customError: false });\n }\n // Extract the reminder index from the name attribute (e.g. reminder-time-0)\n const [_, reminderIndex] = name.split(/(\\d+)/);\n const updatedReminders = [...this.reminders];\n updatedReminders[reminderIndex].minutes_before_event = parseInt(value);\n this.reminders = [...updatedReminders];\n this.updateRemindersFormValue();\n }\n }\n\n @Listen('nylasFormDropdownChanged')\n handleNylasFormDropdownChanged(event: CustomEvent) {\n debug('nylas-reminder-emails', 'handleNylasFormDropdownChanged', event);\n const { name, value } = event.detail;\n if (!name.startsWith('recipient-')) {\n return;\n }\n // Extract the reminder index from the name attribute (e.g. recipient-0)\n const [_, reminderIndex] = name.split(/(\\d+)/);\n const updatedReminders = [...this.reminders];\n updatedReminders[reminderIndex].recipient = value;\n this.reminders = [...updatedReminders];\n this.updateRemindersFormValue();\n }\n\n @Listen('nylasFormInputChanged')\n handleNylasFormInputChanged(event: CustomEvent) {\n debug('nylas-reminder-emails', 'handleNylasFormInputChanged', event);\n const { name, value } = event.detail;\n if (!name.startsWith('reminder-subject-')) {\n return;\n }\n // Extract the reminder index from the name attribute (e.g. reminder-subject-0)\n const [_, reminderIndex] = name.split(/(\\d+)/);\n const updatedReminders = [...this.reminders];\n updatedReminders[reminderIndex].email_subject = value;\n this.reminders = [...updatedReminders];\n this.updateRemindersFormValue();\n }\n\n addReminder() {\n debug('nylas-reminder-emails', 'addReminder');\n const recipient = this.selectedConfiguration?.type === 'group' ? 'guest' : 'all';\n this.reminders = [\n ...this.reminders,\n {\n type: 'email',\n minutes_before_event: 30,\n editing: true,\n recipient: recipient,\n },\n ];\n this.updateRemindersFormValue();\n }\n\n deleteReminder(index: number) {\n this.reminders = this.reminders.filter((_, i) => i !== index).map(p => ({ ...p }));\n this.updateRemindersFormValue();\n }\n\n get isInternalsAvailable() {\n return this.internals !== undefined && typeof this.internals.setFormValue === 'function';\n }\n\n updateRemindersFormValue(valueChanged: boolean = true) {\n debug('nylas-reminder-emails', 'updateRemindersFormValue');\n const eventReminders = this.reminders.map(reminder => {\n const rem = { ...reminder };\n rem?.editing && delete rem.editing;\n return rem;\n });\n if (valueChanged) {\n this.valueChanged.emit({\n value: JSON.stringify(eventReminders),\n name: this.name,\n });\n }\n this.isInternalsAvailable && this.internals.setFormValue(JSON.stringify(eventReminders), this.name);\n }\n\n formatReminderTime(reminderTime: number) {\n switch (true) {\n case reminderTime > 24 * 60:\n return `${(reminderTime / 60 / 24).toFixed(2)} ${i18next.t('time.days')}`;\n case reminderTime === 24 * 60:\n return `1 ${i18next.t('time.days')}`;\n case reminderTime > 90 || reminderTime === 60:\n return `${(reminderTime / 60).toFixed(2)} ${i18next.t('time.hours')}`;\n default:\n return `${reminderTime} ${reminderTime > 1 ? i18next.t('time.minutes') : i18next.t('time.minute')} `;\n }\n }\n\n @RegisterComponent<NylasReminderEmails, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-reminder-emails',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const organizerName = this.participants.find(p => p.is_organizer)?.name;\n let recipientOptions = [\n {\n label: i18next.t('nylasReminderEmails.recipientOptions', { context: 'all' }),\n value: 'all',\n },\n {\n label: i18next.t('nylasReminderEmails.recipientOptions', { context: 'guest' }),\n value: 'guest',\n },\n {\n label: i18next.t('nylasReminderEmails.recipientOptions', { context: 'host' }),\n value: 'host',\n },\n ];\n if (this.selectedConfiguration?.type === 'group') {\n recipientOptions = recipientOptions.filter(option => option.value !== 'all');\n }\n\n return (\n <Host>\n <div class=\"cards-container\">\n {this.reminders.map((reminder, index) => {\n return reminder.type !== 'webhook' ? (\n <div class=\"nylas-reminder-email\" part=\"nre\">\n <div class=\"header\" part=\"nre__header\">\n <div>\n <h3>{i18next.t('nylasReminderEmails.headerTitle', { organizerName: organizerName ? ` with ${organizerName} ` : '' })}</h3>\n <p>{i18next.t('nylasReminderEmails.headerSubTitle')}</p>\n </div>\n {!reminder.editing ? (\n <button-component\n variant={'basic'}\n key={`edit-${index} `}\n clickHandler={event => {\n event.preventDefault();\n reminder.editing = true;\n this.reminders = [...this.reminders];\n }}\n >\n <edit-icon width=\"16\" height=\"16\"></edit-icon>\n {i18next.t('nylasReminderEmails.editButtonText')}\n </button-component>\n ) : (\n <div class=\"reminder-open-close-toggle\">\n <button-component\n variant={'basic'}\n class=\"delete-btn\"\n tooltip=\"Delete reminder\"\n key={`delete -${index} `}\n clickHandler={event => {\n event.preventDefault();\n this.deleteReminder(index);\n }}\n >\n <trash-icon width=\"16\" height=\"16\"></trash-icon>\n </button-component>\n <span\n class={`chevron ${reminder.editing ? 'open' : 'closed'}`}\n onClick={() => {\n reminder.editing = !reminder.editing;\n this.reminders = [...this.reminders];\n }}\n >\n <chevron-icon width=\"24\" height=\"24\" />\n </span>\n </div>\n )}\n </div>\n\n {reminder.editing ? (\n <div class=\"nylas-reminder-email__body\" part=\"nre__body\">\n <div class=\"nylas-reminder-email__section\">\n <div class=\"nylas-reminder-email__row\">\n <label>{i18next.t('nylasReminderEmails.emailRecipients.label')}</label>\n <select-dropdown\n name={`recipient-${index}`}\n options={recipientOptions}\n defaultSelectedOption={recipientOptions.find(i => i.value === reminder.recipient) ?? recipientOptions[0]}\n withSearch={false}\n />\n </div>\n <div class=\"nylas-reminder-email__row\">\n <label>\n {i18next.t('nylasReminderEmails.sendConfirmation.label')}\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasReminderEmails.sendConfirmation.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n </label>\n <div>\n <nylas-reminder-time\n name={`reminder-time-${index}`}\n eventReminderTimeMinutes={reminder.minutes_before_event}\n exportparts=\"nrt, nrt__number-dropdown, nrt__number-dropdown-button, nrt__number-dropdown-content, nrt__period-dropdown, nrt__period-dropdown-button, nrt__period-dropdown-content, nrt__time-period-selector\"\n />\n {this.reminderErrors[`reminder-time-${index}`]?.error && (\n <p class=\"error-message\">\n {this.reminderErrors[`reminder-time-${index}`]?.error}{' '}\n <button-component\n variant=\"invisible\"\n onClick={_e => {\n // this.clearError = !this.clearError;\n // this.handleValueChanged({ detail: { name: `reminder-time-${index}`, value: this.reminderErrors[`reminder-time-${index}`]?.suggestion } } as CustomEvent);\n this.nylasSuggestReminderMinutes.emit({ minutes: this.reminderErrors[`reminder-time-${index}`]?.suggestion });\n }}\n >\n {this.reminderErrors[`reminder-time-${index}`]?.suggestion}\n </button-component>\n </p>\n )}\n </div>\n </div>\n <div class=\"nylas-reminder-email__block\">\n <label>{i18next.t('nylasReminderEmails.emailSubject.label')}</label>\n <input-component\n name={`reminder-subject-${index}`}\n maxLength={60}\n placeholder={i18next.t('nylasReminderEmails.emailSubject.placeholder', { organizerName: organizerName ? ` with ${organizerName}` : '' })}\n defaultValue={reminder?.email_subject || ''}\n />\n </div>\n </div>\n </div>\n ) : (\n <div class=\"nylas-reminder-email__summary\" part=\"nre__summary\">\n <p>\n <span class=\"summary-icon\">\n <person-clipboard-icon></person-clipboard-icon>\n </span>\n {recipientOptions.find(i => i.value === reminder.recipient)?.label}\n </p>\n <p>\n <span class=\"summary-icon\">\n <clock-icon></clock-icon>\n </span>\n {this.formatReminderTime(reminder.minutes_before_event)} {i18next.t('nylasReminderEmails.beforeTheEvent')}\n </p>\n </div>\n )}\n </div>\n ) : null;\n })}\n </div>\n\n <button-component\n class=\"create-reminder\"\n variant={'basic'}\n clickHandler={event => {\n event.preventDefault();\n this.addReminder();\n }}\n >\n <plus-icon width=\"16\" height=\"16\"></plus-icon>\n {i18next.t('nylasReminderEmails.newReminderButtonText')}\n </button-component>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-scheduling-method {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n\n .header {\n padding: 1rem;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n }\n\n .nylas-scheduling-method__dropdown {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n span.nylas-scheduling-method__dropdown-label {\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--nylas-base-800);\n margin: 0.25rem 0 0 0;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n text-align: left;\n\n tooltip-component {\n display: flex;\n }\n }\n\n select-dropdown::part(sd_dropdown) {\n width: 100%;\n }\n\n select-dropdown::part(sd_dropdown-content) {\n width: 100%;\n max-width: unset;\n }\n\n select-dropdown::part(sd_dropdown-button) {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n }\n\n select-dropdown::part(sd_dropdown-button-selected-label) {\n max-width: calc(100% - 2rem);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n\n input-component::part(ic__input) {\n background: var(--nylas-base-50);\n outline: none;\n cursor: not-allowed;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AdditionalParticipant, Configuration } from '@nylas/core';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\n/**\n * The `nylas-scheduling-method` component is a UI component that displays the booking calendar picker.\n * @part nsm - The booking calendar picker container\n * @part nsm__header - The header of the booking calendar picker\n * @part nsm__input-label - The input label of the booking calendar picker\n * @part nsm__dropdown - The dropdown container\n * @part nsm__dropdown-button - The dropdown button\n * @part nsm__dropdown-content - The dropdown content\n */\n@Component({\n tag: 'nylas-scheduling-method',\n styleUrl: 'nylas-scheduling-method.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasSchedulingMethod {\n @Element() host!: HTMLNylasSchedulingMethodElement;\n\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The name of the booking type picker.\n */\n @Prop() name: string = 'availability-method';\n /**\n * @standalone\n * The participant options passed in the additionalParticipants prop\n * from the nylas-scheduler-editor component.\n */\n @Prop() participantOptions?: AdditionalParticipant[];\n /**\n * This prop is used to display the component in a disabled state / read-only mode.\n */\n @Prop() readOnly: boolean = false;\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * Whether to show the sub-title.\n */\n @Prop() showSubTitle: boolean = false;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The selected booking type.\n */\n @State() selectedBookingType: string = '';\n\n /**\n * This event is fired when the selected booking calendar changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-scheduling-method', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-scheduling-method', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-scheduling-method', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-scheduling-method', 'componentDidLoad');\n const bookingType = this.selectedConfiguration?.availability?.availability_rules?.availability_method?.toString();\n\n // TODO: Remove this when the internals in tests are fixed.\n if (bookingType && typeof this.internals.setFormValue === 'function') {\n this.internals.setFormValue(bookingType, this.name);\n }\n this.selectedBookingType = bookingType || 'collective';\n }\n\n componentWillUpdate() {\n debug('nylas-scheduling-method', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-scheduling-method', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-scheduling-method', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-scheduling-method', 'componentDidRender');\n }\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-scheduling-method', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newVal: Configuration, _oldVal: Configuration) {\n const bookingType = newVal?.availability?.availability_rules?.availability_method ?? 'collective';\n\n this.internals.setFormValue(bookingType, this.name);\n this.selectedBookingType = bookingType || 'collective';\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-scheduling-method', 'nylasFormDropdownChangedHandler', event.detail);\n // Pass as handler so that if event.defaultPrevented by parent app, this will be skipped.\n const valueChanged = (event: CustomEvent<{ value: string; name: string }>) => {\n const { value } = event.detail;\n if (value) {\n this.selectedBookingType = value;\n this.internals.setFormValue(value, this.name);\n }\n };\n this.valueChanged.emit({ value: event.detail.value, name: this.name, valueChanged });\n }\n\n @RegisterComponent<NylasSchedulingMethod, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-scheduling-method',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n localPropsToProp: new Map([['additionalParticipants', 'participantOptions']]),\n eventToProps: {\n valueChanged: async (\n event: CustomEvent<{ value: string; name: string; valueChanged?: (event: CustomEvent<{ value: string; name: string }>) => void }>,\n _nylasSchedulerConfigConnector: NylasSchedulerConfigConnector,\n ) => {\n const { valueChanged } = event.detail;\n // If a handler is passed, call it.\n if (valueChanged) {\n valueChanged(event);\n }\n },\n },\n fireRegisterEvent: true,\n })\n render() {\n const bookingTypeOptions = [\n { label: i18next.t('nylasSchedulingMethod.schedulingMethodOptions', { context: 'collective' }), value: 'collective' },\n { label: i18next.t('nylasSchedulingMethod.schedulingMethodOptions', { context: 'maxFairness' }), value: 'max-fairness' },\n { label: i18next.t('nylasSchedulingMethod.schedulingMethodOptions', { context: 'maxAvailability' }), value: 'max-availability' },\n ];\n const defaultBookingType = this.selectedConfiguration?.availability?.availability_rules?.availability_method?.toString();\n const hasAdditionalParticipants =\n this.participantOptions &&\n this.participantOptions?.length > 0 &&\n !!this.participantOptions[0].email &&\n !!this.participantOptions[0].name &&\n !!this.participantOptions[0].calendars &&\n this.participantOptions[0].calendars.length > 0;\n\n // If a default availability method is set in the configuration (developer settings), do not show the booking type picker.\n // Or, if a default availability method is not set and there are no additional participants, do not show the booking type picker.\n if ((defaultBookingType || !hasAdditionalParticipants) && !this.readOnly) {\n return null;\n }\n\n return (\n <Host>\n <div class=\"nylas-scheduling-method\" part=\"nsm\">\n <div class=\"header\" part=\"nsm__header\">\n <h3>{i18next.t('nylasSchedulingMethod.headerTitle')}</h3>\n </div>\n <div class=\"nylas-scheduling-method__dropdown\">\n {this.showSubTitle && (\n <span class=\"nylas-scheduling-method__dropdown-label\">\n {i18next.t('nylasSchedulingMethod.headerSubTitle')}\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">\n <strong>{i18next.t('nylasSchedulingMethod.tooltip.standard.label')}</strong>\n <br />- {i18next.t('nylasSchedulingMethod.tooltip.standard.desc')}\n <br />\n <br />\n <strong>{i18next.t('nylasSchedulingMethod.tooltip.maxFairness.label')}</strong>\n <br />- {i18next.t('nylasSchedulingMethod.tooltip.maxFairness.desc')}\n <br />\n <br />\n <strong>{i18next.t('nylasSchedulingMethod.tooltip.maxAvailability.label')}</strong>\n <br />- {i18next.t('nylasSchedulingMethod.tooltip.maxAvailability.desc')}\n <br />\n </span>\n </tooltip-component>\n </span>\n )}\n {this.readOnly ? (\n <input-component\n name=\"availability-method-read-only\"\n type=\"text\"\n exportparts=\"ic__label: nsm__input-label, ic__input: nsm__input, ic__input_wrapper: nsm__input_wrapper\"\n readOnly\n defaultValue={bookingTypeOptions.find(cal => cal.value == defaultBookingType)?.label ?? bookingTypeOptions[0].label}\n />\n ) : (\n <select-dropdown\n name={this.name}\n options={bookingTypeOptions}\n withSearch={false}\n exportparts=\"sd_dropdown: nsm__dropdown, sd_dropdown-button: nsm__dropdown-button, sd_dropdown-content: nsm__dropdown-content\"\n defaultSelectedOption={bookingTypeOptions.find(cal => cal.value == defaultBookingType) ?? bookingTypeOptions[0]}\n />\n )}\n </div>\n </div>\n </Host>\n );\n }\n}\n","@import '../../../common/styles/variables.scss';\n\n:host {\n display: block;\n @include default-css-variables;\n width: inherit;\n}\n\n.nylas-timeslot-interval {\n width: inherit;\n display: flex;\n flex-direction: column;\n margin: 1rem;\n border-radius: var(--nylas-border-radius-2x);\n border: 1px solid var(--nylas-base-200);\n\n .header {\n padding: 1rem;\n border-bottom: 1px solid var(--nylas-base-200);\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 20px;\n color: var(--nylas-base-900);\n text-align: left;\n }\n\n p {\n margin: 0.25rem 0 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 20px;\n color: var(--nylas-base-600);\n text-align: left;\n }\n }\n\n .nylas-timeslot-interval__dropdown {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n span.label {\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--nylas-base-800);\n\n tooltip-component {\n display: flex;\n }\n }\n\n select-dropdown {\n margin-bottom: 1.5rem;\n }\n\n select-dropdown::part(sd_dropdown) {\n width: 100%;\n }\n\n select-dropdown::part(sd_dropdown-content) {\n width: 100%;\n max-width: unset;\n }\n\n select-dropdown::part(sd_dropdown-button) {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--nylas-base-200);\n border-radius: var(--nylas-border-radius-2x);\n padding: 1rem;\n }\n\n select-dropdown::part(sd_dropdown-button-selected-label) {\n max-width: calc(100% - 2rem);\n font-family: var(--nylas-font-family);\n font-size: 16px;\n line-height: 24px;\n }\n }\n}\n","import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug } from '@/utils/utils';\nimport { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { Configuration } from '@nylas/core';\nimport i18next from '@/utils/i18n';\nimport { LANGUAGE_CODE } from '@/common/constants';\n\nconst defaultRoundToMinutes = 15;\n/**\n * The `nylas-timeslot-interval` component allows users to set their time slot interval preferences.\n * This component provides an option to set both `interval_minutes` and `round_to` in the configuration.\n *\n * @part nti - The timeslot interval container\n * @part nti__header - The header of the timeslot interval picker\n * @part nti__input-label - The input label of the timeslot interval picker\n * @part nti__dropdown - The dropdown container\n * @part nti__dropdown-button - The dropdown button\n * @part nti__dropdown-content - The dropdown content\n */\n@Component({\n tag: 'nylas-timeslot-interval',\n styleUrl: 'nylas-timeslot-interval.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasTimeslotInterval {\n @Element() host!: HTMLNylasTimeslotIntervalElement;\n /**\n * @standalone\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * @standalone\n * The name of the calendar picker.\n */\n @Prop() name: string = 'timeslot-picker';\n\n /**\n * @standalone\n * The event duration in minutes.\n */\n @Prop() eventDurationMinutes?: number = this.selectedConfiguration?.availability?.duration_minutes;\n\n /**\n * The selected language.\n */\n @Prop() selectedLanguage?: LANGUAGE_CODE;\n\n /**\n * The element internals.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * The internal event duration minutes state.\n */\n @State() internalEventDurationMinutes!: number;\n\n /**\n * The selected interval minutes.\n */\n @State() selectedInterval!: number;\n\n /**\n * The selected round to minutes.\n */\n @State() selectedRoundTo!: boolean;\n\n /***\n * The state to store that component is ready to render.\n */\n @State() componentLoaded: boolean = false;\n\n /**\n * This event is fired when the selected booking calendar changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-timeslot-interval', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('selectedConfiguration')\n selectedConfigurationChangedHandler(newValue: Configuration) {\n debug('nylas-timeslot-interval', 'selectedConfigurationChangedHandler', newValue);\n this.internalEventDurationMinutes = newValue?.availability?.duration_minutes ?? this.eventDurationMinutes ?? 30;\n const internalIntervalMinutes = newValue?.availability?.interval_minutes ?? this.internalEventDurationMinutes ?? 30;\n this.selectedInterval = newValue?.availability?.interval_minutes ?? internalIntervalMinutes ?? 10;\n const roundToMinutes = newValue?.availability?.round_to || null;\n this.selectedRoundTo = roundToMinutes && roundToMinutes === internalIntervalMinutes ? true : false;\n }\n\n @Watch('selectedLanguage')\n selectedLanguageChangedHandler(newVal: LANGUAGE_CODE, oldVal: LANGUAGE_CODE) {\n if (newVal === oldVal) return;\n i18next.changeLanguage(newVal);\n }\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-timeslot-interval', 'connectedCallback');\n }\n\n disconnectedCallback() {\n debug('nylas-timeslot-interval', 'disconnectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-timeslot-interval', 'componentWillLoad');\n // See comment in the @Watch('name') decorator for more information.\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-timeslot-interval', 'componentDidLoad');\n if (this.selectedConfiguration) {\n this.selectedConfigurationChangedHandler(this.selectedConfiguration);\n } else {\n this.internalEventDurationMinutes = this.eventDurationMinutes ?? 30;\n const internalIntervalMinutes = this.internalEventDurationMinutes;\n this.selectedInterval = internalIntervalMinutes ?? 10;\n this.selectedRoundTo = false;\n }\n this.componentLoaded = true;\n }\n\n componentWillUpdate() {\n debug('nylas-timeslot-interval', 'componentWillUpdate');\n }\n\n componentDidUpdate() {\n debug('nylas-timeslot-interval', 'componentDidUpdate');\n }\n\n componentWillRender() {\n debug('nylas-timeslot-interval', 'componentWillRender');\n }\n\n componentDidRender() {\n debug('nylas-timeslot-interval', 'componentDidRender');\n }\n\n @Listen('nylasFormDropdownChanged')\n nylasFormDropdownChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-timeslot-interval', 'nylasFormDropdownChangedHandler', event.detail);\n const value = event.detail.value;\n if (value === 'duration') {\n this.selectedInterval = this.internalEventDurationMinutes ?? 10;\n } else {\n this.selectedInterval = parseInt(event.detail.value);\n }\n\n this.valueChanged.emit({\n value: JSON.stringify({\n interval: this.selectedInterval,\n roundTo: this.selectedRoundTo ? this.selectedInterval : defaultRoundToMinutes,\n }),\n name: this.name,\n });\n if (typeof this.internals.setFormValue === 'function') {\n this.internals.setFormValue(JSON.stringify({ interval: this.selectedInterval, roundTo: this.selectedRoundTo ? this.selectedInterval : defaultRoundToMinutes }), this.name);\n }\n }\n\n @Listen('nylasFormRadioChanged')\n nylasFormRadioChangedHandler(event: CustomEvent<{ value: string; name: string }>) {\n debug('nylas-timeslot-interval', 'nylasFormRadioChangedHandler', event.detail);\n const value = event.detail.value;\n if (value === 'no-rounding') {\n this.selectedRoundTo = false;\n } else {\n this.selectedRoundTo = true;\n }\n\n this.valueChanged.emit({\n value: JSON.stringify({\n interval: this.selectedInterval,\n roundTo: this.selectedRoundTo ? this.selectedInterval : defaultRoundToMinutes,\n }),\n name: this.name,\n });\n if (typeof this.internals.setFormValue === 'function') {\n this.internals.setFormValue(JSON.stringify({ interval: this.selectedInterval, roundTo: this.selectedRoundTo ? this.selectedInterval : defaultRoundToMinutes }), this.name);\n }\n }\n\n @RegisterComponent<NylasTimeslotInterval, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-timeslot-interval',\n stateToProps: new Map([\n ['schedulerConfig.selectedConfiguration', 'selectedConfiguration'],\n ['schedulerConfig.selectedLanguage', 'selectedLanguage'],\n ]),\n fireRegisterEvent: true,\n })\n render() {\n const intervalPreferenceOptions = [\n { value: 'duration', label: i18next.t('nylasTimeslotInterval.lengthOfMeeting') },\n { value: '5', label: `5 ${i18next.t('nylasTimeslotInterval.minutesShort')}` },\n { value: '10', label: `10 ${i18next.t('nylasTimeslotInterval.minutesShort')}` },\n { value: '15', label: `15 ${i18next.t('nylasTimeslotInterval.minutesShort')}` },\n { value: '20', label: `20 ${i18next.t('nylasTimeslotInterval.minutesShort')}` },\n { value: '30', label: `30 ${i18next.t('nylasTimeslotInterval.minutesShort')}` },\n { value: '45', label: `45 ${i18next.t('nylasTimeslotInterval.minutesShort')}` },\n { value: '60', label: `60 ${i18next.t('nylasTimeslotInterval.minutesShort')}` },\n ];\n\n const defaultSelectedInterval =\n typeof this.selectedInterval !== 'undefined'\n ? this.selectedInterval == this.internalEventDurationMinutes\n ? intervalPreferenceOptions[0]\n : intervalPreferenceOptions.find(op => op.value == this.selectedInterval.toString()) ?? intervalPreferenceOptions[0]\n : undefined;\n\n return (\n <Host>\n <div class=\"nylas-timeslot-interval\" part=\"nti\">\n <div class=\"header\" part=\"nti__header\">\n <h3>{i18next.t('nylasTimeslotInterval.headerTitle')}</h3>\n </div>\n\n <div class=\"nylas-timeslot-interval__dropdown\">\n <span class=\"label\" part=\"nti__input-label\">\n {i18next.t('nylasTimeslotInterval.timeslotInterval.label')}\n </span>\n {defaultSelectedInterval?.label && (\n <select-dropdown\n name=\"interval-minutes\"\n options={intervalPreferenceOptions}\n withSearch={false}\n exportparts=\"sd_dropdown: nti__dropdown, sd_dropdown-button: nti__dropdown-button, sd_dropdown-content: nti__dropdown-content\"\n defaultSelectedOption={defaultSelectedInterval}\n />\n )}\n <span slot=\"label\" class=\"label\" part=\"nti__input-label\">\n {i18next.t('nylasTimeslotInterval.timeslotRounding.label')}\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{i18next.t('nylasTimeslotInterval.timeslotRounding.tooltip.desc')}</span>\n </tooltip-component>\n </span>\n {this.componentLoaded && (\n <radio-button-group\n name=\"interval-preference\"\n defaultSelectedValue={this.selectedRoundTo ? 'rounding' : 'no-rounding'}\n options={[\n {\n value: 'no-rounding',\n label: i18next.t('nylasTimeslotInterval.timeslotRoundingOptions.noRounding.label'),\n description: i18next.t('nylasTimeslotInterval.timeslotRoundingOptions.noRounding.desc'),\n },\n {\n value: 'rounding',\n label: i18next.t('nylasTimeslotInterval.timeslotRoundingOptions.rounding.label'),\n description: i18next.t('nylasTimeslotInterval.timeslotRoundingOptions.rounding.desc'),\n },\n ]}\n />\n )}\n </div>\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'paintbrush-fill-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class PaintbrushFillIcon {\n @Prop() width: string = '16';\n @Prop() height: string = '13';\n\n render() {\n return (\n <svg width=\"16\" height=\"17\" viewBox=\"-3 0 16 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5 2.875V0.375H0.5C0.223858 0.375 0 0.598858 0 0.875V7.37585H10V0.875C10 0.598858 9.77614 0.375 9.5 0.375H8V3.87722C8 4.15337 7.77614 4.37722 7.5 4.37722C7.22386 4.37722 7 4.15337 7 3.87722V0.375H6V2.875C6 3.15114 5.77614 3.375 5.5 3.375C5.22386 3.375 5 3.15114 5 2.875ZM10 8.37585H0V9.37938C0 10.4839 0.895431 11.3794 2 11.3794H3.5V14.8767C3.5 15.7051 4.17157 16.3767 5 16.3767C5.82843 16.3767 6.5 15.7051 6.5 14.8767V11.3794H8C9.10457 11.3794 10 10.4839 10 9.37938V8.37585Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'paintbrush-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class PaintbrushIcon {\n @Prop() width: string = '16';\n @Prop() height: string = '13';\n\n render() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"-3 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M0.5 -0.000976562C0.223858 -0.000976562 0 0.222881 0 0.499023L1.90735e-05 9.00337C1.90735e-05 10.1079 0.89545 11.0034 2.00002 11.0034H3.00411V14.0007C3.00411 15.1053 3.89954 16.0007 5.00411 16.0007C6.10868 16.0007 7.00411 15.1053 7.00411 14.0007V11.0034H8.00002C9.10459 11.0034 10 10.1079 10 9.00337V7.50339L10 7.49897V0.499023C10 0.222881 9.77614 -0.000976562 9.5 -0.000976562H0.5ZM1.00002 8.00342H9.00002V9.00337C9.00002 9.55566 8.5523 10.0034 8.00002 10.0034H6.50411C6.22797 10.0034 6.00411 10.2272 6.00411 10.5034V14.0007C6.00411 14.553 5.5564 15.0007 5.00411 15.0007C4.45183 15.0007 4.00411 14.553 4.00411 14.0007V10.5034C4.00411 10.2272 3.78026 10.0034 3.50411 10.0034H2.00002C1.44773 10.0034 1.00002 9.55566 1.00002 9.00337V8.00342ZM9 7.00339H1V0.999023H5V2.49902C5 2.77517 5.22386 2.99902 5.5 2.99902C5.77614 2.99902 6 2.77517 6 2.49902V0.999023H7V3.50122C7 3.77736 7.22386 4.00122 7.5 4.00122C7.77614 4.00122 8 3.77736 8 3.50122V0.999023H9V7.00339Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n",":host {\n display: flex;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'people-icon',\n styleUrl: 'icon.css',\n scoped: true,\n})\nexport class PeopleIcon {\n @Prop() width: string = '20';\n @Prop() height: string = '20';\n\n render() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={this.width} height={this.height} fill=\"none\" viewBox=\"0 0 20 20\">\n <path\n fill=\"currentColor\"\n d=\"M11 10a2 2 0 0 1 2 2v1.5c0 2.054-2.088 3.5-5.5 3.5S2 15.554 2 13.5V12a2 2 0 0 1 2-2h7Zm0 1H4a1 1 0 0 0-1 1v1.5C3 14.907 4.579 16 7.5 16c2.921 0 4.5-1.093 4.5-2.5V12a1 1 0 0 0-1-1Zm5-1a2 2 0 0 1 2 2v.5c0 2.089-1.568 3.5-4.5 3.5-.141 0-.28-.003-.414-.01.208-.242.382-.502.522-.781l.097-.213h.039C15.976 14.931 17 13.96 17 12.5V12a1 1 0 0 0-1-1h-2.171a3 3 0 0 0-.594-1H16ZM7.5 2a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7Zm7 2a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5Zm-7-1a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5Zm7 2a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z\"\n />\n </svg>\n );\n }\n}\n"],"mappings":"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"}