From 480df230560b4d8c9b08decb4b18ad6f1587b1c3 Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Thu, 11 Feb 2021 15:59:19 -0800
Subject: [PATCH 01/15] add blog example using builder.io
---
docs/basic-features/data-fetching.md | 1 +
docs/basic-features/pages.md | 1 +
examples/blog-starter/README.md | 1 +
examples/cms-agilitycms/README.md | 1 +
examples/cms-builder-io/.env.local.example | 2 +
examples/cms-builder-io/.gitignore | 34 +
examples/cms-builder-io/README.md | 101 ++
.../builder/author/joe-public.json | 24 +
.../builder/author/johnny-doe.json | 24 +
.../builder/author/schema.model.json | 96 ++
.../builder/post/first-one.json | 283 ++++
.../builder/post/schema.model.json | 197 +++
.../cms-builder-io/builder/post/second.json | 1293 +++++++++++++++++
examples/cms-builder-io/builder/settings.json | 21 +
examples/cms-builder-io/components/alert.js | 42 +
examples/cms-builder-io/components/avatar.js | 13 +
.../cms-builder-io/components/container.js | 3 +
.../cms-builder-io/components/cover-image.js | 17 +
examples/cms-builder-io/components/date.js | 13 +
examples/cms-builder-io/components/footer.js | 30 +
examples/cms-builder-io/components/header.js | 12 +
.../cms-builder-io/components/hero-post.js | 37 +
examples/cms-builder-io/components/intro.js | 28 +
examples/cms-builder-io/components/layout.js | 16 +
examples/cms-builder-io/components/meta.js | 42 +
.../cms-builder-io/components/more-stories.js | 24 +
.../cms-builder-io/components/post-body.js | 13 +
.../cms-builder-io/components/post-header.js | 30 +
.../cms-builder-io/components/post-preview.js | 31 +
.../cms-builder-io/components/post-title.js | 7 +
.../components/section-separator.js | 3 +
examples/cms-builder-io/jsconfig.json | 10 +
examples/cms-builder-io/lib/api.js | 94 ++
examples/cms-builder-io/lib/constants.js | 10 +
examples/cms-builder-io/next.config.js | 23 +
examples/cms-builder-io/package.json | 24 +
examples/cms-builder-io/pages/_app.js | 7 +
examples/cms-builder-io/pages/_document.js | 15 +
.../pages/api/exit-preview.js | 0
examples/cms-builder-io/pages/api/preview.js | 30 +
examples/cms-builder-io/pages/index.js | 44 +
examples/cms-builder-io/pages/posts/[slug].js | 95 ++
examples/cms-builder-io/postcss.config.js | 18 +
.../public/favicon/android-chrome-192x192.png | Bin 0 -> 4795 bytes
.../public/favicon/android-chrome-512x512.png | Bin 0 -> 14640 bytes
.../public/favicon/apple-touch-icon.png | Bin 0 -> 1327 bytes
.../public/favicon/browserconfig.xml | 9 +
.../public/favicon/favicon-16x16.png | Bin 0 -> 595 bytes
.../public/favicon/favicon-32x32.png | Bin 0 -> 880 bytes
.../cms-builder-io/public/favicon/favicon.ico | Bin 0 -> 15086 bytes
.../public/favicon/mstile-150x150.png | Bin 0 -> 3567 bytes
.../public/favicon/safari-pinned-tab.svg | 33 +
.../public/favicon/site.webmanifest | 19 +
examples/cms-builder-io/styles/index.css | 7 +
examples/cms-builder-io/tailwind.config.js | 37 +
examples/cms-buttercms/README.md | 1 +
examples/cms-contentful/README.md | 1 +
examples/cms-contentful/pages/api/preview.js | 31 -
examples/cms-cosmic/README.md | 1 +
examples/cms-datocms/README.md | 1 +
examples/cms-ghost/README.md | 1 +
examples/cms-graphcms/README.md | 1 +
examples/cms-kontent/README.md | 1 +
examples/cms-prismic/README.md | 1 +
examples/cms-sanity/README.md | 1 +
examples/cms-storyblok/README.md | 1 +
examples/cms-strapi/README.md | 1 +
examples/cms-takeshape/README.md | 1 +
examples/cms-wordpress/README.md | 1 +
69 files changed, 2928 insertions(+), 31 deletions(-)
create mode 100644 examples/cms-builder-io/.env.local.example
create mode 100644 examples/cms-builder-io/.gitignore
create mode 100644 examples/cms-builder-io/README.md
create mode 100644 examples/cms-builder-io/builder/author/joe-public.json
create mode 100644 examples/cms-builder-io/builder/author/johnny-doe.json
create mode 100644 examples/cms-builder-io/builder/author/schema.model.json
create mode 100644 examples/cms-builder-io/builder/post/first-one.json
create mode 100644 examples/cms-builder-io/builder/post/schema.model.json
create mode 100644 examples/cms-builder-io/builder/post/second.json
create mode 100644 examples/cms-builder-io/builder/settings.json
create mode 100644 examples/cms-builder-io/components/alert.js
create mode 100644 examples/cms-builder-io/components/avatar.js
create mode 100644 examples/cms-builder-io/components/container.js
create mode 100644 examples/cms-builder-io/components/cover-image.js
create mode 100644 examples/cms-builder-io/components/date.js
create mode 100644 examples/cms-builder-io/components/footer.js
create mode 100644 examples/cms-builder-io/components/header.js
create mode 100644 examples/cms-builder-io/components/hero-post.js
create mode 100644 examples/cms-builder-io/components/intro.js
create mode 100644 examples/cms-builder-io/components/layout.js
create mode 100644 examples/cms-builder-io/components/meta.js
create mode 100644 examples/cms-builder-io/components/more-stories.js
create mode 100644 examples/cms-builder-io/components/post-body.js
create mode 100644 examples/cms-builder-io/components/post-header.js
create mode 100644 examples/cms-builder-io/components/post-preview.js
create mode 100644 examples/cms-builder-io/components/post-title.js
create mode 100644 examples/cms-builder-io/components/section-separator.js
create mode 100644 examples/cms-builder-io/jsconfig.json
create mode 100644 examples/cms-builder-io/lib/api.js
create mode 100644 examples/cms-builder-io/lib/constants.js
create mode 100644 examples/cms-builder-io/next.config.js
create mode 100644 examples/cms-builder-io/package.json
create mode 100644 examples/cms-builder-io/pages/_app.js
create mode 100644 examples/cms-builder-io/pages/_document.js
rename examples/{cms-contentful => cms-builder-io}/pages/api/exit-preview.js (100%)
create mode 100644 examples/cms-builder-io/pages/api/preview.js
create mode 100644 examples/cms-builder-io/pages/index.js
create mode 100644 examples/cms-builder-io/pages/posts/[slug].js
create mode 100644 examples/cms-builder-io/postcss.config.js
create mode 100644 examples/cms-builder-io/public/favicon/android-chrome-192x192.png
create mode 100644 examples/cms-builder-io/public/favicon/android-chrome-512x512.png
create mode 100644 examples/cms-builder-io/public/favicon/apple-touch-icon.png
create mode 100644 examples/cms-builder-io/public/favicon/browserconfig.xml
create mode 100644 examples/cms-builder-io/public/favicon/favicon-16x16.png
create mode 100644 examples/cms-builder-io/public/favicon/favicon-32x32.png
create mode 100644 examples/cms-builder-io/public/favicon/favicon.ico
create mode 100644 examples/cms-builder-io/public/favicon/mstile-150x150.png
create mode 100644 examples/cms-builder-io/public/favicon/safari-pinned-tab.svg
create mode 100644 examples/cms-builder-io/public/favicon/site.webmanifest
create mode 100644 examples/cms-builder-io/styles/index.css
create mode 100644 examples/cms-builder-io/tailwind.config.js
delete mode 100644 examples/cms-contentful/pages/api/preview.js
diff --git a/docs/basic-features/data-fetching.md b/docs/basic-features/data-fetching.md
index f82f7cac5e110..2c2499565a1fd 100644
--- a/docs/basic-features/data-fetching.md
+++ b/docs/basic-features/data-fetching.md
@@ -23,6 +23,7 @@ description: 'Next.js has 2 pre-rendering modes: Static Generation and Server-si
Storyblok Example (Demo )
GraphCMS Example (Demo )
Kontent Example (Demo )
+ Builder.io Example (Demo )
Static Tweet Demo
diff --git a/docs/basic-features/pages.md b/docs/basic-features/pages.md
index 26d8fd735db29..9f178bc72e673 100644
--- a/docs/basic-features/pages.md
+++ b/docs/basic-features/pages.md
@@ -62,6 +62,7 @@ You can also use **Client-side Rendering** along with Static Generation or Serve
Storyblok Example (Demo )
GraphCMS Example (Demo )
Kontent Example (Demo )
+ Builder.io Example (Demo )
Static Tweet Demo
diff --git a/examples/blog-starter/README.md b/examples/blog-starter/README.md
index bcfee0c665a77..8c36f6db767a6 100644
--- a/examples/blog-starter/README.md
+++ b/examples/blog-starter/README.md
@@ -31,6 +31,7 @@ Deploy the example using [Vercel](https://vercel.com?utm_source=github&utm_mediu
- [Storyblok](/examples/cms-storyblok)
- [GraphCMS](/examples/cms-graphcms)
- [Kontent](/examples/cms-kontent)
+- [Builder.io](/examples/cms-builder-io)
## How to use
diff --git a/examples/cms-agilitycms/README.md b/examples/cms-agilitycms/README.md
index 1dd3886700792..da6f80f1f14fe 100644
--- a/examples/cms-agilitycms/README.md
+++ b/examples/cms-agilitycms/README.md
@@ -31,6 +31,7 @@ Once you have access to [the environment variables you'll need](#step-15-set-up-
- [Kontent](/examples/cms-kontent)
- [Ghost](/examples/cms-ghost)
- [Blog Starter](/examples/blog-starter)
+- [Builder.io](/examples/cms-builder-io)
## How to use
diff --git a/examples/cms-builder-io/.env.local.example b/examples/cms-builder-io/.env.local.example
new file mode 100644
index 0000000000000..e7e28ea094a5a
--- /dev/null
+++ b/examples/cms-builder-io/.env.local.example
@@ -0,0 +1,2 @@
+# Copy this file as .env.local
+BUILDER_PUBLIC_KEY=
diff --git a/examples/cms-builder-io/.gitignore b/examples/cms-builder-io/.gitignore
new file mode 100644
index 0000000000000..1437c53f70bc2
--- /dev/null
+++ b/examples/cms-builder-io/.gitignore
@@ -0,0 +1,34 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# local env files
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+# vercel
+.vercel
diff --git a/examples/cms-builder-io/README.md b/examples/cms-builder-io/README.md
new file mode 100644
index 0000000000000..9eef07fc6b3b5
--- /dev/null
+++ b/examples/cms-builder-io/README.md
@@ -0,0 +1,101 @@
+# A statically generated blog example using Next.js and Builder.io
+
+This example showcases Next.js's [Static Generation](https://nextjs.org/docs/basic-features/pages) feature using [Builder.io](https://builder.io/) as the data source.
+
+## Demo
+
+[https://cms-builder-blog.vercel.app/](https://cms-builder-blog.vercel.app/)
+
+## Deploy your own
+
+Once you have access to [the environment variables you'll need](#step-6-set-up-environment-variables), deploy the example using [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example):
+
+[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/vercel/next.js/tree/canary/examples/cms-storyblok&project-name=cms-storyblok&repository-name=cms-builder-io&env=BUILDER_PUBLIC_KEY&envDescription=Required%20to%20connect%20the%20app%20with%20Builder.io&envLink=https://www.builder.io/c/docs/custom-react-components#api-key)
+
+### Related examples
+
+- [WordPress](/examples/cms-wordpress)
+- [DatoCMS](/examples/cms-datocms)
+- [Sanity](/examples/cms-sanity)
+- [TakeShape](/examples/cms-takeshape)
+- [Prismic](/examples/cms-prismic)
+- [Contentful](/examples/cms-contentful)
+- [Agility CMS](/examples/cms-agilitycms)
+- [Cosmic](/examples/cms-cosmic)
+- [Strapi](/examples/cms-strapi)
+- [ButterCMS](/examples/cms-buttercms)
+- [GraphCMS](/examples/cms-graphcms)
+- [Kontent](/examples/cms-kontent)
+- [Ghost](/examples/cms-ghost)
+- [Blog Starter](/examples/blog-starter)
+
+## How to use
+
+Execute [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app) with [npm](https://docs.npmjs.com/cli/init) or [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/) to bootstrap the example:
+
+```bash
+npx create-next-app --example cms-builder-io my-headless-blog
+# or
+yarn create next-app --example cms-builder-io my-headless-blog
+```
+
+## Configuration
+
+### Install the Builder.io cli
+
+```
+npm install @builder.io/cli -g
+```
+
+### Step 1 Generate your Builder.io space
+
+
+
+[Signup for Builder.io](https://builder.io/signup), then go to your [organization settings page](https://builder.io/account/organization?root=true), create a private key and copy it and supply it for `[private-key]` below. For `[space-name]` create a name for your space, such as "Blog"
+
+```
+cd my-headless-blog
+builder create -k [private-key] -n [space-name] -d
+```
+
+This command when done it'll print your new space's public api key, copy it and add as the value for `BUILDER_PUBLIC_KEY` into the .env files (`.env.production` and `.env.development`)
+
+```
+BUILDER_PUBLIC_KEY=...
+```
+
+### Step 2. Run Next.js in development mode
+
+```bash
+npm install
+npm run dev
+
+# or
+
+yarn install
+yarn dev
+```
+
+Your blog should be up and running on [http://localhost:3000](http://localhost:3000)! If it doesn't work, you can post on [GitHub discussions](https://github.com/vercel/next.js/discussions).
+
+### Step 3. Try preview mode
+
+To try preview mode at any time while editing in Builder.io press `view current draft`, if you changed the secret defined in [constants.js](./lib/constants.js) you'll need to also change it in your `Post` [model settings](https://builder.io/models).
+
+To exit the preview mode, you can click **Click here to exit preview mode** at the top.
+
+### Step 4. Deploy on Vercel
+
+You can deploy this app to the cloud with [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example) ([Documentation](https://nextjs.org/docs/deployment)).
+
+#### Deploy Your Local Project
+
+To deploy your local project to Vercel, push it to GitHub/GitLab/Bitbucket and [import to Vercel](https://vercel.com/new?utm_source=github&utm_medium=readme&utm_campaign=next-example).
+
+**Important**: When you import your project on Vercel, make sure to click on **Environment Variables** and set them to match your `.env.local` file.
+
+#### Deploy from Our Template
+
+Alternatively, you can deploy using our template by clicking on the Deploy button below.
+
+[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/vercel/next.js/tree/canary/examples/cms-builder-io&project-name=cms-builder-io&repository-name=cms-builder-io&env=BUILDER_PUBLIC_KEY&envDescription=Required%20to%20connect%20the%20app%20with%20Builder.io&envLink=https://www.builder.io/c/docs/custom-react-components#api-key)
diff --git a/examples/cms-builder-io/builder/author/joe-public.json b/examples/cms-builder-io/builder/author/joe-public.json
new file mode 100644
index 0000000000000..451d63f24f38f
--- /dev/null
+++ b/examples/cms-builder-io/builder/author/joe-public.json
@@ -0,0 +1,24 @@
+{
+ "createdBy": "4FFFg0MNRJT0z0nW4uUizDHfHJV2",
+ "createdDate": 1613015350978,
+ "data": {
+ "image": "https://cdn.builder.io/api/v1/image/assets%2F8f6bae86bfa3487eb1a18f263118c832%2F6ae860242834453ea87d6057e7df9754",
+ "name": "Joe Public"
+ },
+ "id": "7b0b333bd44b4e91a6f4bf93158cb62b",
+ "lastUpdatedBy": "4FFFg0MNRJT0z0nW4uUizDHfHJV2",
+ "meta": {
+ "kind": "data"
+ },
+ "modelId": "6d30b724c93d4198b0c0ce2d3ce390dc",
+ "name": "Joe Public",
+ "published": "published",
+ "query": [],
+ "testRatio": 1,
+ "variations": {},
+ "lastUpdated": 1613031369279,
+ "rev": "0pjukbnd3ox",
+ "@originOrg": "8f6bae86bfa3487eb1a18f263118c832",
+ "@originContentId": "ba1fb5129adf4c379424d346666cc092",
+ "@originModelId": "c71bab5b43fa42eca870e330a39b59e0"
+}
diff --git a/examples/cms-builder-io/builder/author/johnny-doe.json b/examples/cms-builder-io/builder/author/johnny-doe.json
new file mode 100644
index 0000000000000..d3f3b848ca048
--- /dev/null
+++ b/examples/cms-builder-io/builder/author/johnny-doe.json
@@ -0,0 +1,24 @@
+{
+ "createdBy": "4FFFg0MNRJT0z0nW4uUizDHfHJV2",
+ "createdDate": 1613027534444,
+ "data": {
+ "image": "https://cdn.builder.io/api/v1/image/assets%2F8f6bae86bfa3487eb1a18f263118c832%2F5df565e2c411421082123ea8c1084a73",
+ "name": "Johnny Roe"
+ },
+ "id": "d50fe8eced654b2dae22c738dbeabcee",
+ "lastUpdatedBy": "4FFFg0MNRJT0z0nW4uUizDHfHJV2",
+ "meta": {
+ "kind": "data"
+ },
+ "modelId": "6d30b724c93d4198b0c0ce2d3ce390dc",
+ "name": "Johnny Doe",
+ "published": "published",
+ "query": [],
+ "testRatio": 1,
+ "variations": {},
+ "lastUpdated": 1613067837951,
+ "rev": "0pjukbnd3ox",
+ "@originOrg": "8f6bae86bfa3487eb1a18f263118c832",
+ "@originContentId": "edcaddd1a70f494ba1955704cd88ca4f",
+ "@originModelId": "c71bab5b43fa42eca870e330a39b59e0"
+}
diff --git a/examples/cms-builder-io/builder/author/schema.model.json b/examples/cms-builder-io/builder/author/schema.model.json
new file mode 100644
index 0000000000000..94d2b7db6b3bd
--- /dev/null
+++ b/examples/cms-builder-io/builder/author/schema.model.json
@@ -0,0 +1,96 @@
+{
+ "helperText": "",
+ "injectWcAt": "",
+ "webhooks": [],
+ "showTargeting": true,
+ "sendToMongoDb": true,
+ "hideFromUI": false,
+ "showScheduling": true,
+ "name": "author",
+ "fields": [
+ {
+ "showTemplatePicker": true,
+ "helperText": "",
+ "type": "text",
+ "name": "name",
+ "noPhotoPicker": false,
+ "simpleTextOnly": false,
+ "permissionsRequiredToEdit": "",
+ "@type": "@builder.io/core:Field",
+ "mandatory": false,
+ "required": true,
+ "hideFromFieldsEditor": false,
+ "hideFromUI": false,
+ "model": "",
+ "copyOnAdd": true,
+ "disallowRemove": false,
+ "showIf": "",
+ "advanced": false,
+ "onChange": "",
+ "subFields": [],
+ "autoFocus": false,
+ "hidden": false
+ },
+ {
+ "autoFocus": false,
+ "subFields": [],
+ "name": "image",
+ "required": true,
+ "type": "file",
+ "allowedFileTypes": ["jpeg", "png"],
+ "@type": "@builder.io/core:Field",
+ "copyOnAdd": true,
+ "defaultValue": "https://cdn.builder.io/api/v1/image/assets%2F8f6bae86bfa3487eb1a18f263118c832%2F8c8bf9b14266412497c0090aa3136beb",
+ "showTemplatePicker": true,
+ "noPhotoPicker": false,
+ "mandatory": false,
+ "disallowRemove": false,
+ "showIf": "",
+ "permissionsRequiredToEdit": "",
+ "advanced": false,
+ "onChange": "",
+ "model": "",
+ "hideFromFieldsEditor": false,
+ "hideFromUI": false,
+ "helperText": "",
+ "hidden": false,
+ "simpleTextOnly": false
+ }
+ ],
+ "publicReadable": true,
+ "individualEmbed": false,
+ "schema": {},
+ "lastUpdateBy": null,
+ "subType": "",
+ "id": "6d30b724c93d4198b0c0ce2d3ce390dc",
+ "injectWcPosition": "",
+ "repeatable": false,
+ "archived": false,
+ "hooks": {},
+ "pathPrefix": "/",
+ "requiredTargets": [],
+ "allowBuiltInComponents": true,
+ "isPage": false,
+ "publicWritable": false,
+ "autoTracked": true,
+ "sendToElasticSearch": false,
+ "hideOptions": false,
+ "examplePageUrl": "",
+ "showAbTests": true,
+ "allowTests": true,
+ "getSchemaFromPage": false,
+ "allowMetrics": true,
+ "defaultQuery": [],
+ "useQueryParamTargetingClientSide": false,
+ "kind": "data",
+ "designerVersion": 1,
+ "strictPrivateWrite": false,
+ "componentsOnlyMode": false,
+ "showMetrics": true,
+ "singleton": false,
+ "bigData": false,
+ "hidden": false,
+ "allowHeatmap": true,
+ "strictPrivateRead": false,
+ "@originId": "c71bab5b43fa42eca870e330a39b59e0"
+}
diff --git a/examples/cms-builder-io/builder/post/first-one.json b/examples/cms-builder-io/builder/post/first-one.json
new file mode 100644
index 0000000000000..38e3317e2df74
--- /dev/null
+++ b/examples/cms-builder-io/builder/post/first-one.json
@@ -0,0 +1,283 @@
+{
+ "createdBy": "4FFFg0MNRJT0z0nW4uUizDHfHJV2",
+ "createdDate": 1613015962185,
+ "data": {
+ "author": {
+ "@type": "@builder.io/core:Reference",
+ "id": "d50fe8eced654b2dae22c738dbeabcee",
+ "model": "author"
+ },
+ "image": "https://cdn.builder.io/api/v1/image/assets%2F8f6bae86bfa3487eb1a18f263118c832%2F79e961dbf6d54a9a8f189c5bd48454d8",
+ "inputs": [],
+ "intro": "pellentesque nec nam aliquam. Tincidunt id aliquet risus feugiat in ante metus dictum at. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Tellus cras adipiscing enim eu turpis. Ultrices eros in cursus turpis massa tincidunt dui. Feugiat nisl pretium fusce id. Mauris augue neque gravida infermentum et. Sed elementum tempus egestas sed. At consectetur lorem donec massa sapien faucibus et.",
+ "slug": "first-one",
+ "title": "Now howoiofweewf",
+ "blocks": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-73d17ca4f7bc472dbd5b146c075d7976",
+ "component": {
+ "name": "Core:Section",
+ "options": {
+ "maxWidth": 1200
+ }
+ },
+ "children": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-2ac544bf3b9941b2b4e629e34e44c069",
+ "component": {
+ "name": "Columns",
+ "options": {
+ "columns": [
+ {
+ "blocks": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "layerName": "Centered Box",
+ "id": "builder-90ecefea6830467787059c4a74a67bc9",
+ "children": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "layerName": "Title",
+ "id": "builder-86d8df34f7924d90b1f0326f644f3dd6",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Something Great to Say
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "flexShrink": "0",
+ "position": "relative",
+ "marginTop": "-1.65625px",
+ "textAlign": "center",
+ "lineHeight": "normal",
+ "height": "auto",
+ "fontSize": "33px"
+ },
+ "medium": {
+ "marginTop": "29.34375px",
+ "textAlign": "center"
+ },
+ "small": {
+ "fontSize": "25px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "layerName": "Subtitle",
+ "id": "builder-796f2f44186e4206ad59bde67dcd969c",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Orci sagittis eu volutpat odio facilisis mauris. Commodo nulla facilisi nullam vehicula. Tellus cras adipiscing enim eu. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Tempus quam pellentesque nec nam aliquam. Tincidunt id aliquet risus feugiat in ante metus dictum at. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Tellus cras adipiscing enim eu turpis. Ultrices eros in cursus turpis massa tincidunt dui. Feugiat nisl pretium fusce id. Mauris augue neque gravida infermentum et. Sed elementum tempus egestas sed. At consectetur lorem donec massa sapien faucibus et. Tellus pellentesque eu tincidunt tortor. Blandit turpis cursus in hac habitasse. Dui nunc mattis enim ut tellus elementum sagittis vitae.
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "flexShrink": "0",
+ "position": "relative",
+ "marginTop": "25.59375px",
+ "textAlign": "center",
+ "lineHeight": "normal",
+ "height": "auto",
+ "fontSize": "17px",
+ "color": "rgba(86, 86, 86, 1)"
+ },
+ "medium": {
+ "textAlign": "center"
+ },
+ "small": {
+ "fontSize": "15px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-f299f4294fbb46659a49c44f230ae1e0",
+ "component": {
+ "name": "Core:Button",
+ "options": {
+ "text": "Let's go"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "26px",
+ "appearance": "none",
+ "paddingTop": "15px",
+ "paddingBottom": "15px",
+ "paddingLeft": "31px",
+ "paddingRight": "31px",
+ "backgroundColor": "rgba(50, 50, 50, 1)",
+ "color": "white",
+ "borderRadius": "4px",
+ "textAlign": "center",
+ "marginLeft": "auto",
+ "marginRight": "auto",
+ "cursor": "pointer"
+ },
+ "medium": {
+ "marginLeft": "auto",
+ "marginRight": "auto"
+ }
+ }
+ }
+ ],
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "auto",
+ "marginBottom": "auto",
+ "paddingBottom": "16px"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "blocks": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-104a7e15a7d648e6896fbc98cc9b17ed",
+ "component": {
+ "name": "Image",
+ "options": {
+ "image": "https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F975106936a734566974059059f54ec8d?width=2000&height=1000",
+ "backgroundPosition": "center",
+ "backgroundSize": "cover",
+ "aspectRatio": 0.7004048582995948
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "flexShrink": "0",
+ "position": "relative",
+ "marginTop": "-2.5px",
+ "textAlign": "center",
+ "lineHeight": "normal",
+ "height": "auto"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "space": 42,
+ "stackColumnsAt": "tablet",
+ "reverseColumnsWhenStacked": true
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "2.34375px",
+ "paddingLeft": "0px",
+ "paddingRight": "0px"
+ }
+ }
+ }
+ ],
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "0px",
+ "paddingLeft": "20px",
+ "paddingRight": "20px",
+ "paddingTop": "50px",
+ "paddingBottom": "50px",
+ "width": "100vw",
+ "marginLeft": "calc(50% - 50vw)"
+ }
+ }
+ },
+ {
+ "id": "builder-pixel-3zydvairp32",
+ "@type": "@builder.io/sdk:Element",
+ "tagName": "img",
+ "properties": {
+ "src": "https://cdn.builder.io/api/v1/pixel?apiKey=8f6bae86bfa3487eb1a18f263118c832",
+ "role": "presentation",
+ "width": "0",
+ "height": "0"
+ },
+ "responsiveStyles": {
+ "large": {
+ "height": "0",
+ "width": "0",
+ "display": "inline-block",
+ "opacity": "0",
+ "overflow": "hidden",
+ "pointerEvents": "none"
+ }
+ }
+ }
+ ],
+ "state": {
+ "deviceSize": "large",
+ "location": {
+ "path": "",
+ "query": {}
+ }
+ }
+ },
+ "id": "006452f51b414da189e8ccc576d9805b",
+ "lastUpdatedBy": "agZ9n5CUKRfbL9t6CaJOyVSK4Es2",
+ "meta": {
+ "hasLinks": false,
+ "kind": "component",
+ "needsHydration": false
+ },
+ "modelId": "3f6eda812cf2484088b1451a2150d38f",
+ "name": "first one",
+ "published": "published",
+ "query": [],
+ "testRatio": 1,
+ "variations": {},
+ "lastUpdated": 1613035917446,
+ "screenshot": "https://cdn.builder.io/api/v1/image/assets%2F8f6bae86bfa3487eb1a18f263118c832%2Ffb7a0bb3ded54a8cbcdd8ddd98d24a7e",
+ "rev": "3mj2dvbqtry",
+ "@originOrg": "8f6bae86bfa3487eb1a18f263118c832",
+ "@originContentId": "e7951ec30b1c496b87b3fa2c98192a79",
+ "@originModelId": "7a732bbf5d964e7bbeff4acef2735c8a"
+}
diff --git a/examples/cms-builder-io/builder/post/schema.model.json b/examples/cms-builder-io/builder/post/schema.model.json
new file mode 100644
index 0000000000000..d1b3ee11d4cd6
--- /dev/null
+++ b/examples/cms-builder-io/builder/post/schema.model.json
@@ -0,0 +1,197 @@
+{
+ "requiredTargets": [],
+ "publicWritable": false,
+ "fields": [
+ {
+ "noPhotoPicker": false,
+ "permissionsRequiredToEdit": "",
+ "required": true,
+ "hideFromUI": false,
+ "onChange": "",
+ "hidden": false,
+ "autoFocus": false,
+ "hideFromFieldsEditor": true,
+ "simpleTextOnly": false,
+ "name": "blocks",
+ "mandatory": false,
+ "showTemplatePicker": true,
+ "showIf": "",
+ "advanced": false,
+ "copyOnAdd": true,
+ "subFields": [],
+ "model": "",
+ "disallowRemove": false,
+ "@type": "@builder.io/core:Field",
+ "type": "uiBlocks",
+ "helperText": ""
+ },
+ {
+ "showIf": "",
+ "copyOnAdd": true,
+ "showTemplatePicker": true,
+ "hideFromFieldsEditor": false,
+ "advanced": false,
+ "type": "text",
+ "model": "",
+ "hidden": false,
+ "disallowRemove": false,
+ "hideFromUI": false,
+ "permissionsRequiredToEdit": "",
+ "onChange": "",
+ "subFields": [],
+ "simpleTextOnly": false,
+ "name": "title",
+ "required": true,
+ "defaultValue": "Blog title",
+ "autoFocus": false,
+ "noPhotoPicker": false,
+ "@type": "@builder.io/core:Field",
+ "mandatory": false,
+ "helperText": ""
+ },
+ {
+ "showIf": "",
+ "mandatory": false,
+ "defaultValue": "https://cdn.builder.io/api/v1/image/assets%2F8f6bae86bfa3487eb1a18f263118c832%2Fb5d394eb6ab342a0a2f2de8ef2ba496a",
+ "copyOnAdd": true,
+ "hideFromUI": false,
+ "hidden": false,
+ "autoFocus": false,
+ "type": "file",
+ "allowedFileTypes": ["jpeg", "png"],
+ "onChange": "",
+ "showTemplatePicker": true,
+ "model": "",
+ "hideFromFieldsEditor": false,
+ "disallowRemove": false,
+ "permissionsRequiredToEdit": "",
+ "subFields": [],
+ "name": "image",
+ "advanced": false,
+ "required": false,
+ "simpleTextOnly": false,
+ "noPhotoPicker": false,
+ "helperText": "open graph image",
+ "@type": "@builder.io/core:Field"
+ },
+ {
+ "permissionsRequiredToEdit": "",
+ "@type": "@builder.io/core:Field",
+ "subFields": [],
+ "copyOnAdd": true,
+ "hideFromUI": false,
+ "modelId": "6d30b724c93d4198b0c0ce2d3ce390dc",
+ "simpleTextOnly": false,
+ "helperText": "Author of the post",
+ "showIf": "",
+ "noPhotoPicker": false,
+ "mandatory": false,
+ "showTemplatePicker": true,
+ "onChange": "",
+ "advanced": false,
+ "type": "reference",
+ "autoFocus": false,
+ "model": "",
+ "hidden": false,
+ "required": true,
+ "defaultValue": {
+ "id": "7b0b333bd44b4e91a6f4bf93158cb62b",
+ "model": "author",
+ "@type": "@builder.io/core:Reference"
+ },
+ "name": "author",
+ "hideFromFieldsEditor": false,
+ "disallowRemove": false
+ },
+ {
+ "showIf": "",
+ "helperText": "",
+ "showTemplatePicker": true,
+ "disallowRemove": false,
+ "autoFocus": false,
+ "hideFromFieldsEditor": false,
+ "mandatory": false,
+ "hidden": false,
+ "onChange": "",
+ "name": "intro",
+ "simpleTextOnly": false,
+ "permissionsRequiredToEdit": "",
+ "@type": "@builder.io/core:Field",
+ "hideFromUI": false,
+ "type": "longText",
+ "advanced": false,
+ "defaultValue": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Orci sagittis eu volutpat odio facilisis mauris. Commodo nulla facilisi nullam vehicula. Tellus cras adipiscing enim eu. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Tempus quam pellentesque nec nam aliquam. Tincidunt id aliquet risus feugiat in ante metus dictum at. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Tellus cras adipiscing enim eu turpis. Ultrices eros in cursus turpis massa tincidunt dui. Feugiat nisl pretium fusce id. Mauris augue neque gravida in fermentum et. Sed elementum tempus egestas sed. At consectetur lorem donec massa sapien faucibus et. Tellus pellentesque eu tincidunt tortor. Blandit turpis cursus in hac habitasse. Dui nunc mattis enim ut tellus elementum sagittis vitae.",
+ "copyOnAdd": true,
+ "required": false,
+ "noPhotoPicker": false,
+ "subFields": [],
+ "model": ""
+ },
+ {
+ "permissionsRequiredToEdit": "",
+ "defaultValue": "default-one",
+ "helperText": "",
+ "hideFromFieldsEditor": false,
+ "required": true,
+ "subFields": [],
+ "noPhotoPicker": false,
+ "advanced": false,
+ "onChange": "",
+ "showIf": "",
+ "hidden": false,
+ "mandatory": false,
+ "model": "",
+ "name": "slug",
+ "hideFromUI": false,
+ "type": "text",
+ "@type": "@builder.io/core:Field",
+ "simpleTextOnly": false,
+ "showTemplatePicker": true,
+ "copyOnAdd": true,
+ "disallowRemove": false,
+ "autoFocus": false
+ }
+ ],
+ "sendToMongoDb": true,
+ "archived": false,
+ "componentsOnlyMode": false,
+ "autoTracked": true,
+ "allowTests": true,
+ "showScheduling": true,
+ "designerVersion": 1,
+ "getSchemaFromPage": false,
+ "injectWcAt": "",
+ "sendToElasticSearch": false,
+ "individualEmbed": false,
+ "hidden": false,
+ "injectWcPosition": "",
+ "webhooks": [],
+ "showTargeting": true,
+ "allowMetrics": true,
+ "showMetrics": true,
+ "subType": "",
+ "allowHeatmap": true,
+ "showAbTests": true,
+ "pathPrefix": "/",
+ "id": "3f6eda812cf2484088b1451a2150d38f",
+ "isPage": false,
+ "kind": "component",
+ "repeatable": false,
+ "lastUpdateBy": null,
+ "hooks": {},
+ "hideOptions": false,
+ "strictPrivateRead": false,
+ "strictPrivateWrite": false,
+ "hideFromUI": false,
+ "examplePageUrl": "http://localhost:3000/api/preview?secret=micky-mouse",
+ "allowBuiltInComponents": true,
+ "name": "post",
+ "singleton": false,
+ "useQueryParamTargetingClientSide": false,
+ "publicReadable": true,
+ "defaultQuery": [],
+ "helperText": "",
+ "bigData": false,
+ "schema": {},
+ "@originId": "7a732bbf5d964e7bbeff4acef2735c8a"
+}
diff --git a/examples/cms-builder-io/builder/post/second.json b/examples/cms-builder-io/builder/post/second.json
new file mode 100644
index 0000000000000..5fdac0b13ba4b
--- /dev/null
+++ b/examples/cms-builder-io/builder/post/second.json
@@ -0,0 +1,1293 @@
+{
+ "createdBy": "4FFFg0MNRJT0z0nW4uUizDHfHJV2",
+ "createdDate": 1613031378505,
+ "data": {
+ "author": {
+ "@type": "@builder.io/core:Reference",
+ "id": "7b0b333bd44b4e91a6f4bf93158cb62b",
+ "model": "author"
+ },
+ "customFonts": [
+ {
+ "family": "Allura",
+ "isUserFont": true
+ }
+ ],
+ "image": "https://cdn.builder.io/api/v1/image/assets%2F8f6bae86bfa3487eb1a18f263118c832%2Ff2b8319ddd4642209af3a9a09f408dfd",
+ "inputs": [],
+ "intro": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore",
+ "slug": "second-one",
+ "title": "aber",
+ "blocks": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-003e28d053a145cf808c21773addd456",
+ "component": {
+ "name": "Core:Section",
+ "options": {
+ "maxWidth": 1200
+ }
+ },
+ "children": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-33d0b6c8b55b497db53fe28330606698",
+ "component": {
+ "name": "Columns",
+ "options": {
+ "columns": [
+ {
+ "blocks": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-9aead75dcd994cacaae186940a24b096",
+ "component": {
+ "name": "Image",
+ "options": {
+ "image": "https://cdn.builder.io/api/v1/image/assets%2F8f6bae86bfa3487eb1a18f263118c832%2F83d80cd184c84a93bf9ed141114671b1",
+ "backgroundSize": "cover",
+ "backgroundPosition": "top",
+ "lazy": false,
+ "aspectRatio": 1.1104,
+ "height": 1300,
+ "width": 867,
+ "sizes": "(max-width: 638px) 76vw, 34vw"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "20px",
+ "minHeight": "20px",
+ "minWidth": "20px",
+ "overflow": "hidden",
+ "paddingBottom": "0px"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "blocks": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-9e7671596631470a9ba962fb6d53fe91",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "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. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "flexShrink": "0",
+ "position": "relative",
+ "marginTop": "30px",
+ "textAlign": "left",
+ "lineHeight": "25px",
+ "height": "auto"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-e4df8c2cf25842b6abee292e4f9fd1e8",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "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. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "flexShrink": "0",
+ "position": "relative",
+ "marginTop": "30px",
+ "textAlign": "left",
+ "lineHeight": "25px",
+ "height": "auto"
+ },
+ "small": {
+ "fontSize": "14px",
+ "marginTop": "10px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-c28284ce96b047f79801b04c4b7fd60b",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Lorem ipsum dolor sit amet,
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "flexShrink": "0",
+ "position": "relative",
+ "marginTop": "20px",
+ "textAlign": "left",
+ "lineHeight": "25px",
+ "height": "auto"
+ },
+ "small": {
+ "fontSize": "14px",
+ "marginTop": "10px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-0ea495fde38a41e883e89d9287e6a604",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Jane Smith
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "flexShrink": "0",
+ "position": "relative",
+ "marginTop": "20px",
+ "textAlign": "left",
+ "lineHeight": "25px",
+ "height": "auto",
+ "fontFamily": "Allura, sans-serif",
+ "fontWeight": "600",
+ "fontSize": "28px"
+ },
+ "medium": {
+ "paddingBottom": "0px"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-fd5fdad1673a4ccfb6b75e013b66502f",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Co-Founder of store
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "flexShrink": "0",
+ "position": "relative",
+ "marginTop": "-1px",
+ "textAlign": "left",
+ "lineHeight": "25px",
+ "height": "auto"
+ },
+ "medium": {
+ "paddingBottom": "20px"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "space": 34,
+ "stackColumnsAt": "tablet"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "width": "80%",
+ "marginLeft": "auto",
+ "marginRight": "auto"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-58f738032526435288296afb482b930b",
+ "children": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-16978c305ac34c5e84353eca5778904f",
+ "children": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-2509355e0a8a4b68861590c796b31701",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Our approach
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "20px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center",
+ "fontWeight": "600",
+ "fontSize": "28px",
+ "color": "rgba(2, 75, 194, 1)"
+ }
+ }
+ }
+ ],
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "20px",
+ "height": "auto",
+ "paddingBottom": "30px"
+ }
+ }
+ }
+ ],
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "30px",
+ "height": "auto",
+ "width": "100vw",
+ "marginLeft": "calc(50% - 50vw)",
+ "backgroundColor": "rgba(242, 246, 252, 1)",
+ "paddingBottom": "30px",
+ "paddingTop": "25px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-514ba8f61b5948e58c0608bf1c8b2b62",
+ "children": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-4e53d65a8c3d4afc8b9d9ec077a00feb",
+ "children": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-9ddf5078aecc4d03bf5cacc6581bf9ef",
+ "component": {
+ "name": "Image",
+ "options": {
+ "image": "https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F042a6dc74b764273be4758ddb3cf3f31?width=598",
+ "backgroundSize": "cover",
+ "backgroundPosition": "center",
+ "lazy": true,
+ "aspectRatio": 0.6213,
+ "sizes": "(max-width: 998px) 31vw, 28vw",
+ "height": 1300,
+ "width": 868,
+ "srcset": "https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F042a6dc74b764273be4758ddb3cf3f31?width=100 100w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F042a6dc74b764273be4758ddb3cf3f31?width=200 200w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F042a6dc74b764273be4758ddb3cf3f31?width=400 400w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F042a6dc74b764273be4758ddb3cf3f31?width=800 800w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F042a6dc74b764273be4758ddb3cf3f31?width=1200 1200w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F042a6dc74b764273be4758ddb3cf3f31?width=1600 1600w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F042a6dc74b764273be4758ddb3cf3f31?width=2000 2000w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F042a6dc74b764273be4758ddb3cf3f31?width=598 598w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F042a6dc74b764273be4758ddb3cf3f31?width=307 307w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F042a6dc74b764273be4758ddb3cf3f31?width=384 384w"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "width": "100%",
+ "minHeight": "20px",
+ "minWidth": "20px",
+ "overflow": "hidden"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-50f46cd9d5d146e58577f499feee20a0",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Collection name
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "20px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center",
+ "fontSize": "18px",
+ "fontWeight": "600"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-3df2858a55bd44dcb795bb412045747b",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "5px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-6d6f3f3d45b04df6a71a7d65c7b95d61",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Shop this collection →
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "5px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center",
+ "color": "rgba(2, 75, 194, 1)"
+ },
+ "medium": {
+ "color": "rgba(2, 75, 194, 1)"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ }
+ ],
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "0px",
+ "height": "auto",
+ "width": "32%",
+ "paddingBottom": "30px",
+ "marginLeft": "10px"
+ },
+ "medium": {
+ "width": "45%"
+ },
+ "small": {
+ "width": "100%",
+ "marginLeft": "0px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-21e217f6344a4846bdcb2e9115ef7071",
+ "children": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-093537281eeb474b9840d11ae59128e9",
+ "component": {
+ "name": "Image",
+ "options": {
+ "image": "https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F75cc3d48325a4b48aeaf1e3650bc12b3?width=598",
+ "backgroundSize": "cover",
+ "backgroundPosition": "center",
+ "lazy": true,
+ "aspectRatio": 0.6213,
+ "sizes": "(max-width: 998px) 31vw, 28vw",
+ "height": 1300,
+ "width": 868,
+ "srcset": "https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F75cc3d48325a4b48aeaf1e3650bc12b3?width=100 100w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F75cc3d48325a4b48aeaf1e3650bc12b3?width=200 200w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F75cc3d48325a4b48aeaf1e3650bc12b3?width=400 400w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F75cc3d48325a4b48aeaf1e3650bc12b3?width=800 800w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F75cc3d48325a4b48aeaf1e3650bc12b3?width=1200 1200w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F75cc3d48325a4b48aeaf1e3650bc12b3?width=1600 1600w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F75cc3d48325a4b48aeaf1e3650bc12b3?width=2000 2000w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F75cc3d48325a4b48aeaf1e3650bc12b3?width=598 598w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F75cc3d48325a4b48aeaf1e3650bc12b3?width=307 307w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F75cc3d48325a4b48aeaf1e3650bc12b3?width=384 384w"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "width": "100%",
+ "minHeight": "20px",
+ "minWidth": "20px",
+ "overflow": "hidden"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-a6ef7f24494443e5bbb3c9781112149d",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Collection name
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "20px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center",
+ "fontSize": "18px",
+ "fontWeight": "600"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-43772cda114940d9bdd5ed075c2668ad",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "5px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-eed1a02358bc4acfb494dbcca9855dfc",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Shop this collection →
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "5px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center",
+ "color": "rgba(2, 75, 194, 1)"
+ },
+ "medium": {
+ "color": "rgba(2, 75, 194, 1)"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ }
+ ],
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "0px",
+ "height": "auto",
+ "width": "32%",
+ "paddingBottom": "30px",
+ "marginLeft": "10px"
+ },
+ "medium": {
+ "width": "45%"
+ },
+ "small": {
+ "width": "100%",
+ "marginLeft": "0px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-5f72a8af06ce48699f73db3b7264b2c1",
+ "children": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-a090ffb2f1de4c698430f0f9064afe1a",
+ "component": {
+ "name": "Image",
+ "options": {
+ "image": "https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fea7f818a036f4d8c83a8b24b2cae9f15?width=598",
+ "backgroundSize": "cover",
+ "backgroundPosition": "center",
+ "lazy": true,
+ "aspectRatio": 0.6213,
+ "sizes": "(max-width: 998px) 31vw, 28vw",
+ "height": 1300,
+ "width": 868,
+ "srcset": "https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fea7f818a036f4d8c83a8b24b2cae9f15?width=100 100w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fea7f818a036f4d8c83a8b24b2cae9f15?width=200 200w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fea7f818a036f4d8c83a8b24b2cae9f15?width=400 400w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fea7f818a036f4d8c83a8b24b2cae9f15?width=800 800w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fea7f818a036f4d8c83a8b24b2cae9f15?width=1200 1200w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fea7f818a036f4d8c83a8b24b2cae9f15?width=1600 1600w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fea7f818a036f4d8c83a8b24b2cae9f15?width=2000 2000w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fea7f818a036f4d8c83a8b24b2cae9f15?width=598 598w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fea7f818a036f4d8c83a8b24b2cae9f15?width=307 307w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fea7f818a036f4d8c83a8b24b2cae9f15?width=384 384w"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "width": "100%",
+ "minHeight": "20px",
+ "minWidth": "20px",
+ "overflow": "hidden"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-a9be61d17d7141539031b387eaa442e8",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Collection name
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "20px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center",
+ "fontSize": "18px",
+ "fontWeight": "600"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-28f967a79a434006a31c81bcd1797c68",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "5px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-d86dfa71dc8540b2909a91ea8ac6b4b4",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Shop this collection →
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "5px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center",
+ "color": "rgba(2, 75, 194, 1)"
+ },
+ "medium": {
+ "color": "rgba(2, 75, 194, 1)"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ }
+ ],
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "0px",
+ "height": "auto",
+ "width": "32%",
+ "paddingBottom": "30px",
+ "marginLeft": "10px"
+ },
+ "medium": {
+ "width": "45%"
+ },
+ "small": {
+ "width": "100%",
+ "marginLeft": "0px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-eed3f9e5371d43408fb9738a206f73ba",
+ "children": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-476cb53479224af1898ecceadf3a587a",
+ "component": {
+ "name": "Image",
+ "options": {
+ "image": "https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fa6b91fce9c7943399d6ba504b560e1eb?width=598",
+ "backgroundSize": "cover",
+ "backgroundPosition": "center",
+ "lazy": true,
+ "aspectRatio": 0.6213,
+ "sizes": "(max-width: 998px) 31vw, 28vw",
+ "height": 1300,
+ "width": 868,
+ "srcset": "https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fa6b91fce9c7943399d6ba504b560e1eb?width=100 100w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fa6b91fce9c7943399d6ba504b560e1eb?width=200 200w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fa6b91fce9c7943399d6ba504b560e1eb?width=400 400w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fa6b91fce9c7943399d6ba504b560e1eb?width=800 800w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fa6b91fce9c7943399d6ba504b560e1eb?width=1200 1200w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fa6b91fce9c7943399d6ba504b560e1eb?width=1600 1600w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fa6b91fce9c7943399d6ba504b560e1eb?width=2000 2000w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fa6b91fce9c7943399d6ba504b560e1eb?width=598 598w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fa6b91fce9c7943399d6ba504b560e1eb?width=307 307w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fa6b91fce9c7943399d6ba504b560e1eb?width=384 384w"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "width": "100%",
+ "minHeight": "20px",
+ "minWidth": "20px",
+ "overflow": "hidden"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-c9563979146c4c229cf5f8788e63e10d",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Collection name
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "20px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center",
+ "fontSize": "18px",
+ "fontWeight": "600"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-afa27b9b60fd4c0880064f476712fa2d",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "5px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-d7435c0c8eeb44bfa070cdc4999b2b13",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Shop this collection →
\n"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "5px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center",
+ "color": "rgba(2, 75, 194, 1)"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ }
+ ],
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "0px",
+ "height": "auto",
+ "width": "32%",
+ "paddingBottom": "30px",
+ "marginLeft": "10px"
+ },
+ "medium": {
+ "width": "45%"
+ },
+ "small": {
+ "width": "100%",
+ "marginLeft": "0px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-9e246b64553c40ed8bb49a619056a4d8",
+ "children": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-2c6e3c65976f4e95bbd777542fd5caca",
+ "component": {
+ "name": "Image",
+ "options": {
+ "image": "https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F3b73348d1e934e51b29340e41acae8a1?width=598",
+ "backgroundSize": "cover",
+ "backgroundPosition": "center",
+ "lazy": true,
+ "aspectRatio": 0.6213,
+ "sizes": "(max-width: 998px) 31vw, 28vw",
+ "height": 1300,
+ "width": 868,
+ "srcset": "https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F3b73348d1e934e51b29340e41acae8a1?width=100 100w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F3b73348d1e934e51b29340e41acae8a1?width=200 200w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F3b73348d1e934e51b29340e41acae8a1?width=400 400w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F3b73348d1e934e51b29340e41acae8a1?width=800 800w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F3b73348d1e934e51b29340e41acae8a1?width=1200 1200w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F3b73348d1e934e51b29340e41acae8a1?width=1600 1600w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F3b73348d1e934e51b29340e41acae8a1?width=2000 2000w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F3b73348d1e934e51b29340e41acae8a1?width=598 598w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F3b73348d1e934e51b29340e41acae8a1?width=307 307w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F3b73348d1e934e51b29340e41acae8a1?width=384 384w"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "width": "100%",
+ "minHeight": "20px",
+ "minWidth": "20px",
+ "overflow": "hidden"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-7a6999eea6404db28bdbae7e4b433bc3",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Collection name
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "20px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center",
+ "fontSize": "18px",
+ "fontWeight": "600"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-53c35499a0694e939e8b794e103039d2",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "5px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-da1cafe52692406aa46592cc0d98ba4d",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Shop this collection →
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "5px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center",
+ "color": "rgba(2, 75, 194, 1)"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ }
+ ],
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "0px",
+ "height": "auto",
+ "width": "32%",
+ "paddingBottom": "30px",
+ "marginLeft": "10px"
+ },
+ "medium": {
+ "width": "45%"
+ },
+ "small": {
+ "width": "100%",
+ "marginLeft": "0px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-d529c10768684a539019c0d4faf79ab6",
+ "children": [
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-a13520343f3944aab3f070a76ce648d7",
+ "component": {
+ "name": "Image",
+ "options": {
+ "image": "https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fbf5de7cba2434d4980bba0b4a293420e?width=598",
+ "backgroundSize": "cover",
+ "backgroundPosition": "center",
+ "lazy": true,
+ "aspectRatio": 0.6213,
+ "sizes": "(max-width: 998px) 31vw, 28vw",
+ "height": 1300,
+ "width": 868,
+ "srcset": "https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fbf5de7cba2434d4980bba0b4a293420e?width=100 100w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fbf5de7cba2434d4980bba0b4a293420e?width=200 200w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fbf5de7cba2434d4980bba0b4a293420e?width=400 400w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fbf5de7cba2434d4980bba0b4a293420e?width=800 800w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fbf5de7cba2434d4980bba0b4a293420e?width=1200 1200w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fbf5de7cba2434d4980bba0b4a293420e?width=1600 1600w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fbf5de7cba2434d4980bba0b4a293420e?width=2000 2000w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fbf5de7cba2434d4980bba0b4a293420e?width=598 598w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fbf5de7cba2434d4980bba0b4a293420e?width=307 307w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2Fbf5de7cba2434d4980bba0b4a293420e?width=384 384w"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "width": "100%",
+ "minHeight": "20px",
+ "minWidth": "20px",
+ "overflow": "hidden"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-e7fac6c2cd8946e4821bd4567a20ac04",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Collection name
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "20px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center",
+ "fontSize": "18px",
+ "fontWeight": "600"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-0c7430abba114fdc923e17c8812c2d7f",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "5px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ },
+ {
+ "@type": "@builder.io/sdk:Element",
+ "@version": 2,
+ "id": "builder-2d2f4bed888240d2a79200b02ff223b2",
+ "component": {
+ "name": "Text",
+ "options": {
+ "text": "Shop this collection →
"
+ }
+ },
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "5px",
+ "lineHeight": "normal",
+ "height": "auto",
+ "textAlign": "center",
+ "color": "rgba(2, 75, 194, 1)"
+ },
+ "small": {
+ "fontSize": "14px"
+ }
+ }
+ }
+ ],
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "0px",
+ "height": "auto",
+ "width": "32%",
+ "paddingBottom": "30px",
+ "marginLeft": "10px"
+ },
+ "medium": {
+ "width": "45%"
+ },
+ "small": {
+ "width": "100%",
+ "marginLeft": "0px"
+ }
+ }
+ }
+ ],
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "row",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "20px",
+ "width": "100%",
+ "paddingBottom": "30px",
+ "flexWrap": "wrap",
+ "justifyContent": "center"
+ }
+ }
+ }
+ ],
+ "responsiveStyles": {
+ "large": {
+ "display": "flex",
+ "flexDirection": "column",
+ "alignItems": "stretch",
+ "position": "relative",
+ "flexShrink": "0",
+ "boxSizing": "border-box",
+ "marginTop": "0px",
+ "paddingLeft": "20px",
+ "paddingRight": "20px",
+ "paddingTop": "50px",
+ "paddingBottom": "50px",
+ "width": "100vw",
+ "marginLeft": "calc(50% - 50vw)"
+ }
+ }
+ },
+ {
+ "id": "builder-pixel-o7ofge7v1he",
+ "@type": "@builder.io/sdk:Element",
+ "tagName": "img",
+ "properties": {
+ "src": "https://cdn.builder.io/api/v1/pixel?apiKey=8f6bae86bfa3487eb1a18f263118c832",
+ "role": "presentation",
+ "width": "0",
+ "height": "0"
+ },
+ "responsiveStyles": {
+ "large": {
+ "height": "0",
+ "width": "0",
+ "display": "inline-block",
+ "opacity": "0",
+ "overflow": "hidden",
+ "pointerEvents": "none"
+ }
+ }
+ }
+ ],
+ "state": {
+ "deviceSize": "large",
+ "location": {
+ "path": "",
+ "query": {}
+ }
+ }
+ },
+ "id": "aa5cde0446204c228a11ea6ff10fff92",
+ "lastUpdatedBy": "4FFFg0MNRJT0z0nW4uUizDHfHJV2",
+ "meta": {
+ "hasLinks": false,
+ "kind": "component",
+ "needsHydration": false
+ },
+ "modelId": "3f6eda812cf2484088b1451a2150d38f",
+ "name": "second ",
+ "published": "published",
+ "query": [],
+ "testRatio": 1,
+ "variations": {},
+ "lastUpdated": 1613033616315,
+ "screenshot": "https://cdn.builder.io/api/v1/image/assets%2F8f6bae86bfa3487eb1a18f263118c832%2Fae6b7a78f9994ba2bded4527c22b647f",
+ "rev": "3mj2dvbqtry",
+ "@originOrg": "8f6bae86bfa3487eb1a18f263118c832",
+ "@originContentId": "3ff20a4db1994618bb45ac7c8610300f",
+ "@originModelId": "7a732bbf5d964e7bbeff4acef2735c8a"
+}
diff --git a/examples/cms-builder-io/builder/settings.json b/examples/cms-builder-io/builder/settings.json
new file mode 100644
index 0000000000000..8de1d0eed2971
--- /dev/null
+++ b/examples/cms-builder-io/builder/settings.json
@@ -0,0 +1,21 @@
+{
+ "hasIntegrated": "local",
+ "siteUrl": "http://localhost:3000",
+ "type": "space",
+ "name": "blog-test",
+ "@version": 5,
+ "cloneInfo": {
+ "contentIdMap": {
+ "ba1fb5129adf4c379424d346666cc092": "7b0b333bd44b4e91a6f4bf93158cb62b",
+ "edcaddd1a70f494ba1955704cd88ca4f": "d50fe8eced654b2dae22c738dbeabcee",
+ "a9670a29beb04ab98fa9ad87da782363": "c9a48699668448daa6988f2fcad3cd34",
+ "e7951ec30b1c496b87b3fa2c98192a79": "006452f51b414da189e8ccc576d9805b",
+ "3ff20a4db1994618bb45ac7c8610300f": "aa5cde0446204c228a11ea6ff10fff92"
+ },
+ "modelIdMap": {
+ "c71bab5b43fa42eca870e330a39b59e0": "6d30b724c93d4198b0c0ce2d3ce390dc",
+ "06fbdb4d7ab6473f8ec8afad46acaa2a": "7f355eb3798c4d4286a5d12e8f0a3009",
+ "7a732bbf5d964e7bbeff4acef2735c8a": "3f6eda812cf2484088b1451a2150d38f"
+ }
+ }
+}
diff --git a/examples/cms-builder-io/components/alert.js b/examples/cms-builder-io/components/alert.js
new file mode 100644
index 0000000000000..051f3319649ed
--- /dev/null
+++ b/examples/cms-builder-io/components/alert.js
@@ -0,0 +1,42 @@
+import Container from './container'
+import cn from 'classnames'
+import { EXAMPLE_PATH } from '@/lib/constants'
+
+export default function Alert({ preview }) {
+ return (
+
+
+
+ {preview ? (
+ <>
+ This is page is a preview.{' '}
+
+ Click here
+ {' '}
+ to exit preview mode.
+ >
+ ) : (
+ <>
+ The source code for this blog is{' '}
+
+ available on GitHub
+
+ .
+ >
+ )}
+
+
+
+ )
+}
diff --git a/examples/cms-builder-io/components/avatar.js b/examples/cms-builder-io/components/avatar.js
new file mode 100644
index 0000000000000..b8f85068646d6
--- /dev/null
+++ b/examples/cms-builder-io/components/avatar.js
@@ -0,0 +1,13 @@
+export default function Avatar({ name, picture }) {
+ console.log('here ', name, picture)
+ return (
+
+
+
{name}
+
+ )
+}
diff --git a/examples/cms-builder-io/components/container.js b/examples/cms-builder-io/components/container.js
new file mode 100644
index 0000000000000..fc1c29dfb0747
--- /dev/null
+++ b/examples/cms-builder-io/components/container.js
@@ -0,0 +1,3 @@
+export default function Container({ children }) {
+ return {children}
+}
diff --git a/examples/cms-builder-io/components/cover-image.js b/examples/cms-builder-io/components/cover-image.js
new file mode 100644
index 0000000000000..22a4852faa340
--- /dev/null
+++ b/examples/cms-builder-io/components/cover-image.js
@@ -0,0 +1,17 @@
+import Link from 'next/link'
+
+export default function CoverImage({ title, url, slug }) {
+ return (
+
+ {slug ? (
+
+
+
+
+
+ ) : (
+
+ )}
+
+ )
+}
diff --git a/examples/cms-builder-io/components/date.js b/examples/cms-builder-io/components/date.js
new file mode 100644
index 0000000000000..6503e2986d5c0
--- /dev/null
+++ b/examples/cms-builder-io/components/date.js
@@ -0,0 +1,13 @@
+import { parseISO, format } from 'date-fns'
+import { useEffect, useState } from 'react'
+
+// dateString might be null for unpublished posts
+export default function DateComponent({ dateString }) {
+ const [date, setDate] = useState(dateString ? parseISO(dateString) : null)
+ useEffect(() => {
+ if (!date) {
+ setDate(new Date())
+ }
+ }, [date])
+ return date && {format(date, 'LLLL d, yyyy')}
+}
diff --git a/examples/cms-builder-io/components/footer.js b/examples/cms-builder-io/components/footer.js
new file mode 100644
index 0000000000000..b305c3eb40b0d
--- /dev/null
+++ b/examples/cms-builder-io/components/footer.js
@@ -0,0 +1,30 @@
+import Container from './container'
+import { EXAMPLE_PATH } from '@/lib/constants'
+
+export default function Footer() {
+ return (
+
+
+
+
+ Statically Generated with Next.js.
+
+
+
+
+
+ )
+}
diff --git a/examples/cms-builder-io/components/header.js b/examples/cms-builder-io/components/header.js
new file mode 100644
index 0000000000000..562e7e3eebb6a
--- /dev/null
+++ b/examples/cms-builder-io/components/header.js
@@ -0,0 +1,12 @@
+import Link from 'next/link'
+
+export default function Header() {
+ return (
+
+
+ Blog
+
+ .
+
+ )
+}
diff --git a/examples/cms-builder-io/components/hero-post.js b/examples/cms-builder-io/components/hero-post.js
new file mode 100644
index 0000000000000..8a8a9a1186feb
--- /dev/null
+++ b/examples/cms-builder-io/components/hero-post.js
@@ -0,0 +1,37 @@
+import Avatar from './avatar'
+import Date from './date'
+import CoverImage from './cover-image'
+import Link from 'next/link'
+
+export default function HeroPost({
+ title,
+ coverImage,
+ date,
+ excerpt,
+ author,
+ slug,
+}) {
+ return (
+
+ )
+}
diff --git a/examples/cms-builder-io/components/intro.js b/examples/cms-builder-io/components/intro.js
new file mode 100644
index 0000000000000..c3003c6196642
--- /dev/null
+++ b/examples/cms-builder-io/components/intro.js
@@ -0,0 +1,28 @@
+import { CMS_NAME, CMS_URL } from '@/lib/constants'
+
+export default function Intro() {
+ return (
+
+ )
+}
diff --git a/examples/cms-builder-io/components/layout.js b/examples/cms-builder-io/components/layout.js
new file mode 100644
index 0000000000000..399802b095aa7
--- /dev/null
+++ b/examples/cms-builder-io/components/layout.js
@@ -0,0 +1,16 @@
+import Alert from './alert'
+import Footer from './footer'
+import Meta from './meta'
+
+export default function Layout({ preview, children }) {
+ return (
+ <>
+
+
+
+ >
+ )
+}
diff --git a/examples/cms-builder-io/components/meta.js b/examples/cms-builder-io/components/meta.js
new file mode 100644
index 0000000000000..cec622742089e
--- /dev/null
+++ b/examples/cms-builder-io/components/meta.js
@@ -0,0 +1,42 @@
+import Head from 'next/head'
+import { CMS_NAME, HOME_OG_IMAGE_URL } from '@/lib/constants'
+
+export default function Meta() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/examples/cms-builder-io/components/more-stories.js b/examples/cms-builder-io/components/more-stories.js
new file mode 100644
index 0000000000000..2bd3e21429868
--- /dev/null
+++ b/examples/cms-builder-io/components/more-stories.js
@@ -0,0 +1,24 @@
+import PostPreview from './post-preview'
+
+export default function MoreStories({ posts }) {
+ return (
+
+
+ More Stories
+
+
+ {posts.map((post) => (
+
+ ))}
+
+
+ )
+}
diff --git a/examples/cms-builder-io/components/post-body.js b/examples/cms-builder-io/components/post-body.js
new file mode 100644
index 0000000000000..7a704e2559450
--- /dev/null
+++ b/examples/cms-builder-io/components/post-body.js
@@ -0,0 +1,13 @@
+import { BUILDER_CONFIG } from '@/lib/constants'
+import { BuilderComponent } from '@builder.io/react'
+export default function PostBody({ content }) {
+ return (
+
+
+
+ )
+}
diff --git a/examples/cms-builder-io/components/post-header.js b/examples/cms-builder-io/components/post-header.js
new file mode 100644
index 0000000000000..508035b7cd581
--- /dev/null
+++ b/examples/cms-builder-io/components/post-header.js
@@ -0,0 +1,30 @@
+import Avatar from '../components/avatar'
+import Date from '../components/date'
+import CoverImage from '../components/cover-image'
+import PostTitle from '../components/post-title'
+
+export default function PostHeader({ title, coverImage, date, author }) {
+ return (
+ <>
+ {title}
+ {author && (
+
+ )}
+
+
+
+
+ {author && (
+
+ )}
+
+
+
+
+ >
+ )
+}
diff --git a/examples/cms-builder-io/components/post-preview.js b/examples/cms-builder-io/components/post-preview.js
new file mode 100644
index 0000000000000..f183201f2631b
--- /dev/null
+++ b/examples/cms-builder-io/components/post-preview.js
@@ -0,0 +1,31 @@
+import Avatar from './avatar'
+import Date from './date'
+import CoverImage from './cover-image'
+import Link from 'next/link'
+
+export default function PostPreview({
+ title,
+ coverImage,
+ date,
+ excerpt,
+ author,
+ slug,
+}) {
+ return (
+
+
+
+
+
+
+
+
+
{excerpt}
+ {author &&
}
+
+ )
+}
diff --git a/examples/cms-builder-io/components/post-title.js b/examples/cms-builder-io/components/post-title.js
new file mode 100644
index 0000000000000..edd8cba65c257
--- /dev/null
+++ b/examples/cms-builder-io/components/post-title.js
@@ -0,0 +1,7 @@
+export default function PostTitle({ children }) {
+ return (
+
+ {children}
+
+ )
+}
diff --git a/examples/cms-builder-io/components/section-separator.js b/examples/cms-builder-io/components/section-separator.js
new file mode 100644
index 0000000000000..4ca5c65fdc6ee
--- /dev/null
+++ b/examples/cms-builder-io/components/section-separator.js
@@ -0,0 +1,3 @@
+export default function SectionSeparator() {
+ return
+}
diff --git a/examples/cms-builder-io/jsconfig.json b/examples/cms-builder-io/jsconfig.json
new file mode 100644
index 0000000000000..1bac23a7cd556
--- /dev/null
+++ b/examples/cms-builder-io/jsconfig.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "@/components/*": ["components/*"],
+ "@/lib/*": ["lib/*"],
+ "@/styles/*": ["styles/*"]
+ }
+ }
+}
diff --git a/examples/cms-builder-io/lib/api.js b/examples/cms-builder-io/lib/api.js
new file mode 100644
index 0000000000000..6b80cf062d97b
--- /dev/null
+++ b/examples/cms-builder-io/lib/api.js
@@ -0,0 +1,94 @@
+import { Builder, builder } from '@builder.io/react'
+import { BUILDER_CONFIG } from './constants'
+
+builder.init(BUILDER_CONFIG.apiKey)
+Builder.isStatic = true
+
+export function getAllPostsWithSlug() {
+ return builder.getAll(BUILDER_CONFIG.postsModel, {
+ options: { noTargeting: true },
+ apiKey: BUILDER_CONFIG.apiKey,
+ })
+}
+
+export function getAllPostsForHome(preview) {
+ return searchPosts(
+ { 'data.slug': { $exists: true }, 'data.author': { $exists: true } },
+ preview
+ )
+}
+
+export function getDraftPost(id) {
+ return fetch(
+ `https://builder.io/api/v2/content/${BUILDER_CONFIG.postsModel}/${id}?apiKey=${BUILDER_CONFIG.apiKey}&preview=true&noCache=true&cachebust=tru&includeRefs=true`
+ )
+ .then((res) => res.json())
+ .then((res) => res || null)
+}
+
+export async function getPost(mongoQuery, preview) {
+ let post = preview
+ ? (await searchPosts(mongoQuery, true))?.[0]
+ : await builder
+ .get(BUILDER_CONFIG.postsModel, {
+ includeRefs: true,
+ staleCacheSeconds: 20,
+ apiKey: BUILDER_CONFIG.apiKey,
+ preview: BUILDER_CONFIG.postsModel,
+ options: {
+ noTargeting: true,
+ },
+ query: mongoQuery,
+ })
+ .toPromise()
+
+ return post || null
+}
+
+export async function searchPosts(query, preview, limit = 20, offset = 0) {
+ let posts = await builder.getAll(BUILDER_CONFIG.postsModel, {
+ limit,
+ offset,
+ includeRefs: true,
+ preview: BUILDER_CONFIG.postsModel,
+ staleCacheSeconds: preview ? 1 : 200,
+ apiKey: BUILDER_CONFIG.apiKey,
+ ...(preview && { includeUnpublished: true }),
+ options: {
+ noTargeting: true,
+ },
+ query,
+ })
+
+ if (preview) {
+ posts = await Promise.all(posts.map((post) => getDraftPost(post.id)))
+ }
+
+ return posts
+}
+
+export async function getPostAndMorePosts(slug, preview, previewData) {
+ const post =
+ preview && previewData
+ ? await getDraftPost(previewData.postDraftId)
+ : await getPost(
+ {
+ 'data.slug': { $eq: slug },
+ },
+ preview
+ )
+
+ const morePosts = await searchPosts(
+ {
+ 'data.slug': { $ne: slug, $exists: true },
+ 'data.author': { $exists: true },
+ },
+ preview,
+ 2
+ )
+
+ return {
+ post,
+ morePosts,
+ }
+}
diff --git a/examples/cms-builder-io/lib/constants.js b/examples/cms-builder-io/lib/constants.js
new file mode 100644
index 0000000000000..488d8cec866c4
--- /dev/null
+++ b/examples/cms-builder-io/lib/constants.js
@@ -0,0 +1,10 @@
+export const EXAMPLE_PATH = 'cms-builder-io'
+export const CMS_NAME = 'Builder.io'
+export const CMS_URL = 'https://builder.io/'
+export const HOME_OG_IMAGE_URL =
+ 'https://og-image.now.sh/Next.js%20Blog%20example%20with%20**Builder.io**.png?theme=light&md=1&fontSize=100px&images=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Ffront%2Fassets%2Fdesign%2Fnextjs-black-logo.svg&images=https%3A%2F%2Fcdn.builder.io%2Fapi%2Fv1%2Fimage%2Fassets%252FYJIGb4i01jvw0SRdL5Bt%252F79c8b61740bc41d5ae722c000ddb5915'
+export const BUILDER_CONFIG = {
+ apiKey: process.env.BUILDER_PUBLIC_KEY,
+ postsModel: 'post',
+ previewSecret: 'micky-mouse',
+}
diff --git a/examples/cms-builder-io/next.config.js b/examples/cms-builder-io/next.config.js
new file mode 100644
index 0000000000000..3503fbb00e47e
--- /dev/null
+++ b/examples/cms-builder-io/next.config.js
@@ -0,0 +1,23 @@
+module.exports = {
+ images: {
+ domains: ['cdn.builder.io'],
+ },
+ async headers() {
+ return [
+ {
+ source: '/:path*',
+ headers: [
+ {
+ key: 'Content-Security-Policy',
+ value:
+ 'frame-ancestors https://*.builder.io https://builder.io http://localhost:1234',
+ },
+ ],
+ },
+ ]
+ },
+ env: {
+ // expose env to the browser
+ BUILDER_PUBLIC_KEY: process.env.BUILDER_PUBLIC_KEY,
+ },
+}
diff --git a/examples/cms-builder-io/package.json b/examples/cms-builder-io/package.json
new file mode 100644
index 0000000000000..a2f873c45de2c
--- /dev/null
+++ b/examples/cms-builder-io/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "cms-builder-io",
+ "version": "1.0.0",
+ "scripts": {
+ "dev": "next",
+ "build": "next build",
+ "start": "next start"
+ },
+ "dependencies": {
+ "@builder.io/react": "^1.1.35",
+ "@builder.io/widgets": "^1.2.19",
+ "classnames": "2.2.6",
+ "date-fns": "2.14.0",
+ "next": "latest",
+ "react": "^16.13.1",
+ "react-dom": "^16.13.1"
+ },
+ "devDependencies": {
+ "postcss-flexbugs-fixes": "4.2.1",
+ "postcss-preset-env": "^6.7.0",
+ "tailwindcss": "^1.4.6"
+ },
+ "license": "MIT"
+}
diff --git a/examples/cms-builder-io/pages/_app.js b/examples/cms-builder-io/pages/_app.js
new file mode 100644
index 0000000000000..f18e112c7cf79
--- /dev/null
+++ b/examples/cms-builder-io/pages/_app.js
@@ -0,0 +1,7 @@
+import '@/styles/index.css'
+
+function MyApp({ Component, pageProps }) {
+ return
+}
+
+export default MyApp
diff --git a/examples/cms-builder-io/pages/_document.js b/examples/cms-builder-io/pages/_document.js
new file mode 100644
index 0000000000000..c55951c0d5daf
--- /dev/null
+++ b/examples/cms-builder-io/pages/_document.js
@@ -0,0 +1,15 @@
+import Document, { Html, Head, Main, NextScript } from 'next/document'
+
+export default class MyDocument extends Document {
+ render() {
+ return (
+
+
+
+
+
+
+
+ )
+ }
+}
diff --git a/examples/cms-contentful/pages/api/exit-preview.js b/examples/cms-builder-io/pages/api/exit-preview.js
similarity index 100%
rename from examples/cms-contentful/pages/api/exit-preview.js
rename to examples/cms-builder-io/pages/api/exit-preview.js
diff --git a/examples/cms-builder-io/pages/api/preview.js b/examples/cms-builder-io/pages/api/preview.js
new file mode 100644
index 0000000000000..6ce4ed0b299c1
--- /dev/null
+++ b/examples/cms-builder-io/pages/api/preview.js
@@ -0,0 +1,30 @@
+import { getDraftPost } from '@/lib/api'
+import { BUILDER_CONFIG } from '@/lib/constants'
+import querystring from 'querystring'
+
+export default async function preview(req, res) {
+ const postId = req.query[`builder.overrides.${BUILDER_CONFIG.postsModel}`]
+ if (req.query.secret !== BUILDER_CONFIG.previewSecret || !postId) {
+ return res.status(401).json({ message: 'Invalid request' })
+ }
+
+ // Check if the post with the given `slug` exists
+ const post = await getDraftPost(postId)
+
+ // If the slug doesn't exist prevent preview mode from being enabled
+ if (!post) {
+ return res.status(401).json({ message: 'Invalid post' })
+ }
+
+ // Enable Preview Mode by setting the cookies
+ res.setPreviewData({
+ postDraftId: postId,
+ })
+
+ // Redirect to the path from the fetched post
+ // We don't redirect to req.query.slug as that might lead to open redirect vulnerabilities
+ res.writeHead(307, {
+ Location: `/posts/${post.data.slug}?${querystring.stringify(req.query)}`,
+ })
+ res.end()
+}
diff --git a/examples/cms-builder-io/pages/index.js b/examples/cms-builder-io/pages/index.js
new file mode 100644
index 0000000000000..8e417d226a672
--- /dev/null
+++ b/examples/cms-builder-io/pages/index.js
@@ -0,0 +1,44 @@
+import Container from '@/components/container'
+import MoreStories from '@/components/more-stories'
+import HeroPost from '@/components/hero-post'
+import Intro from '@/components/intro'
+import Layout from '@/components/layout'
+import { getAllPostsForHome } from '@/lib/api'
+import Head from 'next/head'
+import { CMS_NAME } from '@/lib/constants'
+
+export default function Index({ allPosts, preview }) {
+ const heroPost = allPosts[0]
+ const morePosts = allPosts.slice(1)
+ return (
+ <>
+
+
+ Next.js Blog Example with {CMS_NAME}
+
+
+
+ {heroPost && (
+
+ )}
+ {morePosts.length > 0 && }
+
+
+ >
+ )
+}
+
+export async function getStaticProps({ preview = null }) {
+ const allPosts = (await getAllPostsForHome(preview)) || []
+ return {
+ props: { allPosts, preview },
+ revalidate: 20,
+ }
+}
diff --git a/examples/cms-builder-io/pages/posts/[slug].js b/examples/cms-builder-io/pages/posts/[slug].js
new file mode 100644
index 0000000000000..4b976b01c4637
--- /dev/null
+++ b/examples/cms-builder-io/pages/posts/[slug].js
@@ -0,0 +1,95 @@
+import { useRouter } from 'next/router'
+import ErrorPage from 'next/error'
+import Container from '@/components/container'
+import PostBody from '@/components/post-body'
+import MoreStories from '@/components/more-stories'
+import Header from '@/components/header'
+import PostHeader from '@/components/post-header'
+import SectionSeparator from '@/components/section-separator'
+import Layout from '@/components/layout'
+import { getAllPostsWithSlug, getPostAndMorePosts } from '@/lib/api'
+import PostTitle from '@/components/post-title'
+import Head from 'next/head'
+import { CMS_NAME, BUILDER_CONFIG } from '@/lib/constants'
+import { Builder, builder, BuilderContent } from '@builder.io/react'
+import '@builder.io/widgets'
+
+builder.init(BUILDER_CONFIG.apiKey)
+Builder.isStatic = true
+
+export default function Post({ post, morePosts, preview }) {
+ const router = useRouter()
+ const isLive = !Builder.isEditing && !Builder.isPreviewing && !preview
+ if (!router.isFallback && !post && isLive) {
+ return
+ }
+ return (
+
+
+
+ {router.isFallback ? (
+ Loading…
+ ) : (
+ <>
+
+ {(data) =>
+ (console.log('here', data) || data) && (
+
+
+
+ {data.title} | Next.js Blog Example with {CMS_NAME}
+
+
+
+ {data.author?.value && (
+
+ )}
+
+
+ )
+ }
+
+
+ {morePosts.length > 0 && }
+ >
+ )}
+
+
+ )
+}
+
+export async function getStaticProps({ params, preview = false, previewData }) {
+ let { post, morePosts } = await getPostAndMorePosts(
+ params.slug,
+ preview,
+ previewData
+ )
+ console.log('here got statuc ', post)
+
+ return {
+ props: {
+ key: post?.id + post?.data.slug + params.slug,
+ preview,
+ post,
+ morePosts,
+ },
+ }
+}
+
+export async function getStaticPaths() {
+ const allPosts = await getAllPostsWithSlug()
+ return {
+ paths: allPosts?.map((post) => `/posts/${post.data.slug}`) || [],
+ fallback: true,
+ }
+}
diff --git a/examples/cms-builder-io/postcss.config.js b/examples/cms-builder-io/postcss.config.js
new file mode 100644
index 0000000000000..6f2d25c4e3509
--- /dev/null
+++ b/examples/cms-builder-io/postcss.config.js
@@ -0,0 +1,18 @@
+module.exports = {
+ plugins: [
+ 'tailwindcss',
+ 'postcss-flexbugs-fixes',
+ [
+ 'postcss-preset-env',
+ {
+ autoprefixer: {
+ flexbox: 'no-2009',
+ },
+ stage: 3,
+ features: {
+ 'custom-properties': false,
+ },
+ },
+ ],
+ ],
+}
diff --git a/examples/cms-builder-io/public/favicon/android-chrome-192x192.png b/examples/cms-builder-io/public/favicon/android-chrome-192x192.png
new file mode 100644
index 0000000000000000000000000000000000000000..2f07282a59cdadaf579b129d650f588d89bef63e
GIT binary patch
literal 4795
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
literal 0
HcmV?d00001
diff --git a/examples/cms-builder-io/public/favicon/android-chrome-512x512.png b/examples/cms-builder-io/public/favicon/android-chrome-512x512.png
new file mode 100644
index 0000000000000000000000000000000000000000..dbb0faea84049b991417262cb8f14ae08201c443
GIT binary patch
literal 14640
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
MboFyt=akR{06}d?wEzGB
literal 0
HcmV?d00001
diff --git a/examples/cms-builder-io/public/favicon/browserconfig.xml b/examples/cms-builder-io/public/favicon/browserconfig.xml
new file mode 100644
index 0000000000000..9824d87b11517
--- /dev/null
+++ b/examples/cms-builder-io/public/favicon/browserconfig.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ #000000
+
+
+
diff --git a/examples/cms-builder-io/public/favicon/favicon-16x16.png b/examples/cms-builder-io/public/favicon/favicon-16x16.png
new file mode 100644
index 0000000000000000000000000000000000000000..29deaf6716e7744b24b8d2f94443b50d3acffe68
GIT binary patch
literal 595
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^xl_H+M9WCijSl0AZa
z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj
ziKnkC`y&=<4t4b@G6n~MLO(oR978nD=T6+{bvQtxb^jfYOS`%RMA#j5UMSyS|6pbD
zi;d6k9bZ#^z+(Rks>-)2dl_&J^V`G?Q{pEo#nr8;@~
z`krL*_G;*v!^IjrakA;BEvmm}T6sI&)8w8wxgoVPV2$ltj)nWqZSPSP<9cp)#pk-y
z3!nU3->tb0Uyz+-@SssyAx-@8dugfqY?qVb-(9v$nAvu{N21_p{^`Vs3aO80xy!%&
z$oZzjQ>@>dc#PfLX7k6kor!0-63$vnKbR`q7inF2)PmzwPWtVW3*#8c~vxSdwa$T$Bo=7>o=IEp!b`
zbdAhI3@ogSErCeez{twLptqKz2}MJ0eoAIqC2kFW6gJoaHH24%M3e+2mMat#<)>xl
zq$-qD7Nja<7L+72FjUNW{E3I7Fib<^l>g~7o=<}qn3cKplDUPIg}o<>FbgZVG?*Mt
wVOHK8qHy}gl@mwK9FaM~e!9V9ftMb`D{;Y+Pfn&&fmSehy85}Sb4q9e02)x*r~m)}
literal 0
HcmV?d00001
diff --git a/examples/cms-builder-io/public/favicon/favicon-32x32.png b/examples/cms-builder-io/public/favicon/favicon-32x32.png
new file mode 100644
index 0000000000000000000000000000000000000000..e3b4277bf093d204f4088ba46590bc9e6f37bf67
GIT binary patch
literal 880
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50
z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKpuOE
zr>`sfBNk~6b@eGS1_y!iqMj~}As)x)PCc6)94K(Key6_H)~zdg8;|I@2rLO(;bG?z
zv&88`{sbpi5kZkx_Z~U92;G^MrtDPSr1Z{Z$_>33u1k7BO}vhVOI&wNh%niD+%@X$
zZ@)Q_cPr<7PJ1`kQuttQpkKj6ndP1vjjEhOWtlh|D8oV>EHcW
z2`<~itr`hdERnPRyIxS?X6yERwEJ~uLB~SbPr1@5O?#Bx=6LEzEKE!9dp*_eMU(Ed
zOXYj7Gp6&Iy74^bx!uWbaa8i1;AYbmu2VWbzipE=f6`I4{V1>b0b5hc!z--i9*Rrf
zc~&FA*drwr$HMEyV|ezVK~u}Z``UW*K1{N?ewgD|Z@JAOtM4m~kM0y;b3Sd&eAu1q
z$c$$R0{c=ke$>x>Y&m@gTTSxW-@a09s_U6r8pQY`9`a?bI&&PJ`$1|x1z#mL#e9}@HJ8bK
zzir;N-}0T6{L6#yK6nF6GpZ%75hW>!C8<`)MX5lF!N|bSLf61V*T_7?z{1Md5{R@7
zjI0a{dTTkFP&DM`r(~v8;@0p-VS^n|LwHq4L`hI$xk5ovep+TuszOO+L8?M#K}j+L
zL&coOpLjS5!!$Hb`JX=H`80@uS(#fenOj&{*n6@Fv#^3ogUR6(X64Nx3a4*eIdSC7
j5t$?GryD#LcNSTKFL46_E}iL5mO)AEZS|
zhz??kp>#q_Pa+X9S9!)q#7v>f>h;_1zJ2P{J?EY~6zP?$I_K=Y*ZTkWKIiUX?Ol$O
z;bc0!dO3Q{aq`JLhPRsE;xZ>o<~Kd63*DEFk1M;XdugYEZ_Oa-Nh{-%0D^{MKAR3)TR78`8wfiHZP
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
literal 0
HcmV?d00001
diff --git a/examples/cms-builder-io/public/favicon/mstile-150x150.png b/examples/cms-builder-io/public/favicon/mstile-150x150.png
new file mode 100644
index 0000000000000000000000000000000000000000..f2dfd904bf1be62be8351fcbc60a1028269923f0
GIT binary patch
literal 3567
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
AfdBvi
literal 0
HcmV?d00001
diff --git a/examples/cms-builder-io/public/favicon/safari-pinned-tab.svg b/examples/cms-builder-io/public/favicon/safari-pinned-tab.svg
new file mode 100644
index 0000000000000..72ab6e050cb11
--- /dev/null
+++ b/examples/cms-builder-io/public/favicon/safari-pinned-tab.svg
@@ -0,0 +1,33 @@
+
+
+
+
+Created by potrace 1.11, written by Peter Selinger 2001-2013
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/cms-builder-io/public/favicon/site.webmanifest b/examples/cms-builder-io/public/favicon/site.webmanifest
new file mode 100644
index 0000000000000..a672d9a233c59
--- /dev/null
+++ b/examples/cms-builder-io/public/favicon/site.webmanifest
@@ -0,0 +1,19 @@
+{
+ "name": "Next.js",
+ "short_name": "Next.js",
+ "icons": [
+ {
+ "src": "/favicons/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/favicons/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#000000",
+ "background_color": "#000000",
+ "display": "standalone"
+}
diff --git a/examples/cms-builder-io/styles/index.css b/examples/cms-builder-io/styles/index.css
new file mode 100644
index 0000000000000..73048d39686bc
--- /dev/null
+++ b/examples/cms-builder-io/styles/index.css
@@ -0,0 +1,7 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+.grayscale {
+ filter: grayscale(1);
+}
diff --git a/examples/cms-builder-io/tailwind.config.js b/examples/cms-builder-io/tailwind.config.js
new file mode 100644
index 0000000000000..a3cd359e95fb2
--- /dev/null
+++ b/examples/cms-builder-io/tailwind.config.js
@@ -0,0 +1,37 @@
+module.exports = {
+ purge: ['./components/**/*.js', './pages/**/*.js'],
+ theme: {
+ extend: {
+ fontFamily: {
+ sans:
+ '-apple-system, "Helvetica Neue", "Segoe UI", Roboto, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
+ },
+ colors: {
+ 'accent-1': '#FAFAFA',
+ 'accent-2': '#EAEAEA',
+ 'accent-7': '#333',
+ success: '#0070f3',
+ cyan: '#79FFE1',
+ },
+ spacing: {
+ 28: '7rem',
+ },
+ letterSpacing: {
+ tighter: '-.04em',
+ },
+ lineHeight: {
+ tight: 1.2,
+ },
+ fontSize: {
+ '5xl': '2.5rem',
+ '6xl': '2.75rem',
+ '7xl': '4.5rem',
+ '8xl': '6.25rem',
+ },
+ boxShadow: {
+ small: '0 5px 10px rgba(0, 0, 0, 0.12)',
+ medium: '0 8px 30px rgba(0, 0, 0, 0.12)',
+ },
+ },
+ },
+}
diff --git a/examples/cms-buttercms/README.md b/examples/cms-buttercms/README.md
index cfbfada2114c2..2b592c4c68ca8 100644
--- a/examples/cms-buttercms/README.md
+++ b/examples/cms-buttercms/README.md
@@ -28,6 +28,7 @@ Once you have access to [the environment variables you'll need](#step-2-set-up-e
- [Kontent](/examples/cms-kontent)
- [Ghost](/examples/cms-ghost)
- [Blog Starter](/examples/blog-starter)
+- [Builder.io](/examples/cms-builder-io)
## How to use
diff --git a/examples/cms-contentful/README.md b/examples/cms-contentful/README.md
index 6f8d7171a68ed..ea20f6546290d 100644
--- a/examples/cms-contentful/README.md
+++ b/examples/cms-contentful/README.md
@@ -28,6 +28,7 @@ Once you have access to [the environment variables you'll need](#step-5-set-up-e
- [Kontent](/examples/cms-kontent)
- [Ghost](/examples/cms-ghost)
- [Blog Starter](/examples/blog-starter)
+- [Builder.io](/examples/cms-builder-io)
## How to use
diff --git a/examples/cms-contentful/pages/api/preview.js b/examples/cms-contentful/pages/api/preview.js
deleted file mode 100644
index 6ddc5a203f6d7..0000000000000
--- a/examples/cms-contentful/pages/api/preview.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import { getPreviewPostBySlug } from '../../lib/api'
-
-export default async function preview(req, res) {
- const { secret, slug } = req.query
-
- if (secret !== process.env.CONTENTFUL_PREVIEW_SECRET || !slug) {
- return res.status(401).json({ message: 'Invalid token' })
- }
-
- // Fetch the headless CMS to check if the provided `slug` exists
- const post = await getPreviewPostBySlug(slug)
-
- // If the slug doesn't exist prevent preview mode from being enabled
- if (!post) {
- return res.status(401).json({ message: 'Invalid slug' })
- }
-
- // Enable Preview Mode by setting the cookies
- res.setPreviewData({})
-
- // Redirect to the path from the fetched post
- // We don't redirect to req.query.slug as that might lead to open redirect vulnerabilities
- // res.writeHead(307, { Location: `/posts/${post.slug}` })
- const url = `/posts/${post.slug}`
- res.write(
- `
-
- `
- )
- res.end()
-}
diff --git a/examples/cms-cosmic/README.md b/examples/cms-cosmic/README.md
index 079a5a84f99b8..ba4c8c4873ee7 100644
--- a/examples/cms-cosmic/README.md
+++ b/examples/cms-cosmic/README.md
@@ -28,6 +28,7 @@ Once you have access to [the environment variables you'll need](#step-3-set-up-e
- [Kontent](/examples/cms-kontent)
- [Ghost](/examples/cms-ghost)
- [Blog Starter](/examples/blog-starter)
+- [Builder.io](/examples/cms-builder-io)
## How to use
diff --git a/examples/cms-datocms/README.md b/examples/cms-datocms/README.md
index 05673ad877fb1..a0fabe1dc6568 100644
--- a/examples/cms-datocms/README.md
+++ b/examples/cms-datocms/README.md
@@ -22,6 +22,7 @@ This example showcases Next.js's [Static Generation](https://nextjs.org/docs/bas
- [Kontent](/examples/cms-kontent)
- [Ghost](/examples/cms-ghost)
- [Blog Starter](/examples/blog-starter)
+- [Builder.io](/examples/cms-builder-io)
## Deploy your own
diff --git a/examples/cms-ghost/README.md b/examples/cms-ghost/README.md
index 13fb0d60c227a..aeefab40923e2 100644
--- a/examples/cms-ghost/README.md
+++ b/examples/cms-ghost/README.md
@@ -26,6 +26,7 @@ Once you have access to [the environment variables you'll need](#step-2-set-up-e
- [GraphCMS](/examples/cms-graphcms)
- [Kontent](/examples/cms-kontent)
- [Blog Starter](/examples/blog-starter)
+- [Builder.io](/examples/cms-builder-io)
## How to use
diff --git a/examples/cms-graphcms/README.md b/examples/cms-graphcms/README.md
index 39f8039e34a11..3c7df34c3bd36 100644
--- a/examples/cms-graphcms/README.md
+++ b/examples/cms-graphcms/README.md
@@ -25,6 +25,7 @@ This example showcases Next.js's [Static Generation](https://nextjs.org/docs/bas
- [Kontent](/examples/cms-kontent)
- [Ghost](/examples/cms-ghost)
- [Blog Starter](/examples/blog-starter)
+- [Builder.io](/examples/cms-builder-io)
## Deploy your own
diff --git a/examples/cms-kontent/README.md b/examples/cms-kontent/README.md
index d3740ebb14581..c77b057f4b29a 100644
--- a/examples/cms-kontent/README.md
+++ b/examples/cms-kontent/README.md
@@ -28,6 +28,7 @@ Once you have access to [the environment variables you'll need](#step-3-set-up-e
- [GraphCMS](/examples/cms-graphcms)
- [Ghost](/examples/cms-ghost)
- [Blog Starter](/examples/blog-starter)
+- [Builder.io](/examples/cms-builder-io)
## How to use
diff --git a/examples/cms-prismic/README.md b/examples/cms-prismic/README.md
index 7544d7fc779e3..4c18e2fda2210 100644
--- a/examples/cms-prismic/README.md
+++ b/examples/cms-prismic/README.md
@@ -27,6 +27,7 @@ Once you have access to [the environment variables you'll need](#step-5-set-up-e
- [Kontent](/examples/cms-kontent)
- [Ghost](/examples/cms-ghost)
- [Blog Starter](/examples/blog-starter)
+- [Builder.io](/examples/cms-builder-io)
## How to use
diff --git a/examples/cms-sanity/README.md b/examples/cms-sanity/README.md
index a6a44861fbd2c..c3c5b74c3d389 100644
--- a/examples/cms-sanity/README.md
+++ b/examples/cms-sanity/README.md
@@ -28,6 +28,7 @@ Once you have access to [the environment variables you'll need](#step-4-set-up-e
- [Kontent](/examples/cms-kontent)
- [Ghost](/examples/cms-ghost)
- [Blog Starter](/examples/blog-starter)
+- [Builder.io](/examples/cms-builder-io)
## How to use
diff --git a/examples/cms-storyblok/README.md b/examples/cms-storyblok/README.md
index 9b59e444ace94..7d44278624ba0 100644
--- a/examples/cms-storyblok/README.md
+++ b/examples/cms-storyblok/README.md
@@ -28,6 +28,7 @@ Once you have access to [the environment variables you'll need](#step-6-set-up-e
- [Kontent](/examples/cms-kontent)
- [Ghost](/examples/cms-ghost)
- [Blog Starter](/examples/blog-starter)
+- [Builder.io](/examples/cms-builder-io)
## How to use
diff --git a/examples/cms-strapi/README.md b/examples/cms-strapi/README.md
index bfd4bc4f2b8d5..2377f5e30d200 100644
--- a/examples/cms-strapi/README.md
+++ b/examples/cms-strapi/README.md
@@ -28,6 +28,7 @@ Once you have access to [the environment variables you'll need](#step-7-set-up-e
- [Kontent](/examples/cms-kontent)
- [Ghost](/examples/cms-ghost)
- [Blog Starter](/examples/blog-starter)
+- [Builder.io](/examples/cms-builder-io)
## How to use
diff --git a/examples/cms-takeshape/README.md b/examples/cms-takeshape/README.md
index 6bd622b558a02..0c76cc989e4bc 100644
--- a/examples/cms-takeshape/README.md
+++ b/examples/cms-takeshape/README.md
@@ -28,6 +28,7 @@ Once you have access to [the environment variables you'll need](#step-5-set-up-e
- [Kontent](/examples/cms-kontent)
- [Ghost](/examples/cms-ghost)
- [Blog Starter](/examples/blog-starter)
+- [Builder.io](/examples/cms-builder-io)
## How to use
diff --git a/examples/cms-wordpress/README.md b/examples/cms-wordpress/README.md
index fc05866306735..a8af3261c0528 100644
--- a/examples/cms-wordpress/README.md
+++ b/examples/cms-wordpress/README.md
@@ -28,6 +28,7 @@ Once you have access to [the environment variables you'll need](#step-3-set-up-e
- [Kontent](/examples/cms-kontent)
- [Ghost](/examples/cms-ghost)
- [Blog Starter](/examples/blog-starter)
+- [Builder.io](/examples/cms-builder-io)
## How to use
From 9b62363688b1ae83b8f2e7140632e1b9010c00ea Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Thu, 11 Feb 2021 16:23:49 -0800
Subject: [PATCH 02/15] match example app quidelines
---
examples/cms-builder-io/README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/examples/cms-builder-io/README.md b/examples/cms-builder-io/README.md
index 9eef07fc6b3b5..7bb6c14bb04c1 100644
--- a/examples/cms-builder-io/README.md
+++ b/examples/cms-builder-io/README.md
@@ -34,9 +34,9 @@ Once you have access to [the environment variables you'll need](#step-6-set-up-e
Execute [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app) with [npm](https://docs.npmjs.com/cli/init) or [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/) to bootstrap the example:
```bash
-npx create-next-app --example cms-builder-io my-headless-blog
+npx create-next-app --example cms-builder-io cms-builder-io-app
# or
-yarn create next-app --example cms-builder-io my-headless-blog
+yarn create next-app --example cms-builder-io cms-builder-io-app
```
## Configuration
@@ -54,7 +54,7 @@ npm install @builder.io/cli -g
[Signup for Builder.io](https://builder.io/signup), then go to your [organization settings page](https://builder.io/account/organization?root=true), create a private key and copy it and supply it for `[private-key]` below. For `[space-name]` create a name for your space, such as "Blog"
```
-cd my-headless-blog
+cd cms-builder-io-app
builder create -k [private-key] -n [space-name] -d
```
From a12cca78014ad0b3bb4470401c30e4f2e0d38125 Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Thu, 11 Feb 2021 16:34:44 -0800
Subject: [PATCH 03/15] remove logs
---
examples/cms-builder-io/components/avatar.js | 1 -
examples/cms-builder-io/pages/posts/[slug].js | 3 +--
2 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/examples/cms-builder-io/components/avatar.js b/examples/cms-builder-io/components/avatar.js
index b8f85068646d6..ecef0953887d5 100644
--- a/examples/cms-builder-io/components/avatar.js
+++ b/examples/cms-builder-io/components/avatar.js
@@ -1,5 +1,4 @@
export default function Avatar({ name, picture }) {
- console.log('here ', name, picture)
return (
{(data) =>
- (console.log('here', data) || data) && (
+ data && (
@@ -74,7 +74,6 @@ export async function getStaticProps({ params, preview = false, previewData }) {
preview,
previewData
)
- console.log('here got statuc ', post)
return {
props: {
From fe20faf67951630f0006b67db1620376d048fe2f Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Thu, 11 Feb 2021 17:29:54 -0800
Subject: [PATCH 04/15] fix step number
---
examples/cms-builder-io/README.md | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/examples/cms-builder-io/README.md b/examples/cms-builder-io/README.md
index 7bb6c14bb04c1..8ed736da6eaf7 100644
--- a/examples/cms-builder-io/README.md
+++ b/examples/cms-builder-io/README.md
@@ -41,13 +41,13 @@ yarn create next-app --example cms-builder-io cms-builder-io-app
## Configuration
-### Install the Builder.io cli
+### Step 1 Install the Builder.io cli
```
npm install @builder.io/cli -g
```
-### Step 1 Generate your Builder.io space
+### Step 2 Generate your Builder.io space
@@ -64,7 +64,7 @@ This command when done it'll print your new space's public api key, copy it and
BUILDER_PUBLIC_KEY=...
```
-### Step 2. Run Next.js in development mode
+### Step 3 Run Next.js in development mode
```bash
npm install
@@ -78,13 +78,13 @@ yarn dev
Your blog should be up and running on [http://localhost:3000](http://localhost:3000)! If it doesn't work, you can post on [GitHub discussions](https://github.com/vercel/next.js/discussions).
-### Step 3. Try preview mode
+### Step 4 Try preview mode
To try preview mode at any time while editing in Builder.io press `view current draft`, if you changed the secret defined in [constants.js](./lib/constants.js) you'll need to also change it in your `Post` [model settings](https://builder.io/models).
To exit the preview mode, you can click **Click here to exit preview mode** at the top.
-### Step 4. Deploy on Vercel
+### Step 5 Deploy on Vercel
You can deploy this app to the cloud with [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example) ([Documentation](https://nextjs.org/docs/deployment)).
From 959f72e962c82fff083947847fca5d7cc1892736 Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Thu, 11 Feb 2021 18:19:03 -0800
Subject: [PATCH 05/15] fix step link in readme
---
examples/cms-builder-io/README.md | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/examples/cms-builder-io/README.md b/examples/cms-builder-io/README.md
index 8ed736da6eaf7..808027ebf8d08 100644
--- a/examples/cms-builder-io/README.md
+++ b/examples/cms-builder-io/README.md
@@ -8,7 +8,7 @@ This example showcases Next.js's [Static Generation](https://nextjs.org/docs/bas
## Deploy your own
-Once you have access to [the environment variables you'll need](#step-6-set-up-environment-variables), deploy the example using [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example):
+Once you have access to [the environment variables you'll need](#step-2-generate-a-space), deploy the example using [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example):
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/vercel/next.js/tree/canary/examples/cms-storyblok&project-name=cms-storyblok&repository-name=cms-builder-io&env=BUILDER_PUBLIC_KEY&envDescription=Required%20to%20connect%20the%20app%20with%20Builder.io&envLink=https://www.builder.io/c/docs/custom-react-components#api-key)
@@ -47,9 +47,7 @@ yarn create next-app --example cms-builder-io cms-builder-io-app
npm install @builder.io/cli -g
```
-### Step 2 Generate your Builder.io space
-
-
+### Step 2 Generate a space
[Signup for Builder.io](https://builder.io/signup), then go to your [organization settings page](https://builder.io/account/organization?root=true), create a private key and copy it and supply it for `[private-key]` below. For `[space-name]` create a name for your space, such as "Blog"
From 6c212d08ebb6e8fc1ab5fcbb617af25063358554 Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Wed, 1 Dec 2021 15:18:40 -0800
Subject: [PATCH 06/15] use next/image and update all dependencies, use
tailwind JIT mode, addressing feedback
---
examples/cms-builder-io/components/alert.js | 2 +-
examples/cms-builder-io/components/avatar.js | 15 ++++++++-----
.../components/builder-image.js | 11 ++++++++++
.../cms-builder-io/components/cover-image.js | 22 ++++++++++++++-----
examples/cms-builder-io/components/date.js | 16 +++++---------
examples/cms-builder-io/components/footer.js | 2 +-
.../cms-builder-io/components/hero-post.js | 12 +++++-----
examples/cms-builder-io/components/intro.js | 2 +-
examples/cms-builder-io/components/layout.js | 6 ++---
examples/cms-builder-io/components/meta.js | 2 +-
.../cms-builder-io/components/more-stories.js | 2 +-
.../cms-builder-io/components/post-header.js | 20 +++++++----------
.../cms-builder-io/components/post-preview.js | 14 ++++++------
examples/cms-builder-io/package.json | 18 +++++++--------
examples/cms-builder-io/pages/_document.js | 15 -------------
examples/cms-builder-io/pages/index.js | 2 +-
examples/cms-builder-io/pages/posts/[slug].js | 2 +-
examples/cms-builder-io/postcss.config.js | 22 +++++--------------
examples/cms-builder-io/tailwind.config.js | 4 ++--
19 files changed, 92 insertions(+), 97 deletions(-)
create mode 100644 examples/cms-builder-io/components/builder-image.js
delete mode 100644 examples/cms-builder-io/pages/_document.js
diff --git a/examples/cms-builder-io/components/alert.js b/examples/cms-builder-io/components/alert.js
index 051f3319649ed..2994d59fbd321 100644
--- a/examples/cms-builder-io/components/alert.js
+++ b/examples/cms-builder-io/components/alert.js
@@ -1,6 +1,6 @@
import Container from './container'
import cn from 'classnames'
-import { EXAMPLE_PATH } from '@/lib/constants'
+import { EXAMPLE_PATH } from '../lib/constants'
export default function Alert({ preview }) {
return (
diff --git a/examples/cms-builder-io/components/avatar.js b/examples/cms-builder-io/components/avatar.js
index ecef0953887d5..635f3f90910fb 100644
--- a/examples/cms-builder-io/components/avatar.js
+++ b/examples/cms-builder-io/components/avatar.js
@@ -1,11 +1,16 @@
+import BuilderImage from './builder-image'
+
export default function Avatar({ name, picture }) {
return (
-
+
+
+
{name}
)
diff --git a/examples/cms-builder-io/components/builder-image.js b/examples/cms-builder-io/components/builder-image.js
new file mode 100644
index 0000000000000..89d38ff150244
--- /dev/null
+++ b/examples/cms-builder-io/components/builder-image.js
@@ -0,0 +1,11 @@
+import Image from 'next/image'
+
+const builderLoader = ({ src, width, quality }) => {
+ return `${src}?width=${width}&quality=${quality || 75}`
+}
+
+const BuilderImage = (props) => {
+ return
+}
+
+export default BuilderImage
diff --git a/examples/cms-builder-io/components/cover-image.js b/examples/cms-builder-io/components/cover-image.js
index 22a4852faa340..222d6b47610d4 100644
--- a/examples/cms-builder-io/components/cover-image.js
+++ b/examples/cms-builder-io/components/cover-image.js
@@ -1,16 +1,28 @@
+import BuilderImage from './builder-image'
import Link from 'next/link'
+import cn from 'classnames'
export default function CoverImage({ title, url, slug }) {
+ const image = (
+
+ )
+
return (
)
diff --git a/examples/cms-builder-io/components/date.js b/examples/cms-builder-io/components/date.js
index 6503e2986d5c0..4fd5b35f56e48 100644
--- a/examples/cms-builder-io/components/date.js
+++ b/examples/cms-builder-io/components/date.js
@@ -1,13 +1,9 @@
-import { parseISO, format } from 'date-fns'
-import { useEffect, useState } from 'react'
+import { format } from 'date-fns'
-// dateString might be null for unpublished posts
export default function DateComponent({ dateString }) {
- const [date, setDate] = useState(dateString ? parseISO(dateString) : null)
- useEffect(() => {
- if (!date) {
- setDate(new Date())
- }
- }, [date])
- return date && {format(date, 'LLLL d, yyyy')}
+ return (
+
+ {format(new Date(dateString), 'LLLL d, yyyy')}
+
+ )
}
diff --git a/examples/cms-builder-io/components/footer.js b/examples/cms-builder-io/components/footer.js
index b305c3eb40b0d..da9eed88ec263 100644
--- a/examples/cms-builder-io/components/footer.js
+++ b/examples/cms-builder-io/components/footer.js
@@ -1,5 +1,5 @@
import Container from './container'
-import { EXAMPLE_PATH } from '@/lib/constants'
+import { EXAMPLE_PATH } from '../lib/constants'
export default function Footer() {
return (
diff --git a/examples/cms-builder-io/components/hero-post.js b/examples/cms-builder-io/components/hero-post.js
index 8a8a9a1186feb..03b41249b9b72 100644
--- a/examples/cms-builder-io/components/hero-post.js
+++ b/examples/cms-builder-io/components/hero-post.js
@@ -1,7 +1,7 @@
-import Avatar from './avatar'
-import Date from './date'
-import CoverImage from './cover-image'
import Link from 'next/link'
+import Avatar from '../components/avatar'
+import DateComponent from '../components/date'
+import CoverImage from '../components/cover-image'
export default function HeroPost({
title,
@@ -14,7 +14,7 @@ export default function HeroPost({
return (
-
+
@@ -24,12 +24,12 @@ export default function HeroPost({
-
+
{excerpt}
-
+ {author &&
}
diff --git a/examples/cms-builder-io/components/intro.js b/examples/cms-builder-io/components/intro.js
index c3003c6196642..5931b3c5961bd 100644
--- a/examples/cms-builder-io/components/intro.js
+++ b/examples/cms-builder-io/components/intro.js
@@ -1,4 +1,4 @@
-import { CMS_NAME, CMS_URL } from '@/lib/constants'
+import { CMS_NAME, CMS_URL } from '../lib/constants'
export default function Intro() {
return (
diff --git a/examples/cms-builder-io/components/layout.js b/examples/cms-builder-io/components/layout.js
index 399802b095aa7..99d95353131e0 100644
--- a/examples/cms-builder-io/components/layout.js
+++ b/examples/cms-builder-io/components/layout.js
@@ -1,6 +1,6 @@
-import Alert from './alert'
-import Footer from './footer'
-import Meta from './meta'
+import Alert from '../components/alert'
+import Footer from '../components/footer'
+import Meta from '../components/meta'
export default function Layout({ preview, children }) {
return (
diff --git a/examples/cms-builder-io/components/meta.js b/examples/cms-builder-io/components/meta.js
index cec622742089e..d9c48d5831e13 100644
--- a/examples/cms-builder-io/components/meta.js
+++ b/examples/cms-builder-io/components/meta.js
@@ -1,5 +1,5 @@
import Head from 'next/head'
-import { CMS_NAME, HOME_OG_IMAGE_URL } from '@/lib/constants'
+import { CMS_NAME, HOME_OG_IMAGE_URL } from '../lib/constants'
export default function Meta() {
return (
diff --git a/examples/cms-builder-io/components/more-stories.js b/examples/cms-builder-io/components/more-stories.js
index 2bd3e21429868..bcf78e019cd28 100644
--- a/examples/cms-builder-io/components/more-stories.js
+++ b/examples/cms-builder-io/components/more-stories.js
@@ -12,7 +12,7 @@ export default function MoreStories({ posts }) {
key={post.data.slug}
title={post.data.title}
coverImage={post.data.image}
- date={post.createdAt}
+ date={post.lastUpdated}
author={post.data.author.value?.data}
slug={post.data.slug}
excerpt={post.data.intro}
diff --git a/examples/cms-builder-io/components/post-header.js b/examples/cms-builder-io/components/post-header.js
index 508035b7cd581..46562af1a40bf 100644
--- a/examples/cms-builder-io/components/post-header.js
+++ b/examples/cms-builder-io/components/post-header.js
@@ -1,5 +1,5 @@
import Avatar from '../components/avatar'
-import Date from '../components/date'
+import DateComponent from '../components/date'
import CoverImage from '../components/cover-image'
import PostTitle from '../components/post-title'
@@ -7,22 +7,18 @@ export default function PostHeader({ title, coverImage, date, author }) {
return (
<>
{title}
- {author && (
-
- )}
+
- {author && (
-
- )}
+
-
+
>
diff --git a/examples/cms-builder-io/components/post-preview.js b/examples/cms-builder-io/components/post-preview.js
index f183201f2631b..bf1b81d6afae7 100644
--- a/examples/cms-builder-io/components/post-preview.js
+++ b/examples/cms-builder-io/components/post-preview.js
@@ -1,7 +1,7 @@
-import Avatar from './avatar'
-import Date from './date'
-import CoverImage from './cover-image'
import Link from 'next/link'
+import Avatar from '../components/avatar'
+import DateComponent from '../components/date'
+import CoverImage from './cover-image'
export default function PostPreview({
title,
@@ -12,17 +12,17 @@ export default function PostPreview({
slug,
}) {
return (
-
+
-
+
-
+
{excerpt}
{author &&
}
diff --git a/examples/cms-builder-io/package.json b/examples/cms-builder-io/package.json
index a2f873c45de2c..b778c577068e7 100644
--- a/examples/cms-builder-io/package.json
+++ b/examples/cms-builder-io/package.json
@@ -7,18 +7,18 @@
"start": "next start"
},
"dependencies": {
- "@builder.io/react": "^1.1.35",
- "@builder.io/widgets": "^1.2.19",
- "classnames": "2.2.6",
- "date-fns": "2.14.0",
+ "@builder.io/react": "^1.1.47",
+ "@builder.io/widgets": "^1.2.21",
+ "classnames": "2.3.1",
+ "date-fns": "2.22.1",
"next": "latest",
- "react": "^16.13.1",
- "react-dom": "^16.13.1"
+ "react": "^17.0.2",
+ "react-dom": "^17.0.2"
},
"devDependencies": {
- "postcss-flexbugs-fixes": "4.2.1",
- "postcss-preset-env": "^6.7.0",
- "tailwindcss": "^1.4.6"
+ "autoprefixer": "10.2.6",
+ "postcss": "8.3.5",
+ "tailwindcss": "^2.2.4"
},
"license": "MIT"
}
diff --git a/examples/cms-builder-io/pages/_document.js b/examples/cms-builder-io/pages/_document.js
deleted file mode 100644
index c55951c0d5daf..0000000000000
--- a/examples/cms-builder-io/pages/_document.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import Document, { Html, Head, Main, NextScript } from 'next/document'
-
-export default class MyDocument extends Document {
- render() {
- return (
-
-
-
-
-
-
-
- )
- }
-}
diff --git a/examples/cms-builder-io/pages/index.js b/examples/cms-builder-io/pages/index.js
index 8e417d226a672..0a747ad442cc9 100644
--- a/examples/cms-builder-io/pages/index.js
+++ b/examples/cms-builder-io/pages/index.js
@@ -22,7 +22,7 @@ export default function Index({ allPosts, preview }) {
)}
diff --git a/examples/cms-builder-io/postcss.config.js b/examples/cms-builder-io/postcss.config.js
index 6f2d25c4e3509..3fa0a9514dc9d 100644
--- a/examples/cms-builder-io/postcss.config.js
+++ b/examples/cms-builder-io/postcss.config.js
@@ -1,18 +1,8 @@
+// If you want to use other PostCSS plugins, see the following:
+// https://tailwindcss.com/docs/using-with-preprocessors
module.exports = {
- plugins: [
- 'tailwindcss',
- 'postcss-flexbugs-fixes',
- [
- 'postcss-preset-env',
- {
- autoprefixer: {
- flexbox: 'no-2009',
- },
- stage: 3,
- features: {
- 'custom-properties': false,
- },
- },
- ],
- ],
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
}
diff --git a/examples/cms-builder-io/tailwind.config.js b/examples/cms-builder-io/tailwind.config.js
index a3cd359e95fb2..949b214445228 100644
--- a/examples/cms-builder-io/tailwind.config.js
+++ b/examples/cms-builder-io/tailwind.config.js
@@ -1,10 +1,10 @@
module.exports = {
+ mode: 'JIT',
purge: ['./components/**/*.js', './pages/**/*.js'],
theme: {
extend: {
fontFamily: {
- sans:
- '-apple-system, "Helvetica Neue", "Segoe UI", Roboto, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
+ sans: '-apple-system, "Helvetica Neue", "Segoe UI", Roboto, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
},
colors: {
'accent-1': '#FAFAFA',
From fcd03ee9464008ee9d3d0faa707791a11a0a259a Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Wed, 1 Dec 2021 15:20:41 -0800
Subject: [PATCH 07/15] Update examples/cms-builder-io/package.json
Co-authored-by: Lee Robinson
---
examples/cms-builder-io/package.json | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/examples/cms-builder-io/package.json b/examples/cms-builder-io/package.json
index b778c577068e7..01c796b0c6749 100644
--- a/examples/cms-builder-io/package.json
+++ b/examples/cms-builder-io/package.json
@@ -1,6 +1,5 @@
{
- "name": "cms-builder-io",
- "version": "1.0.0",
+ "private": true,
"scripts": {
"dev": "next",
"build": "next build",
From ddb60966331c60b05b64bfd07bb436945bddb9d6 Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Wed, 1 Dec 2021 15:25:08 -0800
Subject: [PATCH 08/15] no as usage
---
examples/cms-builder-io/components/hero-post.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/examples/cms-builder-io/components/hero-post.js b/examples/cms-builder-io/components/hero-post.js
index 03b41249b9b72..680afd9829011 100644
--- a/examples/cms-builder-io/components/hero-post.js
+++ b/examples/cms-builder-io/components/hero-post.js
@@ -19,7 +19,7 @@ export default function HeroPost({
From 0b2fe10a150fd9a378e75d9283a0d81fc4921964 Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Wed, 15 Dec 2021 12:52:25 -0800
Subject: [PATCH 09/15] readme feedback
---
examples/cms-builder-io/README.md | 5 -----
1 file changed, 5 deletions(-)
diff --git a/examples/cms-builder-io/README.md b/examples/cms-builder-io/README.md
index 808027ebf8d08..809e24e4b06e1 100644
--- a/examples/cms-builder-io/README.md
+++ b/examples/cms-builder-io/README.md
@@ -6,11 +6,6 @@ This example showcases Next.js's [Static Generation](https://nextjs.org/docs/bas
[https://cms-builder-blog.vercel.app/](https://cms-builder-blog.vercel.app/)
-## Deploy your own
-
-Once you have access to [the environment variables you'll need](#step-2-generate-a-space), deploy the example using [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example):
-
-[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/vercel/next.js/tree/canary/examples/cms-storyblok&project-name=cms-storyblok&repository-name=cms-builder-io&env=BUILDER_PUBLIC_KEY&envDescription=Required%20to%20connect%20the%20app%20with%20Builder.io&envLink=https://www.builder.io/c/docs/custom-react-components#api-key)
### Related examples
From c7063a8269637b49272475c8f79fe5e2fae04e2f Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Wed, 15 Dec 2021 12:53:23 -0800
Subject: [PATCH 10/15] feedback, move related examples section
---
examples/cms-builder-io/README.md | 38 ++++++++++++++++---------------
1 file changed, 20 insertions(+), 18 deletions(-)
diff --git a/examples/cms-builder-io/README.md b/examples/cms-builder-io/README.md
index 809e24e4b06e1..5e0dabfb13f2f 100644
--- a/examples/cms-builder-io/README.md
+++ b/examples/cms-builder-io/README.md
@@ -6,24 +6,6 @@ This example showcases Next.js's [Static Generation](https://nextjs.org/docs/bas
[https://cms-builder-blog.vercel.app/](https://cms-builder-blog.vercel.app/)
-
-### Related examples
-
-- [WordPress](/examples/cms-wordpress)
-- [DatoCMS](/examples/cms-datocms)
-- [Sanity](/examples/cms-sanity)
-- [TakeShape](/examples/cms-takeshape)
-- [Prismic](/examples/cms-prismic)
-- [Contentful](/examples/cms-contentful)
-- [Agility CMS](/examples/cms-agilitycms)
-- [Cosmic](/examples/cms-cosmic)
-- [Strapi](/examples/cms-strapi)
-- [ButterCMS](/examples/cms-buttercms)
-- [GraphCMS](/examples/cms-graphcms)
-- [Kontent](/examples/cms-kontent)
-- [Ghost](/examples/cms-ghost)
-- [Blog Starter](/examples/blog-starter)
-
## How to use
Execute [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app) with [npm](https://docs.npmjs.com/cli/init) or [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/) to bootstrap the example:
@@ -92,3 +74,23 @@ To deploy your local project to Vercel, push it to GitHub/GitLab/Bitbucket and [
Alternatively, you can deploy using our template by clicking on the Deploy button below.
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/vercel/next.js/tree/canary/examples/cms-builder-io&project-name=cms-builder-io&repository-name=cms-builder-io&env=BUILDER_PUBLIC_KEY&envDescription=Required%20to%20connect%20the%20app%20with%20Builder.io&envLink=https://www.builder.io/c/docs/custom-react-components#api-key)
+
+
+### Related examples
+
+- [WordPress](/examples/cms-wordpress)
+- [DatoCMS](/examples/cms-datocms)
+- [Sanity](/examples/cms-sanity)
+- [TakeShape](/examples/cms-takeshape)
+- [Prismic](/examples/cms-prismic)
+- [Contentful](/examples/cms-contentful)
+- [Agility CMS](/examples/cms-agilitycms)
+- [Cosmic](/examples/cms-cosmic)
+- [Strapi](/examples/cms-strapi)
+- [ButterCMS](/examples/cms-buttercms)
+- [GraphCMS](/examples/cms-graphcms)
+- [Kontent](/examples/cms-kontent)
+- [Ghost](/examples/cms-ghost)
+- [Blog Starter](/examples/blog-starter)
+
+
From 045374f29e6bdc27bccbe8528a4413873fe66179 Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Wed, 15 Dec 2021 13:01:05 -0800
Subject: [PATCH 11/15] Update examples/cms-builder-io/package.json
Co-authored-by: Lee Robinson
---
examples/cms-builder-io/package.json | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/examples/cms-builder-io/package.json b/examples/cms-builder-io/package.json
index 01c796b0c6749..0e8c1a089175e 100644
--- a/examples/cms-builder-io/package.json
+++ b/examples/cms-builder-io/package.json
@@ -18,6 +18,5 @@
"autoprefixer": "10.2.6",
"postcss": "8.3.5",
"tailwindcss": "^2.2.4"
- },
- "license": "MIT"
+ }
}
From b9abc8451111fb3998c3208c22f680da9fcfffba Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Wed, 5 Jan 2022 10:25:42 -0800
Subject: [PATCH 12/15] add back file moved by mistake
---
examples/cms-contentful/pages/api/exit-preview.js | 8 ++++++++
1 file changed, 8 insertions(+)
create mode 100644 examples/cms-contentful/pages/api/exit-preview.js
diff --git a/examples/cms-contentful/pages/api/exit-preview.js b/examples/cms-contentful/pages/api/exit-preview.js
new file mode 100644
index 0000000000000..6c63a0a6e8a42
--- /dev/null
+++ b/examples/cms-contentful/pages/api/exit-preview.js
@@ -0,0 +1,8 @@
+export default async function exit(_, res) {
+ // Exit the current user from "Preview Mode". This function accepts no args.
+ res.clearPreviewData()
+
+ // Redirect the user back to the index page.
+ res.writeHead(307, { Location: '/' })
+ res.end()
+}
From 12840e8712f3fe60e0186d3204fa4276ff339da0 Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Wed, 5 Jan 2022 10:32:44 -0800
Subject: [PATCH 13/15] feedback: update tailwind to latest
---
examples/cms-builder-io/package.json | 8 ++++----
examples/cms-builder-io/tailwind.config.js | 3 +--
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/examples/cms-builder-io/package.json b/examples/cms-builder-io/package.json
index 0e8c1a089175e..8b6de9713f828 100644
--- a/examples/cms-builder-io/package.json
+++ b/examples/cms-builder-io/package.json
@@ -1,5 +1,5 @@
{
- "private": true,
+ "private": true,
"scripts": {
"dev": "next",
"build": "next build",
@@ -15,8 +15,8 @@
"react-dom": "^17.0.2"
},
"devDependencies": {
- "autoprefixer": "10.2.6",
- "postcss": "8.3.5",
- "tailwindcss": "^2.2.4"
+ "autoprefixer": "^10.4.1",
+ "postcss": "^8.4.5",
+ "tailwindcss": "^3.0.11"
}
}
diff --git a/examples/cms-builder-io/tailwind.config.js b/examples/cms-builder-io/tailwind.config.js
index 949b214445228..1b23a5e9fe549 100644
--- a/examples/cms-builder-io/tailwind.config.js
+++ b/examples/cms-builder-io/tailwind.config.js
@@ -1,6 +1,5 @@
module.exports = {
- mode: 'JIT',
- purge: ['./components/**/*.js', './pages/**/*.js'],
+ content: ['./components/**/*.js', './pages/**/*.js'],
theme: {
extend: {
fontFamily: {
From b39a79d75b19339a25144760af2566b074dc4962 Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Tue, 11 Jan 2022 10:09:55 -0800
Subject: [PATCH 14/15] update link to deployment
---
docs/basic-features/data-fetching.md | 2 +-
docs/basic-features/pages.md | 2 +-
examples/cms-builder-io/README.md | 5 +----
3 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/docs/basic-features/data-fetching.md b/docs/basic-features/data-fetching.md
index ed35be198a489..f00d7cd2f0a7f 100644
--- a/docs/basic-features/data-fetching.md
+++ b/docs/basic-features/data-fetching.md
@@ -24,7 +24,7 @@ description: 'Next.js has 2 pre-rendering modes: Static Generation and Server-si
Storyblok Example (Demo )
GraphCMS Example (Demo )
Kontent Example (Demo )
- Builder.io Example (Demo )
+ Builder.io Example (Demo )
Static Tweet Demo
diff --git a/docs/basic-features/pages.md b/docs/basic-features/pages.md
index 1ed62cef788bb..0a5336c411507 100644
--- a/docs/basic-features/pages.md
+++ b/docs/basic-features/pages.md
@@ -63,7 +63,7 @@ You can also use **Client-side Rendering** along with Static Generation or Serve
Storyblok Example (Demo )
GraphCMS Example (Demo )
Kontent Example (Demo )
- Builder.io Example (Demo )
+ Builder.io Example (Demo )
Static Tweet (Demo)
diff --git a/examples/cms-builder-io/README.md b/examples/cms-builder-io/README.md
index 5e0dabfb13f2f..1a474cda79065 100644
--- a/examples/cms-builder-io/README.md
+++ b/examples/cms-builder-io/README.md
@@ -4,7 +4,7 @@ This example showcases Next.js's [Static Generation](https://nextjs.org/docs/bas
## Demo
-[https://cms-builder-blog.vercel.app/](https://cms-builder-blog.vercel.app/)
+[https://cms-builder-io.vercel.app/](https://cms-builder-io.vercel.app/)
## How to use
@@ -75,7 +75,6 @@ Alternatively, you can deploy using our template by clicking on the Deploy butto
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/vercel/next.js/tree/canary/examples/cms-builder-io&project-name=cms-builder-io&repository-name=cms-builder-io&env=BUILDER_PUBLIC_KEY&envDescription=Required%20to%20connect%20the%20app%20with%20Builder.io&envLink=https://www.builder.io/c/docs/custom-react-components#api-key)
-
### Related examples
- [WordPress](/examples/cms-wordpress)
@@ -92,5 +91,3 @@ Alternatively, you can deploy using our template by clicking on the Deploy butto
- [Kontent](/examples/cms-kontent)
- [Ghost](/examples/cms-ghost)
- [Blog Starter](/examples/blog-starter)
-
-
From cb18d48366f69315fff156a3d6b556bb2ee07b7b Mon Sep 17 00:00:00 2001
From: Aziz Abbas
Date: Tue, 11 Jan 2022 21:35:47 -0800
Subject: [PATCH 15/15] feedback, add public prefix and remove config
---
examples/cms-builder-io/.env.local.example | 2 +-
examples/cms-builder-io/README.md | 2 +-
examples/cms-builder-io/lib/constants.js | 2 +-
examples/cms-builder-io/next.config.js | 4 ----
4 files changed, 3 insertions(+), 7 deletions(-)
diff --git a/examples/cms-builder-io/.env.local.example b/examples/cms-builder-io/.env.local.example
index e7e28ea094a5a..3138915779a53 100644
--- a/examples/cms-builder-io/.env.local.example
+++ b/examples/cms-builder-io/.env.local.example
@@ -1,2 +1,2 @@
# Copy this file as .env.local
-BUILDER_PUBLIC_KEY=
+NEXT_PUBLIC_BUILDER_API_KEY=
diff --git a/examples/cms-builder-io/README.md b/examples/cms-builder-io/README.md
index 1a474cda79065..f08e79b707557 100644
--- a/examples/cms-builder-io/README.md
+++ b/examples/cms-builder-io/README.md
@@ -33,7 +33,7 @@ cd cms-builder-io-app
builder create -k [private-key] -n [space-name] -d
```
-This command when done it'll print your new space's public api key, copy it and add as the value for `BUILDER_PUBLIC_KEY` into the .env files (`.env.production` and `.env.development`)
+This command when done it'll print your new space's public api key, copy it and add as the value for `NEXT_PUBLIC_BUILDER_API_KEY` into the .env files (`.env.production` and `.env.development`)
```
BUILDER_PUBLIC_KEY=...
diff --git a/examples/cms-builder-io/lib/constants.js b/examples/cms-builder-io/lib/constants.js
index 488d8cec866c4..442de6348b0f0 100644
--- a/examples/cms-builder-io/lib/constants.js
+++ b/examples/cms-builder-io/lib/constants.js
@@ -4,7 +4,7 @@ export const CMS_URL = 'https://builder.io/'
export const HOME_OG_IMAGE_URL =
'https://og-image.now.sh/Next.js%20Blog%20example%20with%20**Builder.io**.png?theme=light&md=1&fontSize=100px&images=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Ffront%2Fassets%2Fdesign%2Fnextjs-black-logo.svg&images=https%3A%2F%2Fcdn.builder.io%2Fapi%2Fv1%2Fimage%2Fassets%252FYJIGb4i01jvw0SRdL5Bt%252F79c8b61740bc41d5ae722c000ddb5915'
export const BUILDER_CONFIG = {
- apiKey: process.env.BUILDER_PUBLIC_KEY,
+ apiKey: process.env.NEXT_PUBLIC_BUILDER_API_KEY,
postsModel: 'post',
previewSecret: 'micky-mouse',
}
diff --git a/examples/cms-builder-io/next.config.js b/examples/cms-builder-io/next.config.js
index 3503fbb00e47e..b4f3c29cb84df 100644
--- a/examples/cms-builder-io/next.config.js
+++ b/examples/cms-builder-io/next.config.js
@@ -16,8 +16,4 @@ module.exports = {
},
]
},
- env: {
- // expose env to the browser
- BUILDER_PUBLIC_KEY: process.env.BUILDER_PUBLIC_KEY,
- },
}