@nyaruka/temba-components 0.86.1 → 0.88.0

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 (288) hide show
  1. package/.eslintrc.js +3 -3
  2. package/.prettierrc +6 -0
  3. package/.storybook/main.js +3 -3
  4. package/.storybook/preview.js +2 -2
  5. package/CHANGELOG.md +24 -24
  6. package/CreateIncludesPlugin.js +2 -2
  7. package/demo/index.html +1 -0
  8. package/dist/locales/es.js +1 -1
  9. package/dist/locales/es.js.map +1 -1
  10. package/dist/locales/fr.js +1 -1
  11. package/dist/locales/fr.js.map +1 -1
  12. package/dist/locales/pt.js +1 -1
  13. package/dist/locales/pt.js.map +1 -1
  14. package/dist/temba-components.js +647 -535
  15. package/dist/temba-components.js.map +1 -1
  16. package/out-tsc/src/RapidElement.js +3 -3
  17. package/out-tsc/src/RapidElement.js.map +1 -1
  18. package/out-tsc/src/ResizeElement.js +2 -2
  19. package/out-tsc/src/ResizeElement.js.map +1 -1
  20. package/out-tsc/src/aliaseditor/AliasEditor.js +1 -1
  21. package/out-tsc/src/aliaseditor/AliasEditor.js.map +1 -1
  22. package/out-tsc/src/button/Button.js +1 -1
  23. package/out-tsc/src/button/Button.js.map +1 -1
  24. package/out-tsc/src/charcount/helpers.js +1 -1
  25. package/out-tsc/src/charcount/helpers.js.map +1 -1
  26. package/out-tsc/src/colorpicker/ColorPicker.js +4 -4
  27. package/out-tsc/src/colorpicker/ColorPicker.js.map +1 -1
  28. package/out-tsc/src/completion/Completion.js +2 -2
  29. package/out-tsc/src/completion/Completion.js.map +1 -1
  30. package/out-tsc/src/completion/ExcellentParser.js +1 -1
  31. package/out-tsc/src/completion/ExcellentParser.js.map +1 -1
  32. package/out-tsc/src/completion/helpers.js +8 -8
  33. package/out-tsc/src/completion/helpers.js.map +1 -1
  34. package/out-tsc/src/compose/Compose.js +14 -14
  35. package/out-tsc/src/compose/Compose.js.map +1 -1
  36. package/out-tsc/src/contacts/ContactBadges.js +2 -2
  37. package/out-tsc/src/contacts/ContactBadges.js.map +1 -1
  38. package/out-tsc/src/contacts/ContactChat.js +4 -4
  39. package/out-tsc/src/contacts/ContactChat.js.map +1 -1
  40. package/out-tsc/src/contacts/ContactDetails.js +4 -4
  41. package/out-tsc/src/contacts/ContactDetails.js.map +1 -1
  42. package/out-tsc/src/contacts/ContactFieldEditor.js +3 -3
  43. package/out-tsc/src/contacts/ContactFieldEditor.js.map +1 -1
  44. package/out-tsc/src/contacts/ContactFields.js +2 -2
  45. package/out-tsc/src/contacts/ContactFields.js.map +1 -1
  46. package/out-tsc/src/contacts/ContactHistory.js +21 -19
  47. package/out-tsc/src/contacts/ContactHistory.js.map +1 -1
  48. package/out-tsc/src/contacts/ContactPending.js +4 -4
  49. package/out-tsc/src/contacts/ContactPending.js.map +1 -1
  50. package/out-tsc/src/contacts/ContactTickets.js +8 -8
  51. package/out-tsc/src/contacts/ContactTickets.js.map +1 -1
  52. package/out-tsc/src/contacts/events.js +2 -2
  53. package/out-tsc/src/contacts/events.js.map +1 -1
  54. package/out-tsc/src/contacts/helpers.js +2 -2
  55. package/out-tsc/src/contacts/helpers.js.map +1 -1
  56. package/out-tsc/src/contactsearch/ContactSearch.js +7 -7
  57. package/out-tsc/src/contactsearch/ContactSearch.js.map +1 -1
  58. package/out-tsc/src/date/TembaDate.js +1 -1
  59. package/out-tsc/src/date/TembaDate.js.map +1 -1
  60. package/out-tsc/src/datepicker/DatePicker.js +1 -1
  61. package/out-tsc/src/datepicker/DatePicker.js.map +1 -1
  62. package/out-tsc/src/dialog/Dialog.js +5 -5
  63. package/out-tsc/src/dialog/Dialog.js.map +1 -1
  64. package/out-tsc/src/dialog/Modax.js +8 -8
  65. package/out-tsc/src/dialog/Modax.js.map +1 -1
  66. package/out-tsc/src/dropdown/Dropdown.js +1 -1
  67. package/out-tsc/src/dropdown/Dropdown.js.map +1 -1
  68. package/out-tsc/src/fields/FieldManager.js +6 -6
  69. package/out-tsc/src/fields/FieldManager.js.map +1 -1
  70. package/out-tsc/src/imagepicker/ImagePicker.js +4 -4
  71. package/out-tsc/src/imagepicker/ImagePicker.js.map +1 -1
  72. package/out-tsc/src/interfaces.js.map +1 -1
  73. package/out-tsc/src/label/Label.js +1 -1
  74. package/out-tsc/src/label/Label.js.map +1 -1
  75. package/out-tsc/src/leafletmap/LeafletMap.js +6 -6
  76. package/out-tsc/src/leafletmap/LeafletMap.js.map +1 -1
  77. package/out-tsc/src/leafletmap/helpers.js +2 -2
  78. package/out-tsc/src/leafletmap/helpers.js.map +1 -1
  79. package/out-tsc/src/lightbox/Lightbox.js +2 -2
  80. package/out-tsc/src/lightbox/Lightbox.js.map +1 -1
  81. package/out-tsc/src/list/ContentMenu.js +8 -8
  82. package/out-tsc/src/list/ContentMenu.js.map +1 -1
  83. package/out-tsc/src/list/RunList.js +1 -1
  84. package/out-tsc/src/list/RunList.js.map +1 -1
  85. package/out-tsc/src/list/SortableList.js +6 -6
  86. package/out-tsc/src/list/SortableList.js.map +1 -1
  87. package/out-tsc/src/list/TembaList.js +9 -7
  88. package/out-tsc/src/list/TembaList.js.map +1 -1
  89. package/out-tsc/src/list/TembaMenu.js +22 -22
  90. package/out-tsc/src/list/TembaMenu.js.map +1 -1
  91. package/out-tsc/src/loading/Loading.js +1 -1
  92. package/out-tsc/src/loading/Loading.js.map +1 -1
  93. package/out-tsc/src/locales/es.js +1 -1
  94. package/out-tsc/src/locales/es.js.map +1 -1
  95. package/out-tsc/src/locales/fr.js +1 -1
  96. package/out-tsc/src/locales/fr.js.map +1 -1
  97. package/out-tsc/src/locales/pt.js +1 -1
  98. package/out-tsc/src/locales/pt.js.map +1 -1
  99. package/out-tsc/src/omnibox/Omnibox.js +1 -1
  100. package/out-tsc/src/omnibox/Omnibox.js.map +1 -1
  101. package/out-tsc/src/options/Options.js +9 -9
  102. package/out-tsc/src/options/Options.js.map +1 -1
  103. package/out-tsc/src/remote/Remote.js +1 -1
  104. package/out-tsc/src/remote/Remote.js.map +1 -1
  105. package/out-tsc/src/select/Select.js +18 -18
  106. package/out-tsc/src/select/Select.js.map +1 -1
  107. package/out-tsc/src/sms/gsmsplitter.js +8 -8
  108. package/out-tsc/src/sms/gsmsplitter.js.map +1 -1
  109. package/out-tsc/src/sms/gsmvalidator.js +1 -1
  110. package/out-tsc/src/sms/gsmvalidator.js.map +1 -1
  111. package/out-tsc/src/sms/index.js +2 -2
  112. package/out-tsc/src/sms/index.js.map +1 -1
  113. package/out-tsc/src/sms/unicodesplitter.js +8 -8
  114. package/out-tsc/src/sms/unicodesplitter.js.map +1 -1
  115. package/out-tsc/src/store/Store.js +10 -10
  116. package/out-tsc/src/store/Store.js.map +1 -1
  117. package/out-tsc/src/store/StoreElement.js +2 -2
  118. package/out-tsc/src/store/StoreElement.js.map +1 -1
  119. package/out-tsc/src/tabpane/TabPane.js +4 -4
  120. package/out-tsc/src/tabpane/TabPane.js.map +1 -1
  121. package/out-tsc/src/templates/TemplateEditor.js +9 -9
  122. package/out-tsc/src/templates/TemplateEditor.js.map +1 -1
  123. package/out-tsc/src/textinput/TextInput.js +1 -1
  124. package/out-tsc/src/textinput/TextInput.js.map +1 -1
  125. package/out-tsc/src/thumbnail/Thumbnail.js +5 -5
  126. package/out-tsc/src/thumbnail/Thumbnail.js.map +1 -1
  127. package/out-tsc/src/tip/Tip.js +3 -3
  128. package/out-tsc/src/tip/Tip.js.map +1 -1
  129. package/out-tsc/src/toast/Toast.js +199 -0
  130. package/out-tsc/src/toast/Toast.js.map +1 -0
  131. package/out-tsc/src/utils/index.js +28 -21
  132. package/out-tsc/src/utils/index.js.map +1 -1
  133. package/out-tsc/src/vectoricon/VectorIcon.js +2 -2
  134. package/out-tsc/src/vectoricon/VectorIcon.js.map +1 -1
  135. package/out-tsc/src/vectoricon/index.js +1 -0
  136. package/out-tsc/src/vectoricon/index.js.map +1 -1
  137. package/out-tsc/src/webchat/WebChat.js +234 -81
  138. package/out-tsc/src/webchat/WebChat.js.map +1 -1
  139. package/out-tsc/src/webchat/assets.js +2 -0
  140. package/out-tsc/src/webchat/assets.js.map +1 -0
  141. package/out-tsc/src/webchat/index.js.map +1 -1
  142. package/out-tsc/temba-modules.js +2 -0
  143. package/out-tsc/temba-modules.js.map +1 -1
  144. package/out-tsc/test/temba-alert.test.js +1 -1
  145. package/out-tsc/test/temba-alert.test.js.map +1 -1
  146. package/out-tsc/test/temba-checkbox.test.js.map +1 -1
  147. package/out-tsc/test/temba-color-picker.test.js +4 -4
  148. package/out-tsc/test/temba-color-picker.test.js.map +1 -1
  149. package/out-tsc/test/temba-compose.test.js +50 -54
  150. package/out-tsc/test/temba-compose.test.js.map +1 -1
  151. package/out-tsc/test/temba-contact-badges.test.js +2 -2
  152. package/out-tsc/test/temba-contact-badges.test.js.map +1 -1
  153. package/out-tsc/test/temba-contact-chat.test.js +25 -38
  154. package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
  155. package/out-tsc/test/temba-contact-details.test.js +2 -2
  156. package/out-tsc/test/temba-contact-details.test.js.map +1 -1
  157. package/out-tsc/test/temba-contact-fields.test.js +4 -4
  158. package/out-tsc/test/temba-contact-fields.test.js.map +1 -1
  159. package/out-tsc/test/temba-contact-history.test.js +3 -3
  160. package/out-tsc/test/temba-contact-history.test.js.map +1 -1
  161. package/out-tsc/test/temba-contact-search.test.js +7 -7
  162. package/out-tsc/test/temba-contact-search.test.js.map +1 -1
  163. package/out-tsc/test/temba-contact-tickets.test.js +3 -3
  164. package/out-tsc/test/temba-contact-tickets.test.js.map +1 -1
  165. package/out-tsc/test/temba-content-menu.test.js +7 -7
  166. package/out-tsc/test/temba-content-menu.test.js.map +1 -1
  167. package/out-tsc/test/temba-date.test.js +3 -3
  168. package/out-tsc/test/temba-date.test.js.map +1 -1
  169. package/out-tsc/test/temba-datepicker.test.js +1 -1
  170. package/out-tsc/test/temba-datepicker.test.js.map +1 -1
  171. package/out-tsc/test/temba-field-manager.test.js +1 -3
  172. package/out-tsc/test/temba-field-manager.test.js.map +1 -1
  173. package/out-tsc/test/temba-label.test.js +6 -6
  174. package/out-tsc/test/temba-label.test.js.map +1 -1
  175. package/out-tsc/test/temba-lightbox.test.js +2 -2
  176. package/out-tsc/test/temba-lightbox.test.js.map +1 -1
  177. package/out-tsc/test/temba-list.test.js +6 -6
  178. package/out-tsc/test/temba-list.test.js.map +1 -1
  179. package/out-tsc/test/temba-menu.test.js +4 -5
  180. package/out-tsc/test/temba-menu.test.js.map +1 -1
  181. package/out-tsc/test/temba-modax.test.js +3 -3
  182. package/out-tsc/test/temba-modax.test.js.map +1 -1
  183. package/out-tsc/test/temba-options.test.js +1 -1
  184. package/out-tsc/test/temba-options.test.js.map +1 -1
  185. package/out-tsc/test/temba-select.test.js +17 -17
  186. package/out-tsc/test/temba-select.test.js.map +1 -1
  187. package/out-tsc/test/temba-sortable-list.test.js +1 -1
  188. package/out-tsc/test/temba-sortable-list.test.js.map +1 -1
  189. package/out-tsc/test/temba-textinput.test.js +2 -2
  190. package/out-tsc/test/temba-textinput.test.js.map +1 -1
  191. package/out-tsc/test/temba-tip.test.js +4 -4
  192. package/out-tsc/test/temba-tip.test.js.map +1 -1
  193. package/out-tsc/test/utils.test.js +8 -8
  194. package/out-tsc/test/utils.test.js.map +1 -1
  195. package/package.json +6 -15
  196. package/src/RapidElement.ts +3 -3
  197. package/src/ResizeElement.ts +2 -2
  198. package/src/aliaseditor/AliasEditor.ts +1 -2
  199. package/src/button/Button.ts +1 -1
  200. package/src/charcount/helpers.ts +1 -1
  201. package/src/colorpicker/ColorPicker.ts +4 -4
  202. package/src/completion/Completion.ts +2 -2
  203. package/src/completion/ExcellentParser.ts +1 -1
  204. package/src/completion/helpers.ts +9 -9
  205. package/src/compose/Compose.ts +18 -16
  206. package/src/contacts/ContactBadges.ts +2 -2
  207. package/src/contacts/ContactChat.ts +4 -4
  208. package/src/contacts/ContactDetails.ts +4 -4
  209. package/src/contacts/ContactFieldEditor.ts +4 -4
  210. package/src/contacts/ContactFields.ts +2 -2
  211. package/src/contacts/ContactHistory.ts +25 -22
  212. package/src/contacts/ContactPending.ts +4 -4
  213. package/src/contacts/ContactTickets.ts +9 -9
  214. package/src/contacts/events.ts +3 -3
  215. package/src/contacts/helpers.ts +2 -2
  216. package/src/contactsearch/ContactSearch.ts +9 -9
  217. package/src/date/TembaDate.ts +1 -1
  218. package/src/datepicker/DatePicker.ts +1 -1
  219. package/src/dialog/Dialog.ts +6 -6
  220. package/src/dialog/Modax.ts +8 -8
  221. package/src/dropdown/Dropdown.ts +1 -2
  222. package/src/emojis.json +1882 -1
  223. package/src/fields/FieldManager.ts +6 -7
  224. package/src/imagepicker/ImagePicker.ts +4 -4
  225. package/src/interfaces.ts +4 -4
  226. package/src/label/Label.ts +1 -1
  227. package/src/leafletmap/LeafletMap.ts +6 -6
  228. package/src/leafletmap/helpers.ts +2 -2
  229. package/src/lightbox/Lightbox.ts +2 -2
  230. package/src/list/ContentMenu.ts +9 -9
  231. package/src/list/RunList.ts +1 -1
  232. package/src/list/SortableList.ts +6 -6
  233. package/src/list/TembaList.ts +9 -7
  234. package/src/list/TembaMenu.ts +23 -23
  235. package/src/loading/Loading.ts +1 -1
  236. package/src/locales/es.ts +1 -1
  237. package/src/locales/fr.ts +1 -1
  238. package/src/locales/pt.ts +1 -1
  239. package/src/omnibox/Omnibox.ts +2 -2
  240. package/src/options/Options.ts +9 -9
  241. package/src/remote/Remote.ts +1 -1
  242. package/src/select/Select.ts +19 -19
  243. package/src/sms/gsmsplitter.ts +8 -8
  244. package/src/sms/gsmvalidator.ts +1 -1
  245. package/src/sms/index.ts +2 -2
  246. package/src/sms/unicodesplitter.ts +8 -8
  247. package/src/store/Store.ts +10 -10
  248. package/src/store/StoreElement.ts +2 -2
  249. package/src/tabpane/TabPane.ts +4 -4
  250. package/src/templates/TemplateEditor.ts +9 -9
  251. package/src/textinput/TextInput.ts +2 -2
  252. package/src/thumbnail/Thumbnail.ts +5 -5
  253. package/src/tip/Tip.ts +3 -3
  254. package/src/toast/Toast.ts +224 -0
  255. package/src/utils/index.ts +33 -24
  256. package/src/vectoricon/VectorIcon.ts +2 -2
  257. package/src/vectoricon/index.ts +2 -1
  258. package/src/webchat/WebChat.ts +272 -87
  259. package/src/webchat/assets.ts +2 -0
  260. package/src/webchat/index.ts +1 -1
  261. package/svg.js +28 -29
  262. package/temba-modules.ts +2 -0
  263. package/test/temba-alert.test.ts +1 -1
  264. package/test/temba-checkbox.test.ts +1 -1
  265. package/test/temba-color-picker.test.ts +4 -4
  266. package/test/temba-compose.test.ts +50 -55
  267. package/test/temba-contact-badges.test.ts +2 -2
  268. package/test/temba-contact-chat.test.ts +26 -46
  269. package/test/temba-contact-details.test.ts +2 -8
  270. package/test/temba-contact-fields.test.ts +4 -11
  271. package/test/temba-contact-history.test.ts +3 -3
  272. package/test/temba-contact-search.test.ts +7 -13
  273. package/test/temba-contact-tickets.test.ts +3 -3
  274. package/test/temba-content-menu.test.ts +7 -7
  275. package/test/temba-date.test.ts +3 -3
  276. package/test/temba-datepicker.test.ts +1 -1
  277. package/test/temba-field-manager.test.ts +1 -4
  278. package/test/temba-label.test.ts +6 -6
  279. package/test/temba-lightbox.test.ts +2 -2
  280. package/test/temba-list.test.ts +6 -6
  281. package/test/temba-menu.test.ts +4 -5
  282. package/test/temba-modax.test.ts +3 -3
  283. package/test/temba-options.test.ts +1 -1
  284. package/test/temba-select.test.ts +17 -17
  285. package/test/temba-sortable-list.test.ts +1 -1
  286. package/test/temba-textinput.test.ts +2 -2
  287. package/test/temba-tip.test.ts +5 -5
  288. package/test/utils.test.ts +8 -9
@@ -36,7 +36,7 @@ export class Thumbnail extends RapidElement {
36
36
  }
37
37
  `;
38
38
  }
39
- handleClick(evt) {
39
+ handleClick() {
40
40
  window.setTimeout(() => {
41
41
  const lightbox = document.querySelector('temba-lightbox');
42
42
  lightbox.showElement(this);
@@ -50,7 +50,7 @@ export class Thumbnail extends RapidElement {
50
50
  style=${styleMap({
51
51
  background: 'red',
52
52
  borderRadius: '0',
53
- boxShadow: 'var(--widget-box-shadow)',
53
+ boxShadow: 'var(--widget-box-shadow)'
54
54
  })}
55
55
  >
56
56
  <div
@@ -68,7 +68,7 @@ export class Thumbnail extends RapidElement {
68
68
  alignItems: 'center',
69
69
  justifyContent: 'center',
70
70
  fontWeight: '400',
71
- color: '#bbb',
71
+ color: '#bbb'
72
72
  })}
73
73
  >
74
74
  ${this.label}
@@ -82,7 +82,7 @@ export class Thumbnail extends RapidElement {
82
82
  padding: 'var(--thumb-padding, 0.4em)',
83
83
  background: '#fff',
84
84
  borderRadius: 'var(--curvature)',
85
- boxShadow: 'var(--widget-box-shadow)',
85
+ boxShadow: 'var(--widget-box-shadow)'
86
86
  })}">
87
87
 
88
88
  <div class="thumb" style=${styleMap({
@@ -97,7 +97,7 @@ export class Thumbnail extends RapidElement {
97
97
  alignItems: 'center',
98
98
  justifyContent: 'center',
99
99
  fontWeight: '400',
100
- color: '#bbb',
100
+ color: '#bbb'
101
101
  })}>
102
102
  ${this.label}
103
103
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"Thumbnail.js","sourceRoot":"","sources":["../../../src/thumbnail/Thumbnail.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAE5D,MAAM,OAAO,SAAU,SAAQ,YAAY;IAA3C;;QAmCE,SAAI,GAAG,IAAI,CAAC;QAGZ,YAAO,GAAG,KAAK,CAAC;IAyElB,CAAC;IA9GC,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;KAuBT,CAAC;IACJ,CAAC;IAcM,WAAW,CAAC,GAAe;QAChC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACrB,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAa,CAAC;YACtE,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;IAEM,MAAM;QACX,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;;mBAEE,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;kBAC9B,QAAQ,CAAC;gBACf,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,GAAG;gBACjB,SAAS,EAAE,0BAA0B;aACtC,CAAC;;;;oBAIQ,QAAQ,CAAC;gBACf,eAAe,EAAE,OAAO,IAAI,CAAC,GAAG,GAAG;gBACnC,cAAc,EAAE,SAAS;gBACzB,kBAAkB,EAAE,QAAQ;gBAC5B,gBAAgB,EAAE,WAAW;gBAC7B,SAAS,EAAE,wBAAwB;gBACnC,MAAM,EAAE,wBAAwB;gBAChC,KAAK,EAAE,wBAAwB;gBAC/B,YAAY,EAAE,GAAG;gBAEjB,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,QAAQ;gBACxB,UAAU,EAAE,KAAK;gBACjB,KAAK,EAAE,MAAM;aACd,CAAC;;cAEA,IAAI,CAAC,KAAK;;;OAGjB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAA;oBACG,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,WAAW,QAAQ,CAAC;gBAC7D,OAAO,EAAE,6BAA6B;gBACtC,UAAU,EAAE,MAAM;gBAClB,YAAY,EAAE,kBAAkB;gBAChC,SAAS,EAAE,0BAA0B;aACtC,CAAC;;qCAE6B,QAAQ,CAAC;gBAClC,eAAe,EAAE,OAAO,IAAI,CAAC,GAAG,GAAG;gBACnC,cAAc,EAAE,OAAO;gBACvB,kBAAkB,EAAE,QAAQ;gBAC5B,SAAS,EAAE,wBAAwB;gBACnC,MAAM,EAAE,wBAAwB;gBAChC,KAAK,EAAE,wBAAwB;gBAC/B,YAAY,EAAE,kBAAkB;gBAEhC,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,QAAQ;gBACxB,UAAU,EAAE,KAAK;gBACjB,KAAK,EAAE,MAAM;aACd,CAAC;cACE,IAAI,CAAC,KAAK;;;KAGnB,CAAC;QACF,CAAC;IACH,CAAC;CACF;AAlFC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sCACf;AAGZ;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wCACb;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;uCAChB;AAGZ;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;0CACZ","sourcesContent":["import { css, html } from 'lit';\nimport { RapidElement } from '../RapidElement';\nimport { property } from 'lit/decorators.js';\nimport { getClasses } from '../utils';\nimport { Lightbox } from '../lightbox/Lightbox';\nimport { styleMap } from 'lit-html/directives/style-map.js';\n\nexport class Thumbnail extends RapidElement {\n static get styles() {\n return css`\n :host {\n display: inline-block;\n }\n\n .zooming.wrapper {\n padding: 0 !important;\n border-radius: 0;\n }\n\n .zooming .thumb {\n border-radius: 0;\n }\n\n .wrapper {\n padding: var(--thumb-padding, 0.4em);\n background: #fff;\n border-radius: var(--curvature);\n box-shadow: var(--widget-box-shadow);\n }\n\n .thumb {\n }\n `;\n }\n\n @property({ type: String })\n url: string;\n\n @property({ type: String })\n label: string;\n\n @property({ type: Boolean })\n zoom = true;\n\n @property({ type: Boolean })\n zooming = false;\n\n public handleClick(evt: MouseEvent) {\n window.setTimeout(() => {\n const lightbox = document.querySelector('temba-lightbox') as Lightbox;\n lightbox.showElement(this);\n }, 0);\n }\n\n public render() {\n if (this.zooming) {\n return html`\n <div\n class=\"${getClasses({ wrapper: true })}\"\n style=${styleMap({\n background: 'red',\n borderRadius: '0',\n boxShadow: 'var(--widget-box-shadow)',\n })}\n >\n <div\n class=\"thumb\"\n style=${styleMap({\n backgroundImage: `url(${this.url})`,\n backgroundSize: 'contain',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n maxHeight: 'var(--thumb-size, 4em)',\n height: 'var(--thumb-size, 4em)',\n width: 'var(--thumb-size, 4em)',\n borderRadius: '0',\n\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: '400',\n color: '#bbb',\n })}\n >\n ${this.label}\n </div>\n </div>\n `;\n } else {\n return html`\n <div class=\"${getClasses({ wrapper: true })}\" style=${styleMap({\n padding: 'var(--thumb-padding, 0.4em)',\n background: '#fff',\n borderRadius: 'var(--curvature)',\n boxShadow: 'var(--widget-box-shadow)',\n })}\">\n\n <div class=\"thumb\" style=${styleMap({\n backgroundImage: `url(${this.url})`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n maxHeight: 'var(--thumb-size, 4em)',\n height: 'var(--thumb-size, 4em)',\n width: 'var(--thumb-size, 4em)',\n borderRadius: 'var(--curvature)',\n\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: '400',\n color: '#bbb',\n })}>\n ${this.label}\n </div>\n </div>\n `;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"Thumbnail.js","sourceRoot":"","sources":["../../../src/thumbnail/Thumbnail.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAE5D,MAAM,OAAO,SAAU,SAAQ,YAAY;IAA3C;;QAmCE,SAAI,GAAG,IAAI,CAAC;QAGZ,YAAO,GAAG,KAAK,CAAC;IAyElB,CAAC;IA9GC,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;KAuBT,CAAC;IACJ,CAAC;IAcM,WAAW;QAChB,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACrB,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAa,CAAC;YACtE,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;IAEM,MAAM;QACX,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;;mBAEE,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;kBAC9B,QAAQ,CAAC;gBACf,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,GAAG;gBACjB,SAAS,EAAE,0BAA0B;aACtC,CAAC;;;;oBAIQ,QAAQ,CAAC;gBACf,eAAe,EAAE,OAAO,IAAI,CAAC,GAAG,GAAG;gBACnC,cAAc,EAAE,SAAS;gBACzB,kBAAkB,EAAE,QAAQ;gBAC5B,gBAAgB,EAAE,WAAW;gBAC7B,SAAS,EAAE,wBAAwB;gBACnC,MAAM,EAAE,wBAAwB;gBAChC,KAAK,EAAE,wBAAwB;gBAC/B,YAAY,EAAE,GAAG;gBAEjB,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,QAAQ;gBACxB,UAAU,EAAE,KAAK;gBACjB,KAAK,EAAE,MAAM;aACd,CAAC;;cAEA,IAAI,CAAC,KAAK;;;OAGjB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAA;oBACG,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,WAAW,QAAQ,CAAC;gBAC7D,OAAO,EAAE,6BAA6B;gBACtC,UAAU,EAAE,MAAM;gBAClB,YAAY,EAAE,kBAAkB;gBAChC,SAAS,EAAE,0BAA0B;aACtC,CAAC;;qCAE6B,QAAQ,CAAC;gBAClC,eAAe,EAAE,OAAO,IAAI,CAAC,GAAG,GAAG;gBACnC,cAAc,EAAE,OAAO;gBACvB,kBAAkB,EAAE,QAAQ;gBAC5B,SAAS,EAAE,wBAAwB;gBACnC,MAAM,EAAE,wBAAwB;gBAChC,KAAK,EAAE,wBAAwB;gBAC/B,YAAY,EAAE,kBAAkB;gBAEhC,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,QAAQ;gBACxB,UAAU,EAAE,KAAK;gBACjB,KAAK,EAAE,MAAM;aACd,CAAC;cACE,IAAI,CAAC,KAAK;;;KAGnB,CAAC;QACF,CAAC;IACH,CAAC;CACF;AAlFC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sCACf;AAGZ;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wCACb;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;uCAChB;AAGZ;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;0CACZ","sourcesContent":["import { css, html } from 'lit';\nimport { RapidElement } from '../RapidElement';\nimport { property } from 'lit/decorators.js';\nimport { getClasses } from '../utils';\nimport { Lightbox } from '../lightbox/Lightbox';\nimport { styleMap } from 'lit-html/directives/style-map.js';\n\nexport class Thumbnail extends RapidElement {\n static get styles() {\n return css`\n :host {\n display: inline-block;\n }\n\n .zooming.wrapper {\n padding: 0 !important;\n border-radius: 0;\n }\n\n .zooming .thumb {\n border-radius: 0;\n }\n\n .wrapper {\n padding: var(--thumb-padding, 0.4em);\n background: #fff;\n border-radius: var(--curvature);\n box-shadow: var(--widget-box-shadow);\n }\n\n .thumb {\n }\n `;\n }\n\n @property({ type: String })\n url: string;\n\n @property({ type: String })\n label: string;\n\n @property({ type: Boolean })\n zoom = true;\n\n @property({ type: Boolean })\n zooming = false;\n\n public handleClick() {\n window.setTimeout(() => {\n const lightbox = document.querySelector('temba-lightbox') as Lightbox;\n lightbox.showElement(this);\n }, 0);\n }\n\n public render() {\n if (this.zooming) {\n return html`\n <div\n class=\"${getClasses({ wrapper: true })}\"\n style=${styleMap({\n background: 'red',\n borderRadius: '0',\n boxShadow: 'var(--widget-box-shadow)'\n })}\n >\n <div\n class=\"thumb\"\n style=${styleMap({\n backgroundImage: `url(${this.url})`,\n backgroundSize: 'contain',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n maxHeight: 'var(--thumb-size, 4em)',\n height: 'var(--thumb-size, 4em)',\n width: 'var(--thumb-size, 4em)',\n borderRadius: '0',\n\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: '400',\n color: '#bbb'\n })}\n >\n ${this.label}\n </div>\n </div>\n `;\n } else {\n return html`\n <div class=\"${getClasses({ wrapper: true })}\" style=${styleMap({\n padding: 'var(--thumb-padding, 0.4em)',\n background: '#fff',\n borderRadius: 'var(--curvature)',\n boxShadow: 'var(--widget-box-shadow)'\n })}\">\n\n <div class=\"thumb\" style=${styleMap({\n backgroundImage: `url(${this.url})`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n maxHeight: 'var(--thumb-size, 4em)',\n height: 'var(--thumb-size, 4em)',\n width: 'var(--thumb-size, 4em)',\n borderRadius: 'var(--curvature)',\n\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: '400',\n color: '#bbb'\n })}>\n ${this.label}\n </div>\n </div>\n `;\n }\n }\n}\n"]}
@@ -134,11 +134,11 @@ export class Tip extends RapidElement {
134
134
  render() {
135
135
  const tipStyle = {
136
136
  top: this.top ? `${this.top}px` : '0px',
137
- left: this.left ? `${this.left}px` : '0px',
137
+ left: this.left ? `${this.left}px` : '0px'
138
138
  };
139
139
  const arrowStyle = {
140
140
  top: this.arrowTop ? `${this.arrowTop}px` : '0px',
141
- left: this.arrowLeft ? `${this.arrowLeft}px` : '0px',
141
+ left: this.arrowLeft ? `${this.arrowLeft}px` : '0px'
142
142
  };
143
143
  if (this.width) {
144
144
  tipStyle.width = `${this.width}px`;
@@ -147,7 +147,7 @@ export class Tip extends RapidElement {
147
147
  tip: true,
148
148
  show: this.visible,
149
149
  top: this.poppedTop,
150
- 'hide-on-change': this.hideOnChange,
150
+ 'hide-on-change': this.hideOnChange
151
151
  });
152
152
  return html `
153
153
  <div
@@ -1 +1 @@
1
- {"version":3,"file":"Tip.js","sourceRoot":"","sources":["../../../src/tip/Tip.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { styleMap } from 'lit-html/directives/style-map.js';\nimport { RapidElement } from '../RapidElement';\nimport { getClasses } from '../utils';\nimport { getCenter, getMiddle } from './helpers';\n\nexport class Tip extends RapidElement {\n static get styles() {\n return css`\n .tip {\n transition: opacity 200ms ease-in-out;\n margin: 0px;\n position: fixed;\n opacity: 0;\n background: #fff;\n padding: 4px 8px;\n pointer-events: none;\n border-radius: var(--curvature-widget);\n box-shadow: 0 1px 10px 10px rgba(0, 0, 0, 0.035),\n 0 1px 3px 0px rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n font-size: 14px;\n z-index: 10000;\n color: #333;\n }\n\n .tip.hide-on-change {\n transition: none;\n }\n\n .show {\n opacity: 1;\n }\n\n .slot {\n display: flex;\n flex-direction: column;\n }\n\n .arrow {\n position: absolute;\n color: #fff;\n font-size: 10px;\n line-height: 0px;\n }\n\n .◀ {\n text-shadow: -1px 2px 2px rgba(0, 0, 0, 0.1);\n }\n\n .▶ {\n text-shadow: 1px 2px 2px rgba(0, 0, 0, 0.1);\n }\n\n .▼ {\n text-shadow: 0px 3px 3px rgba(0, 0, 0, 0.1);\n }\n\n .▲ {\n text-shadow: 0px -1px 1px rgba(0, 0, 0, 0.1);\n }\n `;\n }\n\n @property({ type: String })\n text: string;\n\n @property({ type: Boolean })\n visible = false;\n\n @property({ type: String })\n position = 'auto';\n\n @property({ type: Boolean })\n hideOnChange: boolean;\n\n @property({ type: Number, attribute: false })\n top: number;\n\n @property({ type: Number, attribute: false })\n left: number;\n\n @property({ type: Number, attribute: false })\n width: number;\n\n @property({ type: Boolean, attribute: false })\n poppedTop: boolean;\n\n arrow: string;\n arrowTop: number;\n arrowLeft: number;\n arrowDirection: string;\n\n lastEnter = 0;\n failSafe = 0;\n\n public updated(changed: Map<string, any>) {\n if ((changed.has('visible') || changed.has('text')) && this.visible) {\n this.calculatePosition();\n }\n\n if (changed.has('text') && this.hideOnChange) {\n this.visible = false;\n }\n }\n\n private calculatePosition() {\n if (this.visible) {\n const tipBounds = this.getDiv('.tip').getBoundingClientRect();\n const anchorBounds = this.getDiv('.slot').getBoundingClientRect();\n\n // TODO: pick a direction automatically\n let tipSide = this.position;\n if (tipSide === 'auto') {\n tipSide = 'left';\n }\n\n this.arrowLeft = 0;\n this.arrowTop = 0;\n\n if (tipSide === 'left') {\n this.left = anchorBounds.left - tipBounds.width - 16;\n this.top = getMiddle(anchorBounds, tipBounds);\n\n // position our arrow\n this.arrowTop = tipBounds.height / 2;\n this.arrowLeft = tipBounds.width - 1;\n this.arrow = '▶';\n } else if (tipSide === 'right') {\n this.left = anchorBounds.right + 12;\n this.top = getMiddle(anchorBounds, tipBounds);\n\n this.arrowTop = tipBounds.height / 2;\n this.arrowLeft = -8;\n this.arrow = '◀';\n } else if (tipSide === 'top') {\n this.top = anchorBounds.top - tipBounds.height - 12;\n this.left = getCenter(anchorBounds, tipBounds);\n\n this.arrowTop = tipBounds.height + 2;\n this.arrowLeft = tipBounds.width / 2 - 4;\n this.arrow = '▼';\n } else if (tipSide === 'bottom') {\n this.top = anchorBounds.bottom + 10;\n this.left = getCenter(anchorBounds, tipBounds);\n\n this.arrowTop = -2;\n this.arrowLeft = tipBounds.width / 2 - 3;\n this.arrow = '▲';\n }\n }\n }\n\n private handleMouseEnter() {\n this.lastEnter = window.setTimeout(() => {\n this.visible = true;\n this.failSafe = window.setTimeout(() => {\n this.visible = false;\n }, 2000);\n }, 600);\n }\n\n private handleMouseLeave() {\n window.clearTimeout(this.lastEnter);\n window.clearTimeout(this.failSafe);\n this.visible = false;\n }\n\n public render(): TemplateResult {\n const tipStyle: any = {\n top: this.top ? `${this.top}px` : '0px',\n left: this.left ? `${this.left}px` : '0px',\n };\n\n const arrowStyle: any = {\n top: this.arrowTop ? `${this.arrowTop}px` : '0px',\n left: this.arrowLeft ? `${this.arrowLeft}px` : '0px',\n };\n\n if (this.width) {\n tipStyle.width = `${this.width}px`;\n }\n\n const classes = getClasses({\n tip: true,\n show: this.visible,\n top: this.poppedTop,\n 'hide-on-change': this.hideOnChange,\n });\n\n return html`\n <div\n class=\"slot\"\n @click=${this.handleMouseLeave}\n @mouseenter=${this.handleMouseEnter}\n @mouseleave=${this.handleMouseLeave}\n >\n <slot></slot>\n </div>\n <div class=\"${classes}\" style=${styleMap(tipStyle)}>\n ${this.text}\n <div class=\"arrow ${this.arrow}\" style=${styleMap(arrowStyle)}>\n ${this.arrow}\n </div>\n </div>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"Tip.js","sourceRoot":"","sources":["../../../src/tip/Tip.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { styleMap } from 'lit-html/directives/style-map.js';\nimport { RapidElement } from '../RapidElement';\nimport { getClasses } from '../utils';\nimport { getCenter, getMiddle } from './helpers';\n\nexport class Tip extends RapidElement {\n static get styles() {\n return css`\n .tip {\n transition: opacity 200ms ease-in-out;\n margin: 0px;\n position: fixed;\n opacity: 0;\n background: #fff;\n padding: 4px 8px;\n pointer-events: none;\n border-radius: var(--curvature-widget);\n box-shadow: 0 1px 10px 10px rgba(0, 0, 0, 0.035),\n 0 1px 3px 0px rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n font-size: 14px;\n z-index: 10000;\n color: #333;\n }\n\n .tip.hide-on-change {\n transition: none;\n }\n\n .show {\n opacity: 1;\n }\n\n .slot {\n display: flex;\n flex-direction: column;\n }\n\n .arrow {\n position: absolute;\n color: #fff;\n font-size: 10px;\n line-height: 0px;\n }\n\n .◀ {\n text-shadow: -1px 2px 2px rgba(0, 0, 0, 0.1);\n }\n\n .▶ {\n text-shadow: 1px 2px 2px rgba(0, 0, 0, 0.1);\n }\n\n .▼ {\n text-shadow: 0px 3px 3px rgba(0, 0, 0, 0.1);\n }\n\n .▲ {\n text-shadow: 0px -1px 1px rgba(0, 0, 0, 0.1);\n }\n `;\n }\n\n @property({ type: String })\n text: string;\n\n @property({ type: Boolean })\n visible = false;\n\n @property({ type: String })\n position = 'auto';\n\n @property({ type: Boolean })\n hideOnChange: boolean;\n\n @property({ type: Number, attribute: false })\n top: number;\n\n @property({ type: Number, attribute: false })\n left: number;\n\n @property({ type: Number, attribute: false })\n width: number;\n\n @property({ type: Boolean, attribute: false })\n poppedTop: boolean;\n\n arrow: string;\n arrowTop: number;\n arrowLeft: number;\n arrowDirection: string;\n\n lastEnter = 0;\n failSafe = 0;\n\n public updated(changed: Map<string, any>) {\n if ((changed.has('visible') || changed.has('text')) && this.visible) {\n this.calculatePosition();\n }\n\n if (changed.has('text') && this.hideOnChange) {\n this.visible = false;\n }\n }\n\n private calculatePosition() {\n if (this.visible) {\n const tipBounds = this.getDiv('.tip').getBoundingClientRect();\n const anchorBounds = this.getDiv('.slot').getBoundingClientRect();\n\n // TODO: pick a direction automatically\n let tipSide = this.position;\n if (tipSide === 'auto') {\n tipSide = 'left';\n }\n\n this.arrowLeft = 0;\n this.arrowTop = 0;\n\n if (tipSide === 'left') {\n this.left = anchorBounds.left - tipBounds.width - 16;\n this.top = getMiddle(anchorBounds, tipBounds);\n\n // position our arrow\n this.arrowTop = tipBounds.height / 2;\n this.arrowLeft = tipBounds.width - 1;\n this.arrow = '▶';\n } else if (tipSide === 'right') {\n this.left = anchorBounds.right + 12;\n this.top = getMiddle(anchorBounds, tipBounds);\n\n this.arrowTop = tipBounds.height / 2;\n this.arrowLeft = -8;\n this.arrow = '◀';\n } else if (tipSide === 'top') {\n this.top = anchorBounds.top - tipBounds.height - 12;\n this.left = getCenter(anchorBounds, tipBounds);\n\n this.arrowTop = tipBounds.height + 2;\n this.arrowLeft = tipBounds.width / 2 - 4;\n this.arrow = '▼';\n } else if (tipSide === 'bottom') {\n this.top = anchorBounds.bottom + 10;\n this.left = getCenter(anchorBounds, tipBounds);\n\n this.arrowTop = -2;\n this.arrowLeft = tipBounds.width / 2 - 3;\n this.arrow = '▲';\n }\n }\n }\n\n private handleMouseEnter() {\n this.lastEnter = window.setTimeout(() => {\n this.visible = true;\n this.failSafe = window.setTimeout(() => {\n this.visible = false;\n }, 2000);\n }, 600);\n }\n\n private handleMouseLeave() {\n window.clearTimeout(this.lastEnter);\n window.clearTimeout(this.failSafe);\n this.visible = false;\n }\n\n public render(): TemplateResult {\n const tipStyle: any = {\n top: this.top ? `${this.top}px` : '0px',\n left: this.left ? `${this.left}px` : '0px'\n };\n\n const arrowStyle: any = {\n top: this.arrowTop ? `${this.arrowTop}px` : '0px',\n left: this.arrowLeft ? `${this.arrowLeft}px` : '0px'\n };\n\n if (this.width) {\n tipStyle.width = `${this.width}px`;\n }\n\n const classes = getClasses({\n tip: true,\n show: this.visible,\n top: this.poppedTop,\n 'hide-on-change': this.hideOnChange\n });\n\n return html`\n <div\n class=\"slot\"\n @click=${this.handleMouseLeave}\n @mouseenter=${this.handleMouseEnter}\n @mouseleave=${this.handleMouseLeave}\n >\n <slot></slot>\n </div>\n <div class=\"${classes}\" style=${styleMap(tipStyle)}>\n ${this.text}\n <div class=\"arrow ${this.arrow}\" style=${styleMap(arrowStyle)}>\n ${this.arrow}\n </div>\n </div>\n `;\n }\n}\n"]}
@@ -0,0 +1,199 @@
1
+ import { __decorate } from "tslib";
2
+ import { css, html } from 'lit';
3
+ import { RapidElement } from '../RapidElement';
4
+ import { property } from 'lit/decorators.js';
5
+ import { repeat } from 'lit/directives/repeat.js';
6
+ export class Toast extends RapidElement {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.messages = [];
10
+ this.staleDuration = 5000;
11
+ this.animationDuration = 200;
12
+ this.errorSticky = false;
13
+ this.warningSticky = false;
14
+ this.infoSticky = false;
15
+ this.messageId = 0;
16
+ }
17
+ checkForStaleMessages() {
18
+ const now = new Date();
19
+ // ignore sticky messages
20
+ const staleMessages = this.messages.filter((message) => {
21
+ if (message.level === 'error' && this.errorSticky) {
22
+ return false;
23
+ }
24
+ if (message.level === 'warning' && this.warningSticky) {
25
+ return false;
26
+ }
27
+ if (message.level === 'info' && this.infoSticky) {
28
+ return false;
29
+ }
30
+ return true;
31
+ });
32
+ staleMessages.forEach((message) => {
33
+ // error messages do not remove themselves
34
+ if (now.getTime() - message.time.getTime() > this.staleDuration) {
35
+ this.removeMessage(message);
36
+ }
37
+ });
38
+ if (this.messages.length === 0 && this.checker) {
39
+ window.clearInterval(this.checker);
40
+ this.checker = 0;
41
+ }
42
+ }
43
+ addMessages(messages) {
44
+ messages.forEach((message) => {
45
+ this.addMessage(message.text, message.level);
46
+ });
47
+ }
48
+ addMessage(text, level) {
49
+ const message = {
50
+ id: ++this.messageId,
51
+ text,
52
+ level,
53
+ time: new Date()
54
+ };
55
+ this.messages.push(message);
56
+ window.setTimeout(() => {
57
+ message.visible = true;
58
+ this.requestUpdate('messages');
59
+ }, 100);
60
+ this.requestUpdate('messages');
61
+ if (this.checker) {
62
+ window.clearInterval(this.checker);
63
+ this.checker = 0;
64
+ }
65
+ this.checker = window.setInterval(this.checkForStaleMessages.bind(this), 1000);
66
+ }
67
+ info(message) {
68
+ this.addMessage(message, 'info');
69
+ }
70
+ warning(message) {
71
+ this.addMessage(message, 'warning');
72
+ }
73
+ error(message) {
74
+ this.addMessage(message, 'error');
75
+ }
76
+ removeMessage(message) {
77
+ message.removeTime = new Date();
78
+ window.setTimeout(() => {
79
+ this.messages = this.messages.filter((m) => m !== message);
80
+ this.requestUpdate('messages');
81
+ }, this.animationDuration);
82
+ this.requestUpdate('messages');
83
+ }
84
+ handleMessageClicked(e) {
85
+ const ele = e.target;
86
+ const id = parseInt(ele.getAttribute('message_id'));
87
+ const message = this.messages.find((m) => m.id === id);
88
+ if (message) {
89
+ this.removeMessage(message);
90
+ }
91
+ }
92
+ render() {
93
+ return html `
94
+ ${repeat(this.messages, (message) => message.id, (message) => html `
95
+ <div
96
+ style="transition-duration: ${this.animationDuration}ms"
97
+ class="message ${message.level} ${message.visible
98
+ ? 'visible'
99
+ : ''} ${message.removeTime ? 'removing' : ''}"
100
+ >
101
+ <div class="text">${message.text}</div>
102
+ <temba-icon
103
+ name="close"
104
+ size="1.3"
105
+ message_id="${message.id}"
106
+ @click=${this.handleMessageClicked}
107
+ ></temba-icon>
108
+ </div>
109
+ `)}
110
+ `;
111
+ }
112
+ }
113
+ Toast.styles = css `
114
+ :host {
115
+ position: fixed;
116
+ width: 400px;
117
+ z-index: 10000;
118
+ right: 0;
119
+ }
120
+
121
+ .message {
122
+ background-color: rgba(50, 50, 50, 0.85);
123
+ background-color: rgba(255, 255, 255, 0.97);
124
+ color: rgba(0, 0, 0, 0.85);
125
+ padding: 0.5em 1em;
126
+ margin: 0.75em;
127
+ border-radius: 0.5em;
128
+ display: flex;
129
+ transition-property: transform, opacity;
130
+ transition-timing-function: ease-in-out;
131
+ transform: translateY(-100%);
132
+ opacity: 0;
133
+ box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 3em 2px;
134
+ border: 2px solid rgba(0, 0, 0, 0.3);
135
+ }
136
+
137
+ .message.visible {
138
+ transform: translateY(0);
139
+ opacity: 1;
140
+ }
141
+
142
+ .message.info {
143
+ }
144
+
145
+ .message.warning {
146
+ color: rgba(255, 167, 0, 0.9);
147
+ }
148
+
149
+ .message.error {
150
+ border-color: var(--color-error);
151
+ color: var(--color-error);
152
+ }
153
+
154
+ .message.removing {
155
+ opacity: 0;
156
+ transform: translateY(-100%);
157
+ }
158
+
159
+ temba-icon {
160
+ cursor: pointer;
161
+ padding-left: 1em;
162
+ opacity: 0;
163
+ transition: all 200ms ease-in-out;
164
+ }
165
+
166
+ .message:hover temba-icon {
167
+ opacity: 1;
168
+ }
169
+
170
+ temba-icon:hover {
171
+ transform: scale(1.3) translateX(-0.1em);
172
+ }
173
+
174
+ .message .text {
175
+ flex-grow: 1;
176
+ }
177
+
178
+ .info {
179
+ }
180
+ `;
181
+ __decorate([
182
+ property({ type: Array })
183
+ ], Toast.prototype, "messages", void 0);
184
+ __decorate([
185
+ property({ type: Number, attribute: 'duration' })
186
+ ], Toast.prototype, "staleDuration", void 0);
187
+ __decorate([
188
+ property({ type: Number, attribute: 'animation' })
189
+ ], Toast.prototype, "animationDuration", void 0);
190
+ __decorate([
191
+ property({ type: Boolean, attribute: 'error-sticky' })
192
+ ], Toast.prototype, "errorSticky", void 0);
193
+ __decorate([
194
+ property({ type: Boolean, attribute: 'warning-sticky' })
195
+ ], Toast.prototype, "warningSticky", void 0);
196
+ __decorate([
197
+ property({ type: Boolean, attribute: 'info-sticky' })
198
+ ], Toast.prototype, "infoSticky", void 0);
199
+ //# sourceMappingURL=Toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../../src/toast/Toast.ts"],"names":[],"mappings":"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","sourcesContent":["import { TemplateResult, css, html } from 'lit';\nimport { RapidElement } from '../RapidElement';\nimport { property } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\n\ninterface ToastMessage {\n id: number;\n text: string;\n level: 'info' | 'warning' | 'error';\n visible?: boolean;\n time: Date;\n removeTime?: Date;\n}\n\nexport class Toast extends RapidElement {\n @property({ type: Array })\n messages: ToastMessage[] = [];\n\n @property({ type: Number, attribute: 'duration' })\n staleDuration = 5000;\n\n @property({ type: Number, attribute: 'animation' })\n animationDuration = 200;\n\n @property({ type: Boolean, attribute: 'error-sticky' })\n errorSticky = false;\n\n @property({ type: Boolean, attribute: 'warning-sticky' })\n warningSticky = false;\n\n @property({ type: Boolean, attribute: 'info-sticky' })\n infoSticky = false;\n\n static styles = css`\n :host {\n position: fixed;\n width: 400px;\n z-index: 10000;\n right: 0;\n }\n\n .message {\n background-color: rgba(50, 50, 50, 0.85);\n background-color: rgba(255, 255, 255, 0.97);\n color: rgba(0, 0, 0, 0.85);\n padding: 0.5em 1em;\n margin: 0.75em;\n border-radius: 0.5em;\n display: flex;\n transition-property: transform, opacity;\n transition-timing-function: ease-in-out;\n transform: translateY(-100%);\n opacity: 0;\n box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 3em 2px;\n border: 2px solid rgba(0, 0, 0, 0.3);\n }\n\n .message.visible {\n transform: translateY(0);\n opacity: 1;\n }\n\n .message.info {\n }\n\n .message.warning {\n color: rgba(255, 167, 0, 0.9);\n }\n\n .message.error {\n border-color: var(--color-error);\n color: var(--color-error);\n }\n\n .message.removing {\n opacity: 0;\n transform: translateY(-100%);\n }\n\n temba-icon {\n cursor: pointer;\n padding-left: 1em;\n opacity: 0;\n transition: all 200ms ease-in-out;\n }\n\n .message:hover temba-icon {\n opacity: 1;\n }\n\n temba-icon:hover {\n transform: scale(1.3) translateX(-0.1em);\n }\n\n .message .text {\n flex-grow: 1;\n }\n\n .info {\n }\n `;\n\n public checkForStaleMessages() {\n const now = new Date();\n\n // ignore sticky messages\n const staleMessages = this.messages.filter((message) => {\n if (message.level === 'error' && this.errorSticky) {\n return false;\n }\n if (message.level === 'warning' && this.warningSticky) {\n return false;\n }\n if (message.level === 'info' && this.infoSticky) {\n return false;\n }\n return true;\n });\n\n staleMessages.forEach((message) => {\n // error messages do not remove themselves\n if (now.getTime() - message.time.getTime() > this.staleDuration) {\n this.removeMessage(message);\n }\n });\n\n if (this.messages.length === 0 && this.checker) {\n window.clearInterval(this.checker);\n this.checker = 0;\n }\n }\n\n private checker: number;\n private messageId: number = 0;\n\n public addMessages(messages: ToastMessage[]) {\n messages.forEach((message) => {\n this.addMessage(message.text, message.level);\n });\n }\n\n public addMessage(text: string, level: 'info' | 'warning' | 'error') {\n const message: ToastMessage = {\n id: ++this.messageId,\n text,\n level,\n time: new Date()\n };\n this.messages.push(message);\n\n window.setTimeout(() => {\n message.visible = true;\n this.requestUpdate('messages');\n }, 100);\n\n this.requestUpdate('messages');\n\n if (this.checker) {\n window.clearInterval(this.checker);\n this.checker = 0;\n }\n\n this.checker = window.setInterval(\n this.checkForStaleMessages.bind(this),\n 1000\n );\n }\n\n public info(message: string) {\n this.addMessage(message, 'info');\n }\n\n public warning(message: string) {\n this.addMessage(message, 'warning');\n }\n\n public error(message: string) {\n this.addMessage(message, 'error');\n }\n\n public removeMessage(message: ToastMessage) {\n message.removeTime = new Date();\n window.setTimeout(() => {\n this.messages = this.messages.filter((m) => m !== message);\n this.requestUpdate('messages');\n }, this.animationDuration);\n\n this.requestUpdate('messages');\n }\n\n private handleMessageClicked(e: MouseEvent) {\n const ele = e.target as HTMLElement;\n const id = parseInt(ele.getAttribute('message_id'));\n const message = this.messages.find((m) => m.id === id);\n if (message) {\n this.removeMessage(message);\n }\n }\n\n public render(): TemplateResult {\n return html`\n ${repeat(\n this.messages,\n (message) => message.id,\n (message) => html`\n <div\n style=\"transition-duration: ${this.animationDuration}ms\"\n class=\"message ${message.level} ${message.visible\n ? 'visible'\n : ''} ${message.removeTime ? 'removing' : ''}\"\n >\n <div class=\"text\">${message.text}</div>\n <temba-icon\n name=\"close\"\n size=\"1.3\"\n message_id=\"${message.id}\"\n @click=${this.handleMessageClicked}\n ></temba-icon>\n </div>\n `\n )}\n `;\n }\n}\n"]}
@@ -42,7 +42,7 @@ export const getHeaders = (headers = {}) => {
42
42
  const fetchHeaders = csrf ? { 'X-CSRFToken': csrf } : {};
43
43
  // mark us as ajax
44
44
  fetchHeaders['X-Requested-With'] = 'XMLHttpRequest';
45
- Object.keys(headers).forEach(key => {
45
+ Object.keys(headers).forEach((key) => {
46
46
  fetchHeaders[key] = headers[key];
47
47
  });
48
48
  return fetchHeaders;
@@ -51,13 +51,13 @@ export const getUrl = (url, controller = null, headers = {}) => {
51
51
  return new Promise((resolve, reject) => {
52
52
  const options = {
53
53
  method: 'GET',
54
- headers: getHeaders(headers),
54
+ headers: getHeaders(headers)
55
55
  };
56
56
  if (controller) {
57
57
  options['signal'] = controller.signal;
58
58
  }
59
59
  fetch(url, options)
60
- .then(response => {
60
+ .then((response) => {
61
61
  response.text().then((body) => {
62
62
  let json = {};
63
63
  try {
@@ -71,11 +71,11 @@ export const getUrl = (url, controller = null, headers = {}) => {
71
71
  json,
72
72
  url: response.url,
73
73
  headers: response.headers,
74
- status: response.status,
74
+ status: response.status
75
75
  });
76
76
  });
77
77
  })
78
- .catch(error => {
78
+ .catch((error) => {
79
79
  reject(error);
80
80
  });
81
81
  });
@@ -99,15 +99,15 @@ export const fetchResultsPage = (url, controller = null) => {
99
99
  .then((response) => {
100
100
  resolve({
101
101
  results: response.json.results,
102
- next: response.json.next,
102
+ next: response.json.next
103
103
  });
104
104
  })
105
- .catch(error => reject(error));
105
+ .catch((error) => reject(error));
106
106
  });
107
107
  };
108
108
  export const fetchResults = async (url) => {
109
109
  if (!url) {
110
- return new Promise(resolve => resolve([]));
110
+ return new Promise((resolve) => resolve([]));
111
111
  }
112
112
  let results = [];
113
113
  let pageUrl = url;
@@ -127,19 +127,19 @@ export const getAssetPage = (url) => {
127
127
  if (response.status >= 200 && response.status < 300) {
128
128
  resolve({
129
129
  assets: response.json.results,
130
- next: response.json.next,
130
+ next: response.json.next
131
131
  });
132
132
  }
133
133
  else {
134
134
  reject(response);
135
135
  }
136
136
  })
137
- .catch(error => reject(error));
137
+ .catch((error) => reject(error));
138
138
  });
139
139
  };
140
140
  export const getAssets = async (url) => {
141
141
  if (!url) {
142
- return new Promise(resolve => resolve([]));
142
+ return new Promise((resolve) => resolve([]));
143
143
  }
144
144
  let assets = [];
145
145
  let pageUrl = url;
@@ -163,7 +163,7 @@ export const postUrl = (url, payload, headers = {}, contentType = null) => {
163
163
  const options = {
164
164
  method: 'POST',
165
165
  headers: fetchHeaders,
166
- body: payload,
166
+ body: payload
167
167
  };
168
168
  return new Promise((resolve, reject) => {
169
169
  fetch(url, options)
@@ -172,6 +172,13 @@ export const postUrl = (url, payload, headers = {}, contentType = null) => {
172
172
  reject(response);
173
173
  return;
174
174
  }
175
+ const toasts = response.headers.get('x-temba-toasts');
176
+ if (toasts) {
177
+ const toastEle = document.querySelector('temba-toast');
178
+ if (toastEle) {
179
+ toastEle.addMessages(JSON.parse(toasts));
180
+ }
181
+ }
175
182
  response.text().then((body) => {
176
183
  let json = {};
177
184
  try {
@@ -185,11 +192,11 @@ export const postUrl = (url, payload, headers = {}, contentType = null) => {
185
192
  headers: response.headers,
186
193
  status: response.status,
187
194
  redirected: response.redirected,
188
- url: response.url,
195
+ url: response.url
189
196
  });
190
197
  });
191
198
  })
192
- .catch(error => {
199
+ .catch((error) => {
193
200
  reject(error);
194
201
  });
195
202
  });
@@ -200,7 +207,7 @@ export const postJSON = (url, payload) => {
200
207
  export const postFormData = (url, formData, headers = {}) => {
201
208
  return new Promise((resolve, reject) => {
202
209
  postUrl(url, formData, headers)
203
- .then(response => {
210
+ .then((response) => {
204
211
  if (response.status >= 200 && response.status < 400) {
205
212
  resolve(response);
206
213
  }
@@ -213,7 +220,7 @@ export const postFormData = (url, formData, headers = {}) => {
213
220
  }
214
221
  }
215
222
  })
216
- .catch(err => {
223
+ .catch((err) => {
217
224
  console.error(err);
218
225
  reject(err);
219
226
  });
@@ -237,7 +244,7 @@ export const hexToRgb = (hex) => {
237
244
  ? {
238
245
  r: parseInt(result[1], 16),
239
246
  g: parseInt(result[2], 16),
240
- b: parseInt(result[3], 16),
247
+ b: parseInt(result[3], 16)
241
248
  }
242
249
  : null;
243
250
  };
@@ -251,7 +258,7 @@ export const getElementOffset = (ele) => {
251
258
  bottom: rect.top + rect.height,
252
259
  right: rect.left + rect.width,
253
260
  width: rect.width,
254
- height: rect.height,
261
+ height: rect.height
255
262
  };
256
263
  };
257
264
  export const plural = (count, singular, plural) => {
@@ -348,7 +355,7 @@ export class Stubbable {
348
355
  }
349
356
  export const stubbable = new Stubbable();
350
357
  export const timeSince = (date, options = {
351
- suffix: '',
358
+ suffix: ''
352
359
  }) => {
353
360
  const { compareDate, hideRecentText, suffix } = options;
354
361
  const now = compareDate || stubbable.getCurrentDate();
@@ -547,7 +554,7 @@ export const extractInitials = (text) => {
547
554
  return words[0].substring(0, 2).toUpperCase();
548
555
  }
549
556
  // use initial letters of words with preference to first word and capital letters
550
- const firstLetters = words.map(w => w.substring(0, 1));
557
+ const firstLetters = words.map((w) => w.substring(0, 1));
551
558
  const firstCapitals = firstLetters.filter((l, index) => l == l.toUpperCase() || index == 0);
552
559
  if (firstCapitals.length >= 2) {
553
560
  return (firstCapitals[0] + firstCapitals[1]).toUpperCase();
@@ -559,7 +566,7 @@ export const extractInitials = (text) => {
559
566
  export const hslToHex = (h, s, l) => {
560
567
  l /= 100;
561
568
  const a = (s * Math.min(l, 1 - l)) / 100;
562
- const f = n => {
569
+ const f = (n) => {
563
570
  const k = (n + h / 30) % 12;
564
571
  const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);
565
572
  return Math.round(255 * color)