@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.
- package/.github/workflows/publish.yml +4 -1
- package/CHANGELOG.md +75 -1
- package/demo/components/floating-tabs/example.html +400 -0
- package/demo/components/flow/index.html +1 -1
- package/demo/data/flows/food-order.json +2 -2
- package/demo/data/flows/sample-flow.json +113 -125
- package/demo/data/flows/voicemail.json +613 -0
- package/demo/index.html +6 -0
- package/dist/locales/es.js +5 -5
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/fr.js +5 -5
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/locale-codes.js +11 -2
- package/dist/locales/locale-codes.js.map +1 -1
- package/dist/locales/pt.js +5 -5
- package/dist/locales/pt.js.map +1 -1
- package/dist/static/svg/index.svg +1 -1
- package/dist/temba-components.js +1773 -662
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/Icons.js +4 -1
- package/out-tsc/src/Icons.js.map +1 -1
- package/out-tsc/src/display/FloatingTab.js +167 -0
- package/out-tsc/src/display/FloatingTab.js.map +1 -0
- package/out-tsc/src/display/ProgressBar.js +22 -2
- package/out-tsc/src/display/ProgressBar.js.map +1 -1
- package/out-tsc/src/events.js.map +1 -1
- package/out-tsc/src/flow/CanvasMenu.js +200 -0
- package/out-tsc/src/flow/CanvasMenu.js.map +1 -0
- package/out-tsc/src/flow/CanvasNode.js +489 -47
- package/out-tsc/src/flow/CanvasNode.js.map +1 -1
- package/out-tsc/src/flow/Editor.js +1417 -67
- package/out-tsc/src/flow/Editor.js.map +1 -1
- package/out-tsc/src/flow/NodeEditor.js +479 -112
- package/out-tsc/src/flow/NodeEditor.js.map +1 -1
- package/out-tsc/src/flow/NodeTypeSelector.js +540 -0
- package/out-tsc/src/flow/NodeTypeSelector.js.map +1 -0
- package/out-tsc/src/flow/StickyNote.js +12 -3
- package/out-tsc/src/flow/StickyNote.js.map +1 -1
- package/out-tsc/src/flow/actions/add_contact_groups.js +4 -3
- package/out-tsc/src/flow/actions/add_contact_groups.js.map +1 -1
- package/out-tsc/src/flow/actions/add_contact_urn.js +63 -4
- package/out-tsc/src/flow/actions/add_contact_urn.js.map +1 -1
- package/out-tsc/src/flow/actions/add_input_labels.js +4 -3
- package/out-tsc/src/flow/actions/add_input_labels.js.map +1 -1
- package/out-tsc/src/flow/actions/play_audio.js +3 -2
- package/out-tsc/src/flow/actions/play_audio.js.map +1 -1
- package/out-tsc/src/flow/actions/remove_contact_groups.js +7 -5
- package/out-tsc/src/flow/actions/remove_contact_groups.js.map +1 -1
- package/out-tsc/src/flow/actions/request_optin.js +3 -2
- package/out-tsc/src/flow/actions/request_optin.js.map +1 -1
- package/out-tsc/src/flow/actions/say_msg.js +3 -2
- package/out-tsc/src/flow/actions/say_msg.js.map +1 -1
- package/out-tsc/src/flow/actions/send_broadcast.js +77 -23
- package/out-tsc/src/flow/actions/send_broadcast.js.map +1 -1
- package/out-tsc/src/flow/actions/send_email.js +5 -5
- package/out-tsc/src/flow/actions/send_email.js.map +1 -1
- package/out-tsc/src/flow/actions/send_msg.js +101 -21
- package/out-tsc/src/flow/actions/send_msg.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_channel.js +6 -9
- package/out-tsc/src/flow/actions/set_contact_channel.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_field.js +20 -20
- package/out-tsc/src/flow/actions/set_contact_field.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_language.js +3 -2
- package/out-tsc/src/flow/actions/set_contact_language.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_name.js +3 -12
- package/out-tsc/src/flow/actions/set_contact_name.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_status.js +3 -2
- package/out-tsc/src/flow/actions/set_contact_status.js.map +1 -1
- package/out-tsc/src/flow/actions/set_run_result.js +4 -3
- package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
- package/out-tsc/src/flow/actions/start_session.js +181 -6
- package/out-tsc/src/flow/actions/start_session.js.map +1 -1
- package/out-tsc/src/flow/config.js +11 -23
- package/out-tsc/src/flow/config.js.map +1 -1
- package/out-tsc/src/flow/currencies.js +45 -0
- package/out-tsc/src/flow/currencies.js.map +1 -0
- package/out-tsc/src/flow/nodes/shared-rules.js +257 -0
- package/out-tsc/src/flow/nodes/shared-rules.js.map +1 -0
- package/out-tsc/src/flow/nodes/shared.js +71 -0
- package/out-tsc/src/flow/nodes/shared.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_airtime.js +211 -5
- package/out-tsc/src/flow/nodes/split_by_airtime.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_contact_field.js +152 -3
- package/out-tsc/src/flow/nodes/split_by_contact_field.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_expression.js +73 -2
- package/out-tsc/src/flow/nodes/split_by_expression.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_groups.js +18 -10
- package/out-tsc/src/flow/nodes/split_by_groups.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_intent.js +8 -0
- package/out-tsc/src/flow/nodes/split_by_intent.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_llm.js +11 -3
- package/out-tsc/src/flow/nodes/split_by_llm.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_llm_categorize.js +10 -3
- package/out-tsc/src/flow/nodes/split_by_llm_categorize.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_random.js +10 -4
- package/out-tsc/src/flow/nodes/split_by_random.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_resthook.js +113 -0
- package/out-tsc/src/flow/nodes/split_by_resthook.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_run_result.js +211 -3
- package/out-tsc/src/flow/nodes/split_by_run_result.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_scheme.js +158 -2
- package/out-tsc/src/flow/nodes/split_by_scheme.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_subflow.js +13 -5
- package/out-tsc/src/flow/nodes/split_by_subflow.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_ticket.js +10 -3
- package/out-tsc/src/flow/nodes/split_by_ticket.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_webhook.js +10 -3
- package/out-tsc/src/flow/nodes/split_by_webhook.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_digits.js +3 -2
- package/out-tsc/src/flow/nodes/wait_for_digits.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_menu.js +3 -2
- package/out-tsc/src/flow/nodes/wait_for_menu.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_response.js +38 -568
- package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
- package/out-tsc/src/flow/types.js +86 -12
- package/out-tsc/src/flow/types.js.map +1 -1
- package/out-tsc/src/flow/utils.js +101 -14
- package/out-tsc/src/flow/utils.js.map +1 -1
- package/out-tsc/src/form/FieldRenderer.js +2 -4
- package/out-tsc/src/form/FieldRenderer.js.map +1 -1
- package/out-tsc/src/interfaces.js +3 -0
- package/out-tsc/src/interfaces.js.map +1 -1
- package/out-tsc/src/layout/FloatingWindow.js +346 -0
- package/out-tsc/src/layout/FloatingWindow.js.map +1 -0
- package/out-tsc/src/list/SortableList.js +98 -33
- package/out-tsc/src/list/SortableList.js.map +1 -1
- package/out-tsc/src/live/ContactChat.js +6 -25
- package/out-tsc/src/live/ContactChat.js.map +1 -1
- package/out-tsc/src/locales/es.js +5 -5
- package/out-tsc/src/locales/es.js.map +1 -1
- package/out-tsc/src/locales/fr.js +5 -5
- package/out-tsc/src/locales/fr.js.map +1 -1
- package/out-tsc/src/locales/locale-codes.js +11 -2
- package/out-tsc/src/locales/locale-codes.js.map +1 -1
- package/out-tsc/src/locales/pt.js +5 -5
- package/out-tsc/src/locales/pt.js.map +1 -1
- package/out-tsc/src/store/AppState.js +120 -0
- package/out-tsc/src/store/AppState.js.map +1 -1
- package/out-tsc/src/utils.js +254 -13
- package/out-tsc/src/utils.js.map +1 -1
- package/out-tsc/temba-modules.js +8 -0
- package/out-tsc/temba-modules.js.map +1 -1
- package/out-tsc/test/ActionHelper.js +3 -3
- package/out-tsc/test/ActionHelper.js.map +1 -1
- package/out-tsc/test/NodeHelper.js +6 -3
- package/out-tsc/test/NodeHelper.js.map +1 -1
- package/out-tsc/test/actions/add_contact_urn.test.js +202 -0
- package/out-tsc/test/actions/add_contact_urn.test.js.map +1 -0
- package/out-tsc/test/actions/send_broadcast.test.js +148 -0
- package/out-tsc/test/actions/send_broadcast.test.js.map +1 -0
- package/out-tsc/test/actions/send_email.test.js +17 -23
- package/out-tsc/test/actions/send_email.test.js.map +1 -1
- package/out-tsc/test/actions/send_msg.test.js +33 -15
- package/out-tsc/test/actions/send_msg.test.js.map +1 -1
- package/out-tsc/test/actions/start_session.test.js +116 -0
- package/out-tsc/test/actions/start_session.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_airtime.test.js +604 -0
- package/out-tsc/test/nodes/split_by_airtime.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_contact_field.test.js +387 -0
- package/out-tsc/test/nodes/split_by_contact_field.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_expression.test.js +614 -0
- package/out-tsc/test/nodes/split_by_expression.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_random.test.js +3 -3
- package/out-tsc/test/nodes/split_by_random.test.js.map +1 -1
- package/out-tsc/test/nodes/split_by_resthook.test.js +337 -0
- package/out-tsc/test/nodes/split_by_resthook.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_run_result.test.js +920 -0
- package/out-tsc/test/nodes/split_by_run_result.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_scheme.test.js +399 -0
- package/out-tsc/test/nodes/split_by_scheme.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_subflow.test.js +333 -0
- package/out-tsc/test/nodes/split_by_subflow.test.js.map +1 -0
- package/out-tsc/test/nodes/wait_for_digits.test.js +2 -2
- package/out-tsc/test/nodes/wait_for_digits.test.js.map +1 -1
- package/out-tsc/test/nodes/wait_for_response.test.js +2 -1
- package/out-tsc/test/nodes/wait_for_response.test.js.map +1 -1
- package/out-tsc/test/temba-action-drag-between-nodes.test.js +252 -0
- package/out-tsc/test/temba-action-drag-between-nodes.test.js.map +1 -0
- package/out-tsc/test/temba-canvas-menu.test.js +122 -0
- package/out-tsc/test/temba-canvas-menu.test.js.map +1 -0
- package/out-tsc/test/temba-floating-tab.test.js +91 -0
- package/out-tsc/test/temba-floating-tab.test.js.map +1 -0
- package/out-tsc/test/temba-floating-window.test.js +301 -0
- package/out-tsc/test/temba-floating-window.test.js.map +1 -0
- package/out-tsc/test/temba-flow-editor-node.test.js +202 -2
- package/out-tsc/test/temba-flow-editor-node.test.js.map +1 -1
- package/out-tsc/test/temba-flow-editor.test.js +7 -8
- package/out-tsc/test/temba-flow-editor.test.js.map +1 -1
- package/out-tsc/test/temba-localization.test.js +471 -0
- package/out-tsc/test/temba-localization.test.js.map +1 -0
- package/out-tsc/test/temba-node-editor.test.js +3 -1
- package/out-tsc/test/temba-node-editor.test.js.map +1 -1
- package/out-tsc/test/temba-node-type-selector.test.js +265 -0
- package/out-tsc/test/temba-node-type-selector.test.js.map +1 -0
- package/out-tsc/test/temba-omnibox.test.js +2 -1
- package/out-tsc/test/temba-omnibox.test.js.map +1 -1
- package/out-tsc/test/temba-sortable-list.test.js +51 -0
- package/out-tsc/test/temba-sortable-list.test.js.map +1 -1
- package/out-tsc/test/temba-utils-index.test.js +1 -27
- package/out-tsc/test/temba-utils-index.test.js.map +1 -1
- package/out-tsc/test/utils.test.js +20 -0
- package/out-tsc/test/utils.test.js.map +1 -1
- package/package.json +2 -1
- package/screenshots/truth/actions/add_contact_groups/editor/descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/long-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/many-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/multiple-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/single-group.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/long-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/many-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/multiple-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/single-group.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/expression-facebook.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/expression-phone.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/facebook-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/instagram-handle.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/line-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/phone-number.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/telegram-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/viber-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/wechat-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/whatsapp.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/expression-facebook.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/expression-phone.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/facebook-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/instagram-handle.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/line-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/phone-number.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/telegram-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/viber-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/wechat-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/whatsapp.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/cleanup-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/long-descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/many-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/multiple-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/remove-from-all-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/single-group.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/cleanup-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/long-descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/many-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/multiple-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/remove-from-all-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/single-group.png +0 -0
- package/screenshots/truth/actions/send_broadcast/editor/contacts-only.png +0 -0
- package/screenshots/truth/actions/send_broadcast/editor/groups-and-contacts.png +0 -0
- package/screenshots/truth/actions/send_broadcast/editor/groups-only.png +0 -0
- package/screenshots/truth/actions/send_broadcast/editor/many-groups.png +0 -0
- package/screenshots/truth/actions/send_broadcast/editor/multiline-text.png +0 -0
- package/screenshots/truth/actions/send_broadcast/editor/with-attachments.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/contacts-only.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/groups-and-contacts.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/groups-only.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/many-groups.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/multiline-text.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/with-attachments.png +0 -0
- package/screenshots/truth/actions/send_email/editor/complex-business-email.png +0 -0
- package/screenshots/truth/actions/send_email/editor/empty-body.png +0 -0
- package/screenshots/truth/actions/send_email/editor/empty-subject.png +0 -0
- package/screenshots/truth/actions/send_email/editor/long-subject.png +0 -0
- package/screenshots/truth/actions/send_email/editor/multiline-body.png +0 -0
- package/screenshots/truth/actions/send_email/editor/multiple-recipients.png +0 -0
- package/screenshots/truth/actions/send_email/editor/simple-email.png +0 -0
- package/screenshots/truth/actions/send_email/editor/with-expressions.png +0 -0
- package/screenshots/truth/actions/send_email/render/complex-business-email.png +0 -0
- package/screenshots/truth/actions/send_email/render/empty-body.png +0 -0
- package/screenshots/truth/actions/send_email/render/empty-subject.png +0 -0
- package/screenshots/truth/actions/send_email/render/long-subject.png +0 -0
- package/screenshots/truth/actions/send_email/render/multiline-body.png +0 -0
- package/screenshots/truth/actions/send_email/render/multiple-recipients.png +0 -0
- package/screenshots/truth/actions/send_email/render/simple-email.png +0 -0
- package/screenshots/truth/actions/send_email/render/with-expressions.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/long-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/multiline-text-with-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/simple-text.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-linebreaks.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-many-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-without-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/long-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/multiline-text-with-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/simple-text.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-linebreaks.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-many-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-without-quick-replies.png +0 -0
- package/screenshots/truth/actions/start_session/editor/contact-query.png +0 -0
- package/screenshots/truth/actions/start_session/editor/contacts-only.png +0 -0
- package/screenshots/truth/actions/start_session/editor/create-contact.png +0 -0
- package/screenshots/truth/actions/start_session/editor/groups-and-contacts.png +0 -0
- package/screenshots/truth/actions/start_session/editor/groups-only.png +0 -0
- package/screenshots/truth/actions/start_session/editor/many-recipients.png +0 -0
- package/screenshots/truth/actions/start_session/render/contact-query.png +0 -0
- package/screenshots/truth/actions/start_session/render/contacts-only.png +0 -0
- package/screenshots/truth/actions/start_session/render/create-contact.png +0 -0
- package/screenshots/truth/actions/start_session/render/groups-and-contacts.png +0 -0
- package/screenshots/truth/actions/start_session/render/groups-only.png +0 -0
- package/screenshots/truth/actions/start_session/render/many-recipients.png +0 -0
- package/screenshots/truth/canvas-menu/open.png +0 -0
- package/screenshots/truth/editor/router.png +0 -0
- package/screenshots/truth/editor/wait.png +0 -0
- package/screenshots/truth/floating-tab/default.png +0 -0
- package/screenshots/truth/floating-tab/gray.png +0 -0
- package/screenshots/truth/floating-tab/green.png +0 -0
- package/screenshots/truth/floating-tab/hidden.png +0 -0
- package/screenshots/truth/floating-tab/hover.png +0 -0
- package/screenshots/truth/floating-tab/purple.png +0 -0
- package/screenshots/truth/floating-window/chromeless.png +0 -0
- package/screenshots/truth/floating-window/custom-size.png +0 -0
- package/screenshots/truth/floating-window/default.png +0 -0
- package/screenshots/truth/floating-window/with-header.png +0 -0
- package/screenshots/truth/list/fields-dragging.png +0 -0
- package/screenshots/truth/list/sortable-dragging.png +0 -0
- package/screenshots/truth/node-type-selector/action-mode.png +0 -0
- package/screenshots/truth/node-type-selector/split-mode.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/information-extraction.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/sentiment-analysis.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/summarization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/translation-task.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/information-extraction.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/sentiment-analysis.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/summarization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/translation-task.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/basic-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/custom-input-and-result-name.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/many-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/minimal-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/basic-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/custom-input-and-result-name.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/many-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/minimal-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/ab-test-multiple-variants.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/sampling-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/three-way-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/two-bucket-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/ab-test-multiple-variants.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/sampling-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/three-way-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/two-bucket-split.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/basic-digits-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/phone-number-collection.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/single-digit-with-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/verification-code.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/basic-digits-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/phone-number-collection.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/single-digit-with-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/verification-code.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/basic-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/custom-result-name.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/no-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/short-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/basic-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/custom-result-name.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/no-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/short-timeout.png +0 -0
- package/src/Icons.ts +4 -1
- package/src/display/FloatingTab.ts +174 -0
- package/src/display/ProgressBar.ts +22 -2
- package/src/events.ts +2 -8
- package/src/flow/CanvasMenu.ts +217 -0
- package/src/flow/CanvasNode.ts +596 -40
- package/src/flow/Editor.ts +1721 -45
- package/src/flow/NodeEditor.ts +621 -144
- package/src/flow/NodeTypeSelector.ts +636 -0
- package/src/flow/StickyNote.ts +12 -3
- package/src/flow/actions/add_contact_groups.ts +5 -4
- package/src/flow/actions/add_contact_urn.ts +78 -4
- package/src/flow/actions/add_input_labels.ts +5 -4
- package/src/flow/actions/play_audio.ts +3 -2
- package/src/flow/actions/remove_contact_groups.ts +16 -6
- package/src/flow/actions/request_optin.ts +3 -2
- package/src/flow/actions/say_msg.ts +3 -2
- package/src/flow/actions/send_broadcast.ts +86 -23
- package/src/flow/actions/send_email.ts +12 -6
- package/src/flow/actions/send_msg.ts +155 -34
- package/src/flow/actions/set_contact_channel.ts +6 -11
- package/src/flow/actions/set_contact_field.ts +21 -25
- package/src/flow/actions/set_contact_language.ts +11 -4
- package/src/flow/actions/set_contact_name.ts +4 -15
- package/src/flow/actions/set_contact_status.ts +4 -3
- package/src/flow/actions/set_run_result.ts +5 -4
- package/src/flow/actions/start_session.ts +210 -6
- package/src/flow/config.ts +11 -23
- package/src/flow/currencies.ts +51 -0
- package/src/flow/nodes/shared-rules.ts +301 -0
- package/src/flow/nodes/shared.ts +87 -0
- package/src/flow/nodes/split_by_airtime.ts +255 -5
- package/src/flow/nodes/split_by_contact_field.ts +195 -3
- package/src/flow/nodes/split_by_expression.ts +104 -2
- package/src/flow/nodes/split_by_groups.ts +26 -11
- package/src/flow/nodes/split_by_intent.ts +8 -0
- package/src/flow/nodes/split_by_llm.ts +22 -4
- package/src/flow/nodes/split_by_llm_categorize.ts +22 -5
- package/src/flow/nodes/split_by_random.ts +16 -6
- package/src/flow/nodes/split_by_resthook.ts +140 -0
- package/src/flow/nodes/split_by_run_result.ts +259 -3
- package/src/flow/nodes/split_by_scheme.ts +202 -2
- package/src/flow/nodes/split_by_subflow.ts +17 -5
- package/src/flow/nodes/split_by_ticket.ts +15 -4
- package/src/flow/nodes/split_by_webhook.ts +17 -6
- package/src/flow/nodes/wait_for_digits.ts +3 -2
- package/src/flow/nodes/wait_for_menu.ts +3 -2
- package/src/flow/nodes/wait_for_response.ts +59 -680
- package/src/flow/types.ts +156 -23
- package/src/flow/utils.ts +108 -14
- package/src/form/FieldRenderer.ts +2 -4
- package/src/interfaces.ts +3 -0
- package/src/layout/FloatingWindow.ts +386 -0
- package/src/list/SortableList.ts +109 -34
- package/src/live/ContactChat.ts +7 -25
- package/src/locales/es.ts +18 -13
- package/src/locales/fr.ts +18 -13
- package/src/locales/locale-codes.ts +11 -2
- package/src/locales/pt.ts +18 -13
- package/src/store/AppState.ts +173 -0
- package/src/store/flow-definition.d.ts +2 -5
- package/src/utils.ts +332 -12
- package/static/api/channels.json +46 -0
- package/static/api/llms.json +18 -0
- package/static/api/resthooks.json +31 -0
- package/static/svg/index.svg +1 -1
- package/static/svg/work/traced/lightning-02.svg +1 -0
- package/static/svg/work/used/lightning-02.svg +3 -0
- package/temba-modules.ts +8 -0
- package/test/ActionHelper.ts +3 -3
- package/test/NodeHelper.ts +6 -3
- package/test/actions/add_contact_urn.test.ts +287 -0
- package/test/actions/send_broadcast.test.ts +190 -0
- package/test/actions/send_email.test.ts +17 -23
- package/test/actions/send_msg.test.ts +39 -15
- package/test/actions/start_session.test.ts +151 -0
- package/test/nodes/split_by_airtime.test.ts +673 -0
- package/test/nodes/split_by_contact_field.test.ts +451 -0
- package/test/nodes/split_by_expression.test.ts +751 -0
- package/test/nodes/split_by_random.test.ts +3 -3
- package/test/nodes/split_by_resthook.test.ts +398 -0
- package/test/nodes/split_by_run_result.test.ts +1109 -0
- package/test/nodes/split_by_scheme.test.ts +486 -0
- package/test/nodes/split_by_subflow.test.ts +381 -0
- package/test/nodes/wait_for_digits.test.ts +2 -2
- package/test/nodes/wait_for_response.test.ts +2 -1
- package/test/temba-action-drag-between-nodes.test.ts +301 -0
- package/test/temba-canvas-menu.test.ts +156 -0
- package/test/temba-floating-tab.test.ts +110 -0
- package/test/temba-floating-window.test.ts +477 -0
- package/test/temba-flow-editor-node.test.ts +246 -2
- package/test/temba-flow-editor.test.ts +7 -8
- package/test/temba-localization.test.ts +611 -0
- package/test/temba-node-editor.test.ts +3 -1
- package/test/temba-node-type-selector.test.ts +355 -0
- package/test/temba-omnibox.test.ts +2 -1
- package/test/temba-sortable-list.test.ts +69 -0
- package/test/temba-utils-index.test.ts +0 -35
- package/test/utils.test.ts +22 -0
- package/test-assets/contacts/history.json +14 -21
- package/test-assets/select/llms.json +2 -2
- package/web-dev-server.config.mjs +49 -1
- package/web-test-runner.config.mjs +0 -1
- package/out-tsc/src/flow/actions/call_classifier.js +0 -11
- package/out-tsc/src/flow/actions/call_classifier.js.map +0 -1
- package/out-tsc/src/flow/actions/call_resthook.js +0 -11
- package/out-tsc/src/flow/actions/call_resthook.js.map +0 -1
- package/out-tsc/src/flow/actions/split_by_expression_example.js +0 -77
- package/out-tsc/src/flow/actions/split_by_expression_example.js.map +0 -1
- package/out-tsc/src/flow/actions/transfer_airtime.js +0 -11
- package/out-tsc/src/flow/actions/transfer_airtime.js.map +0 -1
- package/out-tsc/src/flow/nodes/wait_for_audio.js +0 -7
- package/out-tsc/src/flow/nodes/wait_for_audio.js.map +0 -1
- package/out-tsc/src/flow/nodes/wait_for_image.js +0 -7
- package/out-tsc/src/flow/nodes/wait_for_image.js.map +0 -1
- package/out-tsc/src/flow/nodes/wait_for_location.js +0 -7
- package/out-tsc/src/flow/nodes/wait_for_location.js.map +0 -1
- package/out-tsc/src/flow/nodes/wait_for_video.js +0 -7
- package/out-tsc/src/flow/nodes/wait_for_video.js.map +0 -1
- package/src/flow/actions/call_classifier.ts +0 -12
- package/src/flow/actions/call_resthook.ts +0 -12
- package/src/flow/actions/split_by_expression_example.ts +0 -88
- package/src/flow/actions/transfer_airtime.ts +0 -12
- package/src/flow/nodes/wait_for_audio.ts +0 -7
- package/src/flow/nodes/wait_for_image.ts +0 -7
- package/src/flow/nodes/wait_for_location.ts +0 -7
- package/src/flow/nodes/wait_for_video.ts +0 -7
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.
|
|
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><!-- Floating Tab -->
|
|
214
|
+
<temba-floating-tab
|
|
215
|
+
id="phone-tab"
|
|
216
|
+
icon="phone"
|
|
217
|
+
label="Phone Simulator"
|
|
218
|
+
color="#10b981"
|
|
219
|
+
top="100"
|
|
220
|
+
></temba-floating-tab>
|
|
221
|
+
|
|
222
|
+
<!-- Floating Window -->
|
|
223
|
+
<temba-floating-window
|
|
224
|
+
id="phone-window"
|
|
225
|
+
title="Phone Simulator"
|
|
226
|
+
width="250"
|
|
227
|
+
height="700"
|
|
228
|
+
top="100"
|
|
229
|
+
>
|
|
230
|
+
<!-- Your content here -->
|
|
231
|
+
</temba-floating-window></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/
|
|
49
|
-
"image/jpeg:http://localhost:9000/temba-attachments/
|
|
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",
|