@nyaruka/temba-components 0.131.1 → 0.131.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (485) hide show
  1. package/.github/workflows/publish.yml +4 -1
  2. package/CHANGELOG.md +75 -1
  3. package/demo/components/floating-tabs/example.html +400 -0
  4. package/demo/components/flow/index.html +1 -1
  5. package/demo/data/flows/food-order.json +2 -2
  6. package/demo/data/flows/sample-flow.json +113 -125
  7. package/demo/data/flows/voicemail.json +613 -0
  8. package/demo/index.html +6 -0
  9. package/dist/locales/es.js +5 -5
  10. package/dist/locales/es.js.map +1 -1
  11. package/dist/locales/fr.js +5 -5
  12. package/dist/locales/fr.js.map +1 -1
  13. package/dist/locales/locale-codes.js +11 -2
  14. package/dist/locales/locale-codes.js.map +1 -1
  15. package/dist/locales/pt.js +5 -5
  16. package/dist/locales/pt.js.map +1 -1
  17. package/dist/static/svg/index.svg +1 -1
  18. package/dist/temba-components.js +1773 -662
  19. package/dist/temba-components.js.map +1 -1
  20. package/out-tsc/src/Icons.js +4 -1
  21. package/out-tsc/src/Icons.js.map +1 -1
  22. package/out-tsc/src/display/FloatingTab.js +167 -0
  23. package/out-tsc/src/display/FloatingTab.js.map +1 -0
  24. package/out-tsc/src/display/ProgressBar.js +22 -2
  25. package/out-tsc/src/display/ProgressBar.js.map +1 -1
  26. package/out-tsc/src/events.js.map +1 -1
  27. package/out-tsc/src/flow/CanvasMenu.js +200 -0
  28. package/out-tsc/src/flow/CanvasMenu.js.map +1 -0
  29. package/out-tsc/src/flow/CanvasNode.js +489 -47
  30. package/out-tsc/src/flow/CanvasNode.js.map +1 -1
  31. package/out-tsc/src/flow/Editor.js +1417 -67
  32. package/out-tsc/src/flow/Editor.js.map +1 -1
  33. package/out-tsc/src/flow/NodeEditor.js +479 -112
  34. package/out-tsc/src/flow/NodeEditor.js.map +1 -1
  35. package/out-tsc/src/flow/NodeTypeSelector.js +540 -0
  36. package/out-tsc/src/flow/NodeTypeSelector.js.map +1 -0
  37. package/out-tsc/src/flow/StickyNote.js +12 -3
  38. package/out-tsc/src/flow/StickyNote.js.map +1 -1
  39. package/out-tsc/src/flow/actions/add_contact_groups.js +4 -3
  40. package/out-tsc/src/flow/actions/add_contact_groups.js.map +1 -1
  41. package/out-tsc/src/flow/actions/add_contact_urn.js +63 -4
  42. package/out-tsc/src/flow/actions/add_contact_urn.js.map +1 -1
  43. package/out-tsc/src/flow/actions/add_input_labels.js +4 -3
  44. package/out-tsc/src/flow/actions/add_input_labels.js.map +1 -1
  45. package/out-tsc/src/flow/actions/play_audio.js +3 -2
  46. package/out-tsc/src/flow/actions/play_audio.js.map +1 -1
  47. package/out-tsc/src/flow/actions/remove_contact_groups.js +7 -5
  48. package/out-tsc/src/flow/actions/remove_contact_groups.js.map +1 -1
  49. package/out-tsc/src/flow/actions/request_optin.js +3 -2
  50. package/out-tsc/src/flow/actions/request_optin.js.map +1 -1
  51. package/out-tsc/src/flow/actions/say_msg.js +3 -2
  52. package/out-tsc/src/flow/actions/say_msg.js.map +1 -1
  53. package/out-tsc/src/flow/actions/send_broadcast.js +77 -23
  54. package/out-tsc/src/flow/actions/send_broadcast.js.map +1 -1
  55. package/out-tsc/src/flow/actions/send_email.js +5 -5
  56. package/out-tsc/src/flow/actions/send_email.js.map +1 -1
  57. package/out-tsc/src/flow/actions/send_msg.js +101 -21
  58. package/out-tsc/src/flow/actions/send_msg.js.map +1 -1
  59. package/out-tsc/src/flow/actions/set_contact_channel.js +6 -9
  60. package/out-tsc/src/flow/actions/set_contact_channel.js.map +1 -1
  61. package/out-tsc/src/flow/actions/set_contact_field.js +20 -20
  62. package/out-tsc/src/flow/actions/set_contact_field.js.map +1 -1
  63. package/out-tsc/src/flow/actions/set_contact_language.js +3 -2
  64. package/out-tsc/src/flow/actions/set_contact_language.js.map +1 -1
  65. package/out-tsc/src/flow/actions/set_contact_name.js +3 -12
  66. package/out-tsc/src/flow/actions/set_contact_name.js.map +1 -1
  67. package/out-tsc/src/flow/actions/set_contact_status.js +3 -2
  68. package/out-tsc/src/flow/actions/set_contact_status.js.map +1 -1
  69. package/out-tsc/src/flow/actions/set_run_result.js +4 -3
  70. package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
  71. package/out-tsc/src/flow/actions/start_session.js +181 -6
  72. package/out-tsc/src/flow/actions/start_session.js.map +1 -1
  73. package/out-tsc/src/flow/config.js +11 -23
  74. package/out-tsc/src/flow/config.js.map +1 -1
  75. package/out-tsc/src/flow/currencies.js +45 -0
  76. package/out-tsc/src/flow/currencies.js.map +1 -0
  77. package/out-tsc/src/flow/nodes/shared-rules.js +257 -0
  78. package/out-tsc/src/flow/nodes/shared-rules.js.map +1 -0
  79. package/out-tsc/src/flow/nodes/shared.js +71 -0
  80. package/out-tsc/src/flow/nodes/shared.js.map +1 -0
  81. package/out-tsc/src/flow/nodes/split_by_airtime.js +211 -5
  82. package/out-tsc/src/flow/nodes/split_by_airtime.js.map +1 -1
  83. package/out-tsc/src/flow/nodes/split_by_contact_field.js +152 -3
  84. package/out-tsc/src/flow/nodes/split_by_contact_field.js.map +1 -1
  85. package/out-tsc/src/flow/nodes/split_by_expression.js +73 -2
  86. package/out-tsc/src/flow/nodes/split_by_expression.js.map +1 -1
  87. package/out-tsc/src/flow/nodes/split_by_groups.js +18 -10
  88. package/out-tsc/src/flow/nodes/split_by_groups.js.map +1 -1
  89. package/out-tsc/src/flow/nodes/split_by_intent.js +8 -0
  90. package/out-tsc/src/flow/nodes/split_by_intent.js.map +1 -0
  91. package/out-tsc/src/flow/nodes/split_by_llm.js +11 -3
  92. package/out-tsc/src/flow/nodes/split_by_llm.js.map +1 -1
  93. package/out-tsc/src/flow/nodes/split_by_llm_categorize.js +10 -3
  94. package/out-tsc/src/flow/nodes/split_by_llm_categorize.js.map +1 -1
  95. package/out-tsc/src/flow/nodes/split_by_random.js +10 -4
  96. package/out-tsc/src/flow/nodes/split_by_random.js.map +1 -1
  97. package/out-tsc/src/flow/nodes/split_by_resthook.js +113 -0
  98. package/out-tsc/src/flow/nodes/split_by_resthook.js.map +1 -0
  99. package/out-tsc/src/flow/nodes/split_by_run_result.js +211 -3
  100. package/out-tsc/src/flow/nodes/split_by_run_result.js.map +1 -1
  101. package/out-tsc/src/flow/nodes/split_by_scheme.js +158 -2
  102. package/out-tsc/src/flow/nodes/split_by_scheme.js.map +1 -1
  103. package/out-tsc/src/flow/nodes/split_by_subflow.js +13 -5
  104. package/out-tsc/src/flow/nodes/split_by_subflow.js.map +1 -1
  105. package/out-tsc/src/flow/nodes/split_by_ticket.js +10 -3
  106. package/out-tsc/src/flow/nodes/split_by_ticket.js.map +1 -1
  107. package/out-tsc/src/flow/nodes/split_by_webhook.js +10 -3
  108. package/out-tsc/src/flow/nodes/split_by_webhook.js.map +1 -1
  109. package/out-tsc/src/flow/nodes/wait_for_digits.js +3 -2
  110. package/out-tsc/src/flow/nodes/wait_for_digits.js.map +1 -1
  111. package/out-tsc/src/flow/nodes/wait_for_menu.js +3 -2
  112. package/out-tsc/src/flow/nodes/wait_for_menu.js.map +1 -1
  113. package/out-tsc/src/flow/nodes/wait_for_response.js +38 -568
  114. package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
  115. package/out-tsc/src/flow/types.js +86 -12
  116. package/out-tsc/src/flow/types.js.map +1 -1
  117. package/out-tsc/src/flow/utils.js +101 -14
  118. package/out-tsc/src/flow/utils.js.map +1 -1
  119. package/out-tsc/src/form/FieldRenderer.js +2 -4
  120. package/out-tsc/src/form/FieldRenderer.js.map +1 -1
  121. package/out-tsc/src/interfaces.js +3 -0
  122. package/out-tsc/src/interfaces.js.map +1 -1
  123. package/out-tsc/src/layout/FloatingWindow.js +346 -0
  124. package/out-tsc/src/layout/FloatingWindow.js.map +1 -0
  125. package/out-tsc/src/list/SortableList.js +98 -33
  126. package/out-tsc/src/list/SortableList.js.map +1 -1
  127. package/out-tsc/src/live/ContactChat.js +6 -25
  128. package/out-tsc/src/live/ContactChat.js.map +1 -1
  129. package/out-tsc/src/locales/es.js +5 -5
  130. package/out-tsc/src/locales/es.js.map +1 -1
  131. package/out-tsc/src/locales/fr.js +5 -5
  132. package/out-tsc/src/locales/fr.js.map +1 -1
  133. package/out-tsc/src/locales/locale-codes.js +11 -2
  134. package/out-tsc/src/locales/locale-codes.js.map +1 -1
  135. package/out-tsc/src/locales/pt.js +5 -5
  136. package/out-tsc/src/locales/pt.js.map +1 -1
  137. package/out-tsc/src/store/AppState.js +120 -0
  138. package/out-tsc/src/store/AppState.js.map +1 -1
  139. package/out-tsc/src/utils.js +254 -13
  140. package/out-tsc/src/utils.js.map +1 -1
  141. package/out-tsc/temba-modules.js +8 -0
  142. package/out-tsc/temba-modules.js.map +1 -1
  143. package/out-tsc/test/ActionHelper.js +3 -3
  144. package/out-tsc/test/ActionHelper.js.map +1 -1
  145. package/out-tsc/test/NodeHelper.js +6 -3
  146. package/out-tsc/test/NodeHelper.js.map +1 -1
  147. package/out-tsc/test/actions/add_contact_urn.test.js +202 -0
  148. package/out-tsc/test/actions/add_contact_urn.test.js.map +1 -0
  149. package/out-tsc/test/actions/send_broadcast.test.js +148 -0
  150. package/out-tsc/test/actions/send_broadcast.test.js.map +1 -0
  151. package/out-tsc/test/actions/send_email.test.js +17 -23
  152. package/out-tsc/test/actions/send_email.test.js.map +1 -1
  153. package/out-tsc/test/actions/send_msg.test.js +33 -15
  154. package/out-tsc/test/actions/send_msg.test.js.map +1 -1
  155. package/out-tsc/test/actions/start_session.test.js +116 -0
  156. package/out-tsc/test/actions/start_session.test.js.map +1 -0
  157. package/out-tsc/test/nodes/split_by_airtime.test.js +604 -0
  158. package/out-tsc/test/nodes/split_by_airtime.test.js.map +1 -0
  159. package/out-tsc/test/nodes/split_by_contact_field.test.js +387 -0
  160. package/out-tsc/test/nodes/split_by_contact_field.test.js.map +1 -0
  161. package/out-tsc/test/nodes/split_by_expression.test.js +614 -0
  162. package/out-tsc/test/nodes/split_by_expression.test.js.map +1 -0
  163. package/out-tsc/test/nodes/split_by_random.test.js +3 -3
  164. package/out-tsc/test/nodes/split_by_random.test.js.map +1 -1
  165. package/out-tsc/test/nodes/split_by_resthook.test.js +337 -0
  166. package/out-tsc/test/nodes/split_by_resthook.test.js.map +1 -0
  167. package/out-tsc/test/nodes/split_by_run_result.test.js +920 -0
  168. package/out-tsc/test/nodes/split_by_run_result.test.js.map +1 -0
  169. package/out-tsc/test/nodes/split_by_scheme.test.js +399 -0
  170. package/out-tsc/test/nodes/split_by_scheme.test.js.map +1 -0
  171. package/out-tsc/test/nodes/split_by_subflow.test.js +333 -0
  172. package/out-tsc/test/nodes/split_by_subflow.test.js.map +1 -0
  173. package/out-tsc/test/nodes/wait_for_digits.test.js +2 -2
  174. package/out-tsc/test/nodes/wait_for_digits.test.js.map +1 -1
  175. package/out-tsc/test/nodes/wait_for_response.test.js +2 -1
  176. package/out-tsc/test/nodes/wait_for_response.test.js.map +1 -1
  177. package/out-tsc/test/temba-action-drag-between-nodes.test.js +252 -0
  178. package/out-tsc/test/temba-action-drag-between-nodes.test.js.map +1 -0
  179. package/out-tsc/test/temba-canvas-menu.test.js +122 -0
  180. package/out-tsc/test/temba-canvas-menu.test.js.map +1 -0
  181. package/out-tsc/test/temba-floating-tab.test.js +91 -0
  182. package/out-tsc/test/temba-floating-tab.test.js.map +1 -0
  183. package/out-tsc/test/temba-floating-window.test.js +301 -0
  184. package/out-tsc/test/temba-floating-window.test.js.map +1 -0
  185. package/out-tsc/test/temba-flow-editor-node.test.js +202 -2
  186. package/out-tsc/test/temba-flow-editor-node.test.js.map +1 -1
  187. package/out-tsc/test/temba-flow-editor.test.js +7 -8
  188. package/out-tsc/test/temba-flow-editor.test.js.map +1 -1
  189. package/out-tsc/test/temba-localization.test.js +471 -0
  190. package/out-tsc/test/temba-localization.test.js.map +1 -0
  191. package/out-tsc/test/temba-node-editor.test.js +3 -1
  192. package/out-tsc/test/temba-node-editor.test.js.map +1 -1
  193. package/out-tsc/test/temba-node-type-selector.test.js +265 -0
  194. package/out-tsc/test/temba-node-type-selector.test.js.map +1 -0
  195. package/out-tsc/test/temba-omnibox.test.js +2 -1
  196. package/out-tsc/test/temba-omnibox.test.js.map +1 -1
  197. package/out-tsc/test/temba-sortable-list.test.js +51 -0
  198. package/out-tsc/test/temba-sortable-list.test.js.map +1 -1
  199. package/out-tsc/test/temba-utils-index.test.js +1 -27
  200. package/out-tsc/test/temba-utils-index.test.js.map +1 -1
  201. package/out-tsc/test/utils.test.js +20 -0
  202. package/out-tsc/test/utils.test.js.map +1 -1
  203. package/package.json +2 -1
  204. package/screenshots/truth/actions/add_contact_groups/editor/descriptive-group-names.png +0 -0
  205. package/screenshots/truth/actions/add_contact_groups/editor/long-group-names.png +0 -0
  206. package/screenshots/truth/actions/add_contact_groups/editor/many-groups.png +0 -0
  207. package/screenshots/truth/actions/add_contact_groups/editor/multiple-groups.png +0 -0
  208. package/screenshots/truth/actions/add_contact_groups/editor/single-group.png +0 -0
  209. package/screenshots/truth/actions/add_contact_groups/render/descriptive-group-names.png +0 -0
  210. package/screenshots/truth/actions/add_contact_groups/render/long-group-names.png +0 -0
  211. package/screenshots/truth/actions/add_contact_groups/render/many-groups.png +0 -0
  212. package/screenshots/truth/actions/add_contact_groups/render/multiple-groups.png +0 -0
  213. package/screenshots/truth/actions/add_contact_groups/render/single-group.png +0 -0
  214. package/screenshots/truth/actions/add_contact_urn/editor/expression-facebook.png +0 -0
  215. package/screenshots/truth/actions/add_contact_urn/editor/expression-phone.png +0 -0
  216. package/screenshots/truth/actions/add_contact_urn/editor/facebook-id.png +0 -0
  217. package/screenshots/truth/actions/add_contact_urn/editor/instagram-handle.png +0 -0
  218. package/screenshots/truth/actions/add_contact_urn/editor/line-id.png +0 -0
  219. package/screenshots/truth/actions/add_contact_urn/editor/phone-number.png +0 -0
  220. package/screenshots/truth/actions/add_contact_urn/editor/telegram-id.png +0 -0
  221. package/screenshots/truth/actions/add_contact_urn/editor/viber-id.png +0 -0
  222. package/screenshots/truth/actions/add_contact_urn/editor/wechat-id.png +0 -0
  223. package/screenshots/truth/actions/add_contact_urn/editor/whatsapp.png +0 -0
  224. package/screenshots/truth/actions/add_contact_urn/render/expression-facebook.png +0 -0
  225. package/screenshots/truth/actions/add_contact_urn/render/expression-phone.png +0 -0
  226. package/screenshots/truth/actions/add_contact_urn/render/facebook-id.png +0 -0
  227. package/screenshots/truth/actions/add_contact_urn/render/instagram-handle.png +0 -0
  228. package/screenshots/truth/actions/add_contact_urn/render/line-id.png +0 -0
  229. package/screenshots/truth/actions/add_contact_urn/render/phone-number.png +0 -0
  230. package/screenshots/truth/actions/add_contact_urn/render/telegram-id.png +0 -0
  231. package/screenshots/truth/actions/add_contact_urn/render/viber-id.png +0 -0
  232. package/screenshots/truth/actions/add_contact_urn/render/wechat-id.png +0 -0
  233. package/screenshots/truth/actions/add_contact_urn/render/whatsapp.png +0 -0
  234. package/screenshots/truth/actions/remove_contact_groups/editor/cleanup-groups.png +0 -0
  235. package/screenshots/truth/actions/remove_contact_groups/editor/long-descriptive-group-names.png +0 -0
  236. package/screenshots/truth/actions/remove_contact_groups/editor/many-groups.png +0 -0
  237. package/screenshots/truth/actions/remove_contact_groups/editor/multiple-groups.png +0 -0
  238. package/screenshots/truth/actions/remove_contact_groups/editor/remove-from-all-groups.png +0 -0
  239. package/screenshots/truth/actions/remove_contact_groups/editor/single-group.png +0 -0
  240. package/screenshots/truth/actions/remove_contact_groups/render/cleanup-groups.png +0 -0
  241. package/screenshots/truth/actions/remove_contact_groups/render/long-descriptive-group-names.png +0 -0
  242. package/screenshots/truth/actions/remove_contact_groups/render/many-groups.png +0 -0
  243. package/screenshots/truth/actions/remove_contact_groups/render/multiple-groups.png +0 -0
  244. package/screenshots/truth/actions/remove_contact_groups/render/remove-from-all-groups.png +0 -0
  245. package/screenshots/truth/actions/remove_contact_groups/render/single-group.png +0 -0
  246. package/screenshots/truth/actions/send_broadcast/editor/contacts-only.png +0 -0
  247. package/screenshots/truth/actions/send_broadcast/editor/groups-and-contacts.png +0 -0
  248. package/screenshots/truth/actions/send_broadcast/editor/groups-only.png +0 -0
  249. package/screenshots/truth/actions/send_broadcast/editor/many-groups.png +0 -0
  250. package/screenshots/truth/actions/send_broadcast/editor/multiline-text.png +0 -0
  251. package/screenshots/truth/actions/send_broadcast/editor/with-attachments.png +0 -0
  252. package/screenshots/truth/actions/send_broadcast/render/contacts-only.png +0 -0
  253. package/screenshots/truth/actions/send_broadcast/render/groups-and-contacts.png +0 -0
  254. package/screenshots/truth/actions/send_broadcast/render/groups-only.png +0 -0
  255. package/screenshots/truth/actions/send_broadcast/render/many-groups.png +0 -0
  256. package/screenshots/truth/actions/send_broadcast/render/multiline-text.png +0 -0
  257. package/screenshots/truth/actions/send_broadcast/render/with-attachments.png +0 -0
  258. package/screenshots/truth/actions/send_email/editor/complex-business-email.png +0 -0
  259. package/screenshots/truth/actions/send_email/editor/empty-body.png +0 -0
  260. package/screenshots/truth/actions/send_email/editor/empty-subject.png +0 -0
  261. package/screenshots/truth/actions/send_email/editor/long-subject.png +0 -0
  262. package/screenshots/truth/actions/send_email/editor/multiline-body.png +0 -0
  263. package/screenshots/truth/actions/send_email/editor/multiple-recipients.png +0 -0
  264. package/screenshots/truth/actions/send_email/editor/simple-email.png +0 -0
  265. package/screenshots/truth/actions/send_email/editor/with-expressions.png +0 -0
  266. package/screenshots/truth/actions/send_email/render/complex-business-email.png +0 -0
  267. package/screenshots/truth/actions/send_email/render/empty-body.png +0 -0
  268. package/screenshots/truth/actions/send_email/render/empty-subject.png +0 -0
  269. package/screenshots/truth/actions/send_email/render/long-subject.png +0 -0
  270. package/screenshots/truth/actions/send_email/render/multiline-body.png +0 -0
  271. package/screenshots/truth/actions/send_email/render/multiple-recipients.png +0 -0
  272. package/screenshots/truth/actions/send_email/render/simple-email.png +0 -0
  273. package/screenshots/truth/actions/send_email/render/with-expressions.png +0 -0
  274. package/screenshots/truth/actions/send_msg/editor/long-quick-replies.png +0 -0
  275. package/screenshots/truth/actions/send_msg/editor/multiline-text-with-replies.png +0 -0
  276. package/screenshots/truth/actions/send_msg/editor/simple-text.png +0 -0
  277. package/screenshots/truth/actions/send_msg/editor/text-with-linebreaks.png +0 -0
  278. package/screenshots/truth/actions/send_msg/editor/text-with-many-quick-replies.png +0 -0
  279. package/screenshots/truth/actions/send_msg/editor/text-with-quick-replies.png +0 -0
  280. package/screenshots/truth/actions/send_msg/editor/text-without-quick-replies.png +0 -0
  281. package/screenshots/truth/actions/send_msg/render/long-quick-replies.png +0 -0
  282. package/screenshots/truth/actions/send_msg/render/multiline-text-with-replies.png +0 -0
  283. package/screenshots/truth/actions/send_msg/render/simple-text.png +0 -0
  284. package/screenshots/truth/actions/send_msg/render/text-with-linebreaks.png +0 -0
  285. package/screenshots/truth/actions/send_msg/render/text-with-many-quick-replies.png +0 -0
  286. package/screenshots/truth/actions/send_msg/render/text-with-quick-replies.png +0 -0
  287. package/screenshots/truth/actions/send_msg/render/text-without-quick-replies.png +0 -0
  288. package/screenshots/truth/actions/start_session/editor/contact-query.png +0 -0
  289. package/screenshots/truth/actions/start_session/editor/contacts-only.png +0 -0
  290. package/screenshots/truth/actions/start_session/editor/create-contact.png +0 -0
  291. package/screenshots/truth/actions/start_session/editor/groups-and-contacts.png +0 -0
  292. package/screenshots/truth/actions/start_session/editor/groups-only.png +0 -0
  293. package/screenshots/truth/actions/start_session/editor/many-recipients.png +0 -0
  294. package/screenshots/truth/actions/start_session/render/contact-query.png +0 -0
  295. package/screenshots/truth/actions/start_session/render/contacts-only.png +0 -0
  296. package/screenshots/truth/actions/start_session/render/create-contact.png +0 -0
  297. package/screenshots/truth/actions/start_session/render/groups-and-contacts.png +0 -0
  298. package/screenshots/truth/actions/start_session/render/groups-only.png +0 -0
  299. package/screenshots/truth/actions/start_session/render/many-recipients.png +0 -0
  300. package/screenshots/truth/canvas-menu/open.png +0 -0
  301. package/screenshots/truth/editor/router.png +0 -0
  302. package/screenshots/truth/editor/wait.png +0 -0
  303. package/screenshots/truth/floating-tab/default.png +0 -0
  304. package/screenshots/truth/floating-tab/gray.png +0 -0
  305. package/screenshots/truth/floating-tab/green.png +0 -0
  306. package/screenshots/truth/floating-tab/hidden.png +0 -0
  307. package/screenshots/truth/floating-tab/hover.png +0 -0
  308. package/screenshots/truth/floating-tab/purple.png +0 -0
  309. package/screenshots/truth/floating-window/chromeless.png +0 -0
  310. package/screenshots/truth/floating-window/custom-size.png +0 -0
  311. package/screenshots/truth/floating-window/default.png +0 -0
  312. package/screenshots/truth/floating-window/with-header.png +0 -0
  313. package/screenshots/truth/list/fields-dragging.png +0 -0
  314. package/screenshots/truth/list/sortable-dragging.png +0 -0
  315. package/screenshots/truth/node-type-selector/action-mode.png +0 -0
  316. package/screenshots/truth/node-type-selector/split-mode.png +0 -0
  317. package/screenshots/truth/nodes/split_by_llm/editor/information-extraction.png +0 -0
  318. package/screenshots/truth/nodes/split_by_llm/editor/sentiment-analysis.png +0 -0
  319. package/screenshots/truth/nodes/split_by_llm/editor/summarization.png +0 -0
  320. package/screenshots/truth/nodes/split_by_llm/editor/translation-task.png +0 -0
  321. package/screenshots/truth/nodes/split_by_llm/render/information-extraction.png +0 -0
  322. package/screenshots/truth/nodes/split_by_llm/render/sentiment-analysis.png +0 -0
  323. package/screenshots/truth/nodes/split_by_llm/render/summarization.png +0 -0
  324. package/screenshots/truth/nodes/split_by_llm/render/translation-task.png +0 -0
  325. package/screenshots/truth/nodes/split_by_llm_categorize/editor/basic-categorization.png +0 -0
  326. package/screenshots/truth/nodes/split_by_llm_categorize/editor/custom-input-and-result-name.png +0 -0
  327. package/screenshots/truth/nodes/split_by_llm_categorize/editor/feedback-categorization.png +0 -0
  328. package/screenshots/truth/nodes/split_by_llm_categorize/editor/many-categories.png +0 -0
  329. package/screenshots/truth/nodes/split_by_llm_categorize/editor/minimal-categories.png +0 -0
  330. package/screenshots/truth/nodes/split_by_llm_categorize/render/basic-categorization.png +0 -0
  331. package/screenshots/truth/nodes/split_by_llm_categorize/render/custom-input-and-result-name.png +0 -0
  332. package/screenshots/truth/nodes/split_by_llm_categorize/render/feedback-categorization.png +0 -0
  333. package/screenshots/truth/nodes/split_by_llm_categorize/render/many-categories.png +0 -0
  334. package/screenshots/truth/nodes/split_by_llm_categorize/render/minimal-categories.png +0 -0
  335. package/screenshots/truth/nodes/split_by_random/editor/ab-test-multiple-variants.png +0 -0
  336. package/screenshots/truth/nodes/split_by_random/editor/sampling-split.png +0 -0
  337. package/screenshots/truth/nodes/split_by_random/editor/three-way-split.png +0 -0
  338. package/screenshots/truth/nodes/split_by_random/editor/two-bucket-split.png +0 -0
  339. package/screenshots/truth/nodes/split_by_random/render/ab-test-multiple-variants.png +0 -0
  340. package/screenshots/truth/nodes/split_by_random/render/sampling-split.png +0 -0
  341. package/screenshots/truth/nodes/split_by_random/render/three-way-split.png +0 -0
  342. package/screenshots/truth/nodes/split_by_random/render/two-bucket-split.png +0 -0
  343. package/screenshots/truth/nodes/wait_for_digits/editor/basic-digits-wait.png +0 -0
  344. package/screenshots/truth/nodes/wait_for_digits/editor/phone-number-collection.png +0 -0
  345. package/screenshots/truth/nodes/wait_for_digits/editor/single-digit-with-timeout.png +0 -0
  346. package/screenshots/truth/nodes/wait_for_digits/editor/verification-code.png +0 -0
  347. package/screenshots/truth/nodes/wait_for_digits/render/basic-digits-wait.png +0 -0
  348. package/screenshots/truth/nodes/wait_for_digits/render/phone-number-collection.png +0 -0
  349. package/screenshots/truth/nodes/wait_for_digits/render/single-digit-with-timeout.png +0 -0
  350. package/screenshots/truth/nodes/wait_for_digits/render/verification-code.png +0 -0
  351. package/screenshots/truth/nodes/wait_for_response/editor/basic-wait.png +0 -0
  352. package/screenshots/truth/nodes/wait_for_response/editor/custom-result-name.png +0 -0
  353. package/screenshots/truth/nodes/wait_for_response/editor/no-timeout.png +0 -0
  354. package/screenshots/truth/nodes/wait_for_response/editor/short-timeout.png +0 -0
  355. package/screenshots/truth/nodes/wait_for_response/render/basic-wait.png +0 -0
  356. package/screenshots/truth/nodes/wait_for_response/render/custom-result-name.png +0 -0
  357. package/screenshots/truth/nodes/wait_for_response/render/no-timeout.png +0 -0
  358. package/screenshots/truth/nodes/wait_for_response/render/short-timeout.png +0 -0
  359. package/src/Icons.ts +4 -1
  360. package/src/display/FloatingTab.ts +174 -0
  361. package/src/display/ProgressBar.ts +22 -2
  362. package/src/events.ts +2 -8
  363. package/src/flow/CanvasMenu.ts +217 -0
  364. package/src/flow/CanvasNode.ts +596 -40
  365. package/src/flow/Editor.ts +1721 -45
  366. package/src/flow/NodeEditor.ts +621 -144
  367. package/src/flow/NodeTypeSelector.ts +636 -0
  368. package/src/flow/StickyNote.ts +12 -3
  369. package/src/flow/actions/add_contact_groups.ts +5 -4
  370. package/src/flow/actions/add_contact_urn.ts +78 -4
  371. package/src/flow/actions/add_input_labels.ts +5 -4
  372. package/src/flow/actions/play_audio.ts +3 -2
  373. package/src/flow/actions/remove_contact_groups.ts +16 -6
  374. package/src/flow/actions/request_optin.ts +3 -2
  375. package/src/flow/actions/say_msg.ts +3 -2
  376. package/src/flow/actions/send_broadcast.ts +86 -23
  377. package/src/flow/actions/send_email.ts +12 -6
  378. package/src/flow/actions/send_msg.ts +155 -34
  379. package/src/flow/actions/set_contact_channel.ts +6 -11
  380. package/src/flow/actions/set_contact_field.ts +21 -25
  381. package/src/flow/actions/set_contact_language.ts +11 -4
  382. package/src/flow/actions/set_contact_name.ts +4 -15
  383. package/src/flow/actions/set_contact_status.ts +4 -3
  384. package/src/flow/actions/set_run_result.ts +5 -4
  385. package/src/flow/actions/start_session.ts +210 -6
  386. package/src/flow/config.ts +11 -23
  387. package/src/flow/currencies.ts +51 -0
  388. package/src/flow/nodes/shared-rules.ts +301 -0
  389. package/src/flow/nodes/shared.ts +87 -0
  390. package/src/flow/nodes/split_by_airtime.ts +255 -5
  391. package/src/flow/nodes/split_by_contact_field.ts +195 -3
  392. package/src/flow/nodes/split_by_expression.ts +104 -2
  393. package/src/flow/nodes/split_by_groups.ts +26 -11
  394. package/src/flow/nodes/split_by_intent.ts +8 -0
  395. package/src/flow/nodes/split_by_llm.ts +22 -4
  396. package/src/flow/nodes/split_by_llm_categorize.ts +22 -5
  397. package/src/flow/nodes/split_by_random.ts +16 -6
  398. package/src/flow/nodes/split_by_resthook.ts +140 -0
  399. package/src/flow/nodes/split_by_run_result.ts +259 -3
  400. package/src/flow/nodes/split_by_scheme.ts +202 -2
  401. package/src/flow/nodes/split_by_subflow.ts +17 -5
  402. package/src/flow/nodes/split_by_ticket.ts +15 -4
  403. package/src/flow/nodes/split_by_webhook.ts +17 -6
  404. package/src/flow/nodes/wait_for_digits.ts +3 -2
  405. package/src/flow/nodes/wait_for_menu.ts +3 -2
  406. package/src/flow/nodes/wait_for_response.ts +59 -680
  407. package/src/flow/types.ts +156 -23
  408. package/src/flow/utils.ts +108 -14
  409. package/src/form/FieldRenderer.ts +2 -4
  410. package/src/interfaces.ts +3 -0
  411. package/src/layout/FloatingWindow.ts +386 -0
  412. package/src/list/SortableList.ts +109 -34
  413. package/src/live/ContactChat.ts +7 -25
  414. package/src/locales/es.ts +18 -13
  415. package/src/locales/fr.ts +18 -13
  416. package/src/locales/locale-codes.ts +11 -2
  417. package/src/locales/pt.ts +18 -13
  418. package/src/store/AppState.ts +173 -0
  419. package/src/store/flow-definition.d.ts +2 -5
  420. package/src/utils.ts +332 -12
  421. package/static/api/channels.json +46 -0
  422. package/static/api/llms.json +18 -0
  423. package/static/api/resthooks.json +31 -0
  424. package/static/svg/index.svg +1 -1
  425. package/static/svg/work/traced/lightning-02.svg +1 -0
  426. package/static/svg/work/used/lightning-02.svg +3 -0
  427. package/temba-modules.ts +8 -0
  428. package/test/ActionHelper.ts +3 -3
  429. package/test/NodeHelper.ts +6 -3
  430. package/test/actions/add_contact_urn.test.ts +287 -0
  431. package/test/actions/send_broadcast.test.ts +190 -0
  432. package/test/actions/send_email.test.ts +17 -23
  433. package/test/actions/send_msg.test.ts +39 -15
  434. package/test/actions/start_session.test.ts +151 -0
  435. package/test/nodes/split_by_airtime.test.ts +673 -0
  436. package/test/nodes/split_by_contact_field.test.ts +451 -0
  437. package/test/nodes/split_by_expression.test.ts +751 -0
  438. package/test/nodes/split_by_random.test.ts +3 -3
  439. package/test/nodes/split_by_resthook.test.ts +398 -0
  440. package/test/nodes/split_by_run_result.test.ts +1109 -0
  441. package/test/nodes/split_by_scheme.test.ts +486 -0
  442. package/test/nodes/split_by_subflow.test.ts +381 -0
  443. package/test/nodes/wait_for_digits.test.ts +2 -2
  444. package/test/nodes/wait_for_response.test.ts +2 -1
  445. package/test/temba-action-drag-between-nodes.test.ts +301 -0
  446. package/test/temba-canvas-menu.test.ts +156 -0
  447. package/test/temba-floating-tab.test.ts +110 -0
  448. package/test/temba-floating-window.test.ts +477 -0
  449. package/test/temba-flow-editor-node.test.ts +246 -2
  450. package/test/temba-flow-editor.test.ts +7 -8
  451. package/test/temba-localization.test.ts +611 -0
  452. package/test/temba-node-editor.test.ts +3 -1
  453. package/test/temba-node-type-selector.test.ts +355 -0
  454. package/test/temba-omnibox.test.ts +2 -1
  455. package/test/temba-sortable-list.test.ts +69 -0
  456. package/test/temba-utils-index.test.ts +0 -35
  457. package/test/utils.test.ts +22 -0
  458. package/test-assets/contacts/history.json +14 -21
  459. package/test-assets/select/llms.json +2 -2
  460. package/web-dev-server.config.mjs +49 -1
  461. package/web-test-runner.config.mjs +0 -1
  462. package/out-tsc/src/flow/actions/call_classifier.js +0 -11
  463. package/out-tsc/src/flow/actions/call_classifier.js.map +0 -1
  464. package/out-tsc/src/flow/actions/call_resthook.js +0 -11
  465. package/out-tsc/src/flow/actions/call_resthook.js.map +0 -1
  466. package/out-tsc/src/flow/actions/split_by_expression_example.js +0 -77
  467. package/out-tsc/src/flow/actions/split_by_expression_example.js.map +0 -1
  468. package/out-tsc/src/flow/actions/transfer_airtime.js +0 -11
  469. package/out-tsc/src/flow/actions/transfer_airtime.js.map +0 -1
  470. package/out-tsc/src/flow/nodes/wait_for_audio.js +0 -7
  471. package/out-tsc/src/flow/nodes/wait_for_audio.js.map +0 -1
  472. package/out-tsc/src/flow/nodes/wait_for_image.js +0 -7
  473. package/out-tsc/src/flow/nodes/wait_for_image.js.map +0 -1
  474. package/out-tsc/src/flow/nodes/wait_for_location.js +0 -7
  475. package/out-tsc/src/flow/nodes/wait_for_location.js.map +0 -1
  476. package/out-tsc/src/flow/nodes/wait_for_video.js +0 -7
  477. package/out-tsc/src/flow/nodes/wait_for_video.js.map +0 -1
  478. package/src/flow/actions/call_classifier.ts +0 -12
  479. package/src/flow/actions/call_resthook.ts +0 -12
  480. package/src/flow/actions/split_by_expression_example.ts +0 -88
  481. package/src/flow/actions/transfer_airtime.ts +0 -12
  482. package/src/flow/nodes/wait_for_audio.ts +0 -7
  483. package/src/flow/nodes/wait_for_image.ts +0 -7
  484. package/src/flow/nodes/wait_for_location.ts +0 -7
  485. package/src/flow/nodes/wait_for_video.ts +0 -7
@@ -4,7 +4,10 @@ on:
4
4
  push:
5
5
  tags:
6
6
  - '*'
7
-
7
+ permissions:
8
+ id-token: write
9
+ contents: read
10
+
8
11
  jobs:
9
12
  build:
10
13
  runs-on: ubuntu-latest
package/CHANGELOG.md CHANGED
@@ -4,25 +4,99 @@ All notable changes to this project will be documented in this file. Dates are d
4
4
 
5
5
  Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6
6
 
7
+ #### [v0.131.3](https://github.com/nyaruka/temba-components/compare/v0.131.2...v0.131.3)
8
+
9
+ - Chat history tweaks [`#754`](https://github.com/nyaruka/temba-components/pull/754)
10
+ - Localization tab [`#753`](https://github.com/nyaruka/temba-components/pull/753)
11
+ - Add localization editing framework for flow actions and router categories [`#747`](https://github.com/nyaruka/temba-components/pull/747)
12
+ - Bump min-document from 2.19.0 to 2.19.2 [`#752`](https://github.com/nyaruka/temba-components/pull/752)
13
+ - [WIP] Add a generic tab and floating window component [`#751`](https://github.com/nyaruka/temba-components/pull/751)
14
+ - Add flow type and feature filtering to NodeTypeSelector [`#749`](https://github.com/nyaruka/temba-components/pull/749)
15
+ - Add auto translate and category toggles [`cb1257c`](https://github.com/nyaruka/temba-components/commit/cb1257c2044ec8e5b7072274bdc0183811059229)
16
+ - Add voice example file and improve filtering [`a00a21d`](https://github.com/nyaruka/temba-components/commit/a00a21dfeeb553da8f88ba2643792eb6c058a890)
17
+ - Add FloatingTab and FloatingWindow components with tests [`38b3b13`](https://github.com/nyaruka/temba-components/commit/38b3b13bad1a961cd672ae2c246bd06e9adc7b51)
18
+
19
+ #### [v0.131.2](https://github.com/nyaruka/temba-components/compare/v0.131.1...v0.131.2)
20
+
21
+ > 14 November 2025
22
+
23
+ - Support `_status` fields on msg events that are objects [`#745`](https://github.com/nyaruka/temba-components/pull/745)
24
+ - Fix validate methods to use FormData instead of action types [`#742`](https://github.com/nyaruka/temba-components/pull/742)
25
+ - Add mock channels endpoint for demo environment [`#744`](https://github.com/nyaruka/temba-components/pull/744)
26
+ - Add delimiter support to split_by_run_result [`#740`](https://github.com/nyaruka/temba-components/pull/740)
27
+ - Add send_broadcast action config with recipients and message fields [`#738`](https://github.com/nyaruka/temba-components/pull/738)
28
+ - Enable dragging actions between execute_actions nodes [`#736`](https://github.com/nyaruka/temba-components/pull/736)
29
+ - Enable dragging actions from execute_actions nodes to canvas to create new nodes [`#732`](https://github.com/nyaruka/temba-components/pull/732)
30
+ - Add action button for execute_actions nodes [`#734`](https://github.com/nyaruka/temba-components/pull/734)
31
+ - Add configuration for split_by_airtime node [`#730`](https://github.com/nyaruka/temba-components/pull/730)
32
+ - Implement split_by_resthook router configuration [`#725`](https://github.com/nyaruka/temba-components/pull/725)
33
+ - Tracking down intermittent CI failure [`#723`](https://github.com/nyaruka/temba-components/pull/723)
34
+ - Fix split as action for new nodes [`#726`](https://github.com/nyaruka/temba-components/pull/726)
35
+ - Ensure canvas menu is on screen [`#722`](https://github.com/nyaruka/temba-components/pull/722)
36
+ - More structure for node types [`#721`](https://github.com/nyaruka/temba-components/pull/721)
37
+ - Node creation menu [`#719`](https://github.com/nyaruka/temba-components/pull/719)
38
+ - Bump validator from 13.11.0 to 13.15.20 [`#720`](https://github.com/nyaruka/temba-components/pull/720)
39
+ - Add add_urn action [`#718`](https://github.com/nyaruka/temba-components/pull/718)
40
+ - Type safety for formData [`#717`](https://github.com/nyaruka/temba-components/pull/717)
41
+ - Implementation for start_session [`#716`](https://github.com/nyaruka/temba-components/pull/716)
42
+ - Implement split_by_result [`#715`](https://github.com/nyaruka/temba-components/pull/715)
43
+ - Add implementation split_by_contact_field [`#713`](https://github.com/nyaruka/temba-components/pull/713)
44
+ - Add split by expression with shared rule logic [`#712`](https://github.com/nyaruka/temba-components/pull/712)
45
+ - Add common save as result name [`#711`](https://github.com/nyaruka/temba-components/pull/711)
46
+ - Split by scheme [`#710`](https://github.com/nyaruka/temba-components/pull/710)
47
+ - Remove support for older fields on message events in chat history [`#705`](https://github.com/nyaruka/temba-components/pull/705)
48
+ - Implement send_broadcast action config with form, validation and tests [`1212d8e`](https://github.com/nyaruka/temba-components/commit/1212d8eb082ffe74fbd29ebea0bc327e277305b9)
49
+ - Add delimiter feature to split_by_run_result [`db66b81`](https://github.com/nyaruka/temba-components/commit/db66b81c8f216660f727f0e1a1eae544f31e7908)
50
+ - Implement drag-to-canvas for actions [`32ffdb7`](https://github.com/nyaruka/temba-components/commit/32ffdb75344baf8cda915a4ad00c00c218765120)
51
+
7
52
  #### [v0.131.1](https://github.com/nyaruka/temba-components/compare/v0.131.0...v0.131.1)
8
53
 
54
+ > 2 October 2025
55
+
9
56
  - Styling tweak for contact search [`2de5b31`](https://github.com/nyaruka/temba-components/commit/2de5b31280a9d6645780e10bbb7f2e97f182e4b7)
10
57
 
11
- #### [v0.131.0](https://github.com/nyaruka/temba-components/compare/v0.130.1...v0.131.0)
58
+ #### [v0.131.0](https://github.com/nyaruka/temba-components/compare/v0.130.5...v0.131.0)
12
59
 
13
60
  > 2 October 2025
14
61
 
15
62
  - Empty row focus, auto categories [`#707`](https://github.com/nyaruka/temba-components/pull/707)
16
63
  - Fix omnibox [`#706`](https://github.com/nyaruka/temba-components/pull/706)
64
+ - Fix system categories [`8c191f1`](https://github.com/nyaruka/temba-components/commit/8c191f158c7a67d1e15078e78160497b63317c50)
65
+ - Add auto category generation [`5cb1af3`](https://github.com/nyaruka/temba-components/commit/5cb1af36b04a2440d7a5d2e37dbaf29338d89fa7)
66
+ - Maintain focus after new row is added [`f485390`](https://github.com/nyaruka/temba-components/commit/f485390d11b316f2866213ee3261f2c1fee5b6fd)
67
+
68
+ #### [v0.130.5](https://github.com/nyaruka/temba-components/compare/v0.130.4...v0.130.5)
69
+
70
+ > 30 September 2025
71
+
17
72
  - Tweak msg event payload for chat history [`#704`](https://github.com/nyaruka/temba-components/pull/704)
18
73
  - Add split by groups [`#699`](https://github.com/nyaruka/temba-components/pull/699)
19
74
  - Some tweaks for smoother dragging [`#701`](https://github.com/nyaruka/temba-components/pull/701)
20
75
  - Switch to cloned dragged items [`#700`](https://github.com/nyaruka/temba-components/pull/700)
21
76
  - Show select fetching status [`#698`](https://github.com/nyaruka/temba-components/pull/698)
22
77
  - Add sorting for wait for response [`#695`](https://github.com/nyaruka/temba-components/pull/695)
78
+ - Sortable rules wip [`f1af831`](https://github.com/nyaruka/temba-components/commit/f1af8312a136d0c3437e37ef75bee5dcdb9bd670)
79
+ - Use the original element for dragging [`54e1cae`](https://github.com/nyaruka/temba-components/commit/54e1cae6da0ce57cd0821a9e4815efbb0c4dddbc)
80
+ - Maintain order for like-named categories [`7149dc7`](https://github.com/nyaruka/temba-components/commit/7149dc778b54ddd1f8d25eddebeb442faef02b92)
81
+
82
+ #### [v0.130.4](https://github.com/nyaruka/temba-components/compare/v0.130.3...v0.130.4)
83
+
84
+ > 24 September 2025
85
+
23
86
  - Fix rendering of `ivr_created` events [`#697`](https://github.com/nyaruka/temba-components/pull/697)
24
87
  - Update chat history test with more realistic event data [`#696`](https://github.com/nyaruka/temba-components/pull/696)
88
+ - Fix rendering of ivr_created events in chat history [`261f082`](https://github.com/nyaruka/temba-components/commit/261f082a6d8fbdc2244a1e59fa07a49f33439c36)
89
+
90
+ #### [v0.130.3](https://github.com/nyaruka/temba-components/compare/v0.130.2...v0.130.3)
91
+
92
+ > 23 September 2025
93
+
25
94
  - Remove support for legacy ticket events [`#694`](https://github.com/nyaruka/temba-components/pull/694)
95
+
96
+ #### [v0.130.2](https://github.com/nyaruka/temba-components/compare/v0.130.1...v0.130.2)
97
+
98
+ > 22 September 2025
99
+
26
100
  - Add support for ticket events from the engine [`#693`](https://github.com/nyaruka/temba-components/pull/693)
27
101
  - First draft for rules editor [`#691`](https://github.com/nyaruka/temba-components/pull/691)
28
102
  - Show contact ref on details tab since it might be hidden by name if set [`#690`](https://github.com/nyaruka/temba-components/pull/690)
@@ -0,0 +1,400 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-GB">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>Floating Tab & Window Examples</title>
6
+ <link
7
+ href="/static/css/temba-components.css"
8
+ rel="stylesheet"
9
+ type="text/css"
10
+ />
11
+ <link
12
+ href="https://fonts.googleapis.com/css?family=Roboto+Mono:300|Roboto:300,400,500"
13
+ rel="stylesheet"
14
+ />
15
+ <link href="/demo/static/css/styles.css" rel="stylesheet" type="text/css" />
16
+ <style>
17
+ body {
18
+ min-height: 100vh;
19
+ position: relative;
20
+ }
21
+ .content {
22
+ padding: 20px;
23
+ max-width: 800px;
24
+
25
+ }
26
+ .phone-simulator {
27
+ padding: 30px;
28
+ position: relative;
29
+ }
30
+ .phone-frame {
31
+ border-radius: 40px;
32
+ border: 8px solid #1f2937;
33
+ box-shadow: 0 0px 30px rgba(0, 0, 0, 0.4);
34
+ background: #000;
35
+ position: relative;
36
+ overflow:hidden;
37
+
38
+ }
39
+ .phone-top {
40
+ position: absolute;
41
+ top: 0;
42
+ left: 0;
43
+ right: 0;
44
+ z-index: 10;
45
+ cursor: grab;
46
+ }
47
+ .phone-notch {
48
+ background: transparent;
49
+ height: 50px;
50
+ position: relative;
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: space-between;
54
+ padding: 0 20px;
55
+ }
56
+ .phone-notch::before {
57
+ content: '';
58
+ position: absolute;
59
+ top: 0;
60
+ left: 0;
61
+ right: 0;
62
+ height: 100%;
63
+ background: linear-gradient(to bottom, rgba(0, 0, 0, 0.4) 0%, rgba(0, 0, 0, 0.3) 50%, transparent 100%);
64
+ z-index: -1;
65
+ }
66
+ .dynamic-island {
67
+
68
+ top: 10px;
69
+ left: 50%;
70
+
71
+ width: 120px;
72
+ height: 30px;
73
+ background: #000;
74
+ border-radius: 20px;
75
+ z-index: 1;
76
+ }
77
+ .phone-notch .time {
78
+ color: #000;
79
+ font-size: 14px;
80
+ font-weight: 600;
81
+
82
+ }
83
+ .phone-notch .status-icons {
84
+ display: flex;
85
+ gap: 4px;
86
+ align-items: center;
87
+ }
88
+ .phone-notch .status-icons span {
89
+ color: #000;
90
+ font-size: 14px;
91
+ }
92
+ .phone-header {
93
+ background: transparent;
94
+ padding: 10px 15px;
95
+ display: flex;
96
+ align-items: center;
97
+ justify-content: flex-end;
98
+ cursor: move;
99
+ user-select: none;
100
+ border-bottom: none;
101
+ pointer-events: all;
102
+ }
103
+ .close-btn {
104
+ background: rgba(0, 0, 0, 0.5);
105
+ border-radius: 50%;
106
+ color: #fff;
107
+ border: none;
108
+ cursor: pointer;
109
+ padding: 0;
110
+ display: flex;
111
+ align-items: center;
112
+ justify-content: center;
113
+ width:29px;
114
+ }
115
+
116
+ .close-btn:hover {
117
+ color: rgba(0, 0, 0, 0.7);
118
+ }
119
+ .phone-screen {
120
+ background: white;
121
+ padding: 15px;
122
+ padding-top: 75px;
123
+ padding-bottom: 60px;
124
+ height:470px;
125
+ overflow-y: auto;
126
+ flex-direction: column-reverse;
127
+ display: flex;
128
+ }
129
+
130
+
131
+ .message {
132
+ padding: 10px 14px;
133
+ margin-bottom: 8px;
134
+ border-radius: 18px;
135
+ max-width: 70%;
136
+ font-size: 15px;
137
+ line-height: 1.4;
138
+ }
139
+ .message.incoming {
140
+ background: #e5e5ea;
141
+ color: #000;
142
+ margin-right: auto;
143
+ border-bottom-left-radius: 4px;
144
+ }
145
+ .message.outgoing {
146
+ background: #007aff;
147
+ color: white;
148
+ margin-left: auto;
149
+ text-align: left;
150
+ border-bottom-right-radius: 4px;
151
+ }
152
+ .message-input {
153
+ background: linear-gradient(to top, rgba(0, 0, 0, 0.1) 0%, rgba(0, 0, 0, 0.05) 70%, transparent 100%);
154
+ padding: 8px 16px;
155
+ border-top: none;
156
+ display: flex;
157
+ align-items: center;
158
+ gap: 8px;
159
+ position: absolute;
160
+ bottom: 0px;
161
+ left: 0px;
162
+ right: 0px;
163
+ z-index: 10;
164
+ }
165
+ .message-input input {
166
+ flex: 1;
167
+ border: 1px solid #c6c6c8;
168
+ border-radius: 20px;
169
+ padding: 8px 15px;
170
+ font-size: 15px;
171
+ margin-bottom:5px;
172
+ background: white;
173
+ border: none;
174
+ outline:none;
175
+ }
176
+ .message-input input::placeholder {
177
+ color: #8e8e93;
178
+ }
179
+ </style>
180
+ </head>
181
+ <body>
182
+ <div class="content">
183
+ <h1>Floating Tab & Window Examples</h1>
184
+ <p><a href="/demo/index.html">← Back to main demo</a></p>
185
+
186
+ <div class="example">
187
+ <h3>Phone Simulator</h3>
188
+ <p>
189
+ Click the green phone icon on the right to open a phone simulator
190
+ window. The window can be dragged around the screen.
191
+ </p>
192
+ <p>
193
+ Hover over the tab to see the label animate in. Click again to close
194
+ the window.
195
+ </p>
196
+ </div>
197
+
198
+ <div class="example">
199
+ <h3>Multiple Tabs</h3>
200
+ <p>
201
+ Multiple floating tabs can be displayed at once, each with different
202
+ colors and purposes.
203
+ </p>
204
+ <ul>
205
+ <li><strong>Phone (Green):</strong> Phone simulator window</li>
206
+ <li><strong>Clock (Purple):</strong> Revision history window</li>
207
+ <li><strong>Globe (Gray):</strong> Translation/localization window</li>
208
+ </ul>
209
+ </div>
210
+
211
+ <div class="example">
212
+ <h3>Usage</h3>
213
+ <pre><code>&lt;!-- Floating Tab --&gt;
214
+ &lt;temba-floating-tab
215
+ id="phone-tab"
216
+ icon="phone"
217
+ label="Phone Simulator"
218
+ color="#10b981"
219
+ top="100"
220
+ &gt;&lt;/temba-floating-tab&gt;
221
+
222
+ &lt;!-- Floating Window --&gt;
223
+ &lt;temba-floating-window
224
+ id="phone-window"
225
+ title="Phone Simulator"
226
+ width="250"
227
+ height="700"
228
+ top="100"
229
+ &gt;
230
+ &lt;!-- Your content here --&gt;
231
+ &lt;/temba-floating-window&gt;</code></pre>
232
+ </div>
233
+ </div>
234
+
235
+
236
+ <!-- Phone Simulator Tab & Window -->
237
+ <temba-floating-window
238
+ id="translation-window"
239
+ header="Flow Translation"
240
+ width="350"
241
+ height="600"
242
+ top="100"
243
+ color="#6b7280"
244
+ >
245
+ <div style="padding: 20px">
246
+ <h4 style="margin-top: 0">Translate Flow</h4>
247
+ <div style="display: flex; flex-direction: column; gap: 15px">
248
+ <div>
249
+ <label style="display: block; margin-bottom: 5px; font-weight: 500"
250
+ >Language</label
251
+ >
252
+ <select style="width: 100%; padding: 8px; border-radius: 4px; border: 1px solid #d1d5db">
253
+ <option>English</option>
254
+ <option>Spanish</option>
255
+ <option>French</option>
256
+ <option>Portuguese</option>
257
+ </select>
258
+ </div>
259
+ </div>
260
+ </div>
261
+ </temba-floating-window>
262
+
263
+ <temba-floating-window
264
+ id="phone-window"
265
+ width="375"
266
+ height="720"
267
+ top="60"
268
+ chromeless
269
+ >
270
+ <div class="phone-simulator">
271
+
272
+ <div class="phone-frame">
273
+ <div class="phone-top drag-handle">
274
+
275
+ <div class="phone-notch">
276
+ <div style="width:29px;"></div>
277
+ <div class="dynamic-island"></div>
278
+ <button class="close-btn" onclick="document.getElementById('phone-window').close()">
279
+ <temba-icon name="x" clickable size="2"></temba-icon>
280
+ </button>
281
+ </div>
282
+
283
+ </div>
284
+ <div class="phone-screen">
285
+ <div class="message outgoing">Always do!</div>
286
+ <div class="message incoming">Drive safe!</div>
287
+ <div class="message outgoing">Can't wait!</div>
288
+ <div class="message incoming">See you soon!</div>
289
+ <div class="message outgoing">On it!</div>
290
+ <div class="message incoming">Don't forget the salad dressing!</div>
291
+ <div class="message outgoing">Sure thing, see you soon!</div>
292
+ <div class="message incoming">Great! Also need some tomatoes.</div>
293
+ <div class="message outgoing">I got broccoli and asparagus</div>
294
+ <div class="message incoming">Can you buy some veggies on your way home?</div>
295
+ </div>
296
+ <div class="message-input">
297
+ <input type="text" placeholder="Enter Message"/>
298
+ </div>
299
+ </div>
300
+ </div>
301
+ </temba-floating-window>
302
+
303
+ <temba-floating-window
304
+ id="history-window"
305
+ header="Revision History"
306
+ width="300"
307
+ height="500"
308
+ top="100"
309
+ color="#8b5cf6"
310
+ >
311
+ <div style="padding: 20px">
312
+ <h4 style="margin-top: 0">Recent Changes</h4>
313
+ <ul style="list-style: none; padding: 0">
314
+ <li style="margin-bottom: 15px; padding: 10px; background: #f3f4f6; border-radius: 8px">
315
+ <strong>2 hours ago</strong><br />
316
+ Updated flow configuration
317
+ </li>
318
+ <li style="margin-bottom: 15px; padding: 10px; background: #f3f4f6; border-radius: 8px">
319
+ <strong>Yesterday</strong><br />
320
+ Added new message template
321
+ </li>
322
+ <li style="margin-bottom: 15px; padding: 10px; background: #f3f4f6; border-radius: 8px">
323
+ <strong>3 days ago</strong><br />
324
+ Modified contact fields
325
+ </li>
326
+ </ul>
327
+ </div>
328
+ </temba-floating-window>
329
+
330
+ <temba-floating-tab
331
+ id="phone-tab"
332
+ icon="simulator"
333
+ label="Phone Simulator"
334
+ color="#10b981"
335
+ ></temba-floating-tab>
336
+
337
+
338
+
339
+ <!-- History Tab & Window -->
340
+ <temba-floating-tab
341
+ id="history-tab"
342
+ icon="revisions"
343
+ label="Revision History"
344
+ color="#8b5cf6"
345
+ ></temba-floating-tab>
346
+
347
+
348
+
349
+ <!-- Translation Tab & Window -->
350
+ <temba-floating-tab
351
+ id="translation-tab"
352
+ icon="language"
353
+ label="Flow Translation"
354
+ color="#6b7280"
355
+ ></temba-floating-tab>
356
+
357
+
358
+
359
+ <script type="module">
360
+ import '/out-tsc/temba-modules.js';
361
+
362
+ // connect tabs to windows
363
+ const phoneTab = document.getElementById('phone-tab');
364
+ const phoneWindow = document.getElementById('phone-window');
365
+
366
+ const historyTab = document.getElementById('history-tab');
367
+ const historyWindow = document.getElementById('history-window');
368
+
369
+ const translationTab = document.getElementById('translation-tab');
370
+ const translationWindow = document.getElementById('translation-window');
371
+
372
+ // phone tab/window interaction
373
+ phoneTab.addEventListener('temba-button-clicked', () => {
374
+ phoneWindow.show();
375
+ });
376
+
377
+ phoneWindow.addEventListener('temba-dialog-hidden', () => {
378
+ phoneWindow.hide();
379
+ });
380
+
381
+ // history tab/window interaction
382
+ historyTab.addEventListener('temba-button-clicked', () => {
383
+ historyWindow.show();
384
+ });
385
+
386
+ historyWindow.addEventListener('temba-dialog-hidden', () => {
387
+ historyWindow.hide();
388
+ });
389
+
390
+ // translation tab/window interaction
391
+ translationTab.addEventListener('temba-button-clicked', () => {
392
+ translationWindow.show();
393
+ });
394
+
395
+ translationWindow.addEventListener('temba-dialog-hidden', () => {
396
+ translationWindow.hide();
397
+ });
398
+ </script>
399
+ </body>
400
+ </html>
@@ -144,7 +144,7 @@
144
144
 
145
145
  // Fallback function for known flows
146
146
  async function loadKnownFlows(container) {
147
- const knownFlows = ['sample-flow', 'food-order'];
147
+ const knownFlows = ['sample-flow', 'food-order', 'voicemail'];
148
148
  const flows = [];
149
149
 
150
150
  for (const flowId of knownFlows) {
@@ -45,8 +45,8 @@
45
45
  "type": "send_msg",
46
46
  "text": "Would you like chicken or fish?",
47
47
  "attachments": [
48
- "image/jpeg:http://localhost:9000/temba-attachments/816f8797-c929-47a8-a1ad-9a33f0123406-IMG_0917.jpeg",
49
- "image/jpeg:http://localhost:9000/temba-attachments/de0f23fc-2d71-4a93-90d3-729b1ad65cd2-IMG_3208.jpeg"
48
+ "image/jpeg:http://localhost:9000/temba-attachments/0b7acdd2-8563-4991-b3b4-abcb83aa4540-00001.jpg",
49
+ "image/jpeg:http://localhost:9000/temba-attachments/760f4437-e1b7-4de2-a728-1cbd35a59d35-2021-07-23 09.07.13.jpg"
50
50
  ],
51
51
  "quick_replies": [
52
52
  "Fish",