# Table of Contents - [Design standards | Canvas Documentation](#design-standards-canvas-documentation) - [Cookies Permission | Canvas Documentation](#cookies-permission-canvas-documentation) - [404 | Canvas Documentation](#404-canvas-documentation) - [Widgets | Canvas Documentation](#widgets-canvas-documentation) - [Reusable elements | Canvas Documentation](#reusable-elements-canvas-documentation) - [Legal | Canvas Documentation](#legal-canvas-documentation) - [Login | Canvas Documentation](#login-canvas-documentation) - [Reset Password | Canvas Documentation](#reset-password-canvas-documentation) - [Index | Canvas Documentation](#index-canvas-documentation) - [Reference | Canvas Documentation](#reference-canvas-documentation) - [SEO | Canvas Documentation](#seo-canvas-documentation) - [Verify | Canvas Documentation](#verify-canvas-documentation) - [Key Features | Canvas Documentation](#key-features-canvas-documentation) - [Introduction | Canvas Documentation](#introduction-canvas-documentation) - [Admin Portal | Canvas Documentation](#admin-portal-canvas-documentation) - [Principles | Canvas Documentation](#principles-canvas-documentation) - [Account | Canvas Documentation](#account-canvas-documentation) - [Pages | Canvas Documentation](#pages-canvas-documentation) - [Footer | Canvas Documentation](#footer-canvas-documentation) - [Backend Workflows | Canvas Documentation](#backend-workflows-canvas-documentation) - [Signup & Login | Canvas Documentation](#signup-login-canvas-documentation) - [Getting Started | Canvas Documentation](#getting-started-canvas-documentation) - [Roles & Permissions | Canvas Documentation](#roles-permissions-canvas-documentation) - [Menu Focus Elements | Canvas Documentation](#menu-focus-elements-canvas-documentation) - [Branding & Design | Canvas Documentation](#branding-design-canvas-documentation) - [Introduction | Canvas Documentation](#introduction-canvas-documentation) - [Learning Bubble Basics | Canvas Documentation](#learning-bubble-basics-canvas-documentation) - [Data & Workflows | Canvas Documentation](#data-workflows-canvas-documentation) - [Database | Canvas Documentation](#database-canvas-documentation) - [For Designers | Canvas Documentation](#for-designers-canvas-documentation) - [Data triggers | Canvas Documentation](#data-triggers-canvas-documentation) - [Admin Portal | Canvas Documentation](#admin-portal-canvas-documentation) - [Header | Canvas Documentation](#header-canvas-documentation) - [Miscellaneous | Canvas Documentation](#miscellaneous-canvas-documentation) - [What's New | Canvas Documentation](#what-s-new-canvas-documentation) - [Modularity | Canvas Documentation](#modularity-canvas-documentation) - [Option Sets | Canvas Documentation](#option-sets-canvas-documentation) - [Reference | Canvas Documentation](#reference-canvas-documentation) - [Index | Canvas Documentation](#index-canvas-documentation) - [Key Features | Canvas Documentation](#key-features-canvas-documentation) - [Cookie and consent banner | Canvas Documentation](#cookie-and-consent-banner-canvas-documentation) - [Introduction | Canvas Documentation](#introduction-canvas-documentation) - [Pages | Canvas Documentation](#pages-canvas-documentation) - [Set up Payment info on Account page | Canvas Documentation](#set-up-payment-info-on-account-page-canvas-documentation) - [Marketing Pages | Canvas Documentation](#marketing-pages-canvas-documentation) - [Security | Canvas Documentation](#security-canvas-documentation) - [Miscellaneous | Canvas Documentation](#miscellaneous-canvas-documentation) - [Menus & Navigation | Canvas Documentation](#menus-navigation-canvas-documentation) - [Data & Workflows | Canvas Documentation](#data-workflows-canvas-documentation) - [Customizing your app's portal page colors | Canvas Documentation](#customizing-your-app-s-portal-page-colors-canvas-documentation) - [Data types | Canvas Documentation](#data-types-canvas-documentation) - [Manually Building UI | Canvas Documentation](#manually-building-ui-canvas-documentation) - [Setting your password policy | Canvas Documentation](#setting-your-password-policy-canvas-documentation) - [Configuring multiple languages | Canvas Documentation](#configuring-multiple-languages-canvas-documentation) - [Design | Canvas Documentation](#design-canvas-documentation) - [Bubble Pages & Blocks | Canvas Documentation](#bubble-pages-blocks-canvas-documentation) - [Roles & Permissions | Canvas Documentation](#roles-permissions-canvas-documentation) - [Speed | Canvas Documentation](#speed-canvas-documentation) - [Loading screen | Canvas Documentation](#loading-screen-canvas-documentation) - [Emails & Alerts | Canvas Documentation](#emails-alerts-canvas-documentation) - [Getting Started | Canvas Documentation](#getting-started-canvas-documentation) - [Setting up two factor authentication | Canvas Documentation](#setting-up-two-factor-authentication-canvas-documentation) - [Marketing Pages | Canvas Documentation](#marketing-pages-canvas-documentation) - [Bubble Pages & Blocks | Canvas Documentation](#bubble-pages-blocks-canvas-documentation) - [Mail merge terms | Canvas Documentation](#mail-merge-terms-canvas-documentation) - [Branding & Design | Canvas Documentation](#branding-design-canvas-documentation) - [Key Features | Canvas Documentation](#key-features-canvas-documentation) - [Reference | Canvas Documentation](#reference-canvas-documentation) - [Pages | Canvas Documentation](#pages-canvas-documentation) - [Introduction | Canvas Documentation](#introduction-canvas-documentation) - [Privacy Policy (deprecated) | Canvas Documentation](#privacy-policy-deprecated-canvas-documentation) - [Login | Canvas Documentation](#login-canvas-documentation) - [Index | Canvas Documentation](#index-canvas-documentation) - [Account | Canvas Documentation](#account-canvas-documentation) - [404 | Canvas Documentation](#404-canvas-documentation) - [Reset Password | Canvas Documentation](#reset-password-canvas-documentation) - [404 | Canvas Documentation](#404-canvas-documentation) - [Legal | Canvas Documentation](#legal-canvas-documentation) - [Getting Started | Canvas Documentation](#getting-started-canvas-documentation) - [Reset Password | Canvas Documentation](#reset-password-canvas-documentation) - [Canvas Design System Figma File | Canvas Documentation](#canvas-design-system-figma-file-canvas-documentation) - [Admin Portal | Canvas Documentation](#admin-portal-canvas-documentation) - [Cookies Permission | Canvas Documentation](#cookies-permission-canvas-documentation) - [About us | Canvas Documentation](#about-us-canvas-documentation) - [Verify | Canvas Documentation](#verify-canvas-documentation) - [Marketplace homepage | Canvas Documentation](#marketplace-homepage-canvas-documentation) - [Product homepage | Canvas Documentation](#product-homepage-canvas-documentation) - [Pricing | Canvas Documentation](#pricing-canvas-documentation) - [Widgets | Canvas Documentation](#widgets-canvas-documentation) - [SaaS homepage | Canvas Documentation](#saas-homepage-canvas-documentation) - [Legal | Canvas Documentation](#legal-canvas-documentation) - [Sidebar tab | Canvas Documentation](#sidebar-tab-canvas-documentation) - [Backend Workflows | Canvas Documentation](#backend-workflows-canvas-documentation) - [Reusable elements | Canvas Documentation](#reusable-elements-canvas-documentation) - [Reusable elements | Canvas Documentation](#reusable-elements-canvas-documentation) - [Roles & Permissions | Canvas Documentation](#roles-permissions-canvas-documentation) - [Branding & Design | Canvas Documentation](#branding-design-canvas-documentation) - [Login | Canvas Documentation](#login-canvas-documentation) - [Data & Workflows | Canvas Documentation](#data-workflows-canvas-documentation) - [Menus & Navigation | Canvas Documentation](#menus-navigation-canvas-documentation) - [Account | Canvas Documentation](#account-canvas-documentation) - [Signup & Log in | Canvas Documentation](#signup-log-in-canvas-documentation) - [Terms of Service (deprecated) | Canvas Documentation](#terms-of-service-deprecated-canvas-documentation) - [Miscellaneous | Canvas Documentation](#miscellaneous-canvas-documentation) - [What's New | Canvas Documentation](#what-s-new-canvas-documentation) - [Menu Focus Elements | Canvas Documentation](#menu-focus-elements-canvas-documentation) - [Footer | Canvas Documentation](#footer-canvas-documentation) - [Marketing Pages | Canvas Documentation](#marketing-pages-canvas-documentation) - [For Designers | Canvas Documentation](#for-designers-canvas-documentation) - [Menus & Navigation | Canvas Documentation](#menus-navigation-canvas-documentation) - [Admin Portal | Canvas Documentation](#admin-portal-canvas-documentation) - [Bubble Pages & Blocks | Canvas Documentation](#bubble-pages-blocks-canvas-documentation) - [Option Sets | Canvas Documentation](#option-sets-canvas-documentation) - [Data types | Canvas Documentation](#data-types-canvas-documentation) - [Admin Portal | Canvas Documentation](#admin-portal-canvas-documentation) - [Emails & Alerts | Canvas Documentation](#emails-alerts-canvas-documentation) - [Widgets | Canvas Documentation](#widgets-canvas-documentation) - [Cookies Permission | Canvas Documentation](#cookies-permission-canvas-documentation) - [Header | Canvas Documentation](#header-canvas-documentation) - [Admin Portal | Canvas Documentation](#admin-portal-canvas-documentation) - [Header | Canvas Documentation](#header-canvas-documentation) - [Footer | Canvas Documentation](#footer-canvas-documentation) - [Popups Reusable (derprecated) | Canvas Documentation](#popups-reusable-derprecated-canvas-documentation) - [Signup & Login | Canvas Documentation](#signup-login-canvas-documentation) - [Backend Workflows | Canvas Documentation](#backend-workflows-canvas-documentation) - [Design standards | Canvas Documentation](#design-standards-canvas-documentation) - [Principles | Canvas Documentation](#principles-canvas-documentation) - [Learning Bubble Basics | Canvas Documentation](#learning-bubble-basics-canvas-documentation) - [Manually Building UI | Canvas Documentation](#manually-building-ui-canvas-documentation) - [Menu Focus Elements | Canvas Documentation](#menu-focus-elements-canvas-documentation) - [Option Sets | Canvas Documentation](#option-sets-canvas-documentation) - [Data types | Canvas Documentation](#data-types-canvas-documentation) - [Design | Canvas Documentation](#design-canvas-documentation) --- # Design standards | Canvas Documentation [PreviousBackend Workflows](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/api-workflows) [NextManually Building UI](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/design-standards/manually-building-ui) Last updated 4 years ago Was this helpful? [Manually Building UI](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/design-standards/manually-building-ui) --- # Cookies Permission | Canvas Documentation [PreviousSignup & Login](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/signup-login) [NextWidgets](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/widgets) Last updated 4 years ago Was this helpful? **Element name:** cookies\_permission **Purpose:** Get the user's consent to store cookies on their device To use this feature, make sure you enable this setting in the . By default, the cookies\_permission reusable element is placed in a floating group anchored to the bottom of marketing pages. To add this banner to another page, simply select "FloatingGroup cookies" and copy the floating group with workflows. On the new page, right click and select page with workflows. Make sure the floating group is flushed to the bottom of the page and set to "vertically float to the bottom". [Admin portal](https://docs.airdev.co/canvas/v/2.0.0/using-the-template/reference/pages/owners-portal-page#admin-portal-overview) --- # 404 | Canvas Documentation [PreviousVerify](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/verify) [NextReusable elements](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements) Last updated 4 years ago Was this helpful? **Page name:** 404 **Purpose:** Users are redirected to this page anytime they try to navigate to a page the does not exist Your app will come with a simple 404 page. A 404 page is also known as an “error page” or “Page Not Found” page. This page indicates that the user reached the domain they requested, but the URL path provided no information or the page does not exist. ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPzA9nzckjzx_cKjRy4%252F-MPzIJ27hGr5nT-71RsO%252Fimage.png%3Falt%3Dmedia%26token%3Dfd3f50bf-f832-464e-925c-5e10c881e073&width=768&dpr=4&quality=100&sign=c10dd0ea&sv=2) --- # Widgets | Canvas Documentation [PreviousCookies Permission](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/cookiespermission) [NextApp security](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/widgets/app-security) Last updated 4 years ago Was this helpful? **UI Widgets** UI widgets offer elements designed to be interacted with by your users on the front end and contain workflows specific to the reusable. Typically you should clone these reusables and customize them for your specific use case. **Workflow Widgets** Workflow widgets contain workflows that can be referenced from the page using the 'Trigger a custom workflow from a reusable element' action. [UI Widgets](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/widgets/ui-widgets) [Workflow Widgets](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/widgets/workflow-widgets) --- # Reusable elements | Canvas Documentation [Previous404](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/404) [NextHeader](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header) Last updated 4 years ago Was this helpful? Detailed references for each reusable element in the Canvas Base Template, complete with screenshots and in-depth descriptions. [Header](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header) [Footer](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/footer) [Signup & Login](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/signup-login) [Cookies Permission](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/cookiespermission) [Admin Portal](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/owners-portal-reusables) --- # Legal | Canvas Documentation [PreviousLogin](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/login) [NextReset Password](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/reset-password) Last updated 4 years ago Was this helpful? **Page name:** legal **Purpose:** Displays the text content for the Terms & Conditions and Privacy Policy. You can mange the **Privacy policy** content from Settings > Privacy policy in the . You can mange the **Terms of service** content from Settings > Terms of service in the . You can change the color of the legal banner from Settings > Legal page banner color in the . [Admin portal](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal) [Admin portal](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal) [Admin portal](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJQXmMYBr5Q1rzXHVt%252F-MXJQbF84d4-3_ExwEWt%252FScreen%2520Shot%25202021-04-02%2520at%25202.12.19%2520PM.png%3Falt%3Dmedia%26token%3D285c5980-ab60-471f-b8c2-4ea39f3d5171&width=768&dpr=4&quality=100&sign=44658874&sv=2) --- # Login | Canvas Documentation [PreviousAccount](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/account) [NextLegal](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/legal) Last updated 4 years ago Was this helpful? **Page name:** login **Purpose:** Provides functionality for your users to signup and login to your application and go through the forgot password process You can mange the log in page design from Branding > Log in page style in the . [Admin portal](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXISZPhhkICb6GjgO79%252F-MXJ17tpTxTRkuSfzL2H%252Fimage.png%3Falt%3Dmedia%26token%3D0c29ff8f-5e55-4901-a835-9be61fbcd783&width=768&dpr=4&quality=100&sign=f3b39450&sv=2) --- # Reset Password | Canvas Documentation [PreviousLegal](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/legal) [NextVerify](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/verify) Last updated 4 years ago Was this helpful? **Page name:** reset\_pw **Purpose:** Allows the user to reset their password when they click the 'Forgot password' link on the login page When the user goes through the 'Forgot password' flow they will receive an email with a link to reset their password. Clicking that link will bring them to this page. ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPzA9nzckjzx_cKjRy4%252F-MPzHIazpck0q53JqLj4%252Fimage.png%3Falt%3Dmedia%26token%3D5e324499-fbf7-41cf-a6ba-6d9d2a1a2c9e&width=768&dpr=4&quality=100&sign=c930d4ef&sv=2) --- # Index | Canvas Documentation [PreviousPages](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages) [NextAdmin Portal](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal) Last updated 4 years ago Was this helpful? **Page name:** index **Purpose:** Acts as the home page for your application and manages all user redirection for logged in users The index page is the landing page for all non logged in users. You can manage the design and content through the in the Admin Portal. [Pages tab](https://docs.airdev.co/canvas/3.6/canvas-functionality/marketing-pages#building-your-marketing-page) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPz13ZQi5GMzJIEy8Zi%252F-MPz3AS8f6y9BgQ6MviD%252Fimage.png%3Falt%3Dmedia%26token%3D51152523-a070-4fad-a8ef-d9ad690e92ec&width=768&dpr=4&quality=100&sign=85c8fcf0&sv=2) --- # Reference | Canvas Documentation [PreviousMiscellaneous](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous) [NextPages](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages) Last updated 4 years ago Was this helpful? The content in the reference section assumes an intermediate level of proficiency with both Bubble and the Canvas system and contains detailed reference materials on the . If you want to extend the app in more complex ways than outlined in the previous sections, or understand each page's function in more detail, read through this section. [Canvas Base Template](https://bubble.io/template/canvas-starter-template-1541110863579x114287102114398200) [Pages](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages) [Menu Focus Elements](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/menu-focus-elements) [Data types](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/data-structure) [Option Sets](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets) [Backend Workflows](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/api-workflows) [Reusable elements](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements) --- # SEO | Canvas Documentation [](https://docs.airdev.co/canvas/3.6/using-bubble/seo#optimizing-your-site) Optimizing your site ----------------------------------------------------------------------------------------------------- There are a few best practices that you can follow to make sure your site is optimized for SEO ### [](https://docs.airdev.co/canvas/3.6/using-bubble/seo#meta-tags-for-pages) Meta tags for pages Make sure that each of your pages has an SEO Title & Description set up as those will be read by the search engine and will show up on the search results page. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/seo#h1-h2-...-tags-for-text-content) H1/H2/... tags for text content Set header text for text content that represents headings of various levels on your page. That will help search engines better understand the structure of the page. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/seo#alt-tags-for-images) Alt tags for images Set these tags for each of the images used on your page. This will help search engines understand what your images are. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/seo#links-instead-of-buttons) Links instead of buttons For navigation within the site it's often better to use links instead of buttons. That's because links are recognized by the search engine as connected to a page they're linking to and buttons aren't. [](https://docs.airdev.co/canvas/3.6/using-bubble/seo#getting-pages-indexed) Getting pages indexed ------------------------------------------------------------------------------------------------------- Now that your content is optimized, the key thing that you have to do in order to be discoverable through Google is to make sure that Google knows about your site. On a high level there are 2 ways that you can do that: 1. You can wait for the Google crawler to come across a link to your content on other sites that Google knows about 2. You can tell Google about your site and its page The first option relies on there being links to your site, which can take a long time to happen. So the second option is your best bet. Here's how to do that: ### [](https://docs.airdev.co/canvas/3.6/using-bubble/seo#set-up-your-sitemap) Set up your sitemap You'll first need to set up your "sitemap.xml" file, which is the file that gives Google the full list of pages in your application. Bubble makes it very easy to do so under the Settings tab. Note that some of those pages will be static and some of them will be dynamic (i.e. product page). Luckily Bubble is smart enough to handle both. For dynamic pages you should set a pretty URL field for your page, so that the URL has human readable text it in instead of the unique ID of the object ### [](https://docs.airdev.co/canvas/3.6/using-bubble/seo#provide-your-sitemap-to-google) Provide your sitemap to Google Now that you have your sitemap set up, you should tell Google about it. [PreviousSecurity](https://docs.airdev.co/canvas/3.6/using-bubble/security) [NextSpeed](https://docs.airdev.co/canvas/3.6/using-bubble/speed) Last updated 4 years ago Was this helpful? Create a account and add your domain to it. This might require you to verify the domain ownership as part of the process. Then, once your domain is set up, just add a link to your sitemap file, which will generally be https://\[yourdomain.com\]/sitemap.xml. Google will then take a little while (up to a few days) to crawl all of the links and discover their content. [Search Console](https://search.google.com/search-console) --- # Verify | Canvas Documentation [PreviousReset Password](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/reset-password) [Next404](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/404) Last updated 4 years ago Was this helpful? **Page name:** verify **Purpose:** Destination page where users are directed to when they click the verify button from the email in the email verification process [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/verify#workflows) Workflows ------------------------------------------------------------------------------------------------------------------ The verify page has four events that trigger different workflows depending on the scenario ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/verify#page-is-loaded-and-current-email-verification-is-empty) **Page is loaded and current email verification is empty** If`current page email verification is empty`, users will be shown an expired link group, and they will automatically be sent a new verification email. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/verify#page-is-loaded-and-current-email-verification-is-not-empty) **Page is loaded and current email verification is not empty** They will be shown am email verified group and the user's `date completed sign up` will be marked as completed. If the `email verification user's email`is different from the email verification's `email` field, then the user's email will be updated to the new email. Once the user's email is verified on this page, an API workflow will be scheduled to delete the current page email verification. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/verify#button-continue-is-clicked) **Button continue is clicked** Users will be redirect to the `index` page if they are logged in. If they are not logged in, they will be taken to the `login` page. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/verify#button-go-home-is-clicked) **Button go home is clicked** They will be redirected to the index page. If the user waits too long to verify their email the link will expire ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPzA9nzckjzx_cKjRy4%252F-MPzHjRHvYxriACaSKwS%252Fimage.png%3Falt%3Dmedia%26token%3Dddcc9809-d1b8-434f-b2c1-bc31b205dd79&width=768&dpr=4&quality=100&sign=1ef3f5af&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPzIrVdKjYEp2kmmcAC%252F-MPzJcWBtOhrehE3jxg3%252Fimage.png%3Falt%3Dmedia%26token%3D97e573b0-2d9d-4173-9c2f-865b2f02e3dd&width=768&dpr=4&quality=100&sign=cd89387&sv=2) --- # Key Features | Canvas Documentation [PreviousIntroduction](https://docs.airdev.co/canvas/3.6) [NextWhat's New](https://docs.airdev.co/canvas/3.6/whats-new) Last updated 4 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.6/features#admin-portal) Admin portal ----------------------------------------------------------------------------- Canvas has a fully designed and functional admin portal built in to the base template. Manage your app settings, view and add users, create new marketing pages, and much more. [](https://docs.airdev.co/canvas/3.6/features#marketing-page-builder) Marketing page builder ------------------------------------------------------------------------------------------------- Need fast loading, SEO friendly marketing pages to show off your application to potential users? Canvas now comes with a and a host of professionally designed blocks to create a beautiful marketing site on top of your main application! [](https://docs.airdev.co/canvas/3.6/features#canvas-extension) Canvas extension ------------------------------------------------------------------------------------- Use the Canvas extension at any time during development to expand your application with professionally designed, fully responsive or update the colors throughout your application all directly from within the Bubble editor. [](https://docs.airdev.co/canvas/3.6/features#custom-email-templates) Custom email templates ------------------------------------------------------------------------------------------------- We've integrated Canvas with Sendgrid to send transactional emails using a beautiful HTML template. You can create unlimited with dynamically populated data directly from the admin portal. [](https://docs.airdev.co/canvas/3.6/features#built-in-user-management) Built-in user management ----------------------------------------------------------------------------------------------------- Almost every application will need to provide their users some basic functionality for signing up, logging in, and managing their account details. However, creating this functionality can add a lot of time to your build. As much of the functionality for user management is the same across applications, you can find yourself rebuilding the same elements and workflows many times. We have been able to streamline this process and from signup/login, password reset, email verification, profile management and much more, the Canvas base template comes with a robust and fully functional user management system ready to go as soon as it is downloaded. [page builder](https://docs.airdev.co/canvas/3.6/canvas-functionality/marketing-pages) [pages & blocks](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules) [email templates](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#email-templates) --- # Introduction | Canvas Documentation [NextKey Features](https://docs.airdev.co/canvas/3.6/features) Last updated 4 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.6#welcome-to-canvas) Welcome to Canvas! ------------------------------------------------------------------------------- Canvas is a framework based on that non-coders can use to very rapidly build powerful and beautiful web applications. The framework is built and maintained by , an ultra-rapid software development firm based in San Francisco. Canvas doesn't require any previous software knowledge or experience. But learning how Bubble and Canvas work does require significant time investment to get to the point when you can build something great. If you are starting from scratch, you should plan on spending at least a few weeks learning both of the tools. [](https://docs.airdev.co/canvas/3.6#what-is-canvas) What is Canvas? ------------------------------------------------------------------------- Canvas is a development framework based on that combines 3 things: 1. **Base Template**: This app template contains features that almost every application needs - things like marketing pages, user management, admin portal, and so much more. 2. **Pages & blocks:** These are smaller UI & UX components that can be added to the Base Template in order to build almost anything that you might imagine. They also provide consistency to your app's design, so pages you add to the app don't look out of place. 3. **Standards & best practices:** These will help you make sure your application's functionality, design, and integrations are properly built and result in the best product possible. [](https://docs.airdev.co/canvas/3.6#why-canvas) Why Canvas? ----------------------------------------------------------------- There is a major shift happening that's changing not only how software is built, but who builds it. Specifically, no-code tools like Bubble now allow non-coders to build complex software applications without writing a single line of code. At AirDev, we've spent years building software without code for companies ranging from one-person startups to Fortune 50 enterprises. Through our work we've identified common patterns that exist in applications and turned those into this framework. Here's what the framework helps us do: 1. **Build and launch faster:** Because large parts of both functionality and design are templatized, we don't have to spend time reinventing the wheel and instead focus only on the parts that are different about a particular application. 2. **Build better products:** We've spent a lot of time thinking through and iterating on our templates and standards. When we use them we can be sure that the application will look good and work well. 3. **Build in a transferrable way:** Because our products follow the same framework, they're much easier to transfer between developers who know the framework. This is critical for long-term projects that require lots of people to be involved. We're excited to share the Canvas framework with people and teams outside of AirDev, we hope you find it useful! [Bubble](https://bubble.is/?ref=LBRPNATG) [AirDev](https://airdev.co/) [Bubble](https://bubble.is/?ref=LBRPNATG) --- # Admin Portal | Canvas Documentation [PreviousWorkflow Widgets](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/widgets/workflow-widgets) [NextAdmin analytics](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownerdashboard) Last updated 4 years ago Was this helpful? The is a complex page where the app admin of the platform can view, manage, and download raw site data. To reduce the amount of workflows in the Admin Portal page, we've moved a lot of the app-wide settings workflows and UIs to separate reusable elements. In each reusable element, we've included placeholder groups so you can easily add additional content to the groups by resizing the placeholder groups. [Admin analytics](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownerdashboard) [Admin email templates](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/owners-portal-reusables/adminemail) [Admin legal popups](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownerlegalpages) [Admin header & footer](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownerseosettings) [Admin marketing pages](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownerhomepagesetup) [Admin branding, launch, and settings](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownergeneralsettings) [Admin portal canvas logic](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownersocialmediasettings) [Admin Portal](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages#admin-portal-overview) --- # Principles | Canvas Documentation [PreviousLearning Bubble Basics](https://docs.airdev.co/canvas/3.6/using-bubble/bubble-basics) [NextDatabase](https://docs.airdev.co/canvas/3.6/using-bubble/database) Last updated 4 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.6/using-bubble/principles#measure-twice-cut-once) Measure twice, cut once ----------------------------------------------------------------------------------------------------------------- It's much easier to use Bubble than it is to code, which makes it tempting to jump right in when trying to build something or change something that you've already built. That's usually a bad idea because you're much more likely to end up with a "Spaghetti Bubble App" (see ), which is difficult or impossible to maintain and iterate on. What you should do instead is carefully plan and structure both your initial functionality and ongoing improvements. #### [](https://docs.airdev.co/canvas/3.6/using-bubble/principles#well-planned-vs-haphazard-development) Well-planned vs haphazard development Imagine this scenario (which we've seen multiple times): A startup is using Bubble for their SaaS product. The Bubble development team builds an initial version in a few weeks, which makes the sales team very happy. They go out to try to sell the product and start receiving feedback right away. Their first potential customer says, "If only your product had X feature, we would buy." "No problem," replies sales. They go to the development team and in just a few days, feature X is live. The potential customer is amazed and the first sale is made. This continues over and over again until sales gets used to the gratification of being able to quickly deliver any feature that customers ask for. This model of development is not sustainable without factoring in the costs of maintenance that come with ever-increasing app complexity. Creating an app with all of those requested features would require substantial revision after every couple deliveries, or a smaller amount of up-front planning if the client knows which features they want to include in the application. Over time, when an app is built by adding on many quickly delivered features, the Bubble logic gets very convoluted, poorly structured, and layered on top of each other. Eventually it becomes very difficult to maintain and build these applications which are filled with band-aids instead of thoughtful planning, which undermines one of the main advantages of using a no-code platform in the first place. The bottom line is that you should stay very disciplined and not let Bubble lull you into a false sense of "this is easy." A well-built development process includes carefully planning every feature and making sure that you're building for maintainability and scalability. [](https://docs.airdev.co/canvas/3.6/using-bubble/principles#find-the-simplest-way) Find the simplest way -------------------------------------------------------------------------------------------------------------- Blaise Pascal famously said, "I would have written a shorter letter, but I did not have the time." The same can be applied to software generally and Bubble applications specifically. It often takes much more effort and mental energy to come up with a simple way to do something than it takes to come up with a hard way to do it. If you think about some of the most successful tech products as of late, these principles hold true. Uber, Slack, Stripe, and more all launched with a minimal set of critical functionality. All were easy to use and not bloated with unnecessary bells and whistles. You may not be looking to build the next unicorn but the the lessons are universal: * Eliminate any functionality that's not absolutely needed right away * Make the UI as clean and simple as possible * Decrease redundancy in your pages, workflows, and database structure Making things simple may indeed end up taking more time than making them more complex. But the result will be a product that's easier to both use and maintain. [](https://docs.airdev.co/canvas/3.6/using-bubble/principles#think-in-modules) Think in modules ---------------------------------------------------------------------------------------------------- Modular structures are everywhere. Buildings are modular from the elevator (big module) to the brick (small module). Legos are very obviously modular. And our Bubble apps should be modular. Why? A few reasons: * Modules have clearly defined inputs and outputs and can be plugged in anywhere without requiring duplicate work * Modules are self-contained/independent and can thus be safely updated without affecting the rest of the application * Modules allow multiple people to work together on a single project and then combine their efforts * Modules structures are easier to understand There are many ways to create modules in Bubble - through reuseables, custom workflows, API workflows, data triggers, and more. We'll talk more about these later. [Spaghetti Code](https://en.wikipedia.org/wiki/Spaghetti_code) --- # Account | Canvas Documentation [PreviousAdmin Portal](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal) [NextLogin](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/login) Last updated 4 years ago Was this helpful? **Page name:** account **Purpose:** Enables your users to manage their profile and account credentials through a self service portal The Canvas base template has the following navigation tabs visible by default but you can hide any of these by going to Group Main content > Group Main sidebar > Group Inner sidebar content in the elements tree. We also have included 6 placeholder groups to add additional functionality. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/account#profile) Profile --------------------------------------------------------------------------------------------------------------- Here the user can update the profile picture as well as the first and last name on their account. There are also two hidden groups that contain the UI for a user to set their username as well as fill out an about me section. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/account#login-credentials) Login credentials ----------------------------------------------------------------------------------------------------------------------------------- Let your users manage the email and password for their account while providing account security by requiring the current password for any changes to be made. Contains all the UI and workflows to ensure the new password meets the password policy you have set up for your app. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/account#payments) Payments ----------------------------------------------------------------------------------------------------------------- Allow your users to update their payment method as well as view all their payment history on your platform [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/account#notifications) Notifications --------------------------------------------------------------------------------------------------------------------------- In the notifications tab the user can set their notification preferences. Please note, this is UI only in the base template and does not make any changes to your app. You will need to set up the workflows and logic to manage the preferences set here. ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPz13ZQi5GMzJIEy8Zi%252F-MPz2tge_eLKfPnRMs3Q%252Fimage.png%3Falt%3Dmedia%26token%3D9412f9b3-18aa-432b-a547-d9eee459a830&width=768&dpr=4&quality=100&sign=5f730f91&sv=2) --- # Pages | Canvas Documentation [Index](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/index) [Admin Portal](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal) [Account](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/account) [Login](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/login) [Legal](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/legal) [Reset Password](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/reset-password) [Verify](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/verify) [404](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/404) [PreviousReference](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference) [NextIndex](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/index) Last updated 3 years ago Was this helpful? --- # Footer | Canvas Documentation [PreviousHeader](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header) [NextSignup & Login](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/signup-login) Last updated 3 years ago Was this helpful? **Element name:** footer **Purpose:** Provide the user with links to important pages and information at the bottom of the page. Navigate to Headers/Footers > Footer navigation from the left side menu to get started. The footer element is included by default on all marketing pages. For Bubble pages you will need to add it manually to any page you want to include it on. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/footer#pages) Pages You can set up links to any page you like in the pages tab. These can be the same pages you set up in the header or completely different. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/footer#legal) Legal The Canvas template comes standard with Terms and Privacy pages. Edit all the settings for these pages here. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/footer#social-media) Social Media Get the most out of your social media by adding all your social media pages to the footer of your application! Elements as they are displayed in the footer Actions available for the page links in the footer ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNpOZHn1YYhuANBSqZv%252F-MNpXewtnunTjAj72WcX%252Fimage.png%3Falt%3Dmedia%26token%3Df57cd442-9b3b-459b-b1ff-c1e588fb5c90&width=768&dpr=4&quality=100&sign=e82f28&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNpOZHn1YYhuANBSqZv%252F-MNpYGHHt_bk8aPHUZqI%252Fimage.png%3Falt%3Dmedia%26token%3D653217ae-a21b-43aa-a5da-88f1951fd63f&width=768&dpr=4&quality=100&sign=59a3c1d1&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNpOZHn1YYhuANBSqZv%252F-MNpWisdCOR1wqM2wZDV%252Fimage.png%3Falt%3Dmedia%26token%3D06200fc4-74be-4f9c-a102-b104aa604bf7&width=768&dpr=4&quality=100&sign=4be26665&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNox06qHRv-_z6vIwFq%252F-MNp3YN-iIqUBa7h9AMs%252FScreen%2520Shot%25202020-12-05%2520at%25205.42.19%2520PM.png%3Falt%3Dmedia%26token%3Dcda0f50e-1c59-4461-ab6a-544a9fbaab7f&width=768&dpr=4&quality=100&sign=6ab667c0&sv=2) --- # Backend Workflows | Canvas Documentation [PreviousOption Sets](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets) [NextDesign standards](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/design-standards) Last updated 3 years ago Was this helpful? Your app must be on a paid Bubble plan to use Backend Workflows Using backend workflows can be ideal and/or necessary in the following situations: 1. When you have long and complex workflows with a lot of actions 2. When you need to reuse the same workflow from different parts (pages/reusables) of the application 3. When you need to run a workflow on a list of things, (i.e., loop through a list) 4. When you need to schedule a workflow in the future (with the ability to cancel the workflow) 5. If you want your workflow to run asynchronously. Backend workflows run on Bubble's server, and any workflow on a standard Bubble page which schedules a Backend workflow won't need to wait for the entire (Backend) workflow to finish before moving on to the next step in the front-end workflow. 6. If you want to create a webhook - or endpoint - to allow other applications to send and receive data from your Bubble app. For more information on Backend workflows, read AirDev's and . Pro tip: If you'd like to run backend workflows synchronously (in order in the WF) and receive a response to the workflow action, set up an API connector action that points at the backend Workflow's API. Note that any API token used in the API Connector action should not be passed in the URL, but in the headers, and it should be marked as "Hidden" so that it cannot be stolen by app users. Our template comes with 11 Backend workflows in the following folders ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/api-workflows#verify) Verify * **verify\_send:** This will create a new verify record in the database and send a code to the user via email or sms * **verify\_check:** This endpoint is called when the user submits a code to verify their email or phone number. When run, Canvas will verify whether the code is valid and return true or false * **verify\_delete:** Deletes a verify record 15 minutes after it has been created. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/api-workflows#emails) Emails * **send\_email**_**\_**_**template:** This workflow is a template action that can be copied and edited for new email template backend actions. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/api-workflows#canvas) Canvas * **check\_app\_location:** Determines if this application's identifiers are correct. This is necessary for the Canvas Page Builder to function properly. * **record\_registration:** Used one time when the Canvas app is registered with the Page Builder. It generates a private token which will be used for authentication between the two apps. Additionally, it re-generates the public token, since the public token used for this call was sent in the URL of the Canvas admin user's browser during the registration process. * **update\_usersnap** \- When you start a project with AirDev, we'll use this workflow to enable usersnap testing on your app so you can submit feedback in our client management portal. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/api-workflows#page-builder) Page builder * **check\_request:** Page builder uses this to authenticate both the private and public tokens with a Canvas app. Returns information used by the page builder, like page files' names and URLs. * **update\_page:** The Canvas Page Builder uses this as part of the page publishing flow. It updates a page's HTML and other fields. * **upload\_files:** Canvas Page Builder uses this to upload a list of files and images to a page. * **upload\_image:** Canvas Page Builder uses this to a single image to a page. [Bubble Development Guide](https://docs.airdev.co/canvas/3.6/using-bubble/bubble-basics) [Bubble's Manual](https://manual.bubble.is/using-the-bubble-api/how-to-use-the-api.html) --- # Signup & Login | Canvas Documentation [PreviousFooter](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/footer) [NextCookies Permission](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/cookiespermission) Last updated 4 years ago Was this helpful? **Element name:** signup/login **Purpose:** Provide the user with signup, login, and password reset functionality Our standard signup/login reusable element can be put on a login page, and is included in a popup in the popupreusables reusable element. We add the popupreusables reusable element to the so we can trigger widely used popups from any page in the app. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/signup-login#custom-workflows) Custom workflows ------------------------------------------------------------------------------------------------------------------------------------------ * **complete sign up** \- This will mark the current user's `Date completed sign up` field as completed and end the sign up flow. * **move current step** - This will move the sign up step to the next step. * **select user type** - This will update the user type selection * **update signup method (of type text)** \- By default, the signup method will be "Email". If a user is signing up with a social media account, please update the custom workflow "update signup method" in the sign up workflow to the name of the social media login method (e.g. Linkedin, Facebook, Twitter, and etc.). This will ensure that a logged in user cannot see the login credentials tab on the account page (it will only be visible if a user's login method is "Email"). * **update profile (email verification)** - This workflow will only fire if the App owner requires users to verify their emails during sign up. This will schedule an API workflow to send an email verification link to the user. * **update profile (no email verification)** - This workflow will only fire if the App owner does not require users to verify their emails during sign up. This will mark the current user's `Date completed sign up` field as completed and end the sign up flow. * **set login** - Show the login view * **set reset\_pwd** \- Show the reset PW view * **set signup** - Show the signup view * **restrict to login** \- Restrict the reusable to show only the log in view * **restrict to signup** \- Restrict the reusable to show only the sign up view * **close popup** \- close the popup that this signup/login reusable is placed on. This is already set up in the template on the popupsreusable element. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/signup-login#popup-usage) Popup usage -------------------------------------------------------------------------------------------------------------------------------- When using the signup/login popup, instead of signing in on the signup/login page, users will remain on the page that they've signed up on until they fill out the form in step 2 of the signup process. By default, step 2 is where a new User inputs their First and Last name. After this, if email verification is enabled, users will be redirected to the login page until they've verified their email. Otherwise, this popup will close. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/signup-login#api-workflows) API workflows ------------------------------------------------------------------------------------------------------------------------------------ [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/signup-login#more-signup-login-info) More signup/login info ------------------------------------------------------------------------------------------------------------------------------------------------------ See the "Email Verification" section for more info on how to configure this reusable element. There are ten custom workflows in the signup/login reusable element (some are duplicated in the popupsreusable so they can be triggered from the as well): [header](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header) [header](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header) Bubble editor view ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Ls3QQor-a39iHNXy0B4%252F-Ls3iXXHKXyZhuvagipG%252FScreen%2520Shot%25202019-10-25%2520at%25202.02.06%2520PM.png%3Falt%3Dmedia%26token%3Dfa9cb95d-ea5c-475d-ae7d-32e30dbee58e&width=768&dpr=4&quality=100&sign=16996e28&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Ls3QQor-a39iHNXy0B4%252F-Ls3ZxrFje-fbVBHg3nS%252FScreen%2520Shot%25202019-10-25%2520at%25201.20.22%2520PM.png%3Falt%3Dmedia%26token%3Ddd8e9bb5-7b18-4d11-a8cc-abdf4aaed0e8&width=768&dpr=4&quality=100&sign=e272130&sv=2) --- # Getting Started | Canvas Documentation [PreviousFor Designers](https://docs.airdev.co/canvas/3.6/for-designers) [NextBranding & Design](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design) Last updated 3 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.6/canvas-functionality/getting-started#get-the-template) Get the Template ----------------------------------------------------------------------------------------------------------------- Getting the AirDev Canvas Base Template through Bubble's template marketplace is a snap. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/getting-started#add-to-your-account) Add to your account The first step to getting the template is adding it to your Bubble account. To do this, go to the and press Use Template. If you aren't signed in to a Bubble account, you'll be prompted to log in or sign up. Follow the prompts from Bubble to complete this process. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/getting-started#create-a-new-app) Create a new app Now that you've added the template to your account you can create new apps in Bubble using the Canvas template! From the My Apps tab on your Bubble home page, click the blue 'New App' button. In the popup, click on the 'Start from a template' dropdown and select Canvas Base Template. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/getting-started#get-the-chrome-extension) Get the Chrome Extension --------------------------------------------------------------------------------------------------------------------------------- To extend your template with new Bubble pages and blocks from Canvas you will need to . [](https://docs.airdev.co/canvas/3.6/canvas-functionality/getting-started#explore-the-admin-portal) Explore the Admin Portal --------------------------------------------------------------------------------------------------------------------------------- A great feature of the Canvas template is that it comes preconfigured with an Admin Portal where you can manage all the settings for your application. The Admin Portal is accessed from the front end of your application (not from the Bubble editor). To begin exploring your Admin Portal, when you are logged into the Bubble editor go to Data > App Data > All Users and then click on`'Run as'` beside the user with the email '[\[email protected\]](https://docs.airdev.co/cdn-cgi/l/email-protection) ' The admin portal offers access to the following settings from the left navigation menu: **Launch Checklist** The Launch Checklist provides step by step guidance to help you get started with your new application as quickly as possible. **Settings** Here you can update all the general settings for your application like the user signup process and your privacy policy **Analytics** View analytics on new, active, and total users across your application. **Users** View a list of all your users including role, last login, and email. Add a new Admin to your application. **Data Type 1** A sample setup to demonstrate how to expand the functionality of the admin portal using your own custom data types. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/getting-started#naming-conventions) Naming conventions --------------------------------------------------------------------------------------------------------------------- In names of data types and reusable elements, we have included a gear emoji (⚙) to indicate that these specific elements should not be edited, or that you should be very cautious about making changes there. These data types and reusables touch a lot of different features or are easy to break when changed. The data types also include "system\_" prior to the reusable's name. Another thing to note is that Canvas workflows are green. We encourage using workflow folders or creating a color coding convention for your app in order to better organize your app's workflows. **Branding** From your app's name to your social media links you can setup all your applications branding here. **Pages** View Bubble pages and add unlimited marketing pages to your app using the Canvas page builder. **Header / Footer** Manage the navigational links and icons for your header and footer. **Emails** Add and edit email templates across your platform. To unlock all the features of the base template such as the ability to use the , adding , and updating your , be sure to complete the Add App Identifiers and Register App steps from the Launch Checklist. [template page](https://bubble.io/template/canvas-starter-template-1541110863579x114287102114398200) [install the Chrome extension](https://chrome.google.com/webstore/detail/canvas-by-airdev/apmembkcpmjhmecifhckdidppfoiajie) [Learn More](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design) [Learn More](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules) [Learn More](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#header-menu) [page builder](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules#adding-static-marketing-pages) [Bubble pages and blocks with the extension](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules#adding-dynamic-canvas-pages-and-modules) Please don't change the existing data fields on these data types The "system" reusable elements as of July 30, 2021 ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mdx2jVeqkaOMUPJNvKF%252F-Mdx4iAbOE0XLj_G0wmv%252Fimage.png%3Falt%3Dmedia%26token%3D20259193-2e48-46dd-a46f-b3ac891bc123&width=768&dpr=4&quality=100&sign=7ab3720b&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mdx2jVeqkaOMUPJNvKF%252F-Mdx6DI25B5QV4Jgmbn_%252Fimage.png%3Falt%3Dmedia%26token%3Dca258141-b926-4501-9e4e-11e16a7fd4d7&width=768&dpr=4&quality=100&sign=d907c8b1&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MfsbWhfbg2OEg-I76Si%252F-MfsmvWNvCzFxs2m7S3_%252FScreen%2520Shot%25202021-07-30%2520at%252012.01.52%2520PM.png%3Falt%3Dmedia%26token%3D4aaf5896-09d3-4b66-b391-9d0cd727a4d3&width=768&dpr=4&quality=100&sign=bd17fea0&sv=2) [app's colors](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#update-your-apps-colors) [Learn More](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#emails) --- # Roles & Permissions | Canvas Documentation [PreviousBubble Pages & Blocks](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules) [NextMenus & Navigation](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation) Last updated 4 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions#the-bubble-pages-option-set) The 'Bubble Pages' option set ----------------------------------------------------------------------------------------------------------------------------------------------- This option set is used to manage a user's permission to view a specific page. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions#display-attribute) Display attribute In the header element is a workflow that checks whether the current users role is allowed to access the current page. This is done by checking the page name in the url against the page names listed in this option set. For this reason, it is imperative that the Display text matches exactly the page name shown in the editor. If you change the name of a Bubble page, don't forget to update it here! ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions#private-attribute) Private? attribute When checking for a user's permission to access a page, Canvas checks whether the page is marked as private. If this attribute is set to yes, the user will only be allowed to view the page if this option's List of Roles contains the current user's role. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions#roles-attribute) Roles attribute This is a list connection to the Role option set. Any user role that should be able to access this page should be added to this list. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions#the-role-option-set) The 'Role' option set ------------------------------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions#display-attribute-1) Display attribute This text is what is shown in the admin portal and throughout your application to display the role of a user. Since the 'account' page lets a user manage their login credentials and profile data, you will typically want to add every role you create to the Account page's list of roles ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions#default-roles) Default Roles Your Canvas template has two user roles preconfigured for you but you can add as many roles as you need to meet your applications needs. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions#the-app-admin-role) The App Admin Role Redirects and permissions are predefined in your template that will automatically direct a user assigned the App Admin role to the admin portal when they are logged in. Privacy conditions are in place as well that will prevent any user without the App Admin role from being able to view the admin portal. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions#the-standard-role) The Standard Role This role represents any default user on your platform that does not need access to the admin portal ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions#adding-a-new-role) Adding a new role To add a new role: * Add a new option to the Role option set (e.g. Account Admin or Outside Sales) * Add the new role to any Bubble Page option that the role should be allowed to access * Assign the Role to Users, usually through one of these methods: * Assign the new Role to users manually in the Bubble Editor's Data tab * Build the logic to let App Admins sign those Users up from the admin page * Build the logic to assign the new Role to the Users when they're signed up [](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions#page-redirects) Page Redirects ------------------------------------------------------------------------------------------------------------------- As a best practice we recommend using the index page of your app as the default page to which a user is redirected when the user doesn't meet privacy rules for a specific page. This gives you a single place to manage all the redirects for your application for each type of user role. In the standard Canvas Template the Index page redirects users to the Admin Portal page if they are logged in as a user with an App Admin role . Otherwise they will not be redirected away from the Index page. Included in your Canvas template is an option set named Role that is used to manage the user permissions for your application. See below. If you create a new page to which a specific role should be redirected, you can add additional actions to the above workflows. For more details on how they are currently set up or how to add conditional redirects see our complete reference for the While Canvas provides you a great way to manage user permissions and page redirects at a high level you should always create the appropriate to protect your data within the Bubble editor. [privacy rules](https://manual.bubble.io/working-with-data/privacy-and-security) [Default Roles](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions#default-roles) The Display text should match the page name shown here exactly Default redirects set up on the Canvas index page [Index page.](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages#index-page) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNnlBvVgs47Rh8Yf8as%252F-MNnqf2Hnyc0rARvtw4h%252Fimage.png%3Falt%3Dmedia%26token%3Dfc888123-5fb5-445f-94f3-7e021ed0221d&width=768&dpr=4&quality=100&sign=43a7e11c&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MK_r0tKnm410jTYf2Rl%252F-MK_uIUIjHORIF_vAY-n%252Fimage.png%3Falt%3Dmedia%26token%3D023507b4-d4c2-4bf6-9beb-01fda4227af0&width=768&dpr=4&quality=100&sign=1b55c06a&sv=2) --- # Menu Focus Elements | Canvas Documentation [PreviousAdmin options settings](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/owners-portal-reusables/admin-option-settings) [NextData types](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/data-structure) Last updated 3 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/menu-focus-elements#dropdown-menu) Dropdown menu ------------------------------------------------------------------------------------------------------------------------------------------- **Element name:** menufocus\_template **Purpose:** Provide the user with a concise list of actions they can take in a convenient dropdown menu. The dropdown menu is used consistently throughout the Canvas template to provide the user with actions they can take such as Edit/delete a thing, View more details, Send a message, etc. The dropdown is triggered by clicking on the icon, can be dismissed by clicking anywhere outside the dropdown, and is most often used in repeating groups to provide action items for each thing in the list. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/menu-focus-elements#clone-the-reusable-template) **Clone the reusable template** Open the **menufocus\_template** and from the top bar of the Bubble editor click Edit > Clone this Page. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/menu-focus-elements#assign-the-type-of-content) Assign the type of content With your cloned menufocus\_template open, double-click in the gray area of the editor to open up the settings for the reusable. Change the 'Type of content' to the datatype you will be using this menu to edit. You will need to change the type of content for the GroupFocus Dummy as well. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/menu-focus-elements#set-up-the-dropdown-buttons) Set up the dropdown buttons In the elements tree click the '+' to open the GroupFocus Dummy. This group contains all the dropdown buttons in the menu. Group Option 2 and Group Option 3 are already set up as the Edit and Delete actions. There are three more Group Options (1, 4, & 5) that are unused and can be customized to add more buttons to your menu. Each of these groups has a corresponding event in the workflow tab that will be run when the group is clicked. The menufocus\_template reusable element also contains two popups that correlate to the Edit and Delete actions: * **Popup Edit** Clicking on Option 2 (Edit) in the dropdown will open a standard edit form popup to create or edit a thing. * **Popup Remove** Clicking on Option 3 (Delete) in the dropdown will open a popup to remove a thing. Customize/duplicate these popups to your purposes. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/menu-focus-elements#using-the-custom-events) Using the custom events Each popups can be triggered by the corresponding custom events 'Create/edit thing' and 'Remove thing'. Setting up custom events within a reusable gives you the option of using that workflow from the page it is on with the 'Trigger a custom event from a reusable element' action. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/menu-focus-elements#user-menu-overview) User Menu Overview ----------------------------------------------------------------------------------------------------------------------------------------------------- Element name: **admin\_users\_menu** This focus group reusable element contains a menu of dropdown buttons for the user object. The menu popover is triggered by clicking on the icon and can be dismissed by clicking anywhere outside of the focus group. This reusable element is used in the Users tab in the Owner's Portal. 1. Clicking on Option 1 (Password reset) will schedule an API workflow to send a password reset email to the user. 2. Clicking on Option 3 (Deactivate) will open `Popup Remove user`. Deactivating the user will only mark the user as inactive and would not delete the user from the app. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/menu-focus-elements#email-templates-menu) Email Templates Menu --------------------------------------------------------------------------------------------------------------------------------------------------------- Element name: **admin\_email\_menu** This focus group reusable element contains a menu of dropdown buttons for the Email template object. The menu popover is triggered by clicking on the icon and can be dismissed by clicking anywhere outside of the focus group. This reusable element is used in the Emails tab in the Admin Portal. This reusable element contains two popups:‌ 1)Popup Edit Email Popup - Clicking on Option 2 (Edit) in the dropdown will open a standard add/edit form popup to create or edit an Email template. To learn more about email templates and how to use them, please click here. 2)`Popup Remove` - This dummy popup is included and can be used to delete a thing. For example, you can add the menufocus\_template element to the on a page and trigger a custom event to create/edit or remove a thing. 3) [hidden variables popup](https://docs.airdev.co/canvas/v/3.6/canvas-functionality/data-and-workflows#using-the-hidden-variables-popup) [`Hidden variables popup`](https://docs.airdev.co/canvas/v/3.6/canvas-functionality/data-and-workflows#using-the-hidden-variables-popup) Dropdown menu for a Canvas marketing page ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MfsbWhfbg2OEg-I76Si%252F-MfsdlNzaAR391r7RPEv%252FScreen%2520Shot%25202021-07-30%2520at%252011.21.57%2520AM.png%3Falt%3Dmedia%26token%3D32e93419-7246-45c0-826a-c36af459c89c&width=768&dpr=4&quality=100&sign=7aeb7236&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MOmlsouI08973C1_vEH%252F-MOmq7Ul_zdKigf_hqoK%252Fimage.png%3Falt%3Dmedia%26token%3De9e21f95-b182-43e6-960f-2d01334415ba&width=768&dpr=4&quality=100&sign=c8aa8592&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Ly107jHGEGTbJhCeLVB%252F-Ly1EtKzcKbCmjPlUP3Y%252FScreen%2520Shot%25202020-01-07%2520at%25203.03.10%2520PM.png%3Falt%3Dmedia%26token%3Dded61d85-9c2c-4c45-803c-81f83ca7a510&width=768&dpr=4&quality=100&sign=92a295a2&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MOmlsouI08973C1_vEH%252F-MOmxwNsQ9baRxeWKrAq%252Fimage.png%3Falt%3Dmedia%26token%3D365f7994-3cc7-4394-abaa-5897ee7b3404&width=768&dpr=4&quality=100&sign=8700d6be&sv=2) --- # Branding & Design | Canvas Documentation [PreviousGetting Started](https://docs.airdev.co/canvas/3.6/canvas-functionality/getting-started) [NextMarketing Pages](https://docs.airdev.co/canvas/3.6/canvas-functionality/marketing-pages) Last updated 4 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#basic-branding) Basic Branding ----------------------------------------------------------------------------------------------------------------- It's important to update the branding of your application in the admin portal as we use this data throughout the application to display your company's information. To get started, click the Branding tab under Setting in the left menu of the admin portal. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#name) Name The name that is set here is used extensively throughout the front end of your application as well as in emails and notifications sent to your users. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#logo) Logo In this tool you can set desktop and mobile logos for both light and dark backgrounds. The logos set here are displayed in the top left of your application header as well as in your emails and other communication. The browser favicon cannot be set here and must be uploaded to the Bubble editor under Settings > General > Favicon [](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#seo-and-social) SEO & Social --------------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#seo) SEO SEO descriptions and tag lines are set under Branding > Default SEO/Social Tags. This data is when indexing your app's pages for search results and by other services to display data about your platform in link previews. Marketing pages created using the page builder and Bubble pages that are added with the extension will all use these SEO tags by default. If you would like to customize these tags for a specific page: * **Marketing pages** Change the SEO settings for an individual page from the Pages tab in the admin portal * **Bubble pages** Edit the SEO settings directly from the page header input on the page's property inspector ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#social-links) Social Links Links to your social media channels can be shown in the footer throughout the application. To manage what is displayed click on the Header/Footer link in the left menu, scroll down to the Footer section, and click on Social media tab. Here you can manage what links are shown and the icons that should be displayed. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#styles-and-colors) Styles & Colors --------------------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#using-styles-instead-of-setting-individual-properties) Using Styles instead of setting individual properties Canvas uses a consistent set of styles (set in the`Styles` tab). We recommend using these styles instead of manually setting visual attributes on an element, as this maintains consistency and makes it easier to make adjustments later. You can make adjustments to these styles by going to the Styles tab in the Bubble editor. If you might be using some of our advanced features such as style updates, you should refrain from modifying existing styles or changing any of their names. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#use-conditional-properties-if-you-need-to-deviate-from-a-style) Use conditional properties if you need to deviate from a style It's not unusual for a specific element to need formatting specific to only that element. When this scenario arises, you can use a conditional to set a specific property for that element. For instance, maybe all the properties on the `Text_Regular_Black_Body_16pt` style are perfect except you need the text to be center aligned. Rather than removing the style for that text element, we can adjust the text alignment property using a conditional that has an expression which will always be true. Under the Conditional tab in the property editor for the element you need to change, click 'Define another condition', add an expression that say's `This url is not empty`, select the Text alignment property and set it to Center. Because the url for the site will always exist (i.e. is not empty) this condition will always be true so the text will display with center alignment. And since we have maintained the linkage to the style itself, if we make any changes to this style it will automatically be reflected in this element as well! There are other 'always true' expressions that can be used such as `Current date/time is not empty` or `This element is visible` ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#update-your-apps-colors) **Update your App's Colors** At times you need to change the main colors your app is using. While you could do this by going through all the styles one by one, Canvas makes this simple by providing a tool in the Canvas extension that will do all the work for you. Open the Chrome extension and click on 'Update app color'. Here you can select your primary, secondary, and tertiary colors for the app. Select your new colors and click 'Update colors'. It will take Canvas up to 5 minutes to update the colors across all the styles in your application. You will need to leave your browser window open while the colors are being updated so plan accordingly when triggering this action. **How to use the different types of colors** **Primary Colors**: Styles with this color should be used for the main colors through your application and for positive action elements such as a button that creates or updates a thing in your database. **Secondary Colors**: Styles with this color should be used to accent the design of your application as well as secondary action elements such as a Save As Draft button that is an alternative to a primary action Save & Publish button. **Tertiary Colors**: Styles with this color should be reserved for warning, alert, and negative action elements such as a delete button ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#update-your-apps-styles) Update your App's Styles If your version of Canvas is not the latest version, when you add a new page or block to your app it may contain styles that have not yet been added to your Bubble application . In this scenario you will be prompted to update the app's styles. It will take Canvas 5 - 10 minutes to update the styles in your application. You will need to leave your browser window open while the styles are being updated so plan accordingly when triggering this action. The Canvas template is based on the principles, which we use with most of our clients. This makes it easy to translate specs into apps without getting caught up in the creative process. Not sure what colors to use? Check out this r for ideas! [AirDev Canvas Design](https://airdev.co/design) [color palette generato](https://coolors.co/app) [used by Google](https://docs.airdev.co/canvas/3.6/using-bubble/seo) Link preview for Canvas Edit properties in the Styles tab ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNpAf6LX0KuUAlIbO_W%252F-MNpD-tUuaxkgjopsDMI%252Fimage.png%3Falt%3Dmedia%26token%3D94484fc3-7be3-4ecd-a133-838d765bad32&width=768&dpr=4&quality=100&sign=7dc4785e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MO7rzXY0OA8krQF6ife%252F-MO8-6pKYNYKk2x16y7B%252Fimage.png%3Falt%3Dmedia%26token%3D230ddb12-7c9d-483d-b154-5764bfe49549&width=768&dpr=4&quality=100&sign=3d941f97&sv=2) --- # Introduction | Canvas Documentation [NextKey Features](https://docs.airdev.co/canvas/features) Was this helpful? [](https://docs.airdev.co/canvas#welcome-to-canvas) Welcome to Canvas! --------------------------------------------------------------------------- Canvas is a framework based on that non-coders can use to very rapidly build powerful and beautiful web applications. The framework is built and maintained by , an ultra-rapid software development firm based in San Francisco. Canvas doesn't require any previous software knowledge or experience. But learning how Bubble and Canvas work does require significant time investment to get to the point when you can build something great. If you are starting from scratch, you should plan on spending at least a few weeks learning both of the tools. [](https://docs.airdev.co/canvas#what-is-canvas) What is Canvas? --------------------------------------------------------------------- Canvas is a development framework based on that combines 3 things: 1. **Building Framework Template**: This app template contains features that almost every application needs - things like marketing pages, user management, admin portal, and so much more. 2. **Pages, blocks & elements:** These are smaller UI & UX components that can be added to the template in order to build almost anything that you might imagine. They also provide consistency to your app's design, so pages you add to the app don't look out of place. 3. **UI patterns:** These are full page UI patterns with built-in UI & UX components and blocks that you can easily customize right out of the box. 4. **Standards & best practices:** These will help you make sure your application's functionality, design, and integrations are properly built and result in the best product possible. [](https://docs.airdev.co/canvas#why-canvas) Why Canvas? ------------------------------------------------------------- There is a major shift happening that's changing not only how software is built, but who builds it. Specifically, no-code tools like Bubble now allow non-coders to build complex software applications without writing a single line of code. At Airdev, we've spent years building software without code for companies ranging from one-person startups to Fortune 50 enterprises. Through our work we've identified common patterns that exist in applications and turned those into this framework. Here's what the framework helps us do: 1. **Build and launch faster:** Because large parts of both functionality and design are templatized, we don't have to spend time reinventing the wheel and instead focus only on the parts that are different about a particular application. 2. **Build better products:** We've spent a lot of time thinking through and iterating on our templates and standards. When we use them we can be sure that the application will look good and work well. 3. **Build in a transferrable way:** Because our products follow the same framework, they're much easier to transfer between developers who know the framework. This is critical for long-term projects that require lots of people to be involved. We're excited to share the Canvas framework with people and teams outside of Airdev, we hope you find it useful! [Bubble](https://bubble.is/?ref=LBRPNATG) [Airdev](https://airdev.co/) [Bubble](https://bubble.is/?ref=LBRPNATG) --- # Learning Bubble Basics | Canvas Documentation Learning how to use Bubble takes work. While not as complicated as learning how to build web apps with code, there are still a lot of different things that go into Bubble. You'll need to learn things like: * What a database is and how Bubble's database works * How web pages are created in Bubble * How to make pages that work on laptops, tablets and mobile phones (this is called responsiveness) * Rules for setting up logic in Bubble (e.g. what to do when a user clicks on a button) [](https://docs.airdev.co/canvas/3.6/using-bubble/bubble-basics#how-to-use-this-guide) How to use this guide ----------------------------------------------------------------------------------------------------------------- This Best Practices guide is a tool that is intended to be accessible to Bubble beginners (who have spent a few hours using the Bubble editor), intermediate users, and Bubble experts. Depending on your level, it should be useful for the following: * Beginners: learn best practices and build good habits early on * Intermediate: use this as a reference on how to approach many technical choices in Bubble * Experts: learn how AirDev builds and compare our design choices to your own experience For more experienced users of Bubble, this guide will be a window into the way AirDev chooses to build their apps. The motivation for most design choices AirDev makes in client apps, AirDev products, and templates is also explained here. [](https://docs.airdev.co/canvas/3.6/using-bubble/bubble-basics#what-to-learn) What to learn ------------------------------------------------------------------------------------------------- If you're not sure where to start learning, you can follow this path of resources. These tasks are intended to be completed by beginners. **Topic** Goal Content **What is Bubble?** What is Bubble and when/why to use it **Why Bubble?** Is Bubble the right tool for you? (This is for entreprenuers) **Basics** Overview of how Bubble works **Bubble editor** Get familiar with the Bubble editor **Design basics** Create and edit elements 3. Read these two sections of the Bubble manual (10 minutes): **Workflow basics** Visual workflows, data workflows, plugins' workflows **Database basics** Quick intro to the Bubble Database and Workflows **Using plugins** How to install and set up a new plugin **Bubble dev tools** How to use some tools in the Bubble editor and run mode 1. 1. Topics covered: Element dropdown, Element tree, App search tool, Run mode inspector, Run mode debugger, Edit mode element inspector **Basics recap** Practice the skills from the above areas [](https://docs.airdev.co/canvas/3.6/using-bubble/bubble-basics#learning-resources) Learning resources ----------------------------------------------------------------------------------------------------------- This section contains links to general Bubble resources. These are useful for your learning at different stages - some of them are for beginners, while others are useful for Bubble users of all skill levels. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/bubble-basics#core-resources) Core resources ### [](https://docs.airdev.co/canvas/3.6/using-bubble/bubble-basics#additional-resources) Additional resources Additionally, you can use the Bubble Reference as a first resource when you run into some feature that you're not familiar with in the Bubble editor. Users with experience in web development outside of Bubble will be likely to learn quickly by using the reference and practicing in the editor. [PreviousManually Building UI](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/design-standards/manually-building-ui) [NextPrinciples](https://docs.airdev.co/canvas/3.6/using-bubble/principles) Last updated 4 years ago Was this helpful? from the Bubble manual (5 minutes) Check out to see what is possible with Bubble (5-30 minutes) Watch (20 minutes) (10 minutes) Read on Bubble Basics. (5 minutes) Complete the (5-15 minutes) Play with Bubble's home page (5-15 minutes) (Optional): Complete (10 minutes) Complete the (5 minutes) (5-10 minutes) (10 minutes) (5-10 minutes) (5 minutes) (5-10 minutes) (5-10 minutes) (also very design-focused, no workflows/db objects) (5-10 minutes) (5 minutes) . (25 minutes - if the pace is too slow, run on 2x speed or skip around.) Redo all of the on "Hard Mode", which appears after completing a lesson on normal mode (1-2 hours) : These lessons are Bubble's training program, a set of 12 short lessons walking users through the basics of building apps on Bubble. **If you're a complete beginner, start here** - in the next page we direct you through the lessons in a more organized fashion. Complete these lessons and try to understand each action you take before moving on to the next action. Estimated time to complete: 2-3 hours (or longer if you read through related resources while completing these lessons). : This official Bubble manual can be used for an in-depth understanding of how Bubble works. You should spend a few hours going through this resource. We recommend you use it as a guide to different parts of the Bubble editor as you learn, instead of trying to read it straight through. : A Bubble education startup, Coaching No Code Apps has developed a YouTube series available free of charge. They have published about 100 videos, each covering one topic in Bubble development. Follow along by building while Gaby explains the what, how, and why of what you build. There is a from this channel that will guide you through some basics of how to build on Bubble. If you just want to watch one video that is a more complete walkthrough, check out . : If you run into a brick wall while building on Bubble, someone else has probably run into the same issue before. This is a great place to check for previous users' questions and to ask your own questions, too. : The official reference from Bubble is a useful tool to look up detailed information about how certain features are supposed to work. This document is helpful to read if you want an in-depth understanding of how each part of Bubble functions. [**Bubble Lessons**](https://bubble.io/lessons) [**Bubble Manual**](https://manual.bubble.io/) [**Coaching No Code Apps**](https://www.youtube.com/watch?v=6OKVj1A9OcY&list=PL8fkQddJmh-gVOECXWNY-5JHO3Nh3fv2D&index=4) [series of videos](https://www.youtube.com/watch?v=F7jQmMHgOHU&list=PL8fkQddJmh-gVOECXWNY-5JHO3Nh3fv2D) [this 2 hour tutorial](https://www.youtube.com/watch?v=6OKVj1A9OcY&list=PL8fkQddJmh-gVOECXWNY-5JHO3Nh3fv2D&index=4) [**Bubble Forum**](http://forum.bubble.io/) [**Bubble Reference**](https://bubble.io/reference) [Read Bubble's own intro](https://manual.bubble.io/the-bubble-fundamentals/what-is-bubble-for.html) [Bubble's Showcase](https://bubble.io/showcase) [Coaching No Code's video on Bubble pros/cons](https://www.youtube.com/watch?v=4W-LENVu8uc&list=PL8fkQddJmh-gVOECXWNY-5JHO3Nh3fv2D&index=5) [Coaching No Code Intro to Bubble](https://www.youtube.com/watch?v=F7jQmMHgOHU&list=PL8fkQddJmh-gVOECXWNY-5JHO3Nh3fv2D&index=1) [this manual page](https://manual.bubble.io/the-bubble-fundamentals/building-principles.html) [first interactive Bubble lesson](https://bubble.io/page?type=page&name=index&id=learn&tab=tabs-1&lesson_ref=1) [in the Bubble editor](https://bubble.io/page?id=meta_public&tab=tabs-1) [Read the manual pages about the Editor](https://manual.bubble.io/application-editor.html) [the Image Uploader lesson](https://bubble.io/page?type=page&name=index&id=learn&tab=tabs-1&lesson_ref=9) [Image Slideshow lesson](https://bubble.io/page?type=page&name=index&id=learn&tab=tabs-1&lesson_ref=2) [General design info](https://manual.bubble.io/building-a-user-interface/general-principles.html) [Handling conditionality](https://manual.bubble.io/building-a-user-interface/handling-conditionality.html) [City Upvoting Lesson](https://bubble.io/page?type=page&name=index&id=learn&tab=tabs-1&lesson_ref=3) [User Signup/Login/Logout Lesson](https://bubble.io/page?name=index&id=learn&lesson_ref=5&tab=tabs-1) [Using conditions on design elements and workflows](https://bubble.io/page?name=index&id=learn&lesson_ref=6&tab=tabs-1) [Bubble lesson on making a shopping list](https://bubble.io/page?name=index&id=learn&lesson_ref=8&tab=tabs-1) [Bubble lesson with Giphy plugin](https://bubble.io/page?name=index&type=page&id=learn&lesson_ref=10&tab=tabs-1) [Bubble lesson with iTunes plugin](https://bubble.io/page?name=index&id=learn&lesson_ref=4&tab=tabs-1) [Chart lesson](https://bubble.io/page?name=index&id=learn&lesson_ref=7&tab=tabs-1) [Facebook auth lesson](https://bubble.io/page?name=index&type=page&id=learn&lesson_ref=11&tab=tabs-1) [Watch this video on how to use some tools from the Bubble editor](https://vimeo.com/426247008) [Bubble lessons](https://bubble.io/lessons) --- # Data & Workflows | Canvas Documentation [](https://docs.airdev.co/canvas/5.3/canvas-functionality/data-and-workflows#copying-development-data-to-live) Copying development data to live ---------------------------------------------------------------------------------------------------------------------------------------------------- Canvas uses the database extensively to create a highly functional and dynamic application. While in development, all this data is being saved to the development database of your app. It's important to remember that your Bubble app has two separate databases for the live and development versions. When deploying live the first time you will need to copy the development database to the live database for Canvas to have access to all the settings you have applied during development. To do this, from the Bubble editor navigate to the Data tab, open App data, and then click on 'Copy and restore database' in the top right. In the popup click the 'Copy development data into the live database' button, ensure 'Data type to copy' is set to All types, type 'COPY FROM DEVELOPMENT TO LIVE' in the input and press the Confirm button. Be aware that copying the data from one version to the other will overwrite all information in the database to which you are copying data. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/data-and-workflows#copying-specific-data-types) Copying specific data types After your initial deployment to a live application you may find scenarios where you need to copy a specific data type from Live to Development or Development to Live. This is common especially with email templates and marketing pages where you make updates in development and need to have the new data copied directly to the live site. To do this, you will follow the same steps as outlined above for copying the entire database. But instead of setting the 'Data type to copy' to All types, define the specific Data type you need to copy and then proceed as normal. We have added a gear icon (⚙️) before all data types, and field names that are core to the Canvas template. In general, these elements should not be edited unless you understand the impact changes will have on the template. Below is some guidance on when and how to copy Canvas data types from one database to the other. Data type Guidance and best practices ⚙️ **App Settings** If you have made a lot of changes to the app settings in the development version it may be easier to simply copy the app settings data over to the live version rather than duplicating all the changes manually. However, it is a best practice to update app settings directly in the live admin portal once your site has been deployed. ⚙️ **Header & ⚙️ Navigation item & ⚙️ Legal** It is important to always keep the header and navigation item data types in sync. Before initial deployment, we recommend creating or editing your header and navigation item in the development version and then copy those data types to your live site. After initial deployment, we recommend to not copy the header or navigation item data types from one version to the other. Instead, you should make any header or navigation related updates directly in your live site via the admin portal. Whether it is the live or development version, you should add and update these data types from the same version to avoid content conflicts with your headers and navigation items. ⚙️ **Email Template & ⚙️ Email Template Variant** Since email templates must be set up with their own custom workflows, adding a new template will require making and deploying workflow changes from the development version of your app. Whether it is the live or development version, you should add and update email templates and email template variants from the same version (and copy to the other) to avoid content conflicts with these data types. ⚙️ **Verify** Email verification request data is generated automatically and is only valid within the version it is created. You will never need to copy this data type. **App variables** After the initial deployment, copying this data type from one version to the other will overwrite any existing app variables in the other version. **User** After the initial deployment, it's not recommended to copy users from one version to the other as this will overwrite any users that have been added to the app in the other version. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/data-and-workflows#how-the-app-settings-data-type-is-being-used) How the ⚙️ **App Settings** data type is being used ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- There should only ever be one ⚙️ App Settings entry. More than one ⚙️ App Settings entry will break the Canvas Template. Every Canvas template will have a ⚙️ App Settings data type that is used to manage all app-wide settings such as colors, app name, contact information, etc. Almost all data for the ⚙️ App Settings object is controlled from within the Admin portal. While you can add additional fields to the ⚙️ App Settings object as needed to customize your application, we recommend not changing the default fields in any way. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/data-and-workflows#using-the-hidden-variables-popup) Using the hidden variables popup ---------------------------------------------------------------------------------------------------------------------------------------------------- **Variable** simply refers to the use of an element to hold one or more values. Instead of repeating these values in multiple places in your page or workflows, the **variable** holds the results of a calculation, a single thing from a database search, a list of things from a database search, or some other value and can be referenced multiple times from other page elements and actions. Each page has a popup called 'Popup Hidden Variables' designed to hold app data as variables for easy reference. As an example, each page has a group element in this popup called 'var - ⚙️ app settings' with the type of content set to ⚙️ App Settings. The data source then is a 'Search for ⚙️ App Settings: first item'. With this variable set up, anywhere you need to reference the ⚙️ App Settings on the page (e.g. the app name), rather than doing a search for the ⚙️ App Settings object you can simply reference 'var - ⚙️ app settings object's app setting' instead. This keeps your data organization clean and concise on the page. Any data that is referenced from multiple elements or actions on the same page should be stored in a variable group in this popup to avoid redundancy in retrieving data. This helps minimize the possibility of error when searches are duplicated across elements. It also makes it much simpler to update any search parameters as the search only needs to be changed in one location. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/data-and-workflows#types-of-variables) Types of Variables Variables are stored in two kinds of elements: **Groups** and **Repeating Groups**. These elements are often more useful than custom states because they can have default data sources, conditional data sources, or have their data set by a workflow. A custom state's data can only be set by a workflow. It is good practice to name each Group or RG with a naming convention of `var - [Name of variable]` as opposed to the normal 'Group..." convention. This allows you to quickly search for the page variables using the 'var' prefix. **GROUPS** Groups are used to store single item variables such as a number, text, or single Thing from the database. **REPEATING GROUPS** Repeating groups are used to store list variables such as a list of numbers, list of texts, list of Things, etc. When using a Repeating Group as a list variable, use the **Vertical scrolling** layout style to allow your page to only load the data that is needed to display in the current page view. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/data-and-workflows#using-the-inclusive-yes-no-option-set) Using the inclusive Yes/No option set -------------------------------------------------------------------------------------------------------------------------------------------------------------- When filtering data by the yes/no field type in Bubble, you can only return values that are either Yes or No. For instance: The inclusive yes/no option set allows you to create search parameters based on the yes/no field type in Bubble and return all things with a value of 'Yes' OR 'No', a value of only 'Yes', or a value of only 'No'. For instance: The enable this we've added a list of yes/no values as an attribute to the Options in the Yes/No Option set. * For the Yes value we add only the 'yes' value to this list. * For the No value we add only the 'no' value to this list. * For the Yes or No value we add both the 'yes' and 'no' values to this list The search logic then is to check, not if the value is EQUAL TO the Yes/no values, but if the value IS IN the Yes/no values. To see how we use this in Canvas, check out the dropdown to filter users by active status on the admin page of your app. It can be found in the elements tree by clicking the '+' to open Group Main Content > Group Nav 8 - Users > Group User header > Dropdown Users. [PreviousMenus & Navigation](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation) [NextEmails & Alerts](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts) Last updated 11 months ago Check if value 'is in' the list of Yes/no values ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FKlABye5VtVrNGlY5gf2a%2FBoth%2520Yes%2520and%2520No.gif&width=768&dpr=4&quality=100&sign=dc73ce28&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FvcFNmJc4e95OSKoh4ewq%2FScreen%2520Shot%25202021-07-30%2520at%252011.50.34%2520AM.png&width=768&dpr=4&quality=100&sign=ccb9749e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FGmk972XjdRFf09ZWblZE%2Fimage.png&width=768&dpr=4&quality=100&sign=d13ba6c1&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2Fb9FY8DxTYLKmEARW2ku6%2FYes%2520or%2520No.gif&width=768&dpr=4&quality=100&sign=61a4276a&sv=2) --- # Database | Canvas Documentation [PreviousPrinciples](https://docs.airdev.co/canvas/3.6/using-bubble/principles) [NextDesign](https://docs.airdev.co/canvas/3.6/using-bubble/design) Last updated 5 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.6/using-bubble/database#foundation-of-your-app) Foundation of your app -------------------------------------------------------------------------------------------------------------- The data structure is the foundation of a Bubble application and setting up the database should be the very first thing you do. In fact, most of the time it’s something that we at AirDev do before even opening the Bubble editor. Instead, we pull up a spreadsheet and create the entire database structure there first, thinking through the data types and the fields until most details fall into place. This ensures that we have a clean & robust set-up that’s ready for the logic to be built on top. The alternative is setting up your database as you build functionality and, while it’s sometimes necessary (if you can’t anticipate everything you’ll need in the beginning, such as when the project evolves as it’s built), it should mostly be avoided because your app is likely to end up with a messier data structure. And that’s a big deal because as the application grows, the database structure really influences how easy or hard it is to evolve and maintain your application. With a mature application, it may mean a difference of weeks or months of development effort. That’s a pretty major impact of a few clicks that the Bubble database requires to set up. [](https://docs.airdev.co/canvas/3.6/using-bubble/database#the-essentials) The essentials ---------------------------------------------------------------------------------------------- To start, let’s take a look at the core things you should know when building your database. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#data-types-and-data-fields) Data types and data fields Data types are essentially tables of data where each row represents a single object that has one or more data fields. A data field is a single piece of data about that object. So, if you’re building Twitter, you may have a data type called “Tweet” that represents a single tweet and that data type would have a bunch of fields that represent information about that tweet - the text of the tweet, who created it, how many likes it has, how many retweets it has, when it was created, etc. The first step in setting up your database is figuring out what data types you’ll need. There are a couple of ways you can think about that: 1. Think of the actions that take place in your platform. There is a good chance that your data types correspond pretty well to those actions. If you’re building Twitter, here are some actions that may come up: 1. Registering for the platform - this would require “User” data type 2. Posting a tweet - this would require a “Tweet” data type 3. Following someone - this would require a “Follow” data type 1. (Note: we'll explain more of the motivation for these design choices in the next section.) 2. If you’re familiar with Excel, think of how your data would be represented in a spreadsheet. If you’re building Twitter, you’d probably have multiple tabs, one that has all of the users who’ve signed up, one that has all of the tweets that have been created, and so on. In the Excel example, each tab represents a data type, each column represents a data field, and each row represents a thing. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#linking-objects-together) Linking objects together When creating your database, it’s very important to properly link data types to each other. This ensures that you can look up a user’s friends, a listing’s reservations, or a product’s purchases. #### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#a-field-vs.-a-separate-object) A field vs. a separate object A choice you’ll be faced with is whether a link should be set up as a field on a data type or a separate data type altogether. For example, if you’re creating the concept of “following” in a social media app, you might have a field called “List of follows” (of type list of Users) on a User OR you might have a new data type called a “Follow” that would have fields that link the two users together. In this situation I would think about the future and whether you’re likely to want to capture other data about that relationship in the future. If the answer is yes, then you’ll want to have a separate object and if the answer is no, you can keep it to a field. So in the following example, the answer is likely to be yes because you may want to record when the user started following someone and you won’t be able to do that without a separate object. #### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#one-way-vs-two-way-data-linking) One-way vs two-way data linking If you’re building AirBnB, you will probably have a User object and a Property object. The decision you’ll be faced with is whether you should have a “User” field on the Property, a “List of properties” field on the User, or both. Here’s how we think about it: 1. As the first step, always start by having a single link on the object that is subordinate to the other object. In this case, the Property is subordinate to the User, so it’s worthwhile to start with having a “User” field on the Property 2. Then, the question to answer is: will the relationship be used frequently AND will the list remain relatively small if implemented? If the answer is yes, then you should also set up the reverse linkage. In this case, the list of properties that the user has will be used frequently in the application and also the list will likely not get that big, which is why I would advise setting up a two way linkage. If we were setting up Messages for example, I probably would only do one-way linkage because the user might have thousands of messages linked to them and lists of that size get unwieldy in Bubble. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#privacy-rules) Privacy rules Privacy rules determine what data is able to be sent from the server to the client (your computer) and thus are very important for making sure that your user data is secure. **You should set privacy rules up right after you set up the database and before you start development**. It’s much more difficult to set them up after the development is done, especially if you determine that you need to adjust your database to create appropriate privacy rules. You will sometimes need to create extra fields in order to have proper privacy rules. To illustrate: Let’s imagine that you’re building project management software. You may have a data type called Project, a data type called Task with a Project field on it, and a data type called Message with a Task field on it. It’s a pretty straightforward set up where projects consist of tasks, which consist of messages. If you want to make sure that messages aren’t seen by users who aren’t on the project, you may want to construct an expression like “Current User’s Projects contains this Message’s Task’s Project”. However, that expression isn’t fully supported by the privacy rules, so instead you may have to also store a Project field on the Message object. That way your privacy rule changes to “Current User’s Projects contains this Message’s Project”, which is fully supported by privacy rules. See also: ### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#anticipate-the-future) Anticipate the future As you’re setting up your database, it’s important to think ahead to the functionality that you aren’t building yet but are planning to build in the future and set up your database to be well positioned for that functionality. For example, if we are building a SaaS product, we will often start by building it for individuals to start but will anticipate that in the future we’ll need those individuals to be part of organizations and share access, permissions, etc. In that case we will create an “Organization” data type in addition to the “User” data type. Each User will have an Organization attached to them and each organization will have only one User to start but this seemingly redundant set up will make it 10x easier to build out the organizational functionality when it becomes necessary. [](https://docs.airdev.co/canvas/3.6/using-bubble/database#tips-and-tricks) Tips and tricks ------------------------------------------------------------------------------------------------ ### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#database-object-s-instead-of-hardcoded-values) Database object(s) instead of hardcoded values A really useful practice is creating a data type that will store information about the platform that would normally have to be hard-coded instead. This way, we avoid using "Magic numbers", or numbers that are hard coded (i.e. manually typed) into hard-to-find places of an app. #### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#an-example-from-the-canvas-template) An example from the Canvas template In our Canvas template, we have a `Website` data type which contains hard-coded data used across the application. A `Website` has multiple fields that contain info about the platform - the name, the logo, etc. Then, anywhere we have to reference things like the name of the platform, we don't hard code the name, but instead link the display to the `Website` object. That way, if we ever have to change the name, it becomes as easy as going into the database and updating a single field. Each app should only have one `Website` in the database, although if you come up with your own solution for hard-coded values, it may look different depending on your use case. #### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#creating-static-data-types) Creating static data types Static data types are data types that are set by Admins or by the platform developers, and which are likely to change very infrequently. Here are some other ways that using database objects instead of hardcoded values can be useful: * Legal docs: for documents like the Privacy Policy and Terms of Service, we store these in variables on our database (in addition to documents in Google Docs). These documents are then displayed as text in the application. * Pricing plans: let’s say that you have 3 pricing plans for your SaaS platform. Each plan has a price and maximum number of users (1, 10, and 100). One way to represent this is to have a data type called “Plan” that has fields that include the max number of users, so that later on, if you want to change the number of users that are supported by a plan, you can just update a single field in the database. * Permissions - if your application has multiple user types, each with different permissions, it may make sense to create a Permission data type that will capture all of the different permission types that exist and all of the permissions that each type has. If you’re building Slack and want some users to be able to join any channel and some other users to only be able to join public channels, you would have a Permissions object with field called “Can join any channel” and set that field to “yes” only for the Permissions that allow that action. Then you can refer to “Current user’s permission’s Can join any channel” to see whether that user can join a non-public channel. This is much cleaner than the commonly used alternative of just referring to the name of the user type and hard-coding their permissions. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#yes-no-fields-vs-texts-or-dates) Yes/no fields vs texts or dates You’ll often need to record whether something is true or false - whether a user is an admin or not, whether a user has verified their email or not, whether a blog post has been published or not, and so on. One data type we can use for this is the yes/no (boolean) type. It is usually better to use a **text** field type or a **date** field type in order to be able to get richer data and have more future flexibility, rather than a yes/no field type which can only record 2 different values. For example, if you want to record whether or not a User has signed an agreement, it might make sense to record a “Date agreement signed” of type date instead of “Agreement signed” of type yes/no because the former will provide you with more information in a single field. Both whether the agreement was signed (`date isn’t empty` in Bubble-ese) but also when it was signed (value of the field). The downside of this approach, of course, is that a yes/no field is more straightforward to follow and remember. Additionally, if you use a text field, you have to make sure that you’re always using the exact values of the options that can go into that text field. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#naming-conventions) Naming conventions It’s a good idea to name your objects and fields in a consistent way. Specifically, here are some things that you may want to do: * If there are fields on an object that can be grouped somehow (for example fields on a Tweet that record stats about that week), you can add a prefix before each of those fields, so that they appear next to each other on a list * If there are fields that you’re no longer using, it may make sense to add a “DEP” (for deprecated) or a similar prefix to the name. That way it will be apparent that the field isn’t used anymore ### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#created-by-field) “Created by” field By default every Bubble data type comes with a “Created by” field, which records the user who created the object. However, it often makes sense to create a separate field to record that same thing, so that you have control over it. For example, at some point you may want to create those objects through the API and attribute them to people. When data is created via API, an object's "Created By" field is usually empty, depending on how you set up the API authentication. Data can also be created through the Bubble editor, which will result an this field being empty, or via API Workflows triggered by an admin user, where the admin would be the Creator of this data. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#commenting-on-fields) Commenting on fields When creating the database you should comment on the fields where the purpose of those fields isn’t immediately clear, to make it easier for yourself to maintain the application in the future. This is especially important for text fields that represent a multiple choice option. For example, if you have a “Type” text field on the “User” object, you should record all of the different types that can go into that field. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#option-sets) Option Sets There is a feature in Bubble that allows a set of data to be loaded when any page in the app is loaded. This is good for small amounts of data (e.g. categories of Users: Buyer, Seller and Owner) that will be used all over the app. it eliminates unnecessary requests and helps the app's logic look a bit cleaner, too, as you can select a specific app option instead of manually typing in a text or other value stored on database objects. [](https://docs.airdev.co/canvas/3.6/using-bubble/database#example-database) Example database -------------------------------------------------------------------------------------------------- This is a sample database structure for a simple, early version of Facebook. This assumes the following functionality: * Users from certain approved universities can join the platform after verifying their email address * Users can search for other users at their university and add them as friends (requires approval) * If friends, users can view each other’s full profiles and write on each other’s “walls”. Users can also write on their own walls. * Users can poke each other * Users can message each other * Users can create and join groups * Users get notified when important activity occurs on the platform with a few premade option sets that you can copy into your app. #### [](https://docs.airdev.co/canvas/3.6/using-bubble/database#facebook-click-here-to-see-example-in-a-spreadsheet) [We have an app](https://bubble.io/page?type=page&name=index&id=canvasoptionsset&tab=tabs-3&subtab=Option+Sets) [Facebook (click here to see example in a spreadsheet)](https://docs.google.com/spreadsheets/d/1NVcM3Egq5jZDcodZPGgy_Hd9MvQTBdxyeGIGXqaUWfo/edit?usp=sharing) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Flh3.googleusercontent.com%2FzjkQ5KnpvVzwN0j3ZEGO-75A_nlslU-n0EO9UuZnnQTDoRkpm54E-iJJp2ymRupdwiUlQtgRkzqee16BuPdML8mXCcaRzpJCM-e8xyLbhdZHAJGaArQMWdc09qzC5mb7NOb9fYvD&width=300&dpr=4&quality=100&sign=84d74c9d&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Flh5.googleusercontent.com%2FxQgsDcDWtGk8AJP0FEak8IxyVsluBPfDl02c8BNj79osw0bvMd0eDbST9d7lk2JFcYRNmxZy4oEiYTM7Ir9RopPNCR2ycljJvwFjcbKV6f8lR6_CAEotNRYytLqJyjEmzFcbR2TT&width=768&dpr=4&quality=100&sign=31351b66&sv=2) AirBnB example in a spreadsheet - Yellow boxes are optional A filled in comment icon means there is a comment ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LwKLSgB8b48G5VvWI8j%252F-LwKRtM5ZQqF3bfAUgtj%252Fpasted%2520image%25200.png%3Falt%3Dmedia%26token%3Db1a7d320-8dd7-48b1-87aa-c9a0be6bdf20&width=768&dpr=4&quality=100&sign=3970c058&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LwJrLRkDGODmRtljB6e%252F-LwKL05diJN6oetNz_Xg%252FScreenshot%2520from%25202019-12-17%252014-28-33.png%3Falt%3Dmedia%26token%3D7fffc4d6-b596-4528-9eee-e8eeff4613b6&width=768&dpr=4&quality=100&sign=1e8cbc6a&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Lv6mhPcOSLWch6HLRIC%252F-Lv6r5_2dvzmvH_SQMdi%252FScreen%2520Shot%25202019-04-22%2520at%25202.57.53%2520PM.png%3Falt%3Dmedia%26token%3D0f465dde-9cfc-41d0-842f-d12016c1a79b&width=300&dpr=4&quality=100&sign=3a0d5269&sv=2) [https://manual.bubble.io/working-with-data/privacy-and-security.htmlmanual.bubble.io](https://manual.bubble.io/working-with-data/privacy-and-security.html) --- # For Designers | Canvas Documentation [PreviousWhat's New](https://docs.airdev.co/canvas/3.6/whats-new) [NextGetting Started](https://docs.airdev.co/canvas/3.6/canvas-functionality/getting-started) Last updated 3 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.6/for-designers#canvas-library) **Canvas library** ------------------------------------------------------------------------------------------ The contains full-page previews and descriptions of all page templates and blocks within the Canvas design system. [](https://docs.airdev.co/canvas/3.6/for-designers#canvas-styles-and-example-components-figma-file) **Canvas Styles and Example Components Figma file** ------------------------------------------------------------------------------------------------------------------------------------------------------------ The contains all of the typography and color styles used throughout Canvas design system. The example components’ dimensions and padding are consistent with Canvas block and page templates’ dimensions and padding. These components can serve as a base to create additional components, though this is completely optional. [](https://docs.airdev.co/canvas/3.6/for-designers#how-to-customize-the-canvas-figma-file) **How to customize the Canvas Figma file** ------------------------------------------------------------------------------------------------------------------------------------------ * Access the read-only copy of the file here: * At the top of the page, click on the file name, and select “Duplicate” from the dropdown. Figma will copy the file to your Figma account’s Drafts folder. * Navigate to the copied file in your Drafts folder and edit it in any way to begin creating your custom designs. * Modify all of the color styles to fit your app's branding requirements. If you would like to customize your app's font, it is recommended that you choose a font that is equal to or slightly smaller than Inter for these reasons: 1. If the font is larger than Inter, Bubble might show "......" within each text element in the Bubble editor, making it challenging for the designer and developer to know where to click to edit different elements. 2. If the font is larger than Inter, fixed-width tab and link elements will sometimes break to the next line after making changes to the fonts. With smaller fonts, elements won’t break to the following line. Note: For completely custom UI elements and designs created from scratch, and not from Canvas, there shouldn't be any challenges starting with a larger font than Inter. * Utilize the example components and/or create brand new components on this components page. All components with a 🟢emoji contain variants. All components with a 🔴emoji are meant to be detached. * Create a new page for your project and start building your app's designs. [](https://docs.airdev.co/canvas/3.6/for-designers#how-to-import-designs-from-the-canvas-library-into-figma) **How to import designs from the Canvas Library into Figma** ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ * To create a new design in Figma, based on a Canvas design, you can: * Select the “Full Page” preview option to open that design in a new tab. * * This plugin requires that you define an import width. Most page templates have a 1220px width on desktop, and that should equal the size of all Figma frames used for desktop pages. The following page templates have slightly larger widths by default -- please import them at these widths: * 2-Column Menu Tabs Page: 1410px width * Floating Map Search Page: 2600px width * Profile Tabs Page: 1410px width * Standard Multi-Step Page with Sidebar: 1410px width * Vertical Multi-Step Page: 1410px width * All Canvas designs are imported into the Bubble editor at desktop page widths by default. All designs are responsive for mobile but are modified in the Bubble editor at desktop page widths. If you plan to create a new design by modifying imported Canvas components (instead of creating them from scratch in the Bubble editor), it is best also to create desktop mockups, even if a page will primarily be used on mobile. [](https://docs.airdev.co/canvas/3.6/for-designers#canvas-design-system-specifications) **Canvas design system specifications** ------------------------------------------------------------------------------------------------------------------------------------ #### [](https://docs.airdev.co/canvas/3.6/for-designers#page-template-sizes) **Page template sizes** * 1220px width for most pages. * Exceptions: * 2-Column Menu Tabs Page: 1410px width * Floating Map Search Page: 2600px width * Profile Tabs Page: 1410px width * Standard Multi-Step Page with Sidebar: 1410px width * Vertical Multi-Step Page: 1410px width #### [](https://docs.airdev.co/canvas/3.6/for-designers#block-sizes-content-containers) **Block sizes (content containers)** * Desktop: 860px width * 40px of padding on all sides * Mobile: 300px width * 20px of padding on all sides * Canvas will automatically add 40px of space between each block on a page. #### [](https://docs.airdev.co/canvas/3.6/for-designers#popups) **Popups** * Standard: 680px width * 30px of padding on all sides * Small: 360px width * 30px of padding on all sides #### [](https://docs.airdev.co/canvas/3.6/for-designers#typography-scale) **Typography scale** * Size 44: Large Title (for CTA Page Titles) * Size 30: Medium Title (for Standard Page Titles) * Size 23: Small Title (for RG and Group Headers) * Size 19: Subheading, Large Body * Size 15: Body, Buttons, Tabs (default) * Size 13: Microcopy, Metadata, Overline #### [](https://docs.airdev.co/canvas/3.6/for-designers#fonts-and-weights-for-all-font-sizes) **Fonts and weights (for all font sizes)** * Inter Bold - Weight: 600 * Inter Semibold - Weight: 500 * Inter Standard - Weight: 400 (default) #### [](https://docs.airdev.co/canvas/3.6/for-designers#button-sizes) **Button sizes** * 45px height for CTA buttons and marketing page buttons with 19pt font * 40px height for standard buttons with size 15pt font (default) * 28px height for smaller buttons above repeating groups with size 15pt font #### [](https://docs.airdev.co/canvas/3.6/for-designers#inputs-dropdowns-searchboxes) **Inputs, dropdowns, searchboxes** * 45px height, with Inter Standard (Black) 19pt text and light grey borders, for CTA and marketing pages * 40px height, with Inter Standard (Black) 15pt text and light grey borders, for standard app pages (default) #### [](https://docs.airdev.co/canvas/3.6/for-designers#icons) **Icons** * Canvas uses the feather icons library for most icons. Bubble supports Google Material icons and Ionic icons as well. #### [](https://docs.airdev.co/canvas/3.6/for-designers#maps) **Maps** * Canvas contains the following map styles by default: * Apple Maps (default) * Neutral Blue * Dark Mode * Just Places * Bubble supports custom Google map styles as well. [](https://docs.airdev.co/canvas/3.6/for-designers#planning-for-responsiveness) **Planning for responsiveness** -------------------------------------------------------------------------------------------------------------------- * The Bubble responsive engine is slightly different from other visual development platforms such as Webflow. Bubble doesn’t yet support the following responsive settings: * Elements that collapse in width conditionally based on data (e.g., displaying a sidebar for some Users on a page and collapsing that same sidebar for other Users on that same page). * Exception: * Bubble can collapse elements in width based on the Current Page width. * Variable font sizes from desktop to mobile. * Overlapping elements of different sizes (e.g., image elements that must scale proportionally as the page is resized, with text elements on top of it.) * Exceptions: * It is possible to set an image as the background image of a group with text on top of the image. However, the image will not scale proportionally as the page is resized. * It is possible to have elements overlap if the elements remain the same size on all screen sizes. * Elements that change in size on hover. * Elements that dynamically change in width, height, and position based on viewport height and width. Click on any page template or block that meets your use case within the . Use a Chrome Extension such as to inspect the elements’ design properties. In Figma, you can build these components from scratch or use the import plugin to import a Canvas design into Figma by pasting the URL of the full page preview into Figma. [Canvas library](https://canvas.airdev.co/library) [Prism](https://chrome.google.com/webstore/detail/prism-redline-tool/hkbhjllliedcceblibllaodamehmbfgm?hl=en-US) [HTML → Figma](https://www.figma.com/community/plugin/747985167520967365/Figma-to-HTML%2C-CSS%2C-React-%26-more!) [Canvas library](https://canvas.airdev.co/library) [Canvas Styles and Example Components Figma file](https://bit.ly/3AWLAaP) [https://bit.ly/3ww9k23](https://bit.ly/3AWLAaP) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MeCbe1tPzZR45Bevn_l%252F-MeCeNpC_x-BfIfisH_b%252FMy-project.png%3Falt%3Dmedia%26token%3D9ffeda3d-c638-4841-9954-1e2bc3c29b69&width=768&dpr=4&quality=100&sign=fbe54bf1&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MeCbe1tPzZR45Bevn_l%252F-MeCcEo8KX4Vje6op8Tn%252FDuplicate-file.png%3Falt%3Dmedia%26token%3D25bc1f0f-96c3-4d50-9afd-09939869b314&width=768&dpr=4&quality=100&sign=1a6c56ae&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MeCbe1tPzZR45Bevn_l%252F-MeCcRn7ZlPdyJtGLbMx%252FStyles.png%3Falt%3Dmedia%26token%3D43a9eb60-bd91-48c8-bcec-1a9a9b987785&width=768&dpr=4&quality=100&sign=b7638296&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MeCbe1tPzZR45Bevn_l%252F-MeCcilN6pc-CD9SN1y9%252FExample-components.png%3Falt%3Dmedia%26token%3Da69d7a45-e15f-4da6-8d5b-322a7b3130de&width=768&dpr=4&quality=100&sign=c88a9954&sv=2) --- # Data triggers | Canvas Documentation [PreviousModularity](https://docs.airdev.co/canvas/3.6/using-bubble/modularity) Last updated 5 years ago Was this helpful? This page will serve as a guide for Bubble's new \- actions in the Backend Workflows page that will happen any time you make changes to a data object anywhere in the app. For example, when you add an object to a Cart, a data trigger workflow can automatically re-calculate taxes and any other calculated fields, eliminating the need to copy logic to many places throughout the app. Before starting this guide, be aware that it is best to wait at least a few weeks after a feature like this is released before including it for mission-critical features in a client app. Since it was only just released as a public beta, it is possible that the feature is not yet production-ready or that some bugs will be found in the following weeks. [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity/data-triggers#common-use-cases) Common use cases ------------------------------------------------------------------------------------------------------------------ For all of the below use cases, they're really **only relevant if a data type is being changed in more than one place in your Bubble app**. If you're considering moving workflows to a data trigger, and the trigger is only run from one place in the app, it's best to stick to normal workflows. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity/data-triggers#linked-data-objects) Linked data objects Updating one object when another directly related object is changed. For example: a taxi Driver has a Car in a ride-sharing app. When the Car is updated, say if a car becomes too old to be eligible for the app, the Driver can also be updated - in this case, to be unavailable for future rides. Data can be linked in many different ways, including: * **Bidirectional linkages** (like the above Driver example) * Data from one object is directly linked to another, and vice versa * **One-to-one linkages for CSV exports** * Data from one object is directly linked to another, and you want to replicate saved data in order to more easily export it as one table. * Imagine that in a Bubble app, each User has a Store, and each Store has a `monthly revenue`. In a data export of Users, normally the only field included from the Store would be the Store's unique ID. We can include each User's Store's `monthly revenue` on a second `monthly revenue` field on the User object. That field will also be included in the CSV export. However, the User's `monthly revenue` field will also need to be updated each time the Store's `monthly revenue` field changes. Using a data trigger here would make since **if** a User can make changes to a Store's name in multiple places in the app. * **Roll-up/summarized data** * Imagine that there is a Repeating Group of Users and their number of Items is displayed as a column in the UI. Rather than using a `do a search for Items:count` call in each row and calculating the number of items, a number field named Item Count can be recalculated each time an item is added/removed. Again, this makes most sense if the number of items can be changed in many places in the app. If it is only changed in one workflow, you can add the step to save the number of items on the User object inside that same workflow. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity/data-triggers#calculations) Calculations Running complex calculations that need to be updated whenever a field is changed. For example: financial calculations, or any formula containing many factors, where the result should be stored as a field. Note the conditions here - if the calculations are already updated, there is no need to write to the database. The second step takes the results of step 1 and combines them in a way that would be difficult to build and difficult to understand with Bubble mathematical logic. #### [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity/data-triggers#undefined) ### [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity/data-triggers#generating-an-object-json-or-other-field-that-summarizes-the-objects-contents) Generating an object JSON or other field that summarizes the object's contents Re-generating a field that reformats information from other fields. This is similar to the calculations, but generates a text output instead of a number output. For example: a JSON that represents an object and contains each of the other fields, but is stored as a text. This User JSON can be used to manipulate User data on the page with Javascript, among other things. [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity/data-triggers#performance) Performance -------------------------------------------------------------------------------------------------------- Overusing this feature can have huge impacts on app performance. Completing actions that take up a lot of capacity are not recommended, such as making changes to a list of many things. Additionally, searches for data that are completed here do NOT have restrictions with privacy rules. Any search that is completed here can return an entire table in the database if it's not set up correctly, potentially using up your app's capacity and slowing it down drastically. [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity/data-triggers#limitations-and-workarounds) Limitations and workarounds ---------------------------------------------------------------------------------------------------------------------------------------- * User-specific info: * Logging out of a User's account (using the Bubble "Log a user out" workflow) activates any User data trigger. * Logging into a User's account doesn't activate a User data trigger. * Signing up as a new User activates a User data trigger. * One data trigger can't trigger another data trigger - if I edit a User's Post's in a User data trigger, Post data triggers will not be activated. * Workaround: schedule an API workflow that makes changes to an object. This will trigger the data trigger for that object. (Functional as of May 13, 2020.) * There seems to be a protection against infinite loops here. If a User is modified in your app and the User trigger is activated, which then edits a Post in an API workflow, then the Post data trigger will then be triggered. However, if you then edit the User object in an API workflow triggered from the Post data trigger workflow, the User data trigger won't be activated, preventing a loop of User->Post->User->Post from continually firing. [data trigger actions](https://forum.bubble.io/t/public-beta-database-change-triggers/81033) Fields made for CSV export could benefit from data triggers ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M2KC08tlEYuc9l8pVZg%252F-M2KbS2rhhNI_3gMTOMS%252Fformula-1.PNG%3Falt%3Dmedia%26token%3D25f8d00c-7792-4cf6-9e3d-87d1f334683a&width=768&dpr=4&quality=100&sign=28b8a2e4&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M2KC08tlEYuc9l8pVZg%252F-M2KYU707WREPlRSfRKC%252Fdriver-trigger.PNG%3Falt%3Dmedia%26token%3D2db2d99c-133a-4c23-aace-3136058c2512&width=768&dpr=4&quality=100&sign=80ea29ca&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M2kyMyUWmxYFEKcyA_x%252F-M2l1bDog42ooncV8OWQ%252Frollups-trigger.PNG%3Falt%3Dmedia%26token%3Dc612d3bd-98ea-4453-8e33-130e6649548d&width=768&dpr=4&quality=100&sign=22bf5258&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M2KC08tlEYuc9l8pVZg%252F-M2KbX2bQ5QHRc8i2aZx%252Fformula-2.PNG%3Falt%3Dmedia%26token%3D270f7be3-d785-4d69-b368-67aa19b48771&width=768&dpr=4&quality=100&sign=b371b675&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M2kyMyUWmxYFEKcyA_x%252F-M2l0hToOZIdw7Pkd3Xb%252Fcsv-exportdata.PNG%3Falt%3Dmedia%26token%3Df04e515c-bc63-4bc9-8c36-7fb6f9100ca2&width=768&dpr=4&quality=100&sign=60347593&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M2KC08tlEYuc9l8pVZg%252F-M2KZxVa9kNgDfec5jcY%252Fjson-trigger.PNG%3Falt%3Dmedia%26token%3Dceec8ac9-a40c-4ac0-af2c-ad54f3105b89&width=768&dpr=4&quality=100&sign=77b9ad99&sv=2) --- # Admin Portal | Canvas Documentation [PreviousIndex](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/index) [NextAccount](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/account) Last updated 4 years ago Was this helpful? **Page name:** admin **Purpose:** Fully functional portal for managing all the settings for your application Due to the complexity of the page and the amount of information that is usually displayed, the Admin portal will not be responsive. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#overview) Overview ---------------------------------------------------------------------------------------------------------------------- Your app will come with a dedicated portal for the app’s admin where you can manage app settings & data. Much of this is preset for you, but you will have to customize the page for your app. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#launch-checklist) Launch Checklist ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#branding) Branding ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#pages) Pages ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#header-footer) Header/Footer ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#emails) Emails ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#settings) Settings The **Settings** group provides a means for admins to set global variables for the app. Some of these are pre-baked into Canvas, like setting the password policy or cookie settings. But you also can customize your own app-wide settings that can be exposed to app admins (e.g. listing fee or tags). To do this, find the **Group Nav 0/1/5 - Launch & Settings** group. Within this group is a reusable element called **admin\_options.** Within this is another reusable called **admin\_options\_settings**. You shouldn't need to touch any of the other elements/workflows within **admin\_options**. Once inside **admin\_options\_settings**, you will have access to two button-style groups within **Group Collapsible admin-defined options group**, one of which launches a popup with a single input, and another which launches a pick-list of options. The single field popup is updating a dummy field in the website object called **dummy option** and the sample picklist popup is displaying a list of dummy data. You should connect up your own data and logic to the buttons and corresponding popups. The add and delete features in the sample picklist popup are disabled by default - you must go into the Bubble editor and enable the add/delete features in order for them to work. To add additional options to this area, the groups and popups which are used here should be cloned. You can adjust the collapsing range of the reusable using **Group PLACEHOLDER**. If you’d like to hide these options entirely, you should go to the reusable, select **Group Collapsible admin-defined options group** and uncheck _This element is visible_ on the conditional tab. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#analytics) Analytics View statistics for your users such a total users, recent signups, and active users. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#users) Users View all the users in your application, reset passwords, add new admin, and filter by status, name, and role. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#extending-the-admin-portal) Extending the Admin Portal ---------------------------------------------------------------------------------------------------------------------------------------------------------- To extend the admin portal and customize it for your application, the Canvas Base template comes with a placeholder table group that can be copied and customized to add additional views and functionality for your data. You can find this group in the elements tree as **Group Nav 8 - Data type 1 content**. On the page this group is located directly below 'Group Nav 7 - Users'. This group contains a reusable element called **admin\_datatype1** which contains dummy data. Make the following changes to customize it for your needs. **General** 1. Update the titles for the **Group Nav 8 - Data type 1 content** and **admin\_datatype1** groups (i.e, you might have **Group Nav 8 - Posts** and **admin\_posts**) 2. Edit the the **New** button and add an action when it is clicked 3. Add an action for the **Data** button if needed #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#set-up-the-repeating-group) Set up the repeating group From inside the reusable elements **admin\_datatype1**, you should: 1. Data to display 1. Change the title and data type of the element RepeatingGroup Dummy 2. Define a data source for the repeating group 2. Set up the table 1. Update/add headers in the text elements placed above the repeating group. 2. Define the dynamic content that corresponds with the headers and will be displayed by the repeating group. 3. Set up the text that is displayed when no data is found. This is nested under Group inner dummy content > Group no entries. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#navigation) Navigation From the admin page, you should 1. Open FloatingGroup Sidebar\_website > Group inner sidebar tab\_website > Group Main Nav 9 - Data type 1\_text 2. Change the data source for this group to the text you would like to display in the navigation bar After each change you make here, make sure to view the web page in version-test in order to check whether it works as expected. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#adding-additional-tabs-to-the-admin-portal) Adding additional tabs to the Admin portal ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ To add additional tabs to the admin portal, duplicate the **Group Nav 8 - Data type 1 content** and the **admin\_datatype1** reusable elements we customized above. Change the text after the hyphen in the group name to represent the data type it is displaying. For instance, if we were displaying invoices in the Group Nav 9 element we should change the name to 'Group Nav 9 - Invoices'. The steps are nearly the same as above but you will need to take the following additional steps. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#replace-the-reusable-element) **Replace the reusable element** In your new, parent content group (**Group Nav 9 - Data type 2 content**, for example), you'll need to replace the **admin\_datatype1** reusable, which was copied along with the parent group, with your new reusable (**admin\_datatype2**, for example). #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#reposition-the-new-group) Reposition the new group Move your duplicated group underneath Group Nav 8 so the top of your new group snaps to the bottom of the Group Nav 8. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#resize-the-placeholder-group) Resize the placeholder group Drag the top of the 'Group PLACEHOLDER (do not delete) until the top edge snaps to the bottom of the new group you created #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/admin-portal#update-the-conditional-references) Update the conditional references Change the reference in the conditional from 'Group Main Nav 8 - Data type 1\_text' to 'Group Main Nav 9 - Data type 2\_text' You're all set! You can duplicate the steps above to add as many new data tables as you like! These guidelines are specific to the Admin portal, but they can be useful as a common design pattern to follow for a portal/dashboard page. ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPGwzcx0s1nKUFMSyJw%252F-MPHBTSQTa9lo38eLVrj%252Fimage.png%3Falt%3Dmedia%26token%3Db809d37b-9303-4ebd-abb4-037a0927e67c&width=768&dpr=4&quality=100&sign=7e633050&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPGwzcx0s1nKUFMSyJw%252F-MPHBa-DGhdCSHOltazS%252Fimage.png%3Falt%3Dmedia%26token%3Da598be66-9d41-438b-98e5-428542eed575&width=768&dpr=4&quality=100&sign=955ab727&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPGwzcx0s1nKUFMSyJw%252F-MPHBlPFX9VswJVQkQfl%252Fimage.png%3Falt%3Dmedia%26token%3Dbf46ac0b-4735-4ae5-a596-8e53c72f42da&width=768&dpr=4&quality=100&sign=769e13aa&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPGwzcx0s1nKUFMSyJw%252F-MPHBgAR2iZ2YBDOoIeg%252Fimage.png%3Falt%3Dmedia%26token%3D08ed6852-0161-441d-9814-9de465eadb9f&width=768&dpr=4&quality=100&sign=e336bf59&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPGwzcx0s1nKUFMSyJw%252F-MPHBOzTyLTQI_LBPNDD%252Fimage.png%3Falt%3Dmedia%26token%3Db386839a-daeb-49ae-b315-3be0ba20032c&width=768&dpr=4&quality=100&sign=26cbeb75&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-MbcjqmX-MzjnKq1vYX8%252Fimage.png%3Falt%3Dmedia%26token%3D54738df2-c20c-43b7-a6be-0cc887acbeda&width=768&dpr=4&quality=100&sign=32dd078e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-MbcjvwwPGul1VCrM8xB%252Fimage.png%3Falt%3Dmedia%26token%3Dbfb84bef-e5f1-4df1-a333-0a58203f1cd0&width=768&dpr=4&quality=100&sign=448fdf7&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-Mbck1z7DrQW10Bxs1WK%252Fimage.png%3Falt%3Dmedia%26token%3D5da590c2-7901-4bdf-92bf-2927b7f59233&width=768&dpr=4&quality=100&sign=e5c7d950&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPGwzcx0s1nKUFMSyJw%252F-MPHAf89LCHcx_2mAyAP%252Fimage.png%3Falt%3Dmedia%26token%3D3a89cfa2-db51-473f-8a10-9c48247f9301&width=768&dpr=4&quality=100&sign=a90f8613&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPGwzcx0s1nKUFMSyJw%252F-MPHA2_1SH70VI9E7Ddl%252Fimage.png%3Falt%3Dmedia%26token%3Dd9c99474-7450-4221-889a-aba59e5c8106&width=768&dpr=4&quality=100&sign=3c268f14&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-MbchjAC05anOs5Yo662%252Fimage.png%3Falt%3Dmedia%26token%3Df092de49-e57d-4cb7-b663-fb6c282c36e9&width=768&dpr=4&quality=100&sign=5551702f&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-MbcjcPSlBG_uabTXYV5%252Fimage.png%3Falt%3Dmedia%26token%3D285f12ed-c80d-4a25-8823-e5b0ff60e19d&width=768&dpr=4&quality=100&sign=3c5e0be&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-Mbck7wTN5Osk3RZUN-3%252Fimage.png%3Falt%3Dmedia%26token%3Dd88ef78c-c487-44f8-bb9b-b7f32a0509fb&width=768&dpr=4&quality=100&sign=f13056e2&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MbcWjK2MjNiH6nI6Rgg%252F-MbccVyiOC-ZlGLFqgUw%252Fimage.png%3Falt%3Dmedia%26token%3D26a4a68e-2479-47c7-86e6-e8bc36ca3241&width=768&dpr=4&quality=100&sign=e210451a&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-MbcgbZZW0fp0YZMbikx%252Fimage.png%3Falt%3Dmedia%26token%3Db4c4de66-fe6a-4b76-ae71-e960082e9cee&width=768&dpr=4&quality=100&sign=68d97eca&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MbcWjK2MjNiH6nI6Rgg%252F-MbcZASDek7conMcBQlz%252Fimage.png%3Falt%3Dmedia%26token%3Da93d9fa6-7ecf-4116-89cb-b094e3c6d0a7&width=768&dpr=4&quality=100&sign=358f25a7&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MbcWjK2MjNiH6nI6Rgg%252F-Mbcc0Zn3_bzsuxckW61%252Fimage.png%3Falt%3Dmedia%26token%3Ded120516-77a7-4872-ade4-d22d578fa3b3&width=768&dpr=4&quality=100&sign=11c5cfb2&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MbcWjK2MjNiH6nI6Rgg%252F-MbcbA_moJsiaP4Ytl7v%252Fimage.png%3Falt%3Dmedia%26token%3Dd3476aea-17aa-435a-ad49-a9cf3392e7b8&width=768&dpr=4&quality=100&sign=9f0323aa&sv=2) --- # Header | Canvas Documentation [PreviousReusable elements](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements) [NextFooter](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/footer) Last updated 3 years ago Was this helpful? **Element name:** header **Overview:** The Canvas HTML Header allows Canvas developers to create any number of headers for an app. The header reusable element contains a single HTML element that uses custom HTML, CSS, and flexbox to dynamically display different navigation elements, including texts, icons, buttons, the Current User profile image and group focus, and mobile menu. This header element is fully responsive, and it is used on every page of the Canvas template. Each Canvas application comes preconfigured with three headers as shown below. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header#admin-user) Admin user #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header#standard-logged-in-user) Standard logged in user #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header#logged-out-user) Logged out user ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header#creating-editing-a-header) Creating/editing a header Canvas developers can create any number of Headers within the admin portal, and each Header can have any combination of dynamic navigation elements (icons, texts, buttons, and the Current User profile picture): You can create a new header or you can choose to clone an existing header if you have one that is similar to what you would like to create. 1. Click New to create a new header from scratch 2. Click Edit to edit the name of the currently selected header 3. Click Clone to duplicate an existing headers settings into a new header 4. Click Delete to remove the currently selected header ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header#telling-canvas-which-header-to-display) Telling Canvas which header to display Canvas will display any Header based on the “var - current header” hidden variable within the header reusable. As you create new Headers, you will need to add more conditionals to this hidden variable to specify when to show each Header. For example, you could show a specific Header based on the Current User’s role or show a particular Header based on a certain page’s name. Remember, when setting conditionals Bubble will give priority to the last condition that is true. So if you have three conditions and both condition #1 and condition #3 evaluate as true, Bubble will prioritize condition #3 over condition #1. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header#header-sections) Header sections #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header#text) Text Text Navigation items will appear to the left of the icons in your header. On a mobile screen, these elements will be moved from the header into the mobile dropdown menu. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header#icons) Icons The icon element is a special element as we have included four reusable Bubble elements with GroupFocus drop downs that you can set up to be triggered from the icon. Note that both the indicated icon and the Bubble Action Trigger must be set exactly as indicated below for this functionality to work. You can add up to 4 icons per header but for best mobile experience we recommend using a max of 3 icons for a header that has the `logged in state` toggled on * * Icon = `bell` * Bubble Action Trigger = `bell-groupfocus` * * Icon = `messages-circle` * Bubble Action Trigger = `messages-groupfocus` * * Icon = `search` * Bubble Action Trigger = `search-groupfocus` * * Icon = `cart` * Bubble Action Trigger = `cart-groupfocus` Each of the above widgets contains a small text element that displays a number alert for that widget (think unread notifications or count of items in cart). This number is static by default but can be made dynamic by modifying the `var - unread` or `var - count` elements within the corresponding widget reusable. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header#buttons) Buttons You can include up to two buttons on each header. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header#logged-in-state) Logged-in state Set toggle on if this header is visible to logged-in Users. This header will display the Current User's profile picture with a dropdown menu that allows them to view their account settings or log out. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header#mobile-menu-and-responsiveness) Mobile menu and responsiveness Each Header's responsive settings are set automatically. On desktop, the Header will display text links, icons, buttons, and the Current User profile picture. On mobile, the Header will hide any text and button elements, and display the hamburger menu icon. Clicking on the hamburger menu icon will open a mobile menu that contains the Header's text and button navigation elements. The breakpoint to display the mobile menu is determined dynamically for each Header on page load. If a Header does not contain any text or button navigation elements, the hamburger menu will not become visible on mobile. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header#updating-the-logged-in-focus-group-menu) Updating the logged in focus group menu You can manually update the elements in the user account dropdown directly from the header reusable element in the Bubble editor. From the elements tree open **GroupFocus Mini > Group Logged In** There is a button for the user to log out, visit their account page, and navigate to the admin portal. We have also included three placeholder buttons for you to customize and add actions if you would like to create additional functionality. **Placeholder button** refers to a fully designed button element that has been hidden by default but can be unhidden and used as needed in your application. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header#header-states) Header states ------------------------------------------------------------------------------------------------------------------------------ The header reusable uses four states (states are often used in reusable elements to pass data between the reusable element and the page): * **Dark? yes / no state** \- If Dark=yes, then the default logo, favicon, button, and link color in the header will be white. If `Dark` = `no`, then the default logo, favicon, button, and link color in the header will be the app's default color. Please see an example of this below on the index page: * If you would like to change the background color when the header's "dark" state is "yes" so that it is not transparent, please modify this conditional on the `Group Header` element: * **Show portal menu? yes / no state** - On mobile (when on a portal type page), you can click on the portal menu in the upper left corner to open the sidebar menu. This is achieved by setting the state of `Show portal menu` to `yes`. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/header#key-workflows) Key Workflows ------------------------------------------------------------------------------------------------------------------------------ The header will come will various custom workflows that you can trigger from the page. You can do so by going to the workflow tab in the Bubble Editor and selecting Custom workflow > Trigger a custom workflow from a reusable element > Select header from the dropdown and the custom workflow name Each header can contain custom text links, icons, or buttons and have multiple actions that can be set for each item. Learn about how to use each action . **Widget Notifications** This action will show a notifications group focus when clicked. Learn how to customize this element . **Widget Messages** This action will show a messages group focus when clicked. Learn how to customize this element . **Widget Search** This action will show a search input within a group focus when clicked. Learn how to customize this element . **Widget Shopping Cart** This action will show the shopping cart group focus when clicked. Learn how to customize this element . **Portal page? yes / no state** \- When you add a to your app via Canvas Pages, there will be a workflow on that page for `When page is loaded`_,_ `set header's portal page? to "yes".` This will hide the favicon (`Group Logo Mobile`) and show the portal menu group (`Group portal menu`) in the header on mobile. **Search page? yes / no state** - When you add a to your app via Canvas Pages, there will be a workflow on that page for `When page is loaded, set header's search page?` _to_ `yes`_._ This will hide the favicon (`Group Logo Mobile`), show the portal menu group (`Group portal menu`), and change the hamburger menu icon to a search icon in the header on mobile. The popupreusables reusable element (which includes the popup) is included in the header, and can be triggered from the "show loader popup", "show message popup", "show login popup" and "show signup popup" custom workflows. [portal page](https://canvas.airdev.co/resource/portal-dashboard-page-1541199301879x207238372182473540) [portal search page](https://canvas.airdev.co/resource/search-page-1541199371286x774569242727011500) [Signup/Login reusable](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/signup-login) [here](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#notifications) [here](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#messages) [here](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#search) [here](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#shopping-cart) [here](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#setting-up-menu-item-actions) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Flh5.googleusercontent.com%2F8a6sZtylhfw1GqSM9LBw22eUSMtFpoELVDFIB3DndIwnH08Jv2t5ty1aFbCVgLcRp04cxpSUDUocJbIqgM80w412xT7b1sRIEUMSVeMHn_dbjQiX2FVMYXd4Ac2zLFBFamr0hQuZ&width=768&dpr=4&quality=100&sign=a7009eb5&sv=2) The portal menu will replace the favicon on mobile when you set the header state for Portal page? to "yes" ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MezX9FH52tnSe5C8RBZ%252F-MezcUnrXy7IY0ywRibx%252FCleanShot%25202021-07-19%2520at%252012.37.09.png%3Falt%3Dmedia%26token%3Dc1744fbd-8fc2-41fd-8276-da0808072cd7&width=768&dpr=4&quality=100&sign=9d358263&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MfA1PBd8yNPySMOqE8P%252F-MfA4XOfoOttl4GaUJek%252Fimage.png%3Falt%3Dmedia%26token%3Ddebe159c-d843-4055-a687-3b86b80843d2&width=768&dpr=4&quality=100&sign=4155954d&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MfA1PBd8yNPySMOqE8P%252F-MfA4cCHaYPNbVgC0mf4%252Fimage.png%3Falt%3Dmedia%26token%3Dd2a24997-fd07-40b1-9c52-7dde8df2a9b6&width=768&dpr=4&quality=100&sign=e32b85c2&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MfA4t5vaFuyvitKRALV%252F-MfA4yl9vvz7dnPXOAmW%252Fimage.png%3Falt%3Dmedia%26token%3D2a43faad-b87d-41d5-8bb6-1b53dd3b357a&width=768&dpr=4&quality=100&sign=5b1fb2b1&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MT2R3VMDzsFswQ5A_RT%252F-MT2WgDPGU4uZ5YFGiIQ%252Fheader-dark.png%3Falt%3Dmedia%26token%3Db8d3df58-b25a-43fc-bcc9-95ba5d452aac&width=768&dpr=4&quality=100&sign=1f8525c4&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-L_ncoBPrH7sZtzJgpTT%252F-L_nnOsQYA8T2YqVgIyr%252FScreen%2520Shot%25202019-03-12%2520at%25202.27.01%2520PM.png%3Falt%3Dmedia%26token%3Dd5c92511-b471-4989-a64b-eac3a7d8e4b7&width=768&dpr=4&quality=100&sign=c638993e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M3wiZMkjt7yM07Uf79t%252F-M3wn1hhmk4hVQik1ve5%252Fcustom-header-wfs.PNG%3Falt%3Dmedia%26token%3Da559c6a2-6e18-49a5-985e-7f193d90e78b&width=768&dpr=4&quality=100&sign=12167e89&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-L_ncoBPrH7sZtzJgpTT%252F-L_njnyiNG71NXj8REzp%252FScreen%2520Shot%25202019-03-12%2520at%25202.11.17%2520PM.png%3Falt%3Dmedia%26token%3D04260cf8-b04f-4e09-9c43-9fb80dc91e54&width=768&dpr=4&quality=100&sign=598f2b15&sv=2) --- # Miscellaneous | Canvas Documentation [PreviousEmails & Alerts](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts) [NextReference](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference) Last updated 3 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#setting-your-password-policy) Setting your password policy --------------------------------------------------------------------------------------------------------------------------------------- Setting your password policy in the admin portal will automatically update the password check UI throughout Canvas. The Canvas template includes a built-in password check UI during the signup flow and anywhere the user is required to reset their password. By default the password policy is set to require 5 total characters and at least 1 number. You can manage the requirements for your password policy directly from the Admin portal of your application. From the left menu click on Settings > Password policy. There are four policies that can be set: * **Password minimum length** - This sets the total characters that are required for the password to be valid. * **Require numbers** (optional) - If checked you must set the total numbers required in the input to the right. * **Require special characters** (optional) - If checked you must set the total special characters required in the input to the right. Characters that qualify as special characters for this rule are "**(**", "**)**", "**!**", "**@**", "**#**", "**$**", "**%**", "**^**", "**&**", and "**\***". * **Require uppercase letters** (optional) - If checked you must set the total special characters required in the input to the right. This is a Canvas feature and it does not utilize Bubble's built-in password policy feature. To use this in conjunction with Bubble's built-in password policy, in the Bubble editor go to Settings > General and set your password policy there as well. If you do update your Bubble password policy, please ensure that your Canvas password policy matches your Bubble password requirements. This will ensure the password policy check UI in throughout your app is up to date. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#cookie-permissions-and-consent-banner) Cookie Permissions & Consent Banner ------------------------------------------------------------------------------------------------------------------------------------------------------- We consider it a best practice to ask users for consent to save cookies before storing data on their device and have built this functionality directly into Canvas. To set this up properly, let's start in the Bubble editor. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#enabling-cookie-permissions) Enabling Cookie Permissions Once you have the editor open, from the left menu navigate to Settings > General > Privacy & Security. Here we need to check the box that says 'Do not set cookies on new visitors by default' Next log in to the admin portal, click on Settings > Cookies and toggle the 'Require users to agree to the storing of cookies in their browsers when they visit your website' to ON. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#cookie-consent-banner) Cookie Consent Banner **Element name:** cookies\_permission **Purpose:** Get the user's consent to store cookies on their device The Cookie Consent Banner is built as a reusable floating group and by default is placed on the index page of your Canvas template and anchored to the bottom. To add the consent banner to another page, drag it from the list of Reusable elements onto the design canvas of the page you would like to place it and make sure it is positioned at the bottom edge of the page. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#set-up-payment-info-on-account-page) Set up Payment info on Account page ----------------------------------------------------------------------------------------------------------------------------------------------------- Canvas comes with built in UI on the Account page for displaying the saved credit card details for your users as well as a history of transactions they have initiated. Before setting up payments, from your Bubble editor navigate to Plugins > Add Plugins and search for Stripe. Install the plugin that was made by Bubble. The Bubble stripe plugin adds additional fields to your user data type that can now be accessed. In the credit card display we use a group called 'Group credit card brand name' to manage many of the conditions for this view. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#payment-workflows-logic) Payment Workflows/Logic After you have connected the existing UI, you will still need to set up the logic for the payment process. This includes: 1. Saving payment information (credit/debit cards) 2. Running the appropriate workflows from Stripe (or your payment provider) 3. Recording any other relevant information in your app 1. Responses from the workflows in step 2 2. Last 4 digits of card (for identification) You will need to set most of this up on your own. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#loading-screen) Loading screen ----------------------------------------------------------------------------------------------------------- The loading screen element allows you to display a loading animation while your page's elements and data are being loaded beneath. You will want to include this on every page where you want this behavior. The element can be found under **Visual elements**. Simply drag it on to the page in order for it to be active. No matter how large the element is, it will always take up the full width of the page. Make it 1x1 pixels and place it in the top right corner of the page to avoid responsiveness issues. The properties panel provides several options for customizing the behavior and appearance of the loader. There are two ways in which you can use the loading element. **1.** **Display by default on page load** If the element is set to be visible on page load, a loading screen will appear on the page until you explicitly hide it. In order to have it disappear once the page's elements are loaded, you can either: 1. Create a workflow which is triggered when the page is loaded & loaded above the fold. Attach the **Hide loading screen** action. 2. Check the loading screen element's **Auto close** option **2\. Manually set when to show/hide the loader** Under Workflow actions > Plugins, you have two loader actions, one to show the loader and one to hide it. Use these to show the loader while specific workflows are firing (i.e. while making bulk changes to a list). ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#customizing-the-loader-style) **Customizing the loader style** Copy **Updating the loading screen text** Modify the code in the loading screen element's text field to tweak the font size, color, weight, line height, and description. Copy

Please wait

Setting up your portal

[](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#configuring-multiple-languages) Configuring multiple languages ------------------------------------------------------------------------------------------------------------------------------------------- Canvas is designed to support multiple languages and integrates the language selection directly with Bubble. In addition, we provide an easy integration with LocalizeJS for full language support throughout your app. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#enabling-multiple-languages) Enabling multiple languages By default your Canvas template will have multi-language functionality turned off. If you would like to use additional languages, in the admin portal navigate to Settings > Multiple Languages and toggle the 'Enable multi-language support' option. With multi-language support enabled you will see additional functionality available to you. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#supported-languages) Supported Languages This is a list of languages that you can allow your app to support will contain English (US) as the default for your platform. You can add additional supported languages by selecting from the dropdown and clicking the add button. When you have more than one supported language, from the action menu you can choose to set a new language as the default.Add a captionThe default language cannot not be removed from the system and is used throughout Canvas as the fallback language if the user has not set a default language for themselves. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#localizejs-integration) LocalizeJS Integration ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#enable-localize) Enable Localize In the admin portal, navigate to Settings > Multiple Languages. Multi-language support should already be enabled from the previous step. 1. Find the 'Enable LocalizeJS integration' option and toggle it to on. 2. Once you have enabled your integration, copy the Project Key from your LocalizeJS dashboard. Paste this into the project key input and click the save button. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#customize-your-localize-integration) Customize your Localize integration The default integration in Canvas handles generating the code including your dynamic project key and the default language set for the app. Below is the code that we use to initialize this integration. Copy If you would like more granular control over your integration we recommend you simply toggle off the built in Canvas functionality and add your own custom localizeJS script directly to the Script/meta tags in header field found in the Bubble editor under Settings > SEO/metatags. One option that is available through Canvas is a that contains the necessary UI and workflows to save or delete users' credit card info via Stripe. The visual part of this popup can be used for other payment providers, but the workflows are specific to Stripe. **Updating the animation** You can change the loader animation by pasting in a new animation json URL from (requires signup). Adjust the width and height in the code below to modify the size of the animation. User-uploaded Image If you haven't already, create an account and a new project on . Setting up the details of your project within Localize is outside the scope of this tutorial but LocalizeJS has created detailed walkthrough documentation . [Purchase Popup](https://docs.airdev.co/canvas-pages-and-modules/v/2.0.0/popups/stripe-credit-card-purchase-popup) [lottiefiles.com](https://lottiefiles.com/search?q=loader&category=animations) [https://localizejs.com](https://localizejs.com/) [here](https://help.localizejs.com/docs/what-is-localize) [Learn more](https://manual.bubble.io/core-resources/application-settings/seo-metatags#script-meta-tags-in-header) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fstatic.slab.com%2Fprod%2Fuploads%2Fcozgjvpz%2Fposts%2Fimages%2Fx98c60mUyQvuqt91o1mdSs8F.gif&width=768&dpr=4&quality=100&sign=8931768f&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fstatic.slab.com%2Fprod%2Fuploads%2Fcozgjvpz%2Fposts%2Fimages%2FQMcqoT9R9kFnxqZClL8rSdfS.png&width=768&dpr=4&quality=100&sign=6486ffdd&sv=2) Check 'Do not set cookies on new visitors by default' Canvas cookie consent banner Credit card view in Editor ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-MbcyfBE_tMg-loVKtNW%252Fimage.png%3Falt%3Dmedia%26token%3D30ba7bee-d065-477e-b8c8-14af8eb6da2b&width=768&dpr=4&quality=100&sign=62edbe47&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MJraj0Y9Xa5GJldBVvQ%252F-MJrowzc7jZsWmEI77om%252Fimage.png%3Falt%3Dmedia%26token%3De96f8efe-c24d-4408-9570-cfaf3c7e93fb&width=768&dpr=4&quality=100&sign=df2b35a4&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MJs4EHgBPa7d88WV7Eh%252F-MJs9Q4Ev8pJBhnRJlBT%252Fimage.png%3Falt%3Dmedia%26token%3D4d424bd0-3d26-4b85-8e89-55b795d89467&width=768&dpr=4&quality=100&sign=38fe9caf&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MJraj0Y9Xa5GJldBVvQ%252F-MJs2l6HJccQFNcItyDK%252Fimage.png%3Falt%3Dmedia%26token%3D4a10f9b7-6384-4d2a-82c8-4315db634bbd&width=768&dpr=4&quality=100&sign=26b1842a&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-Mbd-opjRdAbCi8Ssb_0%252Fimage.png%3Falt%3Dmedia%26token%3D5049a672-6ea4-485a-820c-1fa09ae8b7ef&width=768&dpr=4&quality=100&sign=cb4a1b2f&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mf-wYswxRdg2IeHaIhc%252F-Mf3PKjUCJVe5QbspVbV%252FCleanShot%25202021-07-20%2520at%252010.52.18.png%3Falt%3Dmedia%26token%3Dd83a2298-f5c9-4e63-848e-3505c48f2c57&width=768&dpr=4&quality=100&sign=74ce2652&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-Mbd0ebBbn4Jb_eyiiHW%252Fimage.png%3Falt%3Dmedia%26token%3D6b9d44a6-db44-4a66-a5b7-cffbefaf3e63&width=768&dpr=4&quality=100&sign=4470732a&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-Mbd1-6vboKrdOuyJWvX%252Fimage.png%3Falt%3Dmedia%26token%3Db1629c6b-8e20-4d30-92ac-fd92bbd59211&width=768&dpr=4&quality=100&sign=e2d7ee30&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-Mbd2Akr0co9cYSrH1U6%252Fimage.png%3Falt%3Dmedia%26token%3Dfc62c502-0125-491d-9f4d-07b8594b7e53&width=768&dpr=4&quality=100&sign=829288ee&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MbrDEb6nJVXar4dP-0s%252F-MbrTN_Ntjadlm_4a21D%252FScreen%2520Shot%25202021-06-10%2520at%252012.49.54%2520PM.png%3Falt%3Dmedia%26token%3Da5c52d57-08ac-4a43-b1f9-37b89b8a0703&width=768&dpr=4&quality=100&sign=bbaf151&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MbrDEb6nJVXar4dP-0s%252F-MbrHlv7uUc5ZNw9k7Ii%252FScreen%2520Shot%25202021-06-10%2520at%252011.58.34%2520AM.png%3Falt%3Dmedia%26token%3D453d2461-264f-4d70-8500-62311116f99c&width=768&dpr=4&quality=100&sign=7ea7a107&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-Mbd5mnqbKNQR9L8vTHb%252Fupdating%2520screen%2520loader%2520animation.gif%3Falt%3Dmedia%26token%3D37706431-6db9-4bb6-bd45-754f4a4e7984&width=768&dpr=4&quality=100&sign=7f34483a&sv=2) --- # What's New | Canvas Documentation [PreviousKey Features](https://docs.airdev.co/canvas/3.6/features) [NextFor Designers](https://docs.airdev.co/canvas/3.6/for-designers) Last updated 3 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.6/whats-new#july-22-2021-patch-3.6.2) July 22, 2021 (patch 3.6.2) --------------------------------------------------------------------------------------------------------- Resolved an issue with the new header and footer elements where they would not be shown if the user was running an ad blocker in their browser. If your version of Canvas is 3.6.0 or 3.6.1, please see our forum post for how to resolve this issue . [](https://docs.airdev.co/canvas/3.6/whats-new#july-21-2021-patch-3.6.1) July 21, 2021 (patch 3.6.1) --------------------------------------------------------------------------------------------------------- Resolved an issue with the adding new pages from the extension where the header was not properly linking to the reusable element resulting in a 'deleted reusable element' error. Resolved an issue with the with the LocalizeJS integration where it was not properly setting the selected language. Update the language selection popup for logged out users so that the language they select persists through the sign up process. [](https://docs.airdev.co/canvas/3.6/whats-new#july-19-2021-release-3.6.0) July 19, 2021 (release 3.6.0) ------------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.6/whats-new#create-custom-headers-for-multiple-user-types) Create custom headers for multiple user types The header has been rebuilt from the ground up and comes with a bunch of shiny new features. * Built entirely with html to speed up the loading time * Create or clone many different headers and show them only to specific user roles * Trigger Javascript function from any of the links or icons * Visually managed entirely from the Canvas admin portal ### [](https://docs.airdev.co/canvas/3.6/whats-new#reveal-password-functionality) Reveal password functionality Users can now choose to show or hide their passwords when entering their passwords in a password input field on the login, account, and reset\_pw pages. This functionality helps users verify if they've entered their passwords correctly. ### [](https://docs.airdev.co/canvas/3.6/whats-new#developer-mode) Developer mode We've added a new `Is developer?` field to the User data type. Any user with an Admin role can enable developer mode in the admin portal under the Settings tab. Enabling developer mode will reveal advanced template settings that would require Bubble knowledge. ### [](https://docs.airdev.co/canvas/3.6/whats-new#changes-to-website-data-type) Changes to Website data type The Website data type has been renamed to `⚙️ App settings` as that seems to more accurately reflect the function it serves throughout the app. As a result, variables referring to this data type have also been renamed to `var - ⚙️ App settings`. ### [](https://docs.airdev.co/canvas/3.6/whats-new#new-data-type-to-contain-app-wide-variables) New data type to contain app wide variables There has been some confusion with our users around what they are able to edit/update on the ⚙️ App settings object. To help remedy this we have created a new data type called `App variables` for you to use for anything that you need to reference throughout your application. Simply add the fields you need and reference `var - App variables` on your pages to access data from this data type. ### [](https://docs.airdev.co/canvas/3.6/whats-new#core-canvas-element-indicators) Core Canvas element indicators We have added a gear icon (⚙️) before all reusable elements, data types, and field names that are core to the Canvas template. In general, these elements should not be edited unless you understand the impact changes will have on the template. ### [](https://docs.airdev.co/canvas/3.6/whats-new#email-templates) Email templates #### [](https://docs.airdev.co/canvas/3.6/whats-new#dynamic-button-text) Dynamic button text You can now manage the button text for an email directly in the template! Simply check 'Include a button in this email' and you can define the button text directly from the admin portal. #### [](https://docs.airdev.co/canvas/3.6/whats-new#multi-language-support) Multi-language support If you are setting up support for multiple languages in your app, you can now create email variants directly in the admin portal to support those languages. #### [](https://docs.airdev.co/canvas/3.6/whats-new#template-folders) Template folders It's now much easier to keep your email templates organized! Use our new folder system to organize your templates into labeled folders to keep similar templates grouped together and easy to find. ### [](https://docs.airdev.co/canvas/3.6/whats-new#localizejs-integration) LocalizeJS integration Support for LocalizeJS is now a core function of the Canvas template! [](https://docs.airdev.co/canvas/3.6/whats-new#june-7-2021-release-3.5.1) June 7, 2021 (release 3.5.1) ----------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.6/whats-new#new-loading-screen-element) **New loading screen element** To use the loading screen element, you would need to first upgrade the Canvas UI Elements plugin version in your app to at least v1.4.0. The element allows you to display a loading animation while your page's elements and data are being loaded beneath. You will want to include this on every page where you want this behavior and have it be visible by default. The loading element is active on the Admin portal by default. ### [](https://docs.airdev.co/canvas/3.6/whats-new#deprecated-the-popup_reusable-element) **Deprecated the popup\_reusable element** The popup\_reusable element has been deprecated. The elements it housed were either not being used often, or are now available elsewhere: * popup\_signup/login - available as a standalone reusable * messagePopup - not being used often and removed from the template [](https://docs.airdev.co/canvas/3.6/whats-new#may-24-2021-release-3.5.0) May 24, 2021 (release 3.5.0) ----------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.6/whats-new#added-postmark-as-an-email-provider) **Added Postmark as an email provider** We’ve just released an update which allows seamless integration of Postmark into Canvas apps. Postmark is known for prioritizing deliverability and cutting down on spam sent from their service so that your emails are more likely to get into your users’ inboxes instead of landing in their spam boxes. To enable this on older versions of canvas, please go to your Bubble editor and upgrade the plugin version for ‘Email for Canvas’ (the plugin used to be called SendGrid for Canvas, but we changed the name with this release). There is backward compatibility with old Canvas apps which allows your existing SendGrid flow to keep working the same way it was working on the previous plugin version when you upgrade the SendGrid plugin. In older Canvas apps, setting up Postmark takes some extra effort, but is much easier than adding a new plugin to your app. Note that Postmark is primarily used as a transactional email service, and that our Postmark integration requires some modifications to support marketing emails. Postmark also has more stringent requirements for email quality than SendGrid, primarily measured by the portion of spam reports received relative to the total number of messages sent. ### [](https://docs.airdev.co/canvas/3.6/whats-new#converted-various-things-to-reusable-elements) **Converted various things to reusable elements** In the admin page, we’ve converted some (more) things to reusable elements to make it easier to edit the functionality in just one place and to follow the build pattern we’ve used in the rest of the admin page. The data type 1 tab content is now a reusable element called **admin\_datatype1**, and it currently contains Dummy data. To use this with a new data object, you would clone this reusable and **Group Nav 8 - Data type 1 content** in the admin portal. You would replace **admin\_datatype1** in the new group with the new reusable User filters in the admin portal is also now a reusable element called **filters\_users.** ### [](https://docs.airdev.co/canvas/3.6/whats-new#added-new-ui-to-settings-tab-in-the-admin-portal-e.g.-sample-single-field-and-sample-picklist) **Added new UI to settings tab in the admin portal (e.g. sample single field and sample picklist)** For this, we’ve created a new reusable element called **admin\_options\_settings** . ### [](https://docs.airdev.co/canvas/3.6/whats-new#page-builder) Page Builder **New marketing page backgrounds** We've added 6 new marketing page backgrounds to the page builder **New hero blocks** We've added 10 new hero blocks to the page builder. You can mix and match these new hero blocks with other page builder blocks and create beautiful marketing pages [](https://docs.airdev.co/canvas/3.6/whats-new#march-30-2021-release-3.4.0) March 30, 2021 (release 3.4.0) --------------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.6/whats-new#base-template) Base Template #### [](https://docs.airdev.co/canvas/3.6/whats-new#all-new-styles-version-003) All new styles (version 003) We've revamped our entire library of styles and this Canvas update comes with more than 300 new Bubble styles! Most page elements now have access to at least three different styles with support for different font weights (regular, semibold, and bold). #### [](https://docs.airdev.co/canvas/3.6/whats-new#consolidated-legal-page) Consolidated legal page #### [](https://docs.airdev.co/canvas/3.6/whats-new#log-in-page-redesigned) Log in page redesigned #### [](https://docs.airdev.co/canvas/3.6/whats-new#new-customizable-blocks) New Customizable Blocks ### [](https://docs.airdev.co/canvas/3.6/whats-new#chrome-extension) Chrome Extension Along with the new styles, we have added a brand new design library of all the Canvas pages and blocks. These elements will be used for all new Canvas templates. If your app is on a version previous to v3.4.0 you can continue to add new pages & blocks from the extension and the elements added will be add with the style version your app is based on. However, if you would like to take advantage of the new styles and elements, you will see a banner prompting you to import the new styles (003). Once you've imported the new styles you are able to toggle between the new design library and and the old design library to add new elements. [](https://docs.airdev.co/canvas/3.6/whats-new#december-29-2020-release-3.0.0) December 29, 2020 (release 3.0.0) --------------------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.6/whats-new#admin-portal-redesigned) Admin Portal Redesigned ### [](https://docs.airdev.co/canvas/3.6/whats-new#page-builder-1) Page Builder ### [](https://docs.airdev.co/canvas/3.6/whats-new#chrome-extension-1) Chrome Extension ### [](https://docs.airdev.co/canvas/3.6/whats-new#pages-option-set-updated) Pages option set updated We have made a couple key changes to the Pages option set. 1. The Pages option set has been renamed to Bubble Pages to differentiate it from the new Marketing pages feature 2. Previously we stored a list of Bubble Pages on the Role option set to define the pages a user was allowed to view. To simplify this, the Bubble Pages option now stores the list of Roles that can view that page enabling you to set a page's privacy status and define the roles that are allowed to view that page from the same place. ### [](https://docs.airdev.co/canvas/3.6/whats-new#fewer-nested-groups) Fewer nested groups We realize in the past that Canvas blocks contained a lot of extra groups nested within other groups. As of this release, we have rebuilt all the Canvas blocks to minimize the number of groups that are used while still maintaining a fully responsive template! ### [](https://docs.airdev.co/canvas/3.6/whats-new#send-custom-sendgrid-emails-on-a-hobby-plan) Send custom Sendgrid emails on a hobby plan With a brand new Sendgrid plugin we have moved the default email functionality to the front end instead of the using backend workflows. This means you can now send emails through Sendgrid with our beautiful HTML template without being on a paid Bubble plan. The backend email functionality is still available for more robust email setups and scheduling. The element can be found under **Visual elements**. You can find details on how to set it up . HTML loader - replaced by the element Enable Postmark on new Canvas apps via the flow seen under . You can now include app-wide settings here that can be easily managed from the front-end (e.g. single field or a picklist). For more information on how to use these, please read our documentation . The previous Terms & Conditions and Privacy Policy pages have been deprecated. The content from both of these pages has been consolidated into a single We've made some minor design updates to the to better align with the design of the marketing and index pages. **Page Flair Group** This includes a collapsible image banner, title, description, and toggle tabs. This group should be used when you want to further customize a page. **Block Title Group** Most blocks will now come with a that includes a title, dropdown, toggle tabs, description text, sort dropdown, filters, and a new button. This group should be used when you need to add a title group above a section of content. This Canvas update comes with host of new features as well as a full redesign of the admin portal. Be sure to check out the admin portal overview in the . You can now create beautiful HTML marketing pages directly within the admin portal using the new ! We have changed the way you add new Bubble pages to your application. You can now use the new to add new Bubble pages & blocks directly within your editor. [here](https://docs.airdev.co/canvas/canvas-functionality/reference/default-pages/admin-portal#settings) [legal page.](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/legal) [log in page](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/default-pages/login) [page-level group](https://docs.airdev.co/canvas/canvas-functionality/pages-and-modules#customizing-your-page) [title group](https://docs.airdev.co/canvas/canvas-functionality/pages-and-modules#customizing-block-title-group) [Canvas Page Builder](https://docs.airdev.co/canvas/canvas-functionality/marketing-pages) [here](https://forum.airdev.co/t/bug-fix-canvas-base-template-v3-6-0-and-v3-6-1-header-and-footer-not-visible-in-some-browsers/430) [Getting Started section](https://docs.airdev.co/canvas/3.6/canvas-functionality/getting-started#explore-the-admin-portal) [Canvas Extension](https://docs.airdev.co/canvas/3.6/canvas-functionality/getting-started#get-the-chrome-extension) [Learn more](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#header-navigation) [Emails & Alerts](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#postmark) [here](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#loading-screen) [Loading screen](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#loading-screen) Easily manage app-wide configurations Example of updating a single field Example of managing a simple picklist that is used throughout the app ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MezOBR0U-FVkmFrU2GA%252F-MezPaj1Z-hZ-eDi2ny_%252FCleanShot%25202021-07-19%2520at%252011.37.10.png%3Falt%3Dmedia%26token%3D4c3a536e-efbd-41fc-9977-b83e9dee5206&width=768&dpr=4&quality=100&sign=2d60784e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbd6WbR3HAhWH9sol_Z%252F-MbdRd75wgk58Lw3gMGk%252Fimage.png%3Falt%3Dmedia%26token%3Dd0d5c9cf-df6d-42ed-bc69-cd09e7a28ae6&width=768&dpr=4&quality=100&sign=1592eab2&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbd6WbR3HAhWH9sol_Z%252F-MbdRb8oUl6pv5bxHrP0%252Fimage.png%3Falt%3Dmedia%26token%3Dc37a6b13-0cc7-43e4-ad42-bd85efcf63bf&width=768&dpr=4&quality=100&sign=b45c4e91&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbd6WbR3HAhWH9sol_Z%252F-MbdRgZWvIbSKAXx7ty1%252Fimage.png%3Falt%3Dmedia%26token%3De4272bd3-fc25-4f21-b02b-86719c719f7b&width=768&dpr=4&quality=100&sign=a4efe8bf&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-MbcyfBE_tMg-loVKtNW%252Fimage.png%3Falt%3Dmedia%26token%3D30ba7bee-d065-477e-b8c8-14af8eb6da2b&width=768&dpr=4&quality=100&sign=62edbe47&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbd6WbR3HAhWH9sol_Z%252F-MbdRlEhhTZJ374g6bf5%252Fimage.png%3Falt%3Dmedia%26token%3Da7e42e09-3f0a-4a2d-80c3-e798f0287533&width=768&dpr=4&quality=100&sign=d0d32c0&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbd6WbR3HAhWH9sol_Z%252F-MbdRynIznvvNDE06sni%252Fimage.png%3Falt%3Dmedia%26token%3D0792da24-d8ab-48fe-bd80-2b642795b663&width=768&dpr=4&quality=100&sign=3ecf2778&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbd6WbR3HAhWH9sol_Z%252F-MbdS-1dJIu3SZFKm_oo%252Fimage.png%3Falt%3Dmedia%26token%3D7d0d70c9-6840-4e7b-af03-9a9ff889c8c4&width=768&dpr=4&quality=100&sign=a1ec72ec&sv=2) --- # Modularity | Canvas Documentation ### [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity#what-is-modularity) What is modularity? When building functionality that is used in multiple places throughout the application, you should build in small chunks (modules) that can be replicated or used in other parts of the app. AirDev recommends splitting app logic and UI into modular pieces when Bubble complexity reaches a point where it causes confusion. **An example:** You have a complex sign-up flow where users' personal information has to pass through multiple steps of verification. Users must be able to access this sign-up flow from multiple pages of the app, and from different types of buttons for desktop and mobile users. In order to set up this example, we can build this functionality in a Reusable Element (like Bubble's signup/login reusable) with a Custom Workflow for signing up users. Before reading through this information, make sure you're familiar with _how_ to use Reusable Elements, API Workflows, Custom Workflows and Plugins. This page covers _when/why_ to use them. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity#when-to-convert-a-workflow-to-an-api-workflow-or-custom-workflow) When to convert a workflow to an API workflow or custom workflow The easiest ways to introduce modularity to your workflows (WFs)are through custom workflows and API workflows. Situations in which you might want to use one of these include: * There are >10 steps in a WF (too long for readability/ease of development) * Parts of a WF are reused in different places throughout a page * A WF in a reusable element needs to be triggered from outside the reusable element * An entire WF is copied and reused elsewhere (sometimes with minor changes to conditions) * A workflow is slow and sometimes times out (takes >30 seconds and throws an error), causing poor UX ### [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity#when-to-use-an-api-workflow-instead-of-a-custom-workflow) When to use an API workflow instead of a custom workflow API workflows offer the benefit of being accessible from anywhere in the application, or even from outside of the application via API, and they don't have the same timeout limits as normal workflows. Note, however, that if your application hits capacity, API workflows will be slowed down. Some times to use API workflows: * Action doesn’t need to be completed immediately (e.g. exporting data where the export file is uploaded to the Bubble DB or sent to a user’s email) * User WFs keep timing out on the page (take >30 seconds) or users have very poor internet * WF is used in multiple pages, and the custom workflow isn’t in a reusable element that is present on each of those pages * WFs are triggered from outside the application If a workflow is timing out, try to speed it up before creating an API workflow. Only move it if you are unable to prevent timeouts from happening. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity#when-to-use-a-custom-workflow-instead-of-an-api-workflow) When to use a custom workflow instead of an API workflow Custom workflows can be faster than API workflows for the types of actions that a user would expect a near-immediate response from, or actions that a user must wait for before continuing (e.g. signing up for an app). Here are some situations where it is better to use a custom WF: * Actions make changes to elements on the page (showing/hiding elements, displaying data in groups, element-type plugins) * Alternative strategy: Use an API WF and set a listener to detect when the API WF is done (usually through checking for when changes are made to some object in the DB) * This is not ideal, but it is an ok way to get around the 30 second WF timeout * The WF is only used on one page, and none of the above API WF reasons are true * If the WF is in a reusable element and needs to be triggered from outside the reusable element Sometimes, the trade-offs between a custom WF and API WF aren't clear until you actually attempt the implementation. In that case, you can try one of the two and see if it performs well enough in terms of execution speed and reliability. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity#when-to-use-a-reusable-element) When to use a reusable element Departing from workflows, reusable elements are useful when you want to make your app's visual design more modular. Here are some situations to use them in: * Your app needs to do the same thing (or nearly the same thing) on more than one page * Your page is a Single Page Application and a group has complex, but isolated functionality * Faster editor loading b.c. of less elements * Cleaner WF view * The group will likely be reused in other applications or on other pages, and it has some complex functionality * E.g. chat, comments, to-do list, menu, instagram-style display, or search filters ### [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity#when-to-create-a-plugin) When to create a plugin Users who know how to use the API Connector or who have some Javascript experience should consider creating plugins. This is more useful for creating modularity across applications rather than within the same application - you (or other users) can reuse the same functionality in multiple apps, and update it once in order to update it for everyone. Situations where it is a good idea to build a plugin include: * You create an API through the API Connector and you think other people would find it useful, or you want to use the same API in another Bubble app ### [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity#app-templates) App Templates **App Templates** are a more unique and labor-intensive way of working modularly, and are more relevant to Bubble developers who will build many apps. This is what our AirDev Canvas template is meant to do - it makes it so that builders can more quickly make fully-featured applications, without having to waste time on setup that you will do with every app you create. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/modularity#airdev-canvas) AirDev Canvas **AirDev Canvas** allows you to build apps more quickly in a way that creates a visually consistent user experience across mobile and desktop. You can add modules that we have designed and build functionality on top of them, making it a breeze to create pages that look and work great. [PreviousSpeed](https://docs.airdev.co/canvas/3.6/using-bubble/speed) [NextData triggers](https://docs.airdev.co/canvas/3.6/using-bubble/modularity/data-triggers) Last updated 5 years ago Was this helpful? A page uses a lot of custom code through the or you need to create an element with code [Run javascript action](https://bubble.io/plugin/toolbox-1488796042609x768734193128308700) --- # Option Sets | Canvas Documentation A few option sets come included with the Canvas template: [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets#bubble-pages) Bubble Pages --------------------------------------------------------------------------------------------------------------- * Display (text) - this is the page name * Roles (List of Roles) - the user roles that are allowed to access this page * Private? (yes/no) - "yes" means the page is private * If a user accesses a Page that is marked as Private, they will be redirected to the index page unless they are logged in to a User whose Role has been added to the Roles for this page The Canvas Base Template comes with a number of pages. The two private pages are the `account` page, which can be accessed by Standard and App Admin users (but not logged out users), and the `admin` portal page, which can be accessed by by App Admin users. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets#role) Role ----------------------------------------------------------------------------------------------- * Display (text) - this is the role name By default, your app comes with two roles: `App Admin` and `Standard`. To add a new role, create a new option in the option set for that role * New option in Role option set (e.g. Account Admin or Sales) * Add the new role to the Bubble Pages attribute Roles if they should have permission to access that page. * Assign the Roles to Users, usually through one of these methods: * Assign the new Role to users manually in the Bubble Editor's Data tab * Build the logic to let App Admins sign those Users up from the admin page * Build the logic to assign the new Role to the Users when they're signed up [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets#admin-options-categories) ⚙️ Admin Options Categories ------------------------------------------------------------------------------------------------------------------------------------------ Manages tabs to display different options in the admin portal [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets#admin-options) ⚙️ Admin Options -------------------------------------------------------------------------------------------------------------------- List of all the different options we display in the admin portal [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets#navigation-action-type) ⚙️ Navigation Action Type -------------------------------------------------------------------------------------------------------------------------------------- Contains the different types of actions that can be used for a navigation element in the header or footer [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets#navigation-button-style) ⚙️ Navigation Button Style ---------------------------------------------------------------------------------------------------------------------------------------- Contains the CSS class for different button styles in the header [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets#navigation-element-type) ⚙️ Navigation Element Type ---------------------------------------------------------------------------------------------------------------------------------------- Canvas uses this option set to maintain the default settings for different types of navigation elements in the header and footer [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets#navigation-feather-icon) ⚙️ Navigation Feather Icon ---------------------------------------------------------------------------------------------------------------------------------------- List of all Feather icons code text. Canvas uses this throughout the template to manage the correct icon to display for links, headers, etc. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets#navigation-type-deprecated) ⚙️ Navigation Type (deprecated) ------------------------------------------------------------------------------------------------------------------------------------------------ [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets#password-policy-requirement) ⚙️ Password Policy Requirement ------------------------------------------------------------------------------------------------------------------------------------------------ This is used to manage the different settings possible for the app's password policy. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets#yesno-inclusive-yes-no) ⚙️ Yesno (Inclusive "Yes/No") ------------------------------------------------------------------------------------------------------------------------------------------ This is an option set that works similar to the Bubble "yes/no" data type, but adds a 3rd option that returns true for both yes and no. In short, it works as follows: * _no_ will return results where the field is "no" * _yes_ will return results where the field is "yes" * _yes OR no_ will return all results For a more detailed explanation, read on. When creating searches in Bubble, if you have a constraint on a yes/no field, it will always return either the "yes" options or the "no" options. The above image shows how a search either includes Inactive users or Active users, but not both. Here's the search logic used to produce this result: Here's how this will look when set up with the Inclusive / Exclusive option set. For a demonstration of how to use this in a real app, check out the Dropdown Users on the admin page of the Canvas Base Template. The performance of these searches seemed to be about the same in our tests. Please let us know if you notice anything different. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets#language) ⚙️ Language ---------------------------------------------------------------------------------------------------------- A full list of languages and to manage all localization settings in Canvas and Bubble. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets#verify-type) ⚙️ Verify type ---------------------------------------------------------------------------------------------------------------- Manages the type of verification being done when using the **widget\_verify\_phone/email** or **widget\_2fa.** Also used with the **Verify** backend calls to indicate whether a user should receive an sms or email. [PreviousData types](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/data-structure) [NextBackend Workflows](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/api-workflows) Last updated 3 years ago Was this helpful? Normal Bubble yes/no Logic with normal Bubble yes/no (no inclusive yesno option) Option set yes/no/yesno Logic with normal Bubble yes/no (no inclusive yesno option) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M3xJujtten6m95J5MIR%252F-M3xRbYwRTvefSoUqUA4%252Fyes-no-inclusive.gif%3Falt%3Dmedia%26token%3D153040e6-c1b9-432b-82ea-f96632cae8df&width=768&dpr=4&quality=100&sign=5e8d65e8&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M3xJujtten6m95J5MIR%252F-M3xM3iYgQv8DaDZxeCl%252Fyes-no-exclusive.gif%3Falt%3Dmedia%26token%3D9ae279d6-f808-403c-bb33-afb3579ede0f&width=768&dpr=4&quality=100&sign=e094c3ed&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M3xJujtten6m95J5MIR%252F-M3xMXuY7doaq97d3_yZ%252Fsearch-for-users.PNG%3Falt%3Dmedia%26token%3D6c25a975-6e54-4b4f-b0ed-7567e1ecabe7&width=768&dpr=4&quality=100&sign=92038acf&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M3xJujtten6m95J5MIR%252F-M3xQWpvt5ahCo6GprqS%252Fsearch-for-users-yesno.PNG%3Falt%3Dmedia%26token%3Db9715744-cadb-44d6-987f-aab9b6916b5f&width=768&dpr=4&quality=100&sign=9c0f951f&sv=2) --- # Reference | Canvas Documentation [PreviousCustomizing your app's portal page colors](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/customizing-your-apps-portal-page-colors) [NextPages](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages) Last updated 11 months ago [Pages](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages) [Reusable elements](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements) [Data types](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/data-structure) [Option Sets](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets) [Backend Workflows](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/api-workflows) [Design standards](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/design-standards) --- # Index | Canvas Documentation [PreviousPages](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages) [NextProduct homepage](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-1) Last updated 11 months ago **Page name:** index **Purpose:** Acts as the homepage for your application and manages all user redirection for logged in users The index page is the landing page for all non logged in users. Canvas Building Framework landing page ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FahDZiXOAiF70pDhY8HLE%2Findex.png&width=768&dpr=4&quality=100&sign=72cb020&sv=2) --- # Key Features | Canvas Documentation [PreviousIntroduction](https://docs.airdev.co/canvas/5.3) [NextWhat's New](https://docs.airdev.co/canvas/5.3/whats-new) [](https://docs.airdev.co/canvas/5.3/features#admin-portal) Admin portal ----------------------------------------------------------------------------- Canvas has a fully designed and functional admin portal built in to the base template. Manage your app settings, view and add users, create headers based on user roles, and much more. [](https://docs.airdev.co/canvas/5.3/features#canvas-bubble-marketing-pages) Canvas Bubble marketing pages --------------------------------------------------------------------------------------------------------------- Need fully responsive, SEO friendly, and customizable marketing pages to show off your application to potential users? Our Base Template includes 5 pre-built Bubble marketing pages — a SaaS landing page, marketplace landing page, simple landing page, an about page, and a pricing page. Use the Canvas extension to add professionally designed marketing blocks built with Bubble elements to your application. Use them right out of the box or further customize the blocks within the Bubble editor. [](https://docs.airdev.co/canvas/5.3/features#canvas-extension) Canvas extension ------------------------------------------------------------------------------------- Use the Canvas extension at any time during development to expand your application with professionally designed, fully responsive or update the colors throughout your application all directly from within the Bubble editor. [](https://docs.airdev.co/canvas/5.3/features#custom-email-templates) Custom email templates ------------------------------------------------------------------------------------------------- We've integrated Canvas with SendGrid and Postmark to send transactional emails using a beautiful HTML template. You can create unlimited with dynamically populated data directly from the admin portal. [](https://docs.airdev.co/canvas/5.3/features#built-in-user-management) Built-in user management ----------------------------------------------------------------------------------------------------- Almost every application will need to provide their users some basic functionality for signing up, logging in, and managing their account details. However, creating this functionality can add a lot of time to your build. As much of the functionality for user management is the same across applications, you can find yourself rebuilding the same elements and workflows many times. We have been able to streamline this process and from signup/login, password reset, email verification, profile management and much more, the Canvas Building Framework Template comes with a robust and fully functional user management system ready to go as soon as it is downloaded. [pages & blocks](https://docs.airdev.co/canvas/5.3/canvas-functionality/pages-and-modules) [email templates](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts#email-templates) --- # Cookie and consent banner | Canvas Documentation [PreviousSetting up two factor authentication](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/setting-up-two-factor-authentication) [NextSetting your password policy](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/setting-your-password-policy) Last updated 11 months ago We consider it a best practice to ask users for consent to save cookies before storing data on their device and have built this functionality directly into Canvas. To set this up properly, let's start in the Bubble editor. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/cookie-and-consent-banner#enabling-cookie-permissions) Enabling Cookie Permissions Once you have the editor open, from the left menu navigate to Settings > General > Privacy & Security. Here we need to check the box that says 'Do not set cookies on new visitors by default' Next log in to the admin portal, click on Settings > Cookies and toggle the 'Require users to agree to the storing of cookies in their browsers when they visit your website' to ON. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/cookie-and-consent-banner#cookie-consent-banner) Cookie Consent Banner **Element name:** cookies\_permission **Purpose:** Get the user's consent to store cookies on their device The Cookie Consent Banner is built as a reusable floating group and by default is placed on the index page of your Canvas template and anchored to the bottom. To add the consent banner to another page, drag it from the list of Reusable elements onto the design canvas of the page you would like to place it and make sure it is positioned at the bottom edge of the page. Check 'Do not set cookies on new visitors by default' Canvas cookie consent banner ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2Fg9CnE5YhqAQbchL76JpH%2Fcookie.png&width=768&dpr=4&quality=100&sign=3cd3f67d&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FK3fCnGlpGRL4p7qlkcd7%2FCleanShot%25202021-07-20%2520at%252010.52.18.png&width=768&dpr=4&quality=100&sign=48d9f1ee&sv=2) --- # Introduction | Canvas Documentation [NextKey Features](https://docs.airdev.co/canvas/5.3/features) Last updated 11 months ago [](https://docs.airdev.co/canvas/5.3#welcome-to-canvas) Welcome to Canvas! ------------------------------------------------------------------------------- Canvas is a framework based on that non-coders can use to very rapidly build powerful and beautiful web applications. The framework is built and maintained by , an ultra-rapid software development firm based in San Francisco. Canvas doesn't require any previous software knowledge or experience. But learning how Bubble and Canvas work does require significant time investment to get to the point when you can build something great. If you are starting from scratch, you should plan on spending at least a few weeks learning both of the tools. [](https://docs.airdev.co/canvas/5.3#what-is-canvas) What is Canvas? ------------------------------------------------------------------------- Canvas is a development framework based on that combines 3 things: 1. **Building Framework Template**: This app template contains features that almost every application needs - things like marketing pages, user management, admin portal, and so much more. 2. **Pages, blocks & elements:** These are smaller UI & UX components that can be added to the template in order to build almost anything that you might imagine. They also provide consistency to your app's design, so pages you add to the app don't look out of place. 3. **UI patterns:** These are full page UI patterns with built-in UI & UX components and blocks that you can easily customize right out of the box. 4. **Standards & best practices:** These will help you make sure your application's functionality, design, and integrations are properly built and result in the best product possible. [](https://docs.airdev.co/canvas/5.3#why-canvas) Why Canvas? ----------------------------------------------------------------- There is a major shift happening that's changing not only how software is built, but who builds it. Specifically, no-code tools like Bubble now allow non-coders to build complex software applications without writing a single line of code. At Airdev, we've spent years building software without code for companies ranging from one-person startups to Fortune 50 enterprises. Through our work we've identified common patterns that exist in applications and turned those into this framework. Here's what the framework helps us do: 1. **Build and launch faster:** Because large parts of both functionality and design are templatized, we don't have to spend time reinventing the wheel and instead focus only on the parts that are different about a particular application. 2. **Build better products:** We've spent a lot of time thinking through and iterating on our templates and standards. When we use them we can be sure that the application will look good and work well. 3. **Build in a transferrable way:** Because our products follow the same framework, they're much easier to transfer between developers who know the framework. This is critical for long-term projects that require lots of people to be involved. We're excited to share the Canvas framework with people and teams outside of Airdev, we hope you find it useful! [Bubble](https://bubble.is/?ref=LBRPNATG) [Airdev](https://airdev.co/) [Bubble](https://bubble.is/?ref=LBRPNATG) --- # Pages | Canvas Documentation [PreviousReference](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference) [NextIndex](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index) Last updated 11 months ago [Index](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index) [Product homepage](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-1) [Marketplace homepage](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-2) [SaaS homepage](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-3) [About us](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-4) [Pricing](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-5) [Admin Portal](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal) [Account](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/account) [Login](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/login) [Legal](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/legal) [Reset Password](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/reset-password) [404](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/404) --- # Set up Payment info on Account page | Canvas Documentation [PreviousSetting your password policy](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/setting-your-password-policy) [NextLoading screen](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/loading-screen) Last updated 11 months ago Canvas comes with built in UI on the Account page for displaying the saved credit card details for your users as well as a history of transactions they have initiated. Before setting up payments, from your Bubble editor navigate to Plugins > Add Plugins and search for Stripe. Install the plugin that was made by Bubble. The Bubble stripe plugin adds additional fields to your user data type that can now be accessed. In the credit card display we use a group called 'Group credit card brand name' to manage many of the conditions for this view. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/set-up-payment-info-on-account-page#payment-workflows-logic) Payment Workflows/Logic After you have connected the existing UI, you will still need to set up the logic for the payment process. This includes: 1. Saving payment information (credit/debit cards) 2. Running the appropriate workflows from Stripe (or your payment provider) 3. Recording any other relevant information in your app 1. Responses from the workflows in step 2 2. Last 4 digits of card (for identification) You will need to set most of this up on your own. One option that is available through Canvas is a that contains the necessary UI and workflows to save or delete users' credit card info via Stripe. The visual part of this popup can be used for other payment providers, but the workflows are specific to Stripe. [Purchase Popup](https://docs.airdev.co/canvas-pages-and-modules/v/2.0.0/popups/stripe-credit-card-purchase-popup) Credit card view in Editor ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FsRViPrvzhIxSjGNlep2Y%2Fimage.png&width=768&dpr=4&quality=100&sign=39505652&sv=2) --- # Marketing Pages | Canvas Documentation [PreviousBranding & Design](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design) [NextBubble Pages & Blocks](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules) Last updated 4 years ago Was this helpful? To get started, login to your admin portal and navigate to Pages in the left menu. You will see a list of all the current marketing pages in your site. The first time you view this section you an index and an about page that come standard with your template. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/marketing-pages#creating-a-new-marketing-page) Creating a new marketing page Click the '+ Add marketing page' button. In the popup enter the unique path you would like this page to be located at on your url (e.g. domain.com/page/**uniquepath**) Both of these values can be updated later but keep in mind that updating the unique path for a page will break the connection of any links to this page that are using the original path name. Enter a description for your page and click the Create button. The description entered here is for your reference and does not appear to your users. Your new page will now appear in the list of marketing pages for your site. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/marketing-pages#building-your-marketing-page) Building your marketing page Now that your page is created, let's get started building it by clicking the pencil icon to open the Canvas Page Builder. There are several main options to familiarize yourself with when first getting started. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/marketing-pages#background) **Background** Clicking the Background tile will open a module allowing you to select from several different styles of backgrounds. These are SVG files that will automatically adjust to the color palette you choose and will span the entire background of your page #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/marketing-pages#colors) **Colors** Canvas offers a number of professionally curated color palettes that will help make your page beautiful. You can also create a custom color palette and save it to be used in other marketing pages as well! Simply select the custom option, choose your colors, and click 'Save custom palette'. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/marketing-pages#page-canvas) **Page canvas** The page canvas is where you will design the UI of your marketing page with our professionally designed and fully responsive page blocks. To add a new block, hover over the page canvas and click on the plus icon. When you find the block you need, click '+ Add block' to add it to your page. To edit a block, hover your mouse over the block you want to change until the options panel appears at the top right of the block. * Click the arrows to move the block's position up or down the page. * Click the pencil icon to edit the content and properties * Click the trash can to delete the block from your page entirely #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/marketing-pages#publish-your-page) Publish your page As you work in the page builder your page changes will be saved automatically so you can come back to continue building your page at any time. If you want to reset your changes, click the 'Discard draft' button to revert to the last published version of your page. Once your page is ready for primetime, click the 'Publish' button to push it live! #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/marketing-pages#get-help) Get Help If you ever get stuck or need help with anything, click the question mark icon in the top right of the screen. Here you can watch a video tutorial on using the editor or access the support portal to ask a question or report a bug. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/marketing-pages#managing-your-page) Managing your page You can manage the details of your page in the admin portal from the dropdown action menu on the page. **Edit page info** - This allows you to edit the unique path and the page description for your page. **Clone page** \- This will duplicate the page. The unique path of the new page will be the same as the page that was cloned with '-copy' appended. **Delete** - Permanently deletes the page. You will be shown a confirmation popup before the page is deleted. Changing the unique path for a page will break the connection of any links to this page. Publishing only publishes the page in the version you are working in. It's a good practice to create and edit Marketing pages in the development version and then copy the **Edit SEO tags** \- By default your page will use your . If you prefer you can customize the title, description, and preview image that is shown when a link to this page is shared on social media or seen through a Google search. Simply uncheck the 'Use the application's standard SEO/social tags' checkbox. [application's standard SEO settings](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#seo-and-social) [Marketing pages data to the live database.](https://docs.airdev.co/canvas/3.6/canvas-functionality/data-and-workflows#copying-specific-data-types) Enter your unique path and page description The Canvas page builder Click this icon to add a new block Options to edit or delete the page section ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNoeeH6LTOhAg5DjOkT%252F-MNol0J-_8FTx-4bZlAp%252Fimage.png%3Falt%3Dmedia%26token%3De71c799b-5838-4ef5-a211-c1c32588d302&width=768&dpr=4&quality=100&sign=ee4e2e44&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MO8ETt4b9y0GQv9aznE%252F-MO8FUN36UjIvEfH8RJK%252Fimage.png%3Falt%3Dmedia%26token%3D7dc31db5-ff40-4fe4-a431-d96b916adedb&width=768&dpr=4&quality=100&sign=f2a83aca&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNoaNtfu2iIGgLron9a%252F-MNoeWMSnGzw8OpeFXpK%252Fimage.png%3Falt%3Dmedia%26token%3D5b7d2ee9-b3a1-4b26-a2d0-0f8a94003245&width=768&dpr=4&quality=100&sign=7fd6cbd1&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNoeeH6LTOhAg5DjOkT%252F-MNojhUze_0ijbdJgGOd%252Fimage.png%3Falt%3Dmedia%26token%3D59fc2cb7-bf74-4d8c-a0c2-2da06c2edbec&width=768&dpr=4&quality=100&sign=bd2712e3&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MKRG5FoufYoHLX0Rl5j%252F-MKRM546S0FYfAzC7mX6%252Fimage.png%3Falt%3Dmedia%26token%3D329f9f26-4d7d-4e56-9e0f-6a76dd126aee&width=768&dpr=4&quality=100&sign=4a9fbd6b&sv=2) --- # Security | Canvas Documentation [](https://docs.airdev.co/canvas/3.6/using-bubble/security#enable-ssl) Enable SSL -------------------------------------------------------------------------------------- SSL ensures that the data transmitted between the server and the browser is encrypted - make sure to set it up by checking the box located in the `Settings > Domain/email` section of the Bubble Editor. [](https://docs.airdev.co/canvas/3.6/using-bubble/security#create-privacy-rules) Create privacy rules ---------------------------------------------------------------------------------------------------------- Having robust privacy rules is essential in making sure that your server doesn't set data to a browser that the user is not supposed to see. See [l](https://docs.airdev.co/bubble-standards/build/database-structure#privacy-rules) ink below for more information about setting those up. We also have a [video walkthrough for Bubble Privacy Rules](https://vimeo.com/427122970) . Database / privacy rules [https://docs.airdev.co/canvas/using-bubble/database#privacy-rules](https://docs.airdev.co/canvas/using-bubble/database#privacy-rules) [](https://docs.airdev.co/canvas/3.6/using-bubble/security#no-paywall-popups) No "paywall" popups ------------------------------------------------------------------------------------------------------ In Bubble, you can create a popup that blocks the user from visually seeing or interacting with the page. However, these popups can be closed relatively easily using Developer Tools in the browser. To put this in specific "Bubble-ese": you shouldn't rely on a popup with the setting `This popup can't be closed by pressing Esc` to lock users out of pages. [](https://docs.airdev.co/canvas/3.6/using-bubble/security#dont-store-sensitive-data-in-an-unencrypted-format) Don't store sensitive data in an unencrypted format ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- If your application needs to store very sensitive data, like Social Security numbers, credit card numbers, etc. in encrypted format. Better yet, find another company (like Stripe or Paypal) that can handle these very risky transactions, and integrate them into your app through Bubble plugins or using the API Connector. Bubble does encrypt all data at rest, which makes data storage and data usage more safe if you have authentication and privacy rules properly set up. But if you've accidentally made your privacy rules more loose than they should be, someone may get a hold of your data. We would recommend encrypting the values that go into those sensitive fields yourself and then decrypting them before they're used. [](https://docs.airdev.co/canvas/3.6/using-bubble/security#set-minimum-password-requirements) Set minimum password requirements ------------------------------------------------------------------------------------------------------------------------------------ Use the `Define a password policy` functionality found in `Settings > General` section of the Bubble editor to set the minimum length, capital letter requirements, etc. We recommend setting a minimum password length of 8 characters and requiring 1 capital letter and 1 number. [](https://docs.airdev.co/canvas/3.6/using-bubble/security#dont-use-private-api-keys-tokens-on-the-page) Don't use private API keys/tokens on the page ----------------------------------------------------------------------------------------------------------------------------------------------------------- If you need to make an API call that uses a secret key or a token, make sure that it's not populated on any page but is instead in one of these 2 places: 1. In the API connector, marked as "Private" 2. In a backend workflow This will ensure that the user's browser never sees the API key/token. [](https://docs.airdev.co/canvas/3.6/using-bubble/security#forum-resource) Forum resource ---------------------------------------------------------------------------------------------- If you're interested in learning more about how Bubble secures data in general, and some other security recommendations, you can read [these security guidelines from early 2019](https://forum.bubble.io/t/josh-request-for-a-security-q-a-guide/42942/18) posted in the Bubble Forum by Josh (Bubble CTO and co-founder). [](https://docs.airdev.co/canvas/3.6/using-bubble/security#testing-privacy-rules) Testing privacy rules ------------------------------------------------------------------------------------------------------------ To test whether privacy rules are set up correctly, it can be helpful to use a web browser's developer tools to examine what data is available to the user. [Here's a page that shows how to do that with Chrome.](https://docs.airdev.co/functionality-reference/resources/performance-and-privacy-rules-testing-with-chrome-devtools#privacy-rules) [](https://docs.airdev.co/canvas/3.6/using-bubble/security#scanning-files-for-malware) Scanning files for malware ---------------------------------------------------------------------------------------------------------------------- When users have the ability to upload files to your app that other users can download, ideally they should be scanned for malware. Some API based solutions for this include [Scanii](http://scanii.com/) and [Cloudmersive](https://cloudmersive.com/virus-api) . [Filestack](https://blog.filestack.com/api/avoid-app-downtime-with-filestack-virus-detection/#:~:text=The%20Filestack%20Virus%20Detection%20tool%20scans%20all%20types%20of%20files,upon%20upload%20into%20your%20application.) also offers this option along with their file storage service, but is quite pricey. This will help protect both admin users and standard users - if admins open these files somewhere in the admin portal or are sent these files via email, that would be an issue. Note that some browsers (e.g. Chrome in Windows) have some built-in file scanning ability as well to prevent downloading files tagged as malware, so there are some built-in protections here for many users. [](https://docs.airdev.co/canvas/3.6/using-bubble/security#risks-from-plugins-and-custom-code) Risks from plugins and custom code -------------------------------------------------------------------------------------------------------------------------------------- Using community plugins and custom HTML in your Bubble app carries some inherent security risks with it. One of those risks is that the plugin developer could be malicious and steal data from you, like by tracking all browsers which load the plugin on the front end. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/security#xss-cross-site-scripting) XSS (cross site scripting) Another risk is the possibility that plugins will allow raw user data to run javascript in other users' browsers. Bubble's native elements should all have protections built in to prevent users from executing javascript when users' data is shown to other users. Plugins, however, may not all have this set up. (The Bubble HTML element, of course, is an exception here, as it is intended to be able to include HTML and javascript.) This is a risk when showing data on the front-end to users - for example, if I have a calendar plugin and I use it to display data from many users to each other, it's possible that one user will enter some executable code in a text field and that the plugin will execute that code when trying to display it. There are many different ways to exploit XSS vulnerabilities, so the specific ways to test this will not be covered here. [](https://docs.airdev.co/canvas/3.6/using-bubble/security#csv-injection) CSV injection -------------------------------------------------------------------------------------------- When allowing for CSVs of user-entered data to be downloaded from an app, programs like Excel will read Formulas that are included in those CSVs. If a user's "About" field has a formula, they can use it to execute programs outside of Excel, or hit APIs and export the app data. More info about the vulnerability here: [https://owasp.org/www-community/attacks/CSV\_Injection](https://owasp.org/www-community/attacks/CSV_Injection) For a Bubble-specific guide on how to deal with this bug, see here: This is a known bug with Canvas' CSV export flow in the admin portal. We've decided to leave this vulnerability there for the moment, as it would add quite a bit of complexity to the app to remove it. All app admins should be made aware of this vulnerability. [](https://docs.airdev.co/canvas/3.6/using-bubble/security#unsafe-html-in-emails-phishing) Unsafe HTML in emails (phishing) -------------------------------------------------------------------------------------------------------------------------------- Emails can be used as a vector to steal user data, user credentials and other sensitive info. This relatively simple attack has been the cause of several high-profile cybersecurity breaches over the past few years. [](https://docs.airdev.co/canvas/3.6/using-bubble/security#block-all-iframes-of-app) Block all iFrames of app ------------------------------------------------------------------------------------------------------------------ If your app allows other websites to display it in an iFrame, then other developers can much more easily impersonate your website or use its content to show on their own websites. Impersonating your website is useful in the case of a phishing attack. It is okay to allow all iFrames or iFrames from the same origin if your app has a valid reason for doing so and you are aware of the minor risks involved. Otherwise, it's best to block all iFrames of your site. [PreviousDesign](https://docs.airdev.co/canvas/3.6/using-bubble/design) [NextSEO](https://docs.airdev.co/canvas/3.6/using-bubble/seo) Last updated 3 years ago Was this helpful? [CSV injection preventionFunctionality Reference](https://docs.airdev.co/functionality-reference/resources/security-tools/csv-injection-prevention) [XSS stopper + HTML whitelistFunctionality Reference](https://docs.airdev.co/functionality-reference/resources/security-tools/xss-stopper#html-whitelist-stop-email-phishing-attacks) This setting is carries some amount of risk with it ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-McuaCxCmerLi1u5DN1d%252F-McubI_Ub63ydts8mATu%252Fblock-all-iframes.png%3Falt%3Dmedia%26token%3Dea06a1d4-253b-427c-8571-ad899b0ff329&width=768&dpr=4&quality=100&sign=a065a55&sv=2) ![Logo](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fgitbook-28427.appspot.com%2Fo%2Fspaces%252F-LhCh4rbsm1X2FcstlIv%252Favatar.png%3Fgeneration%3D1560376837215206%26alt%3Dmedia&width=20&dpr=4&quality=100&sign=d153b8e7&sv=2) ![Logo](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fgitbook-28427.appspot.com%2Fo%2Fspaces%252F-LhCh4rbsm1X2FcstlIv%252Favatar.png%3Fgeneration%3D1560376837215206%26alt%3Dmedia&width=20&dpr=4&quality=100&sign=d153b8e7&sv=2) --- # Miscellaneous | Canvas Documentation [PreviousMail merge terms](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts/mail-merge-terms) [NextSetting up two factor authentication](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/setting-up-two-factor-authentication) Last updated 11 months ago [Setting up two factor authentication](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/setting-up-two-factor-authentication) [Cookie and consent banner](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/cookie-and-consent-banner) [Setting your password policy](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/setting-your-password-policy) [Set up Payment info on Account page](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/set-up-payment-info-on-account-page) [Loading screen](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/loading-screen) [Configuring multiple languages](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/configuring-multiple-languages) [Customizing your app's portal page colors](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/customizing-your-apps-portal-page-colors) --- # Menus & Navigation | Canvas Documentation [PreviousRoles & Permissions](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions) [NextData & Workflows](https://docs.airdev.co/canvas/3.6/canvas-functionality/data-and-workflows) Last updated 3 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#the-header) The Header ---------------------------------------------------------------------------------------------------------- **Element name:** header **Overview:** The Canvas HTML Header allows Canvas developers to create any number of headers for an app. The header reusable element contains a single HTML element that uses custom HTML, CSS, and flexbox to dynamically display different navigation elements, including texts, icons, buttons, the Current User profile image and group focus, and mobile menu. This header element is fully responsive, and it is used on every page of the Canvas template. Each Canvas application comes preconfigured with three headers as shown below. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#admin-user) Admin user #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#standard-logged-in-user) Standard logged in user #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#logged-out-user) Logged out user ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#creating-editing-a-header) Creating/editing a header Canvas developers can create any number of Headers within the admin portal, and each Header can have any combination of dynamic navigation elements (icons, texts, buttons, and the Current User profile picture): You can create a new header or you can choose to clone an existing header if you have one that is similar to what you would like to create. 1. Click New to create a new header from scratch 2. Click Edit to edit the name of the currently selected header 3. Click Clone to duplicate an existing headers settings into a new header 4. Click Delete to remove the currently selected header ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#telling-canvas-which-header-to-display) Telling Canvas which header to display Canvas will display any Header based on the “var - current header” hidden variable within the header reusable. As you create new Headers, you will need to add more conditionals to this hidden variable to specify when to show each Header. For example, you could show a specific Header based on the Current User’s role or show a particular Header based on a certain page’s name. Remember, when setting conditionals Bubble will give priority to the last condition that is true. So if you have three conditions and both condition #1 and condition #3 evaluate as true, Bubble will prioritize condition #3 over condition #1. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#header-sections) Header sections #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#text) Text Text Navigation items will appear to the left of the icons in your header. On a mobile screen, these elements will be moved from the header into the mobile dropdown menu. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#icons) Icons The icon element is a special element as we have included four reusable Bubble elements with GroupFocus drop downs that you can set up to be triggered from the icon. Note that both the indicated icon and the Bubble Action Trigger must be set exactly as indicated below for this functionality to work. You can add up to 4 icons per header but for best mobile experience we recommend using a max of 3 icons for a header that has the `logged in state` toggled on * * Icon = `bell` * Bubble Action Trigger = `bell-groupfocus` * * Icon = `messages-circle` * Bubble Action Trigger = `messages-groupfocus` * * Icon = `search` * Bubble Action Trigger = `search-groupfocus` * * Icon = `cart` * Bubble Action Trigger = `cart-groupfocus` Each of the above widgets contains a small text element that displays a number alert for that widget (think unread notifications or count of items in cart). This number is static by default but can be made dynamic by modifying the `var - unread` or `var - count` elements within the corresponding widget reusable. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#buttons) Buttons You can include up to two buttons on each header. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#logged-in-state) Logged-in state Set toggle on if this header is visible to logged-in Users. This header will display the Current User's profile picture with a dropdown menu that allows them to view their account settings or log out. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#mobile-menu-and-responsiveness) Mobile menu and responsiveness Each Header's responsive settings are set automatically. On desktop, the Header will display text links, icons, buttons, and the Current User profile picture. On mobile, the Header will hide any text and button elements, and display the hamburger menu icon. Clicking on the hamburger menu icon will open a mobile menu that contains the Header's text and button navigation elements. The breakpoint to display the mobile menu is determined dynamically for each Header on page load. If a Header does not contain any text or button navigation elements, the hamburger menu will not become visible on mobile. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#updating-the-logged-in-focus-group-menu) Updating the logged in focus group menu You can manually update the elements in the user account dropdown directly from the header reusable element in the Bubble editor. From the elements tree open **GroupFocus Mini > Group Logged In** There is a button for the user to log out, visit their account page, and navigate to the admin portal. We have also included three placeholder buttons for you to customize and add actions if you would like to create additional functionality. **Placeholder button** refers to a fully designed button element that has been hidden by default but can be unhidden and used as needed in your application. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#the-footer) The Footer ---------------------------------------------------------------------------------------------------------- **Element name:** footer **Overview:** Similar to the Canvas HTML Header, the app’s footer reusable element is also a single HTML element that displays Navigation Items defined in the admin portal. The primary difference between the header and footer is that there is only one footer version; you cannot define different footer variants through the admin portal. The footer element is included by default on all marketing pages. For Bubble pages you will need to add it manually. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#how-to-add-edit-or-delete-navigation-items) How to add, edit, or delete Navigation items Adding, editing, and deleting Navigation Items within the Footer is the same as doing so in the Header. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#styling) Styling The Footer’s desktop design has the app’s text links aligned to the left and the app’s social media icons aligned to the right: On mobile, all elements become centered: The Footer's HTML utilizes the same CSS classes defined in the "header" reusable. Changing the CSS in the header will adjust the styling of elements in both the Header and the Footer ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#footer-sections) Footer Sections #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#pages) Pages Pages are simple text links and your template will have two Navigation items in this section linking to the Home and About pages. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#legal) Legal Canvas allows you to manage your terms of service and privacy policy content directly from the admin portal. By default the footer will have a link to both the Terms of service and Privacy policy pages. We have provided default content for your but the content contains references to text that needs to be changed. If you search for all references of the word "Sample" and replace those with an appropriate word (usually the legal name of your company), that is a start, but you should also determine if the content of the documents is appropriate for your application. To edit the content for these pages, from the left menu navigate to Settings > Terms of service or Settings > Privacy policy We have compiled a list of resources to help you get started with customizing your legal pages. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#social-media) Social media Here you can add social media icons to your footer that link to your social media pages. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#setting-up-navigation-item-actions) Setting up Navigation item actions ---------------------------------------------------------------------------------------------------------------------------------------------------------- When adding items to the header or footer, you will see the same actions available to setup for both. You can set up almost any configuration possible. Here's how: ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#open-marketing-page) Open Marketing page ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#open-internal-bubble-page) Open internal Bubble page ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#open-external-link) Open external link Enter a url (including https:) that would like to navigate to when this element is clicked. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#run-bubble-action) Run Bubble action This will trigger a workflow in the header reusable called `Run Bubble Action Triggered` which is a Javascript to Bubble element action from the Toolbox plugin. The text value that you save in the 'Bubble action trigger' input will be passed through this event as "This JavascripttoBubble's value". Let's say we want to show a popup when a link is clicked we would set that up with the following steps 1. First let's decide on a unique text we can use to identify that this particular link was clicked. For this case it would make sense to make that text be `show-popup`. 2. Now we need to add an action in the `Run Bubble Action Triggered` workflow to show the popup. On this action add a condition so that it only runs when `This JavascripttoBubble's value is show-popup` . 3. Finally, to set up the link to trigger this action, we will select `Run Bubble action` as the action type and in the Bubble action trigger will add the text `show-popup` . That's it! The popup will now be shown when the user clicks this link. We recommend setting up only one action per link trigger in this Run Bubble Action Triggered. If you need to create a more complex action, put those actions in a Custom event and trigger the custom event from the Run Bubble Action Triggered workflow. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#dropdown-menu) Dropdown menu ---------------------------------------------------------------------------------------------------------------- **Element name:** menufocus\_template **Purpose:** Provide the user with a concise list of actions they can take in a convenient dropdown menu. The dropdown menu is used consistently throughout the Canvas template to provide the user with actions they can take such as Edit/delete a thing, View more details, Send a message, etc. The dropdown is triggered by clicking on the icon, can be dismissed by clicking anywhere outside the dropdown, and is most often used in repeating groups to provide action items for each thing in the list. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#clone-the-reusable-template) **Clone the reusable template** Open the **menufocus\_template** and from the top bar of the Bubble editor click Edit > Clone this Page. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#assign-the-type-of-content) Assign the type of content With your cloned menufocus\_template open, double-click in the gray area of the editor to open up the settings for the reusable. Change the 'Type of content' to the datatype you will be using this menu to edit. You will need to change the type of content for the GroupFocus Dummy as well. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#set-up-the-dropdown-buttons) Set up the dropdown buttons In the elements tree click the '+' to open the GroupFocus Dummy. This group contains all the dropdown buttons in the menu. Group Option 2 and Group Option 3 are already set up as the Edit and Delete actions. There are three more Group Options (1, 4, & 5) that are unused and can be customized to add more buttons to your menu. Each of these groups has a corresponding event in the workflow tab that will be run when the group is clicked. The menufocus\_template reusable element also contains two popups that correlate to the Edit and Delete actions: * **Popup Edit** Clicking on Option 2 (Edit) in the dropdown will open a standard edit form popup to create or edit a thing. * **Popup Remove** Clicking on Option 3 (Delete) in the dropdown will open a popup to remove a thing. Customize/duplicate these popups to your purposes. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#using-the-custom-events) Using the custom events Each popups can be triggered by the corresponding custom events 'Create/edit thing' and 'Remove thing'. Setting up custom events within a reusable gives you the option of using that workflow from the page it is on with the 'Trigger a custom event from a reusable element' action. Each header can contain custom text links, icons, or buttons and have multiple actions that can be set for each item. Learn about how to use each action . **Widget Notifications** This action will show a notifications group focus when clicked. Learn how to customize this element . **Widget Messages** This action will show a messages group focus when clicked. Learn how to customize this element . **Widget Search** This action will show a search input within a group focus when clicked. Learn how to customize this element . **Widget Shopping Cart** This action will show the shopping cart group focus when clicked. Learn how to customize this element . This will open a page that has been created by the page builder. To use this option, you must have set up the marketing page already from the tab. Opening a Bubble page will use the reusable data that is setup inside the editor. For example, you can add the menufocus\_template element to the on a page and trigger a custom event to create/edit or remove a thing. [Privacy Policy resources](https://docs.google.com/document/d/1hqAkqI9N9i0HUUPf-Ql6V2mlZDFePNVarqkbx78_oc4/edit?usp=sharing) [Terms of Service resources](https://docs.google.com/document/d/1_x-D6MKT_dUC_9_gTuDMYv8e5O5n98tol8wdxb7AMQ8/edit?usp=sharing) [Pages](https://docs.airdev.co/canvas/3.6/canvas-functionality/marketing-pages) [here](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation#setting-up-menu-item-actions) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Flh5.googleusercontent.com%2F8a6sZtylhfw1GqSM9LBw22eUSMtFpoELVDFIB3DndIwnH08Jv2t5ty1aFbCVgLcRp04cxpSUDUocJbIqgM80w412xT7b1sRIEUMSVeMHn_dbjQiX2FVMYXd4Ac2zLFBFamr0hQuZ&width=768&dpr=4&quality=100&sign=a7009eb5&sv=2) [Bubble Pages](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions#the-bubble-pages-option-set) [here](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#notifications) [here](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#messages) [here](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#search) [here](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#shopping-cart) Dropdown menu for a Canvas marketing page ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MezX9FH52tnSe5C8RBZ%252F-MezcUnrXy7IY0ywRibx%252FCleanShot%25202021-07-19%2520at%252012.37.09.png%3Falt%3Dmedia%26token%3Dc1744fbd-8fc2-41fd-8276-da0808072cd7&width=768&dpr=4&quality=100&sign=9d358263&sv=2) [hidden variables popup](https://docs.airdev.co/canvas/3.6/canvas-functionality/data-and-workflows#hidden-variables) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MfAuAs4QkJyWuoa52jQ%252F-MfAuOKVufkZjpBu5moG%252Fimage.png%3Falt%3Dmedia%26token%3D45d35883-2714-44b0-9bcb-998171f45f31&width=768&dpr=4&quality=100&sign=a0898a66&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MfA1PBd8yNPySMOqE8P%252F-MfA4cCHaYPNbVgC0mf4%252Fimage.png%3Falt%3Dmedia%26token%3Dd2a24997-fd07-40b1-9c52-7dde8df2a9b6&width=768&dpr=4&quality=100&sign=e32b85c2&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MfA4t5vaFuyvitKRALV%252F-MfA4yl9vvz7dnPXOAmW%252Fimage.png%3Falt%3Dmedia%26token%3D2a43faad-b87d-41d5-8bb6-1b53dd3b357a&width=768&dpr=4&quality=100&sign=5b1fb2b1&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MfA1PBd8yNPySMOqE8P%252F-MfA4XOfoOttl4GaUJek%252Fimage.png%3Falt%3Dmedia%26token%3Ddebe159c-d843-4055-a687-3b86b80843d2&width=768&dpr=4&quality=100&sign=4155954d&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MOmlsouI08973C1_vEH%252F-MOmq7Ul_zdKigf_hqoK%252Fimage.png%3Falt%3Dmedia%26token%3De9e21f95-b182-43e6-960f-2d01334415ba&width=768&dpr=4&quality=100&sign=c8aa8592&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MOmlsouI08973C1_vEH%252F-MOmxwNsQ9baRxeWKrAq%252Fimage.png%3Falt%3Dmedia%26token%3D365f7994-3cc7-4394-abaa-5897ee7b3404&width=768&dpr=4&quality=100&sign=8700d6be&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mf4Ml6OXsRGBc-2vumS%252F-Mf4eJfblWDfLcIkpGdN%252Fimage.png%3Falt%3Dmedia%26token%3D011f0847-bb4e-43ff-92b4-2388c7ce2e16&width=768&dpr=4&quality=100&sign=f9ed6830&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MfAuAs4QkJyWuoa52jQ%252F-MfAuS09-pCvrmlTFCbr%252Fimage.png%3Falt%3Dmedia%26token%3D8dc8a127-befa-4a68-96e3-dd6da29fb71d&width=768&dpr=4&quality=100&sign=b745b7cf&sv=2) --- # Data & Workflows | Canvas Documentation [](https://docs.airdev.co/canvas/3.6/canvas-functionality/data-and-workflows#copying-development-data-to-live) Copying development data to live ---------------------------------------------------------------------------------------------------------------------------------------------------- Canvas uses the database extensively to create a highly functional and dynamic application. While in development, all this data is being saved to the development database of your app. It's important to remember that your Bubble app has two separate databases for the live and development versions. When deploying live the first time you will need to copy the development database to the live database for Canvas to have access to all the settings you have applied during development. To do this, from the Bubble editor navigate to the Data tab, open App data, and then click on 'Copy and restore database' in the top right. In the popup click the 'Copy development data into the live database' button, ensure 'Data type to copy' is set to All types, type 'COPY FROM DEVELOPMENT TO LIVE' in the input and press the Confirm button. Be aware that copying the data from one version to the other will overwrite all information in the database to which you are copying data. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/data-and-workflows#copying-specific-data-types) Copying specific data types After your initial deployment to a live application you may find scenarios where you need to copy a specific data type from Live to Development or Development to Live. This is common especially with email templates and marketing pages where you make updates in development and need to have the new data copied directly to the live site. To do this, you will follow the same steps as outlined above for copying the entire database. But instead of setting the 'Data type to copy' to All types, define the specific Data type you need to copy and then proceed as normal. We have added a gear icon (⚙️) before all data types, and field names that are core to the Canvas template. In general, these elements should not be edited unless you understand the impact changes will have on the template. Below is some guidance on when and how to copy Canvas data types from one database to the other. Data type Guidance and best practices ⚙️ **App Settings** If you have made a lot of changes to the app settings in the development version it may be easier to simply copy the app settings data over to the live version rather than duplicating all the changes manually. However, it is a best practice to update app settings directly in the live admin portal once your site has been deployed. ⚙️ **Header & ⚙️ Navigation item** It is important to always keep the header and navigation item data types in sync. Before initial deployment, we recommend creating or editing your header and navigation item in the development version and then copy those data types to your live site. After initial deployment, we recommend to not copy the header or navigation item data types from one version to the other. Instead, you should make any header or navigation related updates directly in your live site via the admin portal. Whether it is the live or development version, you should add and update these data types from the same version to avoid content conflicts with your headers and navigation items. ⚙️ **Marketing Page** It's a best practice when using the Canvas Page Builder to create and and update your marketing pages in the development version and then copy the data to your live site. ⚙️ **Palette Color** Palette colors are a standalone data type and can be copied from one version to the other with little impact to the application ⚙️ **Email Template & ⚙️ Email Template Variant** Since email templates must be set up with their own custom workflows, adding a new template will require making and deploying workflow changes from the development version of your app. Whether it is the live or development version, you should add and update email templates and email template variants from the same version (and copy to the other) to avoid content conflicts with these data types. ⚙️ **Email Verification Request** Email verification request data is generated automatically and is only valid within the version it is created. You will never need to copy this data type. ⚙️ **Dummy** Dummy data is used to populate default content for Canvas blocks when they are first added. When an app is pushed live these blocks should have been customized to display content specific to your application. It's unlikely you would need to copy the Dummy data from development to live. **App variables** After the initial deployment, copying this data type from one version to the other will overwrite any existing app variables in the other version. **User** After the initial deployment, it's not recommended to copy users from one version to the other as this will overwrite any users that have been added to the app in the other version. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/data-and-workflows#how-the-app-settings-data-type-is-being-used) How the ⚙️ **App Settings** data type is being used ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- There should only ever be one ⚙️ App Settings entry. More than one ⚙️ App Settings entry will break the Canvas Template. Every Canvas template will have a ⚙️ App Settings data type that is used to manage all app-wide settings such as colors, app name, contact information, etc. Almost all data for the ⚙️ App Settings object is controlled from within the Admin portal. While you can add additional fields to the ⚙️ App Settings object as needed to customize your application, we recommend not changing the default fields in any way. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/data-and-workflows#using-the-hidden-variables-popup) Using the hidden variables popup ---------------------------------------------------------------------------------------------------------------------------------------------------- **Variable** simply refers to the use of an element to hold one or more values. Instead of repeating these values in multiple places in your page or workflows, the **variable** holds the results of a calculation, a single thing from a database search, a list of things from a database search, or some other value and can be referenced multiple times from other page elements and actions. Each page has a popup called 'Popup Hidden Variables' designed to hold app data as variables for easy reference. As an example, each page has a group element in this popup called 'var - ⚙️ app settings' with the type of content set to ⚙️ App Settings. The data source then is a 'Search for ⚙️ App Settings: first item'. With this variable set up, anywhere you need to reference the ⚙️ App Settings on the page (e.g. the app name), rather than doing a search for the ⚙️ App Settings object you can simply reference 'var - ⚙️ app settings object's app setting' instead. This keeps your data organization clean and concise on the page. Any data that is referenced from multiple elements or actions on the same page should be stored in a variable group in this popup to avoid redundancy in retrieving data. This helps minimize the possibility of error when searches are duplicated across elements. It also makes it much simpler to update any search parameters as the search only needs to be changed in one location. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/data-and-workflows#types-of-variables) Types of Variables Variables are stored in two kinds of elements: **Groups** and **Repeating Groups**. These elements are often more useful than custom states because they can have default data sources, conditional data sources, or have their data set by a workflow. A custom state's data can only be set by a workflow. It is good practice to name each Group or RG with a naming convention of `var - [Name of variable]` as opposed to the normal 'Group..." convention. This allows you to quickly search for the page variables using the 'var' prefix. **GROUPS** Groups are used to store single item variables such as a number, text, or single Thing from the database. **REPEATING GROUPS** Repeating groups are used to store list variables such as a list of numbers, list of texts, list of Things, etc. When using a Repeating Group as a list variable, use the **Vertical scrolling** layout style to allow your page to only load the data that is needed to display in the current page view. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/data-and-workflows#using-the-inclusive-yes-no-option-set) Using the inclusive Yes/No option set -------------------------------------------------------------------------------------------------------------------------------------------------------------- When filtering data by the yes/no field type in Bubble, you can only return values that are either Yes or No. For instance: The inclusive yes/no option set allows you to create search parameters based on the yes/no field type in Bubble and return all things with a value of 'Yes' OR 'No', a value of only 'Yes', or a value of only 'No'. For instance: The enable this we've added a list of yes/no values as an attribute to the Options in the Yes/No Option set. * For the Yes value we add only the 'yes' value to this list. * For the No value we add only the 'no' value to this list. * For the Yes or No value we add both the 'yes' and 'no' values to this list The search logic then is to check, not if the value is EQUAL TO the Yes/no values, but if the value IS IN the Yes/no values. To see how we use this in Canvas, check out the dropdown to filter users by active status on the admin page of your app. It can be found in the elements tree by clicking the '+' to open Group Main Content > Group Nav 8 - Users > Group User header > Dropdown Users. [PreviousMenus & Navigation](https://docs.airdev.co/canvas/3.6/canvas-functionality/menus-and-navigation) [NextEmails & Alerts](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts) Last updated 3 years ago Was this helpful? Check if value 'is in' the list of Yes/no values ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MJscNyO3JEnxGVmkJ55%252F-MJshuV3O8dxW4zj1QkN%252FYes%2520or%2520No.gif%3Falt%3Dmedia%26token%3Dc3a3879b-b994-425b-8a4c-b39385da7d79&width=768&dpr=4&quality=100&sign=58946a31&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MfsbWhfbg2OEg-I76Si%252F-MfskIDVNh82qBFibjsZ%252FScreen%2520Shot%25202021-07-30%2520at%252011.50.34%2520AM.png%3Falt%3Dmedia%26token%3D8edefeeb-c0f9-425b-a3ad-0713e940c25c&width=768&dpr=4&quality=100&sign=523f8037&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MJscNyO3JEnxGVmkJ55%252F-MJsiA15gCPj2Qzu3c4G%252FBoth%2520Yes%2520and%2520No.gif%3Falt%3Dmedia%26token%3Df87de47a-5d8c-4787-a37b-816bbd08bf49&width=768&dpr=4&quality=100&sign=2d628be3&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MJscNyO3JEnxGVmkJ55%252F-MJskhX6ZPnhYom1uojI%252Fimage.png%3Falt%3Dmedia%26token%3D0609788a-535b-4403-9dd0-a5ea154949c2&width=768&dpr=4&quality=100&sign=832e2123&sv=2) --- # Customizing your app's portal page colors | Canvas Documentation [PreviousConfiguring multiple languages](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/configuring-multiple-languages) [NextReference](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference) Last updated 11 months ago These portal sidebar color settings will only apply to portal pages imported using the (excluding the admin portal page). The "Update your portal page sidebar styles" within the "Branding" tab of the admin portal allows you to generate a custom color palette for your app's sidebars based on a single base color. You can also adjust the modes of each sidebar type from "dark" to "light" mode within this popup. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/customizing-your-apps-portal-page-colors#change-the-base-color) Change the base color Change the base color used to create your sidebar color palette. This base color is usually your app's primary color. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/customizing-your-apps-portal-page-colors#adjust-the-lightness-and-saturation-of-the-color-palette) Adjust the lightness and saturation of the color palette Use the sliders to adjust the lightness and saturation of the autogenerated colors. If your base color is red, pink, or orange, it is likely that you will want to first increase the lightness and then increase the saturation to make the colors look brighter and more vivid. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/customizing-your-apps-portal-page-colors#change-the-alert-color) Change the alert color After you change the base color, the alert color will be set to the base color's complementary color. For example, if you select orange as your base color, the alert color will be blue. You can override the alert color with any color. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/customizing-your-apps-portal-page-colors#change-the-mode-of-each-sidebar) Change the mode of each sidebar You can change the mode of each type of portal page using the "mode" dropdowns above each sidebar preview within the popup. Changing a portal page's mode from "Dark" to "Light" and then clicking save will change that type of portal page template's colors to display that style when the page is loaded. For example, if your icon portal page template is set to "Light", and you have an icon sidebar portal page somewhere in your app, that sidebar will be set to "Light" mode colors when viewing that page in preview mode. You can also programmatically change the mode by adjusting the "var - sidebar mode" within that page template's "Hidden Variables" popup. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/customizing-your-apps-portal-page-colors#import-portal-pages-to-your-application) Import portal pages to your application Import other "Standard", "Icon", and "Double" sidebar portal page designs using the Canvas extension. [Canvas Chrome Extension](https://chromewebstore.google.com/detail/canvas-by-airdev/apmembkcpmjhmecifhckdidppfoiajie?hl=en) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F7FuVkAhIrEs0Tmf6PUE4%2Fportalstyles.png&width=768&dpr=4&quality=100&sign=65829b96&sv=2) --- # Data types | Canvas Documentation [PreviousMenu Focus Elements](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/reusable-elements/menu-focus-elements) [NextOption Sets](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/option-sets) Last updated 3 years ago Was this helpful? All objects and some selected fields in the template are explained below. Please refer to our document for guidance on how the Bubble database should be structured. All data types and a few select fields are explained below. A good general rule to follow is that you shouldn't delete any fields that are included with the template and instead only add new ones. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/data-structure#app-settings) ⚙️ App Settings --------------------------------------------------------------------------------------------------------------------- This data type includes fields for all app-wide settings. Most of the data fields are controlled by the App admin from the Admin portal. There should only be a single object of this data type. Field name Type Description Ask for cookies? yes / no App Owner can control whether or not to ask users to accept cookies (if yes, a cookies banner will show on the homepage) Email text Contact / support email that all emails in the application come from. Whenever a new email action is created in the application, it should refer to this field instead of being hardcoded Email verification required? yes / no App owner can control whether or not to require users to verify their emails during the sign up process (if yes, users will receive an email that contains a verification link and they will need to click the link to verify their emails) Name text Name of your app / website. This is the field that should be referenced anywhere where the name is used (instead of hardcoded). App primary color text App and email template primary color Usersnap off? yes / no This turns off the Usersnap tool, which Airdev uses with its clients to submit feedback and bug reports. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/data-structure#app-variables) App Variables -------------------------------------------------------------------------------------------------------------------- This data type is specifically for setting up custom app-wide variables for your project. Simply add fields as need and reference them from your pages by accessing the `var - app variables` [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/data-structure#user) User -------------------------------------------------------------------------------------------------- The user data type represents each person who has an account in your application. Field name Type Description Date agreed to terms and privacy docs date Date agreed to terms and privacy docs during sign up Date signup completed date Date the user completed signup. If the user signs up themself this is populated on initial signup. If the user is invited such as an app admin, this is recorded when they first set their password Inactive yes / no User is marked as inactive = yes when App owner deletes the user from the Owner's Portal Last login date Captures the last date that the user loaded any page in the app Signup method text E.g., E-mail, LinkedIn, Facebook, Twitter, or etc. Pending email verification email verification Current user's email verification (this will be deleted from the user once the user verifies his email) [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/data-structure#dummy) ⚙️ Dummy ------------------------------------------------------------------------------------------------------- This data type allows you to quickly preview your page layout by it as your data source. This is filler data for designers to create the UI. These fields can be used to see what the UI of a page looks like with given types of data, which is helpful when you want to focus on the design and ignore the content. Building this way is also great when the designer isn't familiar with the data structures for a particular design. Field name Type Description Address geographic address Address in the San Francisco Bay Area Attachment file Sample pdf file Background picture image Sample image Cover photo image Another sample image Email text Sample email First text First name of a person Last text Last name of a person Long description text Paragraph-length text Number of likes number Number larger than 0 Number of stars number Number between 1 and 5 Order number Integer used to order how these Dummy objects are displayed Phone number number Number with 10 digits Price number Integer used for testing price displays Profile picture image Image of a person (or dog) Regular picture image Another image Short description text A sentence-length text Title text 1-3 word text [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/data-structure#palette-color) ⚙️ Palette color ----------------------------------------------------------------------------------------------------------------------- This data type is color palette list is referenced in the Air Color Picker plugin / element. Feel free to add more color entries for quick access when using the Air Color Picker element. We use this data type for push notifications when we turn your app into a native mobile iOS or Android app. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/data-structure#email-template) ⚙️ Email Template ------------------------------------------------------------------------------------------------------------------------- Email templates are managed from the admin portal and act as the main parent to manage email content for different scenarios [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/data-structure#email-template-variant) ⚙️ Email Template Variant ----------------------------------------------------------------------------------------------------------------------------------------- The email template variant holds the email content for its parent Email template. When using multiple languages an email template will have multiple variants... one for each language. Field name Type Description Email template ⚙️ Email Template Parent email template Is active? yes/no Sample pdf fileimage Language code text Language code for the language this variant represents Language name text Display name of the variants language Text body text Text to use as the body content for the email Text button text Button text Text signature text Text to include as the signature of the email Text subject text Text to add to the subject line of the email We create one record for each header you create for your application [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/data-structure#marketing-page) ⚙️ Marketing Page ------------------------------------------------------------------------------------------------------------------------- Contains all the html and metadata used to display a marketing page [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/data-structure#navigation-item) ⚙️ Navigation Item --------------------------------------------------------------------------------------------------------------------------- Contains all the code and metadata for an item such as a link, button, icon, etc that has been created for a footer or header element [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/data-structure#verify) ⚙️ Verify --------------------------------------------------------------------------------------------------------- Stores the code data when a user is going through the verification process for their email, sms, or two-factor authentication. [Bubble Best Practices](https://docs.airdev.co/bubble-development-guide/steps/plan/database-structure) --- # Manually Building UI | Canvas Documentation [PreviousDesign standards](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/design-standards) [NextLearning Bubble Basics](https://docs.airdev.co/canvas/3.6/using-bubble/bubble-basics) Last updated 4 years ago Was this helpful? Using elements and spacing consistently across your application is important for your app's design to remain cohesive with the Canvas template. Canvas manages this for you but there are times you will find you need to build pieces of your UI manually. The guidelines below specify the standards used by Canvas to help you maintain a consistent brand and design across your application. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/design-standards/manually-building-ui#standard-page) Standard page If you need a generic Canvas page simply add the 'Standard page' to your app with Canvas extension by following the steps . This will create a new page in your app with a header, footer, and all the elements below as a starting point for building your new page. A standard page will have a width of 1220px, minimum width of 0, and no maximum width. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/design-standards/manually-building-ui#group-title) Group Title This group is placed just below the header and is a full width element that can be used as the title element for the entire page. By default it includes a title and a description text. **NOTE**: This element is set to be hidden when the page width is less than 500px. Keep in mind if you are building for mobile that the element will not be shown on most phones. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/design-standards/manually-building-ui#blocks-container-860-do-not-rename) Blocks container 860 (do not rename) This group is used as a main container for the page body content and can be found on every Canvas page. * On standard pages, the default width is set to 860px with responsive minimum width of 99% and a maximum width of 105%. * On portal pages, the default width is set to 860px with responsive minimum width of 80% and no maximum width. To maintain responsiveness across different screen sizes all groups on the page should be nested inside this group. Nesting a group within another group can be achieved by dragging the group to be nested into the containing group. The border of the containing group will turn **RED** when the nested group is successfully nested All Canvas blocks are designed to fit and operate responsively at this standard width of 860px. Changing the width of the Blocks container 860 (do not rename) group can cause issues with responsiveness and new blocks you may add to your project ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/design-standards/manually-building-ui#blocks) Blocks Most Canvas blocks will come with a main container group and are designed to be used as either main sections for a single page or as a full page itself when creating a portal page The block will contain two main groups: Header group and Standard Group ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/design-standards/manually-building-ui#header-group) Header group A **header group** is used to describe the page or section to which it belongs. Each header group contains a title, description, and a button by default. See Standard Group below to learn more about the widths, padding, and responsiveness of groups in general. * The title has a font size of 24pt, a height of 36px, minimum width of 20%, and no maximum width set * The description has a font size of 16pt, a height of 24px, minimum width of 20%, and no maximum width set. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/design-standards/manually-building-ui#standard-group) Standard group A **standard group** is used to contain the main content of the page or section. This can be text, images, repeating groups, or any combination of elements. When placed below a header group there should be 15px of spacing between bottom of the header group and the top of the standard group. A standard group contains the following three main elements: * **Outer Group**: This group operates as a container for the entire section and has a width of 860px, a minimum width of 20%, and no maximum width set. * **Inner Group**: This is the content container for this section and will have a width of 780px, a minimum width of 20%, and no maximum width set. To maintain proper responsiveness, all content elements should be placed within this inner group. * **Padding Groups**: There are two groups called Group verticalPadding 1 and Group verticalPadding 2 which are located at the top left and right of the outer group. These groups have a standard width of 40px, a minimum width of 50%, and no maximum width set and are used to maintain a dynamic padding distance between edges of the outer group and the inner group. Do not delete the padding groups as they are integral to maintain responsiveness ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/reference/design-standards/manually-building-ui#popups) Popups Canvas comes with two different popup sizes. The small popup is 360px wide and the standard popup is 680px wide. Both have a minimum responsive width set to 20%. The padding between the edge of a popup and its inner content is 30px on all sides. **Small popups** generally have a title, some text, and a couple of buttons. Padding between main elements is 20px. The **Standard popup** has a title, inputs, and a couple of buttons. The padding between main elements is 20px with the exception of the inputs. Padding between inputs is 15px. An input's label text element is 18px in height, uses a 12pt font size, and has a 0px spacing between the label text and the input element below it. A Portal Page is a single Bubble page that has a left side navigation menu and creates the illusion of navigating between pages by hiding and showing groups on the page. To learn more, see the . [Hiding Groups section](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#hiding-groups-incomplete) [here](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules#adding-a-new-page) Nesting a group within a containing group Module containing a header group and a standard group Standard group on a page with a button and a width of 860px Small popup with description text and a width of 360px Standard popup with inputs and a width of 680px ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MH9wSM5py0s_ryJuJjG%252F-MHAH58pF8afR2A3yZmP%252FSmall%2520Popup.png%3Falt%3Dmedia%26token%3D08f9fab9-9b34-4c31-8727-947c75b65685&width=768&dpr=4&quality=100&sign=e906778&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MHCJqdOY9MgGVCfOJ-b%252F-MHCT_G5K9yOrskO7Eqv%252FModule.png%3Falt%3Dmedia%26token%3D78779c6c-9948-4ea6-9d98-7c3f9fe666d0&width=768&dpr=4&quality=100&sign=201983bd&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MHCJqdOY9MgGVCfOJ-b%252F-MHCXdlKjDZYqB6T-JFV%252FHeader%2520group.png%3Falt%3Dmedia%26token%3D424a0c80-50df-4755-b1a0-eabd922eaae6&width=768&dpr=4&quality=100&sign=577d9c87&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MHC2SS4xTIHx5MRPG0Z%252F-MHC9ThpkzEB1SzFdMeE%252FStandard%2520Group.png%3Falt%3Dmedia%26token%3Db3d71b65-af10-48a8-93ab-44099f9f90d3&width=768&dpr=4&quality=100&sign=a749e317&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MHC2SS4xTIHx5MRPG0Z%252F-MHCGF9LsY6NUaAKeJly%252FNesting%2520Groups.gif%3Falt%3Dmedia%26token%3D76c6b73a-50d3-4ccc-8404-8e84d264dd17&width=768&dpr=4&quality=100&sign=cf5fb5fc&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MH9wSM5py0s_ryJuJjG%252F-MHAEvqMYRxmYXejlZ6M%252FLarge%2520Popup.png%3Falt%3Dmedia%26token%3Dc5a522a0-4d55-4335-a998-ff5269076ee6&width=768&dpr=4&quality=100&sign=488bd549&sv=2) --- # Setting your password policy | Canvas Documentation [PreviousCookie and consent banner](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/cookie-and-consent-banner) [NextSet up Payment info on Account page](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/set-up-payment-info-on-account-page) Last updated 11 months ago **Element name:** ⚙️ system\_password Setting your password policy in the admin portal will automatically update the password strength check throughout Canvas. The Canvas template includes a built-in password strength check UI during the signup flow and anywhere the user is required to reset their password. By default, the minimum acceptable password strength is **medium**. You can manage the requirements for your password policy directly from the Admin portal of your application. From the left menu click on Settings > Password policy. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/setting-your-password-policy#password-strength-levels) Password strength levels The password strength is calculated using Bubble's algorithm, which broadly incorporates the number of characters, use of uppercase versus lowercase characters, and use of numbers versus special characters. In Canvas, we use this number to determine the password strength levels: * **Very weak (0-19)** * Password length is less than 8 characters * No special character, number, or uppercase letter * Common words * **Weak (20-59)** * Password longer than or equal to 8 in length * Password includes at least one special character, number, or uppercase letter * **Medium (60-69)** * Password longer than or equal to 8 in length * Password includes at least two: special character, number, or uppercase letter * **Strong (70-79)** * Password longer than or equal to 8 in length * Includes a combination of special characters, numbers, and uppercase letters * \*75=Google suggested passwords * **Very strong (80-100)** * Password longer than or equal to 8 in length * Includes a combination of numbers and uppercase letters * Includes multiple special characters Here's the criteria Bubble uses to assess a password's strength: * 35 for having a password longer than or equal to 8 in length * 20 for having an uppercase letter * 10 for a lowercase letter * 10 for a number * 25 for special characters/symbols (anything not alphanumberical) * \-100 for common passwords This Canvas feature uses Bubble's and not Bubble's built-in password policy feature (App Bubble editor > Settings tab > General tab > Privacy & Security section). [password strength feature](https://manual.bubble.io/core-resources/elements/states#...s-password-strength) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FqpDJ9OwjPJ66o7SdciOF%2Fpassword%2520policy.png&width=768&dpr=4&quality=100&sign=6ba1f82a&sv=2) --- # Configuring multiple languages | Canvas Documentation [PreviousLoading screen](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/loading-screen) [NextCustomizing your app's portal page colors](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/customizing-your-apps-portal-page-colors) Last updated 11 months ago Canvas is designed to support multiple languages and integrates the language selection directly with Bubble. In addition, we provide an easy integration with LocalizeJS for full language support throughout your app. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/configuring-multiple-languages#enabling-multiple-languages) Enabling multiple languages By default your Canvas template will have multi-language functionality turned off. If you would like to use additional languages, in the admin portal navigate to Settings > Multiple Languages and toggle the 'Enable multi-language support' option. With multi-language support enabled you will see additional functionality available to you. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/configuring-multiple-languages#supported-languages) Supported Languages This is a list of languages that you can allow your app to support will contain English (US) as the default for your platform. You can add additional supported languages by selecting from the dropdown and clicking the add button. When you have more than one supported language, from the action menu you can choose to set a new language as the default.Add a captionThe default language cannot not be removed from the system and is used throughout Canvas as the fallback language if the user has not set a default language for themselves. User-uploaded Image ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/configuring-multiple-languages#localizejs-integration) LocalizeJS Integration ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/configuring-multiple-languages#enable-localize) Enable Localize In the admin portal, navigate to Settings > Multiple Languages. Multi-language support should already be enabled from the previous step. 1. Find the 'Enable LocalizeJS integration' option and toggle it to on. 2. Once you have enabled your integration, copy the Project Key from your LocalizeJS dashboard. Paste this into the project key input and click the save button. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/configuring-multiple-languages#customize-your-localize-integration) Customize your Localize integration The default integration in Canvas handles generating the code including your dynamic project key and the default language set for the app. Below is the code that we use to initialize this integration. Copy If you would like more granular control over your integration we recommend you simply toggle off the built in Canvas functionality and add your own custom localizeJS script directly to the Script/meta tags in header field found in the Bubble editor under Settings > SEO/metatags. If you haven't already, create an account and a new project on . Setting up the details of your project within Localize is outside the scope of this tutorial but LocalizeJS has created detailed walkthrough documentation . [https://localizejs.com](https://localizejs.com/) [here](https://help.localizejs.com/docs/what-is-localize) [Learn more](https://manual.bubble.io/core-resources/application-settings/seo-metatags#script-meta-tags-in-header) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fstatic.slab.com%2Fprod%2Fuploads%2Fcozgjvpz%2Fposts%2Fimages%2FQMcqoT9R9kFnxqZClL8rSdfS.png&width=768&dpr=4&quality=100&sign=6486ffdd&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fstatic.slab.com%2Fprod%2Fuploads%2Fcozgjvpz%2Fposts%2Fimages%2Fx98c60mUyQvuqt91o1mdSs8F.gif&width=768&dpr=4&quality=100&sign=8931768f&sv=2) --- # Design | Canvas Documentation [PreviousDatabase](https://docs.airdev.co/canvas/3.6/using-bubble/database) [NextSecurity](https://docs.airdev.co/canvas/3.6/using-bubble/security) Last updated 5 years ago Was this helpful? #### [](https://docs.airdev.co/canvas/3.6/using-bubble/design#it-can-be-difficult-to-strike-a-balance-between-design-functionality-and-maintainability-in-your-bub) It can be difficult to strike a balance between design, functionality, and maintainability in your Bubble app. Here are a few tips on how to do so. [](https://docs.airdev.co/canvas/3.6/using-bubble/design#design-guide) Design guide ---------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.6/using-bubble/design#scale-your-layouts-vertically) Scale your layouts vertically Making application fully-responsive and working well at every screen width is one of the hardest things to do in Bubble but one that is critical to not making your users upset. A key component to doing that is creating layouts that scale vertically and not horizontally. What does that mean? Basically, when creating a layout, think of what will happen when you need to add more stuff to it and when the screen becomes more narrow. Let's say you're creating a layout for a very simple row in a list with 2 action buttons, edit and delete. You may come up with something like this: But what happens if the screen gets more narrow? Perhaps you can still fit the name and two buttons on a phone screen but what about when you need to add a third button? A better and more scalable alternative is one where you add buttons vertically, instead of horizontally: ‌ ### [](https://docs.airdev.co/canvas/3.6/using-bubble/design#white-space-is-good) White space is good There is not much to say here, except for that having white/empty space in your application can be very effective in making the application feel uncluttered and clean. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/design#style-system) Style system You should make sure that every element that you use (or at least almost every element) is using a Style instead of having its visual properties on the element itself. This ensures the following: 1. That you're forced to keep your elements consistent and thus pleasing to the end user 2. That, if you ever decide to change the look and feel of your application, you won't have to hunt down individual elements and will instead be able to update multiple at a time 3. That your application is slightly smaller in size (this probably won't matter for most apps but if you have thousands of elements, the extra code required to store the visual properties on each element can really add up). At the same time, you should ensure that you don't have too many styles because then they will be difficult to manage and also result in inconsistent UI. Somewhere in the 5-10 range is probably right for most element types (some may require fewer, some more). What to do if you need to have an element that's styled in a one-off way? For example, let's imagine that you have an existing text style that you need to make **bold** in a single place. Do you create a whole separate style for that? We generally don't, instead we use a hack where we conditionally set the font to be bold and make the condition apply all the time. Below is an example. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/design#size-and-spacing-system) Size and spacing system The Style tab doesn't ensure that the sizes of your elements and padding are consistent, so you have to take care of that separately. Here are a few sample conventions that we use in Canvas: * Pages have a width of 1220px * Primary content goes into a group that's 860px wide * Each primary content block is 780px wide * Small buttons are 25px high, big buttons are 40px high * There are 15px of spacing between each input * Etc. [](https://docs.airdev.co/canvas/3.6/using-bubble/design#big-design-decisions) Big design decisions -------------------------------------------------------------------------------------------------------- As you're designing and laying out your application, there are some high-level decisions that you'll need to make. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/design#lots-of-pages-or-lots-groups-on-a-single-page) Lots of pages or lots groups on a single page? You'll have to decide whether you'll build a separate page for each of your screens or whether you put them on the same page, in hidden groups that show at the right time. Here's a table that compares the two methods on multiple dimensions: Dimension Separate page Group on a page Speed Each page will load quickly BUT a lot of page loads will be required, so overall probably a bit slower. The overall page will load slower but switching between groups will be very quick. Modularity Very modular because all you have to do is just link to the page if you need to integrate it into a new flow or expose it to a new user type. A bit less modular because it's embedded within a larger page. However, that can be remedied by using a reuseable group. Navigation Very easy to link to. Harder to link to an individual group but not that hard as long as parameters are used for navigation. Where we've landed with Canvas is that we use both separate pages as well as multiple groups on a page, depending on the use case. Let's imagine a very basic social networking application with the following functionality: * Users can search for other users and view their profiles * Users can add other users as friends * Users can message their friends * Users can update their profile and settings We would probably use the following pages: * **Search page** - this would be a standalone page where the user will search for other users and view the results in a list. * **Profile page** \- this would be a standalone page that will show information about a particular user. * **Dashboard page** - this would be a page with several hidden groups that will be used to approve friend requests, message other users, and update profile/settings. If you decide to have multiple groups on a page, you shouldn't stack them in an overlapping way on top of each other because the page height will then have to be as tall as the tallest group and you might end up with unnecessary empty space at the bottom. Instead, stack them vertically, one below the other one, and set each one to collapse when hidden. Also, you should make them all invisible by default and only visible when they need to be (vs. making all groups visible by default, which will result in a flash of content that is later hidden). ### [](https://docs.airdev.co/canvas/3.6/using-bubble/design#reusables-or-not) Reusables or not? Generally, reusable elements are great. They fit well within our principle of modularity and allow us to easily add repeated functionality without needing to duplicate it. There is, however, a relatively large **BUT**, which is: > **It's relatively hard to pass data to and from reusable elements** Each reusable element accepts an object or a simple value and each custom workflow within a reusable also accepts an object or a simple value. The hard part starts when you need to either pass more than 2 parameters to the reusable element or you need to reference the result of something that happens within the reusable element. There are three non-ideal ways to do that: 1. (Most likely a bad idea) Set fields on the `Current User` to pass data back and forth 2. Set states on the reusable elements and reference them in either direction (either from page to reusable or from reusable to page) 3. Update the URL parameters and refer to those in either direction 4. Use one of the global variable plugins #1 is probably a bad idea because multiple people won't be able to use the same user account at once. And #2-#4 are all doable but require a bit more work than not using reusables. Now that we've caveated reusable elements, let's reiterate that you should probably be using them, especially if you're building functionality that will need to be accessed in multiple places and doesn't require passing a lot of data back and forth. A great example is a popup for editing an object - it only needs one parameter, which is the object itself and is most likely needed in multiple places (in the dashboard of the user who creates the object, in the dashboard of the app's owner, etc.). A button layout that scales horizontally A button layout that scales vertically Look at all that "wasted" space The condition is always true and thus the text is always bold ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Lv6mhPcOSLWch6HLRIC%252F-Lv6sSLSOOPVjKeyfqLc%252Fassets_-LZgeX5n5GW38BCost9m_-L_KBICLewFV5ykV2By6_-L_KDRqIqaNbh7DW6s4M_image.png%3Falt%3Dmedia%26token%3D46d3decc-21b8-4201-9728-3365fa99335c&width=768&dpr=4&quality=100&sign=4c890cd2&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Lv6mhPcOSLWch6HLRIC%252F-Lv6sK7xl1DZ9DTVla9b%252Fassets_-LZgeX5n5GW38BCost9m_-L_KBICLewFV5ykV2By6_-L_KKC9S9M0VwnKs_tC0_image.png%3Falt%3Dmedia%26token%3Dd4e095ec-6e9d-4007-b81e-414d80070622&width=768&dpr=4&quality=100&sign=ee96fb38&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Lv6mhPcOSLWch6HLRIC%252F-Lv6sV2ECxIJqljBPDwo%252Fassets_-LZgeX5n5GW38BCost9m_-L_K6Mg1Q1J0AK0WmL4z_-L_K9xDFr1PUp876FuD0_image.png%3Falt%3Dmedia%26token%3D43d2ff9b-253b-4e67-a7a0-9bf04fa357fe&width=768&dpr=4&quality=100&sign=85930232&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Lv6mhPcOSLWch6HLRIC%252F-Lv6sOo6O_VWPD7RifaD%252Fassets_-LZgeX5n5GW38BCost9m_-L_KBICLewFV5ykV2By6_-L_KLfdPK0y_jFVQKLJ5_image.png%3Falt%3Dmedia%26token%3D6aa19b08-606b-4501-838d-407ed8d1d4fe&width=768&dpr=4&quality=100&sign=a0db9aba&sv=2) --- # Bubble Pages & Blocks | Canvas Documentation [PreviousMarketing Pages](https://docs.airdev.co/canvas/3.6/canvas-functionality/marketing-pages) [NextRoles & Permissions](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions) Last updated 4 years ago Was this helpful? Your Canvas template is installed with several pages that provide login, account, and admin functionality. However, your template can be extended far beyond this by taking advantage of dozens of prebuilt Bubble pages and blocks available to you in the Canvas library. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules#installing-the-chrome-extension) Installing the Chrome Extension In order to be able to add Bubble pages and blocks to your Canvas template be sure to . With the Canvas Chrome extension installed, in your Bubble editor you will now see a vertical blue button floating on the right side of your screen that says 'Open Canvas'. Click to open a full height module along the right of your editor that contains functionality for Adding a new page, Adding a new block, and Updating your apps colors. View a list of all pages and blocks available through Canvas ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules#adding-a-new-page) Adding a new page With the Canvas extension open, click on 'Add a new page' to open the library of Bubble page templates. Select the page you would like to add and click the '+ Add page' button. The unique path entered here will also be the name of your new Bubble page. When creating your page, Canvas will also create a corresponding option in the . You will need to set this option up with the correct privacy and role permissions for each Bubble page you create. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules#customizing-your-page) Customizing your page Some page templates will include a page-level group with a collapsible image banner, title, description, and toggle tabs. This group should be used when you want to further customize a page. * To show an image banner, unhide the placeholder group by checking the box for _This element is visible on page load_ and change the group's style to an empty style. Change the background of the group by selecting a background type and entering the relevant fields. * Show or hide the other UI components in the Page Flair group to fit your needs. Your page is now a fresh canvas ready to go. Start building it out by adding blocks from the Canvas library! ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules#adding-blocks-to-the-page) Adding blocks to the page To add a block, open the extension and select 'Add block to page' from the home screen. The library of Canvas blocks already contains dozens of Free and Premium options and we are constantly adding new options to the list. Click the '+ Add block' button to start building out your page. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules#setting-up-blocks-you-have-added) Setting up blocks you have added Adding blocks using Canvas Pages is only the first step to extending the functionality of your app. In order to make the most of the Canvas blocks, you need to modify these blocks in a few different ways: * Adding or modifying actions on buttons * Changing data sources on repeating groups or elements with data sources * Filling out content on groups * Linking content on groups to data types * Linking blocks to portal tabs (show/hide based on what user selects) #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules#customizing-block-title-group) Customizing block title group Most blocks will include a standard title group. This group includes common UI components such as a title, dropdown, toggle tabs, description text, sort dropdown, filters, and a 'new' button. The dropdown, toggle tabs, and description/results text are within three separate collapsible groups. You can set any of those groups to be visible or not visible on page load. #### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules#example-of-setting-up-functionality-between-two-blocks) Example of setting up functionality between two blocks Add the following blocks to your page * Reviews Repeating Group (Image, Text, and Rating) * Rating Popup Select the ADD button named 'Button solidPrimaryMediumBody14pt' and name it something that make sense to you like 'Button Add Rating'. Press the Start/Edit workflow button in the property inspector and add an action to Show the element Popup ratingPopup. Preview the page and check that the ratings popup is shown when you click the Add button. Voilà! You've finished creating a page with two different types of blocks and linked those two blocks together. Nice job! While most blocks will take more configuration than the above example, especially if you're setting up forms with many inputs or more complex functionality, that is outside the scope of this manual and can be learned by learning Bubble well. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/pages-and-modules#adding-blocks-with-functionality) Adding blocks with functionality Some blocks in Canvas already have functionality that is preconfigured for your app. Adding these blocks to your app is another way to quickly extend the template. A is a group of Bubble elements arranged in a way that is responsive, cohesive with Canvas design standards, and has some functionality that you can use in your app. More complex blocks also require some customization as well as specific data types and fields to be added to your application in order to work properly. Please see the for these blocks to learn how to set them up. The and blocks are both examples of Canvas elements with functionality that has already been setup. You can find in depth documentation on all the [documentation](https://docs.airdev.co/canvas-pages-and-modules/v/2.0.0/modules/comments-thread) [Comments](https://docs.airdev.co/canvas-pages-and-modules/v/2.0.0/modules/comments-thread) [Chat](https://docs.airdev.co/canvas-pages-and-modules/v/2.0.0/modules/bottom-input-chat-widget) [Canvas Pages & Blocks here.](https://docs.airdev.co/canvas-pages-and-modules/v/2.0.0/) [install the Chrome extension](https://chrome.google.com/webstore/detail/canvas-by-airdev/apmembkcpmjhmecifhckdidppfoiajie) [here](http://canvas.airdev.co/library) [block](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#modules) [Bubble Pages option set](https://docs.airdev.co/canvas/3.6/canvas-functionality/roles-and-permissions#the-bubble-pages-option-set) Page Flair Group Editor view with all groups visible Page Flair Group with page title and description visible Page Flair Group with page title, description, and toggle tabs visible Page Flair Group with image banner, page title, description, and toggle tabs visible Title Group Editor view with all groups visible Title Group with Category dropdown visible Title Group with Toggle tabs visible Title Group with Description/Results text visible Create an action to show the ratings popup block Ratings popup is shown when the ADD button is clicked ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJStXpwu0s1YsYBSc4%252Fp2.png%3Falt%3Dmedia%26token%3D382a6f6c-2fa4-490d-b056-6b19aa31d21c&width=768&dpr=4&quality=100&sign=7bc3ae68&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJSolf2_BMbmmOUxpB%252Fp1.png%3Falt%3Dmedia%26token%3D0d2a6c93-7902-489f-bafc-00ac6868e94a&width=768&dpr=4&quality=100&sign=57db2fbb&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJSxhtKvC46TO3PLK3%252Fp3.png%3Falt%3Dmedia%26token%3D0c53bfbe-a58b-4396-839a-9e626267161f&width=768&dpr=4&quality=100&sign=e6f6f508&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJUbJZXMw8S3ibE3AD%252Ft1.png%3Falt%3Dmedia%26token%3D52ef5087-03b9-4ece-985f-0e50d57e9ff8&width=768&dpr=4&quality=100&sign=26510779&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJT1jQHqlk2kVYecX8%252Fp4.png%3Falt%3Dmedia%26token%3D981c363e-6328-4e5a-a1e8-57d286f4fd3b&width=768&dpr=4&quality=100&sign=a35d9876&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJUfcxRyjh1cecjWH2%252Ft2.png%3Falt%3Dmedia%26token%3D6e53458e-41e2-4e88-83ef-37732662f2a5&width=768&dpr=4&quality=100&sign=dd633a50&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJUjYR71g3SoezrtbC%252Ft3.png%3Falt%3Dmedia%26token%3Debccb236-5cc7-4613-a19f-7a9fbf502547&width=768&dpr=4&quality=100&sign=9ce6ad86&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJUmPpY68KDMSJtrk7%252Ft4.png%3Falt%3Dmedia%26token%3Ddc150a9e-d95b-47fa-b1b0-6fec970498ec&width=768&dpr=4&quality=100&sign=b1290656&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MKapwLrwcRh1ksPffsf%252F-MKasRPcE4AT6DiaKbSh%252Fimage.png%3Falt%3Dmedia%26token%3Dceb8a64d-8c54-46dd-ab68-07c1fc632759&width=768&dpr=4&quality=100&sign=4a28dcb1&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MKapwLrwcRh1ksPffsf%252F-MKasw_4HSL9iZOt-mRI%252Fimage.png%3Falt%3Dmedia%26token%3Dfa652f75-5ed3-4b11-822f-36b21305fa5c&width=768&dpr=4&quality=100&sign=8b34f67&sv=2) --- # Roles & Permissions | Canvas Documentation [PreviousBubble Pages & Blocks](https://docs.airdev.co/canvas/5.3/canvas-functionality/pages-and-modules) [NextMenus & Navigation](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation) Last updated 11 months ago [](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#the-role-option-set) The 'Role' option set ------------------------------------------------------------------------------------------------------------------------------- Included in your Canvas template is an option set named Role that is used to manage the user permissions for your application. See below. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#display-attribute) Display attribute This text is what is shown in the admin portal and throughout your application to display the role of a user. Since the 'account' page lets a user manage their login credentials and profile data, you will typically want to add every role you create to the Account page's list of roles ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#default-roles) Default Roles Your Canvas template has two user roles preconfigured for you but you can add as many roles as you need to meet your applications needs. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#the-app-admin-role) The App Admin Role Redirects and permissions are predefined in your template that will automatically direct a user assigned the App Admin role to the admin portal when they are logged in. Privacy conditions are in place as well that will prevent any user without the App Admin role from being able to view the admin portal. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#the-standard-role) The Standard Role This role represents any default user on your platform that does not need access to the admin portal ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#adding-a-new-role) Adding a new role To add a new role: * Add a new option to the Role option set (e.g. Account Admin or Outside Sales) * Add the new role to any Bubble Page option that the role should be allowed to access * Assign the Role to Users, usually through one of these methods: * Assign the new Role to users manually in the Bubble Editor's Data tab * Build the logic to let App Admins sign those Users up from the admin page * Build the logic to assign the new Role to the Users when they're signed up * \[Optional\] Create a new header for the role and set the menu and navigation items to display for the role () [](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#the-bubble-pages-option-set) The 'Bubble Pages' option set ----------------------------------------------------------------------------------------------------------------------------------------------- This option set is used to manage a user's permission to view a specific page. When you use our Canvas chrome extension to import a page, we automatically create an option under the 'Bubble Pages' option set for you. If you manually create a new page or duplicate an existing page in your app, please make sure to add the new page to 'Bubble Pages' option set. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#display-attribute-1) Display attribute In the header element is a workflow that checks whether the current users role is allowed to access the current page. This is done by checking the page name in the url against the page names listed in this option set. For this reason, it is imperative that the Display text matches exactly the page name shown in the editor. If you change the name of a Bubble page, don't forget to update it here! ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#private-attribute) Private? attribute When checking for a user's permission to access a page, Canvas checks whether the page is marked as private. If this attribute is set to yes, the user will only be allowed to view the page if this option's List of Roles contains the current user's role. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#roles-attribute) Roles attribute This is a list connection to the Role option set. Any user role that should be able to access this page should be added to this list. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#page-redirects) Page Redirects ------------------------------------------------------------------------------------------------------------------- As a best practice we recommend using the index page of your app as the default page to which a user is redirected when the user doesn't meet privacy rules for a specific page. This gives you a single place to manage all the redirects for your application for each type of user role. In the standard Canvas Template the Index page redirects users to the Admin Portal page if they are logged in as a user with an App Admin role . Otherwise they will not be redirected away from the Index page. If you create a new page to which a specific role should be redirected, you can add additional actions to the above workflows. For more details on how they are currently set up or how to add conditional redirects see our complete reference for the While Canvas provides you a great way to manage user permissions and page redirects at a high level you should always create the appropriate to protect your data within the Bubble editor. [privacy rules](https://manual.bubble.io/working-with-data/privacy-and-security) [Default Roles](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#default-roles) [Index page.](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages#index-page) [read more](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#telling-canvas-which-header-to-display) The Display text should match the page name shown here exactly Default redirects set up on the Canvas index page ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2Fmp86VBgrpYEJOcEUdl8l%2Fimage.png&width=768&dpr=4&quality=100&sign=6381bec1&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2Feo8RNZOi51s516gnyl9C%2Fimage.png&width=768&dpr=4&quality=100&sign=eabe4c98&sv=2) --- # Speed | Canvas Documentation [PreviousSEO](https://docs.airdev.co/canvas/3.6/using-bubble/seo) [NextModularity](https://docs.airdev.co/canvas/3.6/using-bubble/modularity) Last updated 4 years ago Was this helpful? You're deep in developing your brand new Bubble app and start testing it, only to find out that some parts of it are running painfully slow. You're cursing Bubble under your breath and/or increasing your app's capacity (and your Bubble bill) by 10x. We've all been there and the answer is usually refactoring/optimizing your application, which can often turn the most sluggish of applications into a lightning fast one. On this page we explain some ways to do that. To optimize the speed of a Bubble app, you have to think like Bubble. That means that you have to try to understand what operations Bubble is doing in order to achieve your desired result. When building a dashboard or portal page (e.g. AirDev's Canvas admin portal), structuring the logic to efficiently fetch the correct data can have a huge impact on application speed. [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#minimize-eliminate-advanced-filters) Minimize/eliminate advanced filters ------------------------------------------------------------------------------------------------------------------------------------- Advanced filtering is a powerful feature in Bubble, but it can cause massive slowdowns for your users if you're not careful. As of January 2020 Bubble performs advanced filtering operations client-side, which means they are done on the user's browser instead of Bubble's servers. To do that, the browser has to first download all of the records that need to be filtered and then filter them. Let's look at an example In this example, we need to find all of the users whose email address contains a certain text, which in this case is pre-defined as "airdev". If we do this using advanced filters, the application will download a batch of users into the browser, check if they match this condition, and download another batch if the matching users don't fill up the repeating group. Depending on how many users you have, that could take a long time - in this case on an app with 900 users, it downloaded around 300 users onto the page, 4mb of data, and took 20 seconds longer than it normally would to load the page. If the list you are filtering contains a small number of objects (roughly 2-100 objects), advanced filters can still execute relatively quickly. An easier solution is to assign a yes/no field on the User object like "AirDev email", and then include that as a criteria in the search expression. If your app has advanced filters and you can't figure out how to remove them, consider adding more fields directly to the object that you are filtering for. This takes a bit of work and is more advanced - you need to add new fields to that object, update the app logic to save new data to these new fields, and set up an API workflow that will calculate or update that field's value for all of your existing app data. In the long run, this will be worth it due to the speed boosts for your users. Advanced filtering is rarely scalable if the list that must be filtered will eventually contain hundreds or thousands of items. [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#minimize-eliminate-nested-searches) Minimize/eliminate nested searches ----------------------------------------------------------------------------------------------------------------------------------- Let's imagine a data structure where there is a single `Project` that has multiple `Message Threads`, each of which has multiple `Messages`. If you want to find all messages within a particular project, you may want to do a search like the one below, where you find all messages that belong to threads that are linked to a project. However, this nested search (search inside a search) will take longer because Bubble first has to find all of the threads that belong to a project and then find all of the messages that belong to one of those threads. Alternatively, you could link each `Message` object directly to the `Project` object, which seems redundant (as you can always reference `Message's Message Thread's Project`) but also allows you to make your search more direct and thus faster. Coincidentally, this technique also makes setting up Privacy Rules easier (as Bubble is a bit restrictive when it comes to the types of rules that you can set up). [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#make-sure-your-apps-privacy-rules-are-set-up) Make sure your app's privacy rules are set up -------------------------------------------------------------------------------------------------------------------------------------------------------- We can't overstate the importance of solid privacy rules in your application. The primary reason is to keep your data secure. A side effect is that this may speed up your app. **If you have tight privacy rules, the amount of data that will ever be sent to your browser is always limited by those privacy rules.** Think of this as a performance safety net - even if you mess up somewhere else and set up a search expression to download more items than it needs to, the search's results may be restricted due to privacy rules. This is mostly relevant if you're doing some operation on these items or if they're displayed in a repeating group. [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#move-lengthy-actions-to-api-workflows) Move lengthy actions to API workflows ----------------------------------------------------------------------------------------------------------------------------------------- Sometimes you may need to have really long workflows, with lots of actions, like the one below: Such a workflow may take a while, especially if it involves things like external API calls, making changes to/copying a list of things, or complex searches. An easy solution is moving a part of the workflow to be an API workflow instead. That way you just need to execute the part that has to happen right on the page (charging the user in this case) and then pass whatever parameters are needed to the API workflow that lives on the server side. The other benefit of this approach is that it makes things more modular - you can now call that same API workflow from a different part of the application without having to rebuild its logic. [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#dont-accidentally-ignore-empty-constraints) Don't accidentally ignore empty constraints ---------------------------------------------------------------------------------------------------------------------------------------------------- What's wrong with this search? The issue there is that `Ignore empty constraints` is checked and the `email` field is set to the value of `Group email`, which means that if `Group email` is ever empty, the search will ignore the email constraint and will return ALL of the users in the database. There are a few ways to remedy this: 1. Don't use `Ignore empty constraints`. This is the easiest but is also sometimes bad advice because this feature can keep your search expressions cleaner. For example, if you have a repeating group that you want to show all of the users and a search box on top of that repeating group that the user can enter a keyword in to filter the repeating group, you can use the `Ignore empty constraints` option to get away with using a single search expression for the repeating group. 2. Make sure that the constraint is never empty. This is harder to do than it seems - in the example above, we can set `Group email's` value `When page is loaded` but, if you do that, there will be a split second before the page is loaded, when the group is empty. And during that time your repeating group may try to load all of the Users into it, which will slow the entire application down. 3. Conditionally set the search expression only if the constraint value isn't empty, which ensures that the search is not performed until it's ready to be performed. [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#short-lists-are-faster-than-searches) Short lists are faster than searches --------------------------------------------------------------------------------------------------------------------------------------- Let's imagine that your database has an object called `Project` and an object called `Invoice`. Each project can have multiple invoices. The default database structure would be to create a `Project` field on each `Invoice` object and then `Do a search for Invoices where Project is equal x`. However, if you're looking to speed up your application a bit, you may want to create a `List of invoices` on each `Project` and refer to that list directly instead of doing a search. [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#but-long-lists-are-slower) But long lists are slower ----------------------------------------------------------------------------------------------------------------- The above only applies if the list is relatively small. Let's imagine a different scenario - you have an object called `Song` and an object called `Tag`. Each song can have multiple tags (classical, rock, etc.) applied to it. In this case we **wouldn't want to** store a `List of songs` on each `Tag` because that list may get very large and Bubble struggles working with large lists. Instead, we should have a field called `List of tags` on each `Song` and always perform a search for songs if we're looking to access songs that have a particular tag. [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#add-an-abstraction-for-searches-in-repeating-groups) Add an abstraction for searches in Repeating Groups --------------------------------------------------------------------------------------------------------------------------------------------------------------------- Any time you put something into a Repeating Group, you should keep in mind that whatever you put in there will happen multiple times, once per each row of the RG. Let's imagine that we are building a messenger and want to display a list of threads along with the number of unread messages in each thread (that is messages that are unread by the current user). Here's how we may structure that: The issue with the above is that in every single cell there will be a search that will occur. So if you have 100 threads, there will be 100 searches that will need to happen in order to display the correct number of unread messages on each line. A different way to do it is as follows: Add a Repeating Group somewhere on the page (can be hidden) which searches for all of the relevant messages that are unread by the user, like this: In each cell of the Message Thread repeating group, add an expression that filters the Messages repeating group down to only the messages that belong to the Thread in each cell of the RG. As the result, the search for unread messages now only has to happen (and be sent from the server to the client) once, at which point it's just filtered directly on the page, which is faster. [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#data-api-can-be-your-friend) Data API can be your friend --------------------------------------------------------------------------------------------------------------------- Sometimes you can use Bubble's Data API to do things faster. Let's imagine the following scenario. We are building a reminder app where, upon signup, each user has 30 Reminder objects created for them. There are 3 ways we can do that: 1. **Create all of the objects right on the page**. This approach will be messy and slow - you'll have to create objects one-by-one and also you'll have unnecessary workflows on the page. 2. **Create all of the objects through Schedule API workflow on a list action**. This approach will be much cleaner but the downside is that it will be both and _asynchronous_, meaning that you won't easily be able to know when the creation process is done and you also won't be able to refer to the list of objects created. [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#get-familiar-with-the-network-tab-of-chrome) Get familiar with the network tab of Chrome ----------------------------------------------------------------------------------------------------------------------------------------------------- 1. Open the Developer Tools console in Chrome by going to View -> Developer -> JavaScript console. 2. Switch to the Network tab. 3. Load the page, you'll see something like the below screenshot. 4. Sort by Size, so that the biggest things are at the top (see screenshot 1 below). 5. If you see items called "search" or "msearch" at the top, those represent searches that the application is doing. Click on one to inspect it. 6. Expand the data shown in the Preview tab until you see what data is being shown (see screenshot 2 below). [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#too-many-elements-can-cause-issues-too) Too many elements can cause issues, too -------------------------------------------------------------------------------------------------------------------------------------------- When your page is loading thousands of different HTML nodes in order to display the page or some data view, it can dramatically increase loading times. This is especially an issue when using repeating groups that can potentially contain large amounts of data (100+). To illustrate this: if these repeating groups render 20 HTML elements in each tab (a reasonable number for the Bubble engine), in order to display 50 data points you'll be rendering (showing) 1000 HTML elements on the page. These numbers are OK, but will result in a significant amount of time to load, especially if the user's device isn't very fast. When element rending can really get out of hand is using reusable elements inside of repeating groups. If that repeating group has a popup or menu inside of it, that group will be rendered in every single tab of the repeating group. For a data table with 3-4 different options that all require their own popup, some of which with several inputs, this could easily blow the number of elements rendered per tab out of the water (10 times as many elements, or more). To avoid this build pattern, you'll need to do one of the following: * Determine if any of those popups or menus are unnecessary, in which case they should be removed from the reusable element; OR * Put those popups directly on the page where the dashboard is found. You can trigger them from the reusable element via custom states on the reusable elements and "Do when condition is true" workflows on the target page. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#estimating-the-number-of-elements-loaded-by-a-repeating-group) Estimating the number of elements loaded by a repeating group In order to know whether your page has too many elements, it's necessary to actually find the number of elements on the page. This is relatively straightforward using the Chrome or Firefox javascript console. 1. Open the target page 2. Open the Chrome Javascript Console 3. Paste the following text into the Console when the page is completely loaded: 1. `document.getElementsByTagName("*").length;` 4. Press enter For reference, here are some measurements atken in this way: Webpage Number of HTML elements Default owner's portal (Dashboard) 609 Default owner's portal (Users table, 26 users loaded) 1592 airdev.co (AirDev landing page) 791 Google home page (google.com) 251 Facebook home page (logged in user, facebook.com) 4383 Twitter landing page (not logged in, twitter.com) 668 If you load one part of your page and then hide it, those elements are also counted in the number of HTML elements. ### [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#too-many-elements-slowing-down-the-editor) Too many elements slowing down the editor If you are experiencing **issues with speed in your Bubble editor** rather than or in addition to speed issues on user-facing pages, you may have too many elements on one page. This can be resolved by converting groups on that page to reusable elements - the Bubble elements inside of the reusables are not rendered inside of the Bubble editor, decreasing the number of things that need to be loaded in order to make changes to a page. After creating a reusable element, you may need to make changes to the logic for the element, if one of the following is true: * Elements inside the reusable were referring to other elements on the page (outside of the reusable). * Workflows inside the reusable were referring to elements on the page (that are now outside of the. reusable). * Some sort of "Do when condition is true" workflow was set up using elements inside the reusable. * Elements or workflows outside of the reusable were referring to elements that are now inside the reusable. [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#set-elements-to-hidden-by-default) Set elements to hidden by default --------------------------------------------------------------------------------------------------------------------------------- Another way to improve performance is to hide elements on the page when it is first loaded. The initial Bubble rendering will include less elements and the users will see the first content on the page sooner, as rendering each additional element takes time. A good example of when to do this is when you're building a page that has some sort of internal Tab navigation. When a page is loaded, only the navigation menu, header, and footer are loaded, and the page loads the content of the tab afterwards. It may seem more natural to set some view to be the default view on a page and to have it visible on page load, but this adds a flash of unneccessary content and increases page load times. [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#inspect-network-activity-for-broken-searches) Inspect network activity for broken searches ------------------------------------------------------------------------------------------------------------------------------------------------------- [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#boost-capacity-as-the-last-resort) Boost capacity as the last resort --------------------------------------------------------------------------------------------------------------------------------- If you've done everything possible and you're still getting warnings like the below, it may be worthwhile to add some capacity to your application. You can always experiment using Bubble's "boost capacity" feature first before paying for it. [](https://docs.airdev.co/canvas/3.6/using-bubble/speed#handle-delays-gracefully) Handle delays gracefully --------------------------------------------------------------------------------------------------------------- Have you followed the above recommendations but are still experiencing delays because of something that just needs a long time to execute? Make your users' experience more pleasant by letting them know what's going on or keeping them entertained while they're waiting: More information on privacy rules can be found . **Use the** **of the Data API**. This approach is the cleanest, fastest, _synchronous_, and will return the full list of objects created. You can use the Network tab of Chrome's Developer Tools to see how your page is loading and what's taking up the most time/space. You can read more about that but, in the meantime, here's a quick guide to seeing big searches: To find potential causes for slowness, it can be helpful to use a web browser's developer tools to examine what data is being downloaded to the page and when. [here](https://docs.airdev.co/canvas/using-bubble/bubble-best-practices/database#privacy-rules) [**bulk create functionality**](https://bubble.is/reference#API.get_api.bulk_create) [here](https://developers.google.com/web/tools/chrome-devtools/network/) [Here's a page that shows how to do that with Chrome.](https://docs.airdev.co/functionality-reference/resources/performance-and-privacy-rules-testing-with-chrome-devtools) Bad search (don't use advanced filters on big lists) Good design. Calculate this field's value when you assign a user's email address Bad design (inefficient) Good design This might take a while This would be much quicker Bad design (Depending on privacy rules) Good design (Safe without worrying about privacy rules) A search will happen in each cell Step 2: This RG will not perform any more searches but instead just filter the first RG. Screenshot 1: List of largest operations on your page Screenshot 2: What's getting downloaded with a single search operation Chrome Javascript console Most apps will hit 100% capacity at some point, so these warnings are common Our loading popup for the Algo tool ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LvXnC0GkYIQMh7C1u_N%252F-LvaoYPGqc4bZ2zV4zdv%252Fassets_-LZgeX5n5GW38BCost9m_-L_FDLsFHOJK9jlEWgLU_-L_FEU8rP5yrEnyyKNa__image.png%3Falt%3Dmedia%26token%3D44b53635-7616-4213-b245-bfa0efe3f0c8&width=768&dpr=4&quality=100&sign=4afb7200&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LvXnC0GkYIQMh7C1u_N%252F-Lvaoa7tSImuh-cjGfy6%252Fassets_-LZgeX5n5GW38BCost9m_-L_FDLsFHOJK9jlEWgLU_-L_FEbEIk3kkmXLcSDOw_image.png%3Falt%3Dmedia%26token%3Dfa293ace-ebd2-45a9-83aa-6ff0ddae326e&width=768&dpr=4&quality=100&sign=b8efeae3&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LvXnC0GkYIQMh7C1u_N%252F-Lvaod6bFq_vMbgrFqws%252Fassets_-LZgeX5n5GW38BCost9m_-L_J4WqinA9imXmU1GPl_-L_J6aHitByXdSNQbNa9_image.png%3Falt%3Dmedia%26token%3D30eb8b36-4978-4671-82cb-1751736a0f0b&width=768&dpr=4&quality=100&sign=aed37df0&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LvXnC0GkYIQMh7C1u_N%252F-LvaqHbMhtkXaVFyrqyy%252Fassets_-LZgeX5n5GW38BCost9m_-L_ENSCvi3CSRYn01hf5_-L_EO6SLpsXbyns9NLDN_image.png%3Falt%3Dmedia%26token%3D7c6a273e-e26b-4d66-b767-33b0a4acc51a&width=768&dpr=4&quality=100&sign=91dd94ba&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Lz7l0Z9aNsdVmW1hfCJ%252F-Lz7v852Um0dL8gZhJCh%252FScreenshot%2520from%25202020-01-21%252011-25-15.png%3Falt%3Dmedia%26token%3D86ef4400-2d87-4b0a-914c-b93ede08d4d4&width=768&dpr=4&quality=100&sign=490e7381&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LvXnC0GkYIQMh7C1u_N%252F-LvaomwVz6-CAMap2j9p%252Fassets_-LZgeX5n5GW38BCost9m_-L_J4WqinA9imXmU1GPl_-L_J7-tX279ylDL1wU8q_image.png%3Falt%3Dmedia%26token%3D1f8d8bea-6041-4427-ad97-bcb03eae1297&width=768&dpr=4&quality=100&sign=2ba8c754&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Lz7l0Z9aNsdVmW1hfCJ%252F-Lz7tmROwjhlyouGRIm6%252FScreenshot%2520from%25202020-01-21%252011-18-38.png%3Falt%3Dmedia%26token%3Dc666725f-62cb-4b8c-945e-8f57b6198cf8&width=768&dpr=4&quality=100&sign=bed54b71&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LvXnC0GkYIQMh7C1u_N%252F-LvapwpSRQFndPgGcwHg%252Fassets_-LZgeX5n5GW38BCost9m_-L_EgtlTD8atZu74EjAA_-L_EiRHCyJsRk3tRtCOu_image.png%3Falt%3Dmedia%26token%3D938e1ca3-48e2-445d-9a80-f90595f6d9d4&width=768&dpr=4&quality=100&sign=96a668b&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LvXnC0GkYIQMh7C1u_N%252F-Lvaq65N585uR7iT0-dk%252Fassets_-LZgeX5n5GW38BCost9m_-L_Eltp8m_bh77sqAezi_-L_EraxyN10fNeE8Ii8s_image.png%3Falt%3Dmedia%26token%3Ddcec01fd-ac76-4e41-8723-0f0bc631b989&width=768&dpr=4&quality=100&sign=b6d3d675&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LvXnC0GkYIQMh7C1u_N%252F-Lvapm8-NvaoENzJrY-D%252Fassets_-LZgeX5n5GW38BCost9m_-L_ENSCvi3CSRYn01hf5_-L_EO0UiTcoANn_64G-j_image.png%3Falt%3Dmedia%26token%3Db22c4402-e174-4a68-9e15-15e0a162597e&width=768&dpr=4&quality=100&sign=f72146b8&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LvXnC0GkYIQMh7C1u_N%252F-Lvaq9MQDT5X8b_oqGmm%252Fassets_-LZgeX5n5GW38BCost9m_-L_Eltp8m_bh77sqAezi_-L_Er-k7RxYR4BK56Y2m_image.png%3Falt%3Dmedia%26token%3De9c8fa49-784a-4441-9024-2a13843e5d10&width=768&dpr=4&quality=100&sign=3ee9d615&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LvXnC0GkYIQMh7C1u_N%252F-Lvaq-K94g3e7NLFwLIp%252Fassets_-LZgeX5n5GW38BCost9m_-L_EgtlTD8atZu74EjAA_-L_Ehx-0898F-gE3Pvs6_image.png%3Falt%3Dmedia%26token%3D8a57c5d1-0453-4f27-877e-372a6eb1a338&width=768&dpr=4&quality=100&sign=c381b3f3&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Lye_nvXThO0Y6wx-Q1o%252F-Lye_nvZa5UWOlOxL0rx%252Fnumber-of-elements.PNG%3Falt%3Dmedia%26token%3D4e8f189d-9927-49a6-936b-d7cb7dd0bfef&width=768&dpr=4&quality=100&sign=1afe62ff&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LvXnC0GkYIQMh7C1u_N%252F-LvaqDvU5D3c_GSANACC%252Fassets_-LZgeX5n5GW38BCost9m_-L_Eltp8m_bh77sqAezi_-L_EpzxxCAqknvFVeYHm_image.png%3Falt%3Dmedia%26token%3D665a97fc-1e51-4205-8b6c-431c03a596b0&width=768&dpr=4&quality=100&sign=67bc6a1b&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LvXnC0GkYIQMh7C1u_N%252F-Lvapt4LrKh25zLE8RwT%252Fassets_-LZgeX5n5GW38BCost9m_-L_ENSCvi3CSRYn01hf5_-L_EPrN4hmEO84QQKePl_image.png%3Falt%3Dmedia%26token%3D4eea4b5e-c1cb-440d-aaeb-4950028aad5b&width=768&dpr=4&quality=100&sign=32948a27&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-LvXnC0GkYIQMh7C1u_N%252F-Lvapqslmi-_elG9cMXx%252Fassets_-LZgeX5n5GW38BCost9m_-L_EQgKv34nAZdyQZwbU_-L_ERFX1hpgRtNQPjgBi_image.png%3Falt%3Dmedia%26token%3Da4722284-aeee-4fca-ba5c-d00ea5c283c2&width=768&dpr=4&quality=100&sign=5f0b124f&sv=2) --- # Loading screen | Canvas Documentation [PreviousSet up Payment info on Account page](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/set-up-payment-info-on-account-page) [NextConfiguring multiple languages](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/configuring-multiple-languages) Last updated 11 months ago The loading screen element allows you to display a loading animation while your page's elements and data are being loaded beneath. You will want to include this on every page where you want this behavior. The element can be found under **Visual elements**. Simply drag it on to the page in order for it to be active. No matter how large the element is, it will always take up the full width of the page. Make it 1x1 pixels and place it in the top right corner of the page to avoid responsiveness issues. The properties panel provides several options for customizing the behavior and appearance of the loader. There are two ways in which you can use the loading element. **1.** **Display by default on page load** If the element is set to be visible on page load, a loading screen will appear on the page until you explicitly hide it. In order to have it disappear once the page's elements are loaded, you can either: 1. Create a workflow which is triggered when the page is loaded & loaded above the fold. Attach the **Hide loading screen** action. 2. Check the loading screen element's **Auto close** option **2\. Manually set when to show/hide the loader** Under Workflow actions > Plugins, you have two loader actions, one to show the loader and one to hide it. Use these to show the loader while specific workflows are firing (i.e. while making bulk changes to a list). ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/loading-screen#customizing-the-loader-style) **Customizing the loader style** Copy **Updating the loading screen text** Modify the code in the loading screen element's text field to tweak the font size, color, weight, line height, and description. Copy

Please wait

Setting up your portal

**Updating the animation** You can change the loader animation by pasting in a new animation json URL from (requires signup). Adjust the width and height in the code below to modify the size of the animation. [lottiefiles.com](https://lottiefiles.com/search?q=loader&category=animations) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FU1OqlWGTrTOqKIyB9mPZ%2Fimage.png&width=768&dpr=4&quality=100&sign=ea8e8e8e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FEnNOS6u4K71iXHOeoIdO%2Fimage.png&width=768&dpr=4&quality=100&sign=5a4a345e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F8qnw2sKpNHrKHL0tC6oS%2FScreen%2520Shot%25202021-06-10%2520at%252011.58.34%2520AM.png&width=768&dpr=4&quality=100&sign=32dc582e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FwcoSJ2znv9BhTTGHVFHA%2FScreen%2520Shot%25202021-06-10%2520at%252012.49.54%2520PM.png&width=768&dpr=4&quality=100&sign=80e1a1c9&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FeIQt0Q9mIlYq2pguOSZL%2Fimage.png&width=768&dpr=4&quality=100&sign=5b2baea8&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FOKjbc30oyGXNEQt5UWhn%2Fimage.png&width=768&dpr=4&quality=100&sign=fa6ae717&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FqFoOxuVgVpQKzcCP2cjx%2Fimage.png&width=768&dpr=4&quality=100&sign=2826f331&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FxYgJOvhWjw2PQ0NiXM6q%2Fupdating%2520screen%2520loader%2520animation.gif&width=768&dpr=4&quality=100&sign=21d40510&sv=2) --- # Emails & Alerts | Canvas Documentation [PreviousData & Workflows](https://docs.airdev.co/canvas/3.6/canvas-functionality/data-and-workflows) [NextMiscellaneous](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous) Last updated 3 years ago Was this helpful? Canvas does not use Bubble's native 'send email' action for sending emails from your application. Instead we have integrated with Sendgrid and Postmark to send transactional emails using a beautiful HTML template. There are several key benefits to using SendGrid or Postmark: * Send email from your own domain name (e.g. [\[email protected\]](https://docs.airdev.co/cdn-cgi/l/email-protection) ) * This is great for branding and can potentially help with spam filters * Access to advanced email metrics to measure the success of your email marketing * With our Sendgrid integration, you can of your account to see these metrics. * The same goes for our Postmark integration. Check Postmark's dashboard for more statistics on and email activity logs. * Send attachments with your emails * Customize the email's design with html directly in your Canvas admin portal To use this template you will need to take some steps to set up the integration with SendGrid. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#setting-up-your-email-integration) Setting up your Email integration ----------------------------------------------------------------------------------------------------------------------------------------------------- [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#sendgrid) Sendgrid --------------------------------------------------------------------------------------------------- As of April 6, 2020, Sendgrid began requiring new accounts to verify any email address from which you will be sending communication through the SendGrid API. This is to prevent using the SendGrid platform for spamming or phishing activities. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#get-your-sendgrid-api-key) Get your Sendgrid API key Click on the blue button in the top right hand side of the screen called Create API Key. You can name the API key anything so it's best to choose a name that that makes sense to you. Select the Full Access option and click the Create & View button. Copy the API key that is displayed in the next screen. Sendgrid will only show this API Key to you once so make sure to save it somewhere safe that you can access later if needed. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#setup-sendgrid-in-plugin) Setup Sendgrid in plugin Now that you have your API key, open the Bubble editor for your app and navigate to the Plugins tab from the left menu. Click on Sendgrid to open the plugin settings. Paste your Sendgrid API key into the 'API Key' field. If you would like to keep the email stats from the development site and your live site separate, go through the steps for creating an API key in Sendgrid again and paste the second key into the 'API Key - dev' field. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#postmark) Postmark --------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#get-your-postmark-api-key) Get your Postmark API key Postmark's free tier allows 100 emails per month per account. This is much less than SendGrid. Postmark's email deliverability rate has been reported to be higher than SendGrid's (less likely to be marked as spam) due to higher standards for quality email sent by Postmark's users, and lower tolerance for users sending out messages marked as spam. * Copy the Account API Token into your Bubble app's plugin * Copy the Server API Token into your plugin. Use the server name "My first server" if you haven't created any custom servers. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#setup-postmark-in-plguin) Setup Postmark in plguin [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#add-your-apps-admin-email) Add your app's Admin email -------------------------------------------------------------------------------------------------------------------------------------- The admin email address set in the portal is the one that will be used to send all emails from your application. To set this up, login to the Admin portal and navigate to Settings > Outgoing email. This will open the Enable outgoing email popup. Below is a GIF that displays each of the steps to adding an email to your Canvas app. You must to be logged in to Sendgrid in the same browser that the verification email is opened in order for the Single Sender email verification process to work. This is not the case for Postmark. Go to the inbox for the email you just entered. You should have an email from SendGrid or Postmark asking you to verify your Single Sender email address. Click the button to verify. Once you have verified your email, go back to the admin portal and click on 'Outgoing email' in settings again. Click the 'I've verified my email' button. Canvas will check the verification status of your email with Sendgrid or Postmark and you will see a message saying your email is verified and ready to go. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#migrating-to-postmark-on-old-apps) Migrating to Postmark on old apps Using older Canvas apps, it is possible to upgrade the SendGrid plugin to use the new Postmark flow. Doing this will require you add a text field called "Email provider" to your website object, and saving the value "Postmark" to that field. This data source should be added to your app anywhere that emails are sent, so that they are sent through Postmark and not SendGrid. This process is a bit tricky and must be done anywhere in the app that one of the plugin's actions is used, so be sure to use the Bubble editor search tool and update each individual action. Note that the flow to assign an admin email in the admin portal is integrated with SendGrid, and the workflow actions there would need to be updated to work with either SendGrid or Postmark, depending on the Website's email provider field. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#email-templates) Email templates ----------------------------------------------------------------------------------------------------------------- Your Canvas template will come with 5 standard email templates that can be customized to meet your needs. These templates can all be managed centrally from the Admin portal by navigating to the Emails tab from the left menu. **Email verification** This is sent to the user to confirm their email address when 'Require email verification during signup' is toggled to yes in Settings > Manage user sign up flow. This template cannot be deactivated at the template level. **New admin** This email will be sent to new App Admins you invite from the Users tab to help you manage your app. Do not remove the \*RESETLINK\* merge term on this email as that will remove the link that allows them to create their password. This template cannot be deactivated as it is integral to adding additional admins to your application. **New admin notification** Sends a notification to all existing admins when a new admin is added to the app. **Reset password** Any time a user click on 'Forgot Password' and requests a new password reset link they will receive this email. This template cannot be deactivated as a user should always be able to reset their password. **Welcome email** If this template is active it will be sent to any user who signs up welcoming them to your platform. **Sample email** This is a sample email that is available to give you a head start on expanding your email templates. Simply click 'Duplicate' in the dropdown menu to duplicate this email and start customizing! ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#adding-an-email-template) Adding an email template You can add a new template in two ways. * **Add new template** To start from a blank slate, click the '+ Add new template' button to create a new email template. * **Duplicate an existing template** You can duplicate an existing template by opening the action menu from the ( ⋮ ) button and clicking the 'Duplicate' option. It is typically simpler to duplicate an existing template as you are not starting from scratch. Whichever way you add a new template, the following steps must be completed before the email template can be used. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#create-update-the-template-content) Create/Update the template content In the edit popup are are two tabs **EMAIL SETTINGS** Here you will update and manage the overall settings for your email template * **Template name** (required) This is how the email template is identified in all front end UI. * **Template folder** (required) For new templates, this will default to the General folder. If you are duplicating an existing template, this will default to the same folder of the template that has been duplicated. To manage the list of folders, click `Edit folders` . In the event you delete a folder that other email templates are assigned to, those templates will be reassigned to the General folder * **Description** (required) Brief description of how this email template is used. It's not unusual for an app to have many similar emails so be as specific as possible with your descriptions. You will thank yourself later! * **Template mail merge terms** (optional) This is a list of texts that represent the mail merge terms being used for that specific email template. Only the mail merge terms actually included in the subject, body, or signature of the email will be used but this is a great way to keep track of which terms you are using as a quick reference when you are setting up or updating the template workflow. * **Include a button in this email** (optional) If this element is checked we will display the UI for inputing the button text you would like to show in the email. * **Subject** (required) Create the subject line for your email. Can be dynamic by using mail merge terms as well. * **Body** (required) Use mail merge terms and create a fully customized email by using HTML formatting in the body of your email. Check out the _**Sample email content**_ template for a quick view on how to use HTML tags in your email. * **Button** (required if visible) Set the button text to display in the email. Please note you will still need to manually set the link for this button from the editor in the Send Email action. A **mail merge term** is simply a placeholder text within asterisks (_e.g., \*FIRSTNAME\*_ ) that is replaced with dynamic content when the email is sent. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#set-the-id-for-the-template) Set the ID for the template The Email template data type contains a field called 'ID\_name' that is used to identify the template with a rememberable unique ID when searching for the template in the database. This field must be edited from the database in the editor and should be unique and contain no spaces (_e.g., uniqueID, unique\_ID, etc_) If you change the ID\_name for an email template after it has been setup, don't forget to update the id in any template workflows to send that email. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#create-a-template-workflow) Create a template workflow A corresponding workflow will need to be created for each email template to set up the mail merge terms. Canvas offers two ways to handle this: 1. **SEND USING FRONT END WORKFLOWS** The default emails in Canvas are sent from the front end. **Pros:** Does not require a paid Bubble plan to send custom HTML emails **Cons:** Less robust when it comes to scheduling emails for the future **Setup**: Open the reusable element 'email\_workflows', duplicate the workflow named 'template - send email action' and rename it to match your email template. 2. **SEND USING BACKEND WORKFLOWS** **Pros:** Supports complex email templates and more robust scheduling options **Cons:** Requires a paid Bubble plan to use **Setup**: From the Emails folder in the backend workflows, duplicate the workflow named 'send\_email\_template' and rename it to match your email template. The standard workflow actions for setting up the template is the same regardless of how you have decided to send your emails. By default a User thing will be the only data being used but consider the content of your email and note the data necessary to customize the email when it is sent. Additional data can be passed through parameters in the backend workflow. If sending emails from the front end, additional data can be passed by setting custom states on the email\_workflows element. **Action 1:** Make changes to Email template variant... This step is used to find the correct email template variant for this workflow and can later be referenced as Result of Step 1. Click on the blue search text and change the text 'template_\__name' for the ID\_name of your email template. **Whoa!** What is an Email template variant?! Each Email template will have at least one variant that holds the content of the email. When using a single language setup, there will be only one variant per template which will use the default language of the app. However, when using a multi-language setup we create a new variant for each language you add to the template and then search for the variant that matches the current user's selected language. **Action 2:** Make changes to Website... This step is used to find the website data for your application and can be referenced as Result of Step 2. **Action 3:** Send basic email This action is already preconfigured to use the email template you set in the first action. Generally you will need to simply update the button action and the mail merge terms at the bottom of the editor. Here's a quick overview of the options available. * Emails * To, CC, and BCC emails can have multiple static or dynamic values as long as each email is separated by a comma. * The From email must be a verified email in your Sendgrid account * Subject should be set to the email template's Subject text * Body should be set to the email template's Body text * Signature should be set to the email template's Signature content * Logo * The dynamic image is preset to use the logo set in the admin portal. If set the static image will be used if no dynamic image is available. * Button * Customize the button text and link for each email. * Mail Merge * Define the values for your all mail merge terms by inputting the mail merge term in the 'key' field and the value it should be replaced with in the 'value' field. * To add additional mail merge terms click on the the '+ Set another key/value' button Merge terms can be used in the following locations: Subject, body, signature, from name, reply to name, and button text [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#sending-an-email) Sending an email ------------------------------------------------------------------------------------------------------------------- To send an email from your app: * From the backend use the action 'Schedule API Workflow' * Add the 'Send basic email' action directly into any workflow to send an email for which you do not need a template. [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#alerts) Alerts ----------------------------------------------------------------------------------------------- Showing toast notifications goes a long way in keeping your users feeling confident in the actions they take like saving changes or adding an item to their cart. The Canvas AirAlert plugin provides three actions that can be used to manage these notifications. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#airalert-standard) AirAlert - Standard This is the action you should use for most of your notifications and has predefined settings for Success, Warning, Error, and Information alerts . If you would like to customize the background and font colors for these alerts they can be updated by navigating to Plugins > AirAlert in the Bubble editor. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#airalert-clear-all) AirAlert - Clear all Run this action to close all alerts that are currently visible to the user. ### [](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#airalert-custom) AirAlert - Custom While AirAlerts work in all modern browsers (Safari, Chrome, IE Edge, Firefox, Opera, and more) they do not work in Internet Explorer. You can either verify up to 25 single email addresses or verify a domain. Learn about both options . Go to and sign up for a free account. Once you are signed in you will be directed to the Sendgrid dashboard. Navigate to Settings > API Keys in the left menu to Create a Postmark account with the first step in this process. Postmark has a that includes more steps than what are required to use our plugin, but which we recommend that users complete in order to maximize email deliverability and minimize the number of emails that end up in spam boxes. Visit the to get the following 2 API tokens: To track different stats on development and live emails, and use the API credentials for that server in the "Postmark Server API Token - dev." key. The 'Add SendGrid API key to the Bubble editor' should be checked. If it is not, go back through the step to or Setup the Postmark plugin. Enter your email address into the input and click 'Verify'. This will trigger the process with Sendgrid, or the . While each email template can be created and edited from the Admin portal, the workflow actions and mail merge terms must be set up manually. See **EMAIL CONTENT** From the tab you can control the all the content for your email template. By default you will be editing the English version of your email. However, if you have turned on the in Canvas you will be able to add other language variants to your email from here. **Signature** (optional) You have the option to customize your email signature here. If left blank we will set this to `- The *APPNAME* team` using the application name you set . From the frontend, place the reusable 'email\_workflows' in the and use the action 'Trigger a custom workflow from a reusable element' With this action you can customize all the attributes of the the alert directly in the property editor for the action. This is useful for one-off use cases where you need to simulate a specific look but takes more time to set up than using the action. [here](https://sendgrid.com/docs/for-developers/sending-email/sender-identity/) [sendgrid.com](https://sendgrid.com/) [create your API key.](https://sendgrid.com/docs/ui/account-and-settings/api-keys/#creating-an-api-key) [guide to getting started](https://postmarkapp.com/support/article/1002-getting-started-with-postmark) [API Tokens page](https://account.postmarkapp.com/api_tokens) [set up a second server in Postmark](https://postmarkapp.com/guides/how-to-manage-multiple-customers-with-postmark) [Single Sender verification](https://sendgrid.com/docs/for-developers/sending-email/sender-identity/) [verification process with Postmark](https://postmarkapp.com/support/article/846-how-can-i-send-on-behalf-of-my-users) [hidden variable popup](https://docs.airdev.co/canvas/v/3.6/canvas-functionality/data-and-workflows#using-the-hidden-variables-popup) [Setup the Sendgrid plugin](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#set-up-the-sendgrid-plugin) [Create a Template Workflow](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#create-a-template-workflow) [AirAlert - Standard](https://docs.airdev.co/canvas/3.6/canvas-functionality/emails-and-alerts#airalert-standard) [check the Sendgrid dashboard](https://app.sendgrid.com/) [user engagment](https://postmarkapp.com/) [here](https://docs.airdev.co/canvas/3.6/canvas-functionality/branding-and-design#name) [multi-language functionality](https://docs.airdev.co/canvas/3.6/canvas-functionality/miscellaneous#configuring-multiple-languages) Exchange 'template\_name' for the ID\_name of your email template \*MERGE\_TERM\* is replaced with the dynamic value Options when triggering the Standard alert ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MZruKXErIlvLq2wc-Ux%252F-MZs3CWK_8bf31i-vDWy%252Fsendgrid-pm-plugin-keys.png%3Falt%3Dmedia%26token%3D9ef4f6de-5069-4825-844f-f4e69f0aaf4d&width=768&dpr=4&quality=100&sign=6c303a39&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MZs4SFO1ypu3xxJQ-_1%252F-MZs7O5A1QLKA6CyTKoX%252Fsendgrid-postmark-admin-email.gif.gif%3Falt%3Dmedia%26token%3D7979b685-6e9b-4f45-b520-9506bcd46a21&width=768&dpr=4&quality=100&sign=8ea06b87&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MZs8Y8LTDbJvqfprKY6%252F-MZsARHTkysoszrTz0Rp%252Fimage.png%3Falt%3Dmedia%26token%3D4de88cee-3735-44b5-8d52-14992b012750&width=768&dpr=4&quality=100&sign=25df075c&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mf480iUVRBsKPhYujgg%252F-Mf4GzpziqZXqJ-adgfa%252FCleanShot%25202021-07-20%2520at%252014.50.51.gif%3Falt%3Dmedia%26token%3Dd9b28f3c-9ee0-47dc-bf93-b214dee5f2da&width=768&dpr=4&quality=100&sign=ad3f666a&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MP5P11d7bkwqZg1Pvbs%252F-MP5ofGe1fkTBwX9Xs4m%252Fimage.png%3Falt%3Dmedia%26token%3Dcbb11aa5-22d4-4e97-b36a-f18080d4ede0&width=768&dpr=4&quality=100&sign=caedcd6e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNtWmNmi9sSEtA4Mxae%252F-MNu5WC2FuNKFJCBVD7H%252Fimage.png%3Falt%3Dmedia%26token%3D5f7108b4-39c0-4d77-a3af-dea6e8d5db3c&width=768&dpr=4&quality=100&sign=a91aab1&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MZruKXErIlvLq2wc-Ux%252F-MZs374AF_5TUh-1d7gW%252Fsendgrid-pm-plugin-keys.png%3Falt%3Dmedia%26token%3D5e94d9b0-49e7-419c-8563-02ba367bd637&width=768&dpr=4&quality=100&sign=a6f36b8c&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MZs8Y8LTDbJvqfprKY6%252F-MZs9Fg51fHwaIfxBdxH%252Fimage.png%3Falt%3Dmedia%26token%3Dec9ed251-39aa-42c9-94e4-eae9ab865939&width=768&dpr=4&quality=100&sign=b3b70528&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F265427419-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MfsbWhfbg2OEg-I76Si%252F-MfskoffmLXEoG3pkjHI%252FScreen%2520Shot%25202021-07-30%2520at%252011.52.48%2520AM.png%3Falt%3Dmedia%26token%3D9ed1c033-6f4b-4d9d-8427-8ad61a7a87ed&width=768&dpr=4&quality=100&sign=f28f7725&sv=2) --- # Getting Started | Canvas Documentation [PreviousCanvas Design System Figma File](https://docs.airdev.co/canvas/5.3/for-designers) [NextBranding & Design](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design) Last updated 11 months ago In these videos, we explain how to add the framework to your applications, how to design and build a page using components from the Canvas library, and how to modify the standard functionality such as emails or the signup flow. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/getting-started#get-the-template) Get the Template ----------------------------------------------------------------------------------------------------------------- Getting the Airdev Canvas Building Framework Template through Bubble's template marketplace is a snap. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/getting-started#add-to-your-account) Add to your account The first step to getting the template is adding it to your Bubble account. To do this, go to the and press Use Template. If you aren't signed in to a Bubble account, you'll be prompted to log in or sign up. Follow the prompts from Bubble to complete this process. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/getting-started#create-a-new-app) Create a new app Now that you've added the template to your account you can create new apps in Bubble using the Canvas template! From the My Apps tab on your Bubble home page, click the blue 'New App' button. In the popup, click on the 'Start from a template' dropdown and select Canvas Building Framework Template. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/getting-started#get-the-chrome-extension) Get the Chrome Extension --------------------------------------------------------------------------------------------------------------------------------- To extend your template with new Bubble pages and blocks from Canvas you will need to . [](https://docs.airdev.co/canvas/5.3/canvas-functionality/getting-started#explore-the-admin-portal) Explore the Admin Portal --------------------------------------------------------------------------------------------------------------------------------- A great feature of the Canvas template is that it comes preconfigured with an Admin Portal where you can manage all the settings for your application. The Admin Portal is accessed from the front end of your application (not from the Bubble editor). To begin exploring your Admin Portal, when you are logged into the Bubble editor go to Data > App Data > All Users and then click on`'Run as'` beside the user with the email '[\[email protected\]](https://docs.airdev.co/cdn-cgi/l/email-protection) ' The admin portal offers access to the following settings from the left navigation menu: **Setup Checklist** The Setup Checklist provides step-by-step guidance to help you get started with your new application as quickly as possible. **Settings** Here you can update all the general settings for your application like the user signup process and your privacy policy **Analytics** View analytics on new, active, and total users across your application. **Metadata** View important app metadata (i.e. Roles and Pages) and manage app-wide variables. **Users** View a list of all your users including role, last active, and email. Add a new Admin to your application. **Data Type 1** A sample setup to demonstrate how to expand the functionality of the admin portal using your own custom data types. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/getting-started#naming-conventions) Naming conventions --------------------------------------------------------------------------------------------------------------------- In names of data types and reusable elements, we have included a gear emoji (⚙) to indicate that these specific elements should not be edited, or that you should be very cautious about making changes there. These data types and reusables touch a lot of different features or are easy to break when changed. The data types also include "system\_" prior to the reusable's name. Another thing to note is that Canvas workflows are green. We encourage using workflow folders or creating a color coding convention for your app in order to better organize your app's workflows. **Branding** From your app's name to your social media links you can setup all your applications branding here. **Header / Footer** Manage the navigational links and icons for your header and footer. **Emails** Add, edit, and preview email templates across your platform. To unlock all the features of the template such as the ability to add , add APIs, and update your , be sure to complete the **Install the Canvas extension** step from the Setup Checklist. [**Check out our new Introduction to Canvas Building Framework video series**](https://www.youtube.com/playlist?list=PLUpAowpWBfl0X5rhNNX0vhGZqBdizZfzG) [template page](https://bubble.io/template/canvas-starter-template-1541110863579x114287102114398200) [install the Chrome extension](https://chrome.google.com/webstore/detail/canvas-by-airdev/apmembkcpmjhmecifhckdidppfoiajie) [Learn More](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design) [Bubble pages and blocks with the extension](https://docs.airdev.co/canvas/5.3/canvas-functionality/pages-and-modules#adding-dynamic-canvas-pages-and-modules) [app's colors](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design#update-your-apps-colors) Please don't change the existing data fields on these data types The "system" reusable elements as of May 2, 2023 [Learn More](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts#emails) [Learn More](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#header-menu) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FvAOymIntQwGn6RcG0BCA%2Freusables.png&width=768&dpr=4&quality=100&sign=28a34600&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FzYvDDAX5Hk7Q2sgAxZQq%2Fimage.png&width=768&dpr=4&quality=100&sign=d143deda&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FK7bJlqK6Q4u6AxhfT1P8%2Fdata%2520types.png&width=768&dpr=4&quality=100&sign=849ddb40&sv=2) --- # Setting up two factor authentication | Canvas Documentation [PreviousMiscellaneous](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous) [NextCookie and consent banner](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/cookie-and-consent-banner) Last updated 11 months ago [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/setting-up-two-factor-authentication#overview) **Overview** ---------------------------------------------------------------------------------------------------------------------------------------- The 2fa functionality in Canvas is set up using the , found under the Verify folder, and an integration with Twilio. Two factor authentication requires a paid account with both Twilio and Bubble [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/setting-up-two-factor-authentication#step-1-set-up-twilio) **Step 1: Set up Twilio** ----------------------------------------------------------------------------------------------------------------------------------------------------------------- 2fa will require your Twilio account details to be added to the preset API connection in the API connector. Login to your Twilio account (or create one) . You will need to purchase a verified number from Twilio (but it may be possible to get a test phone number). Note that during testing you will need to verify any number you would like to send a code TO in your Twilio account as well. This restriction goes away when your account has been approved and you are no longer using it in testing mode. Add your account values to the API connector like this: 1. Your Twilio Account SID goes in the username field 2. Your Twilio Account Auth Token goes in the Password field 3. Add your Twilio Account SID to the Twilio SID parameters in the Send SMS call 4. Enter the verified phone number you purchased from Twilio in the From parameter in the Send SMS call (e.g. 19299990000) 5. Enter a phone number to test in the To field 6. Enter some placeholder text (e.g. Test) in the Body field Once you've entered all the fields above, please click the **Reinitialize call** button and the **Save** button. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/setting-up-two-factor-authentication#step-2-set-up-verify) **Step 2: Set up Verify** ----------------------------------------------------------------------------------------------------------------------------------------------------------------- Require email verification during sign up feature only requires you to set up Verify in your app. You do not need to set up Twilio above unless you also want to require phone verification or 2fa during sign up. While it has the same name as Twilio’s 2fa product, your Verify functionality is contained fully inside your Canvas application. This is completely setup but will require that you generate an API key in your app to be able to use it. To do this, in the editor: 1. Navigate to Settings 2. Click the API tab 3. Click to ‘Generate a new API token’ 4. Name the new token and copy the value of the Private key Once you have the key copied, replace the {{Private key}} value (make sure to keep the word Bearer) in the header of the Verify API call (Plugins tab > API connector > Verify). [](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous/setting-up-two-factor-authentication#step-3-set-up-canvas) **Step 3: Set up Canvas** ----------------------------------------------------------------------------------------------------------------------------------------------------------------- Now that Twilio and Verify are both ready to go, you have the following options to set up in the Admin portal under Settings > Signup Process. 1. Require phone verification 2. Enable two-factor authentication 3. If enabled, you can require 2fa app wide or set to optional which will allow individual users to enable 2fa only for their account from the account page. [⚙️ system\_widget\_verify\_phone/email widget](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets/app-security) [here](https://www.twilio.com/try-twilio) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Ft-h_nkHzVhX98EbNcMDc0tgq9ae_G2owyVccL7UTVbVPYIpeKe39I9R7KwIXrbREVE8sJHSzmIqTfjNMH4UXYTBKOW6mwH48IYSk5ZYPrJcn2k_FRuVIQok5O99yrMtj973iwUKC%3Ds0&width=768&dpr=4&quality=100&sign=af21d040&sv=2) [three backend workflows](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/api-workflows#verify) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FzKWaHwW7L1dJh8AMIu0d%2FScreen%2520Shot%25202021-10-07%2520at%25202.28.53%2520PM.png&width=768&dpr=4&quality=100&sign=53c66eb1&sv=2) --- # Marketing Pages | Canvas Documentation [PreviousBranding & Design](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design) [NextBubble Pages & Blocks](https://docs.airdev.co/canvas/5.3/canvas-functionality/pages-and-modules) Last updated 11 months ago By default, your Canvas template will come with five Bubble marketing pages — the **index or SaaS landing page (home1), Marketplace landing page (home2), Simple landing page (home3), about** and **pricing** pages. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/marketing-pages#installing-the-chrome-extension) Installing the Chrome Extension In order to be able to add Bubble marketing pages and blocks to your Canvas template be sure to . With the Canvas Chrome extension installed, please follow the instructions below: 1. In your Chrome browser, click on the puzzle icon in the upper right corner 2. Find Canvas by Airdev and click on the pin next to it to pin it to your Chrome browser for easy access 3. Click the Canvas icon to open and close the extension ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/marketing-pages#adding-a-new-bubble-marketing-page) Adding a new Bubble marketing page With the Canvas extension open, click on 'Pages' to open the library of Bubble page templates. From the Pages subtabs, select **Marketing** to filter on marketing page templates only. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/marketing-pages#basic-marketing-page-template) Basic Marketing Page Template To build your marketing page from scratch, you should select this page template. You can further customize it by using the Canvas extension to add more marketing blocks and Canvas elements. **Duplicate a marketing page in the Base template** Go to your Bubble editor and select "Add a new page" from the page dropdown in the upper left corner. From there, simply create a new page by cloning one of the marketing pages in your app. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/marketing-pages#customizing-your-bubble-marketing-page) Customizing your Bubble marketing page With the Canvas extension open, click on 'Blocks' to open the library of Bubble block templates. From the 'select category' dropdown, select **Marketing Blocks** to filter on marketing block templates only. Alternatively, you can copy and paste a marketing block from another marketing page in your app and paste it to any other marketing pages. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/marketing-pages#faqs) FAQs ----------------------------------------------------------------------------------------- **How can I set a Bubble marketing page as my application's new index page?** In your Bubble editor, go to the Bubble marketing page you want to set as your new index page. Click on 'Edit' in the top bar and from the dropdown, select 'Make this page the new index'. The original Canvas index page includes various workflows for index page redirections. Make sure you copy those workflows to your new index page. **My Bubble page name for my marketing page in the Bubble editor is different from the name under the Metadata tab > Pages subtab in the Admin portal. Why don't the two page names match?** As an admin, you'll be able to view all the Bubble pages in your Canvas app from Metadata tab > Pages subtab in the admin portal. The unique paths for your pages here should match the actual page names in your Bubble editor. We use the 'Bubble Pages' option set to manage a user's permission to view a specific page. If you change the name of a Bubble page in the Bubble editor then you would need to go to the Data tab > Option sets > Bubble Pages option set > Update the display name for the page to match. **How can I customize the SEO settings for my Bubble marketing pages?** All Bubble pages in your Canvas app will use default SEO tags set in the Admin portal under Branding > Default SEO/Social Tags. To customize SEO tags for a specific page, you would need to go to the page in your Bubble editor and open the page's property inspector. When using this method, please be sure to add a new option to the . You will need to set this option up with the correct privacy and role permissions for each Bubble marketing page you add to your application. From the 'Add to' button dropdown, select the group that you would like to add the marketing block to. [install the Chrome extension](https://chrome.google.com/webstore/detail/canvas-by-airdev/apmembkcpmjhmecifhckdidppfoiajie) [Bubble Pages option set](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#the-bubble-pages-option-set) Basic marketing page that is blank for you to add marketing blocks to and customize using the Chrome extension Admin page > Metadata tab > Pages subtab view ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FJIQ47fANW8UhgBANOhr1%2Fmarketing1.png&width=768&dpr=4&quality=100&sign=2c224f7f&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FArLIDYWW4YJcbg9fjBJp%2FAdmin&width=768&dpr=4&quality=100&sign=8bcf18ab&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FXk2o3rvZwJsrbg1EKBN6%2Fseo.png&width=300&dpr=4&quality=100&sign=ecfb29b0&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2Fdhx97RXAU5OlpMZfjDEn%2Fmarketing2.png&width=300&dpr=4&quality=100&sign=6af78078&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2Fj8fnoNzKGXEwZU4HEN58%2FOptions.png&width=768&dpr=4&quality=100&sign=3f2be704&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FHNN5yGrJYfRVnkic6KHK%2Fchrome.png&width=300&dpr=4&quality=100&sign=377c1839&sv=2) --- # Bubble Pages & Blocks | Canvas Documentation [PreviousMarketing Pages](https://docs.airdev.co/canvas/5.3/canvas-functionality/marketing-pages) [NextRoles & Permissions](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions) Your Canvas template is installed with several pages that provide login, account, and admin functionality. However, your template can be extended far beyond this by taking advantage of dozens of prebuilt Bubble pages and blocks available to you in the Canvas library. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/pages-and-modules#installing-the-chrome-extension) Installing the Chrome Extension In order to be able to add Bubble pages and blocks to your Canvas template be sure to . With the Canvas Chrome extension installed, please follow the instructions below: 1. In your Chrome browser, click on the puzzle icon in the upper right corner 2. Find Canvas by Airdev and click on the pin next to it to pin it to your Chrome browser for easy access 3. Click the Canvas icon to open and close the extension View a list of all pages and blocks available through Canvas ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/pages-and-modules#do-i-need-to-register-my-canvas-application-with-the-build-hub-to-use-the-canvas-extension) Do I need to register my Canvas application with the Build Hub to use the Canvas extension? As of Sep 5, 2023 (template version 5.1.0), we have removed the manual registration flow in the template to register your app with the Build Hub. If your app template version is v5.1.0 or later, you can simply open the Canvas extension from your app editor to add free assets. If you are using an older template, you can self-register your application with the Build Hub using this . ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/pages-and-modules#adding-a-new-page) Adding a new page With the Canvas extension open, click on 'Pages' to open the library of Bubble page templates. Select the page you would like to add and click the 'Add page' button. The unique path entered here will also be the name of your new Bubble page. When creating your page, Canvas will also create a corresponding option in the . You will need to set this option up with the correct privacy and role permissions for each Bubble page you create. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/pages-and-modules#customizing-your-page) Customizing your page Some page templates will include a page-level group with a collapsible image banner, title, description, and toggle tabs. This group should be used when you want to further customize a page. * To show an image banner, unhide the placeholder group by checking the box for _This element is visible on page load_ and change the group's style to an empty style. Change the background of the group by selecting a background type and entering the relevant fields. * Show or hide the other UI components in the Page Flair group to fit your needs. Your page is now a fresh canvas ready to go. Start building it out by adding blocks from the Canvas library! ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/pages-and-modules#adding-blocks-to-the-page) Adding blocks to the page A block is a group of Bubble elements arranged in a way that is responsive, cohesive with Canvas design standards, and has some functionality that you can use in your app. To add a block, open the extension and select 'Blocks' from the sidebar. The library of Canvas blocks already contains dozens of Free and Premium options and we are constantly adding new options to the list. From the 'Add to' dropdown, select the group that you would like to add a block to. Click the 'Add' button to start building out your page. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/pages-and-modules#setting-up-blocks-you-have-added) Setting up blocks you have added Adding blocks using Canvas Pages is only the first step to extending the functionality of your app. In order to make the most of the Canvas blocks, you need to modify these blocks in a few different ways: * Adding or modifying actions on buttons * Changing data sources on repeating groups or elements with data sources * Filling out content on groups * Linking content on groups to data types * Linking blocks to portal tabs (show/hide based on what user selects) #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/pages-and-modules#customizing-block-title-group) Customizing block title group Most blocks will include a standard title group. This group includes common UI components such as a title, dropdown, toggle tabs, description text, sort dropdown, filters, and a 'new' button. The dropdown, toggle tabs, and description/results text are within three separate collapsible groups. You can set any of those groups to be visible or not visible on page load. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/pages-and-modules#adding-blocks-with-functionality) Adding blocks with functionality Some blocks in Canvas already have functionality that is preconfigured for your app. Adding these blocks to your app is another way to quickly extend the template. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/pages-and-modules#adding-elements-to-blocks) Adding elements to blocks An element is a small and foundational UI that you can add to any Canvas page or block to further customize it. To add an element, open the extension and select 'Elements' from the home screen. From the 'Add to' dropdown, select the group that you would like to add an element to. Click the 'Add' button to start customizing your blocks. More complex blocks also require some customization as well as specific data types and fields to be added to your application in order to work properly. Please see the for these blocks to learn how to set them up. [documentation](https://docs.airdev.co/canvas/5.3/canvas-library/blocks) [install the Chrome extension](https://chrome.google.com/webstore/detail/canvas-by-airdev/apmembkcpmjhmecifhckdidppfoiajie) [here](http://canvas.airdev.co/library) [link](https://build.airdev.co/registration) [Bubble Pages option set](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#the-bubble-pages-option-set) Page Flair Group with page title and description visible Page Flair Group with page title, description, and toggle tabs visible Page Flair Group with image banner, page title, description, and toggle tabs visible Title Group with Category dropdown visible Title Group with Toggle tabs visible Title Group with Description/Results text visible ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FCDORdYA7Yni0pXVLas4w%2Ft4.png&width=768&dpr=4&quality=100&sign=d7d436d8&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FkQOCV2qCUT5kTRK1HZNy%2Fp2.png&width=768&dpr=4&quality=100&sign=52583594&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FPKdlArYoVFyugkNAbBAN%2Fp4.png&width=768&dpr=4&quality=100&sign=911bf60c&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F8hAEhD7qsoym6sZKBkdn%2Fp3.png&width=768&dpr=4&quality=100&sign=a9c2c848&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FD1mDyZgleEGAX4I6v32D%2Ft2.png&width=768&dpr=4&quality=100&sign=7856d864&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FHNN5yGrJYfRVnkic6KHK%2Fchrome.png&width=300&dpr=4&quality=100&sign=377c1839&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FDpA6HKkRlXfYAmLLvym2%2Ft3.png&width=768&dpr=4&quality=100&sign=3f9ec287&sv=2) --- # Mail merge terms | Canvas Documentation [PreviousEmails & Alerts](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts) [NextMiscellaneous](https://docs.airdev.co/canvas/5.3/canvas-functionality/miscellaneous) Last updated 11 months ago [](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts/mail-merge-terms#overview) Overview -------------------------------------------------------------------------------------------------------------------- A **mail merge term** is simply a placeholder text within asterisks (_e.g., \*FIRSTNAME\*_ ) that is replaced with dynamic content when the email is sent. Remember that adding mail merge terms to the email template mail merge terms list or to the email template content is not enough for them to work, you have to add the logic in the correspondent . If the following sections of this page you are going to learn: [](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts/mail-merge-terms#how-to-add-mail-merge-terms-to-the-email-template-content) How to add mail merge terms to the email template content ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- To add mail merge terms to the email template content is as easy as typing them between asterisks (_e.g., \*FIRSTNAME\*_ ). But Canvas has now a new system to help you add them without even having to type them. This method is present in Canvas templates from version 4.1.0 and onwards Now you can just type an asterisk and Canvas is going to show you all the mail merge terms that have been already added to the email template mail merge list. You just have to click on the desired term and it will be added to the content automatically. Keep reading to learn how to add mail merge terms to the email template list. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts/mail-merge-terms#how-to-add-mail-merge-terms-to-the-email-template-mail-merge-terms-list) How to add mail merge terms to the email template mail merge terms list -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- You should add the mail merge terms to this list so you can keep track of the terms you are using in each template and to be able to add them later to the email content in a semi-automatic manner. There are two methods to add mail merge terms to the email template mail merge terms list: 1. Add them in the EMAIL SETTING tab 2. Add them when editing the email template content (only in Developer mode) ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts/mail-merge-terms#id-1.-add-them-in-the-email-setting-tab) 1\. Add them in the EMAIL SETTING tab In the edit email template popup -> EMAIL SETTING tab, click on 'Edit terms' Then, in the Edit mail merge terms popup you can add or delete them. Don't forget to click on Save terms to make the changes permanent. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts/mail-merge-terms#id-2.-add-them-when-editing-the-email-template-content-only-with-developer-mode-enabled) 2\. Add them when editing the email template content (only with Developer mode enabled) In the edit email template popup -> EMAIL CONTENT tab: 1. Start by entering content in any of the available inputs: subject, body, button (optional) or signature. 2. When you add a placeholder text within asterisks (_e.g., \*FIRSTNAME\*_ ) and after you leave the input (e.g., click in another one) Canvas will recognize the new term and will show you the new term/s available to be added to the email template mail merge list 3. Click on the term you want to be added to the list and an alert will confirm that the term has been added to the list 4. Done! This new mail merge term will be available to you to be added to the content when you type '\*'. And don't forget that you still have to for this mail merge term to work. This method is enabled only when the is on and for Canvas templates from version 4.1.0 and onwards And don't forget that you still have to for this mail merge term to work. [How to add mail merge terms to the email template content](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts/mail-merge-terms#how-to-add-mail-merge-terms-to-the-email-template-content) [How to add mail merge terms to the email template mail merge terms list](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts/mail-merge-terms#add-mail-merge-terms-to-the-email-template-mail-merge-terms-list) Add mail merge terms to the email content Edit email template popup Edit mail merge terms popup Add mail merge terms to the list from the content ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F1NVzBZ0ZHv06mbz1Ne7Z%2Femail3.png&width=768&dpr=4&quality=100&sign=9da69040&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F9HW8YfuSovkPXszF7Ra1%2FAdd%2520mail%2520merge%2520terms%2520to%2520the%2520list.gif&width=768&dpr=4&quality=100&sign=89d127a3&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F6gM4uHIGeHqUx0zzstlV%2FAdd%2520mail%2520merge%2520terms%2520to%2520the%2520content.gif&width=768&dpr=4&quality=100&sign=edf865d4&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FuYcyoYrQGKpAHTqB2eY0%2Femail2.png&width=768&dpr=4&quality=100&sign=8eb9a111&sv=2) [backend workflow](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts#create-a-template-workflow) [add the logic in the backend](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts#create-a-template-workflow) [add the logic in the backend](https://docs.airdev.co/canvas/5.3/canvas-functionality/emails-and-alerts#create-a-template-workflow) [Developer mode](https://docs.airdev.co/canvas/5.3/whats-new#developer-mode) --- # Branding & Design | Canvas Documentation [PreviousGetting Started](https://docs.airdev.co/canvas/5.3/canvas-functionality/getting-started) [NextMarketing Pages](https://docs.airdev.co/canvas/5.3/canvas-functionality/marketing-pages) Last updated 11 months ago [](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design#basic-branding) Basic Branding ----------------------------------------------------------------------------------------------------------------- It's important to update the branding of your application in the admin portal as we use this data throughout the application to display your company's information. To get started, click the Branding tab under Setting in the left menu of the admin portal. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design#name) Name The name that is set here is used extensively throughout the front end of your application as well as in emails and notifications sent to your users. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design#logo) Logo In this tool you can set desktop and mobile logos for both light and dark backgrounds. The logos set here are displayed in the top left of your application header as well as in your emails and other communication. The browser favicon cannot be set here and must be uploaded to the Bubble editor under Settings > General > Favicon [](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design#seo-and-social) SEO & Social --------------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design#seo) SEO SEO descriptions and tag lines are set under Branding > Default SEO/Social Tags. This data is used by Google when indexing your app's pages for search results and by other services to display data about your platform in link previews. All Bubble pages that are added with the extension will all use these SEO tags by default. If you would like to customize these tags for a specific page, you would need to edit the SEO settings directly from the page header input on the page's property inspector ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design#social-links) Social Links Links to your social media channels can be shown in the footer throughout the application. To manage what is displayed click on the Header/Footer link in the left menu, scroll down to the Footer section, and click on Social media tab. Here you can manage what links are shown and the icons that should be displayed. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design#styles-and-colors) Styles & Colors --------------------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design#using-styles-instead-of-setting-individual-properties) Using Styles instead of setting individual properties Canvas uses a consistent set of styles (set in the`Styles` tab). We recommend using these styles instead of manually setting visual attributes on an element, as this maintains consistency and makes it easier to make adjustments later. You can make adjustments to these styles by going to the Styles tab in the Bubble editor. If you might be using some of our advanced features such as style updates, you should refrain from modifying existing styles or changing any of their names. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design#use-bubbles-new-styles-override-feature-if-you-need-to-deviate-from-a-style) Use Bubble's new styles override feature if you need to deviate from a style It's not unusual for a specific element to need formatting specific to only that element. When this scenario arises, please do not remove the Canvas Bubble style. Instead, simply apply the change to the element's Appearance tab using Bubble's latest styles override feature. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design#update-your-apps-colors) **Update your App's Colors** At times you need to change the main colors your app is using. While you could do this by going through all the styles one by one, Canvas makes this simple by providing a tool in the Canvas extension that will do all the work for you. Open the Chrome extension and click on 'App colors'. Here you can select your primary, secondary, and tertiary colors for the app. Select your new colors and click 'Update colors'. It will take Canvas up to 5 minutes to update the colors across all the styles in your application. You will need to leave your browser window open and remain on the tab while the colors are being updated so plan accordingly when triggering this action. **How to use the different types of colors** **Primary Colors**: Styles with this color should be used for the main colors through your application and for positive action elements such as a button that creates or updates a thing in your database. **Secondary Colors**: Styles with this color should be used to accent the design of your application as well as secondary action elements such as a Save As Draft button that is an alternative to a primary action Save & Publish button. **Tertiary Colors**: Styles with this color should be reserved for warning, alert, and negative action elements such as a delete button ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design#update-your-apps-styles) Update your App's Styles If your version of Canvas is not the latest version, when you add a new page or block to your app it may contain styles that have not yet been added to your Bubble application. In this scenario you will be prompted to import the new Canvas styles to your app. It will take Canvas 5 - 10 minutes to update the styles in your application. You will need to leave your browser window open and remain on the tab while the styles are being imported so plan accordingly when triggering this action. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/branding-and-design#update-your-apps-font) Update your App's Font Easily change the App Font for all of your Canvas styles by going to your Bubble editor > Styles tab > and Styles variables. The Canvas template is based on the principles, which we use with most of our clients. This makes it easy to translate specs into apps without getting caught up in the creative process. Not sure what colors to use? Check out this r for ideas! [Airdev Canvas Design](https://airdev.co/design) [color palette generato](https://coolors.co/app) Link preview for Canvas Edit properties in the Styles tab All Canvas Bubble styles use App Font (Inter) Change the App Font for all styles from here ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FmNWntlyWIZUWW3qWTDjs%2Fstyles.png&width=768&dpr=4&quality=100&sign=41aa88fa&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FssMGCqKQgU3khkBNXK8O%2Fimage.png&width=768&dpr=4&quality=100&sign=3137304a&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2Fsl89PWaGInXgo515m05H%2Fimage.png&width=768&dpr=4&quality=100&sign=477fd8a&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F5mbMcgpL1keNXyLSHzus%2Felement%2520styles.png&width=768&dpr=4&quality=100&sign=2169c621&sv=2) --- # Key Features | Canvas Documentation [PreviousIntroduction](https://docs.airdev.co/canvas/3.0.0-1) [NextWhat's New](https://docs.airdev.co/canvas/3.0.0-1/whats-new) Last updated 4 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.0.0-1/features#admin-portal) Admin portal --------------------------------------------------------------------------------- Canvas has a fully designed and functional admin portal built in to the base template. Manage your app settings, view and add users, create new marketing pages, and much more. [](https://docs.airdev.co/canvas/3.0.0-1/features#marketing-page-builder) Marketing page builder ----------------------------------------------------------------------------------------------------- Need fast loading, SEO friendly marketing pages to show off your application to potential users? Canvas now comes with a and a host of professionally designed blocks to create a beautiful marketing site on top of your main application! [](https://docs.airdev.co/canvas/3.0.0-1/features#canvas-extension) Canvas extension ----------------------------------------------------------------------------------------- Use the Canvas extension at any time during development to expand your application with professionally designed, fully responsive or update the colors throughout your application all directly from within the Bubble editor. [](https://docs.airdev.co/canvas/3.0.0-1/features#custom-email-templates) Custom email templates ----------------------------------------------------------------------------------------------------- We've integrated Canvas with Sendgrid to send transactional emails using a beautiful HTML template. You can create unlimited with dynamically populated data directly from the admin portal. [](https://docs.airdev.co/canvas/3.0.0-1/features#built-in-user-management) Built-in user management --------------------------------------------------------------------------------------------------------- Almost every application will need to provide their users some basic functionality for signing up, logging in, and managing their account details. However, creating this functionality can add a lot of time to your build. As much of the functionality for user management is the same across applications, you can find yourself rebuilding the same elements and workflows many times. We have been able to streamline this process and from signup/login, password reset, email verification, profile management and much more, the Canvas base template comes with a robust and fully functional user management system ready to go as soon as it is downloaded. [page builder](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/marketing-pages) [pages & blocks](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules) [email templates](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#email-templates) --- # Reference | Canvas Documentation [PreviousMiscellaneous](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/miscellaneous) [NextPages](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages) Last updated 4 years ago Was this helpful? The content in the reference section assumes an intermediate level of proficiency with both Bubble and the Canvas system and contains detailed reference materials on the . If you want to extend the app in more complex ways than outlined in the previous sections, or understand each page's function in more detail, read through this section. [Canvas Base Template](https://bubble.io/template/canvas-starter-template-1541110863579x114287102114398200) [Pages](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages) [Menu Focus Elements](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/menu-focus-elements) [Data types](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/data-structure) [Option Sets](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/option-sets) [Backend Workflows](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/api-workflows) [Reusable elements](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements) --- # Pages | Canvas Documentation [PreviousReference](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference) [NextIndex](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/index) Last updated 4 years ago Was this helpful? [Index](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/index) [Admin Portal](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal) [Account](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/account) [Login](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/login) [Reset Password](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/reset-password) [Verify](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/verify) [404](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/404) [Privacy Policy (deprecated)](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/privacy-policy) [Terms of Service (deprecated)](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/terms-of-service) --- # Introduction | Canvas Documentation [NextKey Features](https://docs.airdev.co/canvas/3.0.0-1/features) Last updated 4 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.0.0-1#welcome-to-canvas) Welcome to Canvas! ----------------------------------------------------------------------------------- Canvas is a framework based on that non-coders can use to very rapidly build powerful and beautiful web applications. The framework is built and maintained by , an ultra-rapid software development firm based in San Francisco. Canvas doesn't require any previous software knowledge or experience. But learning how Bubble and Canvas work does require significant time investment to get to the point when you can build something great. If you are starting from scratch, you should plan on spending at least a few weeks learning both of the tools. [](https://docs.airdev.co/canvas/3.0.0-1#what-is-canvas) What is Canvas? ----------------------------------------------------------------------------- Canvas is a development framework based on that combines 3 things: 1. **Base Template**: This app template contains features that almost every application needs - things like marketing pages, user management, admin portal, and so much more. 2. **Pages & blocks:** These are smaller UI & UX components that can be added to the Base Template in order to build almost anything that you might imagine. They also provide consistency to your app's design, so pages you add to the app don't look out of place. 3. **Standards & best practices:** These will help you make sure your application's functionality, design, and integrations are properly built and result in the best product possible. [](https://docs.airdev.co/canvas/3.0.0-1#why-canvas) Why Canvas? --------------------------------------------------------------------- There is a major shift happening that's changing not only how software is built, but who builds it. Specifically, no-code tools like Bubble now allow non-coders to build complex software applications without writing a single line of code. At AirDev, we've spent years building software without code for companies ranging from one-person startups to Fortune 50 enterprises. Through our work we've identified common patterns that exist in applications and turned those into this framework. Here's what the framework helps us do: 1. **Build and launch faster:** Because large parts of both functionality and design are templatized, we don't have to spend time reinventing the wheel and instead focus only on the parts that are different about a particular application. 2. **Build better products:** We've spent a lot of time thinking through and iterating on our templates and standards. When we use them we can be sure that the application will look good and work well. 3. **Build in a transferrable way:** Because our products follow the same framework, they're much easier to transfer between developers who know the framework. This is critical for long-term projects that require lots of people to be involved. We're excited to share the Canvas framework with people and teams outside of AirDev, we hope you find it useful! [Bubble](https://bubble.is/?ref=LBRPNATG) [AirDev](https://airdev.co/) [Bubble](https://bubble.is/?ref=LBRPNATG) --- # Privacy Policy (deprecated) | Canvas Documentation [Previous404](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/404) [NextTerms of Service (deprecated)](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/terms-of-service) Last updated 4 years ago Was this helpful? **Page name:** privacy **Purpose:** Contains all the content for the privacy policy that is linked from the footer Your app will include a simple Privacy Policy page. You can update the content of this page from Settings > Privacy policy in the . [Admin portal](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPzA9nzckjzx_cKjRy4%252F-MPzIXtFsjH7oxTCEtkl%252Fimage.png%3Falt%3Dmedia%26token%3D76055a7c-a235-4674-b7aa-0f8d2881cc6c&width=768&dpr=4&quality=100&sign=1631a2f6&sv=2) --- # Login | Canvas Documentation [PreviousAccount](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/account) [NextLegal](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/legal) Last updated 4 years ago Was this helpful? **Page name:** login **Purpose:** Provides functionality for your users to signup and login to your application and go through the forgot password process You can mange the log in page design from Branding > Log in page style in the . [Admin portal](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXISZPhhkICb6GjgO79%252F-MXJ17tpTxTRkuSfzL2H%252Fimage.png%3Falt%3Dmedia%26token%3D0c29ff8f-5e55-4901-a835-9be61fbcd783&width=768&dpr=4&quality=100&sign=1578589c&sv=2) --- # Index | Canvas Documentation [PreviousPages](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages) [NextAdmin Portal](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal) Last updated 4 years ago Was this helpful? **Page name:** index **Purpose:** Acts as the home page for your application and manages all user redirection for logged in users The index page is the landing page for all non logged in users. You can manage the design and content through the in the Admin Portal. [Pages tab](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/marketing-pages#building-your-marketing-page) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPz13ZQi5GMzJIEy8Zi%252F-MPz3AS8f6y9BgQ6MviD%252Fimage.png%3Falt%3Dmedia%26token%3D51152523-a070-4fad-a8ef-d9ad690e92ec&width=768&dpr=4&quality=100&sign=47017674&sv=2) --- # Account | Canvas Documentation [PreviousAdmin Portal](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal) [NextLogin](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/login) Last updated 4 years ago Was this helpful? **Page name:** account **Purpose:** Enables your users to manage their profile and account credentials through a self service portal The Canvas base template has the following navigation tabs visible by default but you can hide any of these by going to Group Main content > Group Main sidebar > Group Inner sidebar content in the elements tree. We also have included 6 placeholder groups to add additional functionality. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/account#profile) Profile ------------------------------------------------------------------------------------------------------------------- Here the user can update the profile picture as well as the first and last name on their account. There are also two hidden groups that contain the UI for a user to set their username as well as fill out an about me section. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/account#login-credentials) Login credentials --------------------------------------------------------------------------------------------------------------------------------------- Let your users manage the email and password for their account while providing account security by requiring the current password for any changes to be made. Contains all the UI and workflows to ensure the new password meets the password policy you have set up for your app. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/account#payments) Payments --------------------------------------------------------------------------------------------------------------------- Allow your users to update their payment method as well as view all their payment history on your platform [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/account#notifications) Notifications ------------------------------------------------------------------------------------------------------------------------------- In the notifications tab the user can set their notification preferences. Please note, this is UI only in the base template and does not make any changes to your app. You will need to set up the workflows and logic to manage the preferences set here. ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPz13ZQi5GMzJIEy8Zi%252F-MPz2tge_eLKfPnRMs3Q%252Fimage.png%3Falt%3Dmedia%26token%3D9412f9b3-18aa-432b-a547-d9eee459a830&width=768&dpr=4&quality=100&sign=93a72f35&sv=2) --- # 404 | Canvas Documentation [PreviousVerify](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/verify) [NextPrivacy Policy (deprecated)](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/privacy-policy) Last updated 4 years ago Was this helpful? **Page name:** 404 **Purpose:** Users are redirected to this page anytime they try to navigate to a page the does not exist Your app will come with a simple 404 page. A 404 page is also known as an “error page” or “Page Not Found” page. This page indicates that the user reached the domain they requested, but the URL path provided no information or the page does not exist. ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPzA9nzckjzx_cKjRy4%252F-MPzIJ27hGr5nT-71RsO%252Fimage.png%3Falt%3Dmedia%26token%3Dfd3f50bf-f832-464e-925c-5e10c881e073&width=768&dpr=4&quality=100&sign=4b15f846&sv=2) --- # Reset Password | Canvas Documentation [PreviousLegal](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/legal) [NextVerify](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/verify) Last updated 4 years ago Was this helpful? **Page name:** reset\_pw **Purpose:** Allows the user to reset their password when they click the 'Forgot password' link on the login page When the user goes through the 'Forgot password' flow they will receive an email with a link to reset their password. Clicking that link will bring them to this page. ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPzA9nzckjzx_cKjRy4%252F-MPzHIazpck0q53JqLj4%252Fimage.png%3Falt%3Dmedia%26token%3D5e324499-fbf7-41cf-a6ba-6d9d2a1a2c9e&width=768&dpr=4&quality=100&sign=d35d8d0b&sv=2) --- # 404 | Canvas Documentation **Page name:** 404 **Purpose:** Users are redirected to this page anytime they try to navigate to a page the does not exist Your app will come with a simple 404 page. A 404 page is also known as an “error page” or “Page Not Found” page. This page indicates that the user reached the domain they requested, but the URL path provided no information or the page does not exist. [PreviousReset Password](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/reset-password) [NextReusable elements](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements) Last updated 11 months ago --- # Legal | Canvas Documentation [PreviousLogin](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/login) [NextReset Password](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/reset-password) Last updated 4 years ago Was this helpful? **Page name:** legal **Purpose:** Displays the text content for the Terms & Conditions and Privacy Policy. You can mange the **Privacy policy** content from Settings > Privacy policy in the . You can mange the **Terms of service** content from Settings > Terms of service in the . You can change the color of the legal banner from Settings > Legal page banner color in the . [Admin portal](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal) [Admin portal](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal) [Admin portal](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJQXmMYBr5Q1rzXHVt%252F-MXJQbF84d4-3_ExwEWt%252FScreen%2520Shot%25202021-04-02%2520at%25202.12.19%2520PM.png%3Falt%3Dmedia%26token%3D285c5980-ab60-471f-b8c2-4ea39f3d5171&width=768&dpr=4&quality=100&sign=74c050b8&sv=2) --- # Getting Started | Canvas Documentation [PreviousFor Designers](https://docs.airdev.co/canvas/3.0.0-1/for-designers) [NextBranding & Design](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design) Last updated 3 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/getting-started#get-the-template) Get the Template --------------------------------------------------------------------------------------------------------------------- Getting the AirDev Canvas Base Template through Bubble's template marketplace is a snap. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/getting-started#add-to-your-account) Add to your account The first step to getting the template is adding it to your Bubble account. To do this, go to the and press Use Template. If you aren't signed in to a Bubble account, you'll be prompted to log in or sign up. Follow the prompts from Bubble to complete this process. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/getting-started#create-a-new-app) Create a new app Now that you've added the template to your account you can create new apps in Bubble using the Canvas template! From the My Apps tab on your Bubble home page, click the blue 'New App' button. In the popup, click on the 'Start from a template' dropdown and select Canvas Base Template. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/getting-started#get-the-chrome-extension) Get the Chrome Extension ------------------------------------------------------------------------------------------------------------------------------------- To extend your template with new Bubble pages and blocks from Canvas you will need to . [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/getting-started#explore-the-admin-portal) Explore the Admin Portal ------------------------------------------------------------------------------------------------------------------------------------- A great feature of the Canvas template is that it comes preconfigured with an Admin Portal where you can manage all the settings for your application. The Admin Portal is accessed from the front end of your application (not from the Bubble editor). To begin exploring your Admin Portal, when you are logged into the Bubble editor go to Data > App Data > All Users and then click on`'Run as'` beside the user with the email '[\[email protected\]](https://docs.airdev.co/cdn-cgi/l/email-protection) ' The admin portal offers access to the following settings from the left navigation menu: **Launch Checklist** The Launch Checklist provides step by step guidance to help you get started with your new application as quickly as possible. **Settings** Here you can update all the general settings for your application like the user signup process and your privacy policy **Analytics** View analytics on new, active, and total users across your application. **Users** View a list of all your users including role, last login, and email. Add a new Admin to your application. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/getting-started#naming-conventions) Naming conventions ------------------------------------------------------------------------------------------------------------------------- In names of data types and reusable elements, we have included a gear emoji (⚙) to indicate that these specific elements should not be edited, or that you should be very cautious about making changes there. These data types and reusables touch a lot of different features or are easy to break when changed. The data types also include "system\_" prior to the reusable's name. Another thing to note is that Canvas workflows are green. We encourage using workflow folders or creating a color coding convention for your app in order to better organize your app's workflows. **Branding** From your app's name to your social media links you can setup all your applications branding here. **Pages** View Bubble pages and add unlimited marketing pages to your app using the Canvas page builder. **Header / Footer** Manage the navigational links and icons for your header and footer. **Emails** Add and edit email templates across your platform. To unlock all the features of the base template such as the ability to use the , adding , and updating your , be sure to complete step 2 (adding your app identifier) and step 3 (register your app with Canvas) from the Launch Checklist. [template page](https://bubble.io/template/canvas-starter-template-1541110863579x114287102114398200) [install the Chrome extension](https://chrome.google.com/webstore/detail/canvas-by-airdev/apmembkcpmjhmecifhckdidppfoiajie) [Learn More](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design) [Learn More](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules) [app's colors](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#update-your-apps-colors) [page builder](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules#adding-static-marketing-pages) [Bubble pages and blocks with the extension](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules#adding-dynamic-canvas-pages-and-modules) [Learn More](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#emails) [Learn More](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#header-menu) Please don't change the existing data fields on these data types The "system" reusable elements as of July 6, 2021 ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mdx2jVeqkaOMUPJNvKF%252F-Mdx4kxDcRcjKs95tF0K%252Fimage.png%3Falt%3Dmedia%26token%3D93979bdd-cd4d-4268-bfba-85abbab341ac&width=768&dpr=4&quality=100&sign=35bc1424&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mdx2jVeqkaOMUPJNvKF%252F-Mdx4iAbOE0XLj_G0wmv%252Fimage.png%3Falt%3Dmedia%26token%3D20259193-2e48-46dd-a46f-b3ac891bc123&width=768&dpr=4&quality=100&sign=42d8142f&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mdx2jVeqkaOMUPJNvKF%252F-Mdx6DI25B5QV4Jgmbn_%252Fimage.png%3Falt%3Dmedia%26token%3Dca258141-b926-4501-9e4e-11e16a7fd4d7&width=768&dpr=4&quality=100&sign=a07b306d&sv=2) --- # Reset Password | Canvas Documentation **Page name:** reset\_pw **Purpose:** Allows the user to reset their password when they click the 'Forgot password' link on the login page When the user goes through the 'Forgot password' flow they will receive an email with a link to reset their password. Clicking that link will bring them to this page. Once the user has reset their password, they will taken to the login page where they will go through the full login process in order to access the application [PreviousLegal](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/legal) [Next404](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/404) Last updated 11 months ago --- # Canvas Design System Figma File | Canvas Documentation [PreviousWhat's New](https://docs.airdev.co/canvas/5.3/whats-new) [NextGetting Started](https://docs.airdev.co/canvas/5.3/canvas-functionality/getting-started) Last updated 11 months ago [](https://docs.airdev.co/canvas/5.3/for-designers#canvas-figma-file-link) Canvas Figma File Link ------------------------------------------------------------------------------------------------------ Get access to the Canvas Figma file here: [](https://docs.airdev.co/canvas/5.3/for-designers#tutorials-and-resources) Tutorials and Resources -------------------------------------------------------------------------------------------------------- Canvas Library with live component previews: ### [](https://docs.airdev.co/canvas/5.3/for-designers#videos) Videos * (30 sec) * (2 min) * (1 min) * (1 min) * (1 min) * (2 min) * (3 min) ### [](https://docs.airdev.co/canvas/5.3/for-designers#file-structure-overview) File Structure Overview The Canvas Figma file contains the following sections: #### [](https://docs.airdev.co/canvas/5.3/for-designers#cover) Cover This layer contains the thumbnail of the library. You can delete this. #### [](https://docs.airdev.co/canvas/5.3/for-designers#app-name) App name This layer will contain the client app's name. You can add the app's name, right-click the frame, and select "Set as new thumbnail" so that the client project is easy to locate within your Figma account. #### [](https://docs.airdev.co/canvas/5.3/for-designers#styles) Styles The Styles page contains logo, typography, color, image, and shadow styles. Figma styles are dynamic variables that store HEX colors, images, typography, and effect settings, which apply to every element on the Blocks and Page Template pages. You can make sweeping changes to the styling of hundreds of components by adjusting the defined styles on this page. Here's an overview of how to change each style: * Changing effect styles: Effect styles control the drop shadow settings on elements. The shadow settings add a very light gray drop shadow to card and tile components by default. #### [](https://docs.airdev.co/canvas/5.3/for-designers#atomic-components) Atomic Components If you picture the Canvas Design System as a set of different-sized LEGO blocks that you can use to assemble your designs, the Atomic Components are the smallest LEGO blocks within the library. These are individual text elements, buttons, inputs, images, tags, and other elements found within every Block component. Similar to changing Styles, changing any of these atomic components will automatically update every instance where that atomic component is used throughout your file. You will probably not need to modify these components, but you will usually add more instances of them to autolayout groups and other components when assembling custom mockups. #### [](https://docs.airdev.co/canvas/5.3/for-designers#desktop-page-templates) Desktop Page Templates Desktop Page Templates are the desktop versions of the page templates within the Canvas library. Each Page Template contains different "Page-level elements" (found on the "Atomic Components" page of the file) and an 860px autolayout group with two green placeholders. To use a Page Template for a new mockup, add a new instance of that Page Template to your Figma file. Then, detach the instance of that Page Template so that you can add Blocks within the 860px autolayout group. You may then decide to create a new component of that customized page template. #### [](https://docs.airdev.co/canvas/5.3/for-designers#desktop-blocks) Desktop Blocks Desktop Blocks are the desktop versions of the blocks within the Canvas library. Each block contains different Atomic Components within autolayout groups. If you'd like to use and modify a Desktop Block within your design, it's best to add an instance of that block to your Figma file and then detach it to rearrange or add any elements within the autolayout group. You may then decide to create a new component from the customized elements if you plan to use that design multiple times (e.g., creating a master component of a customized list tile repeating group cell, and then adding instances of that list tile to create new rows in your repeating group). #### [](https://docs.airdev.co/canvas/5.3/for-designers#mobile-page-templates) Mobile Page Templates Mobile Page Templates are the mobile versions of the page templates within the Canvas library. Each Page Template contains different "Page-level elements" (found on the "Atomic Components" page of the file) and an 860px autolayout group with two green placeholders. To use a Page Template for a new mockup, add a new instance of that Page Template to your Figma file. Then, detach the instance of that Page Template so that you can add Blocks within the 860px autolayout group. Alternatively, you can keep the Page Template as a component instance and then swap one of its Placeholder groups for a Block component. #### [](https://docs.airdev.co/canvas/5.3/for-designers#mobile-blocks) Mobile Blocks Mobile Blocks are the mobile versions of the blocks within the Canvas library. Each block contains different Atomic Components within autolayout groups. If you'd like to use and modify a Desktop Block within your design, it's best to add an instance of that block to your Figma file and then detach it to rearrange or add any elements within the autolayout group. [](https://docs.airdev.co/canvas/5.3/for-designers#how-to-create-your-designs) **How to Create Your Designs** ------------------------------------------------------------------------------------------------------------------ ### [](https://docs.airdev.co/canvas/5.3/for-designers#the-my-page-designs-layer) The My Page Designs layer #### [](https://docs.airdev.co/canvas/5.3/for-designers#my-headers-section) **My Headers section** By default, the Figma file contains 6 Header navigation variants of a component called “Default Header” for the three default Canvas User types: Logged-in (desktop and mobile variants) Logged-out (desktop and mobile variants) Admin (desktop and mobile variants) You can edit the existing headers, and/or add new header variants within this component in any way to define the app's navigation. It's totally up to you! Any time you want to make changes to the navigation elements across multiple mockups, it's best to change the text and icon elements within this main component’s variants. Then, adjust the variants of the header instances within Page components to quickly switch between which header is displayed on a Page. An instance of the Default Header component is within every instance of the Page Template elements by default, so editing the Default Header will edit the Headers within all of the Page Template components automatically. #### [](https://docs.airdev.co/canvas/5.3/for-designers#my-page-components-and-my-screens) My Page Components and My Screens This column is the intended space to create one main page component for every Page defined in the "Pages" table of the scope doc. A new page component can be created by: Adding an instance of any of the Canvas Page Template components that come with the Figma file. Detaching the Page Template component and detaching any sidebar navigation components within it (e.g., if you add an instance of the Standard Dashboard Page template, you will want to detach both the Standard Dashboard Page Template component and the Sidebar component that comes within that Page Template) Creating a new component from the detached page, and customizing it to match the scope (e.g., "Winery Portal Page" in the video example). Once your new page component is created, that component will be the 'main component' for that page's Screens. In this Winery Portal Page example video, there are 5 tabs (Dashboard, Wines, Experiences, Orders, Bookings). In total, this Dashboard page has around 16 Screens. We want to keep those 16 Screens attached to the main Winery Portal Page component, so that we don't have to individually update 16 Screens if we need to make a change that affects every Screen. By keeping them attached, we can make sweeping changes across tons of mockups in just a few clicks. Since each Screen will contain an instance of the Winery Portal Page component, we can use different overrides and visible elements to show each Screens' UI. We can also swap placeholder components with custom block components that we create (as shown in the video with the Stripe empty state example). Note: When a Screen needs to show a popup, you can combine a Screen instance and a Popup component into a single frame. This preserves the Screen instance while displaying a popup on top of it. Though the above setup recommends creating a component structure before diving into designing each Screen, it will likely save tons of time when needing to make changes since you can easily update a single Page component once and see those changes reflected in all of the related Screens (instead of needing to manually update many detached Screens). This set up will also make it much easier to update mockups when adding new functionality for future follow-on builds. #### [](https://docs.airdev.co/canvas/5.3/for-designers#example-files) Example files: [](https://docs.airdev.co/canvas/5.3/for-designers#tips) Tips ------------------------------------------------------------------ * All components with a 🟢 emoji are often atomic components or blocks containing variants. All components with a 🔴 emoji are meant to be detached. * Every master component and component instance will have a purple element name and purple borders. Every non-component element will have a blue border. If you find it challenging to change an element, it is probably still attached to a master component. Quickly identify this by seeing if it has a purple border, and click CMD+D to detach it without checking whether it is a component within the layers panel. * Use Figma's "swap component" function to change icons. * Use autolayout to keep consistent spacing between elements. * Use frames instead of groups. * You do not need to detach a component instance if you are only deleting elements not included in that instance's master component. However, you will need to detach any component if you would like to add any element to it or change the order of the elements within it. [](https://docs.airdev.co/canvas/5.3/for-designers#canvas-library) Canvas library -------------------------------------------------------------------------------------- [](https://docs.airdev.co/canvas/5.3/for-designers#canvas-design-system-specifications) Canvas design system specifications -------------------------------------------------------------------------------------------------------------------------------- #### [](https://docs.airdev.co/canvas/5.3/for-designers#page-template-sizes) Page template sizes * 1220px width for most pages. * Exceptions: * 2-Column Menu Tabs Page: 1410px width * Floating Map Search Page: 2600px width * Profile Tabs Page: 1410px width * Standard Multi-Step Page with Sidebar: 1410px width * Vertical Multi-Step Page: 1410px width #### [](https://docs.airdev.co/canvas/5.3/for-designers#block-sizes-content-containers) Block sizes (content containers) * Desktop: 860px width * 40px of padding on all sides * Mobile: 300px width * 20px of padding on all sides * Canvas will automatically add 40px of space between each block on a page. #### [](https://docs.airdev.co/canvas/5.3/for-designers#popups) Popups * Standard: 680px width * 30px of padding on all sides * Small: 360px width * 30px of padding on all sides #### [](https://docs.airdev.co/canvas/5.3/for-designers#typography-scale) Typography scale * Size 44: Large Title (for CTA Page Titles) * Size 30: Medium Title (for Standard Page Titles) * Size 23: Small Title (for RG and Group Headers) * Size 19: Subheading, Large Body * Size 15: Body, Buttons, Tabs (default) * Size 13: Microcopy, Metadata, Overline #### [](https://docs.airdev.co/canvas/5.3/for-designers#fonts-and-weights-for-all-font-sizes) Fonts and weights (for all font sizes) * Inter Bold - Weight: 600 * Inter Semibold - Weight: 500 * Inter Standard - Weight: 400 (default) #### [](https://docs.airdev.co/canvas/5.3/for-designers#button-sizes) Button sizes * 45px height for CTA buttons and marketing page buttons with 19pt font * 40px height for standard buttons with size 15pt font (default) * 28px height for smaller buttons above repeating groups with size 15pt font #### [](https://docs.airdev.co/canvas/5.3/for-designers#inputs-dropdowns-searchboxes) Inputs, dropdowns, searchboxes * 45px height, with Inter Standard (Black) 19pt text and light grey borders, for CTA and marketing pages * 40px height, with Inter Standard (Black) 15pt text and light grey borders, for standard app pages (default) #### [](https://docs.airdev.co/canvas/5.3/for-designers#icons) Icons * Canvas uses the feather icons library for most icons. Bubble supports Google Material icons and Ionic icons as well. #### [](https://docs.airdev.co/canvas/5.3/for-designers#maps) Maps * Canvas contains the following map styles by default: * Apple Maps (default) * Neutral Blue * Dark Mode * Just Places * Bubble supports custom Google map styles as well. [](https://docs.airdev.co/canvas/5.3/for-designers#planning-for-responsiveness) Planning for responsiveness ---------------------------------------------------------------------------------------------------------------- (Please note the below responsive principles apply to the first version of the Bubble responsive engine, and not the Beta responsive engine) * The Bubble responsive engine is slightly different from other visual development platforms such as Webflow. Bubble doesn't yet support the following responsive settings: * Elements that collapse in width conditionally based on data (e.g., displaying a sidebar for some Users on a page and collapsing that same sidebar for other Users on that same page). * Exception: * Bubble can collapse elements in width based on the Current Page width. * Variable font sizes from desktop to mobile. * Overlapping elements of different sizes (e.g., image elements that must scale proportionally as the page is resized, with text elements on top of it.) * Exceptions: * It is possible to set an image as the background image of a group with text on top of the image. However, the image will not scale proportionally as the page is resized. * It is possible to have overlapping elements if they remain the same size on all screen sizes. * Elements that change in size on hover. * Elements that dynamically change in width, height, and position based on viewport height and width. [](https://docs.airdev.co/canvas/5.3/for-designers#designing-in-figma) Designing in Figma ---------------------------------------------------------------------------------------------- A common question that Bubblers ask is whether they should create designs in Figma, or design everything directly in Bubble. We almost always recommend using Figma first, because it is easy to make sweeping changes across your designs before architecting them in Bubble. If you are new to Figma, these are the main controls to utilize which save tons of design time: * Main components, component instances, and overrides: In Figma, every element within the file is either a main component or a component instance. You can define a main component (e.g., a Title Group), and include any elements you need in there (title text, results text, sort dropdown, filter dropdown, new button). As you are building your designs, if you realize that all Title Groups need to have a larger font or an additional element, you can add that element within the Title Group main component and all of the Title Group instances will update in your designs immediately. In Bubble, each Title Group would be a standalone group of elements, which may have similar defined styles, but all of them would need to be modified individually. 1. Main components and components instances are similar to the concept of reusable elements in Bubble, but Figma has 'overrides' which allow us to quickly customize the individual properties within each component instances without breaking the linkage to their main component. In the Canvas Figma file, everything is a component or a component instance, which significantly speeds up the time it takes to create consistent and cohesive designs. In Bubble, there is not currently a way to create that same UI component structure and system. * Color styles: Figma has color styles which allow us to define a color palette for all of the components in a Figma file, and change all of the color palette styles in seconds. In Bubble, colors are nested within each element style, and changed individually and manually. * Typography styles: Figma also has typography styles which allow us to change the font and type scale across all of the components in a few minutes. In Bubble, typography is nested within each element style, and changed individually and manually. * UI Plugins: Figma's plugins are UI focused so it's very easy to populate realistic dummy data and imagery in mockups instead of needing to add these manually as individual app data entries. [](https://docs.airdev.co/canvas/5.3/for-designers#creating-figma-designs-in-bubble) Creating Figma Designs in Bubble -------------------------------------------------------------------------------------------------------------------------- In order to successfully recreate your Figma designs in a Bubble app, our best recommendation is to: 1. Create an app with the Canvas Base Template template 2. Import the page templates and blocks you need using the Canvas Chrome extension based on your designs 3. Make modifications within Bubble based on your high-fidelity mockups Though Bubble has a Figma integration, it doesn't recognize element types, styles, and workflows, so running a 1:1 import from a Figma file to Bubble usually takes more time than adding the blocks through the Canvas extension and making modifications. We recommend creating high-fidelity mockups in Figma whenever you are creating designs for multiple flows, collaborating with other designers, or working through multiple options, and then build them in Bubble when they're finalized. In Figma, everything is a text element or a shape, so it's very easy to make large and sweeping changes to your designs. In Bubble, we must define the specific element type, visual, and responsive properties for each element, so it is harder and more time-consuming to make large, sweeping changes to designs once they are structured in Bubble. If the required designs are small, straightforward, and largely unchanged from their default Canvas state (e.g., just a few blocks), then it is sometimes faster to add those blocks directly in Bubble instead of needing to create mockups first. However, for most UI, it usually saves time to design in Figma before building out designs in Bubble. Changing color styles: If you'd like to change the app's primary color from blue to purple, you can find that style and edit the style's HEX color to a purple HEX color. Then, navigate to any of the component layers within the file, and that purple color will be used in every place that utilizes the app's primary color. Here is a that shows how to do this. Changing image styles: Image styles are similar to color styles in that they both involve modifying the "Fill" setting of a style. The benefit of using image styles is that you can easily change the design system's branding and imagery from its default images to any images that fit the theme of the client's app. For example, if you are building a marketplace that sells cars, you can right-click any image styles and upload pictures of cars in place of the default images. All Canvas components that utilize that image will display the car images by default. Here is a that shows how to do this. The "My Page Designs" tab contains a grid layout to help organize your app's headers, page components, and screens. Here is a that walks through an overview of these updates, as well as a more realistic example which contains some common example component structures. It's probably easiest to view the video and example file first, but here is an overview of the new sections as well: (simple component structure) (advanced, recommended component structure) The contains full-page previews and descriptions of all page templates and blocks within the Canvas design system. Use this library to discover different page templates and blocks, and then add them to your mockups by searching for them within the "Assets" panel of the Figma file. [https://www.figma.com/community/file/1387894540487619534](https://www.figma.com/community/file/1387894540487619534) [build.airdev.co/library](https://build.airdev.co/library) [How to change the cover](https://www.loom.com/share/da3bd537698849a58c198f2cc8ce5252) [How to change the logo elements](https://www.loom.com/share/055e88835cc848ae9b83285dbc5937aa) [How to change the primary color style](https://www.loom.com/share/d67307511dfa4f8ea8e55a08cac58101?sharedAppSource=personal_library) [How to change product image color styles](https://www.loom.com/share/e567013d9d864ad9984fc3b26a623a05) [How to create a signup page](https://www.loom.com/share/de40f17ef2694c1d9753d83e6d2c7862) [How to create a search page with tiles](https://www.loom.com/share/3702ee7e269e411aa95568fb3513bc59) [How to create a portal page with a custom form](https://www.loom.com/share/ac5fad11b6254b6aafa2393ade8636fd) [video](https://www.loom.com/share/d67307511dfa4f8ea8e55a08cac58101?sharedAppSource=personal_library) [video](https://www.loom.com/share/e567013d9d864ad9984fc3b26a623a05) [video](https://www.loom.com/share/27fc320b4ee7437e9124753310e6de30) [Winery app](https://www.figma.com/file/gml2dYdTy9r1czInhuZ3M8/Example-Project---AirTour?node-id=914%3A140871) [Airbnb](https://www.figma.com/file/zr3vckLqxlSmFIdJ4o1Ybm/Base-Project-Example-(Airbnb)?node-id=706%3A90208) [AirTour](https://www.figma.com/file/gml2dYdTy9r1czInhuZ3M8/Example-Project---AirTour?node-id=914%3A140871) [Canvas library](https://canvas.airdev.co/library) --- # Admin Portal | Canvas Documentation [PreviousWorkflow Widgets](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets/workflow-widgets) [NextAdmin analytics](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownerdashboard) Last updated 11 months ago The is a complex page where the app admin of the platform can view, manage, and download raw site data. To reduce the amount of workflows in the Admin Portal page, we've moved a lot of the app-wide settings workflows and UIs to separate reusable elements. In each reusable element, we've included placeholder groups so you can easily add additional content to the groups by resizing the placeholder groups. [Admin analytics](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownerdashboard) [Admin email & templates](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/owners-portal-reusables/adminemail) [Admin header & footer](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownerseosettings) [Admin legal popups](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownerlegalpages) [Admin branding, setup checklist, and settings](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownergeneralsettings) [Admin options app variables](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/owners-portal-reusables/admin-option-settings) [Admin Portal](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages#admin-portal-overview) --- # Cookies Permission | Canvas Documentation [PreviousSignup & Log in](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/signup-login) [NextWidgets](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets) Last updated 11 months ago **Element name:** cookies\_permission **Purpose:** Get the user's consent to store cookies on their device To use this feature, make sure you enable this setting in the . By default, the cookies\_permission reusable element is placed in a floating group anchored to the bottom of marketing pages. To add this banner to another page, simply select "FloatingGroup cookies" and copy the floating group with workflows. On the new page, right click and select page with workflows. Make sure the floating group is flushed to the bottom of the page and set to "vertically float to the bottom". [Admin portal](https://docs.airdev.co/canvas/v/2.0.0/using-the-template/reference/pages/owners-portal-page#admin-portal-overview) --- # About us | Canvas Documentation [PreviousSaaS homepage](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-3) [NextPricing](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-5) **Page name:** about **Purpose:** Acts as a marketing page for your application and includes information about your company and your team ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FxkhwtXoGCQ6Hty5Sg29f%2Fabout.png&width=768&dpr=4&quality=100&sign=f38ec566&sv=2) --- # Verify | Canvas Documentation [PreviousReset Password](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/reset-password) [Next404](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/404) Last updated 4 years ago Was this helpful? **Page name:** verify **Purpose:** Destination page where users are directed to when they click the verify button from the email in the email verification process [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/verify#workflows) Workflows ---------------------------------------------------------------------------------------------------------------------- The verify page has four events that trigger different workflows depending on the scenario ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/verify#page-is-loaded-and-current-email-verification-is-empty) **Page is loaded and current email verification is empty** If`current page email verification is empty`, users will be shown an expired link group, and they will automatically be sent a new verification email. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/verify#page-is-loaded-and-current-email-verification-is-not-empty) **Page is loaded and current email verification is not empty** They will be shown am email verified group and the user's `date completed sign up` will be marked as completed. If the `email verification user's email`is different from the email verification's `email` field, then the user's email will be updated to the new email. Once the user's email is verified on this page, an API workflow will be scheduled to delete the current page email verification. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/verify#button-continue-is-clicked) **Button continue is clicked** Users will be redirect to the `index` page if they are logged in. If they are not logged in, they will be taken to the `login` page. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/verify#button-go-home-is-clicked) **Button go home is clicked** They will be redirected to the index page. If the user waits too long to verify their email the link will expire ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPzIrVdKjYEp2kmmcAC%252F-MPzJcWBtOhrehE3jxg3%252Fimage.png%3Falt%3Dmedia%26token%3D97e573b0-2d9d-4173-9c2f-865b2f02e3dd&width=768&dpr=4&quality=100&sign=6526a543&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPzA9nzckjzx_cKjRy4%252F-MPzHjRHvYxriACaSKwS%252Fimage.png%3Falt%3Dmedia%26token%3Dddcc9809-d1b8-434f-b2c1-bc31b205dd79&width=768&dpr=4&quality=100&sign=dcbe8b73&sv=2) --- # Marketplace homepage | Canvas Documentation [PreviousProduct homepage](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-1) [NextSaaS homepage](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-3) **Page name:** home2 **Purpose:** Acts as the homepage for your application and manages all user redirection for logged in users A marketplace homepage example for all non logged in users. ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FamJHCaYMhtuswVBCVMla%2Fhome2.png&width=768&dpr=4&quality=100&sign=f7ee3247&sv=2) --- # Product homepage | Canvas Documentation [PreviousIndex](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index) [NextMarketplace homepage](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-2) Last updated 11 months ago **Page name:** home1 **Purpose:** Acts as the homepage for your application and manages all user redirection for logged in users A simple homepage example for all non logged in users. SaaS landing page example ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FC3cErVbEr7661PbX5e5t%2Fhome1.png&width=768&dpr=4&quality=100&sign=1d791ee4&sv=2) --- # Pricing | Canvas Documentation [PreviousAbout us](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-4) [NextAdmin Portal](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal) Last updated 11 months ago **Page name:** pricing **Purpose:** Acts as a marketing page for your application and includes information for different plans, features comparison table, and an FAQ section ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FZx0WPDX2gyYrATehlBwk%2Fpricing.png&width=768&dpr=4&quality=100&sign=30e3ebaa&sv=2) --- # Widgets | Canvas Documentation [PreviousCookies Permission](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/cookiespermission) [NextApp security](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets/app-security) **UI Widgets** UI widgets offer elements designed to be interacted with by your users on the front end and contain workflows specific to the reusable. Typically you should clone these reusables and customize them for your specific use case. **Workflow Widgets** Workflow widgets contain workflows that can be referenced from the page using the 'Trigger a custom workflow from a reusable element' action. [App security](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets/app-security) [Header Widgets](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets/ui-widgets) [Workflow Widgets](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets/workflow-widgets) --- # SaaS homepage | Canvas Documentation [PreviousMarketplace homepage](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-2) [NextAbout us](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-4) **Page name:** home3 **Purpose:** Acts as the homepage for your application and manages all user redirection for logged in users A SaaS homepage example for all non logged in users. ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FKAAa5OKRYSZz859pMDUs%2Fhome3.png&width=768&dpr=4&quality=100&sign=ca1fa6da&sv=2) --- # Legal | Canvas Documentation [PreviousLogin](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/login) [NextReset Password](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/reset-password) Last updated 11 months ago **Page name:** legal **Purpose:** Displays the text content for the Terms & Conditions and Privacy Policy. You can mange the **Privacy policy** content from Settings > Privacy policy in the . You can mange the **Terms of service** content from Settings > Terms of service in the . You can change the color of the legal banner from Settings > Legal page banner color in the . [Admin portal](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal) [Admin portal](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal) [Admin portal](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal) --- # Sidebar tab | Canvas Documentation [PreviousMenu Focus Elements](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/menu-focus-elements) [NextData types](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/data-structure) Last updated 11 months ago **Reusable name:** sidebar\_tab **Overview:** Used as sidebar tabs in the admin page and standard portal pages. You can copy and paste an existing sidebar\_tab and define the below: **Icon** Tab feather icon **Tab text** Tab name (e.g. Users or Data type 1 from the image above) This will be used as the tab's name and as a parameter in the url (&tab=Tab text) **Default tab color** Default tab background color **Selected tab color** Tab background color for a selected tab (e.g. Blue tab in image above) **Hovered tab color** Tab background color for a hovered tab (e.g. Gray tab in image above) **Selected font color** Font and icon color for select tab **Hovered font color** Font and icon color for hovered tab **Show subtab (y/n)** If selected, a chevron icon will show next to the Tab text **Subtabs (string of text)** Utilize Bubble's `arbitrary text` to pass and parse a string of subtab text **Notifications (number)** If this value is not empty, a notifications badge with a count number will show **Workflows**: Workflows to navigate to tab or subtab are included in this reusable element: * Clicking on a tab will append tab=**Tab text** to the url * Clicking on a subtab will append **sub=Subtab text** to the url **How to setup** To show different content groups for each selected tab, you will add a conditional statement to the content group similar to the one below on the admin page or other portal pages: or 'Get tab from page URL is sidebar\_tab's text' [reusable element properties](https://manual.bubble.io/core-resources/elements/reusable-elements#reusable-element-properties) Example of defining a list of subtabs using 'Arbitrary text' ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F3YVthWvPDoyRZ3zcQz2i%2Fconditional.png&width=300&dpr=4&quality=100&sign=682849c7&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FmnwNP1R9VBevcBMaRFB7%2Ftab.png&width=300&dpr=4&quality=100&sign=6f882c42&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2Fr0tclMPxQCNQfOLAme1f%2Ftabs.png&width=768&dpr=4&quality=100&sign=4ca84c9c&sv=2) --- # Backend Workflows | Canvas Documentation Your app must be on a paid Bubble plan to use Backend Workflows Using backend workflows can be ideal and/or necessary in the following situations: 1. When you have long and complex workflows with a lot of actions 2. When you need to reuse the same workflow from different parts (pages/reusables) of the application 3. When you need to run a workflow on a list of things, (i.e., loop through a list) 4. When you need to schedule a workflow in the future (with the ability to cancel the workflow) 5. If you want your workflow to run asynchronously. Backend workflows run on Bubble's server, and any workflow on a standard Bubble page which schedules a Backend workflow won't need to wait for the entire (Backend) workflow to finish before moving on to the next step in the front-end workflow. 6. If you want to create a webhook - or endpoint - to allow other applications to send and receive data from your Bubble app. For more information on Backend workflows, read Airdev's Bubble Development Guide and [Bubble's Manual](https://manual.bubble.is/using-the-bubble-api/how-to-use-the-api.html) . Pro tip: If you'd like to run backend workflows synchronously (in order in the WF) and receive a response to the workflow action, set up an API connector action that points at the backend Workflow's API. Note that any API token used in the API Connector action should not be passed in the URL, but in the headers, and it should be marked as "Hidden" so that it cannot be stolen by app users. Our template comes with 7 Backend workflows in the following folders. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/api-workflows#verify) Verify * **verify\_send:** This will create a new verify record in the database and send a code to the user via email or sms * **verify\_check:** This endpoint is called when the user submits a code to verify their email or phone number. When run, Canvas will verify whether the code is valid and return true or false * **verify\_delete:** Deletes a verify record 15 minutes after it has been created. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/api-workflows#emails) Emails * **send\_email**_**\_**_**template:** This workflow is a template action that can be copied and edited for new email template backend actions. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/api-workflows#canvas) Canvas * **update\_usersnap** \- When you start a project with AirDev, we'll use this workflow to enable usersnap testing on your app so you can submit feedback in our client management portal. [PreviousOption Sets](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets) [NextDesign standards](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/design-standards) Last updated 11 months ago --- # Reusable elements | Canvas Documentation [PreviousTerms of Service (deprecated)](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/terms-of-service) [NextHeader](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/header) Last updated 4 years ago Was this helpful? Detailed references for each reusable element in the Canvas Base Template, complete with screenshots and in-depth descriptions. [Header](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/header) [Footer](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/footer) [Signup & Login](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/signup-login) [Popups Reusable (derprecated)](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/popupsreusable-1) [Cookies Permission](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/cookiespermission) [Admin Portal](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/owners-portal-reusables) --- # Reusable elements | Canvas Documentation [Previous404](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/404) [NextHeader](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header) Detailed references for each reusable element in the Canvas Base Template, complete with screenshots and in-depth descriptions. [Header](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header) [Footer](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/footer) [Signup & Log in](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/signup-login) [Cookies Permission](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/cookiespermission) [Widgets](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets) [Admin Portal](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/owners-portal-reusables) [Menu Focus Elements](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/menu-focus-elements) [Sidebar tab](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/sidebar-tab) --- # Roles & Permissions | Canvas Documentation [PreviousBubble Pages & Blocks](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules) [NextMenus & Navigation](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation) Last updated 4 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions#the-bubble-pages-option-set) The 'Bubble Pages' option set --------------------------------------------------------------------------------------------------------------------------------------------------- This option set is used to manage a user's permission to view a specific page. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions#display-attribute) Display attribute In the header element is a workflow that checks whether the current users role is allowed to access the current page. This is done by checking the page name in the url against the page names listed in this option set. For this reason, it is imperative that the Display text matches exactly the page name shown in the editor. If you change the name of a Bubble page, don't forget to update it here! ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions#private-attribute) Private? attribute When checking for a user's permission to access a page, Canvas checks whether the page is marked as private. If this attribute is set to yes, the user will only be allowed to view the page if this option's List of Roles contains the current user's role. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions#roles-attribute) Roles attribute This is a list connection to the Role option set. Any user role that should be able to access this page should be added to this list. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions#the-role-option-set) The 'Role' option set ----------------------------------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions#display-attribute-1) Display attribute This text is what is shown in the admin portal and throughout your application to display the role of a user. Since the 'account' page lets a user manage their login credentials and profile data, you will typically want to add every role you create to the Account page's list of roles ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions#default-roles) Default Roles Your Canvas template has two user roles preconfigured for you but you can add as many roles as you need to meet your applications needs. #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions#the-app-admin-role) The App Admin Role Redirects and permissions are predefined in your template that will automatically direct a user assigned the App Admin role to the admin portal when they are logged in. Privacy conditions are in place as well that will prevent any user without the App Admin role from being able to view the admin portal. #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions#the-standard-role) The Standard Role This role represents any default user on your platform that does not need access to the admin portal ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions#adding-a-new-role) Adding a new role To add a new role: * Add a new option to the Role option set (e.g. Account Admin or Outside Sales) * Add the new role to any Bubble Page option that the role should be allowed to access * Assign the Role to Users, usually through one of these methods: * Assign the new Role to users manually in the Bubble Editor's Data tab * Build the logic to let App Admins sign those Users up from the admin page * Build the logic to assign the new Role to the Users when they're signed up [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions#page-redirects) Page Redirects ----------------------------------------------------------------------------------------------------------------------- As a best practice we recommend using the index page of your app as the default page to which a user is redirected when the user doesn't meet privacy rules for a specific page. This gives you a single place to manage all the redirects for your application for each type of user role. In the standard Canvas Template the Index page redirects users to the Admin Portal page if they are logged in as a user with an App Admin role . Otherwise they will not be redirected away from the Index page. Included in your Canvas template is an option set named Role that is used to manage the user permissions for your application. See below. If you create a new page to which a specific role should be redirected, you can add additional actions to the above workflows. For more details on how they are currently set up or how to add conditional redirects see our complete reference for the While Canvas provides you a great way to manage user permissions and page redirects at a high level you should always create the appropriate to protect your data within the Bubble editor. [privacy rules](https://manual.bubble.io/working-with-data/privacy-and-security) [Default Roles](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions#default-roles) [Index page.](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages#index-page) The Display text should match the page name shown here exactly Default redirects set up on the Canvas index page ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MK_r0tKnm410jTYf2Rl%252F-MK_uIUIjHORIF_vAY-n%252Fimage.png%3Falt%3Dmedia%26token%3D023507b4-d4c2-4bf6-9beb-01fda4227af0&width=768&dpr=4&quality=100&sign=56fd624e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNnlBvVgs47Rh8Yf8as%252F-MNnqf2Hnyc0rARvtw4h%252Fimage.png%3Falt%3Dmedia%26token%3Dfc888123-5fb5-445f-94f3-7e021ed0221d&width=768&dpr=4&quality=100&sign=405f8c38&sv=2) --- # Branding & Design | Canvas Documentation [PreviousGetting Started](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/getting-started) [NextMarketing Pages](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/marketing-pages) Last updated 4 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#basic-branding) Basic Branding --------------------------------------------------------------------------------------------------------------------- It's important to update the branding of your application in the admin portal as we use this data throughout the application to display your company's information. To get started, click the Branding tab under Setting in the left menu of the admin portal. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#name) Name The name that is set here is used extensively throughout the front end of your application as well as in emails and notifications sent to your users. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#logo) Logo In this tool you can set desktop and mobile logos for both light and dark backgrounds. The logos set here are displayed in the top left of your application header as well as in your emails and other communication. The browser favicon cannot be set here and must be uploaded to the Bubble editor under Settings > General > Favicon [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#seo-and-social) SEO & Social ------------------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#seo) SEO SEO descriptions and tag lines are set under Branding > Default SEO/Social Tags. This data is when indexing your app's pages for search results and by other services to display data about your platform in link previews. Marketing pages created using the page builder and Bubble pages that are added with the extension will all use these SEO tags by default. If you would like to customize these tags for a specific page: * **Marketing pages** Change the SEO settings for an individual page from the Pages tab in the admin portal * **Bubble pages** Edit the SEO settings directly from the page header input on the page's property inspector ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#social-links) Social Links Links to your social media channels can be shown in the footer throughout the application. To manage what is displayed click on the Header/Footer link in the left menu, scroll down to the Footer section, and click on Social media tab. Here you can manage what links are shown and the icons that should be displayed. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#styles-and-colors) Styles & Colors ------------------------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#using-styles-instead-of-setting-individual-properties) Using Styles instead of setting individual properties Canvas uses a consistent set of styles (set in the`Styles` tab). We recommend using these styles instead of manually setting visual attributes on an element, as this maintains consistency and makes it easier to make adjustments later. You can make adjustments to these styles by going to the Styles tab in the Bubble editor. If you might be using some of our advanced features such as style updates, you should refrain from modifying existing styles or changing any of their names. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#use-conditional-properties-if-you-need-to-deviate-from-a-style) Use conditional properties if you need to deviate from a style It's not unusual for a specific element to need formatting specific to only that element. When this scenario arises, you can use a conditional to set a specific property for that element. For instance, maybe all the properties on the `Text_Regular_Black_Body_16pt` style are perfect except you need the text to be center aligned. Rather than removing the style for that text element, we can adjust the text alignment property using a conditional that has an expression which will always be true. Under the Conditional tab in the property editor for the element you need to change, click 'Define another condition', add an expression that say's `This url is not empty`, select the Text alignment property and set it to Center. Because the url for the site will always exist (i.e. is not empty) this condition will always be true so the text will display with center alignment. And since we have maintained the linkage to the style itself, if we make any changes to this style it will automatically be reflected in this element as well! There are other 'always true' expressions that can be used such as `Current date/time is not empty` or `This element is visible` ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#update-your-apps-colors) **Update your App's Colors** At times you need to change the main colors your app is using. While you could do this by going through all the styles one by one, Canvas makes this simple by providing a tool in the Canvas extension that will do all the work for you. Open the Chrome extension and click on 'Update app color'. Here you can select your primary, secondary, and tertiary colors for the app. Select your new colors and click 'Update colors'. It will take Canvas up to 5 minutes to update the colors across all the styles in your application. You will need to leave your browser window open while the colors are being updated so plan accordingly when triggering this action. **How to use the different types of colors** **Primary Colors**: Styles with this color should be used for the main colors through your application and for positive action elements such as a button that creates or updates a thing in your database. **Secondary Colors**: Styles with this color should be used to accent the design of your application as well as secondary action elements such as a Save As Draft button that is an alternative to a primary action Save & Publish button. **Tertiary Colors**: Styles with this color should be reserved for warning, alert, and negative action elements such as a delete button ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#update-your-apps-styles) Update your App's Styles If your version of Canvas is not the latest version, when you add a new page or block to your app it may contain styles that have not yet been added to your Bubble application . In this scenario you will be prompted to update the app's styles. It will take Canvas 5 - 10 minutes to update the styles in your application. You will need to leave your browser window open while the styles are being updated so plan accordingly when triggering this action. The Canvas template is based on the principles, which we use with most of our clients. This makes it easy to translate specs into apps without getting caught up in the creative process. Not sure what colors to use? Check out this r for ideas! [AirDev Canvas Design](https://airdev.co/design) [color palette generato](https://coolors.co/app) [used by Google](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/seo) Link preview for Canvas Edit properties in the Styles tab ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNpAf6LX0KuUAlIbO_W%252F-MNpD-tUuaxkgjopsDMI%252Fimage.png%3Falt%3Dmedia%26token%3D94484fc3-7be3-4ecd-a133-838d765bad32&width=768&dpr=4&quality=100&sign=38563dfa&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MO7rzXY0OA8krQF6ife%252F-MO8-6pKYNYKk2x16y7B%252Fimage.png%3Falt%3Dmedia%26token%3D230ddb12-7c9d-483d-b154-5764bfe49549&width=768&dpr=4&quality=100&sign=8f392723&sv=2) --- # Login | Canvas Documentation [PreviousAccount deletion](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/account/account-deletion) [NextLegal](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/legal) Last updated 11 months ago **Page name:** login **Purpose:** Provides functionality for your users to signup and login to your application and go through the forgot password process You can mange the log in page design from Branding > Log in page style in the . [Admin portal](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FlHlm8xOTxnkpG8CkC0oH%2Fimage.png&width=768&dpr=4&quality=100&sign=746c2b2b&sv=2) --- # Data & Workflows | Canvas Documentation [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/data-and-workflows#copying-development-data-to-live) Copying development data to live -------------------------------------------------------------------------------------------------------------------------------------------------------- Canvas uses the database extensively to create a highly functional and dynamic application. While in development, all this data is being saved to the development database of your app. It's important to remember that your Bubble app has two separate databases for the live and development versions. When deploying live the first time you will need to copy the development database to the live database for Canvas to have access to all the settings you have applied during development. To do this, from the Bubble editor navigate to the Data tab, open App data, and then click on 'Copy and restore database' in the top right. In the popup click the 'Copy development data into the live database' button, ensure 'Data type to copy' is set to All types, type 'COPY FROM DEVELOPMENT TO LIVE' in the input and press the Confirm button. Be aware that copying the data from one version to the other will overwrite all information in the database to which you are copying data. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/data-and-workflows#copying-specific-data-types) Copying specific data types After your initial deployment to a live application you may find scenarios where you need to copy a specific data type from Live to Development or Development to Live. This is common especially with email templates and marketing pages where you make updates in development and need to have the new data copied directly to the live site. To do this, you will follow the same steps as outlined above for copying the entire database. But instead of setting the 'Data type to copy' to All types, define the specific Data type you need to copy and then proceed as normal. Below is some guidance on when and how to copy Canvas data types from one database to the other. Data type Guidance and best practices **Website** If you have made a lot of changes to the app settings in the development version it may be easier to simply copy the website data over to the live version rather than duplicating all the changes manually. However, it is a best practice to update app settings directly in the live admin portal once your site has been deployed. **Email Template** Since email templates must be set up with their own custom workflows, adding a new template will require making and deploying workflow changes from the development version of your app. Whether it is the live or development version, you should add and update email templates from the same version (and copy to the other) to avoid content conflicts with your email templates. **Marketing Page &** **Navigation Link** It's a best practice when using the Canvas Page builder to create and and update your marketing pages in the development version and then copy the data to your live site. Since Marketing pages & Navigation links require the other data type to function properly, any time data from one of these data types is copied to another database, data from the other data type should be copied as well. **Palette Color** Palette colors are a standalone data type and can be copied from one version to the other with little impact to the application **User** After the initial deployment, it's not recommended to copy users from one version to the other as this will overwrite any users that have been added to the app in the other version. **Email Verification Request** Email verification request data is generated automatically and is only valid within the version it is created. You will never need to copy this data type. **Dummy** Dummy data is used to populate default content for Canvas blocks when they are first added. When an app is pushed live these blocks should have been customized to display content specific to your application. It's unlikely you would need to copy the Dummy data from development to live. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/data-and-workflows#how-the-website-data-type-is-being-used) How the Website data type is being used ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- There should only ever be one Website entry. More than one website entry will break the Canvas Template. Every Canvas template will have a Website data type that is used to manage all app-wide settings such as colors, app name, contact information, etc. Almost all data for the Website object is controlled from within the Admin portal. While you can add additional fields to the website object as needed to customize your application, we recommend not changing the default fields in any way. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/data-and-workflows#using-the-hidden-variables-popup) Using the hidden variables popup -------------------------------------------------------------------------------------------------------------------------------------------------------- **Variable** simply refers to the use of an element to hold one or more values. Instead of repeating these values in multiple places in your page or workflows, the **variable** holds the results of a calculation, a single thing from a database search, a list of things from a database search, or some other value and can be referenced multiple times from other page elements and actions. Each page has a popup called 'Popup Hidden Variables' designed to hold app data as variables for easy reference. As an example, each page has a group element in this popup called 'var - Website object' with the type of content set to Website. The data source then is a 'Search for Websites: first item'. With this variable set up, anywhere you need to reference the Website object on the page (e.g. the app name), rather than doing a search for the website object you can simply reference 'var - Website object's website' instead. This keeps your data organization clean and concise on the page. Any data that is referenced from multiple elements or actions on the same page should be stored in a variable group in this popup to avoid redundancy in retrieving data. This helps minimize the possibility of error when searches are duplicated across elements. It also makes it much simpler to update any search parameters as the search only needs to be changed in one location. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/data-and-workflows#types-of-variables) Types of Variables Variables are stored in two kinds of elements: **Groups** and **Repeating Groups**. These elements are often more useful than custom states because they can have default data sources, conditional data sources, or have their data set by a workflow. A custom state's data can only be set by a workflow. It is good practice to name each Group or RG with a naming convention of `var - [Name of variable]` as opposed to the normal 'Group..." convention. This allows you to quickly search for the page variables using the 'var' prefix. **GROUPS** Groups are used to store single item variables such as a number, text, or single Thing from the database. **REPEATING GROUPS** Repeating groups are used to store list variables such as a list of numbers, list of texts, list of Things, etc. When using a Repeating Group as a list variable, use the **Vertical scrolling** layout style to allow your page to only load the data that is needed to display in the current page view. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/data-and-workflows#using-the-inclusive-yes-no-option-set) Using the inclusive Yes/No option set ------------------------------------------------------------------------------------------------------------------------------------------------------------------ When filtering data by the yes/no field type in Bubble, you can only return values that are either Yes or No. For instance: The inclusive yes/no option set allows you to create search parameters based on the yes/no field type in Bubble and return all things with a value of 'Yes' OR 'No', a value of only 'Yes', or a value of only 'No'. For instance: The enable this we've added a list of yes/no values as an attribute to the Options in the Yes/No Option set. * For the Yes value we add only the 'yes' value to this list. * For the No value we add only the 'no' value to this list. * For the Yes or No value we add both the 'yes' and 'no' values to this list The search logic then is to check, not if the value is EQUAL TO the Yes/no values, but if the value IS IN the Yes/no values. To see how we use this in Canvas, check out the dropdown to filter users by active status on the admin page of your app. It can be found in the elements tree by clicking the '+' to open Group Main Content > Group Nav 8 - Users > Group User header > Dropdown Users. [PreviousMenus & Navigation](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation) [NextEmails & Alerts](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts) Last updated 4 years ago Was this helpful? Group containing the data for the main website object Check if value 'is in' the list of Yes/no values ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MJscNyO3JEnxGVmkJ55%252F-MJsiA15gCPj2Qzu3c4G%252FBoth%2520Yes%2520and%2520No.gif%3Falt%3Dmedia%26token%3Df87de47a-5d8c-4787-a37b-816bbd08bf49&width=768&dpr=4&quality=100&sign=1a896177&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MJscNyO3JEnxGVmkJ55%252F-MJshuV3O8dxW4zj1QkN%252FYes%2520or%2520No.gif%3Falt%3Dmedia%26token%3Dc3a3879b-b994-425b-8a4c-b39385da7d79&width=768&dpr=4&quality=100&sign=d4d3b8c5&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MJsCq_gGG-1FIhTsI8p%252F-MJsQyDioQbO61DDUYUn%252Fimage.png%3Falt%3Dmedia%26token%3Df4bc8d6e-c9e4-4391-b73c-6338c1776499&width=768&dpr=4&quality=100&sign=6b87a824&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MJscNyO3JEnxGVmkJ55%252F-MJskhX6ZPnhYom1uojI%252Fimage.png%3Falt%3Dmedia%26token%3D0609788a-535b-4403-9dd0-a5ea154949c2&width=768&dpr=4&quality=100&sign=98d88c7f&sv=2) --- # Menus & Navigation | Canvas Documentation [PreviousRoles & Permissions](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions) [NextData & Workflows](https://docs.airdev.co/canvas/5.3/canvas-functionality/data-and-workflows) Last updated 11 months ago [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#the-header) The Header ---------------------------------------------------------------------------------------------------------- **Element name:** header **Overview:** The Canvas header allows Canvas developers to create any number of headers for an app. The header reusable dynamically displays different navigation elements, including texts, icons, buttons, the Current User profile image and group focus, and mobile menu. This header element is fully responsive, and it is used on every page of the Canvas template. Each Canvas application comes preconfigured with three headers as shown below. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#admin-user) Admin user #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#standard-logged-in-user) Standard logged in user #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#logged-out-user) Logged out user ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#creating-editing-a-header) Creating/editing a header Canvas developers can create any number of Headers within the admin portal, and each Header can have any combination of dynamic navigation elements (icons, texts, buttons, and the Current User profile picture). You can create a new header or you can choose to clone an existing header if you have one that is similar to what you would like to create. 1. Click New to create a new header from scratch 2. Click Edit to edit the name of the currently selected header 3. Click Clone to duplicate an existing headers settings into a new header 4. Click Delete to remove the currently selected header ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#telling-canvas-which-header-to-display) Telling Canvas which header to display Canvas will display any Header based on the “var - current header” hidden variable within the header reusable. As you create new Headers, you will need to add more conditionals to this hidden variable to specify when to show each Header. For example, you could show a specific Header based on the Current User’s role or show a particular Header based on a certain page’s name. Remember, when setting conditionals Bubble will give priority to the last condition that is true. So if you have three conditions and both condition #1 and condition #3 evaluate as true, Bubble will prioritize condition #3 over condition #1. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#header-sections) Header sections #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#text) Text Text Navigation items will appear to the left of the icons in your header. On a mobile screen, these elements will be moved from the header into the mobile dropdown menu. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#icons) Icons The icon element is a special element as we have included four reusable Bubble elements with GroupFocus drop downs that you can set up to be triggered from the icon. You can add up to 4 icons per header but for best mobile experience we recommend using a max of 3 icons for a header that has the `logged in state` toggled on To set up this functionality, in the Edit Icon Option popup select the `Open widget` action type and then select from one of the four widgets below. * * Widget Action Trigger = `Open notifications widget` * Recommended icon = `bell` * * Widget Action Trigger = `Open messages widget` * Recommended icon = `messages-circle` * * Widget Action Trigger = `Open search widget` * Recommended icon = `search` * * Widget Action Trigger = `Open cart widget` * Recommended icon = `cart` Each of the above widgets contains a small text element that displays a number alert for that widget (think unread notifications or count of items in cart). This number is static by default but can be made dynamic by modifying the `var - unread` or `var - count` elements within the corresponding widget reusable. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#buttons) Buttons You can include up to two buttons on each header. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#general-settings) General Settings * **Logo link** Set the logo link for each header. Choose between the index page or another url. * **User info** Set toggle on if this header is visible to logged-in Users. This header will display the Current User's profile picture with a dropdown menu that allows them to view their account settings or log out. * Check 'Show user's first name' to display the user's name to the left of their profile image. Note, if you would like to display text other than the user's first name, you can edit the `var - user text` element within the header reusable. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#mobile-menu-and-responsiveness) Mobile menu and responsiveness Each Header's responsive settings are set automatically. On desktop, the Header will display text links, icons, buttons, and the Current User profile picture. On mobile, the Header will hide any text and button elements, and display the hamburger menu icon. Clicking on the hamburger menu icon will open a mobile menu that contains the Header's text and button navigation elements. The breakpoint to display the mobile menu is determined dynamically for each Header on page load. If a Header does not contain any text or button navigation elements, the hamburger menu will not become visible on mobile. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#updating-the-logged-in-focus-group-menu) Updating the logged in focus group menu You can manually update the elements in the user account dropdown directly from the header reusable element in the Bubble editor. From the elements tree open **GroupFocus Mini > Group Logged In** There is a button for the user to log out, visit their account page, and navigate to the admin portal. We have also included three placeholder buttons for you to customize and add actions if you would like to create additional functionality. **Placeholder button** refers to a fully designed button element that has been hidden by default but can be unhidden and used as needed in your application. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#the-footer) The Footer ---------------------------------------------------------------------------------------------------------- **Element name:** footer **Overview:** Similar to the Canvas Header, the app’s footer reusable element also displays Navigation Items defined in the admin portal. The primary difference between the header and footer is that there is only one footer version; you cannot define different footer variants through the admin portal. The footer element is included by default on all Bubble marketing pages. For non-marketing pages you will need to add it manually. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#how-to-add-edit-or-delete-navigation-items) How to add, edit, or delete Navigation items Adding, editing, and deleting Navigation Items within the Footer is the same as doing so in the Header. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#styling) Styling The Footer’s desktop design has the app’s text links aligned to the left and the app’s social media icons aligned to the right: On mobile, all elements become centered: ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#footer-sections) Footer Sections #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#pages) Pages Pages are simple text links and your template will have two Navigation items in this section linking to the Home and About pages. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#legal) Legal Canvas allows you to manage your terms of service and privacy policy content directly from the admin portal. By default the footer will have a link to both the Terms of service and Privacy policy pages. We have provided default content for your but the content contains references to text that needs to be changed. If you search for all references of the word "Sample" and replace those with an appropriate word (usually the legal name of your company), that is a start, but you should also determine if the content of the documents is appropriate for your application. To edit the content for these pages, from the left menu navigate to Settings > Terms of service or Settings > Privacy policy We have compiled a list of resources to help you get started with customizing your legal pages. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#social-media) Social media Here you can add social media icons to your footer that link to your social media pages. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#setting-up-navigation-item-actions) Setting up Navigation item actions ---------------------------------------------------------------------------------------------------------------------------------------------------------- When adding items to the header or footer, you will see the same actions available to setup for both. You can set up almost any configuration possible. Here's how: ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#open-bubble-page) Open Bubble page ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#open-external-link) Open external link Enter a url (including https:) that would like to navigate to when this element is clicked. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#run-bubble-action) Run Bubble action This will trigger a workflow in the header reusable called `Run Bubble Action Triggered` which is a Javascript to Bubble element action from the Toolbox plugin. The text value that you save in the 'Bubble action trigger' input will be passed through this event as "This JavascripttoBubble's value". Let's say we want to show a popup when a link is clicked we would set that up with the following steps 1. First let's decide on a unique text we can use to identify that this particular link was clicked. For this case it would make sense to make that text be `show-popup`. 2. Now we need to add an action in the `Run Bubble Action Triggered` workflow to show the popup. On this action add a condition so that it only runs when `This JavascripttoBubble's value is show-popup` . 3. Finally, to set up the link to trigger this action, we will select `Run Bubble action` as the action type and in the Bubble action trigger will add the text `show-popup` . That's it! The popup will now be shown when the user clicks this link. We recommend setting up only one action per link trigger in this Run Bubble Action Triggered. If you need to create a more complex action, put those actions in a Custom event and trigger the custom event from the Run Bubble Action Triggered workflow. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#dropdown-menu) Dropdown menu ---------------------------------------------------------------------------------------------------------------- **Element name:** menufocus\_template **Purpose:** Provide the user with a concise list of actions they can take in a convenient dropdown menu. The dropdown menu is used consistently throughout the Canvas template to provide the user with actions they can take such as Edit/delete a thing, View more details, Send a message, etc. The dropdown is triggered by clicking on the icon, can be dismissed by clicking anywhere outside the dropdown, and is most often used in repeating groups to provide action items for each thing in the list. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#clone-the-reusable-template) **Clone the reusable template** Open the **menufocus\_template** and from the top bar of the Bubble editor click Edit > Clone this Page. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#assign-the-type-of-content) Assign the type of content With your cloned menufocus\_template open, double-click in the gray area of the editor to open up the settings for the reusable. Change the 'Type of content' to the datatype you will be using this menu to edit. You will need to change the type of content for the GroupFocus Dummy as well. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#set-up-the-dropdown-buttons) Set up the dropdown buttons In the elements tree click the '+' to open the GroupFocus Dummy. This group contains all the dropdown buttons in the menu. Group Option 2 and Group Option 3 are already set up as the Edit and Delete actions. There are three more Group Options (1, 4, & 5) that are unused and can be customized to add more buttons to your menu. Each of these groups has a corresponding event in the workflow tab that will be run when the group is clicked. The menufocus\_template reusable element also contains two popups that correlate to the Edit and Delete actions: * **Popup Edit** Clicking on Option 2 (Edit) in the dropdown will open a standard edit form popup to create or edit a thing. * **Popup Remove** Clicking on Option 3 (Delete) in the dropdown will open a popup to remove a thing. Customize/duplicate these popups to your purposes. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#using-the-custom-events) Using the custom events Each popups can be triggered by the corresponding custom events 'Create/edit thing' and 'Remove thing'. Setting up custom events within a reusable gives you the option of using that workflow from the page it is on with the 'Trigger a custom event from a reusable element' action. Each header can contain custom text links, icons, or buttons and have multiple actions that can be set for each item. Learn about how to use each action . **Widget Notifications** This action will show a notifications group focus when clicked. Learn how to customize this element . **Widget Messages** This action will show a messages group focus when clicked. Learn how to customize this element . **Widget Search** This action will show a search input within a group focus when clicked. Learn how to customize this element . **Widget Shopping Cart** This action will show the shopping cart group focus when clicked. Learn how to customize this element . Opening a Bubble page will use the reusable data that is setup inside the editor. For example, you can add the menufocus\_template element to the on a page and trigger a custom event to create/edit or remove a thing. [Privacy Policy resources](https://docs.google.com/document/d/1hqAkqI9N9i0HUUPf-Ql6V2mlZDFePNVarqkbx78_oc4/edit?usp=sharing) [Terms of Service resources](https://docs.google.com/document/d/1_x-D6MKT_dUC_9_gTuDMYv8e5O5n98tol8wdxb7AMQ8/edit?usp=sharing) [here](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#setting-up-menu-item-actions) [Bubble Pages](https://docs.airdev.co/canvas/5.3/canvas-functionality/roles-and-permissions#the-bubble-pages-option-set) [hidden variables popup](https://docs.airdev.co/canvas/5.3/canvas-functionality/data-and-workflows#hidden-variables) [here](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#notifications) [here](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#messages) [here](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#search) [here](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#shopping-cart) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FBKejmV0JULTa9fiF3Ypk%2FScreen%2520Shot%25202023-05-02%2520at%25204.17.01%2520PM.png&width=768&dpr=4&quality=100&sign=699ac7ee&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F6NnxUd90s7p7VeEEPs4D%2FScreen%2520Shot%25202023-05-02%2520at%25204.17.21%2520PM.png&width=768&dpr=4&quality=100&sign=9c66a1d3&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FUzahWrIHelajE3EbIFnd%2Fimage.png&width=768&dpr=4&quality=100&sign=d7e7b6f1&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F8fBxwhYfvk0fd9Q5ucbS%2FScreen%2520Shot%25202023-05-02%2520at%25204.17.08%2520PM.png&width=768&dpr=4&quality=100&sign=be370b24&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FR2GeMpiu65v7SZD546HO%2Fimage.png&width=768&dpr=4&quality=100&sign=22dd5817&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F6E9teEVAEsObNncFgah7%2FCleanShot%25202021-07-19%2520at%252012.37.09.png&width=768&dpr=4&quality=100&sign=c225a21f&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FercmLzBeVqCx5Xa3qr9F%2Fimage.png&width=768&dpr=4&quality=100&sign=c5d307f4&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FYSXhIwVwJUGQrz7tycPw%2Fimage.png&width=768&dpr=4&quality=100&sign=eb217047&sv=2) --- # Account | Canvas Documentation [PreviousAdmin Portal](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal) [NextAccount deletion](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/account/account-deletion) Last updated 11 months ago **Page name:** account **Purpose:** Enables your users to manage their profile and account credentials through a self service portal. The Canvas base template has the following navigation tabs visible by default but you can hide any of these by going to Group Main content > Group Main sidebar > Group Inner sidebar content in the elements tree. We also have included 6 placeholder groups to add additional functionality. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/account#profile) Profile --------------------------------------------------------------------------------------------------------------- Your users can update the names and profile photos for their account in this view. We've also included hidden elements for editing additional values you would like to store on your user object. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/account#login-credentials) Login credentials ----------------------------------------------------------------------------------------------------------------------------------- Let your users securely manage their email, password, and 2fa settings from a single location. Contains all the UI and workflows to ensure the email, phone, and password meet the parameters and verification settings you have defined for your app. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/account#payments) Payments ----------------------------------------------------------------------------------------------------------------- We have included the UI for your users to manage and view their payments settings and history. You will need to build the functionality to fit the data structure of your application. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/account#notifications) Notifications --------------------------------------------------------------------------------------------------------------------------- In the notifications tab the user can set their notification preferences. Please note, this is UI only in the base template and does not make any changes to your app. You will need to set up the workflows and logic to manage the preferences set here. ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2Fm5yYbZYAD5rsbUnfJV02%2Fimage.png&width=768&dpr=4&quality=100&sign=b6ed5eaa&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FQPDaJJUa0XzGSQb1FA3l%2Fimage.png&width=768&dpr=4&quality=100&sign=c2995bab&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FQCAqxtKC9MZon5Wua0Bf%2Fimage.png&width=768&dpr=4&quality=100&sign=a402a526&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FEt0A5t05Op8Hdp0qw1aB%2FCleanShot%25202021-10-06%2520at%252013.35.23.png&width=768&dpr=4&quality=100&sign=4260ab05&sv=2) --- # Signup & Log in | Canvas Documentation [PreviousFooter](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/footer) [NextCookies Permission](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/cookiespermission) Last updated 11 months ago **Element name:** signup/login **Purpose:** Provide the user with signup, login, and password reset functionality Our standard signup/login reusable element can be put on a [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/signup-login#custom-workflows) Custom workflows ------------------------------------------------------------------------------------------------------------------------------------------ There are ten custom workflows in the signup/login reusable element. * **complete sign up** \- This will mark the current user's `Date completed sign up` field as completed and end the sign up flow. * **move current step** - This will move the sign up step to the next step. * **select user type** - This will update the user type selection * **update profile (email verification)** - This workflow will only fire if the App owner requires users to verify their emails during sign up. This will schedule an API workflow to send an email verification link to the user. * **update profile (no email verification)** - This workflow will only fire if the App owner does not require users to verify their emails during sign up. This will mark the current user's `Date completed sign up` field as completed and end the sign up flow. * **set login** - Show the login view * **set reset\_pwd** \- Show the reset PW view * **set signup** - Show the signup view * **restrict to login** \- Restrict the reusable to show only the log in view * **restrict to signup** \- Restrict the reusable to show only the sign up view * **close popup** \- close the popup that this signup/login reusable is placed on. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/signup-login#popup-usage) Popup usage -------------------------------------------------------------------------------------------------------------------------------- When using the signup/login popup, instead of signing in on the signup/login page, users will remain on the page that they've signed up on until they fill out the form in step 2 of the signup process. By default, step 2 is where a new User inputs their First and Last name. After this, if email verification is enabled, users will be redirected to the login page until they've verified their email. Otherwise, this popup will close. **update signup method (of type text)** \- By default, the signup method will be "Email". If a user is signing up with a social media account, please update the custom workflow "update signup method" in the sign up workflow to the name of the social media login method (e.g. Linkedin, Facebook, Twitter, and etc.). This will ensure that a logged in user cannot see the login credentials tab on the (it will only be visible if a user's login method is "Email"). [account page](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/account) [login page](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/login) Bubble editor view ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FuYJvTqkBDTLQGDSquEFh%2FScreen%2520Shot%25202019-10-25%2520at%25201.20.22%2520PM.png&width=768&dpr=4&quality=100&sign=3891b852&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FwZsEQG53BALk3YDwgT1G%2FScreen%2520Shot%25202019-10-25%2520at%25202.02.06%2520PM.png&width=768&dpr=4&quality=100&sign=bcc40f86&sv=2) --- # Terms of Service (deprecated) | Canvas Documentation [PreviousPrivacy Policy (deprecated)](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/privacy-policy) [NextReusable elements](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements) Last updated 4 years ago Was this helpful? **Page name:** terms **Purpose:** Contains all the content for the terms of service that are linked from the footer Your app will include a simple Terms of Service page. You can update the content of this page from Settings > Terms of service in the . [Admin portal](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPzA9nzckjzx_cKjRy4%252F-MPzIojAAhtV7nqYkVfD%252Fimage.png%3Falt%3Dmedia%26token%3D414a8eb2-7a1f-4a9c-ba8d-5b9492d51897&width=768&dpr=4&quality=100&sign=71346413&sv=2) --- # Miscellaneous | Canvas Documentation [PreviousEmails & Alerts](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts) [NextReference](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference) Last updated 4 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/miscellaneous#setting-your-password-policy) Setting your password policy ------------------------------------------------------------------------------------------------------------------------------------------- Setting your password policy in the admin portal will automatically update the password check UI throughout Canvas. The Canvas template includes a built-in password check UI during the signup flow and anywhere the user is required to reset their password. By default the password policy is set to require 5 total characters and at least 1 number. You can manage the requirements for your password policy directly from the Admin portal of your application. From the left menu click on Settings > Password policy. There are four policies that can be set: * **Password minimum length** - This sets the total characters that are required for the password to be valid. * **Require numbers** (optional) - If checked you must set the total numbers required in the input to the right. * **Require special characters** (optional) - If checked you must set the total special characters required in the input to the right. Characters that qualify as special characters for this rule are "**(**", "**)**", "**!**", "**@**", "**#**", "**$**", "**%**", "**^**", "**&**", and "**\***". * **Require uppercase letters** (optional) - If checked you must set the total special characters required in the input to the right. This is a Canvas feature and it does not utilize Bubble's built-in password policy feature. To use this in conjunction with Bubble's built-in password policy, in the Bubble editor go to Settings > General and set your password policy there as well. If you do update your Bubble password policy, please ensure that your Canvas password policy matches your Bubble password requirements. This will ensure the password policy check UI in throughout your app is up to date. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/miscellaneous#cookie-permissions-and-consent-banner) Cookie Permissions & Consent Banner ----------------------------------------------------------------------------------------------------------------------------------------------------------- We consider it a best practice to ask users for consent to save cookies before storing data on their device and have built this functionality directly into Canvas. To set this up properly, let's start in the Bubble editor. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/miscellaneous#enabling-cookie-permissions) Enabling Cookie Permissions Once you have the editor open, from the left menu navigate to Settings > General > Privacy & Security. Here we need to check the box that says 'Do not set cookies on new visitors by default' Next log in to the admin portal, click on Settings > Cookies and toggle the 'Require users to agree to the storing of cookies in their browsers when they visit your website' to ON. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/miscellaneous#cookie-consent-banner) Cookie Consent Banner **Element name:** cookies\_permission **Purpose:** Get the user's consent to store cookies on their device The Cookie Consent Banner is built as a reusable floating group and by default is placed on the index page of your Canvas template and anchored to the bottom. To add the consent banner to another page, drag it from the list of Reusable elements onto the design canvas of the page you would like to place it and make sure it is positioned at the bottom edge of the page. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/miscellaneous#set-up-payment-info-on-account-page) Set up Payment info on Account page --------------------------------------------------------------------------------------------------------------------------------------------------------- Canvas comes with built in UI on the Account page for displaying the saved credit card details for your users as well as a history of transactions they have initiated. Before setting up payments, from your Bubble editor navigate to Plugins > Add Plugins and search for Stripe. Install the plugin that was made by Bubble. The Bubble stripe plugin adds additional fields to your user data type that can now be accessed. In the credit card display we use a group called 'Group credit card brand name' to manage many of the conditions for this view. #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/miscellaneous#payment-workflows-logic) Payment Workflows/Logic After you have connected the existing UI, you will still need to set up the logic for the payment process. This includes: 1. Saving payment information (credit/debit cards) 2. Running the appropriate workflows from Stripe (or your payment provider) 3. Recording any other relevant information in your app 1. Responses from the workflows in step 2 2. Last 4 digits of card (for identification) You will need to set most of this up on your own. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/miscellaneous#loading-screen) Loading screen --------------------------------------------------------------------------------------------------------------- The loading screen element allows you to display a loading animation while your page's elements and data are being loaded beneath. You will want to include this on every page where you want this behavior. The element can be found under **Visual elements**. Simply drag it on to the page in order for it to be active. No matter how large the element is, it will always take up the full width of the page. Make it 1x1 pixels and place it in the top right corner of the page to avoid responsiveness issues. The properties panel provides several options for customizing the behavior and appearance of the loader. There are two ways in which you can use the loading element. **1.** **Display by default on page load** If the element is set to be visible on page load, a loading screen will appear on the page until you explicitly hide it. In order to have it disappear once the page's elements are loaded, you can either: 1. Create a workflow which is triggered when the page is loaded & loaded above the fold. Attach the **Hide loading screen** action. 2. Check the loading screen element's **Auto close** option **2\. Manually set when to show/hide the loader** Under Workflow actions > Plugins, you have two loader actions, one to show the loader and one to hide it. Use these to show the loader while specific workflows are firing (i.e. while making bulk changes to a list). ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/miscellaneous#customizing-the-loader-style) **Customizing the loader style** Copy **Updating the loading screen text** Modify the code in the loading screen element's text field to tweak the font size, color, weight, line height, and description. Copy

Please wait

Setting up your portal

One option that is available through Canvas is a that contains the necessary UI and workflows to save or delete users' credit card info via Stripe. The visual part of this popup can be used for other payment providers, but the workflows are specific to Stripe. **Updating the animation** You can change the loader animation by pasting in a new animation json URL from (requires signup). Adjust the width and height in the code below to modify the size of the animation. [Purchase Popup](https://docs.airdev.co/canvas-pages-and-modules/v/2.0.0/popups/stripe-credit-card-purchase-popup) [lottiefiles.com](https://lottiefiles.com/search?q=loader&category=animations) Check 'Do not set cookies on new visitors by default' Canvas cookie consent banner Credit card view in Editor ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MJraj0Y9Xa5GJldBVvQ%252F-MJrowzc7jZsWmEI77om%252Fimage.png%3Falt%3Dmedia%26token%3De96f8efe-c24d-4408-9570-cfaf3c7e93fb&width=768&dpr=4&quality=100&sign=58dec718&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MJraj0Y9Xa5GJldBVvQ%252F-MJs-jjV625FrDHGrUNG%252Fimage.png%3Falt%3Dmedia%26token%3Ddd812889-5a4f-450d-9680-ccd7970ad042&width=768&dpr=4&quality=100&sign=1463967d&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MJraj0Y9Xa5GJldBVvQ%252F-MJs2l6HJccQFNcItyDK%252Fimage.png%3Falt%3Dmedia%26token%3D4a10f9b7-6384-4d2a-82c8-4315db634bbd&width=768&dpr=4&quality=100&sign=b2c3f13e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-MbcyfBE_tMg-loVKtNW%252Fimage.png%3Falt%3Dmedia%26token%3D30ba7bee-d065-477e-b8c8-14af8eb6da2b&width=768&dpr=4&quality=100&sign=1ba9fc6b&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-Mbd-opjRdAbCi8Ssb_0%252Fimage.png%3Falt%3Dmedia%26token%3D5049a672-6ea4-485a-820c-1fa09ae8b7ef&width=768&dpr=4&quality=100&sign=3235b18b&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-Mbd0ebBbn4Jb_eyiiHW%252Fimage.png%3Falt%3Dmedia%26token%3D6b9d44a6-db44-4a66-a5b7-cffbefaf3e63&width=768&dpr=4&quality=100&sign=958d2b06&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MJs4EHgBPa7d88WV7Eh%252F-MJs9Q4Ev8pJBhnRJlBT%252Fimage.png%3Falt%3Dmedia%26token%3D4d424bd0-3d26-4b85-8e89-55b795d89467&width=768&dpr=4&quality=100&sign=bddef543&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-Mbd1-6vboKrdOuyJWvX%252Fimage.png%3Falt%3Dmedia%26token%3Db1629c6b-8e20-4d30-92ac-fd92bbd59211&width=768&dpr=4&quality=100&sign=be40d17c&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MbrDEb6nJVXar4dP-0s%252F-MbrHlv7uUc5ZNw9k7Ii%252FScreen%2520Shot%25202021-06-10%2520at%252011.58.34%2520AM.png%3Falt%3Dmedia%26token%3D453d2461-264f-4d70-8500-62311116f99c&width=768&dpr=4&quality=100&sign=afa73ba3&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-Mbd2Akr0co9cYSrH1U6%252Fimage.png%3Falt%3Dmedia%26token%3Dfc62c502-0125-491d-9f4d-07b8594b7e53&width=768&dpr=4&quality=100&sign=9a5dab9a&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MbrDEb6nJVXar4dP-0s%252F-MbrTN_Ntjadlm_4a21D%252FScreen%2520Shot%25202021-06-10%2520at%252012.49.54%2520PM.png%3Falt%3Dmedia%26token%3Da5c52d57-08ac-4a43-b1f9-37b89b8a0703&width=768&dpr=4&quality=100&sign=e05f14ad&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-Mbd5mnqbKNQR9L8vTHb%252Fupdating%2520screen%2520loader%2520animation.gif%3Falt%3Dmedia%26token%3D37706431-6db9-4bb6-bd45-754f4a4e7984&width=768&dpr=4&quality=100&sign=27a1e79e&sv=2) --- # What's New | Canvas Documentation [PreviousKey Features](https://docs.airdev.co/canvas/3.0.0-1/features) [NextFor Designers](https://docs.airdev.co/canvas/3.0.0-1/for-designers) Last updated 4 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#june-7-2021-release-3.5.1) June 7, 2021 (release 3.5.1) --------------------------------------------------------------------------------------------------------------- **New loading screen element** To use the loading screen element, you would need to first upgrade the Canvas UI Elements plugin version in your app to at least v1.4.0. The element allows you to display a loading animation while your page's elements and data are being loaded beneath. You will want to include this on every page where you want this behavior and have it be visible by default. The element can be found under **Visual elements**. You can find details on how to set it up . The loading element is active on the Admin portal by default. **Deprecated the popup\_reusable element** The popup\_reusable element has been deprecated. The elements it housed were either not being used often, or are now available elsewhere: * popup\_signup/login - available as a standalone reusable * messagePopup - not being used often and removed from the template [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#may-24-2021-release-3.5.0) May 24, 2021 (release 3.5.0) --------------------------------------------------------------------------------------------------------------- **Added Postmark as an email provider** We’ve just released an update which allows seamless integration of Postmark into Canvas apps. Postmark is known for prioritizing deliverability and cutting down on spam sent from their service so that your emails are more likely to get into your users’ inboxes instead of landing in their spam boxes. To enable this on older versions of canvas, please go to your Bubble editor and upgrade the plugin version for ‘Email for Canvas’ (the plugin used to be called SendGrid for Canvas, but we changed the name with this release). There is backward compatibility with old Canvas apps which allows your existing SendGrid flow to keep working the same way it was working on the previous plugin version when you upgrade the SendGrid plugin. In older Canvas apps, setting up Postmark takes some extra effort, but is much easier than adding a new plugin to your app. Note that Postmark is primarily used as a transactional email service, and that our Postmark integration requires some modifications to support marketing emails. Postmark also has more stringent requirements for email quality than SendGrid, primarily measured by the portion of spam reports received relative to the total number of messages sent. **Converted various things to reusable elements** In the admin page, we’ve converted some (more) things to reusable elements to make it easier to edit the functionality in just one place and to follow the build pattern we’ve used in the rest of the admin page. The data type 1 tab content is now a reusable element called **admin\_datatype1**, and it currently contains Dummy data. To use this with a new data object, you would clone this reusable and **Group Nav 8 - Data type 1 content** in the admin portal. You would replace **admin\_datatype1** in the new group with the new reusable User filters in the admin portal is also now a reusable element called **filters\_users.** **Added new UI to settings tab in the admin portal (e.g. sample single field and sample picklist)** For this, we’ve created a new reusable element called **admin\_options\_settings** . [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#page-builder) Page Builder ---------------------------------------------------------------------------------- **New marketing page backgrounds** We've added 6 new marketing page backgrounds to the page builder. **New hero blocks** We've added 10 new hero blocks to the page builder. You can mix and match these new hero blocks with other page builder blocks and create beautiful marketing pages. [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#march-30-2021-release-3.4.0) March 30, 2021 (release 3.4.0) ------------------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#base-template) Base Template #### [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#all-new-styles-version-003) All new styles (version 003) We've revamped our entire library of styles and this Canvas update comes with more than 300 new Bubble styles! Most page elements now have access to at least three different styles with support for different font weights (regular, semibold, and bold). #### [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#consolidated-legal-page) Consolidated legal page #### [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#log-in-page-redesigned) Log in page redesigned #### [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#new-customizable-blocks) New Customizable Blocks ### [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#chrome-extension) Chrome Extension Along with the new styles, we have added a brand new design library of all the Canvas pages and blocks. These elements will be used for all new Canvas templates. If your app is on a version previous to v3.4.0 you can continue to add new pages & blocks from the extension and the elements added will be add with the style version your app is based on. However, if you would like to take advantage of the new styles and elements, you will see a banner prompting you to import the new styles (003). Once you've imported the new styles you are able to toggle between the new design library and and the old design library to add new elements. [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#december-29-2020-release-3.0.0) December 29, 2020 (release 3.0.0) ------------------------------------------------------------------------------------------------------------------------- #### [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#admin-portal-redesigned) Admin Portal Redesigned #### [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#page-builder-1) Page Builder #### [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#chrome-extension-1) Chrome Extension #### [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#pages-option-set-updated) Pages option set updated We have made a couple key changes to the Pages option set. 1. The Pages option set has been renamed to Bubble Pages to differentiate it from the new Marketing pages feature 2. Previously we stored a list of Bubble Pages on the Role option set to define the pages a user was allowed to view. To simplify this, the Bubble Pages option now stores the list of Roles that can view that page enabling you to set a page's privacy status and define the roles that are allowed to view that page from the same place. #### [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#fewer-nested-groups) Fewer nested groups We realize in the past that Canvas blocks contained a lot of extra groups nested within other groups. As of this release, we have rebuilt all the Canvas blocks to minimize the number of groups that are used while still maintaining a fully responsive template! #### [](https://docs.airdev.co/canvas/3.0.0-1/whats-new#send-custom-sendgrid-emails-on-a-hobby-plan) Send custom Sendgrid emails on a hobby plan With a brand new Sendgrid plugin we have moved the default email functionality to the front end instead of the using backend workflows. This means you can now send emails through Sendgrid with our beautiful HTML template without being on a paid Bubble plan. The backend email functionality is still available for more robust email setups and scheduling. HTML loader - replaced by the element Enable Postmark on new Canvas apps via the flow seen under . You can now include app-wide settings here that can be easily managed from the front-end (e.g. single field or a picklist). For more information on how to use these, please read our documentation . The previous and pages have been deprecated. The content from both of these pages has been consolidated into a single We've made some minor design updates to the to better align with the design of the marketing and index pages. **Page Flair Group** This includes a collapsible image banner, title, description, and toggle tabs. This group should be used when you want to further customize a page. **Block Title Group** Most blocks will now come with a that includes a title, dropdown, toggle tabs, description text, sort dropdown, filters, and a new button. This group should be used when you need to add a title group above a section of content. This Canvas update comes with host of new features as well as a full redesign of the admin portal. Be sure to check out the admin portal overview in the . You can now create beautiful HTML marketing pages directly within the admin portal using the new ! We have changed the way you add new Bubble pages to your application. You can now use the new to add new Bubble pages & blocks directly within your editor. [here](https://docs.airdev.co/canvas/canvas-functionality/reference/default-pages/admin-portal#settings) [Terms & Conditions](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/terms-of-service) [Privacy Policy](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/privacy-policy) [legal page.](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/legal) [log in page](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/login) [page-level group](https://docs.airdev.co/canvas/canvas-functionality/pages-and-modules#customizing-your-page) [title group](https://docs.airdev.co/canvas/canvas-functionality/pages-and-modules#customizing-block-title-group) [Canvas Page Builder](https://docs.airdev.co/canvas/canvas-functionality/marketing-pages) [](https://t8465184.p.clickup-attachments.com/t8465184/995dd302-1aef-4b0e-bf7f-7725c62c7fac/bg.png) [](https://t8465184.p.clickup-attachments.com/t8465184/83074b83-063d-49ac-927d-f857a48671ce/heroblocks.png) [Loading screen](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/miscellaneous#loading-screen) [here](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/miscellaneous#loading-screen) [Emails & Alerts](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#postmark) Easily manage app-wide configurations Example of updating a single field Example of managing a simple picklist that is used throughout the app [Getting Started section](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/getting-started#explore-the-admin-portal) [Canvas Extension](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/getting-started#get-the-chrome-extension) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-MbcyfBE_tMg-loVKtNW%252Fimage.png%3Falt%3Dmedia%26token%3D30ba7bee-d065-477e-b8c8-14af8eb6da2b&width=768&dpr=4&quality=100&sign=1ba9fc6b&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbd6WbR3HAhWH9sol_Z%252F-MbdRd75wgk58Lw3gMGk%252Fimage.png%3Falt%3Dmedia%26token%3Dd0d5c9cf-df6d-42ed-bc69-cd09e7a28ae6&width=768&dpr=4&quality=100&sign=d682ca6e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbd6WbR3HAhWH9sol_Z%252F-MbdRgZWvIbSKAXx7ty1%252Fimage.png%3Falt%3Dmedia%26token%3De4272bd3-fc25-4f21-b02b-86719c719f7b&width=768&dpr=4&quality=100&sign=106465eb&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbd6WbR3HAhWH9sol_Z%252F-MbdRlEhhTZJ374g6bf5%252Fimage.png%3Falt%3Dmedia%26token%3Da7e42e09-3f0a-4a2d-80c3-e798f0287533&width=768&dpr=4&quality=100&sign=f992d4d4&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbd6WbR3HAhWH9sol_Z%252F-MbdRynIznvvNDE06sni%252Fimage.png%3Falt%3Dmedia%26token%3D0792da24-d8ab-48fe-bd80-2b642795b663&width=768&dpr=4&quality=100&sign=6d0c557c&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbd6WbR3HAhWH9sol_Z%252F-MbdS-1dJIu3SZFKm_oo%252Fimage.png%3Falt%3Dmedia%26token%3D7d0d70c9-6840-4e7b-af03-9a9ff889c8c4&width=768&dpr=4&quality=100&sign=ccd422a0&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Ft8465184.p.clickup-attachments.com%2Ft8465184%2F995dd302-1aef-4b0e-bf7f-7725c62c7fac%2Fbg.png&width=300&dpr=4&quality=100&sign=adcbe3ab&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbd6WbR3HAhWH9sol_Z%252F-MbdRb8oUl6pv5bxHrP0%252Fimage.png%3Falt%3Dmedia%26token%3Dc37a6b13-0cc7-43e4-ad42-bd85efcf63bf&width=768&dpr=4&quality=100&sign=518d305&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MbrU8sY8TxK9kY-Ejs1%252F-MbriY4NoDIsVyvCeJY7%252Fheroblocks.png%3Falt%3Dmedia%26token%3D9f3e1471-5a72-4792-a34f-f2d0ff09110d&width=300&dpr=4&quality=100&sign=f6f95032&sv=2) --- # Menu Focus Elements | Canvas Documentation [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/menu-focus-elements#dropdown-menu) Dropdown menu ------------------------------------------------------------------------------------------------------------------------------------------- **Element name:** menufocus\_template **Purpose:** Provide the user with a concise list of actions they can take in a convenient dropdown menu. The dropdown menu is used consistently throughout the Canvas template to provide the user with actions they can take such as Edit/delete a thing, View more details, Send a message, etc. The dropdown is triggered by clicking on the icon, can be dismissed by clicking anywhere outside the dropdown, and is most often used in repeating groups to provide action items for each thing in the list. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/menu-focus-elements#clone-the-reusable-template) **Clone the reusable template** Open the **menufocus\_template** and from the top bar of the Bubble editor click Edit > Clone this Page. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/menu-focus-elements#assign-the-type-of-content) Assign the type of content With your cloned menufocus\_template open, double-click in the gray area of the editor to open up the settings for the reusable. Change the 'Type of content' to the datatype you will be using this menu to edit. You will need to change the type of content for the GroupFocus Dummy as well. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/menu-focus-elements#set-up-the-dropdown-buttons) Set up the dropdown buttons In the elements tree click the '+' to open the GroupFocus Dummy. This group contains all the dropdown buttons in the menu. Group Option 2 and Group Option 3 are already set up as the Edit and Delete actions. There are three more Group Options (1, 4, & 5) that are unused and can be customized to add more buttons to your menu. Each of these groups has a corresponding event in the workflow tab that will be run when the group is clicked. The menufocus\_template reusable element also contains two popups that correlate to the Edit and Delete actions: * **Popup Edit** Clicking on Option 2 (Edit) in the dropdown will open a standard edit form popup to create or edit a thing. * **Popup Remove** Clicking on Option 3 (Delete) in the dropdown will open a popup to remove a thing. Customize/duplicate these popups to your purposes. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/menu-focus-elements#using-the-custom-events) Using the custom events Each popups can be triggered by the corresponding custom events 'Create/edit thing' and 'Remove thing'. Setting up custom events within a reusable gives you the option of using that workflow from the page it is on with the 'Trigger a custom event from a reusable element' action. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/menu-focus-elements#user-menu-overview) User Menu Overview ----------------------------------------------------------------------------------------------------------------------------------------------------- Element name: **admin\_users\_menu** This focus group reusable element contains a menu of dropdown buttons for the user object. The menu popover is triggered by clicking on the icon and can be dismissed by clicking anywhere outside of the focus group. This reusable element is used in the Users tab in the Owner's Portal. 1. Clicking on Option 1 (Password reset) will schedule an API workflow to send a password reset email to the user. 2. Clicking on Option 3 (Deactivate) will open `Popup Remove user`. Deactivating the user will only mark the user as inactive and would not delete the user from the app. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/menu-focus-elements#email-templates-menu) Email Templates Menu --------------------------------------------------------------------------------------------------------------------------------------------------------- Element name: ⚙️ **system\_admin\_email\_menu** This focus group reusable element contains a menu of dropdown buttons for the Email template object. The menu popover is triggered by clicking on the icon and can be dismissed by clicking anywhere outside of the focus group. This reusable element is used in the Emails tab in the Admin Portal. This reusable element contains two popups:‌ 1. Popup Edit Email Popup - Clicking on Option 2 (Edit) in the dropdown will open a standard add/edit form popup to create or edit an Email template. To learn more about email templates and how to use them, please click here. 2. `Popup Remove` - This dummy popup is included and can be used to delete a thing. [PreviousAdmin options app variables](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/owners-portal-reusables/admin-option-settings) [NextSidebar tab](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/sidebar-tab) Last updated 11 months ago For example, you can add the menufocus\_template element to the on a page and trigger a custom event to create/edit or remove a thing. [hidden variables popup](https://docs.airdev.co/canvas/v/3.6/canvas-functionality/data-and-workflows#using-the-hidden-variables-popup) [`Hidden variables popup`](https://docs.airdev.co/canvas/v/3.6/canvas-functionality/data-and-workflows#using-the-hidden-variables-popup) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FercmLzBeVqCx5Xa3qr9F%2Fimage.png&width=768&dpr=4&quality=100&sign=c5d307f4&sv=2) --- # Footer | Canvas Documentation [PreviousHeader](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header) [NextSignup & Log in](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/signup-login) Last updated 11 months ago **Element name:** footer **Purpose:** Provide the user with links to important pages and information at the bottom of the page. Navigate to Headers/Footers > Footer navigation from the left side menu to get started. The footer element is included by default on all marketing pages. For Bubble pages you will need to add it manually to any page you want to include it on. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/footer#pages) Pages You can set up links to any page you like in the pages tab. These can be the same pages you set up in the header or completely different. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/footer#legal) Legal The Canvas template comes standard with Terms and Privacy pages. Edit all the settings for these pages here. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/footer#social-media) Social Media Get the most out of your social media by adding all your social media pages to the footer of your application! Elements as they are displayed in the footer Actions available for the page links in the footer ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F834t1TjeDPTWs7PsLtP7%2Fimage.png&width=768&dpr=4&quality=100&sign=8e8b9a9&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FbxCeLFwTSVuGDoNHYib7%2FScreen%2520Shot%25202020-12-05%2520at%25205.42.19%2520PM.png&width=768&dpr=4&quality=100&sign=ad31a440&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FZVA6FBsNjWxjWo68xj98%2Fimage.png&width=768&dpr=4&quality=100&sign=9dd105b7&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FDU1m3zkOUecjHblrawv3%2Fimage.png&width=768&dpr=4&quality=100&sign=56464679&sv=2) --- # Marketing Pages | Canvas Documentation [PreviousBranding & Design](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design) [NextBubble Pages & Blocks](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules) Last updated 4 years ago Was this helpful? To get started, login to your admin portal and navigate to Pages in the left menu. You will see a list of all the current marketing pages in your site. The first time you view this section you an index and an about page that come standard with your template. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/marketing-pages#creating-a-new-marketing-page) Creating a new marketing page Click the '+ Add marketing page' button. In the popup enter the unique path you would like this page to be located at on your url (e.g. domain.com/page/**uniquepath**) Both of these values can be updated later but keep in mind that updating the unique path for a page will break the connection of any links to this page that are using the original path name. Enter a description for your page and click the Create button. The description entered here is for your reference and does not appear to your users. Your new page will now appear in the list of marketing pages for your site. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/marketing-pages#building-your-marketing-page) Building your marketing page Now that your page is created, let's get started building it by clicking the pencil icon to open the Canvas Page Builder. There are several main options to familiarize yourself with when first getting started. #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/marketing-pages#background) **Background** Clicking the Background tile will open a module allowing you to select from several different styles of backgrounds. These are SVG files that will automatically adjust to the color palette you choose and will span the entire background of your page #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/marketing-pages#colors) **Colors** Canvas offers a number of professionally curated color palettes that will help make your page beautiful. You can also create a custom color palette and save it to be used in other marketing pages as well! Simply select the custom option, choose your colors, and click 'Save custom palette'. #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/marketing-pages#page-canvas) **Page canvas** The page canvas is where you will design the UI of your marketing page with our professionally designed and fully responsive page blocks. To add a new block, hover over the page canvas and click on the plus icon. When you find the block you need, click '+ Add block' to add it to your page. To edit a block, hover your mouse over the block you want to change until the options panel appears at the top right of the block. * Click the arrows to move the block's position up or down the page. * Click the pencil icon to edit the content and properties * Click the trash can to delete the block from your page entirely #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/marketing-pages#publish-your-page) Publish your page As you work in the page builder your page changes will be saved automatically so you can come back to continue building your page at any time. If you want to reset your changes, click the 'Discard draft' button to revert to the last published version of your page. Once your page is ready for primetime, click the 'Publish' button to push it live! #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/marketing-pages#get-help) Get Help If you ever get stuck or need help with anything, click the question mark icon in the top right of the screen. Here you can watch a video tutorial on using the editor or access the support portal to ask a question or report a bug. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/marketing-pages#managing-your-page) Managing your page You can manage the details of your page in the admin portal from the dropdown action menu on the page. **Edit page info** - This allows you to edit the unique path and the page description for your page. **Clone page** \- This will duplicate the page. The unique path of the new page will be the same as the page that was cloned with '-copy' appended. **Delete** - Permanently deletes the page. You will be shown a confirmation popup before the page is deleted. Changing the unique path for a page will break the connection of any links to this page. Publishing only publishes the page in the version you are working in. It's a good practice to create and edit Marketing pages in the development version and then copy the **Edit SEO tags** \- By default your page will use your . If you prefer you can customize the title, description, and preview image that is shown when a link to this page is shared on social media or seen through a Google search. Simply uncheck the 'Use the application's standard SEO/social tags' checkbox. [Marketing pages data to the live database.](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/data-and-workflows#copying-specific-data-types) [application's standard SEO settings](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#seo-and-social) Enter your unique path and page description The Canvas page builder Click this icon to add a new block Options to edit or delete the page section ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNoeeH6LTOhAg5DjOkT%252F-MNol0J-_8FTx-4bZlAp%252Fimage.png%3Falt%3Dmedia%26token%3De71c799b-5838-4ef5-a211-c1c32588d302&width=768&dpr=4&quality=100&sign=f70f14c8&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MKRG5FoufYoHLX0Rl5j%252F-MKRM546S0FYfAzC7mX6%252Fimage.png%3Falt%3Dmedia%26token%3D329f9f26-4d7d-4e56-9e0f-6a76dd126aee&width=768&dpr=4&quality=100&sign=553a9e97&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNoaNtfu2iIGgLron9a%252F-MNoeWMSnGzw8OpeFXpK%252Fimage.png%3Falt%3Dmedia%26token%3D5b7d2ee9-b3a1-4b26-a2d0-0f8a94003245&width=768&dpr=4&quality=100&sign=cfd69b1d&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNoeeH6LTOhAg5DjOkT%252F-MNojhUze_0ijbdJgGOd%252Fimage.png%3Falt%3Dmedia%26token%3D59fc2cb7-bf74-4d8c-a0c2-2da06c2edbec&width=768&dpr=4&quality=100&sign=bc428b6f&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MO8ETt4b9y0GQv9aznE%252F-MO8FUN36UjIvEfH8RJK%252Fimage.png%3Falt%3Dmedia%26token%3D7dc31db5-ff40-4fe4-a431-d96b916adedb&width=768&dpr=4&quality=100&sign=799c4bc6&sv=2) --- # For Designers | Canvas Documentation [PreviousWhat's New](https://docs.airdev.co/canvas/3.0.0-1/whats-new) [NextGetting Started](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/getting-started) Last updated 3 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#canvas-library) **Canvas library** ---------------------------------------------------------------------------------------------- The contains full-page previews and descriptions of all page templates and blocks within the Canvas design system. [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#canvas-styles-and-example-components-figma-file) **Canvas Styles and Example Components Figma file** ---------------------------------------------------------------------------------------------------------------------------------------------------------------- The contains all of the typography and color styles used throughout Canvas design system. The example components’ dimensions and padding are consistent with Canvas block and page templates’ dimensions and padding. These components can serve as a base to create additional components, though this is completely optional. [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#how-to-customize-the-canvas-figma-file) **How to customize the Canvas Figma file** ---------------------------------------------------------------------------------------------------------------------------------------------- * Access the read-only copy of the file here: * At the top of the page, click on the file name, and select “Duplicate” from the dropdown. Figma will copy the file to your Figma account’s Drafts folder. * Navigate to the copied file in your Drafts folder and edit it in any way to begin creating your custom designs. * Modify all of the color styles to fit your app's branding requirements. If you would like to customize your app's font, it is recommended that you choose a font that is equal to or slightly smaller than Inter for these reasons: 1. If the font is larger than Inter, Bubble might show "......" within each text element in the Bubble editor, making it challenging for the designer and developer to know where to click to edit different elements. 2. If the font is larger than Inter, fixed-width tab and link elements will sometimes break to the next line after making changes to the fonts. With smaller fonts, elements won’t break to the following line. Note: For completely custom UI elements and designs created from scratch, and not from Canvas, there shouldn't be any challenges starting with a larger font than Inter. * Utilize the example components and/or create brand new components on this components page. All components with a 🟢emoji contain variants. All components with a 🔴emoji are meant to be detached. * Create a new page for your project and start building your app's designs. [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#how-to-import-designs-from-the-canvas-library-into-figma) **How to import designs from the Canvas Library into Figma** ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * To create a new design in Figma, based on a Canvas design, you can: * Select the “Full Page” preview option to open that design in a new tab. * * This plugin requires that you define an import width. Most page templates have a 1220px width on desktop, and that should equal the size of all Figma frames used for desktop pages. The following page templates have slightly larger widths by default -- please import them at these widths: * 2-Column Menu Tabs Page: 1410px width * Floating Map Search Page: 2600px width * Profile Tabs Page: 1410px width * Standard Multi-Step Page with Sidebar: 1410px width * Vertical Multi-Step Page: 1410px width * All Canvas designs are imported into the Bubble editor at desktop page widths by default. All designs are responsive for mobile but are modified in the Bubble editor at desktop page widths. If you plan to create a new design by modifying imported Canvas components (instead of creating them from scratch in the Bubble editor), it is best also to create desktop mockups, even if a page will primarily be used on mobile. [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#canvas-design-system-specifications) **Canvas design system specifications** ---------------------------------------------------------------------------------------------------------------------------------------- #### [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#page-template-sizes) **Page template sizes** * 1220px width for most pages. * Exceptions: * 2-Column Menu Tabs Page: 1410px width * Floating Map Search Page: 2600px width * Profile Tabs Page: 1410px width * Standard Multi-Step Page with Sidebar: 1410px width * Vertical Multi-Step Page: 1410px width #### [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#block-sizes-content-containers) **Block sizes (content containers)** * Desktop: 860px width * 40px of padding on all sides * Mobile: 300px width * 20px of padding on all sides * Canvas will automatically add 40px of space between each block on a page. #### [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#popups) **Popups** * Standard: 680px width * 30px of padding on all sides * Small: 360px width * 30px of padding on all sides #### [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#typography-scale) **Typography scale** * Size 44: Large Title (for CTA Page Titles) * Size 30: Medium Title (for Standard Page Titles) * Size 23: Small Title (for RG and Group Headers) * Size 19: Subheading, Large Body * Size 15: Body, Buttons, Tabs (default) * Size 13: Microcopy, Metadata, Overline #### [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#fonts-and-weights-for-all-font-sizes) **Fonts and weights (for all font sizes)** * Inter Bold - Weight: 600 * Inter Semibold - Weight: 500 * Inter Standard - Weight: 400 (default) #### [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#button-sizes) **Button sizes** * 45px height for CTA buttons and marketing page buttons with 19pt font * 40px height for standard buttons with size 15pt font (default) * 28px height for smaller buttons above repeating groups with size 15pt font #### [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#inputs-dropdowns-searchboxes) **Inputs, dropdowns, searchboxes** * 45px height, with Inter Standard (Black) 19pt text and light grey borders, for CTA and marketing pages * 40px height, with Inter Standard (Black) 15pt text and light grey borders, for standard app pages (default) #### [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#icons) **Icons** * Canvas uses the feather icons library for most icons. Bubble supports Google Material icons and Ionic icons as well. #### [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#maps) **Maps** * Canvas contains the following map styles by default: * Apple Maps (default) * Neutral Blue * Dark Mode * Just Places * Bubble supports custom Google map styles as well. [](https://docs.airdev.co/canvas/3.0.0-1/for-designers#planning-for-responsiveness) **Planning for responsiveness** ------------------------------------------------------------------------------------------------------------------------ * The Bubble responsive engine is slightly different from other visual development platforms such as Webflow. Bubble doesn’t yet support the following responsive settings: * Elements that collapse in width conditionally based on data (e.g., displaying a sidebar for some Users on a page and collapsing that same sidebar for other Users on that same page). * Exception: * Bubble can collapse elements in width based on the Current Page width. * Variable font sizes from desktop to mobile. * Overlapping elements of different sizes (e.g., image elements that must scale proportionally as the page is resized, with text elements on top of it.) * Exceptions: * It is possible to set an image as the background image of a group with text on top of the image. However, the image will not scale proportionally as the page is resized. * It is possible to have elements overlap if the elements remain the same size on all screen sizes. * Elements that change in size on hover. * Elements that dynamically change in width, height, and position based on viewport height and width. Click on any page template or block that meets your use case within the . Use a Chrome Extension such as to inspect the elements’ design properties. In Figma, you can build these components from scratch or use the import plugin to import a Canvas design into Figma by pasting the URL of the full page preview into Figma. [Canvas library](https://canvas.airdev.co/library) [Prism](https://chrome.google.com/webstore/detail/prism-redline-tool/hkbhjllliedcceblibllaodamehmbfgm?hl=en-US) [HTML → Figma](https://www.figma.com/community/plugin/747985167520967365/Figma-to-HTML%2C-CSS%2C-React-%26-more!) [Canvas library](https://canvas.airdev.co/library) [Canvas Styles and Example Components Figma file](https://bit.ly/3AWLAaP) [https://bit.ly/3ww9k23](https://bit.ly/3AWLAaP) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MeCbe1tPzZR45Bevn_l%252F-MeCcilN6pc-CD9SN1y9%252FExample-components.png%3Falt%3Dmedia%26token%3Da69d7a45-e15f-4da6-8d5b-322a7b3130de&width=768&dpr=4&quality=100&sign=312e4508&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MeCbe1tPzZR45Bevn_l%252F-MeCcRn7ZlPdyJtGLbMx%252FStyles.png%3Falt%3Dmedia%26token%3D43a9eb60-bd91-48c8-bcec-1a9a9b987785&width=768&dpr=4&quality=100&sign=a5082d5a&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MeCbe1tPzZR45Bevn_l%252F-MeCeNpC_x-BfIfisH_b%252FMy-project.png%3Falt%3Dmedia%26token%3D9ffeda3d-c638-4841-9954-1e2bc3c29b69&width=768&dpr=4&quality=100&sign=f23ff405&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MeCbe1tPzZR45Bevn_l%252F-MeCcEo8KX4Vje6op8Tn%252FDuplicate-file.png%3Falt%3Dmedia%26token%3D25bc1f0f-96c3-4d50-9afd-09939869b314&width=768&dpr=4&quality=100&sign=c9053da&sv=2) --- # Menus & Navigation | Canvas Documentation [PreviousRoles & Permissions](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions) [NextData & Workflows](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/data-and-workflows) Last updated 4 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#header-navigation) Header navigation ---------------------------------------------------------------------------------------------------------------------------- **Element name:** header **Purpose:** Provide easy navigation and actions to the user throughout the application. The header is a fully responsive reusable element and is used on every page of the Canvas template. When being viewed by a user that is not logged in to the application the header will display a logo, menu links, and buttons for logging in or signing up to your application. When viewed as a logged in user the header will display a logo, a set of three widgets (, , and ), and a profile image with a dropdown menu that includes links to the users profile account page, Admin portal (if an admin), and a log out action. You can make changes to the links visible to **logged out users** directly from the admin portal. For the actions available to your **logged in users** you will need to make changes from the Bubble editor. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#for-logged-out-users) For logged out users To set up the links visible to logged out users, go to your admin portal and navigate to the Header/Footer section from the left menu. From here you can add, edit, and delete menu links, change the display order, view both mobile and desktop previews, and set the destination links and icons for each option. To navigate to Branding > Logos in the admin portal ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#for-logged-in-users) For logged in users To add new actions and links to pages for your apps users you will need to open the **header** reusable in your Bubble editor #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#change-text-on-the-signup-login-buttons) Change text on the Signup/Login buttons From the elements tree, click the '+' to open Group Header > Group Loggedout. You'll see the buttons for both Login and Signup here. Click on the one you want to change and update the text in the property editor. #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#remove-the-icons-from-the-header) **Remove the icons from the header** From the elements tree, click the '+' to open Group Header > Group Loggedin. Select the groups that you would like to hide and uncheck the 'This element is visible on page load' option on the property editor. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#updating-the-header-dropdown-menu) Updating the header dropdown menu Manual updates to the dropdown menu will need to happen from the Bubble editor as well. With the **header** reusable open in the editor, click the '+' to open the GroupFocus Mini in the elements tree. This group contains all the elements of the dropdown menu within the following groups. #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#group-loggedout-menu) **Group Loggedout Menu** This is shown only to logged out users and contains the login and signup buttons. There are also three placeholder buttons that can be edited if you would like to provide additional actions for your logged out users. #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#group-logged-in) Group Logged in This is shown only to logged in users and by default contains a button for logging out as well as buttons to navigate to the Account page and the Admin portal page. There are also seven placeholder buttons here you can customize and add additional actions to. #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#group-pages-list) Group Pages list You should not edit this group as it is populated by the page links you set up in the Admin portal. **Placeholder button** refers to a fully designed button element that has been hidden by default but can be unhidden and used as needed in your application. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#footer-navigation) Footer navigation ---------------------------------------------------------------------------------------------------------------------------- **Element name:** footer **Purpose:** Provide the user with links to important pages and information at the bottom of the page. In contrast to the header navigation, the footer navigation is customized entirely in the Admin portal of your application. Navigate to Headers/Footers from the left side menu to get started. The footer element is included by default on all marketing pages. For Bubble pages you will need to add it manually. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#set-up-page-links) Set up page links You can set up footer links to any internal or external page in the pages tab. These can be the same pages you set up in the header or completely different. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#customize-your-legal-pages) Customize your legal pages The Canvas template comes with default Terms and Privacy pages and you can edit all the settings and content for these pages from the footer navigation settings. These page contain references to text that needs to be changed. If you search for all references of the word "Sample" and replace those with an appropriate word (usually the legal name of your company), that is a start, but you should also determine if the content of the documents is appropriate for your application. We have compiled a list of resources to help you get started with customizing your legal pages. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#add-your-social-media-profiles) Add your social media profiles Get the most out of your efforts by adding all your social media pages to the footer of your application. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#dropdown-menu) Dropdown menu -------------------------------------------------------------------------------------------------------------------- **Element name:** menufocusgroup\_template **Purpose:** Provide the user with a concise list of actions they can take in a convenient dropdown menu. The dropdown menu is used consistently throughout the Canvas template to provide the user with actions they can take such as Edit/delete a thing, View more details, Send a message, etc. The dropdown is triggered by clicking on the icon, can be dismissed by clicking anywhere outside the dropdown, and is most often used in repeating groups to provide action items for each thing in the list. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#clone-the-reusable-template) **Clone the reusable template** Open the **menufocusgroup\_template** and from the top bar of the Bubble editor click Edit > Clone this Page. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#assign-the-type-of-content) Assign the type of content With your cloned menufocusgroup\_template open, double-click in the gray area of the editor to open up the settings for the reusable. Change the 'Type of content' to the datatype you will be using this menu to edit. You will need to change the type of content for the GroupFocus Dummy as well. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#set-up-the-dropdown-buttons) Set up the dropdown buttons In the elements tree click the '+' to open the GroupFocus Dummy. This group contains all the dropdown buttons in the menu. Group Option 2 and Group Option 3 are already set up as the Edit and Delete actions. There are three more Group Options (1, 4, & 5) that are unused and can be customized to add more buttons to your menu. Each of these groups has a corresponding event in the workflow tab that will be run when the group is clicked. The menufocusgroup reusable element also contains two popups that correlate to the Edit and Delete actions: * **Popup Edit** Clicking on Option 2 (Edit) in the dropdown will open a standard edit form popup to create or edit a thing. * **Popup Remove** Clicking on Option 3 (Delete) in the dropdown will open a popup to remove a thing. Customize/duplicate these popups to your purposes. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#using-the-custom-events) Using the custom events Each popups can be triggered by the corresponding custom events 'Create/edit thing' and 'Remove thing'. Setting up custom events within a reusable gives you the option of using that workflow from the page it is on with the 'Trigger a custom event from a reusable element' action. For example, you can add the menufocusgroup\_template element to the on a page and trigger a custom event to create/edit or remove a thing. [Privacy Policy resources](https://docs.google.com/document/d/1hqAkqI9N9i0HUUPf-Ql6V2mlZDFePNVarqkbx78_oc4/edit?usp=sharing) [Terms of Service resources](https://docs.google.com/document/d/1_x-D6MKT_dUC_9_gTuDMYv8e5O5n98tol8wdxb7AMQ8/edit?usp=sharing) [search](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#search-menu) [shopping cart](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#shopping-cart-menu) [notifications](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#notifications-menu) [hidden variables popup](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/data-and-workflows#hidden-variables) [change your logo](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#logo) Dropdown menu for a Canvas marketing page ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MOmPqLMJ92yUrUKcexg%252F-MOmaii-yyf5ltFqA8CP%252Fimage.png%3Falt%3Dmedia%26token%3D0a92f480-09de-4022-ad3e-ff11a9d5996d&width=768&dpr=4&quality=100&sign=b1ea4ac2&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MOmlsouI08973C1_vEH%252F-MOmxwNsQ9baRxeWKrAq%252Fimage.png%3Falt%3Dmedia%26token%3D365f7994-3cc7-4394-abaa-5897ee7b3404&width=768&dpr=4&quality=100&sign=4b77522a&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MOmlsouI08973C1_vEH%252F-MOmq7Ul_zdKigf_hqoK%252Fimage.png%3Falt%3Dmedia%26token%3De9e21f95-b182-43e6-960f-2d01334415ba&width=768&dpr=4&quality=100&sign=9f58eb26&sv=2) --- # Admin Portal | Canvas Documentation [PreviousIndex](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/index) [NextAccount](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/account) Last updated 4 years ago Was this helpful? **Page name:** admin **Purpose:** Fully functional portal for managing all the settings for your application Due to the complexity of the page and the amount of information that is usually displayed, the Admin portal will not be responsive. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#overview) Overview -------------------------------------------------------------------------------------------------------------------------- Your app will come with a dedicated portal for the app’s admin where you can manage app settings & data. Much of this is preset for you, but you will have to customize the page for your app. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#launch-checklist) Launch Checklist ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#branding) Branding ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#pages) Pages ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#header-footer) Header/Footer ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#emails) Emails ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#settings) Settings The **Settings** group provides a means for admins to set global variables for the app. Some of these are pre-baked into Canvas, like setting the password policy or cookie settings. But you also can customize your own app-wide settings that can be exposed to app admins (e.g. listing fee or tags). To do this, find the **Group Nav 0/1/5 - Launch & Settings** group. Within this group is a reusable element called **admin\_options.** Within this is another reusable called **admin\_options\_settings**. You shouldn't need to touch any of the other elements/workflows within **admin\_options**. Once inside **admin\_options\_settings**, you will have access to two button-style groups within **Group Collapsible admin-defined options group**, one of which launches a popup with a single input, and another which launches a pick-list of options. The single field popup is updating a dummy field in the website object called **dummy option** and the sample picklist popup is displaying a list of dummy data. You should connect up your own data and logic to the buttons and corresponding popups. The add and delete features in the sample picklist popup are disabled by default - you must go into the Bubble editor and enable the add/delete features in order for them to work. To add additional options to this area, the groups and popups which are used here should be cloned. You can adjust the collapsing range of the reusable using **Group PLACEHOLDER**. If you’d like to hide these options entirely, you should go to the reusable, select **Group Collapsible admin-defined options group** and uncheck _This element is visible_ on the conditional tab. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#analytics) Analytics View statistics for your users such a total users, recent signups, and active users. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#users) Users View all the users in your application, reset passwords, add new admin, and filter by status, name, and role. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#extending-the-admin-portal) Extending the Admin Portal -------------------------------------------------------------------------------------------------------------------------------------------------------------- To extend the admin portal and customize it for your application, the Canvas Base template comes with a placeholder table group that can be copied and customized to add additional views and functionality for your data. You can find this group in the elements tree as **Group Nav 8 - Data type 1 content**. On the page this group is located directly below 'Group Nav 7 - Users'. This group contains a reusable element called **admin\_datatype1** which contains dummy data. Make the following changes to customize it for your needs. **General** 1. Update the titles for the **Group Nav 8 - Data type 1 content** and **admin\_datatype1** groups (i.e, you might have **Group Nav 8 - Posts** and **admin\_posts**) 2. Edit the the **New** button and add an action when it is clicked 3. Add an action for the **Data** button if needed #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#set-up-the-repeating-group) Set up the repeating group From inside the reusable elements **admin\_datatype1**, you should: 1. Data to display 1. Change the title and data type of the element RepeatingGroup Dummy 2. Define a data source for the repeating group 2. Set up the table 1. Update/add headers in the text elements placed above the repeating group. 2. Define the dynamic content that corresponds with the headers and will be displayed by the repeating group. 3. Set up the text that is displayed when no data is found. This is nested under Group inner dummy content > Group no entries. #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#navigation) Navigation From the admin page, you should 1. Open FloatingGroup Sidebar\_website > Group inner sidebar tab\_website > Group Main Nav 9 - Data type 1\_text 2. Change the data source for this group to the text you would like to display in the navigation bar After each change you make here, make sure to view the web page in version-test in order to check whether it works as expected. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#adding-additional-tabs-to-the-admin-portal) Adding additional tabs to the Admin portal ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- To add additional tabs to the admin portal, duplicate the **Group Nav 8 - Data type 1 content** and the **admin\_datatype1** reusable elements we customized above. Change the text after the hyphen in the group name to represent the data type it is displaying. For instance, if we were displaying invoices in the Group Nav 9 element we should change the name to 'Group Nav 9 - Invoices'. The steps are nearly the same as above but you will need to take the following additional steps. #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#replace-the-reusable-element) **Replace the reusable element** In your new, parent content group (**Group Nav 9 - Data type 2 content**, for example), you'll need to replace the **admin\_datatype1** reusable, which was copied along with the parent group, with your new reusable (**admin\_datatype2**, for example). #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#reposition-the-new-group) Reposition the new group Move your duplicated group underneath Group Nav 8 so the top of your new group snaps to the bottom of the Group Nav 8. #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#resize-the-placeholder-group) Resize the placeholder group Drag the top of the 'Group PLACEHOLDER (do not delete) until the top edge snaps to the bottom of the new group you created #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages/admin-portal#update-the-conditional-references) Update the conditional references Change the reference in the conditional from 'Group Main Nav 8 - Data type 1\_text' to 'Group Main Nav 9 - Data type 2\_text' You're all set! You can duplicate the steps above to add as many new data tables as you like! These guidelines are specific to the Admin portal, but they can be useful as a common design pattern to follow for a portal/dashboard page. ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPGwzcx0s1nKUFMSyJw%252F-MPHBgAR2iZ2YBDOoIeg%252Fimage.png%3Falt%3Dmedia%26token%3D08ed6852-0161-441d-9814-9de465eadb9f&width=768&dpr=4&quality=100&sign=e2ac45a5&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPGwzcx0s1nKUFMSyJw%252F-MPHBlPFX9VswJVQkQfl%252Fimage.png%3Falt%3Dmedia%26token%3Dbf46ac0b-4735-4ae5-a596-8e53c72f42da&width=768&dpr=4&quality=100&sign=e7155dbe&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-MbcgbZZW0fp0YZMbikx%252Fimage.png%3Falt%3Dmedia%26token%3Db4c4de66-fe6a-4b76-ae71-e960082e9cee&width=768&dpr=4&quality=100&sign=d8bba4b6&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-MbcjqmX-MzjnKq1vYX8%252Fimage.png%3Falt%3Dmedia%26token%3D54738df2-c20c-43b7-a6be-0cc887acbeda&width=768&dpr=4&quality=100&sign=51f2adfa&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPGwzcx0s1nKUFMSyJw%252F-MPHBa-DGhdCSHOltazS%252Fimage.png%3Falt%3Dmedia%26token%3Da598be66-9d41-438b-98e5-428542eed575&width=768&dpr=4&quality=100&sign=5e7fab83&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPGwzcx0s1nKUFMSyJw%252F-MPHBOzTyLTQI_LBPNDD%252Fimage.png%3Falt%3Dmedia%26token%3Db386839a-daeb-49ae-b315-3be0ba20032c&width=768&dpr=4&quality=100&sign=52999069&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPGwzcx0s1nKUFMSyJw%252F-MPHBTSQTa9lo38eLVrj%252Fimage.png%3Falt%3Dmedia%26token%3Db809d37b-9303-4ebd-abb4-037a0927e67c&width=768&dpr=4&quality=100&sign=11ba1bd4&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-MbchjAC05anOs5Yo662%252Fimage.png%3Falt%3Dmedia%26token%3Df092de49-e57d-4cb7-b663-fb6c282c36e9&width=768&dpr=4&quality=100&sign=b7768f2b&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-MbcjvwwPGul1VCrM8xB%252Fimage.png%3Falt%3Dmedia%26token%3Dbfb84bef-e5f1-4df1-a333-0a58203f1cd0&width=768&dpr=4&quality=100&sign=112c7693&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-Mbck1z7DrQW10Bxs1WK%252Fimage.png%3Falt%3Dmedia%26token%3D5da590c2-7901-4bdf-92bf-2927b7f59233&width=768&dpr=4&quality=100&sign=723bc0f4&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPGwzcx0s1nKUFMSyJw%252F-MPHAf89LCHcx_2mAyAP%252Fimage.png%3Falt%3Dmedia%26token%3D3a89cfa2-db51-473f-8a10-9c48247f9301&width=768&dpr=4&quality=100&sign=2eb936f7&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MbcWjK2MjNiH6nI6Rgg%252F-MbcZASDek7conMcBQlz%252Fimage.png%3Falt%3Dmedia%26token%3Da93d9fa6-7ecf-4116-89cb-b094e3c6d0a7&width=768&dpr=4&quality=100&sign=4a611613&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MbcWjK2MjNiH6nI6Rgg%252F-MbcbA_moJsiaP4Ytl7v%252Fimage.png%3Falt%3Dmedia%26token%3Dd3476aea-17aa-435a-ad49-a9cf3392e7b8&width=768&dpr=4&quality=100&sign=2d2e309e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MbcWjK2MjNiH6nI6Rgg%252F-MbccVyiOC-ZlGLFqgUw%252Fimage.png%3Falt%3Dmedia%26token%3D26a4a68e-2479-47c7-86e6-e8bc36ca3241&width=768&dpr=4&quality=100&sign=b1667aee&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MbcWjK2MjNiH6nI6Rgg%252F-Mbcc0Zn3_bzsuxckW61%252Fimage.png%3Falt%3Dmedia%26token%3Ded120516-77a7-4872-ade4-d22d578fa3b3&width=768&dpr=4&quality=100&sign=b314ace&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-Mbck7wTN5Osk3RZUN-3%252Fimage.png%3Falt%3Dmedia%26token%3Dd88ef78c-c487-44f8-bb9b-b7f32a0509fb&width=768&dpr=4&quality=100&sign=914e1226&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Mbcf0jzyS4_oebWCvCH%252F-MbcjcPSlBG_uabTXYV5%252Fimage.png%3Falt%3Dmedia%26token%3D285f12ed-c80d-4a25-8823-e5b0ff60e19d&width=768&dpr=4&quality=100&sign=91227d9a&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MPGwzcx0s1nKUFMSyJw%252F-MPHA2_1SH70VI9E7Ddl%252Fimage.png%3Falt%3Dmedia%26token%3Dd9c99474-7450-4221-889a-aba59e5c8106&width=768&dpr=4&quality=100&sign=d42a8718&sv=2) --- # Bubble Pages & Blocks | Canvas Documentation [PreviousMarketing Pages](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/marketing-pages) [NextRoles & Permissions](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions) Last updated 4 years ago Was this helpful? Your Canvas template is installed with several pages that provide login, account, and admin functionality. However, your template can be extended far beyond this by taking advantage of dozens of prebuilt Bubble pages and blocks available to you in the Canvas library. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules#installing-the-chrome-extension) Installing the Chrome Extension In order to be able to add Bubble pages and blocks to your Canvas template be sure to . With the Canvas Chrome extension installed, in your Bubble editor you will now see a vertical blue button floating on the right side of your screen that says 'Open Canvas'. Click to open a full height module along the right of your editor that contains functionality for Adding a new page, Adding a new block, and Updating your apps colors. View a list of all pages and blocks available through Canvas ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules#adding-a-new-page) Adding a new page With the Canvas extension open, click on 'Add a new page' to open the library of Bubble page templates. Select the page you would like to add and click the '+ Add page' button. The unique path entered here will also be the name of your new Bubble page. When creating your page, Canvas will also create a corresponding option in the . You will need to set this option up with the correct privacy and role permissions for each Bubble page you create. #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules#customizing-your-page) Customizing your page Some page templates will include a page-level group with a collapsible image banner, title, description, and toggle tabs. This group should be used when you want to further customize a page. * To show an image banner, unhide the placeholder group by checking the box for _This element is visible on page load_ and change the group's style to an empty style. Change the background of the group by selecting a background type and entering the relevant fields. * Show or hide the other UI components in the Page Flair group to fit your needs. Your page is now a fresh canvas ready to go. Start building it out by adding blocks from the Canvas library! ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules#adding-blocks-to-the-page) Adding blocks to the page To add a block, open the extension and select 'Add block to page' from the home screen. The library of Canvas blocks already contains dozens of Free and Premium options and we are constantly adding new options to the list. Click the '+ Add block' button to start building out your page. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules#setting-up-blocks-you-have-added) Setting up blocks you have added Adding blocks using Canvas Pages is only the first step to extending the functionality of your app. In order to make the most of the Canvas blocks, you need to modify these blocks in a few different ways: * Adding or modifying actions on buttons * Changing data sources on repeating groups or elements with data sources * Filling out content on groups * Linking content on groups to data types * Linking blocks to portal tabs (show/hide based on what user selects) #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules#customizing-block-title-group) Customizing block title group Most blocks will include a standard title group. This group includes common UI components such as a title, dropdown, toggle tabs, description text, sort dropdown, filters, and a 'new' button. The dropdown, toggle tabs, and description/results text are within three separate collapsible groups. You can set any of those groups to be visible or not visible on page load. #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules#example-of-setting-up-functionality-between-two-blocks) Example of setting up functionality between two blocks Add the following blocks to your page * Reviews Repeating Group (Image, Text, and Rating) * Rating Popup Select the ADD button named 'Button solidPrimaryMediumBody14pt' and name it something that make sense to you like 'Button Add Rating'. Press the Start/Edit workflow button in the property inspector and add an action to Show the element Popup ratingPopup. Preview the page and check that the ratings popup is shown when you click the Add button. Voilà! You've finished creating a page with two different types of blocks and linked those two blocks together. Nice job! While most blocks will take more configuration than the above example, especially if you're setting up forms with many inputs or more complex functionality, that is outside the scope of this manual and can be learned by learning Bubble well. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules#adding-blocks-with-functionality) Adding blocks with functionality Some blocks in Canvas already have functionality that is preconfigured for your app. Adding these blocks to your app is another way to quickly extend the template. A is a group of Bubble elements arranged in a way that is responsive, cohesive with Canvas design standards, and has some functionality that you can use in your app. More complex blocks also require some customization as well as specific data types and fields to be added to your application in order to work properly. Please see the for these blocks to learn how to set them up. The and blocks are both examples of Canvas elements with functionality that has already been setup. You can find in depth documentation on all the [documentation](https://docs.airdev.co/canvas-pages-and-modules/v/2.0.0/modules/comments-thread) [Comments](https://docs.airdev.co/canvas-pages-and-modules/v/2.0.0/modules/comments-thread) [Chat](https://docs.airdev.co/canvas-pages-and-modules/v/2.0.0/modules/bottom-input-chat-widget) [Canvas Pages & Blocks here.](https://docs.airdev.co/canvas-pages-and-modules/v/2.0.0/) [install the Chrome extension](https://chrome.google.com/webstore/detail/canvas-by-airdev/apmembkcpmjhmecifhckdidppfoiajie) [here](http://canvas.airdev.co/library) [Bubble Pages option set](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/roles-and-permissions#the-bubble-pages-option-set) [block](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#modules) Page Flair Group Editor view with all groups visible Page Flair Group with page title and description visible Page Flair Group with page title, description, and toggle tabs visible Page Flair Group with image banner, page title, description, and toggle tabs visible Title Group Editor view with all groups visible Title Group with Category dropdown visible Title Group with Toggle tabs visible Title Group with Description/Results text visible Create an action to show the ratings popup block Ratings popup is shown when the ADD button is clicked ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJT1jQHqlk2kVYecX8%252Fp4.png%3Falt%3Dmedia%26token%3D981c363e-6328-4e5a-a1e8-57d286f4fd3b&width=768&dpr=4&quality=100&sign=6dbbceba&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJStXpwu0s1YsYBSc4%252Fp2.png%3Falt%3Dmedia%26token%3D382a6f6c-2fa4-490d-b056-6b19aa31d21c&width=768&dpr=4&quality=100&sign=b1647124&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJSolf2_BMbmmOUxpB%252Fp1.png%3Falt%3Dmedia%26token%3D0d2a6c93-7902-489f-bafc-00ac6868e94a&width=768&dpr=4&quality=100&sign=5555cfb7&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJUbJZXMw8S3ibE3AD%252Ft1.png%3Falt%3Dmedia%26token%3D52ef5087-03b9-4ece-985f-0e50d57e9ff8&width=768&dpr=4&quality=100&sign=8d3464d&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJSxhtKvC46TO3PLK3%252Fp3.png%3Falt%3Dmedia%26token%3D0c53bfbe-a58b-4396-839a-9e626267161f&width=768&dpr=4&quality=100&sign=b6ba01ac&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJUjYR71g3SoezrtbC%252Ft3.png%3Falt%3Dmedia%26token%3Debccb236-5cc7-4613-a19f-7a9fbf502547&width=768&dpr=4&quality=100&sign=4b80dbd2&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MKapwLrwcRh1ksPffsf%252F-MKasRPcE4AT6DiaKbSh%252Fimage.png%3Falt%3Dmedia%26token%3Dceb8a64d-8c54-46dd-ab68-07c1fc632759&width=768&dpr=4&quality=100&sign=4e8b9025&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJUfcxRyjh1cecjWH2%252Ft2.png%3Falt%3Dmedia%26token%3D6e53458e-41e2-4e88-83ef-37732662f2a5&width=768&dpr=4&quality=100&sign=98e1f76c&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MXJRVG3x3of0-YYDAx5%252F-MXJUmPpY68KDMSJtrk7%252Ft4.png%3Falt%3Dmedia%26token%3Ddc150a9e-d95b-47fa-b1b0-6fec970498ec&width=768&dpr=4&quality=100&sign=ed20d682&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MKapwLrwcRh1ksPffsf%252F-MKasw_4HSL9iZOt-mRI%252Fimage.png%3Falt%3Dmedia%26token%3Dfa652f75-5ed3-4b11-822f-36b21305fa5c&width=768&dpr=4&quality=100&sign=ee2824eb&sv=2) --- # Option Sets | Canvas Documentation A few option sets come included with the Canvas template: [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets#bubble-pages) Bubble Pages --------------------------------------------------------------------------------------------------------------- * Display (text) - this is the page name * Roles (List of Roles) - the user roles that are allowed to access this page * Private? (yes/no) - "yes" means the page is private * If a user accesses a Page that is marked as Private, they will be redirected to the index page unless they are logged in to a User whose Role has been added to the Roles for this page The Canvas Base Template comes with a number of pages. The two private pages are the `account` page, which can be accessed by Standard and App Admin users (but not logged out users), and the `admin` portal page, which can be accessed by by App Admin users. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets#role) Role ----------------------------------------------------------------------------------------------- * Display (text) - this is the role name By default, your app comes with two roles: `App Admin` and `Standard`. To add a new role, create a new option in the option set for that role * New option in Role option set (e.g. Account Admin or Sales) * Add the new role to the Bubble Pages attribute Roles if they should have permission to access that page. * Assign the Roles to Users, usually through one of these methods: * Assign the new Role to users manually in the Bubble Editor's Data tab * Build the logic to let App Admins sign those Users up from the admin page * Build the logic to assign the new Role to the Users when they're signed up [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets#admin-options-categories) ⚙️ Admin Options Categories ------------------------------------------------------------------------------------------------------------------------------------------ Manages tabs to display different options in the admin portal [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets#admin-options) ⚙️ Admin Options -------------------------------------------------------------------------------------------------------------------- List of all the different options we display in the admin portal [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets#navigation-action-type) ⚙️ Navigation Action Type -------------------------------------------------------------------------------------------------------------------------------------- Contains the different types of actions that can be used for a navigation element in the header or footer [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets#navigation-button-style) ⚙️ Navigation Button Style ---------------------------------------------------------------------------------------------------------------------------------------- Contains the CSS class for different button styles in the header [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets#navigation-element-type) ⚙️ Navigation Element Type ---------------------------------------------------------------------------------------------------------------------------------------- Canvas uses this option set to maintain the default settings for different types of navigation elements in the header and footer [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets#navigation-feather-icon) ⚙️ Navigation Feather Icon ---------------------------------------------------------------------------------------------------------------------------------------- List of all Feather icons code text. Canvas uses this throughout the template to manage the correct icon to display for links, headers, etc. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets#password-strength) ⚙️ Password Strength ---------------------------------------------------------------------------------------------------------------------------- This is used to manage the application's password policy strength requirement. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets#template-version) ⚙️ Template version -------------------------------------------------------------------------------------------------------------------------- This is used for version control and in our Canvas Chrome extension. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets#yesno-inclusive-yes-no) ⚙️ Yesno (Inclusive "Yes/No") ------------------------------------------------------------------------------------------------------------------------------------------ This is an option set that works similar to the Bubble "yes/no" data type, but adds a 3rd option that returns true for both yes and no. In short, it works as follows: * _no_ will return results where the field is "no" * _yes_ will return results where the field is "yes" * _yes OR no_ will return all results For a more detailed explanation, read on. When creating searches in Bubble, if you have a constraint on a yes/no field, it will always return either the "yes" options or the "no" options. The above image shows how a search either includes Inactive users or Active users, but not both. Here's the search logic used to produce this result: Here's how this will look when set up with the Inclusive / Exclusive option set. For a demonstration of how to use this in a real app, check out the Dropdown Users on the admin page of the Canvas Base Template. The performance of these searches seemed to be about the same in our tests. Please let us know if you notice anything different. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets#language) ⚙️ Language ---------------------------------------------------------------------------------------------------------- A full list of languages and to manage all localization settings in Canvas and Bubble. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets#verify-type) ⚙️ Verify type ---------------------------------------------------------------------------------------------------------------- Manages the type of verification being done when using **widget\_verify\_phone/email.** Also used with the **Verify** backend calls to indicate whether a user should receive an sms or email. [PreviousData types](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/data-structure) [NextBackend Workflows](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/api-workflows) Last updated 11 months ago Normal Bubble yes/no Logic with normal Bubble yes/no (no inclusive yesno option) Option set yes/no/yesno Logic with normal Bubble yes/no (no inclusive yesno option) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F8ur6s6wdnfR9bclne4Dx%2Fsearch-for-users-yesno.PNG&width=768&dpr=4&quality=100&sign=aeb63356&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F4srpI4uGkt7Cp8DWO6Y9%2Fsearch-for-users.PNG&width=768&dpr=4&quality=100&sign=1415e608&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FVYxkq1A9hSNTxNF1LrdJ%2Fyes-no-exclusive.gif&width=768&dpr=4&quality=100&sign=7a8ec7d9&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2Fa0AZ4tlYDjwAFYxw3mG0%2Fyes-no-inclusive.gif&width=768&dpr=4&quality=100&sign=fd04564f&sv=2) --- # Data types | Canvas Documentation [PreviousSidebar tab](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/sidebar-tab) [NextOption Sets](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/option-sets) Last updated 11 months ago All objects and some selected fields in the template are explained below. Please refer to our document for guidance on how the Bubble database should be structured. All data types and a few select fields are explained below. A good general rule to follow is that you shouldn't delete any fields that are included with the template and instead only add new ones. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/data-structure#app-settings) ⚙️ App Settings --------------------------------------------------------------------------------------------------------------------- This data type includes fields for all app-wide settings. Most of the data fields are controlled by the App admin from the Admin portal. There should only be a single object of this data type. Field name Type Description Ask for cookies? yes / no App Owner can control whether or not to ask users to accept cookies (if yes, a cookies banner will show on the homepage) Email text Contact / support email that all emails in the application come from. Whenever a new email action is created in the application, it should refer to this field instead of being hardcoded Email verification required? yes / no App owner can control whether or not to require users to verify their emails during the sign up process (if yes, users will receive an email that contains a verification link and they will need to click the link to verify their emails) Name text Name of your app / website. This is the field that should be referenced anywhere where the name is used (instead of hardcoded). App primary color text App and email template primary color Usersnap off? yes / no This disables the Usersnap tool, which Airdev uses with its clients to submit feedback and bug reports. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/data-structure#app-variables) App Variables -------------------------------------------------------------------------------------------------------------------- This data type is specifically for setting up custom app-wide variables for your project. Simply add fields as need and reference them from your pages by accessing the `var - app variables` [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/data-structure#user) User -------------------------------------------------------------------------------------------------- The user data type represents each person who has an account in your application. Field name Type Description Date agreed to terms and privacy docs date Date agreed to terms and privacy docs during sign up Date signup completed date Date the user completed signup. This is populated upon sign up when the user signs up for an account by himself. If the user is invited to the app (e.g, app admin) then this is recorded when he first sets his password. Inactive yes / no User is marked as inactive = yes when app admin deletes the user from the admin portal Last login date Captures the last date that the user loaded any page in the app Signup method text E.g., E-mail, LinkedIn, Facebook, Twitter, or etc. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/data-structure#email-template) ⚙️ Email Template ------------------------------------------------------------------------------------------------------------------------- Email templates are managed from the admin portal and act as the main parent to manage email content for different scenarios [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/data-structure#email-template-variant) ⚙️ Email Template Variant ----------------------------------------------------------------------------------------------------------------------------------------- The email template variant holds the email content for its parent Email template. When using multiple languages an email template will have multiple variants... one for each language. Field name Type Description Email template ⚙️ Email Template Parent email template Is active? yes/no Sample pdf fileimage Language code text Language code for the language this variant represents Language name text Display name of the variants language Text body text Text to use as the body content for the email Text button text Button text Text signature text Text to include as the signature of the email Text subject text Text to add to the subject line of the email Used to verify a users email We create one record for each header you create for your application [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/data-structure#navigation-item) ⚙️ Navigation Item --------------------------------------------------------------------------------------------------------------------------- Contains all the code and metadata for an item such as a link, button, icon, etc that has been created for a footer or header element [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/data-structure#verify) ⚙️ Verify --------------------------------------------------------------------------------------------------------- Stores the code data when a user is going through the verification process for their email, sms, or two-factor authentication. [Bubble Best Practices](https://build.airdev.co/wiki/best-practices-building-bubble-apps) --- # Admin Portal | Canvas Documentation [PreviousPricing](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/index-5) [NextAccount](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/account) Last updated 11 months ago **Page name:** admin **Purpose:** Fully responsive and functional portal for managing all the settings for your application [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#overview) Overview ---------------------------------------------------------------------------------------------------------------------- Your app will come with a dedicated portal for the app’s admin where you can manage app settings & data. Much of this is preset for you, but you will have to customize the page for your app. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#canvas-tools-and-setup-checklist) Canvas tools & Setup checklist In your admin portal, we have a dedicated section for Canvas tools. This section includes various resources on how to use the Canvas Building Framework. The setup checklist contains a list of settings that you will need to update or activate to customize your Canvas app according to your needs. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#branding) Branding This is a compilation of all branding related settings for your app. You can manage your app name, SEO/social tags, logos, colors, and certain page styles from this tab. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#pages) Pages This tab allows you to view all marketing and Bubble pages in your app. To add marketing pages, you will need to register your app with Canvas first and have your app be on a paid Bubble plan. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#header-footer) Header/Footer This tab allows you to customize your header and footer navigations. You will be able to add or edit the headers for each of your app's user types (e.g. admin user, standard logged-in user, and logged-out user). ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#emails) Emails This tab allows you to manage and edit the content for the emails that are sent from the app. To use this feature, you would need to complete the launch checklist step for _Enable outgoing email_ first. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#settings) Settings This is a compilation of your application's general settings (many you would have already seen from the launch checklist). The **Settings** tab provides a means for admins to set global variables for the app. Some of these are pre-baked into Canvas, like setting the password policy or cookie settings. But you also can customize your own app-wide settings that can be exposed to app admins (e.g. listing fee or tags). To do this, find the **Group Nav 0/1/5 - Launch & Settings** group. Within this group is a reusable element called **admin\_options.** Within this is another reusable called **admin\_options\_settings**. You shouldn't need to touch any of the other elements/workflows within **admin\_options**. Once inside **admin\_options\_settings**, you will have access to two button-style groups within **Group Collapsible admin-defined options group**, one of which launches a popup with a single input, and another which launches a pick-list of options. The single field popup is updating a dummy field in the website object called **dummy option** and the sample picklist popup is displaying a list of dummy data. You should connect up your own data and logic to the buttons and corresponding popups. The add and delete features in the sample picklist popup are disabled by default - you must go into the Bubble editor and enable the add/delete features in order for them to work. To add additional options to this area, the groups and popups which are used here should be cloned. You can adjust the collapsing range of the reusable using **Group PLACEHOLDER**. If you’d like to hide these options entirely, you should go to the reusable, select **Group Collapsible admin-defined options group** and uncheck _This element is visible_ on the conditional tab. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#analytics) Analytics View statistics for your users such a total users, recent signups, and active users. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#users) Users View all the users in your application, reset passwords, add new admin, and filter by status, name, and role. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#extending-the-admin-portal) Extending the Admin Portal ---------------------------------------------------------------------------------------------------------------------------------------------------------- To extend the admin portal and customize it for your application, the Canvas Base template comes with a placeholder table group that can be copied and customized to add additional views and functionality for your data. You can find this group in the elements tree as **Group Nav 8 - Data type 1 content**. On the page this group is located directly below 'Group Nav 7 - Users'. This group contains a reusable element called **admin\_section\_template** which contains dummy data. Make the following changes to customize it for your needs. **General** 1. Update the titles for the **Group Nav 8 - Data type 1 content** and **admin\_section\_template** groups (i.e, you might have **Group Nav 8 - Posts** and **admin\_posts**) 2. Edit the the **New** button and add an action when it is clicked 3. Add an action for the **Data** button if needed #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#set-up-the-repeating-group) Set up the repeating group From inside the reusable elements **admin\_section\_template**, you should: 1. Data to display 1. Change the title and data type of the element RepeatingGroup Dummy 2. Define a data source for the repeating group 2. Set up the table 1. Update/add headers in the text elements placed above the repeating group. 2. Define the dynamic content that corresponds with the headers and will be displayed by the repeating group. 3. Set up the text that is displayed when no data is found. This is nested under Group inner dummy content > Group no entries. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#navigation) Navigation From the admin page, you should 1. Open FloatingGroup Sidebar\_website > Group inner sidebar tab\_website > Group Main Nav 9 - Data type 1\_text 2. Change the data source for this group to the text you would like to display in the navigation bar After each change you make here, make sure to view the web page in version-test in order to check whether it works as expected. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#adding-additional-tabs-to-the-admin-portal) Adding additional tabs to the Admin portal ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ To add additional tabs to the admin portal, duplicate the **Group Nav 8 - Data type 1 content** and the **admin\_section\_template** reusable elements we customized above. Change the text after the hyphen in the group name to represent the data type it is displaying. For instance, if we were displaying invoices in the Group Nav 9 element we should change the name to 'Group Nav 9 - Invoices'. The steps are nearly the same as above but you will need to take the following additional steps. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#replace-the-reusable-element) **Replace the reusable element** In your new, parent content group (**Group Nav 9 - Data type 2 content**, for example), you'll need to replace the **admin\_section\_template** reusable, which was copied along with the parent group, with your new reusable (**admin\_section\_name**, for example). #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#reposition-the-new-group) Reposition the new group Move your duplicated group underneath Group Nav 8 so the top of your new group snaps to the bottom of the Group Nav 8. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#resize-the-placeholder-group) Resize the placeholder group Drag the top of the 'Group PLACEHOLDER (do not delete) until the top edge snaps to the bottom of the new group you created #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/default-pages/admin-portal#update-the-conditional-references) Update the conditional references Change the reference in the conditional from 'Group Main Nav 8 - Data type 1\_text' to 'Group Main Nav 9 - Data type 2\_text' You're all set! You can duplicate the steps above to add as many new data tables as you like! These guidelines are specific to the Admin portal, but they can be useful as a common design pattern to follow for a portal/dashboard page. [](https://share.vidyard.com/watch/XTbyh5BxmHnuy84RWh397Z?) [](https://share.vidyard.com/watch/nwZzhmHuaui2672BjDx4ck?) [](https://share.vidyard.com/watch/5VDXLBdV29FMjN84ykX5iP?) [](https://share.vidyard.com/watch/4vBgHvtUz3SqEdXG61A3cM?) ![Emails tab](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcdn.vidyard.com%2Fthumbnails%2F23753589%2FFTeEhh1S77n8vaePTlJQDQ_play_button_small.jpg&width=300&dpr=4&quality=100&sign=8054254&sv=2) ![Pages tab](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcdn.vidyard.com%2Fthumbnails%2F23753414%2F_YbNXXIp31gz0_EJXPH9gw_play_button_small.jpg&width=300&dpr=4&quality=100&sign=857c3fe&sv=2) ![Settings tab](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcdn.vidyard.com%2Fthumbnails%2F23753799%2FkPykSNnHn3BXXB-5DR_XAw_play_button_small.jpg&width=300&dpr=4&quality=100&sign=e859723&sv=2) ![Header / Footer tab](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcdn.vidyard.com%2Fthumbnails%2F23753474%2F4BmlnWmLVKkzOWbyeVuRVg_play_button_small.jpg&width=300&dpr=4&quality=100&sign=753d9d90&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FFsW0hhsvhtZHh8DDRgAv%2Fimage.png&width=768&dpr=4&quality=100&sign=e8aa5330&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FrW3AAJQ6aPJm12qOC3jx%2Fimage.png&width=768&dpr=4&quality=100&sign=9832bc4f&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FF5gK1kfxbPx4qA0Fjl1w%2FScreen%2520Shot%25202022-01-11%2520at%25207.10.44%2520PM.png&width=768&dpr=4&quality=100&sign=407e4bff&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F7b7BmTAC5kBOEYUr0ZfO%2Fimage.png&width=768&dpr=4&quality=100&sign=39fff881&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FpCskFGw9y7kr78glxbb8%2Fimage.png&width=768&dpr=4&quality=100&sign=7cb42096&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FiN74ya3YGHGOrQmfYQ5H%2Fimage.png&width=768&dpr=4&quality=100&sign=34d1d131&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FAq2wlPu3vHbaEOrCSkT9%2Fimage.png&width=768&dpr=4&quality=100&sign=74f64bdb&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FjDv6WJtvT6asiOaExSeQ%2Fimage.png&width=768&dpr=4&quality=100&sign=6f47fccd&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FpZDGCncq0KvYJq2IPGyW%2Fimage.png&width=768&dpr=4&quality=100&sign=bbcd2e80&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F5FIrJyfH3QJH01xVjHlT%2Fimage.png&width=768&dpr=4&quality=100&sign=f3e124cd&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FO4uwdqpjlZCte5by7g3h%2Fimage.png&width=768&dpr=4&quality=100&sign=6b18f006&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FPKMDLjgkghLik04l6mQZ%2Fimage.png&width=768&dpr=4&quality=100&sign=4f59794e&sv=2) --- # Emails & Alerts | Canvas Documentation [PreviousData & Workflows](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/data-and-workflows) [NextMiscellaneous](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/miscellaneous) Last updated 4 years ago Was this helpful? Canvas does not use Bubble's native 'send email' action for sending emails from your application. Instead we have integrated with Sendgrid and Postmark to send transactional emails using a beautiful HTML template. There are several key benefits to using SendGrid or Postmark: * Send email from your own domain name (e.g. [\[email protected\]](https://docs.airdev.co/cdn-cgi/l/email-protection) ) * This is great for branding and can potentially help with spam filters * Access to advanced email metrics to measure the success of your email marketing * With our Sendgrid integration, you can [check the Sendgrid dashboard](https://app.sendgrid.com/) of your account to see these metrics. * The same goes for our Postmark integration. Check Postmark's dashboard for more statistics on [user engagment](https://postmarkapp.com/) and email activity logs. * Send attachments with your emails * Customize the email's design with html directly in your Canvas admin portal To use this template you will need to take some steps to set up the integration with SendGrid. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#setting-up-your-email-integration) Setting up your Email integration --------------------------------------------------------------------------------------------------------------------------------------------------------- [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#sendgrid) Sendgrid ------------------------------------------------------------------------------------------------------- As of April 6, 2020, Sendgrid began requiring new accounts to verify any email address from which you will be sending communication through the SendGrid API. This is to prevent using the SendGrid platform for spamming or phishing activities. You can either verify up to 25 single email addresses or verify a domain. Learn about both options [here](https://sendgrid.com/docs/for-developers/sending-email/sender-identity/) . ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#get-your-sendgrid-api-key) Get your Sendgrid API key Go to [sendgrid.com](https://sendgrid.com/) and sign up for a free account. Once you are signed in you will be directed to the Sendgrid dashboard. Navigate to Settings > API Keys in the left menu to [create your API key.](https://sendgrid.com/docs/ui/account-and-settings/api-keys/#creating-an-api-key) Click on the blue button in the top right hand side of the screen called Create API Key. You can name the API key anything so it's best to choose a name that that makes sense to you. Select the Full Access option and click the Create & View button. Copy the API key that is displayed in the next screen. Sendgrid will only show this API Key to you once so make sure to save it somewhere safe that you can access later if needed. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#setup-sendgrid-in-plugin) Setup Sendgrid in plugin Now that you have your API key, open the Bubble editor for your app and navigate to the Plugins tab from the left menu. Click on Sendgrid to open the plugin settings. Paste your Sendgrid API key into the 'API Key' field. If you would like to keep the email stats from the development site and your live site separate, go through the steps for creating an API key in Sendgrid again and paste the second key into the 'API Key - dev' field. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#postmark) Postmark ------------------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#get-your-postmark-api-key) Get your Postmark API key Create a Postmark account with the first step in this process. Postmark has a [guide to getting started](https://postmarkapp.com/support/article/1002-getting-started-with-postmark) that includes more steps than what are required to use our plugin, but which we recommend that users complete in order to maximize email deliverability and minimize the number of emails that end up in spam boxes. Postmark's free tier allows 100 emails per month per account. This is much less than SendGrid. Postmark's email deliverability rate has been reported to be higher than SendGrid's (less likely to be marked as spam) due to higher standards for quality email sent by Postmark's users, and lower tolerance for users sending out messages marked as spam. Visit the [API Tokens page](https://account.postmarkapp.com/api_tokens) to get the following 2 API tokens: * Copy the Account API Token into your Bubble app's plugin * Copy the Server API Token into your plugin. Use the server name "My first server" if you haven't created any custom servers. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#setup-postmark-in-plguin) Setup Postmark in plguin To track different stats on development and live emails, [set up a second server in Postmark](https://postmarkapp.com/guides/how-to-manage-multiple-customers-with-postmark) and use the API credentials for that server in the "Postmark Server API Token - dev." key. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#add-your-apps-admin-email) Add your app's Admin email ------------------------------------------------------------------------------------------------------------------------------------------ The admin email address set in the portal is the one that will be used to send all emails from your application. To set this up, login to the Admin portal and navigate to Settings > Outgoing email. This will open the Enable outgoing email popup. Below is a GIF that displays each of the steps to adding an email to your Canvas app. Enter your email address into the input and click 'Verify'. This will trigger the [Single Sender verification](https://sendgrid.com/docs/for-developers/sending-email/sender-identity/) process with Sendgrid, or the [verification process with Postmark](https://postmarkapp.com/support/article/846-how-can-i-send-on-behalf-of-my-users) . You must to be logged in to Sendgrid in the same browser that the verification email is opened in order for the Single Sender email verification process to work. This is not the case for Postmark. Go to the inbox for the email you just entered. You should have an email from SendGrid or Postmark asking you to verify your Single Sender email address. Click the button to verify. Once you have verified your email, go back to the admin portal and click on 'Outgoing email' in settings again. Click the 'I've verified my email' button. Canvas will check the verification status of your email with Sendgrid or Postmark and you will see a message saying your email is verified and ready to go. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#migrating-to-postmark-on-old-apps) Migrating to Postmark on old apps Using older Canvas apps, it is possible to upgrade the SendGrid plugin to use the new Postmark flow. Doing this will require you add a text field called "Email provider" to your website object, and saving the value "Postmark" to that field. This data source should be added to your app anywhere that emails are sent, so that they are sent through Postmark and not SendGrid. This process is a bit tricky and must be done anywhere in the app that one of the plugin's actions is used, so be sure to use the Bubble editor search tool and update each individual action. Note that the flow to assign an admin email in the admin portal is integrated with SendGrid, and the workflow actions there would need to be updated to work with either SendGrid or Postmark, depending on the Website's email provider field. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#email-templates) Email templates --------------------------------------------------------------------------------------------------------------------- Your Canvas template will come with 5 standard email templates that can be customized to meet your needs. These templates can all be managed centrally from the Admin portal by navigating to the Emails tab from the left menu. **Email verification** This is sent to the user to confirm their email address when 'Require email verification during signup' is toggled to yes in Settings > Manage user sign up flow. This template cannot be deactivated at the template level. **New admin** This email will be sent to new App Admins you invite from the Users tab to help you manage your app. Do not remove the \*RESETLINK\* merge term on this email as that will remove the link that allows them to create their password. This template cannot be deactivated as it is integral to adding additional admins to your application. **Reset password** Any time a user click on 'Forgot Password' and requests a new password reset link they will receive this email. This template cannot be deactivated as a user should always be able to reset their password. **Welcome email** If this template is active it will be sent to any user who signs up welcoming them to your platform. **Sample email** This is a sample email that is available to give you a head start on expanding your email templates. Simply click 'Duplicate' in the dropdown menu to duplicate this email and start customizing! ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#adding-an-email-template) Adding an email template You can add a new template in two ways. * **Add new template** To start from a blank slate, click the '+ Add new template' button to create a new email template. * **Duplicate an existing template** You can duplicate an existing template by opening the action menu from the ( ⋮ ) button and clicking the 'Duplicate' option. It is typically simpler to duplicate an existing template as you are not starting from scratch. Whichever way you add a new template, the following steps must be completed before the email template can be used. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#create-update-the-template-content) Create/Update the template content Open the edit form for your email template and fill out the fields * **Email template name** (required) This is how the email template is identified in all front end UI. * **Description** (required) Brief description of how this email template is used. It's not unusual for an app to have many similar emails so be as specific as possible with your descriptions. You will thank yourself later! * **Mail merge terms** (optional) This is a list of texts that represent the mail merge terms being used for that specific email template. Only the mail merge terms actually included in the subject, body, or signature of the email will be used but this is a great way to keep track of which terms you are using as a quick reference when you are setting up or updating the template workflow. * **Subject text** (required) Create the subject line for your email. Can be dynamic by using mail merge terms as well. * **Body text** (required) Use mail merge terms and create a fully customized email by using HTML formatting in the body of your email. Check out the _**Sample email content**_ template for a quick view on how to use HTML tags in your email. A **mail merge term** is simply a placeholder text within asterisks (_e.g., \*FIRSTNAME\*_ ) that is replaced with dynamic content when the email is sent. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#set-the-id-for-the-template) Set the ID for the template The Email template data type contains a field called 'ID\_name' that is used to identify the template with a rememberable unique ID when searching for the template in the database. This field must be edited from the database in the editor and should be unique and contain no spaces (_e.g., uniqueID, unique\_ID, etc_) If you change the ID\_name for an email template after it has been setup, don't forget to update the id in any template workflows to send that email. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#create-a-template-workflow) Create a template workflow A corresponding workflow will need to be created for each email template to set up the mail merge terms. Canvas offers two ways to handle this: 1. **SEND USING FRONT END WORKFLOWS** The default emails in Canvas are sent from the front end. **Pros:** Does not require a paid Bubble plan to send custom HTML emails **Cons:** Less robust when it comes to scheduling emails for the future **Setup**: Open the reusable element 'email\_workflows', duplicate the workflow named 'template - send email action' and rename it to match your email template. 2. **SEND USING BACKEND WORKFLOWS** **Pros:** Supports complex email templates and more robust scheduling options **Cons:** Requires a paid Bubble plan to use **Setup**: From the Emails folder in the backend workflows, duplicate the workflow named 'send\_email\_template' and rename it to match your email template. The standard workflow actions for setting up the template is the same regardless of how you have decided to send your emails. By default a User thing will be the only data being used but consider the content of your email and note the data necessary to customize the email when it is sent. Additional data can be passed through parameters in the backend workflow. If sending emails from the front end, additional data can be passed by setting custom states on the email\_workflows element. **Action 1:** Make changes to Email template... This step is used to find the correct email template for this workflow and can later be referenced as Result of Step 1. Click on the blue search text and change the text 'template_\__name' for the ID\_name of your email template. **Action 2:** Make changes to Website... This step is used to find the website data for your application and can be referenced as Result of Step 2. **Action 3:** Send basic email This action is already preconfigured to use the email template you set in the first action. Generally you will need to simply update the button action and the mail merge terms at the bottom of the editor. Here's a quick overview of the options available. * Emails * To, CC, and BCC emails can have multiple static or dynamic values as long as each email is separated by a comma. * The From email must be a verified email in your Sendgrid account * Subject should be set to the email template's Subject text * Body should be set to the email template's Body text * Signature should be set to the email template's Signature content * Logo * The dynamic image is preset to use the logo set in the admin portal. If set the static image will be used if no dynamic image is available. * Button * Customize the button text and link for each email. * Mail Merge * Define the values for your all mail merge terms by inputting the mail merge term in the 'key' field and the value it should be replaced with in the 'value' field. * To add additional mail merge terms click on the the '+ Set another key/value' button Merge terms can be used in the following locations: Subject, body, signature, from name, reply to name, and button text [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#sending-an-email) Sending an email ----------------------------------------------------------------------------------------------------------------------- To send an email from your app: * From the frontend, place the reusable 'email\_workflows' in the hidden variable popup and use the action 'Trigger a custom workflow from a reusable element' * From the backend use the action 'Schedule API Workflow' * Add the 'Send basic email' action directly into any workflow to send an email for which you do not need a template. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#alerts) Alerts --------------------------------------------------------------------------------------------------- Showing toast notifications goes a long way in keeping your users feeling confident in the actions they take like saving changes or adding an item to their cart. The Canvas AirAlert plugin provides three actions that can be used to manage these notifications. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#airalert-standard) AirAlert - Standard This is the action you should use for most of your notifications and has predefined settings for Success, Warning, Error, and Information alerts . If you would like to customize the background and font colors for these alerts they can be updated by navigating to Plugins > AirAlert in the Bubble editor. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#airalert-clear-all) AirAlert - Clear all Run this action to close all alerts that are currently visible to the user. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#airalert-custom) AirAlert - Custom While AirAlerts work in all modern browsers (Safari, Chrome, IE Edge, Firefox, Opera, and more) they do not work in Internet Explorer. The 'Add SendGrid API key to the Bubble editor' should be checked. If it is not, go back through the step to or Setup the Postmark plugin. While each email template can be created and edited from the Admin portal, the workflow actions and mail merge terms must be set up manually. See **Signature content** (optional) You have the option to customize your email signature here. If left blank we will set this to `- The *APPNAME* team` using the application name you set . With this action you can customize all the attributes of the the alert directly in the property editor for the action. This is useful for one-off use cases where you need to simulate a specific look but takes more time to set up than using the action. [here](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#name) [Setup the Sendgrid plugin](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#set-up-the-sendgrid-plugin) [Create a Template Workflow](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#create-a-template-workflow) [AirAlert - Standard](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/emails-and-alerts#airalert-standard) A reset password email sent from Canvas using our plugin Exchange 'template\_name' for the ID\_name of your email template \*MERGE\_TERM\* is replaced with the dynamic value Options when triggering the Standard alert ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNssaFsPJvbtdPkZie7%252F-MNtJlcj9DIFPHUMtkFf%252Fimage.png%3Falt%3Dmedia%26token%3Ddfd274a2-f722-46ee-a7ab-83cf7b3ee707&width=768&dpr=4&quality=100&sign=fcf35878&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MZs8Y8LTDbJvqfprKY6%252F-MZs9Fg51fHwaIfxBdxH%252Fimage.png%3Falt%3Dmedia%26token%3Dec9ed251-39aa-42c9-94e4-eae9ab865939&width=768&dpr=4&quality=100&sign=b4b196dc&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MZs4SFO1ypu3xxJQ-_1%252F-MZs7O5A1QLKA6CyTKoX%252Fsendgrid-postmark-admin-email.gif.gif%3Falt%3Dmedia%26token%3D7979b685-6e9b-4f45-b520-9506bcd46a21&width=768&dpr=4&quality=100&sign=9696d573&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNtWmNmi9sSEtA4Mxae%252F-MNu5WC2FuNKFJCBVD7H%252Fimage.png%3Falt%3Dmedia%26token%3D5f7108b4-39c0-4d77-a3af-dea6e8d5db3c&width=768&dpr=4&quality=100&sign=a552f2ad&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MZs8Y8LTDbJvqfprKY6%252F-MZsARHTkysoszrTz0Rp%252Fimage.png%3Falt%3Dmedia%26token%3D4de88cee-3735-44b5-8d52-14992b012750&width=768&dpr=4&quality=100&sign=8b705048&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MP5P11d7bkwqZg1Pvbs%252F-MP5ofGe1fkTBwX9Xs4m%252Fimage.png%3Falt%3Dmedia%26token%3Dcbb11aa5-22d4-4e97-b36a-f18080d4ede0&width=768&dpr=4&quality=100&sign=ab9f7a82&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNtWmNmi9sSEtA4Mxae%252F-MNtgQMXeHxl6X9tsRex%252Fimage.png%3Falt%3Dmedia%26token%3Db81febce-954d-44b4-9d62-9d1bcc686298&width=768&dpr=4&quality=100&sign=74194e3b&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MZruKXErIlvLq2wc-Ux%252F-MZs3CWK_8bf31i-vDWy%252Fsendgrid-pm-plugin-keys.png%3Falt%3Dmedia%26token%3D9ef4f6de-5069-4825-844f-f4e69f0aaf4d&width=768&dpr=4&quality=100&sign=abf4a285&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MZruKXErIlvLq2wc-Ux%252F-MZs374AF_5TUh-1d7gW%252Fsendgrid-pm-plugin-keys.png%3Falt%3Dmedia%26token%3D5e94d9b0-49e7-419c-8563-02ba367bd637&width=768&dpr=4&quality=100&sign=3ac278b8&sv=2) --- # Widgets | Canvas Documentation [PreviousCookies Permission](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/cookiespermission) [NextUI Widgets](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/widgets/ui-widgets) Last updated 4 years ago Was this helpful? **UI Widgets** UI widgets offer elements designed to be interacted with by your users on the front end and contain workflows specific to the reusable. Typically you should clone these reusables and customize them for your specific use case. **Workflow Widgets** Workflow widgets contain workflows that can be referenced from the page using the 'Trigger a custom workflow from a reusable element' action. [UI Widgets](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/widgets/ui-widgets) [Workflow Widgets](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/widgets/workflow-widgets) --- # Cookies Permission | Canvas Documentation [PreviousPopups Reusable (derprecated)](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/popupsreusable-1) [NextWidgets](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/widgets) Last updated 4 years ago Was this helpful? **Element name:** cookies\_permission **Purpose:** Get the user's consent to store cookies on their device To use this feature, make sure you enable this setting in the . By default, the cookies\_permission reusable element is placed in a floating group anchored to the bottom of marketing pages. To add this banner to another page, simply select "FloatingGroup cookies" and copy the floating group with workflows. On the new page, right click and select page with workflows. Make sure the floating group is flushed to the bottom of the page and set to "vertically float to the bottom". [Admin portal](https://docs.airdev.co/canvas/v/2.0.0/using-the-template/reference/pages/owners-portal-page#admin-portal-overview) --- # Header | Canvas Documentation [PreviousReusable elements](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements) [NextFooter](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/footer) Last updated 4 years ago Was this helpful? **Element name:** header **Purpose:** Provide easy navigation and actions to the user throughout the application. The header menu is a fully responsive reusable element that is used on every page of the Canvas template. You can find it nested inside a group at the top of the page called 'FloatingGroup Header'. When being viewed by a user that is not logged in to the application the header will display a logo, menu links, and CTA button for logging in or signing up to the application. On a small screen the menu links and CTA buttons are shown in the dropdown menu when the menu icon is clicked ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/header#editing-the-header) Editing the header #### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/header#editing-from-the-admin-portal) Editing from the Admin Portal To set up the links visible to logged out users, go to your admin portal and navigate to the Header/Footer section from the left menu. From here you can add, edit, and delete menu links, change the display order, view both mobile and desktop previews, and set the destination links and icons for each option. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/header#header-elements) **Header Elements** ------------------------------------------------------------------------------------------------------------------------------------------ Open the header reusable element in the Bubble editor to make substantive changes to your apps header menu. This reusable is quite complex so we'll go through all the visual elements and workflows and how they are used below! ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/header#offline-notifier-a) **Offline Notifier A** This element is from the AirDev plugin Offline Notify and monitors the internet connection of your users computer. If the connection goes offline it will display an alert letting the user know their connection has been interrupted. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/header#group-portal-menu) **Group portal menu** This group contains a single feather icon element and is only visible on a portal page when the width of the screen is ≤ 1111px. This element is used to show and hide the left side portal menu on smaller screens. **Portal page** is simply a reference to a page that has a menu on the left side of the screen with content to the right of that menu. On tablets and phones this menu needs to be hidden for good usability so we use the Group portal menu element to allow the user to show and hide the menu on smaller screens. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/header#group-header) **Group Header** The Group header element contains all the main header menu elements including the logo. Header logos are linked to the logo images uploaded dynamically through the admin portal and have conditions set for when the dark or light versions should be shown. We highly recommend not making changes to the logo elements unless you are proficient with the Canvas template. **Group Logo Desktop** This element is used to display the logo on larger screens and is visible by default. It is hidden with the following conditions: * Header's Portal page? (a custom state) is 'yes' and the page width is ≤ 1111px wide * Header's hide logos? (a custom state) is 'yes' * Hiding rule in responsive settings `Parent width is ≤ 600px` **Group Logo Mobile** This element is used to display the mobile logo on small screens and is visible by default. It is hidden with the following conditions: * Header's Portal page? (a custom state) is 'yes' * Hiding rule in responsive settings `Parent width is > 600px` The header element has custom state called 'Dark?' that indicates whether the color behind the logo image is dark or light. By default this is set to 'Dark? = no' which will show the dark logo. To manually show the light version of the logo, simply set this state to 'Dark? = yes' from the page actions. **Group placeholder responsive** This element is used to shrink the distance between the logo groups and the element to the right when the screen is resized smaller. DO NOT DELETE **Group Desktop Menu Items** Contains the HTML element used to display the menu links setup in the admin portal. We highly recommend you do not edit this group. **Group Mini Menu Holder** The element contains two transparent overlay buttons and one icon and is visible only when the user is not logged in. These buttons are used to show and hide the dropdown navigation menu on small screens. **Group Loggedout** As it sounds, this group is also shown only when the user is not logged in and the parent width is > 1009px. There are two buttons in the group: * Button Log in * Button Sign up **Group Loggedin** This element is shown only when the user is logged in and contains the following nested groups. If you do not need one or more of these elements, hide them at the group level listed below. * Group profile * **Note: It is unlikely you would ever want to hide this group as the functionality provided is integral to the performance of your Canvas template** * Group Notifications icon * Group Shopping cart icon * Group search icon **Quick tip**: You can use the button element with a transparent background as an overlay on another element to provide an accessible place for the user to click. **popupsreusable A** A reusable containing the signup/login popup, HTML loading screen, and a generic message popup **HTML Usersnap code** This is a feature we use with our clients for testing. You can turn this off by setting the field 'Usersnap off?' on the Website object to 'yes' or it can be deleted if you do not think you will be using it. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/header#groupfocus-mini) GroupFocus Mini This is a Group Focus element that contains the dropdown menu for all the actions in your application. There are three main sections in this menu: * Group Loggedout Menu * Shown only to users who are not logged in and by default contains the following buttons and actions * Signup * Login * Also contains three placeholder buttons. * Group Logged in * Shown only to logged in users and by default contains the following buttons and actions * Admin portal - shown only to admin users * My account * Log out * Also contains seven additional placeholder buttons. * Group Pages list * Shown only to users who are not logged in * Contains the menu links set up in the Admin portal **Placeholder button** simply refers to a fully designed button element that has been hidden by default but can be unhidden and used as needed in your application. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/header#header-states) Header states ---------------------------------------------------------------------------------------------------------------------------------- The header reusable uses four states (states are often used in reusable elements to pass data between the reusable element and the page): * **Dark? yes / no state** \- If Dark=yes, then the default logo, favicon, button, and link color in the header will be white. If `Dark` = `no`, then the default logo, favicon, button, and link color in the header will be the app's default color. Please see an example of this below on the index page: * If you would like to change the background color when the header's "dark" state is "yes" so that it is not transparent, please modify this conditional on the `Group Header` element: * **Show portal menu? yes / no state** - On mobile (when on a portal type page), you can click on the portal menu in the upper left corner to open the sidebar menu. This is achieved by setting the state of `Show portal menu` to `yes`. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/header#key-workflows) Key Workflows ---------------------------------------------------------------------------------------------------------------------------------- The header will come will various custom workflows that you can trigger from the page. You can do so by going to the workflow tab in the Bubble Editor and selecting Custom workflow > Trigger a custom workflow from a reusable element > Select header from the dropdown and the custom workflow name When viewed as a logged in user the header will display a logo, a set of three icons (, , and ), and a profile image with a dropdown menu that includes links to the users profile account page, Admin portal (if an admin), and a log out action. To customize the header to match your needs, you can make changes to the links visible to **logged out users** from the admin portal and to the actions available to your **logged in users** from the Bubble editor (see below) To navigate to Branding > Logos in the admin portal Contains two transparent overlay buttons for opening and closing the element, a round user profile image, and an ionic icon. Contains the reusable element. Contains the reusable element. Contains the reusable element. **Portal page? yes / no state** \- When you add a to your app via Canvas Pages, there will be a workflow on that page for `When page is loaded`_,_ `set header's portal page? to "yes".` This will hide the favicon (`Group Logo Mobile`) and show the portal menu group (`Group portal menu`) in the header on mobile. **Search page? yes / no state** - When you add a to your app via Canvas Pages, there will be a workflow on that page for `When page is loaded, set header's search page?` _to_ `yes`_._ This will hide the favicon (`Group Logo Mobile`), show the portal menu group (`Group portal menu`), and change the hamburger menu icon to a search icon in the header on mobile. The (which includes the popup) is included in the header, and can be triggered from the "show loader popup", "show message popup", "show login popup" and "show signup popup" custom workflows. [portal page](https://canvas.airdev.co/resource/portal-dashboard-page-1541199301879x207238372182473540) [portal search page](https://canvas.airdev.co/resource/search-page-1541199371286x774569242727011500) [popupreusables reusable element](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/popupsreusable-1) [Signup/Login reusable](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/signup-login) [change your logo](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#logo) [search](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#search-menu) [shopping cart](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#shopping-cart-menu) [notifications](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#notifications-menu) [Header Elements](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#header-elements) [GroupFocus Mini](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#groupfocus-mini) [menufocusgroup\_notifications](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#notifications-menu) [menufocusgroup\_shoppingcart](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#shopping-cart-menu) [menufocusgroup\_search](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/menus-and-navigation#search-menu) Mobile & Desktop versions of the header for a logged out user Mobile and Desktop versions of the header as seen by a logged in Admin user Offline Notify banner indicating an offline status The portal menu will replace the favicon on mobile when you set the header state for Portal page? to "yes" ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-L_ncoBPrH7sZtzJgpTT%252F-L_njnyiNG71NXj8REzp%252FScreen%2520Shot%25202019-03-12%2520at%25202.11.17%2520PM.png%3Falt%3Dmedia%26token%3D04260cf8-b04f-4e09-9c43-9fb80dc91e54&width=768&dpr=4&quality=100&sign=2421b401&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-L_ncoBPrH7sZtzJgpTT%252F-L_nnOsQYA8T2YqVgIyr%252FScreen%2520Shot%25202019-03-12%2520at%25202.27.01%2520PM.png%3Falt%3Dmedia%26token%3Dd5c92511-b471-4989-a64b-eac3a7d8e4b7&width=768&dpr=4&quality=100&sign=33cd136a&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MKayUg85dm5s3VY9yrk%252F-MKqEE2Vkb3tzvXavBrK%252Fimage.png%3Falt%3Dmedia%26token%3D2dae43c2-0ef0-45d7-8eb0-97a472d0a7d8&width=768&dpr=4&quality=100&sign=2f688780&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MKqK6Q_HGjb0lL1ZKwD%252F-MKqRpn5qp7-aAsnwh9D%252Fimage.png%3Falt%3Dmedia%26token%3D1ac63d39-e2da-493f-865d-a4fd6fa156f2&width=768&dpr=4&quality=100&sign=e88d3d05&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MKayUg85dm5s3VY9yrk%252F-MKqGpxeg4vZHNd1rkRc%252Fimage.png%3Falt%3Dmedia%26token%3D65d921fc-31fa-45ab-9e85-0e269aac2397&width=768&dpr=4&quality=100&sign=7e9a0c46&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M3wiZMkjt7yM07Uf79t%252F-M3wn1hhmk4hVQik1ve5%252Fcustom-header-wfs.PNG%3Falt%3Dmedia%26token%3Da559c6a2-6e18-49a5-985e-7f193d90e78b&width=768&dpr=4&quality=100&sign=eea08ac5&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MT2R3VMDzsFswQ5A_RT%252F-MT2WgDPGU4uZ5YFGiIQ%252Fheader-dark.png%3Falt%3Dmedia%26token%3Db8d3df58-b25a-43fc-bcc9-95ba5d452aac&width=768&dpr=4&quality=100&sign=5f51ced0&sv=2) --- # Admin Portal | Canvas Documentation [PreviousWorkflow Widgets](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/widgets/workflow-widgets) [NextAdmin analytics](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownerdashboard) Last updated 4 years ago Was this helpful? The is a complex page where the app admin of the platform can view, manage, and download raw site data. To reduce the amount of workflows in the Admin Portal page, we've moved a lot of the app-wide settings workflows and UIs to separate reusable elements. In each reusable element, we've included placeholder groups so you can easily add additional content to the groups by resizing the placeholder groups. [Admin analytics](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownerdashboard) [Admin email templates](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/owners-portal-reusables/adminemail) [Admin legal popups](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownerlegalpages) [Admin header & footer](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownerseosettings) [Admin marketing pages](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownerhomepagesetup) [Admin branding, launch, and settings](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownergeneralsettings) [Admin portal canvas logic](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/owners-portal-reusables/ownersocialmediasettings) [Admin Portal](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/default-pages#admin-portal-overview) --- # Header | Canvas Documentation [PreviousReusable elements](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements) [NextFooter](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/footer) Last updated 11 months ago **Element name:** header **Overview:** The Canvas HTML Header allows Canvas developers to create any number of headers for an app. The header reusable element contains a single HTML element that uses custom HTML, CSS, and flexbox to dynamically display different navigation elements, including texts, icons, buttons, the Current User profile image and group focus, and mobile menu. This header element is fully responsive, and it is used on every page of the Canvas template. Each Canvas application comes preconfigured with three headers as shown below. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header#admin-user) Admin user #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header#standard-logged-in-user) Standard logged in user #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header#logged-out-user) Logged out user ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header#creating-editing-a-header) Creating/editing a header Canvas developers can create any number of Headers within the admin portal, and each Header can have any combination of dynamic navigation elements (icons, texts, buttons, and the Current User profile picture): You can create a new header or you can choose to clone an existing header if you have one that is similar to what you would like to create. 1. Click New to create a new header from scratch 2. Click Edit to edit the name of the currently selected header 3. Click Clone to duplicate an existing headers settings into a new header 4. Click Delete to remove the currently selected header ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header#telling-canvas-which-header-to-display) Telling Canvas which header to display Canvas will display any Header based on the “var - current header” hidden variable within the header reusable. As you create new Headers, you will need to add more conditionals to this hidden variable to specify when to show each Header. For example, you could show a specific Header based on the Current User’s role or show a particular Header based on a certain page’s name. Remember, when setting conditionals Bubble will give priority to the last condition that is true. So if you have three conditions and both condition #1 and condition #3 evaluate as true, Bubble will prioritize condition #3 over condition #1. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header#header-sections) Header sections #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header#text) Text Text Navigation items will appear to the left of the icons in your header. On a mobile screen, these elements will be moved from the header into the mobile dropdown menu. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header#icons) Icons The icon element is a special element as we have included four reusable Bubble elements with GroupFocus drop downs that you can set up to be triggered from the icon. Note that both the indicated icon and the Bubble Action Trigger must be set exactly as indicated below for this functionality to work. You can add up to 4 icons per header but for best mobile experience we recommend using a max of 3 icons for a header that has the `logged in state` toggled on * * Icon = `bell` * Bubble Action Trigger = `bell-groupfocus` * * Icon = `messages-circle` * Bubble Action Trigger = `messages-groupfocus` * * Icon = `search` * Bubble Action Trigger = `search-groupfocus` * * Icon = `cart` * Bubble Action Trigger = `cart-groupfocus` Each of the above widgets contains a small text element that displays a number alert for that widget (think unread notifications or count of items in cart). This number is static by default but can be made dynamic by modifying the `var - unread` or `var - count` elements within the corresponding widget reusable. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header#buttons) Buttons You can include up to two buttons on each header. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header#logged-in-state) Logged-in state Set toggle on if this header is visible to logged-in Users. This header will display the Current User's profile picture with a dropdown menu that allows them to view their account settings or log out. #### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header#mobile-menu-and-responsiveness) Mobile menu and responsiveness Each Header's responsive settings are set automatically. On desktop, the Header will display text links, icons, buttons, and the Current User profile picture. On mobile, the Header will hide any text and button elements, and display the hamburger menu icon. Clicking on the hamburger menu icon will open a mobile menu that contains the Header's text and button navigation elements. The breakpoint to display the mobile menu is determined dynamically for each Header on page load. If a Header does not contain any text or button navigation elements, the hamburger menu will not become visible on mobile. ### [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header#updating-the-logged-in-focus-group-menu) Updating the logged in focus group menu You can manually update the elements in the user account dropdown directly from the header reusable element in the Bubble editor. From the elements tree open **GroupFocus Mini > Group Logged In** There is a button for the user to log out, visit their account page, and navigate to the admin portal. We have also included three placeholder buttons for you to customize and add actions if you would like to create additional functionality. **Placeholder button** refers to a fully designed button element that has been hidden by default but can be unhidden and used as needed in your application. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header#header-states) Header states ------------------------------------------------------------------------------------------------------------------------------ The header reusable uses four states (states are often used in reusable elements to pass data between the reusable element and the page): * **Dark? yes / no state** \- If Dark=yes, then the default logo, favicon, button, and link color in the header will be white. If `Dark` = `no`, then the default logo, favicon, button, and link color in the header will be the app's default color. Please see an example of this below on the index page: * If you would like to change the background color when the header's "dark" state is "yes" so that it is not transparent, please modify this conditional on the `Group Header` element: * **Show portal menu? yes / no state** - On mobile (when on a portal type page), you can click on the portal menu in the upper left corner to open the sidebar menu. This is achieved by setting the state of `Show portal menu` to `yes`. [](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/header#key-workflows) Key Workflows ------------------------------------------------------------------------------------------------------------------------------ The header will come will various custom workflows that you can trigger from the page. You can do so by going to the workflow tab in the Bubble Editor and selecting Custom workflow > Trigger a custom workflow from a reusable element > Select header from the dropdown and the custom workflow name Each header can contain custom text links, icons, or buttons and have multiple actions that can be set for each item. Learn about how to use each action . **Widget Notifications** This action will show a notifications group focus when clicked. Learn how to customize this element . **Widget Messages** This action will show a messages group focus when clicked. Learn how to customize this element . **Widget Search** This action will show a search input within a group focus when clicked. Learn how to customize this element . **Widget Shopping Cart** This action will show the shopping cart group focus when clicked. Learn how to customize this element . **Portal page? yes / no state** \- When you add a to your app via Canvas Pages, there will be a workflow on that page for `When page is loaded`_,_ `set header's portal page? to "yes".` This will hide the favicon (`Group Logo Mobile`) and show the portal menu group (`Group portal menu`) in the header on mobile. **Search page? yes / no state** - When you add a to your app via Canvas Pages, there will be a workflow on that page for `When page is loaded, set header's search page?` _to_ `yes`_._ This will hide the favicon (`Group Logo Mobile`), show the portal menu group (`Group portal menu`), and change the hamburger menu icon to a search icon in the header on mobile. [portal page](https://canvas.airdev.co/resource/portal-dashboard-page-1541199301879x207238372182473540) [portal search page](https://canvas.airdev.co/resource/search-page-1541199371286x774569242727011500) [here](https://docs.airdev.co/canvas/5.3/canvas-functionality/menus-and-navigation#setting-up-menu-item-actions) [here](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#notifications) [here](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#messages) [here](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#search) [here](https://docs.airdev.co/canvas/5.3/canvas-functionality/reference/reusable-elements/widgets/ui-widgets#shopping-cart) The portal menu will replace the favicon on mobile when you set the header state for Portal page? to "yes" ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F6E9teEVAEsObNncFgah7%2FCleanShot%25202021-07-19%2520at%252012.37.09.png&width=768&dpr=4&quality=100&sign=c225a21f&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Flh5.googleusercontent.com%2F8a6sZtylhfw1GqSM9LBw22eUSMtFpoELVDFIB3DndIwnH08Jv2t5ty1aFbCVgLcRp04cxpSUDUocJbIqgM80w412xT7b1sRIEUMSVeMHn_dbjQiX2FVMYXd4Ac2zLFBFamr0hQuZ&width=768&dpr=4&quality=100&sign=a7009eb5&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FYuGY2uG07hS2aDcv03JQ%2Fimage.png&width=768&dpr=4&quality=100&sign=c16c0399&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FGIngDKpSu2NygVUyHySm%2Fimage.png&width=768&dpr=4&quality=100&sign=756b2d12&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2Fr4bf8skL8rbxqOxscC2V%2FScreen%2520Shot%25202019-03-12%2520at%25202.11.17%2520PM.png&width=768&dpr=4&quality=100&sign=e55db3de&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2F2luNurdFs8TRGIWZDLG8%2Fheader-dark.png&width=768&dpr=4&quality=100&sign=38daa221&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2Fw2VZJOfUVV38YjB7u2qn%2Fimage.png&width=768&dpr=4&quality=100&sign=bdadfd97&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2Fcontent.gitbook.com%2Fcontent%2FSSunCeiuKbDNt2RTgRa6%2Fblobs%2FlEkVbH8qaOT6N9lY1OUK%2FScreen%2520Shot%25202019-03-12%2520at%25202.27.01%2520PM.png&width=768&dpr=4&quality=100&sign=1cfb25a&sv=2) --- # Footer | Canvas Documentation [PreviousHeader](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/header) [NextSignup & Login](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/signup-login) Last updated 4 years ago Was this helpful? **Element name:** footer **Purpose:** Provide the user with links to important pages and information at the bottom of the page. In contrast to the header menu, the footer is customized entirely in the Admin portal of your application. Navigate to Headers/Footers from the left side menu to get started. The footer element is included by default on all marketing pages. For Bubble pages you will need to add it manually to any page you want to include it on. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/footer#pages) Pages You can set up links to any page you like in the pages tab. These can be the same pages you set up in the header or completely different. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/footer#legal) Legal The Canvas template comes standard with Terms and Privacy pages. Edit all the settings for these pages here. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/footer#social-media) Social Media Get the most out of your social media by adding all your social media pages to the footer of your application! Elements as they are displayed in the footer Actions available for the page links in the footer ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNox06qHRv-_z6vIwFq%252F-MNp3YN-iIqUBa7h9AMs%252FScreen%2520Shot%25202020-12-05%2520at%25205.42.19%2520PM.png%3Falt%3Dmedia%26token%3Dcda0f50e-1c59-4461-ab6a-544a9fbaab7f&width=768&dpr=4&quality=100&sign=7ca1f59c&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNpOZHn1YYhuANBSqZv%252F-MNpWisdCOR1wqM2wZDV%252Fimage.png%3Falt%3Dmedia%26token%3D06200fc4-74be-4f9c-a102-b104aa604bf7&width=768&dpr=4&quality=100&sign=28a475d1&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNpOZHn1YYhuANBSqZv%252F-MNpYGHHt_bk8aPHUZqI%252Fimage.png%3Falt%3Dmedia%26token%3D653217ae-a21b-43aa-a5da-88f1951fd63f&width=768&dpr=4&quality=100&sign=f28ca66d&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MNpOZHn1YYhuANBSqZv%252F-MNpXewtnunTjAj72WcX%252Fimage.png%3Falt%3Dmedia%26token%3Df57cd442-9b3b-459b-b1ff-c1e588fb5c90&width=768&dpr=4&quality=100&sign=89a3e774&sv=2) --- # Popups Reusable (derprecated) | Canvas Documentation [PreviousIntegrate some to parent](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/signup-login/emails) [NextCookies Permission](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/cookiespermission) Last updated 4 years ago Was this helpful? **Element name:** popups\_reusable **Purpose:** Provide commonly used functionality in an element that can be easily dropped in on any page. There are a few standard popups that we put into a reusable element so you can trigger them as needed rather than creating many copies. The reusable element `popupresuable` contains the sign up / login popup, loader popup, and message popup. You can trigger custom workflows from the header (which contains the `popupsreusable` element) to show certain popups. Or if the page that you're building does not have a header, please add the `popupsreusable` element to the page so you can trigger custom workflows from that element. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/popupsreusable-1#signup-login-popup) Signup / login popup There is a `signup/login` reusable element which is used across the app (login page, homepageblocks, popupsreusable). This popup can be used to display a popup on the page. Note that you can trigger a workflow to show this element from the `header` reusable element. From a page, you can trigger either of the following actions via the header's custom workflows: `show login popup` or `show signup popup` . When using this popup, users will be able to login and signup from any page that contains the header without having to be redirected to the login or index page. There are a couple of caveats to this, though: 1. If users sign up and need to verify their email, they'll be redirected to the "verify" page. However, if a user logs in to a page and that page needs verification (but the user hasn't verified his email yet) then the user will not be able to access that page. For more information about the `signup/login` reusable, . The below popups require some setup to be used in this reusable. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/popupsreusable-1#message-popup) Message popup With the message popup, you can display a simple message (e.g., “Your account is pending, and will become active once approved”) and make the user click “OK”. * The message popup (no esc) contains a popup title text, body message, and a button. * You can pass a string of text for the content of the popup by triggering a custom workflow from a reusable element (header or popupsreusable): * The custom workflow "show message popup (no esc)" is of type text * Simply pass a text string in this format: * This is a title{This is the body message}This is the close button text * Any text before { is the title of the popup * Any text between { } is the body text of the popup * Any text after } is the button text of the popup ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/popupsreusable-1#loader-popup) Loader popup With the loader popup, you can display a loading icon over the whole page for some time (to avoid a bad/choppy experience) This should be used sparingly in cases of very complicated and slow pages. * The loader popup contains the standard full page HTML loader popup * On the page that you are displaying the loader popup, add the following workflow: * _Do when condition is true and only when page loaded (entire) is "yes"_, trigger custom workflow "close loader popup" from reusable element You can trigger the loader popup by triggering a custom workflow called "show loader popup" from a reusable element ( or popupsreusable) [header](https://docs.airdev.co/canvas/assets/reuseables/header) [click here](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/signup-login) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-L_o-KzLmcDA6wNXm22S%252F-L_o1oYx5k2H5fckfEr3%252FScreen%2520Shot%25202019-03-12%2520at%25203.34.40%2520PM.png%3Falt%3Dmedia%26token%3D01060042-3b26-4a2a-bbe0-b85af17c4dca&width=768&dpr=4&quality=100&sign=110190a&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-L_o2S36QFA4y05IN5ND%252F-L_o2dUZ2VrTavuVMCAz%252FScreen%2520Shot%25202019-03-12%2520at%25203.38.14%2520PM.png%3Falt%3Dmedia%26token%3D4aef52d3-504b-4e42-9003-8ca2cf16e26c&width=768&dpr=4&quality=100&sign=2c465e0b&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-L_o1yMIk8NIb9w_TMx2%252F-L_o2Ez-v1AR0tpGuGa7%252FScreen%2520Shot%25202019-03-12%2520at%25203.36.22%2520PM.png%3Falt%3Dmedia%26token%3D422006a8-63fb-4ce7-aea2-575eda36ea1c&width=768&dpr=4&quality=100&sign=27ade71b&sv=2) --- # Signup & Login | Canvas Documentation [PreviousFooter](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/footer) [NextIntegrate some to parent](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/signup-login/emails) Last updated 4 years ago Was this helpful? **Element name:** signup/login **Purpose:** Provide the user with signup, login, and password reset functionality Our standard signup/login reusable element can be put on a login page, and is included in a popup in the . We add the popupreusables reusable element to the so we can trigger widely used popups from any page in the app. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/signup-login#custom-workflows) Custom workflows ---------------------------------------------------------------------------------------------------------------------------------------------- * **complete sign up** \- This will mark the current user's `Date completed sign up` field as completed and end the sign up flow. * **move current step** - This will move the sign up step to the next step. * **select user type** - This will update the user type selection * **update signup method (of type text)** \- By default, the signup method will be "Email". If a user is signing up with a social media account, please update the custom workflow "update signup method" in the sign up workflow to the name of the social media login method (e.g. Linkedin, Facebook, Twitter, and etc.). This will ensure that a logged in user cannot see the login credentials tab on the account page (it will only be visible if a user's login method is "Email"). * **update profile (email verification)** - This workflow will only fire if the App owner requires users to verify their emails during sign up. This will schedule an API workflow to send an email verification link to the user. * **update profile (no email verification)** - This workflow will only fire if the App owner does not require users to verify their emails during sign up. This will mark the current user's `Date completed sign up` field as completed and end the sign up flow. * **set login** - Show the login view * **set reset\_pwd** \- Show the reset PW view * **set signup** - Show the signup view * **restrict to login** \- Restrict the reusable to show only the log in view * **restrict to signup** \- Restrict the reusable to show only the sign up view * **close popup** \- close the popup that this signup/login reusable is placed on. This is already set up in the template on the popupsreusable element. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/signup-login#popup-usage) Popup usage ------------------------------------------------------------------------------------------------------------------------------------ When using the signup/login popup, instead of signing in on the signup/login page, users will remain on the page that they've signed up on until they fill out the form in step 2 of the signup process. By default, step 2 is where a new User inputs their First and Last name. After this, if email verification is enabled, users will be redirected to the login page until they've verified their email. Otherwise, this popup will close. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/signup-login#api-workflows) API workflows ---------------------------------------------------------------------------------------------------------------------------------------- [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/signup-login#more-signup-login-info) More signup/login info ---------------------------------------------------------------------------------------------------------------------------------------------------------- There are ten custom workflows in the signup/login reusable element (some are duplicated in the so they can be triggered from the as well): See the "" section for more info on how to configure this reusable element. [popupsreusable](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/popupsreusable-1) [header](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/header) [popupreusables reusable element](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/popupsreusable-1) [header](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/header) [Email Verification](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/signup-login/emails#sign-up-flow-set-up-email-verification) Bubble editor view ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Ls3QQor-a39iHNXy0B4%252F-Ls3iXXHKXyZhuvagipG%252FScreen%2520Shot%25202019-10-25%2520at%25202.02.06%2520PM.png%3Falt%3Dmedia%26token%3Dfa9cb95d-ea5c-475d-ae7d-32e30dbee58e&width=768&dpr=4&quality=100&sign=401a0494&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Ls3QQor-a39iHNXy0B4%252F-Ls3ZxrFje-fbVBHg3nS%252FScreen%2520Shot%25202019-10-25%2520at%25201.20.22%2520PM.png%3Falt%3Dmedia%26token%3Ddd8e9bb5-7b18-4d11-a8cc-abdf4aaed0e8&width=768&dpr=4&quality=100&sign=c8dabba4&sv=2) --- # Backend Workflows | Canvas Documentation [PreviousOption Sets](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/option-sets) [NextDesign standards](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/design-standards) Last updated 4 years ago Was this helpful? Your app must be on a paid Bubble plan to use Backend Workflows Using backend workflows can be ideal and/or necessary in the following situations: 1. When you have long and complex workflows with a lot of actions 2. When you need to reuse the same workflow from different parts (pages/reusables) of the application 3. When you need to run a workflow on a list of things, (i.e., loop through a list) 4. When you need to schedule a workflow in the future (with the ability to cancel the workflow) 5. If you want your workflow to run asynchronously. Backend workflows run on Bubble's server, and any workflow on a standard Bubble page which schedules a Backend workflow won't need to wait for the entire (Backend) workflow to finish before moving on to the next step in the front-end workflow. 6. If you want to create a webhook - or endpoint - to allow other applications to send and receive data from your Bubble app. For more information on Backend workflows, read AirDev's and . Pro tip: If you'd like to run backend workflows synchronously (in order in the WF) and receive a response to the workflow action, set up an API connector action that points at the backend Workflow's API. Note that any API token used in the API Connector action should not be passed in the URL, but in the headers, and it should be marked as "Hidden" so that it cannot be stolen by app users. Our template comes with 8 Backend workflows: * **check\_app\_location:** Determines if this application's identifiers are correct. This is necessary for the Canvas Page Builder to function properly. * **check\_request:** Page builder uses this to authenticate both the private and public tokens with a Canvas app. Returns information used by the page builder, like page files' names and URLs. * **record\_registration:** Used one time when the Canvas app is registered with the Page Builder. It generates a private token which will be used for authentication between the two apps. Additionally, it re-generates the public token, since the public token used for this call was sent in the URL of the Canvas admin user's browser during the registration process. * **send\_email**_**\_**_**template:** This workflow is a template action that can be copied and edited for new email template backend actions. * **update\_page:** The Canvas Page Builder uses this as part of the page publishing flow. It updates a page's HTML and other fields. * **update\_usersnap** \- When you start a project with AirDev, we'll use this workflow to enable usersnap testing on your app so you can submit feedback in our client management portal. * **upload\_files:** Canvas Page Builder uses this to upload a list of files and images to a page. * **upload\_image:** Canvas Page Builder uses this to a single image to a page. [Bubble Development Guide](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/bubble-basics) [Bubble's Manual](https://manual.bubble.is/using-the-bubble-api/how-to-use-the-api.html) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M_unM5mslzBQXaFMAb6%252F-M_uomQb73d_snuPyj0z%252Fimage.png%3Falt%3Dmedia%26token%3D18b63d08-2e6e-425a-9720-d60cfc4a87c1&width=768&dpr=4&quality=100&sign=91968d03&sv=2) --- # Design standards | Canvas Documentation [PreviousBackend Workflows](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/api-workflows) [NextManually Building UI](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/design-standards/manually-building-ui) Last updated 4 years ago Was this helpful? [Manually Building UI](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/design-standards/manually-building-ui) --- # Principles | Canvas Documentation [PreviousLearning Bubble Basics](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/bubble-basics) [NextDatabase](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/database) Last updated 4 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/principles#measure-twice-cut-once) Measure twice, cut once --------------------------------------------------------------------------------------------------------------------- It's much easier to use Bubble than it is to code, which makes it tempting to jump right in when trying to build something or change something that you've already built. That's usually a bad idea because you're much more likely to end up with a "Spaghetti Bubble App" (see ), which is difficult or impossible to maintain and iterate on. What you should do instead is carefully plan and structure both your initial functionality and ongoing improvements. #### [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/principles#well-planned-vs-haphazard-development) Well-planned vs haphazard development Imagine this scenario (which we've seen multiple times): A startup is using Bubble for their SaaS product. The Bubble development team builds an initial version in a few weeks, which makes the sales team very happy. They go out to try to sell the product and start receiving feedback right away. Their first potential customer says, "If only your product had X feature, we would buy." "No problem," replies sales. They go to the development team and in just a few days, feature X is live. The potential customer is amazed and the first sale is made. This continues over and over again until sales gets used to the gratification of being able to quickly deliver any feature that customers ask for. This model of development is not sustainable without factoring in the costs of maintenance that come with ever-increasing app complexity. Creating an app with all of those requested features would require substantial revision after every couple deliveries, or a smaller amount of up-front planning if the client knows which features they want to include in the application. Over time, when an app is built by adding on many quickly delivered features, the Bubble logic gets very convoluted, poorly structured, and layered on top of each other. Eventually it becomes very difficult to maintain and build these applications which are filled with band-aids instead of thoughtful planning, which undermines one of the main advantages of using a no-code platform in the first place. The bottom line is that you should stay very disciplined and not let Bubble lull you into a false sense of "this is easy." A well-built development process includes carefully planning every feature and making sure that you're building for maintainability and scalability. [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/principles#find-the-simplest-way) Find the simplest way ------------------------------------------------------------------------------------------------------------------ Blaise Pascal famously said, "I would have written a shorter letter, but I did not have the time." The same can be applied to software generally and Bubble applications specifically. It often takes much more effort and mental energy to come up with a simple way to do something than it takes to come up with a hard way to do it. If you think about some of the most successful tech products as of late, these principles hold true. Uber, Slack, Stripe, and more all launched with a minimal set of critical functionality. All were easy to use and not bloated with unnecessary bells and whistles. You may not be looking to build the next unicorn but the the lessons are universal: * Eliminate any functionality that's not absolutely needed right away * Make the UI as clean and simple as possible * Decrease redundancy in your pages, workflows, and database structure Making things simple may indeed end up taking more time than making them more complex. But the result will be a product that's easier to both use and maintain. [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/principles#think-in-modules) Think in modules -------------------------------------------------------------------------------------------------------- Modular structures are everywhere. Buildings are modular from the elevator (big module) to the brick (small module). Legos are very obviously modular. And our Bubble apps should be modular. Why? A few reasons: * Modules have clearly defined inputs and outputs and can be plugged in anywhere without requiring duplicate work * Modules are self-contained/independent and can thus be safely updated without affecting the rest of the application * Modules allow multiple people to work together on a single project and then combine their efforts * Modules structures are easier to understand There are many ways to create modules in Bubble - through reuseables, custom workflows, API workflows, data triggers, and more. We'll talk more about these later. [Spaghetti Code](https://en.wikipedia.org/wiki/Spaghetti_code) --- # Learning Bubble Basics | Canvas Documentation Learning how to use Bubble takes work. While not as complicated as learning how to build web apps with code, there are still a lot of different things that go into Bubble. You'll need to learn things like: * What a database is and how Bubble's database works * How web pages are created in Bubble * How to make pages that work on laptops, tablets and mobile phones (this is called responsiveness) * Rules for setting up logic in Bubble (e.g. what to do when a user clicks on a button) [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/bubble-basics#how-to-use-this-guide) How to use this guide --------------------------------------------------------------------------------------------------------------------- This Best Practices guide is a tool that is intended to be accessible to Bubble beginners (who have spent a few hours using the Bubble editor), intermediate users, and Bubble experts. Depending on your level, it should be useful for the following: * Beginners: learn best practices and build good habits early on * Intermediate: use this as a reference on how to approach many technical choices in Bubble * Experts: learn how AirDev builds and compare our design choices to your own experience For more experienced users of Bubble, this guide will be a window into the way AirDev chooses to build their apps. The motivation for most design choices AirDev makes in client apps, AirDev products, and templates is also explained here. [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/bubble-basics#what-to-learn) What to learn ----------------------------------------------------------------------------------------------------- If you're not sure where to start learning, you can follow this path of resources. These tasks are intended to be completed by beginners. **Topic** Goal Content **What is Bubble?** What is Bubble and when/why to use it **Why Bubble?** Is Bubble the right tool for you? (This is for entreprenuers) **Basics** Overview of how Bubble works **Bubble editor** Get familiar with the Bubble editor **Design basics** Create and edit elements 3. Read these two sections of the Bubble manual (10 minutes): **Workflow basics** Visual workflows, data workflows, plugins' workflows **Database basics** Quick intro to the Bubble Database and Workflows **Using plugins** How to install and set up a new plugin **Bubble dev tools** How to use some tools in the Bubble editor and run mode 1. 1. Topics covered: Element dropdown, Element tree, App search tool, Run mode inspector, Run mode debugger, Edit mode element inspector **Basics recap** Practice the skills from the above areas [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/bubble-basics#learning-resources) Learning resources --------------------------------------------------------------------------------------------------------------- This section contains links to general Bubble resources. These are useful for your learning at different stages - some of them are for beginners, while others are useful for Bubble users of all skill levels. ### [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/bubble-basics#core-resources) Core resources ### [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/bubble-basics#additional-resources) Additional resources Additionally, you can use the Bubble Reference as a first resource when you run into some feature that you're not familiar with in the Bubble editor. Users with experience in web development outside of Bubble will be likely to learn quickly by using the reference and practicing in the editor. [PreviousManually Building UI](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/design-standards/manually-building-ui) [NextPrinciples](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/principles) Last updated 4 years ago Was this helpful? from the Bubble manual (5 minutes) Check out to see what is possible with Bubble (5-30 minutes) Watch (20 minutes) (10 minutes) Read on Bubble Basics. (5 minutes) Complete the (5-15 minutes) Play with Bubble's home page (5-15 minutes) (Optional): Complete (10 minutes) Complete the (5 minutes) (5-10 minutes) (10 minutes) (5-10 minutes) (5 minutes) (5-10 minutes) (5-10 minutes) (also very design-focused, no workflows/db objects) (5-10 minutes) (5 minutes) . (25 minutes - if the pace is too slow, run on 2x speed or skip around.) Redo all of the on "Hard Mode", which appears after completing a lesson on normal mode (1-2 hours) : These lessons are Bubble's training program, a set of 12 short lessons walking users through the basics of building apps on Bubble. **If you're a complete beginner, start here** - in the next page we direct you through the lessons in a more organized fashion. Complete these lessons and try to understand each action you take before moving on to the next action. Estimated time to complete: 2-3 hours (or longer if you read through related resources while completing these lessons). : This official Bubble manual can be used for an in-depth understanding of how Bubble works. You should spend a few hours going through this resource. We recommend you use it as a guide to different parts of the Bubble editor as you learn, instead of trying to read it straight through. : A Bubble education startup, Coaching No Code Apps has developed a YouTube series available free of charge. They have published about 100 videos, each covering one topic in Bubble development. Follow along by building while Gaby explains the what, how, and why of what you build. There is a from this channel that will guide you through some basics of how to build on Bubble. If you just want to watch one video that is a more complete walkthrough, check out . : If you run into a brick wall while building on Bubble, someone else has probably run into the same issue before. This is a great place to check for previous users' questions and to ask your own questions, too. : The official reference from Bubble is a useful tool to look up detailed information about how certain features are supposed to work. This document is helpful to read if you want an in-depth understanding of how each part of Bubble functions. [**Bubble Lessons**](https://bubble.io/lessons) [**Bubble Manual**](https://manual.bubble.io/) [**Coaching No Code Apps**](https://www.youtube.com/watch?v=6OKVj1A9OcY&list=PL8fkQddJmh-gVOECXWNY-5JHO3Nh3fv2D&index=4) [series of videos](https://www.youtube.com/watch?v=F7jQmMHgOHU&list=PL8fkQddJmh-gVOECXWNY-5JHO3Nh3fv2D) [this 2 hour tutorial](https://www.youtube.com/watch?v=6OKVj1A9OcY&list=PL8fkQddJmh-gVOECXWNY-5JHO3Nh3fv2D&index=4) [**Bubble Forum**](http://forum.bubble.io/) [**Bubble Reference**](https://bubble.io/reference) [Read Bubble's own intro](https://manual.bubble.io/the-bubble-fundamentals/what-is-bubble-for.html) [Bubble's Showcase](https://bubble.io/showcase) [Coaching No Code's video on Bubble pros/cons](https://www.youtube.com/watch?v=4W-LENVu8uc&list=PL8fkQddJmh-gVOECXWNY-5JHO3Nh3fv2D&index=5) [Coaching No Code Intro to Bubble](https://www.youtube.com/watch?v=F7jQmMHgOHU&list=PL8fkQddJmh-gVOECXWNY-5JHO3Nh3fv2D&index=1) [this manual page](https://manual.bubble.io/the-bubble-fundamentals/building-principles.html) [first interactive Bubble lesson](https://bubble.io/page?type=page&name=index&id=learn&tab=tabs-1&lesson_ref=1) [in the Bubble editor](https://bubble.io/page?id=meta_public&tab=tabs-1) [Read the manual pages about the Editor](https://manual.bubble.io/application-editor.html) [the Image Uploader lesson](https://bubble.io/page?type=page&name=index&id=learn&tab=tabs-1&lesson_ref=9) [Image Slideshow lesson](https://bubble.io/page?type=page&name=index&id=learn&tab=tabs-1&lesson_ref=2) [General design info](https://manual.bubble.io/building-a-user-interface/general-principles.html) [Handling conditionality](https://manual.bubble.io/building-a-user-interface/handling-conditionality.html) [City Upvoting Lesson](https://bubble.io/page?type=page&name=index&id=learn&tab=tabs-1&lesson_ref=3) [User Signup/Login/Logout Lesson](https://bubble.io/page?name=index&id=learn&lesson_ref=5&tab=tabs-1) [Using conditions on design elements and workflows](https://bubble.io/page?name=index&id=learn&lesson_ref=6&tab=tabs-1) [Bubble lesson on making a shopping list](https://bubble.io/page?name=index&id=learn&lesson_ref=8&tab=tabs-1) [Bubble lesson with Giphy plugin](https://bubble.io/page?name=index&type=page&id=learn&lesson_ref=10&tab=tabs-1) [Bubble lesson with iTunes plugin](https://bubble.io/page?name=index&id=learn&lesson_ref=4&tab=tabs-1) [Chart lesson](https://bubble.io/page?name=index&id=learn&lesson_ref=7&tab=tabs-1) [Facebook auth lesson](https://bubble.io/page?name=index&type=page&id=learn&lesson_ref=11&tab=tabs-1) [Watch this video on how to use some tools from the Bubble editor](https://vimeo.com/426247008) [Bubble lessons](https://bubble.io/lessons) --- # Manually Building UI | Canvas Documentation [PreviousDesign standards](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/design-standards) [NextLearning Bubble Basics](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/bubble-basics) Last updated 4 years ago Was this helpful? Using elements and spacing consistently across your application is important for your app's design to remain cohesive with the Canvas template. Canvas manages this for you but there are times you will find you need to build pieces of your UI manually. The guidelines below specify the standards used by Canvas to help you maintain a consistent brand and design across your application. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/design-standards/manually-building-ui#standard-page) Standard page If you need a generic Canvas page simply add the 'Standard page' to your app with Canvas extension by following the steps . This will create a new page in your app with a header, footer, and all the elements below as a starting point for building your new page. A standard page will have a width of 1220px, minimum width of 0, and no maximum width. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/design-standards/manually-building-ui#group-title) Group Title This group is placed just below the header and is a full width element that can be used as the title element for the entire page. By default it includes a title and a description text. **NOTE**: This element is set to be hidden when the page width is less than 500px. Keep in mind if you are building for mobile that the element will not be shown on most phones. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/design-standards/manually-building-ui#blocks-container-860-do-not-rename) Blocks container 860 (do not rename) This group is used as a main container for the page body content and can be found on every Canvas page. * On standard pages, the default width is set to 860px with responsive minimum width of 99% and a maximum width of 105%. * On portal pages, the default width is set to 860px with responsive minimum width of 80% and no maximum width. To maintain responsiveness across different screen sizes all groups on the page should be nested inside this group. Nesting a group within another group can be achieved by dragging the group to be nested into the containing group. The border of the containing group will turn **RED** when the nested group is successfully nested All Canvas blocks are designed to fit and operate responsively at this standard width of 860px. Changing the width of the Blocks container 860 (do not rename) group can cause issues with responsiveness and new blocks you may add to your project ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/design-standards/manually-building-ui#blocks) Blocks Most Canvas blocks will come with a main container group and are designed to be used as either main sections for a single page or as a full page itself when creating a portal page The block will contain two main groups: Header group and Standard Group ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/design-standards/manually-building-ui#header-group) Header group A **header group** is used to describe the page or section to which it belongs. Each header group contains a title, description, and a button by default. See Standard Group below to learn more about the widths, padding, and responsiveness of groups in general. * The title has a font size of 24pt, a height of 36px, minimum width of 20%, and no maximum width set * The description has a font size of 16pt, a height of 24px, minimum width of 20%, and no maximum width set. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/design-standards/manually-building-ui#standard-group) Standard group A **standard group** is used to contain the main content of the page or section. This can be text, images, repeating groups, or any combination of elements. When placed below a header group there should be 15px of spacing between bottom of the header group and the top of the standard group. A standard group contains the following three main elements: * **Outer Group**: This group operates as a container for the entire section and has a width of 860px, a minimum width of 20%, and no maximum width set. * **Inner Group**: This is the content container for this section and will have a width of 780px, a minimum width of 20%, and no maximum width set. To maintain proper responsiveness, all content elements should be placed within this inner group. * **Padding Groups**: There are two groups called Group verticalPadding 1 and Group verticalPadding 2 which are located at the top left and right of the outer group. These groups have a standard width of 40px, a minimum width of 50%, and no maximum width set and are used to maintain a dynamic padding distance between edges of the outer group and the inner group. Do not delete the padding groups as they are integral to maintain responsiveness ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/design-standards/manually-building-ui#popups) Popups Canvas comes with two different popup sizes. The small popup is 360px wide and the standard popup is 680px wide. Both have a minimum responsive width set to 20%. The padding between the edge of a popup and its inner content is 30px on all sides. **Small popups** generally have a title, some text, and a couple of buttons. Padding between main elements is 20px. The **Standard popup** has a title, inputs, and a couple of buttons. The padding between main elements is 20px with the exception of the inputs. Padding between inputs is 15px. An input's label text element is 18px in height, uses a 12pt font size, and has a 0px spacing between the label text and the input element below it. A Portal Page is a single Bubble page that has a left side navigation menu and creates the illusion of navigating between pages by hiding and showing groups on the page. To learn more, see the . [here](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/pages-and-modules#adding-a-new-page) [Hiding Groups section](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/branding-and-design#hiding-groups-incomplete) Nesting a group within a containing group Module containing a header group and a standard group Standard group on a page with a button and a width of 860px Small popup with description text and a width of 360px Standard popup with inputs and a width of 680px ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MHCJqdOY9MgGVCfOJ-b%252F-MHCT_G5K9yOrskO7Eqv%252FModule.png%3Falt%3Dmedia%26token%3D78779c6c-9948-4ea6-9d98-7c3f9fe666d0&width=768&dpr=4&quality=100&sign=df212211&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MH9wSM5py0s_ryJuJjG%252F-MHAEvqMYRxmYXejlZ6M%252FLarge%2520Popup.png%3Falt%3Dmedia%26token%3Dc5a522a0-4d55-4335-a998-ff5269076ee6&width=768&dpr=4&quality=100&sign=685be395&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MHC2SS4xTIHx5MRPG0Z%252F-MHC9ThpkzEB1SzFdMeE%252FStandard%2520Group.png%3Falt%3Dmedia%26token%3Db3d71b65-af10-48a8-93ab-44099f9f90d3&width=768&dpr=4&quality=100&sign=32d78c6b&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MHCJqdOY9MgGVCfOJ-b%252F-MHCXdlKjDZYqB6T-JFV%252FHeader%2520group.png%3Falt%3Dmedia%26token%3D424a0c80-50df-4755-b1a0-eabd922eaae6&width=768&dpr=4&quality=100&sign=291d7433&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MH9wSM5py0s_ryJuJjG%252F-MHAH58pF8afR2A3yZmP%252FSmall%2520Popup.png%3Falt%3Dmedia%26token%3D08f9fab9-9b34-4c31-8727-947c75b65685&width=768&dpr=4&quality=100&sign=b028474c&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MHC2SS4xTIHx5MRPG0Z%252F-MHCGF9LsY6NUaAKeJly%252FNesting%2520Groups.gif%3Falt%3Dmedia%26token%3D76c6b73a-50d3-4ccc-8404-8e84d264dd17&width=768&dpr=4&quality=100&sign=b1c89ca0&sv=2) --- # Menu Focus Elements | Canvas Documentation [PreviousAdmin option settings](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/owners-portal-reusables/admin-option-settings) [NextIntegrate some to parent](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/menu-focus-elements/set-up-menu) Last updated 4 years ago Was this helpful? [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/menu-focus-elements#dropdown-menu) Dropdown menu ----------------------------------------------------------------------------------------------------------------------------------------------- **Element name:** menufocusgroup\_template **Purpose:** Provide the user with a concise list of actions they can take in a convenient dropdown menu. The dropdown menu is used consistently throughout the Canvas template to provide the user with actions they can take such as Edit/delete a thing, View more details, Send a message, etc. The dropdown is triggered by clicking on the icon, can be dismissed by clicking anywhere outside the dropdown, and is most often used in repeating groups to provide action items for each thing in the list. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/menu-focus-elements#clone-the-reusable-template) **Clone the reusable template** Open the **menufocusgroup\_template** and from the top bar of the Bubble editor click Edit > Clone this Page. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/menu-focus-elements#assign-the-type-of-content) Assign the type of content With your cloned menufocusgroup\_template open, double-click in the gray area of the editor to open up the settings for the reusable. Change the 'Type of content' to the datatype you will be using this menu to edit. You will need to change the type of content for the GroupFocus Dummy as well. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/menu-focus-elements#set-up-the-dropdown-buttons) Set up the dropdown buttons In the elements tree click the '+' to open the GroupFocus Dummy. This group contains all the dropdown buttons in the menu. Group Option 2 and Group Option 3 are already set up as the Edit and Delete actions. There are three more Group Options (1, 4, & 5) that are unused and can be customized to add more buttons to your menu. Each of these groups has a corresponding event in the workflow tab that will be run when the group is clicked. The menufocusgroup reusable element also contains two popups that correlate to the Edit and Delete actions: * **Popup Edit** Clicking on Option 2 (Edit) in the dropdown will open a standard edit form popup to create or edit a thing. * **Popup Remove** Clicking on Option 3 (Delete) in the dropdown will open a popup to remove a thing. Customize/duplicate these popups to your purposes. ### [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/menu-focus-elements#using-the-custom-events) Using the custom events Each popups can be triggered by the corresponding custom events 'Create/edit thing' and 'Remove thing'. Setting up custom events within a reusable gives you the option of using that workflow from the page it is on with the 'Trigger a custom event from a reusable element' action. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/menu-focus-elements#user-menu-overview) User Menu Overview --------------------------------------------------------------------------------------------------------------------------------------------------------- Element name: **menufocusgroup\_use**r This focus group reusable element contains a menu of dropdown buttons for the user object. The menu popover is triggered by clicking on the icon and can be dismissed by clicking anywhere outside of the focus group. This reusable element is used in the Users tab in the Owner's Portal. 1. Clicking on Option 1 (Password reset) will schedule an API workflow to send a password reset email to the user. 2. Clicking on Option 3 (Deactivate) will open `Popup remove user`. Deactivating the user will only mark the user as inactive and would not delete the user from the app. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/menu-focus-elements#email-templates-menu) Email Templates Menu ------------------------------------------------------------------------------------------------------------------------------------------------------------- Element name: **admin\_email\_menu** This focus group reusable element contains a menu of dropdown buttons for the Email template object. The menu popover is triggered by clicking on the icon and can be dismissed by clicking anywhere outside of the focus group. This reusable element is used in the Emails tab in the Admin Portal. This reusable element contains two popups:‌ 2)`Popup Remove` - This dummy popup is included and can be used to delete a thing. For example, you can add the menufocusgroup\_template element to the on a page and trigger a custom event to create/edit or remove a thing. 1)Popup Edit Email Popup - Clicking on Option 2 (Edit) in the dropdown will open a standard add/edit form popup to create or edit an Email template. To learn more about email templates and how to use them, please click . 3) [`Hidden variables popup`](https://docs.airdev.co/canvas/v/2.0.0/using-the-template/setup/included-with-the-template/hidden-variables-popup) [hidden variables popup](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/data-and-workflows#hidden-variables) [here](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/signup-login/emails#email-templates) Dropdown menu for a Canvas marketing page ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MOmlsouI08973C1_vEH%252F-MOmxwNsQ9baRxeWKrAq%252Fimage.png%3Falt%3Dmedia%26token%3D365f7994-3cc7-4394-abaa-5897ee7b3404&width=768&dpr=4&quality=100&sign=4b77522a&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-MOmlsouI08973C1_vEH%252F-MOmq7Ul_zdKigf_hqoK%252Fimage.png%3Falt%3Dmedia%26token%3De9e21f95-b182-43e6-960f-2d01334415ba&width=768&dpr=4&quality=100&sign=9f58eb26&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Ly107jHGEGTbJhCeLVB%252F-Ly1Bd2PrUk6iOAKL5n2%252FScreen%2520Shot%25202020-01-07%2520at%25202.47.22%2520PM.png%3Falt%3Dmedia%26token%3Dc885ced5-7187-4cb6-a628-672bfbcb2cdb&width=768&dpr=4&quality=100&sign=9dbd557b&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Ly107jHGEGTbJhCeLVB%252F-Ly1EtKzcKbCmjPlUP3Y%252FScreen%2520Shot%25202020-01-07%2520at%25203.03.10%2520PM.png%3Falt%3Dmedia%26token%3Dded61d85-9c2c-4c45-803c-81f83ca7a510&width=768&dpr=4&quality=100&sign=3f1420ce&sv=2) --- # Option Sets | Canvas Documentation A few option sets come included with the Canvas template: 1. Page 2. Role 3. Inclusive "yes/no" [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/option-sets#admin-options) Admin Options --------------------------------------------------------------------------------------------------------------------- [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/option-sets#admin-option-categories) Admin Option Categories ----------------------------------------------------------------------------------------------------------------------------------------- [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/option-sets#navigation-type) Navigation type ------------------------------------------------------------------------------------------------------------------------- [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/option-sets#link-type) Link Type ------------------------------------------------------------------------------------------------------------- [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/option-sets#password-policy-requirement) Password Policy Requirement ------------------------------------------------------------------------------------------------------------------------------------------------- [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/option-sets#bubble-pages) Bubble Pages ------------------------------------------------------------------------------------------------------------------- * Display (text) - this is the page name * Roles (List of Roles) - the user roles that are allowed to access this page * Private? (yes/no) - "yes" means the page is private * If a user accesses a Page that is marked as Private, they will be redirected to the index page unless they are logged in to a User whose Role has been added to the Roles for this page The Canvas Base Template comes with a number of pages. The two private pages are the `account` page, which can be accessed by Standard and App Admin users (but not logged out users), and the `admin` portal page, which can be accessed by by App Admin users. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/option-sets#role) Role --------------------------------------------------------------------------------------------------- * Display (text) - this is the role name By default, your app comes with two roles: `App Admin` and `Standard`. To add a new role, create a new option in the option set for that role * New option in Role option set (e.g. Account Admin or Sales) * Add the new role to the Bubble Pages attribute Roles if they should have permission to access that page. * Assign the Roles to Users, usually through one of these methods: * Assign the new Role to users manually in the Bubble Editor's Data tab * Build the logic to let App Admins sign those Users up from the admin page * Build the logic to assign the new Role to the Users when they're signed up [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/option-sets#inclusive-yes-no) Inclusive "yes/no" ----------------------------------------------------------------------------------------------------------------------------- This is an option set that works similar to the Bubble "yes/no" data type, but adds a 3rd option that returns true for both yes and no. In short, it works as follows: * _no_ will return results where the field is "no" * _yes_ will return results where the field is "yes" * _yes OR no_ will return all results For a more detailed explanation, read on. When creating searches in Bubble, if you have a constraint on a yes/no field, it will always return either the "yes" options or the "no" options. The above image shows how a search either includes Inactive users or Active users, but not both. Here's the search logic used to produce this result: Here's how this will look when set up with the Inclusive / Exclusive option set. For a demonstration of how to use this in a real app, check out the Dropdown Users on the admin page of the Canvas Base Template. The performance of these searches seemed to be about the same in our tests. Please let us know if you notice anything different. [PreviousData types](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/data-structure) [NextBackend Workflows](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/api-workflows) Last updated 4 years ago Was this helpful? Normal Bubble yes/no Logic with normal Bubble yes/no (no inclusive yesno option) Option set yes/no/yesno Logic with normal Bubble yes/no (no inclusive yesno option) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M3xJujtten6m95J5MIR%252F-M3xQWpvt5ahCo6GprqS%252Fsearch-for-users-yesno.PNG%3Falt%3Dmedia%26token%3Db9715744-cadb-44d6-987f-aab9b6916b5f&width=768&dpr=4&quality=100&sign=98c8951b&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M3xJujtten6m95J5MIR%252F-M3xM3iYgQv8DaDZxeCl%252Fyes-no-exclusive.gif%3Falt%3Dmedia%26token%3D9ae279d6-f808-403c-bb33-afb3579ede0f&width=768&dpr=4&quality=100&sign=53ef43b9&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M3xJujtten6m95J5MIR%252F-M3xMXuY7doaq97d3_yZ%252Fsearch-for-users.PNG%3Falt%3Dmedia%26token%3D6c25a975-6e54-4b4f-b0ed-7567e1ecabe7&width=768&dpr=4&quality=100&sign=75fbbd1b&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-M3xJujtten6m95J5MIR%252F-M3xRbYwRTvefSoUqUA4%252Fyes-no-inclusive.gif%3Falt%3Dmedia%26token%3D153040e6-c1b9-432b-82ea-f96632cae8df&width=768&dpr=4&quality=100&sign=eeb3dedc&sv=2) --- # Data types | Canvas Documentation [PreviousIntegrate some to parent](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/reusable-elements/menu-focus-elements/set-up-menu) [NextOption Sets](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/option-sets) Last updated 4 years ago Was this helpful? All objects and some selected fields in the template are explained below. Please refer to our document for guidance on how the Bubble database should be structured. All data types and a few select fields are explained below. A good general rule to follow is that you shouldn't delete any fields that are included with the template and instead only add new ones. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/data-structure#website) Website ------------------------------------------------------------------------------------------------------------ This data type includes fields for all app-wide settings. Most of the data fields are controlled by the App admin from the Admin portal. There should only be a single object of this data type. Field name Type Description Ask for cookies? yes / no App Owner can control whether or not to ask users to accept cookies (if yes, a cookies banner will show on the homepage) Email text Contact / support email that all emails in the application come from. Whenever a new email action is created in the application, it should refer to this field instead of being hardcoded Email HTML text Email verification required? yes / no App owner can control whether or not to require users to verify their emails during the sign up process (if yes, users will receive an email that contains a verification link and they will need to click the link to verify their emails) Name text Name of your app / website. This is the field that should be referenced anywhere where the name is used (instead of hardcoded). App primary color text App and email template primary color Usersnap off? yes / no This turns off the Usersnap tool, which AirDev uses with its clients to submit feedback and bug reports. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/data-structure#user) User ------------------------------------------------------------------------------------------------------ The user data type represents each person who has an account in your application. Field name Type Description Date agreed to terms and privacy docs date Date agreed to terms and privacy docs during sign up Date signup completed date Date the user completed signup. If the user signs up themself this is populated on initial signup. If the user is invited such as an app admin, this is recorded when they first set their password Inactive yes / no User is marked as inactive = yes when App owner deletes the user from the Owner's Portal Last login date Captures the last date that the user loaded any page in the app Signup method text E.g., E-mail, LinkedIn, Facebook, Twitter, or etc. Pending email verification email verification Current user's email verification (this will be deleted from the user once the user verifies his email) [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/data-structure#dummy) Dummy -------------------------------------------------------------------------------------------------------- This data type allows you to quickly preview your page layout by it as your data source. This is filler data for designers to create the UI. These fields can be used to see what the UI of a page looks like with given types of data, which is helpful when you want to focus on the design and ignore the content. Building this way is also great when the designer isn't familiar with the data structures for a particular design. Field name Type DescriptionAddrewtext Address geographic address Address in the San Francisco Bay Area Attachment file Sample pdf file Background picture image Sample image Cover photo image Another sample image Email text Sample email First text First name of a person Last text Last name of a person Long description text Paragraph-length text Number of likes number Number larger than 0 Number of stars number Number between 1 and 5 Order number Integer used to order how these Dummy objects are displayed Phone number number Number with 10 digits Price number Integer used for testing price displays Profile picture image Image of a person (or dog) Regular picture image Another image Short description text A sentence-length text Title text 1-3 word text [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/data-structure#palette-color) Palette color ------------------------------------------------------------------------------------------------------------------------ This data type is color palette list is referenced in the Air Color Picker plugin / element. Feel free to add more color entries for quick access when using the Air Color Picker element. We use this data type for push notifications when we turn your app into a native mobile iOS or Android app. [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/data-structure#email-template) Email Template -------------------------------------------------------------------------------------------------------------------------- [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/data-structure#email-verification-request) Email Verification Request -------------------------------------------------------------------------------------------------------------------------------------------------- [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/data-structure#marketing-page) Marketing Page -------------------------------------------------------------------------------------------------------------------------- [](https://docs.airdev.co/canvas/3.0.0-1/canvas-functionality/reference/data-structure#navigation-link) Navigation Link ---------------------------------------------------------------------------------------------------------------------------- Used in the that generates a nicely-formatted HTML email [Bubble Best Practices](https://docs.airdev.co/bubble-development-guide/steps/plan/database-structure) [SendGrid API call for "send emails"](https://docs.airdev.co/canvas/quickstart-guide#step-2-setting-up-your-email) --- # Design | Canvas Documentation [PreviousDatabase](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/database) [NextSecurity](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/security) Last updated 5 years ago Was this helpful? #### [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/design#it-can-be-difficult-to-strike-a-balance-between-design-functionality-and-maintainability-in-your-bub) It can be difficult to strike a balance between design, functionality, and maintainability in your Bubble app. Here are a few tips on how to do so. [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/design#design-guide) Design guide -------------------------------------------------------------------------------------------- ### [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/design#scale-your-layouts-vertically) Scale your layouts vertically Making application fully-responsive and working well at every screen width is one of the hardest things to do in Bubble but one that is critical to not making your users upset. A key component to doing that is creating layouts that scale vertically and not horizontally. What does that mean? Basically, when creating a layout, think of what will happen when you need to add more stuff to it and when the screen becomes more narrow. Let's say you're creating a layout for a very simple row in a list with 2 action buttons, edit and delete. You may come up with something like this: But what happens if the screen gets more narrow? Perhaps you can still fit the name and two buttons on a phone screen but what about when you need to add a third button? A better and more scalable alternative is one where you add buttons vertically, instead of horizontally: ‌ ### [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/design#white-space-is-good) White space is good There is not much to say here, except for that having white/empty space in your application can be very effective in making the application feel uncluttered and clean. ### [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/design#style-system) Style system You should make sure that every element that you use (or at least almost every element) is using a Style instead of having its visual properties on the element itself. This ensures the following: 1. That you're forced to keep your elements consistent and thus pleasing to the end user 2. That, if you ever decide to change the look and feel of your application, you won't have to hunt down individual elements and will instead be able to update multiple at a time 3. That your application is slightly smaller in size (this probably won't matter for most apps but if you have thousands of elements, the extra code required to store the visual properties on each element can really add up). At the same time, you should ensure that you don't have too many styles because then they will be difficult to manage and also result in inconsistent UI. Somewhere in the 5-10 range is probably right for most element types (some may require fewer, some more). What to do if you need to have an element that's styled in a one-off way? For example, let's imagine that you have an existing text style that you need to make **bold** in a single place. Do you create a whole separate style for that? We generally don't, instead we use a hack where we conditionally set the font to be bold and make the condition apply all the time. Below is an example. ### [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/design#size-and-spacing-system) Size and spacing system The Style tab doesn't ensure that the sizes of your elements and padding are consistent, so you have to take care of that separately. Here are a few sample conventions that we use in Canvas: * Pages have a width of 1220px * Primary content goes into a group that's 860px wide * Each primary content block is 780px wide * Small buttons are 25px high, big buttons are 40px high * There are 15px of spacing between each input * Etc. [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/design#big-design-decisions) Big design decisions ------------------------------------------------------------------------------------------------------------ As you're designing and laying out your application, there are some high-level decisions that you'll need to make. ### [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/design#lots-of-pages-or-lots-groups-on-a-single-page) Lots of pages or lots groups on a single page? You'll have to decide whether you'll build a separate page for each of your screens or whether you put them on the same page, in hidden groups that show at the right time. Here's a table that compares the two methods on multiple dimensions: Dimension Separate page Group on a page Speed Each page will load quickly BUT a lot of page loads will be required, so overall probably a bit slower. The overall page will load slower but switching between groups will be very quick. Modularity Very modular because all you have to do is just link to the page if you need to integrate it into a new flow or expose it to a new user type. A bit less modular because it's embedded within a larger page. However, that can be remedied by using a reuseable group. Navigation Very easy to link to. Harder to link to an individual group but not that hard as long as parameters are used for navigation. Where we've landed with Canvas is that we use both separate pages as well as multiple groups on a page, depending on the use case. Let's imagine a very basic social networking application with the following functionality: * Users can search for other users and view their profiles * Users can add other users as friends * Users can message their friends * Users can update their profile and settings We would probably use the following pages: * **Search page** - this would be a standalone page where the user will search for other users and view the results in a list. * **Profile page** \- this would be a standalone page that will show information about a particular user. * **Dashboard page** - this would be a page with several hidden groups that will be used to approve friend requests, message other users, and update profile/settings. If you decide to have multiple groups on a page, you shouldn't stack them in an overlapping way on top of each other because the page height will then have to be as tall as the tallest group and you might end up with unnecessary empty space at the bottom. Instead, stack them vertically, one below the other one, and set each one to collapse when hidden. Also, you should make them all invisible by default and only visible when they need to be (vs. making all groups visible by default, which will result in a flash of content that is later hidden). ### [](https://docs.airdev.co/canvas/3.0.0-1/using-bubble/design#reusables-or-not) Reusables or not? Generally, reusable elements are great. They fit well within our principle of modularity and allow us to easily add repeated functionality without needing to duplicate it. There is, however, a relatively large **BUT**, which is: > **It's relatively hard to pass data to and from reusable elements** Each reusable element accepts an object or a simple value and each custom workflow within a reusable also accepts an object or a simple value. The hard part starts when you need to either pass more than 2 parameters to the reusable element or you need to reference the result of something that happens within the reusable element. There are three non-ideal ways to do that: 1. (Most likely a bad idea) Set fields on the `Current User` to pass data back and forth 2. Set states on the reusable elements and reference them in either direction (either from page to reusable or from reusable to page) 3. Update the URL parameters and refer to those in either direction 4. Use one of the global variable plugins #1 is probably a bad idea because multiple people won't be able to use the same user account at once. And #2-#4 are all doable but require a bit more work than not using reusables. Now that we've caveated reusable elements, let's reiterate that you should probably be using them, especially if you're building functionality that will need to be accessed in multiple places and doesn't require passing a lot of data back and forth. A great example is a popup for editing an object - it only needs one parameter, which is the object itself and is most likely needed in multiple places (in the dashboard of the user who creates the object, in the dashboard of the app's owner, etc.). A button layout that scales horizontally A button layout that scales vertically Look at all that "wasted" space The condition is always true and thus the text is always bold ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Lv6mhPcOSLWch6HLRIC%252F-Lv6sSLSOOPVjKeyfqLc%252Fassets_-LZgeX5n5GW38BCost9m_-L_KBICLewFV5ykV2By6_-L_KDRqIqaNbh7DW6s4M_image.png%3Falt%3Dmedia%26token%3D46d3decc-21b8-4201-9728-3365fa99335c&width=768&dpr=4&quality=100&sign=c60cc35e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Lv6mhPcOSLWch6HLRIC%252F-Lv6sV2ECxIJqljBPDwo%252Fassets_-LZgeX5n5GW38BCost9m_-L_K6Mg1Q1J0AK0WmL4z_-L_K9xDFr1PUp876FuD0_image.png%3Falt%3Dmedia%26token%3D43d2ff9b-253b-4e67-a7a0-9bf04fa357fe&width=768&dpr=4&quality=100&sign=155f9e8e&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Lv6mhPcOSLWch6HLRIC%252F-Lv6sOo6O_VWPD7RifaD%252Fassets_-LZgeX5n5GW38BCost9m_-L_KBICLewFV5ykV2By6_-L_KLfdPK0y_jFVQKLJ5_image.png%3Falt%3Dmedia%26token%3D6aa19b08-606b-4501-838d-407ed8d1d4fe&width=768&dpr=4&quality=100&sign=8a4fc3c6&sv=2) ![](https://docs.airdev.co/~gitbook/image?url=https%3A%2F%2F3171454870-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fassets%252F-LYJWnUT3lUFQk1K9BCK%252F-Lv6mhPcOSLWch6HLRIC%252F-Lv6sK7xl1DZ9DTVla9b%252Fassets_-LZgeX5n5GW38BCost9m_-L_KBICLewFV5ykV2By6_-L_KKC9S9M0VwnKs_tC0_image.png%3Falt%3Dmedia%26token%3Dd4e095ec-6e9d-4007-b81e-414d80070622&width=768&dpr=4&quality=100&sign=415633bc&sv=2) ---