From 6507eaef69547236246766818aa6aa6038df3be3 Mon Sep 17 00:00:00 2001 From: Baptiste Arnaud Date: Tue, 21 Feb 2023 14:35:44 +0100 Subject: [PATCH] :sparkles: Introduce bot v2 in builder Also the new engine is the default for updated typebots for viewer --- apps/builder/next.config.js | 8 +- apps/builder/package.json | 15 +- apps/builder/public/bots/onboarding-dark.json | 346 ++++++----------- apps/builder/public/bots/onboarding.json | 356 +++++++---------- apps/builder/public/templates/faq.json | 2 +- apps/builder/public/templates/lead-gen.json | 5 +- apps/builder/src/assets/styles/codeMirror.css | 9 - apps/builder/src/components/CodeEditor.tsx | 174 ++++----- apps/builder/src/components/ColorPicker.tsx | 4 +- apps/builder/src/components/Seo.tsx | 4 - apps/builder/src/components/SupportBubble.tsx | 54 ++- .../components/inputs/SmartNumberInput.tsx | 1 + apps/builder/src/features/auth/constants.ts | 6 +- .../blocks/bubbles/audio/audio.spec.ts | 3 +- .../blocks/bubbles/embed/embed.spec.ts | 8 +- .../blocks/bubbles/image/image.spec.ts | 6 +- .../bubbles/textBubble/textBubble.spec.ts | 21 +- .../blocks/bubbles/video/video.spec.ts | 12 +- .../blocks/inputs/buttons/buttons.spec.ts | 29 +- .../features/blocks/inputs/date/date.spec.ts | 46 +-- .../inputs/emailInput/emailInput.spec.ts | 23 +- .../components/FileInputSettings.tsx | 2 +- .../inputs/fileUpload/fileUpload.spec.ts | 25 +- .../blocks/inputs/number/number.spec.ts | 11 +- .../blocks/inputs/payment/payment.spec.ts | 9 +- .../blocks/inputs/phone/phone.spec.ts | 26 +- .../blocks/inputs/rating/rating.spec.ts | 25 +- .../blocks/inputs/textInput/textInput.spec.ts | 9 +- .../features/blocks/inputs/url/url.spec.ts | 23 +- .../integrations/chatwoot/chatwoot.spec.ts | 2 +- .../googleSheets/googleSheets.spec.ts | 65 ++-- .../SendEmailSettings/SendEmailSettings.tsx | 2 +- .../sendEmail/queries/sendEmail.spec.ts | 3 +- .../WebhookSettings/WebhookSettings.tsx | 4 +- .../blocks/logic/condition/condition.spec.ts | 22 +- .../blocks/logic/redirect/redirect.spec.ts | 5 +- .../script/components/ScriptSettings.tsx | 4 +- .../blocks/logic/script/script.spec.ts | 3 +- .../components/SetVariableSettings.tsx | 4 +- .../logic/setVariable/setVariable.spec.ts | 12 +- .../logic/typebotLink/typebotLink.spec.ts | 17 +- .../features/blocks/logic/wait/wait.spec.ts | 11 +- .../features/dashboard/api/parseNewTypebot.ts | 1 + .../dashboard/components/OnboardingModal.tsx | 133 +++---- .../dashboard/queries/importTypebotQuery.ts | 1 + .../editor/components/PreviewDrawer.tsx | 65 ++-- .../TypebotHeader/TypebotHeader.tsx | 4 +- .../src/features/editor/editor.spec.ts | 7 +- .../folders/components/FolderContent.tsx | 13 +- .../components/Nodes/BlockNode/BlockNode.tsx | 6 +- .../components/Nodes/GroupNode/GroupNode.tsx | 2 + .../graph/providers/GraphProvider.tsx | 10 + .../publish/components/PublishButton.tsx | 13 +- .../publish/components/embeds/EmbedButton.tsx | 3 +- .../publish/components/embeds/EmbedModal.tsx | 77 ++++ .../embeds/EmbedTypeMenu/BubbleMenuButton.tsx | 33 ++ .../embeds/EmbedTypeMenu/EmbedTypeMenu.tsx | 18 + .../embeds/EmbedTypeMenu/PopupMenuButton.tsx | 35 ++ .../EmbedTypeMenu/StandardMenuButton.tsx | 33 ++ .../illustrations/BubbleIllustration.tsx | 77 ++++ .../illustrations/PopupIllustration.tsx | 75 ++++ .../illustrations/StandardIllustration.tsx | 79 ++++ .../illustrations/animationVariants.ts | 8 + .../embeds/codeSnippets/Chat/EmbedCode.tsx | 41 -- .../codeSnippets/Chat/EmbedSettings.tsx | 223 ----------- .../codeSnippets/Container/EmbedCode.tsx | 59 --- .../codeSnippets/Container/EmbedSettings.tsx | 120 ------ .../embeds/codeSnippets/Popup/EmbedCode.tsx | 37 -- .../codeSnippets/Popup/EmbedSettings.tsx | 66 ---- .../embeds/codeSnippets/ReactCode.tsx | 161 -------- .../components/embeds/codeSnippets/params.ts | 140 ------- .../embeds/modals/ChooseEmbedTypeList.tsx | 155 -------- .../modals/GtmModal/GtmInstructions.tsx | 132 ------- .../embeds/modals/GtmModal/GtmModal.tsx | 30 ++ .../embeds/modals/GtmModal/index.ts | 1 + .../embeds/modals/GtmModal/index.tsx | 70 ---- .../instructions/GtmBubbleInstructions.tsx | 45 +++ .../GtmModal/instructions/GtmInstructions.tsx | 22 ++ .../instructions/GtmPopupInstructions.tsx | 30 ++ .../instructions/GtmStandardInstructions.tsx | 62 +++ .../modals/{ => IframeModal}/IframeModal.tsx | 23 +- .../IframeModal/IframeSnippet.tsx} | 15 +- .../Javascript/JavascriptBubbleSnippet.tsx | 36 ++ .../Javascript/JavascriptInstructions.tsx | 89 ----- .../modals/Javascript/JavascriptModal.tsx | 66 +--- .../Javascript/JavascriptPopupSnippet.tsx | 33 ++ .../Javascript/JavascriptStandardSnippet.tsx | 51 +++ .../JavascriptBubbleInstructions.tsx | 43 +++ .../instructions/JavascriptInstructions.tsx | 23 ++ .../JavascriptPopupInstructions.tsx | 20 + .../JavascriptStandardInstructions.tsx | 26 ++ .../components/embeds/modals/NotionModal.tsx | 38 +- .../components/embeds/modals/OtherModal.tsx | 25 ++ .../React/InstallReactPackageSnippet.tsx | 11 + .../modals/React/ReactBubbleSnippet.tsx | 31 ++ .../embeds/modals/React/ReactInstructions.tsx | 95 ----- .../embeds/modals/React/ReactModal.tsx | 66 +--- .../embeds/modals/React/ReactPopupSnippet.tsx | 29 ++ .../modals/React/ReactStandardSnippet.tsx | 28 ++ .../instructions/ReactBubbleInstructions.tsx | 42 +++ .../React/instructions/ReactInstructions.tsx | 21 ++ .../instructions/ReactPopupInstructions.tsx | 30 ++ .../ReactStandardInstructions.tsx | 36 ++ .../ShopifyModal/ShopifyInstructions.tsx | 146 ------- .../modals/ShopifyModal/ShopifyModal.tsx | 30 ++ .../embeds/modals/ShopifyModal/index.ts | 1 + .../embeds/modals/ShopifyModal/index.tsx | 70 ---- .../ShopifyBubbleInstructions.tsx | 47 +++ .../instructions/ShopifyInstructions.tsx | 25 ++ .../instructions/ShopifyPopupInstructions.tsx | 31 ++ .../ShopifyStandardInstructions.tsx | 65 ++++ .../WebflowModal/WebflowInstructions.tsx | 91 ----- .../modals/WebflowModal/WebflowModal.tsx | 26 ++ .../embeds/modals/WebflowModal/index.ts | 1 + .../embeds/modals/WebflowModal/index.tsx | 65 ---- .../WebflowBubbleInstructions.tsx | 46 +++ .../instructions/WebflowInstructions.tsx | 21 ++ .../instructions/WebflowPopupInstructions.tsx | 30 ++ .../WebflowStandardInstructions.tsx | 19 + .../modals/WixModal/WixInstructions.tsx | 105 ------ .../embeds/modals/WixModal/WixModal.tsx | 26 ++ .../embeds/modals/WixModal/index.ts | 1 + .../embeds/modals/WixModal/index.tsx | 65 ---- .../instructions/WixBubbleInstructions.tsx | 49 +++ .../WixModal/instructions/WixInstructions.tsx | 21 ++ .../instructions/WixPopupInstructions.tsx | 33 ++ .../instructions/WixStandardInstuctions.tsx | 23 ++ .../embeds/modals/WordpressModal.tsx | 80 ---- .../modals/WordpressModal/WordpressModal.tsx | 30 ++ .../embeds/modals/WordpressModal/index.ts | 1 + .../WordpressBubbleInstructions.tsx | 74 ++++ .../instructions/WordpressInstructions.tsx | 22 ++ .../WordpressPopupInstructions.tsx | 55 +++ .../WordpressStandardInstructions.tsx | 80 ++++ .../components/embeds/modals/index.tsx | 2 +- .../BubbleSettings/BubbleSettings.tsx | 96 +++++ .../BubbleSettings/ButtonThemeSettings.tsx | 65 ++++ .../BubbleSettings/PreviewMessageSettings.tsx | 121 ++++++ .../PreviewMessageThemeSettings.tsx | 80 ++++ .../settings/BubbleSettings/ThemeSettings.tsx | 68 ++++ .../embeds/settings/PopupSettings.tsx | 54 +++ .../embeds/settings/StandardSettings.tsx | 107 ++++++ .../embeds/snippetParsers/bubble.ts | 162 ++++++++ .../components/embeds/snippetParsers/index.ts | 4 + .../components/embeds/snippetParsers/popup.ts | 77 ++++ .../embeds/snippetParsers/shared.ts | 32 ++ .../embeds/snippetParsers/standard.ts | 21 ++ apps/builder/src/features/publish/utils.ts | 2 + .../settings/components/SettingsPage.tsx | 15 +- .../src/features/settings/settings.spec.ts | 23 +- .../templates/components/TemplatesModal.tsx | 17 +- .../templates/components/TemplatesPage.tsx | 2 +- .../src/features/templates/templates.spec.ts | 5 +- .../CustomCssSettings/CustomCssSettings.tsx | 2 +- .../features/theme/components/ThemePage.tsx | 17 +- .../theme/components/ThemeSideMenu.tsx | 1 + apps/builder/src/features/theme/theme.spec.ts | 74 ++-- apps/builder/src/lib/googleSheets.ts | 2 +- apps/builder/src/pages/_app.tsx | 1 - .../src/pages/api/typebots/[typebotId].ts | 4 + .../typebots/integrations/googleSheets.json | 3 +- .../integrations/googleSheetsGet.json | 3 +- apps/builder/src/test/utils/selectorUtils.ts | 4 +- .../docs/editor/blocks/logic/set-variable.md | 2 +- apps/docs/docs/editor/variables.mdx | 6 +- apps/docs/docs/embed/html-javascript.md | 23 +- apps/docs/docs/embed/wordpress.md | 67 +--- .../img/embeddings/wordpress-preview.png | Bin 279041 -> 201136 bytes apps/viewer/src/components/TypebotPage.tsx | 161 -------- apps/viewer/src/components/TypebotPageV2.tsx | 169 +++++++-- apps/viewer/src/components/TypebotPageV3.tsx | 50 +++ .../inputs/fileUpload/fileUpload.spec.ts | 21 +- .../inputs/fileUpload/fileUploadV2.spec.ts | 117 ------ .../integrations/chatwoot/chatwoot.spec.ts | 3 +- .../integrations/chatwoot/chatwootV2.spec.ts | 30 -- .../integrations/sendEmail/sendEmail.spec.ts | 20 +- .../sendEmail/sendEmailV2.spec.ts | 40 -- .../integrations/webhook/webhook.spec.ts | 219 +++-------- .../integrations/webhook/webhookV2.spec.ts | 67 ---- .../logic/typebotLink/typebotLink.spec.ts | 16 +- .../logic/typebotLink/typebotLinkV2.spec.ts | 30 -- .../src/features/results/results.spec.ts | 36 +- .../src/features/results/resultsV2.spec.ts | 27 -- .../src/features/settings/settings.spec.ts | 72 ++-- .../src/features/settings/settingsV2.spec.ts | 179 --------- apps/viewer/src/features/usage/usage.spec.ts | 9 +- .../viewer/src/features/usage/usageV2.spec.ts | 70 ---- .../src/features/variables/variables.spec.ts | 13 +- .../features/variables/variablesV2.spec.ts | 21 -- apps/viewer/src/pages/[[...publicId]].tsx | 26 +- .../viewer/src/pages/next/[[...publicId]].tsx | 71 ---- packages/db/mysql/schema.prisma | 2 + packages/db/package.json | 2 +- .../migration.sql | 11 + packages/db/postgresql/schema.prisma | 2 + packages/models/features/publicTypebot.ts | 1 + packages/models/features/typebot/typebot.ts | 2 +- packages/utils/playwright/databaseActions.ts | 1 + packages/utils/playwright/databaseHelpers.ts | 2 + packages/utils/typebotConversions.ts | 15 - packages/wordpress/trunk/README.txt | 5 +- .../trunk/admin/class-typebot-admin.php | 63 +--- .../wordpress/trunk/admin/css/bulma.min.css | 1 - .../admin/partials/typebot-admin-display.php | 272 ++----------- .../trunk/includes/class-typebot.php | 2 +- .../trunk/public/class-typebot-public.php | 294 ++------------- packages/wordpress/trunk/typebot.php | 4 +- pnpm-lock.yaml | 357 ++++++++++++++++-- 208 files changed, 4325 insertions(+), 5099 deletions(-) delete mode 100644 apps/builder/src/assets/styles/codeMirror.css create mode 100644 apps/builder/src/features/publish/components/embeds/EmbedModal.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/EmbedTypeMenu/BubbleMenuButton.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/EmbedTypeMenu/EmbedTypeMenu.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/EmbedTypeMenu/PopupMenuButton.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/EmbedTypeMenu/StandardMenuButton.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/EmbedTypeMenu/illustrations/BubbleIllustration.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/EmbedTypeMenu/illustrations/PopupIllustration.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/EmbedTypeMenu/illustrations/StandardIllustration.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/EmbedTypeMenu/illustrations/animationVariants.ts delete mode 100644 apps/builder/src/features/publish/components/embeds/codeSnippets/Chat/EmbedCode.tsx delete mode 100644 apps/builder/src/features/publish/components/embeds/codeSnippets/Chat/EmbedSettings.tsx delete mode 100644 apps/builder/src/features/publish/components/embeds/codeSnippets/Container/EmbedCode.tsx delete mode 100644 apps/builder/src/features/publish/components/embeds/codeSnippets/Container/EmbedSettings.tsx delete mode 100644 apps/builder/src/features/publish/components/embeds/codeSnippets/Popup/EmbedCode.tsx delete mode 100644 apps/builder/src/features/publish/components/embeds/codeSnippets/Popup/EmbedSettings.tsx delete mode 100644 apps/builder/src/features/publish/components/embeds/codeSnippets/ReactCode.tsx delete mode 100644 apps/builder/src/features/publish/components/embeds/codeSnippets/params.ts delete mode 100644 apps/builder/src/features/publish/components/embeds/modals/ChooseEmbedTypeList.tsx delete mode 100644 apps/builder/src/features/publish/components/embeds/modals/GtmModal/GtmInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/GtmModal/GtmModal.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/GtmModal/index.ts delete mode 100644 apps/builder/src/features/publish/components/embeds/modals/GtmModal/index.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmBubbleInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmPopupInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmStandardInstructions.tsx rename apps/builder/src/features/publish/components/embeds/modals/{ => IframeModal}/IframeModal.tsx (65%) rename apps/builder/src/features/publish/components/embeds/{codeSnippets/Iframe/EmbedCode.tsx => modals/IframeModal/IframeSnippet.tsx} (55%) create mode 100644 apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptBubbleSnippet.tsx delete mode 100644 apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptPopupSnippet.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptStandardSnippet.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptBubbleInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptPopupInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptStandardInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/OtherModal.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/React/InstallReactPackageSnippet.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/React/ReactBubbleSnippet.tsx delete mode 100644 apps/builder/src/features/publish/components/embeds/modals/React/ReactInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/React/ReactPopupSnippet.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/React/ReactStandardSnippet.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactBubbleInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactPopupInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactStandardInstructions.tsx delete mode 100644 apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/ShopifyInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/ShopifyModal.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/index.ts delete mode 100644 apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/index.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyBubbleInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyPopupInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyStandardInstructions.tsx delete mode 100644 apps/builder/src/features/publish/components/embeds/modals/WebflowModal/WebflowInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WebflowModal/WebflowModal.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WebflowModal/index.ts delete mode 100644 apps/builder/src/features/publish/components/embeds/modals/WebflowModal/index.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowBubbleInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowPopupInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowStandardInstructions.tsx delete mode 100644 apps/builder/src/features/publish/components/embeds/modals/WixModal/WixInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WixModal/WixModal.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WixModal/index.ts delete mode 100644 apps/builder/src/features/publish/components/embeds/modals/WixModal/index.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixBubbleInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixPopupInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixStandardInstuctions.tsx delete mode 100644 apps/builder/src/features/publish/components/embeds/modals/WordpressModal.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WordpressModal/WordpressModal.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WordpressModal/index.ts create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressBubbleInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressPopupInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressStandardInstructions.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/BubbleSettings.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/ButtonThemeSettings.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/PreviewMessageSettings.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/PreviewMessageThemeSettings.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/ThemeSettings.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/settings/PopupSettings.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/settings/StandardSettings.tsx create mode 100644 apps/builder/src/features/publish/components/embeds/snippetParsers/bubble.ts create mode 100644 apps/builder/src/features/publish/components/embeds/snippetParsers/index.ts create mode 100644 apps/builder/src/features/publish/components/embeds/snippetParsers/popup.ts create mode 100644 apps/builder/src/features/publish/components/embeds/snippetParsers/shared.ts create mode 100644 apps/builder/src/features/publish/components/embeds/snippetParsers/standard.ts delete mode 100644 apps/viewer/src/components/TypebotPage.tsx create mode 100644 apps/viewer/src/components/TypebotPageV3.tsx delete mode 100644 apps/viewer/src/features/blocks/inputs/fileUpload/fileUploadV2.spec.ts delete mode 100644 apps/viewer/src/features/blocks/integrations/chatwoot/chatwootV2.spec.ts delete mode 100644 apps/viewer/src/features/blocks/integrations/sendEmail/sendEmailV2.spec.ts delete mode 100644 apps/viewer/src/features/blocks/integrations/webhook/webhookV2.spec.ts delete mode 100644 apps/viewer/src/features/blocks/logic/typebotLink/typebotLinkV2.spec.ts delete mode 100644 apps/viewer/src/features/results/resultsV2.spec.ts delete mode 100644 apps/viewer/src/features/settings/settingsV2.spec.ts delete mode 100644 apps/viewer/src/features/usage/usageV2.spec.ts delete mode 100644 apps/viewer/src/features/variables/variablesV2.spec.ts delete mode 100644 apps/viewer/src/pages/next/[[...publicId]].tsx create mode 100644 packages/db/postgresql/migrations/20230220085522_add_version_fields/migration.sql delete mode 100644 packages/utils/typebotConversions.ts delete mode 100644 packages/wordpress/trunk/admin/css/bulma.min.css diff --git a/apps/builder/next.config.js b/apps/builder/next.config.js index 3b24d76bc6..6a7f2fe6cd 100644 --- a/apps/builder/next.config.js +++ b/apps/builder/next.config.js @@ -1,11 +1,7 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ const { withSentryConfig } = require('@sentry/nextjs') const path = require('path') -const withTM = require('next-transpile-modules')([ - 'utils', - 'models', - 'emails', - 'bot-engine', -]) +const withTM = require('next-transpile-modules')(['utils', 'models', 'emails']) /** @type {import('next').NextConfig} */ const nextConfig = withTM({ diff --git a/apps/builder/package.json b/apps/builder/package.json index d1faf75b00..b96f688fa2 100644 --- a/apps/builder/package.json +++ b/apps/builder/package.json @@ -17,13 +17,6 @@ "@chakra-ui/css-reset": "2.0.11", "@chakra-ui/react": "2.5.0", "@chakra-ui/theme-tools": "^2.0.16", - "@codemirror/lang-css": "6.0.1", - "@codemirror/lang-html": "6.4.1", - "@codemirror/lang-javascript": "6.1.2", - "@codemirror/lang-json": "6.0.1", - "@codemirror/lint": "6.1.0", - "@codemirror/state": "6.2.0", - "@codemirror/theme-one-dark": "^6.1.0", "@dnd-kit/core": "6.0.7", "@dnd-kit/sortable": "7.0.2", "@dnd-kit/utilities": "3.2.1", @@ -52,12 +45,17 @@ "@udecode/plate-ui-toolbar": "19.2.0", "@use-gesture/react": "^10.2.24", "aws-sdk": "2.1304.0", - "bot-engine": "workspace:*", "browser-image-compression": "2.0.0", "canvas-confetti": "1.6.0", "chakra-react-select": "^4.4.3", "codemirror": "6.0.1", "@paralleldrive/cuid2": "2.0.1", + "@typebot.io/js": "workspace:*", + "@typebot.io/react": "workspace:*", + "@uiw/codemirror-extensions-langs": "^4.19.7", + "@uiw/codemirror-theme-github": "^4.19.7", + "@uiw/codemirror-theme-tokyo-night": "^4.19.7", + "@uiw/react-codemirror": "^4.19.7", "deep-object-diff": "1.1.9", "dequal": "2.0.3", "emails": "workspace:*", @@ -94,7 +92,6 @@ "swr": "2.0.3", "tinycolor2": "1.5.2", "trpc-openapi": "1.1.2", - "typebot-js": "workspace:*", "use-debounce": "9.0.3" }, "devDependencies": { diff --git a/apps/builder/public/bots/onboarding-dark.json b/apps/builder/public/bots/onboarding-dark.json index edd6b376f8..314b6f51a5 100644 --- a/apps/builder/public/bots/onboarding-dark.json +++ b/apps/builder/public/bots/onboarding-dark.json @@ -6,21 +6,22 @@ "folderId": null, "groups": [ { - "id": "cl1265zct0000mb1a6bir36w7", + "id": "clcueadzi00043b6s1r8wnql8", + "title": "Start", "blocks": [ { "id": "cl1265zct0001mb1afel460do", "type": "start", "label": "Start", - "groupId": "cl1265zct0000mb1a6bir36w7", - "outgoingEdgeId": "cl1266kt100082e6d1wks5dtp" + "groupId": "clcueadzi00043b6s1r8wnql8", + "outgoingEdgeId": "clcuefdfv000r3b6sqzv3prz3" } ], - "title": "Start", "graphCoordinates": { "x": 0, "y": 0 } }, { - "id": "cl1266bah00032e6dgdnj4vgz", + "id": "clcueadzi00063b6sch7b1f32", + "title": "Name", "blocks": [ { "id": "cl1266bam00042e6dm0gn22vy", @@ -40,47 +41,39 @@ ], "logicalOperator": "AND" }, - "outgoingEdgeId": "cl12bk3j6000c2e69bak89ja9" + "outgoingEdgeId": "clcueadzi000l3b6smlf218u7" } ], - "groupId": "cl1266bah00032e6dgdnj4vgz", - "outgoingEdgeId": "cl12bnfyd000g2e69g7lr3czq" - } - ], - "title": "Group #1", - "graphCoordinates": { "x": 266, "y": 162 } - }, - { - "id": "cl1267q1z000d2e6d949f2ge4", - "blocks": [ + "groupId": "clcueadzi00063b6sch7b1f32" + }, { "id": "cl1267q2c000e2e6dynjeg83n", "type": "text", - "groupId": "cl1267q1z000d2e6d949f2ge4", "content": { "html": "
Welcome 👋
", "richText": [ { "type": "p", "children": [{ "text": "Welcome 👋" }] } ], "plainText": "Welcome 👋" - } + }, + "groupId": "clcueadzi00063b6sch7b1f32" }, { "id": "cl1267y1u000f2e6d4rlglv6g", "type": "text", - "groupId": "cl1267q1z000d2e6d949f2ge4", "content": { "html": "
What's your name?
", "richText": [ { "type": "p", "children": [{ "text": "What's your name?" }] } ], "plainText": "What's your name?" - } + }, + "groupId": "clcueadzi00063b6sch7b1f32" }, { "id": "cl126820m000g2e6dfleq78bt", "type": "text input", - "groupId": "cl1267q1z000d2e6d949f2ge4", + "groupId": "clcueadzi00063b6sch7b1f32", "options": { "isLong": false, "labels": { @@ -88,41 +81,31 @@ "placeholder": "Type your answer..." }, "variableId": "cl126f4hf000i2e6d8zvzc3t1" - } - }, - { - "id": "cl1289y1s00142e6dvbkpvbje", - "type": "Code", - "groupId": "cl1267q1z000d2e6d949f2ge4", - "options": { - "name": "Store Name in DB", - "content": "postMessage({from: \"typebot\", action: \"storeName\", content: {{Name}}}, \"*\")" }, - "outgoingEdgeId": "cl12bk56s000d2e69oll3nqxm" + "outgoingEdgeId": "clcuecvjo000q3b6s42ouw3zz" } ], - "title": "Group #3", - "graphCoordinates": { "x": 269, "y": 381 } + "graphCoordinates": { "x": 328.22861564828236, "y": -1.7421511890097776 } }, { - "id": "cl126ixoq000p2e6dfbz9sype", + "id": "clcueadzi00073b6sqz8n5vxp", + "title": "Company", "blocks": [ { "id": "cl1266v6f000a2e6db7wj3ux7", "type": "text", - "groupId": "cl126ixoq000p2e6dfbz9sype", "content": { "html": "
Welcome {{Name}} 👋
", "richText": [ { "type": "p", "children": [{ "text": "Welcome {{Name}} 👋" }] } ], "plainText": "Welcome {{Name}} 👋" - } + }, + "groupId": "clcueadzi00073b6sqz8n5vxp" }, { "id": "cl126hb9m000l2e6d5qk3mohn", "type": "text", - "groupId": "cl126ixoq000p2e6dfbz9sype", "content": { "html": "
I'm super pumped that you've decided to try out Typebot 😍
", "richText": [ @@ -136,12 +119,12 @@ } ], "plainText": "I'm super pumped that you've decided to try out Typebot 😍" - } + }, + "groupId": "clcueadzi00073b6sqz8n5vxp" }, { "id": "cl126hpw1000m2e6dneousygl", "type": "text", - "groupId": "cl126ixoq000p2e6dfbz9sype", "content": { "html": "
You are small steps away from meaningful, hyper-personalized experience for your users
", "richText": [ @@ -155,12 +138,12 @@ } ], "plainText": "You are small steps away from meaningful, hyper-personalized experience for your users" - } + }, + "groupId": "clcueadzi00073b6sqz8n5vxp" }, { "id": "cl126guhd000k2e6d6ypkex9z", "type": "text", - "groupId": "cl126ixoq000p2e6dfbz9sype", "content": { "html": "
Let's get you set up for your Typebot journey.
", "richText": [ @@ -172,12 +155,12 @@ } ], "plainText": "Let's get you set up for your Typebot journey." - } + }, + "groupId": "clcueadzi00073b6sqz8n5vxp" }, { "id": "cl126ixp9000q2e6dslh0zypi", "type": "text", - "groupId": "cl126ixoq000p2e6dfbz9sype", "content": { "html": "
Do you work for a specific company?
", "richText": [ @@ -187,7 +170,8 @@ } ], "plainText": "Do you work for a specific company?" - } + }, + "groupId": "clcueadzi00073b6sqz8n5vxp" }, { "id": "cl126jb2q000r2e6dgqlnxnt8", @@ -197,31 +181,23 @@ "id": "cl126jb2q000s2e6dm60yq5p2", "type": 0, "blockId": "cl126jb2q000r2e6dgqlnxnt8", - "content": "Yes", - "outgoingEdgeId": "cl126jsoo000x2e6ditu7dgf8" + "content": "Yes" }, { "id": "cl126jc5a000t2e6dqv91w7j6", "type": 0, "blockId": "cl126jb2q000r2e6dgqlnxnt8", "content": "No", - "outgoingEdgeId": "cl126l5tx00122e6dmisci6h5" + "outgoingEdgeId": "clcueadzi000f3b6sb7lxyeta" } ], - "groupId": "cl126ixoq000p2e6dfbz9sype", + "groupId": "clcueadzi00073b6sqz8n5vxp", "options": { "buttonLabel": "Send", "isMultipleChoice": false } - } - ], - "title": "Group #5", - "graphCoordinates": { "x": 614, "y": 244 } - }, - { - "id": "cl126jioj000u2e6dqssno3hv", - "blocks": [ + }, { "id": "cl126jioz000v2e6dwrk1f2cb", "type": "text input", - "groupId": "cl126jioj000u2e6dqssno3hv", + "groupId": "clcueadzi00073b6sqz8n5vxp", "options": { "isLong": false, "labels": { @@ -229,43 +205,34 @@ "placeholder": "Type the company name..." }, "variableId": "cl126jqww000w2e6dq9yv4ifq" - } - }, - { - "id": "cl12890kw00132e6dp9v5dexm", - "type": "Code", - "groupId": "cl126jioj000u2e6dqssno3hv", - "options": { - "name": "Store company in DB", - "content": "postMessage({from: \"typebot\", action: \"storeCompany\", content: {{Company}}}, \"*\")" }, - "outgoingEdgeId": "cl128ag8i00162e6dufv3tgo0" + "outgoingEdgeId": "clcueb0cl000p3b6sisrc741n" } ], - "title": "Group #6", - "graphCoordinates": { "x": 969, "y": 308 } + "graphCoordinates": { "x": 679.828061917379, "y": 3.351428911218571 } }, { - "id": "cl126krbp00102e6dnjelmfa1", + "id": "clcueadzi00093b6s82ivles8", + "title": "Bot category", "blocks": [ { "id": "cl126krck00112e6d1m6ctxpn", "type": "text", - "groupId": "cl126krbp00102e6dnjelmfa1", "content": { - "html": "
What type of forms are you planning to build with Typebot?
", + "html": "
What type of bots are you planning to build with Typebot?
", "richText": [ { "type": "p", "children": [ { - "text": "What type of forms are you planning to build with Typebot?" + "text": "What type of bots are you planning to build with Typebot?" } ] } ], - "plainText": "What type of forms are you planning to build with Typebot?" - } + "plainText": "What type of bots are you planning to build with Typebot?" + }, + "groupId": "clcueadzi00093b6s82ivles8" }, { "id": "cl126lb8v00142e6duv5qe08l", @@ -320,7 +287,7 @@ "content": "Other" } ], - "groupId": "cl126krbp00102e6dnjelmfa1", + "groupId": "clcueadzi00093b6s82ivles8", "options": { "variableId": "cl126mo3t001b2e6dvyi16bkd", "buttonLabel": "Send", @@ -328,26 +295,40 @@ } }, { - "id": "cl128ain900172e6d1osj4u90", - "type": "Code", - "groupId": "cl126krbp00102e6dnjelmfa1", - "options": { - "name": "Store categories in DB", - "content": "postMessage({from: \"typebot\", action: \"storeCategories\", content: {{Categories}}}, \"*\")" - }, - "outgoingEdgeId": "cl128azam00182e6dct61k7v5" + "id": "cl1278gyk002w2e6d744eb87n", + "type": "Condition", + "items": [ + { + "id": "cl1278gyk002x2e6dwmpzs3nf", + "type": 1, + "blockId": "cl1278gyk002w2e6d744eb87n", + "content": { + "comparisons": [ + { + "id": "cl1278irq002y2e6dv4965diw", + "value": "Other", + "variableId": "cl126mo3t001b2e6dvyi16bkd", + "comparisonOperator": "Contains" + } + ], + "logicalOperator": "AND" + }, + "outgoingEdgeId": "clcueadzi000g3b6sdb6o0xet" + } + ], + "groupId": "clcueadzi00093b6s82ivles8", + "outgoingEdgeId": "clcueadzi000h3b6shpxplygo" } ], - "title": "Group #6", - "graphCoordinates": { "x": 1218, "y": 510 } + "graphCoordinates": { "x": 1030.2081982319628, "y": -0.2818258211374715 } }, { - "id": "cl126p75m001j2e6d73qmes0m", + "id": "clcueadzi000a3b6spk404zpz", + "title": "Bye", "blocks": [ { "id": "cl126p76d001k2e6dbhnf2ysq", "type": "text", - "groupId": "cl126p75m001j2e6d73qmes0m", "content": { "html": "
Thank you for answering those questions!
", "richText": [ @@ -359,29 +340,20 @@ } ], "plainText": "Thank you for answering those questions!" - } - }, - { - "id": "cl128375600112e6d4l0jtuyf", - "type": "Code", - "groupId": "cl126p75m001j2e6d73qmes0m", - "options": { - "name": "Shoot confettis", - "content": "postMessage({from: \"typebot\", action: \"shootConfettis\"}, \"*\")" - } + }, + "groupId": "clcueadzi000a3b6spk404zpz" }, { "id": "cl126rfy6001t2e6d21gcb6b0", "type": "image", - "groupId": "cl126p75m001j2e6d73qmes0m", "content": { "url": "https://media4.giphy.com/media/l0amJzVHIAfl7jMDos/giphy.gif?cid=fe3852a3i4c33635xdtj3nesr9uq4zteujaab6b0jr42gpxx&rid=giphy.gif&ct=g" - } + }, + "groupId": "clcueadzi000a3b6spk404zpz" }, { "id": "cl126txta001y2e6dtxrbsnek", "type": "text", - "groupId": "cl126p75m001j2e6d73qmes0m", "content": { "html": "
You can reach out to me using the contact bubble on the bottom right corner 🤓
", "richText": [ @@ -395,11 +367,11 @@ } ], "plainText": "You can reach out to me using the contact bubble on the bottom right corner 🤓" - } + }, + "groupId": "clcueadzi000a3b6spk404zpz" }, { "id": "cl12buyly00172e6991bz38ch", - "groupId": "cl126p75m001j2e6d73qmes0m", "type": "text", "content": { "html": "
Let's create your first typebot...
", @@ -410,91 +382,41 @@ } ], "plainText": "Let's create your first typebot..." - } - }, - { - "id": "cl12bwpi800182e69kcivnp1s", - "groupId": "cl126p75m001j2e6d73qmes0m", - "type": "Code", - "options": { - "name": "Go to typebot creation", - "content": "setTimeout(() => {window.location.href = \"https://app.typebot.io/typebots/create?isFirstBot=true\"}, 4000)" - } + }, + "groupId": "clcueadzi000a3b6spk404zpz" } ], - "title": "Group #7", - "graphCoordinates": { "x": 1612, "y": 1103 } + "graphCoordinates": { "x": 1585.6402200792238, "y": 219.28927860860924 } }, { - "id": "cl126pv6w001n2e6dp0qkvthu", + "id": "clcueadzi000b3b6sv6936vs4", + "title": "Other category", "blocks": [ { "id": "cl127yxym000b2e6d9hksxo6h", "type": "text", - "groupId": "cl126pv6w001n2e6dp0qkvthu", "content": { "html": "
What else?
", "richText": [ { "type": "p", "children": [{ "text": "What else?" }] } ], "plainText": "What else?" - } + }, + "groupId": "clcueadzi000b3b6sv6936vs4" }, { "id": "cl126pv7n001o2e6dajltc4qz", "type": "text input", - "groupId": "cl126pv6w001n2e6dp0qkvthu", + "groupId": "clcueadzi000b3b6sv6936vs4", "options": { "isLong": false, "labels": { "button": "Send", "placeholder": "Type your answer" }, "variableId": "cl126q38p001q2e6d0hj23f6b" - } - }, - { - "id": "cl128b34o00192e6dqjxs3cxf", - "type": "Code", - "groupId": "cl126pv6w001n2e6dp0qkvthu", - "options": { - "name": "Store Other categories in DB", - "content": "postMessage({from: \"typebot\", action: \"storeOtherCategories\", content: {{Other categories}}}, \"*\")" }, - "outgoingEdgeId": "cl128c0fu001a2e6droq69g6z" + "outgoingEdgeId": "clcuehrt2000s3b6skmk7rhje" } ], - "title": "Group #8", - "graphCoordinates": { "x": 1943, "y": 895 } - }, - { - "id": "cl1278gx9002v2e6d4kf3v89s", - "blocks": [ - { - "id": "cl1278gyk002w2e6d744eb87n", - "type": "Condition", - "items": [ - { - "id": "cl1278gyk002x2e6dwmpzs3nf", - "type": 1, - "blockId": "cl1278gyk002w2e6d744eb87n", - "content": { - "comparisons": [ - { - "id": "cl1278irq002y2e6dv4965diw", - "value": "Other", - "variableId": "cl126mo3t001b2e6dvyi16bkd", - "comparisonOperator": "Contains" - } - ], - "logicalOperator": "AND" - }, - "outgoingEdgeId": "cl1278r3b002z2e6d6d6rk9dh" - } - ], - "groupId": "cl1278gx9002v2e6d4kf3v89s", - "outgoingEdgeId": "cl1278trd00312e6dxmzhcmmn" - } - ], - "title": "Group #13", - "graphCoordinates": { "x": 1585, "y": 792 } + "graphCoordinates": { "x": 1369.6844213687823, "y": -7.90789096298402 } } ], "variables": [ @@ -505,99 +427,71 @@ ], "edges": [ { - "id": "cl1266kt100082e6d1wks5dtp", - "to": { "groupId": "cl1266bah00032e6dgdnj4vgz" }, - "from": { - "blockId": "cl1265zct0001mb1afel460do", - "groupId": "cl1265zct0000mb1a6bir36w7" - } - }, - { - "id": "cl126jsoo000x2e6ditu7dgf8", - "to": { "groupId": "cl126jioj000u2e6dqssno3hv" }, - "from": { - "itemId": "cl126jb2q000s2e6dm60yq5p2", - "blockId": "cl126jb2q000r2e6dgqlnxnt8", - "groupId": "cl126ixoq000p2e6dfbz9sype" - } - }, - { - "id": "cl126l5tx00122e6dmisci6h5", - "to": { "groupId": "cl126krbp00102e6dnjelmfa1" }, + "id": "clcueadzi000f3b6sb7lxyeta", + "to": { "groupId": "clcueadzi00093b6s82ivles8" }, "from": { "itemId": "cl126jc5a000t2e6dqv91w7j6", "blockId": "cl126jb2q000r2e6dgqlnxnt8", - "groupId": "cl126ixoq000p2e6dfbz9sype" + "groupId": "clcueadzi00073b6sqz8n5vxp" } }, { - "id": "cl1278r3b002z2e6d6d6rk9dh", - "to": { "groupId": "cl126pv6w001n2e6dp0qkvthu" }, + "id": "clcueadzi000g3b6sdb6o0xet", + "to": { "groupId": "clcueadzi000b3b6sv6936vs4" }, "from": { "itemId": "cl1278gyk002x2e6dwmpzs3nf", "blockId": "cl1278gyk002w2e6d744eb87n", - "groupId": "cl1278gx9002v2e6d4kf3v89s" + "groupId": "clcueadzi00093b6s82ivles8" } }, { - "id": "cl1278trd00312e6dxmzhcmmn", - "to": { "groupId": "cl126p75m001j2e6d73qmes0m" }, + "id": "clcueadzi000h3b6shpxplygo", + "to": { "groupId": "clcueadzi000a3b6spk404zpz" }, "from": { "blockId": "cl1278gyk002w2e6d744eb87n", - "groupId": "cl1278gx9002v2e6d4kf3v89s" + "groupId": "clcueadzi00093b6s82ivles8" } }, { - "id": "cl128ag8i00162e6dufv3tgo0", - "to": { "groupId": "cl126krbp00102e6dnjelmfa1" }, + "id": "clcueadzi000l3b6smlf218u7", + "to": { "groupId": "clcueadzi00073b6sqz8n5vxp" }, "from": { - "blockId": "cl12890kw00132e6dp9v5dexm", - "groupId": "cl126jioj000u2e6dqssno3hv" - } - }, - { - "id": "cl128azam00182e6dct61k7v5", - "to": { "groupId": "cl1278gx9002v2e6d4kf3v89s" }, - "from": { - "blockId": "cl128ain900172e6d1osj4u90", - "groupId": "cl126krbp00102e6dnjelmfa1" + "itemId": "cl1266bam00052e6dn1sdjnax", + "blockId": "cl1266bam00042e6dm0gn22vy", + "groupId": "clcueadzi00063b6sch7b1f32" } }, { - "id": "cl128c0fu001a2e6droq69g6z", - "to": { "groupId": "cl126p75m001j2e6d73qmes0m" }, "from": { - "blockId": "cl128b34o00192e6dqjxs3cxf", - "groupId": "cl126pv6w001n2e6dp0qkvthu" - } + "groupId": "clcueadzi00073b6sqz8n5vxp", + "blockId": "cl126jioz000v2e6dwrk1f2cb" + }, + "to": { "groupId": "clcueadzi00093b6s82ivles8" }, + "id": "clcueb0cl000p3b6sisrc741n" }, { "from": { - "groupId": "cl1266bah00032e6dgdnj4vgz", - "blockId": "cl1266bam00042e6dm0gn22vy", - "itemId": "cl1266bam00052e6dn1sdjnax" + "groupId": "clcueadzi00063b6sch7b1f32", + "blockId": "cl126820m000g2e6dfleq78bt" }, - "to": { "groupId": "cl126ixoq000p2e6dfbz9sype" }, - "id": "cl12bk3j6000c2e69bak89ja9" + "to": { "groupId": "clcueadzi00073b6sqz8n5vxp" }, + "id": "clcuecvjo000q3b6s42ouw3zz" }, { "from": { - "groupId": "cl1267q1z000d2e6d949f2ge4", - "blockId": "cl1289y1s00142e6dvbkpvbje" - }, - "to": { - "groupId": "cl126ixoq000p2e6dfbz9sype", - "blockId": "cl126hb9m000l2e6d5qk3mohn" + "groupId": "clcueadzi00043b6s1r8wnql8", + "blockId": "cl1265zct0001mb1afel460do" }, - "id": "cl12bk56s000d2e69oll3nqxm" + "to": { "groupId": "clcueadzi00063b6sch7b1f32" }, + "id": "clcuefdfv000r3b6sqzv3prz3" }, { "from": { - "groupId": "cl1266bah00032e6dgdnj4vgz", - "blockId": "cl1266bam00042e6dm0gn22vy" + "groupId": "clcueadzi000b3b6sv6936vs4", + "blockId": "cl126pv7n001o2e6dajltc4qz" }, - "to": { "groupId": "cl1267q1z000d2e6d949f2ge4" }, - "id": "cl12bnfyd000g2e69g7lr3czq" + "to": { "groupId": "clcueadzi000a3b6spk404zpz" }, + "id": "clcuehrt2000s3b6skmk7rhje" } ], "theme": { @@ -632,6 +526,10 @@ }, "typingEmulation": { "speed": 300, "enabled": true, "maxDelay": 1.5 } }, - "publicId": "typebot-onboarding", - "customDomain": null + "publicId": null, + "customDomain": null, + "workspaceId": "proWorkspace", + "resultsTablePreferences": null, + "isArchived": false, + "isClosed": false } diff --git a/apps/builder/public/bots/onboarding.json b/apps/builder/public/bots/onboarding.json index 72a10ad068..05f9917f84 100644 --- a/apps/builder/public/bots/onboarding.json +++ b/apps/builder/public/bots/onboarding.json @@ -6,21 +6,22 @@ "folderId": null, "groups": [ { - "id": "cl1265zct0000mb1a6bir36w7", + "id": "clcueadzi00043b6s1r8wnql8", + "title": "Start", "blocks": [ { "id": "cl1265zct0001mb1afel460do", "type": "start", "label": "Start", - "groupId": "cl1265zct0000mb1a6bir36w7", - "outgoingEdgeId": "cl1266kt100082e6d1wks5dtp" + "groupId": "clcueadzi00043b6s1r8wnql8", + "outgoingEdgeId": "clcuefdfv000r3b6sqzv3prz3" } ], - "title": "Start", "graphCoordinates": { "x": 0, "y": 0 } }, { - "id": "cl1266bah00032e6dgdnj4vgz", + "id": "clcueadzi00063b6sch7b1f32", + "title": "Name", "blocks": [ { "id": "cl1266bam00042e6dm0gn22vy", @@ -40,47 +41,39 @@ ], "logicalOperator": "AND" }, - "outgoingEdgeId": "cl12bk3j6000c2e69bak89ja9" + "outgoingEdgeId": "clcueadzi000l3b6smlf218u7" } ], - "groupId": "cl1266bah00032e6dgdnj4vgz", - "outgoingEdgeId": "cl12bnfyd000g2e69g7lr3czq" - } - ], - "title": "Group #1", - "graphCoordinates": { "x": 266, "y": 162 } - }, - { - "id": "cl1267q1z000d2e6d949f2ge4", - "blocks": [ + "groupId": "clcueadzi00063b6sch7b1f32" + }, { "id": "cl1267q2c000e2e6dynjeg83n", "type": "text", - "groupId": "cl1267q1z000d2e6d949f2ge4", "content": { "html": "
Welcome 👋
", "richText": [ { "type": "p", "children": [{ "text": "Welcome 👋" }] } ], "plainText": "Welcome 👋" - } + }, + "groupId": "clcueadzi00063b6sch7b1f32" }, { "id": "cl1267y1u000f2e6d4rlglv6g", "type": "text", - "groupId": "cl1267q1z000d2e6d949f2ge4", "content": { "html": "
What's your name?
", "richText": [ { "type": "p", "children": [{ "text": "What's your name?" }] } ], "plainText": "What's your name?" - } + }, + "groupId": "clcueadzi00063b6sch7b1f32" }, { "id": "cl126820m000g2e6dfleq78bt", "type": "text input", - "groupId": "cl1267q1z000d2e6d949f2ge4", + "groupId": "clcueadzi00063b6sch7b1f32", "options": { "isLong": false, "labels": { @@ -88,41 +81,31 @@ "placeholder": "Type your answer..." }, "variableId": "cl126f4hf000i2e6d8zvzc3t1" - } - }, - { - "id": "cl1289y1s00142e6dvbkpvbje", - "type": "Code", - "groupId": "cl1267q1z000d2e6d949f2ge4", - "options": { - "name": "Store Name in DB", - "content": "postMessage({from: \"typebot\", action: \"storeName\", content: {{Name}}}, \"*\")" }, - "outgoingEdgeId": "cl12bk56s000d2e69oll3nqxm" + "outgoingEdgeId": "clcuecvjo000q3b6s42ouw3zz" } ], - "title": "Group #3", - "graphCoordinates": { "x": 269, "y": 381 } + "graphCoordinates": { "x": 328.22861564828236, "y": -1.7421511890097776 } }, { - "id": "cl126ixoq000p2e6dfbz9sype", + "id": "clcueadzi00073b6sqz8n5vxp", + "title": "Company", "blocks": [ { "id": "cl1266v6f000a2e6db7wj3ux7", "type": "text", - "groupId": "cl126ixoq000p2e6dfbz9sype", "content": { "html": "
Welcome {{Name}} 👋
", "richText": [ { "type": "p", "children": [{ "text": "Welcome {{Name}} 👋" }] } ], "plainText": "Welcome {{Name}} 👋" - } + }, + "groupId": "clcueadzi00073b6sqz8n5vxp" }, { "id": "cl126hb9m000l2e6d5qk3mohn", "type": "text", - "groupId": "cl126ixoq000p2e6dfbz9sype", "content": { "html": "
I'm super pumped that you've decided to try out Typebot 😍
", "richText": [ @@ -136,12 +119,12 @@ } ], "plainText": "I'm super pumped that you've decided to try out Typebot 😍" - } + }, + "groupId": "clcueadzi00073b6sqz8n5vxp" }, { "id": "cl126hpw1000m2e6dneousygl", "type": "text", - "groupId": "cl126ixoq000p2e6dfbz9sype", "content": { "html": "
You are small steps away from meaningful, hyper-personalized experience for your users
", "richText": [ @@ -155,12 +138,12 @@ } ], "plainText": "You are small steps away from meaningful, hyper-personalized experience for your users" - } + }, + "groupId": "clcueadzi00073b6sqz8n5vxp" }, { "id": "cl126guhd000k2e6d6ypkex9z", "type": "text", - "groupId": "cl126ixoq000p2e6dfbz9sype", "content": { "html": "
Let's get you set up for your Typebot journey.
", "richText": [ @@ -172,12 +155,12 @@ } ], "plainText": "Let's get you set up for your Typebot journey." - } + }, + "groupId": "clcueadzi00073b6sqz8n5vxp" }, { "id": "cl126ixp9000q2e6dslh0zypi", "type": "text", - "groupId": "cl126ixoq000p2e6dfbz9sype", "content": { "html": "
Do you work for a specific company?
", "richText": [ @@ -187,7 +170,8 @@ } ], "plainText": "Do you work for a specific company?" - } + }, + "groupId": "clcueadzi00073b6sqz8n5vxp" }, { "id": "cl126jb2q000r2e6dgqlnxnt8", @@ -197,31 +181,23 @@ "id": "cl126jb2q000s2e6dm60yq5p2", "type": 0, "blockId": "cl126jb2q000r2e6dgqlnxnt8", - "content": "Yes", - "outgoingEdgeId": "cl126jsoo000x2e6ditu7dgf8" + "content": "Yes" }, { "id": "cl126jc5a000t2e6dqv91w7j6", "type": 0, "blockId": "cl126jb2q000r2e6dgqlnxnt8", "content": "No", - "outgoingEdgeId": "cl126l5tx00122e6dmisci6h5" + "outgoingEdgeId": "clcueadzi000f3b6sb7lxyeta" } ], - "groupId": "cl126ixoq000p2e6dfbz9sype", + "groupId": "clcueadzi00073b6sqz8n5vxp", "options": { "buttonLabel": "Send", "isMultipleChoice": false } - } - ], - "title": "Group #5", - "graphCoordinates": { "x": 614, "y": 244 } - }, - { - "id": "cl126jioj000u2e6dqssno3hv", - "blocks": [ + }, { "id": "cl126jioz000v2e6dwrk1f2cb", "type": "text input", - "groupId": "cl126jioj000u2e6dqssno3hv", + "groupId": "clcueadzi00073b6sqz8n5vxp", "options": { "isLong": false, "labels": { @@ -229,43 +205,34 @@ "placeholder": "Type the company name..." }, "variableId": "cl126jqww000w2e6dq9yv4ifq" - } - }, - { - "id": "cl12890kw00132e6dp9v5dexm", - "type": "Code", - "groupId": "cl126jioj000u2e6dqssno3hv", - "options": { - "name": "Store company in DB", - "content": "postMessage({from: \"typebot\", action: \"storeCompany\", content: {{Company}}}, \"*\")" }, - "outgoingEdgeId": "cl128ag8i00162e6dufv3tgo0" + "outgoingEdgeId": "clcueb0cl000p3b6sisrc741n" } ], - "title": "Group #6", - "graphCoordinates": { "x": 969, "y": 308 } + "graphCoordinates": { "x": 679.828061917379, "y": 3.351428911218571 } }, { - "id": "cl126krbp00102e6dnjelmfa1", + "id": "clcueadzi00093b6s82ivles8", + "title": "Bot category", "blocks": [ { "id": "cl126krck00112e6d1m6ctxpn", "type": "text", - "groupId": "cl126krbp00102e6dnjelmfa1", "content": { - "html": "
What type of forms are you planning to build with Typebot?
", + "html": "
What type of bots are you planning to build with Typebot?
", "richText": [ { "type": "p", "children": [ { - "text": "What type of forms are you planning to build with Typebot?" + "text": "What type of bots are you planning to build with Typebot?" } ] } ], - "plainText": "What type of forms are you planning to build with Typebot?" - } + "plainText": "What type of bots are you planning to build with Typebot?" + }, + "groupId": "clcueadzi00093b6s82ivles8" }, { "id": "cl126lb8v00142e6duv5qe08l", @@ -320,7 +287,7 @@ "content": "Other" } ], - "groupId": "cl126krbp00102e6dnjelmfa1", + "groupId": "clcueadzi00093b6s82ivles8", "options": { "variableId": "cl126mo3t001b2e6dvyi16bkd", "buttonLabel": "Send", @@ -328,26 +295,40 @@ } }, { - "id": "cl128ain900172e6d1osj4u90", - "type": "Code", - "groupId": "cl126krbp00102e6dnjelmfa1", - "options": { - "name": "Store categories in DB", - "content": "postMessage({from: \"typebot\", action: \"storeCategories\", content: {{Categories}}}, \"*\")" - }, - "outgoingEdgeId": "cl128azam00182e6dct61k7v5" + "id": "cl1278gyk002w2e6d744eb87n", + "type": "Condition", + "items": [ + { + "id": "cl1278gyk002x2e6dwmpzs3nf", + "type": 1, + "blockId": "cl1278gyk002w2e6d744eb87n", + "content": { + "comparisons": [ + { + "id": "cl1278irq002y2e6dv4965diw", + "value": "Other", + "variableId": "cl126mo3t001b2e6dvyi16bkd", + "comparisonOperator": "Contains" + } + ], + "logicalOperator": "AND" + }, + "outgoingEdgeId": "clcueadzi000g3b6sdb6o0xet" + } + ], + "groupId": "clcueadzi00093b6s82ivles8", + "outgoingEdgeId": "clcueadzi000h3b6shpxplygo" } ], - "title": "Group #6", - "graphCoordinates": { "x": 1218, "y": 510 } + "graphCoordinates": { "x": 1030.2081982319628, "y": -0.2818258211374715 } }, { - "id": "cl126p75m001j2e6d73qmes0m", + "id": "clcueadzi000a3b6spk404zpz", + "title": "Bye", "blocks": [ { "id": "cl126p76d001k2e6dbhnf2ysq", "type": "text", - "groupId": "cl126p75m001j2e6d73qmes0m", "content": { "html": "
Thank you for answering those questions!
", "richText": [ @@ -359,29 +340,20 @@ } ], "plainText": "Thank you for answering those questions!" - } - }, - { - "id": "cl128375600112e6d4l0jtuyf", - "type": "Code", - "groupId": "cl126p75m001j2e6d73qmes0m", - "options": { - "name": "Shoot confettis", - "content": "postMessage({from: \"typebot\", action: \"shootConfettis\"}, \"*\")" - } + }, + "groupId": "clcueadzi000a3b6spk404zpz" }, { "id": "cl126rfy6001t2e6d21gcb6b0", "type": "image", - "groupId": "cl126p75m001j2e6d73qmes0m", "content": { "url": "https://media4.giphy.com/media/l0amJzVHIAfl7jMDos/giphy.gif?cid=fe3852a3i4c33635xdtj3nesr9uq4zteujaab6b0jr42gpxx&rid=giphy.gif&ct=g" - } + }, + "groupId": "clcueadzi000a3b6spk404zpz" }, { "id": "cl126txta001y2e6dtxrbsnek", "type": "text", - "groupId": "cl126p75m001j2e6d73qmes0m", "content": { "html": "
You can reach out to me using the contact bubble on the bottom right corner 🤓
", "richText": [ @@ -395,11 +367,11 @@ } ], "plainText": "You can reach out to me using the contact bubble on the bottom right corner 🤓" - } + }, + "groupId": "clcueadzi000a3b6spk404zpz" }, { "id": "cl12buyly00172e6991bz38ch", - "groupId": "cl126p75m001j2e6d73qmes0m", "type": "text", "content": { "html": "
Let's create your first typebot...
", @@ -410,91 +382,41 @@ } ], "plainText": "Let's create your first typebot..." - } - }, - { - "id": "cl12bwpi800182e69kcivnp1s", - "groupId": "cl126p75m001j2e6d73qmes0m", - "type": "Code", - "options": { - "name": "Go to typebot creation", - "content": "setTimeout(() => {window.location.href = \"https://app.typebot.io/typebots/create?isFirstBot=true\"}, 4000)" - } + }, + "groupId": "clcueadzi000a3b6spk404zpz" } ], - "title": "Group #7", - "graphCoordinates": { "x": 1612, "y": 1103 } + "graphCoordinates": { "x": 1585.6402200792238, "y": 219.28927860860924 } }, { - "id": "cl126pv6w001n2e6dp0qkvthu", + "id": "clcueadzi000b3b6sv6936vs4", + "title": "Other category", "blocks": [ { "id": "cl127yxym000b2e6d9hksxo6h", "type": "text", - "groupId": "cl126pv6w001n2e6dp0qkvthu", "content": { "html": "
What else?
", "richText": [ { "type": "p", "children": [{ "text": "What else?" }] } ], "plainText": "What else?" - } + }, + "groupId": "clcueadzi000b3b6sv6936vs4" }, { "id": "cl126pv7n001o2e6dajltc4qz", "type": "text input", - "groupId": "cl126pv6w001n2e6dp0qkvthu", + "groupId": "clcueadzi000b3b6sv6936vs4", "options": { "isLong": false, "labels": { "button": "Send", "placeholder": "Type your answer" }, "variableId": "cl126q38p001q2e6d0hj23f6b" - } - }, - { - "id": "cl128b34o00192e6dqjxs3cxf", - "type": "Code", - "groupId": "cl126pv6w001n2e6dp0qkvthu", - "options": { - "name": "Store Other categories in DB", - "content": "postMessage({from: \"typebot\", action: \"storeOtherCategories\", content: {{Other categories}}}, \"*\")" }, - "outgoingEdgeId": "cl128c0fu001a2e6droq69g6z" + "outgoingEdgeId": "clcuehrt2000s3b6skmk7rhje" } ], - "title": "Group #8", - "graphCoordinates": { "x": 1943, "y": 895 } - }, - { - "id": "cl1278gx9002v2e6d4kf3v89s", - "blocks": [ - { - "id": "cl1278gyk002w2e6d744eb87n", - "type": "Condition", - "items": [ - { - "id": "cl1278gyk002x2e6dwmpzs3nf", - "type": 1, - "blockId": "cl1278gyk002w2e6d744eb87n", - "content": { - "comparisons": [ - { - "id": "cl1278irq002y2e6dv4965diw", - "value": "Other", - "variableId": "cl126mo3t001b2e6dvyi16bkd", - "comparisonOperator": "Contains" - } - ], - "logicalOperator": "AND" - }, - "outgoingEdgeId": "cl1278r3b002z2e6d6d6rk9dh" - } - ], - "groupId": "cl1278gx9002v2e6d4kf3v89s", - "outgoingEdgeId": "cl1278trd00312e6dxmzhcmmn" - } - ], - "title": "Group #13", - "graphCoordinates": { "x": 1585, "y": 792 } + "graphCoordinates": { "x": 1369.6844213687823, "y": -7.90789096298402 } } ], "variables": [ @@ -505,99 +427,71 @@ ], "edges": [ { - "id": "cl1266kt100082e6d1wks5dtp", - "to": { "groupId": "cl1266bah00032e6dgdnj4vgz" }, - "from": { - "blockId": "cl1265zct0001mb1afel460do", - "groupId": "cl1265zct0000mb1a6bir36w7" - } - }, - { - "id": "cl126jsoo000x2e6ditu7dgf8", - "to": { "groupId": "cl126jioj000u2e6dqssno3hv" }, - "from": { - "itemId": "cl126jb2q000s2e6dm60yq5p2", - "blockId": "cl126jb2q000r2e6dgqlnxnt8", - "groupId": "cl126ixoq000p2e6dfbz9sype" - } - }, - { - "id": "cl126l5tx00122e6dmisci6h5", - "to": { "groupId": "cl126krbp00102e6dnjelmfa1" }, + "id": "clcueadzi000f3b6sb7lxyeta", + "to": { "groupId": "clcueadzi00093b6s82ivles8" }, "from": { "itemId": "cl126jc5a000t2e6dqv91w7j6", "blockId": "cl126jb2q000r2e6dgqlnxnt8", - "groupId": "cl126ixoq000p2e6dfbz9sype" + "groupId": "clcueadzi00073b6sqz8n5vxp" } }, { - "id": "cl1278r3b002z2e6d6d6rk9dh", - "to": { "groupId": "cl126pv6w001n2e6dp0qkvthu" }, + "id": "clcueadzi000g3b6sdb6o0xet", + "to": { "groupId": "clcueadzi000b3b6sv6936vs4" }, "from": { "itemId": "cl1278gyk002x2e6dwmpzs3nf", "blockId": "cl1278gyk002w2e6d744eb87n", - "groupId": "cl1278gx9002v2e6d4kf3v89s" + "groupId": "clcueadzi00093b6s82ivles8" } }, { - "id": "cl1278trd00312e6dxmzhcmmn", - "to": { "groupId": "cl126p75m001j2e6d73qmes0m" }, + "id": "clcueadzi000h3b6shpxplygo", + "to": { "groupId": "clcueadzi000a3b6spk404zpz" }, "from": { "blockId": "cl1278gyk002w2e6d744eb87n", - "groupId": "cl1278gx9002v2e6d4kf3v89s" - } - }, - { - "id": "cl128ag8i00162e6dufv3tgo0", - "to": { "groupId": "cl126krbp00102e6dnjelmfa1" }, - "from": { - "blockId": "cl12890kw00132e6dp9v5dexm", - "groupId": "cl126jioj000u2e6dqssno3hv" + "groupId": "clcueadzi00093b6s82ivles8" } }, { - "id": "cl128azam00182e6dct61k7v5", - "to": { "groupId": "cl1278gx9002v2e6d4kf3v89s" }, + "id": "clcueadzi000l3b6smlf218u7", + "to": { "groupId": "clcueadzi00073b6sqz8n5vxp" }, "from": { - "blockId": "cl128ain900172e6d1osj4u90", - "groupId": "cl126krbp00102e6dnjelmfa1" + "itemId": "cl1266bam00052e6dn1sdjnax", + "blockId": "cl1266bam00042e6dm0gn22vy", + "groupId": "clcueadzi00063b6sch7b1f32" } }, { - "id": "cl128c0fu001a2e6droq69g6z", - "to": { "groupId": "cl126p75m001j2e6d73qmes0m" }, "from": { - "blockId": "cl128b34o00192e6dqjxs3cxf", - "groupId": "cl126pv6w001n2e6dp0qkvthu" - } + "groupId": "clcueadzi00073b6sqz8n5vxp", + "blockId": "cl126jioz000v2e6dwrk1f2cb" + }, + "to": { "groupId": "clcueadzi00093b6s82ivles8" }, + "id": "clcueb0cl000p3b6sisrc741n" }, { "from": { - "groupId": "cl1266bah00032e6dgdnj4vgz", - "blockId": "cl1266bam00042e6dm0gn22vy", - "itemId": "cl1266bam00052e6dn1sdjnax" + "groupId": "clcueadzi00063b6sch7b1f32", + "blockId": "cl126820m000g2e6dfleq78bt" }, - "to": { "groupId": "cl126ixoq000p2e6dfbz9sype" }, - "id": "cl12bk3j6000c2e69bak89ja9" + "to": { "groupId": "clcueadzi00073b6sqz8n5vxp" }, + "id": "clcuecvjo000q3b6s42ouw3zz" }, { "from": { - "groupId": "cl1267q1z000d2e6d949f2ge4", - "blockId": "cl1289y1s00142e6dvbkpvbje" - }, - "to": { - "groupId": "cl126ixoq000p2e6dfbz9sype", - "blockId": "cl126hb9m000l2e6d5qk3mohn" + "groupId": "clcueadzi00043b6s1r8wnql8", + "blockId": "cl1265zct0001mb1afel460do" }, - "id": "cl12bk56s000d2e69oll3nqxm" + "to": { "groupId": "clcueadzi00063b6sch7b1f32" }, + "id": "clcuefdfv000r3b6sqzv3prz3" }, { "from": { - "groupId": "cl1266bah00032e6dgdnj4vgz", - "blockId": "cl1266bam00042e6dm0gn22vy" + "groupId": "clcueadzi000b3b6sv6936vs4", + "blockId": "cl126pv7n001o2e6dajltc4qz" }, - "to": { "groupId": "cl1267q1z000d2e6d949f2ge4" }, - "id": "cl12bnfyd000g2e69g7lr3czq" + "to": { "groupId": "clcueadzi000a3b6spk404zpz" }, + "id": "clcuehrt2000s3b6skmk7rhje" } ], "theme": { @@ -608,12 +502,12 @@ "placeholderColor": "#9095A0" }, "buttons": { "color": "#FFFFFF", "backgroundColor": "#0042DA" }, - "hostBubbles": { "color": "#303235", "backgroundColor": "#F7F8FF" }, - "guestBubbles": { "color": "#FFFFFF", "backgroundColor": "#FF8E21" }, "hostAvatar": { - "isEnabled": true, - "url": "https://s3.eu-west-3.amazonaws.com/typebot/typebots/ckzp7a2za005809lczf2knzix/273013187_1315820332248257_6244778509534754615_n.jpg" - } + "url": "https://avatars.githubusercontent.com/u/16015833?v=4", + "isEnabled": true + }, + "hostBubbles": { "color": "#303235", "backgroundColor": "#F7F8FF" }, + "guestBubbles": { "color": "#FFFFFF", "backgroundColor": "#FF8E21" } }, "general": { "font": "Open Sans", @@ -631,6 +525,10 @@ }, "typingEmulation": { "speed": 300, "enabled": true, "maxDelay": 1.5 } }, - "publicId": "typebot-onboarding", - "customDomain": null + "publicId": null, + "customDomain": null, + "workspaceId": "proWorkspace", + "resultsTablePreferences": null, + "isArchived": false, + "isClosed": false } diff --git a/apps/builder/public/templates/faq.json b/apps/builder/public/templates/faq.json index 0a0160b036..8922485a1d 100644 --- a/apps/builder/public/templates/faq.json +++ b/apps/builder/public/templates/faq.json @@ -557,7 +557,7 @@ }, "settings": { "general": { - "isBrandingEnabled": false, + "isBrandingEnabled": true, "isInputPrefillEnabled": true, "isHideQueryParamsEnabled": true, "isNewResultOnRefreshEnabled": false diff --git a/apps/builder/public/templates/lead-gen.json b/apps/builder/public/templates/lead-gen.json index 555a596764..82993dd34e 100644 --- a/apps/builder/public/templates/lead-gen.json +++ b/apps/builder/public/templates/lead-gen.json @@ -337,7 +337,10 @@ }, "buttons": { "color": "#FFFFFF", "backgroundColor": "#0042DA" }, "hostBubbles": { "color": "#303235", "backgroundColor": "#F7F8FF" }, - "guestBubbles": { "color": "#FFFFFF", "backgroundColor": "#FF8E21" } + "guestBubbles": { "color": "#FFFFFF", "backgroundColor": "#FF8E21" }, + "hostAvatar": { + "isEnabled": true + } }, "general": { "font": "Open Sans", diff --git a/apps/builder/src/assets/styles/codeMirror.css b/apps/builder/src/assets/styles/codeMirror.css deleted file mode 100644 index e88793c6fd..0000000000 --- a/apps/builder/src/assets/styles/codeMirror.css +++ /dev/null @@ -1,9 +0,0 @@ -.cm-editor { - outline: 0px solid transparent !important; - height: 100%; - border-radius: 0.25rem; -} - -.cm-scroller { - border-radius: 5px; -} diff --git a/apps/builder/src/components/CodeEditor.tsx b/apps/builder/src/components/CodeEditor.tsx index 2b2da9f969..4f79f790ee 100644 --- a/apps/builder/src/components/CodeEditor.tsx +++ b/apps/builder/src/components/CodeEditor.tsx @@ -1,29 +1,26 @@ import { - Box, BoxProps, + Fade, HStack, - useColorMode, useColorModeValue, + useDisclosure, } from '@chakra-ui/react' -import { EditorView, basicSetup } from 'codemirror' -import { EditorState } from '@codemirror/state' -import { json, jsonParseLinter } from '@codemirror/lang-json' -import { css } from '@codemirror/lang-css' -import { javascript } from '@codemirror/lang-javascript' -import { html } from '@codemirror/lang-html' -import { oneDark } from '@codemirror/theme-one-dark' -import { useEffect, useRef, useState } from 'react' +import { useRef, useState } from 'react' import { useDebouncedCallback } from 'use-debounce' -import { linter, LintSource } from '@codemirror/lint' import { VariablesButton } from '@/features/variables' import { Variable } from 'models' import { env } from 'utils' - -const linterExtension = linter(jsonParseLinter() as unknown as LintSource) +import CodeMirror, { ReactCodeMirrorRef } from '@uiw/react-codemirror' +import { tokyoNight } from '@uiw/codemirror-theme-tokyo-night' +import { githubLight } from '@uiw/codemirror-theme-github' +import { LanguageName, loadLanguage } from '@uiw/codemirror-extensions-langs' +import { isDefined } from '@udecode/plate-common' +import { CopyButton } from './CopyButton' type Props = { - value: string - lang?: 'css' | 'json' | 'js' | 'html' + value?: string + defaultValue?: string + lang: LanguageName isReadOnly?: boolean debounceTimeout?: number withVariableButton?: boolean @@ -31,7 +28,7 @@ type Props = { onChange?: (value: string) => void } export const CodeEditor = ({ - value, + defaultValue, lang, onChange, height = '250px', @@ -40,91 +37,25 @@ export const CodeEditor = ({ debounceTimeout = 1000, ...props }: Props & Omit) => { - const isDark = useColorMode().colorMode === 'dark' - const editorContainer = useRef(null) - const editorView = useRef(null) - const [, setPlainTextValue] = useState(value) + const theme = useColorModeValue(githubLight, tokyoNight) + const codeEditor = useRef(null) const [carretPosition, setCarretPosition] = useState(0) const isVariableButtonDisplayed = withVariableButton && !isReadOnly + const [value, _setValue] = useState(defaultValue ?? '') + const { onOpen, onClose, isOpen } = useDisclosure() - const debounced = useDebouncedCallback( + const setValue = useDebouncedCallback( (value) => { - setPlainTextValue(value) + _setValue(value) onChange && onChange(value) }, env('E2E_TEST') === 'true' ? 0 : debounceTimeout ) - useEffect( - () => () => { - debounced.flush() - }, - [debounced] - ) - - useEffect(() => { - if (!editorView.current || !isReadOnly) return - editorView.current.dispatch({ - changes: { - from: 0, - to: editorView.current.state.doc.length, - insert: value, - }, - }) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [value]) - - useEffect(() => { - const editor = initEditor(value) - return () => { - editor?.destroy() - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) - - const initEditor = (value: string) => { - if (!editorContainer.current) return - const updateListenerExtension = EditorView.updateListener.of((update) => { - if (update.docChanged && onChange) - debounced(update.state.doc.toJSON().join('\n')) - }) - const extensions = [ - updateListenerExtension, - basicSetup, - EditorState.readOnly.of(isReadOnly), - ] - if (isDark) extensions.push(oneDark) - if (lang === 'json') { - extensions.push(json()) - extensions.push(linterExtension) - } - if (lang === 'css') extensions.push(css()) - if (lang === 'js') extensions.push(javascript()) - if (lang === 'html') extensions.push(html()) - extensions.push( - EditorView.theme({ - '&': { maxHeight: '500px' }, - '.cm-gutter,.cm-content': { minHeight: isReadOnly ? '0' : height }, - '.cm-scroller': { overflow: 'auto' }, - }) - ) - const editor = new EditorView({ - state: EditorState.create({ - extensions, - }), - parent: editorContainer.current, - }) - editor.dispatch({ - changes: { from: 0, insert: value }, - }) - editorView.current = editor - return editor - } - const handleVariableSelected = (variable?: Pick) => { - editorView.current?.focus() + codeEditor.current?.view?.focus() const insert = `{{${variable?.name}}}` - editorView.current?.dispatch({ + codeEditor.current?.view?.dispatch({ changes: { from: carretPosition, insert, @@ -133,9 +64,10 @@ export const CodeEditor = ({ }) } - const handleKeyUp = () => { - if (!editorContainer.current) return - setCarretPosition(editorView.current?.state.selection.main.from ?? 0) + const handleChange = (newValue: string) => { + if (isDefined(props.value)) return + setValue(newValue) + setCarretPosition(codeEditor.current?.state?.selection.main.head ?? 0) } return ( @@ -143,19 +75,61 @@ export const CodeEditor = ({ align="flex-end" spacing={0} borderWidth={'1px'} - borderRadius="md" - bg={useColorModeValue('#FCFCFC', '#282C34')} + rounded="md" + bg={useColorModeValue('white', '#1A1B26')} + width="full" + h="full" + pos="relative" + onMouseEnter={onOpen} + onMouseLeave={onClose} + sx={{ + '& .cm-editor': { + maxH: '70vh', + outline: '0px solid transparent !important', + rounded: 'md', + }, + '& .cm-scroller': { + rounded: 'md', + overflow: 'auto', + }, + '& .cm-gutter,.cm-content': { + minH: isReadOnly ? '0' : height, + }, + '& .ͼ1 .cm-scroller': { + fontSize: '14px', + fontFamily: + 'JetBrainsMono, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace', + }, + }} > - {isVariableButtonDisplayed && ( )} + {isReadOnly && ( + + + + )} ) } diff --git a/apps/builder/src/components/ColorPicker.tsx b/apps/builder/src/components/ColorPicker.tsx index 0fa336fd03..cc06b0c6ae 100644 --- a/apps/builder/src/components/ColorPicker.tsx +++ b/apps/builder/src/components/ColorPicker.tsx @@ -29,12 +29,12 @@ const colorsSelection: `#${string}`[] = [ ] type Props = { - initialColor: string + initialColor?: string onColorChange: (color: string) => void } export const ColorPicker = ({ initialColor, onColorChange }: Props) => { - const [color, setColor] = useState(initialColor) + const [color, setColor] = useState(initialColor ?? '') useEffect(() => { onColorChange(color) diff --git a/apps/builder/src/components/Seo.tsx b/apps/builder/src/components/Seo.tsx index 0a2d769065..599547a7bd 100644 --- a/apps/builder/src/components/Seo.tsx +++ b/apps/builder/src/components/Seo.tsx @@ -2,7 +2,6 @@ import Head from 'next/head' export const Seo = ({ title, - currentUrl = 'https://app.typebot.io', description = 'Create and publish conversational forms that collect 4 times more answers and feel native to your product', imagePreviewUrl = 'https://app.typebot.io/site-preview.png', }: { @@ -20,9 +19,6 @@ export const Seo = ({ - - - diff --git a/apps/builder/src/components/SupportBubble.tsx b/apps/builder/src/components/SupportBubble.tsx index 55bd4b2c4b..faa2b8f2a2 100644 --- a/apps/builder/src/components/SupportBubble.tsx +++ b/apps/builder/src/components/SupportBubble.tsx @@ -1,43 +1,35 @@ import { useTypebot } from '@/features/editor' import { useUser } from '@/features/account' import { useWorkspace } from '@/features/workspace' -import React, { useEffect, useState } from 'react' -import { initBubble } from 'typebot-js' -import { isCloudProdInstance } from '@/utils/helpers' +import React from 'react' +import { Bubble } from '@typebot.io/react' import { planToReadable } from '@/features/billing' +import { isCloudProdInstance } from '@/utils/helpers' export const SupportBubble = () => { const { typebot } = useTypebot() const { user } = useUser() const { workspace } = useWorkspace() - const [localTypebotId, setLocalTypebotId] = useState(typebot?.id) - const [localUserId, setLocalUserId] = useState(user?.id) - useEffect(() => { - if ( - isCloudProdInstance && - (localTypebotId !== typebot?.id || localUserId !== user?.id) - ) { - setLocalTypebotId(typebot?.id) - setLocalUserId(user?.id) - initBubble({ - url: `https://viewer.typebot.io/typebot-support`, - backgroundColor: '#ffffff', - button: { - color: '#0042DA', - }, - hiddenVariables: { - 'User ID': user?.id, - 'First name': user?.name?.split(' ')[0] ?? undefined, - Email: user?.email ?? undefined, - 'Typebot ID': typebot?.id, - 'Avatar URL': user?.image ?? undefined, - Plan: planToReadable(workspace?.plan), - }, - }) - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [user, typebot]) + if (!isCloudProdInstance) return null - return <> + return ( + + ) } diff --git a/apps/builder/src/components/inputs/SmartNumberInput.tsx b/apps/builder/src/components/inputs/SmartNumberInput.tsx index 9a37b5316c..3afd7f6506 100644 --- a/apps/builder/src/components/inputs/SmartNumberInput.tsx +++ b/apps/builder/src/components/inputs/SmartNumberInput.tsx @@ -93,6 +93,7 @@ export const SmartNumberInput = ({ as={HStack} isRequired={isRequired} justifyContent="space-between" + width={label ? 'full' : 'auto'} > {label && ( diff --git a/apps/builder/src/features/auth/constants.ts b/apps/builder/src/features/auth/constants.ts index 68ad70e92f..c183e2afd7 100644 --- a/apps/builder/src/features/auth/constants.ts +++ b/apps/builder/src/features/auth/constants.ts @@ -5,12 +5,12 @@ export const mockedUser: User = { name: 'John Doe', email: 'user@email.com', company: null, - createdAt: new Date(), + createdAt: new Date('2022-01-01'), emailVerified: null, graphNavigation: 'TRACKPAD', preferredAppAppearance: null, image: 'https://avatars.githubusercontent.com/u/16015833?v=4', - lastActivityAt: new Date(), + lastActivityAt: new Date('2022-01-01'), onboardingCategories: [], - updatedAt: new Date(), + updatedAt: new Date('2022-01-01'), } diff --git a/apps/builder/src/features/blocks/bubbles/audio/audio.spec.ts b/apps/builder/src/features/blocks/bubbles/audio/audio.spec.ts index 840ed19ce4..421d134aef 100644 --- a/apps/builder/src/features/blocks/bubbles/audio/audio.spec.ts +++ b/apps/builder/src/features/blocks/bubbles/audio/audio.spec.ts @@ -4,7 +4,6 @@ import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' import { BubbleBlockType, defaultAudioBubbleContent } from 'models' import { createId } from '@paralleldrive/cuid2' import { getTestAsset } from '@/test/utils/playwright' -import { typebotViewer } from 'utils/playwright/testHelpers' const audioSampleUrl = 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3' @@ -34,7 +33,7 @@ test('should work as expected', async ({ page }) => { RegExp(`/public/typebots/${typebotId}/blocks`, 'gm') ) await page.getByRole('button', { name: 'Preview', exact: true }).click() - await expect(typebotViewer(page).locator('audio')).toHaveAttribute( + await expect(page.locator('audio')).toHaveAttribute( 'src', RegExp(`/public/typebots/${typebotId}/blocks`, 'gm') ) diff --git a/apps/builder/src/features/blocks/bubbles/embed/embed.spec.ts b/apps/builder/src/features/blocks/bubbles/embed/embed.spec.ts index 580a7225cf..65df373201 100644 --- a/apps/builder/src/features/blocks/bubbles/embed/embed.spec.ts +++ b/apps/builder/src/features/blocks/bubbles/embed/embed.spec.ts @@ -3,7 +3,6 @@ import { BubbleBlockType, defaultEmbedBubbleContent } from 'models' import { createId } from '@paralleldrive/cuid2' import { createTypebots } from 'utils/playwright/databaseActions' import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' -import { typebotViewer } from 'utils/playwright/testHelpers' const pdfSrc = 'https://www.orimi.com/pdf-test.pdf' const siteSrc = 'https://app.cal.com/baptistearno/15min' @@ -47,9 +46,10 @@ test.describe.parallel('Embed bubble block', () => { await page.goto(`/typebots/${typebotId}/edit`) await page.click('text=Preview') - await expect( - typebotViewer(page).locator('iframe#embed-bubble-content') - ).toHaveAttribute('src', siteSrc) + await expect(page.locator('iframe#embed-bubble-content')).toHaveAttribute( + 'src', + siteSrc + ) }) }) }) diff --git a/apps/builder/src/features/blocks/bubbles/image/image.spec.ts b/apps/builder/src/features/blocks/bubbles/image/image.spec.ts index 119fd089b0..3df5c5cfee 100644 --- a/apps/builder/src/features/blocks/bubbles/image/image.spec.ts +++ b/apps/builder/src/features/blocks/bubbles/image/image.spec.ts @@ -3,7 +3,6 @@ import { createTypebots } from 'utils/playwright/databaseActions' import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' import { BubbleBlockType, defaultImageBubbleContent } from 'models' import { createId } from '@paralleldrive/cuid2' -import { typebotViewer } from 'utils/playwright/testHelpers' import { getTestAsset } from '@/test/utils/playwright' const unsplashImageSrc = @@ -117,10 +116,7 @@ test.describe.parallel('Image bubble block', () => { await page.goto(`/typebots/${typebotId}/edit`) await page.click('text=Preview') - await expect(typebotViewer(page).locator('img')).toHaveAttribute( - 'src', - unsplashImageSrc - ) + await expect(page.locator('img')).toHaveAttribute('src', unsplashImageSrc) }) }) }) diff --git a/apps/builder/src/features/blocks/bubbles/textBubble/textBubble.spec.ts b/apps/builder/src/features/blocks/bubbles/textBubble/textBubble.spec.ts index 2db4ba0aa7..92877a7d51 100644 --- a/apps/builder/src/features/blocks/bubbles/textBubble/textBubble.spec.ts +++ b/apps/builder/src/features/blocks/bubbles/textBubble/textBubble.spec.ts @@ -3,7 +3,6 @@ import { createTypebots } from 'utils/playwright/databaseActions' import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' import { BubbleBlockType, defaultTextBubbleContent } from 'models' import { createId } from '@paralleldrive/cuid2' -import { typebotViewer } from 'utils/playwright/testHelpers' test.describe('Text bubble block', () => { test('rich text features should work', async ({ page }) => { @@ -51,17 +50,17 @@ test.describe('Text bubble block', () => { await page.getByRole('menuitem', { name: 'Create test' }).click() await page.click('text=Preview') + await expect(page.locator('span.slate-bold >> nth=0')).toHaveText( + 'Bold text' + ) + await expect(page.locator('span.slate-italic >> nth=0')).toHaveText( + 'Italic text' + ) + await expect(page.locator('span.slate-underline >> nth=0')).toHaveText( + 'Underlined text' + ) await expect( - typebotViewer(page).locator('span.slate-bold >> nth=0') - ).toHaveText('Bold text') - await expect( - typebotViewer(page).locator('span.slate-italic >> nth=0') - ).toHaveText('Italic text') - await expect( - typebotViewer(page).locator('span.slate-underline >> nth=0') - ).toHaveText('Underlined text') - await expect( - typebotViewer(page).locator('a[href="https://github.com"]') + page.locator('typebot-standard').locator('a[href="https://github.com"]') ).toHaveText('My super link') }) }) diff --git a/apps/builder/src/features/blocks/bubbles/video/video.spec.ts b/apps/builder/src/features/blocks/bubbles/video/video.spec.ts index f0a95def01..52b070af66 100644 --- a/apps/builder/src/features/blocks/bubbles/video/video.spec.ts +++ b/apps/builder/src/features/blocks/bubbles/video/video.spec.ts @@ -7,7 +7,6 @@ import { VideoBubbleContentType, } from 'models' import { createId } from '@paralleldrive/cuid2' -import { typebotViewer } from 'utils/playwright/testHelpers' const videoSrc = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4' @@ -57,9 +56,10 @@ test.describe.parallel('Video bubble block', () => { await page.goto(`/typebots/${typebotId}/edit`) await page.click('text=Preview') - await expect( - typebotViewer(page).locator('video > source') - ).toHaveAttribute('src', videoSrc) + await expect(page.locator('video > source').nth(1)).toHaveAttribute( + 'src', + videoSrc + ) }) test('should display youtube video correctly', async ({ page }) => { @@ -80,7 +80,7 @@ test.describe.parallel('Video bubble block', () => { await page.goto(`/typebots/${typebotId}/edit`) await page.click('text=Preview') - await expect(typebotViewer(page).locator('iframe')).toHaveAttribute( + await expect(page.locator('iframe').nth(1)).toHaveAttribute( 'src', 'https://www.youtube.com/embed/dQw4w9WgXcQ' ) @@ -104,7 +104,7 @@ test.describe.parallel('Video bubble block', () => { await page.goto(`/typebots/${typebotId}/edit`) await page.click('text=Preview') - await expect(typebotViewer(page).locator('iframe')).toHaveAttribute( + await expect(page.locator('iframe').nth(1)).toHaveAttribute( 'src', 'https://player.vimeo.com/video/649301125' ) diff --git a/apps/builder/src/features/blocks/inputs/buttons/buttons.spec.ts b/apps/builder/src/features/blocks/inputs/buttons/buttons.spec.ts index 3ec721fedd..dcad1c7431 100644 --- a/apps/builder/src/features/blocks/inputs/buttons/buttons.spec.ts +++ b/apps/builder/src/features/blocks/inputs/buttons/buttons.spec.ts @@ -6,7 +6,6 @@ import { import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' import { defaultChoiceInputOptions, InputBlockType, ItemType } from 'models' import { createId } from '@paralleldrive/cuid2' -import { typebotViewer } from 'utils/playwright/testHelpers' import { getTestAsset } from '@/test/utils/playwright' test.describe.parallel('Buttons input block', () => { @@ -42,10 +41,10 @@ test.describe.parallel('Buttons input block', () => { await expect(page.locator('text=Item 2')).toBeHidden() await page.click('text=Preview') - const item3Button = typebotViewer(page).locator('button >> text=Item 3') + const item3Button = page.locator('button >> text=Item 3') await item3Button.click() await expect(item3Button).toBeHidden() - await expect(typebotViewer(page).locator('text=Item 3')).toBeVisible() + await expect(page.getByTestId('guest-bubble')).toHaveText('Item 3') await page.click('button[aria-label="Close"]') await page.click('[data-testid="block2-icon"]') @@ -64,13 +63,11 @@ test.describe.parallel('Buttons input block', () => { await page.click('text=Preview') - await typebotViewer(page).locator('button >> text="Item 3"').click() - await typebotViewer(page).locator('button >> text="Item 1"').click() - await typebotViewer(page).locator('text=Go').click() + await page.locator('button >> text="Item 3"').click() + await page.locator('button >> text="Item 1"').click() + await page.locator('text=Go').click() - await expect( - typebotViewer(page).locator('text="Item 3, Item 1"') - ).toBeVisible() + await expect(page.locator('text="Item 3, Item 1"')).toBeVisible() }) }) @@ -85,18 +82,18 @@ test('Variable buttons should work', async ({ page }) => { await page.goto(`/typebots/${typebotId}/edit`) await page.click('text=Preview') - await typebotViewer(page).locator('text=Variable item').click() - await expect(typebotViewer(page).locator('text=Variable item')).toBeVisible() - await expect(typebotViewer(page).locator('text=Ok great!')).toBeVisible() + await page.getByRole('button', { name: 'Variable item' }).click() + await expect(page.getByTestId('guest-bubble')).toHaveText('Variable item') + await expect(page.locator('text=Ok great!')).toBeVisible() await page.click('text="Item 1"') await page.fill('input[value="Item 1"]', '{{Item 2}}') await page.click('[data-testid="block1-icon"]') await page.click('text=Multiple choice?') await page.click('text="Restart"') - await typebotViewer(page).locator('text="Variable item" >> nth=0').click() - await typebotViewer(page).locator('text="Variable item" >> nth=1').click() - await typebotViewer(page).locator('text="Send"').click() + await page.getByTestId('button').first().click() + await page.getByTestId('button').nth(1).click() + await page.locator('text="Send"').click() await expect( - typebotViewer(page).locator('text="Variable item, Variable item"') + page.locator('text="Variable item, Variable item"') ).toBeVisible() }) diff --git a/apps/builder/src/features/blocks/inputs/date/date.spec.ts b/apps/builder/src/features/blocks/inputs/date/date.spec.ts index 0301a42486..12d8564a7d 100644 --- a/apps/builder/src/features/blocks/inputs/date/date.spec.ts +++ b/apps/builder/src/features/blocks/inputs/date/date.spec.ts @@ -2,7 +2,6 @@ import test, { expect } from '@playwright/test' import { createTypebots } from 'utils/playwright/databaseActions' import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' import { defaultDateInputOptions, InputBlockType } from 'models' -import { typebotViewer } from 'utils/playwright/testHelpers' import { createId } from '@paralleldrive/cuid2' test.describe('Date input block', () => { @@ -21,15 +20,14 @@ test.describe('Date input block', () => { await page.goto(`/typebots/${typebotId}/edit`) await page.click('text=Preview') - await expect( - typebotViewer(page).locator('[data-testid="from-date"]') - ).toHaveAttribute('type', 'date') - await expect(typebotViewer(page).locator(`button`)).toBeDisabled() - await typebotViewer(page) - .locator('[data-testid="from-date"]') - .fill('2021-01-01') - await typebotViewer(page).locator(`button`).click() - await expect(typebotViewer(page).locator('text="01/01/2021"')).toBeVisible() + await expect(page.locator('[data-testid="from-date"]')).toHaveAttribute( + 'type', + 'date' + ) + await expect(page.getByRole('button', { name: 'Send' })).toBeDisabled() + await page.locator('[data-testid="from-date"]').fill('2021-01-01') + await page.getByRole('button', { name: 'Send' }).click() + await expect(page.locator('text="01/01/2021"')).toBeVisible() await page.click(`text=Pick a date...`) await page.click('text=Is range?') @@ -39,23 +37,19 @@ test.describe('Date input block', () => { await page.fill('#button', 'Go') await page.click('text=Restart') + await expect(page.locator(`[data-testid="from-date"]`)).toHaveAttribute( + 'type', + 'datetime-local' + ) + await expect(page.locator(`[data-testid="to-date"]`)).toHaveAttribute( + 'type', + 'datetime-local' + ) + await page.locator('[data-testid="from-date"]').fill('2021-01-01T11:00') + await page.locator('[data-testid="to-date"]').fill('2022-01-01T09:00') + await page.getByRole('button', { name: 'Go' }).click() await expect( - typebotViewer(page).locator(`[data-testid="from-date"]`) - ).toHaveAttribute('type', 'datetime-local') - await expect( - typebotViewer(page).locator(`[data-testid="to-date"]`) - ).toHaveAttribute('type', 'datetime-local') - await typebotViewer(page) - .locator('[data-testid="from-date"]') - .fill('2021-01-01T11:00') - await typebotViewer(page) - .locator('[data-testid="to-date"]') - .fill('2022-01-01T09:00') - await typebotViewer(page).locator(`button`).click() - await expect( - typebotViewer(page).locator( - 'text="01/01/2021, 11:00 AM to 01/01/2022, 09:00 AM"' - ) + page.locator('text="01/01/2021, 11:00 AM to 01/01/2022, 09:00 AM"') ).toBeVisible() }) }) diff --git a/apps/builder/src/features/blocks/inputs/emailInput/emailInput.spec.ts b/apps/builder/src/features/blocks/inputs/emailInput/emailInput.spec.ts index 01b2966c75..6feecadc49 100644 --- a/apps/builder/src/features/blocks/inputs/emailInput/emailInput.spec.ts +++ b/apps/builder/src/features/blocks/inputs/emailInput/emailInput.spec.ts @@ -2,7 +2,6 @@ import test, { expect } from '@playwright/test' import { createTypebots } from 'utils/playwright/databaseActions' import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' import { defaultEmailInputOptions, InputBlockType } from 'models' -import { typebotViewer } from 'utils/playwright/testHelpers' import { createId } from '@paralleldrive/cuid2' test.describe('Email input block', () => { @@ -22,11 +21,11 @@ test.describe('Email input block', () => { await page.click('text=Preview') await expect( - typebotViewer(page).locator( + page.locator( `input[placeholder="${defaultEmailInputOptions.labels.placeholder}"]` ) ).toHaveAttribute('type', 'email') - await expect(typebotViewer(page).locator(`button`)).toBeDisabled() + await expect(page.getByRole('button', { name: 'Send' })).toBeDisabled() await page.click(`text=${defaultEmailInputOptions.labels.placeholder}`) await page.fill( @@ -41,19 +40,13 @@ test.describe('Email input block', () => { ) await page.click('text=Restart') - await typebotViewer(page) - .locator(`input[placeholder="Your email..."]`) - .fill('test@test') - await typebotViewer(page).locator('text=Go').click() - await expect( - typebotViewer(page).locator('text=Try again bro') - ).toBeVisible() - await typebotViewer(page) + await page.locator(`input[placeholder="Your email..."]`).fill('test@test') + await page.getByRole('button', { name: 'Go' }).click() + await expect(page.locator('text=Try again bro')).toBeVisible() + await page .locator(`input[placeholder="Your email..."]`) .fill('test@test.com') - await typebotViewer(page).locator('text=Go').click() - await expect( - typebotViewer(page).locator('text=test@test.com') - ).toBeVisible() + await page.getByRole('button', { name: 'Go' }).click() + await expect(page.locator('text=test@test.com')).toBeVisible() }) }) diff --git a/apps/builder/src/features/blocks/inputs/fileUpload/components/FileInputSettings.tsx b/apps/builder/src/features/blocks/inputs/fileUpload/components/FileInputSettings.tsx index fcedcf13ef..ced9e732ee 100644 --- a/apps/builder/src/features/blocks/inputs/fileUpload/components/FileInputSettings.tsx +++ b/apps/builder/src/features/blocks/inputs/fileUpload/components/FileInputSettings.tsx @@ -63,7 +63,7 @@ export const FileInputSettings = ({ options, onOptionsChange }: Props) => { diff --git a/apps/builder/src/features/blocks/inputs/fileUpload/fileUpload.spec.ts b/apps/builder/src/features/blocks/inputs/fileUpload/fileUpload.spec.ts index de6f095481..11a3258c9f 100644 --- a/apps/builder/src/features/blocks/inputs/fileUpload/fileUpload.spec.ts +++ b/apps/builder/src/features/blocks/inputs/fileUpload/fileUpload.spec.ts @@ -2,7 +2,6 @@ import test, { expect } from '@playwright/test' import { createTypebots } from 'utils/playwright/databaseActions' import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' import { defaultFileInputOptions, InputBlockType } from 'models' -import { typebotViewer } from 'utils/playwright/testHelpers' import { createId } from '@paralleldrive/cuid2' import { freeWorkspaceId } from 'utils/playwright/databaseSetup' import { getTestAsset } from '@/test/utils/playwright' @@ -24,14 +23,12 @@ test('options should work', async ({ page }) => { await page.goto(`/typebots/${typebotId}/edit`) await page.click('text=Preview') - await expect( - typebotViewer(page).locator(`text=Click to upload`) - ).toBeVisible() - await expect(typebotViewer(page).locator(`text="Skip"`)).toBeHidden() - await typebotViewer(page) + await expect(page.locator(`text=Click to upload`)).toBeVisible() + await expect(page.locator(`text="Skip"`)).toBeHidden() + await page .locator(`input[type="file"]`) .setInputFiles([getTestAsset('avatar.jpg')]) - await expect(typebotViewer(page).locator(`text=File uploaded`)).toBeVisible() + await expect(page.locator(`text=File uploaded`)).toBeVisible() await page.click('text="Collect file"') await page.click('text="Required?"') await page.click('text="Allow multiple files?"') @@ -41,20 +38,18 @@ test('options should work', async ({ page }) => { await page.fill('[value="Skip"]', 'Pass') await page.fill('input[value="10"]', '20') await page.click('text="Restart"') - await expect(typebotViewer(page).locator(`text="Pass"`)).toBeVisible() - await expect(typebotViewer(page).locator(`text="Upload now!!"`)).toBeVisible() - await typebotViewer(page) + await expect(page.locator(`text="Pass"`)).toBeVisible() + await expect(page.locator(`text="Upload now!!"`)).toBeVisible() + await page .locator(`input[type="file"]`) .setInputFiles([ getTestAsset('avatar.jpg'), getTestAsset('avatar.jpg'), getTestAsset('avatar.jpg'), ]) - await expect(typebotViewer(page).locator(`text="3"`)).toBeVisible() - await typebotViewer(page).locator('text="Go"').click() - await expect( - typebotViewer(page).locator(`text="3 files uploaded"`) - ).toBeVisible() + await expect(page.locator(`text="3"`)).toBeVisible() + await page.locator('text="Go"').click() + await expect(page.locator(`text="3 files uploaded"`)).toBeVisible() }) test.describe('Free workspace', () => { diff --git a/apps/builder/src/features/blocks/inputs/number/number.spec.ts b/apps/builder/src/features/blocks/inputs/number/number.spec.ts index 7580848135..db0af544f4 100644 --- a/apps/builder/src/features/blocks/inputs/number/number.spec.ts +++ b/apps/builder/src/features/blocks/inputs/number/number.spec.ts @@ -2,7 +2,6 @@ import test, { expect } from '@playwright/test' import { createTypebots } from 'utils/playwright/databaseActions' import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' import { defaultNumberInputOptions, InputBlockType } from 'models' -import { typebotViewer } from 'utils/playwright/testHelpers' import { createId } from '@paralleldrive/cuid2' test.describe('Number input block', () => { @@ -22,11 +21,11 @@ test.describe('Number input block', () => { await page.click('text=Preview') await expect( - typebotViewer(page).locator( + page.locator( `input[placeholder="${defaultNumberInputOptions.labels.placeholder}"]` ) ).toHaveAttribute('type', 'number') - await expect(typebotViewer(page).locator(`button`)).toBeDisabled() + await expect(page.getByRole('button', { name: 'Send' })).toBeDisabled() await page.click(`text=${defaultNumberInputOptions.labels.placeholder}`) await page.fill('#placeholder', 'Your number...') @@ -37,15 +36,13 @@ test.describe('Number input block', () => { await page.fill('[role="spinbutton"] >> nth=2', '10') await page.click('text=Restart') - const input = typebotViewer(page).locator( - `input[placeholder="Your number..."]` - ) + const input = page.locator(`input[placeholder="Your number..."]`) await input.fill('-1') await input.press('Enter') await input.fill('150') await input.press('Enter') await input.fill('50') await input.press('Enter') - await expect(typebotViewer(page).locator('text=50')).toBeVisible() + await expect(page.locator('text=50')).toBeVisible() }) }) diff --git a/apps/builder/src/features/blocks/inputs/payment/payment.spec.ts b/apps/builder/src/features/blocks/inputs/payment/payment.spec.ts index df1cfa097b..cc69d2f7dc 100644 --- a/apps/builder/src/features/blocks/inputs/payment/payment.spec.ts +++ b/apps/builder/src/features/blocks/inputs/payment/payment.spec.ts @@ -3,7 +3,6 @@ import { createTypebots } from 'utils/playwright/databaseActions' import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' import { defaultPaymentInputOptions, InputBlockType } from 'models' import { createId } from '@paralleldrive/cuid2' -import { typebotViewer } from 'utils/playwright/testHelpers' import { stripePaymentForm } from '@/test/utils/selectorUtils' test.describe('Payment input block', () => { @@ -59,9 +58,9 @@ test.describe('Payment input block', () => { .locator(`[placeholder="MM / YY"]`) .fill('12 / 25') await stripePaymentForm(page).locator(`[placeholder="CVC"]`).fill('240') - await typebotViewer(page).locator(`text="Pay 30€"`).click() + await page.locator(`text="Pay 30€"`).click() await expect( - typebotViewer(page).locator(`text="Your card has been declined."`) + page.locator(`text="Your card has been declined."`) ).toBeVisible() await stripePaymentForm(page) .locator(`[placeholder="1234 1234 1234 1234"]`) @@ -69,7 +68,7 @@ test.describe('Payment input block', () => { const zipInput = stripePaymentForm(page).getByPlaceholder('90210') const isZipInputVisible = await zipInput.isVisible() if (isZipInputVisible) await zipInput.fill('12345') - await typebotViewer(page).locator(`text="Pay 30€"`).click() - await expect(typebotViewer(page).locator(`text="Success"`)).toBeVisible() + await page.locator(`text="Pay 30€"`).click() + await expect(page.locator(`text="Success"`)).toBeVisible() }) }) diff --git a/apps/builder/src/features/blocks/inputs/phone/phone.spec.ts b/apps/builder/src/features/blocks/inputs/phone/phone.spec.ts index 774feaa5bd..c0530968c4 100644 --- a/apps/builder/src/features/blocks/inputs/phone/phone.spec.ts +++ b/apps/builder/src/features/blocks/inputs/phone/phone.spec.ts @@ -2,7 +2,6 @@ import test, { expect } from '@playwright/test' import { createTypebots } from 'utils/playwright/databaseActions' import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' import { defaultPhoneInputOptions, InputBlockType } from 'models' -import { typebotViewer } from 'utils/playwright/testHelpers' import { createId } from '@paralleldrive/cuid2' test.describe('Phone input block', () => { @@ -22,11 +21,11 @@ test.describe('Phone input block', () => { await page.click('text=Preview') await expect( - typebotViewer(page).locator( + page.locator( `input[placeholder="${defaultPhoneInputOptions.labels.placeholder}"]` ) ).toHaveAttribute('type', 'tel') - await expect(typebotViewer(page).locator(`button`)).toBeDisabled() + await expect(page.getByRole('button', { name: 'Send' })).toBeDisabled() await page.click(`text=${defaultPhoneInputOptions.labels.placeholder}`) await page.fill('#placeholder', '+33 XX XX XX XX') @@ -37,21 +36,14 @@ test.describe('Phone input block', () => { ) await page.click('text=Restart') - await typebotViewer(page) - .locator(`input[placeholder="+33 XX XX XX XX"]`) - .fill('+33 6 73') - await expect(typebotViewer(page).locator(`img`)).toHaveAttribute( - 'alt', - 'France' - ) - await typebotViewer(page).locator('button >> text="Go"').click() - await expect( - typebotViewer(page).locator('text=Try again bro') - ).toBeVisible() - await typebotViewer(page) + await page.locator(`input[placeholder="+33 XX XX XX XX"]`).type('+33 6 73') + await expect(page.getByRole('combobox')).toHaveText(/🇫🇷.+/) + await page.locator('button >> text="Go"').click() + await expect(page.locator('text=Try again bro')).toBeVisible() + await page .locator(`input[placeholder="+33 XX XX XX XX"]`) .fill('+33 6 73 54 45 67') - await typebotViewer(page).locator('button >> text="Go"').click() - await expect(typebotViewer(page).locator('text=+33673544567')).toBeVisible() + await page.locator('button >> text="Go"').click() + await expect(page.locator('text=+33 6 73 54 45 67')).toBeVisible() }) }) diff --git a/apps/builder/src/features/blocks/inputs/rating/rating.spec.ts b/apps/builder/src/features/blocks/inputs/rating/rating.spec.ts index 1520afb437..5ccbc09b43 100644 --- a/apps/builder/src/features/blocks/inputs/rating/rating.spec.ts +++ b/apps/builder/src/features/blocks/inputs/rating/rating.spec.ts @@ -2,7 +2,6 @@ import test, { expect } from '@playwright/test' import { createTypebots } from 'utils/playwright/databaseActions' import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' import { defaultRatingInputOptions, InputBlockType } from 'models' -import { typebotViewer } from 'utils/playwright/testHelpers' import { createId } from '@paralleldrive/cuid2' const boxSvg = ` { await page.goto(`/typebots/${typebotId}/edit`) await page.click('text=Preview') - await expect(typebotViewer(page).locator(`text=Send`)).toBeHidden() - await typebotViewer(page).locator(`text=8`).click() - await typebotViewer(page).locator(`text=Send`).click() - await expect(typebotViewer(page).locator(`text=8`)).toBeVisible() + await expect(page.locator(`text=Send`)).toBeHidden() + await page.locator(`text=8`).click() + await page.locator(`text=Send`).click() + await expect(page.locator(`text=8`)).toBeVisible() await page.click('text=Rate from 0 to 10') await page.click('text="10"') await page.click('text="5"') @@ -48,14 +47,10 @@ test('options should work', async ({ page }) => { await page.fill('[placeholder="Not likely at all"]', 'Not likely at all') await page.fill('[placeholder="Extremely likely"]', 'Extremely likely') await page.click('text="Restart"') - await expect(typebotViewer(page).locator(`text=8`)).toBeHidden() - await expect(typebotViewer(page).locator(`text=4`)).toBeHidden() - await expect( - typebotViewer(page).locator(`text=Not likely at all`) - ).toBeVisible() - await expect( - typebotViewer(page).locator(`text=Extremely likely`) - ).toBeVisible() - await typebotViewer(page).locator(`svg >> nth=4`).click() - await expect(typebotViewer(page).locator(`text=5`)).toBeVisible() + await expect(page.locator(`text=8`)).toBeHidden() + await expect(page.locator(`text=4`)).toBeHidden() + await expect(page.locator(`text=Not likely at all`)).toBeVisible() + await expect(page.locator(`text=Extremely likely`)).toBeVisible() + await page.locator(`svg >> nth=4`).click() + await expect(page.locator(`text=5`)).toBeVisible() }) diff --git a/apps/builder/src/features/blocks/inputs/textInput/textInput.spec.ts b/apps/builder/src/features/blocks/inputs/textInput/textInput.spec.ts index 575f9b3d8f..a3019539a8 100644 --- a/apps/builder/src/features/blocks/inputs/textInput/textInput.spec.ts +++ b/apps/builder/src/features/blocks/inputs/textInput/textInput.spec.ts @@ -2,7 +2,6 @@ import test, { expect } from '@playwright/test' import { createTypebots } from 'utils/playwright/databaseActions' import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' import { defaultTextInputOptions, InputBlockType } from 'models' -import { typebotViewer } from 'utils/playwright/testHelpers' import { createId } from '@paralleldrive/cuid2' test.describe.parallel('Text input block', () => { @@ -22,11 +21,11 @@ test.describe.parallel('Text input block', () => { await page.click('text=Preview') await expect( - typebotViewer(page).locator( + page.locator( `input[placeholder="${defaultTextInputOptions.labels.placeholder}"]` ) ).toHaveAttribute('type', 'text') - await expect(typebotViewer(page).locator(`button`)).toBeDisabled() + await expect(page.getByRole('button', { name: 'Send' })).toBeDisabled() await page.click(`text=${defaultTextInputOptions.labels.placeholder}`) await page.fill('#placeholder', 'Your name...') @@ -35,8 +34,8 @@ test.describe.parallel('Text input block', () => { await page.click('text=Restart') await expect( - typebotViewer(page).locator(`textarea[placeholder="Your name..."]`) + page.locator(`textarea[placeholder="Your name..."]`) ).toBeVisible() - await expect(typebotViewer(page).locator(`text=Go`)).toBeVisible() + await expect(page.getByRole('button', { name: 'Go' })).toBeVisible() }) }) diff --git a/apps/builder/src/features/blocks/inputs/url/url.spec.ts b/apps/builder/src/features/blocks/inputs/url/url.spec.ts index 229ed7f84b..2d79f025c6 100644 --- a/apps/builder/src/features/blocks/inputs/url/url.spec.ts +++ b/apps/builder/src/features/blocks/inputs/url/url.spec.ts @@ -2,7 +2,6 @@ import test, { expect } from '@playwright/test' import { createTypebots } from 'utils/playwright/databaseActions' import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' import { defaultUrlInputOptions, InputBlockType } from 'models' -import { typebotViewer } from 'utils/playwright/testHelpers' import { createId } from '@paralleldrive/cuid2' test.describe('Url input block', () => { @@ -22,11 +21,13 @@ test.describe('Url input block', () => { await page.click('text=Preview') await expect( - typebotViewer(page).locator( + page.locator( `input[placeholder="${defaultUrlInputOptions.labels.placeholder}"]` ) ).toHaveAttribute('type', 'url') - await expect(typebotViewer(page).locator(`button`)).toBeDisabled() + await expect( + page.locator('typebot-standard').locator(`button`) + ).toBeDisabled() await page.click(`text=${defaultUrlInputOptions.labels.placeholder}`) await page.fill('#placeholder', 'Your URL...') @@ -38,19 +39,15 @@ test.describe('Url input block', () => { ) await page.click('text=Restart') - await typebotViewer(page) + await page .locator(`input[placeholder="Your URL..."]`) .fill('https://https://test') - await typebotViewer(page).locator('button >> text="Go"').click() - await expect( - typebotViewer(page).locator('text=Try again bro') - ).toBeVisible() - await typebotViewer(page) + await page.locator('button >> text="Go"').click() + await expect(page.locator('text=Try again bro')).toBeVisible() + await page .locator(`input[placeholder="Your URL..."]`) .fill('https://website.com') - await typebotViewer(page).locator('button >> text="Go"').click() - await expect( - typebotViewer(page).locator('text=https://website.com') - ).toBeVisible() + await page.locator('button >> text="Go"').click() + await expect(page.locator('text=https://website.com')).toBeVisible() }) }) diff --git a/apps/builder/src/features/blocks/integrations/chatwoot/chatwoot.spec.ts b/apps/builder/src/features/blocks/integrations/chatwoot/chatwoot.spec.ts index c64af89441..adaed434f9 100644 --- a/apps/builder/src/features/blocks/integrations/chatwoot/chatwoot.spec.ts +++ b/apps/builder/src/features/blocks/integrations/chatwoot/chatwoot.spec.ts @@ -36,7 +36,7 @@ test.describe('Chatwoot block', () => { await page.getByLabel('Phone number').fill('+33654347543') await page.getByRole('button', { name: 'Preview', exact: true }).click() await expect( - page.getByText("Chatwoot won't open in preview mode").nth(0) + page.getByText('Chatwoot block is not supported in preview').nth(0) ).toBeVisible() }) }) diff --git a/apps/builder/src/features/blocks/integrations/googleSheets/googleSheets.spec.ts b/apps/builder/src/features/blocks/integrations/googleSheets/googleSheets.spec.ts index 817fd73769..62ec180075 100644 --- a/apps/builder/src/features/blocks/integrations/googleSheets/googleSheets.spec.ts +++ b/apps/builder/src/features/blocks/integrations/googleSheets/googleSheets.spec.ts @@ -1,6 +1,5 @@ import test, { expect, Page } from '@playwright/test' import { importTypebotInDatabase } from 'utils/playwright/databaseActions' -import { typebotViewer } from 'utils/playwright/testHelpers' import { createId } from '@paralleldrive/cuid2' import { getTestAsset } from '@/test/utils/playwright' @@ -33,25 +32,17 @@ test.describe.parallel('Google sheets integration', () => { ) await page.click('text=Preview') - await typebotViewer(page) + await page + .locator('typebot-standard') .locator('input[placeholder="Type your email..."]') .fill('georges@gmail.com') - await Promise.all([ - page.waitForResponse( - (resp) => - resp - .request() - .url() - .includes( - '/api/integrations/google-sheets/spreadsheets/1k_pIDw3YHl9tlZusbBVSBRY0PeRPd2H6t4Nj7rwnOtM/sheets/0' - ) && - resp.status() === 200 && - resp.request().method() === 'POST' - ), - typebotViewer(page) - .locator('input[placeholder="Type your email..."]') - .press('Enter'), - ]) + await page + .locator('typebot-standard') + .locator('input[placeholder="Type your email..."]') + .press('Enter') + await expect( + page.getByText('Succesfully inserted row in CRM > Sheet1').nth(0) + ).toBeVisible() }) test('Update row should work', async ({ page }) => { @@ -82,25 +73,17 @@ test.describe.parallel('Google sheets integration', () => { ) await page.click('text=Preview') - await typebotViewer(page) + await page + .locator('typebot-standard') .locator('input[placeholder="Type your email..."]') .fill('test@test.com') - await Promise.all([ - page.waitForResponse( - (resp) => - resp - .request() - .url() - .includes( - '/api/integrations/google-sheets/spreadsheets/1k_pIDw3YHl9tlZusbBVSBRY0PeRPd2H6t4Nj7rwnOtM/sheets/0' - ) && - resp.status() === 200 && - resp.request().method() === 'POST' - ), - typebotViewer(page) - .locator('input[placeholder="Type your email..."]') - .press('Enter'), - ]) + await page + .locator('typebot-standard') + .locator('input[placeholder="Type your email..."]') + .press('Enter') + await expect( + page.getByText('Succesfully updated row in CRM > Sheet1').nth(0) + ).toBeVisible() }) test('Get row should work', async ({ page }) => { @@ -143,15 +126,17 @@ test.describe.parallel('Google sheets integration', () => { await createNewVar(page, 'Last name') await page.click('text=Preview') - await typebotViewer(page) + await page + .locator('typebot-standard') .locator('input[placeholder="Type your email..."]') .fill('test2@test.com') - await typebotViewer(page) + await page + .locator('typebot-standard') .locator('input[placeholder="Type your email..."]') .press('Enter') - await expect(typebotViewer(page).locator('text=Your name is:')).toHaveText( - /John|Fred|Georges/ - ) + await expect( + page.locator('typebot-standard').locator('text=Your name is:') + ).toHaveText(/John|Fred|Georges/) }) }) diff --git a/apps/builder/src/features/blocks/integrations/sendEmail/components/SendEmailSettings/SendEmailSettings.tsx b/apps/builder/src/features/blocks/integrations/sendEmail/components/SendEmailSettings/SendEmailSettings.tsx index fd03db10ce..8173201f1f 100644 --- a/apps/builder/src/features/blocks/integrations/sendEmail/components/SendEmailSettings/SendEmailSettings.tsx +++ b/apps/builder/src/features/blocks/integrations/sendEmail/components/SendEmailSettings/SendEmailSettings.tsx @@ -181,7 +181,7 @@ export const SendEmailSettings = ({ options, onOptionsChange }: Props) => { {options.isBodyCode ? ( diff --git a/apps/builder/src/features/blocks/integrations/sendEmail/queries/sendEmail.spec.ts b/apps/builder/src/features/blocks/integrations/sendEmail/queries/sendEmail.spec.ts index 96ab8cc9af..122e6b2837 100644 --- a/apps/builder/src/features/blocks/integrations/sendEmail/queries/sendEmail.spec.ts +++ b/apps/builder/src/features/blocks/integrations/sendEmail/queries/sendEmail.spec.ts @@ -1,6 +1,5 @@ import test, { expect } from '@playwright/test' import { importTypebotInDatabase } from 'utils/playwright/databaseActions' -import { typebotViewer } from 'utils/playwright/testHelpers' import { createId } from '@paralleldrive/cuid2' import { getTestAsset } from '@/test/utils/playwright' @@ -64,7 +63,7 @@ test.describe('Send email block', () => { await page.fill('[data-testid="body-input"]', 'Here is my email') await page.click('text=Preview') - await typebotViewer(page).locator('text=Go').click() + await page.locator('typebot-standard').locator('text=Go').click() await expect( page.locator('text=Emails are not sent in preview mode >> nth=0') ).toBeVisible() diff --git a/apps/builder/src/features/blocks/integrations/webhook/components/WebhookSettings/WebhookSettings.tsx b/apps/builder/src/features/blocks/integrations/webhook/components/WebhookSettings/WebhookSettings.tsx index 34764ee3f0..0278b1721f 100644 --- a/apps/builder/src/features/blocks/integrations/webhook/components/WebhookSettings/WebhookSettings.tsx +++ b/apps/builder/src/features/blocks/integrations/webhook/components/WebhookSettings/WebhookSettings.tsx @@ -223,7 +223,7 @@ export const WebhookSettings = ({ /> {(options.isCustomBody ?? true) && ( )} {testResponse && ( - + )} {(testResponse || options?.responseVariableMapping.length > 0) && ( diff --git a/apps/builder/src/features/blocks/logic/condition/condition.spec.ts b/apps/builder/src/features/blocks/logic/condition/condition.spec.ts index 924220fe69..d61ff16c61 100644 --- a/apps/builder/src/features/blocks/logic/condition/condition.spec.ts +++ b/apps/builder/src/features/blocks/logic/condition/condition.spec.ts @@ -1,5 +1,4 @@ import test, { expect } from '@playwright/test' -import { typebotViewer } from 'utils/playwright/testHelpers' import { importTypebotInDatabase } from 'utils/playwright/databaseActions' import { createId } from '@paralleldrive/cuid2' import { getTestAsset } from '@/test/utils/playwright' @@ -51,30 +50,33 @@ test.describe('Condition block', () => { await page.fill('input[placeholder="Type a value..."]', '20') await page.click('text=Preview') - await typebotViewer(page) + await page + .locator('typebot-standard') .locator('input[placeholder="Type a number..."]') .fill('15') - await typebotViewer(page).locator('text=Send').click() + await page.locator('typebot-standard').locator('text=Send').click() await expect( - typebotViewer(page).locator('text=You are younger than 20') + page.locator('typebot-standard').getByText('You are younger than 20') ).toBeVisible() await page.click('text=Restart') - await typebotViewer(page) + await page + .locator('typebot-standard') .locator('input[placeholder="Type a number..."]') .fill('45') - await typebotViewer(page).locator('text=Send').click() + await page.locator('typebot-standard').locator('text=Send').click() await expect( - typebotViewer(page).locator('text=You are older than 20') + page.locator('typebot-standard').getByText('You are older than 20') ).toBeVisible() await page.click('text=Restart') - await typebotViewer(page) + await page + .locator('typebot-standard') .locator('input[placeholder="Type a number..."]') .fill('90') - await typebotViewer(page).locator('text=Send').click() + await page.locator('typebot-standard').locator('text=Send').click() await expect( - typebotViewer(page).locator('text=You are older than 80') + page.locator('typebot-standard').getByText('You are older than 80') ).toBeVisible() }) }) diff --git a/apps/builder/src/features/blocks/logic/redirect/redirect.spec.ts b/apps/builder/src/features/blocks/logic/redirect/redirect.spec.ts index ec88fc6884..6c509003d9 100644 --- a/apps/builder/src/features/blocks/logic/redirect/redirect.spec.ts +++ b/apps/builder/src/features/blocks/logic/redirect/redirect.spec.ts @@ -1,5 +1,4 @@ import test, { expect } from '@playwright/test' -import { typebotViewer } from 'utils/playwright/testHelpers' import { importTypebotInDatabase } from 'utils/playwright/databaseActions' import { createId } from '@paralleldrive/cuid2' import { getTestAsset } from '@/test/utils/playwright' @@ -20,7 +19,7 @@ test.describe('Redirect block', () => { await page.fill('input[placeholder="Type a URL..."]', 'google.com') await page.click('text=Preview') - await typebotViewer(page).locator('text=Go to URL').click() + await page.locator('typebot-standard').locator('text=Go to URL').click() await expect(page).toHaveURL('https://www.google.com') await page.goBack() @@ -30,7 +29,7 @@ test.describe('Redirect block', () => { await page.click('text=Preview') const [newPage] = await Promise.all([ context.waitForEvent('page'), - typebotViewer(page).locator('text=Go to URL').click(), + page.locator('typebot-standard').locator('text=Go to URL').click(), ]) await newPage.waitForLoadState() await expect(newPage).toHaveURL('https://www.google.com') diff --git a/apps/builder/src/features/blocks/logic/script/components/ScriptSettings.tsx b/apps/builder/src/features/blocks/logic/script/components/ScriptSettings.tsx index c7b755dd99..2a282feb6e 100644 --- a/apps/builder/src/features/blocks/logic/script/components/ScriptSettings.tsx +++ b/apps/builder/src/features/blocks/logic/script/components/ScriptSettings.tsx @@ -41,8 +41,8 @@ export const ScriptSettings = ({ options, onOptionsChange }: Props) => { Code: diff --git a/apps/builder/src/features/blocks/logic/script/script.spec.ts b/apps/builder/src/features/blocks/logic/script/script.spec.ts index f35720f2bc..3bea66b741 100644 --- a/apps/builder/src/features/blocks/logic/script/script.spec.ts +++ b/apps/builder/src/features/blocks/logic/script/script.spec.ts @@ -1,5 +1,4 @@ import test, { expect } from '@playwright/test' -import { typebotViewer } from 'utils/playwright/testHelpers' import { importTypebotInDatabase } from 'utils/playwright/databaseActions' import { createId } from '@paralleldrive/cuid2' import { getTestAsset } from '@/test/utils/playwright' @@ -20,7 +19,7 @@ test.describe('Script block', () => { ) await page.click('text=Preview') - await typebotViewer(page).locator('text=Trigger code').click() + await page.getByRole('button', { name: 'Trigger code' }).click() await expect(page).toHaveURL('https://www.google.com') }) }) diff --git a/apps/builder/src/features/blocks/logic/setVariable/components/SetVariableSettings.tsx b/apps/builder/src/features/blocks/logic/setVariable/components/SetVariableSettings.tsx index a6b30f3fac..7e26df570b 100644 --- a/apps/builder/src/features/blocks/logic/setVariable/components/SetVariableSettings.tsx +++ b/apps/builder/src/features/blocks/logic/setVariable/components/SetVariableSettings.tsx @@ -51,9 +51,9 @@ export const SetVariableSettings = ({ options, onOptionsChange }: Props) => { {options.isCode ?? false ? ( ) : (
- ` -} diff --git a/apps/builder/src/features/publish/components/embeds/codeSnippets/Container/EmbedSettings.tsx b/apps/builder/src/features/publish/components/embeds/codeSnippets/Container/EmbedSettings.tsx deleted file mode 100644 index fe2cd5f693..0000000000 --- a/apps/builder/src/features/publish/components/embeds/codeSnippets/Container/EmbedSettings.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import { - StackProps, - Stack, - Flex, - Heading, - FormControl, - FormLabel, - Switch, - Input, - HStack, - Text, -} from '@chakra-ui/react' -import { DropdownList } from '@/components/DropdownList' -import { useState, useEffect } from 'react' - -type StandardEmbedWindowSettingsProps = { - onUpdateWindowSettings: (windowSettings: { - heightLabel: string - widthLabel: string - }) => void -} -export const StandardEmbedWindowSettings = ({ - onUpdateWindowSettings, - ...props -}: StandardEmbedWindowSettingsProps & StackProps) => { - const [fullscreen, setFullscreen] = useState(false) - const [inputValues, setInputValues] = useState({ - widthValue: '100', - widthType: '%', - heightValue: '600', - heightType: 'px', - }) - - useEffect(() => { - onUpdateWindowSettings({ - widthLabel: fullscreen - ? '100%' - : inputValues.widthValue + inputValues.widthType, - heightLabel: fullscreen - ? '100vh' - : inputValues.heightValue + inputValues.heightType, - }) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [inputValues, fullscreen]) - - const handleWidthTypeSelect = (widthType: string) => - setInputValues({ ...inputValues, widthType }) - const handleHeightTypeSelect = (heightType: string) => - setInputValues({ ...inputValues, heightType }) - - return ( - - - - Window settings - - - - Set to fullscreen? - - setFullscreen(!fullscreen)} - isChecked={fullscreen} - /> - - - - {!fullscreen && ( - <> - - Width - - - setInputValues({ - ...inputValues, - widthValue: e.target.value, - }) - } - w="70px" - value={inputValues.widthValue} - /> - - items={['px', '%']} - onItemSelect={handleWidthTypeSelect} - currentItem={inputValues.widthType} - /> - - - - Height - - - setInputValues({ - ...inputValues, - heightValue: e.target.value, - }) - } - w="70px" - value={inputValues.heightValue} - /> - - items={['px', '%']} - onItemSelect={handleHeightTypeSelect} - currentItem={inputValues.heightType} - /> - - - - )} - - ) -} diff --git a/apps/builder/src/features/publish/components/embeds/codeSnippets/Popup/EmbedCode.tsx b/apps/builder/src/features/publish/components/embeds/codeSnippets/Popup/EmbedCode.tsx deleted file mode 100644 index 291eff2adb..0000000000 --- a/apps/builder/src/features/publish/components/embeds/codeSnippets/Popup/EmbedCode.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { FlexProps } from '@chakra-ui/react' -import { useTypebot } from '@/features/editor' -import parserHtml from 'prettier/parser-html' -import prettier from 'prettier/standalone' -import { PopupParams } from 'typebot-js' -import { env, getViewerUrl } from 'utils' -import { parseInitPopupCode, typebotJsHtml } from '../params' -import { CodeEditor } from '@/components/CodeEditor' - -type PopupEmbedCodeProps = { - delay?: number - withStarterVariables?: boolean - onCopied?: () => void -} - -export const PopupEmbedCode = ({ delay }: PopupEmbedCodeProps & FlexProps) => { - const { typebot } = useTypebot() - const snippet = prettier.format( - createSnippet({ - url: `${env('VIEWER_INTERNAL_URL') ?? getViewerUrl()}/${ - typebot?.publicId - }`, - delay, - }), - { - parser: 'html', - plugins: [parserHtml], - } - ) - return -} - -const createSnippet = (params: PopupParams): string => { - const jsCode = parseInitPopupCode(params) - return `${typebotJsHtml} - ` -} diff --git a/apps/builder/src/features/publish/components/embeds/codeSnippets/Popup/EmbedSettings.tsx b/apps/builder/src/features/publish/components/embeds/codeSnippets/Popup/EmbedSettings.tsx deleted file mode 100644 index 2cb2b024e4..0000000000 --- a/apps/builder/src/features/publish/components/embeds/codeSnippets/Popup/EmbedSettings.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import { - StackProps, - Stack, - Flex, - Heading, - NumberInput, - NumberInputField, - Switch, - HStack, - NumberIncrementStepper, - NumberDecrementStepper, -} from '@chakra-ui/react' -import { useState, useEffect } from 'react' -import { PopupParams } from 'typebot-js' - -type PopupEmbedSettingsProps = { - onUpdateSettings: (windowSettings: Pick) => void -} -export const PopupEmbedSettings = ({ - onUpdateSettings, - ...props -}: PopupEmbedSettingsProps & StackProps) => { - const [isEnabled, setIsEnabled] = useState(false) - const [inputValue, setInputValue] = useState(0) - - useEffect(() => { - onUpdateSettings({ - delay: isEnabled ? inputValue * 1000 : undefined, - }) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [inputValue, isEnabled]) - - return ( - - - - Popup settings - - - - - -

Appearance delay

- setIsEnabled(e.target.checked)} - /> -
- - {isEnabled && ( - setInputValue(val)} - value={inputValue} - min={0} - > - - - - - - - )} -
-
- ) -} diff --git a/apps/builder/src/features/publish/components/embeds/codeSnippets/ReactCode.tsx b/apps/builder/src/features/publish/components/embeds/codeSnippets/ReactCode.tsx deleted file mode 100644 index b310af5edc..0000000000 --- a/apps/builder/src/features/publish/components/embeds/codeSnippets/ReactCode.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import { FlexProps } from '@chakra-ui/react' -import React from 'react' -import { BubbleParams, IframeParams, PopupParams } from 'typebot-js' -import { - parseInitBubbleCode, - parseInitContainerCode, - parseInitPopupCode, -} from './params' -import parserBabel from 'prettier/parser-babel' -import prettier from 'prettier/standalone' -import { useTypebot } from '@/features/editor' -import { env, getViewerUrl } from 'utils' -import { CodeEditor } from '@/components/CodeEditor' - -type StandardReactDivProps = { widthLabel: string; heightLabel: string } -export const StandardReactDiv = ({ - widthLabel, - heightLabel, -}: StandardReactDivProps) => { - const { typebot } = useTypebot() - const snippet = prettier.format( - parseContainerSnippet({ - url: `${env('VIEWER_INTERNAL_URL') ?? getViewerUrl()}/${ - typebot?.publicId - }`, - heightLabel, - widthLabel, - }), - { - parser: 'babel', - plugins: [parserBabel], - } - ) - return -} - -type SnippetProps = IframeParams & - Pick - -const parseContainerSnippet = ({ - url, - customDomain, - backgroundColor, - hiddenVariables, - ...embedProps -}: SnippetProps): string => { - const jsCode = parseInitContainerCode({ - url, - customDomain, - backgroundColor, - hiddenVariables, - }) - return `import Typebot from "typebot-js"; - - const Component = () => { - useEffect(()=> { - ${jsCode} - }, []) - - return
- }` -} - -type PopupEmbedCodeProps = { - delay?: number - withStarterVariables?: boolean -} - -export const PopupReactCode = ({ delay }: PopupEmbedCodeProps & FlexProps) => { - const { typebot } = useTypebot() - const snippet = prettier.format( - parsePopupSnippet({ - url: `${env('VIEWER_INTERNAL_URL') ?? getViewerUrl()}/${ - typebot?.publicId - }`, - delay, - }), - { - parser: 'babel', - plugins: [parserBabel], - } - ) - return -} - -const parsePopupSnippet = ({ - url, - customDomain, - backgroundColor, - hiddenVariables, - delay, -}: PopupParams): string => { - const jsCode = parseInitPopupCode({ - url, - customDomain, - backgroundColor, - hiddenVariables, - delay, - }) - return `import Typebot from "typebot-js"; - - const Component = () => { - useEffect(()=> { - ${jsCode} - }, []) - - return <>; - }` -} - -type ChatEmbedCodeProps = { - withStarterVariables?: boolean -} & Pick - -export const ChatReactCode = ({ - proactiveMessage, - button, -}: ChatEmbedCodeProps & FlexProps) => { - const { typebot } = useTypebot() - const snippet = prettier.format( - parseBubbleSnippet({ - url: `${env('VIEWER_INTERNAL_URL') ?? getViewerUrl()}/${ - typebot?.publicId - }`, - button, - proactiveMessage, - }), - { - parser: 'babel', - plugins: [parserBabel], - } - ) - return -} - -const parseBubbleSnippet = ({ - url, - customDomain, - backgroundColor, - hiddenVariables, - proactiveMessage, - button, -}: BubbleParams): string => { - const jsCode = parseInitBubbleCode({ - url, - customDomain, - backgroundColor, - hiddenVariables, - proactiveMessage, - button, - }) - return `import Typebot from "typebot-js"; - - const Component = () => { - useEffect(()=> { - ${jsCode} - }, []) - - return <> - }` -} diff --git a/apps/builder/src/features/publish/components/embeds/codeSnippets/params.ts b/apps/builder/src/features/publish/components/embeds/codeSnippets/params.ts deleted file mode 100644 index 7cdc429fc3..0000000000 --- a/apps/builder/src/features/publish/components/embeds/codeSnippets/params.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { - BubbleParams, - ButtonParams, - IframeParams, - PopupParams, - ProactiveMessageParams, -} from 'typebot-js' -import parserBabel from 'prettier/parser-babel' -import prettier from 'prettier/standalone' -import { isDefined } from 'utils' - -const parseStringParam = (fieldName: string, fieldValue?: string) => - fieldValue ? `${fieldName}: "${fieldValue}",` : `` - -const parseNonStringParam = ( - fieldName: string, - fieldValue?: number | boolean -) => (isDefined(fieldValue) ? `${fieldName}: ${fieldValue},` : ``) - -const parseCustomDomain = (domain?: string): string => - parseStringParam('customDomain', domain) - -const parseHiddenVariables = ( - variables: { [key: string]: string | undefined } | undefined -): string => (variables ? `hiddenVariables: ${JSON.stringify(variables)},` : ``) - -const parseBackgroundColor = (bgColor?: string): string => - parseStringParam('backgroundColor', bgColor) - -const parseDelay = (delay?: number) => parseNonStringParam('delay', delay) - -const parseButton = (button?: ButtonParams): string => { - if (!button) return '' - const iconUrlString = parseStringParam('iconUrl', button.iconUrl) - const buttonColorstring = parseStringParam('color', button.color) - const buttonIconColorString = parseStringParam('iconColor', button.iconColor) - return `button: {${iconUrlString}${buttonColorstring}${buttonIconColorString}},` -} - -const parseProactiveMessage = ( - proactiveMessage?: ProactiveMessageParams -): string => { - if (!proactiveMessage) return `` - const { avatarUrl, textContent, delay } = proactiveMessage - const avatarUrlString = parseStringParam('avatarUrl', avatarUrl) - const textContentString = parseStringParam('textContent', textContent) - const delayString = parseNonStringParam('delay', delay) - return `proactiveMessage: {${avatarUrlString}${textContentString}${delayString}},` -} - -const parseIframeParams = ({ - customDomain, - hiddenVariables, - backgroundColor, -}: Pick< - IframeParams, - 'customDomain' | 'hiddenVariables' | 'backgroundColor' ->) => ({ - customDomainString: parseCustomDomain(customDomain), - hiddenVariablesString: parseHiddenVariables(hiddenVariables), - bgColorString: parseBackgroundColor(backgroundColor), -}) - -const parsePopupParams = ({ delay }: Pick) => ({ - delayString: parseDelay(delay), -}) - -const parseBubbleParams = ({ - button, - proactiveMessage, -}: Pick) => ({ - proactiveMessageString: parseProactiveMessage(proactiveMessage), - buttonString: parseButton(button), -}) - -export const parseInitContainerCode = ({ - url, - customDomain, - backgroundColor, - hiddenVariables, -}: IframeParams) => { - const { customDomainString, hiddenVariablesString, bgColorString } = - parseIframeParams({ - customDomain, - hiddenVariables, - backgroundColor, - }) - return prettier.format( - `Typebot.initContainer("typebot-container", { - url: "${url}",${bgColorString}${customDomainString}${hiddenVariablesString} - });`, - { parser: 'babel', plugins: [parserBabel] } - ) -} - -export const parseInitPopupCode = ({ - url, - customDomain, - hiddenVariables, - backgroundColor, - delay, -}: PopupParams) => { - const { customDomainString, hiddenVariablesString, bgColorString } = - parseIframeParams({ - customDomain, - hiddenVariables, - backgroundColor, - }) - const { delayString } = parsePopupParams({ delay }) - return prettier.format( - `var typebotCommands = Typebot.initPopup({url: "${url}",${delayString}${bgColorString}${customDomainString}${hiddenVariablesString}});`, - { parser: 'babel', plugins: [parserBabel] } - ) -} - -export const parseInitBubbleCode = ({ - url, - customDomain, - hiddenVariables, - backgroundColor, - button, - proactiveMessage, -}: BubbleParams) => { - const { customDomainString, hiddenVariablesString, bgColorString } = - parseIframeParams({ - customDomain, - hiddenVariables, - backgroundColor, - }) - const { buttonString, proactiveMessageString } = parseBubbleParams({ - button, - proactiveMessage, - }) - return prettier.format( - `var typebotCommands = Typebot.initBubble({url: "${url}",${bgColorString}${customDomainString}${hiddenVariablesString}${proactiveMessageString}${buttonString}});`, - { parser: 'babel', plugins: [parserBabel] } - ) -} - -export const typebotJsHtml = `` diff --git a/apps/builder/src/features/publish/components/embeds/modals/ChooseEmbedTypeList.tsx b/apps/builder/src/features/publish/components/embeds/modals/ChooseEmbedTypeList.tsx deleted file mode 100644 index 63bb8400fc..0000000000 --- a/apps/builder/src/features/publish/components/embeds/modals/ChooseEmbedTypeList.tsx +++ /dev/null @@ -1,155 +0,0 @@ -import { HStack, Button, Text, Stack } from '@chakra-ui/react' - -type ChooseEmbedTypeListProps = { - onSelectEmbedType: (type: 'standard' | 'popup' | 'bubble') => void - disabledTypes?: ('standard' | 'popup' | 'bubble')[] -} - -export const ChooseEmbedTypeList = ({ - onSelectEmbedType, - disabledTypes = [], -}: ChooseEmbedTypeListProps) => { - return ( - - onSelectEmbedType('standard')} - whiteSpace={'normal'} - spacing="6" - isDisabled={disabledTypes.includes('standard')} - > - - - - Standard - - Embed in a container on your site - - - onSelectEmbedType('popup')} - whiteSpace={'normal'} - spacing="6" - isDisabled={disabledTypes.includes('popup')} - > - - - - Popup - - - Embed in a popup window on top of your website - - - - onSelectEmbedType('bubble')} - whiteSpace={'normal'} - spacing="6" - isDisabled={disabledTypes.includes('bubble')} - > - - - - Bubble - - - Embed in a chat bubble on the corner of your site - - - - - ) -} - -const StandardEmbedSvg = () => ( - - - - - - - - - - - - - - - - -) - -const PopupEmbedSvg = () => ( - - - - - - - - - - - -) - -const BubbleEmbedSvg = () => ( - - - - -) diff --git a/apps/builder/src/features/publish/components/embeds/modals/GtmModal/GtmInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/GtmModal/GtmInstructions.tsx deleted file mode 100644 index 23130fa8ce..0000000000 --- a/apps/builder/src/features/publish/components/embeds/modals/GtmModal/GtmInstructions.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import { CodeEditor } from '@/components/CodeEditor' -import { OrderedList, ListItem, Tag } from '@chakra-ui/react' -import { useState } from 'react' -import { BubbleParams } from 'typebot-js' -import { env, getViewerUrl } from 'utils' -import { ChatEmbedCode } from '../../codeSnippets/Chat/EmbedCode' -import { ChatEmbedSettings } from '../../codeSnippets/Chat/EmbedSettings' -import { StandardEmbedWindowSettings } from '../../codeSnippets/Container/EmbedSettings' -import { - parseInitContainerCode, - typebotJsHtml, -} from '../../codeSnippets/params' -import { PopupEmbedCode } from '../../codeSnippets/Popup/EmbedCode' -import { PopupEmbedSettings } from '../../codeSnippets/Popup/EmbedSettings' -import { ModalProps } from '../../EmbedButton' - -type GtmInstructionsProps = { - type: 'standard' | 'popup' | 'bubble' - publicId: string -} - -export const GtmInstructions = ({ type, publicId }: GtmInstructionsProps) => { - switch (type) { - case 'standard': { - return - } - case 'popup': { - return - } - case 'bubble': { - return - } - } -} - -const StandardInstructions = ({ publicId }: Pick) => { - const [windowSizes, setWindowSizes] = useState({ - height: '100%', - width: '100%', - }) - - const jsCode = parseInitContainerCode({ - url: `${env('VIEWER_INTERNAL_URL') ?? getViewerUrl()}/${publicId}`, - }) - const headCode = `${typebotJsHtml} - ` - - const elementCode = `
` - return ( - - - On your GTM account dashboard, click on Add a new tag - - - Choose Custom HTML tag type - - - Paste the code below: - - - - On your webpage, you need to have an element on which the typebot will - go. It needs to have the id typebot-container: - - setWindowSizes({ - height: sizes.heightLabel, - width: sizes.widthLabel, - }) - } - /> - - - - ) -} - -const PopupInstructions = () => { - const [inputValue, setInputValue] = useState() - - return ( - - - On your GTM account dashboard, click on Add a new tag - - - Choose Custom HTML tag type - - - Paste the code below: - setInputValue(settings.delay)} - /> - - - - ) -} - -const BubbleInstructions = () => { - const [inputValues, setInputValues] = useState< - Pick - >({ - proactiveMessage: undefined, - button: { - color: '', - iconUrl: '', - }, - }) - - return ( - - - On your GTM account dashboard, click on Add a new tag - - - Choose Custom HTML tag type - - - Paste the code below: - setInputValues({ ...settings })} - /> - - - - ) -} diff --git a/apps/builder/src/features/publish/components/embeds/modals/GtmModal/GtmModal.tsx b/apps/builder/src/features/publish/components/embeds/modals/GtmModal/GtmModal.tsx new file mode 100644 index 0000000000..e71a0afbe0 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/GtmModal/GtmModal.tsx @@ -0,0 +1,30 @@ +import React, { useState } from 'react' +import { ModalProps } from '../../EmbedButton' +import { EmbedModal } from '../../EmbedModal' +import { isDefined } from '@udecode/plate-common' +import { GtmInstructions } from './instructions/GtmInstructions' + +export const GtmModal = ({ + isOpen, + onClose, + isPublished, + publicId, +}: ModalProps) => { + const [selectedEmbedType, setSelectedEmbedType] = useState< + 'standard' | 'popup' | 'bubble' | undefined + >() + return ( + + {isDefined(selectedEmbedType) && ( + + )} + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/GtmModal/index.ts b/apps/builder/src/features/publish/components/embeds/modals/GtmModal/index.ts new file mode 100644 index 0000000000..6169150565 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/GtmModal/index.ts @@ -0,0 +1 @@ +export * from './GtmModal' diff --git a/apps/builder/src/features/publish/components/embeds/modals/GtmModal/index.tsx b/apps/builder/src/features/publish/components/embeds/modals/GtmModal/index.tsx deleted file mode 100644 index b57f5bbc92..0000000000 --- a/apps/builder/src/features/publish/components/embeds/modals/GtmModal/index.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalCloseButton, - ModalBody, - ModalFooter, - IconButton, - Heading, - HStack, -} from '@chakra-ui/react' -import { ChevronLeftIcon } from '@/components/icons' -import React, { useState } from 'react' -import { ModalProps } from '../../EmbedButton' -import { ChooseEmbedTypeList } from '../ChooseEmbedTypeList' -import { capitalize } from 'utils' -import { GtmInstructions } from './GtmInstructions' -import { AlertInfo } from '@/components/AlertInfo' - -export const GtmModal = ({ - isOpen, - onClose, - isPublished, - publicId, -}: ModalProps) => { - const [chosenEmbedType, setChosenEmbedType] = useState< - 'standard' | 'popup' | 'bubble' | undefined - >() - return ( - - - - - - {chosenEmbedType && ( - } - aria-label="back" - variant="ghost" - colorScheme="gray" - mr={2} - onClick={() => setChosenEmbedType(undefined)} - /> - )} - - Javascript {chosenEmbedType && `- ${capitalize(chosenEmbedType)}`} - - - - - - {!isPublished && ( - You need to publish your bot first. - )} - {!chosenEmbedType ? ( - - ) : ( - - )} - - - - - ) -} diff --git a/apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmBubbleInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmBubbleInstructions.tsx new file mode 100644 index 0000000000..0498208676 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmBubbleInstructions.tsx @@ -0,0 +1,45 @@ +import { useTypebot } from '@/features/editor' +import { OrderedList, ListItem, Stack, Text, Code } from '@chakra-ui/react' +import { BubbleProps } from '@typebot.io/js' +import { useState } from 'react' +import { BubbleSettings } from '../../../settings/BubbleSettings/BubbleSettings' +import { parseDefaultBubbleTheme } from '../../Javascript/instructions/JavascriptBubbleInstructions' +import { JavascriptBubbleSnippet } from '../../Javascript/JavascriptBubbleSnippet' + +export const GtmBubbleInstructions = () => { + const { typebot } = useTypebot() + const [theme, setTheme] = useState( + parseDefaultBubbleTheme(typebot) + ) + const [previewMessage, setPreviewMessage] = + useState() + + return ( + + + On your GTM account dashboard, click on Add a new tag + + + Choose Custom HTML tag type + + + + + Paste the code below: + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmInstructions.tsx new file mode 100644 index 0000000000..133ab8edd9 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmInstructions.tsx @@ -0,0 +1,22 @@ +import { GtmBubbleInstructions } from './GtmBubbleInstructions' +import { GtmPopupInstructions } from './GtmPopupInstructions' +import { GtmStandardInstructions } from './GtmStandardInstructions' + +type GtmInstructionsProps = { + type: 'standard' | 'popup' | 'bubble' + publicId: string +} + +export const GtmInstructions = ({ type, publicId }: GtmInstructionsProps) => { + switch (type) { + case 'standard': { + return + } + case 'popup': { + return + } + case 'bubble': { + return + } + } +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmPopupInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmPopupInstructions.tsx new file mode 100644 index 0000000000..81843517c1 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmPopupInstructions.tsx @@ -0,0 +1,30 @@ +import { OrderedList, ListItem, Code, Stack, Text } from '@chakra-ui/react' +import { useState } from 'react' +import { PopupSettings } from '../../../settings/PopupSettings' +import { JavascriptPopupSnippet } from '../../Javascript/JavascriptPopupSnippet' + +export const GtmPopupInstructions = () => { + const [inputValue, setInputValue] = useState() + + return ( + + + On your GTM account dashboard, click on Add a new tag + + + Choose Custom HTML tag type + + + + + setInputValue(settings.autoShowDelay) + } + /> + Paste the code below: + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmStandardInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmStandardInstructions.tsx new file mode 100644 index 0000000000..09173b7005 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/GtmModal/instructions/GtmStandardInstructions.tsx @@ -0,0 +1,62 @@ +import { CodeEditor } from '@/components/CodeEditor' +import { OrderedList, ListItem, Code, Stack, Text } from '@chakra-ui/react' +import { Typebot } from 'models' +import { useState } from 'react' +import { StandardSettings } from '../../../settings/StandardSettings' +import { + parseStandardElementCode, + parseStandardHeadCode, +} from '../../Javascript/JavascriptStandardSnippet' + +export const GtmStandardInstructions = ({ + publicId, +}: Pick) => { + const [windowSizes, setWindowSizes] = useState<{ + height: string + width?: string + }>({ + height: '100%', + width: '100%', + }) + + const headCode = parseStandardHeadCode(publicId) + + const elementCode = parseStandardElementCode( + windowSizes.width, + windowSizes.height + ) + + return ( + + + On your GTM account dashboard, click on Add a new tag + + + Choose Custom HTML tag type + + + + Paste the code below: + + + + + + + setWindowSizes({ + height: sizes.heightLabel, + width: sizes.widthLabel, + }) + } + /> + + On your web page, you need to have an element on which the typebot + will go: + + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/IframeModal.tsx b/apps/builder/src/features/publish/components/embeds/modals/IframeModal/IframeModal.tsx similarity index 65% rename from apps/builder/src/features/publish/components/embeds/modals/IframeModal.tsx rename to apps/builder/src/features/publish/components/embeds/modals/IframeModal/IframeModal.tsx index 8f6b3d5cf8..ebdb127f7c 100644 --- a/apps/builder/src/features/publish/components/embeds/modals/IframeModal.tsx +++ b/apps/builder/src/features/publish/components/embeds/modals/IframeModal/IframeModal.tsx @@ -11,12 +11,15 @@ import { Text, } from '@chakra-ui/react' import { useState } from 'react' -import { StandardEmbedWindowSettings } from '../codeSnippets/Container/EmbedSettings' -import { IframeEmbedCode } from '../codeSnippets/Iframe/EmbedCode' -import { ModalProps } from '../EmbedButton' +import { ModalProps } from '../../EmbedButton' +import { StandardSettings } from '../../settings/StandardSettings' +import { IframeSnippet } from './IframeSnippet' export const IframeModal = ({ isPublished, isOpen, onClose }: ModalProps) => { - const [inputValues, setInputValues] = useState({ + const [inputValues, setInputValues] = useState<{ + heightLabel: string + widthLabel?: string + }>({ heightLabel: '100%', widthLabel: '100%', }) @@ -27,17 +30,21 @@ export const IframeModal = ({ isPublished, isOpen, onClose }: ModalProps) => { Iframe - + {!isPublished && ( You need to publish your bot first. )} - Paste this anywhere in your HTML code: - setInputValues({ ...settings }) } /> - + Paste this anywhere in your HTML code: + + diff --git a/apps/builder/src/features/publish/components/embeds/codeSnippets/Iframe/EmbedCode.tsx b/apps/builder/src/features/publish/components/embeds/modals/IframeModal/IframeSnippet.tsx similarity index 55% rename from apps/builder/src/features/publish/components/embeds/codeSnippets/Iframe/EmbedCode.tsx rename to apps/builder/src/features/publish/components/embeds/modals/IframeModal/IframeSnippet.tsx index 2e30757b29..f289ac99c6 100644 --- a/apps/builder/src/features/publish/components/embeds/codeSnippets/Iframe/EmbedCode.tsx +++ b/apps/builder/src/features/publish/components/embeds/modals/IframeModal/IframeSnippet.tsx @@ -2,21 +2,24 @@ import { FlexProps } from '@chakra-ui/react' import { useTypebot } from '@/features/editor' import { env, getViewerUrl } from 'utils' import { CodeEditor } from '@/components/CodeEditor' +import prettier from 'prettier/standalone' +import parserHtml from 'prettier/parser-html' type Props = { widthLabel: string heightLabel: string onCopied?: () => void -} -export const IframeEmbedCode = ({ - widthLabel, - heightLabel, -}: Props & FlexProps) => { +} & FlexProps + +export const IframeSnippet = ({ widthLabel, heightLabel }: Props) => { const { typebot } = useTypebot() const src = `${env('VIEWER_INTERNAL_URL') ?? getViewerUrl()}/${ typebot?.publicId }` - const code = `` + const code = prettier.format( + ``, + { parser: 'html', plugins: [parserHtml] } + ) return } diff --git a/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptBubbleSnippet.tsx b/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptBubbleSnippet.tsx new file mode 100644 index 0000000000..fe840bf05f --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptBubbleSnippet.tsx @@ -0,0 +1,36 @@ +import prettier from 'prettier/standalone' +import parserHtml from 'prettier/parser-html' +import { parseInitBubbleCode } from '../../snippetParsers' +import { useTypebot } from '@/features/editor' +import { CodeEditor } from '@/components/CodeEditor' +import { BubbleProps } from '@typebot.io/js' +import { isCloudProdInstance } from '@/utils/helpers' +import { env, getViewerUrl } from 'utils' + +type Props = Pick + +export const JavascriptBubbleSnippet = ({ theme, previewMessage }: Props) => { + const { typebot } = useTypebot() + + const snippet = prettier.format( + ``, + { + parser: 'html', + plugins: [parserHtml], + } + ) + + return +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptInstructions.tsx deleted file mode 100644 index e45e4c9358..0000000000 --- a/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptInstructions.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import { Stack, Tag, Text } from '@chakra-ui/react' -import { useState } from 'react' -import { BubbleParams } from 'typebot-js' -import { ChatEmbedCode } from '../../codeSnippets/Chat/EmbedCode' -import { ChatEmbedSettings } from '../../codeSnippets/Chat/EmbedSettings' -import { ContainerEmbedCode } from '../../codeSnippets/Container/EmbedCode' -import { StandardEmbedWindowSettings } from '../../codeSnippets/Container/EmbedSettings' -import { PopupEmbedCode } from '../../codeSnippets/Popup/EmbedCode' -import { PopupEmbedSettings } from '../../codeSnippets/Popup/EmbedSettings' - -type JavascriptInstructionsProps = { - type: 'standard' | 'popup' | 'bubble' -} - -export const JavascriptInstructions = ({ - type, -}: JavascriptInstructionsProps) => { - switch (type) { - case 'standard': { - return - } - case 'popup': { - return - } - case 'bubble': { - return - } - } -} - -const StandardInstructions = () => { - const [inputValues, setInputValues] = useState({ - heightLabel: '100%', - widthLabel: '100%', - }) - - return ( - - - Paste this anywhere in the body - - setInputValues({ ...settings })} - /> - - - ) -} - -const PopupInstructions = () => { - const [inputValue, setInputValue] = useState() - - return ( - - - Paste this anywhere in the body - - setInputValue(settings.delay)} - /> - - - ) -} - -const BubbleInstructions = () => { - const [inputValues, setInputValues] = useState< - Pick - >({ - proactiveMessage: undefined, - button: { - color: '', - iconUrl: '', - }, - }) - - return ( - - - Paste this anywhere in the body - - setInputValues({ ...settings })} - /> - - - ) -} diff --git a/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptModal.tsx b/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptModal.tsx index 3c3d0a1ab4..3f3dba2271 100644 --- a/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptModal.tsx +++ b/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptModal.tsx @@ -1,69 +1,29 @@ -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalCloseButton, - ModalBody, - ModalFooter, - IconButton, - Heading, - HStack, -} from '@chakra-ui/react' -import { ChevronLeftIcon } from '@/components/icons' import React, { useState } from 'react' import { ModalProps } from '../../EmbedButton' -import { ChooseEmbedTypeList } from '../ChooseEmbedTypeList' -import { capitalize } from 'utils' -import { JavascriptInstructions } from './JavascriptInstructions' -import { AlertInfo } from '@/components/AlertInfo' +import { EmbedModal } from '../../EmbedModal' +import { isDefined } from '@udecode/plate-common' +import { JavascriptInstructions } from './instructions/JavascriptInstructions' export const JavascriptModal = ({ isOpen, onClose, isPublished, }: ModalProps) => { - const [chosenEmbedType, setChosenEmbedType] = useState< + const [selectedEmbedType, setSelectedEmbedType] = useState< 'standard' | 'popup' | 'bubble' | undefined >() return ( - - - - - - {chosenEmbedType && ( - } - aria-label="back" - variant="ghost" - colorScheme="gray" - mr={2} - onClick={() => setChosenEmbedType(undefined)} - /> - )} - - Javascript {chosenEmbedType && `- ${capitalize(chosenEmbedType)}`} - - - - - - {!isPublished && ( - You need to publish your bot first. - )} - {!chosenEmbedType ? ( - - ) : ( - - )} - - - - + {isDefined(selectedEmbedType) && ( + + )} + ) } diff --git a/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptPopupSnippet.tsx b/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptPopupSnippet.tsx new file mode 100644 index 0000000000..ddc50a736d --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptPopupSnippet.tsx @@ -0,0 +1,33 @@ +import { useTypebot } from '@/features/editor' +import parserHtml from 'prettier/parser-html' +import prettier from 'prettier/standalone' +import { parseInitPopupCode } from '../../snippetParsers' +import { CodeEditor } from '@/components/CodeEditor' +import { PopupProps } from '@typebot.io/js' +import { isCloudProdInstance } from '@/utils/helpers' +import { env, getViewerUrl } from 'utils' + +type Props = Pick + +export const JavascriptPopupSnippet = ({ autoShowDelay }: Props) => { + const { typebot } = useTypebot() + const snippet = prettier.format( + createSnippet({ + typebot: typebot?.publicId ?? '', + apiHost: isCloudProdInstance + ? undefined + : env('VIEWER_INTERNAL_URL') ?? getViewerUrl(), + autoShowDelay, + }), + { + parser: 'html', + plugins: [parserHtml], + } + ) + return +} + +const createSnippet = (params: PopupProps): string => { + const jsCode = parseInitPopupCode(params) + return `` +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptStandardSnippet.tsx b/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptStandardSnippet.tsx new file mode 100644 index 0000000000..dd3b7aaa97 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/Javascript/JavascriptStandardSnippet.tsx @@ -0,0 +1,51 @@ +import parserHtml from 'prettier/parser-html' +import prettier from 'prettier/standalone' +import { parseInitStandardCode } from '../../snippetParsers' +import { useTypebot } from '@/features/editor' +import { CodeEditor } from '@/components/CodeEditor' +import { isCloudProdInstance } from '@/utils/helpers' +import { env, getViewerUrl } from 'utils' + +type Props = { + widthLabel?: string + heightLabel?: string +} + +export const JavascriptStandardSnippet = ({ + widthLabel, + heightLabel, +}: Props) => { + const { typebot } = useTypebot() + + const snippet = prettier.format( + `${parseStandardHeadCode(typebot?.publicId)} + ${parseStandardElementCode(widthLabel, heightLabel)}`, + { + parser: 'html', + plugins: [parserHtml], + } + ) + + return +} + +export const parseStandardHeadCode = (publicId?: string | null) => + prettier.format( + ``, + { parser: 'html', plugins: [parserHtml] } + ) + +export const parseStandardElementCode = (width?: string, height?: string) => { + if (!width && !height) return '' + return prettier.format( + ``, + { parser: 'html', plugins: [parserHtml] } + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptBubbleInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptBubbleInstructions.tsx new file mode 100644 index 0000000000..38050f8fb3 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptBubbleInstructions.tsx @@ -0,0 +1,43 @@ +import { useTypebot } from '@/features/editor' +import { Stack, Code, Text } from '@chakra-ui/react' +import { BubbleProps } from '@typebot.io/js' +import { Typebot } from 'models' +import { useState } from 'react' +import { BubbleSettings } from '../../../settings/BubbleSettings/BubbleSettings' +import { JavascriptBubbleSnippet } from '../JavascriptBubbleSnippet' + +export const parseDefaultBubbleTheme = (typebot?: Typebot) => ({ + button: { + backgroundColor: typebot?.theme.chat.buttons.backgroundColor, + iconColor: typebot?.theme.chat.buttons.color, + }, + previewMessage: { + backgroundColor: typebot?.theme.general.background.content ?? 'white', + textColor: 'black', + }, +}) + +export const JavascriptBubbleInstructions = () => { + const { typebot } = useTypebot() + const [theme, setTheme] = useState( + parseDefaultBubbleTheme(typebot) + ) + const [previewMessage, setPreviewMessage] = + useState() + + return ( + + + + Paste this anywhere in the {''}: + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptInstructions.tsx new file mode 100644 index 0000000000..cb6b643c41 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptInstructions.tsx @@ -0,0 +1,23 @@ +import { JavascriptBubbleInstructions } from './JavascriptBubbleInstructions' +import { JavascriptPopupInstructions } from './JavascriptPopupInstructions' +import { JavascriptStandardInstructions } from './JavascriptStandardInstructions' + +type JavascriptInstructionsProps = { + type: 'standard' | 'popup' | 'bubble' +} + +export const JavascriptInstructions = ({ + type, +}: JavascriptInstructionsProps) => { + switch (type) { + case 'standard': { + return + } + case 'popup': { + return + } + case 'bubble': { + return + } + } +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptPopupInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptPopupInstructions.tsx new file mode 100644 index 0000000000..1f53888c35 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptPopupInstructions.tsx @@ -0,0 +1,20 @@ +import { Stack, Code, Text } from '@chakra-ui/react' +import { useState } from 'react' +import { PopupSettings } from '../../../settings/PopupSettings' +import { JavascriptPopupSnippet } from '../JavascriptPopupSnippet' + +export const JavascriptPopupInstructions = () => { + const [inputValue, setInputValue] = useState() + + return ( + + setInputValue(settings.autoShowDelay)} + /> + + Paste this anywhere in the {''}: + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptStandardInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptStandardInstructions.tsx new file mode 100644 index 0000000000..9ea57f80f4 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/Javascript/instructions/JavascriptStandardInstructions.tsx @@ -0,0 +1,26 @@ +import { Stack, Code, Text } from '@chakra-ui/react' +import { useState } from 'react' +import { StandardSettings } from '../../../settings/StandardSettings' +import { JavascriptStandardSnippet } from '../JavascriptStandardSnippet' + +export const JavascriptStandardInstructions = () => { + const [inputValues, setInputValues] = useState<{ + heightLabel: string + widthLabel?: string + }>({ + heightLabel: '100%', + widthLabel: '100%', + }) + + return ( + + setInputValues({ ...settings })} + /> + + Paste this anywhere in the {''}: + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/NotionModal.tsx b/apps/builder/src/features/publish/components/embeds/modals/NotionModal.tsx index 54e463b3e9..60bc5681e0 100644 --- a/apps/builder/src/features/publish/components/embeds/modals/NotionModal.tsx +++ b/apps/builder/src/features/publish/components/embeds/modals/NotionModal.tsx @@ -10,11 +10,13 @@ import { ModalBody, OrderedList, ListItem, - Tag, + Code, InputGroup, Input, InputRightElement, ModalFooter, + Text, + Stack, } from '@chakra-ui/react' import { env, getViewerUrl } from 'utils' import { ModalProps } from '../EmbedButton' @@ -37,28 +39,30 @@ export const NotionModal = ({ {!isPublished && ( You need to publish your bot first. )} - + - Type /embed + Type /embed - Paste your typebot URL - - - - + Paste your typebot URL + + - - + + + + + diff --git a/apps/builder/src/features/publish/components/embeds/modals/OtherModal.tsx b/apps/builder/src/features/publish/components/embeds/modals/OtherModal.tsx new file mode 100644 index 0000000000..04aa663cfb --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/OtherModal.tsx @@ -0,0 +1,25 @@ +import React, { useState } from 'react' +import { isDefined } from '@udecode/plate-common' +import { EmbedModal } from '../EmbedModal' +import { JavascriptInstructions } from './Javascript/instructions/JavascriptInstructions' +import { ModalProps } from '../EmbedButton' + +export const OtherModal = ({ isOpen, onClose, isPublished }: ModalProps) => { + const [selectedEmbedType, setSelectedEmbedType] = useState< + 'standard' | 'popup' | 'bubble' | undefined + >() + return ( + + {isDefined(selectedEmbedType) && ( + + )} + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/React/InstallReactPackageSnippet.tsx b/apps/builder/src/features/publish/components/embeds/modals/React/InstallReactPackageSnippet.tsx new file mode 100644 index 0000000000..cba15fd044 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/React/InstallReactPackageSnippet.tsx @@ -0,0 +1,11 @@ +import { CodeEditor } from '@/components/CodeEditor' + +export const InstallReactPackageSnippet = () => { + return ( + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/React/ReactBubbleSnippet.tsx b/apps/builder/src/features/publish/components/embeds/modals/React/ReactBubbleSnippet.tsx new file mode 100644 index 0000000000..d69cf08c64 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/React/ReactBubbleSnippet.tsx @@ -0,0 +1,31 @@ +import { CodeEditor } from '@/components/CodeEditor' +import { useTypebot } from '@/features/editor' +import { BubbleProps } from '@typebot.io/js' +import parserBabel from 'prettier/parser-babel' +import prettier from 'prettier/standalone' +import { parseReactBubbleProps } from '../../snippetParsers' + +export const ReactBubbleSnippet = ({ + theme, + previewMessage, +}: Pick) => { + const { typebot } = useTypebot() + + const snippet = prettier.format( + `import { Bubble } from "@typebot.io/react"; + + const App = () => { + return + }`, + { + parser: 'babel', + plugins: [parserBabel], + } + ) + + return +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/React/ReactInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/React/ReactInstructions.tsx deleted file mode 100644 index 2b95bb68e5..0000000000 --- a/apps/builder/src/features/publish/components/embeds/modals/React/ReactInstructions.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { CodeEditor } from '@/components/CodeEditor' -import { Stack, Text } from '@chakra-ui/react' -import { useState } from 'react' -import { BubbleParams } from 'typebot-js' -import { ChatEmbedSettings } from '../../codeSnippets/Chat/EmbedSettings' -import { StandardEmbedWindowSettings } from '../../codeSnippets/Container/EmbedSettings' -import { PopupEmbedSettings } from '../../codeSnippets/Popup/EmbedSettings' -import { - StandardReactDiv, - PopupReactCode, - ChatReactCode, -} from '../../codeSnippets/ReactCode' - -type Props = { - type: 'standard' | 'popup' | 'bubble' -} - -export const ReactInstructions = ({ type }: Props) => { - switch (type) { - case 'standard': { - return - } - case 'popup': { - return - } - case 'bubble': { - return - } - } -} - -const StandardInstructions = () => { - const [inputValues, setInputValues] = useState({ - heightLabel: '100%', - widthLabel: '100%', - }) - - return ( - - - setInputValues({ ...settings })} - /> - Insert the typebot container - - - ) -} - -const PopupInstructions = () => { - const [inputValue, setInputValue] = useState() - - return ( - - - setInputValue(settings.delay)} - /> - Initialize the typebot - - - ) -} - -const BubbleInstructions = () => { - const [inputValues, setInputValues] = useState< - Pick - >({ - proactiveMessage: undefined, - button: { - color: '', - iconUrl: '', - }, - }) - - return ( - - - setInputValues({ ...settings })} - /> - Initialize the typebot - - - ) -} - -const InstallPackageInstruction = () => { - return ( - - Install the package: - - - ) -} diff --git a/apps/builder/src/features/publish/components/embeds/modals/React/ReactModal.tsx b/apps/builder/src/features/publish/components/embeds/modals/React/ReactModal.tsx index e0ee6f6e01..e2c7f916d3 100644 --- a/apps/builder/src/features/publish/components/embeds/modals/React/ReactModal.tsx +++ b/apps/builder/src/features/publish/components/embeds/modals/React/ReactModal.tsx @@ -1,65 +1,25 @@ -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalCloseButton, - ModalBody, - ModalFooter, - IconButton, - Heading, - HStack, -} from '@chakra-ui/react' -import { ChevronLeftIcon } from '@/components/icons' import React, { useState } from 'react' import { ModalProps } from '../../EmbedButton' -import { ChooseEmbedTypeList } from '../ChooseEmbedTypeList' -import { capitalize } from 'utils' -import { ReactInstructions } from './ReactInstructions' -import { AlertInfo } from '@/components/AlertInfo' +import { EmbedModal } from '../../EmbedModal' +import { isDefined } from '@udecode/plate-common' +import { ReactInstructions } from './instructions/ReactInstructions' export const ReactModal = ({ isOpen, onClose, isPublished }: ModalProps) => { - const [chosenEmbedType, setChosenEmbedType] = useState< + const [selectedEmbedType, setSelectedEmbedType] = useState< 'standard' | 'popup' | 'bubble' | undefined >() return ( - - - - - - {chosenEmbedType && ( - } - aria-label="back" - variant="ghost" - colorScheme="gray" - mr={2} - onClick={() => setChosenEmbedType(undefined)} - /> - )} - - React {chosenEmbedType && `- ${capitalize(chosenEmbedType)}`} - - - - - - {!isPublished && ( - You need to publish your bot first. - )} - {!chosenEmbedType ? ( - - ) : ( - - )} - - - - + {isDefined(selectedEmbedType) && ( + + )} + ) } diff --git a/apps/builder/src/features/publish/components/embeds/modals/React/ReactPopupSnippet.tsx b/apps/builder/src/features/publish/components/embeds/modals/React/ReactPopupSnippet.tsx new file mode 100644 index 0000000000..b822a133ed --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/React/ReactPopupSnippet.tsx @@ -0,0 +1,29 @@ +import { CodeEditor } from '@/components/CodeEditor' +import { useTypebot } from '@/features/editor' +import { PopupProps } from '@typebot.io/js' +import parserBabel from 'prettier/parser-babel' +import prettier from 'prettier/standalone' +import { parseReactPopupProps } from '../../snippetParsers' + +export const ReactPopupSnippet = ({ + autoShowDelay, +}: Pick) => { + const { typebot } = useTypebot() + + const snippet = prettier.format( + `import { Popup } from "@typebot.io/react"; + + const App = () => { + return ; + }`, + { + parser: 'babel', + plugins: [parserBabel], + } + ) + + return +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/React/ReactStandardSnippet.tsx b/apps/builder/src/features/publish/components/embeds/modals/React/ReactStandardSnippet.tsx new file mode 100644 index 0000000000..2e7f7d35e5 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/React/ReactStandardSnippet.tsx @@ -0,0 +1,28 @@ +import { CodeEditor } from '@/components/CodeEditor' +import { useTypebot } from '@/features/editor' +import parserBabel from 'prettier/parser-babel' +import prettier from 'prettier/standalone' +import { parseReactBotProps } from '../../snippetParsers' + +type ReactStandardSnippetProps = { widthLabel?: string; heightLabel: string } + +export const ReactStandardSnippet = ({ + widthLabel, + heightLabel, +}: ReactStandardSnippetProps) => { + const { typebot } = useTypebot() + const snippet = prettier.format( + `import { Standard } from "@typebot.io/react"; + + const App = () => { + return + }`, + { + parser: 'babel', + plugins: [parserBabel], + } + ) + return +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactBubbleInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactBubbleInstructions.tsx new file mode 100644 index 0000000000..e554a9e351 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactBubbleInstructions.tsx @@ -0,0 +1,42 @@ +import { useTypebot } from '@/features/editor' +import { ListItem, OrderedList, Stack, Text } from '@chakra-ui/react' +import { BubbleProps } from '@typebot.io/js' +import { useState } from 'react' +import { BubbleSettings } from '../../../settings/BubbleSettings/BubbleSettings' +import { InstallReactPackageSnippet } from '../InstallReactPackageSnippet' +import { ReactBubbleSnippet } from '../ReactBubbleSnippet' +import { parseDefaultBubbleTheme } from '../../Javascript/instructions/JavascriptBubbleInstructions' + +export const ReactBubbleInstructions = () => { + const { typebot } = useTypebot() + const [theme, setTheme] = useState( + parseDefaultBubbleTheme(typebot) + ) + const [previewMessage, setPreviewMessage] = + useState() + + return ( + + + + Install the packages + + + + + + + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactInstructions.tsx new file mode 100644 index 0000000000..32154e25ac --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactInstructions.tsx @@ -0,0 +1,21 @@ +import { ReactBubbleInstructions } from './ReactBubbleInstructions' +import { ReactPopupInstructions } from './ReactPopupInstructions' +import { ReactStandardInstructions } from './ReactStandardInstructions' + +type Props = { + type: 'standard' | 'popup' | 'bubble' +} + +export const ReactInstructions = ({ type }: Props) => { + switch (type) { + case 'standard': { + return + } + case 'popup': { + return + } + case 'bubble': { + return + } + } +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactPopupInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactPopupInstructions.tsx new file mode 100644 index 0000000000..b6273aa57b --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactPopupInstructions.tsx @@ -0,0 +1,30 @@ +import { ListItem, OrderedList, Stack, Text } from '@chakra-ui/react' +import { useState } from 'react' +import { PopupSettings } from '../../../settings/PopupSettings' +import { InstallReactPackageSnippet } from '../InstallReactPackageSnippet' +import { ReactPopupSnippet } from '../ReactPopupSnippet' + +export const ReactPopupInstructions = () => { + const [inputValue, setInputValue] = useState() + + return ( + + + + Install the packages + + + + + + + setInputValue(settings.autoShowDelay) + } + /> + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactStandardInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactStandardInstructions.tsx new file mode 100644 index 0000000000..7abecab43e --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/React/instructions/ReactStandardInstructions.tsx @@ -0,0 +1,36 @@ +import { ListItem, OrderedList, Stack, Text } from '@chakra-ui/react' +import { useState } from 'react' +import { StandardSettings } from '../../../settings/StandardSettings' +import { InstallReactPackageSnippet } from '../InstallReactPackageSnippet' +import { ReactStandardSnippet } from '../ReactStandardSnippet' + +export const ReactStandardInstructions = () => { + const [inputValues, setInputValues] = useState<{ + widthLabel?: string + heightLabel: string + }>({ + heightLabel: '100%', + widthLabel: '100%', + }) + + return ( + + + + Install the packages + + + + + + + setInputValues({ ...settings }) + } + /> + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/ShopifyInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/ShopifyInstructions.tsx deleted file mode 100644 index 80a72788ed..0000000000 --- a/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/ShopifyInstructions.tsx +++ /dev/null @@ -1,146 +0,0 @@ -import { OrderedList, ListItem, Tag } from '@chakra-ui/react' -import { useState } from 'react' -import { BubbleParams } from 'typebot-js' -import { ModalProps } from '../../EmbedButton' -import parserHtml from 'prettier/parser-html' -import prettier from 'prettier/standalone' -import { env, getViewerUrl } from 'utils' -import { CodeEditor } from '@/components/CodeEditor' -import { ChatEmbedCode } from '../../codeSnippets/Chat/EmbedCode' -import { ChatEmbedSettings } from '../../codeSnippets/Chat/EmbedSettings' -import { StandardEmbedWindowSettings } from '../../codeSnippets/Container/EmbedSettings' -import { - parseInitContainerCode, - typebotJsHtml, -} from '../../codeSnippets/params' -import { PopupEmbedCode } from '../../codeSnippets/Popup/EmbedCode' -import { PopupEmbedSettings } from '../../codeSnippets/Popup/EmbedSettings' - -type ShopifyInstructionsProps = { - type: 'standard' | 'popup' | 'bubble' - publicId: string -} - -export const ShopifyInstructions = ({ - type, - publicId, -}: ShopifyInstructionsProps) => { - switch (type) { - case 'standard': { - return - } - case 'popup': { - return - } - case 'bubble': { - return - } - } -} - -const StandardInstructions = ({ publicId }: Pick) => { - const [windowSizes, setWindowSizes] = useState({ - height: '100%', - width: '100%', - }) - - const jsCode = parseInitContainerCode({ - url: `${env('VIEWER_INTERNAL_URL') ?? getViewerUrl()}/${publicId}`, - }) - const headCode = prettier.format( - `${typebotJsHtml}`, - { - parser: 'html', - plugins: [parserHtml], - } - ) - - const elementCode = prettier.format( - `
`, - { - parser: 'html', - plugins: [parserHtml], - } - ) - - return ( - - - On your shop dashboard in the Themes page, click on{' '} - Actions {'>'} Edit code - - - In Layout {'>'} theme.liquid file, paste this code just - before the closing head tag: - - - - Then, you can place an element on which the typebot will go in any file - in the body tags. It needs to have the id{' '} - typebot-container: - - setWindowSizes({ - height: sizes.heightLabel, - width: sizes.widthLabel, - }) - } - /> - - - - ) -} - -const PopupInstructions = () => { - const [inputValue, setInputValue] = useState() - - return ( - - - On your shop dashboard in the Themes page, click on{' '} - Actions {'>'} Edit code - - - In Layout {'>'} theme.liquid file, paste this code just - before the closing head tag: - setInputValue(settings.delay)} - /> - - - - ) -} - -const BubbleInstructions = () => { - const [inputValues, setInputValues] = useState< - Pick - >({ - proactiveMessage: undefined, - button: { - color: '', - iconUrl: '', - }, - }) - - return ( - - - On your shop dashboard in the Themes page, click on{' '} - Actions {'>'} Edit code - - - In Layout {'>'} theme.liquid file, paste this code just - before the closing head tag: - setInputValues({ ...settings })} - /> - - - - ) -} diff --git a/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/ShopifyModal.tsx b/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/ShopifyModal.tsx new file mode 100644 index 0000000000..bd6945ee38 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/ShopifyModal.tsx @@ -0,0 +1,30 @@ +import React, { useState } from 'react' +import { ModalProps } from '../../EmbedButton' +import { EmbedModal } from '../../EmbedModal' +import { isDefined } from '@udecode/plate-common' +import { ShopifyInstructions } from './instructions/ShopifyInstructions' + +export const ShopifyModal = ({ + isOpen, + onClose, + isPublished, + publicId, +}: ModalProps) => { + const [selectedEmbedType, setSelectedEmbedType] = useState< + 'standard' | 'popup' | 'bubble' | undefined + >() + return ( + + {isDefined(selectedEmbedType) && ( + + )} + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/index.ts b/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/index.ts new file mode 100644 index 0000000000..6255586271 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/index.ts @@ -0,0 +1 @@ +export * from './ShopifyModal' diff --git a/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/index.tsx b/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/index.tsx deleted file mode 100644 index c34666937d..0000000000 --- a/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/index.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalCloseButton, - ModalBody, - ModalFooter, - IconButton, - Heading, - HStack, -} from '@chakra-ui/react' -import { ChevronLeftIcon } from '@/components/icons' -import React, { useState } from 'react' -import { ModalProps } from '../../EmbedButton' -import { ChooseEmbedTypeList } from '../ChooseEmbedTypeList' -import { capitalize } from 'utils' -import { ShopifyInstructions } from './ShopifyInstructions' -import { AlertInfo } from '@/components/AlertInfo' - -export const ShopifyModal = ({ - isOpen, - onClose, - isPublished, - publicId, -}: ModalProps) => { - const [chosenEmbedType, setChosenEmbedType] = useState< - 'standard' | 'popup' | 'bubble' | undefined - >() - return ( - - - - - - {chosenEmbedType && ( - } - aria-label="back" - variant="ghost" - colorScheme="gray" - mr={2} - onClick={() => setChosenEmbedType(undefined)} - /> - )} - - Shopify {chosenEmbedType && `- ${capitalize(chosenEmbedType)}`} - - - - - - {!isPublished && ( - You need to publish your bot first. - )} - {!chosenEmbedType ? ( - - ) : ( - - )} - - - - - ) -} diff --git a/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyBubbleInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyBubbleInstructions.tsx new file mode 100644 index 0000000000..f6ef3187a3 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyBubbleInstructions.tsx @@ -0,0 +1,47 @@ +import { useTypebot } from '@/features/editor' +import { OrderedList, ListItem, Stack, Text, Code } from '@chakra-ui/react' +import { BubbleProps } from '@typebot.io/js' +import { useState } from 'react' +import { BubbleSettings } from '../../../settings/BubbleSettings/BubbleSettings' +import { parseDefaultBubbleTheme } from '../../Javascript/instructions/JavascriptBubbleInstructions' +import { JavascriptBubbleSnippet } from '../../Javascript/JavascriptBubbleSnippet' + +export const ShopifyBubbleInstructions = () => { + const { typebot } = useTypebot() + + const [theme, setTheme] = useState( + parseDefaultBubbleTheme(typebot) + ) + const [previewMessage, setPreviewMessage] = + useState() + + return ( + + + On your shop dashboard in the Themes page, click on{' '} + Actions {'>'} Edit code + + + + + + In Layout {'>'} theme.liquid file, paste this code just + before the closing {''} tag: + + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyInstructions.tsx new file mode 100644 index 0000000000..fe4a9d527e --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyInstructions.tsx @@ -0,0 +1,25 @@ +import { ShopifyBubbleInstructions } from './ShopifyBubbleInstructions' +import { ShopifyPopupInstructions } from './ShopifyPopupInstructions' +import { ShopifyStandardInstructions } from './ShopifyStandardInstructions' + +type ShopifyInstructionsProps = { + type: 'standard' | 'popup' | 'bubble' + publicId: string +} + +export const ShopifyInstructions = ({ + type, + publicId, +}: ShopifyInstructionsProps) => { + switch (type) { + case 'standard': { + return + } + case 'popup': { + return + } + case 'bubble': { + return + } + } +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyPopupInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyPopupInstructions.tsx new file mode 100644 index 0000000000..e633910d5e --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyPopupInstructions.tsx @@ -0,0 +1,31 @@ +import { OrderedList, ListItem, Stack, Text, Code } from '@chakra-ui/react' +import { useState } from 'react' +import { PopupSettings } from '../../../settings/PopupSettings' +import { JavascriptPopupSnippet } from '../../Javascript/JavascriptPopupSnippet' + +export const ShopifyPopupInstructions = () => { + const [inputValue, setInputValue] = useState() + + return ( + + + On your shop dashboard in the Themes page, click on{' '} + Actions {'>'} Edit code + + + + + setInputValue(settings.autoShowDelay) + } + /> + + In Layout {'>'} theme.liquid file, paste this code just + before the closing {''} tag: + + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyStandardInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyStandardInstructions.tsx new file mode 100644 index 0000000000..d612dd5599 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/ShopifyModal/instructions/ShopifyStandardInstructions.tsx @@ -0,0 +1,65 @@ +import { CodeEditor } from '@/components/CodeEditor' +import { OrderedList, ListItem, Stack, Text, Code } from '@chakra-ui/react' +import { useState } from 'react' +import { StandardSettings } from '../../../settings/StandardSettings' +import { + parseStandardElementCode, + parseStandardHeadCode, +} from '../../Javascript/JavascriptStandardSnippet' + +type Props = { + publicId: string +} + +export const ShopifyStandardInstructions = ({ publicId }: Props) => { + const [windowSizes, setWindowSizes] = useState<{ + width?: string + height: string + }>({ + height: '100%', + width: '100%', + }) + + const headCode = parseStandardHeadCode(publicId) + + const elementCode = parseStandardElementCode( + windowSizes.width, + windowSizes.height + ) + + return ( + + + On your shop dashboard in the Themes page, click on{' '} + Actions {'>'} Edit code + + + + + In Layout {'>'} theme.liquid file, paste this code just + before the closing {''} tag: + + + + + + + + + setWindowSizes({ + height: sizes.heightLabel, + width: sizes.widthLabel, + }) + } + /> + + Place an element on which the typebot will go in any file in the{' '} + {''}: + + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/WebflowInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/WebflowInstructions.tsx deleted file mode 100644 index ccf7e4877a..0000000000 --- a/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/WebflowInstructions.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import { OrderedList, ListItem, Tag } from '@chakra-ui/react' -import { useState } from 'react' -import { BubbleParams } from 'typebot-js' -import { ChatEmbedCode } from '../../codeSnippets/Chat/EmbedCode' -import { ChatEmbedSettings } from '../../codeSnippets/Chat/EmbedSettings' -import { ContainerEmbedCode } from '../../codeSnippets/Container/EmbedCode' -import { PopupEmbedCode } from '../../codeSnippets/Popup/EmbedCode' -import { PopupEmbedSettings } from '../../codeSnippets/Popup/EmbedSettings' - -type WebflowInstructionsProps = { - type: 'standard' | 'popup' | 'bubble' -} - -export const WebflowInstructions = ({ type }: WebflowInstructionsProps) => { - switch (type) { - case 'standard': { - return - } - case 'popup': { - return - } - case 'bubble': { - return - } - default: - return <> - } -} - -const StandardInstructions = () => ( - - - Press A to open the Add elements panel - - - Add an embed element from the components - section and paste this code: - - - -) - -const PopupInstructions = () => { - const [inputValue, setInputValue] = useState() - - return ( - - - Press A to open the Add elements panel - - - Add an embed element from the components - section and paste this code: - setInputValue(settings.delay)} - my={4} - /> - - - - ) -} - -const BubbleInstructions = () => { - const [inputValues, setInputValues] = useState< - Pick - >({ - proactiveMessage: undefined, - button: { - color: '', - iconUrl: '', - }, - }) - - return ( - - - Press A to open the Add elements panel - - - Add an embed element from the components - section and paste this code: - setInputValues({ ...settings })} - my={4} - /> - - - - ) -} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/WebflowModal.tsx b/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/WebflowModal.tsx new file mode 100644 index 0000000000..9e78b0392c --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/WebflowModal.tsx @@ -0,0 +1,26 @@ +import React, { useState } from 'react' +import { ModalProps } from '../../EmbedButton' +import { EmbedModal } from '../../EmbedModal' +import { isDefined } from '@udecode/plate-common' +import { WebflowInstructions } from './instructions/WebflowInstructions' + +export const WebflowModal = ({ isOpen, onClose, isPublished }: ModalProps) => { + const [selectedEmbedType, setSelectedEmbedType] = useState< + 'standard' | 'popup' | 'bubble' | undefined + >() + + return ( + + {isDefined(selectedEmbedType) && ( + + )} + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/index.ts b/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/index.ts new file mode 100644 index 0000000000..7e48139569 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/index.ts @@ -0,0 +1 @@ +export * from './WebflowModal' diff --git a/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/index.tsx b/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/index.tsx deleted file mode 100644 index 870de78766..0000000000 --- a/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/index.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalCloseButton, - ModalBody, - ModalFooter, - IconButton, - Heading, - HStack, -} from '@chakra-ui/react' -import { ChevronLeftIcon } from '@/components/icons' -import React, { useState } from 'react' -import { ModalProps } from '../../EmbedButton' -import { ChooseEmbedTypeList } from '../ChooseEmbedTypeList' -import { capitalize } from 'utils' -import { WebflowInstructions } from './WebflowInstructions' -import { AlertInfo } from '@/components/AlertInfo' - -export const WebflowModal = ({ isOpen, onClose, isPublished }: ModalProps) => { - const [chosenEmbedType, setChosenEmbedType] = useState< - 'standard' | 'popup' | 'bubble' | undefined - >() - return ( - - - - - - {chosenEmbedType && ( - } - aria-label="back" - variant="ghost" - colorScheme="gray" - mr={2} - onClick={() => setChosenEmbedType(undefined)} - /> - )} - - Webflow {chosenEmbedType && `- ${capitalize(chosenEmbedType)}`} - - - - - - {!isPublished && ( - You need to publish your bot first. - )} - {!chosenEmbedType ? ( - - ) : ( - - )} - - - - - ) -} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowBubbleInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowBubbleInstructions.tsx new file mode 100644 index 0000000000..e6da812c7a --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowBubbleInstructions.tsx @@ -0,0 +1,46 @@ +import { useTypebot } from '@/features/editor' +import { OrderedList, ListItem, Code, Stack, Text } from '@chakra-ui/react' +import { BubbleProps } from '@typebot.io/js' +import { useState } from 'react' +import { BubbleSettings } from '../../../settings/BubbleSettings/BubbleSettings' +import { parseDefaultBubbleTheme } from '../../Javascript/instructions/JavascriptBubbleInstructions' +import { JavascriptBubbleSnippet } from '../../Javascript/JavascriptBubbleSnippet' + +export const WebflowBubbleInstructions = () => { + const { typebot } = useTypebot() + + const [theme, setTheme] = useState( + parseDefaultBubbleTheme(typebot) + ) + const [previewMessage, setPreviewMessage] = + useState() + + return ( + + + Press A to open the Add elements panel + + + + + + Add an embed element from the components{' '} + section and paste this code: + + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowInstructions.tsx new file mode 100644 index 0000000000..d5411a7d7f --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowInstructions.tsx @@ -0,0 +1,21 @@ +import { WebflowStandardInstructions } from './WebflowStandardInstructions' +import { WebflowPopupInstructions } from './WebflowPopupInstructions' +import { WebflowBubbleInstructions } from './WebflowBubbleInstructions' + +type WebflowInstructionsProps = { + type: 'standard' | 'popup' | 'bubble' +} + +export const WebflowInstructions = ({ type }: WebflowInstructionsProps) => { + switch (type) { + case 'standard': { + return + } + case 'popup': { + return + } + case 'bubble': { + return + } + } +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowPopupInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowPopupInstructions.tsx new file mode 100644 index 0000000000..ee09192cbd --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowPopupInstructions.tsx @@ -0,0 +1,30 @@ +import { OrderedList, ListItem, Code, Stack, Text } from '@chakra-ui/react' +import { useState } from 'react' +import { PopupSettings } from '../../../settings/PopupSettings' +import { JavascriptPopupSnippet } from '../../Javascript/JavascriptPopupSnippet' + +export const WebflowPopupInstructions = () => { + const [inputValue, setInputValue] = useState() + + return ( + + + Press A to open the Add elements panel + + + + + setInputValue(settings.autoShowDelay) + } + /> + + Add an embed element from the components{' '} + section and paste this code: + + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowStandardInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowStandardInstructions.tsx new file mode 100644 index 0000000000..e1ad7c66df --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WebflowModal/instructions/WebflowStandardInstructions.tsx @@ -0,0 +1,19 @@ +import { OrderedList, ListItem, Code, Stack, Text } from '@chakra-ui/react' +import { JavascriptStandardSnippet } from '../../Javascript/JavascriptStandardSnippet' + +export const WebflowStandardInstructions = () => ( + + + Press A to open the Add elements panel + + + + + Add an embed element from the components{' '} + section and paste this code: + + + + + +) diff --git a/apps/builder/src/features/publish/components/embeds/modals/WixModal/WixInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/WixModal/WixInstructions.tsx deleted file mode 100644 index 839265de54..0000000000 --- a/apps/builder/src/features/publish/components/embeds/modals/WixModal/WixInstructions.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import { ListItem, OrderedList, Tag } from '@chakra-ui/react' -import { useState } from 'react' -import { BubbleParams } from 'typebot-js' -import { ChatEmbedCode } from '../../codeSnippets/Chat/EmbedCode' -import { ChatEmbedSettings } from '../../codeSnippets/Chat/EmbedSettings' -import { ContainerEmbedCode } from '../../codeSnippets/Container/EmbedCode' -import { PopupEmbedCode } from '../../codeSnippets/Popup/EmbedCode' -import { PopupEmbedSettings } from '../../codeSnippets/Popup/EmbedSettings' - -type WixInstructionsProps = { - type: 'standard' | 'popup' | 'bubble' -} - -export const WixInstructions = ({ type }: WixInstructionsProps) => { - switch (type) { - case 'standard': { - return - } - case 'popup': { - return - } - case 'bubble': { - return - } - } -} - -const StandardInstructions = () => { - return ( - - - In the Wix Website Editor: - - Add {'>'} Embed {'>'} Embed a Widget - - - - Click on Enter code and paste this code: - - - - ) -} - -const PopupInstructions = () => { - const [inputValue, setInputValue] = useState() - - return ( - <> - - - Go to Settings in your dashboard on Wix - - - Click on Custom Code under Advanced - - - Click + Add Custom Code at the top right. - - - Paste this snippet in the code box: - setInputValue(settings.delay)} - my={4} - /> - - - - - ) -} - -const BubbleInstructions = () => { - const [inputValues, setInputValues] = useState< - Pick - >({ - proactiveMessage: undefined, - button: { - color: '', - iconUrl: '', - }, - }) - - return ( - - - Go to Settings in your dashboard on Wix - - - Click on Custom Code under Advanced - - - Click + Add Custom Code at the top right. - - - Paste this snippet in the code box:{' '} - setInputValues({ ...settings })} - /> - - - - ) -} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WixModal/WixModal.tsx b/apps/builder/src/features/publish/components/embeds/modals/WixModal/WixModal.tsx new file mode 100644 index 0000000000..fa590f4ac6 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WixModal/WixModal.tsx @@ -0,0 +1,26 @@ +import React, { useState } from 'react' +import { ModalProps } from '../../EmbedButton' +import { EmbedModal } from '../../EmbedModal' +import { isDefined } from '@udecode/plate-common' +import { WixInstructions } from './instructions/WixInstructions' + +export const WixModal = ({ isOpen, onClose, isPublished }: ModalProps) => { + const [selectedEmbedType, setSelectedEmbedType] = useState< + 'standard' | 'popup' | 'bubble' | undefined + >() + + return ( + + {isDefined(selectedEmbedType) && ( + + )} + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WixModal/index.ts b/apps/builder/src/features/publish/components/embeds/modals/WixModal/index.ts new file mode 100644 index 0000000000..98f88b10ac --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WixModal/index.ts @@ -0,0 +1 @@ +export * from './WixModal' diff --git a/apps/builder/src/features/publish/components/embeds/modals/WixModal/index.tsx b/apps/builder/src/features/publish/components/embeds/modals/WixModal/index.tsx deleted file mode 100644 index 50da9a4a26..0000000000 --- a/apps/builder/src/features/publish/components/embeds/modals/WixModal/index.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalCloseButton, - ModalBody, - ModalFooter, - IconButton, - Heading, - HStack, -} from '@chakra-ui/react' -import { ChevronLeftIcon } from '@/components/icons' -import React, { useState } from 'react' -import { ModalProps } from '../../EmbedButton' -import { ChooseEmbedTypeList } from '../ChooseEmbedTypeList' -import { WixInstructions } from './WixInstructions' -import { capitalize } from 'utils' -import { AlertInfo } from '@/components/AlertInfo' - -export const WixModal = ({ isOpen, onClose, isPublished }: ModalProps) => { - const [chosenEmbedType, setChosenEmbedType] = useState< - 'standard' | 'popup' | 'bubble' | undefined - >() - return ( - - - - - - {chosenEmbedType && ( - } - aria-label="back" - variant="ghost" - colorScheme="gray" - mr={2} - onClick={() => setChosenEmbedType(undefined)} - /> - )} - - Wix {chosenEmbedType && `- ${capitalize(chosenEmbedType)}`} - - - - - - {!isPublished && ( - You need to publish your bot first. - )} - {!chosenEmbedType ? ( - - ) : ( - - )} - - - - - ) -} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixBubbleInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixBubbleInstructions.tsx new file mode 100644 index 0000000000..bbc6e3d61e --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixBubbleInstructions.tsx @@ -0,0 +1,49 @@ +import { useTypebot } from '@/features/editor' +import { OrderedList, ListItem, Code, Stack, Text } from '@chakra-ui/react' +import { BubbleProps } from '@typebot.io/js' +import { useState } from 'react' +import { BubbleSettings } from '../../../settings/BubbleSettings/BubbleSettings' +import { parseDefaultBubbleTheme } from '../../Javascript/instructions/JavascriptBubbleInstructions' +import { JavascriptBubbleSnippet } from '../../Javascript/JavascriptBubbleSnippet' + +export const WixBubbleInstructions = () => { + const { typebot } = useTypebot() + + const [theme, setTheme] = useState( + parseDefaultBubbleTheme(typebot) + ) + const [previewMessage, setPreviewMessage] = + useState() + + return ( + + + Go to Settings in your dashboard on Wix + + + Click on Custom Code under Advanced + + + Click + Add Custom Code at the top right. + + + + + Paste this snippet in the code box: + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixInstructions.tsx new file mode 100644 index 0000000000..6e7874ae5a --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixInstructions.tsx @@ -0,0 +1,21 @@ +import { WixBubbleInstructions } from './WixBubbleInstructions' +import { WixPopupInstructions } from './WixPopupInstructions' +import { WixStandardInstructions } from './WixStandardInstuctions' + +type WixInstructionsProps = { + type: 'standard' | 'popup' | 'bubble' +} + +export const WixInstructions = ({ type }: WixInstructionsProps) => { + switch (type) { + case 'standard': { + return + } + case 'popup': { + return + } + case 'bubble': { + return + } + } +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixPopupInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixPopupInstructions.tsx new file mode 100644 index 0000000000..31e92d00b2 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixPopupInstructions.tsx @@ -0,0 +1,33 @@ +import { OrderedList, ListItem, Code, Stack, Text } from '@chakra-ui/react' +import { useState } from 'react' +import { PopupSettings } from '../../../settings/PopupSettings' +import { JavascriptPopupSnippet } from '../../Javascript/JavascriptPopupSnippet' + +export const WixPopupInstructions = () => { + const [inputValue, setInputValue] = useState() + + return ( + + + Go to Settings in your dashboard on Wix + + + Click on Custom Code under Advanced + + + Click + Add Custom Code at the top right. + + + + + setInputValue(settings.autoShowDelay) + } + /> + Paste this snippet in the code box: + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixStandardInstuctions.tsx b/apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixStandardInstuctions.tsx new file mode 100644 index 0000000000..7f7660cff2 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WixModal/instructions/WixStandardInstuctions.tsx @@ -0,0 +1,23 @@ +import { OrderedList, ListItem, Code, Stack, Text } from '@chakra-ui/react' +import { JavascriptStandardSnippet } from '../../Javascript/JavascriptStandardSnippet' + +export const WixStandardInstructions = () => { + return ( + + + In the Wix Website Editor: + + Add {'>'} Embed {'>'} Embed a Widget + + + + + + Click on Enter code and paste this code: + + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WordpressModal.tsx b/apps/builder/src/features/publish/components/embeds/modals/WordpressModal.tsx deleted file mode 100644 index f3ed48fd38..0000000000 --- a/apps/builder/src/features/publish/components/embeds/modals/WordpressModal.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - Heading, - ModalCloseButton, - ModalBody, - OrderedList, - ListItem, - InputGroup, - Input, - InputRightElement, - ModalFooter, - Link, - useColorModeValue, -} from '@chakra-ui/react' -import { ExternalLinkIcon } from '@/components/icons' -import { env, getViewerUrl } from 'utils' -import { ModalProps } from '../EmbedButton' -import { AlertInfo } from '@/components/AlertInfo' -import { CopyButton } from '@/components/CopyButton' - -export const WordpressModal = ({ - publicId, - isPublished, - isOpen, - onClose, -}: ModalProps): JSX.Element => { - return ( - - - - - WordPress - - - - {!isPublished && ( - You need to publish your bot first. - )} - - - Install{' '} - - the official Typebot WordPress plugin - - - - - Copy your typebot URL - - - - - - - - Complete the setup in your Wordpress interface - - - - - - ) -} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/WordpressModal.tsx b/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/WordpressModal.tsx new file mode 100644 index 0000000000..74b445ad76 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/WordpressModal.tsx @@ -0,0 +1,30 @@ +import { isDefined } from 'utils' +import { ModalProps } from '../../EmbedButton' +import { useState } from 'react' +import { EmbedModal } from '../../EmbedModal' +import { WordpressInstructions } from './instructions/WordpressInstructions' + +export const WordpressModal = ({ + isOpen, + onClose, + isPublished, + publicId, +}: ModalProps) => { + const [selectedEmbedType, setSelectedEmbedType] = useState< + 'standard' | 'popup' | 'bubble' | undefined + >() + return ( + + {isDefined(selectedEmbedType) && ( + + )} + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/index.ts b/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/index.ts new file mode 100644 index 0000000000..062eae6d13 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/index.ts @@ -0,0 +1 @@ +export * from './WordpressModal' diff --git a/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressBubbleInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressBubbleInstructions.tsx new file mode 100644 index 0000000000..1c2e0f85f9 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressBubbleInstructions.tsx @@ -0,0 +1,74 @@ +import { CodeEditor } from '@/components/CodeEditor' +import { ExternalLinkIcon } from '@/components/icons' +import { useTypebot } from '@/features/editor' +import { + OrderedList, + ListItem, + useColorModeValue, + Link, + Stack, + Text, +} from '@chakra-ui/react' +import { BubbleProps } from '@typebot.io/js' +import { useState } from 'react' +import { BubbleSettings } from '../../../settings/BubbleSettings/BubbleSettings' +import { parseInitBubbleCode } from '../../../snippetParsers' +import { parseDefaultBubbleTheme } from '../../Javascript/instructions/JavascriptBubbleInstructions' + +type Props = { + publicId: string +} +export const WordpressBubbleInstructions = ({ publicId }: Props) => { + const { typebot } = useTypebot() + + const [theme, setTheme] = useState( + parseDefaultBubbleTheme(typebot) + ) + const [previewMessage, setPreviewMessage] = + useState() + + const initCode = parseInitBubbleCode({ + typebot: publicId, + theme: { + ...theme, + chatWindow: { + backgroundColor: typebot?.theme.general.background.content ?? '#fff', + }, + }, + previewMessage, + }) + + return ( + + + Install{' '} + + the official Typebot WordPress plugin + + + + + + + + You can now place the following code snippet in the Typebot panel in + your WordPress admin: + + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressInstructions.tsx new file mode 100644 index 0000000000..0397f26516 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressInstructions.tsx @@ -0,0 +1,22 @@ +import { WordpressBubbleInstructions } from './WordpressBubbleInstructions' +import { WordpressPopupInstructions } from './WordpressPopupInstructions' +import { WordpressStandardInstructions } from './WordpressStandardInstructions' + +type Props = { + publicId: string + type: 'standard' | 'popup' | 'bubble' +} + +export const WordpressInstructions = ({ publicId, type }: Props) => { + switch (type) { + case 'standard': { + return + } + case 'popup': { + return + } + case 'bubble': { + return + } + } +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressPopupInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressPopupInstructions.tsx new file mode 100644 index 0000000000..017b407fe1 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressPopupInstructions.tsx @@ -0,0 +1,55 @@ +import { CodeEditor } from '@/components/CodeEditor' +import { ExternalLinkIcon } from '@/components/icons' +import { + OrderedList, + ListItem, + useColorModeValue, + Link, + Stack, + Text, +} from '@chakra-ui/react' +import { useState } from 'react' +import { PopupSettings } from '../../../settings/PopupSettings' +import { parseInitPopupCode } from '../../../snippetParsers/popup' + +type Props = { + publicId: string +} +export const WordpressPopupInstructions = ({ publicId }: Props) => { + const [autoShowDelay, setAutoShowDelay] = useState() + + const initCode = parseInitPopupCode({ + typebot: publicId, + autoShowDelay, + }) + + return ( + + + Install{' '} + + the official Typebot WordPress plugin + + + + + + + setAutoShowDelay(settings.autoShowDelay) + } + /> + + You can now place the following code snippet in the Typebot panel in + your WordPress admin: + + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressStandardInstructions.tsx b/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressStandardInstructions.tsx new file mode 100644 index 0000000000..019db1c23c --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/modals/WordpressModal/instructions/WordpressStandardInstructions.tsx @@ -0,0 +1,80 @@ +import { CodeEditor } from '@/components/CodeEditor' +import { ExternalLinkIcon } from '@/components/icons' +import { + OrderedList, + ListItem, + useColorModeValue, + Link, + Stack, + Text, + Code, +} from '@chakra-ui/react' +import { useState } from 'react' +import { StandardSettings } from '../../../settings/StandardSettings' + +type Props = { + publicId: string +} + +export const WordpressStandardInstructions = ({ publicId }: Props) => { + const [windowSizes, setWindowSizes] = useState<{ + width?: string + height: string + }>({ + height: '100%', + width: '100%', + }) + + const elementCode = parseWordpressShortcode({ ...windowSizes, publicId }) + + return ( + + + Install{' '} + + the official Typebot WordPress plugin + + + + + + + setWindowSizes({ + height: sizes.heightLabel, + width: sizes.widthLabel, + }) + } + /> + + You can now place the following shortcode anywhere on your site: + + + + Note: Your page templating system probably has a{' '} + Shortcode element (if not, use a text element). + + + + + ) +} + +const parseWordpressShortcode = ({ + width, + height, + publicId, +}: { + width?: string + height?: string + publicId: string +}) => { + return `[typebot typebot="${publicId}"${width ? ` width="${width}"` : ''}${ + height ? ` height="${height}"` : '' + }] +` +} diff --git a/apps/builder/src/features/publish/components/embeds/modals/index.tsx b/apps/builder/src/features/publish/components/embeds/modals/index.tsx index d2393557c0..6b7f51cb49 100644 --- a/apps/builder/src/features/publish/components/embeds/modals/index.tsx +++ b/apps/builder/src/features/publish/components/embeds/modals/index.tsx @@ -1,4 +1,4 @@ -export * from './IframeModal' +export * from './IframeModal/IframeModal' export * from './NotionModal' export * from './WordpressModal' export * from './WixModal' diff --git a/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/BubbleSettings.tsx b/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/BubbleSettings.tsx new file mode 100644 index 0000000000..c04a0d0ef0 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/BubbleSettings.tsx @@ -0,0 +1,96 @@ +import { Stack, Heading, HStack, Flex, Text, Image } from '@chakra-ui/react' +import { BubbleProps } from '@typebot.io/js' +import { isDefined } from 'utils' +import { PreviewMessageSettings } from './PreviewMessageSettings' +import { ThemeSettings } from './ThemeSettings' + +type Props = { + defaultPreviewMessageAvatar: string + theme: BubbleProps['theme'] + previewMessage: BubbleProps['previewMessage'] + onThemeChange: (theme: BubbleProps['theme']) => void + onPreviewMessageChange: ( + previewMessage: BubbleProps['previewMessage'] + ) => void +} + +export const BubbleSettings = ({ + defaultPreviewMessageAvatar, + theme, + previewMessage, + onThemeChange, + onPreviewMessageChange, +}: Props) => { + const updatePreviewMessage = ( + previewMessage: BubbleProps['previewMessage'] + ) => { + onPreviewMessageChange(previewMessage) + } + + const updateTheme = (theme: BubbleProps['theme']) => { + onThemeChange(theme) + } + + return ( + + Chat bubble settings + + + + Preview: + + {isDefined(previewMessage) && ( + + {previewMessage.avatarUrl && ( + Preview message avatar + )} + + {previewMessage.message} + + + )} + + + + + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/ButtonThemeSettings.tsx b/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/ButtonThemeSettings.tsx new file mode 100644 index 0000000000..b37c1a8a75 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/ButtonThemeSettings.tsx @@ -0,0 +1,65 @@ +import { ColorPicker } from '@/components/ColorPicker' +import { Heading, HStack, Input, Stack, Text } from '@chakra-ui/react' +import { ButtonTheme } from '@typebot.io/js/dist/features/bubble/types' +import React from 'react' + +type Props = { + buttonTheme: ButtonTheme | undefined + onChange: (newButtonTheme?: ButtonTheme) => void +} + +export const ButtonThemeSettings = ({ buttonTheme, onChange }: Props) => { + const updateBackgroundColor = (backgroundColor: string) => { + onChange({ + ...buttonTheme, + backgroundColor, + }) + } + + const updateIconColor = (iconColor: string) => { + onChange({ + ...buttonTheme, + iconColor, + }) + } + + const updateCustomIconSrc = (customIconSrc: string) => { + onChange({ + ...buttonTheme, + customIconSrc, + }) + } + + return ( + + Button + + + Background color + + + + Icon color + + + + Custom icon + updateCustomIconSrc(e.target.value)} + minW="0" + w="300px" + size="sm" + /> + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/PreviewMessageSettings.tsx b/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/PreviewMessageSettings.tsx new file mode 100644 index 0000000000..e3aa154841 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/PreviewMessageSettings.tsx @@ -0,0 +1,121 @@ +import { SmartNumberInput } from '@/components/inputs' +import { FormLabel, HStack, Input, Stack, Switch, Text } from '@chakra-ui/react' +import { PreviewMessageParams } from '@typebot.io/js/dist/features/bubble/types' +import { useState } from 'react' +import { isDefined } from 'utils' + +type Props = { + defaultAvatar: string + onChange: (newPreviewMessage?: PreviewMessageParams) => void +} + +export const PreviewMessageSettings = ({ defaultAvatar, onChange }: Props) => { + const [isPreviewMessageEnabled, setIsPreviewMessageEnabled] = useState(false) + const [previewMessage, setPreviewMessage] = useState() + const [autoShowDelay, setAutoShowDelay] = useState(10) + + const [isAutoShowEnabled, setIsAutoShowEnabled] = useState(false) + + const updatePreviewMessage = (previewMessage: PreviewMessageParams) => { + setPreviewMessage(previewMessage) + onChange(previewMessage) + } + + const updateAutoShowDelay = (autoShowDelay?: number) => { + setAutoShowDelay(autoShowDelay ?? 0) + updatePreviewMessage({ + ...previewMessage, + message: previewMessage?.message ?? '', + autoShowDelay, + }) + } + + const updateAvatarUrl = (avatarUrl: string) => { + updatePreviewMessage({ + ...previewMessage, + message: previewMessage?.message ?? '', + avatarUrl, + }) + } + + const updateMessage = (message: string) => { + updatePreviewMessage({ ...previewMessage, message }) + } + + const updatePreviewMessageCheck = (isChecked: boolean) => { + setIsPreviewMessageEnabled(isChecked) + const newPreviewMessage = { + autoShowDelay: isAutoShowEnabled ? autoShowDelay : undefined, + message: previewMessage?.message ?? 'I have a question for you!', + avatarUrl: previewMessage?.avatarUrl ?? defaultAvatar, + } + if (isChecked) setPreviewMessage(newPreviewMessage) + onChange(isChecked ? newPreviewMessage : undefined) + } + + const updateAutoShowDelayCheck = (isChecked: boolean) => { + setIsAutoShowEnabled(isChecked) + updatePreviewMessage({ + ...previewMessage, + message: previewMessage?.message ?? '', + + autoShowDelay: isChecked ? autoShowDelay : undefined, + }) + } + + return ( + + + + Preview message + + updatePreviewMessageCheck(e.target.checked)} + /> + + {isPreviewMessageEnabled && ( + + + Avatar URL + updateAvatarUrl(e.target.value)} + value={previewMessage?.avatarUrl} + placeholder={'Paste image link (.png, .jpg)'} + /> + + + Message + updateMessage(e.target.value)} + value={previewMessage?.message} + /> + + + Auto show + updateAutoShowDelayCheck(e.target.checked)} + /> + {isAutoShowEnabled && ( + <> + After + + isDefined(val) && updateAutoShowDelay(val) + } + withVariableButton={false} + /> + seconds + + )} + + + )} + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/PreviewMessageThemeSettings.tsx b/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/PreviewMessageThemeSettings.tsx new file mode 100644 index 0000000000..a86a425cbb --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/PreviewMessageThemeSettings.tsx @@ -0,0 +1,80 @@ +import { ColorPicker } from '@/components/ColorPicker' +import { Heading, HStack, Stack, Text } from '@chakra-ui/react' +import { PreviewMessageTheme } from '@typebot.io/js/dist/features/bubble/types' +import React from 'react' + +type Props = { + previewMessageTheme?: PreviewMessageTheme + onChange: (newPreviewMessageTheme?: PreviewMessageTheme) => void +} + +export const PreviewMessageThemeSettings = ({ + previewMessageTheme, + onChange, +}: Props) => { + const updateBackgroundColor = (backgroundColor: string) => { + onChange({ + ...previewMessageTheme, + backgroundColor, + }) + } + + const updateTextColor = (textColor: string) => { + onChange({ + ...previewMessageTheme, + textColor, + }) + } + + const updateCloseButtonBackgroundColor = ( + closeButtonBackgroundColor: string + ) => { + onChange({ + ...previewMessageTheme, + closeButtonBackgroundColor, + }) + } + + const updateCloseButtonIconColor = (closeButtonIconColor: string) => { + onChange({ + ...previewMessageTheme, + closeButtonIconColor, + }) + } + + return ( + + Preview message + + + Background color + + + + Text color + + + + Close button background + + + + Close icon color + + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/ThemeSettings.tsx b/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/ThemeSettings.tsx new file mode 100644 index 0000000000..51617d8990 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/settings/BubbleSettings/ThemeSettings.tsx @@ -0,0 +1,68 @@ +import { + Accordion, + AccordionButton, + AccordionIcon, + AccordionItem, + AccordionPanel, + HStack, + Stack, + Text, +} from '@chakra-ui/react' +import { BubbleProps } from '@typebot.io/js' +import { + ButtonTheme, + PreviewMessageTheme, +} from '@typebot.io/js/dist/features/bubble/types' +import { ButtonThemeSettings } from './ButtonThemeSettings' +import { PreviewMessageThemeSettings } from './PreviewMessageThemeSettings' + +type Props = { + isPreviewMessageEnabled: boolean + theme: BubbleProps['theme'] + onChange: (newBubbleTheme: BubbleProps['theme']) => void +} + +export const ThemeSettings = ({ + isPreviewMessageEnabled, + theme, + onChange, +}: Props) => { + const updateButtonTheme = (button?: ButtonTheme) => { + onChange({ + ...theme, + button, + }) + } + + const updatePreviewMessageTheme = (previewMessage?: PreviewMessageTheme) => { + onChange({ + ...theme, + previewMessage, + }) + } + + return ( + + + + + Theme + + + + + + {isPreviewMessageEnabled ? ( + + ) : null} + + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/settings/PopupSettings.tsx b/apps/builder/src/features/publish/components/embeds/settings/PopupSettings.tsx new file mode 100644 index 0000000000..ccdfc9c2b9 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/settings/PopupSettings.tsx @@ -0,0 +1,54 @@ +import { SmartNumberInput } from '@/components/inputs' +import { + StackProps, + Stack, + Heading, + Switch, + HStack, + Text, +} from '@chakra-ui/react' +import { PopupProps } from '@typebot.io/js' +import { useState, useEffect } from 'react' +import { isDefined } from 'utils' + +type Props = { + onUpdateSettings: (windowSettings: Pick) => void +} & StackProps + +export const PopupSettings = ({ onUpdateSettings, ...props }: Props) => { + const [isEnabled, setIsEnabled] = useState(false) + const [inputValue, setInputValue] = useState(5) + + useEffect(() => { + onUpdateSettings({ + autoShowDelay: isEnabled ? inputValue * 1000 : undefined, + }) + }, [inputValue, isEnabled, onUpdateSettings]) + + return ( + + Popup settings + + +

Auto show

+ setIsEnabled(e.target.checked)} + /> + {isEnabled && ( + <> + isDefined(val) && setInputValue(val)} + withVariableButton={false} + /> + seconds + + )} +
+
+ ) +} diff --git a/apps/builder/src/features/publish/components/embeds/settings/StandardSettings.tsx b/apps/builder/src/features/publish/components/embeds/settings/StandardSettings.tsx new file mode 100644 index 0000000000..e6e1f26640 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/settings/StandardSettings.tsx @@ -0,0 +1,107 @@ +import { + StackProps, + Stack, + Flex, + Heading, + Input, + HStack, + Text, +} from '@chakra-ui/react' +import { DropdownList } from '@/components/DropdownList' +import { useState, useEffect } from 'react' +import { SwitchWithLabel } from '@/components/SwitchWithLabel' + +type Props = { + onUpdateWindowSettings: (windowSettings: { + heightLabel: string + widthLabel?: string + }) => void +} & StackProps + +export const StandardSettings = ({ + onUpdateWindowSettings, + ...props +}: Props) => { + const [isFullscreenChecked, setIsFullscreenChecked] = useState(false) + const [inputValues, setInputValues] = useState({ + widthValue: '100', + widthType: '%', + heightValue: '600', + heightType: 'px', + }) + + useEffect(() => { + onUpdateWindowSettings({ + widthLabel: isFullscreenChecked + ? undefined + : inputValues.widthValue + inputValues.widthType, + heightLabel: isFullscreenChecked + ? '100vh' + : inputValues.heightValue + inputValues.heightType, + }) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [inputValues, isFullscreenChecked]) + + const handleWidthTypeSelect = (widthType: string) => + setInputValues({ ...inputValues, widthType }) + const handleHeightTypeSelect = (heightType: string) => + setInputValues({ ...inputValues, heightType }) + + return ( + + Window settings + + + setIsFullscreenChecked(!isFullscreenChecked)} + /> + {!isFullscreenChecked && ( + <> + + Width + + + setInputValues({ + ...inputValues, + widthValue: e.target.value, + }) + } + w="70px" + value={inputValues.widthValue} + /> + + items={['px', '%']} + onItemSelect={handleWidthTypeSelect} + currentItem={inputValues.widthType} + /> + + + + Height + + + setInputValues({ + ...inputValues, + heightValue: e.target.value, + }) + } + w="70px" + value={inputValues.heightValue} + /> + + items={['px', '%']} + onItemSelect={handleHeightTypeSelect} + currentItem={inputValues.heightType} + /> + + + + )} + + + ) +} diff --git a/apps/builder/src/features/publish/components/embeds/snippetParsers/bubble.ts b/apps/builder/src/features/publish/components/embeds/snippetParsers/bubble.ts new file mode 100644 index 0000000000..a616acabb1 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/snippetParsers/bubble.ts @@ -0,0 +1,162 @@ +import { BubbleProps } from '@typebot.io/js' +import parserBabel from 'prettier/parser-babel' +import prettier from 'prettier/standalone' +import { + parseStringParam, + parseBotProps, + parseNumberOrBoolParam, + parseReactBotProps, + typebotImportUrl, +} from './shared' + +const parseButtonTheme = ( + button: NonNullable['button'] +): string => { + if (!button) return '' + const { backgroundColor, iconColor, customIconSrc } = button + const backgroundColorLine = parseStringParam( + 'backgroundColor', + backgroundColor + ) + const iconColorLine = parseStringParam('iconColor', iconColor) + const customIconLine = parseStringParam('customIconSrc', customIconSrc) + const line = `button: {${backgroundColorLine}${iconColorLine}${customIconLine}},` + if (line === 'button: {},') return '' + return line +} + +const parsePreviewMessageTheme = ( + previewMessage: NonNullable['previewMessage'] +): string => { + if (!previewMessage) return '' + const { + backgroundColor, + closeButtonBackgroundColor, + closeButtonIconColor, + textColor, + } = previewMessage + const backgroundColorLine = parseStringParam( + 'backgroundColor', + backgroundColor + ) + const closeButtonBackgroundColorLine = parseStringParam( + 'closeButtonBackgroundColor', + closeButtonBackgroundColor + ) + const closeButtonIconColorLine = parseStringParam( + 'closeButtonIconColor', + closeButtonIconColor + ) + const textColorLine = parseStringParam('textColor', textColor) + const line = `previewMessage: {${backgroundColorLine}${textColorLine}${closeButtonBackgroundColorLine}${closeButtonIconColorLine}},` + if (line === 'previewMessage: {},') return '' + return line +} + +const parseChatWindowTheme = ( + chatWindow: NonNullable['chatWindow'] +) => { + if (!chatWindow) return '' + const backgroundColorLine = parseStringParam( + 'backgroundColor', + chatWindow.backgroundColor + ) + const line = `chatWindow: {${backgroundColorLine}},` + if (line === 'chatWindow: {},') return '' + return line +} + +const parseBubbleTheme = (theme: BubbleProps['theme']): string => { + if (!theme) return '' + const { button, previewMessage } = theme + const buttonThemeLine = parseButtonTheme(button) + const previewMessageThemeLine = parsePreviewMessageTheme(previewMessage) + const chatWindowThemeLine = parseChatWindowTheme(theme.chatWindow) + const line = `theme: {${buttonThemeLine}${previewMessageThemeLine}${chatWindowThemeLine}},` + if (line === 'theme: {},') return '' + return line +} + +const parsePreviewMessage = ( + previewMessage: BubbleProps['previewMessage'] +): string => { + if (!previewMessage) return '' + const { message, autoShowDelay, avatarUrl } = previewMessage + const messageLine = parseStringParam('message', message) + const autoShowDelayLine = parseNumberOrBoolParam( + 'autoShowDelay', + autoShowDelay + ) + const avatarUrlLine = parseStringParam('avatarUrl', avatarUrl) + const line = `previewMessage: {${messageLine}${autoShowDelayLine}${avatarUrlLine}},` + if (line === 'previewMessage: {},') return '' + return line +} + +const parseBubbleProps = ({ + previewMessage, + theme, +}: Pick) => { + const previewMessageLine = parsePreviewMessage(previewMessage) + const themeLine = parseBubbleTheme(theme) + return `${previewMessageLine}${themeLine}` +} + +export const parseInitBubbleCode = ({ + typebot, + apiHost, + previewMessage, + theme, +}: BubbleProps) => { + const botProps = parseBotProps({ typebot, apiHost }) + const bubbleProps = parseBubbleProps({ previewMessage, theme }) + + return prettier.format( + `import Typebot from '${typebotImportUrl}' + + Typebot.initBubble({${botProps}${bubbleProps}});`, + { + parser: 'babel', + plugins: [parserBabel], + } + ) +} + +const parseReactBubbleTheme = (theme: BubbleProps['theme']): string => { + if (!theme) return '' + const { button, previewMessage } = theme + const buttonThemeLine = parseButtonTheme(button) + const previewMessageThemeLine = parsePreviewMessageTheme(previewMessage) + const line = `theme={{${buttonThemeLine}${previewMessageThemeLine}}}` + if (line === 'theme={{}}') return '' + return line +} + +const parseReactPreviewMessage = ( + previewMessage: BubbleProps['previewMessage'] +): string => { + if (!previewMessage) return '' + const { message, autoShowDelay, avatarUrl } = previewMessage + const messageLine = parseStringParam('message', message) + const autoShowDelayLine = parseNumberOrBoolParam( + 'autoShowDelay', + autoShowDelay + ) + const avatarUrlLine = parseStringParam('avatarUrl', avatarUrl) + const line = `previewMessage={{${messageLine}${autoShowDelayLine}${avatarUrlLine}}}` + if (line === 'previewMessage={{}}') return '' + return line +} + +export const parseReactBubbleProps = ({ + typebot, + apiHost, + previewMessage, + theme, +}: BubbleProps) => { + const botProps = parseReactBotProps({ typebot, apiHost }) + const previewMessageProp = parseReactPreviewMessage(previewMessage) + const themeProp = parseReactBubbleTheme(theme) + + return `${botProps} ${previewMessageProp} ${themeProp}` +} diff --git a/apps/builder/src/features/publish/components/embeds/snippetParsers/index.ts b/apps/builder/src/features/publish/components/embeds/snippetParsers/index.ts new file mode 100644 index 0000000000..7c8eff3163 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/snippetParsers/index.ts @@ -0,0 +1,4 @@ +export * from './bubble' +export * from './popup' +export * from './shared' +export * from './standard' diff --git a/apps/builder/src/features/publish/components/embeds/snippetParsers/popup.ts b/apps/builder/src/features/publish/components/embeds/snippetParsers/popup.ts new file mode 100644 index 0000000000..40b0e9f97b --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/snippetParsers/popup.ts @@ -0,0 +1,77 @@ +import { PopupProps } from '@typebot.io/js' +import parserBabel from 'prettier/parser-babel' +import prettier from 'prettier/standalone' +import { + parseBotProps, + parseNumberOrBoolParam, + parseReactBotProps, + parseReactNumberOrBoolParam, + parseReactStringParam, + parseStringParam, + typebotImportUrl, +} from './shared' + +const parsePopupTheme = (theme: PopupProps['theme']): string => { + if (!theme) return '' + const { width } = theme + const widthLine = parseStringParam('width', width) + const line = `theme: {${widthLine}},` + if (line === 'theme: {}') return '' + return line +} + +const parsePopupProps = ({ + autoShowDelay, + theme, +}: Pick) => { + const autoShowDelayLine = parseNumberOrBoolParam( + 'autoShowDelay', + autoShowDelay + ) + const themeLine = parsePopupTheme(theme) + return `${autoShowDelayLine}${themeLine}` +} + +export const parseInitPopupCode = ({ + typebot, + apiHost, + theme, + autoShowDelay, +}: PopupProps) => { + const botProps = parseBotProps({ typebot, apiHost }) + const bubbleProps = parsePopupProps({ theme, autoShowDelay }) + + return prettier.format( + `import Typebot from '${typebotImportUrl}' + + Typebot.initPopup({${botProps}${bubbleProps}});`, + { + parser: 'babel', + plugins: [parserBabel], + } + ) +} + +const parseReactThemeProp = (theme: PopupProps['theme']): string => { + if (!theme) return '' + const { width } = theme + const widthProp = parseReactStringParam('width', width) + if (widthProp === 'theme={{}}') return '' + return widthProp +} + +export const parseReactPopupProps = ({ + typebot, + apiHost, + theme, + autoShowDelay, +}: PopupProps) => { + const botProps = parseReactBotProps({ typebot, apiHost }) + const autoShowDelayProp = parseReactNumberOrBoolParam( + 'autoShowDelay', + autoShowDelay + ) + const themeProp = parseReactThemeProp(theme) + + return `${botProps} ${autoShowDelayProp} ${themeProp}` +} diff --git a/apps/builder/src/features/publish/components/embeds/snippetParsers/shared.ts b/apps/builder/src/features/publish/components/embeds/snippetParsers/shared.ts new file mode 100644 index 0000000000..e7d412c0af --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/snippetParsers/shared.ts @@ -0,0 +1,32 @@ +import { BotProps } from '@typebot.io/js' +import { isDefined } from 'utils' + +export const parseStringParam = (fieldName: string, fieldValue?: string) => + fieldValue ? `${fieldName}: "${fieldValue}",` : `` + +export const parseNumberOrBoolParam = ( + fieldName: string, + fieldValue?: number | boolean +) => (isDefined(fieldValue) ? `${fieldName}: ${fieldValue},` : ``) + +export const parseBotProps = ({ typebot, apiHost }: BotProps) => { + const typebotLine = parseStringParam('typebot', typebot as string) + const apiHostLine = parseStringParam('apiHost', apiHost) + return `${typebotLine}${apiHostLine}` +} + +export const parseReactStringParam = (fieldName: string, fieldValue?: string) => + fieldValue ? `${fieldName}="${fieldValue}"` : `` + +export const parseReactNumberOrBoolParam = ( + fieldName: string, + fieldValue?: number | boolean +) => (isDefined(fieldValue) ? `${fieldName}={${fieldValue}}` : ``) + +export const parseReactBotProps = ({ typebot, apiHost }: BotProps) => { + const typebotLine = parseReactStringParam('typebot', typebot as string) + const apiHostLine = parseReactStringParam('apiHost', apiHost) + return `${typebotLine} ${apiHostLine}` +} + +export const typebotImportUrl = `https://cdn.jsdelivr.net/npm/@typebot.io/js@0.0.9/dist/web.js` diff --git a/apps/builder/src/features/publish/components/embeds/snippetParsers/standard.ts b/apps/builder/src/features/publish/components/embeds/snippetParsers/standard.ts new file mode 100644 index 0000000000..d52e2b9f37 --- /dev/null +++ b/apps/builder/src/features/publish/components/embeds/snippetParsers/standard.ts @@ -0,0 +1,21 @@ +import { BotProps } from '@typebot.io/js' +import parserBabel from 'prettier/parser-babel' +import prettier from 'prettier/standalone' +import { parseBotProps, typebotImportUrl } from './shared' + +export const parseInitStandardCode = ({ + typebot, + apiHost, +}: Pick) => { + const botProps = parseBotProps({ typebot, apiHost }) + + return prettier.format( + `import Typebot from '${typebotImportUrl}' + + Typebot.initStandard({${botProps}});`, + { + parser: 'babel', + plugins: [parserBabel], + } + ) +} diff --git a/apps/builder/src/features/publish/utils.ts b/apps/builder/src/features/publish/utils.ts index f827494fd7..d43574bf30 100644 --- a/apps/builder/src/features/publish/utils.ts +++ b/apps/builder/src/features/publish/utils.ts @@ -10,6 +10,7 @@ export const parsePublicTypebotToTypebot = ( existingTypebot: Typebot ): Typebot => ({ id: typebot.typebotId, + version: typebot.version, groups: typebot.groups, edges: typebot.edges, name: existingTypebot.name, @@ -32,6 +33,7 @@ export const parseTypebotToPublicTypebot = ( typebot: Typebot ): PublicTypebot => ({ id: createId(), + version: typebot.version, typebotId: typebot.id, groups: typebot.groups, edges: typebot.edges, diff --git a/apps/builder/src/features/settings/components/SettingsPage.tsx b/apps/builder/src/features/settings/components/SettingsPage.tsx index d787456309..9ee1dbd4cd 100644 --- a/apps/builder/src/features/settings/components/SettingsPage.tsx +++ b/apps/builder/src/features/settings/components/SettingsPage.tsx @@ -1,19 +1,12 @@ import { Seo } from '@/components/Seo' import { TypebotHeader, useTypebot } from '@/features/editor' import { Flex } from '@chakra-ui/react' -import { TypebotViewer } from 'bot-engine' -import { useMemo } from 'react' +import { Standard } from '@typebot.io/react' import { getViewerUrl } from 'utils' import { SettingsSideMenu } from './SettingsSideMenu' -import { parseTypebotToPublicTypebot } from '@/features/publish' export const SettingsPage = () => { const { typebot } = useTypebot() - const publicTypebot = useMemo( - () => (typebot ? parseTypebotToPublicTypebot(typebot) : undefined), - // eslint-disable-next-line react-hooks/exhaustive-deps - [typebot?.settings] - ) return ( @@ -21,10 +14,8 @@ export const SettingsPage = () => { - - {publicTypebot && ( - - )} + + {typebot && } diff --git a/apps/builder/src/features/settings/settings.spec.ts b/apps/builder/src/features/settings/settings.spec.ts index d7de15f7e4..c06a572aae 100644 --- a/apps/builder/src/features/settings/settings.spec.ts +++ b/apps/builder/src/features/settings/settings.spec.ts @@ -4,7 +4,6 @@ import { createId } from '@paralleldrive/cuid2' import { defaultTextInputOptions } from 'models' import { importTypebotInDatabase } from 'utils/playwright/databaseActions' import { freeWorkspaceId } from 'utils/playwright/databaseSetup' -import { typebotViewer } from 'utils/playwright/testHelpers' test.describe.parallel('Settings page', () => { test.describe('General', () => { @@ -15,12 +14,10 @@ test.describe.parallel('Settings page', () => { }) await page.goto(`/typebots/${typebotId}/settings`) await expect( - typebotViewer(page).locator('a:has-text("Made with Typebot")') + page.locator('a:has-text("Made with Typebot")') ).toHaveAttribute('href', 'https://www.typebot.io/?utm_source=litebadge') await page.click('text="Typebot.io branding"') - await expect( - typebotViewer(page).locator('a:has-text("Made with Typebot")') - ).toBeHidden() + await expect(page.locator('a:has-text("Made with Typebot")')).toBeHidden() await page.click('text="Remember session"') await expect( @@ -32,13 +29,13 @@ test.describe.parallel('Settings page', () => { page.locator('input[type="checkbox"] >> nth=-1') ).toHaveAttribute('checked', '') - await expect( - typebotViewer(page).locator('input[value="Baptiste"]') - ).toBeVisible() + await expect(page.getByPlaceholder('Type your answer...')).toHaveValue( + 'Baptiste' + ) await page.click('text=Prefill input') await page.click('text=Theme') await expect( - typebotViewer(page).locator( + page.locator( `input[placeholder="${defaultTextInputOptions.labels.placeholder}"]` ) ).toHaveValue('') @@ -53,7 +50,7 @@ test.describe.parallel('Settings page', () => { }) await page.goto(`/typebots/${typebotId}/settings`) await expect( - typebotViewer(page).locator('a:has-text("Made with Typebot")') + page.locator('a:has-text("Made with Typebot")') ).toHaveAttribute('href', 'https://www.typebot.io/?utm_source=litebadge') await page.click('button:has-text("Typing emulation")') await page.fill('[data-testid="speed"] input', '350') @@ -74,7 +71,7 @@ test.describe.parallel('Settings page', () => { }) await page.goto(`/typebots/${typebotId}/settings`) await expect( - typebotViewer(page).locator( + page.locator( `input[placeholder="${defaultTextInputOptions.labels.placeholder}"]` ) ).toHaveValue('Baptiste') @@ -120,9 +117,7 @@ test.describe.parallel('Settings page', () => { workspaceId: freeWorkspaceId, }) await page.goto(`/typebots/${typebotId}/settings`) - await expect( - typebotViewer(page).locator('text="What\'s your name?"') - ).toBeVisible() + await expect(page.locator('text="What\'s your name?"')).toBeVisible() await expect( page.locator('[data-testid="starter-lock-tag"]') ).toBeVisible() diff --git a/apps/builder/src/features/templates/components/TemplatesModal.tsx b/apps/builder/src/features/templates/components/TemplatesModal.tsx index e913608f26..2fadfcc91a 100644 --- a/apps/builder/src/features/templates/components/TemplatesModal.tsx +++ b/apps/builder/src/features/templates/components/TemplatesModal.tsx @@ -12,14 +12,13 @@ import { Tooltip, } from '@chakra-ui/react' import { ExternalLinkIcon } from '@/components/icons' -import { TypebotViewer } from 'bot-engine' +import { Standard } from '@typebot.io/react' import { Typebot } from 'models' import React, { useCallback, useEffect, useState } from 'react' -import { getViewerUrl, sendRequest } from 'utils' import { templates } from '../data' import { TemplateProps } from '../types' import { useToast } from '@/hooks/useToast' -import { parseTypebotToPublicTypebot } from '@/features/publish' +import { sendRequest } from 'utils' type Props = { isOpen: boolean @@ -68,18 +67,20 @@ export const TemplatesModal = ({ isOpen, onClose, onTypebotChoose }: Props) => { > - + {selectedTemplate.emoji}{' '} {selectedTemplate.name} {typebot && ( - )} diff --git a/apps/builder/src/features/templates/components/TemplatesPage.tsx b/apps/builder/src/features/templates/components/TemplatesPage.tsx index 9ee3fbc0e1..b78eef6f26 100644 --- a/apps/builder/src/features/templates/components/TemplatesPage.tsx +++ b/apps/builder/src/features/templates/components/TemplatesPage.tsx @@ -4,7 +4,7 @@ import { VStack } from '@chakra-ui/react' import { CreateNewTypebotButtons } from './CreateNewTypebotButtons' export const TemplatesPage = () => ( - + diff --git a/apps/builder/src/features/templates/templates.spec.ts b/apps/builder/src/features/templates/templates.spec.ts index 7308eb8f31..0c932dabe3 100644 --- a/apps/builder/src/features/templates/templates.spec.ts +++ b/apps/builder/src/features/templates/templates.spec.ts @@ -1,6 +1,5 @@ import { getTestAsset } from '@/test/utils/playwright' import test, { expect } from '@playwright/test' -import { typebotViewer } from 'utils/playwright/testHelpers' test.describe.parallel('Templates page', () => { test('From scratch should create a blank typebot', async ({ page }) => { @@ -26,9 +25,7 @@ test.describe.parallel('Templates page', () => { await page.goto('/typebots/create') await page.click('text=Start from a template') await page.click('text=Customer Support') - await expect( - typebotViewer(page).locator('text=How can I help you?') - ).toBeVisible() + await expect(page.locator('text=How can I help you?')).toBeVisible() await page.click('text=Use this template') await expect(page).toHaveURL(new RegExp(`/edit`)) }) diff --git a/apps/builder/src/features/theme/components/CustomCssSettings/CustomCssSettings.tsx b/apps/builder/src/features/theme/components/CustomCssSettings/CustomCssSettings.tsx index a9640765e5..c67cd6fac0 100644 --- a/apps/builder/src/features/theme/components/CustomCssSettings/CustomCssSettings.tsx +++ b/apps/builder/src/features/theme/components/CustomCssSettings/CustomCssSettings.tsx @@ -9,7 +9,7 @@ type Props = { export const CustomCssSettings = ({ customCss, onCustomCssChange }: Props) => { return ( diff --git a/apps/builder/src/features/theme/components/ThemePage.tsx b/apps/builder/src/features/theme/components/ThemePage.tsx index 0b05b684a5..e9fc760ca7 100644 --- a/apps/builder/src/features/theme/components/ThemePage.tsx +++ b/apps/builder/src/features/theme/components/ThemePage.tsx @@ -1,14 +1,11 @@ import { Seo } from '@/components/Seo' import { TypebotHeader, useTypebot } from '@/features/editor' import { Flex } from '@chakra-ui/react' -import { TypebotViewer } from 'bot-engine' -import { getViewerUrl } from 'utils' +import { Standard } from '@typebot.io/react' import { ThemeSideMenu } from './ThemeSideMenu' -import { parseTypebotToPublicTypebot } from '@/features/publish' export const ThemePage = () => { const { typebot } = useTypebot() - const publicTypebot = typebot && parseTypebotToPublicTypebot(typebot) return ( @@ -16,9 +13,15 @@ export const ThemePage = () => { - - {publicTypebot && ( - + + {typebot && ( + )} diff --git a/apps/builder/src/features/theme/components/ThemeSideMenu.tsx b/apps/builder/src/features/theme/components/ThemeSideMenu.tsx index 092721faac..db3e2d6fa6 100644 --- a/apps/builder/src/features/theme/components/ThemeSideMenu.tsx +++ b/apps/builder/src/features/theme/components/ThemeSideMenu.tsx @@ -38,6 +38,7 @@ export const ThemeSideMenu = () => { spacing={10} overflowY="scroll" pb="20" + position="relative" > Customize the theme diff --git a/apps/builder/src/features/theme/theme.spec.ts b/apps/builder/src/features/theme/theme.spec.ts index 5fcb0cc652..2a1dd56b45 100644 --- a/apps/builder/src/features/theme/theme.spec.ts +++ b/apps/builder/src/features/theme/theme.spec.ts @@ -2,7 +2,6 @@ import { getTestAsset } from '@/test/utils/playwright' import test, { expect } from '@playwright/test' import { createId } from '@paralleldrive/cuid2' import { importTypebotInDatabase } from 'utils/playwright/databaseActions' -import { typebotViewer } from 'utils/playwright/testHelpers' const hostAvatarUrl = 'https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1760&q=80' @@ -13,30 +12,29 @@ test.describe.parallel('Theme page', () => { test.describe('General', () => { test('should reflect change in real-time', async ({ page }) => { const typebotId = createId() - const chatContainer = typebotViewer(page).locator( - '[data-testid="container"]' - ) await importTypebotInDatabase(getTestAsset('typebots/theme.json'), { id: typebotId, }) await page.goto(`/typebots/${typebotId}/theme`) - await expect( - typebotViewer(page).locator('button >> text="Go"') - ).toBeVisible() + await expect(page.locator('button >> text="Go"')).toBeVisible() // Font await page.fill('input[type="text"]', 'Roboto Slab') - await expect(chatContainer).toHaveCSS('font-family', '"Roboto Slab"') + await expect(page.locator('.typebot-container')).toHaveCSS( + 'font-family', + /"Roboto Slab"/ + ) // BG color - await expect(chatContainer).toHaveCSS( + await expect(page.locator('.typebot-container')).toHaveCSS( 'background-color', 'rgba(0, 0, 0, 0)' ) await page.click('text=Color') - await page.click('[aria-label="Pick a color"]') + await page.waitForTimeout(100) + await page.getByRole('button', { name: 'Pick a color' }).click() await page.fill('[aria-label="Color value"] >> nth=-1', '#2a9d8f') - await expect(chatContainer).toHaveCSS( + await expect(page.locator('.typebot-container')).toHaveCSS( 'background-color', 'rgb(42, 157, 143)' ) @@ -55,30 +53,26 @@ test.describe.parallel('Theme page', () => { } await page.goto(`/typebots/${typebotId}/theme`) - await expect( - typebotViewer(page).locator('button >> text="Go"') - ).toBeVisible() + await expect(page.locator('button >> text="Go"')).toBeVisible() await page.click('button:has-text("Chat")') // Host avatar - await expect( - typebotViewer(page).locator('[data-testid="default-avatar"]') - ).toBeVisible() + await expect(page.locator('[data-testid="default-avatar"]')).toBeVisible() await page.click('[data-testid="default-avatar"]') await page.click('button:has-text("Embed link")') await page.fill( 'input[placeholder="Paste the image link..."]', hostAvatarUrl ) - await typebotViewer(page).locator('button >> text="Go"').click() + await page.locator('button >> text="Go"').click() - await expect(typebotViewer(page).locator('img')).toHaveAttribute( + await expect(page.locator('.typebot-container img')).toHaveAttribute( 'src', hostAvatarUrl ) await page.click('text=Bot avatar') - await expect(typebotViewer(page).locator('img')).toBeHidden() + await expect(page.locator('.typebot-container img')).toBeHidden() // Host bubbles await page.click( @@ -89,9 +83,7 @@ test.describe.parallel('Theme page', () => { '[data-testid="host-bubbles-theme"] >> [aria-label="Pick a color"] >> nth=1' ) await page.fill('input[value="#303235"]', '#ffffff') - const hostBubble = typebotViewer(page).locator( - '[data-testid="host-bubble"] >> nth=-1' - ) + const hostBubble = page.locator('[data-testid="host-bubble"] >> nth=-1') await expect(hostBubble).toHaveCSS( 'background-color', 'rgb(42, 157, 143)' @@ -107,7 +99,7 @@ test.describe.parallel('Theme page', () => { '[data-testid="buttons-theme"] >> [aria-label="Pick a color"] >> nth=1' ) await page.fill('input[value="#FFFFFF"]', '#e9c46a') - const button = typebotViewer(page).locator('[data-testid="button"]') + const button = page.getByRole('button', { name: 'Go' }) await expect(button).toHaveCSS('background-color', 'rgb(114, 9, 183)') await expect(button).toHaveCSS('color', 'rgb(233, 196, 106)') @@ -120,10 +112,8 @@ test.describe.parallel('Theme page', () => { '[data-testid="guest-bubbles-theme"] >> [aria-label="Pick a color"] >> nth=1' ) await page.fill('input[value="#FFFFFF"]', '#264653') - await typebotViewer(page).locator('button >> text="Go"').click() - const guestBubble = typebotViewer(page).locator( - '[data-testid="guest-bubble"] >> nth=-1' - ) + await page.locator('button >> text="Go"').click() + const guestBubble = page.locator('[data-testid="guest-bubble"] >> nth=-1') await expect(guestBubble).toHaveCSS( 'background-color', 'rgb(216, 243, 220)' @@ -133,21 +123,20 @@ test.describe.parallel('Theme page', () => { // Guest avatar await page.click('text=User avatar') await expect( - typebotViewer(page).locator('[data-testid="default-avatar"] >> nth=-1') + page.locator('[data-testid="default-avatar"] >> nth=-1') ).toBeVisible() await page.click('[data-testid="default-avatar"]') await page.click('button:has-text("Embed link")') - await page.fill( - 'input[placeholder="Paste the image link..."]', - guestAvatarUrl - ) - - typebotViewer(page).locator('button >> text="Go"').click() - await expect(typebotViewer(page).locator('img')).toHaveAttribute( + await page + .locator('input[placeholder="Paste the image link..."]') + .fill(guestAvatarUrl) + await page.locator('button >> text="Go"').click() + await expect(page.locator('.typebot-container img')).toHaveAttribute( 'src', guestAvatarUrl ) + await page.waitForTimeout(1000) // Input await page.click( '[data-testid="inputs-theme"] >> [aria-label="Pick a color"] >> nth=0' @@ -157,7 +146,7 @@ test.describe.parallel('Theme page', () => { '[data-testid="inputs-theme"] >> [aria-label="Pick a color"] >> nth=1' ) await page.fill('input[value="#303235"]', '#023e8a') - const input = typebotViewer(page).locator('.typebot-input') + const input = page.locator('.typebot-input') await expect(input).toHaveCSS('background-color', 'rgb(255, 232, 214)') await expect(input).toHaveCSS('color', 'rgb(2, 62, 138)') }) @@ -170,17 +159,16 @@ test.describe.parallel('Theme page', () => { id: typebotId, }) await page.goto(`/typebots/${typebotId}/theme`) - await expect( - typebotViewer(page).locator('button >> text="Go"') - ).toBeVisible() + await expect(page.locator('button >> text="Go"')).toBeVisible() await page.click('button:has-text("Custom CSS")') await page.fill( 'div[role="textbox"]', '.typebot-button {background-color: green}' ) - await expect( - typebotViewer(page).locator('[data-testid="button"]') - ).toHaveCSS('background-color', 'rgb(0, 128, 0)') + await expect(page.getByRole('button', { name: 'Go' })).toHaveCSS( + 'background-color', + 'rgb(0, 128, 0)' + ) }) }) }) diff --git a/apps/builder/src/lib/googleSheets.ts b/apps/builder/src/lib/googleSheets.ts index 163696b9dd..b9e6922350 100644 --- a/apps/builder/src/lib/googleSheets.ts +++ b/apps/builder/src/lib/googleSheets.ts @@ -27,7 +27,7 @@ export const getAuthenticatedGoogleClient = async ( ) as GoogleSheetsCredentialsData oauth2Client.setCredentials(data) - oauth2Client.on('tokens', updateTokens(credentialsId, data)) + oauth2Client.on('tokens', updateTokens(credentials.id, data)) return { client: oauth2Client, credentials } } diff --git a/apps/builder/src/pages/_app.tsx b/apps/builder/src/pages/_app.tsx index 77a0391138..b9e4036347 100644 --- a/apps/builder/src/pages/_app.tsx +++ b/apps/builder/src/pages/_app.tsx @@ -7,7 +7,6 @@ import { useRouterProgressBar } from '@/lib/routerProgressBar' import '@/assets/styles/routerProgressBar.css' import '@/assets/styles/plate.css' import '@/assets/styles/submissionsTable.css' -import '@/assets/styles/codeMirror.css' import '@/assets/styles/custom.css' import { UserProvider } from '@/features/account' import { TypebotProvider } from '@/features/editor' diff --git a/apps/builder/src/pages/api/typebots/[typebotId].ts b/apps/builder/src/pages/api/typebots/[typebotId].ts index e8a011ecfa..c0dcbf7bb1 100644 --- a/apps/builder/src/pages/api/typebots/[typebotId].ts +++ b/apps/builder/src/pages/api/typebots/[typebotId].ts @@ -92,9 +92,13 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => { const updates = { ...omit(data, 'id', 'createdAt', 'updatedAt'), + version: '3', theme: data.theme ?? undefined, settings: data.settings ?? undefined, resultsTablePreferences: data.resultsTablePreferences ?? undefined, + groups: data.groups ?? [], + variables: data.variables ?? [], + edges: data.edges ?? [], } satisfies Prisma.TypebotUpdateInput const updatedTypebot = await prisma.typebot.update({ diff --git a/apps/builder/src/test/assets/typebots/integrations/googleSheets.json b/apps/builder/src/test/assets/typebots/integrations/googleSheets.json index da14d9db13..9a0ed9431d 100644 --- a/apps/builder/src/test/assets/typebots/integrations/googleSheets.json +++ b/apps/builder/src/test/assets/typebots/integrations/googleSheets.json @@ -30,7 +30,8 @@ "type": "email input", "options": { "labels": { "button": "Send", "placeholder": "Type your email..." }, - "variableId": "qyLW6xD1AyLeedso2tHmhw" + "variableId": "qyLW6xD1AyLeedso2tHmhw", + "retryMessageContent": "This email doesn't seem to be valid. Can you type it again?" }, "outgoingEdgeId": "4yg9V76fdDntpDEw6H3tvU" } diff --git a/apps/builder/src/test/assets/typebots/integrations/googleSheetsGet.json b/apps/builder/src/test/assets/typebots/integrations/googleSheetsGet.json index de8664221f..9404f7598a 100644 --- a/apps/builder/src/test/assets/typebots/integrations/googleSheetsGet.json +++ b/apps/builder/src/test/assets/typebots/integrations/googleSheetsGet.json @@ -30,7 +30,8 @@ "type": "email input", "options": { "labels": { "button": "Send", "placeholder": "Type your email..." }, - "variableId": "qyLW6xD1AyLeedso2tHmhw" + "variableId": "qyLW6xD1AyLeedso2tHmhw", + "retryMessageContent": "This email doesn't seem to be valid. Can you type it again?" }, "outgoingEdgeId": "4yg9V76fdDntpDEw6H3tvU" } diff --git a/apps/builder/src/test/utils/selectorUtils.ts b/apps/builder/src/test/utils/selectorUtils.ts index 5c276ce81e..924fdfde8d 100644 --- a/apps/builder/src/test/utils/selectorUtils.ts +++ b/apps/builder/src/test/utils/selectorUtils.ts @@ -4,6 +4,4 @@ export const deleteButtonInConfirmDialog = (page: Page) => page.locator('section[role="alertdialog"] button:has-text("Delete")') export const stripePaymentForm = (page: Page) => - page - .frameLocator('#typebot-iframe') - .frameLocator('[title="Secure payment input frame"]') + page.frameLocator('[title="Secure payment input frame"]') diff --git a/apps/docs/docs/editor/blocks/logic/set-variable.md b/apps/docs/docs/editor/blocks/logic/set-variable.md index 195662148d..c39c054b54 100644 --- a/apps/docs/docs/editor/blocks/logic/set-variable.md +++ b/apps/docs/docs/editor/blocks/logic/set-variable.md @@ -93,7 +93,7 @@ window.location.href :::caution It will not give you the parent URL if you embed the bot on your site. -A more bulletproof option is to pass the URL as a hidden variable in the embed code options. You can find an example [here](/embed/html-javascript#additional-configuration). +A more bulletproof option is to pass the URL as a prefilled variable in the embed code options. You can find an example [here](/embed/html-javascript#additional-configuration). ::: ## Extract a cookie diff --git a/apps/docs/docs/editor/variables.mdx b/apps/docs/docs/editor/variables.mdx index 3acaa7f986..450eb230ad 100644 --- a/apps/docs/docs/editor/variables.mdx +++ b/apps/docs/docs/editor/variables.mdx @@ -34,12 +34,12 @@ Then the variables will be prefilled as following: - Email => test@test.com - First name => John -Prefilling variables using the embed library is even easier. You need to add an object named `hiddenVariables` that contains a dictionary of your values. For example: +Prefilling variables using the embed library is even easier. You need to add an object named `prefilledVariables` that contains a dictionary of your values. For example: ```js Typebot.initBubble({ - url: `https://viewer.typebot.io/typebot-support`, - hiddenVariables: { + typebot: `my-bot`, + prefilledVariables: { Email: 'test@test.com', 'First name': 'John', }, diff --git a/apps/docs/docs/embed/html-javascript.md b/apps/docs/docs/embed/html-javascript.md index 61d2f52215..bd864ebeb1 100644 --- a/apps/docs/docs/embed/html-javascript.md +++ b/apps/docs/docs/embed/html-javascript.md @@ -12,10 +12,10 @@ There, you can change the container dimensions. Here is a code example: ```html -
+ ``` @@ -32,8 +32,8 @@ Here is an example: ``` @@ -71,9 +71,8 @@ Here is an example: ```html ``` @@ -122,12 +121,12 @@ You can bind these commands on a button element, for example: ## Additional configuration -You can add hidden variable values in your embed code by adding the `hiddenVariables` option. Here is an example: +You can prefill the bot variable values in your embed code by adding the `prefilledVariables` option. Here is an example: ```js -Typebot.initContainer('typebot-container', { - url: 'https://viewer.typebot.io/my-typebot', - hiddenVariables: { +Typebot.initStandard({ + typebot: 'my-typebot', + prefilledVariables: { 'Current URL': 'https://my-site/account', 'User name': 'John Doe', }, diff --git a/apps/docs/docs/embed/wordpress.md b/apps/docs/docs/embed/wordpress.md index 85af87b93d..2f262045e4 100644 --- a/apps/docs/docs/embed/wordpress.md +++ b/apps/docs/docs/embed/wordpress.md @@ -8,78 +8,19 @@ Typebot has a native [WordPress plug-in](https://wordpress.org/plugins/typebot/) Of course, before using it, you need to create and publish your first typebot. -WP plugin preview +WP plugin preview -You can either choose to configurate an "easy setup" or "advanced setup". - -## Easy setup - -### Container - -When choosing "container" and click on "Save" you can then use a typebot shortcode in your page builder. [Here is a complete tutorial on how to insert a shortcode](https://www.wpbeginner.com/wp-tutorials/how-to-add-a-shortcode-in-wordpress/). - -Here is how it looks like: - -```text -[typebot width="100%" height="500px" background-color="#F7F8FF"] -``` - -`width`, `height`, `background-color` and `url` are optionnal. - -You should use `url` parameter only if you need to embed different typebots as containers on your website. - -If your typebot appears to have a small height like this: -WP plugin preview - -you need to set a fixed `height` in pixel (`500px` or `600px` is usually a great number). - -### Popup & Bubble - -Fields are self explanatory. To open the popup or the bubble when a button in your site is clicked you can use the [Javascript commands](/embed/html-javascript#open-or-close-a-popup). - -#### Pages to include separated by a comma - -With this field, you can tell the plugin to include the typebot only on specific pages. - -Example: - -- `/my-page,/other-page/*`: the typebot will appear on these pages: `/my-page`, `/other-page`, `/other-page/sub/path`, `/other-page/other/path` - -## Advanced setup - -This config allows you to directly paste the code from "HTML & Javascript" instructions in the Share page. So that you can set your own logic if needed. - -Here is an example for a bubble config: - -```html - - - -``` +The code snippet to paste is easily configurable in the Share tab of your bot after clicking on the "Wordpress" button. ## Personalize user experience -You can leverage the [hidden variables](/editor/variables#hidden-variables) and inject your user information directly into your typebot so that the experience is entirely customized to your user. +You can leverage the [prefilled variables](/editor/variables#prefilled-variables) and inject your user information directly into your typebot so that the experience is entirely customized to your user. Here are the available variables from WordPress, make sure to create them in your typebot's variables dropdown: WP predefined variables -You can use these variables anywhere on your typebot. For more informations, check out the [Hidden variables doc](https://docs.typebot.io/editor/variables/hidden-variables) +You can use these variables anywhere on your typebot. For more informations, check out the [Prefilled variables doc](https://docs.typebot.io/editor/variables#prefilled-variables) ## Your typebot isn't showing? diff --git a/apps/docs/static/img/embeddings/wordpress-preview.png b/apps/docs/static/img/embeddings/wordpress-preview.png index f40baa6e1a2dfdd3b6ed62b70e785f750d32a7f9..29ddea58c26d8f988ba6be5904ad93bfef9a89a8 100644 GIT binary patch literal 201136 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 XlwWr~-twk^0SG)@{an^LB{Ts5k$8Bm literal 279041 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

6qo3=z+?!QM79^e?T;HAt>&>O*KII&|YuoQn>}W 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 diff --git a/apps/viewer/src/components/TypebotPage.tsx b/apps/viewer/src/components/TypebotPage.tsx deleted file mode 100644 index b60ea115ff..0000000000 --- a/apps/viewer/src/components/TypebotPage.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import { TypebotViewer } from 'bot-engine' -import { AnswerInput, PublicTypebot, Typebot, VariableWithValue } from 'models' -import { useRouter } from 'next/router' -import React, { useEffect, useState } from 'react' -import { - injectCustomHeadCode, - isDefined, - isNotDefined, - isNotEmpty, -} from 'utils' -import { SEO } from './Seo' -import { ErrorPage } from './ErrorPage' -import { createResultQuery, updateResultQuery } from '@/features/results' -import { upsertAnswerQuery } from '@/features/answers' -import { gtmBodyElement } from '@/lib/google-tag-manager' -import { - getExistingResultFromSession, - setResultInSession, -} from '@/utils/sessionStorage' - -export type TypebotPageProps = { - publishedTypebot: Omit & { - typebot: Pick - } - url: string - isIE: boolean - customHeadCode: string | null -} - -export const TypebotPage = ({ - publishedTypebot, - isIE, - url, - customHeadCode, -}: TypebotPageProps) => { - const { asPath, push } = useRouter() - const [showTypebot, setShowTypebot] = useState(false) - const [predefinedVariables, setPredefinedVariables] = useState<{ - [key: string]: string - }>() - const [error, setError] = useState( - isIE ? new Error('Internet explorer is not supported') : undefined - ) - const [resultId, setResultId] = useState() - const [variableUpdateQueue, setVariableUpdateQueue] = useState< - VariableWithValue[][] - >([]) - const [chatStarted, setChatStarted] = useState(false) - - useEffect(() => { - setShowTypebot(true) - const urlParams = new URLSearchParams(location.search) - clearQueryParams() - const predefinedVariables: { [key: string]: string } = {} - urlParams.forEach((value, key) => { - predefinedVariables[key] = value - }) - setPredefinedVariables(predefinedVariables) - initializeResult().then() - if (isDefined(customHeadCode)) injectCustomHeadCode(customHeadCode) - const gtmId = publishedTypebot.settings.metadata.googleTagManagerId - if (isNotEmpty(gtmId)) document.body.prepend(gtmBodyElement(gtmId)) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) - - const clearQueryParams = () => { - const hasQueryParams = asPath.includes('?') - if ( - hasQueryParams && - publishedTypebot.settings.general.isHideQueryParamsEnabled !== false - ) - push(asPath.split('?')[0], undefined, { shallow: true }) - } - - const initializeResult = async () => { - const resultIdFromSession = getExistingResultFromSession() - if (resultIdFromSession) setResultId(resultIdFromSession) - else { - const { error, data } = await createResultQuery( - publishedTypebot.typebotId - ) - if (error) return setError(error) - if (data?.hasReachedLimit) - return setError(new Error('This bot is now closed.')) - if (data?.result) { - setResultId(data.result.id) - if ( - publishedTypebot.settings.general.isNewResultOnRefreshEnabled !== true - ) - setResultInSession(data.result.id) - } - } - } - - useEffect(() => { - if (!resultId || variableUpdateQueue.length === 0) return - Promise.all(variableUpdateQueue.map(sendNewVariables(resultId))).then() - setVariableUpdateQueue([]) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [resultId]) - - const handleNewVariables = async (variables: VariableWithValue[]) => { - if (!resultId) - return setVariableUpdateQueue([...variableUpdateQueue, variables]) - await sendNewVariables(resultId)(variables) - } - - const sendNewVariables = - (resultId: string) => async (variables: VariableWithValue[]) => { - if (publishedTypebot.settings.general.isResultSavingEnabled === false) - return - const { error } = await updateResultQuery(resultId, { variables }) - if (error) setError(error) - } - - const handleNewAnswer = async ( - answer: AnswerInput & { uploadedFiles: boolean } - ) => { - if (!resultId) return setError(new Error('Error: result was not created')) - if (publishedTypebot.settings.general.isResultSavingEnabled !== false) { - const { error } = await upsertAnswerQuery({ ...answer, resultId }) - if (error) setError(error) - } - if (chatStarted) return - updateResultQuery(resultId, { - hasStarted: true, - }).then(({ error }) => (error ? setError(error) : setChatStarted(true))) - } - - const handleCompleted = async () => { - if (publishedTypebot.settings.general.isResultSavingEnabled === false) - return - if (!resultId) return setError(new Error('Error: result was not created')) - const { error } = await updateResultQuery(resultId, { isCompleted: true }) - if (error) setError(error) - } - - if (error) { - return - } - return ( -

- - {showTypebot && ( - - )} -
- ) -} diff --git a/apps/viewer/src/components/TypebotPageV2.tsx b/apps/viewer/src/components/TypebotPageV2.tsx index fd376311f2..4addce3111 100644 --- a/apps/viewer/src/components/TypebotPageV2.tsx +++ b/apps/viewer/src/components/TypebotPageV2.tsx @@ -1,50 +1,161 @@ -import { Standard } from '@typebot.io/react' -import { BackgroundType, Typebot } from 'models' +import { TypebotViewer } from 'bot-engine' +import { AnswerInput, PublicTypebot, Typebot, VariableWithValue } from 'models' import { useRouter } from 'next/router' +import React, { useEffect, useState } from 'react' +import { + injectCustomHeadCode, + isDefined, + isNotDefined, + isNotEmpty, +} from 'utils' import { SEO } from './Seo' +import { ErrorPage } from './ErrorPage' +import { createResultQuery, updateResultQuery } from '@/features/results' +import { upsertAnswerQuery } from '@/features/answers' +import { gtmBodyElement } from '@/lib/google-tag-manager' +import { + getExistingResultFromSession, + setResultInSession, +} from '@/utils/sessionStorage' export type TypebotPageProps = { + publishedTypebot: Omit & { + typebot: Pick + } url: string - typebot?: Pick + isIE: boolean + customHeadCode: string | null } -export const TypebotPage = ({ url, typebot }: TypebotPageProps) => { - const { asPath, push, query } = useRouter() +export const TypebotPageV2 = ({ + publishedTypebot, + isIE, + url, + customHeadCode, +}: TypebotPageProps) => { + const { asPath, push } = useRouter() + const [showTypebot, setShowTypebot] = useState(false) + const [predefinedVariables, setPredefinedVariables] = useState<{ + [key: string]: string + }>() + const [error, setError] = useState( + isIE ? new Error('Internet explorer is not supported') : undefined + ) + const [resultId, setResultId] = useState() + const [variableUpdateQueue, setVariableUpdateQueue] = useState< + VariableWithValue[][] + >([]) + const [chatStarted, setChatStarted] = useState(false) - const background = typebot?.theme.general.background + useEffect(() => { + setShowTypebot(true) + const urlParams = new URLSearchParams(location.search) + clearQueryParams() + const predefinedVariables: { [key: string]: string } = {} + urlParams.forEach((value, key) => { + predefinedVariables[key] = value + }) + setPredefinedVariables(predefinedVariables) + initializeResult().then() + if (isDefined(customHeadCode)) injectCustomHeadCode(customHeadCode) + const gtmId = publishedTypebot.settings.metadata.googleTagManagerId + if (isNotEmpty(gtmId)) document.body.prepend(gtmBodyElement(gtmId)) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) - const clearQueryParamsIfNecessary = () => { + const clearQueryParams = () => { const hasQueryParams = asPath.includes('?') if ( - !hasQueryParams || - !(typebot?.settings.general.isHideQueryParamsEnabled ?? true) + hasQueryParams && + publishedTypebot.settings.general.isHideQueryParamsEnabled !== false ) + push(asPath.split('?')[0], undefined, { shallow: true }) + } + + const initializeResult = async () => { + const resultIdFromSession = getExistingResultFromSession() + if (resultIdFromSession) setResultId(resultIdFromSession) + else { + const { error, data } = await createResultQuery( + publishedTypebot.typebotId + ) + if (error) return setError(error) + if (data?.hasReachedLimit) + return setError(new Error('This bot is now closed.')) + if (data?.result) { + setResultId(data.result.id) + if ( + publishedTypebot.settings.general.isNewResultOnRefreshEnabled !== true + ) + setResultInSession(data.result.id) + } + } + } + + useEffect(() => { + if (!resultId || variableUpdateQueue.length === 0) return + Promise.all(variableUpdateQueue.map(sendNewVariables(resultId))).then() + setVariableUpdateQueue([]) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [resultId]) + + const handleNewVariables = async (variables: VariableWithValue[]) => { + if (!resultId) + return setVariableUpdateQueue([...variableUpdateQueue, variables]) + await sendNewVariables(resultId)(variables) + } + + const sendNewVariables = + (resultId: string) => async (variables: VariableWithValue[]) => { + if (publishedTypebot.settings.general.isResultSavingEnabled === false) + return + const { error } = await updateResultQuery(resultId, { variables }) + if (error) setError(error) + } + + const handleNewAnswer = async ( + answer: AnswerInput & { uploadedFiles: boolean } + ) => { + if (!resultId) return setError(new Error('Error: result was not created')) + if (publishedTypebot.settings.general.isResultSavingEnabled !== false) { + const { error } = await upsertAnswerQuery({ ...answer, resultId }) + if (error) setError(error) + } + if (chatStarted) return + updateResultQuery(resultId, { + hasStarted: true, + }).then(({ error }) => (error ? setError(error) : setChatStarted(true))) + } + + const handleCompleted = async () => { + if (publishedTypebot.settings.general.isResultSavingEnabled === false) return - push(asPath.split('?')[0], undefined, { shallow: true }) + if (!resultId) return setError(new Error('Error: result was not created')) + const { error } = await updateResultQuery(resultId, { isCompleted: true }) + if (error) setError(error) } + if (error) { + return + } return ( -
- {typebot && ( - + + {showTypebot && ( + )} -
) } diff --git a/apps/viewer/src/components/TypebotPageV3.tsx b/apps/viewer/src/components/TypebotPageV3.tsx new file mode 100644 index 0000000000..67255c0ee1 --- /dev/null +++ b/apps/viewer/src/components/TypebotPageV3.tsx @@ -0,0 +1,50 @@ +import { Standard } from '@typebot.io/react' +import { BackgroundType, Typebot } from 'models' +import { useRouter } from 'next/router' +import { SEO } from './Seo' + +export type TypebotPageProps = { + url: string + typebot?: Pick +} + +export const TypebotPageV3 = ({ url, typebot }: TypebotPageProps) => { + const { asPath, push, query } = useRouter() + + const background = typebot?.theme.general.background + + const clearQueryParamsIfNecessary = () => { + const hasQueryParams = asPath.includes('?') + if ( + !hasQueryParams || + !(typebot?.settings.general.isHideQueryParamsEnabled ?? true) + ) + return + push(asPath.split('?')[0], undefined, { shallow: true }) + } + + return ( +
+ {typebot && ( + + )} + +
+ ) +} diff --git a/apps/viewer/src/features/blocks/inputs/fileUpload/fileUpload.spec.ts b/apps/viewer/src/features/blocks/inputs/fileUpload/fileUpload.spec.ts index db8cdd1a15..c9c5f24514 100644 --- a/apps/viewer/src/features/blocks/inputs/fileUpload/fileUpload.spec.ts +++ b/apps/viewer/src/features/blocks/inputs/fileUpload/fileUpload.spec.ts @@ -8,7 +8,6 @@ import { importTypebotInDatabase, injectFakeResults, } from 'utils/playwright/databaseActions' -import { typebotViewer } from 'utils/playwright/testHelpers' import { getTestAsset } from '@/test/utils/playwright' import { Plan } from 'db' @@ -21,18 +20,16 @@ test('should work as expected', async ({ page, browser }) => { publicId: `${typebotId}-public`, }) await page.goto(`/${typebotId}-public`) - await typebotViewer(page) + await page .locator(`input[type="file"]`) .setInputFiles([ getTestAsset('typebots/api.json'), getTestAsset('typebots/fileUpload.json'), getTestAsset('typebots/hugeGroup.json'), ]) - await expect(typebotViewer(page).locator(`text="3"`)).toBeVisible() - await typebotViewer(page).locator('text="Upload 3 files"').click() - await expect( - typebotViewer(page).locator(`text="3 files uploaded"`) - ).toBeVisible() + await expect(page.locator(`text="3"`)).toBeVisible() + await page.locator('text="Upload 3 files"').click() + await expect(page.locator(`text="3 files uploaded"`)).toBeVisible() await page.goto(`${process.env.NEXTAUTH_URL}/typebots/${typebotId}/results`) await expect(page.getByRole('link', { name: 'api.json' })).toHaveAttribute( 'href', @@ -100,18 +97,16 @@ test.describe('Storage limit is reached', () => { page, }) => { await page.goto(`/${typebotId}-public`) - await typebotViewer(page) + await page .locator(`input[type="file"]`) .setInputFiles([ getTestAsset('typebots/api.json'), getTestAsset('typebots/fileUpload.json'), getTestAsset('typebots/hugeGroup.json'), ]) - await expect(typebotViewer(page).locator(`text="3"`)).toBeVisible() - await typebotViewer(page).locator('text="Upload 3 files"').click() - await expect( - typebotViewer(page).locator(`text="3 files uploaded"`) - ).toBeVisible() + await expect(page.locator(`text="3"`)).toBeVisible() + await page.locator('text="Upload 3 files"').click() + await expect(page.locator(`text="3 files uploaded"`)).toBeVisible() await page.evaluate(() => window.localStorage.setItem('workspaceId', 'starterWorkspace') ) diff --git a/apps/viewer/src/features/blocks/inputs/fileUpload/fileUploadV2.spec.ts b/apps/viewer/src/features/blocks/inputs/fileUpload/fileUploadV2.spec.ts deleted file mode 100644 index 914c282979..0000000000 --- a/apps/viewer/src/features/blocks/inputs/fileUpload/fileUploadV2.spec.ts +++ /dev/null @@ -1,117 +0,0 @@ -import test, { expect } from '@playwright/test' -import { createId } from '@paralleldrive/cuid2' -import { parse } from 'papaparse' -import { readFileSync } from 'fs' -import { isDefined } from 'utils' -import { - createWorkspaces, - importTypebotInDatabase, - injectFakeResults, -} from 'utils/playwright/databaseActions' -import { getTestAsset } from '@/test/utils/playwright' -import { Plan } from 'db' - -const THREE_GIGABYTES = 3 * 1024 * 1024 * 1024 - -test('should work as expected', async ({ page, browser }) => { - const typebotId = createId() - await importTypebotInDatabase(getTestAsset('typebots/fileUpload.json'), { - id: typebotId, - publicId: `${typebotId}-public`, - }) - await page.goto(`/next/${typebotId}-public`) - await page - .locator(`input[type="file"]`) - .setInputFiles([ - getTestAsset('typebots/api.json'), - getTestAsset('typebots/fileUpload.json'), - getTestAsset('typebots/hugeGroup.json'), - ]) - await expect(page.locator(`text="3"`)).toBeVisible() - await page.locator('text="Upload 3 files"').click() - await expect(page.locator(`text="3 files uploaded"`)).toBeVisible() - await page.goto(`${process.env.NEXTAUTH_URL}/typebots/${typebotId}/results`) - await expect(page.getByRole('link', { name: 'api.json' })).toHaveAttribute( - 'href', - /.+\/api\.json/ - ) - await expect( - page.getByRole('link', { name: 'fileUpload.json' }) - ).toHaveAttribute('href', /.+\/fileUpload\.json/) - await expect( - page.getByRole('link', { name: 'hugeGroup.json' }) - ).toHaveAttribute('href', /.+\/hugeGroup\.json/) - - await page.click('[data-testid="checkbox"] >> nth=0') - const [download] = await Promise.all([ - page.waitForEvent('download'), - page.getByRole('button', { name: 'Export' }).click(), - ]) - const downloadPath = await download.path() - expect(downloadPath).toBeDefined() - const file = readFileSync(downloadPath as string).toString() - const { data } = parse(file) - expect(data).toHaveLength(2) - expect((data[1] as unknown[])[1]).toContain(process.env.S3_ENDPOINT) - - const urls = ( - await Promise.all( - [ - page.getByRole('link', { name: 'api.json' }), - page.getByRole('link', { name: 'fileUpload.json' }), - page.getByRole('link', { name: 'hugeGroup.json' }), - ].map((elem) => elem.getAttribute('href')) - ) - ).filter(isDefined) - - const page2 = await browser.newPage() - await page2.goto(urls[0]) - await expect(page2.locator('pre')).toBeVisible() - - page.getByRole('button', { name: 'Delete' }).click() - await page.locator('button >> text="Delete"').click() - await expect(page.locator('text="api.json"')).toBeHidden() - await page2.goto(urls[0]) - await expect(page2.locator('pre')).toBeHidden() -}) - -test.describe('Storage limit is reached', () => { - const typebotId = createId() - const workspaceId = createId() - - test.beforeAll(async () => { - await createWorkspaces([{ id: workspaceId, plan: Plan.STARTER }]) - await importTypebotInDatabase(getTestAsset('typebots/fileUpload.json'), { - id: typebotId, - publicId: `${typebotId}-public`, - workspaceId, - }) - await injectFakeResults({ - typebotId, - count: 20, - fakeStorage: THREE_GIGABYTES, - }) - }) - - test("shouldn't upload anything if limit has been reached", async ({ - page, - }) => { - await page.goto(`/next/${typebotId}-public`) - await page - .locator(`input[type="file"]`) - .setInputFiles([ - getTestAsset('typebots/api.json'), - getTestAsset('typebots/fileUpload.json'), - getTestAsset('typebots/hugeGroup.json'), - ]) - await expect(page.locator(`text="3"`)).toBeVisible() - await page.locator('text="Upload 3 files"').click() - await expect(page.locator(`text="3 files uploaded"`)).toBeVisible() - await page.evaluate(() => - window.localStorage.setItem('workspaceId', 'starterWorkspace') - ) - await page.goto(`${process.env.NEXTAUTH_URL}/typebots/${typebotId}/results`) - await expect(page.locator('text="150%"')).toBeVisible() - await expect(page.locator('text="api.json"')).toBeHidden() - }) -}) diff --git a/apps/viewer/src/features/blocks/integrations/chatwoot/chatwoot.spec.ts b/apps/viewer/src/features/blocks/integrations/chatwoot/chatwoot.spec.ts index 26df441d78..be21ca94dc 100644 --- a/apps/viewer/src/features/blocks/integrations/chatwoot/chatwoot.spec.ts +++ b/apps/viewer/src/features/blocks/integrations/chatwoot/chatwoot.spec.ts @@ -3,7 +3,6 @@ import { createId } from '@paralleldrive/cuid2' import { createTypebots } from 'utils/playwright/databaseActions' import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' import { defaultChatwootOptions, IntegrationBlockType } from 'models' -import { typebotViewer } from 'utils/playwright/testHelpers' const typebotId = createId() @@ -26,6 +25,6 @@ test('should work as expected', async ({ page }) => { }, ]) await page.goto(`/${typebotId}-public`) - await typebotViewer(page).getByRole('button', { name: 'Go' }).click() + await page.getByRole('button', { name: 'Go' }).click() await expect(page.locator('#chatwoot_live_chat_widget')).toBeVisible() }) diff --git a/apps/viewer/src/features/blocks/integrations/chatwoot/chatwootV2.spec.ts b/apps/viewer/src/features/blocks/integrations/chatwoot/chatwootV2.spec.ts deleted file mode 100644 index fee2996c13..0000000000 --- a/apps/viewer/src/features/blocks/integrations/chatwoot/chatwootV2.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import test, { expect } from '@playwright/test' -import { createId } from '@paralleldrive/cuid2' -import { createTypebots } from 'utils/playwright/databaseActions' -import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' -import { defaultChatwootOptions, IntegrationBlockType } from 'models' - -const typebotId = createId() - -const chatwootTestWebsiteToken = 'tueXiiqEmrWUCZ4NUyoR7nhE' - -test('should work as expected', async ({ page }) => { - await createTypebots([ - { - id: typebotId, - ...parseDefaultGroupWithBlock( - { - type: IntegrationBlockType.CHATWOOT, - options: { - ...defaultChatwootOptions, - websiteToken: chatwootTestWebsiteToken, - }, - }, - { withGoButton: true } - ), - }, - ]) - await page.goto(`/next/${typebotId}-public`) - await page.getByRole('button', { name: 'Go' }).click() - await expect(page.locator('#chatwoot_live_chat_widget')).toBeVisible() -}) diff --git a/apps/viewer/src/features/blocks/integrations/sendEmail/sendEmail.spec.ts b/apps/viewer/src/features/blocks/integrations/sendEmail/sendEmail.spec.ts index b7be76a757..33d41618aa 100644 --- a/apps/viewer/src/features/blocks/integrations/sendEmail/sendEmail.spec.ts +++ b/apps/viewer/src/features/blocks/integrations/sendEmail/sendEmail.spec.ts @@ -3,7 +3,6 @@ import { createSmtpCredentials } from '../../../../test/utils/databaseActions' import { createId } from '@paralleldrive/cuid2' import { SmtpCredentialsData } from 'models' import { importTypebotInDatabase } from 'utils/playwright/databaseActions' -import { typebotViewer } from 'utils/playwright/testHelpers' import { getTestAsset } from '@/test/utils/playwright' export const mockSmtpCredentials: SmtpCredentialsData = { @@ -33,23 +32,8 @@ test('should send an email', async ({ page }) => { publicId: `${typebotId}-public`, }) await page.goto(`/${typebotId}-public`) - const [response] = await Promise.all([ - page.waitForResponse((resp) => - resp.request().url().includes(`integrations/email`) - ), - typebotViewer(page).locator('text=Send email').click(), - ]) - const { previewUrl } = await response.json() - await page.goto(previewUrl) - await expect(page.locator('text="Hey!"')).toBeVisible() - await expect( - page.locator(`text="${mockSmtpCredentials.from.name}"`) - ).toBeVisible() - await expect(page.locator('text="" >> nth=0')).toBeVisible() - await expect(page.locator('text="" >> nth=0')).toBeVisible() - await expect( - page.locator('text="" >> nth=0') - ).toBeVisible() + await page.locator('text=Send email').click() + await expect(page.getByText('Email sent!')).toBeVisible() await page.goto(`${process.env.NEXTAUTH_URL}/typebots/${typebotId}/results`) await page.click('text="See logs"') await expect(page.locator('text="Email successfully sent"')).toBeVisible() diff --git a/apps/viewer/src/features/blocks/integrations/sendEmail/sendEmailV2.spec.ts b/apps/viewer/src/features/blocks/integrations/sendEmail/sendEmailV2.spec.ts deleted file mode 100644 index be3fbdccb6..0000000000 --- a/apps/viewer/src/features/blocks/integrations/sendEmail/sendEmailV2.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import test, { expect } from '@playwright/test' -import { createSmtpCredentials } from '../../../../test/utils/databaseActions' -import { createId } from '@paralleldrive/cuid2' -import { SmtpCredentialsData } from 'models' -import { importTypebotInDatabase } from 'utils/playwright/databaseActions' -import { getTestAsset } from '@/test/utils/playwright' - -const mockSmtpCredentials: SmtpCredentialsData = { - from: { - email: 'sunny.cremin66@ethereal.email', - name: 'Sunny Cremin', - }, - host: 'smtp.ethereal.email', - port: 587, - username: 'sunny.cremin66@ethereal.email', - password: 'yJDHkf2bYbNydaRvTq', -} - -test.beforeAll(async () => { - try { - const credentialsId = 'send-email-credentials' - await createSmtpCredentials(credentialsId, mockSmtpCredentials) - } catch (err) { - console.error(err) - } -}) - -test('should send an email', async ({ page }) => { - const typebotId = createId() - await importTypebotInDatabase(getTestAsset('typebots/sendEmail.json'), { - id: typebotId, - publicId: `${typebotId}-public`, - }) - await page.goto(`/next/${typebotId}-public`) - await page.locator('text=Send email').click() - await expect(page.getByText('Email sent!')).toBeVisible() - await page.goto(`${process.env.NEXTAUTH_URL}/typebots/${typebotId}/results`) - await page.click('text="See logs"') - await expect(page.locator('text="Email successfully sent"')).toBeVisible() -}) diff --git a/apps/viewer/src/features/blocks/integrations/webhook/webhook.spec.ts b/apps/viewer/src/features/blocks/integrations/webhook/webhook.spec.ts index b19d6f8253..01c2867347 100644 --- a/apps/viewer/src/features/blocks/integrations/webhook/webhook.spec.ts +++ b/apps/viewer/src/features/blocks/integrations/webhook/webhook.spec.ts @@ -1,190 +1,67 @@ import test, { expect } from '@playwright/test' import { createId } from '@paralleldrive/cuid2' -import { HttpMethod, Typebot } from 'models' +import { HttpMethod } from 'models' import { createWebhook, importTypebotInDatabase, } from 'utils/playwright/databaseActions' -import { typebotViewer } from 'utils/playwright/testHelpers' -import { apiToken } from 'utils/playwright/databaseSetup' import { getTestAsset } from '@/test/utils/playwright' const typebotId = createId() -test.describe('Bot', () => { - test.beforeEach(async () => { - await importTypebotInDatabase(getTestAsset('typebots/webhook.json'), { - id: typebotId, - publicId: `${typebotId}-public`, - }) - - try { - await createWebhook(typebotId, { - id: 'failing-webhook', - url: 'http://localhost:3001/api/mock/fail', - method: HttpMethod.POST, - }) - - await createWebhook(typebotId, { - id: 'partial-body-webhook', - url: 'http://localhost:3000/api/mock/webhook-easy-config', - method: HttpMethod.POST, - body: `{ - "name": "{{Name}}", - "age": {{Age}}, - "gender": "{{Gender}}" - }`, - }) - - await createWebhook(typebotId, { - id: 'full-body-webhook', - url: 'http://localhost:3000/api/mock/webhook-easy-config', - method: HttpMethod.POST, - body: `{{Full body}}`, - }) - } catch (err) { - // Webhooks already created - } - }) - - test('should execute webhooks properly', async ({ page }) => { - await page.goto(`/${typebotId}-public`) - await typebotViewer(page).locator('text=Send failing webhook').click() - await typebotViewer(page) - .locator('[placeholder="Type a name..."]') - .fill('John') - await typebotViewer(page).locator('text="Send"').click() - await typebotViewer(page) - .locator('[placeholder="Type an age..."]') - .fill('30') - await typebotViewer(page).locator('text="Send"').click() - await typebotViewer(page).locator('text="Male"').click() - await expect( - typebotViewer(page).getByText('{"name":"John","age":25,"gender":"male"}') - ).toBeVisible() - await expect( - typebotViewer(page).getByText('{"name":"John","age":30,"gender":"Male"}') - ).toBeVisible() - await page.goto(`http://localhost:3000/typebots/${typebotId}/results`) - await page.click('text="See logs"') - await expect( - page.locator('text="Webhook successfuly executed." >> nth=1') - ).toBeVisible() - await expect(page.locator('text="Webhook returned an error"')).toBeVisible() - }) -}) - -test.describe('API', () => { - const typebotId = 'webhook-flow' - - test.beforeAll(async () => { - try { - await importTypebotInDatabase(getTestAsset('typebots/api.json'), { - id: typebotId, - }) - await createWebhook(typebotId) - } catch (err) { - console.log(err) - } +test.beforeEach(async () => { + await importTypebotInDatabase(getTestAsset('typebots/webhook.json'), { + id: typebotId, + publicId: `${typebotId}-public`, }) - test('can list typebots', async ({ request }) => { - expect((await request.get(`/api/typebots`)).status()).toBe(401) - const response = await request.get(`/api/typebots`, { - headers: { Authorization: `Bearer ${apiToken}` }, + try { + await createWebhook(typebotId, { + id: 'failing-webhook', + url: 'http://localhost:3001/api/mock/fail', + method: HttpMethod.POST, }) - const { typebots } = (await response.json()) as { typebots: Typebot[] } - expect(typebots.length).toBeGreaterThanOrEqual(1) - expect(typebots.find((typebot) => typebot.id === typebotId)).toMatchObject({ - id: typebotId, - name: 'My typebot', - }) - }) - - test('can get webhook blocks', async ({ request }) => { - expect( - (await request.get(`/api/typebots/${typebotId}/webhookBlocks`)).status() - ).toBe(401) - const response = await request.get( - `/api/typebots/${typebotId}/webhookBlocks`, - { - headers: { Authorization: `Bearer ${apiToken}` }, - } - ) - const { blocks } = await response.json() - expect(blocks).toHaveLength(1) - expect(blocks[0]).toEqual({ - blockId: 'webhookBlock', - name: 'Webhook > webhookBlock', - }) - }) - test('can subscribe webhook', async ({ request }) => { - expect( - ( - await request.post( - `/api/typebots/${typebotId}/blocks/webhookBlock/subscribeWebhook`, - { data: { url: 'https://test.com' } } - ) - ).status() - ).toBe(401) - const response = await request.post( - `/api/typebots/${typebotId}/blocks/webhookBlock/subscribeWebhook`, - { - headers: { - Authorization: `Bearer ${apiToken}`, - }, - data: { url: 'https://test.com' }, - } - ) - const body = await response.json() - expect(body).toEqual({ - message: 'success', + await createWebhook(typebotId, { + id: 'partial-body-webhook', + url: 'http://localhost:3000/api/mock/webhook-easy-config', + method: HttpMethod.POST, + body: `{ + "name": "{{Name}}", + "age": {{Age}}, + "gender": "{{Gender}}" + }`, }) - }) - test('can unsubscribe webhook', async ({ request }) => { - expect( - ( - await request.post( - `/api/typebots/${typebotId}/blocks/webhookBlock/unsubscribeWebhook` - ) - ).status() - ).toBe(401) - const response = await request.post( - `/api/typebots/${typebotId}/blocks/webhookBlock/unsubscribeWebhook`, - { - headers: { Authorization: `Bearer ${apiToken}` }, - } - ) - const body = await response.json() - expect(body).toEqual({ - message: 'success', + await createWebhook(typebotId, { + id: 'full-body-webhook', + url: 'http://localhost:3000/api/mock/webhook-easy-config', + method: HttpMethod.POST, + body: `{{Full body}}`, }) - }) + } catch (err) { + console.log(err) + } +}) - test('can get a sample result', async ({ request }) => { - expect( - ( - await request.get( - `/api/typebots/${typebotId}/blocks/webhookBlock/sampleResult` - ) - ).status() - ).toBe(401) - const response = await request.get( - `/api/typebots/${typebotId}/blocks/webhookBlock/sampleResult`, - { - headers: { Authorization: `Bearer ${apiToken}` }, - } - ) - const data = await response.json() - expect(data).toMatchObject({ - message: 'This is a sample result, it has been generated ⬇️', - Welcome: 'Hi!', - Email: 'test@email.com', - Name: 'answer value', - Services: 'Website dev, Content Marketing, Social Media, UI / UX Design', - 'Additional information': 'answer value', - }) - }) +test('should execute webhooks properly', async ({ page }) => { + await page.goto(`/${typebotId}-public`) + await page.locator('text=Send failing webhook').click() + await page.locator('[placeholder="Type a name..."]').fill('John') + await page.locator('text="Send"').click() + await page.locator('[placeholder="Type an age..."]').fill('30') + await page.locator('text="Send"').click() + await page.locator('text="Male"').click() + await expect( + page.getByText('{"name":"John","age":25,"gender":"male"}') + ).toBeVisible() + await expect( + page.getByText('{"name":"John","age":30,"gender":"Male"}') + ).toBeVisible() + await page.goto(`http://localhost:3000/typebots/${typebotId}/results`) + await page.click('text="See logs"') + await expect( + page.locator('text="Webhook successfuly executed." >> nth=1') + ).toBeVisible() + await expect(page.locator('text="Webhook returned an error"')).toBeVisible() }) diff --git a/apps/viewer/src/features/blocks/integrations/webhook/webhookV2.spec.ts b/apps/viewer/src/features/blocks/integrations/webhook/webhookV2.spec.ts deleted file mode 100644 index bb78bb73ee..0000000000 --- a/apps/viewer/src/features/blocks/integrations/webhook/webhookV2.spec.ts +++ /dev/null @@ -1,67 +0,0 @@ -import test, { expect } from '@playwright/test' -import { createId } from '@paralleldrive/cuid2' -import { HttpMethod } from 'models' -import { - createWebhook, - importTypebotInDatabase, -} from 'utils/playwright/databaseActions' -import { getTestAsset } from '@/test/utils/playwright' - -const typebotId = createId() - -test.beforeEach(async () => { - await importTypebotInDatabase(getTestAsset('typebots/webhook.json'), { - id: typebotId, - publicId: `${typebotId}-public`, - }) - - try { - await createWebhook(typebotId, { - id: 'failing-webhook', - url: 'http://localhost:3001/api/mock/fail', - method: HttpMethod.POST, - }) - - await createWebhook(typebotId, { - id: 'partial-body-webhook', - url: 'http://localhost:3000/api/mock/webhook-easy-config', - method: HttpMethod.POST, - body: `{ - "name": "{{Name}}", - "age": {{Age}}, - "gender": "{{Gender}}" - }`, - }) - - await createWebhook(typebotId, { - id: 'full-body-webhook', - url: 'http://localhost:3000/api/mock/webhook-easy-config', - method: HttpMethod.POST, - body: `{{Full body}}`, - }) - } catch (err) { - // Webhooks already created - } -}) - -test('should execute webhooks properly', async ({ page }) => { - await page.goto(`/next/${typebotId}-public`) - await page.locator('text=Send failing webhook').click() - await page.locator('[placeholder="Type a name..."]').fill('John') - await page.locator('text="Send"').click() - await page.locator('[placeholder="Type an age..."]').fill('30') - await page.locator('text="Send"').click() - await page.locator('text="Male"').click() - await expect( - page.getByText('{"name":"John","age":25,"gender":"male"}') - ).toBeVisible() - await expect( - page.getByText('{"name":"John","age":30,"gender":"Male"}') - ).toBeVisible() - await page.goto(`http://localhost:3000/typebots/${typebotId}/results`) - await page.click('text="See logs"') - await expect( - page.locator('text="Webhook successfuly executed." >> nth=1') - ).toBeVisible() - await expect(page.locator('text="Webhook returned an error"')).toBeVisible() -}) diff --git a/apps/viewer/src/features/blocks/logic/typebotLink/typebotLink.spec.ts b/apps/viewer/src/features/blocks/logic/typebotLink/typebotLink.spec.ts index 0e12de7833..d9179bd6e9 100644 --- a/apps/viewer/src/features/blocks/logic/typebotLink/typebotLink.spec.ts +++ b/apps/viewer/src/features/blocks/logic/typebotLink/typebotLink.spec.ts @@ -1,9 +1,8 @@ import { getTestAsset } from '@/test/utils/playwright' import test, { expect } from '@playwright/test' import { importTypebotInDatabase } from 'utils/playwright/databaseActions' -import { typebotViewer } from 'utils/playwright/testHelpers' -const typebotId = 'cl0ibhi7s0018n21aarlmg0cm1' +const typebotId = 'cl0ibhi7s0018n21aarlmg0cm' const linkedTypebotId = 'cl0ibhv8d0130n21aw8doxhj5' test.beforeAll(async () => { @@ -23,16 +22,9 @@ test.beforeAll(async () => { test('should work as expected', async ({ page }) => { await page.goto(`/${typebotId}-public`) - await typebotViewer(page).locator('input').fill('Hello there!') - await Promise.all([ - page.waitForResponse( - (resp) => - resp.request().url().includes(`/api/typebots/t/results`) && - resp.status() === 200 && - resp.request().method() === 'PUT' - ), - typebotViewer(page).locator('input').press('Enter'), - ]) + await page.locator('input').fill('Hello there!') + await page.locator('input').press('Enter') + await expect(page.getByText('Cheers!')).toBeVisible() await page.goto(`${process.env.NEXTAUTH_URL}/typebots/${typebotId}/results`) await expect(page.locator('text=Hello there!')).toBeVisible() }) diff --git a/apps/viewer/src/features/blocks/logic/typebotLink/typebotLinkV2.spec.ts b/apps/viewer/src/features/blocks/logic/typebotLink/typebotLinkV2.spec.ts deleted file mode 100644 index 1bd0197de6..0000000000 --- a/apps/viewer/src/features/blocks/logic/typebotLink/typebotLinkV2.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { getTestAsset } from '@/test/utils/playwright' -import test, { expect } from '@playwright/test' -import { importTypebotInDatabase } from 'utils/playwright/databaseActions' - -const typebotId = 'cl0ibhi7s0018n21aarlmg0cm' -const linkedTypebotId = 'cl0ibhv8d0130n21aw8doxhj5' - -test.beforeAll(async () => { - try { - await importTypebotInDatabase( - getTestAsset('typebots/linkTypebots/1.json'), - { id: typebotId, publicId: `${typebotId}-public` } - ) - await importTypebotInDatabase( - getTestAsset('typebots/linkTypebots/2.json'), - { id: linkedTypebotId, publicId: `${linkedTypebotId}-public` } - ) - } catch (err) { - console.error(err) - } -}) - -test('should work as expected', async ({ page }) => { - await page.goto(`/next/${typebotId}-public`) - await page.locator('input').fill('Hello there!') - await page.locator('input').press('Enter') - await expect(page.getByText('Cheers!')).toBeVisible() - await page.goto(`${process.env.NEXTAUTH_URL}/typebots/${typebotId}/results`) - await expect(page.locator('text=Hello there!')).toBeVisible() -}) diff --git a/apps/viewer/src/features/results/results.spec.ts b/apps/viewer/src/features/results/results.spec.ts index 16f9876eb3..299008e0f2 100644 --- a/apps/viewer/src/features/results/results.spec.ts +++ b/apps/viewer/src/features/results/results.spec.ts @@ -1,12 +1,7 @@ import { getTestAsset } from '@/test/utils/playwright' import test, { expect } from '@playwright/test' import { createId } from '@paralleldrive/cuid2' -import { - importTypebotInDatabase, - injectFakeResults, -} from 'utils/playwright/databaseActions' -import { apiToken } from 'utils/playwright/databaseSetup' -import { typebotViewer } from 'utils/playwright/testHelpers' +import { importTypebotInDatabase } from 'utils/playwright/databaseActions' test('Big groups should work as expected', async ({ page }) => { const typebotId = createId() @@ -15,11 +10,11 @@ test('Big groups should work as expected', async ({ page }) => { publicId: `${typebotId}-public`, }) await page.goto(`/${typebotId}-public`) - await typebotViewer(page).locator('input').fill('Baptiste') - await typebotViewer(page).locator('input').press('Enter') - await typebotViewer(page).locator('input').fill('26') - await typebotViewer(page).locator('input').press('Enter') - await typebotViewer(page).locator('button >> text=Yes').click() + await page.locator('input').fill('Baptiste') + await page.locator('input').press('Enter') + await page.locator('input').fill('26') + await page.locator('input').press('Enter') + await page.locator('button >> text=Yes').click() await page.goto(`${process.env.NEXTAUTH_URL}/typebots/${typebotId}/results`) await expect(page.locator('text="Baptiste"')).toBeVisible() await expect(page.locator('text="26"')).toBeVisible() @@ -30,22 +25,3 @@ test('Big groups should work as expected', async ({ page }) => { await expect(page.locator('text="26" >> nth=1')).toBeVisible() await expect(page.locator('text="Yes" >> nth=1')).toBeVisible() }) - -test('can list results with API', async ({ request }) => { - const typebotId = createId() - await importTypebotInDatabase(getTestAsset('typebots/api.json'), { - id: typebotId, - }) - await injectFakeResults({ typebotId, count: 20 }) - expect( - (await request.get(`/api/typebots/${typebotId}/results`)).status() - ).toBe(401) - const response = await request.get( - `/api/typebots/${typebotId}/results?limit=10`, - { - headers: { Authorization: `Bearer ${apiToken}` }, - } - ) - const { results } = await response.json() - expect(results).toHaveLength(10) -}) diff --git a/apps/viewer/src/features/results/resultsV2.spec.ts b/apps/viewer/src/features/results/resultsV2.spec.ts deleted file mode 100644 index 6e573494ab..0000000000 --- a/apps/viewer/src/features/results/resultsV2.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { getTestAsset } from '@/test/utils/playwright' -import test, { expect } from '@playwright/test' -import { createId } from '@paralleldrive/cuid2' -import { importTypebotInDatabase } from 'utils/playwright/databaseActions' - -test('Big groups should work as expected', async ({ page }) => { - const typebotId = createId() - await importTypebotInDatabase(getTestAsset('typebots/hugeGroup.json'), { - id: typebotId, - publicId: `${typebotId}-public`, - }) - await page.goto(`/next/${typebotId}-public`) - await page.locator('input').fill('Baptiste') - await page.locator('input').press('Enter') - await page.locator('input').fill('26') - await page.locator('input').press('Enter') - await page.locator('button >> text=Yes').click() - await page.goto(`${process.env.NEXTAUTH_URL}/typebots/${typebotId}/results`) - await expect(page.locator('text="Baptiste"')).toBeVisible() - await expect(page.locator('text="26"')).toBeVisible() - await expect(page.locator('text="Yes"')).toBeVisible() - await page.hover('tbody > tr') - await page.click('button >> text="Open"') - await expect(page.locator('text="Baptiste" >> nth=1')).toBeVisible() - await expect(page.locator('text="26" >> nth=1')).toBeVisible() - await expect(page.locator('text="Yes" >> nth=1')).toBeVisible() -}) diff --git a/apps/viewer/src/features/settings/settings.spec.ts b/apps/viewer/src/features/settings/settings.spec.ts index ed65d00565..32a964afa5 100644 --- a/apps/viewer/src/features/settings/settings.spec.ts +++ b/apps/viewer/src/features/settings/settings.spec.ts @@ -8,9 +8,8 @@ import { } from 'models' import { createTypebots, updateTypebot } from 'utils/playwright/databaseActions' import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' -import { typebotViewer } from 'utils/playwright/testHelpers' -test('Result should be in storage by default', async ({ page }) => { +test('Result should be overwritten on page refresh', async ({ page }) => { const typebotId = createId() await createTypebots([ { @@ -21,18 +20,21 @@ test('Result should be in storage by default', async ({ page }) => { }), }, ]) - await Promise.all([ + + const [, response] = await Promise.all([ page.goto(`/${typebotId}-public`), - page.waitForResponse( - (resp) => - resp.request().url().includes(`/api/typebots/${typebotId}/results`) && - resp.status() === 200 && - resp.request().method() === 'POST' - ), + page.waitForResponse(/sendMessage/), ]) - await page.reload() - const resultId = await page.evaluate(() => sessionStorage.getItem('resultId')) + const { resultId } = await response.json() expect(resultId).toBeDefined() + await expect(page.getByRole('textbox')).toBeVisible() + + const [, secondResponse] = await Promise.all([ + page.reload(), + page.waitForResponse(/sendMessage/), + ]) + const { resultId: secondResultId } = await secondResponse.json() + expect(secondResultId).toBe(resultId) }) test.describe('Create result on page refresh enabled', () => { @@ -54,28 +56,20 @@ test.describe('Create result on page refresh enabled', () => { }), }, ]) - await Promise.all([ + const [, response] = await Promise.all([ page.goto(`/${typebotId}-public`), - page.waitForResponse( - (resp) => - resp.request().url().includes(`/api/typebots/${typebotId}/results`) && - resp.status() === 200 && - resp.request().method() === 'POST' - ), + page.waitForResponse(/sendMessage/), ]) - await Promise.all([ + const { resultId } = await response.json() + expect(resultId).toBeDefined() + + await expect(page.getByRole('textbox')).toBeVisible() + const [, secondResponse] = await Promise.all([ page.reload(), - page.waitForResponse( - (resp) => - resp.request().url().includes(`/api/typebots/${typebotId}/results`) && - resp.status() === 200 && - resp.request().method() === 'POST' - ), + page.waitForResponse(/sendMessage/), ]) - const resultId = await page.evaluate(() => - sessionStorage.getItem('resultId') - ) - expect(resultId).toBe(null) + const { resultId: secondResultId } = await secondResponse.json() + expect(secondResultId).not.toBe(resultId) }) }) @@ -125,14 +119,12 @@ test('Show close message', async ({ page }) => { test('Should correctly parse metadata', async ({ page }) => { const typebotId = createId() - const googleTagManagerId = 'GTM-M72NXKB' const customMetadata: Metadata = { description: 'My custom description', title: 'Custom title', favIconUrl: 'https://www.baptistearno.com/favicon.png', imageUrl: 'https://www.baptistearno.com/images/site-preview.png', customHeadCode: '', - googleTagManagerId, } await createTypebots([ { @@ -148,11 +140,6 @@ test('Should correctly parse metadata', async ({ page }) => { }, ]) await page.goto(`/${typebotId}-public`) - await expect( - typebotViewer(page).locator( - `input[placeholder="${defaultTextInputOptions.labels.placeholder}"]` - ) - ).toBeVisible() expect( await page.evaluate(`document.querySelector('title').textContent`) ).toBe(customMetadata.title) @@ -177,6 +164,11 @@ test('Should correctly parse metadata', async ({ page }) => { ).getAttribute('href') ) ).toBe(customMetadata.favIconUrl) + await expect( + page.locator( + `input[placeholder="${defaultTextInputOptions.labels.placeholder}"]` + ) + ).toBeVisible() expect( await page.evaluate( () => @@ -184,12 +176,4 @@ test('Should correctly parse metadata', async ({ page }) => { .content ) ).toBe('John Doe') - expect( - await page.evaluate( - (googleTagManagerId) => - document.querySelector( - `iframe[src="https://www.googletagmanager.com/ns.html?id=${googleTagManagerId}"]` - ) as HTMLMetaElement - ) - ).toBeDefined() }) diff --git a/apps/viewer/src/features/settings/settingsV2.spec.ts b/apps/viewer/src/features/settings/settingsV2.spec.ts deleted file mode 100644 index b482a956e4..0000000000 --- a/apps/viewer/src/features/settings/settingsV2.spec.ts +++ /dev/null @@ -1,179 +0,0 @@ -import test, { expect } from '@playwright/test' -import { createId } from '@paralleldrive/cuid2' -import { - defaultSettings, - defaultTextInputOptions, - InputBlockType, - Metadata, -} from 'models' -import { createTypebots, updateTypebot } from 'utils/playwright/databaseActions' -import { parseDefaultGroupWithBlock } from 'utils/playwright/databaseHelpers' - -test('Result should be overwritten on page refresh', async ({ page }) => { - const typebotId = createId() - await createTypebots([ - { - id: typebotId, - ...parseDefaultGroupWithBlock({ - type: InputBlockType.TEXT, - options: defaultTextInputOptions, - }), - }, - ]) - - const [, response] = await Promise.all([ - page.goto(`/next/${typebotId}-public`), - page.waitForResponse(/sendMessage/), - ]) - const { resultId } = await response.json() - expect(resultId).toBeDefined() - await expect(page.getByRole('textbox')).toBeVisible() - - const [, secondResponse] = await Promise.all([ - page.reload(), - page.waitForResponse(/sendMessage/), - ]) - const { resultId: secondResultId } = await secondResponse.json() - expect(secondResultId).toBe(resultId) -}) - -test.describe('Create result on page refresh enabled', () => { - test('should work', async ({ page }) => { - const typebotId = createId() - await createTypebots([ - { - id: typebotId, - settings: { - ...defaultSettings, - general: { - ...defaultSettings.general, - isNewResultOnRefreshEnabled: true, - }, - }, - ...parseDefaultGroupWithBlock({ - type: InputBlockType.TEXT, - options: defaultTextInputOptions, - }), - }, - ]) - const [, response] = await Promise.all([ - page.goto(`/next/${typebotId}-public`), - page.waitForResponse(/sendMessage/), - ]) - const { resultId } = await response.json() - expect(resultId).toBeDefined() - - await expect(page.getByRole('textbox')).toBeVisible() - const [, secondResponse] = await Promise.all([ - page.reload(), - page.waitForResponse(/sendMessage/), - ]) - const { resultId: secondResultId } = await secondResponse.json() - expect(secondResultId).not.toBe(resultId) - }) -}) - -test('Hide query params', async ({ page }) => { - const typebotId = createId() - await createTypebots([ - { - id: typebotId, - ...parseDefaultGroupWithBlock({ - type: InputBlockType.TEXT, - options: defaultTextInputOptions, - }), - }, - ]) - await page.goto(`/next/${typebotId}-public?Name=John`) - await page.waitForTimeout(1000) - expect(page.url()).toEqual(`http://localhost:3001/next/${typebotId}-public`) - await updateTypebot({ - id: typebotId, - settings: { - ...defaultSettings, - general: { ...defaultSettings.general, isHideQueryParamsEnabled: false }, - }, - }) - await page.goto(`/next/${typebotId}-public?Name=John`) - await page.waitForTimeout(1000) - expect(page.url()).toEqual( - `http://localhost:3001/next/${typebotId}-public?Name=John` - ) -}) - -test('Show close message', async ({ page }) => { - const typebotId = createId() - await createTypebots([ - { - id: typebotId, - ...parseDefaultGroupWithBlock({ - type: InputBlockType.TEXT, - options: defaultTextInputOptions, - }), - isClosed: true, - }, - ]) - await page.goto(`/next/${typebotId}-public`) - await expect(page.locator('text=This bot is now closed')).toBeVisible() -}) - -test('Should correctly parse metadata', async ({ page }) => { - const typebotId = createId() - const customMetadata: Metadata = { - description: 'My custom description', - title: 'Custom title', - favIconUrl: 'https://www.baptistearno.com/favicon.png', - imageUrl: 'https://www.baptistearno.com/images/site-preview.png', - customHeadCode: '', - } - await createTypebots([ - { - id: typebotId, - settings: { - ...defaultSettings, - metadata: customMetadata, - }, - ...parseDefaultGroupWithBlock({ - type: InputBlockType.TEXT, - options: defaultTextInputOptions, - }), - }, - ]) - await page.goto(`/next/${typebotId}-public`) - expect( - await page.evaluate(`document.querySelector('title').textContent`) - ).toBe(customMetadata.title) - expect( - await page.evaluate( - () => - (document.querySelector('meta[name="description"]') as HTMLMetaElement) - .content - ) - ).toBe(customMetadata.description) - expect( - await page.evaluate( - () => - (document.querySelector('meta[property="og:image"]') as HTMLMetaElement) - .content - ) - ).toBe(customMetadata.imageUrl) - expect( - await page.evaluate(() => - ( - document.querySelector('link[rel="icon"]') as HTMLLinkElement - ).getAttribute('href') - ) - ).toBe(customMetadata.favIconUrl) - await expect( - page.locator( - `input[placeholder="${defaultTextInputOptions.labels.placeholder}"]` - ) - ).toBeVisible() - expect( - await page.evaluate( - () => - (document.querySelector('meta[name="author"]') as HTMLMetaElement) - .content - ) - ).toBe('John Doe') -}) diff --git a/apps/viewer/src/features/usage/usage.spec.ts b/apps/viewer/src/features/usage/usage.spec.ts index f01e2a548f..7993d28f68 100644 --- a/apps/viewer/src/features/usage/usage.spec.ts +++ b/apps/viewer/src/features/usage/usage.spec.ts @@ -8,7 +8,6 @@ import { importTypebotInDatabase, injectFakeResults, } from 'utils/playwright/databaseActions' -import { typebotViewer } from 'utils/playwright/testHelpers' test('should not start if chat limit is reached', async ({ page, context }) => { await test.step('Free plan', async () => { @@ -38,9 +37,7 @@ test('should not start if chat limit is reached', async ({ page, context }) => { }) await injectFakeResults({ typebotId, count: 3000 }) await page.goto(`/${typebotId}-public`) - await expect( - typebotViewer(page).locator('text="Hey there, upload please"') - ).toBeVisible() + await expect(page.locator('text="Hey there, upload please"')).toBeVisible() }) await test.step('Custom plan', async () => { @@ -63,9 +60,7 @@ test('should not start if chat limit is reached', async ({ page, context }) => { }) const page = await context.newPage() await page.goto(`/${typebotId}-public`) - await expect( - typebotViewer(page).locator('text="Hey there, upload please"') - ).toBeVisible() + await expect(page.locator('text="Hey there, upload please"')).toBeVisible() await injectFakeResults({ typebotId, count: 2000 }) await page.goto(`/${typebotId}-public`) await expect(page.locator('text="This bot is now closed."')).toBeVisible() diff --git a/apps/viewer/src/features/usage/usageV2.spec.ts b/apps/viewer/src/features/usage/usageV2.spec.ts deleted file mode 100644 index c8e39af231..0000000000 --- a/apps/viewer/src/features/usage/usageV2.spec.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { getTestAsset } from '@/test/utils/playwright' -import test, { expect } from '@playwright/test' -import { createId } from '@paralleldrive/cuid2' -import { Plan } from 'db' -import { defaultSettings } from 'models' -import { - createWorkspaces, - importTypebotInDatabase, - injectFakeResults, -} from 'utils/playwright/databaseActions' - -test('should not start if chat limit is reached', async ({ page, context }) => { - await test.step('Free plan', async () => { - const workspaceId = createId() - const typebotId = createId() - await createWorkspaces([{ id: workspaceId, plan: Plan.FREE }]) - await importTypebotInDatabase(getTestAsset('typebots/fileUpload.json'), { - id: typebotId, - publicId: `${typebotId}-public`, - workspaceId, - }) - await injectFakeResults({ typebotId, count: 400 }) - await page.goto(`/next/${typebotId}-public`) - await expect(page.locator('text="This bot is now closed."')).toBeVisible() - await page.goto(`${process.env.NEXTAUTH_URL}/typebots/${typebotId}/results`) - await expect(page.locator('text="133%"')).toBeVisible() - }) - - await test.step('Lifetime plan', async () => { - const workspaceId = createId() - const typebotId = createId() - await createWorkspaces([{ id: workspaceId, plan: Plan.LIFETIME }]) - await importTypebotInDatabase(getTestAsset('typebots/fileUpload.json'), { - id: typebotId, - publicId: `${typebotId}-public`, - workspaceId, - }) - await injectFakeResults({ typebotId, count: 3000 }) - await page.goto(`/next/${typebotId}-public`) - await expect(page.locator('text="Hey there, upload please"')).toBeVisible() - }) - - await test.step('Custom plan', async () => { - const workspaceId = createId() - const typebotId = createId() - await createWorkspaces([ - { id: workspaceId, plan: Plan.CUSTOM, customChatsLimit: 1000 }, - ]) - await importTypebotInDatabase(getTestAsset('typebots/fileUpload.json'), { - id: typebotId, - publicId: `${typebotId}-public`, - workspaceId, - settings: { - ...defaultSettings, - general: { - ...defaultSettings.general, - isNewResultOnRefreshEnabled: true, - }, - }, - }) - const page = await context.newPage() - await page.goto(`/next/${typebotId}-public`) - await expect(page.locator('text="Hey there, upload please"')).toBeVisible() - await injectFakeResults({ typebotId, count: 2000 }) - await page.goto(`/next/${typebotId}-public`) - await expect(page.locator('text="This bot is now closed."')).toBeVisible() - await page.goto(`${process.env.NEXTAUTH_URL}/typebots/${typebotId}/results`) - await expect(page.locator('text="200%"')).toBeVisible() - }) -}) diff --git a/apps/viewer/src/features/variables/variables.spec.ts b/apps/viewer/src/features/variables/variables.spec.ts index 9372df3576..d91de16285 100644 --- a/apps/viewer/src/features/variables/variables.spec.ts +++ b/apps/viewer/src/features/variables/variables.spec.ts @@ -2,7 +2,6 @@ import { getTestAsset } from '@/test/utils/playwright' import test, { expect } from '@playwright/test' import { createId } from '@paralleldrive/cuid2' import { importTypebotInDatabase } from 'utils/playwright/databaseActions' -import { typebotViewer } from 'utils/playwright/testHelpers' test('should correctly be injected', async ({ page }) => { const typebotId = createId() @@ -11,12 +10,10 @@ test('should correctly be injected', async ({ page }) => { { id: typebotId, publicId: `${typebotId}-public` } ) await page.goto(`/${typebotId}-public`) - await expect(typebotViewer(page).locator('text="Your name is"')).toBeVisible() + await expect(page.locator('text="Your name is"')).toBeVisible() await page.goto(`/${typebotId}-public?Name=Baptiste&Email=email@test.com`) - await expect( - typebotViewer(page).locator('text="Your name is Baptiste"') - ).toBeVisible() - await expect( - typebotViewer(page).locator('input[value="email@test.com"]') - ).toBeVisible() + await expect(page.locator('text="Your name is Baptiste"')).toBeVisible() + await expect(page.getByPlaceholder('Type your email...')).toHaveValue( + 'email@test.com' + ) }) diff --git a/apps/viewer/src/features/variables/variablesV2.spec.ts b/apps/viewer/src/features/variables/variablesV2.spec.ts deleted file mode 100644 index b0a4fe2359..0000000000 --- a/apps/viewer/src/features/variables/variablesV2.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { getTestAsset } from '@/test/utils/playwright' -import test, { expect } from '@playwright/test' -import { createId } from '@paralleldrive/cuid2' -import { importTypebotInDatabase } from 'utils/playwright/databaseActions' - -test('should correctly be injected', async ({ page }) => { - const typebotId = createId() - await importTypebotInDatabase( - getTestAsset('typebots/predefinedVariables.json'), - { id: typebotId, publicId: `${typebotId}-public` } - ) - await page.goto(`/next/${typebotId}-public`) - await expect(page.locator('text="Your name is"')).toBeVisible() - await page.goto( - `/next/${typebotId}-public?Name=Baptiste&Email=email@test.com` - ) - await expect(page.locator('text="Your name is Baptiste"')).toBeVisible() - await expect(page.getByPlaceholder('Type your email...')).toHaveValue( - 'email@test.com' - ) -}) diff --git a/apps/viewer/src/pages/[[...publicId]].tsx b/apps/viewer/src/pages/[[...publicId]].tsx index 57b1d1f385..0390df7511 100644 --- a/apps/viewer/src/pages/[[...publicId]].tsx +++ b/apps/viewer/src/pages/[[...publicId]].tsx @@ -3,8 +3,9 @@ import { ErrorPage } from '@/components/ErrorPage' import { NotFoundPage } from '@/components/NotFoundPage' import { GetServerSideProps, GetServerSidePropsContext } from 'next' import { env, getViewerUrl, isDefined, isNotDefined, omit } from 'utils' -import { TypebotPage, TypebotPageProps } from '../components/TypebotPage' import prisma from '../lib/prisma' +import { TypebotPageProps, TypebotPageV2 } from '@/components/TypebotPageV2' +import { TypebotPageV3 } from '@/components/TypebotPageV3' export const getServerSideProps: GetServerSideProps = async ( context: GetServerSidePropsContext @@ -76,7 +77,14 @@ const getTypebotFromCustomDomain = async ( const publishedTypebot = await prisma.publicTypebot.findFirst({ where: { typebot: { customDomain } }, include: { - typebot: { select: { name: true, isClosed: true, isArchived: true } }, + typebot: { + select: { + name: true, + isClosed: true, + isArchived: true, + publicId: true, + }, + }, }, }) if (isNotDefined(publishedTypebot)) return null @@ -99,7 +107,19 @@ const App = ({ publishedTypebot, ...props }: TypebotPageProps) => { return if (publishedTypebot.typebot.isClosed) return - return + return publishedTypebot.version === '3' ? ( + + ) : ( + + ) } export default App diff --git a/apps/viewer/src/pages/next/[[...publicId]].tsx b/apps/viewer/src/pages/next/[[...publicId]].tsx deleted file mode 100644 index 2aa0c53d5d..0000000000 --- a/apps/viewer/src/pages/next/[[...publicId]].tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { IncomingMessage } from 'http' -import { GetServerSideProps, GetServerSidePropsContext } from 'next' -import { env, getViewerUrl, isNotDefined } from 'utils' -import prisma from '@/lib/prisma' -import { TypebotPage, TypebotPageProps } from '@/components/TypebotPageV2' - -export const getServerSideProps: GetServerSideProps = async ( - context: GetServerSidePropsContext -) => { - const { host, forwardedHost } = getHost(context.req) - const pathname = context.resolvedUrl.split('?')[0] - try { - if (!host) return { props: {} } - const viewerUrls = (getViewerUrl({ returnAll: true }) ?? '').split(',') - const isMatchingViewerUrl = - env('E2E_TEST') === 'true' - ? true - : viewerUrls.some( - (url) => - host.split(':')[0].includes(url.split('//')[1].split(':')[0]) || - (forwardedHost && - forwardedHost - .split(':')[0] - .includes(url.split('//')[1].split(':')[0])) - ) - const typebot = isMatchingViewerUrl - ? await getTypebotFromPublicId(context.query.publicId?.toString()) - : null - return { - props: { - typebot, - url: `https://${forwardedHost ?? host}${pathname}`, - }, - } - } catch (err) { - console.error(err) - } - return { - props: {}, - url: `https://${forwardedHost ?? host}${pathname}`, - } -} - -const getTypebotFromPublicId = async ( - publicId?: string -): Promise => { - const typebot = (await prisma.typebot.findUnique({ - where: { publicId: publicId ?? '' }, - select: { - theme: true, - name: true, - settings: true, - publicId: true, - }, - })) as TypebotPageProps['typebot'] | null - if (isNotDefined(typebot)) return null - return typebot -} - -const getHost = ( - req?: IncomingMessage -): { host?: string; forwardedHost?: string } => ({ - host: req?.headers ? req.headers.host : window.location.host, - forwardedHost: req?.headers['x-forwarded-host'] as string | undefined, -}) - -const App = ({ typebot, url }: TypebotPageProps) => ( - -) - -export default App diff --git a/packages/db/mysql/schema.prisma b/packages/db/mysql/schema.prisma index 45d94f355a..da1fbaccff 100644 --- a/packages/db/mysql/schema.prisma +++ b/packages/db/mysql/schema.prisma @@ -170,6 +170,7 @@ model DashboardFolder { model Typebot { id String @id @default(cuid()) + version String? @db.VarChar(10) createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt icon String? @db.VarChar(1000) @@ -226,6 +227,7 @@ model CollaboratorsOnTypebots { model PublicTypebot { id String @id @default(cuid()) + version String? @db.VarChar(10) createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt typebotId String @unique diff --git a/packages/db/package.json b/packages/db/package.json index 43e1cf95dc..aee6021707 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -9,7 +9,7 @@ "db:generate": "tsx scripts/db-generate.ts", "db:push": "tsx scripts/db-push.ts", "migrate:deploy": "tsx scripts/migrate-deploy.ts", - "migrate:dev": "tsx scripts/migrate-dev.ts", + "migrate:dev": "prisma migrate dev --create-only --schema postgresql/schema.prisma", "db:migrate": "pnpm migrate:deploy" }, "dependencies": { diff --git a/packages/db/postgresql/migrations/20230220085522_add_version_fields/migration.sql b/packages/db/postgresql/migrations/20230220085522_add_version_fields/migration.sql new file mode 100644 index 0000000000..7e8d5515cb --- /dev/null +++ b/packages/db/postgresql/migrations/20230220085522_add_version_fields/migration.sql @@ -0,0 +1,11 @@ +-- AlterTable +ALTER TABLE + "PublicTypebot" +ADD + COLUMN "version" TEXT; + +-- AlterTable +ALTER TABLE + "Typebot" +ADD + COLUMN "version" TEXT; \ No newline at end of file diff --git a/packages/db/postgresql/schema.prisma b/packages/db/postgresql/schema.prisma index 9dd5a1c79b..54ce631349 100644 --- a/packages/db/postgresql/schema.prisma +++ b/packages/db/postgresql/schema.prisma @@ -154,6 +154,7 @@ model DashboardFolder { model Typebot { id String @id @default(cuid()) + version String? createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt icon String? @@ -207,6 +208,7 @@ model CollaboratorsOnTypebots { model PublicTypebot { id String @id @default(cuid()) + version String? createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt typebotId String @unique diff --git a/packages/models/features/publicTypebot.ts b/packages/models/features/publicTypebot.ts index 48d1fdda0e..e7da986768 100644 --- a/packages/models/features/publicTypebot.ts +++ b/packages/models/features/publicTypebot.ts @@ -13,6 +13,7 @@ import { schemaForType } from './utils' export const publicTypebotSchema = schemaForType()( z.object({ id: z.string(), + version: z.enum(['3']).nullable(), createdAt: z.date(), updatedAt: z.date(), typebotId: z.string(), diff --git a/packages/models/features/typebot/typebot.ts b/packages/models/features/typebot/typebot.ts index 0cb3a64a85..bcb2c945b2 100644 --- a/packages/models/features/typebot/typebot.ts +++ b/packages/models/features/typebot/typebot.ts @@ -41,7 +41,7 @@ const resultsTablePreferencesSchema = z.object({ export const typebotSchema = schemaForType()( z.object({ - version: z.enum(['2']).optional(), + version: z.enum(['3']).nullable(), id: z.string(), name: z.string(), groups: z.array(groupSchema), diff --git a/packages/utils/playwright/databaseActions.ts b/packages/utils/playwright/databaseActions.ts index 1c02b08bd2..297175d590 100644 --- a/packages/utils/playwright/databaseActions.ts +++ b/packages/utils/playwright/databaseActions.ts @@ -78,6 +78,7 @@ export const importTypebotInDatabase = async ( ...JSON.parse(readFileSync(path).toString()), workspaceId: proWorkspaceId, ...updates, + version: '3', } await prisma.typebot.create({ data: parseCreateTypebot(typebot), diff --git a/packages/utils/playwright/databaseHelpers.ts b/packages/utils/playwright/databaseHelpers.ts index 7f6e4c79a4..966c1b805b 100644 --- a/packages/utils/playwright/databaseHelpers.ts +++ b/packages/utils/playwright/databaseHelpers.ts @@ -16,6 +16,7 @@ export const parseTestTypebot = ( partialTypebot: Partial ): Typebot => ({ id: createId(), + version: '3', workspaceId: proWorkspaceId, folderId: null, name: 'My typebot', @@ -62,6 +63,7 @@ export const parseTypebotToPublicTypebot = ( typebot: Typebot ): Omit => ({ id, + version: typebot.version, groups: typebot.groups, typebotId: typebot.id, theme: typebot.theme, diff --git a/packages/utils/typebotConversions.ts b/packages/utils/typebotConversions.ts deleted file mode 100644 index 5fe4a445a1..0000000000 --- a/packages/utils/typebotConversions.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Typebot } from 'models' - -export const convertTypebotToV2 = (typebot: any): Typebot => { - const newTypebot = JSON.parse( - JSON.stringify(typebot) - .replace(/\"blocks\":/g, '"groups":') - .replace(/\"steps\":/g, '"blocks":') - .replace(/\"blockId\":/g, '"groupId":') - .replace(/\"blockId\":/g, '"blockId":') - ) - return { - version: '2', - ...newTypebot, - } -} diff --git a/packages/wordpress/trunk/README.txt b/packages/wordpress/trunk/README.txt index d48a9e43f9..aef81f8c77 100644 --- a/packages/wordpress/trunk/README.txt +++ b/packages/wordpress/trunk/README.txt @@ -5,7 +5,7 @@ Requires at least: 5.0 Tested up to: 6.0 License: GPL 2.0 License URI: http://www.gnu.org/licenses/gpl-2.0.txt -Stable Tag: 2.1.11 +Stable Tag: 3.0.0 Build beautiful conversational forms @@ -26,6 +26,9 @@ This plugin relies on Typebot which is a tool that allows you to create conversa 3. Activate your Typebot with the "Typebot" admin button located in the sidebar == Changelog == += 3.0.0 = +* Complete rework of the plugin. You are now required to generate a code snippet on https://app.typebot.io + = 2.1.9 = * Fix standard embed when window is already loaded diff --git a/packages/wordpress/trunk/admin/class-typebot-admin.php b/packages/wordpress/trunk/admin/class-typebot-admin.php index 4c20896723..c5edb10f8b 100644 --- a/packages/wordpress/trunk/admin/class-typebot-admin.php +++ b/packages/wordpress/trunk/admin/class-typebot-admin.php @@ -5,26 +5,6 @@ class Typebot_Admin { - private $version; - - public function __construct($version) - { - $this->version = $version; - } - - public function enqueue_styles($hook) - { - if ($hook === 'toplevel_page_typebot/settings') { - wp_enqueue_style( - 'bulma', - plugin_dir_url(__FILE__) . 'css/bulma.min.css', - [], - $this->version, - 'all' - ); - } - } - public function my_admin_menu() { add_menu_page( @@ -45,47 +25,6 @@ public function typebot_settings_callback() public function register_typebot_settings() { - register_setting('typebot', 'url', [ - 'sanitize_callback' => 'sanitize_text_field', - ]); - register_setting('typebot', 'embed_type', [ - 'sanitize_callback' => 'sanitize_text_field', - ]); - register_setting('typebot', 'popup_delay', [ - 'sanitize_callback' => 'sanitize_text_field', - ]); - register_setting('typebot', 'bubble_delay', [ - 'sanitize_callback' => 'sanitize_text_field', - ]); - register_setting('typebot', 'chat_delay', [ - 'sanitize_callback' => 'sanitize_text_field', - ]); - register_setting('typebot', 'avatar', [ - 'sanitize_callback' => 'sanitize_text_field', - ]); - register_setting('typebot', 'text_content', [ - 'sanitize_callback' => 'sanitize_text_field', - ]); - register_setting('typebot', 'button_color', [ - 'sanitize_callback' => 'sanitize_text_field', - ]); - register_setting('typebot', 'chat_included_pages', [ - 'sanitize_callback' => 'sanitize_text_field', - ]); - register_setting('typebot', 'popup_included_pages', [ - 'sanitize_callback' => 'sanitize_text_field', - ]); - register_setting('typebot', 'chat_icon', [ - 'sanitize_callback' => 'sanitize_text_field', - ]); - register_setting('typebot', 'custom_code', [ - 'sanitize_callback' => 'sanitize_text_field', - ]); - register_setting('typebot', 'config_type', [ - 'sanitize_callback' => 'sanitize_text_field', - ]); - register_setting('typebot', 'dont_show_callout_twice', [ - 'sanitize_callback' => 'sanitize_text_field', - ]); + register_setting('typebot', 'init_snippet'); } } diff --git a/packages/wordpress/trunk/admin/css/bulma.min.css b/packages/wordpress/trunk/admin/css/bulma.min.css deleted file mode 100644 index fc33352a7a..0000000000 --- a/packages/wordpress/trunk/admin/css/bulma.min.css +++ /dev/null @@ -1 +0,0 @@ -/*! bulma.io v0.9.1 | MIT License | github.com/jgthms/bulma */@-webkit-keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}@keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}.breadcrumb,.button,.file,.is-unselectable,.modal-close,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.highlight:not(:last-child),.level:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.pagination:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.modal-close{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:290486px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.modal-close::after,.modal-close::before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before{height:2px;width:50%}.modal-close::after{height:50%;width:2px}.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.modal-close:active{background-color:rgba(10,10,10,.4)}.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading::after,.control.is-loading::after,.loader,.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.5em - 1px);padding-left:calc(.75em - 1px);padding-right:calc(.75em - 1px);padding-top:calc(.5em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:0}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .button,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .input,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-previous,fieldset[disabled] .select select,fieldset[disabled] .textarea{cursor:not-allowed}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,::after,::before{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1em;font-weight:400;line-height:1.5}a{color:#3273dc;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#da1039;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#363636}.box{background-color:#fff;border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px #3273dc}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #3273dc}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.5em - 1px);margin-right:calc(-.5em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#3273dc;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:transparent;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-hovered,.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined.is-focused,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined.is-loading.is-focused::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined.is-focused,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:transparent;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-hovered,.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined.is-focused,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined.is-loading.is-focused::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined.is-focused,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:transparent;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-hovered,.button.is-light.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined.is-focused,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined.is-loading.is-focused::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-light.is-inverted.is-outlined.is-focused,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-dark{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#fff}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],fieldset[disabled] .button.is-dark{background-color:#363636;border-color:transparent;box-shadow:none}.button.is-dark.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-hovered,.button.is-dark.is-inverted:hover{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined.is-focused,.button.is-dark.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined.is-loading.is-focused::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined.is-focused,.button.is-dark.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled],fieldset[disabled] .button.is-primary{background-color:#00d1b2;border-color:transparent;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-hovered,.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],fieldset[disabled] .button.is-primary.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined.is-focused,.button.is-primary.is-outlined.is-hovered,.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined.is-loading.is-focused::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-outlined.is-loading:focus::after,.button.is-primary.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined.is-focused,.button.is-primary.is-inverted.is-outlined.is-hovered,.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light{background-color:#ebfffc;color:#00947e}.button.is-primary.is-light.is-hovered,.button.is-primary.is-light:hover{background-color:#defffa;border-color:transparent;color:#00947e}.button.is-primary.is-light.is-active,.button.is-primary.is-light:active{background-color:#d1fff8;border-color:transparent;color:#00947e}.button.is-link{background-color:#3273dc;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#276cda;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#2366d1;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#3273dc;border-color:transparent;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#3273dc}.button.is-link.is-inverted.is-hovered,.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#3273dc}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#3273dc;color:#3273dc}.button.is-link.is-outlined.is-focused,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#3273dc;border-color:#3273dc;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #3273dc #3273dc!important}.button.is-link.is-outlined.is-loading.is-focused::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#3273dc;box-shadow:none;color:#3273dc}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined.is-focused,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#3273dc}.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #3273dc #3273dc!important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eef3fc;color:#2160c4}.button.is-link.is-light.is-hovered,.button.is-link.is-light:hover{background-color:#e3ecfa;border-color:transparent;color:#2160c4}.button.is-link.is-light.is-active,.button.is-link.is-light:active{background-color:#d8e4f8;border-color:transparent;color:#2160c4}.button.is-info{background-color:#3298dc;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#2793da;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(50,152,220,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#238cd1;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#3298dc;border-color:transparent;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#3298dc}.button.is-info.is-inverted.is-hovered,.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#3298dc}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#3298dc;color:#3298dc}.button.is-info.is-outlined.is-focused,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#3298dc;border-color:#3298dc;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #3298dc #3298dc!important}.button.is-info.is-outlined.is-loading.is-focused::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#3298dc;box-shadow:none;color:#3298dc}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined.is-focused,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#3298dc}.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #3298dc #3298dc!important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#eef6fc;color:#1d72aa}.button.is-info.is-light.is-hovered,.button.is-info.is-light:hover{background-color:#e3f1fa;border-color:transparent;color:#1d72aa}.button.is-info.is-light.is-active,.button.is-info.is-light:active{background-color:#d8ebf8;border-color:transparent;color:#1d72aa}.button.is-success{background-color:#48c774;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#3ec46d;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,199,116,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#3abb67;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#48c774;border-color:transparent;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#48c774}.button.is-success.is-inverted.is-hovered,.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#48c774}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#48c774;color:#48c774}.button.is-success.is-outlined.is-focused,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#48c774;border-color:#48c774;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #48c774 #48c774!important}.button.is-success.is-outlined.is-loading.is-focused::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#48c774;box-shadow:none;color:#48c774}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined.is-focused,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#48c774}.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #48c774 #48c774!important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#effaf3;color:#257942}.button.is-success.is-light.is-hovered,.button.is-success.is-light:hover{background-color:#e6f7ec;border-color:transparent;color:#257942}.button.is-success.is-light.is-active,.button.is-success.is-light:active{background-color:#dcf4e4;border-color:transparent;color:#257942}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdb4a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,221,87,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd83d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:transparent;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffdd57}.button.is-warning.is-inverted.is-hovered,.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined.is-focused,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57!important}.button.is-warning.is-outlined.is-loading.is-focused::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined.is-focused,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #ffdd57 #ffdd57!important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-warning.is-light{background-color:#fffbeb;color:#947600}.button.is-warning.is-light.is-hovered,.button.is-warning.is-light:hover{background-color:#fff8de;border-color:transparent;color:#947600}.button.is-warning.is-light.is-active,.button.is-warning.is-light:active{background-color:#fff6d1;border-color:transparent;color:#947600}.button.is-danger{background-color:#f14668;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#f03a5f;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ef2e55;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#f14668;border-color:transparent;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-hovered,.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#f14668}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;color:#f14668}.button.is-danger.is-outlined.is-focused,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#f14668;border-color:#f14668;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-outlined.is-loading.is-focused::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;box-shadow:none;color:#f14668}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined.is-focused,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.button.is-danger.is-light.is-hovered,.button.is-danger.is-light:hover{background-color:#fde0e6;border-color:transparent;color:#cc0f35}.button.is-danger.is-light.is-active,.button.is-danger.is-light:active{background-color:#fcd4dc;border-color:transparent;color:#cc0f35}.button.is-small{border-radius:2px;font-size:.75rem}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em / 2));top:calc(50% - (1em / 2));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:290486px;padding-left:calc(1em + .25em);padding-right:calc(1em + .25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){border-radius:2px;font-size:.75rem}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none!important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width:1024px){.container{max-width:960px}}@media screen and (max-width:1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width:1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width:1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width:1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small{font-size:.75rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:290486px}.image.is-fullwidth{width:100%}.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img{height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-5by4{padding-top:80%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-5by3{padding-top:60%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-3by1{padding-top:33.3333%}.image.is-4by5{padding-top:125%}.image.is-3by4{padding-top:133.3333%}.image.is-2by3{padding-top:150%}.image.is-3by5{padding-top:166.6666%}.image.is-9by16{padding-top:177.7777%}.image.is-1by2{padding-top:200%}.image.is-1by3{padding-top:300%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{right:.5rem;position:absolute;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.notification.is-dark{background-color:#363636;color:#fff}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-primary.is-light{background-color:#ebfffc;color:#00947e}.notification.is-link{background-color:#3273dc;color:#fff}.notification.is-link.is-light{background-color:#eef3fc;color:#2160c4}.notification.is-info{background-color:#3298dc;color:#fff}.notification.is-info.is-light{background-color:#eef6fc;color:#1d72aa}.notification.is-success{background-color:#48c774;color:#fff}.notification.is-success.is-light{background-color:#effaf3;color:#257942}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.notification.is-warning.is-light{background-color:#fffbeb;color:#947600}.notification.is-danger{background-color:#f14668;color:#fff}.notification.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:290486px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right,#fff 30%,#ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right,#0a0a0a 30%,#ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right,#f5f5f5 30%,#ededed 30%)}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate{background-image:linear-gradient(to right,#363636 30%,#ededed 30%)}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-primary:indeterminate{background-image:linear-gradient(to right,#00d1b2 30%,#ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#3273dc}.progress.is-link::-moz-progress-bar{background-color:#3273dc}.progress.is-link::-ms-fill{background-color:#3273dc}.progress.is-link:indeterminate{background-image:linear-gradient(to right,#3273dc 30%,#ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#3298dc}.progress.is-info::-moz-progress-bar{background-color:#3298dc}.progress.is-info::-ms-fill{background-color:#3298dc}.progress.is-info:indeterminate{background-image:linear-gradient(to right,#3298dc 30%,#ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#48c774}.progress.is-success::-moz-progress-bar{background-color:#48c774}.progress.is-success::-ms-fill{background-color:#48c774}.progress.is-success:indeterminate{background-image:linear-gradient(to right,#48c774 30%,#ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right,#ffdd57 30%,#ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#f14668}.progress.is-danger::-moz-progress-bar{background-color:#f14668}.progress.is-danger::-ms-fill{background-color:#f14668}.progress.is-danger:indeterminate{background-image:linear-gradient(to right,#f14668 30%,#ededed 30%)}.progress:indeterminate{-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moveIndeterminate;animation-name:moveIndeterminate;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right,#4a4a4a 30%,#ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@-webkit-keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#3273dc;border-color:#3273dc;color:#fff}.table td.is-info,.table th.is-info{background-color:#3298dc;border-color:#3298dc;color:#fff}.table td.is-success,.table th.is-success{background-color:#48c774;border-color:#48c774;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#f14668;border-color:#f14668;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#363636}.table th:not([align]){text-align:inherit}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:transparent}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot{background-color:transparent}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody{background-color:transparent}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tags.has-addons .tag{margin-right:0}.tags.has-addons .tag:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.tag:not(body).is-dark{background-color:#363636;color:#fff}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-primary.is-light{background-color:#ebfffc;color:#00947e}.tag:not(body).is-link{background-color:#3273dc;color:#fff}.tag:not(body).is-link.is-light{background-color:#eef3fc;color:#2160c4}.tag:not(body).is-info{background-color:#3298dc;color:#fff}.tag:not(body).is-info.is-light{background-color:#eef6fc;color:#1d72aa}.tag:not(body).is-success{background-color:#48c774;color:#fff}.tag:not(body).is-success.is-light{background-color:#effaf3;color:#257942}.tag:not(body).is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.tag:not(body).is-warning.is-light{background-color:#fffbeb;color:#947600}.tag:not(body).is-danger{background-color:#f14668;color:#fff}.tag:not(body).is-danger.is-light{background-color:#feecf0;color:#cc0f35}.tag:not(body).is-normal{font-size:.75rem}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag:not(body).is-delete{margin-left:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete::after,.tag:not(body).is-delete::before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag:not(body).is-delete::before{height:1px;width:50%}.tag:not(body).is-delete::after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:290486px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title+.highlight{margin-top:-.75rem}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.highlight{font-weight:400;max-width:100%;overflow:hidden;padding:0}.highlight pre{overflow:auto;max-width:100%}.number{align-items:center;background-color:#f5f5f5;border-radius:290486px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.input,.select select,.textarea{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.input::-moz-placeholder,.select select::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.select select:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input:hover,.is-hovered.input,.is-hovered.textarea,.select select.is-hovered,.select select:hover,.textarea:hover{border-color:#b5b5b5}.input:active,.input:focus,.is-active.input,.is-active.textarea,.is-focused.input,.is-focused.textarea,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{border-color:#3273dc;box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.input[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .input,fieldset[disabled] .select select,fieldset[disabled] .textarea{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input,.textarea{box-shadow:inset 0 .0625em .125em rgba(10,10,10,.05);max-width:100%;width:100%}.input[readonly],.textarea[readonly]{box-shadow:none}.is-white.input,.is-white.textarea{border-color:#fff}.is-white.input:active,.is-white.input:focus,.is-white.is-active.input,.is-white.is-active.textarea,.is-white.is-focused.input,.is-white.is-focused.textarea,.is-white.textarea:active,.is-white.textarea:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.is-black.input,.is-black.textarea{border-color:#0a0a0a}.is-black.input:active,.is-black.input:focus,.is-black.is-active.input,.is-black.is-active.textarea,.is-black.is-focused.input,.is-black.is-focused.textarea,.is-black.textarea:active,.is-black.textarea:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.is-light.input,.is-light.textarea{border-color:#f5f5f5}.is-light.input:active,.is-light.input:focus,.is-light.is-active.input,.is-light.is-active.textarea,.is-light.is-focused.input,.is-light.is-focused.textarea,.is-light.textarea:active,.is-light.textarea:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.is-dark.input,.is-dark.textarea{border-color:#363636}.is-dark.input:active,.is-dark.input:focus,.is-dark.is-active.input,.is-dark.is-active.textarea,.is-dark.is-focused.input,.is-dark.is-focused.textarea,.is-dark.textarea:active,.is-dark.textarea:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.is-primary.input,.is-primary.textarea{border-color:#00d1b2}.is-primary.input:active,.is-primary.input:focus,.is-primary.is-active.input,.is-primary.is-active.textarea,.is-primary.is-focused.input,.is-primary.is-focused.textarea,.is-primary.textarea:active,.is-primary.textarea:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.is-link.input,.is-link.textarea{border-color:#3273dc}.is-link.input:active,.is-link.input:focus,.is-link.is-active.input,.is-link.is-active.textarea,.is-link.is-focused.input,.is-link.is-focused.textarea,.is-link.textarea:active,.is-link.textarea:focus{box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.is-info.input,.is-info.textarea{border-color:#3298dc}.is-info.input:active,.is-info.input:focus,.is-info.is-active.input,.is-info.is-active.textarea,.is-info.is-focused.input,.is-info.is-focused.textarea,.is-info.textarea:active,.is-info.textarea:focus{box-shadow:0 0 0 .125em rgba(50,152,220,.25)}.is-success.input,.is-success.textarea{border-color:#48c774}.is-success.input:active,.is-success.input:focus,.is-success.is-active.input,.is-success.is-active.textarea,.is-success.is-focused.input,.is-success.is-focused.textarea,.is-success.textarea:active,.is-success.textarea:focus{box-shadow:0 0 0 .125em rgba(72,199,116,.25)}.is-warning.input,.is-warning.textarea{border-color:#ffdd57}.is-warning.input:active,.is-warning.input:focus,.is-warning.is-active.input,.is-warning.is-active.textarea,.is-warning.is-focused.input,.is-warning.is-focused.textarea,.is-warning.textarea:active,.is-warning.textarea:focus{box-shadow:0 0 0 .125em rgba(255,221,87,.25)}.is-danger.input,.is-danger.textarea{border-color:#f14668}.is-danger.input:active,.is-danger.input:focus,.is-danger.is-active.input,.is-danger.is-active.textarea,.is-danger.is-focused.input,.is-danger.is-focused.textarea,.is-danger.textarea:active,.is-danger.textarea:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.is-small.input,.is-small.textarea{border-radius:2px;font-size:.75rem}.is-medium.input,.is-medium.textarea{font-size:1.25rem}.is-large.input,.is-large.textarea{font-size:1.5rem}.is-fullwidth.input,.is-fullwidth.textarea{display:block;width:100%}.is-inline.input,.is-inline.textarea{display:inline;width:auto}.input.is-rounded{border-radius:290486px;padding-left:calc(calc(.75em - 1px) + .375em);padding-right:calc(calc(.75em - 1px) + .375em)}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox input[disabled],.checkbox[disabled],.radio input[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .radio{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#3273dc;right:1.125em;z-index:4}.select.is-rounded select{border-radius:290486px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select.is-hovered,.select.is-white select:hover{border-color:#f2f2f2}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-hovered,.select.is-black select:hover{border-color:#000}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-hovered,.select.is-light select:hover{border-color:#e8e8e8}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark:not(:hover)::after{border-color:#363636}.select.is-dark select{border-color:#363636}.select.is-dark select.is-hovered,.select.is-dark select:hover{border-color:#292929}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary:not(:hover)::after{border-color:#00d1b2}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-hovered,.select.is-primary select:hover{border-color:#00b89c}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link:not(:hover)::after{border-color:#3273dc}.select.is-link select{border-color:#3273dc}.select.is-link select.is-hovered,.select.is-link select:hover{border-color:#2366d1}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.select.is-info:not(:hover)::after{border-color:#3298dc}.select.is-info select{border-color:#3298dc}.select.is-info select.is-hovered,.select.is-info select:hover{border-color:#238cd1}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{box-shadow:0 0 0 .125em rgba(50,152,220,.25)}.select.is-success:not(:hover)::after{border-color:#48c774}.select.is-success select{border-color:#48c774}.select.is-success select.is-hovered,.select.is-success select:hover{border-color:#3abb67}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{box-shadow:0 0 0 .125em rgba(72,199,116,.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select.is-hovered,.select.is-warning select:hover{border-color:#ffd83d}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{box-shadow:0 0 0 .125em rgba(255,221,87,.25)}.select.is-danger:not(:hover)::after{border-color:#f14668}.select.is-danger select{border-color:#f14668}.select.is-danger select.is-hovered,.select.is-danger select:hover{border-color:#ef2e55}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:.625em;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(245,245,245,.25);color:rgba(0,0,0,.7)}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(54,54,54,.25);color:#fff}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#3273dc;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#276cda;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(50,115,220,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#2366d1;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#3298dc;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#2793da;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(50,152,220,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#238cd1;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#48c774;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#3ec46d;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,199,116,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#3abb67;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdb4a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,221,87,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd83d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#f14668;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#f03a5f;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(241,70,104,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ef2e55;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:0;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#3273dc}.help.is-info{color:#3298dc}.help.is-success{color:#48c774}.help.is-warning{color:#ffdd57}.help.is-danger{color:#f14668}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]).is-hovered,.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .input:not([disabled]).is-hovered,.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]).is-hovered,.field.has-addons .control .select select:not([disabled]):hover{z-index:2}.field.has-addons .control .button:not([disabled]).is-active,.field.has-addons .control .button:not([disabled]).is-focused,.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .input:not([disabled]).is-active,.field.has-addons .control .input:not([disabled]).is-focused,.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control .select select:not([disabled]).is-active,.field.has-addons .control .select select:not([disabled]).is-focused,.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select:not([disabled]):focus{z-index:3}.field.has-addons .control .button:not([disabled]).is-active:hover,.field.has-addons .control .button:not([disabled]).is-focused:hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .input:not([disabled]).is-active:hover,.field.has-addons .control .input:not([disabled]).is-focused:hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control .select select:not([disabled]).is-active:hover,.field.has-addons .control .select select:not([disabled]).is-focused:hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select:not([disabled]):focus:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#4a4a4a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute!important;right:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#3273dc;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;max-width:100%;overflow:hidden;position:relative}.card-header{background-color:transparent;align-items:stretch;box-shadow:0 .125em .25em rgba(10,10,10,.1);display:flex}.card-header-title{align-items:center;color:#363636;display:flex;flex-grow:1;font-weight:700;padding:.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem 1rem}.card-image{display:block;position:relative}.card-content{background-color:transparent;padding:1.5rem}.card-footer{background-color:transparent;border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#3273dc;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width:768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#3273dc;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body{border-color:#363636}.message.is-primary{background-color:#ebfffc}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#00947e}.message.is-link{background-color:#eef3fc}.message.is-link .message-header{background-color:#3273dc;color:#fff}.message.is-link .message-body{border-color:#3273dc;color:#2160c4}.message.is-info{background-color:#eef6fc}.message.is-info .message-header{background-color:#3298dc;color:#fff}.message.is-info .message-body{border-color:#3298dc;color:#1d72aa}.message.is-success{background-color:#effaf3}.message.is-success .message-header{background-color:#48c774;color:#fff}.message.is-success .message-body{border-color:#48c774;color:#257942}.message.is-warning{background-color:#fffbeb}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#947600}.message.is-danger{background-color:#feecf0}.message.is-danger .message-header{background-color:#f14668;color:#fff}.message.is-danger .message-body{border-color:#f14668;color:#cc0f35}.message-header{align-items:center;background-color:#4a4a4a;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px){.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:0 0;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-foot,.modal-card-head{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#363636;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width:1024px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,.7)}}.navbar.is-dark{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#fff}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#fff}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#3273dc;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#2366d1;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#2366d1;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#2366d1;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#3273dc;color:#fff}}.navbar.is-info{background-color:#3298dc;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#238cd1;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#238cd1;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#238cd1;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#3298dc;color:#fff}}.navbar.is-success{background-color:#48c774;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#3abb67;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#3abb67;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#3abb67;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#48c774;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#f14668;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#f14668;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}body.has-navbar-fixed-top,html.has-navbar-fixed-top{padding-top:3.25rem}body.has-navbar-fixed-bottom,html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}.navbar-link,a.navbar-item{cursor:pointer}.navbar-link.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,a.navbar-item.is-active,a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover{background-color:#fafafa;color:#3273dc}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#3273dc}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#3273dc;border-bottom-style:solid;border-bottom-width:3px;color:#3273dc;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#3273dc;margin-top:-.375em;right:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:.5rem 0}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}body.has-navbar-fixed-top-touch,html.has-navbar-fixed-top-touch{padding-top:3.25rem}body.has-navbar-fixed-bottom-touch,html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-end,.navbar.is-spaced .navbar-start{align-items:center}.navbar.is-spaced .navbar-link,.navbar.is-spaced a.navbar-item{border-radius:4px}.navbar.is-transparent .navbar-link.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#3273dc}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#3273dc}.navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-dropdown{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-left:-.75rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}body.has-navbar-fixed-top-desktop,html.has-navbar-fixed-top-desktop{padding-top:3.25rem}body.has-navbar-fixed-bottom-desktop,html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}body.has-spaced-navbar-fixed-top,html.has-spaced-navbar-fixed-top{padding-top:5.25rem}body.has-spaced-navbar-fixed-bottom,html.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}.navbar-link.is-active,a.navbar-item.is-active{color:#0a0a0a}.navbar-link.is-active:not(:focus):not(:hover),a.navbar-item.is-active:not(:focus):not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:290486px}.pagination.is-rounded .pagination-link{border-radius:290486px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.5em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#3273dc}.pagination-link:active,.pagination-next:active,.pagination-previous:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#3273dc;border-color:#3273dc;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-next,.pagination-previous{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading{background-color:#00d1b2;color:#fff}.panel.is-primary .panel-tabs a.is-active{border-bottom-color:#00d1b2}.panel.is-primary .panel-block.is-active .panel-icon{color:#00d1b2}.panel.is-link .panel-heading{background-color:#3273dc;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#3273dc}.panel.is-link .panel-block.is-active .panel-icon{color:#3273dc}.panel.is-info .panel-heading{background-color:#3298dc;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#3298dc}.panel.is-info .panel-block.is-active .panel-icon{color:#3298dc}.panel.is-success .panel-heading{background-color:#48c774;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#48c774}.panel.is-success .panel-block.is-active .panel-icon{color:#48c774}.panel.is-warning .panel-heading{background-color:#ffdd57;color:rgba(0,0,0,.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffdd57}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffdd57}.panel.is-danger .panel-heading{background-color:#f14668;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#f14668}.panel.is-danger .panel-block.is-active .panel-icon{color:#f14668}.panel-block:not(:last-child),.panel-tabs:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#363636;font-size:1.25em;font-weight:700;line-height:1.25;padding:.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#3273dc}.panel-block{align-items:center;color:#363636;display:flex;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#3273dc;color:#363636}.panel-block.is-active .panel-icon{color:#3273dc}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:flex;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#3273dc;color:#3273dc}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#3273dc;border-color:#3273dc;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:290486px;border-top-left-radius:290486px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:290486px;border-top-right-radius:290486px;padding-right:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-left:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-left:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-left:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-left:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-left:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-left:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-left:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-left:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width:1023px){.column.is-narrow-touch{flex:none}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-left:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-left:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-left:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-left:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-left:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-left:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-left:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-left:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width:1024px){.column.is-narrow-desktop{flex:none}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-left:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-left:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-left:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-left:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-left:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-left:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-left:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-left:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{flex:none}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-left:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-left:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-left:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-left:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-left:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-left:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-left:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-left:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{flex:none}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-left:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-left:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-left:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-left:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-left:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-left:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-left:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-left:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1024px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable .column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}@media screen and (max-width:768px){.columns.is-variable.is-0-mobile{--columnGap:0rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-0-tablet{--columnGap:0rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-0-tablet-only{--columnGap:0rem}}@media screen and (max-width:1023px){.columns.is-variable.is-0-touch{--columnGap:0rem}}@media screen and (min-width:1024px){.columns.is-variable.is-0-desktop{--columnGap:0rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-0-desktop-only{--columnGap:0rem}}@media screen and (min-width:1216px){.columns.is-variable.is-0-widescreen{--columnGap:0rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-0-widescreen-only{--columnGap:0rem}}@media screen and (min-width:1408px){.columns.is-variable.is-0-fullhd{--columnGap:0rem}}.columns.is-variable.is-1{--columnGap:0.25rem}@media screen and (max-width:768px){.columns.is-variable.is-1-mobile{--columnGap:0.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-1-tablet{--columnGap:0.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-1-tablet-only{--columnGap:0.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-1-touch{--columnGap:0.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-1-desktop{--columnGap:0.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-1-desktop-only{--columnGap:0.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-1-widescreen{--columnGap:0.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-1-widescreen-only{--columnGap:0.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-1-fullhd{--columnGap:0.25rem}}.columns.is-variable.is-2{--columnGap:0.5rem}@media screen and (max-width:768px){.columns.is-variable.is-2-mobile{--columnGap:0.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-2-tablet{--columnGap:0.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-2-tablet-only{--columnGap:0.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-2-touch{--columnGap:0.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-2-desktop{--columnGap:0.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-2-desktop-only{--columnGap:0.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-2-widescreen{--columnGap:0.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-2-widescreen-only{--columnGap:0.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-2-fullhd{--columnGap:0.5rem}}.columns.is-variable.is-3{--columnGap:0.75rem}@media screen and (max-width:768px){.columns.is-variable.is-3-mobile{--columnGap:0.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-3-tablet{--columnGap:0.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-3-tablet-only{--columnGap:0.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-3-touch{--columnGap:0.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-3-desktop{--columnGap:0.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-3-desktop-only{--columnGap:0.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-3-widescreen{--columnGap:0.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-3-widescreen-only{--columnGap:0.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-3-fullhd{--columnGap:0.75rem}}.columns.is-variable.is-4{--columnGap:1rem}@media screen and (max-width:768px){.columns.is-variable.is-4-mobile{--columnGap:1rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-4-tablet{--columnGap:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-4-tablet-only{--columnGap:1rem}}@media screen and (max-width:1023px){.columns.is-variable.is-4-touch{--columnGap:1rem}}@media screen and (min-width:1024px){.columns.is-variable.is-4-desktop{--columnGap:1rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-4-desktop-only{--columnGap:1rem}}@media screen and (min-width:1216px){.columns.is-variable.is-4-widescreen{--columnGap:1rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-4-widescreen-only{--columnGap:1rem}}@media screen and (min-width:1408px){.columns.is-variable.is-4-fullhd{--columnGap:1rem}}.columns.is-variable.is-5{--columnGap:1.25rem}@media screen and (max-width:768px){.columns.is-variable.is-5-mobile{--columnGap:1.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-5-tablet{--columnGap:1.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-5-tablet-only{--columnGap:1.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-5-touch{--columnGap:1.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-5-desktop{--columnGap:1.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-5-desktop-only{--columnGap:1.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-5-widescreen{--columnGap:1.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-5-widescreen-only{--columnGap:1.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-5-fullhd{--columnGap:1.25rem}}.columns.is-variable.is-6{--columnGap:1.5rem}@media screen and (max-width:768px){.columns.is-variable.is-6-mobile{--columnGap:1.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-6-tablet{--columnGap:1.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-6-tablet-only{--columnGap:1.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-6-touch{--columnGap:1.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-6-desktop{--columnGap:1.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-6-desktop-only{--columnGap:1.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-6-widescreen{--columnGap:1.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-6-widescreen-only{--columnGap:1.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-6-fullhd{--columnGap:1.5rem}}.columns.is-variable.is-7{--columnGap:1.75rem}@media screen and (max-width:768px){.columns.is-variable.is-7-mobile{--columnGap:1.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-7-tablet{--columnGap:1.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-7-tablet-only{--columnGap:1.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-7-touch{--columnGap:1.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-7-desktop{--columnGap:1.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-7-desktop-only{--columnGap:1.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-7-widescreen{--columnGap:1.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-7-widescreen-only{--columnGap:1.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-7-fullhd{--columnGap:1.75rem}}.columns.is-variable.is-8{--columnGap:2rem}@media screen and (max-width:768px){.columns.is-variable.is-8-mobile{--columnGap:2rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-8-tablet{--columnGap:2rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-8-tablet-only{--columnGap:2rem}}@media screen and (max-width:1023px){.columns.is-variable.is-8-touch{--columnGap:2rem}}@media screen and (min-width:1024px){.columns.is-variable.is-8-desktop{--columnGap:2rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-8-desktop-only{--columnGap:2rem}}@media screen and (min-width:1216px){.columns.is-variable.is-8-widescreen{--columnGap:2rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-8-widescreen-only{--columnGap:2rem}}@media screen and (min-width:1408px){.columns.is-variable.is-8-fullhd{--columnGap:2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-background-white{background-color:#fff!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-background-black{background-color:#0a0a0a!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-background-light{background-color:#f5f5f5!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-background-dark{background-color:#363636!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-background-primary{background-color:#00d1b2!important}.has-text-primary-light{color:#ebfffc!important}a.has-text-primary-light:focus,a.has-text-primary-light:hover{color:#b8fff4!important}.has-background-primary-light{background-color:#ebfffc!important}.has-text-primary-dark{color:#00947e!important}a.has-text-primary-dark:focus,a.has-text-primary-dark:hover{color:#00c7a9!important}.has-background-primary-dark{background-color:#00947e!important}.has-text-link{color:#3273dc!important}a.has-text-link:focus,a.has-text-link:hover{color:#205bbc!important}.has-background-link{background-color:#3273dc!important}.has-text-link-light{color:#eef3fc!important}a.has-text-link-light:focus,a.has-text-link-light:hover{color:#c2d5f5!important}.has-background-link-light{background-color:#eef3fc!important}.has-text-link-dark{color:#2160c4!important}a.has-text-link-dark:focus,a.has-text-link-dark:hover{color:#3b79de!important}.has-background-link-dark{background-color:#2160c4!important}.has-text-info{color:#3298dc!important}a.has-text-info:focus,a.has-text-info:hover{color:#207dbc!important}.has-background-info{background-color:#3298dc!important}.has-text-info-light{color:#eef6fc!important}a.has-text-info-light:focus,a.has-text-info-light:hover{color:#c2e0f5!important}.has-background-info-light{background-color:#eef6fc!important}.has-text-info-dark{color:#1d72aa!important}a.has-text-info-dark:focus,a.has-text-info-dark:hover{color:#248fd6!important}.has-background-info-dark{background-color:#1d72aa!important}.has-text-success{color:#48c774!important}a.has-text-success:focus,a.has-text-success:hover{color:#34a85c!important}.has-background-success{background-color:#48c774!important}.has-text-success-light{color:#effaf3!important}a.has-text-success-light:focus,a.has-text-success-light:hover{color:#c8eed6!important}.has-background-success-light{background-color:#effaf3!important}.has-text-success-dark{color:#257942!important}a.has-text-success-dark:focus,a.has-text-success-dark:hover{color:#31a058!important}.has-background-success-dark{background-color:#257942!important}.has-text-warning{color:#ffdd57!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd324!important}.has-background-warning{background-color:#ffdd57!important}.has-text-warning-light{color:#fffbeb!important}a.has-text-warning-light:focus,a.has-text-warning-light:hover{color:#fff1b8!important}.has-background-warning-light{background-color:#fffbeb!important}.has-text-warning-dark{color:#947600!important}a.has-text-warning-dark:focus,a.has-text-warning-dark:hover{color:#c79f00!important}.has-background-warning-dark{background-color:#947600!important}.has-text-danger{color:#f14668!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ee1742!important}.has-background-danger{background-color:#f14668!important}.has-text-danger-light{color:#feecf0!important}a.has-text-danger-light:focus,a.has-text-danger-light:hover{color:#fabdc9!important}.has-background-danger-light{background-color:#feecf0!important}.has-text-danger-dark{color:#cc0f35!important}a.has-text-danger-dark:focus,a.has-text-danger-dark:hover{color:#ee2049!important}.has-background-danger-dark{background-color:#cc0f35!important}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.is-flex-direction-row{flex-direction:row!important}.is-flex-direction-row-reverse{flex-direction:row-reverse!important}.is-flex-direction-column{flex-direction:column!important}.is-flex-direction-column-reverse{flex-direction:column-reverse!important}.is-flex-wrap-nowrap{flex-wrap:nowrap!important}.is-flex-wrap-wrap{flex-wrap:wrap!important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse!important}.is-justify-content-flex-start{justify-content:flex-start!important}.is-justify-content-flex-end{justify-content:flex-end!important}.is-justify-content-center{justify-content:center!important}.is-justify-content-space-between{justify-content:space-between!important}.is-justify-content-space-around{justify-content:space-around!important}.is-justify-content-space-evenly{justify-content:space-evenly!important}.is-justify-content-start{justify-content:start!important}.is-justify-content-end{justify-content:end!important}.is-justify-content-left{justify-content:left!important}.is-justify-content-right{justify-content:right!important}.is-align-content-flex-start{align-content:flex-start!important}.is-align-content-flex-end{align-content:flex-end!important}.is-align-content-center{align-content:center!important}.is-align-content-space-between{align-content:space-between!important}.is-align-content-space-around{align-content:space-around!important}.is-align-content-space-evenly{align-content:space-evenly!important}.is-align-content-stretch{align-content:stretch!important}.is-align-content-start{align-content:start!important}.is-align-content-end{align-content:end!important}.is-align-content-baseline{align-content:baseline!important}.is-align-items-stretch{align-items:stretch!important}.is-align-items-flex-start{align-items:flex-start!important}.is-align-items-flex-end{align-items:flex-end!important}.is-align-items-center{align-items:center!important}.is-align-items-baseline{align-items:baseline!important}.is-align-items-start{align-items:start!important}.is-align-items-end{align-items:end!important}.is-align-items-self-start{align-items:self-start!important}.is-align-items-self-end{align-items:self-end!important}.is-align-self-auto{align-self:auto!important}.is-align-self-flex-start{align-self:flex-start!important}.is-align-self-flex-end{align-self:flex-end!important}.is-align-self-center{align-self:center!important}.is-align-self-baseline{align-self:baseline!important}.is-align-self-stretch{align-self:stretch!important}.is-flex-grow-0{flex-grow:0!important}.is-flex-grow-1{flex-grow:1!important}.is-flex-grow-2{flex-grow:2!important}.is-flex-grow-3{flex-grow:3!important}.is-flex-grow-4{flex-grow:4!important}.is-flex-grow-5{flex-grow:5!important}.is-flex-shrink-0{flex-shrink:0!important}.is-flex-shrink-1{flex-shrink:1!important}.is-flex-shrink-2{flex-shrink:2!important}.is-flex-shrink-3{flex-shrink:3!important}.is-flex-shrink-4{flex-shrink:4!important}.is-flex-shrink-5{flex-shrink:5!important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.is-clickable{cursor:pointer!important}.is-clipped{overflow:hidden!important}.is-relative{position:relative!important}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:.75rem!important}.mt-3{margin-top:.75rem!important}.mr-3{margin-right:.75rem!important}.mb-3{margin-bottom:.75rem!important}.ml-3{margin-left:.75rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.m-4{margin:1rem!important}.mt-4{margin-top:1rem!important}.mr-4{margin-right:1rem!important}.mb-4{margin-bottom:1rem!important}.ml-4{margin-left:1rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.m-5{margin:1.5rem!important}.mt-5{margin-top:1.5rem!important}.mr-5{margin-right:1.5rem!important}.mb-5{margin-bottom:1.5rem!important}.ml-5{margin-left:1.5rem!important}.mx-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.my-5{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-6{margin:3rem!important}.mt-6{margin-top:3rem!important}.mr-6{margin-right:3rem!important}.mb-6{margin-bottom:3rem!important}.ml-6{margin-left:3rem!important}.mx-6{margin-left:3rem!important;margin-right:3rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:.75rem!important}.pt-3{padding-top:.75rem!important}.pr-3{padding-right:.75rem!important}.pb-3{padding-bottom:.75rem!important}.pl-3{padding-left:.75rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.p-4{padding:1rem!important}.pt-4{padding-top:1rem!important}.pr-4{padding-right:1rem!important}.pb-4{padding-bottom:1rem!important}.pl-4{padding-left:1rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.p-5{padding:1.5rem!important}.pt-5{padding-top:1.5rem!important}.pr-5{padding-right:1.5rem!important}.pb-5{padding-bottom:1.5rem!important}.pl-5{padding-left:1.5rem!important}.px-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-5{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-6{padding:3rem!important}.pt-6{padding-top:3rem!important}.pr-6{padding-right:3rem!important}.pb-6{padding-bottom:3rem!important}.pl-6{padding-left:3rem!important}.px-6{padding-left:3rem!important;padding-right:3rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1023px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1024px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1023px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1024px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1023px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1024px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1023px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1024px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1023px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1024px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-medium{font-weight:500!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-family-primary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-secondary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-sans-serif{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-monospace{font-family:monospace!important}.is-family-code{font-family:monospace!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1023px){.is-block-touch{display:block!important}}@media screen and (min-width:1024px){.is-block-desktop{display:block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1023px){.is-flex-touch{display:flex!important}}@media screen and (min-width:1024px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1216px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1408px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1023px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1024px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1023px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1024px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1023px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1024px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1216px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1408px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}.is-sr-only{border:none!important;clip:rect(0,0,0,0)!important;height:.01em!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:.01em!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1023px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1024px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1023px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1024px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-invisible-fullhd{visibility:hidden!important}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1023px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,.7)}.hero.is-light .subtitle{color:rgba(0,0,0,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.hero.is-light .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#fff}.hero.is-dark .subtitle{color:rgba(255,255,255,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(255,255,255,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#fff}.hero.is-dark .tabs a{color:#fff;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#3273dc;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-link .navbar-menu{background-color:#3273dc}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#2366d1;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3273dc}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#1577c6 0,#3273dc 71%,#4366e5 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1577c6 0,#3273dc 71%,#4366e5 100%)}}.hero.is-info{background-color:#3298dc;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-info .navbar-menu{background-color:#3298dc}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#238cd1;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3298dc}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#159dc6 0,#3298dc 71%,#4389e5 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#159dc6 0,#3298dc 71%,#4389e5 100%)}}.hero.is-success{background-color:#48c774;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-success .navbar-menu{background-color:#48c774}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#3abb67;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#48c774}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#29b342 0,#48c774 71%,#56d296 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#29b342 0,#48c774 71%,#56d296 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffaf24 0,#ffdd57 71%,#fffa70 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffaf24 0,#ffdd57 71%,#fffa70 100%)}}.hero.is-danger{background-color:#f14668;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-danger .navbar-menu{background-color:#f14668}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ef2e55;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#f14668}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}}.hero.is-small .hero-body{padding:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding:9rem 1.5rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding:18rem 1.5rem}}.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}.section{padding:3rem 1.5rem}@media screen and (min-width:1024px){.section.is-medium{padding:9rem 1.5rem}.section.is-large{padding:18rem 1.5rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem} \ No newline at end of file diff --git a/packages/wordpress/trunk/admin/partials/typebot-admin-display.php b/packages/wordpress/trunk/admin/partials/typebot-admin-display.php index 51efc345d8..dd551c5c1b 100644 --- a/packages/wordpress/trunk/admin/partials/typebot-admin-display.php +++ b/packages/wordpress/trunk/admin/partials/typebot-admin-display.php @@ -1,255 +1,25 @@ - -
-

Typebot Settings

-
First, you need to create a Typebot with our builder. It's free. -
- -
- -
-
- -
- -
-
- -
- - - -
- - - - +
+

Typebot Settings

+
    +
  1. Generate your initialization snippet in the Share tab of your typebot.
  2. +
  3. If embedding as Standard container, paste the generated shortcode anywhere on your site.
  4. +
  5. + + +
    + + +
    - - -
    -
    - -
    -
    -
  6. + + +
\ No newline at end of file diff --git a/packages/wordpress/trunk/includes/class-typebot.php b/packages/wordpress/trunk/includes/class-typebot.php index d0f1e64608..af0bbbd102 100644 --- a/packages/wordpress/trunk/includes/class-typebot.php +++ b/packages/wordpress/trunk/includes/class-typebot.php @@ -50,7 +50,7 @@ private function define_admin_hooks() private function define_public_hooks() { $plugin_public = new Typebot_Public($this->get_plugin_name(), $this->get_version()); - $this->loader->add_action('wp_head', $plugin_public, 'add_head_code'); + $this->loader->add_action('wp_enqueue_scripts', $plugin_public, 'add_head_code'); $this->loader->add_shortcode('typebot', $plugin_public, 'add_typebot_container'); } diff --git a/packages/wordpress/trunk/public/class-typebot-public.php b/packages/wordpress/trunk/public/class-typebot-public.php index 6bf4be3f4e..ce72332d96 100644 --- a/packages/wordpress/trunk/public/class-typebot-public.php +++ b/packages/wordpress/trunk/public/class-typebot-public.php @@ -4,219 +4,33 @@ class Typebot_Public { public function add_head_code() { - wp_enqueue_script( - 'typebot', - 'https://unpkg.com/typebot-js@2.2/dist/index.umd.min.js' - ); - wp_add_inline_script('typebot', $this->parse_wp_user()); - if (get_option('config_type') === 'advanced') { - echo esc_html(get_option('custom_code')); - } - if (get_option('embed_type') === 'popup') { - return $this->parse_popup_head_code(); - } - if (get_option('embed_type') === 'bubble') { - return $this->parse_bubble_head_code(); - } - } - - private function parse_popup_head_code() - { - $url = str_starts_with(get_option('url'), 'https://typebot.io') - ? 'https://viewer.typebot.io' . '/' . explode('/', get_option('url'))[3] - : get_option('url'); - if (!$url) { - return; - } - if ( - get_option('popup_included_pages') !== null && - get_option('popup_included_pages') !== '' - ) { - $paths = explode(',', get_option('popup_included_pages')); - $arr_js = 'const typebot_include_paths = ['; - foreach ($paths as $path) { - $arr_js = $arr_js . '"' . $path . '",'; + function add_module_type($tag, $handle) + { + if ('typebot' !== $handle) { + return $tag; } - $arr_js = $arr_js . ']'; - wp_add_inline_script('typebot', $arr_js); - } else { - wp_add_inline_script('typebot', 'const typebot_include_paths = null'); - } - $params = - '{ - url: "' . - $url . - '", - hiddenVariables: typebotWpUser, - }'; - if ( - get_option('popup_delay') !== null && - get_option('popup_delay') !== '' - ) { - $params = - '{ - url: "' . - $url . - '", - delay: ' . - get_option('popup_delay') * 1000 . - ' - }'; + $tag = str_replace( + ' { - let includePath = path; - let windowPath = window.location.pathname; - if (includePath.endsWith("*")) { - return windowPath.startsWith(includePath.slice(0, -1)); - } - if (includePath.endsWith("/")) { - includePath = path.slice(0, -1); - } - if (windowPath.endsWith("/")) { - windowPath = windowPath.slice(0, -1); - } - return windowPath === includePath; - }) - ) { - Typebot.initPopup(' . - $params . - '); - }' - ); - } - private function parse_bubble_head_code() - { - $url = str_starts_with(get_option('url'), 'https://typebot.io') - ? 'https://viewer.typebot.io' . '/' . explode('/', get_option('url'))[3] - : get_option('url'); - if (!$url) { - return; - } - $chat_icon = get_option('chat_icon'); - if ( - get_option('chat_included_pages') !== null && - get_option('chat_included_pages') !== '' - ) { - $paths = explode(',', get_option('chat_included_pages')); - $arr_js = 'const typebot_include_paths = ['; - foreach ($paths as $path) { - $arr_js = $arr_js . '"' . $path . '",'; - } - $arr_js = $arr_js . ']'; - wp_add_inline_script('typebot', $arr_js); - } else { - wp_add_inline_script('typebot', 'const typebot_include_paths = null'); - } - $button_color = '#0042DA'; - if ( - get_option('button_color') !== null && - get_option('button_color') !== '' - ) { - $button_color = get_option('button_color'); - } - $params = - '{ - url: "' . - $url . - '", - autoOpenDelay: ' . - (get_option('chat_delay') === '' || get_option('chat_delay') === null - ? 'undefined' - : get_option('chat_delay') * 1000) . - ', - button: { - color: "' . - $button_color . - '", - iconUrl: "' . - $chat_icon . - '", - }, - hiddenVariables: typebotWpUser, - }'; - if ( - get_option('text_content') !== '' && - get_option('text_content') !== null - ) { - $remember = - get_option('dont_show_callout_twice') === 'on' ? 'true' : 'false'; - $params = - '{ - url: "' . - $url . - '", - autoOpenDelay: ' . - (get_option('chat_delay') === '' || get_option('chat_delay') === null - ? 'undefined' - : get_option('chat_delay') * 1000) . - ', - proactiveMessage: { - avatarUrl: "' . - get_option('avatar') . - '", - textContent: "' . - get_option('text_content') . - '", - delay: ' . - get_option('bubble_delay') * 1000 . - ', - rememberClose: ' . - $remember . - ' - }, - hiddenVariables: typebotWpUser, - button: { - color: "' . - $button_color . - '", - iconUrl: "' . - $chat_icon . - '", - }, - }'; + wp_enqueue_script('typebot', 'whatever.js'); + add_filter('script_loader_tag', 'add_module_type', 10, 2); + wp_add_inline_script('typebot', $this->parse_wp_user()); + if (get_option('init_snippet') && get_option('init_snippet') !== '') { + wp_add_inline_script('typebot', get_option('init_snippet')); + wp_add_inline_script('typebot', 'Typebot.setPrefilledVariables({ typebotWpUser });'); } - wp_add_inline_script( - 'typebot', - 'if (!typebot_include_paths) { - Typebot.initBubble(' . - $params . - '); - } else if ( - typebot_include_paths.some((path) => { - let includePath = path; - let windowPath = window.location.pathname; - if (includePath.endsWith("*")) { - return windowPath.startsWith(includePath.slice(0, -1)); - } - if (includePath.endsWith("/")) { - includePath = path.slice(0, -1); - } - if (windowPath.endsWith("/")) { - windowPath = windowPath.slice(0, -1); - } - return windowPath === includePath; - }) - ) { - Typebot.initBubble(' . - $params . - '); - }' - ); } private function parse_wp_user() { $wp_user = wp_get_current_user(); - return 'if(typeof typebotWpUser === "undefined"){ - var typebotWpUser = { + return 'if(typeof window.typebotWpUser === "undefined"){ + window.typebotWpUser = { wp_id:"' . $wp_user->ID . '", @@ -238,69 +52,29 @@ private function parse_wp_user() public function add_typebot_container($attributes = []) { + $lib_url = "https://cdn.jsdelivr.net/npm/@typebot.io/js@0.0.9/dist/web.js"; $width = '100%'; $height = '500px'; - $bg_color = 'rgba(255, 255, 255, 0)'; - $url = str_starts_with(get_option('url'), 'https://typebot.io') - ? 'https://viewer.typebot.io' . '/' . explode('/', get_option('url'))[3] - : get_option('url'); - if (is_array($attributes)) { - if (array_key_exists('width', $attributes)) { - $width = sanitize_text_field($attributes['width']); - } - if (array_key_exists('height', $attributes)) { - $height = sanitize_text_field($attributes['height']); - } - if (array_key_exists('background-color', $attributes)) { - $bg_color = sanitize_text_field($attributes['background-color']); - } - if (array_key_exists('url', $attributes)) { - $url = sanitize_text_field($attributes['url']); - } + if (array_key_exists('width', $attributes)) { + $width = sanitize_text_field($attributes['width']); + } + if (array_key_exists('height', $attributes)) { + $height = sanitize_text_field($attributes['height']); } - if (!$url) { + if (array_key_exists('typebot', $attributes)) { + $typebot = sanitize_text_field($attributes['typebot']); + } + if (!$typebot) { return; } - $container_id = 'typebot-container-' . $this->generateRandomString(4); - $bot_initializer = - 'var typebot = Typebot.initContainer("' . - $container_id . - '",{ - hiddenVariables: typebotWpUser, - url: "' . - $url . - '", - })'; + $id = $this->generateRandomString(); - return '' . - '
- '; + $bot_initializer = ''; + + return '' . $bot_initializer; } private function generateRandomString($length = 10) diff --git a/packages/wordpress/trunk/typebot.php b/packages/wordpress/trunk/typebot.php index 64173a6c74..41f6fb48f3 100644 --- a/packages/wordpress/trunk/typebot.php +++ b/packages/wordpress/trunk/typebot.php @@ -3,7 +3,7 @@ /** * Plugin Name: Typebot * Description: Convert more with conversational forms - * Version: 2.1.11 + * Version: 3.0.0 * Author: Typebot * Author URI: http://typebot.io/ * License: GPL-2.0+ @@ -16,7 +16,7 @@ die(); } -define('TYPEBOT_VERSION', '2.1.11'); +define('TYPEBOT_VERSION', '3.0.0'); function activate_typebot() { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ed2392cc0..9459a932ab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,13 +22,6 @@ importers: '@chakra-ui/react': 2.5.0 '@chakra-ui/styled-system': 2.5.1 '@chakra-ui/theme-tools': ^2.0.16 - '@codemirror/lang-css': 6.0.1 - '@codemirror/lang-html': 6.4.1 - '@codemirror/lang-javascript': 6.1.2 - '@codemirror/lang-json': 6.0.1 - '@codemirror/lint': 6.1.0 - '@codemirror/state': 6.2.0 - '@codemirror/theme-one-dark': ^6.1.0 '@dnd-kit/core': 6.0.7 '@dnd-kit/sortable': 7.0.2 '@dnd-kit/utilities': 3.2.1 @@ -50,6 +43,8 @@ importers: '@trpc/next': 10.9.0 '@trpc/react-query': 10.9.0 '@trpc/server': 10.9.0 + '@typebot.io/js': workspace:* + '@typebot.io/react': workspace:* '@types/canvas-confetti': 1.6.0 '@types/google-spreadsheet': 3.3.0 '@types/jsonwebtoken': 9.0.1 @@ -70,9 +65,12 @@ importers: '@udecode/plate-serializer-html': 19.2.0 '@udecode/plate-ui-link': 19.2.0 '@udecode/plate-ui-toolbar': 19.2.0 + '@uiw/codemirror-extensions-langs': ^4.19.7 + '@uiw/codemirror-theme-github': ^4.19.7 + '@uiw/codemirror-theme-tokyo-night': ^4.19.7 + '@uiw/react-codemirror': ^4.19.7 '@use-gesture/react': ^10.2.24 aws-sdk: 2.1304.0 - bot-engine: workspace:* browser-image-compression: 2.0.0 canvas-confetti: 1.6.0 chakra-react-select: ^4.4.3 @@ -121,7 +119,6 @@ importers: tinycolor2: 1.5.2 trpc-openapi: 1.1.2 tsconfig: workspace:* - typebot-js: workspace:* typescript: 4.9.4 use-debounce: 9.0.3 utils: workspace:* @@ -131,13 +128,6 @@ importers: '@chakra-ui/css-reset': 2.0.11_hp5f5nkljdiwilp4rgxyefcplu '@chakra-ui/react': 2.5.0_rmkrbeisirqa7nsh5de33nr2se '@chakra-ui/theme-tools': 2.0.16_ak67p4fuwhwgy7hpxa6ejvcgoy - '@codemirror/lang-css': 6.0.1_nzpoxphwgc7witc3f5hdaoweju - '@codemirror/lang-html': 6.4.1 - '@codemirror/lang-javascript': 6.1.2 - '@codemirror/lang-json': 6.0.1 - '@codemirror/lint': 6.1.0 - '@codemirror/state': 6.2.0 - '@codemirror/theme-one-dark': 6.1.0 '@dnd-kit/core': 6.0.7_biqbaboplfbrettd7655fr4n2y '@dnd-kit/sortable': 7.0.2_pmudlfv2z3i7vvlookxjkeidxe '@dnd-kit/utilities': 3.2.1_react@18.2.0 @@ -158,6 +148,8 @@ importers: '@trpc/next': 10.9.0_5z6xuiz5uv65txozaje5ixjdkm '@trpc/react-query': 10.9.0_3y2fjou3ckwba5czteau6vvsje '@trpc/server': 10.9.0 + '@typebot.io/js': link:../../packages/js + '@typebot.io/react': link:../../packages/react '@udecode/plate-basic-marks': 19.2.0_6cxv2rkchn37mmk4ursbonwz7a '@udecode/plate-common': 7.0.2_anhkvwz6zcr7uznpbsjwteukiu '@udecode/plate-core': 19.2.0_6cxv2rkchn37mmk4ursbonwz7a @@ -165,9 +157,12 @@ importers: '@udecode/plate-serializer-html': 19.2.0_xdtsvcftqex5yu43odi3bb6j7u '@udecode/plate-ui-link': 19.2.0_zvntoaj4wsvigktaodqapm7npu '@udecode/plate-ui-toolbar': 19.2.0_zvntoaj4wsvigktaodqapm7npu + '@uiw/codemirror-extensions-langs': 4.19.7_brqhm5cu2qxolzjg2togia2d7m + '@uiw/codemirror-theme-github': 4.19.7_a2usvefncw26hnlzt6oyk4qbeq + '@uiw/codemirror-theme-tokyo-night': 4.19.7_a2usvefncw26hnlzt6oyk4qbeq + '@uiw/react-codemirror': 4.19.7_pzrqepnlx4uklbalwyntc26e4u '@use-gesture/react': 10.2.24_react@18.2.0 aws-sdk: 2.1304.0 - bot-engine: link:../../packages/bot-engine browser-image-compression: 2.0.0 canvas-confetti: 1.6.0 chakra-react-select: 4.4.3_ujih3xq5xzlagyvac65tb5w3ru @@ -208,7 +203,6 @@ importers: swr: 2.0.3_react@18.2.0 tinycolor2: 1.5.2 trpc-openapi: 1.1.2_v7aw5md42ua3rf277jyeogdfny - typebot-js: link:../../packages/typebot-js use-debounce: 9.0.3_react@18.2.0 devDependencies: '@babel/core': 7.20.12 @@ -3341,8 +3335,15 @@ packages: '@lezer/common': 1.0.2 dev: false - /@codemirror/lang-css/6.0.1_nzpoxphwgc7witc3f5hdaoweju: - resolution: {integrity: sha512-rlLq1Dt0WJl+2epLQeAsfqIsx3lGu4HStHCJu95nGGuz2P2fNugbU3dQYafr2VRjM4eMC9HviI6jvS98CNtG5w==} + /@codemirror/lang-cpp/6.0.2: + resolution: {integrity: sha512-6oYEYUKHvrnacXxWxYa6t4puTlbN3dgV662BDfSH8+MfjQjVmP697/KYTDOqpxgerkvoNm7q5wlFMBeX8ZMocg==} + dependencies: + '@codemirror/language': 6.4.0 + '@lezer/cpp': 1.0.0 + dev: false + + /@codemirror/lang-css/6.0.2_nzpoxphwgc7witc3f5hdaoweju: + resolution: {integrity: sha512-4V4zmUOl2Glx0GWw0HiO1oGD4zvMlIQ3zx5hXOE6ipCjhohig2bhWRAasrZylH9pRNTcl1VMa59Lsl8lZWlTzw==} dependencies: '@codemirror/autocomplete': 6.4.0_3jfk5zzaw77h3sqp5wt6b7asku '@codemirror/language': 6.4.0 @@ -3357,7 +3358,7 @@ packages: resolution: {integrity: sha512-9NzhWKAkWEwjXC04DKM6yrHnxIPFTqZNLDhWfZiKLMxUiU++XoHz9n6D5EPp1igBmX0vXcpFb5Kud6XzIJhZ4A==} dependencies: '@codemirror/autocomplete': 6.4.0_3jfk5zzaw77h3sqp5wt6b7asku - '@codemirror/lang-css': 6.0.1_nzpoxphwgc7witc3f5hdaoweju + '@codemirror/lang-css': 6.0.2_nzpoxphwgc7witc3f5hdaoweju '@codemirror/lang-javascript': 6.1.2 '@codemirror/language': 6.4.0 '@codemirror/state': 6.2.0 @@ -3367,6 +3368,13 @@ packages: '@lezer/html': 1.3.0 dev: false + /@codemirror/lang-java/6.0.1: + resolution: {integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==} + dependencies: + '@codemirror/language': 6.4.0 + '@lezer/java': 1.0.0 + dev: false + /@codemirror/lang-javascript/6.1.2: resolution: {integrity: sha512-OcwLfZXdQ1OHrLiIcKCn7MqZ7nx205CMKlhe+vL88pe2ymhT9+2P+QhwkYGxMICj8TDHyp8HFKVwpiisUT7iEQ==} dependencies: @@ -3386,6 +3394,125 @@ packages: '@lezer/json': 1.0.0 dev: false + /@codemirror/lang-lezer/6.0.1: + resolution: {integrity: sha512-WHwjI7OqKFBEfkunohweqA5B/jIlxaZso6Nl3weVckz8EafYbPZldQEKSDb4QQ9H9BUkle4PVELP4sftKoA0uQ==} + dependencies: + '@codemirror/language': 6.4.0 + '@codemirror/state': 6.2.0 + '@lezer/common': 1.0.2 + '@lezer/lezer': 1.1.0 + dev: false + + /@codemirror/lang-markdown/6.0.5: + resolution: {integrity: sha512-qH0THRYc2M7pIJoAp6jstXZkv8ZMVhNaBm7Bs4+0SLHhHlwX53txFy98AcPwrfq0Sh8Zi6RAuj9j/GyL8E1MKw==} + dependencies: + '@codemirror/lang-html': 6.4.1 + '@codemirror/language': 6.4.0 + '@codemirror/state': 6.2.0 + '@codemirror/view': 6.7.3 + '@lezer/common': 1.0.2 + '@lezer/markdown': 1.0.2 + dev: false + + /@codemirror/lang-php/6.0.1: + resolution: {integrity: sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA==} + dependencies: + '@codemirror/lang-html': 6.4.1 + '@codemirror/language': 6.4.0 + '@codemirror/state': 6.2.0 + '@lezer/common': 1.0.2 + '@lezer/php': 1.0.1 + dev: false + + /@codemirror/lang-python/6.1.1_gmyi65uhzwvxi3jypseoerg22u: + resolution: {integrity: sha512-AddGMIKUssUAqaDKoxKWA5GAzy/CVE0eSY7/ANgNzdS1GYBkp6N49XKEyMElkuN04UsZ+bTIQdj+tVV75NMwJw==} + dependencies: + '@codemirror/autocomplete': 6.4.0_3jfk5zzaw77h3sqp5wt6b7asku + '@codemirror/language': 6.4.0 + '@lezer/python': 1.1.1 + transitivePeerDependencies: + - '@codemirror/state' + - '@codemirror/view' + - '@lezer/common' + dev: false + + /@codemirror/lang-rust/6.0.1: + resolution: {integrity: sha512-344EMWFBzWArHWdZn/NcgkwMvZIWUR1GEBdwG8FEp++6o6vT6KL9V7vGs2ONsKxxFUPXKI0SPcWhyYyl2zPYxQ==} + dependencies: + '@codemirror/language': 6.4.0 + '@lezer/rust': 1.0.0 + dev: false + + /@codemirror/lang-sql/6.3.3_nzpoxphwgc7witc3f5hdaoweju: + resolution: {integrity: sha512-VNsHju8500fkiDyDU8jZyGQ8M0iXU0SmfeCoCeAYkACcEFlX63BOT8311pICXyw43VYRbS23w54RgSEQmixGjQ==} + dependencies: + '@codemirror/autocomplete': 6.4.0_3jfk5zzaw77h3sqp5wt6b7asku + '@codemirror/language': 6.4.0 + '@codemirror/state': 6.2.0 + '@lezer/highlight': 1.1.3 + '@lezer/lr': 1.2.5 + transitivePeerDependencies: + - '@codemirror/view' + - '@lezer/common' + dev: false + + /@codemirror/lang-sql/6.4.0_nzpoxphwgc7witc3f5hdaoweju: + resolution: {integrity: sha512-UWGK1+zc9+JtkiT+XxHByp4N6VLgLvC2x0tIudrJG26gyNtn0hWOVoB0A8kh/NABPWkKl3tLWDYf2qOBJS9Zdw==} + dependencies: + '@codemirror/autocomplete': 6.4.0_3jfk5zzaw77h3sqp5wt6b7asku + '@codemirror/language': 6.4.0 + '@codemirror/state': 6.2.0 + '@lezer/highlight': 1.1.3 + '@lezer/lr': 1.3.1 + transitivePeerDependencies: + - '@codemirror/view' + - '@lezer/common' + dev: false + + /@codemirror/lang-wast/6.0.1: + resolution: {integrity: sha512-sQLsqhRjl2MWG3rxZysX+2XAyed48KhLBHLgq9xcKxIJu3npH/G+BIXW5NM5mHeDUjG0jcGh9BcjP0NfMStuzA==} + dependencies: + '@codemirror/language': 6.4.0 + '@lezer/highlight': 1.1.3 + '@lezer/lr': 1.2.5 + dev: false + + /@codemirror/lang-xml/6.0.2_@codemirror+view@6.7.3: + resolution: {integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==} + dependencies: + '@codemirror/autocomplete': 6.4.0_3jfk5zzaw77h3sqp5wt6b7asku + '@codemirror/language': 6.4.0 + '@codemirror/state': 6.2.0 + '@lezer/common': 1.0.2 + '@lezer/xml': 1.0.1 + transitivePeerDependencies: + - '@codemirror/view' + dev: false + + /@codemirror/language-data/6.1.0_gmyi65uhzwvxi3jypseoerg22u: + resolution: {integrity: sha512-g9V23fuLRI9AEbpM6bDy1oquqgpFlIDHTihUhL21NPmxp+x67ZJbsKk+V71W7/Bj8SCqEO1PtqQA/tDGgt1nfw==} + dependencies: + '@codemirror/lang-cpp': 6.0.2 + '@codemirror/lang-css': 6.0.2_nzpoxphwgc7witc3f5hdaoweju + '@codemirror/lang-html': 6.4.1 + '@codemirror/lang-java': 6.0.1 + '@codemirror/lang-javascript': 6.1.2 + '@codemirror/lang-json': 6.0.1 + '@codemirror/lang-markdown': 6.0.5 + '@codemirror/lang-php': 6.0.1 + '@codemirror/lang-python': 6.1.1_gmyi65uhzwvxi3jypseoerg22u + '@codemirror/lang-rust': 6.0.1 + '@codemirror/lang-sql': 6.4.0_nzpoxphwgc7witc3f5hdaoweju + '@codemirror/lang-wast': 6.0.1 + '@codemirror/lang-xml': 6.0.2_@codemirror+view@6.7.3 + '@codemirror/language': 6.4.0 + '@codemirror/legacy-modes': 6.3.1 + transitivePeerDependencies: + - '@codemirror/state' + - '@codemirror/view' + - '@lezer/common' + dev: false + /@codemirror/language/6.4.0: resolution: {integrity: sha512-Wzb7GnNj8vnEtbPWiOy9H0m1fBtE28kepQNGLXekU2EEZv43BF865VKITUn+NoV8OpW6gRtvm29YEhqm46927Q==} dependencies: @@ -3393,10 +3520,16 @@ packages: '@codemirror/view': 6.7.3 '@lezer/common': 1.0.2 '@lezer/highlight': 1.1.3 - '@lezer/lr': 1.3.3 + '@lezer/lr': 1.3.1 style-mod: 4.0.0 dev: false + /@codemirror/legacy-modes/6.3.1: + resolution: {integrity: sha512-icXmCs4Mhst2F8mE0TNpmG6l7YTj1uxam3AbZaFaabINH5oWAdg2CfR/PVi+d/rqxJ+TuTnvkKK5GILHrNThtw==} + dependencies: + '@codemirror/language': 6.4.0 + dev: false + /@codemirror/lint/6.1.0: resolution: {integrity: sha512-mdvDQrjRmYPvQ3WrzF6Ewaao+NWERYtpthJvoQ3tK3t/44Ynhk8ZGjTSL9jMEv8CgSMogmt75X8ceOZRDSXHtQ==} dependencies: @@ -5615,11 +5748,18 @@ packages: resolution: {integrity: sha512-SVgiGtMnMnW3ActR8SXgsDhw7a0w0ChHSYAyAUxxrOiJ1OqYWEKk/xJd84tTSPo1mo6DXLObAJALNnd0Hrv7Ng==} dev: false + /@lezer/cpp/1.0.0: + resolution: {integrity: sha512-Klk3/AIEKoptmm6cNm7xTulNXjdTKkD+hVOEcz/NeRg8tIestP5hsGHJeFDR/XtyDTxsjoPjKZRIGohht7zbKw==} + dependencies: + '@lezer/highlight': 1.1.3 + '@lezer/lr': 1.3.1 + dev: false + /@lezer/css/1.1.1: resolution: {integrity: sha512-mSjx+unLLapEqdOYDejnGBokB5+AiJKZVclmud0MKQOKx3DLJ5b5VTCstgDDknR6iIV4gVrN6euzsCnj0A2gQA==} dependencies: '@lezer/highlight': 1.1.3 - '@lezer/lr': 1.3.3 + '@lezer/lr': 1.3.1 dev: false /@lezer/highlight/1.1.3: @@ -5633,29 +5773,84 @@ packages: dependencies: '@lezer/common': 1.0.2 '@lezer/highlight': 1.1.3 - '@lezer/lr': 1.3.3 + '@lezer/lr': 1.3.1 + dev: false + + /@lezer/java/1.0.0: + resolution: {integrity: sha512-z2EA0JHq2WoiKfQy5uOOd4t17PJtq8guh58gPkSzOnNcQ7DNbkrU+Axak+jL8+Noinwyz2tRNOseQFj+Tg+P0A==} + dependencies: + '@lezer/highlight': 1.1.3 + '@lezer/lr': 1.3.1 dev: false /@lezer/javascript/1.4.1: resolution: {integrity: sha512-Hqx36DJeYhKtdpc7wBYPR0XF56ZzIp0IkMO/zNNj80xcaFOV4Oj/P7TQc/8k2TxNhzl7tV5tXS8ZOCPbT4L3nA==} dependencies: '@lezer/highlight': 1.1.3 - '@lezer/lr': 1.3.3 + '@lezer/lr': 1.3.1 dev: false /@lezer/json/1.0.0: resolution: {integrity: sha512-zbAuUY09RBzCoCA3lJ1+ypKw5WSNvLqGMtasdW6HvVOqZoCpPr8eWrsGnOVWGKGn8Rh21FnrKRVlJXrGAVUqRw==} dependencies: '@lezer/highlight': 1.1.3 - '@lezer/lr': 1.3.3 + '@lezer/lr': 1.3.1 + dev: false + + /@lezer/lezer/1.1.0: + resolution: {integrity: sha512-XTomM3C2MzHNuZwjYbyYZ44IRV6rHIOvi++yAD1O4djlDoKAnikx3BFoREK2g/z8zUIc/kyWuZO9W9xN4/OR1g==} + dependencies: + '@lezer/highlight': 1.1.3 + '@lezer/lr': 1.3.1 + dev: false + + /@lezer/lr/1.2.5: + resolution: {integrity: sha512-f9319YG1A/3ysgUE3bqCHEd7g+3ZZ71MWlwEc42mpnLVYXgfJJgtu1XAyBB4Kz8FmqmnFe9caopDqKeMMMAU6g==} + dependencies: + '@lezer/common': 1.0.2 dev: false - /@lezer/lr/1.3.3: - resolution: {integrity: sha512-JPQe3mwJlzEVqy67iQiiGozhcngbO8QBgpqZM6oL1Wj/dXckrEexpBLeFkq0edtW5IqnPRFxA24BHJni8Js69w==} + /@lezer/lr/1.3.1: + resolution: {integrity: sha512-+GymJB/+3gThkk2zHwseaJTI5oa4AuOuj1I2LCslAVq1dFZLSX8SAe4ZlJq1TjezteDXtF/+d4qeWz9JvnrG9Q==} dependencies: '@lezer/common': 1.0.2 dev: false + /@lezer/markdown/1.0.2: + resolution: {integrity: sha512-8CY0OoZ6V5EzPjSPeJ4KLVbtXdLBd8V6sRCooN5kHnO28ytreEGTyrtU/zUwo/XLRzGr/e1g44KlzKi3yWGB5A==} + dependencies: + '@lezer/common': 1.0.2 + '@lezer/highlight': 1.1.3 + dev: false + + /@lezer/php/1.0.1: + resolution: {integrity: sha512-aqdCQJOXJ66De22vzdwnuC502hIaG9EnPK2rSi+ebXyUd+j7GAX1mRjWZOVOmf3GST1YUfUCu6WXDiEgDGOVwA==} + dependencies: + '@lezer/highlight': 1.1.3 + '@lezer/lr': 1.3.1 + dev: false + + /@lezer/python/1.1.1: + resolution: {integrity: sha512-ArUGh9kvdaOVu6IkSaYUS9WFQeMAFVWKRuZo6vexnxoeCLnxf0Y9DCFEAMMa7W9SQBGYE55OarSpPqSkdOXSCA==} + dependencies: + '@lezer/highlight': 1.1.3 + '@lezer/lr': 1.3.1 + dev: false + + /@lezer/rust/1.0.0: + resolution: {integrity: sha512-IpGAxIjNxYmX9ra6GfQTSPegdCAWNeq23WNmrsMMQI7YNSvKtYxO4TX5rgZUmbhEucWn0KTBMeDEPXg99YKtTA==} + dependencies: + '@lezer/highlight': 1.1.3 + '@lezer/lr': 1.3.1 + dev: false + + /@lezer/xml/1.0.1: + resolution: {integrity: sha512-jMDXrV953sDAUEMI25VNrI9dz94Ai96FfeglytFINhhwQ867HKlCE2jt3AwZTCT7M528WxdDWv/Ty8e9wizwmQ==} + dependencies: + '@lezer/highlight': 1.1.3 + '@lezer/lr': 1.3.1 + dev: false + /@mdx-js/mdx/1.6.22: resolution: {integrity: sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==} dependencies: @@ -7741,6 +7936,112 @@ packages: - scheduler dev: false + /@uiw/codemirror-extensions-basic-setup/4.19.7_z4w2cb7jeeiewgtgrbfykr2vnq: + resolution: {integrity: sha512-pk0JTFJAZOGxouBB1pdBtb59qKibO9DW4hER4VSFGBGW3TBDeXUwL/gKujhRpySHG2MtG09cgt4a3XOFIWwXTw==} + peerDependencies: + '@codemirror/autocomplete': '>=6.0.0' + '@codemirror/commands': '>=6.0.0' + '@codemirror/language': '>=6.0.0' + '@codemirror/lint': '>=6.0.0' + '@codemirror/search': '>=6.0.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + dependencies: + '@codemirror/autocomplete': 6.4.0_3jfk5zzaw77h3sqp5wt6b7asku + '@codemirror/commands': 6.2.0 + '@codemirror/language': 6.4.0 + '@codemirror/lint': 6.1.0 + '@codemirror/search': 6.2.3 + '@codemirror/state': 6.2.0 + '@codemirror/view': 6.7.3 + dev: false + + /@uiw/codemirror-extensions-langs/4.19.7_brqhm5cu2qxolzjg2togia2d7m: + resolution: {integrity: sha512-dqaOFrwv79y93pBIDJ41fWRxF4JP9ij/PVFi9YxHNILNN1RqdS0uDFj8VJ8aeHPM8w0dmQZUoDP3qySru+r5yA==} + peerDependencies: + '@codemirror/language-data': '>=6.0.0' + '@codemirror/legacy-modes': '>=6.0.0' + dependencies: + '@codemirror/lang-cpp': 6.0.2 + '@codemirror/lang-html': 6.4.1 + '@codemirror/lang-java': 6.0.1 + '@codemirror/lang-javascript': 6.1.2 + '@codemirror/lang-json': 6.0.1 + '@codemirror/lang-lezer': 6.0.1 + '@codemirror/lang-markdown': 6.0.5 + '@codemirror/lang-php': 6.0.1 + '@codemirror/lang-python': 6.1.1_gmyi65uhzwvxi3jypseoerg22u + '@codemirror/lang-rust': 6.0.1 + '@codemirror/lang-sql': 6.3.3_nzpoxphwgc7witc3f5hdaoweju + '@codemirror/lang-wast': 6.0.1 + '@codemirror/lang-xml': 6.0.2_@codemirror+view@6.7.3 + '@codemirror/language-data': 6.1.0_gmyi65uhzwvxi3jypseoerg22u + '@codemirror/legacy-modes': 6.3.1 + transitivePeerDependencies: + - '@codemirror/state' + - '@codemirror/view' + - '@lezer/common' + dev: false + + /@uiw/codemirror-theme-github/4.19.7_a2usvefncw26hnlzt6oyk4qbeq: + resolution: {integrity: sha512-yeBKOS31bJWvxHWv/hO8CC5Hz657poyuCRX533B+7c2W3B5TX48i49GC9k91yX/BfCsTVqneONk4ZgRWGJkDww==} + dependencies: + '@uiw/codemirror-themes': 4.19.7_a2usvefncw26hnlzt6oyk4qbeq + transitivePeerDependencies: + - '@codemirror/language' + - '@codemirror/state' + - '@codemirror/view' + dev: false + + /@uiw/codemirror-theme-tokyo-night/4.19.7_a2usvefncw26hnlzt6oyk4qbeq: + resolution: {integrity: sha512-D/oLEsamQ7goFYnP46kyrt60vc2Tx8nC9FWyHqJvD3DL8+ugUsQvCL2oIadCadfMm7pQrFj1ILfokb8uC9W5eg==} + dependencies: + '@uiw/codemirror-themes': 4.19.7_a2usvefncw26hnlzt6oyk4qbeq + transitivePeerDependencies: + - '@codemirror/language' + - '@codemirror/state' + - '@codemirror/view' + dev: false + + /@uiw/codemirror-themes/4.19.7_a2usvefncw26hnlzt6oyk4qbeq: + resolution: {integrity: sha512-M/42RkPI60ItlssmNuEoZO2MQvlY6fRmdX7XRUAhKjxczZoaq8xS6HIvv1whGf2zGsTrwdVTPCm6ls0l17dvPA==} + peerDependencies: + '@codemirror/language': '>=6.0.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + dependencies: + '@codemirror/language': 6.4.0 + '@codemirror/state': 6.2.0 + '@codemirror/view': 6.7.3 + dev: false + + /@uiw/react-codemirror/4.19.7_pzrqepnlx4uklbalwyntc26e4u: + resolution: {integrity: sha512-IHvpYWVSdiaHX0Fk6oY6YyAJigDnyvSpWKNUTRzsMNxB+8/wqZ8lior4TprXH0zyLxW5F1+bTyifFFTeg+X3Sw==} + peerDependencies: + '@babel/runtime': '>=7.11.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/theme-one-dark': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + codemirror: '>=6.0.0' + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@babel/runtime': 7.20.13 + '@codemirror/commands': 6.2.0 + '@codemirror/state': 6.2.0 + '@codemirror/theme-one-dark': 6.1.0 + '@codemirror/view': 6.7.3 + '@uiw/codemirror-extensions-basic-setup': 4.19.7_z4w2cb7jeeiewgtgrbfykr2vnq + codemirror: 6.0.1_@lezer+common@1.0.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + transitivePeerDependencies: + - '@codemirror/autocomplete' + - '@codemirror/language' + - '@codemirror/lint' + - '@codemirror/search' + dev: false + /@use-gesture/core/10.2.24: resolution: {integrity: sha512-ZL7F9mgOn3Qlnp6QLI9jaOfcvqrx6JPE/BkdVSd8imveaFTm/a3udoO6f5Us/1XtqnL4347PsIiK6AtCvMHk2Q==} dev: false