!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e=e||self)["zh-tw"]={})}(this,function(e){"use strict";var n="undefined"!=typeof window&&window.flatpickr!==undefined?window.flatpickr:{l10ns:{}},t={weekdays:{shorthand:["週日","週一","週二","週三","週四","週五","週六"],longhand:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]},months:{shorthand:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],longhand:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},rangeSeparator:" 至 ",weekAbbreviation:"週",scrollTitle:"滾動切換",toggleTitle:"點擊切換 12/24 小時時制"};n.l10ns.zh_tw=t;var o=n.l10ns;e.MandarinTraditional=t,e["default"]=o,Object.defineProperty(e,"__esModule",{value:!0})});!function(e){"use strict";ElementsKit_Helper.registerWidget("elementskit-image-accordion.default",(function(i){const t=i.find(".elementskit-single-image-accordion");let n;for(let i=0;iFor example:“I want to share my photography work. I’d like a minimal, modern look with a photo gallery and an About me page.”","chatbot.widget.onboarding.question.business.name":"Got it! And how would you like to call your online store? This is the name visitors will see on your site.","chatbot.widget.onboarding.question.website.name":"Got it! What’s the name of your business or project? This is the name visitors will see on your site.","chatbot.widget.onboarding.option.portfolio":"Portfolio","chatbot.widget.onboarding.option.business":"Business & services","chatbot.widget.onboarding.option.blog":"Blog","chatbot.widget.onboarding.option.online.store":"Online store","chatbot.widget.onboarding.option.link.in.bio":"Landing page","chatbot.widget.onboarding.confirm.business.name":'I confirm that "{name}" is my site name',"chatbot.widget.suggestions":"Suggestions","chatbot.widget.ticketStatus.inProgress":"Ticket {ticketNumber} is currently in progress, you will be notified on this banner of any updates. {issueType}","chatbot.widget.ticketStatus.waitingCustomer":"Ticket {ticketNumber} is currently waiting for your response. Click below to provide more details. {issueType}","chatbot.widget.ticketStatus.closed":"Ticket {ticketNumber} has been closed. If the issue persists, please reach out to us again to review it. {issueType}","chatbot.widget.ticketStatus.waitingCustomerPrompt":"I have a waiting ticket #{ticketNumber} for {issueType} and would like to add details","chatbot.widget.ticketStatus.provideDetails":"Provide details","chatbot.widget.onboarding.startScreen.title":"Hi, I’m Kodee! 👋","chatbot.widget.onboarding.startScreen.subTitle":"I’ll help you get your site up and running. Who is this website for?","chatbot.widget.onboarding.secondaryStartScreen.title":"Got it! Let's get started.","chatbot.widget.onboarding.secondaryStartScreen.subTitle":"Do you want to create or migrate a site?","chatbot.widget.onboarding.surveyTitles.myself":"Myself or my business","chatbot.widget.onboarding.surveyTitles.others":"Someone else","chatbot.widget.onboarding.surveyTitles.create":"Create a new site","chatbot.widget.onboarding.surveyTitles.migrate":"Migrate an existing site","chatbot.widget.onboarding.surveyTitles.professional":"I hired someone to help me with my site","chatbot.widget.onboarding.startScreenCreateOrMigrate.title":"Hi, I’m Kodee! 👋","chatbot.widget.onboarding.startScreenCreateOrMigrate.subTitle":"I’ll help you get your site up and running. Where would you like to start?","chatbot.widget.onboarding.confirm.business.name.short":"I confirm that’s the correct name","chatbot.widget.onboarding.clarify.business.name":"Just to double-check – is '{name}' the name you'd like to use? Just confirm below if that's right. If I got it wrong, go ahead and share the correct one – I'll make sure to update it!","chatbot.widget.try.now":"Try now","chatbot.widget.main.closedConversation":"Closed","chatbot.widget.main.you":"You","chatbot.widget.you.are.in.queue":"You are in queue","chatbot.widget.reconnecting.failedToConnect":"Failed to connect. Please","chatbot.widget.reconnecting.refreshThePage":"refresh the page.","chatbot.widget.reconnecting.reconnecting":"Reconnecting","chatbot.widget.reconnecting.connected":"Connected","chatbot.widget.main.go.back":"Go back","chatbot.widget.voice.record.title":"Listening...","chatbot.widget.voice.record.send":"Send","chatbot.widget.voice.record.cancel":"Cancel","chatbot.widget.voice.stop.playback":"Stop playback","chatbot.widget.voice.record.permission.denied":"Microphone access is required. Please allow microphone permissions in your browser settings.","chatbot.widget.voice.voice.message.sent":"Voice message sent","chatbot.widget.voice.start.playback":"Start playback","chatbot.widget.feedback.howWouldYouRate":"How would you rate your conversation?","chatbot.widget.feedback.giveFeedback":"Give feedback","chatbot.widget.survey.yes":"Yes","chatbot.widget.survey.no":"No","chatbot.widget.survey.thankYou":"Thank you for your input","chatbot.widget.voice.loading":"Loading voice response","chatbot.widget.systemMessages.previous.message.being.processed":"Your previous message is still being processed. Please wait before sending a new one.","chatbot.widget.a11y.loading":"Kodee is generating a response","chatbot.widget.a11y.responded":"{name} says","chatbot.widget.a11y.navigationTabs":"Chat navigation","chatbot.widget.a11y.chatMessages":"Chat messages","chatbot.widget.a11y.widget.title":"Kodee AI Assistant","chatbot.widget.a11y.input.label":"Send message to AI","chatbot.widget.send.voice":"Send voice message","chatbot.widget.a11y.history.unread":"Unread","chatbot.widget.a11y.history.list":"Previous conversations","chatbot.widget.feedback.comment.label":"Comments","chatbot.widget.about.your.goals.input.placeholder":"e.g. I want to attract more customers to my bike store","chatbot.widget.suggestions.salesN8nChoosePlan.title":"Help me choose a plan for n8n","chatbot.widget.suggestions.salesN8nChoosePlan.prompt":"Hi! I'm planning to run n8n workflows and I'm not sure which plan fits. Can you recommend a plan based on how I'll use n8n?","chatbot.widget.suggestions.salesN8nInstallOnHostinger.title":"How do I install n8n on Hostinger?","chatbot.widget.suggestions.salesN8nInstallOnHostinger.prompt":"Hi! I want to install n8n on Hostinger. Can you guide me through the easiest setup step by step?","chatbot.widget.suggestions.salesN8nMonthlyCost.title":"How much will n8n cost monthly?","chatbot.widget.suggestions.salesN8nMonthlyCost.prompt":"Hi! What's the total monthly cost to run self-hosted n8n on Hostinger (hosting + any recommended add-ons), and what's the best-value option?","chatbot.widget.suggestions.salesN8nWorkflowVolume.title":"Which n8n plan should I choose to handle my workflow volume?","chatbot.widget.suggestions.salesN8nWorkflowVolume.prompt":"Hi! I plan to run multiple workflows and integrations. Ask me questions to help decide what resources (RAM/CPU/storage) I should choose so n8n stays reliable?","chatbot.widget.suggestions.salesOpenclawIsRightForMe.title":"Is OpenClaw right for what I want to build?","chatbot.widget.suggestions.salesOpenclawIsRightForMe.prompt":"Hi! I'm looking at OpenClaw, but I'm not sure if it fits my use case. I want to use AI across messaging apps (like WhatsApp/Telegram/Slack/Discord). Can you ask a few questions and tell me if OpenClaw is the right choice—and what I should buy to get started on Hostinger?","chatbot.widget.suggestions.salesOpenclawVpsPlan.title":"Which VPS plan do I need for OpenClaw?","chatbot.widget.suggestions.salesOpenclawVpsPlan.prompt":"Hi! I want to deploy OpenClaw on Hostinger. What VPS plan/specs (CPU/RAM/storage) do you recommend based on how many channels and users I'll have, and whether I'll use voice/browser control?","chatbot.widget.suggestions.salesOpenclawAiCredits.title":"How do AI credits/tokens work on Hostinger?","chatbot.widget.suggestions.salesOpenclawAiCredits.prompt":"Hi! I saw that I can buy AI credits/tokens for OpenClaw. Can you explain how that works (nexos.ai access, top-ups, usage), and what I should choose to start with?","chatbot.widget.suggestions.salesOpenclawSecurity.title":"Is self-hosted OpenClaw secure and private?","chatbot.widget.suggestions.salesOpenclawSecurity.prompt":"Hi! Privacy matters to me. If I run OpenClaw on a Hostinger VPS, where do my chat logs and data live, how do I keep them under my control, and what security best practices should I enable before going live?","chatbot.widget.suggestions.salesHorizonsIsRight.title":"Is Horizons right for my idea?","chatbot.widget.suggestions.salesHorizonsIsRight.prompt":"Hi! I'm looking at Horizons and I have an idea for a website or web app. Can you tell me if Horizons is a good fit and what plan I should choose?","chatbot.widget.suggestions.salesHorizonsVsWebsiteBuilder.title":"Horizons vs Website Builder","chatbot.widget.suggestions.salesHorizonsVsWebsiteBuilder.prompt":"Hi! I'm deciding between Horizons and Website Builder. Can you explain the difference and recommend which one I should buy for my project?","chatbot.widget.suggestions.salesHorizonsChoosePlan.title":"Help me choose a Horizons plan","chatbot.widget.suggestions.salesHorizonsChoosePlan.prompt":"Hi! I want to try Horizons but I'm not sure which plan to choose. Can you recommend the best plan for a first-time project?","chatbot.widget.suggestions.salesHorizonsLoginsPayments.title":"Can I build features like logins/payments?","chatbot.widget.suggestions.salesHorizonsLoginsPayments.prompt":"Hi! My project needs features like user accounts and/or payments. Can Horizons handle that, and what would the setup look like?","chatbot.widget.suggestions.salesHorizonsPublish.title":"How do I publish what I build?","chatbot.widget.suggestions.salesHorizonsPublish.prompt":"Hi! If I build something with Horizons, how do I publish it online and connect a domain? What do I need to purchase to go live?","chatbot.widget.suggestions.salesHorizonsCost.title":"What's the real cost to get started?","chatbot.widget.suggestions.salesHorizonsCost.prompt":"Hi! Can you explain the total cost to get started with Horizons (what's included in the plan, renewals, and anything else I might need) and recommend the best-value option?","chatbot.widget.suggestions.salesWebHostingChoosePlan.title":"Which hosting plan should I buy?","chatbot.widget.suggestions.salesWebHostingChoosePlan.prompt":"Hi! I want to create a website (business/blog/portfolio). Can you recommend the best web hosting plan for me and explain why?","chatbot.widget.suggestions.salesWebHostingWhatsIncluded.title":"What's included in web hosting?","chatbot.widget.suggestions.salesWebHostingWhatsIncluded.prompt":"Hi! What exactly is included with your web hosting plans (SSL, email, backups, domain options, etc.) and which plan is the best value?","chatbot.widget.suggestions.salesWebHostingOnlineStore.title":"Is web hosting enough for an online store?","chatbot.widget.suggestions.salesWebHostingOnlineStore.prompt":"Hi! I want to sell online. Is regular web hosting enough, and which plan should I choose to start?","chatbot.widget.suggestions.salesWebHostingTransfer.title":"I have a site elsewhere — can I transfer it?","chatbot.widget.suggestions.salesWebHostingTransfer.prompt":"Hi! I already have a website with another provider. Can you tell me how moving to Hostinger works and which hosting plan I should buy?","chatbot.widget.suggestions.salesBusinessEmailProfessional.title":"I want a professional email address","chatbot.widget.suggestions.salesBusinessEmailProfessional.prompt":"Hi! I want an email like name{'@'}mydomain.com. Which Business Email plan should I choose and how do I set it up?","chatbot.widget.suggestions.salesBusinessEmailUseDomain.title":"Can I use my domain for email?","chatbot.widget.suggestions.salesBusinessEmailUseDomain.prompt":"Hi! I already have a domain name. Can I connect it to Business Email, and what steps do I need to take?","chatbot.widget.suggestions.salesBusinessEmailForTeam.title":"Email for my team","chatbot.widget.suggestions.salesBusinessEmailForTeam.prompt":"Hi! I need email accounts for a small team. How do I choose the right plan and how many mailboxes do I need?","chatbot.widget.suggestions.salesBusinessEmailGmailOutlook.title":"Can I use your email in Gmail or Outlook?","chatbot.widget.suggestions.salesBusinessEmailGmailOutlook.prompt":"Hi! If I buy Business Email, can I use it in Gmail or Outlook apps? How would I log in and set it up?","chatbot.widget.suggestions.salesBusinessEmailMigrate.title":"Can I move my existing email?","chatbot.widget.suggestions.salesBusinessEmailMigrate.prompt":"Hi! I already have email with another provider. Can you explain how migration works and which plan I should buy?","chatbot.widget.suggestions.salesBusinessEmailWhatsIncluded.title":"What's included in Business Email?","chatbot.widget.suggestions.salesBusinessEmailWhatsIncluded.prompt":"Hi! What features are included in your Business Email plans (storage, security, spam protection, etc.) and which plan is best value?","chatbot.widget.suggestions.salesVpsDoINeed.title":"Do I need VPS hosting?","chatbot.widget.suggestions.salesVpsDoINeed.prompt":"Hi! I'm looking at VPS hosting but I'm not sure if it's the right choice for me. Can you ask a few questions about my project and recommend the best option?","chatbot.widget.suggestions.salesVpsChoosePlan.title":"Help me choose a VPS plan","chatbot.widget.suggestions.salesVpsChoosePlan.prompt":"Hi! I want to buy a VPS but I don't know which plan to pick. Can you recommend the right VPS plan based on what I'm building and my budget?","chatbot.widget.suggestions.salesVpsVsWebHosting.title":"VPS vs Web Hosting","chatbot.widget.suggestions.salesVpsVsWebHosting.prompt":"Hi! Should I choose VPS hosting or regular web hosting for my website/project? Please compare them and tell me what you recommend for my situation.","chatbot.widget.suggestions.salesVpsTooTechnical.title":"Is VPS too technical for me?","chatbot.widget.suggestions.salesVpsTooTechnical.prompt":"Hi! I'm interested in VPS. How does management work, and what help or guidance do you provide?","chatbot.widget.suggestions.salesWordpressChoosePlan.title":"Which WordPress plan should I buy?","chatbot.widget.suggestions.salesWordpressChoosePlan.prompt":"Hi! I want to build a WordPress website. Can you recommend the right WordPress hosting plan after figuring out my needs and budget?","chatbot.widget.suggestions.salesWordpressVsWebHosting.title":"WordPress hosting vs web hosting","chatbot.widget.suggestions.salesWordpressVsWebHosting.prompt":"Hi! What's the difference between WordPress hosting and regular web hosting, and which one should I choose?","chatbot.widget.suggestions.salesWordpressSetup.title":"Can you help me set up WordPress?","chatbot.widget.suggestions.salesWordpressSetup.prompt":"Hi! I'm new to WordPress. Can you guide me on how to get started and tell me which plan I should buy?","chatbot.widget.suggestions.salesWordpressSpeed.title":"Will my WordPress site be fast?","chatbot.widget.suggestions.salesWordpressSpeed.prompt":"Hi! Speed matters to me. Which WordPress hosting plan should I choose to keep my site fast, and what features help with performance?","chatbot.widget.suggestions.salesWordpressTransfer.title":"Can I transfer my WordPress site to Hostinger?","chatbot.widget.suggestions.salesWordpressTransfer.prompt":"Hi! I already have a WordPress site with another provider. Can you explain the migration options and recommend the best plan for moving?","chatbot.widget.suggestions.salesWebsiteBuilderOrWordpress.title":"Should I choose Builder or WordPress?","chatbot.widget.suggestions.salesWebsiteBuilderOrWordpress.prompt":"Hi! I want to build a website but I'm not sure if I should use Website Builder or WordPress. Can you help me choose based on what I'm trying to make?","chatbot.widget.suggestions.salesWebsiteBuilderChoosePlan.title":"Help me pick a Website Builder plan","chatbot.widget.suggestions.salesWebsiteBuilderChoosePlan.prompt":"Hi! I want to use your Website Builder. Can you recommend the right plan for my site and explain the differences between the options?","chatbot.widget.suggestions.salesWebsiteBuilderOnlineStore.title":"Can I build an online store with Website Builder?","chatbot.widget.suggestions.salesWebsiteBuilderOnlineStore.prompt":"Hi! I want to sell products or services online. Can I do that with your Website Builder, and which plan do I need?","chatbot.widget.suggestions.salesWebsiteBuilderWhatsIncluded.title":"What do I get with the plan?","chatbot.widget.suggestions.salesWebsiteBuilderWhatsIncluded.prompt":"Hi! Before I buy, can you explain what's included in the Website Builder plan (features, limits, and anything extra I might need)?","chatbot.widget.suggestions.salesWebsiteBuilderProfessional.title":"I want a site that looks professional","chatbot.widget.suggestions.salesWebsiteBuilderProfessional.prompt":"Hi! I want a professional-looking website but don't know what layout or sections I need. Can you guide me on what to include and recommend the best plan to start?","chatbot.widget.suggestion.category.salesN8n":"n8n","chatbot.widget.suggestion.category.salesOpenclaw":"OpenClaw","chatbot.widget.suggestion.category.salesHorizons":"Horizons","chatbot.widget.suggestion.category.salesWebHosting":"Web Hosting","chatbot.widget.suggestion.category.salesBusinessEmail":"Business Email","chatbot.widget.suggestion.category.salesVpsHosting":"VPS Hosting","chatbot.widget.suggestion.category.salesWordpressHosting":"WordPress Hosting","chatbot.widget.suggestion.category.salesWebsiteBuilder":"Website Builder","chatbot.widget.requestHumanAssistance":"Request human assistance","chatbot.widget.voice.record.input.placeholder":"Recording your message...","chatbot.widget.agentRedirect.badge":"AI Agent","chatbot.widget.agentRedirect.tryButton":"Try {agentName}","chatbot.widget.agentRedirect.scout.description":"Scout can run a comprehensive SEO audit of your website, analyze your keyword rankings, identify technical issues, and create an actionable optimization plan — going much deeper than I can in a chat.","chatbot.widget.agentRedirect.north.description":"North can analyze your business model, evaluate market opportunities, construct detailed financial forecasts, and develop a strategic growth roadmap — going much deeper than I can in a chat.","chatbot.widget.agentRedirect.quill.description":"Quill can draft compelling blog posts, develop engaging brand narratives, write long-form articles, and refine your overall content strategy — going much deeper than I can in a chat.","chatbot.widget.agentRedirect.buzz.description":"Buzz can design multi-channel marketing campaigns, allocate your advertising budget, map out promotional calendars, and define your target audience segments — going much deeper than I can in a chat.","chatbot.widget.agentRedirect.shield.description":"Shield can review your business contracts, highlight potential compliance risks, outline standard legal frameworks, and help draft basic terms of service — going much deeper than I can in a chat.","chatbot.widget.agentRedirect.ally.description":"Ally can craft empathetic customer service responses, develop comprehensive FAQ documentation, design email onboarding sequences, and standardize your support tone — going much deeper than I can in a chat.","chatbot.widget.agentRedirect.arrow.description":"Arrow can build targeted prospect lists, write personalized cold email sequences, formulate objection-handling scripts, and design your sales funnel — going much deeper than I can in a chat.","chatbot.widget.startScreen.titleNoName":"Hello 👋","chatbot.widget.a11y.suggestions.list":"Suggested replies","chatbot.widget.a11y.suggestions.categories":"Suggestion categories","chatbot.widget.a11y.suggestions.listWithCategory":"Suggested messages for {category}","chatbot.widget.costLimit.banner.title":"You’ve reached your weekly Kodee limit.","chatbot.widget.costLimit.banner.description":"You can still chat with Kodee using a lighter version until {resetDate}","chatbot.widget.costLimit.banner.cta":"Upgrade","chatbot.widget.costLimit.modal.title":"Higher limits are coming","chatbot.widget.costLimit.modal.description":"We’re working on upgrade options to increase your weekly Kodee limit. You’ll be able to get higher limits and improved performance soon.","chatbot.widget.costLimit.modal.cancel":"Cancel","chatbot.widget.costLimit.modal.notifyMe":"Notify me","chatbot.widget.agentResponse.viewWork":"View {agentName}'s work","chatbot.widget.agentsTopUp.title":"You've run out of Agent credits","chatbot.widget.agentsTopUp.description":"Top up your Agent credits or upgrade your plan to keep going.","chatbot.widget.agentsTopUp.cta":"Top up credits","chatbot.widget.agentInProgress.status":"{agentName} is working on it…","chatbot.widget.banner.message.generic":"Some Hostinger services may be experiencing issues. Our team is working to restore normal functionality.","chatbot.widget.v2.header.title":"Kodee","chatbot.widget.v2.header.newChat":"Start new chat","chatbot.widget.v2.header.close":"Close chat","chatbot.widget.v2.modal.close":"Close","chatbot.widget.v2.welcome.heading":"What are you looking to create?","chatbot.widget.v2.welcome.intro":"I'm {name} — I'll match you with the right Hostinger plan in under 2 minutes.","chatbot.widget.v2.actions.orExplore":"or explore","chatbot.widget.v2.actions.buildWebsite.title":"Build my website","chatbot.widget.v2.actions.buildWebsite.subtitle":"Most popular takes 2 min","chatbot.widget.v2.actions.webHosting.title":"Get web hosting","chatbot.widget.v2.actions.webHosting.prompt":"Help me choose webhosting plan that is right for me","chatbot.widget.v2.actions.findDomain.title":"Find a domain","chatbot.widget.v2.actions.findDomain.prompt":"Help me find a domain","chatbot.widget.v2.actions.businessEmail.title":"Business email","chatbot.widget.v2.actions.businessEmail.prompt":"Help me purchase an email plan for my business","chatbot.widget.v2.input.placeholder":"Message Kodee…","chatbot.widget.v2.input.sendButton":"Send message","chatbot.widget.v2.feedback.goodResponse":"Good response","chatbot.widget.v2.feedback.badResponse":"Bad response","chatbot.widget.v2.feedback.leaveComment":"Leave comment","chatbot.widget.v2.feedback.editComment":"Edit comment","chatbot.widget.v2.comment.placeholderPositive":"What worked well?","chatbot.widget.v2.comment.placeholderNegative":"What could be better?","chatbot.widget.v2.comment.cancel":"Cancel","chatbot.widget.v2.comment.send":"Send","chatbot.widget.v2.restart.title":"Start a new chat?","chatbot.widget.v2.restart.description":"This will clear your current conversation with Kodee, including anything you've shared. You can't undo this.","chatbot.widget.v2.restart.keepChatting":"Keep chatting","chatbot.widget.v2.restart.confirm":"Start new chat","chatbot.widget.v2.flow.intro":"What are we building today? Pick a category or describe your own.","chatbot.widget.v2.flow.charCounter":"{remaining} to go","chatbot.widget.v2.flow.category.onlineStore.title":"Online Store","chatbot.widget.v2.flow.category.onlineStore.subtitle":"Sell products online","chatbot.widget.v2.flow.category.onlineStore.promptLabel":"an Online Store","chatbot.widget.v2.flow.category.onlineStore.inputTitle":"Tell me about your store","chatbot.widget.v2.flow.category.onlineStore.inputSubtitle":"A few words about what you sell and the vibe you want.","chatbot.widget.v2.flow.category.onlineStore.inputPlaceholder":"e.g. 'Bloom Cafe — cozy coffee shop, warm earth tones, minimal.'","chatbot.widget.v2.flow.category.onlineStore.submitLabel":"Bring my store to life","chatbot.widget.v2.flow.category.portfolio.title":"Portfolio / Blog","chatbot.widget.v2.flow.category.portfolio.subtitle":"Showcase your work","chatbot.widget.v2.flow.category.portfolio.promptLabel":"a Portfolio / Blog","chatbot.widget.v2.flow.category.portfolio.inputTitle":"Tell me about your portfolio","chatbot.widget.v2.flow.category.portfolio.inputSubtitle":"What do you want to showcase and who is it for?","chatbot.widget.v2.flow.category.portfolio.inputPlaceholder":"e.g. 'Freelance photographer — moody editorial style, dark theme.'","chatbot.widget.v2.flow.category.portfolio.submitLabel":"Bring my vision to life","chatbot.widget.v2.flow.category.business.title":"Business Site","chatbot.widget.v2.flow.category.business.subtitle":"Establish your brand","chatbot.widget.v2.flow.category.business.promptLabel":"a Business Site","chatbot.widget.v2.flow.category.business.inputTitle":"Tell me about your business","chatbot.widget.v2.flow.category.business.inputSubtitle":"What you do, who you serve, and the feel you want.","chatbot.widget.v2.flow.category.business.inputPlaceholder":"e.g. 'Family-run plumbing service — trustworthy, local, simple.'","chatbot.widget.v2.flow.category.business.submitLabel":"Bring my brand to life","chatbot.widget.v2.flow.category.other.title":"Something Else","chatbot.widget.v2.flow.category.other.subtitle":"Tell us what you need","chatbot.widget.v2.flow.category.other.promptLabel":"something custom","chatbot.widget.v2.flow.category.other.inputTitle":"Tell me about your idea","chatbot.widget.v2.flow.category.other.inputSubtitle":"Describe what you have in mind and I will take it from there.","chatbot.widget.v2.flow.category.other.inputPlaceholder":"e.g. 'A booking page for my yoga classes with a calm, airy feel.'","chatbot.widget.v2.flow.category.other.submitLabel":"Bring my idea to life","chatbot.widget.v2.visual.plan.bestMatch":"Best match","chatbot.widget.v2.visual.plan.pricePerMonth":"/month","chatbot.widget.v2.visual.preview.alt":"Preview of your website","chatbot.widget.v2.visual.preview.accept":"Love it, continue","chatbot.widget.v2.visual.preview.acceptPrompt":"Man tai patinka, tęskime","chatbot.widget.outOfScopeDescriptionForm.descriptionLabel":"Add a description","chatbot.widget.outOfScopeDescriptionForm.descriptionPlaceholder":"e.g. I can't access my control panel after the password reset","chatbot.widget.outOfScopeDescriptionForm.submit":"Submit details","chatbot.widget.outOfScopeHandoffChoice.intro":"Form has been successfully submitted. Thank you for filling in the details.","chatbot.widget.outOfScopeHandoffChoice.outro":"Before we queue a specialist. I can resolve the issue and save you the wait.","chatbot.widget.outOfScopeHandoffChoice.goToHuman":"Go to human","chatbot.widget.outOfScopeHandoffChoice.continueWithKodee":"Continue with Kodee","chatbot.widget.outOfScopeHandoffChoice.handoffMessage":"I want to continue with a human","chatbot.widget.outOfScopeHandoffChoice.kodeeContinueReply":"Thank you for choosing to continue with me, how can I help you further?","chatbot.widget.outOfScopeDescriptionForm.minCharsHint":"Please add at least {count} characters ({current}/{count}).","chatbot.widget.code.block.copy":"Copy","chatbot.widget.code.block.copied":"Copied"};export{t as default}; /*! * Dialogs Manager v4.9.3 * https://github.com/kobizz/dialogs-manager * * Copyright Kobi Zaltzberg * Released under the MIT license * https://github.com/kobizz/dialogs-manager/blob/master/LICENSE.txt */ (function($, global) { 'use strict'; /* * Dialog Manager */ var DialogsManager = { widgetsTypes: {}, createWidgetType: function(typeName, properties, Parent) { if (!Parent) { Parent = this.Widget; } var WidgetType = function() { Parent.apply(this, arguments); }; var prototype = WidgetType.prototype = new Parent(typeName); prototype.types = prototype.types.concat([typeName]); $.extend(prototype, properties); prototype.constructor = WidgetType; WidgetType.extend = function(typeName, properties) { return DialogsManager.createWidgetType(typeName, properties, WidgetType); }; return WidgetType; }, addWidgetType: function(typeName, properties, Parent) { if (properties && properties.prototype instanceof this.Widget) { return this.widgetsTypes[typeName] = properties; } return this.widgetsTypes[typeName] = this.createWidgetType(typeName, properties, Parent); }, getWidgetType: function(widgetType) { return this.widgetsTypes[widgetType]; } }; /* * Dialog Manager instances constructor */ DialogsManager.Instance = function() { var self = this, elements = {}, settings = {}; var initElements = function() { elements.body = $('body'); }; var initSettings = function(options) { var defaultSettings = { classPrefix: 'dialog', effects: { show: 'fadeIn', hide: 'fadeOut' } }; $.extend(settings, defaultSettings, options); }; this.createWidget = function(widgetType, properties) { var WidgetTypeConstructor = DialogsManager.getWidgetType(widgetType), widget = new WidgetTypeConstructor(widgetType); properties = properties || {}; widget.init(self, properties); return widget; }; this.getSettings = function(property) { if (property) { return settings[property]; } return Object.create(settings); }; this.maybeLoadAssets = async function () { const isFrontend = !! window.elementorFrontend?.utils?.assetsLoader; if ( ! isFrontend ) { return; } try { await elementorFrontend.utils.assetsLoader.load( 'style', 'dialog' ); } catch ( error ) { console.error( 'Failed to load assets:', error ); } }; this.init = function (settings) { this.maybeLoadAssets(); initSettings(settings); initElements(); return self; }; self.init(); }; /* * Widget types constructor */ DialogsManager.Widget = function(widgetName) { var self = this, settings = {}, events = {}, elements = {}, hideTimeOut = 0, baseClosureMethods = ['refreshPosition']; var bindEvents = function() { var windows = [elements.window]; if (elements.iframe) { windows.push(jQuery(elements.iframe[0].contentWindow)); } windows.forEach(function(window) { if (settings.hide.onEscKeyPress) { window.on('keyup', onWindowKeyUp); } if (settings.hide.onOutsideClick) { window[0].addEventListener('click', hideOnOutsideClick, true); } if (settings.hide.onOutsideContextMenu) { window[0].addEventListener('contextmenu', hideOnOutsideClick, true); } if (settings.position.autoRefresh) { window.on('resize', self.refreshPosition); } }); if (settings.hide.onClick || settings.hide.onBackgroundClick) { elements.widget.on('click', hideOnClick); } }; var callEffect = function(intent, params) { var effect = settings.effects[intent], $widget = elements.widget; if ('function' === typeof effect) { effect.apply($widget, params); } else { if ($widget[effect]) { $widget[effect].apply($widget, params); } else { throw 'Reference Error: The effect ' + effect + ' not found'; } } }; var ensureClosureMethods = function() { var closureMethodsNames = baseClosureMethods.concat(self.getClosureMethods()); $.each(closureMethodsNames, function() { var methodName = this, oldMethod = self[methodName]; self[methodName] = function() { oldMethod.apply(self, arguments); }; }); }; var fixIframePosition = function(position) { if (! position.my) { return; } var horizontalOffsetRegex = /left|right/, extraOffsetRegex = /([+-]\d+)?$/, iframeOffset = elements.iframe.offset(), iframeWindow = elements.iframe[0].contentWindow, myParts = position.my.split(' '), fixedParts = []; if (myParts.length === 1) { if (horizontalOffsetRegex.test(myParts[0])) { myParts.push('center'); } else { myParts.unshift('center'); } } myParts.forEach(function(part, index) { var fixedPart = part.replace(extraOffsetRegex, function(partOffset) { partOffset = +partOffset || 0; if (! index) { partOffset += iframeOffset.left - iframeWindow.scrollX; } else { partOffset += iframeOffset.top - iframeWindow.scrollY; } if (partOffset >= 0) { partOffset = '+' + partOffset; } return partOffset; }); fixedParts.push(fixedPart); }); position.my = fixedParts.join(' '); }; var hideOnClick = function(event) { if (isContextMenuClickEvent(event)) { return; } if (settings.hide.onClick) { if ($(event.target).closest(settings.selectors.preventClose).length) { return; } } else if (event.target !== this) { return; } self.hide(); }; var isIgnoredTarget = function(event) { if (! settings.hide.ignore) { return false; } return !! $(event.target).closest(settings.hide.ignore).length; }; var hideOnOutsideClick = function(event) { if (isContextMenuClickEvent(event) || $(event.target).closest(elements.widget).length || isIgnoredTarget(event)) { return; } self.hide(); }; var initElements = function() { self.addElement('widget'); self.addElement('header'); self.addElement('message'); self.addElement('window', window); self.addElement('body', document.body); self.addElement('container', settings.container); if (settings.iframe) { self.addElement('iframe', settings.iframe); } if (settings.closeButton) { if ( settings.closeButtonClass ) { // Backwards compatibility settings.closeButtonOptions.iconClass = settings.closeButtonClass; } const $button = $('', settings.closeButtonOptions.attributes), $buttonIcon = $(settings.closeButtonOptions.iconElement).addClass(settings.closeButtonOptions.iconClass); $button.append($buttonIcon); self.addElement('closeButton', $button); } var id = self.getSettings('id'); if (id) { self.setID(id); } var classes = []; $.each(self.types, function() { classes.push(settings.classes.globalPrefix + '-type-' + this); }); classes.push(self.getSettings('className')); elements.widget .addClass(classes.join(' ')) .attr({ 'aria-modal': true, 'role': 'document', 'tabindex': 0, }); }; var initSettings = function(parent, userSettings) { var parentSettings = $.extend(true, {}, parent.getSettings()); settings = { headerMessage: '', message: '', effects: parentSettings.effects, classes: { globalPrefix: parentSettings.classPrefix, prefix: parentSettings.classPrefix + '-' + widgetName, preventScroll: parentSettings.classPrefix + '-prevent-scroll', }, selectors: { preventClose: '.' + parentSettings.classPrefix + '-prevent-close', }, container: 'body', preventScroll: false, iframe: null, closeButton: false, closeButtonOptions: { iconClass: parentSettings.classPrefix + '-close-button-icon', attributes: { role: 'button', 'tabindex': 0, 'aria-label': 'Close', href: '#', }, iconElement: '', }, position: { element: 'widget', my: 'center', at: 'center', enable: true, autoRefresh: false, }, hide: { auto: false, autoDelay: 5000, onClick: false, onOutsideClick: true, onOutsideContextMenu: false, onBackgroundClick: true, onEscKeyPress: true, ignore: '', }, }; $.extend(true, settings, self.getDefaultSettings(), userSettings); initSettingsEvents(); }; var initSettingsEvents = function() { $.each(settings, function(settingKey) { var eventName = settingKey.match(/^on([A-Z].*)/); if (!eventName) { return; } eventName = eventName[1].charAt(0).toLowerCase() + eventName[1].slice(1); self.on(eventName, this); }); }; var isContextMenuClickEvent = function(event) { // Firefox fires `click` event on every `contextmenu` event. return event.type === 'click' && event.button === 2; }; var normalizeClassName = function(name) { return name.replace(/([a-z])([A-Z])/g, function() { return arguments[1] + '-' + arguments[2].toLowerCase(); }); }; var onWindowKeyUp = function(event) { var ESC_KEY = 27, keyCode = event.which; if (ESC_KEY === keyCode) { self.hide(); } }; var unbindEvents = function() { var windows = [elements.window]; if (elements.iframe) { windows.push(jQuery(elements.iframe[0].contentWindow)); } windows.forEach(function(window) { if (settings.hide.onEscKeyPress) { window.off('keyup', onWindowKeyUp); } if (settings.hide.onOutsideClick) { window[0].removeEventListener('click', hideOnOutsideClick, true); } if (settings.hide.onOutsideContextMenu) { window[0].removeEventListener('contextmenu', hideOnOutsideClick, true); } if (settings.position.autoRefresh) { window.off('resize', self.refreshPosition); } }); if (settings.hide.onClick || settings.hide.onBackgroundClick) { elements.widget.off('click', hideOnClick); } }; this.addElement = function(name, element, classes) { var $newElement = elements[name] = $(element || '
'), normalizedName = normalizeClassName(name); classes = classes ? classes + ' ' : ''; classes += settings.classes.globalPrefix + '-' + normalizedName; classes += ' ' + settings.classes.prefix + '-' + normalizedName; $newElement.addClass(classes); return $newElement; }; this.destroy = function() { unbindEvents(); elements.widget.remove(); self.trigger('destroy'); return self; }; this.getElements = function(item) { return item ? elements[item] : elements; }; this.getSettings = function(setting) { var copy = Object.create(settings); if (setting) { return copy[setting]; } return copy; }; this.hide = function() { if (! self.isVisible()) { return; } clearTimeout(hideTimeOut); callEffect('hide', arguments); unbindEvents(); if (settings.preventScroll) { self.getElements('body').removeClass(settings.classes.preventScroll); } self.trigger('hide'); return self; }; this.init = function(parent, properties) { if (!(parent instanceof DialogsManager.Instance)) { throw 'The ' + self.widgetName + ' must to be initialized from an instance of DialogsManager.Instance'; } ensureClosureMethods(); self.trigger('init', properties); initSettings(parent, properties); initElements(); self.buildWidget(); self.attachEvents(); self.trigger('ready'); return self; }; this.isVisible = function() { return elements.widget.is(':visible'); }; this.on = function(eventName, callback) { if ('object' === typeof eventName) { $.each(eventName, function(singleEventName) { self.on(singleEventName, this); }); return self; } var eventNames = eventName.split(' '); eventNames.forEach(function(singleEventName) { if (!events[singleEventName]) { events[singleEventName] = []; } events[singleEventName].push(callback); }); return self; }; this.off = function(eventName, callback) { if (! events[ eventName ]) { return self; } if (! callback) { delete events[eventName]; return self; } var callbackIndex = events[eventName].indexOf(callback); if (-1 !== callbackIndex) { events[eventName].splice(callbackIndex, 1); } return self; }; this.refreshPosition = function() { if (! settings.position.enable) { return; } var position = $.extend({}, settings.position); if (elements[position.of]) { position.of = elements[position.of]; } if (! position.of) { position.of = window; } if (settings.iframe) { fixIframePosition(position); } elements[position.element].position(position); }; this.setID = function(id) { elements.widget.attr('id', id); return self; }; this.setHeaderMessage = function(message) { self.getElements('header').html(message); return self; }; this.setMessage = function(message) { elements.message.html(message); return self; }; this.setSettings = function(key, value) { if (jQuery.isPlainObject(value)) { $.extend(true, settings[key], value); } else { settings[key] = value; } return self; }; this.show = function() { clearTimeout(hideTimeOut); elements.widget.appendTo(elements.container).hide(); callEffect('show', arguments); self.refreshPosition(); if (settings.hide.auto) { hideTimeOut = setTimeout(self.hide, settings.hide.autoDelay); } bindEvents(); if (settings.preventScroll) { self.getElements('body').addClass(settings.classes.preventScroll); } self.trigger('show'); return self; }; this.trigger = function(eventName, params) { var methodName = 'on' + eventName[0].toUpperCase() + eventName.slice(1); if (self[methodName]) { self[methodName](params); } var callbacks = events[eventName]; if (!callbacks) { return; } $.each(callbacks, function(index, callback) { callback.call(self, params); }); return self; }; }; DialogsManager.Widget.prototype.types = []; // Inheritable widget methods DialogsManager.Widget.prototype.buildWidget = function() { var elements = this.getElements(), settings = this.getSettings(); elements.widget.append(elements.header, elements.message); this.setHeaderMessage(settings.headerMessage); this.setMessage(settings.message); if (this.getSettings('closeButton')) { elements.widget.prepend(elements.closeButton); } }; DialogsManager.Widget.prototype.attachEvents = function() { var self = this; if (self.getSettings('closeButton')) { self.getElements('closeButton').on('click', function(event) { event.preventDefault(); self.hide(); }); } }; DialogsManager.Widget.prototype.getDefaultSettings = function() { return {}; }; DialogsManager.Widget.prototype.getClosureMethods = function() { return []; }; DialogsManager.Widget.prototype.onHide = function() { }; DialogsManager.Widget.prototype.onShow = function() { }; DialogsManager.Widget.prototype.onInit = function() { }; DialogsManager.Widget.prototype.onReady = function() { }; DialogsManager.widgetsTypes.simple = DialogsManager.Widget; DialogsManager.addWidgetType('buttons', { activeKeyUp: function(event) { var TAB_KEY = 9; if (event.which === TAB_KEY) { event.preventDefault(); } if (this.hotKeys[event.which]) { this.hotKeys[event.which](this); } }, activeKeyDown: function(event) { if (!this.focusedButton) { return; } var TAB_KEY = 9; if (event.which === TAB_KEY) { event.preventDefault(); var currentButtonIndex = this.focusedButton.index(), nextButtonIndex; if (event.shiftKey) { nextButtonIndex = currentButtonIndex - 1; if (nextButtonIndex < 0) { nextButtonIndex = this.buttons.length - 1; } } else { nextButtonIndex = currentButtonIndex + 1; if (nextButtonIndex >= this.buttons.length) { nextButtonIndex = 0; } } this.focusedButton = this.buttons[nextButtonIndex].trigger('focus'); } }, addButton: function(options) { var self = this, settings = self.getSettings(), buttonSettings = jQuery.extend(settings.button, options); var classes = options.classes ? options.classes + ' ' : ''; classes += settings.classes.globalPrefix + '-button'; var $button = self.addElement(options.name, $('<' + buttonSettings.tag + '>').html(options.text), classes); self.buttons.push($button); var buttonFn = function() { if (settings.hide.onButtonClick) { self.hide(); } if ('function' === typeof options.callback) { options.callback.call(this, self); } }; $button.on('click', buttonFn); if (options.hotKey) { this.hotKeys[options.hotKey] = buttonFn; } this.getElements('buttonsWrapper').append($button); if (options.focus) { this.focusedButton = $button; } return self; }, bindHotKeys: function() { this.getElements('window').on({ keyup: this.activeKeyUp, keydown: this.activeKeyDown }); }, buildWidget: function() { DialogsManager.Widget.prototype.buildWidget.apply(this, arguments); var $buttonsWrapper = this.addElement('buttonsWrapper'); this.getElements('widget').append($buttonsWrapper); }, getClosureMethods: function() { return [ 'activeKeyUp', 'activeKeyDown' ]; }, getDefaultSettings: function() { return { hide: { onButtonClick: true }, button: { tag: 'button' } }; }, onHide: function() { this.unbindHotKeys(); }, onInit: function() { this.buttons = []; this.hotKeys = {}; this.focusedButton = null; }, onShow: function() { this.bindHotKeys(); if (!this.focusedButton) { this.focusedButton = this.buttons[0]; } if (this.focusedButton) { this.focusedButton.trigger('focus'); } }, unbindHotKeys: function() { this.getElements('window').off({ keyup: this.activeKeyUp, keydown: this.activeKeyDown }); } }); DialogsManager.addWidgetType('lightbox', DialogsManager.getWidgetType('buttons').extend('lightbox', { getDefaultSettings: function() { var settings = DialogsManager.getWidgetType('buttons').prototype.getDefaultSettings.apply(this, arguments); return $.extend(true, settings, { contentWidth: 'auto', contentHeight: 'auto', position: { element: 'widgetContent', of: 'widget', autoRefresh: true } }); }, buildWidget: function() { DialogsManager.getWidgetType('buttons').prototype.buildWidget.apply(this, arguments); var $widgetContent = this.addElement('widgetContent'), elements = this.getElements(); $widgetContent.append(elements.header, elements.message, elements.buttonsWrapper); elements.widget.html($widgetContent); if (elements.closeButton) { $widgetContent.prepend(elements.closeButton); } }, onReady: function() { var elements = this.getElements(), settings = this.getSettings(); if ('auto' !== settings.contentWidth) { elements.message.width(settings.contentWidth); } if ('auto' !== settings.contentHeight) { elements.message.height(settings.contentHeight); } } })); DialogsManager.addWidgetType('confirm', DialogsManager.getWidgetType('lightbox').extend('confirm', { onReady: function() { DialogsManager.getWidgetType('lightbox').prototype.onReady.apply(this, arguments); var strings = this.getSettings('strings'), isDefaultCancel = this.getSettings('defaultOption') === 'cancel'; this.addButton({ name: 'cancel', text: strings.cancel, callback: function(widget) { widget.trigger('cancel'); }, focus: isDefaultCancel }); this.addButton({ name: 'ok', text: strings.confirm, callback: function(widget) { widget.trigger('confirm'); }, focus: !isDefaultCancel }); }, getDefaultSettings: function() { var settings = DialogsManager.getWidgetType('lightbox').prototype.getDefaultSettings.apply(this, arguments); settings.strings = { confirm: 'OK', cancel: 'Cancel' }; settings.defaultOption = 'cancel'; return settings; } })); DialogsManager.addWidgetType('alert', DialogsManager.getWidgetType('lightbox').extend('alert', { onReady: function() { DialogsManager.getWidgetType('lightbox').prototype.onReady.apply(this, arguments); var strings = this.getSettings('strings'); this.addButton({ name: 'ok', text: strings.confirm, callback: function(widget) { widget.trigger('confirm'); } }); }, getDefaultSettings: function() { var settings = DialogsManager.getWidgetType('lightbox').prototype.getDefaultSettings.apply(this, arguments); settings.strings = { confirm: 'OK' }; return settings; } })); // Exporting the DialogsManager variable to global global.DialogsManager = DialogsManager; })( typeof jQuery !== 'undefined' ? jQuery : typeof require === 'function' && require('jquery'), (typeof module !== 'undefined' && typeof module.exports !== 'undefined') ? module.exports : window );