diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a2cd1504..587f23bd 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,6 +33,7 @@ repos: .*node_modules.*| .*boilerplate.*| .*src.*.js| + builder/public/js/identify.js| )$ ci: diff --git a/README.md b/README.md index 87810b92..706a0e42 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@

Frappe Builder

Crafting Web Pages Made Effortless!

-![Frappe Builder](https://github.com/frappe/builder/assets/13928957/e39f1057-4b60-4d1f-b8e9-049668738da6) +![Frappe Builder](https://github.com/user-attachments/assets/e906545e-101e-4d55-8a25-2c4f6380ea5e) [Web page design credit](https://www.figma.com/community/file/949266436474872912) diff --git a/builder/api.py b/builder/api.py index 8a781691..4f9f01e8 100644 --- a/builder/api.py +++ b/builder/api.py @@ -1,8 +1,20 @@ import json +import os +from io import BytesIO +from urllib.parse import unquote import frappe +import requests +from frappe.apps import get_apps as get_permitted_apps +from frappe.core.doctype.file.file import get_local_image +from frappe.core.doctype.file.utils import delete_file from frappe.integrations.utils import make_post_request +from frappe.model.document import Document +from frappe.utils.caching import redis_cache from frappe.utils.telemetry import POSTHOG_HOST_FIELD, POSTHOG_PROJECT_FIELD +from PIL import Image + +from builder.builder.doctype.builder_page.builder_page import BuilderPageRenderer @frappe.whitelist() @@ -52,6 +64,132 @@ def get_posthog_settings(): } +@frappe.whitelist() +def get_page_preview_html(page: str, **kwarg) -> str: + # to load preview without publishing + frappe.form_dict.update(kwarg) + renderer = BuilderPageRenderer(path="") + renderer.docname = page + renderer.doctype = "Builder Page" + frappe.flags.show_preview = True + frappe.local.no_cache = 1 + renderer.init_context() + response = renderer.render() + page = frappe.get_cached_doc("Builder Page", page) + frappe.enqueue_doc( + page.doctype, + page.name, + "generate_page_preview_image", + html=str(response.data, "utf-8"), + queue="short", + ) + return response + + +@frappe.whitelist() +def upload_builder_asset(): + from frappe.handler import upload_file + + image_file = upload_file() + if image_file.file_url.endswith((".png", ".jpeg", ".jpg")) and frappe.get_cached_value( + "Builder Settings", None, "auto_convert_images_to_webp" + ): + convert_to_webp(file_doc=image_file) + return image_file + + +@frappe.whitelist() +def convert_to_webp(image_url: str | None = None, file_doc: Document | None = None) -> str: + """BETA: Convert image to webp format""" + + CONVERTIBLE_IMAGE_EXTENSIONS = ["png", "jpeg", "jpg"] + + def can_convert_image(extn): + return extn.lower() in CONVERTIBLE_IMAGE_EXTENSIONS + + def get_extension(filename): + return filename.split(".")[-1].lower() + + def convert_and_save_image(image, path): + image.save(path, "WEBP") + return path + + def update_file_doc_with_webp(file_doc, image, extn): + webp_path = file_doc.get_full_path().replace(extn, "webp") + convert_and_save_image(image, webp_path) + delete_file(file_doc.get_full_path()) + file_doc.file_url = f"{file_doc.file_url.replace(extn, 'webp')}" + file_doc.save() + return file_doc.file_url + + def create_new_webp_file_doc(file_url, image, extn): + files = frappe.get_all("File", filters={"file_url": file_url}, fields=["name"], limit=1) + if files: + _file = frappe.get_doc("File", files[0].name) + webp_path = _file.get_full_path().replace(extn, "webp") + convert_and_save_image(image, webp_path) + new_file = frappe.copy_doc(_file) + new_file.file_name = f"{_file.file_name.replace(extn, 'webp')}" + new_file.file_url = f"{_file.file_url.replace(extn, 'webp')}" + new_file.save() + return new_file.file_url + return file_url + + def handle_image_from_url(image_url): + image_url = unquote(image_url) + response = requests.get(image_url) + image = Image.open(BytesIO(response.content)) + filename = image_url.split("/")[-1] + extn = get_extension(filename) + if can_convert_image(extn): + _file = frappe.get_doc( + { + "doctype": "File", + "file_name": f"{filename.replace(extn, 'webp')}", + "file_url": f"/files/{filename.replace(extn, 'webp')}", + } + ) + webp_path = _file.get_full_path() + convert_and_save_image(image, webp_path) + _file.save() + return _file.file_url + return image_url + + if not image_url and not file_doc: + return "" + + if file_doc: + if file_doc.file_url.startswith("/files"): + image, filename, extn = get_local_image(file_doc.file_url) + if can_convert_image(extn): + return update_file_doc_with_webp(file_doc, image, extn) + return file_doc.file_url + + if image_url.startswith("/files"): + image, filename, extn = get_local_image(image_url) + if can_convert_image(extn): + return create_new_webp_file_doc(image_url, image, extn) + return image_url + + if image_url.startswith("/builder_assets"): + image_path = os.path.abspath(frappe.get_app_path("builder", "www", image_url.lstrip("/"))) + image_path = image_path.replace("_", "-") + image_path = image_path.replace("/builder-assets", "/builder_assets") + + image = Image.open(image_path) + extn = get_extension(image_path) + if can_convert_image(extn): + webp_path = image_path.replace(extn, "webp") + convert_and_save_image(image, webp_path) + return image_url.replace(extn, "webp") + return image_url + + if image_url.startswith("http"): + return handle_image_from_url(image_url) + + return image_url + + def check_app_permission(): if frappe.session.user == "Administrator": return True @@ -60,3 +198,20 @@ def check_app_permission(): return True return False + + +@frappe.whitelist() +@redis_cache() +def get_apps(): + apps = get_permitted_apps() + app_list = [ + { + "name": "frappe", + "logo": "/assets/builder/images/desk.png", + "title": "Desk", + "route": "/app", + } + ] + app_list += filter(lambda app: app.get("name") != "builder", apps) + + return app_list diff --git a/builder/builder/builder_block_template/blockquote/blockquote.json b/builder/builder/builder_block_template/blockquote/blockquote.json new file mode 100644 index 00000000..e58a3b1d --- /dev/null +++ b/builder/builder/builder_block_template/blockquote/blockquote.json @@ -0,0 +1,17 @@ +{ + "block": "{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"left\": \"auto\",\"overflow\": \"hidden\",\"position\": \"static\",\"top\": \"auto\",\"width\": \"100%\"},\"blockId\": \"udqa5zyxm\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"position\": \"static\",\"width\": \"fit-content\"},\"blockId\": \"98f44tdju\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Words can be like X-rays, if you use them properly\\u2014they\\u2019ll go through anything. You read and you\\u2019re pierced.

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"gap\": \"6px\",\"height\": \"fit-content\",\"overflow\": \"hidden\",\"position\": \"relative\",\"width\": \"fit-content\"},\"blockId\": \"ztvga4ewc\",\"blockName\": \"container\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"height\": \"fit-content\",\"width\": \"fit-content\"},\"blockId\": \"pxv3ojq7t\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"innerHTML\": \"

\\u2014Aldous Huxley,\",\"mobileStyles\": {},\"originalElement\": \"__raw_html__\",\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"background\": \"#e2e2e2\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"overflow\": \"hidden\",\"position\": \"static\"},\"blockId\": \"bglu90k42\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"cite\",\"innerHTML\": \"

Brave New World

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {\"cite\": \"https://www.huxley.net/bnw/four.html\"},\"dataKey\": null,\"element\": \"blockquote\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}", + "category": "Typography", + "creation": "2024-09-03 23:17:52.830414", + "docstatus": 0, + "doctype": "Block Template", + "idx": 0, + "modified": "2024-09-19 13:10:00.947270", + "modified_by": "Administrator", + "name": "Blockquote", + "order": 13, + "owner": "Administrator", + "preview": "/builder_assets/Blockquote/blockquote.png", + "preview_height": 1, + "preview_width": 1, + "template_name": "Blockquote" +} \ No newline at end of file diff --git a/builder/builder/builder_block_template/button/button.json b/builder/builder/builder_block_template/button/button.json index 83704ce1..ec9d662a 100644 --- a/builder/builder/builder_block_template/button/button.json +++ b/builder/builder/builder_block_template/button/button.json @@ -1,14 +1,17 @@ { - "block": "{\"blockId\":\"4ur2l2mc6\",\"children\":[{\"blockId\":\"3z5gwjl2f\",\"children\":[],\"baseStyles\":{\"color\":\"var(--neutral-white, #FFF)\",\"fontSize\":\"14px\",\"fontWeight\":\"420\",\"height\":\"fit-content\",\"left\":\"auto\",\"letterSpacing\":\"0.28px\",\"lineHeight\":\"115%\",\"minWidth\":\"30px\",\"position\":\"static\",\"top\":\"auto\",\"width\":\"fit-content\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[\"__text_block__\"],\"dataKey\":null,\"element\":\"p\",\"innerHTML\":\"

Button

\",\"customAttributes\":{}}],\"baseStyles\":{\"background\":\"#171717\",\"borderRadius\":\"4px\",\"display\":\"flex\",\"flexDirection\":\"column\",\"height\":\"fit-content\",\"padding\":\"6px 8px\",\"width\":\"fit-content\"},\"rawStyles\":{\"flex-shrink\":\"0\",\"hover:background\":\"#383838\",\"transition\":\"all 0.1s ease-out\"},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{\"href\":\"#\"},\"classes\":[\"__text_block__\"],\"dataKey\":null,\"blockName\":\"container\",\"element\":\"a\",\"customAttributes\":{}}", + "block": "{\"attributes\": {\"href\": \"#\"},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"#171717\",\"borderRadius\": \"4px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"height\": \"fit-content\",\"justifyContent\": \"center\",\"padding\": \"6px 8px\",\"width\": \"fit-content\"},\"blockId\": \"4ur2l2mc6\",\"blockName\": \"button-link\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"color\": \"var(--neutral-white, #FFF)\",\"fontSize\": \"14px\",\"fontWeight\": \"420\",\"height\": \"fit-content\",\"left\": \"auto\",\"letterSpacing\": \"0.28px\",\"lineHeight\": \"115%\",\"minWidth\": \"30px\",\"position\": \"static\",\"top\": \"auto\",\"width\": \"fit-content\"},\"blockId\": \"3z5gwjl2f\",\"children\": [],\"classes\": [\"__text_block__\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Button

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [\"__text_block__\"],\"customAttributes\": {},\"dataKey\": null,\"editable\": false,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {\"flex-shrink\": \"0\",\"hover:background\": \"#383838\",\"transition\": \"all 0.1s ease-out\"},\"tabletStyles\": {}}", "category": "Basic", "creation": "2024-07-10 14:44:08.816465", "docstatus": 0, "doctype": "Block Template", "idx": 0, - "modified": "2024-07-12 09:34:22.716694", + "modified": "2024-09-19 13:08:10.275886", "modified_by": "Administrator", "name": "Button", + "order": 1, "owner": "Administrator", "preview": "/builder_assets/Button/button.png", + "preview_height": 1, + "preview_width": 1, "template_name": "Button" } \ No newline at end of file diff --git a/builder/builder/builder_block_template/embed/embed.json b/builder/builder/builder_block_template/embed/embed.json index 73a3f651..ea5a0b6a 100644 --- a/builder/builder/builder_block_template/embed/embed.json +++ b/builder/builder/builder_block_template/embed/embed.json @@ -1,11 +1,11 @@ { "block": "{\"blockId\":\"1vw78v0md\",\"children\":[],\"baseStyles\":{\"height\":\"fit-content\",\"width\":\"fit-content\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[],\"dataKey\":null,\"blockName\":\"Embed HTML\",\"element\":\"div\",\"innerHTML\":\"
\\n

Paste HTML or double click to edit

\\n
\",\"originalElement\":\"__raw_html__\",\"customAttributes\":{}}", - "category": "Basic", + "category": "Advanced", "creation": "2024-07-10 17:07:00.407251", "docstatus": 0, "doctype": "Block Template", "idx": 0, - "modified": "2024-07-12 09:34:18.897182", + "modified": "2024-09-03 22:16:29.411961", "modified_by": "Administrator", "name": "Embed", "owner": "Administrator", diff --git a/builder/builder/builder_block_template/footer_1/footer_1.json b/builder/builder/builder_block_template/footer_1/footer_1.json new file mode 100644 index 00000000..d906c423 --- /dev/null +++ b/builder/builder/builder_block_template/footer_1/footer_1.json @@ -0,0 +1,17 @@ +{ + "block": "{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"height\": \"fit-content\",\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"width\": \"100%\"},\"blockId\": \"5bruwapua\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"flex-start\",\"background\": \"rgb(255, 255, 255)\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"gap\": \"49px\",\"justifyContent\": \"flex-start\",\"maxWidth\": \"1200px\",\"paddingBottom\": \"40px\",\"paddingLeft\": \"40px\",\"paddingRight\": \"40px\",\"paddingTop\": \"40px\",\"width\": \"100%\"},\"blockId\": \"8ej0p4sc9\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"flex-start\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"gap\": \"30px\",\"justifyContent\": \"space-between\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\",\"width\": \"100%\"},\"blockId\": \"unakkk9zz\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"flex-start\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"gap\": \"19px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\",\"width\": \"400px\"},\"blockId\": \"jc6z4ovz1\",\"children\": [{\"attributes\": {},\"baseStyles\": {},\"blockId\": \"h2wqexent\",\"blockName\": \"logo\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"svg\",\"innerHTML\": \"\\n\\n\\n\",\"mobileStyles\": {},\"originalElement\": \"__raw_html__\",\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"flex-start\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"gap\": \"10px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\"},\"blockId\": \"o5ehl5yk2\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(82, 82, 82)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"-0.5%\",\"lineHeight\": \"150%\"},\"blockId\": \"zvvci9cwq\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Transform your designs into stunning websites with Frappe builder, the ultimate web builder for creative pros.

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"flex-end\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"gap\": \"23px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"10px\",\"paddingRight\": \"10px\",\"paddingTop\": \"10px\"},\"blockId\": \"1otqfemvd\",\"blockName\": \"social\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"height\": \"fit-content\",\"overflow\": \"hidden\",\"width\": \"fit-content\"},\"blockId\": \"xdjj348b7\",\"blockName\": \"container\",\"children\": [{\"attributes\": {},\"baseStyles\": {},\"blockId\": \"u2xkwijlw\",\"blockName\": \"facebook\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"svg\",\"innerHTML\": \"\\n\\n\\n\\n\\n\\n\\n\\n\\n\",\"mobileStyles\": {},\"originalElement\": \"__raw_html__\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"height\": \"fit-content\",\"overflow\": \"hidden\",\"width\": \"fit-content\"},\"blockId\": \"8o6mm2cdb\",\"blockName\": \"container\",\"children\": [{\"attributes\": {},\"baseStyles\": {},\"blockId\": \"u1ekxhiv1\",\"blockName\": \"twitter\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"svg\",\"innerHTML\": \"\\n\\n\\n\\n\\n\\n\\n\\n\\n\",\"mobileStyles\": {},\"originalElement\": \"__raw_html__\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"height\": \"fit-content\",\"overflow\": \"hidden\",\"width\": \"fit-content\"},\"blockId\": \"r4iv0wuoc\",\"blockName\": \"container\",\"children\": [{\"attributes\": {},\"baseStyles\": {},\"blockId\": \"r3fudne7b\",\"blockName\": \"medium\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"svg\",\"innerHTML\": \"\\n\\n\\n\\n\\n\\n\\n\\n\\n\",\"mobileStyles\": {},\"originalElement\": \"__raw_html__\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"height\": \"fit-content\",\"overflow\": \"hidden\",\"width\": \"fit-content\"},\"blockId\": \"pyba60bv5\",\"blockName\": \"container\",\"children\": [{\"attributes\": {},\"baseStyles\": {},\"blockId\": \"tagf2z51x\",\"blockName\": \"github\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"svg\",\"innerHTML\": \"\\n\\n\\n\\n\\n\\n\\n\\n\\n\",\"mobileStyles\": {},\"originalElement\": \"__raw_html__\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {\"width\": \"100%\"},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {\"gap\": \"20px\",\"width\": \"273px\"}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"flex-start\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"gap\": \"10px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\"},\"blockId\": \"nqbjj11d7\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"flex-start\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"gap\": \"20px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\",\"width\": \"200px\"},\"blockId\": \"d4w69s8eg\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"gap\": \"8px\",\"height\": \"24px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\"},\"blockId\": \"07jtmm84h\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(23, 23, 23)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"-0.5%\",\"lineHeight\": \"150%\"},\"blockId\": \"zcyjuogrf\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Services

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"flex-start\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"gap\": \"12px\",\"height\": \"132px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\"},\"blockId\": \"z4n1d2i83\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"ktqrphv2q\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Cloud

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"skfy075b8\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"Support\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"si8qyc9s1\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"Mobile apps\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"ygnijnps6\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Login

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {\"width\": \"45%\"},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {\"width\": \"100px\"}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"flex-start\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"gap\": \"20px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\",\"width\": \"200px\"},\"blockId\": \"4n8qmplt8\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"gap\": \"8px\",\"height\": \"24px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\"},\"blockId\": \"yp0fqrqdd\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(23, 23, 23)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"-0.5%\",\"lineHeight\": \"150%\"},\"blockId\": \"105alltts\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Apps

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"flex-start\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"gap\": \"12px\",\"height\": \"168px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\"},\"blockId\": \"kdq1dow5i\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"doh9t5a12\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"Gameplan\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"6p08a3pse\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Insights

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"ycynx3igy\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

CRM

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"f3ue51wtf\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"Builder\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"iu3pg6g3j\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

See more

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {\"width\": \"45%\"},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {\"width\": \"100px\"}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"flex-start\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"gap\": \"20px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\",\"width\": \"200px\"},\"blockId\": \"cfjzm6god\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"gap\": \"8px\",\"height\": \"24px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\"},\"blockId\": \"essjxuapl\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(23, 23, 23)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"-0.5%\",\"lineHeight\": \"150%\"},\"blockId\": \"9v1rofnpa\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Company

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"flex-start\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"gap\": \"12px\",\"height\": \"168px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\"},\"blockId\": \"7hg3h8por\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"wey03z8ha\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

About

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"sn82zbglu\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Blog

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"wvl2u43uq\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"Products\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"cnwzbff05\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"Features\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"xa5nc7fc1\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"Pricing\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {\"width\": \"45%\"},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {\"width\": \"100px\"}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"flex-start\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"gap\": \"20px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\",\"width\": \"200px\"},\"blockId\": \"53990huoy\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"gap\": \"8px\",\"height\": \"24px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\"},\"blockId\": \"3vussng0p\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(23, 23, 23)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"-0.5%\",\"lineHeight\": \"150%\"},\"blockId\": \"q6int684n\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

What\\u2019s new

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"flex-start\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"gap\": \"12px\",\"height\": \"132px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\"},\"blockId\": \"vafhal75z\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"8a8oms3cb\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Version 1.1.1

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"sipclbpdw\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"Version 1.2.1\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"025ltoff9\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"Version 1.3.1\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"16px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"6cvbizhgo\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Version 1.6.1

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {\"width\": \"45%\"},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {\"width\": \"100px\"}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {\"flexWrap\": \"wrap\",\"gap\": \"10px\"},\"originalElement\": \"\",\"rawStyles\": {\"order\": \"1\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {\"flexDirection\": \"column\",\"gap\": \"50px\"},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"justifyContent\": \"space-between\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\",\"width\": \"100%\"},\"blockId\": \"0kwur41vl\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"gap\": \"8px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"10px\",\"paddingRight\": \"10px\",\"paddingTop\": \"0px\"},\"blockId\": \"y8gk3bnj1\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(124, 124, 124)\",\"display\": \"flex\",\"fontSize\": \"14px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\"},\"blockId\": \"e1s8u3buh\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

\\u00a9 2024 Your Company, Inc. All rights reserved.

\",\"mobileStyles\": {\"width\": \"100%\"},\"originalElement\": \"\",\"rawStyles\": {\"whiteSpace\": \"wrap\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"innerHTML\": \"\",\"mobileStyles\": {\"paddingLeft\": \"0px\",\"width\": \"100%\"},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"gap\": \"10px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\"},\"blockId\": \"fui1hqr7b\",\"children\": [{\"attributes\": {\"placeholder\": \"Enter your email\"},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"rgb(243, 243, 243)\",\"borderRadius\": \"8px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"gap\": \"14px\",\"height\": \"28px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"6px\",\"paddingLeft\": \"8px\",\"paddingRight\": \"8px\",\"paddingTop\": \"6px\",\"width\": \"200px\"},\"blockId\": \"uilntcr4m\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"input\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"boxShadow\": \"0px 0px 0px rgb(199, 199, 199)\"},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"rgb(23, 23, 23)\",\"borderRadius\": \"8px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"gap\": \"8px\",\"justifyContent\": \"center\",\"paddingBottom\": \"6px\",\"paddingLeft\": \"8px\",\"paddingRight\": \"8px\",\"paddingTop\": \"6px\"},\"blockId\": \"ipp7b45nb\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(255, 255, 255)\",\"display\": \"flex\",\"fontSize\": \"14px\",\"letterSpacing\": \"0.5%\",\"lineHeight\": \"114.99999761581421%\"},\"blockId\": \"ivmdmqxka\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Subscribe

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {\"overflow\": \"hidden\",\"textOverflow\": \"ellipsis\",\"whiteSpace\": \"nowrap\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"button\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {\"width\": \"100%\"},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {\"flexDirection\": \"column\",\"gap\": \"20px\"},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {\"gap\": \"67px\"},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"footer\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}", + "category": "Structure", + "creation": "2024-09-18 19:52:15.072947", + "docstatus": 0, + "doctype": "Block Template", + "idx": 0, + "modified": "2024-10-14 00:07:01.491709", + "modified_by": "Administrator", + "name": "Footer 1", + "order": 7, + "owner": "Administrator", + "preview": "/builder_assets/Footer 1/footer_1.png", + "preview_height": 2, + "preview_width": 2, + "template_name": "Footer 1" +} \ No newline at end of file diff --git a/builder/builder/builder_block_template/form_1/form_1.json b/builder/builder/builder_block_template/form_1/form_1.json index c9cb9ac5..9a0ece40 100644 --- a/builder/builder/builder_block_template/form_1/form_1.json +++ b/builder/builder/builder_block_template/form_1/form_1.json @@ -1,14 +1,17 @@ { - "block": "{\"blockId\":\"2e45tti0c\",\"children\":[{\"blockId\":\"86oxik4s9\",\"children\":[],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"flexShrink\":0,\"overflow\":\"hidden\",\"position\":\"static\",\"width\":\"100%\",\"height\":\"32px\",\"borderRadius\":\"4px\",\"borderColor\":\"#c9c9c9\",\"borderWidth\":\"1px\",\"borderStyle\":\"solid\",\"fontSize\":\"14px\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{\"placeholder\":\"Full Name\"},\"classes\":[],\"dataKey\":null,\"element\":\"input\",\"customAttributes\":{\"name\":\"full_name\",\"required\":\"true\"}},{\"blockId\":\"wzbvukqlo\",\"children\":[],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"flexShrink\":0,\"overflow\":\"hidden\",\"position\":\"static\",\"width\":\"100%\",\"height\":\"32px\",\"borderRadius\":\"4px\",\"borderColor\":\"#c9c9c9\",\"borderWidth\":\"1px\",\"borderStyle\":\"solid\",\"fontSize\":\"14px\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{\"placeholder\":\"Email\"},\"classes\":[],\"dataKey\":null,\"element\":\"input\",\"customAttributes\":{\"name\":\"email\",\"required\":\"true\"}},{\"blockId\":\"4rclutff4\",\"children\":[],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"flexShrink\":0,\"overflow\":\"hidden\",\"position\":\"static\",\"top\":\"auto\",\"left\":\"auto\",\"width\":\"100%\",\"height\":\"150px\",\"borderRadius\":\"4px\",\"borderColor\":\"#c9c9c9\",\"borderWidth\":\"1px\",\"borderStyle\":\"solid\",\"fontSize\":\"14px\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{\"placeholder\":\"Message\"},\"classes\":[],\"dataKey\":null,\"element\":\"textarea\",\"customAttributes\":{\"name\":\"message\",\"required\":\"true\"}},{\"blockId\":\"uxry21e1i\",\"children\":[{\"blockId\":\"yjglepmnh\",\"children\":[],\"baseStyles\":{\"color\":\"var(--neutral-white, #FFF)\",\"fontSize\":\"14px\",\"fontWeight\":\"420\",\"height\":\"fit-content\",\"left\":\"auto\",\"letterSpacing\":\"0.28px\",\"lineHeight\":\"115%\",\"minWidth\":\"30px\",\"position\":\"static\",\"top\":\"auto\",\"width\":\"fit-content\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[\"__text_block__\"],\"dataKey\":null,\"element\":\"p\",\"innerHTML\":\"

Submit

\",\"customAttributes\":{}}],\"baseStyles\":{\"background\":\"#171717\",\"borderRadius\":\"4px\",\"display\":\"flex\",\"flexDirection\":\"column\",\"height\":\"fit-content\",\"padding\":\"6px 8px\",\"width\":\"100%\",\"justifyContent\":\"flex-start\",\"alignItems\":\"center\"},\"rawStyles\":{\"flex-shrink\":\"0\",\"hover:background\":\"#383838\",\"transition\":\"all 0.1s ease-out\"},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[\"\"],\"dataKey\":null,\"element\":\"button\",\"customAttributes\":{}}],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"flexShrink\":0,\"overflow\":\"hidden\",\"position\":\"static\",\"top\":\"auto\",\"left\":\"auto\",\"width\":\"100%\",\"paddingLeft\":\"20px\",\"paddingRight\":\"20px\",\"paddingBottom\":\"20px\",\"paddingTop\":\"20px\",\"maxWidth\":\"400px\",\"gap\":\"15px\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[],\"dataKey\":null,\"element\":\"form\",\"customAttributes\":{}}", - "category": "Basic", + "block": "{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"gap\": \"15px\",\"left\": \"auto\",\"maxWidth\": \"400px\",\"overflow\": \"hidden\",\"paddingBottom\": \"20px\",\"paddingLeft\": \"20px\",\"paddingRight\": \"20px\",\"paddingTop\": \"20px\",\"position\": \"static\",\"top\": \"auto\",\"width\": \"100%\"},\"blockId\": \"2e45tti0c\",\"children\": [{\"attributes\": {\"placeholder\": \"Full Name\"},\"baseStyles\": {\"borderColor\": \"#c9c9c9\",\"borderRadius\": \"4px\",\"borderStyle\": \"solid\",\"borderWidth\": \"1px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"fontSize\": \"14px\",\"height\": \"32px\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"86oxik4s9\",\"children\": [],\"classes\": [],\"customAttributes\": {\"name\": \"full_name\",\"required\": \"true\"},\"dataKey\": null,\"element\": \"input\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {\"placeholder\": \"Email\"},\"baseStyles\": {\"borderColor\": \"#c9c9c9\",\"borderRadius\": \"4px\",\"borderStyle\": \"solid\",\"borderWidth\": \"1px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"fontSize\": \"14px\",\"height\": \"32px\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"wzbvukqlo\",\"children\": [],\"classes\": [],\"customAttributes\": {\"name\": \"email_id\",\"required\": \"true\"},\"dataKey\": null,\"element\": \"input\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {\"placeholder\": \"Message\"},\"baseStyles\": {\"borderColor\": \"#c9c9c9\",\"borderRadius\": \"4px\",\"borderStyle\": \"solid\",\"borderWidth\": \"1px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"fontSize\": \"14px\",\"height\": \"150px\",\"left\": \"auto\",\"overflow\": \"hidden\",\"position\": \"static\",\"top\": \"auto\",\"width\": \"100%\"},\"blockId\": \"4rclutff4\",\"children\": [],\"classes\": [],\"customAttributes\": {\"name\": \"message\",\"required\": \"true\"},\"dataKey\": null,\"element\": \"textarea\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"#171717\",\"borderRadius\": \"4px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"height\": \"fit-content\",\"justifyContent\": \"flex-start\",\"padding\": \"6px 8px\",\"width\": \"100%\"},\"blockId\": \"uxry21e1i\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"color\": \"var(--neutral-white, #FFF)\",\"fontSize\": \"14px\",\"fontWeight\": \"420\",\"height\": \"fit-content\",\"left\": \"auto\",\"letterSpacing\": \"0.28px\",\"lineHeight\": \"115%\",\"minWidth\": \"30px\",\"position\": \"static\",\"top\": \"auto\",\"width\": \"fit-content\"},\"blockId\": \"yjglepmnh\",\"children\": [],\"classes\": [\"__text_block__\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Submit

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [\"\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"button\",\"mobileStyles\": {},\"rawStyles\": {\"flex-shrink\": \"0\",\"hover:background\": \"#383838\",\"transition\": \"all 0.1s ease-out\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"form\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}", + "category": "Basic Forms", "creation": "2024-07-11 23:34:22.558908", "docstatus": 0, "doctype": "Block Template", "idx": 0, - "modified": "2024-08-05 10:09:12.451684", + "modified": "2024-09-19 13:10:03.603174", "modified_by": "Administrator", "name": "Form 1", + "order": 14, "owner": "Administrator", "preview": "/builder_assets/Form 1/form-1.png", + "preview_height": 1, + "preview_width": 1, "template_name": "Form 1" } \ No newline at end of file diff --git a/builder/builder/builder_block_template/form_2/form_2.json b/builder/builder/builder_block_template/form_2/form_2.json index a39649ee..7b83c52f 100644 --- a/builder/builder/builder_block_template/form_2/form_2.json +++ b/builder/builder/builder_block_template/form_2/form_2.json @@ -1,14 +1,17 @@ { - "block": "{\"blockId\":\"6um6dfg30\",\"children\":[{\"blockId\":\"kv3hkfwvl\",\"children\":[{\"blockId\":\"a6gbqj3zl\",\"children\":[],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"flexShrink\":1,\"overflow\":\"hidden\",\"position\":\"static\",\"width\":\"100%\",\"height\":\"28px\",\"borderRadius\":\"4px\",\"borderColor\":\"#c9c9c9\",\"borderWidth\":\"1px\",\"borderStyle\":\"solid\",\"fontSize\":\"14px\"},\"rawStyles\":{\"border-right\":\"none\",\"border-top-right-radius\":\"0px\",\"border-bottom-right-radius\":\"0px\"},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{\"placeholder\":\"Email\",\"type\":\"email\"},\"classes\":[],\"dataKey\":null,\"element\":\"input\",\"customAttributes\":{\"name\":\"email\",\"required\":\"true\"}}],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"row\",\"flexShrink\":1,\"height\":\"fit-content\",\"width\":\"100%\",\"overflow\":\"hidden\",\"position\":\"relative\",\"gap\":\"10px\",\"flexGrow\":0},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[],\"dataKey\":null,\"blockName\":\"container\",\"element\":\"div\",\"customAttributes\":{}},{\"blockId\":\"m68wwxf5e\",\"children\":[{\"blockId\":\"0aw9cg9y7\",\"children\":[],\"baseStyles\":{\"color\":\"var(--neutral-white, #FFF)\",\"fontSize\":\"14px\",\"fontWeight\":\"420\",\"height\":\"fit-content\",\"left\":\"auto\",\"letterSpacing\":\"0.28px\",\"lineHeight\":\"115%\",\"minWidth\":\"30px\",\"position\":\"static\",\"top\":\"auto\",\"width\":\"fit-content\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[\"__text_block__\"],\"dataKey\":null,\"element\":\"p\",\"innerHTML\":\"

Sign Up

\",\"customAttributes\":{}}],\"baseStyles\":{\"background\":\"#171717\",\"borderRadius\":\"4px\",\"display\":\"flex\",\"flexDirection\":\"column\",\"height\":\"fit-content\",\"padding\":\"6px 8px\",\"justifyContent\":\"flex-start\",\"alignItems\":\"center\"},\"rawStyles\":{\"flex-shrink\":\"0\",\"hover:background\":\"#383838\",\"transition\":\"all 0.1s ease-out\",\"border-top-left-radius\":\"0px\",\"border-bottom-left-radius\":\"0px\"},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[\"\"],\"dataKey\":null,\"element\":\"button\",\"customAttributes\":{}}],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"row\",\"flexShrink\":0,\"overflow\":\"hidden\",\"position\":\"static\",\"top\":\"auto\",\"left\":\"auto\",\"width\":\"100%\",\"paddingLeft\":\"20px\",\"paddingRight\":\"20px\",\"paddingBottom\":\"20px\",\"paddingTop\":\"20px\",\"maxWidth\":\"400px\",\"gap\":\"0px\",\"justifyContent\":\"flex-start\",\"alignItems\":\"center\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[],\"dataKey\":null,\"element\":\"form\",\"customAttributes\":{}}", - "category": "Basic", + "block": "{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"gap\": \"0px\",\"justifyContent\": \"flex-start\",\"left\": \"auto\",\"maxWidth\": \"400px\",\"overflow\": \"hidden\",\"paddingBottom\": \"20px\",\"paddingLeft\": \"20px\",\"paddingRight\": \"20px\",\"paddingTop\": \"20px\",\"position\": \"static\",\"top\": \"auto\",\"width\": \"100%\"},\"blockId\": \"6um6dfg30\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"row\",\"flexGrow\": 0,\"flexShrink\": 1,\"gap\": \"10px\",\"height\": \"fit-content\",\"overflow\": \"hidden\",\"position\": \"relative\",\"width\": \"100%\"},\"blockId\": \"kv3hkfwvl\",\"blockName\": \"container\",\"children\": [{\"attributes\": {\"placeholder\": \"Email\",\"type\": \"email\"},\"baseStyles\": {\"borderColor\": \"#c9c9c9\",\"borderRadius\": \"4px\",\"borderStyle\": \"solid\",\"borderWidth\": \"1px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 1,\"fontSize\": \"14px\",\"height\": \"28px\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"a6gbqj3zl\",\"children\": [],\"classes\": [],\"customAttributes\": {\"name\": \"email\",\"required\": \"true\"},\"dataKey\": null,\"element\": \"input\",\"mobileStyles\": {},\"rawStyles\": {\"border-bottom-right-radius\": \"0px\",\"border-right\": \"none\",\"border-top-right-radius\": \"0px\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"#171717\",\"borderRadius\": \"4px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"height\": \"fit-content\",\"justifyContent\": \"flex-start\",\"padding\": \"6px 8px\"},\"blockId\": \"m68wwxf5e\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"color\": \"var(--neutral-white, #FFF)\",\"fontSize\": \"14px\",\"fontWeight\": \"420\",\"height\": \"fit-content\",\"left\": \"auto\",\"letterSpacing\": \"0.28px\",\"lineHeight\": \"115%\",\"minWidth\": \"30px\",\"position\": \"static\",\"top\": \"auto\",\"width\": \"fit-content\"},\"blockId\": \"0aw9cg9y7\",\"children\": [],\"classes\": [\"__text_block__\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Sign Up

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [\"\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"button\",\"mobileStyles\": {},\"rawStyles\": {\"border-bottom-left-radius\": \"0px\",\"border-top-left-radius\": \"0px\",\"flex-shrink\": \"0\",\"hover:background\": \"#383838\",\"transition\": \"all 0.1s ease-out\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"form\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}", + "category": "Basic Forms", "creation": "2024-07-12 00:27:46.067242", "docstatus": 0, "doctype": "Block Template", "idx": 0, - "modified": "2024-08-05 10:08:57.335197", + "modified": "2024-09-19 13:10:05.562456", "modified_by": "Administrator", "name": "Form 2", + "order": 15, "owner": "Administrator", "preview": "/builder_assets/Form 2/form-2.png", + "preview_height": 1, + "preview_width": 1, "template_name": "Form 2" } \ No newline at end of file diff --git a/builder/builder/builder_block_template/form_3/form_3.json b/builder/builder/builder_block_template/form_3/form_3.json index 9dc4caf3..e0455699 100644 --- a/builder/builder/builder_block_template/form_3/form_3.json +++ b/builder/builder/builder_block_template/form_3/form_3.json @@ -1,14 +1,17 @@ { - "block": "{\"blockId\":\"6um6dfg30\",\"children\":[{\"blockId\":\"kv3hkfwvl\",\"children\":[{\"blockId\":\"a6gbqj3zl\",\"children\":[],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"flexShrink\":1,\"overflow\":\"hidden\",\"position\":\"static\",\"width\":\"100%\",\"height\":\"32px\",\"borderRadius\":\"4px\",\"borderColor\":\"#c9c9c9\",\"borderWidth\":\"1px\",\"borderStyle\":\"solid\",\"fontSize\":\"14px\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{\"placeholder\":\"First Name\"},\"classes\":[],\"dataKey\":null,\"element\":\"input\",\"customAttributes\":{\"name\":\"first_name\",\"required\":\"true\"}},{\"blockId\":\"za6939gew\",\"children\":[],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"flexShrink\":1,\"overflow\":\"hidden\",\"position\":\"static\",\"width\":\"100%\",\"height\":\"32px\",\"borderRadius\":\"4px\",\"borderColor\":\"#c9c9c9\",\"borderWidth\":\"1px\",\"borderStyle\":\"solid\",\"fontSize\":\"14px\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{\"placeholder\":\"Last Name\"},\"classes\":[],\"dataKey\":null,\"element\":\"input\",\"customAttributes\":{\"name\":\"last_name\",\"required\":\"true\"}}],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"row\",\"flexShrink\":1,\"height\":\"fit-content\",\"width\":\"100%\",\"overflow\":\"hidden\",\"position\":\"relative\",\"gap\":\"10px\",\"flexGrow\":0},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[],\"dataKey\":null,\"blockName\":\"container\",\"element\":\"div\",\"customAttributes\":{}},{\"blockId\":\"feg29l91n\",\"children\":[],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"flexShrink\":0,\"overflow\":\"hidden\",\"position\":\"static\",\"width\":\"100%\",\"height\":\"32px\",\"borderRadius\":\"4px\",\"borderColor\":\"#c9c9c9\",\"borderWidth\":\"1px\",\"borderStyle\":\"solid\",\"fontSize\":\"14px\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{\"placeholder\":\"Email\"},\"classes\":[],\"dataKey\":null,\"element\":\"input\",\"customAttributes\":{\"name\":\"email\",\"required\":\"true\"}},{\"blockId\":\"j267ivzos\",\"children\":[],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"flexShrink\":0,\"overflow\":\"hidden\",\"position\":\"static\",\"top\":\"auto\",\"left\":\"auto\",\"width\":\"100%\",\"height\":\"150px\",\"borderRadius\":\"4px\",\"borderColor\":\"#c9c9c9\",\"borderWidth\":\"1px\",\"borderStyle\":\"solid\",\"fontSize\":\"14px\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{\"placeholder\":\"Message\"},\"classes\":[],\"dataKey\":null,\"element\":\"textarea\",\"customAttributes\":{\"name\":\"message\",\"required\":\"true\"}},{\"blockId\":\"m68wwxf5e\",\"children\":[{\"blockId\":\"0aw9cg9y7\",\"children\":[],\"baseStyles\":{\"color\":\"var(--neutral-white, #FFF)\",\"fontSize\":\"14px\",\"fontWeight\":\"420\",\"height\":\"fit-content\",\"left\":\"auto\",\"letterSpacing\":\"0.28px\",\"lineHeight\":\"115%\",\"minWidth\":\"30px\",\"position\":\"static\",\"top\":\"auto\",\"width\":\"fit-content\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[\"__text_block__\"],\"dataKey\":null,\"element\":\"p\",\"innerHTML\":\"

Submit

\",\"customAttributes\":{}}],\"baseStyles\":{\"background\":\"#171717\",\"borderRadius\":\"4px\",\"display\":\"flex\",\"flexDirection\":\"column\",\"height\":\"fit-content\",\"padding\":\"6px 8px\",\"width\":\"100%\",\"justifyContent\":\"flex-start\",\"alignItems\":\"center\"},\"rawStyles\":{\"flex-shrink\":\"0\",\"hover:background\":\"#383838\",\"transition\":\"all 0.1s ease-out\"},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[\"\"],\"dataKey\":null,\"element\":\"button\",\"customAttributes\":{}}],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"flexShrink\":0,\"overflow\":\"hidden\",\"position\":\"static\",\"top\":\"auto\",\"left\":\"auto\",\"width\":\"100%\",\"paddingLeft\":\"20px\",\"paddingRight\":\"20px\",\"paddingBottom\":\"20px\",\"paddingTop\":\"20px\",\"maxWidth\":\"400px\",\"gap\":\"15px\",\"justifyContent\":\"flex-start\",\"alignItems\":\"center\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[],\"dataKey\":null,\"element\":\"form\",\"customAttributes\":{}}", - "category": "Basic", + "block": "{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"gap\": \"15px\",\"justifyContent\": \"flex-start\",\"left\": \"auto\",\"maxWidth\": \"400px\",\"overflow\": \"hidden\",\"paddingBottom\": \"20px\",\"paddingLeft\": \"20px\",\"paddingRight\": \"20px\",\"paddingTop\": \"20px\",\"position\": \"static\",\"top\": \"auto\",\"width\": \"100%\"},\"blockId\": \"6um6dfg30\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"row\",\"flexGrow\": 0,\"flexShrink\": 1,\"gap\": \"10px\",\"height\": \"fit-content\",\"overflow\": \"hidden\",\"position\": \"relative\",\"width\": \"100%\"},\"blockId\": \"kv3hkfwvl\",\"blockName\": \"container\",\"children\": [{\"attributes\": {\"placeholder\": \"First Name\"},\"baseStyles\": {\"borderColor\": \"#c9c9c9\",\"borderRadius\": \"4px\",\"borderStyle\": \"solid\",\"borderWidth\": \"1px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 1,\"fontSize\": \"14px\",\"height\": \"32px\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"a6gbqj3zl\",\"children\": [],\"classes\": [],\"customAttributes\": {\"name\": \"first_name\",\"required\": \"true\"},\"dataKey\": null,\"element\": \"input\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {\"placeholder\": \"Last Name\"},\"baseStyles\": {\"borderColor\": \"#c9c9c9\",\"borderRadius\": \"4px\",\"borderStyle\": \"solid\",\"borderWidth\": \"1px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 1,\"fontSize\": \"14px\",\"height\": \"32px\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"za6939gew\",\"children\": [],\"classes\": [],\"customAttributes\": {\"name\": \"last_name\",\"required\": \"true\"},\"dataKey\": null,\"element\": \"input\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {\"placeholder\": \"Email\"},\"baseStyles\": {\"borderColor\": \"#c9c9c9\",\"borderRadius\": \"4px\",\"borderStyle\": \"solid\",\"borderWidth\": \"1px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"fontSize\": \"14px\",\"height\": \"32px\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"feg29l91n\",\"children\": [],\"classes\": [],\"customAttributes\": {\"name\": \"email\",\"required\": \"true\"},\"dataKey\": null,\"element\": \"input\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {\"placeholder\": \"Message\"},\"baseStyles\": {\"borderColor\": \"#c9c9c9\",\"borderRadius\": \"4px\",\"borderStyle\": \"solid\",\"borderWidth\": \"1px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"fontSize\": \"14px\",\"height\": \"150px\",\"left\": \"auto\",\"overflow\": \"hidden\",\"position\": \"static\",\"top\": \"auto\",\"width\": \"100%\"},\"blockId\": \"j267ivzos\",\"children\": [],\"classes\": [],\"customAttributes\": {\"name\": \"message\",\"required\": \"true\"},\"dataKey\": null,\"element\": \"textarea\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"#171717\",\"borderRadius\": \"4px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"height\": \"fit-content\",\"justifyContent\": \"flex-start\",\"padding\": \"6px 8px\",\"width\": \"100%\"},\"blockId\": \"m68wwxf5e\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"color\": \"var(--neutral-white, #FFF)\",\"fontSize\": \"14px\",\"fontWeight\": \"420\",\"height\": \"fit-content\",\"left\": \"auto\",\"letterSpacing\": \"0.28px\",\"lineHeight\": \"115%\",\"minWidth\": \"30px\",\"position\": \"static\",\"top\": \"auto\",\"width\": \"fit-content\"},\"blockId\": \"0aw9cg9y7\",\"children\": [],\"classes\": [\"__text_block__\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Submit

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [\"\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"button\",\"mobileStyles\": {},\"rawStyles\": {\"flex-shrink\": \"0\",\"hover:background\": \"#383838\",\"transition\": \"all 0.1s ease-out\"},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"form\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}", + "category": "Basic Forms", "creation": "2024-07-12 00:19:26.657647", "docstatus": 0, "doctype": "Block Template", "idx": 0, - "modified": "2024-08-05 10:08:41.880329", + "modified": "2024-09-19 13:12:17.932679", "modified_by": "Administrator", "name": "Form 3", + "order": 16, "owner": "Administrator", "preview": "/builder_assets/Form 3/form-3.png", + "preview_height": 1, + "preview_width": 1, "template_name": "Form 3" } \ No newline at end of file diff --git a/builder/builder/builder_block_template/heading/heading.json b/builder/builder/builder_block_template/heading/heading.json new file mode 100644 index 00000000..7bc24ce0 --- /dev/null +++ b/builder/builder/builder_block_template/heading/heading.json @@ -0,0 +1,17 @@ +{ + "block": "{\"attributes\": {},\"baseStyles\": {\"fontSize\": \"2rem\",\"fontWeight\": \"bold\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"position\": \"static\",\"width\": \"fit-content\"},\"blockId\": \"sszefcous\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"h1\",\"innerHTML\": \"Heading\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}", + "category": "Typography", + "creation": "2024-09-03 23:01:48.712698", + "docstatus": 0, + "doctype": "Block Template", + "idx": 0, + "modified": "2024-09-19 13:09:29.235170", + "modified_by": "Administrator", + "name": "Heading", + "order": 10, + "owner": "Administrator", + "preview": "/builder_assets/Heading/heading.png", + "preview_height": 1, + "preview_width": 1, + "template_name": "Heading" +} \ No newline at end of file diff --git a/builder/builder/builder_block_template/hero_1/hero_1.json b/builder/builder/builder_block_template/hero_1/hero_1.json new file mode 100644 index 00000000..3ab04ec9 --- /dev/null +++ b/builder/builder/builder_block_template/hero_1/hero_1.json @@ -0,0 +1,17 @@ +{ + "block": "{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"gap\": \"10px\",\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"paddingBottom\": \"0px\",\"paddingTop\": \"0px\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"q7z15h823\",\"blockName\": \"hero\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"gap\": \"10px\",\"justifyContent\": \"center\",\"maxWidth\": \"1200px\",\"overflow\": \"hidden\",\"paddingBottom\": \"200px\",\"paddingTop\": \"200px\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"1w6wekyhh\",\"blockName\": \"wrapper\",\"children\": [{\"attributes\": {\"href\": \"/whats-new\"},\"baseStyles\": {\"alignItems\": \"center\",\"borderColor\": \"#EDEDED\",\"borderRadius\": \"100px\",\"borderStyle\": \"solid\",\"borderWidth\": \"1px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"paddingBottom\": \"4.5px\",\"paddingLeft\": \"8px\",\"paddingRight\": \"8px\",\"paddingTop\": \"4.5px\",\"position\": \"static\"},\"blockId\": \"pml2z8px1\",\"blockName\": \"whats-new\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"color\": \"var(--text-icons-gray-6, #525252)\",\"fontFamily\": \"\",\"fontSize\": \"13px\",\"fontWeight\": \"400\",\"height\": \"fit-content\",\"letterSpacing\": \"0.065px\",\"lineHeight\": \"115%\",\"minWidth\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"l3okvvbip\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

What\\u2019s new

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"color\": \"#171717\",\"fontFamily\": \"\",\"fontSize\": \"48px\",\"fontWeight\": \"bold\",\"height\": \"fit-content\",\"letterSpacing\": \"0.48px\",\"lineHeight\": \"140%\",\"minWidth\": \"10px\",\"textAlign\": \"center\",\"width\": \"fit-content\"},\"blockId\": \"rdxw5m4ba\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"h1\",\"innerHTML\": \"Craft websites with striking style.\",\"mobileStyles\": {\"fontSize\": \"32px\",\"paddingLeft\": \"26px\",\"paddingRight\": \"26px\"},\"rawStyles\": {},\"tabletStyles\": {\"fontSize\": \"40px\"}},{\"attributes\": {},\"baseStyles\": {\"color\": \"#525252\",\"fontFamily\": \"\",\"fontSize\": \"16px\",\"fontWeight\": \"500\",\"height\": \"fit-content\",\"letterSpacing\": \"-0.08px\",\"lineHeight\": \"150%\",\"maxWidth\": \"518px\",\"minWidth\": \"10px\",\"textAlign\": \"center\",\"width\": \"fit-content\"},\"blockId\": \"z09gantla\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Transform your designs into stunning websites with Frappe builder, the ultimate web builder for creative pros.

\",\"mobileStyles\": {\"paddingLeft\": \"30px\",\"paddingRight\": \"30px\"},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"gap\": \"12px\",\"height\": \"fit-content\",\"marginTop\": \"26px\",\"overflow\": \"hidden\",\"width\": \"fit-content\"},\"blockId\": \"cd342xgme\",\"blockName\": \"actions\",\"children\": [{\"attributes\": {\"href\": \"/get-started\"},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"#171717\",\"borderRadius\": \"12px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"height\": \"fit-content\",\"justifyContent\": \"center\",\"paddingBottom\": \"12px\",\"paddingLeft\": \"14px\",\"paddingRight\": \"14px\",\"paddingTop\": \"12px\",\"width\": \"fit-content\"},\"blockId\": \"a6fy7yivx\",\"blockName\": \"get-started\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"color\": \"var(--neutral-white, #FFF)\",\"fontSize\": \"14px\",\"fontWeight\": \"420\",\"height\": \"fit-content\",\"left\": \"auto\",\"letterSpacing\": \"0.28px\",\"lineHeight\": \"115%\",\"minWidth\": \"30px\",\"position\": \"static\",\"top\": \"auto\",\"width\": \"fit-content\"},\"blockId\": \"9vliuvghj\",\"children\": [],\"classes\": [\"__text_block__\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Get Started

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [\"__text_block__\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {\"flex-shrink\": \"0\",\"hover:background\": \"#383838\",\"transition\": \"all 0.1s ease-out\"},\"tabletStyles\": {\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\"}},{\"attributes\": {\"href\": \"/learn-more\"},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"#F3F3F3\",\"borderRadius\": \"12px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"height\": \"fit-content\",\"justifyContent\": \"center\",\"paddingBottom\": \"12px\",\"paddingLeft\": \"14px\",\"paddingRight\": \"14px\",\"paddingTop\": \"12px\",\"width\": \"fit-content\"},\"blockId\": \"xglze3bl4\",\"blockName\": \"learn-more\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"color\": \"#383838\",\"fontSize\": \"14px\",\"fontWeight\": \"420\",\"height\": \"fit-content\",\"left\": \"auto\",\"letterSpacing\": \"0.28px\",\"lineHeight\": \"115%\",\"minWidth\": \"30px\",\"position\": \"static\",\"top\": \"auto\",\"width\": \"fit-content\"},\"blockId\": \"0abw8dupb\",\"children\": [],\"classes\": [\"__text_block__\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Learn More

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [\"__text_block__\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {\"flex-shrink\": \"0\",\"hover:background\": \"#383838\",\"transition\": \"all 0.1s ease-out\"},\"tabletStyles\": {\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\"}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}", + "category": "Structure", + "creation": "2024-09-17 12:24:13.824273", + "docstatus": 0, + "doctype": "Block Template", + "idx": 0, + "modified": "2024-09-19 13:08:25.812814", + "modified_by": "Administrator", + "name": "Hero 1", + "order": 4, + "owner": "Administrator", + "preview": "/builder_assets/Hero 1/hero_1.png", + "preview_height": 2, + "preview_width": 2, + "template_name": "Hero 1" +} \ No newline at end of file diff --git a/builder/builder/builder_block_template/hero_2/hero_2.json b/builder/builder/builder_block_template/hero_2/hero_2.json new file mode 100644 index 00000000..bd6a1803 --- /dev/null +++ b/builder/builder/builder_block_template/hero_2/hero_2.json @@ -0,0 +1,17 @@ +{ + "block": "{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"height\": \"fit-content\",\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"position\": \"relative\",\"width\": \"100%\"},\"blockId\": \"xiuhb9ky8\",\"blockName\": \"hero\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"gap\": \"16px\",\"justifyContent\": \"space-between\",\"maxWidth\": \"1200px\",\"overflow\": \"hidden\",\"paddingBottom\": \"120px\",\"paddingLeft\": \"80px\",\"paddingRight\": \"0px\",\"paddingTop\": \"120px\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"q7z15h823\",\"blockName\": \"container\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"gap\": \"10px\",\"height\": \"fit-content\",\"overflow\": \"hidden\",\"position\": \"relative\",\"width\": \"fit-content\"},\"blockId\": \"vhdziphwj\",\"blockName\": \"container\",\"children\": [{\"attributes\": {\"href\": \"/whats-new\"},\"baseStyles\": {\"alignItems\": \"center\",\"borderColor\": \"#EDEDED\",\"borderRadius\": \"100px\",\"borderStyle\": \"solid\",\"borderWidth\": \"1px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"paddingBottom\": \"4.5px\",\"paddingLeft\": \"8px\",\"paddingRight\": \"8px\",\"paddingTop\": \"4.5px\",\"position\": \"static\",\"width\": \"fit-content\"},\"blockId\": \"m9j6t0ttk\",\"blockName\": \"whats-new\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"color\": \"var(--text-icons-gray-6, #525252)\",\"fontFamily\": \"\",\"fontSize\": \"13px\",\"fontWeight\": \"400\",\"height\": \"fit-content\",\"letterSpacing\": \"0.065px\",\"lineHeight\": \"115%\",\"minWidth\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"8ahpfu1ke\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

What\\u2019s new

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"color\": \"#171717\",\"fontFamily\": \"\",\"fontSize\": \"48px\",\"fontWeight\": \"700\",\"height\": \"fit-content\",\"letterSpacing\": \"0.48px\",\"lineHeight\": \"104%\",\"maxWidth\": \"450px\",\"minWidth\": \"10px\",\"textAlign\": \"left\",\"width\": \"fit-content\"},\"blockId\": \"hhltxd6fl\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"h1\",\"innerHTML\": \"Craft websites with striking style.\",\"mobileStyles\": {\"fontSize\": \"34px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\"},\"rawStyles\": {},\"tabletStyles\": {\"fontSize\": \"40px\",\"maxWidth\": \"300px\"}},{\"attributes\": {},\"baseStyles\": {\"color\": \"#525252\",\"fontFamily\": \"\",\"fontSize\": \"16px\",\"fontWeight\": \"500\",\"height\": \"fit-content\",\"letterSpacing\": \"-0.08px\",\"lineHeight\": \"150%\",\"maxWidth\": \"350px\",\"minWidth\": \"10px\",\"textAlign\": \"left\",\"width\": \"fit-content\"},\"blockId\": \"bjdfr96pk\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Transform your designs into stunning websites with Frappe builder, the ultimate web builder for creative pros.

\",\"mobileStyles\": {\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\"},\"rawStyles\": {},\"tabletStyles\": {\"maxWidth\": \"300px\"}},{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"gap\": \"12px\",\"height\": \"fit-content\",\"marginTop\": \"15px\",\"overflow\": \"hidden\",\"width\": \"fit-content\"},\"blockId\": \"0swftvl8l\",\"blockName\": \"container\",\"children\": [{\"attributes\": {\"href\": \"/get-started\"},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"#171717\",\"borderRadius\": \"12px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"height\": \"fit-content\",\"justifyContent\": \"center\",\"paddingBottom\": \"12px\",\"paddingLeft\": \"14px\",\"paddingRight\": \"14px\",\"paddingTop\": \"12px\",\"width\": \"fit-content\"},\"blockId\": \"vij8cbaa3\",\"blockName\": \"get-started\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"color\": \"var(--neutral-white, #FFF)\",\"fontSize\": \"14px\",\"fontWeight\": \"420\",\"height\": \"fit-content\",\"left\": \"auto\",\"letterSpacing\": \"0.28px\",\"lineHeight\": \"115%\",\"minWidth\": \"30px\",\"position\": \"static\",\"top\": \"auto\",\"width\": \"fit-content\"},\"blockId\": \"si77pxsal\",\"children\": [],\"classes\": [\"__text_block__\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Get Started

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [\"__text_block__\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {\"flex-shrink\": \"0\",\"hover:background\": \"#383838\",\"transition\": \"all 0.1s ease-out\"},\"tabletStyles\": {\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\"}},{\"attributes\": {\"href\": \"/learn-more\"},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"#F3F3F3\",\"borderRadius\": \"12px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"height\": \"fit-content\",\"justifyContent\": \"center\",\"paddingBottom\": \"12px\",\"paddingLeft\": \"14px\",\"paddingRight\": \"14px\",\"paddingTop\": \"12px\",\"width\": \"fit-content\"},\"blockId\": \"ly49oj9jh\",\"blockName\": \"learn-more\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"color\": \"#383838\",\"fontSize\": \"14px\",\"fontWeight\": \"420\",\"height\": \"fit-content\",\"left\": \"auto\",\"letterSpacing\": \"0.28px\",\"lineHeight\": \"115%\",\"minWidth\": \"30px\",\"position\": \"static\",\"top\": \"auto\",\"width\": \"fit-content\"},\"blockId\": \"g2x4nidta\",\"children\": [],\"classes\": [\"__text_block__\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Learn More

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [\"__text_block__\"],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {\"flex-shrink\": \"0\",\"hover:background\": \"#383838\",\"transition\": \"all 0.1s ease-out\"},\"tabletStyles\": {\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\"}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {\"src\": \"/builder_assets/Hero 2/image0ccb3c.webp\"},\"baseStyles\": {\"borderRadius\": \"50px\",\"flexShrink\": 0,\"objectFit\": \"cover\"},\"blockId\": \"5irh6smpx\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"img\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {\"alignItems\": \"flex-start\",\"flexDirection\": \"column\",\"gap\": \"40px\",\"justifyContent\": \"center\",\"paddingBottom\": \"120px\",\"paddingLeft\": \"20px\",\"paddingRight\": \"20px\"},\"rawStyles\": {},\"tabletStyles\": {\"paddingLeft\": \"60px\",\"paddingRight\": \"60px\"}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}", + "category": "Structure", + "creation": "2024-09-17 14:08:36.529314", + "docstatus": 0, + "doctype": "Block Template", + "idx": 0, + "modified": "2024-09-19 13:08:38.218157", + "modified_by": "Administrator", + "name": "Hero 2", + "order": 5, + "owner": "Administrator", + "preview": "/builder_assets/Hero 2/hero_2.png", + "preview_height": 2, + "preview_width": 2, + "template_name": "Hero 2" +} \ No newline at end of file diff --git a/builder/builder/builder_block_template/label/label.json b/builder/builder/builder_block_template/label/label.json new file mode 100644 index 00000000..0e3dbc1d --- /dev/null +++ b/builder/builder/builder_block_template/label/label.json @@ -0,0 +1,14 @@ +{ + "block": "{\"blockId\":\"pjw5akr39\",\"children\":[{\"blockId\":\"xi48r2pme\",\"children\":[],\"baseStyles\":{\"fontSize\":\"14px\",\"width\":\"fit-content\",\"height\":\"fit-content\",\"lineHeight\":\"115%\",\"minWidth\":\"10px\",\"position\":\"static\",\"top\":\"auto\",\"left\":\"auto\",\"fontFamily\":\"\",\"fontWeight\":\"400\",\"letterSpacing\":\"0.07px\",\"color\":\"#7C7C7C\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[],\"dataKey\":null,\"element\":\"label\",\"innerHTML\":\"

Label

\",\"customAttributes\":{\"for\":\"name\"}},{\"blockId\":\"ki103x8w7\",\"children\":[],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"flexShrink\":0,\"overflow\":\"hidden\",\"position\":\"static\",\"width\":\"100%\",\"height\":\"32px\",\"borderRadius\":\"4px\",\"borderColor\":\"#c9c9c9\",\"borderWidth\":\"1px\",\"borderStyle\":\"solid\",\"fontSize\":\"14px\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{\"placeholder\":\"Name\"},\"classes\":[],\"dataKey\":null,\"element\":\"input\",\"customAttributes\":{\"name\":\"name\",\"required\":\"true\"}}],\"baseStyles\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"flexShrink\":0,\"height\":\"fit-content\",\"width\":\"100%\",\"overflow\":\"hidden\",\"position\":\"relative\",\"gap\":\"5px\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{},\"classes\":[],\"dataKey\":null,\"blockName\":\"container\",\"element\":\"div\",\"customAttributes\":{}}", + "category": "Form parts", + "creation": "2024-09-03 23:00:16.365741", + "docstatus": 0, + "doctype": "Block Template", + "idx": 0, + "modified": "2024-09-03 23:00:16.365741", + "modified_by": "Administrator", + "name": "Label", + "owner": "Administrator", + "preview": "/builder_assets/Label/label.png", + "template_name": "Label" +} \ No newline at end of file diff --git a/builder/builder/builder_block_template/navbar_1/navbar_1.json b/builder/builder/builder_block_template/navbar_1/navbar_1.json new file mode 100644 index 00000000..0dfcd882 --- /dev/null +++ b/builder/builder/builder_block_template/navbar_1/navbar_1.json @@ -0,0 +1,17 @@ +{ + "block": "{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"boxShadow\": \"rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 1px 2px 0px, rgba(0, 0, 0, 0.05) 0px 1px 3px 0px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"y2d301ae6\",\"blockName\": \"navbar\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"boxShadow\": \"None\",\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"height\": \"fit-content\",\"justifyContent\": \"space-between\",\"maxWidth\": \"1200px\",\"overflow\": \"hidden\",\"paddingBottom\": \"16px\",\"paddingLeft\": \"36px\",\"paddingRight\": \"36px\",\"paddingTop\": \"16px\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"0vtlpu03s\",\"blockName\": \"container\",\"children\": [{\"attributes\": {\"href\": \"/home\"},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"height\": \"fit-content\",\"overflow\": \"hidden\",\"width\": \"fit-content\"},\"blockId\": \"0jmcvjcsj\",\"blockName\": \"container\",\"children\": [{\"attributes\": {\"src\": \"/builder_assets/Navbar 1/imageca9535.webp\"},\"baseStyles\": {\"flexShrink\": 0,\"objectFit\": \"cover\",\"width\": \"90px\"},\"blockId\": \"bsrrts4ka\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"img\",\"mobileStyles\": {\"display\": \"none\"},\"rawStyles\": {},\"tabletStyles\": {\"width\": \"80px\"}},{\"attributes\": {\"src\": \"/builder_assets/Navbar 1/Logo.webp\"},\"baseStyles\": {\"display\": \"none\",\"flexShrink\": 0,\"objectFit\": \"cover\"},\"blockId\": \"hoqwsctwv\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"img\",\"mobileStyles\": {\"display\": \"flex\",\"width\": \"30px\"},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"gap\": \"4px\",\"height\": \"fit-content\",\"overflow\": \"hidden\",\"width\": \"fit-content\"},\"blockId\": \"9m6ziw1vz\",\"children\": [{\"attributes\": {\"href\": \"/home\"},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"ek6bh4o1y\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Home

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {\"padding\": \"10px\"}},{\"attributes\": {\"href\": \"/product\"},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"30sxa7qpb\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Product

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {\"padding\": \"10px\"}},{\"attributes\": {\"href\": \"/features\"},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"oxe8p96l8\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Features

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {\"padding\": \"10px\"}},{\"attributes\": {\"href\": \"/about\"},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"490v0w3do\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

About us

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {\"padding\": \"10px\"}},{\"attributes\": {\"href\": \"/pricing\"},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"tfp4aede9\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Pricing

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {\"padding\": \"10px\"}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"nav\",\"mobileStyles\": {\"__last_display\": \"flex\",\"display\": \"none\"},\"rawStyles\": {},\"tabletStyles\": {\"gap\": \"0px\"}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"gap\": \"8px\",\"height\": \"fit-content\",\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"width\": \"fit-content\"},\"blockId\": \"9s9e7v41r\",\"blockName\": \"container\",\"children\": [{\"attributes\": {\"href\": \"/login\"},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"zf0y11fvx\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Log in

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {\"padding\": \"10px\"}},{\"attributes\": {\"href\": \"/get-started\"},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"color(display-p3 0.090 0.090 0.090)\",\"borderRadius\": \"10px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\"},\"blockId\": \"tlh5pzpsg\",\"blockName\": \"container\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"color\": \"color(display-p3 1.000 1.000 1.000)\",\"fontFamily\": \"\",\"fontSize\": \"16px\",\"fontWeight\": \"500\",\"height\": \"fit-content\",\"letterSpacing\": \"0.005em\",\"lineHeight\": \"115%\",\"minWidth\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"tmf6exowl\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Get started

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {\"__last_display\": \"flex\",\"display\": \"none\"},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"__last_display\": \"flex\",\"display\": \"none\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"height\": \"fit-content\",\"overflow\": \"hidden\",\"width\": \"fit-content\"},\"blockId\": \"c70gdumv2\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"height\": \"18px\",\"width\": \"18px\"},\"blockId\": \"l1fodmqkq\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"innerHTML\": \"\\n\\n\",\"mobileStyles\": {},\"originalElement\": \"__raw_html__\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"button\",\"mobileStyles\": {\"display\": \"flex\",\"paddingBottom\": \"7px\",\"paddingLeft\": \"7px\",\"paddingRight\": \"7px\",\"paddingTop\": \"7px\"},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {\"paddingLeft\": \"16px\",\"paddingRight\": \"16px\"},\"rawStyles\": {},\"tabletStyles\": {\"paddingLeft\": \"16px\",\"paddingRight\": \"16px\"}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"editable\": false,\"element\": \"header\",\"mobileStyles\": {\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\"},\"rawStyles\": {},\"tabletStyles\": {\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\"}}", + "category": "Structure", + "creation": "2024-09-17 11:48:14.626645", + "docstatus": 0, + "doctype": "Block Template", + "idx": 0, + "modified": "2024-09-19 13:08:11.964111", + "modified_by": "Administrator", + "name": "Navbar 1", + "order": 2, + "owner": "Administrator", + "preview": "/builder_assets/Navbar 1/navbar_1.png", + "preview_height": 1, + "preview_width": 2, + "template_name": "Navbar 1" +} \ No newline at end of file diff --git a/builder/builder/builder_block_template/navbar_2/navbar_2.json b/builder/builder/builder_block_template/navbar_2/navbar_2.json new file mode 100644 index 00000000..b9337b86 --- /dev/null +++ b/builder/builder/builder_block_template/navbar_2/navbar_2.json @@ -0,0 +1,17 @@ +{ + "block": "{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"boxShadow\": \"rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 1px 2px 0px, rgba(0, 0, 0, 0.05) 0px 1px 3px 0px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"go755hiqz\",\"blockName\": \"hero\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"boxShadow\": \"None\",\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"justifyContent\": \"space-between\",\"maxWidth\": \"1200px\",\"overflow\": \"hidden\",\"paddingBottom\": \"16px\",\"paddingLeft\": \"36px\",\"paddingRight\": \"36px\",\"paddingTop\": \"16px\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"kzbg33fba\",\"children\": [{\"attributes\": {\"href\": \"/home\"},\"baseStyles\": {\"alignItems\": \"center\",\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"gap\": \"40px\",\"height\": \"fit-content\",\"justifyContent\": \"flex-start\",\"overflow\": \"hidden\",\"width\": \"fit-content\"},\"blockId\": \"zknkfszm7\",\"blockName\": \"container\",\"children\": [{\"attributes\": {\"src\": \"/builder_assets/Navbar 2/Logo.webp\"},\"baseStyles\": {\"flexShrink\": 0,\"height\": \"30px\",\"objectFit\": \"cover\",\"width\": \"30px\"},\"blockId\": \"uew56afyp\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"img\",\"mobileStyles\": {\"display\": \"flex\"},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"gap\": \"4px\",\"height\": \"fit-content\",\"overflow\": \"hidden\",\"width\": \"fit-content\"},\"blockId\": \"qrq7fgnw3\",\"children\": [{\"attributes\": {\"href\": \"/home\"},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"onijv3a3m\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Home

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {\"padding\": \"10px\"}},{\"attributes\": {\"href\": \"/product\"},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"28gj17j17\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Product

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {\"padding\": \"10px\"}},{\"attributes\": {\"href\": \"/features\"},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"geznu05ij\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Features

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {\"padding\": \"10px\"}},{\"attributes\": {\"href\": \"/about\"},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"mp4q703ic\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

About us

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {\"padding\": \"10px\"}},{\"attributes\": {\"href\": \"/pricing\"},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"dbr8zdxrg\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Pricing

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {\"padding\": \"10px\"}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"nav\",\"mobileStyles\": {\"__last_display\": \"flex\",\"display\": \"none\"},\"rawStyles\": {},\"tabletStyles\": {\"gap\": \"0px\"}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {\"gap\": \"30px\"}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"gap\": \"8px\",\"height\": \"fit-content\",\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"width\": \"fit-content\"},\"blockId\": \"s2m739lp7\",\"blockName\": \"container\",\"children\": [{\"attributes\": {\"href\": \"/login\"},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"l9v23eaw4\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"innerHTML\": \"

Log in

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {\"padding\": \"10px\"}},{\"attributes\": {\"href\": \"/get-started\"},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"color(display-p3 0.090 0.090 0.090)\",\"borderRadius\": \"10px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"12px\",\"paddingRight\": \"12px\",\"paddingTop\": \"10px\"},\"blockId\": \"ni08tqcr9\",\"blockName\": \"container\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"color\": \"color(display-p3 1.000 1.000 1.000)\",\"fontFamily\": \"\",\"fontSize\": \"16px\",\"fontWeight\": \"500\",\"height\": \"fit-content\",\"letterSpacing\": \"0.005em\",\"lineHeight\": \"115%\",\"minWidth\": \"10px\",\"width\": \"fit-content\"},\"blockId\": \"98oddel44\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Get started

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"a\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {\"__last_display\": \"flex\",\"display\": \"none\"},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"__last_display\": \"flex\",\"display\": \"none\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"height\": \"fit-content\",\"overflow\": \"hidden\",\"width\": \"fit-content\"},\"blockId\": \"vydncgo65\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"height\": \"18px\",\"width\": \"18px\"},\"blockId\": \"ae7k6drur\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"innerHTML\": \"\\n\\n\",\"mobileStyles\": {},\"originalElement\": \"__raw_html__\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"button\",\"mobileStyles\": {\"display\": \"flex\",\"paddingBottom\": \"7px\",\"paddingLeft\": \"7px\",\"paddingRight\": \"7px\",\"paddingTop\": \"7px\"},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": {\"key\": \"\",\"property\": \"\",\"type\": \"\"},\"element\": \"div\",\"mobileStyles\": {\"paddingLeft\": \"16px\",\"paddingRight\": \"16px\"},\"rawStyles\": {},\"tabletStyles\": {\"paddingLeft\": \"16px\",\"paddingRight\": \"16px\"}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": {\"key\": \"\",\"property\": \"\",\"type\": \"\"},\"element\": \"header\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}", + "category": "Structure", + "creation": "2024-09-17 11:44:33.077409", + "docstatus": 0, + "doctype": "Block Template", + "idx": 0, + "modified": "2024-09-29 21:08:20.795780", + "modified_by": "Administrator", + "name": "Navbar 2", + "order": 3, + "owner": "Administrator", + "preview": "/builder_assets/Navbar 2/navbar_2.png", + "preview_height": 1, + "preview_width": 2, + "template_name": "Navbar 2" +} \ No newline at end of file diff --git a/builder/builder/builder_block_template/paragraph/paragraph.json b/builder/builder/builder_block_template/paragraph/paragraph.json new file mode 100644 index 00000000..644d3119 --- /dev/null +++ b/builder/builder/builder_block_template/paragraph/paragraph.json @@ -0,0 +1,17 @@ +{ + "block": "{\"attributes\": {},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"position\": \"static\",\"width\": \"fit-content\"},\"blockId\": \"z5hw6riip\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

\\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\\\"

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}", + "category": "Typography", + "creation": "2024-09-03 23:03:27.782586", + "docstatus": 0, + "doctype": "Block Template", + "idx": 0, + "modified": "2024-09-19 13:09:32.402504", + "modified_by": "Administrator", + "name": "Paragraph", + "order": 11, + "owner": "Administrator", + "preview": "/builder_assets/Paragraph/paragraph.png", + "preview_height": 1, + "preview_width": 1, + "template_name": "Paragraph" +} \ No newline at end of file diff --git a/builder/builder/builder_block_template/quick_grid/quick_grid.json b/builder/builder/builder_block_template/quick_grid/quick_grid.json new file mode 100644 index 00000000..9bbabd85 --- /dev/null +++ b/builder/builder/builder_block_template/quick_grid/quick_grid.json @@ -0,0 +1,17 @@ +{ + "block": "{\"attributes\": {},\"baseStyles\": {\"display\": \"grid\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"gap\": \"20px\",\"gridTemplateColumns\": \"repeat(2, minmax(200px, 1fr))\",\"height\": \"800px\",\"overflow\": \"hidden\",\"padding\": \"20px\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"9jln72b1t\",\"blockName\": \"grid\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"background\": \"#e2e2e2\",\"borderRadius\": \"10px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"height\": \"100%\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"auto\"},\"blockId\": \"vwf92j0d4\",\"blockName\": \"cell-1\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"background\": \"#e2e2e2\",\"borderRadius\": \"10px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"height\": \"100%\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"auto\"},\"blockId\": \"2nsk5x26t\",\"blockName\": \"cell-2\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"background\": \"#e2e2e2\",\"borderRadius\": \"10px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"height\": \"100%\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"auto\"},\"blockId\": \"z19h14huq\",\"blockName\": \"cell-3\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"background\": \"#e2e2e2\",\"borderRadius\": \"10px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"height\": \"100%\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"auto\"},\"blockId\": \"7ya6tzprf\",\"blockName\": \"cell-4\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}", + "category": "Structure", + "creation": "2024-09-19 13:01:06.663112", + "docstatus": 0, + "doctype": "Block Template", + "idx": 0, + "modified": "2024-09-19 13:09:25.446243", + "modified_by": "Administrator", + "name": "Quick Grid", + "order": 9, + "owner": "Administrator", + "preview": "/builder_assets/Quick Grid/quick-grid.png", + "preview_height": 1, + "preview_width": 1, + "template_name": "Quick Grid" +} \ No newline at end of file diff --git a/builder/builder/builder_block_template/quick_stack/quick_stack.json b/builder/builder/builder_block_template/quick_stack/quick_stack.json new file mode 100644 index 00000000..3f3216bc --- /dev/null +++ b/builder/builder/builder_block_template/quick_stack/quick_stack.json @@ -0,0 +1,17 @@ +{ + "block": "{\"attributes\": {},\"baseStyles\": {\"background\": \"#ffffff\",\"display\": \"flex\",\"flexDirection\": \"row\",\"flexShrink\": 0,\"gap\": \"20px\",\"height\": \"600px\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"1w8x9wtvc\",\"blockName\": \"Stack\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"#e2e2e2\",\"borderRadius\": \"10px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 1,\"height\": \"100%\",\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"xh8ticga0\",\"blockName\": \"container\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 1,\"gap\": \"20px\",\"height\": \"100%\",\"overflow\": \"hidden\",\"position\": \"relative\",\"width\": \"100%\"},\"blockId\": \"dqkd8jjr8\",\"blockName\": \"container\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"#e2e2e2\",\"borderRadius\": \"10px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 1,\"height\": \"100%\",\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"8xas835ea\",\"blockName\": \"container\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"#e2e2e2\",\"borderRadius\": \"10px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 1,\"height\": \"100%\",\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"position\": \"static\",\"width\": \"100%\"},\"blockId\": \"sntr9rcir\",\"blockName\": \"container\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"editable\": false,\"element\": \"div\",\"mobileStyles\": {\"flexDirection\": \"column\"},\"rawStyles\": {},\"tabletStyles\": {}}", + "category": "Structure", + "creation": "2024-09-03 22:36:28.203260", + "docstatus": 0, + "doctype": "Block Template", + "idx": 0, + "modified": "2024-09-19 13:35:31.530861", + "modified_by": "Administrator", + "name": "Quick Stack", + "order": 8, + "owner": "Administrator", + "preview": "/builder_assets/Quick Stack/quick-stack.png", + "preview_height": 1, + "preview_width": 1, + "template_name": "Quick Stack" +} \ No newline at end of file diff --git a/builder/builder/builder_block_template/testimonial_1/testimonial_1.json b/builder/builder/builder_block_template/testimonial_1/testimonial_1.json new file mode 100644 index 00000000..07ae9762 --- /dev/null +++ b/builder/builder/builder_block_template/testimonial_1/testimonial_1.json @@ -0,0 +1,17 @@ +{ + "block": "{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"display\": \"flex\",\"flexDirection\": \"column\",\"flexShrink\": 0,\"height\": \"fit-content\",\"justifyContent\": \"center\",\"overflow\": \"hidden\",\"width\": \"100%\"},\"blockId\": \"80gz6xaq2\",\"blockName\": \"testimonial-wrapper\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"rgb(255, 255, 255)\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"justifyContent\": \"space-between\",\"maxWidth\": \"1200px\",\"paddingBottom\": \"70px\",\"paddingLeft\": \"40px\",\"paddingRight\": \"40px\",\"paddingTop\": \"70px\",\"width\": \"100%\"},\"blockId\": \"uoi8pxczq\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"rgb(255, 255, 255)\",\"borderColor\": \"rgb(237, 237, 237)\",\"borderRadius\": \"34px\",\"borderWidth\": \"1px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"gap\": \"6px\",\"justifyContent\": \"center\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"10px\",\"paddingRight\": \"10px\",\"paddingTop\": \"10px\"},\"blockId\": \"wfk91yvhp\",\"blockName\": \"prev-button\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"height\": \"21px\",\"width\": \"20px\"},\"blockId\": \"iew39254n\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"innerHTML\": \"\\n\\n\",\"mobileStyles\": {},\"originalElement\": \"__raw_html__\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"button\",\"innerHTML\": \"\",\"mobileStyles\": {\"paddingBottom\": \"5px\",\"paddingLeft\": \"5px\",\"paddingRight\": \"5px\",\"paddingTop\": \"5px\"},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"gap\": \"72px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\"},\"blockId\": \"eakp683av\",\"blockName\": \"content\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"gap\": \"40px\",\"justifyContent\": \"flex-start\",\"maxWidth\": \"560px\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\"},\"blockId\": \"g44wdzdfd\",\"blockName\": \"testimony\",\"children\": [{\"attributes\": {\"src\": \"/builder_assets/Testimonial 1/imagebab78c.webp\"},\"baseStyles\": {\"background\": \"url(image.png)\",\"flexShrink\": 0,\"height\": \"35px\",\"objectFit\": \"cover\",\"width\": \"104px\"},\"blockId\": \"vnpylp2pu\",\"blockName\": \"logo\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"img\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(23, 23, 23)\",\"display\": \"flex\",\"fontSize\": \"24px\",\"letterSpacing\": \"0px\",\"lineHeight\": \"139.9999976158142%\",\"textAlign\": \"center\"},\"blockId\": \"7ps8gs1gs\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

A world-class design system project is currently underway. I've been fortunate enough to beta test it. Keep tracking this - it might turn into the perfect design system for your upcoming side project or new SaaS platform.

\",\"mobileStyles\": {\"color\": \"color(display-p3 0.090 0.090 0.090)\",\"fontSize\": \"18px\",\"fontWeight\": \"500\",\"letterSpacing\": \"-0.01em\",\"lineHeight\": \"150%\",\"textAlign\": \"center\"},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"borderRadius\": \"0px\",\"display\": \"flex\",\"flexDirection\": \"column\",\"gap\": \"4px\",\"justifyContent\": \"flex-start\",\"paddingBottom\": \"0px\",\"paddingLeft\": \"0px\",\"paddingRight\": \"0px\",\"paddingTop\": \"0px\"},\"blockId\": \"i88odt6fm\",\"blockName\": \"testimony-by\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(23, 23, 23)\",\"display\": \"flex\",\"fontSize\": \"18px\",\"letterSpacing\": \"1%\",\"lineHeight\": \"114.99999761581421%\",\"textAlign\": \"center\"},\"blockId\": \"b5ohij9kn\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Lynn Tanner

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"color\": \"rgb(82, 82, 82)\",\"display\": \"flex\",\"fontSize\": \"14px\",\"letterSpacing\": \"0%\",\"lineHeight\": \"150%\",\"textAlign\": \"center\"},\"blockId\": \"fdjz2ork4\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Chief Technology Officer, Notion

\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}},{\"attributes\": {},\"baseStyles\": {\"alignItems\": \"center\",\"background\": \"rgb(255, 255, 255)\",\"borderColor\": \"rgb(237, 237, 237)\",\"borderRadius\": \"100px\",\"borderWidth\": \"1px\",\"display\": \"flex\",\"flexDirection\": \"row\",\"gap\": \"6px\",\"justifyContent\": \"center\",\"paddingBottom\": \"10px\",\"paddingLeft\": \"10px\",\"paddingRight\": \"10px\",\"paddingTop\": \"10px\"},\"blockId\": \"nq0wglh9f\",\"blockName\": \"next-button\",\"children\": [{\"attributes\": {},\"baseStyles\": {\"height\": \"21px\",\"width\": \"20px\"},\"blockId\": \"zblz7t7ov\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"innerHTML\": \"\\n\\n\",\"mobileStyles\": {},\"originalElement\": \"__raw_html__\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"button\",\"innerHTML\": \"\",\"mobileStyles\": {\"paddingBottom\": \"5px\",\"paddingLeft\": \"5px\",\"paddingRight\": \"5px\",\"paddingTop\": \"5px\"},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"section\",\"innerHTML\": \"\",\"mobileStyles\": {\"paddingLeft\": \"30px\",\"paddingRight\": \"30px\"},\"originalElement\": \"\",\"rawStyles\": {},\"tabletStyles\": {}}],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"div\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}", + "category": "Structure", + "creation": "2024-09-18 19:38:39.294613", + "docstatus": 0, + "doctype": "Block Template", + "idx": 0, + "modified": "2024-10-14 00:05:16.066806", + "modified_by": "Administrator", + "name": "Testimonial 1", + "order": 6, + "owner": "Administrator", + "preview": "/builder_assets/Testimonial 1/testimonial_1.png", + "preview_height": 2, + "preview_width": 2, + "template_name": "Testimonial 1" +} \ No newline at end of file diff --git a/builder/builder/builder_block_template/text_link/text_link.json b/builder/builder/builder_block_template/text_link/text_link.json new file mode 100644 index 00000000..a6792431 --- /dev/null +++ b/builder/builder/builder_block_template/text_link/text_link.json @@ -0,0 +1,17 @@ +{ + "block": "{\"attributes\": {},\"baseStyles\": {\"fontSize\": \"16px\",\"height\": \"fit-content\",\"lineHeight\": \"1.4\",\"minWidth\": \"10px\",\"position\": \"static\",\"width\": \"fit-content\"},\"blockId\": \"z5hw6riip\",\"children\": [],\"classes\": [],\"customAttributes\": {},\"dataKey\": null,\"element\": \"p\",\"innerHTML\": \"

Hi, click me 

\",\"mobileStyles\": {},\"rawStyles\": {},\"tabletStyles\": {}}", + "category": "Typography", + "creation": "2024-09-03 23:08:18.568344", + "docstatus": 0, + "doctype": "Block Template", + "idx": 0, + "modified": "2024-09-19 13:09:34.940528", + "modified_by": "Administrator", + "name": "Text Link", + "order": 12, + "owner": "Administrator", + "preview": "/builder_assets/Text Link/text-link.png", + "preview_height": 1, + "preview_width": 1, + "template_name": "Text Link" +} \ No newline at end of file diff --git a/builder/builder/builder_block_template/video/video.json b/builder/builder/builder_block_template/video/video.json index 98fbdebf..721f4934 100644 --- a/builder/builder/builder_block_template/video/video.json +++ b/builder/builder/builder_block_template/video/video.json @@ -1,11 +1,11 @@ { "block": "{\"blockId\":\"69xrb0gy4\",\"children\":[],\"baseStyles\":{\"objectFit\":\"cover\",\"width\":\"550px\"},\"rawStyles\":{},\"mobileStyles\":{},\"tabletStyles\":{},\"attributes\":{\"autoplay\":\"\",\"muted\":\"\",\"src\":\"https://cdn.free-stock.video/2152023/wave-nature-waves-ocean-water-sand-water-23350-small.mp4\"},\"classes\":[],\"dataKey\":null,\"element\":\"video\",\"customAttributes\":{}}", - "category": "Basic", + "category": "Media", "creation": "2024-07-10 23:09:39.980242", "docstatus": 0, "doctype": "Block Template", "idx": 0, - "modified": "2024-07-12 09:34:20.763472", + "modified": "2024-09-03 22:16:17.757615", "modified_by": "Administrator", "name": "Video", "owner": "Administrator", diff --git a/builder/builder/doctype/block_template/block_template.json b/builder/builder/doctype/block_template/block_template.json index 0c469df7..e1b8e006 100644 --- a/builder/builder/doctype/block_template/block_template.json +++ b/builder/builder/doctype/block_template/block_template.json @@ -9,7 +9,10 @@ "template_name", "block", "preview", - "category" + "preview_width", + "preview_height", + "category", + "order" ], "fields": [ { @@ -39,13 +42,31 @@ "fieldtype": "Select", "in_list_view": 1, "label": "Category", - "options": "Basic\nStructure" + "options": "Structure\nBasic\nTypography\nBasic Forms\nForm parts\nMedia\nAdvanced", + "search_index": 1 + }, + { + "default": "1", + "fieldname": "preview_width", + "fieldtype": "Int", + "label": "Preview Width" + }, + { + "default": "1", + "fieldname": "preview_height", + "fieldtype": "Int", + "label": "Preview Height" + }, + { + "fieldname": "order", + "fieldtype": "Int", + "label": "Order" } ], "in_create": 1, "index_web_pages_for_search": 1, "links": [], - "modified": "2024-08-22 21:48:45.695550", + "modified": "2024-09-19 13:07:00.935349", "modified_by": "Administrator", "module": "Builder", "name": "Block Template", diff --git a/builder/builder/doctype/block_template/block_template.py b/builder/builder/doctype/block_template/block_template.py index ac82d6d6..02d51d3b 100644 --- a/builder/builder/doctype/block_template/block_template.py +++ b/builder/builder/doctype/block_template/block_template.py @@ -11,6 +11,7 @@ from frappe.modules.export_file import export_to_files from builder.builder.doctype.builder_page.builder_page import get_template_assets_folder_path +from builder.utils import copy_img_to_asset_folder class BlockTemplate(Document): @@ -26,6 +27,11 @@ def on_update(self): self.preview = f"/builder_assets/{self.name}/{self.preview.split('/')[-1]}" self.db_set("preview", self.preview) + block = frappe.parse_json(self.block) + if block: + copy_img_to_asset_folder(block, self) + self.db_set("block", frappe.as_json(block, indent=None)) + export_to_files( record_list=[ [ diff --git a/builder/builder/doctype/builder_client_script/builder_client_script.py b/builder/builder/doctype/builder_client_script/builder_client_script.py index 30d84688..a5bd6516 100644 --- a/builder/builder/doctype/builder_client_script/builder_client_script.py +++ b/builder/builder/doctype/builder_client_script/builder_client_script.py @@ -4,9 +4,11 @@ import os import frappe +from csscompressor import compress from frappe.model.document import Document from frappe.modules.export_file import export_to_files from frappe.utils import get_files_path +from jsmin import jsmin class BuilderClientScript(Document): @@ -32,7 +34,12 @@ def update_script_file(self): file_path = get_files_path(f"{folder_name}/{file_name}") os.makedirs(os.path.dirname(file_path), exist_ok=True) with open(file_path, "w") as f: - f.write(self.script) + script = self.script or "" + if script_type == "JavaScript": + script = jsmin(script, quote_chars="'\"`") + if script_type == "CSS": + script = compress(script) + f.write(script) public_url = f"/files/{folder_name}/{file_name}?v={frappe.generate_hash(length=10)}" self.db_set("public_url", public_url, commit=True) diff --git a/builder/builder/doctype/builder_client_script/patches/trigger_asset_compression.py b/builder/builder/doctype/builder_client_script/patches/trigger_asset_compression.py new file mode 100644 index 00000000..fbac24c6 --- /dev/null +++ b/builder/builder/doctype/builder_client_script/patches/trigger_asset_compression.py @@ -0,0 +1,11 @@ +import frappe + + +def execute(): + for doc in frappe.get_all("Builder Client Script"): + script_doc = frappe.get_doc("Builder Client Script", doc.name) + try: + script_doc.on_update() # this will compress script and save it to file + except Exception as e: + print(f"Error compressing script for {script_doc.name}: {e}") + continue diff --git a/builder/builder/doctype/builder_page/builder_page.json b/builder/builder/doctype/builder_page/builder_page.json index c08c929b..3c8e69a4 100644 --- a/builder/builder/doctype/builder_page/builder_page.json +++ b/builder/builder/doctype/builder_page/builder_page.json @@ -32,7 +32,10 @@ "page_title", "meta_description", "meta_image", - "set_meta_tags" + "set_meta_tags", + "options_tab", + "authenticated_access", + "disable_indexing" ], "fields": [ { @@ -172,11 +175,30 @@ { "fieldname": "column_break_ymjg", "fieldtype": "Column Break" + }, + { + "fieldname": "options_tab", + "fieldtype": "Tab Break", + "label": "Options" + }, + { + "default": "0", + "description": "Only allow logged-in users to view this page.", + "fieldname": "authenticated_access", + "fieldtype": "Check", + "label": "Authenticated Access" + }, + { + "default": "0", + "description": "Prevent search engines from indexing this page", + "fieldname": "disable_indexing", + "fieldtype": "Check", + "label": "Disable Indexing" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2024-07-02 18:13:15.327787", + "modified": "2024-09-02 14:20:24.457766", "modified_by": "Administrator", "module": "Builder", "name": "Builder Page", diff --git a/builder/builder/doctype/builder_page/builder_page.py b/builder/builder/doctype/builder_page/builder_page.py index d4cdf7d3..1ee8a6d7 100644 --- a/builder/builder/doctype/builder_page/builder_page.py +++ b/builder/builder/doctype/builder_page/builder_page.py @@ -2,24 +2,16 @@ # For license information, please see license.txt import os -import re import shutil -from io import BytesIO -from urllib.parse import unquote import bs4 as bs import frappe import frappe.utils -import requests -from frappe.core.doctype.file.file import get_local_image -from frappe.core.doctype.file.utils import delete_file -from frappe.model.document import Document from frappe.modules import scrub from frappe.modules.export_file import export_to_files from frappe.utils.caching import redis_cache from frappe.utils.jinja import render_template from frappe.utils.safe_exec import is_safe_exec_enabled, safe_exec -from frappe.utils.telemetry import capture from frappe.website.page_renderers.document_page import DocumentPage from frappe.website.path_resolver import evaluate_dynamic_routes from frappe.website.path_resolver import resolve_path as original_resolve_path @@ -27,12 +19,20 @@ from frappe.website.utils import clear_cache from frappe.website.website_generator import WebsiteGenerator from jinja2.exceptions import TemplateSyntaxError -from PIL import Image from werkzeug.routing import Rule from builder.hooks import builder_path from builder.html_preview_image import generate_preview -from builder.utils import safer_exec +from builder.utils import ( + ColonRule, + camel_case_to_kebab_case, + copy_img_to_asset_folder, + escape_single_quotes, + execute_script, + get_builder_page_preview_paths, + get_template_assets_folder_path, + is_component_used, +) MOBILE_BREAKPOINT = 576 TABLET_BREAKPOINT = 768 @@ -44,16 +44,27 @@ def can_render(self): if page := find_page_with_path(self.path): self.doctype = "Builder Page" self.docname = page + self.validate_access() return True for d in get_web_pages_with_dynamic_routes(): - if evaluate_dynamic_routes([Rule(f"/{d.route}", endpoint=d.name)], self.path): - self.doctype = "Builder Page" - self.docname = d.name - return True + try: + if evaluate_dynamic_routes([ColonRule(f"/{d.route}", endpoint=d.name)], self.path): + self.doctype = "Builder Page" + self.docname = d.name + self.validate_access() + return True + except ValueError: + return False return False + def validate_access(self): + if self.docname: + self.doc = frappe.get_cached_doc(self.doctype, self.docname) + if self.doc.authenticated_access and frappe.session.user == "Guest": + raise frappe.PermissionError("Please log in to view this page.") + class BuilderPage(WebsiteGenerator): def onload(self): @@ -83,15 +94,22 @@ def before_insert(self): if not self.page_title: self.page_title = "My Page" if not self.route: - self.route = ( - f"pages/{camel_case_to_kebab_case(self.page_title, True)}-{frappe.generate_hash(length=4)}" - ) + if not self.name: + self.autoname() + self.route = f"pages/{self.name}" def on_update(self): + if self.has_value_changed("route"): + if ":" in self.route or "<" in self.route: + self.db_set("dynamic_route", 1) + else: + self.db_set("dynamic_route", 0) + if ( self.has_value_changed("dynamic_route") or self.has_value_changed("route") or self.has_value_changed("published") + or self.has_value_changed("disable_indexing") ): self.clear_route_cache() @@ -131,8 +149,9 @@ def add_comment(self, comment_type="Comment", text=None, comment_email=None, com ) @frappe.whitelist() - def publish(self, **kwargs): - frappe.form_dict.update(kwargs) + def publish(self, route_variables=None): + if route_variables: + frappe.form_dict.update(frappe.parse_json(route_variables or "{}")) self.published = 1 if self.draft_blocks: self.blocks = self.draft_blocks @@ -155,6 +174,7 @@ def unpublish(self, **kwargs): def get_context(self, context): # delete default favicon del context.favicon + context.disable_indexing = self.disable_indexing page_data = self.get_page_data() if page_data.get("title"): context.title = page_data.get("page_title") @@ -169,10 +189,12 @@ def get_context(self, context): blocks = self.draft_blocks content, style, fonts = get_block_html(blocks) + self.set_custom_font(context, fonts) context.fonts = fonts context.content = content context.style = render_template(style, page_data) context.editor_link = f"/{builder_path}/page/{self.name}" + context.page_name = self.name if self.dynamic_route and hasattr(frappe.local, "request"): context.base_url = frappe.utils.get_url(frappe.local.request.path or self.route) @@ -183,7 +205,6 @@ def get_context(self, context): context.update(page_data) self.set_meta_tags(context=context, page_data=page_data) self.set_favicon(context) - try: context["content"] = render_template(context.content, context) except TemplateSyntaxError: @@ -228,17 +249,13 @@ def set_style_and_script(self, context): context.setdefault("styles", []).append(builder_settings.style_public_url) @frappe.whitelist() - def get_page_data(self, args=None): - if args: - args = frappe.parse_json(args) - frappe.form_dict.update(args) + def get_page_data(self, route_variables=None): + if route_variables: + frappe.form_dict.update(frappe.parse_json(route_variables or "{}")) page_data = frappe._dict() if self.page_data_script: _locals = dict(data=frappe._dict()) - if is_safe_exec_enabled(): - safe_exec(self.page_data_script, None, _locals, script_filename=self.name) - else: - safer_exec(self.page_data_script, None, _locals, script_filename=self.name) + execute_script(self.page_data_script, _locals, self.name) page_data.update(_locals["data"]) return page_data @@ -250,6 +267,15 @@ def generate_page_preview_image(self, html=None): ) self.db_set("preview", public_path, commit=True, update_modified=False) + def set_custom_font(self, context, font_map): + user_fonts = frappe.get_all( + "User Font", fields=["font_name", "font_file"], filters={"name": ("in", list(font_map.keys()))} + ) + if user_fonts: + context.custom_fonts = user_fonts + for font in user_fonts: + del font_map[font.font_name] + def save_as_template(page_doc: BuilderPage): # move all assets to www/builder_assets/{page_name} @@ -354,7 +380,7 @@ def get_tag(block, soup, data_key=None): tag[key] = value if block.get("baseStyles", {}): - style_class = f"frappe-builder-{frappe.generate_hash(length=8)}" + style_class = f"fb-{frappe.generate_hash(length=8)}" base_styles = block.get("baseStyles", {}) mobile_styles = block.get("mobileStyles", {}) tablet_styles = block.get("tabletStyles", {}) @@ -378,7 +404,7 @@ def get_tag(block, soup, data_key=None): ) classes.insert(0, style_class) - tag.attrs["class"] = get_class(classes) + tag.attrs["class"] = " ".join(classes) innerContent = block.get("innerHTML") if innerContent: @@ -432,19 +458,6 @@ def get_style(style_obj): ) -def get_class(class_list): - return " ".join(class_list) - - -def camel_case_to_kebab_case(text, remove_spaces=False): - if not text: - return "" - text = re.sub(r"(? str: - # to load preview without publishing - frappe.form_dict.update(kwarg) - renderer = BuilderPageRenderer(path="") - renderer.docname = page - renderer.doctype = "Builder Page" - frappe.flags.show_preview = True - frappe.local.no_cache = 1 - renderer.init_context() - response = renderer.render() - page = frappe.get_cached_doc("Builder Page", page) - frappe.enqueue_doc( - page.doctype, - page.name, - "generate_page_preview_image", - html=str(response.data, "utf-8"), - queue="short", - ) - return response - - @redis_cache(ttl=60 * 60) def find_page_with_path(route): try: @@ -664,176 +608,15 @@ def get_web_pages_with_dynamic_routes() -> dict[str, str]: def resolve_path(path): - if find_page_with_path(path): - return path - elif evaluate_dynamic_routes( - [Rule(f"/{d.route}", endpoint=d.name) for d in get_web_pages_with_dynamic_routes()], - path, - ): - return path + try: + if find_page_with_path(path): + return path + elif evaluate_dynamic_routes( + [ColonRule(f"/{d.route}", endpoint=d.name) for d in get_web_pages_with_dynamic_routes()], + path, + ): + return path + except Exception: + pass return original_resolve_path(path) - - -def is_component_used(blocks, component_id): - blocks = frappe.parse_json(blocks) - if not isinstance(blocks, list): - blocks = [blocks] - - for block in blocks: - if not block: - continue - if block.get("extendedFromComponent") == component_id: - return True - elif block.get("children"): - return is_component_used(block.get("children"), component_id) - - return False - - -def copy_img_to_asset_folder(block, self): - if block.get("element") == "img": - src = block.get("attributes", {}).get("src") - site_url = frappe.utils.get_url() - - if src and (src.startswith(f"{site_url}/files") or src.startswith("/files")): - # find file doc - if src.startswith(f"{site_url}/files"): - src = src.split(f"{site_url}")[1] - # url decode - src = unquote(src) - print(f"src: {src}") - files = frappe.get_all("File", filters={"file_url": src}, fields=["name"]) - print(f"files: {files}") - if files: - _file = frappe.get_doc("File", files[0].name) - # copy physical file to new location - assets_folder_path = get_template_assets_folder_path(self) - shutil.copy(_file.get_full_path(), assets_folder_path) - block["attributes"]["src"] = f"/builder_assets/{self.name}/{src.split('/')[-1]}" - for child in block.get("children", []): - copy_img_to_asset_folder(child, self) - - -def get_builder_page_preview_paths(page_doc): - public_path, public_path = None, None - if page_doc.is_template: - local_path = os.path.join(get_template_assets_folder_path(page_doc), "preview.jpeg") - public_path = f"/builder_assets/{page_doc.name}/preview.jpeg" - else: - file_name = f"{page_doc.name}-preview.jpeg" - local_path = os.path.join(frappe.local.site_path, "public", "files", file_name) - random_hash = frappe.generate_hash(length=5) - public_path = f"/files/{file_name}?v={random_hash}" - return public_path, local_path - - -def get_template_assets_folder_path(page_doc): - path = os.path.join(frappe.get_app_path("builder"), "www", "builder_assets", page_doc.name) - if not os.path.exists(path): - os.makedirs(path) - return path - - -@frappe.whitelist() -def upload_builder_asset(): - from frappe.handler import upload_file - - image_file = upload_file() - if image_file.file_url.endswith((".png", ".jpeg", ".jpg")) and frappe.get_cached_value( - "Builder Settings", None, "auto_convert_images_to_webp" - ): - convert_to_webp(file_doc=image_file) - return image_file - - -@frappe.whitelist() -def convert_to_webp(image_url: str | None = None, file_doc: Document | None = None) -> str: - """BETA: Convert image to webp format""" - - CONVERTIBLE_IMAGE_EXTENSIONS = ["png", "jpeg", "jpg"] - - def can_convert_image(extn): - return extn.lower() in CONVERTIBLE_IMAGE_EXTENSIONS - - def get_extension(filename): - return filename.split(".")[-1].lower() - - def convert_and_save_image(image, path): - image.save(path, "WEBP") - return path - - def update_file_doc_with_webp(file_doc, image, extn): - webp_path = file_doc.get_full_path().replace(extn, "webp") - convert_and_save_image(image, webp_path) - delete_file(file_doc.get_full_path()) - file_doc.file_url = f"{file_doc.file_url.replace(extn, 'webp')}" - file_doc.save() - return file_doc.file_url - - def create_new_webp_file_doc(file_url, image, extn): - files = frappe.get_all("File", filters={"file_url": file_url}, fields=["name"], limit=1) - if files: - _file = frappe.get_doc("File", files[0].name) - webp_path = _file.get_full_path().replace(extn, "webp") - convert_and_save_image(image, webp_path) - new_file = frappe.copy_doc(_file) - new_file.file_name = f"{_file.file_name.replace(extn, 'webp')}" - new_file.file_url = f"{_file.file_url.replace(extn, 'webp')}" - new_file.save() - return new_file.file_url - return file_url - - def handle_image_from_url(image_url): - image_url = unquote(image_url) - response = requests.get(image_url) - image = Image.open(BytesIO(response.content)) - filename = image_url.split("/")[-1] - extn = get_extension(filename) - if can_convert_image(extn): - _file = frappe.get_doc( - { - "doctype": "File", - "file_name": f"{filename.replace(extn, 'webp')}", - "file_url": f"/files/{filename.replace(extn, 'webp')}", - } - ) - webp_path = _file.get_full_path() - convert_and_save_image(image, webp_path) - _file.save() - return _file.file_url - return image_url - - if not image_url and not file_doc: - return "" - - if file_doc: - if file_doc.file_url.startswith("/files"): - image, filename, extn = get_local_image(file_doc.file_url) - if can_convert_image(extn): - return update_file_doc_with_webp(file_doc, image, extn) - return file_doc.file_url - - if image_url.startswith("/files"): - image, filename, extn = get_local_image(image_url) - if can_convert_image(extn): - return create_new_webp_file_doc(image_url, image, extn) - return image_url - - if image_url.startswith("/builder_assets"): - image_path = os.path.abspath(frappe.get_app_path("builder", "www", image_url.lstrip("/"))) - image_path = image_path.replace("_", "-") - image_path = image_path.replace("/builder-assets", "/builder_assets") - - image = Image.open(image_path) - extn = get_extension(image_path) - if can_convert_image(extn): - webp_path = image_path.replace(extn, "webp") - convert_and_save_image(image, webp_path) - return image_url.replace(extn, "webp") - return image_url - - if image_url.startswith("http"): - return handle_image_from_url(image_url) - - return image_url diff --git a/builder/builder/doctype/builder_page/patches/create_upload_folder_for_builder.py b/builder/builder/doctype/builder_page/patches/create_upload_folder_for_builder.py index adbeaa7d..c68c770f 100644 --- a/builder/builder/doctype/builder_page/patches/create_upload_folder_for_builder.py +++ b/builder/builder/doctype/builder_page/patches/create_upload_folder_for_builder.py @@ -1,7 +1,8 @@ - import frappe from frappe.core.api.file import create_new_folder + def execute(): """create upload folder for builder""" - create_new_folder("Builder Uploads", "Home") \ No newline at end of file + create_new_folder("Builder Uploads", "Home") + create_new_folder("Fonts", "Home/Builder Uploads") diff --git a/builder/builder/doctype/builder_page/test_builder_page.py b/builder/builder/doctype/builder_page/test_builder_page.py index 451254d5..e3cbe4a7 100644 --- a/builder/builder/doctype/builder_page/test_builder_page.py +++ b/builder/builder/doctype/builder_page/test_builder_page.py @@ -52,7 +52,7 @@ def test_publish_unpublish(self): from frappe.utils import get_html_for_route content = get_html_for_route("/test-page") - self.assertTrue("The page you are looking for has gone missing" in content) + self.assertTrue("window.is_404 = true;" in content) self.page.publish() content = get_response_content("/test-page") diff --git a/builder/builder/doctype/builder_settings/builder_settings.json b/builder/builder/doctype/builder_settings/builder_settings.json index 242ec152..e515ef35 100644 --- a/builder/builder/doctype/builder_settings/builder_settings.json +++ b/builder/builder/doctype/builder_settings/builder_settings.json @@ -57,7 +57,7 @@ }, { "default": "1", - "description": "Beta: All the images uploaded to Canvas will be auto converted to WebP for better page performance.", + "description": "All the images uploaded to Canvas will be auto converted to WebP for better page performance.", "fieldname": "auto_convert_images_to_webp", "fieldtype": "Check", "label": "Auto convert images to WebP" diff --git a/builder/builder/doctype/user_font/__init__.py b/builder/builder/doctype/user_font/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/builder/builder/doctype/user_font/test_user_font.py b/builder/builder/doctype/user_font/test_user_font.py new file mode 100644 index 00000000..fdf4ca1a --- /dev/null +++ b/builder/builder/doctype/user_font/test_user_font.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024, Frappe Technologies Pvt Ltd and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestUserFont(FrappeTestCase): + pass diff --git a/builder/builder/doctype/user_font/user_font.js b/builder/builder/doctype/user_font/user_font.js new file mode 100644 index 00000000..0b4d4d27 --- /dev/null +++ b/builder/builder/doctype/user_font/user_font.js @@ -0,0 +1,8 @@ +// Copyright (c) 2024, Frappe Technologies Pvt Ltd and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("User Font", { +// refresh(frm) { + +// }, +// }); diff --git a/builder/builder/doctype/user_font/user_font.json b/builder/builder/doctype/user_font/user_font.json new file mode 100644 index 00000000..815c0bdf --- /dev/null +++ b/builder/builder/doctype/user_font/user_font.json @@ -0,0 +1,62 @@ +{ + "actions": [], + "allow_rename": 1, + "autoname": "field:font_name", + "creation": "2024-09-23 11:43:02.981496", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "font_name", + "font_file" + ], + "fields": [ + { + "fieldname": "font_name", + "fieldtype": "Data", + "label": "Font Name", + "unique": 1 + }, + { + "fieldname": "font_file", + "fieldtype": "Attach", + "label": "Font File" + } + ], + "index_web_pages_for_search": 1, + "links": [], + "modified": "2024-09-26 11:24:22.897525", + "modified_by": "Administrator", + "module": "Builder", + "name": "User Font", + "naming_rule": "By fieldname", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Website Manager", + "share": 1, + "write": 1 + } + ], + "sort_field": "creation", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/builder/builder/doctype/user_font/user_font.py b/builder/builder/doctype/user_font/user_font.py new file mode 100644 index 00000000..b0a84858 --- /dev/null +++ b/builder/builder/doctype/user_font/user_font.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024, Frappe Technologies Pvt Ltd and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class UserFont(Document): + pass diff --git a/builder/builder/test_utils.py b/builder/builder/test_utils.py new file mode 100644 index 00000000..cd3822d7 --- /dev/null +++ b/builder/builder/test_utils.py @@ -0,0 +1,81 @@ +from unittest.mock import patch + +import frappe +from frappe.tests.utils import FrappeTestCase + +from builder.utils import ( + camel_case_to_kebab_case, + escape_single_quotes, + execute_script, + get_builder_page_preview_paths, + get_dummy_blocks, + get_template_assets_folder_path, + is_component_used, + remove_unsafe_fields, +) + + +class TestBuilderPage(FrappeTestCase): + def test_camel_case_to_kebab_case(self): + self.assertEqual(camel_case_to_kebab_case("backgroundColor"), "background-color") + self.assertEqual(camel_case_to_kebab_case("Color"), "color") + self.assertEqual(camel_case_to_kebab_case("color"), "color") + self.assertEqual(camel_case_to_kebab_case("NewPage"), "new-page") + self.assertEqual(camel_case_to_kebab_case("new page", remove_spaces=True), "newpage") + + def test_escape_single_quotes(self): + self.assertEqual(escape_single_quotes("Hello 'World'"), "Hello \\'World\\'") + self.assertEqual(escape_single_quotes("Hello World"), "Hello World") + + def test_is_component_used(self): + dummy_blocks = get_dummy_blocks() + self.assertTrue(is_component_used(dummy_blocks, "component-1")) + self.assertTrue(is_component_used(dummy_blocks, "component-2")) + self.assertFalse(is_component_used(dummy_blocks, "component-3")) + + def test_get_builder_page_preview_paths(self): + page_doc = frappe._dict( + { + "name": "test-page", + "is_template": False, + } + ) + public_path, local_path = get_builder_page_preview_paths(page_doc) + self.assertRegex(public_path, r"/files/test-page-preview.jpeg\?v=\w{5}") + self.assertEqual(local_path, f"{frappe.local.site_path}/public/files/test-page-preview.jpeg") + + page_doc.is_template = True + public_path, local_path = get_builder_page_preview_paths(page_doc) + self.assertEqual(public_path, "/builder_assets/test-page/preview.jpeg") + self.assertEqual( + local_path, f"{frappe.get_app_path('builder')}/www/builder_assets/test-page/preview.jpeg" + ) + + def test_get_template_assets_folder_path(self): + page_doc = frappe._dict({"name": "mypage"}) + path = get_template_assets_folder_path(page_doc) + self.assertEqual(path, f"{frappe.get_app_path('builder')}/www/builder_assets/mypage") + + @patch("builder.utils.is_safe_exec_enabled", return_value=False) + @patch("frappe.utils.safe_exec.is_safe_exec_enabled", return_value=False) + def test_execute_script_with_enabled_server_script(self, *args): + script = "data.test = frappe.get_doc('User', 'Administrator').email" + _locals = dict(data=frappe._dict()) + execute_script(script, _locals, "test.py") + self.assertEqual(_locals["data"]["test"], "admin@example.com") + + @patch("builder.utils.is_safe_exec_enabled", return_value=True) + @patch("frappe.utils.safe_exec.is_safe_exec_enabled", return_value=True) + def test_execute_script_with_disabled_server_script(self, *args): + script = "data.test = frappe.get_doc('User', 'Administrator').email" + _locals = dict(data=frappe._dict()) + execute_script(script, _locals, "test.py") + self.assertEqual(_locals["data"]["test"], "admin@example.com") + + script = "data.users = frappe.db.get_all('User')" + execute_script(script, _locals, "test.py") + self.assertTrue(_locals["data"]["users"]) + + script = "data.users = frappe.db.get_all('User')" + execute_script(script, _locals, "test.py") + self.assertTrue(_locals["data"]["users"]) diff --git a/builder/install.py b/builder/install.py index 8333b112..203fc85a 100644 --- a/builder/install.py +++ b/builder/install.py @@ -6,6 +6,7 @@ def after_install(): create_new_folder("Builder Uploads", "Home") + create_new_folder("Fonts", "Home/Builder Uploads") sync_page_templates() sync_block_templates() diff --git a/builder/patches.txt b/builder/patches.txt index e0247868..20dcd179 100644 --- a/builder/patches.txt +++ b/builder/patches.txt @@ -1,5 +1,5 @@ [pre_model_sync] -builder.builder.doctype.builder_page.patches.create_upload_folder_for_builder # +builder.builder.doctype.builder_page.patches.create_upload_folder_for_builder # 25-09-2024 builder.builder.patches.rename_web_page_beta_to_builder_page builder.builder.patches.rename_web_page_component_to_builder_component @@ -8,3 +8,4 @@ builder.builder.doctype.builder_component.patches.set_component_id builder.builder.doctype.builder_page.patches.properly_extend_blocks_from_component builder.builder.doctype.builder_page.patches.attach_client_script_to_builder_page builder.builder.doctype.builder_page.patches.enable_auto_convert_to_webp_by_default +builder.builder.doctype.builder_client_script.patches.trigger_asset_compression diff --git a/builder/public/images/desk.png b/builder/public/images/desk.png new file mode 100644 index 00000000..f4a09599 Binary files /dev/null and b/builder/public/images/desk.png differ diff --git a/builder/public/js/identify.js b/builder/public/js/identify.js new file mode 100644 index 00000000..c5f57204 --- /dev/null +++ b/builder/public/js/identify.js @@ -0,0 +1,8 @@ +/** + * FingerprintJS v3.4.2 - Copyright (c) FingerprintJS, Inc, 2023 (https://fingerprint.com) + * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. + * + * This software contains code from open-source projects: + * MurmurHash3 by Karan Lyons (https://github.com/karanlyons/murmurHash3.js) + */ +var e=function(){return e=Object.assign||function(e){for(var n,t=1,r=arguments.length;t0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]=i+a?(i=u,[4,o(0)]):[3,3]):[3,4];case 2:t.sent(),t.label=3;case 3:return++c,[3,1];case 4:return[2,n]}}))}))}function u(e){e.then(void 0,(function(){}))}function l(e,n){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],n=[n[0]>>>16,65535&n[0],n[1]>>>16,65535&n[1]];var t=[0,0,0,0];return t[3]+=e[3]+n[3],t[2]+=t[3]>>>16,t[3]&=65535,t[2]+=e[2]+n[2],t[1]+=t[2]>>>16,t[2]&=65535,t[1]+=e[1]+n[1],t[0]+=t[1]>>>16,t[1]&=65535,t[0]+=e[0]+n[0],t[0]&=65535,[t[0]<<16|t[1],t[2]<<16|t[3]]}function s(e,n){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],n=[n[0]>>>16,65535&n[0],n[1]>>>16,65535&n[1]];var t=[0,0,0,0];return t[3]+=e[3]*n[3],t[2]+=t[3]>>>16,t[3]&=65535,t[2]+=e[2]*n[3],t[1]+=t[2]>>>16,t[2]&=65535,t[2]+=e[3]*n[2],t[1]+=t[2]>>>16,t[2]&=65535,t[1]+=e[1]*n[3],t[0]+=t[1]>>>16,t[1]&=65535,t[1]+=e[2]*n[2],t[0]+=t[1]>>>16,t[1]&=65535,t[1]+=e[3]*n[1],t[0]+=t[1]>>>16,t[1]&=65535,t[0]+=e[0]*n[3]+e[1]*n[2]+e[2]*n[1]+e[3]*n[0],t[0]&=65535,[t[0]<<16|t[1],t[2]<<16|t[3]]}function d(e,n){return 32===(n%=64)?[e[1],e[0]]:n<32?[e[0]<>>32-n,e[1]<>>32-n]:(n-=32,[e[1]<>>32-n,e[0]<>>32-n])}function m(e,n){return 0===(n%=64)?e:n<32?[e[0]<>>32-n,e[1]<>>1]),e=f(e=s(e,[4283543511,3981806797]),[0,e[0]>>>1]),e=f(e=s(e,[3301882366,444984403]),[0,e[0]>>>1])}function h(e,n){n=n||0;var t,r=(e=e||"").length%16,o=e.length-r,a=[0,n],i=[0,n],c=[0,0],u=[0,0],h=[2277735313,289559509],p=[1291169091,658871167];for(t=0;t>>0).toString(16)).slice(-8)+("00000000"+(a[1]>>>0).toString(16)).slice(-8)+("00000000"+(i[0]>>>0).toString(16)).slice(-8)+("00000000"+(i[1]>>>0).toString(16)).slice(-8)}function p(e){return parseInt(e)}function b(e){return parseFloat(e)}function y(e,n){return"number"==typeof e&&isNaN(e)?n:e}function g(e){return e.reduce((function(e,n){return e+(n?1:0)}),0)}function w(e,n){if(void 0===n&&(n=1),Math.abs(n)>=1)return Math.round(e/n)*n;var t=1/n;return Math.round(e*t)/t}function L(e){return e&&"object"==typeof e&&"message"in e?e:{message:e}}function k(e){return"function"!=typeof e}function V(e,r,o){var a=Object.keys(e).filter((function(e){return!function(e,n){for(var t=0,r=e.length;t=4}function C(){var e=window,n=navigator;return g(["msWriteProfilerMark"in e,"MSStream"in e,"msLaunchUri"in n,"msSaveBlob"in n])>=3&&!W()}function S(){var e=window,n=navigator;return g(["webkitPersistentStorage"in n,"webkitTemporaryStorage"in n,0===n.vendor.indexOf("Google"),"webkitResolveLocalFileSystemURL"in e,"BatteryManager"in e,"webkitMediaStream"in e,"webkitSpeechGrammar"in e])>=5}function x(){var e=window,n=navigator;return g(["ApplePayError"in e,"CSSPrimitiveValue"in e,"Counter"in e,0===n.vendor.indexOf("Apple"),"getStorageUpdates"in n,"WebKitMediaKeys"in e])>=4}function F(){var e=window;return g(["safari"in e,!("DeviceMotionEvent"in e),!("ongestureend"in e),!("standalone"in navigator)])>=3}function Y(){var e,n,t=window;return g(["buildID"in navigator,"MozAppearance"in(null!==(n=null===(e=document.documentElement)||void 0===e?void 0:e.style)&&void 0!==n?n:{}),"onmozfullscreenchange"in t,"mozInnerScreenX"in t,"CSSMozDocumentRule"in t,"CanvasCaptureMediaStream"in t])>=4}function M(){var e=document;return e.fullscreenElement||e.msFullscreenElement||e.mozFullScreenElement||e.webkitFullscreenElement||null}function G(){var e=S(),n=Y();if(!e&&!n)return!1;var t=window;return g(["onorientationchange"in t,"orientation"in t,e&&!("SharedWorker"in t),n&&/android/i.test(navigator.appVersion)])>=2}function R(e){var n=new Error(e);return n.name=e,n}function X(e,r,a){var i,c,u;return void 0===a&&(a=50),n(this,void 0,void 0,(function(){var n,l;return t(this,(function(t){switch(t.label){case 0:n=document,t.label=1;case 1:return n.body?[3,3]:[4,o(a)];case 2:return t.sent(),[3,1];case 3:l=n.createElement("iframe"),t.label=4;case 4:return t.trys.push([4,,10,11]),[4,new Promise((function(e,t){var o=!1,a=function(){o=!0,e()};l.onload=a,l.onerror=function(e){o=!0,t(e)};var i=l.style;i.setProperty("display","block","important"),i.position="absolute",i.top="0",i.left="0",i.visibility="hidden",r&&"srcdoc"in l?l.srcdoc=r:l.src="about:blank",n.body.appendChild(l);var c=function(){var e,n;o||("complete"===(null===(n=null===(e=l.contentWindow)||void 0===e?void 0:e.document)||void 0===n?void 0:n.readyState)?a():setTimeout(c,10))};c()}))];case 5:t.sent(),t.label=6;case 6:return(null===(c=null===(i=l.contentWindow)||void 0===i?void 0:i.document)||void 0===c?void 0:c.body)?[3,8]:[4,o(a)];case 7:return t.sent(),[3,6];case 8:return[4,e(l,l.contentWindow)];case 9:return[2,t.sent()];case 10:return null===(u=l.parentNode)||void 0===u||u.removeChild(l),[7];case 11:return[2]}}))}))}function A(e){for(var n=function(e){for(var n,t,r="Unexpected syntax '".concat(e,"'"),o=/^\s*([a-z-]*)(.*)$/i.exec(e),a=o[1]||void 0,i={},c=/([.:#][\w-]+|\[.+?\])/gi,u=function(e,n){i[e]=i[e]||[],i[e].push(n)};;){var l=c.exec(o[2]);if(!l)break;var s=l[0];switch(s[0]){case".":u("class",s.slice(1));break;case"#":u("id",s.slice(1));break;case"[":var d=/^\[([\w-]+)([~|^$*]?=("(.*?)"|([\w-]+)))?(\s+[is])?\]$/.exec(s);if(!d)throw new Error(r);u(d[1],null!==(t=null!==(n=d[4])&&void 0!==n?n:d[5])&&void 0!==t?t:"");break;default:throw new Error(r)}}return[a,i]}(e),t=n[0],r=n[1],o=document.createElement(null!=t?t:"div"),a=0,i=Object.keys(r);a.6*t.length}))).sort(),[2,a]}var c}))}))},fontPreferences:function(){return function(e,n){void 0===n&&(n=4e3);return X((function(t,o){var a=o.document,i=a.body,c=i.style;c.width="".concat(n,"px"),c.webkitTextSizeAdjust=c.textSizeAdjust="none",S()?i.style.zoom="".concat(1/o.devicePixelRatio):x()&&(i.style.zoom="reset");var u=a.createElement("div");return u.textContent=r([],Array(n/20<<0),!0).map((function(){return"word"})).join(" "),i.appendChild(u),e(a,i)}),'')}((function(e,n){for(var t={},r={},o=0,a=Object.keys(ee);o=3}())return-1;var t=new n(1,5e3,44100),r=t.createOscillator();r.type="triangle",r.frequency.value=1e4;var o=t.createDynamicsCompressor();o.threshold.value=-50,o.knee.value=40,o.ratio.value=12,o.attack.value=0,o.release.value=.25,r.connect(o),o.connect(t.destination),r.start(0);var i=function(e){var n=3,t=500,r=500,o=5e3,i=function(){};return[new Promise((function(c,l){var s=!1,d=0,m=0;e.oncomplete=function(e){return c(e.renderedBuffer)};var f=function(){setTimeout((function(){return l(R("timeout"))}),Math.min(r,m+o-Date.now()))},v=function(){try{var r=e.startRendering();switch(a(r)&&u(r),e.state){case"running":m=Date.now(),s&&f();break;case"suspended":document.hidden||d++,s&&d>=n?l(R("suspended")):setTimeout(v,t)}}catch(o){l(o)}};v(),i=function(){s||(s=!0,m>0&&f())}})),i]}(t),c=i[0],l=i[1],s=c.then((function(e){return function(e){for(var n=0,t=0;t=3||t.push(n.languages);else if("string"==typeof n.languages){var o=n.languages;o&&t.push(o.split(","))}return t},colorDepth:function(){return window.screen.colorDepth},deviceMemory:function(){return y(b(navigator.deviceMemory),void 0)},screenResolution:function(){var e=screen,n=function(e){return y(p(e),null)},t=[n(e.width),n(e.height)];return t.sort().reverse(),t},hardwareConcurrency:function(){return y(p(navigator.hardwareConcurrency),void 0)},timezone:function(){var e,n=null===(e=window.Intl)||void 0===e?void 0:e.DateTimeFormat;if(n){var t=(new n).resolvedOptions().timeZone;if(t)return t}var r,o=(r=(new Date).getFullYear(),-Math.max(b(new Date(r,0,1).getTimezoneOffset()),b(new Date(r,6,1).getTimezoneOffset())));return"UTC".concat(o>=0?"+":"").concat(Math.abs(o))},sessionStorage:function(){try{return!!window.sessionStorage}catch(e){return!0}},localStorage:function(){try{return!!window.localStorage}catch(e){return!0}},indexedDB:function(){if(!W()&&!C())try{return!!window.indexedDB}catch(e){return!0}},openDatabase:function(){return!!window.openDatabase},cpuClass:function(){return navigator.cpuClass},platform:function(){var e=navigator.platform;return"MacIntel"===e&&x()&&!F()?function(){if("iPad"===navigator.platform)return!0;var e=screen,n=e.width/e.height;return g(["MediaSource"in window,!!Element.prototype.webkitRequestFullscreen,n>.65&&n<1.53])>=2}()?"iPad":"iPhone":e},plugins:function(){var e=navigator.plugins;if(e){for(var n=[],t=0;t + + {% if disable_indexing %} + + {% endif %} {{title}} @@ -13,6 +17,9 @@ {% for (font, options) in fonts.items() %}{% endfor %} {{ style }} + {%- if custom_fonts -%} + + {%- endif -%} {% block style %} {%- if styles -%} {% for style_path in styles %} diff --git a/builder/templates/generators/webpage_scripts.html b/builder/templates/generators/webpage_scripts.html index 791e6d92..53028639 100644 --- a/builder/templates/generators/webpage_scripts.html +++ b/builder/templates/generators/webpage_scripts.html @@ -5,17 +5,14 @@ {% endfor %} {%- endif -%} {%- endblock %} - {% if enable_view_tracking and not preview %} {% endif %} \ No newline at end of file diff --git a/builder/utils.py b/builder/utils.py index b048d458..ab950ac4 100644 --- a/builder/utils.py +++ b/builder/utils.py @@ -1,19 +1,27 @@ +import glob import os +import re +import shutil import socket +import subprocess from os.path import join -from urllib.parse import urlparse +from urllib.parse import unquote, urlparse import frappe from frappe.modules.import_file import import_file_by_path +from frappe.utils import get_site_base_path, get_site_path, get_url from frappe.utils.safe_exec import ( SERVER_SCRIPT_FILE_PREFIX, FrappeTransformer, NamespaceDict, get_python_builtins, get_safe_globals, + is_safe_exec_enabled, + safe_exec, safe_exec_flags, ) from RestrictedPython import compile_restricted +from werkzeug.routing import Rule def get_doc_as_dict(doctype, name): @@ -67,10 +75,16 @@ def remove_unsafe_fields(fields): def get_safer_globals(): safe_globals = get_safe_globals() + form_dict = getattr(frappe.local, "form_dict", frappe._dict()) + + if "_" in form_dict: + del frappe.local.form_dict["_"] + out = NamespaceDict( json=safe_globals["json"], as_json=frappe.as_json, dict=safe_globals["dict"], + args=form_dict, frappe=NamespaceDict( db=NamespaceDict( count=frappe.db.count, @@ -79,6 +93,7 @@ def get_safer_globals(): get_list=safe_get_list, get_single_value=frappe.db.get_single_value, ), + form_dict=form_dict, make_get_request=make_safe_get_request, get_doc=get_doc_as_dict, get_cached_doc=get_cached_doc_as_dict, @@ -151,3 +166,142 @@ def make_records(path): for fname in os.listdir(path): if os.path.isdir(join(path, fname)) and fname != "__pycache__": import_file_by_path(f"{path}/{fname}/{fname}.json") + + +# def generate_tailwind_css_file_from_html(html): +# # execute tailwindcss cli command to generate css file +# # create temp folder +# temp_folder = os.path.join(get_site_base_path(), "temp") +# if os.path.exists(temp_folder): +# shutil.rmtree(temp_folder) +# os.mkdir(temp_folder) + +# # create temp html file +# temp_html_file_path = os.path.join(temp_folder, "temp.html") +# with open(temp_html_file_path, "w") as f: +# f.write(html) + +# # place tailwind.css file in public folder +# tailwind_css_file_path = os.path.join(get_site_path(), "public", "files", "tailwind.css") + +# # create temp config file +# temp_config_file_path = os.path.join(temp_folder, "tailwind.config.js") +# with open(temp_config_file_path, "w") as f: +# f.write("module.exports = {content: ['./temp.html']}") + +# # run tailwindcss cli command in production mode +# subprocess.run( +# ["npx", "tailwindcss", "-o", tailwind_css_file_path, "--config", temp_config_file_path, "--minify"] +# ) + + +def copy_img_to_asset_folder(block, page_doc): + if block.get("element") == "img": + src = block.get("attributes", {}).get("src") + site_url = get_url() + + if src and (src.startswith(f"{site_url}/files") or src.startswith("/files")): + # find file doc + if src.startswith(f"{site_url}/files"): + src = src.split(f"{site_url}")[1] + # url decode + src = unquote(src) + print(f"src: {src}") + files = frappe.get_all("File", filters={"file_url": src}, fields=["name"]) + print(f"files: {files}") + if files: + _file = frappe.get_doc("File", files[0].name) + # copy physical file to new location + assets_folder_path = get_template_assets_folder_path(page_doc) + shutil.copy(_file.get_full_path(), assets_folder_path) + block["attributes"]["src"] = f"/builder_assets/{page_doc.name}/{src.split('/')[-1]}" + for child in block.get("children", []): + copy_img_to_asset_folder(child, page_doc) + + +def get_template_assets_folder_path(page_doc): + path = os.path.join(frappe.get_app_path("builder"), "www", "builder_assets", page_doc.name) + if not os.path.exists(path): + os.makedirs(path) + return path + + +def get_builder_page_preview_paths(page_doc): + public_path, public_path = None, None + if page_doc.is_template: + local_path = os.path.join(get_template_assets_folder_path(page_doc), "preview.jpeg") + public_path = f"/builder_assets/{page_doc.name}/preview.jpeg" + else: + file_name = f"{page_doc.name}-preview.jpeg" + local_path = os.path.join(frappe.local.site_path, "public", "files", file_name) + random_hash = frappe.generate_hash(length=5) + public_path = f"/files/{file_name}?v={random_hash}" + return public_path, local_path + + +def is_component_used(blocks, component_id): + blocks = frappe.parse_json(blocks) + if not isinstance(blocks, list): + blocks = [blocks] + + for block in blocks: + if not block: + continue + if block.get("extendedFromComponent") == component_id: + return True + elif block.get("children"): + return is_component_used(block.get("children"), component_id) + + return False + + +def escape_single_quotes(text): + return (text or "").replace("'", "\\'") + + +def camel_case_to_kebab_case(text, remove_spaces=False): + if not text: + return "" + text = re.sub(r"(?' so Werkzeug can process it + string = self.convert_colon_to_brackets(string) + super().__init__(string, *args, **kwargs) + + @staticmethod + def convert_colon_to_brackets(string): + return re.sub(r":([a-zA-Z0-9_-]+)", r"<\1>", string) diff --git a/builder/www/builder_assets/Blockquote/blockquote.png b/builder/www/builder_assets/Blockquote/blockquote.png new file mode 100644 index 00000000..0e999dc3 Binary files /dev/null and b/builder/www/builder_assets/Blockquote/blockquote.png differ diff --git a/builder/www/builder_assets/Footer 1/footer_1.png b/builder/www/builder_assets/Footer 1/footer_1.png new file mode 100644 index 00000000..2f61d572 Binary files /dev/null and b/builder/www/builder_assets/Footer 1/footer_1.png differ diff --git a/builder/www/builder_assets/Heading/heading.png b/builder/www/builder_assets/Heading/heading.png new file mode 100644 index 00000000..c0eaa475 Binary files /dev/null and b/builder/www/builder_assets/Heading/heading.png differ diff --git a/builder/www/builder_assets/Hero 1/hero_1.png b/builder/www/builder_assets/Hero 1/hero_1.png new file mode 100644 index 00000000..304529bd Binary files /dev/null and b/builder/www/builder_assets/Hero 1/hero_1.png differ diff --git a/builder/www/builder_assets/Hero 2/hero_2.png b/builder/www/builder_assets/Hero 2/hero_2.png new file mode 100644 index 00000000..5e3820d4 Binary files /dev/null and b/builder/www/builder_assets/Hero 2/hero_2.png differ diff --git a/builder/www/builder_assets/Hero 2/image0ccb3c.webp b/builder/www/builder_assets/Hero 2/image0ccb3c.webp new file mode 100644 index 00000000..903ecfd0 Binary files /dev/null and b/builder/www/builder_assets/Hero 2/image0ccb3c.webp differ diff --git a/builder/www/builder_assets/Label/label.png b/builder/www/builder_assets/Label/label.png new file mode 100644 index 00000000..14c5f2b6 Binary files /dev/null and b/builder/www/builder_assets/Label/label.png differ diff --git a/builder/www/builder_assets/Navbar 1/Logo.webp b/builder/www/builder_assets/Navbar 1/Logo.webp new file mode 100644 index 00000000..f6b06a6c Binary files /dev/null and b/builder/www/builder_assets/Navbar 1/Logo.webp differ diff --git a/builder/www/builder_assets/Navbar 1/imageca9535.webp b/builder/www/builder_assets/Navbar 1/imageca9535.webp new file mode 100644 index 00000000..c2996ada Binary files /dev/null and b/builder/www/builder_assets/Navbar 1/imageca9535.webp differ diff --git a/builder/www/builder_assets/Navbar 1/navbar_1.png b/builder/www/builder_assets/Navbar 1/navbar_1.png new file mode 100644 index 00000000..9f377fdd Binary files /dev/null and b/builder/www/builder_assets/Navbar 1/navbar_1.png differ diff --git a/builder/www/builder_assets/Navbar 2/Logo.webp b/builder/www/builder_assets/Navbar 2/Logo.webp new file mode 100644 index 00000000..f6b06a6c Binary files /dev/null and b/builder/www/builder_assets/Navbar 2/Logo.webp differ diff --git a/builder/www/builder_assets/Navbar 2/navbar_2.png b/builder/www/builder_assets/Navbar 2/navbar_2.png new file mode 100644 index 00000000..38fe2483 Binary files /dev/null and b/builder/www/builder_assets/Navbar 2/navbar_2.png differ diff --git a/builder/www/builder_assets/Paragraph/paragraph.png b/builder/www/builder_assets/Paragraph/paragraph.png new file mode 100644 index 00000000..c2a0892d Binary files /dev/null and b/builder/www/builder_assets/Paragraph/paragraph.png differ diff --git a/builder/www/builder_assets/Quick Grid/quick-grid.png b/builder/www/builder_assets/Quick Grid/quick-grid.png new file mode 100644 index 00000000..8eddd15e Binary files /dev/null and b/builder/www/builder_assets/Quick Grid/quick-grid.png differ diff --git a/builder/www/builder_assets/Quick Stack/quick-stack.png b/builder/www/builder_assets/Quick Stack/quick-stack.png new file mode 100644 index 00000000..c698c81a Binary files /dev/null and b/builder/www/builder_assets/Quick Stack/quick-stack.png differ diff --git a/builder/www/builder_assets/Testimonial 1/imagebab78c.webp b/builder/www/builder_assets/Testimonial 1/imagebab78c.webp new file mode 100644 index 00000000..7fd7ea87 Binary files /dev/null and b/builder/www/builder_assets/Testimonial 1/imagebab78c.webp differ diff --git a/builder/www/builder_assets/Testimonial 1/testimonial_1.png b/builder/www/builder_assets/Testimonial 1/testimonial_1.png new file mode 100644 index 00000000..4f970e31 Binary files /dev/null and b/builder/www/builder_assets/Testimonial 1/testimonial_1.png differ diff --git a/builder/www/builder_assets/Text Link/text-link.png b/builder/www/builder_assets/Text Link/text-link.png new file mode 100644 index 00000000..2c5180d0 Binary files /dev/null and b/builder/www/builder_assets/Text Link/text-link.png differ diff --git a/frappe-ui b/frappe-ui index 490ee7aa..c34ce581 160000 --- a/frappe-ui +++ b/frappe-ui @@ -1 +1 @@ -Subproject commit 490ee7aa2e0ee52670aa0cc881af757cfe6f2ea3 +Subproject commit c34ce5814f94ed18dacadaa5046df65a13991435 diff --git a/frontend/cypress/e2e/landing.cy.js b/frontend/cypress/e2e/landing.cy.js index af1fbca4..00c14f48 100644 --- a/frontend/cypress/e2e/landing.cy.js +++ b/frontend/cypress/e2e/landing.cy.js @@ -1,8 +1,8 @@ -describe("Builder Landing", () => { +describe("Builder Dashboard", () => { before(() => { cy.login(); }); it("Open builder page", () => { cy.visit("builder/home"); }); -}); \ No newline at end of file +}); diff --git a/frontend/espresso_colors.js b/frontend/espresso_colors.js new file mode 100644 index 00000000..dbc82265 --- /dev/null +++ b/frontend/espresso_colors.js @@ -0,0 +1,83 @@ +const espressoColors = { + outline: { + "amber-1": "var(--outline-amber-1)", + "amber-2": "var(--outline-amber-2)", + "blue-1": "var(--outline-blue-1)", + "blue-2": "var(--outline-blue-2)", + "gray-1": "var(--outline-gray-1)", + "gray-2": "var(--outline-gray-2)", + "gray-3": "var(--outline-gray-3)", + "gray-4": "var(--outline-gray-4)", + "gray-5": "var(--outline-gray-5)", + "gray-modals": "var(--outline-gray-modals)", + "green-1": "var(--outline-green-1)", + "green-2": "var(--outline-green-2)", + "orange-1": "var(--outline-orange-1)", + "red-1": "var(--outline-red-1)", + "red-2": "var(--outline-red-2)", + "red-3": "var(--outline-red-3)", + "red-4": "var(--outline-red-4)", + white: "var(--outline-white)", + }, + surface: { + "amber-1": "var(--surface-amber-1)", + "amber-2": "var(--surface-amber-2)", + "blue-1": "var(--surface-blue-1)", + "blue-2": "var(--surface-blue-2)", + cards: "var(--surface-cards)", + "cyan-1": "var(--surface-cyan-1)", + "gray-1": "var(--surface-gray-1)", + "gray-2": "var(--surface-gray-2)", + "gray-3": "var(--surface-gray-3)", + "gray-4": "var(--surface-gray-4)", + "gray-5": "var(--surface-gray-5)", + "gray-6": "var(--surface-gray-6)", + "gray-7": "var(--surface-gray-7)", + "green-1": "var(--surface-green-1)", + "green-2": "var(--surface-green-2)", + "green-3": "var(--surface-green-3)", + "menu-bar": "var(--surface-menu-bar)", + modal: "var(--surface-modal)", + "orange-1": "var(--surface-orange-1)", + "pink-1": "var(--surface-pink-1)", + "red-1": "var(--surface-red-1)", + "red-2": "var(--surface-red-2)", + "red-3": "var(--surface-red-3)", + "red-4": "var(--surface-red-4)", + "red-5": "var(--surface-red-5)", + "red-6": "var(--surface-red-6)", + selected: "var(--surface-selected)", + "violet-1": "var(--surface-violet-1)", + white: "var(--surface-white)", + }, + "text-icons": { + "amber-1": "var(--text-icons-amber-1)", + "amber-2": "var(--text-icons-amber-2)", + "amber-3": "var(--text-icons-amber-3)", + "blue-1": "var(--text-icons-blue-1)", + "blue-2": "var(--text-icons-blue-2)", + "blue-3": "var(--text-icons-blue-3)", + "cyan-1": "var(--text-icons-cyan-1)", + "gray-1": "var(--text-icons-gray-1)", + "gray-2": "var(--text-icons-gray-2)", + "gray-3": "var(--text-icons-gray-3)", + "gray-4": "var(--text-icons-gray-4)", + "gray-5": "var(--text-icons-gray-5)", + "gray-6": "var(--text-icons-gray-6)", + "gray-7": "var(--text-icons-gray-7)", + "gray-8": "var(--text-icons-gray-8)", + "gray-9": "var(--text-icons-gray-9)", + "green-1": "var(--text-icons-green-1)", + "green-2": "var(--text-icons-green-2)", + "green-3": "var(--text-icons-green-3)", + "pink-1": "var(--text-icons-pink-1)", + "red-1": "var(--text-icons-red-1)", + "red-2": "var(--text-icons-red-2)", + "red-3": "var(--text-icons-red-3)", + "red-4": "var(--text-icons-red-4)", + "violet-1": "var(--text-icons-violet-1)", + white: "var(--text-icons-white)", + }, +}; + +export default espressoColors; diff --git a/frontend/index.html b/frontend/index.html index d852c3b7..1fcfbbf8 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -8,7 +8,7 @@ Frappe Builder - +
diff --git a/frontend/package.json b/frontend/package.json index 72bb0e36..a9a9a9a4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -25,6 +25,7 @@ "autoprefixer": "^10.4.2", "feather-icons": "^4.28.0", "frappe-ui": "^0.1.43", + "opentype.js": "^1.3.4", "pinia": "^2.0.28", "postcss": "^8.4.5", "tailwindcss": "^3.3.2", @@ -36,6 +37,7 @@ "webfontloader": "^1.6.28" }, "devDependencies": { + "@types/opentype.js": "^1.3.8", "cypress": "^13.3.2", "eslint": "^8.38.0", "eslint-plugin-import": "^2.27.5", diff --git a/frontend/public/builder_logo.png b/frontend/public/builder_logo.png index 53626ac4..92a3cc85 100644 Binary files a/frontend/public/builder_logo.png and b/frontend/public/builder_logo.png differ diff --git a/frontend/public/builder_logo_old.png b/frontend/public/builder_logo_old.png new file mode 100644 index 00000000..53626ac4 Binary files /dev/null and b/frontend/public/builder_logo_old.png differ diff --git a/frontend/src/App.vue b/frontend/src/App.vue index a4f49301..6bb3e568 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -5,7 +5,7 @@ - + @@ -33,7 +33,9 @@ const title = computed(() => { useTitle(title); -const isDark = useDark(); +const isDark = useDark({ + attribute: "data-theme", +}); diff --git a/frontend/src/builder.d.ts b/frontend/src/builder.d.ts index 85eb7d07..f2ae2e58 100644 --- a/frontend/src/builder.d.ts +++ b/frontend/src/builder.d.ts @@ -1,7 +1,9 @@ declare type StyleValue = string | number | null | undefined; +declare type styleProperty = keyof CSSProperties; + declare interface BlockStyleMap { - [key: string]: StyleValue; + [key: styleProperty]: StyleValue; } declare interface BlockAttributeMap { @@ -25,6 +27,7 @@ declare interface BlockOptions { declare interface BlockComponent { name: string; component_name: string; + component_id: string; icon: string; is_dynamic: boolean; block: BlockOptions; @@ -65,7 +68,7 @@ declare type HashString = `#${string}`; declare type RGBString = `rgb(${number}, ${number}, ${number})`; -declare type LeftSidebarTabOption = "Assets" | "Layers"; +declare type LeftSidebarTabOption = "Blocks" | "Layers" | "Assets"; declare type RightSidebarTabOption = "Properties" | "Script" | "Options"; declare type BuilderMode = "select" | "text" | "container" | "image" | "repeater" | "move"; diff --git a/frontend/src/colors.css b/frontend/src/colors.css new file mode 100644 index 00000000..77a64741 --- /dev/null +++ b/frontend/src/colors.css @@ -0,0 +1,152 @@ +@layer base { + :root { + --outline-amber-1: rgb(254 237 169); + --outline-amber-2: rgb(251 204 85); + --outline-blue-1: rgb(167 215 253); + --outline-blue-2: rgb(2 137 247); + --outline-gray-1: rgb(237 237 237); + --outline-gray-2: rgb(226 226 226); + --outline-gray-3: rgb(199 199 199); + --outline-gray-4: rgb(153 153 153); + --outline-gray-5: rgb(56 56 56); + --outline-gray-modals: rgb(237 237 237); + --outline-green-1: rgb(185 238 204); + --outline-green-2: rgb(155 228 182); + --outline-orange-1: rgb(244 176 127); + --outline-red-1: rgb(255 216 216); + --outline-red-2: rgb(253 194 194); + --outline-red-3: rgb(247 149 150); + --outline-red-4: rgb(224 54 54); + --outline-white: rgb(255 255 255); + --surface-amber-1: rgb(255 247 211); + --surface-amber-2: rgb(219 119 6); + --surface-blue-1: rgb(230 244 255); + --surface-blue-2: rgb(2 137 247); + --surface-cards: rgb(255 255 255); + --surface-cyan-1: rgb(221 247 255); + --surface-gray-1: rgb(248 248 248); + --surface-gray-2: rgb(243 243 243); + --surface-gray-3: rgb(237 237 237); + --surface-gray-4: rgb(226 226 226); + --surface-gray-5: rgb(82 82 82); + --surface-gray-6: rgb(56 56 56); + --surface-gray-7: rgb(23 23 23); + --surface-green-1: rgb(242 253 244); + --surface-green-2: rgb(228 250 235); + --surface-green-3: rgb(48 166 109); + --surface-menu-bar: rgb(248 248 248); + --surface-modal: rgb(255 255 255); + --surface-orange-1: rgb(255 239 228); + --surface-pink-1: rgb(253 232 245); + --surface-red-1: rgb(255 231 231); + --surface-red-2: rgb(255 216 216); + --surface-red-3: rgb(253 194 194); + --surface-red-4: rgb(204 41 41); + --surface-red-5: rgb(181 42 42); + --surface-red-6: rgb(148 31 31); + --surface-selected: rgb(255 255 255); + --surface-violet-1: rgb(240 235 255); + --surface-white: rgb(255 255 255); + --text-icons-amber-1: rgb(255 247 211); + --text-icons-amber-2: rgb(231 153 19); + --text-icons-amber-3: rgb(219 119 6); + --text-icons-blue-1: rgb(230 244 255); + --text-icons-blue-2: rgb(0 123 224); + --text-icons-blue-3: rgb(0 92 163); + --text-icons-cyan-1: rgb(59 189 229); + --text-icons-gray-1: rgb(237 237 237); + --text-icons-gray-2: rgb(226 226 226); + --text-icons-gray-3: rgb(199 199 199); + --text-icons-gray-4: rgb(153 153 153); + --text-icons-gray-5: rgb(124 124 124); + --text-icons-gray-6: rgb(82 82 82); + --text-icons-gray-7: rgb(82 82 82); + --text-icons-gray-8: rgb(56 56 56); + --text-icons-gray-9: rgb(23 23 23); + --text-icons-green-1: rgb(242 253 244); + --text-icons-green-2: rgb(48 166 109); + --text-icons-green-3: rgb(22 121 76); + --text-icons-pink-1: rgb(227 74 166); + --text-icons-red-1: rgb(255 247 247); + --text-icons-red-2: rgb(247 149 150); + --text-icons-red-3: rgb(224 54 54); + --text-icons-red-4: rgb(204 41 41); + --text-icons-violet-1: rgb(104 70 227); + --text-icons-white: rgb(255 255 255); + } + [data-theme="dark"] { + --outline-amber-1: rgb(130 65 8); + --outline-amber-2: rgb(130 65 8); + --outline-blue-1: rgb(21 89 153); + --outline-blue-2: rgb(21 89 153); + --outline-gray-1: rgb(35 35 35); + --outline-gray-2: rgb(52 52 52); + --outline-gray-3: rgb(66 66 66); + --outline-gray-4: rgb(128 128 128); + --outline-gray-5: rgb(237 237 237); + --outline-gray-modals: rgb(52 52 52); + --outline-green-1: rgb(11 97 57); + --outline-green-2: rgb(10 63 39); + --outline-orange-1: rgb(130 57 6); + --outline-red-1: rgb(98 27 24); + --outline-red-2: rgb(76 24 24); + --outline-red-3: rgb(98 27 24); + --outline-red-4: rgb(156 32 32); + --outline-white: rgb(28 28 28); + --surface-amber-1: rgb(55 30 6); + --surface-amber-2: rgb(197 116 17); + --surface-blue-1: rgb(14 32 55); + --surface-blue-2: rgb(21 128 216); + --surface-cards: rgb(28 28 28); + --surface-cyan-1: rgb(11 37 45); + --surface-gray-1: rgb(35 35 35); + --surface-gray-2: rgb(255 255 255 / 0.1); + --surface-gray-3: rgb(255 255 255 / 0.18); + --surface-gray-4: rgb(66 66 66); + --surface-gray-5: rgb(212 212 212); + --surface-gray-6: rgb(175 175 175); + --surface-gray-7: rgb(212 212 212); + --surface-green-1: rgb(11 46 28); + --surface-green-2: rgb(10 63 39); + --surface-green-3: rgb(31 157 96); + --surface-menu-bar: rgb(15 15 15); + --surface-modal: rgb(35 35 35); + --surface-orange-1: rgb(64 31 7 / 0.8); + --surface-pink-1: rgb(71 20 50 / 0.8); + --surface-red-1: rgb(54 21 21 / 0.8); + --surface-red-2: rgb(76 24 24 / 0.9); + --surface-red-3: rgb(98 27 24); + --surface-red-4: rgb(228 56 56); + --surface-red-5: rgb(156 32 32); + --surface-red-6: rgb(98 27 24); + --surface-selected: rgb(255 255 255 / 0.1); + --surface-violet-1: rgb(34 28 66); + --surface-white: rgb(15 15 15); + --text-icons-amber-1: rgb(255 255 255); + --text-icons-amber-2: rgb(231 153 19); + --text-icons-amber-3: rgb(231 153 19); + --text-icons-blue-1: rgb(255 255 255); + --text-icons-blue-2: rgb(90 174 242); + --text-icons-blue-3: rgb(140 193 236); + --text-icons-cyan-1: rgb(60 184 220); + --text-icons-gray-1: rgb(35 35 35); + --text-icons-gray-2: rgb(66 66 66); + --text-icons-gray-3: rgb(113 113 113); + --text-icons-gray-4: rgb(113 113 113); + --text-icons-gray-5: rgb(128 128 128); + --text-icons-gray-6: rgb(153 153 153); + --text-icons-gray-7: rgb(175 175 175); + --text-icons-gray-8: rgb(212 212 212); + --text-icons-gray-9: rgb(248 248 248); + --text-icons-green-1: rgb(255 255 255); + --text-icons-green-2: rgb(53 174 116); + --text-icons-green-3: rgb(120 215 169); + --text-icons-pink-1: rgb(227 89 171); + --text-icons-red-1: rgb(255 255 255); + --text-icons-red-2: rgb(98 27 24); + --text-icons-red-3: rgb(235 77 82); + --text-icons-red-4: rgb(252 116 116); + --text-icons-violet-1: rgb(157 124 234); + --text-icons-white: rgb(15 15 15); + } +} \ No newline at end of file diff --git a/frontend/src/components/AlertDialog.vue b/frontend/src/components/AlertDialog.vue new file mode 100644 index 00000000..9f9f6c1d --- /dev/null +++ b/frontend/src/components/AlertDialog.vue @@ -0,0 +1,38 @@ + + + diff --git a/frontend/src/components/AppsMenu.vue b/frontend/src/components/AppsMenu.vue new file mode 100644 index 00000000..25662747 --- /dev/null +++ b/frontend/src/components/AppsMenu.vue @@ -0,0 +1,39 @@ + + diff --git a/frontend/src/components/Autocomplete.vue b/frontend/src/components/Autocomplete.vue deleted file mode 100644 index eec9174c..00000000 --- a/frontend/src/components/Autocomplete.vue +++ /dev/null @@ -1,127 +0,0 @@ - - - diff --git a/frontend/src/components/BackgroundHandler.vue b/frontend/src/components/BackgroundHandler.vue index d03aeb5e..8729b1eb 100644 --- a/frontend/src/components/BackgroundHandler.vue +++ b/frontend/src/components/BackgroundHandler.vue @@ -5,12 +5,13 @@ BG Image
- + :modelValue="backgroundURL?.replace(/^'|'$/g, '')" />
diff --git a/frontend/src/components/Controls/BuilderButton.vue b/frontend/src/components/Controls/BuilderButton.vue new file mode 100644 index 00000000..7c7fd5eb --- /dev/null +++ b/frontend/src/components/Controls/BuilderButton.vue @@ -0,0 +1,33 @@ + + diff --git a/frontend/src/components/CodeEditor.vue b/frontend/src/components/Controls/CodeEditor.vue similarity index 81% rename from frontend/src/components/CodeEditor.vue rename to frontend/src/components/Controls/CodeEditor.vue index 4663a583..cfd30b8a 100644 --- a/frontend/src/components/CodeEditor.vue +++ b/frontend/src/components/Controls/CodeEditor.vue @@ -1,25 +1,19 @@ diff --git a/frontend/src/components/Controls/ImageUploader.vue b/frontend/src/components/Controls/ImageUploader.vue new file mode 100644 index 00000000..5120f834 --- /dev/null +++ b/frontend/src/components/Controls/ImageUploader.vue @@ -0,0 +1,37 @@ + + diff --git a/frontend/src/components/InlineInput.vue b/frontend/src/components/Controls/InlineInput.vue similarity index 92% rename from frontend/src/components/InlineInput.vue rename to frontend/src/components/Controls/InlineInput.vue index 0bc99e43..393b191b 100644 --- a/frontend/src/components/InlineInput.vue +++ b/frontend/src/components/Controls/InlineInput.vue @@ -20,7 +20,7 @@ - + class="w-full" />
diff --git a/frontend/src/components/InputLabel.vue b/frontend/src/components/Controls/InputLabel.vue similarity index 100% rename from frontend/src/components/InputLabel.vue rename to frontend/src/components/Controls/InputLabel.vue diff --git a/frontend/src/components/OptionToggle.vue b/frontend/src/components/Controls/OptionToggle.vue similarity index 94% rename from frontend/src/components/OptionToggle.vue rename to frontend/src/components/Controls/OptionToggle.vue index f79a2250..4105a057 100644 --- a/frontend/src/components/OptionToggle.vue +++ b/frontend/src/components/Controls/OptionToggle.vue @@ -9,9 +9,9 @@
diff --git a/frontend/src/components/DimensionInput.vue b/frontend/src/components/DimensionInput.vue index 0c7698e0..a8da903d 100644 --- a/frontend/src/components/DimensionInput.vue +++ b/frontend/src/components/DimensionInput.vue @@ -22,10 +22,10 @@ @update:modelValue="(val) => blockController.setStyle(property, val)"> diff --git a/frontend/src/components/Input.vue b/frontend/src/components/Input.vue deleted file mode 100644 index f8dbd416..00000000 --- a/frontend/src/components/Input.vue +++ /dev/null @@ -1,49 +0,0 @@ - - diff --git a/frontend/src/components/MainMenu.vue b/frontend/src/components/MainMenu.vue new file mode 100644 index 00000000..d62ae601 --- /dev/null +++ b/frontend/src/components/MainMenu.vue @@ -0,0 +1,73 @@ + + diff --git a/frontend/src/components/MarginHandler.vue b/frontend/src/components/MarginHandler.vue index d5a6fc32..b65d38dc 100644 --- a/frontend/src/components/MarginHandler.vue +++ b/frontend/src/components/MarginHandler.vue @@ -249,6 +249,7 @@ enum Position { const handleMargin = (ev: MouseEvent, position: Position) => { if (props.disableHandlers) return; + ev.preventDefault(); updating.value = true; const startY = ev.clientY; const startX = ev.clientX; @@ -311,7 +312,7 @@ const handleMargin = (ev: MouseEvent, position: Position) => { updating.value = false; mouseUpEvent.preventDefault(); }, - { once: true } + { once: true }, ); }; diff --git a/frontend/src/components/ObjectEditor.vue b/frontend/src/components/ObjectEditor.vue index 58c8bb79..780b4323 100644 --- a/frontend/src/components/ObjectEditor.vue +++ b/frontend/src/components/ObjectEditor.vue @@ -1,27 +1,27 @@