{"version":1,"pages":[{"id":"mtE6XbI9evJr7I6DJYb4","title":"Introduction","pathname":"/","siteSpaceId":"sitesp_xs5Ka","description":""},{"id":"fQ0zj1043YSkCXPLtM2E","title":"Features","pathname":"/features-summary","siteSpaceId":"sitesp_xs5Ka","emoji":"1f3c6","description":""},{"id":"KrQpsp3UF72klzDDyh0P","title":"Welcome to Klai Studio!","pathname":"/getting-started/welcome-to-fm-betterforms","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"}]},{"id":"Tjyj50zSSfaxS8rR5n8t","title":"Overview","pathname":"/getting-started/system-overview","siteSpaceId":"sitesp_xs5Ka","description":"Klai Studio was purpose built to allow FileMaker developers access to a full powerful web technology stack.","breadcrumbs":[{"label":"Getting Started"}]},{"id":"cpC8QAzbYRxoBgB5bamK","title":"Your First App","pathname":"/getting-started/ide-quick-tour","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"}]},{"id":"jaczochxwz2CtcAYNaZF","title":"1. Setting Up Your Foundation","pathname":"/getting-started/ide-quick-tour/setup","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"}]},{"id":"dSeHM5JT53eD5ier2Ww5","title":"1.1 Configure FileMaker Server","pathname":"/getting-started/ide-quick-tour/setup/configure-fm-server","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"1. Setting Up Your Foundation"}]},{"id":"oYSZ3eeKEs1T6u0CkjPE","title":"1.2 Install BetterForms Helper File","pathname":"/getting-started/ide-quick-tour/setup/install-bf-helper-file","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"1. Setting Up Your Foundation"}]},{"id":"6o1skvT3SbWooVvgb7PP","title":"1.3 Add Your Server to BetterForms (IDE)","pathname":"/getting-started/ide-quick-tour/setup/add-server-to-bf","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"1. Setting Up Your Foundation"}]},{"id":"YJeYrng0Gr55A1ZaAirQ","title":"2. Building Your First Application","pathname":"/getting-started/ide-quick-tour/first-app","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"}]},{"id":"we2t1O7yj7JNb3hZ2hKm","title":"2.1 Create an App (Site) in the IDE","pathname":"/getting-started/ide-quick-tour/first-app/create-app","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"2. Building Your First Application"}]},{"id":"CigWnoWdV1M9hC5aixPv","title":"2.2 Create Your First Page (Intro to Page Builder)","pathname":"/getting-started/ide-quick-tour/first-app/create-page","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"2. Building Your First Application"}]},{"id":"JOOEqCXvvO7cGdeuPG50","title":"2.3 Understanding & Managing Environments (IDE)","pathname":"/getting-started/ide-quick-tour/first-app/environments","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"2. Building Your First Application"}]},{"id":"zuYpxivAUUNClmbRy2NB","title":"2.4 Adding Elements to Your Page","pathname":"/getting-started/ide-quick-tour/first-app/adding-elements","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"2. Building Your First Application"}]},{"id":"O3ogc1TpUAs3Cj2OI3DF","title":"2.5 Understanding Validation","pathname":"/getting-started/ide-quick-tour/first-app/understanding-validation","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"2. Building Your First Application"}]},{"id":"c1uyyeVNoGbKaduyRjHj","title":"2.6 Adding Actions to Your Page","pathname":"/getting-started/ide-quick-tour/first-app/adding-actions-to-your-page","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"2. Building Your First Application"}]},{"id":"VJRhuk1yD4ez10e2swz4","title":"2.7 Creating Your First List View","pathname":"/getting-started/ide-quick-tour/first-app/creating-your-first-list-view","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"2. Building Your First Application"}]},{"id":"Mh8BknNOz8v1Ske9LGx2","title":"2.8 Understanding Page Data Flow","pathname":"/getting-started/ide-quick-tour/first-app/page-data-flow","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"2. Building Your First Application"}]},{"id":"OPaabHH2Ps817aNzcVhu","title":"2.9 Creating Your First Hook","pathname":"/getting-started/ide-quick-tour/first-app/creating-your-first-hook","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"2. Building Your First Application"}]},{"id":"eljWtGDo0DCKdkrpI3nd","title":"2.10 Working with Data Tables","pathname":"/getting-started/ide-quick-tour/first-app/working-with-data-tables","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"2. Building Your First Application"}]},{"id":"7R1yGLuoyjTNK27NPs7o","title":"3. Understanding Core BetterForms Concepts","pathname":"/getting-started/ide-quick-tour/3.-understanding-core-betterforms-concepts","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"}]},{"id":"GvuFV5zUelSVtKDtUUb4","title":"3.1 Introduction to Hooks (and where to find them in the IDE)","pathname":"/getting-started/ide-quick-tour/3.-understanding-core-betterforms-concepts/3.1-introduction-to-hooks-and-where-to-find-them-in-the-ide","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"3. Understanding Core BetterForms Concepts"}]},{"id":"RtCoF6mkiwwUFQxZbzfE","title":"3.2 Running Your First Hook (Practical Example)","pathname":"/getting-started/ide-quick-tour/3.-understanding-core-betterforms-concepts/3.2-running-your-first-hook-practical-example","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"3. Understanding Core BetterForms Concepts"}]},{"id":"6lwiW7Xm5lrju35FxGQG","title":"3.3 Introduction to Actions & Action Scripts (IDE Context)","pathname":"/getting-started/ide-quick-tour/3.-understanding-core-betterforms-concepts/3.3-introduction-to-actions-and-action-scripts-ide-context","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"3. Understanding Core BetterForms Concepts"}]},{"id":"wonm4wEbrg9LgSe4T1p8","title":"3.4 Understanding the Data Model (and Page Data Model UI)","pathname":"/getting-started/ide-quick-tour/3.-understanding-core-betterforms-concepts/3.4-understanding-the-data-model-and-page-data-model-ui","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"3. Understanding Core BetterForms Concepts"}]},{"id":"H5OlKxM2IejSPB2oAcAx","title":"4. Common Customizations & Expanding Your App","pathname":"/getting-started/ide-quick-tour/4.-common-customizations-and-expanding-your-app","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"}]},{"id":"DbzhXahzoeqrUdVvhBhl","title":"4.1 Adding & Configuring Buttons (Page Builder)","pathname":"/getting-started/ide-quick-tour/4.-common-customizations-and-expanding-your-app/4.1-adding-and-configuring-buttons-page-builder","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"4. Common Customizations & Expanding Your App"}]},{"id":"03tm4MXbJpsRR2R6n9Fu","title":"4.2 Implementing Page Navigation (Actions & Site Navigation UI)","pathname":"/getting-started/ide-quick-tour/4.-common-customizations-and-expanding-your-app/4.2-implementing-page-navigation-actions-and-site-navigation-ui","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"4. Common Customizations & Expanding Your App"}]},{"id":"NQABfUCwTkDstobVFjVg","title":"4.3 Displaying Data in Tables (Page Builder & Element Config)","pathname":"/getting-started/ide-quick-tour/4.-common-customizations-and-expanding-your-app/4.3-displaying-data-in-tables-page-builder-and-element-config","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"4. Common Customizations & Expanding Your App"}]},{"id":"pQUiRXUSegNsdRxT9xbA","title":"4.4 Basic App Styling (Site Styling UI)","pathname":"/getting-started/ide-quick-tour/4.-common-customizations-and-expanding-your-app/4.4-basic-app-styling-site-styling-ui","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"4. Common Customizations & Expanding Your App"}]},{"id":"v5VCEcXRCN5G7VIVAIi4","title":"5. Mastering the BetterForms Environment & Advancing Your Skills","pathname":"/getting-started/ide-quick-tour/environment","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"}]},{"id":"QP6Iszwe0DTvhw9LkGxO","title":"5.1 Understanding & Managing Environments (In-Depth)","pathname":"/getting-started/ide-quick-tour/environment/managing-environments-deep-dive","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"5. Mastering the BetterForms Environment & Advancing Your Skills"}]},{"id":"6ppsoL2QljQVtElu9W7G","title":"5.2 Deep Dive: Page Configuration & Settings","pathname":"/getting-started/ide-quick-tour/environment/pages-deep-dive","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"5. Mastering the BetterForms Environment & Advancing Your Skills"}]},{"id":"zj9Z7CoejAFOWQMlO08E","title":"Navigating the Page Builder Interface","pathname":"/getting-started/ide-quick-tour/environment/pages-deep-dive/page-builder-ui","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"5. Mastering the BetterForms Environment & Advancing Your Skills"},{"label":"5.2 Deep Dive: Page Configuration & Settings"}]},{"id":"8XFkxygpyYFEGqEreXns","title":"Working with Page-Level Action Scripts","pathname":"/getting-started/ide-quick-tour/environment/pages-deep-dive/page-action-scripts","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"5. Mastering the BetterForms Environment & Advancing Your Skills"},{"label":"5.2 Deep Dive: Page Configuration & Settings"}]},{"id":"TS1Q6YhW7QbHGyuf2fnQ","title":"Configuring the Page Data Model","pathname":"/getting-started/ide-quick-tour/environment/pages-deep-dive/page-data-model-config","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"5. Mastering the BetterForms Environment & Advancing Your Skills"},{"label":"5.2 Deep Dive: Page Configuration & Settings"}]},{"id":"UYodlV0PElzm4H7IUlaF","title":"Page Integration Settings Explained","pathname":"/getting-started/ide-quick-tour/environment/pages-deep-dive/page-integration-settings","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"5. Mastering the BetterForms Environment & Advancing Your Skills"},{"label":"5.2 Deep Dive: Page Configuration & Settings"}]},{"id":"BhfEn6GRkycyIl4rpQh7","title":"Managing Page Info & Other Settings","pathname":"/getting-started/ide-quick-tour/environment/pages-deep-dive/page-info-misc","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"5. Mastering the BetterForms Environment & Advancing Your Skills"},{"label":"5.2 Deep Dive: Page Configuration & Settings"}]},{"id":"Uao5K4ZK6YiHpOq2T6Q3","title":"5.3 Working with Global Scripts","pathname":"/getting-started/ide-quick-tour/environment/global-scripts","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"5. Mastering the BetterForms Environment & Advancing Your Skills"}]},{"id":"cbCCxVyIIhJ37eIYk9wj","title":"5.4 Managing App (Site) Settings & Navigation","pathname":"/getting-started/ide-quick-tour/environment/app-settings-navigation","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"5. Mastering the BetterForms Environment & Advancing Your Skills"}]},{"id":"egodhrWgoXvBNR4bbeqD","title":"5.5 Exploring Further: What to Learn Next","pathname":"/getting-started/ide-quick-tour/environment/next-steps","siteSpaceId":"sitesp_xs5Ka","description":"You've got the basics down! Now it's time to start building out your app","breadcrumbs":[{"label":"Getting Started"},{"label":"Your First App"},{"label":"5. Mastering the BetterForms Environment & Advancing Your Skills"}]},{"id":"LqQSVrl4gXwpQ06cwRQP","title":"Support & Resources","pathname":"/getting-started/support-and-resources","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"}]},{"id":"Njef8hTJlFvdfXVaQscn","title":"Getting Help","pathname":"/getting-started/support-and-resources/support","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Support & Resources"}]},{"id":"HyEb7dsRG6B4DY8HYgRd","title":"Learning JSON","pathname":"/getting-started/support-and-resources/learning-json","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Support & Resources"}]},{"id":"yXYrRBVVwxFINPnb7dq3","title":"Site Settings","pathname":"/reference/site-settings","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"RQ1vNMBDGw0ScDhG20Py","title":"Navigation","pathname":"/reference/site-settings/navigationoverview","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Site Settings"}]},{"id":"AqExTpyOfLsu3VjqfDUO","title":"App Model","pathname":"/reference/site-settings/app-model","siteSpaceId":"sitesp_xs5Ka","description":"The App Model functions similar to a page's data model, except that it is accessible to every page in your site. You can also reference data in the App Model from elements that are not bound to a page","breadcrumbs":[{"label":"Reference"},{"label":"Site Settings"}]},{"id":"kH8Du5DM7RCBxucZohqF","title":"DOM Header Insertions","pathname":"/reference/site-settings/dom-header-insertions","siteSpaceId":"sitesp_xs5Ka","description":"This are is used to add third part code into your app.","breadcrumbs":[{"label":"Reference"},{"label":"Site Settings"}]},{"id":"URSwybHUI3wWkLOQd8Oj","title":"Global Named Actions","pathname":"/reference/site-settings/site-wide-named-actions","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Site Settings"}]},{"id":"5p9VkMav09RB0ckb6SbF","title":"Site Structure","pathname":"/reference/site-settings/site-structure","siteSpaceId":"sitesp_xs5Ka","description":"Klai Studio app's do have some small opinionated design elements. Understanding the undunderlying structure will help you to design better apps.","breadcrumbs":[{"label":"Reference"},{"label":"Site Settings"}]},{"id":"s5Qcgbirs3PXyHEHkpGA","title":"Slots / Code Injection","pathname":"/reference/site-settings/slots-code-injection","siteSpaceId":"sitesp_xs5Ka","description":"Reference for BetterForms slot names and where each slot renders in the app UI.","breadcrumbs":[{"label":"Reference"},{"label":"Site Settings"}]},{"id":"An9yO4aciEHbmPvxbqBf","title":"Page Settings","pathname":"/reference/form-settings","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"BZCRxxoyXg45AibiU40Z","title":"Data Model","pathname":"/reference/form-settings/data-model","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Settings"}]},{"id":"910LHCuXr27Ei3WdOoLN","title":"Card / Window Modals","pathname":"/reference/form-settings/card-modals","siteSpaceId":"sitesp_xs5Ka","description":"Card modals display other pages as their content.","breadcrumbs":[{"label":"Reference"},{"label":"Page Settings"}]},{"id":"bStdbSrTaE94aViHGGnM","title":"Validation","pathname":"/reference/form-settings/validationoverview","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Settings"}]},{"id":"szEeONtkaiowWUTdoEOS","title":"Custom Validators","pathname":"/reference/form-settings/validationoverview/clientside","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Settings"},{"label":"Validation"}]},{"id":"IyQUjHtk9aH2Kl09HEYN","title":"SEO Meta Tags","pathname":"/reference/form-settings/seo-meta-tags","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Settings"}]},{"id":"OO3UBrlMYeDsEUow8sCJ","title":"Misc Page Settings","pathname":"/reference/form-settings/misc-page-settings","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Settings"}]},{"id":"XQbydV3ndJENQr9kluCC","title":"Page Elements","pathname":"/reference/components-overview","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"sgX6oonpsG05ke5Jp3jF","title":"App Layout Overview","pathname":"/reference/components-overview/copy-of-site-structure","siteSpaceId":"sitesp_xs5Ka","description":"Quick pointer to the canonical BetterForms app layout overview.","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"}]},{"id":"2BHffPCsecVdu8jKFexa","title":"BetterForms Elements","pathname":"/reference/components-overview/betterforms-elements","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"}]},{"id":"COvpXGFG7XoUefX3tPl0","title":"Checkbox","pathname":"/reference/components-overview/betterforms-elements/checkbox","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"BetterForms Elements"}]},{"id":"7C52IB5nc2Uv2QNYhAWl","title":"Checklist","pathname":"/reference/components-overview/betterforms-elements/checklist","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"BetterForms Elements"}]},{"id":"qpCqK8TP5EdTfXzGgb5O","title":"Cleave.js Input Masking","pathname":"/reference/components-overview/betterforms-elements/cleave","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"BetterForms Elements"}]},{"id":"Sfa6dyjf4GBJir0iM3Np","title":"DateTime Picker","pathname":"/reference/components-overview/betterforms-elements/datetimepicker","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"BetterForms Elements"}]},{"id":"bwTkKaYOpuFblbJkhPFG","title":"Google Address Autocomplete","pathname":"/reference/components-overview/betterforms-elements/googleaddress","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"BetterForms Elements"}]},{"id":"BidoILk3jylP8ZmaMhCM","title":"Image Display Element","pathname":"/reference/components-overview/betterforms-elements/image","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"BetterForms Elements"}]},{"id":"rmZSaAEMS0F9woemUgm5","title":"Input","pathname":"/reference/components-overview/betterforms-elements/input","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"BetterForms Elements"}]},{"id":"99WPGpomdoCFHCfQ7CEB","title":"Masked Input","pathname":"/reference/components-overview/betterforms-elements/masked","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"BetterForms Elements"}]},{"id":"l8ycgkV7BNClYNt2EB79","title":"Range Slider (noUiSlider)","pathname":"/reference/components-overview/betterforms-elements/nouislider","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"BetterForms Elements"}]},{"id":"X90yBeaxhFZevQ0jxbAl","title":"Radios","pathname":"/reference/components-overview/betterforms-elements/radios","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"BetterForms Elements"}]},{"id":"ZSUA7erNs3plb9Aybuw1","title":"Select","pathname":"/reference/components-overview/betterforms-elements/select","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"BetterForms Elements"}]},{"id":"zRWAP6wccfoUXtFAJHKT","title":"Advanced Select (selectEx)","pathname":"/reference/components-overview/betterforms-elements/selectex","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"BetterForms Elements"}]},{"id":"E8zsCGTAP4VJjXpVaxZW","title":"TextArea","pathname":"/reference/components-overview/betterforms-elements/textarea","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"BetterForms Elements"}]},{"id":"IJA0oOOKkl189tg28Eet","title":"Common","pathname":"/reference/components-overview/common","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"}]},{"id":"iCBXKqayTOVF1M6oHS7v","title":"Input","pathname":"/reference/components-overview/common/input","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Common"}]},{"id":"6oC3OQttZzpNtmBAixe0","title":"Button","pathname":"/reference/components-overview/common/button","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Common"}]},{"id":"qg8mzfJbJlCF3xUsjolw","title":"Data Table","pathname":"/reference/components-overview/common/tables2","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Common"}]},{"id":"jsSh0JTRikqPweY1poRB","title":"HTML","pathname":"/reference/components-overview/common/html","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Common"}]},{"id":"sZUqdOz2XI0U3DStA4h4","title":"Grouping Elements","pathname":"/reference/components-overview/grouping-elements","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"}]},{"id":"rzGJSd9nE7mAZNUHLZj3","title":"Tabs","pathname":"/reference/components-overview/grouping-elements/tabs_form","siteSpaceId":"sitesp_xs5Ka","description":"Organize complex forms using a standard tab element","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Grouping Elements"}]},{"id":"kWmL0Ow7Ovhs04H2SDJc","title":"Panel","pathname":"/reference/components-overview/grouping-elements/panel","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Grouping Elements"}]},{"id":"-LsEcB9OTyOaAe4MLbAb","title":"accordion","pathname":"/reference/components-overview/grouping-elements/accordion","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Grouping Elements"}]},{"id":"7lm53utU0zQxFJNyFxDl","title":"accordion2","pathname":"/reference/components-overview/grouping-elements/accordion-1","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Grouping Elements"}]},{"id":"-LsEcB9TuZxAo74ofxZh","title":"listrows","pathname":"/reference/components-overview/grouping-elements/listrows","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Grouping Elements"}]},{"id":"CH6j3pXDc1b6JV9VcJbj","title":"Uploading Files","pathname":"/reference/components-overview/uploading-files","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"}]},{"id":"TKEX7DQN9eqmCUoWyV3h","title":"dropzone","pathname":"/reference/components-overview/uploading-files/dropzone","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Uploading Files"}]},{"id":"umdMN8rlVNK5x8ugypw2","title":"dropzone to S3","pathname":"/reference/components-overview/uploading-files/dropzone-to-s3","siteSpaceId":"sitesp_xs5Ka","description":"How to use the dropzone element to upload files directly to an AWS S3 bucket.","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Uploading Files"}]},{"id":"-LsEcB9auqEY-BQd3ZmB","title":"uploadCare","pathname":"/reference/components-overview/uploading-files/uploadcare","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Uploading Files"}]},{"id":"jgHAiFCXpFfRMibaeQaT","title":"Uppy File Upload Widget Integration with AWS S3","pathname":"/reference/components-overview/uploading-files/uppy-file-upload-widget-integration-with-aws-s3","siteSpaceId":"sitesp_xs5Ka","emoji":"1f3d7","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Uploading Files"}]},{"id":"eJaVgavOMXc2GxhyiAoa","title":"Misc Elements","pathname":"/reference/components-overview/misc-elements","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"}]},{"id":"0qldtUYe8wM1fDOFHN94","title":"Plain Text / Code Editor","pathname":"/reference/components-overview/misc-elements/aceeditor","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Misc Elements"}]},{"id":"-LsEcB9Wuiex8l-sUEvX","title":"signature","pathname":"/reference/components-overview/misc-elements/signature","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Misc Elements"}]},{"id":"-LsEcB9RqMJ-enifBHVX","title":"fullCalendar","pathname":"/reference/components-overview/misc-elements/fullcalendar","siteSpaceId":"sitesp_xs5Ka","description":"Implementation of www.fullcalendar.io calendaring component. Component based on https://github.com/CroudTech/vue-fullcalendar","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Misc Elements"}]},{"id":"0HYpWyDcHJAYiJoGCb0j","title":"rangeSlider","pathname":"/reference/components-overview/misc-elements/rangeslider","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Misc Elements"}]},{"id":"3qws7YLTfPOongUH4r0a","title":"Payment Gateways","pathname":"/reference/components-overview/payment-gateways","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"}]},{"id":"C9UZCqVpSb2TxeF2UAdj","title":"Authorize.net","pathname":"/reference/components-overview/payment-gateways/authorize","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Payment Gateways"}]},{"id":"fnZJiT5VO2qvLv1ijj0C","title":"PayPal","pathname":"/reference/components-overview/payment-gateways/paypal","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Payment Gateways"}]},{"id":"uhvn0YKfS0aD1JPE2hmj","title":"Stripe","pathname":"/reference/components-overview/payment-gateways/stripe","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Payment Gateways"}]},{"id":"ZQNNKGPRI6PV52aia3U7","title":"Adding Custom Page Elements","pathname":"/reference/components-overview/3rd-party-elements","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"}]},{"id":"v2glPjjPyjbtQDxb8nrh","title":"Actions Processor","pathname":"/reference/actions-processor","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"lrn8Yi0CzsjybKPGBlM3","title":"Named Actions (Action Scripts)","pathname":"/reference/actions-processor/actions_named","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"}]},{"id":"qbfKWd5ZuNYI0YSQM92p","title":"Actions","pathname":"/reference/actions-processor/actions_overview","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"}]},{"id":"UsOAFOv6xGJxkwPYYwj7","title":"runUtilityHook","pathname":"/reference/actions-processor/actions_overview/runutilityhook","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"FF4oE7ePhbsoNgODYmkg","title":"path","pathname":"/reference/actions-processor/actions_overview/path","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"FRsClHtJqs9ZncWgYcqt","title":"debounce","pathname":"/reference/actions-processor/actions_overview/debounce","siteSpaceId":"sitesp_xs5Ka","description":"Ver +bf-0.01.4","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"d5p0V2hZOYJjiPLIOTYA","title":"throttle","pathname":"/reference/actions-processor/actions_overview/throttle","siteSpaceId":"sitesp_xs5Ka","description":"Ver +bf-0.01.4","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LsEcB9qYPPLRbDI4vY5","title":"showAlert","pathname":"/reference/actions-processor/actions_overview/showalert","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"oVkhG4i7uGDjbF0GnIGU","title":"showModal / hideModal","pathname":"/reference/actions-processor/actions_overview/showmodal","siteSpaceId":"sitesp_xs5Ka","description":"Displays a full screen modal dialogue with customizable buttons","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"slhBxkH76ifpXliXMUCb","title":"function","pathname":"/reference/actions-processor/actions_overview/function-1","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LsEcB9gOPi8g18VzUSI","title":"clipboard","pathname":"/reference/actions-processor/actions_overview/clipboard","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"akwhJl52asMaf0tJALF5","title":"cookie","pathname":"/reference/actions-processor/actions_overview/cookie","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LsEcB9p1pcuZvFyFpFY","title":"setFocus","pathname":"/reference/actions-processor/actions_overview/setfocus","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"mv6xG781vT9IfexScLMn","title":"scrollTo","pathname":"/reference/actions-processor/actions_overview/scrollto","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"k8QJjWn5fqx5PuQaSzZJ","title":"wait","pathname":"/reference/actions-processor/actions_overview/wait","siteSpaceId":"sitesp_xs5Ka","description":"pause the actions queue for an amount of time specified","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LsEcB9tHy91uNFRdYRU","title":"emit","pathname":"/reference/actions-processor/actions_overview/emit","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"TVcPvTGtI5GFsub6qSqj","title":"validate","pathname":"/reference/actions-processor/actions_overview/validate","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"EFYRZ3XJWxqaes6gGd2Z","title":"channelJoinAnon","pathname":"/reference/actions-processor/actions_overview/channeljoinanonymous","siteSpaceId":"sitesp_xs5Ka","description":"Adds user to anonymous channel","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"1qzCMnetWUQpKOqUI2WA","title":"channelLeaveAnon","pathname":"/reference/actions-processor/actions_overview/channelleaveanon","siteSpaceId":"sitesp_xs5Ka","description":"Removes user from anonymous channel","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"LXbm4R6ObpaETAubjrNE","title":"messageSend","pathname":"/reference/actions-processor/actions_overview/messagesend","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"ffk72c5qLnRIuOV5VuPg","title":"messageSendAnonChannel","pathname":"/reference/actions-processor/actions_overview/messagesendanonchannel","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"d1eCM25pcRe0OXKYPOYR","title":"consoleError","pathname":"/reference/actions-processor/actions_overview/consoleerror","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"WLL0seVcak308BaboSWc","title":"showStripeCheckout","pathname":"/reference/actions-processor/actions_overview/showstripecheckout","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"g871pz6FpO51uOFmbg5A","title":"showCardModal / hideCardModal","pathname":"/reference/actions-processor/actions_overview/showcardmodal","siteSpaceId":"sitesp_xs5Ka","description":"Opens or closes a BetterForms card modal that renders another page.","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"LBV63ASElwVSfbEfyKMN","title":"runOnCompleteHook","pathname":"/reference/actions-processor/actions_overview/runoncompletehook","siteSpaceId":"sitesp_xs5Ka","description":"Runs the form completion hook and waits for it to finish before continuing the action queue.","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"2UfxQj2tMKUzn55GcyTb","title":"mapInfoWindow","pathname":"/reference/actions-processor/actions_overview/mapinfowindow","siteSpaceId":"sitesp_xs5Ka","description":"Emits a map info-window event to components listening for map interactions.","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"sS1mK2z4hxfK27oRM6Qw","title":"authLoginOauth / oauthLoginHook","pathname":"/reference/actions-processor/actions_overview/authloginoauth","siteSpaceId":"sitesp_xs5Ka","description":"Finalizes an OAuth login after the provider redirects back into BetterForms.","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"5PnTi7PteZ7nOxib7FvA","title":"pwaCustomInstall","pathname":"/reference/actions-processor/actions_overview/pwacustominstall","siteSpaceId":"sitesp_xs5Ka","description":"Captures the browser install prompt so your app can trigger installation later with custom UI.","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"P1Xnjsulrt7dL7NgyjEa","title":"pwaPromptInstall","pathname":"/reference/actions-processor/actions_overview/pwapromptinstall","siteSpaceId":"sitesp_xs5Ka","description":"Triggers the stored PWA install prompt and runs callbacks for accept or dismiss outcomes.","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"ik30mdqHI54GkKDy4UQX","title":"pwaPromptPushPermission","pathname":"/reference/actions-processor/actions_overview/pwapromptpushpermission","siteSpaceId":"sitesp_xs5Ka","description":"Requests push-notification permission and registers the browser subscription with BetterForms.","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"fxXBOthp2fISxGTjvwQ8","title":"pwaPushNotificationSend","pathname":"/reference/actions-processor/actions_overview/pwapushnotificationsend","siteSpaceId":"sitesp_xs5Ka","description":"Sends a push notification through BetterForms to registered browser subscriptions.","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"eGNiuu36bh9QKwqNSFS3","title":"llmToolCall","pathname":"/reference/actions-processor/actions_overview/llmtoolcall","siteSpaceId":"sitesp_xs5Ka","description":"Dispatches LLM-requested frontend tools by mapping them to BetterForms named actions.","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"zP4s4JnNWGpGN06RFeIH","title":"llmToolCallResponse","pathname":"/reference/actions-processor/actions_overview/llmtoolcallresponse","siteSpaceId":"sitesp_xs5Ka","description":"Sends the result of a frontend tool workflow back to the BetterForms LLM tool-response service.","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"KYv4FVR3CgTfPWET0khz","title":"llmQueryStop","pathname":"/reference/actions-processor/actions_overview/llmquerystop","siteSpaceId":"sitesp_xs5Ka","description":"Requests that an active BetterForms LLM query stream stop gracefully.","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"3gHnnHennxCOL1R7nDIG","title":"assistantStop","pathname":"/reference/actions-processor/actions_overview/assistantstop","siteSpaceId":"sitesp_xs5Ka","description":"Requests that an active BetterForms assistants stream stop gracefully.","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"ndv0F4Y91eyJGYc9DphA","title":"Authentication Actions","pathname":"/reference/actions-processor/authentication-actions","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"}]},{"id":"mrv6DkpGdbIHwUm5UiOM","title":"Script Hooks","pathname":"/reference/hooksoverview","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"61xtjnJTmqNQVvM8T5GM","title":"Globals Variables","pathname":"/reference/hooksoverview/filemaker-globals","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"}]},{"id":"k7JQPPtveKnCWK4ojpOr","title":"$$BF_Model","pathname":"/reference/hooksoverview/filemaker-globals/usdusdbf_model","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"},{"label":"Globals Variables"}]},{"id":"hXNQj95A4EEWKSiZ95ek","title":"$$BF_App","pathname":"/reference/hooksoverview/filemaker-globals/usdusdbf_app","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"},{"label":"Globals Variables"}]},{"id":"jLAO9rMqTciSqbbd4oLu","title":"$$BF_State","pathname":"/reference/hooksoverview/filemaker-globals/usdusdbf_state","siteSpaceId":"sitesp_xs5Ka","description":"The state object holds various data related to the browser environment.","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"},{"label":"Globals Variables"}]},{"id":"BrM7bYs3aG5knexuFnQu","title":"Keeping Keys Private","pathname":"/reference/hooksoverview/payloadobject","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"}]},{"id":"OPunE2gEJir0LExcRMN2","title":"Reducing Payload Size","pathname":"/reference/hooksoverview/env_vars","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"}]},{"id":"zKN6lB6AJO1fz7pcSoTr","title":"API Callback Endpoint","pathname":"/reference/hooksoverview/callback","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"}]},{"id":"fPuJmwNRKTTikFMsHWqj","title":"Common Hooks","pathname":"/reference/hooksoverview/commonoverview","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"}]},{"id":"FYwOuvYMDOjSv4GLvaMq","title":"Scoped Hooks","pathname":"/reference/hooksoverview/hooks","siteSpaceId":"sitesp_xs5Ka","description":"Scoped hooks are specific to the page on which they are initiated and contain relevant data about the page context","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"}]},{"id":"MHTiS34urb6JjeyIRv14","title":"Lifecycle Hooks","pathname":"/reference/hooksoverview/lifecycle-hooks","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"}]},{"id":"EqVocup91nzmugJtupfU","title":"Authentication","pathname":"/reference/authentication","siteSpaceId":"sitesp_xs5Ka","description":"High-level overview of BetterForms authentication strategies and building blocks.","breadcrumbs":[{"label":"Reference"}]},{"id":"zSayUFwPwLQKbOD21xjc","title":"Basic Authentication","pathname":"/reference/authentication/basic-auth","siteSpaceId":"sitesp_xs5Ka","description":"Email/password authentication using the internal Users table in the helper file.","breadcrumbs":[{"label":"Reference"},{"label":"Authentication"}]},{"id":"6ivSNYP6bFV6pg7dmlFJ","title":"User Registration & Verification","pathname":"/reference/authentication/basic-auth/user-registration","siteSpaceId":"sitesp_xs5Ka","description":"Step-by-step for user sign-up and email verification using Basic Authentication.","breadcrumbs":[{"label":"Reference"},{"label":"Authentication"},{"label":"Basic Authentication"}]},{"id":"OTYS9QTPJoFeeVc1mzW5","title":"Password Management","pathname":"/reference/authentication/basic-auth/password-management","siteSpaceId":"sitesp_xs5Ka","description":"Password reset flows for end users in Basic Authentication.","breadcrumbs":[{"label":"Reference"},{"label":"Authentication"},{"label":"Basic Authentication"}]},{"id":"0esgKliumWnqJqDKKKvd","title":"Managing User Accounts","pathname":"/reference/authentication/managing-users","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Authentication"}]},{"id":"f19tR87SZtAgtbU4CTZs","title":"Custom Login Pages","pathname":"/reference/authentication/custom-login-pages","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Authentication"}]},{"id":"vgHMAD84yiyrUPzafCjD","title":"Query & Cookie Based Auth","pathname":"/reference/authentication/query-cookie-auth","siteSpaceId":"sitesp_xs5Ka","description":"Using smart links (query tokens) and cookie-based sessions for streamlined authentication.","breadcrumbs":[{"label":"Reference"},{"label":"Authentication"}]},{"id":"iC19Uu6lLUuFv1BEalSQ","title":"OAuth","pathname":"/reference/authentication/oauth","siteSpaceId":"sitesp_xs5Ka","description":"OAuth sign-in with Google, Auth0, and Okta.","breadcrumbs":[{"label":"Reference"},{"label":"Authentication"}]},{"id":"vzd1T6vjh6ZH0EhZfXUu","title":"JWT Expiration","pathname":"/reference/authentication/jwt-expiration","siteSpaceId":"sitesp_xs5Ka","description":"Configure per-tenant JWT authentication token expiry and domain audience.","breadcrumbs":[{"label":"Reference"},{"label":"Authentication"}]},{"id":"ihwhai93EFQ8RdV97nAr","title":"Security Best Practices","pathname":"/reference/authentication/security-best-practices","siteSpaceId":"sitesp_xs5Ka","description":"Recommended practices for securing authentication flows in BetterForms.","breadcrumbs":[{"label":"Reference"},{"label":"Authentication"}]},{"id":"vTRNmrdkxqhLCopyicBT","title":"Klai Utility Functions","pathname":"/reference/bf-utility-function-ver-0.9.20+","siteSpaceId":"sitesp_xs5Ka","description":"BetterForm has a collection of helper Java Script functions that are used within JavaScript to allow  easy access to common complex code.","breadcrumbs":[{"label":"Reference"}]},{"id":"YeHUqgFDI1PyftouNitW","title":"Dynamic Library Loading","pathname":"/reference/bf-utility-function-ver-0.9.20+/bf-dynamic-library-loading","siteSpaceId":"sitesp_xs5Ka","description":"Dynamic library loading functionality for BetterForms - Load external JavaScript libraries, ESM modules, and CSS files from CDN dynamically within function actions.","breadcrumbs":[{"label":"Reference"},{"label":"Klai Utility Functions"}]},{"id":"sbtcHFnXGJVaHYm910UJ","title":"APIs & Services","pathname":"/reference/apis-and-services","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"Fgqxsuy1EM8jfw4hfpkx","title":"Messaging","pathname":"/reference/apis-and-services/messaging","siteSpaceId":"sitesp_xs5Ka","description":"Messaging is intended to be used for real-time features, such as notifications, chat or auto updates. Messaging also allows data to be pushed from FileMaker into your BetterForms apps.","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"}]},{"id":"9n639kBwACyzz5QTI6FT","title":"Adding users to channels","pathname":"/reference/apis-and-services/messaging/adding-users-to-channels","siteSpaceId":"sitesp_xs5Ka","description":"You can add users to channels either by calling a FileMaker script in the Helper File, or by calling a REST API endpoint of your BetterForms domain.","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Messaging"}]},{"id":"6Hmn8ibzrLjg3g4ll4Gm","title":"Removing users from channels","pathname":"/reference/apis-and-services/messaging/removing-users-from-channels","siteSpaceId":"sitesp_xs5Ka","description":"Similar to adding users, you can remove users either by a REST API call, or via a FileMaker script in your helper file.","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Messaging"}]},{"id":"irDRuDFQkq2X65USxXzS","title":"Sending messages","pathname":"/reference/apis-and-services/messaging/sending-messages","siteSpaceId":"sitesp_xs5Ka","description":"Once your users are subscribed to a channel or two, you can send messages to them!","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Messaging"}]},{"id":"HjtwjIa7aSD2GYWpjfvr","title":"Get connected users","pathname":"/reference/apis-and-services/messaging/get-all-users-connected","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Messaging"}]},{"id":"OpAwtZs3H2Cd6kGJGohI","title":"Get active channels","pathname":"/reference/apis-and-services/messaging/get-active-channels","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Messaging"}]},{"id":"pP4GxpU0cYzWlg20GeyQ","title":"Core APIs","pathname":"/reference/apis-and-services/core-apis","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"}]},{"id":"Rdhk8So8Y5N9HNauzdRt","title":"Klai Server Proxy","pathname":"/reference/apis-and-services/core-apis/server-proxy","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Core APIs"}]},{"id":"sR9OJu5bvZLCjpgOtCIw","title":"BetterForms Error Pages API","pathname":"/reference/apis-and-services/core-apis/error-pages-api","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Core APIs"}]},{"id":"94Va05QV7MwNlbyF4DDN","title":"Klai Streaming Proxy","pathname":"/reference/apis-and-services/streaming-proxy","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"}]},{"id":"YDMdSZwbiBFWB09VziTZ","title":"Klai Streaming API (Chat)","pathname":"/reference/apis-and-services/streaming-proxy/bf-streaming-api-chat","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Klai Streaming Proxy"}]},{"id":"jBry7iqlxZh2AfxJ1DLD","title":"Klai Streaming API (Assistants)","pathname":"/reference/apis-and-services/streaming-proxy/bf-streaming-assistants-api","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Klai Streaming Proxy"}]},{"id":"6txEGNWq4p7xRHAPFoII","title":"Klai Streaming API (LLM Query)","pathname":"/reference/apis-and-services/streaming-proxy/bf-streaming-api-llm-query","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Klai Streaming Proxy"}]},{"id":"9HESAWZnusNNlnuYbdKF","title":"Guides & Integrations","pathname":"/reference/apis-and-services/integrations","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"}]},{"id":"kjAKqfl8kxbfa5y4riyL","title":"Creating Components with Third-Party Libraries","pathname":"/reference/apis-and-services/integrations/creating-components-with-third-party-libraries","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Guides & Integrations"}]},{"id":"GB5Nhj3hZEDEphUG5nQS","title":"Web Awesome Components in BetterForms","pathname":"/reference/apis-and-services/integrations/web-awesome-components","siteSpaceId":"sitesp_xs5Ka","description":"Use Web Awesome components inside BetterForms with self-contained bfcomponents that lazy-load the library and styles.","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Guides & Integrations"}]},{"id":"CanPv4DvqC1amzqQCXrx","title":"ApexCharts - Getting started","pathname":"/reference/apis-and-services/integrations/apexcharts-getting-started","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Guides & Integrations"}]},{"id":"C6Wvn4KQTr76JGnvNFnF","title":"Creating a PWA","pathname":"/reference/apis-and-services/integrations/creating-a-pwa","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Guides & Integrations"}]},{"id":"Xt9DDecwj8Qa67TPjwp4","title":"Setting up Auth0","pathname":"/reference/apis-and-services/integrations/setting-up-auth0","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Guides & Integrations"}]},{"id":"mRBk83abRQJE72AyIQZl","title":"Create an S3 Bucket on AWS","pathname":"/reference/apis-and-services/integrations/create-an-s3-bucket-on-aws","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"APIs & Services"},{"label":"Guides & Integrations"}]},{"id":"8PZZhg3EjcIBM3oYsgc1","title":"Development & Best Practices","pathname":"/reference/best-practices","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"O1n79dkiKPyxeuifjmg7","title":"Developer Mode","pathname":"/reference/best-practices/developer-mode","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Development & Best Practices"}]},{"id":"IdkT2c0BbkNtYG05mp5H","title":"JavaScript Libraries","pathname":"/reference/best-practices/javascript-libraries","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Development & Best Practices"}]},{"id":"1i6Rc7b8hWumnOtVRtJg","title":"Practices for File Downloads","pathname":"/reference/best-practices/practices-for-file-downloads","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Development & Best Practices"}]},{"id":"8VvFYC32m71ZX4IATRea","title":"Rollbacks and Version Control","pathname":"/reference/best-practices/rollbacks-and-version-control","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Development & Best Practices"}]},{"id":"kYw3Xdshkto7ScpKhYEo","title":"Customizing & Styling","pathname":"/reference/styling","siteSpaceId":"sitesp_xs5Ka","description":"There are many ways to customize a BetterForms site to suit the needs of your application!","breadcrumbs":[{"label":"Reference"}]},{"id":"Wlp3spdMEJmmeyuvY8so","title":"SEO & Social Sharing","pathname":"/reference/styling/seo-and-social-sharing","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Customizing & Styling"}]},{"id":"oiEXAaM3md4YBPBFa7OJ","title":"Custom Components","pathname":"/reference/styling/custom-components","siteSpaceId":"sitesp_xs5Ka","description":"Components are chunks of reusable code. They allow you to define code in a single place and reuse it throughout your app. Components can be references through HTML or with Klai JSON schema","breadcrumbs":[{"label":"Reference"},{"label":"Customizing & Styling"}]},{"id":"dYD8GKesV37ftDv5n8z1","title":"Components Editor","pathname":"/reference/styling/custom-components/components-editor","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Customizing & Styling"},{"label":"Custom Components"}]},{"id":"Cscbtn4P8YmPrBcpf98g","title":"Component Best Practices","pathname":"/reference/styling/custom-components/component-best-practices","siteSpaceId":"sitesp_xs5Ka","description":"Good components need to be designed well. Taking the time to think of future use cases significantly enhances the components usability.","breadcrumbs":[{"label":"Reference"},{"label":"Customizing & Styling"},{"label":"Custom Components"}]},{"id":"Dz0xHGKWchq0DCnWgDlo","title":"Support & Maintenance","pathname":"/reference/support-and-maintenance","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"A80xglccSVTslPv8j6Ku","title":"Connection Trouble Shooting Guide","pathname":"/reference/support-and-maintenance/connection-trouble-shooting-guide","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Support & Maintenance"}]},{"id":"3NpkZHj48A76qP5SQMK3","title":"Updating the Helper File","pathname":"/reference/support-and-maintenance/updating-the-helper-file","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Support & Maintenance"}]},{"id":"CjoXONmZRcZujv0vzeTA","title":"Klai Error Codes","pathname":"/reference/support-and-maintenance/bf-error-codes","siteSpaceId":"sitesp_xs5Ka","description":"Klai Studio can throw various errors due to code or configuration. Errors can appear in the Helper File, Developer Tools ( when enabled) or the browser console.","breadcrumbs":[{"label":"Reference"},{"label":"Support & Maintenance"}]},{"id":"RXLN1glYMVT1vavQ2Jao","title":"Security","pathname":"/reference/security","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"EO0GRt5W1v5QqbJUsUXT","title":"Custom Domains","pathname":"/reference/security/custom-domains","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Security"}]},{"id":"-LsEcBALkWvxcqwuDhD1","title":"Security White Paper","pathname":"/reference/security/white-paper","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Security"}]},{"id":"-LsEcBAMsujzxfrZhiqJ","title":"Firewalls","pathname":"/reference/security/security","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Security"}]},{"id":"48tVZx0KLWHLkJnvlEcG","title":"Technology Stack","pathname":"/reference/security/technology-stack","siteSpaceId":"sitesp_xs5Ka","description":"Software and tools we use to run Klai Studio!","breadcrumbs":[{"label":"Reference"},{"label":"Security"}]},{"id":"xLwM2kQU0vEzH6faKJAj","title":"Compatibility","pathname":"/reference/security/compatibility","siteSpaceId":"sitesp_xs5Ka","description":"As of version 0.9.43 BetterForms is compatible with the following versions or newer. Older version may be supported but may have some limiting features as of Oct 22nd, 2020:","breadcrumbs":[{"label":"Reference"},{"label":"Security"}]},{"id":"IlK7uJ8E60vNrDTAr79j","title":"Enterprise","pathname":"/reference/enterprise","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"ZLKvvFx4doTIGaubQFQb","title":"Klai Enterprise Documentation","pathname":"/reference/enterprise/bf-enterprise-documentation","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Enterprise"}]},{"id":"zcLUz3dTeJt8Yp1NI8Ib","title":"Cookbook Backlog","pathname":"/cookbook-backlog/read-me","siteSpaceId":"sitesp_xs5Ka","description":"Planned recipe topics with links to the best current reference pages.","breadcrumbs":[{"label":"Cookbook Backlog"}]},{"id":"BAzZnI0w37F2Yatg2fIt","title":"AI Assistant - Tips & Tricks","pathname":"/cookbook-backlog/ai-assistant-tips-and-tricks","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Cookbook Backlog"}]},{"id":"hjgnuIq5hThFiJR71Uc6","title":"Using Development Data","pathname":"/cookbook-backlog/using-development-data","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Cookbook Backlog"}]},{"id":"EkAVQc97te6FOdw9yFXH","title":"Passing Data Between Pages","pathname":"/cookbook-backlog/passing-data-between-pages","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Cookbook Backlog"}]},{"id":"rhpKPjB1p11T93zN9CUa","title":"When to use 'App' vs 'Model'","pathname":"/cookbook-backlog/when-to-use-app-vs-model","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Cookbook Backlog"}]},{"id":"qFz9aAwQOzB8Ys4YTnLL","title":"Using Smart Links","pathname":"/cookbook-backlog/using-smart-links","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Cookbook Backlog"}]},{"id":"bUhHK6UKaOoUClikm0MW","title":"FM Script Architecture","pathname":"/cookbook-backlog/fm-script-architecture","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Cookbook Backlog"}]},{"id":"MnD6CXtvjBBEMIDHWlPa","title":"Using JSON in FileMaker","pathname":"/cookbook-backlog/using-json-in-filemaker","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Cookbook Backlog"}]},{"id":"rJz41jUeTDpn9pbIhlCf","title":"Performance & Optimization","pathname":"/cookbook-backlog/preformance","siteSpaceId":"sitesp_xs5Ka","description":"","breadcrumbs":[{"label":"Cookbook Backlog"}]},{"id":"KPD0m4xUDnSjdiBT9UfD","title":"Backward Compatibility for V2 to V3","pathname":"/cookbook-backlog/backward-compatibility-v2-to-v3","siteSpaceId":"sitesp_xs5Ka","description":"Notes for restoring legacy behaviors when upgrading older BetterForms V2 projects to V3.","breadcrumbs":[{"label":"Cookbook Backlog"}]},{"id":"-LKI28Wkh3cSd6Lz_xCt","title":"Introduction","pathname":"/v1","siteSpaceId":"sitesp_hJ0rI","description":""},{"id":"-LKI579VmneL_1prM_Cp","title":"Features Summary","pathname":"/v1/introduction","siteSpaceId":"sitesp_hJ0rI","description":""},{"id":"-LitpsfAa_B3KDGV_qV-","title":"System Overview","pathname":"/v1/getting-started/system-overview","siteSpaceId":"sitesp_hJ0rI","description":"BetterForms is a unique application that can interact with your FileMaker server in creative ways. Let's see how that works!","breadcrumbs":[{"label":"Getting Started"}]},{"id":"-LitqGHMI_lI0H_30hDt","title":"Integration","pathname":"/v1/getting-started/integration","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Getting Started"}]},{"id":"-LKI579WC9ftXf1s6Jhc","title":"1. Configure FileMaker Server","pathname":"/v1/getting-started/integration/installation","siteSpaceId":"sitesp_hJ0rI","description":"Need to Learn JSON? https://youtu.be/iiADhChRriM","breadcrumbs":[{"label":"Getting Started"},{"label":"Integration"}]},{"id":"-LjJcL_wgs_iseV0BajR","title":"2. Add your Server to BetterForms","pathname":"/v1/getting-started/integration/2.-add-a-server","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Integration"}]},{"id":"-LjMR5E733Q99rP21SOu","title":"3. Introduction to Hooks","pathname":"/v1/getting-started/integration/3.-introduction-to-hooks","siteSpaceId":"sitesp_hJ0rI","description":"Before we continue integrating, let's take a step back to understand the concept of Hooks in BetterForms","breadcrumbs":[{"label":"Getting Started"},{"label":"Integration"}]},{"id":"-LjJf5LA92Pz7-8f-c5f","title":"4. Create your first Site","pathname":"/v1/getting-started/integration/4.-create-a-site","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Integration"}]},{"id":"-LjJieGB7i3yp-q6PfcS","title":"5. Create your first Page","pathname":"/v1/getting-started/integration/5.-create-a-form","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Integration"}]},{"id":"-LjJe1gGHNT6iAGXH8o-","title":"6. Configure your FileMaker File(s)","pathname":"/v1/getting-started/integration/3.-copy-custom-functions-and-scripts","siteSpaceId":"sitesp_hJ0rI","description":"Now that BetterForms is properly configured, let's finish integrating your legacy FileMaker file(s) so that we can test the entire workflow through BetterForms.","breadcrumbs":[{"label":"Getting Started"},{"label":"Integration"}]},{"id":"-LjMEMqUuGcCsnGzs7uE","title":"7. Run your first Hook","pathname":"/v1/getting-started/integration/6.-run-your-first-hook","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Integration"}]},{"id":"-LjMEm1fGLZXto9JQy88","title":"Next Steps","pathname":"/v1/getting-started/integration/next-steps","siteSpaceId":"sitesp_hJ0rI","description":"You've got the basics down! Now it's time to start building out your app","breadcrumbs":[{"label":"Getting Started"},{"label":"Integration"}]},{"id":"-LitqJ_ph6GckZbUsK5T","title":"Common Customizations","pathname":"/v1/getting-started/common-customizations","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Getting Started"}]},{"id":"-LjN7FyN8CiezWBj_wmg","title":"Introduction to Actions","pathname":"/v1/getting-started/common-customizations/introduction-to-actions","siteSpaceId":"sitesp_hJ0rI","description":"Actions","breadcrumbs":[{"label":"Getting Started"},{"label":"Common Customizations"}]},{"id":"-LjN79WIk9Acp61dCCEk","title":"Introduction to Buttons","pathname":"/v1/getting-started/common-customizations/introduction-to-buttons","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Common Customizations"}]},{"id":"-LjquYL5zKHm3Mf8jw6E","title":"Page Navigation","pathname":"/v1/getting-started/common-customizations/page-navigation","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Common Customizations"}]},{"id":"-LjquePJnV1WDzGe7DNk","title":"Displaying Data in a Table","pathname":"/v1/getting-started/common-customizations/displaying-data-in-a-table","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Common Customizations"}]},{"id":"-LitqNm3fmQCEPWHfBX_","title":"Support","pathname":"/v1/getting-started/support","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Getting Started"}]},{"id":"-Ljqurh5v0gO6YDlJerT","title":"Hacking a Webpage","pathname":"/v1/getting-started/support/hacking-a-webpage","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Support"}]},{"id":"-LjRaj0zk2_AxmuLXQ6z","title":"Learning JSON","pathname":"/v1/getting-started/support/learning-json","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Getting Started"},{"label":"Support"}]},{"id":"-Litq99xmZEGw6zXM4Rt","title":"Site Settings","pathname":"/v1/reference/site-settings","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"-LKI57Ac9qWPBNv5FCqm","title":"Navigation","pathname":"/v1/reference/site-settings/navigationoverview","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Site Settings"}]},{"id":"-LjRVGQs0oVC-w7WXxUD","title":"Slots / Code Injection","pathname":"/v1/reference/site-settings/slots-code-injection","siteSpaceId":"sitesp_hJ0rI","description":"There are many ways to inject code throughout your site. Slots are the primary method for doing this","breadcrumbs":[{"label":"Reference"},{"label":"Site Settings"}]},{"id":"-LjRVQNC8UPYTkIpi-N0","title":"App Model","pathname":"/v1/reference/site-settings/app-model","siteSpaceId":"sitesp_hJ0rI","description":"The App Model functions similar to a page's data model, except that it is accessible to every page in your site. You can also reference data in the App Model from elements that are not bound to a page","breadcrumbs":[{"label":"Reference"},{"label":"Site Settings"}]},{"id":"-LjRVS3qeGqQVfOwxJ9H","title":"Site-wide Named Actions","pathname":"/v1/reference/site-settings/site-wide-named-actions","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Site Settings"}]},{"id":"-LitqS2mGxOmDIPyWSzv","title":"Page Settings","pathname":"/v1/reference/form-settings","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"-LjRZLQXtqLmT7YbXjuK","title":"Data Model","pathname":"/v1/reference/form-settings/data-model","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Settings"}]},{"id":"-LSh-HpuyJ0Oc71yypW7","title":"Card / Window Modals","pathname":"/v1/reference/form-settings/card-modals","siteSpaceId":"sitesp_hJ0rI","description":"Card modals display other pages as their content.","breadcrumbs":[{"label":"Reference"},{"label":"Page Settings"}]},{"id":"-LKI579qxSqvkAmlhrO2","title":"Validation","pathname":"/v1/reference/form-settings/validationoverview","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Settings"}]},{"id":"-LKI579rJA2DBZnyUoIb","title":"Custom Validators","pathname":"/v1/reference/form-settings/validationoverview/clientside","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Settings"},{"label":"Validation"}]},{"id":"-Ll3Nd_stEAicT0BGyw3","title":"Misc Page Settings","pathname":"/v1/reference/form-settings/misc-page-settings","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Settings"}]},{"id":"-LKI579syfk71LequOft","title":"Page Elements","pathname":"/v1/reference/components-overview","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"-LitqqLR4Zf-4ku6BVxu","title":"Common","pathname":"/v1/reference/components-overview/common","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"}]},{"id":"-LXX8VtsRMmr9MnVYNeY","title":"Button","pathname":"/v1/reference/components-overview/common/button","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Common"}]},{"id":"-LKI57ADfgDYLAWpmIrC","title":"Data Table","pathname":"/v1/reference/components-overview/common/tables2","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Common"}]},{"id":"-LKI579wo5XNSUxJlYyJ","title":"HTML","pathname":"/v1/reference/components-overview/common/html","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Common"}]},{"id":"-LitrHEfaMV90GIeS1uF","title":"Grouping Elements","pathname":"/v1/reference/components-overview/grouping-elements","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"}]},{"id":"-LSgFqINYqI3cyX0dpfc","title":"Tabs","pathname":"/v1/reference/components-overview/grouping-elements/tabs_form","siteSpaceId":"sitesp_hJ0rI","description":"Organize complex forms using a standard tab element","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Grouping Elements"}]},{"id":"-LaAunfEytk5MmVJ_n3m","title":"panel","pathname":"/v1/reference/components-overview/grouping-elements/untitled-1","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Grouping Elements"}]},{"id":"-LKI579taW8yKNJRlohX","title":"accordion","pathname":"/v1/reference/components-overview/grouping-elements/accordion","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Grouping Elements"}]},{"id":"-LKI579xaCC-GQB88CmZ","title":"listrows","pathname":"/v1/reference/components-overview/grouping-elements/listrows","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Grouping Elements"}]},{"id":"-LitseH9nbeg9Ndj_9rA","title":"Uploading Files","pathname":"/v1/reference/components-overview/uploading-files","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"}]},{"id":"-LKI579y0iQGvQxDhXNT","title":"dropzone","pathname":"/v1/reference/components-overview/uploading-files/dropzone","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Uploading Files"}]},{"id":"-LtlSyyDM3PV9PQlsKD5","title":"dropzone to S3","pathname":"/v1/reference/components-overview/uploading-files/dropzone-to-s3","siteSpaceId":"sitesp_hJ0rI","description":"How to use the dropzone element to upload files directly to an AWS S3 bucket.","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Uploading Files"}]},{"id":"-L_h3Ck1oPVXBU2VPOSN","title":"uploadCare","pathname":"/v1/reference/components-overview/uploading-files/uploadcare","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Uploading Files"}]},{"id":"-LitskUElPLwzB3GAlqT","title":"Misc Elements","pathname":"/v1/reference/components-overview/misc-elements","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"}]},{"id":"-LKI57A-nKIR77uLb-pL","title":"Plain Text / Code Editor","pathname":"/v1/reference/components-overview/misc-elements/aceeditor","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Misc Elements"}]},{"id":"-LKI579v-jWvMo9B4pHZ","title":"signature","pathname":"/v1/reference/components-overview/misc-elements/signature","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Misc Elements"}]},{"id":"-LY2ciCTh0tbe75GxW-A","title":"fullCalendar","pathname":"/v1/reference/components-overview/misc-elements/fullcalendar","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Misc Elements"}]},{"id":"-LaAup3-9S9MZfuS-Id9","title":"rangeSlider","pathname":"/v1/reference/components-overview/misc-elements/rangeslider","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Misc Elements"}]},{"id":"-Litr3oVNrw1hy9nTSPE","title":"Payment Gateways","pathname":"/v1/reference/components-overview/payment-gateways","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"}]},{"id":"-LVpEtl0ZJhyinzB_d4J","title":"Authorize.net","pathname":"/v1/reference/components-overview/payment-gateways/authorize","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Payment Gateways"}]},{"id":"-LKI579z1dQLInUx3DEG","title":"PayPal","pathname":"/v1/reference/components-overview/payment-gateways/paypal","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Payment Gateways"}]},{"id":"-LitrDVn-g_tLKf6Ym6d","title":"Stripe","pathname":"/v1/reference/components-overview/payment-gateways/stripe","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"},{"label":"Payment Gateways"}]},{"id":"-LYA3N-tK2M8KlrO9IeH","title":"Adding Custom Page Elements","pathname":"/v1/reference/components-overview/3rd-party-elements","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Page Elements"}]},{"id":"-Litt8MIiOlHsUasr0-_","title":"Actions Processor","pathname":"/v1/reference/actions-processor","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"-LKI57ANB4SOznduOZeG","title":"Named Actions","pathname":"/v1/reference/actions-processor/actions_named","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"}]},{"id":"-LKI57AJxPzpGj35CoIZ","title":"Actions","pathname":"/v1/reference/actions-processor/actions_overview","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"}]},{"id":"-LKI57APOo2YmensjYEl","title":"runUtilityHook","pathname":"/v1/reference/actions-processor/actions_overview/runutilityhook","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LKI57AOVG6u3UXXtFYq","title":"path","pathname":"/v1/reference/actions-processor/actions_overview/path","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-MP2P1REY2mnkoMISY5a","title":"debounce","pathname":"/v1/reference/actions-processor/actions_overview/debounce","siteSpaceId":"sitesp_hJ0rI","description":"Ver +bf-0.01.4","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-MP2XEsSGYMs5T2SQVma","title":"throttle","pathname":"/v1/reference/actions-processor/actions_overview/throttle","siteSpaceId":"sitesp_hJ0rI","description":"Ver +bf-0.01.4","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LKI57ARX9_NfNIJd0cv","title":"showAlert","pathname":"/v1/reference/actions-processor/actions_overview/showalert","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LKI57ASd2D1x26o0Icb","title":"showModal / hideModal","pathname":"/v1/reference/actions-processor/actions_overview/showmodal","siteSpaceId":"sitesp_hJ0rI","description":"Displays a full screen modal dialogue with customizable buttons","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LKI57AU3eXjkQwjRQKC","title":"function","pathname":"/v1/reference/actions-processor/actions_overview/function-1","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LKI57AKYwzyma-_DuMM","title":"clipboard","pathname":"/v1/reference/actions-processor/actions_overview/clipboard","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LKI57AVdVm5FminPlih","title":"cookie","pathname":"/v1/reference/actions-processor/actions_overview/cookie","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LKI57AQY1cF2TicDDVI","title":"setFocus","pathname":"/v1/reference/actions-processor/actions_overview/setfocus","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LOsbmJpDvEHEgV2Ya0J","title":"wait","pathname":"/v1/reference/actions-processor/actions_overview/wait","siteSpaceId":"sitesp_hJ0rI","description":"pause the actions queue for an amount of time specified","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LPl_WFlT0ISVzkzGfx2","title":"emit","pathname":"/v1/reference/actions-processor/actions_overview/emit","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LSVS9BJtHIw0fGgPJ51","title":"validate","pathname":"/v1/reference/actions-processor/actions_overview/validate","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-MQnazgIBATEgNwfp2Ek","title":"channelJoinAnon","pathname":"/v1/reference/actions-processor/actions_overview/channeljoinanonymous","siteSpaceId":"sitesp_hJ0rI","description":"Adds user to anonymous channel","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-M_vhk7shkdto8kR5-OX","title":"channelLeaveAnon","pathname":"/v1/reference/actions-processor/actions_overview/channelleaveanon","siteSpaceId":"sitesp_hJ0rI","description":"Removes user from anonymous channel","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-MQndS5rs5ZZfwNcf9No","title":"messageSend","pathname":"/v1/reference/actions-processor/actions_overview/messagesend","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-M_viWe81aOZWle9z4A4","title":"messageSendAnonChannel","pathname":"/v1/reference/actions-processor/actions_overview/messagesendanonchannel","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"},{"label":"Actions"}]},{"id":"-LaQDoAKMNf85WZYnPoQ","title":"Authentication Actions","pathname":"/v1/reference/actions-processor/authentication-actions","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Actions Processor"}]},{"id":"-LKI57AW9SILLecKvSCX","title":"Script Hooks","pathname":"/v1/reference/hooksoverview","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"-LittAEt1hileTymwKjN","title":"Globals Variables","pathname":"/v1/reference/hooksoverview/filemaker-globals","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"}]},{"id":"-LjIOqEM657ZE5wgCJR6","title":"$$BF_Model","pathname":"/v1/reference/hooksoverview/filemaker-globals/usdusdbf_model","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"},{"label":"Globals Variables"}]},{"id":"-LjIRoou885Lx4_rOzmi","title":"$$BF_App","pathname":"/v1/reference/hooksoverview/filemaker-globals/usdusdbf_app","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"},{"label":"Globals Variables"}]},{"id":"-LjIRiRD5fvYit44XOgg","title":"$$BF_State","pathname":"/v1/reference/hooksoverview/filemaker-globals/usdusdbf_state","siteSpaceId":"sitesp_hJ0rI","description":"The state object holds various data related to the browser environment.","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"},{"label":"Globals Variables"}]},{"id":"-LKI57AX9uS6FNgRLs8u","title":"Keeping Keys Private","pathname":"/v1/reference/hooksoverview/payloadobject","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"}]},{"id":"-LKI57AY1W-HY1p1KcRB","title":"Reducing Payload Size","pathname":"/v1/reference/hooksoverview/env_vars","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"}]},{"id":"-LKI57A_UWHVlvb_dxxL","title":"API Callback Endpoint","pathname":"/v1/reference/hooksoverview/callback","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"}]},{"id":"-LKI57AZKhybCFkHjyRj","title":"Common Hooks","pathname":"/v1/reference/hooksoverview/commonoverview","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"}]},{"id":"-LKI57AbpkaRdCKeNUv1","title":"Scoped Hooks","pathname":"/v1/reference/hooksoverview/hooks","siteSpaceId":"sitesp_hJ0rI","description":"Scoped hooks are specific to the page on which they are initiated and contain relevant data about the page context","breadcrumbs":[{"label":"Reference"},{"label":"Script Hooks"}]},{"id":"-LlHzrx0uwCnKs__oDZ3","title":"Users & Authentication","pathname":"/v1/reference/users-and-authentication","siteSpaceId":"sitesp_hJ0rI","description":"This section will guide you through how authentication is built into BetterForms and how you can customize its behavior to meet the needs of your app.","breadcrumbs":[{"label":"Reference"}]},{"id":"-LlI3dT8sk0uHd_5C7VS","title":"Managing User Accounts","pathname":"/v1/reference/users-and-authentication/managing-users","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Users & Authentication"}]},{"id":"-Ll3OG6bVwd0h-o49wNj","title":"Custom Login Pages","pathname":"/v1/reference/users-and-authentication/custom-login-pages","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Users & Authentication"}]},{"id":"-Litw_dzM_8y-aq_LGVq","title":"Advanced Configuration","pathname":"/v1/reference/advanced-configuration","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"}]},{"id":"-LKNnTwbr4FPji-yDMVT","title":"Custom Domains","pathname":"/v1/reference/advanced-configuration/custom-domains","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Advanced Configuration"}]},{"id":"-M3XClvZrR6bPjs_hwvq","title":"BF Utility Functions","pathname":"/v1/reference/bf-utility-function-ver-0.9.20+","siteSpaceId":"sitesp_hJ0rI","description":"BetterForm has a collection of helper Java Script functions that are used within JavaScript to allow  easy access to common complex code.","breadcrumbs":[{"label":"Reference"}]},{"id":"-LzhShliAoj0plYjfEYQ","title":"BF Error Codes","pathname":"/v1/reference/bf-error-codes","siteSpaceId":"sitesp_hJ0rI","description":"FM BetterForms can throw various errors due to code or configuration. Errors can appear in the Helper File, Developer Tools ( when enabled) or the browser console. For the lates list of error code see","breadcrumbs":[{"label":"Reference"}]},{"id":"-MQnHnSrmCtCDv1PsnGQ","title":"Messaging","pathname":"/v1/reference/messaging-ver-0.10.14+","siteSpaceId":"sitesp_hJ0rI","description":"Messaging is intended to be used for real-time features, such as notifications, chat or auto updates. Messaging also allows data to be pushed from FileMaker into your BetterForms apps.","breadcrumbs":[{"label":"Reference"}]},{"id":"-MQnOz5VdaAg65jeSUh1","title":"Adding users to channels","pathname":"/v1/reference/messaging-ver-0.10.14+/adding-users-to-channels","siteSpaceId":"sitesp_hJ0rI","description":"You can add users to channels either by calling a FileMaker script in the Helper File, or by calling a REST API endpoint of your BetterForms domain.","breadcrumbs":[{"label":"Reference"},{"label":"Messaging"}]},{"id":"-MQnWuuDWFvqcqR019B0","title":"Removing users from channels","pathname":"/v1/reference/messaging-ver-0.10.14+/removing-users-from-channels","siteSpaceId":"sitesp_hJ0rI","description":"Similar to adding users, you can remove users either by a REST API call, or via a FileMaker script in your helper file.","breadcrumbs":[{"label":"Reference"},{"label":"Messaging"}]},{"id":"-MQnZ1Vlxj1LvHfff20D","title":"Sending messages","pathname":"/v1/reference/messaging-ver-0.10.14+/sending-messages","siteSpaceId":"sitesp_hJ0rI","description":"Once your users are subscribed to a channel or two, you can send messages to them!","breadcrumbs":[{"label":"Reference"},{"label":"Messaging"}]},{"id":"-MQnlxSt2xy95e-iIb60","title":"Get connected users","pathname":"/v1/reference/messaging-ver-0.10.14+/get-all-users-connected","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Messaging"}]},{"id":"-MRLDPnph1aV2YD2JPTj","title":"Get active channels","pathname":"/v1/reference/messaging-ver-0.10.14+/get-active-channels","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Reference"},{"label":"Messaging"}]},{"id":"-LittEA5A9If9Jb1L7L3","title":"Troubleshooting","pathname":"/v1/usage/troubleshooting","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"}]},{"id":"-LaDaHp26_hGvKgC30xh","title":"Debugging","pathname":"/v1/usage/troubleshooting/debugging","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"Troubleshooting"}]},{"id":"-LvGClvxoLeSwD4AZtg0","title":"Frozen Actions Queue","pathname":"/v1/usage/troubleshooting/frozen-actions-queue","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"Troubleshooting"}]},{"id":"-LittCa1-nC7ShWkVxyb","title":"JavaScript Tips","pathname":"/v1/usage/javascript-tips","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"}]},{"id":"-M9ZYa9m4MUJ2m-9CmXf","title":"Calling Named Actions from HTML Vue Events","pathname":"/v1/usage/javascript-tips/calling-named-actions-from-html-vue-events","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"JavaScript Tips"}]},{"id":"-LOKAZGQ0J7cf6hmXbRy","title":"Calculations","pathname":"/v1/usage/javascript-tips/calculations","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"JavaScript Tips"}]},{"id":"-LKI579ZLqqDmaU3rO25","title":"System Overview","pathname":"/v1/usage/system-overview","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"}]},{"id":"-LKI579nQvaPhISvZVe_","title":"Forms Processor","pathname":"/v1/usage/formsoverview","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"}]},{"id":"-LKI579pRdOp38Q19UXK","title":"Form Types","pathname":"/v1/usage/formsoverview/formtypesoverview","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"Forms Processor"}]},{"id":"-LapoO2Fxk_FY8vcmB7G","title":"HTML & VueJS","pathname":"/v1/usage/formsoverview/working-with-html","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"Forms Processor"}]},{"id":"-LKI57AInZZZqneSdxwu","title":"Styling and Design","pathname":"/v1/usage/formsoverview/styling","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"Forms Processor"}]},{"id":"-LWrF-nCCnNdNQpN8EaF","title":"JS Caclulations and Functions","pathname":"/v1/usage/formsoverview/js-caclulations-and-functions","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"Forms Processor"}]},{"id":"-LKI57Adj4Gq-hn_VMku","title":"Customizing and Styling","pathname":"/v1/usage/stylingverview","siteSpaceId":"sitesp_hJ0rI","description":"There are many ways to customize a BetterForms site to suit the needs of your application!","breadcrumbs":[{"label":"Usage Tips"}]},{"id":"-M6NaOpMpNeaoJBKozjn","title":"Custom Components","pathname":"/v1/usage/stylingverview/custom-components-1","siteSpaceId":"sitesp_hJ0rI","description":"This is a preliminary spec for building and using custom components","breadcrumbs":[{"label":"Usage Tips"},{"label":"Customizing and Styling"}]},{"id":"-LjI_N1w9YK0bjSfS5qm","title":"Custom CSS","pathname":"/v1/usage/stylingverview/custom-css","siteSpaceId":"sitesp_hJ0rI","description":"You can apply custom CSS styles on a per-site basis","breadcrumbs":[{"label":"Usage Tips"},{"label":"Customizing and Styling"}]},{"id":"-M5OO7ibzXButzn92EdW","title":"Custom Components","pathname":"/v1/usage/stylingverview/custom-components","siteSpaceId":"sitesp_hJ0rI","description":"What are they, how are they reusable and why","breadcrumbs":[{"label":"Usage Tips"},{"label":"Customizing and Styling"}]},{"id":"-LjIYsSd3x4lGESJn7D8","title":"Page Pre-loaders","pathname":"/v1/usage/stylingverview/page-pre-loaders","siteSpaceId":"sitesp_hJ0rI","description":"Customize the animated page loading style","breadcrumbs":[{"label":"Usage Tips"},{"label":"Customizing and Styling"}]},{"id":"-LjIZVdXbU2ZI-hOWP-I","title":"Favicon","pathname":"/v1/usage/stylingverview/favicon","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"Customizing and Styling"}]},{"id":"-LUn5G1qOy2lKkpRXe59","title":"Design Patterns and Best Practices","pathname":"/v1/usage/design-patterns-and-debugging","siteSpaceId":"sitesp_hJ0rI","description":"UX, Performance optimizations and best practices for building BetterForms apps.","breadcrumbs":[{"label":"Usage Tips"}]},{"id":"-M13VeifS4y-g10GuilD","title":"Working with environments","pathname":"/v1/usage/design-patterns-and-debugging/untitled","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"Design Patterns and Best Practices"}]},{"id":"-LUnD0kfuvo2Vsl_r36M","title":"Handling Data","pathname":"/v1/usage/design-patterns-and-debugging/fetching-data","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"Design Patterns and Best Practices"}]},{"id":"-LUnDNF_RHDKJebVQk0G","title":"Saving Data","pathname":"/v1/usage/design-patterns-and-debugging/saving-data","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"Design Patterns and Best Practices"}]},{"id":"-LYNCeXiNOMYam0RHJwr","title":"Optimization","pathname":"/v1/usage/design-patterns-and-debugging/optimization","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"Design Patterns and Best Practices"}]},{"id":"-LUnE9jlcfLrqv4MJnoK","title":"Business Logic","pathname":"/v1/usage/design-patterns-and-debugging/business-logic","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"Design Patterns and Best Practices"}]},{"id":"-LUnAFaMM8KhILL2Fupy","title":"UI / UX","pathname":"/v1/usage/design-patterns-and-debugging/ui-ux","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Usage Tips"},{"label":"Design Patterns and Best Practices"}]},{"id":"-LKI57AiJ1wX7MF1N0Jw","title":"Authentication","pathname":"/v1/security/authentication","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Security"}]},{"id":"-LPfyfPZ6YAig1pjJbNS","title":"Security White Paper","pathname":"/v1/security/white-paper","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Security"}]},{"id":"-LPcpE5ykW2ckD99TaLy","title":"Firewalls","pathname":"/v1/security/security","siteSpaceId":"sitesp_hJ0rI","description":"","breadcrumbs":[{"label":"Security"}]},{"id":"-M4yqTuIMdWeaVIxRET2","title":"Technology Stack","pathname":"/v1/security/technology-stack","siteSpaceId":"sitesp_hJ0rI","description":"Software and tools we use to run FM BetterForms!","breadcrumbs":[{"label":"Security"}]},{"id":"-M13Vk1jeK5KeHvK2eCR","title":"Compatibility","pathname":"/v1/compatibility","siteSpaceId":"sitesp_hJ0rI","description":"As of version 0.9.43 BetterForms is compatible with the following versions or newer. Older version may be supported but may have some limiting features as of Oct 22nd, 2020:"},{"id":"tfiq6xHjXVboOWlI9vp5","title":"BF Streaming Proxy","pathname":"/engineering-reference-docs","siteSpaceId":"sitesp_EOlBc"},{"id":"RPLBWsUFo7vbZzEJquyC","title":"Updating the Helper File","pathname":"/engineering-reference-docs/updating-the-helper-file","siteSpaceId":"sitesp_EOlBc"},{"id":"f6eCaB2XU8Xx6cK3Pcpl","title":"Connection Trouble Shooting Guide","pathname":"/engineering-reference-docs/connection-trouble-shooting-guide","siteSpaceId":"sitesp_EOlBc"},{"id":"Mc4IkImiL79r2mZa6EA3","title":"Software Testing - Overview","pathname":"/engineering-reference-docs/software-testing-overview","siteSpaceId":"sitesp_EOlBc"},{"id":"ux5TXfCG0Q0a5gq4VpTx","title":"Types of Testing","pathname":"/engineering-reference-docs/software-testing-overview/types-of-testing","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"}]},{"id":"wHW6stGSAn71rDaVgFPe","title":"UX/UI Checklist","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"}]},{"id":"tnoZPqJ4jiBDhCnjCBUV","title":"Pages","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/pages","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"}]},{"id":"xWSLY7ijGFVcTOLwfF37","title":"Login 🔑","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/pages/login","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Pages"}]},{"id":"u7Ka5iuFYJf3bAUnyrL0","title":"Pricing 💵","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/pages/pricing","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Pages"}]},{"id":"iV7kB53ukl525Wf9LQRP","title":"404 🤷‍♂️","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/pages/404","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Pages"}]},{"id":"9YE69p709LA2FV1BZRV2","title":"Contact Us ☎️","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/pages/contact-us","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Pages"}]},{"id":"T8EdNHO7oPr3KPQG0dX3","title":"Sign Up 👋","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/pages/sign-up","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Pages"}]},{"id":"7dQUHkiBohHPpzOC0EvY","title":"FAQ ❓","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/pages/faq","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Pages"}]},{"id":"0skVNqkPCcGWcB0HkSfK","title":"Blog Post 🗞","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/pages/blog-post","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Pages"}]},{"id":"cdQCnbe9Wp9VoDF2zaoi","title":"Careers 💼","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/pages/careers","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Pages"}]},{"id":"zbYoshbXFM9tDsuJLDfo","title":"Team 👫","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/pages/team","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Pages"}]},{"id":"a1Ncq1CmUZurSYI94NCD","title":"Cart 🛒","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/pages/cart","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Pages"}]},{"id":"PR2pHN2lrx3WL1gtHjBu","title":"Press 📸","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/pages/press","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Pages"}]},{"id":"dRQBh2IE4Hj7uG8UFFU1","title":"Search results 🔍","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/pages/search-results","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Pages"}]},{"id":"3aYOA0Eg1wDx2toFoPBV","title":"Elements","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"}]},{"id":"lskZIQsdpS3kxEWqRf96","title":"Avatar 😁","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/avatar","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"w33tCraXEKKgLPxlalrT","title":"Badge 📛","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/badge","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"uSZAvbSlBWgXSxgEm5nj","title":"Button 🖲️","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/button","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"dzItKnpwKHqhKy20HP6r","title":"Card 🃏","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/card","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"8ZpPspbvZMD96lecDJtj","title":"Table 📏","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/table","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"wYTuFccwLIQVxb8Yo6PT","title":"Icon 🌠","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/icon","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"XyBjOvQ2kV5wicVu53Ll","title":"Text Field ⌨️","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/text-field","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"fTSQ04voKLAPKN1ONgjF","title":"Toggle 🎛️","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/toggle","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"WMskyJYyyMoC6LSHbdm3","title":"Loading ⏳","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/loading","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"cPLjMUQAX3dvP7CJn6qa","title":"Modal 🎉","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/modal","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"GhFi2RymAwJdYSBk7h7Z","title":"Tooltip 🛠","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/tooltip","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"BlC0nPjSeWY3ih17OI85","title":"Search 🕵️‍♀️","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/search","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"Dh5a3O1ISgi7EaHWgJYo","title":"Navigation 🧭","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/navigation","siteSpaceId":"sitesp_EOlBc","description":"","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"DP4BdA6CDzxHjjdyvRPD","title":"Radio 📻","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/radio","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"sLBLMB7R25YQilVjEt3I","title":"Checkbox ☑️","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/checkbox","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"J68VfMNa95wTFaBXGNw1","title":"Tabs 🗂","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/tabs","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"kiMJp1mt9UW7rvxuiRsa","title":"Toast 🍞","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/elements/toast","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Elements"}]},{"id":"fXDPtNRstazFBwXKKevG","title":"Flows","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/flows","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"}]},{"id":"4elrtQR2wnthKd8dsh4o","title":"Submitting a form 📨","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/flows/submitting-a-form","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Flows"}]},{"id":"Mdm7Q7Jcthe2dC5yVY0L","title":"Making a payment 💳","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/flows/making-a-payment","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Flows"}]},{"id":"WbNlBgikN4KGbVmUBpxb","title":"Contacting support 🆘","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/flows/contacting-support","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Flows"}]},{"id":"0J9ABB4XSGXsG9IKAZcR","title":"Deleting account 🗑","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/flows/deleting-account","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Flows"}]},{"id":"pYSPQ9ylHMjLDj8iFpkv","title":"Tracking progress 📈","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/flows/tracking-progress","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Flows"}]},{"id":"1qbxTqJxG7k6SC29dyj5","title":"Resetting password 🤫","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/flows/resetting-password","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Flows"}]},{"id":"WY8tLB0IAlV5pEfQe6tt","title":"Showing input error 🚨","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/flows/showing-input-error","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Flows"}]},{"id":"VDEIP2Hwx2NCHHzAlY0O","title":"Entering a promo code 🏷️","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/flows/entering-a-promo-code","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Flows"}]},{"id":"AOQu1smI3yWiQCXCxeo2","title":"Saving changes 💾","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/flows/saving-changes","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Flows"}]},{"id":"cmiNxsRUOcbGt9ED1B8d","title":"Canceling subscription 🛑","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/flows/canceling-subscription","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Flows"}]},{"id":"UrGj2BEru4lYNPQiX77q","title":"Topics","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/topics","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"}]},{"id":"OJLnpXPe0l5KEmNHuhNw","title":"Responsiveness 🎚","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/topics/responsiveness","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Topics"}]},{"id":"DZ90Q2IwBx0tg3XB92al","title":"Typography 🔤","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/topics/typography","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Topics"}]},{"id":"6NmUWtpqhPwwaT1xIDpT","title":"Dark mode 🌑","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/topics/dark-mode","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Topics"}]},{"id":"J2BeV5ueia3pS33bGA04","title":"Accessibility 🚹","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/topics/accessibility","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Topics"}]},{"id":"dDg4qtPiaUqz7L5VODD8","title":"Colors 🎨","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/topics/colors","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Topics"}]},{"id":"12BgWSrTq8upG3dlDNpV","title":"UX Writing ✏️","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/topics/ux-writing","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Topics"}]},{"id":"Y9KSyB6bY09XOoOUHY03","title":"Brand","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/brand","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"}]},{"id":"slAPqNpNZFctYmqvXwgF","title":"Logo 💠","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/brand/logo","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Brand"}]},{"id":"GLurkLUhXoOR7dWchuXp","title":"Social Media 🔉","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/brand/social-media","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Brand"}]},{"id":"0DlA4UI7WMsyPY8cCZ45","title":"Typography 🔠","pathname":"/engineering-reference-docs/software-testing-overview/ux-ui-checklist/brand/typography","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"},{"label":"UX/UI Checklist"},{"label":"Brand"}]},{"id":"ZsxltMF8WHKNE2s6Y9IZ","title":"FM BetterForms - Quality Assurance","pathname":"/engineering-reference-docs/software-testing-overview/fm-betterforms-quality-assurance","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"}]},{"id":"Ym0CAa4MSygSF2UIpfV6","title":"JavaScript Libraries","pathname":"/engineering-reference-docs/software-testing-overview/javascript-libraries","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Software Testing - Overview"}]},{"id":"1qQKEgy0RXcmSuaRX5wB","title":"Rollbacks and Version Control","pathname":"/engineering-reference-docs/rollbacks-and-version-control","siteSpaceId":"sitesp_EOlBc"},{"id":"dBbq6cWuHfXAaHfu2OD4","title":"BF Server Proxy","pathname":"/engineering-reference-docs/bf-server-proxy","siteSpaceId":"sitesp_EOlBc"},{"id":"dU02MqHkipi8fHpswjLp","title":"Base code End of Life - 0.8.78-0.8111","pathname":"/engineering-reference-docs/base-code-end-of-life-0.8.78-0.8111","siteSpaceId":"sitesp_EOlBc"},{"id":"kpSOQ5Zzvn4442Eqe3xD","title":"Setting up Auth0","pathname":"/engineering-reference-docs/setting-up-auth0","siteSpaceId":"sitesp_EOlBc"},{"id":"t3acNh44goc6QuXwtyyU","title":"Introduction","pathname":"/engineering-reference-docs/setting-up-auth0/introduction","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Setting up Auth0"}]},{"id":"adBM7jxaNzkD8thh5iom","title":"Getting started","pathname":"/engineering-reference-docs/setting-up-auth0/getting-started","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Setting up Auth0"}]},{"id":"h51wOtmaetzgh0aJZLdc","title":"Creating a tenant","pathname":"/engineering-reference-docs/setting-up-auth0/getting-started/creating-a-tenant","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Setting up Auth0"},{"label":"Getting started"}]},{"id":"HO37Ht3Snk5VwT0yLvgy","title":"Creating Application","pathname":"/engineering-reference-docs/setting-up-auth0/getting-started/creating-application","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Setting up Auth0"},{"label":"Getting started"}]},{"id":"3V7gJqx2hTqzoQtDe75e","title":"Additional customizations","pathname":"/engineering-reference-docs/setting-up-auth0/getting-started/additional-customizations","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Setting up Auth0"},{"label":"Getting started"}]},{"id":"9YtKOwqJWCWJcS2S6Csf","title":"Allowed Callback URLs","pathname":"/engineering-reference-docs/setting-up-auth0/getting-started/additional-customizations/allowed-callback-urls","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Setting up Auth0"},{"label":"Getting started"},{"label":"Additional customizations"}]},{"id":"Fu9WZRrWWMj9a7DNaxk0","title":"Creating a Database","pathname":"/engineering-reference-docs/setting-up-auth0/creating-a-database","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Setting up Auth0"}]},{"id":"eSPVyiBhzww9uI6qKoaY","title":"Choosing different login options","pathname":"/engineering-reference-docs/setting-up-auth0/creating-a-database/choosing-different-login-options","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Setting up Auth0"},{"label":"Creating a Database"}]},{"id":"VYTaR000C82EJjU2qzrw","title":"Social Connections","pathname":"/engineering-reference-docs/setting-up-auth0/creating-a-database/choosing-different-login-options/social-connections","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Setting up Auth0"},{"label":"Creating a Database"},{"label":"Choosing different login options"}]},{"id":"ZxG42pvAtrDy7x94cWHK","title":"Username and password (Auth0)","pathname":"/engineering-reference-docs/setting-up-auth0/creating-a-database/choosing-different-login-options/username-and-password-auth0","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Setting up Auth0"},{"label":"Creating a Database"},{"label":"Choosing different login options"}]},{"id":"ZQuFlHpNRhoheFbdWgvo","title":"Creating new BF Users","pathname":"/engineering-reference-docs/setting-up-auth0/creating-a-database/choosing-different-login-options/creating-new-bf-users","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Setting up Auth0"},{"label":"Creating a Database"},{"label":"Choosing different login options"}]},{"id":"DGFJPPRc7kUHkUB4QXs9","title":"Using Auth0 in an iFrame","pathname":"/engineering-reference-docs/setting-up-auth0/creating-a-database/choosing-different-login-options/using-auth0-in-an-iframe","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Setting up Auth0"},{"label":"Creating a Database"},{"label":"Choosing different login options"}]},{"id":"oqKlih5oFUADY8VuR5bE","title":"Configuring FM BetterForms","pathname":"/engineering-reference-docs/setting-up-auth0/creating-a-database/choosing-different-login-options/configuring-fm-betterforms","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Setting up Auth0"},{"label":"Creating a Database"},{"label":"Choosing different login options"}]},{"id":"uKzNgzxgYJgM35J5MoXc","title":"Additional Notes","pathname":"/engineering-reference-docs/setting-up-auth0/creating-a-database/choosing-different-login-options/additional-notes","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Setting up Auth0"},{"label":"Creating a Database"},{"label":"Choosing different login options"}]},{"id":"guXxEihE6DYmKTdWr1RU","title":"Create an S3 Bucket on AWS","pathname":"/engineering-reference-docs/create-an-s3-bucket-on-aws","siteSpaceId":"sitesp_EOlBc"},{"id":"SrAqfk4MM4MpwKeVvyht","title":"ApexCharts - Getting started","pathname":"/engineering-reference-docs/apexcharts-getting-started","siteSpaceId":"sitesp_EOlBc"},{"id":"VVVzzZ4ewwhH3SObUyy7","title":"BF Enterprise Documentation","pathname":"/engineering-reference-docs/bf-enterprise-documentation","siteSpaceId":"sitesp_EOlBc"},{"id":"fWhqIbvWe6YD3Ir1uMKI","title":"Overview","pathname":"/engineering-reference-docs/bf-enterprise-documentation/overview","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"}]},{"id":"Mtdb7ZrthkRi0jL8q4KM","title":"Features","pathname":"/engineering-reference-docs/bf-enterprise-documentation/overview/features","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"},{"label":"Overview"}]},{"id":"TCMULPatiozYtHLtTcdL","title":"Overview Diagram","pathname":"/engineering-reference-docs/bf-enterprise-documentation/overview/overview-diagram","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"},{"label":"Overview"}]},{"id":"bUlDOdX3YUy5esogPCSt","title":"Requirements","pathname":"/engineering-reference-docs/bf-enterprise-documentation/requirements","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"}]},{"id":"iHGSRDzuvsCCANTXvH5M","title":"Env File","pathname":"/engineering-reference-docs/bf-enterprise-documentation/env-file","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"}]},{"id":"H8wK3v3Asms1ROlO2rDe","title":"Setting up the Server","pathname":"/engineering-reference-docs/bf-enterprise-documentation/setting-up-the-server","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"}]},{"id":"eN1d8M3HZpGfLhKyPoFS","title":"Installation","pathname":"/engineering-reference-docs/bf-enterprise-documentation/setting-up-the-server/installation","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"},{"label":"Setting up the Server"}]},{"id":"aFPhnpbQmWHaZ8xe1Zwb","title":"Loading image to a local repository","pathname":"/engineering-reference-docs/bf-enterprise-documentation/setting-up-the-server/loading-image-to-a-local-repository","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"},{"label":"Setting up the Server"}]},{"id":"TrJMsug24ywVi8qxJZO7","title":"Starting server","pathname":"/engineering-reference-docs/bf-enterprise-documentation/setting-up-the-server/starting-server","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"},{"label":"Setting up the Server"}]},{"id":"BFA6yFG2Q3BxbG5l7WfY","title":"Restarting Policies","pathname":"/engineering-reference-docs/bf-enterprise-documentation/setting-up-the-server/restarting-policies","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"},{"label":"Setting up the Server"}]},{"id":"zeXQXEB5Qv6wGGpjBOWh","title":"Scaling up","pathname":"/engineering-reference-docs/bf-enterprise-documentation/setting-up-the-server/scaling-up","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"},{"label":"Setting up the Server"}]},{"id":"NFC2jL1Z8t7EV6ycTXms","title":"Hardware Recommendations","pathname":"/engineering-reference-docs/bf-enterprise-documentation/hardware-recommendations","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"}]},{"id":"QvHeDJOyBF6QTRiS2jRU","title":"FM Credentials - Helper file","pathname":"/engineering-reference-docs/bf-enterprise-documentation/fm-credentials-helper-file","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"}]},{"id":"kPPixnYAgSFy01xi4pUE","title":"How it works","pathname":"/engineering-reference-docs/bf-enterprise-documentation/how-it-works","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"}]},{"id":"v7sAKH0cJJZYQhGx91zy","title":"Development","pathname":"/engineering-reference-docs/bf-enterprise-documentation/how-it-works/development","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"},{"label":"How it works"}]},{"id":"VyuBKxaC8th4IypLI7hC","title":"Downloading environment data","pathname":"/engineering-reference-docs/bf-enterprise-documentation/how-it-works/downloading-environment-data","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BF Enterprise Documentation"},{"label":"How it works"}]},{"id":"aiFXNji6SMKnsWWXeJFF","title":"BetterForms Error Pages API","pathname":"/engineering-reference-docs/betterforms-error-pages-api","siteSpaceId":"sitesp_EOlBc"},{"id":"yTSF1GbIZqH7qP5DSYJw","title":"Introduction","pathname":"/engineering-reference-docs/betterforms-error-pages-api/introduction","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BetterForms Error Pages API"}]},{"id":"2LpWKuBBdsZR46uHStfW","title":"Dynamic Error Page","pathname":"/engineering-reference-docs/betterforms-error-pages-api/dynamic-error-page","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BetterForms Error Pages API"}]},{"id":"dNykaGtmLYu8FZFhN3xh","title":"Static Error Page","pathname":"/engineering-reference-docs/betterforms-error-pages-api/static-error-page","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BetterForms Error Pages API"}]},{"id":"1pj6A9LCDzjtv8qT2PRz","title":"Custom error pages","pathname":"/engineering-reference-docs/betterforms-error-pages-api/custom-error-pages","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BetterForms Error Pages API"}]},{"id":"3WMmQLt5bkLs8es3sFtt","title":"Custom error handlers","pathname":"/engineering-reference-docs/betterforms-error-pages-api/custom-error-handlers","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BetterForms Error Pages API"}]},{"id":"zOlXgvAkHtuY5dY9qFOb","title":"Error Code List","pathname":"/engineering-reference-docs/betterforms-error-pages-api/error-code-list","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"BetterForms Error Pages API"}]},{"id":"iN6oVJlsrwRChuHFsYVb","title":"BF Streaming API","pathname":"/engineering-reference-docs/bf-streaming-api","siteSpaceId":"sitesp_EOlBc"},{"id":"tkGsZHmEPun98kvmBSYG","title":"Creating a PWA","pathname":"/engineering-reference-docs/creating-a-pwa","siteSpaceId":"sitesp_EOlBc"},{"id":"v3CFJH739C0ACy8QucfR","title":"Introduction","pathname":"/engineering-reference-docs/creating-a-pwa/introduction","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Creating a PWA"}]},{"id":"q0zW9tMz6OZ5w66uI3PS","title":"Getting Started","pathname":"/engineering-reference-docs/creating-a-pwa/getting-started","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Creating a PWA"}]},{"id":"2AIf9GUEndeFf0QL9kRf","title":"Making it installable","pathname":"/engineering-reference-docs/creating-a-pwa/getting-started/making-it-installable","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Creating a PWA"},{"label":"Getting Started"}]},{"id":"BYRlA8Kb3jlg5zIyH0qc","title":"Browser Support","pathname":"/engineering-reference-docs/creating-a-pwa/getting-started/browser-support","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Creating a PWA"},{"label":"Getting Started"}]},{"id":"yG5IoJujgp5qcdytUDTm","title":"Sending Push Notifications","pathname":"/engineering-reference-docs/creating-a-pwa/getting-started/sending-push-notifications","siteSpaceId":"sitesp_EOlBc","description":"NOTE: This page is obsolute due to API changes, see BF Team Support","breadcrumbs":[{"label":"Creating a PWA"},{"label":"Getting Started"}]},{"id":"MS0J2bQxgUjte2sCjb1I","title":"Sending a Push Notification from the API Endpoint","pathname":"/engineering-reference-docs/creating-a-pwa/getting-started/sending-a-push-notification-from-the-api-endpoint","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Creating a PWA"},{"label":"Getting Started"}]},{"id":"62hQgMgsFCLPuPq4xXJV","title":"Adding DOM Header Insertion to be Available for Offline Use","pathname":"/engineering-reference-docs/creating-a-pwa/getting-started/adding-dom-header-insertion-to-be-available-for-offline-use","siteSpaceId":"sitesp_EOlBc","breadcrumbs":[{"label":"Creating a PWA"},{"label":"Getting Started"}]}]}