From 4aee8541710246185b4a1d619709e246c13e38bf Mon Sep 17 00:00:00 2001 From: Filip Rakowski Date: Thu, 25 Mar 2021 18:41:34 +0100 Subject: [PATCH 01/14] update key concepts --- packages/core/docs/general/key-concepts.md | 91 ++++++++++++++++++---- packages/core/docs/guide/composables.md | 4 +- 2 files changed, 76 insertions(+), 19 deletions(-) diff --git a/packages/core/docs/general/key-concepts.md b/packages/core/docs/general/key-concepts.md index 40ab2d5f1f9..09814a63c81 100644 --- a/packages/core/docs/general/key-concepts.md +++ b/packages/core/docs/general/key-concepts.md @@ -4,13 +4,10 @@ This document will walk you through the most important concepts of Vue Storefron ## Configuration -The first thing you usually want to do after setting up a new project is some configuration. No matter if you want to change your backend API credentials, change routes or add a custom logger, there is always a single place to do all these things - Vue Storefront Modules configuration in `nuxt.config.js`. +There are two types of configuration in Vue Storefront: -If you're using our boilerplate, you will find 3 Vue Storefront modules in your configuration: - -- `@vue-storefront/nuxt` - Our core Nuxt module. Its main responsibility is to extend Nuxt configuration. -- `@vue-storefront/nuxt-theme`- This module adds routing and theme-specific configuration for Nuxt. -- `@vue-storefront/` - This is a module of your eCommerce integration. All configuration related to the specific eCommerce platform like setting up API credentials has to happen through this module. Such module usually provides some additional functionalities like setting up the cookies. +- `nuxt.config.js` which controls your Nuxt App and frontend-related features of Vue Storefront +- `middleware.config.js` where you add, configure and extend your integrations You can read more about configuration [here](/guide/configuration.html) @@ -39,26 +36,86 @@ By default, we're using `nuxt-i18n` module for internationalization. You can read more about i18n in Vue Storefront [here](/advanced/internationalization). -## App Context +## Middleware + +Vue Storefront uses a middleware that is a bridge between front-end and backends (eCommerce or 3rd party services). The front-end always calls middleware that is redirecting requests to correlated destinations. It allows developers to implement custom logic to inject into the lifecycle of the requests or even create custom API endpoints if needed. + +Middleware by default is a part of your Nuxt application but it can be detached and server as a separate node application. + +You can read more about Vue Storefront Middleware on the [Server Middleware](/advanced/server-middleware) page. + -Sometimes the only thing you need is to fetch some data from integrations API Client without the overlap of a composable. You should use an API Client that is accessible through `useVSFContext` composable for that. +## Integrations and extendibility + +All the 3rd party integrations (eCommerce, CMS, Search etc) can be added and configured through `middleware.config.js`. ```js -import { useVSFContext } from '@vue-storefront/core' -// for each integration you can access it's tag - eg $ct for commercetools -const { $ct } = useVSFContext() +//middleware.config.js +module.exports = { + integrations: { + // ... + } +} ``` -You can read more about Vue Storefront Context [here](/advanced/context) +Each integration has `extensions` field. You can use extensions to: +- Override existing API methods of a certain integration. +- Add new API methods. +- Change method parameters before each/specific it's called. +- Do something after each/specific method is called. +```js +{ + name: 'my-extension', + extendApiMethods: { + // will override default getProduct + getProduct: async () => { /* ... */ } + // will add new method to the integration + doSomethingMore: async () => { /* ... */} + }, + hooks: (req, res) => { + return { + beforeCreate: ({ configuration }) => configuration, + afterCreate: ({ configuration }) => configuration, + beforeCall: ({ configuration, callName, args }) => args, + afterCall: ({ configuration, callName, args, response }) => response + } + } +} +``` -## Middleware +Sometime you just need to call specific API client method without using a composable. You have access to all API methods of your registered integrations through `useVSFContext` composable. -When it comes to the networking layer, Vue Storefront uses a middleware that is a bridge between front-end and other backends (eCommerce or 3rd party services). The front-end always calls middleware that is redirecting requests to correlated destinations. It allows developers to implement custom logic to inject into the lifecycle of the requests or even create custom API endpoints if needed. +The composable returns a list of tags representing your integrations (it's usually either a name of the integration like `$storyblok` or acronym for longer names like `$ct` for commercetools) -You can read more about Vue Storefront Middleware on the [Server Middleware](/advanced/server-middleware) page. +```js +const { $ct } = useVsfContext() +``` +You have access to all methods through `api` field of each integration -## Integrations +```js +const products = $ct.api.getProducts(params) +``` + +## Backend-agnostic + +No matter what backend services you're using they are handled more or less the same way on the frontend. No matter what eCommerce platform, CMS or Search you're using you will always use the same getters and composables so it's easy to work with VSF projects on different tech stacks or try new services without making heavy investments. + +There are some things that are different for each platform though. Main data object of each composable (like `products` in `useProduct`) is **always** a plain response from your platform. If you use getters on this object they will always return agnostic data format + +```js +const { search, products } = useProduct() + +console.log(products) // type: CommerceToolsProduct[] + +console.log(productGetters.getAttributes(products.value)) // type: AgnosticProductAttribute[] +``` + +Also parameters of functions returned by composables are different for each platform + +```js +const { search, products } = useProduct() -Even though high-level APIs are the same for all Vue Storefront integrations, they are different on the low level (data formats, search params). Check the documentation for a specific platform to learn more. +search(params) // `params` are different depending on backend platform +``` \ No newline at end of file diff --git a/packages/core/docs/guide/composables.md b/packages/core/docs/guide/composables.md index 681efa96a98..3cf9f21b978 100644 --- a/packages/core/docs/guide/composables.md +++ b/packages/core/docs/guide/composables.md @@ -294,9 +294,9 @@ Vue Storefront integrations are exposing the following composables: #### Checkout - `useShipping` - Saving the shipping address for a current order. -- `useShippingProvider` - Choosing a shipping method for a current order. +- `useShippingProvider` - Choosing a shipping method for a current order. Shares data with `VsfShippingProvider` component. - `useBilling` - Saving the billing address for a current order. -- `usePaymentProvider` - Choosing a payment method for a current order. +- `usePaymentProvider` - Choosing a payment method for a current order. Shares data with `VsfPaymentProvider` component - `useMakeOrder` - Placing the order. #### Other From 653d96b047155c35ae5ec3b613f2a625bb491f03 Mon Sep 17 00:00:00 2001 From: Filip Rakowski Date: Thu, 25 Mar 2021 18:59:23 +0100 Subject: [PATCH 02/14] enterprise polishments --- packages/core/docs/general/enterprise.md | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/core/docs/general/enterprise.md b/packages/core/docs/general/enterprise.md index dc5345e696c..22cda769982 100644 --- a/packages/core/docs/general/enterprise.md +++ b/packages/core/docs/general/enterprise.md @@ -1,18 +1,23 @@ # What is Vue Storefront Enterprise -Vue Storefront Enterprise is a commercial offering from Vue Storefront core team built on top of the Open Source product. Our goal is to give you all the tools that you could need to launch your Vue Storefront shop and provide you with ready-to-use integrations that will drastically speed up your development process. +> Vue Storefront Enterprise is currently available only for Commercetools -- Vue Storefront Cloud -- Integrations with third-parties -- Extended integration with Commercetools +Vue Storefront Enterprise is a commercial offering from Vue Storefront core team built on top of the Open Source product. Our goal is to give you all the tools that you could need to launch your Vue Storefront shop and provide you with ready-to-use integrations that will reduce the development time and cost of your project. -You can learn more about our commercial offering [here](https://www.vuestorefront.io/enterprise). +## What are the differences between Open Source and Enterprise version? + +In Enterprise Edition you're getting everything that is in Open Source plus: +- Vue Storefront Cloud +- Additional integrations with third-party services. +- Extended integration with eCommerce platform with advanced features. + +Everything with badge in the docs is only available in Vue Storefront Enterprise edition. -This document will walk you through the installation and usage of the latter part. +You can learn more about our commercial offering [here](https://www.vuestorefront.io/enterprise). # How to use Vue Storefront Enterprise -Vue Storefront Enterprise packages are part of our private npm registry. +Enterprise packages within `@vsf-enterprise` scope are part of our private registry. To make use of it create a `.npmrc` file in the root of your project with the following content: @@ -20,7 +25,8 @@ To make use of it create a `.npmrc` file in the root of your project with the fo @vsf-enterprise:registry=https://registrynpm.storefrontcloud.io ``` -Then log into your account on Vue Storefront registry: +Then log into your account with your Vue Storefront Enterprise credentials: + ```bash npm adduser --registry https://registrynpm.storefrontcloud.io ``` @@ -28,3 +34,4 @@ npm adduser --registry https://registrynpm.storefrontcloud.io From there you will use Vue Storefront registry for all packages within `@vsf-enterprise` scope. Other ones will be proxied to NPM. + From a4aa72e84e3fcfa3ee0e75acfb5b9f22b2e16b8c Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Fri, 26 Mar 2021 11:02:22 +0100 Subject: [PATCH 03/14] Restore and update useFacet docs (#5705) --- .../commercetools/composables/use-facet.md | 76 +++++++++++++++---- 1 file changed, 62 insertions(+), 14 deletions(-) diff --git a/packages/core/docs/commercetools/composables/use-facet.md b/packages/core/docs/commercetools/composables/use-facet.md index 5efbe6382fa..3f52bf78e55 100644 --- a/packages/core/docs/commercetools/composables/use-facet.md +++ b/packages/core/docs/commercetools/composables/use-facet.md @@ -169,25 +169,62 @@ type ProductVariant = { ## Configuration -::: warning -Configuration can be changed only for th Enterprise version of this package. +::: tip +Configuration can be changed only for the Enterprise version of this package. ::: -Faceting configuration can be modified to change available sorting options, filters, etc. +Faceting configuration can be modified to change available sorting options, filters, etc. It must be passed to: +- `@vsf-enterprise/ct-faceting/nuxt` module in `nuxt.config.js`. +- `@vsf-enterprise/ct-faceting/server` integration in `middleware.config.js`. -If the explicit configuration is not provided, the following defaults will be used: +::: warning Keep your configuration synchronized +Parts of the configuration marked as `` must be identical in both files. +::: + +```javascript +// nuxt.config.js +export default { + buildModules: [ + ['@vsf-enterprise/ct-faceting/nuxt', { + // + }], + ] +}; + +// middleware.config.js +module.exports = { + integrations: { + ctf: { + location: '@vsf-enterprise/ct-faceting/server', + configuration: { + api: { + authHost: "", + projectKey: "", + clientId: "", + clientSecret: "", + scopes: [ + "" + ], + }, + faceting: { + host: "" + }, + // + } + } + } +}; +``` + +If the explicit configuration is not provided in place of ``, the following defaults will be used: ```javascript { - pageOptions: [ - 20, - 50, - 100 - ], + pageOptions: [20, 50, 100], subcategoriesLimit: 100, availableFacets: [ - { facet: 'categories.id', type: 'string', option: 'subtree("*")', name: 'category' }, - { facet: 'variants.attributes.size', type: 'number', option: '', name: 'size' }, + { facet: 'categories.id', type: 'string', option: 'subtree("*")', name: 'category', filteringStrategy: 'query' }, // Don't change the "name" of this facet + { facet: 'variants.attributes.size', type: 'string', option: '', name: 'size' }, { facet: 'variants.attributes.color.key', type: 'string', option: '', name: 'color' } ], sortingOptions: [ @@ -200,9 +237,20 @@ If the explicit configuration is not provided, the following defaults will be us } ``` -Configuration can be modified by passing identical configuration to: -- `@vsf-enterprise/ct-faceting/nuxt` module in `nuxt.config.js`. -- `@vsf-enterprise/ct-faceting/server` integration in `middleware.config.js`. +- `pageOptions` - an array of number of elements displayed per page. +- `subcategoriesLimit` - the maximum number of subcategories displayed for any given category. +- `availableFacets` - an array of filters available to the user. + - `facet` - facet expressions described on [this page](https://docs.commercetools.com/api/projects/products-search#termfacetexpression). + - `type` - `facet` data type. Valid values are `string`, `date`, `time`, `datetime`, `boolean` or `number`. + - `option` - filtering options described on [this page](https://docs.commercetools.com/api/projects/products-search#filters). + - `name` - facet alias described on [this page](https://docs.commercetools.com/api/projects/products-search#alias). `category` alias for the first facet shown above is a constant and shouldn't be changed. + - `filteringStrategy` - scope applied to this specific filter. Possible values are `filter`, `query` or `facets`. For more information refer to [this page](https://docs.commercetools.com/api/projects/products-search#filters). +- `sortingOptions` - an array of sorting options available to the user. + - `id` - unique `identifier` for the option. + - `name` - label for the option. + - `facet` - the name of the field to sort by. For more information refer to [this page](https://docs.commercetools.com/api/projects/products-search#sorting). + - `direction` - sorting direction. Valid values are `asc` or `desc`. +- `filteringStrategy` - fallback scope applied to the facets that don't have strategy defined. Possible values are `filter`, `query` or `facets`. For more information refer to [this page](https://docs.commercetools.com/api/projects/products-search#filters). ## Example From dfcef6a342a7658f8ff6aa9702e6356907e7c762 Mon Sep 17 00:00:00 2001 From: Filip Rakowski Date: Sun, 28 Mar 2021 10:41:02 +0200 Subject: [PATCH 04/14] correct payment provider docs --- packages/core/docs/guide/checkout.md | 6 +++--- packages/core/docs/guide/configuration.md | 23 +++++++++++++---------- packages/core/docs/guide/theme.md | 7 ++----- packages/core/docs/guide/user-profile.md | 2 +- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/core/docs/guide/checkout.md b/packages/core/docs/guide/checkout.md index b481f2dda7d..f3ea394f761 100644 --- a/packages/core/docs/guide/checkout.md +++ b/packages/core/docs/guide/checkout.md @@ -342,9 +342,9 @@ You can pass asynchronous functions to the `VsfPaymentProvider` component to hoo Because every payment provider is different, not all of them are present in every integration. Always refer to the documentation of a specific provider to learn which hooks are available. - **beforeLoad** `(config => config)` - Called before loading payment methods. -- **afterLoad** `(shippingMethodsResponse => shippingMethodsResponse.shippingMethods)` - Called after loading payment methods. -- **beforeSelect** `(shippingMethod => shippingMethod)` - Called before selecting payment method. -- **afterSelect** `(selectedShippingMethod => void)` - Called after selecting payment method. +- **afterLoad** `(paymentMethodsResponse => paymentMethodsResponse.paymentMethods)` - Called after loading payment methods. +- **beforeSelect** `(paymentMethod => paymentMethod)` - Called before selecting payment method. +- **afterSelect** `(selectedPaymentMethod => void)` - Called after selecting payment method. - **beforePay** `(paymentDetails => paymentDetails)` - Called before pay. - **afterPay** `(paymentResponse => void)` - Called after pay. - **beforeSelectedDetailsChange** `(details => details)` - Called before modifying currently picked payment method, e.g. changing credit card's details. diff --git a/packages/core/docs/guide/configuration.md b/packages/core/docs/guide/configuration.md index a20dd9a976a..f26d16b2ba5 100644 --- a/packages/core/docs/guide/configuration.md +++ b/packages/core/docs/guide/configuration.md @@ -31,14 +31,6 @@ Sometimes integrations also expose a Nuxt module to configure frontend-related p }] ``` -Below you can find links to the setup instructions and config references of the official eCommerce integrations: - - - - ## Configuring Nuxt We try to use the most common modules from Nuxt Community whenever it's possible. For internationalization we are using `nuxt-i18n`, for PWA capabilities `@nuxtjs/pwa` etc. You can find a list of the Nuxt modules used in the default theme [here](theme.html#preinstalled-modules-and-libraries). Each of them is configured in a way that works best for the majority of users. @@ -85,10 +77,21 @@ It's unsafe and not recommended to remove `@vue-storefront/nuxt` from your proje ## Configuring Middleware +There are certain things related to Integration Middleware that are not tied to any specific integration like setting custom GraphQL queries you can configure. You can read more about the Middleware and its configuration [here](/v2/advanced/server-middleware). + +## Integration References + + +### Setting up official eCommerce integrations + -There are certain things related to Integration Middleware that are not tied to any specific integration like setting custom GraphQL queries you can configure. You can read more about the Middleware and its configuration [here](/v2/advanced/server-middleware). +### Configuration references of official eCommerce integrations + \ No newline at end of file diff --git a/packages/core/docs/guide/theme.md b/packages/core/docs/guide/theme.md index 8a3da1f7bf4..379bf9cb2a3 100644 --- a/packages/core/docs/guide/theme.md +++ b/packages/core/docs/guide/theme.md @@ -42,17 +42,14 @@ If you're familiar with Nuxt.js, you will quickly notice that the directory stru ```js . ├─ components/ -├─ composables/ // place for custom composition API functions -│ └─ useUiHelpers/ // theme-specific composition API functions -├─ helpers/ // utility functions -│ ├─ category/ // getting category search params to/from url -│ └─ filters/ // getting filters to/from url +├─ composables/ // custom, theme-related composables ├─ lang/ // i18n translation keys ├─ layouts/ ├─ middleware/ │ └─ checkout.js // prevents users from entering checkout steps if certain information is missing ├─ pages/ ├─ static/ +├─ middleware.config.js // integrations configuration └─ nuxt.config.js ``` diff --git a/packages/core/docs/guide/user-profile.md b/packages/core/docs/guide/user-profile.md index 73c53a83850..df946f1df10 100644 --- a/packages/core/docs/guide/user-profile.md +++ b/packages/core/docs/guide/user-profile.md @@ -265,7 +265,7 @@ export default { ] } ``` -## Integration references +## Integration References ### `useUser` From 10abe4a566001cf4b77f837c71197a53637d2095 Mon Sep 17 00:00:00 2001 From: Filip Rakowski Date: Sun, 28 Mar 2021 10:42:42 +0200 Subject: [PATCH 05/14] Update packages/core/docs/general/key-concepts.md Co-authored-by: Natalia Tepluhina --- packages/core/docs/general/key-concepts.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/docs/general/key-concepts.md b/packages/core/docs/general/key-concepts.md index 09814a63c81..a1a0b4bf24e 100644 --- a/packages/core/docs/general/key-concepts.md +++ b/packages/core/docs/general/key-concepts.md @@ -100,7 +100,7 @@ const products = $ct.api.getProducts(params) ## Backend-agnostic -No matter what backend services you're using they are handled more or less the same way on the frontend. No matter what eCommerce platform, CMS or Search you're using you will always use the same getters and composables so it's easy to work with VSF projects on different tech stacks or try new services without making heavy investments. +Whatever backend services you're using, they are handled more or less the same way on the frontend. No matter what eCommerce platform, CMS, or Search you're using you will always use the same getters and composables so it's easy to work with VSF projects on different tech stacks or try new services without making heavy investments. There are some things that are different for each platform though. Main data object of each composable (like `products` in `useProduct`) is **always** a plain response from your platform. If you use getters on this object they will always return agnostic data format @@ -118,4 +118,4 @@ Also parameters of functions returned by composables are different for each plat const { search, products } = useProduct() search(params) // `params` are different depending on backend platform -``` \ No newline at end of file +``` From 2f9b10f66c96b7e4870a46e43c2cda27c52a865e Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Mon, 29 Mar 2021 11:38:49 +0200 Subject: [PATCH 06/14] Move Homepage link from Header to Sidebar and rename Getting Started to Installation --- .../.vuepress/components/IntegrationTile.vue | 2 +- packages/core/docs/.vuepress/config.js | 12 +- packages/core/docs/README.md | 103 +++++++++--------- packages/core/docs/core/api-client.md | 2 +- .../{getting-started.md => installation.md} | 4 +- packages/core/docs/guide/theme.md | 2 +- 6 files changed, 61 insertions(+), 64 deletions(-) rename packages/core/docs/general/{getting-started.md => installation.md} (97%) diff --git a/packages/core/docs/.vuepress/components/IntegrationTile.vue b/packages/core/docs/.vuepress/components/IntegrationTile.vue index f5b38efd433..e1f236fc85a 100644 --- a/packages/core/docs/.vuepress/components/IntegrationTile.vue +++ b/packages/core/docs/.vuepress/components/IntegrationTile.vue @@ -3,7 +3,7 @@
Enterprise - In prorgess + In progress Beta From Core Team
diff --git a/packages/core/docs/.vuepress/config.js b/packages/core/docs/.vuepress/config.js index d67e11f069f..685f5cf839c 100644 --- a/packages/core/docs/.vuepress/config.js +++ b/packages/core/docs/.vuepress/config.js @@ -23,7 +23,6 @@ module.exports = { themeConfig: { logo: 'https://camo.githubusercontent.com/48c886ac0703e3a46bc0ec963e20f126337229fc/68747470733a2f2f643968687267346d6e767a6f772e636c6f756466726f6e742e6e65742f7777772e76756573746f726566726f6e742e696f2f32383062313964302d6c6f676f2d76735f3062793032633062793032633030303030302e6a7067', nav: [ - { text: 'Home', link: '/' }, { text: 'Demo', link: 'https://vsf-next-demo.storefrontcloud.io' }, { text: 'Integrations', link: '/integrations/' }, { text: 'Migration guide', link: '/migrate/' }, @@ -169,16 +168,17 @@ module.exports = { ], '/': [ { - title: 'In a nutshell', + title: 'Getting started', collapsable: false, children: [ - ['/general/getting-started', 'Getting started'], + ['/', 'What is Vue Storefront?'], + ['/general/installation', 'Installation'], ['/general/key-concepts', 'Key concepts'], ['/general/enterprise', 'Enterprise'] ] }, { - title: 'Guide [WIP]', + title: 'Guides', collapsable: false, children: [ ['/guide/theme', 'Theme'], @@ -192,7 +192,7 @@ module.exports = { ] }, { - title: 'Advanced [WIP]', + title: 'Advanced', collapsable: false, children: [ ['/advanced/architecture', 'Architecture'], @@ -206,7 +206,7 @@ module.exports = { ] }, { - title: 'Build integration', + title: 'Building integration', collapsable: true, children: [ ['/integrate/integration-guide', 'eCommerce'], diff --git a/packages/core/docs/README.md b/packages/core/docs/README.md index c7e9207d0e4..033cd27cd43 100644 --- a/packages/core/docs/README.md +++ b/packages/core/docs/README.md @@ -3,104 +3,99 @@ [[toc]] -_Vue Storefront_ is a ___platform-agnostic headless e-commerce PWA frontend framework___ that may work with __any__ backend that you are already using via its API regardless of the platform, be it e-commerce, CMS, ERP, PIM, or anything else. - - +_Vue Storefront_ is a ___platform-agnostic e-commerce PWA frontend framework___ that can work with __any__ backend that you already use, be it e-commerce, CMS, ERP, PIM, or anything else.
+That's a mouthful, so let's break it down: + - __platform-agnostic__: we made it possible to work with any platform and service you already use, as long as it has an API like REST or GraphQL. Because of _low coupling and high cohesion_, it can work with multiple platforms at once, giving you the freedom to work with the technologies you need and love. + - __e-commerce__: today's shops are much more than just products or carts. That's why we made it easy to integrate other types of services, such as helper service for ERP, versatile search features for PIM, portable checkout for 3rd party payment kiosk, and more. + - __PWA__: it's the technology of the future, designed to give the best performance on any device, with native-like features to satisfy your customer's needs. + - __frontend framework__: _Vue Storefront_ is a set of modular features, glued together using _interfaces_ and _factories_ and powered by [Nuxt.js](https://nuxtjs.org/). +## Problems Vue Storefront solves -We mean by - - __platform-agnostic__ : _Vue Storefront_ will work with any platform and service that you're using as long as it's exposing some kind of REST or GraphQL API. - - __headless__ : Your e-commerce platform as a whole system can be built on top of a set of different technologies. No mandatory combination for the platform is required. Manifestation of _low coupling and high cohesion_ is here and will stay with us until the end. - - __e-commerce__ : Essentially _Vue Storefront_ was born as the e-commerce framework. By the nature of headless and microservice, however, you might connect it to whatever you set it to, say, a helper service for ERP, or versatile search features for PIM, and portable checkout for 3rd party payment kiosk, and so on. Limit is your imagination. - - __PWA__ : _PWA_ is the thing of future, it is designed to give best performance even on laggy mobile devices with native-like features from the beginning in order to satisfy your customers who are curious, rich, and impatient. - - __framework__ : Even though _Vue Storefront_ is a set of atomic features, they should be guided as one by the conductor. We do so by gluing them through _interfaces_ and _factories_. We will dig this further later, but one thing to take away, they are quite flexible glues. - -## Problems Vue Storefront will solve for you - -The main purpose of any software is to solve problems. Vue Storefront is no different. We're doing our best to find common issues in eCommerce space (and in our software!) and find viable solutions to them. Below you can find just a few of the issues Vue Storefront will solve for you. +The main purpose of any software is to solve problems and Vue Storefront is no different. We're doing our best to find common issues in the eCommerce space and find viable and scalable solutions to them. Below you can find just a few of the issues Vue Storefront solves. ### Long time to market Headless eCommerce frontends are complex and developing them can take a lot of time. -**Solution** With Vue Storefront you're getting a working headless frontend connected to eCommerce, CMS and other third-party services of your choice out of the box along with a hundreds of ready-to-use Vue Storefront and Nuxt modules for all common functionalities! Because of that you're saving hundreds (or even thousands) of working hours so you can focus more on details and polishing while leaving the heavy lifting to us! +**Solution** + +With Vue Storefront you're getting a performant headless frontend connected to eCommerce, CMS, and other third-party services of your choice, along with hundreds of ready-to-use Vue Storefront and Nuxt.js modules for all common functionalities. Thanks to them, you will save hundreds (or even thousands) of working hours, so you can focus more on details and polishing while leaving the heavy lifting to us! ### Slow, unresponsive online shop -No matter how great your products are slow and unresponsive shop will make your conversion significantly lower . **Some estimates say up to 1% users will leave your website for every 100ms delay in page load time.** +No matter how great your products are, a slow and unresponsive shop will make your conversion significantly lower. -**Solution** _Vue Storefront_ solves slow, unresponsive online shop problems as follows : +::: tip +Some estimates say that up to 1% of users will leave your website for every 100ms of delay in page load time. +::: -- The page load time is reduced significantly on average thanks to small bundle size, code splitting, lazy loading and a bunch of other web performance techniques that we used to make sure your shop will load as fast as possible. -- Pages that were already visited are cached so next time user enters them they will load instantly. -- Resources that might be needed in the future are precached so when the user clicks the link it loads immediately. -- When network connectivity is slow or temporarily lost you can stil browse the product catalog. In many cases its unnoticeable for the user. -- Majority of JavaScript code is hosted and executed on the server side so your users download only the code that drives the UI. Because of this the page renders much faster and is much lighter compared to traditional SPA. +**Solution** -Not only page load time but also __responsiveness as a whole from the page is almost instant and seamless__ just as you would expect from a native app, if not better. +We solved these issues by: +- using modern technologies for small bundle sizes; +- using code splitting, lazy loading, and lazy hydration to load only what's needed at the moment; +- caching the resources, so the already visited pages are loaded instantly; +- preloading resources that might be needed in the future; +- hosting and executing at much as possible on the server, so the part served to the users is much lighter and faster compared to traditional SPA; ### Unwieldy architectural decisions -How painful was it when you had to meticulously fix tremendous amount of changes without patterns while you just want to add/remove a simple feature, or upgrade the framework as they claim security risk is at stake? +It can be incredibly hard to add or remove simple features when the code doesn't follow industry standard patterns and conventions. Even a simple bugfix or security update can be a very time-consuming task. -**Solution** Vue Storefront is promoting good architectural decisions by design. We're providing an opinionated way of building eCommerce frontends based on years of experience. Whatever troubles you could run into we made sure that our architecture and flexibility will got you covered. +**Solution** -### Painful migrations +We are promoting good architectural decisions by providing an opinionated way of building eCommerce frontends based on years of experience. Whatever issues you could run into, we made sure that our modular and flexible architecture will handle them. -How frustrated was it when you learned the other backend platform you didn't choose turned out better solution for your business, a lot better on many levels, but the cost of switching is even greater than the benefit of it you just learned? You were literally locked-in by tentative choices you made while you were naive. +### Painful or impossible migrations -**Solution** Vue Storefront is backend-agnostic which means all eCommerce backends are integrated on the frontend under common interfaces. All these technologies are completely different on the backend but they're very similar from the frontend perspective. We just made use of that fact and came up with abstractions that will make your migrations painless and almost instantaneous. +It can be frustrating when the technology you choose turned out to not fit your business needs, be it feature- or cost-wise. It can be even worse if you can't change it at all or the cost outweighs the benefits. -### Lack of platform-specific competences +**Solution** -So your Magento department is not doing very well but the commercetools one is growing like crazy? If only could you move developers from one department to another... +From the very beginning, Vue Storefront was designed to be backend-agnostic. This means that all eCommerce backends are integrated on the frontend under common interfaces. Most technologies are completely different on the backend but are very similar from the frontend perspective, so we made abstractions that will make your migrations painless. -**Solution** ...wait! With Vue Storefront you can! We have the same interfaces for all integrations of the same type (eCommerce, CMS, Loyalty etc) so once a developer learns Vue Storefront he/she can be confident with any tech stack that works with it. +### Lack of platform-specific competencies -### Lack of flexibility +So your Magento department is not doing well, but the commercetools one is growing like crazy? If only you could move developers from one department to another... + +**Solution** -Do you recall the frustration when implementing your dream design is not possible within your backend platform, adding a single modal window takes 2 days or adding some specific feature is just not possible with the framework you're using? +With Vue Storefront you can! We have common interfaces for all integrations of the same type (eCommerce, CMS, Loyalty, etc.), so once a developer learns Vue Storefront they can be confident with any tech stack that works with it. +### Lack of flexibility -**Solution** You will forget about these issues with Vue Storefront! For the best experience when it comes to maintaining the framework, we divided the system into the smallest chunks until it's not meaningful to do so. ___Technically all parts are wrapped in as individual `npm` packages so switching from one version to another should be as easy as any `npm` command.___ In short, it has been built on the firm ground of _Mircroservice_ architecture. Each of these packages is independent and optional so its up to you how much of the framework you want to utilize. Moreover **there are absolutely no limitations in terms of UI customization**. Your theme is just a regular Nuxt.js project which you can customize to any degree. +Do you recall the frustration when it wasn't possible to implement your dream design or feature within your backend platform, or adding a single modal window took 2 days? -## eCommerce Integrations -_Vue Storefront_ is a frontend framework undoubtedly. It needs an e-commerce backend to fully function in its glory. -Here is the list of e-commerce platform integrations already out in the field. +**Solution** -- Commercetools -- Magento 2 -- Shopware (as Shopware PWA) -- Shopify (Developers Preview) -- About You Cloud (Developers Preview) -- Salesforce Commerce Cloud (WIP) -- BigCommerce (WIP) +You will forget about these issues with Vue Storefront! For the best experience, we divided the system into the smallest and modular chunks. All parts are individual `npm` packages, so switching from one version to another should be as easy as any package installation. +Vue Storefront was built on the firm ground of _microservice_ architecture. Each of these packages is independent and optional, so you decide how much of the framework you want to utilize. Moreover **there are absolutely no limitations in terms of UI customization**. Your theme is just a regular Nuxt.js project which you can customize to any degree. -We will walk you with details of each integration in its dedicated guide. +## eCommerce Integrations -## Benefits you take -- Blazingly fast frontend -- Ability to work with any eCommerce platform, CMS, ERP, PIM **under common, agnostic API** -- Server Side Rendereing -- Progressive Web App features -- Unlimited flexibility in changing third-party services thanks to agnostic data formats +Vue Storefront is a frontend framework, so it needs an e-commerce backend. You can see the list of supported e-commerce platforms on the [integrations page](./integrations). ## Tech stack + +The speed and flexibility of Vue Storefront wouldn't be possible without the great technologies that power it: + - [Vue.js](https://vuejs.org/v2/guide/) - [Nuxt.js](https://nuxtjs.org/guide) -- SCSS +- [SCSS](https://sass-lang.com/) - [Storefront UI](https://www.storefrontui.io/) (optional) - [TypeScript](https://www.typescriptlang.org/docs/home) (optional) - +- [Cypress](https://www.cypress.io/) (optional) ## What's next? -If you're already convinced to use Vue Storefront check the [installation guide](./general/getting-started.html). -If you want to learn more check the [key concepts](./general/key-concepts.html) behind Vue Storefront to understand how it works. +If you're already convinced to use Vue Storefront, check the [Installation guide](./general/installation.html). + +If you want to learn more, check the [Key Concepts](./general/key-concepts.html) behind Vue Storefront. diff --git a/packages/core/docs/core/api-client.md b/packages/core/docs/core/api-client.md index 22cec517212..e36f2826939 100644 --- a/packages/core/docs/core/api-client.md +++ b/packages/core/docs/core/api-client.md @@ -4,7 +4,7 @@ ---- ::: tip Installation -If you want to learn how to install the API Client check our [Getting Started guide](/getting-started.html) +If you want to learn how to install the API Client check our [Installation guide](/general/installation.html) ::: API Client is a data layer of your eCommerce integration. It provides a friendly abstraction layer over network calls to your eCommerce platform. diff --git a/packages/core/docs/general/getting-started.md b/packages/core/docs/general/installation.md similarity index 97% rename from packages/core/docs/general/getting-started.md rename to packages/core/docs/general/installation.md index b4093c02a4f..426219c8d4e 100644 --- a/packages/core/docs/general/getting-started.md +++ b/packages/core/docs/general/installation.md @@ -1,4 +1,6 @@ -# Getting started +# Installation + +## Using CLI If you want to get started with Vue Storefront, the easiest way to do this is to set up your project through our CLI tool. It can be installed globally through NPM: diff --git a/packages/core/docs/guide/theme.md b/packages/core/docs/guide/theme.md index 379bf9cb2a3..fd411b68ec1 100644 --- a/packages/core/docs/guide/theme.md +++ b/packages/core/docs/guide/theme.md @@ -1,6 +1,6 @@ # Theme -If you [use our CLI to set up your project](./general/getting-started) you will end up with a fully functional eCommerce theme connected to your eCommerce backend and a bunch of other services based on [Nuxt.js](https://nuxtjs.org/) +If you [use our CLI to set up your project](/general/installation) you will end up with a fully functional eCommerce theme connected to your eCommerce backend and a bunch of other services based on [Nuxt.js](https://nuxtjs.org/) ## High-level overview From 01684bf5b56c264737bac5c608e8c977c7a077a2 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Mon, 29 Mar 2021 12:04:44 +0200 Subject: [PATCH 07/14] Rename Homepage to "Introduction" and polish it --- packages/core/docs/.vuepress/config.js | 2 +- packages/core/docs/README.md | 34 ++++++++++++-------------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/packages/core/docs/.vuepress/config.js b/packages/core/docs/.vuepress/config.js index 685f5cf839c..9cf2f7c7e6b 100644 --- a/packages/core/docs/.vuepress/config.js +++ b/packages/core/docs/.vuepress/config.js @@ -171,7 +171,7 @@ module.exports = { title: 'Getting started', collapsable: false, children: [ - ['/', 'What is Vue Storefront?'], + ['/', 'Introduction'], ['/general/installation', 'Installation'], ['/general/key-concepts', 'Key concepts'], ['/general/enterprise', 'Enterprise'] diff --git a/packages/core/docs/README.md b/packages/core/docs/README.md index 033cd27cd43..415aa75c9eb 100644 --- a/packages/core/docs/README.md +++ b/packages/core/docs/README.md @@ -1,7 +1,8 @@ -# What is Vue Storefront? +# Introduction [[toc]] +## What is Vue Storefront? _Vue Storefront_ is a ___platform-agnostic e-commerce PWA frontend framework___ that can work with __any__ backend that you already use, be it e-commerce, CMS, ERP, PIM, or anything else. @@ -10,14 +11,14 @@ _Vue Storefront_ is a ___platform-agnostic e-commerce PWA frontend framework___ That's a mouthful, so let's break it down: - - __platform-agnostic__: we made it possible to work with any platform and service you already use, as long as it has an API like REST or GraphQL. Because of _low coupling and high cohesion_, it can work with multiple platforms at once, giving you the freedom to work with the technologies you need and love. - - __e-commerce__: today's shops are much more than just products or carts. That's why we made it easy to integrate other types of services, such as helper service for ERP, versatile search features for PIM, portable checkout for 3rd party payment kiosk, and more. - - __PWA__: it's the technology of the future, designed to give the best performance on any device, with native-like features to satisfy your customer's needs. - - __frontend framework__: _Vue Storefront_ is a set of modular features, glued together using _interfaces_ and _factories_ and powered by [Nuxt.js](https://nuxtjs.org/). + - __platform-agnostic__ - we made it possible to work with any platform and service you already use, as long as it has an API like REST or GraphQL. Because of _low coupling and high cohesion_, it can work with multiple platforms at once, giving you the freedom to work with the technologies you need and love. + - __e-commerce__ - today's shops are much more than just products and carts. That's why we made it easy to integrate other types of services, such as helper service for ERP, versatile search features for PIM, portable checkout for 3rd party payment kiosk, and more. + - __PWA__ - it's the technology of the future, designed to give the best performance on any device, with native-like features to satisfy your customer's needs. + - __frontend framework__ - _Vue Storefront_ is a set of modular features, glued together using _interfaces_ and _factories_ and powered by [Nuxt.js](https://nuxtjs.org/). ## Problems Vue Storefront solves -The main purpose of any software is to solve problems and Vue Storefront is no different. We're doing our best to find common issues in the eCommerce space and find viable and scalable solutions to them. Below you can find just a few of the issues Vue Storefront solves. +The main purpose of any software is to solve problems and Vue Storefront is no different. We're doing our best to find common issues in the eCommerce space and find viable and scalable solutions. Below you can find just a few. ### Long time to market @@ -25,25 +26,20 @@ Headless eCommerce frontends are complex and developing them can take a lot of t **Solution** -With Vue Storefront you're getting a performant headless frontend connected to eCommerce, CMS, and other third-party services of your choice, along with hundreds of ready-to-use Vue Storefront and Nuxt.js modules for all common functionalities. Thanks to them, you will save hundreds (or even thousands) of working hours, so you can focus more on details and polishing while leaving the heavy lifting to us! +With Vue Storefront you're getting a performant frontend connected to headless e-commerce, CMS, and other third-party platforms of your choice, along with hundreds of ready-to-use Vue Storefront and Nuxt.js modules for all common functionalities. Thanks to them, you will save hundreds (or even thousands) of working hours, so you can focus on creating value for your product while leaving the heavy lifting to us! ### Slow, unresponsive online shop -No matter how great your products are, a slow and unresponsive shop will make your conversion significantly lower. - -::: tip -Some estimates say that up to 1% of users will leave your website for every 100ms of delay in page load time. -::: +By some estimates, up to 1% of users will leave your website for every 100ms of delay in page load time. No matter how great your products are, a slow and unresponsive shop will make your conversion significantly lower. **Solution** We solved these issues by: - -- using modern technologies for small bundle sizes; +- using modern technologies for small bundle sizes and performance; - using code splitting, lazy loading, and lazy hydration to load only what's needed at the moment; - caching the resources, so the already visited pages are loaded instantly; - preloading resources that might be needed in the future; -- hosting and executing at much as possible on the server, so the part served to the users is much lighter and faster compared to traditional SPA; +- hosting and executing as much as possible on the server, so the part served to the users is much lighter and faster compared to traditional SPA; ### Unwieldy architectural decisions @@ -59,7 +55,7 @@ It can be frustrating when the technology you choose turned out to not fit your **Solution** -From the very beginning, Vue Storefront was designed to be backend-agnostic. This means that all eCommerce backends are integrated on the frontend under common interfaces. Most technologies are completely different on the backend but are very similar from the frontend perspective, so we made abstractions that will make your migrations painless. +From the very beginning, Vue Storefront was designed to be backend-agnostic. This means that all eCommerce backends are integrated on the frontend under common interfaces and can be replaced without having to rewrite the frontend from scratch. Most technologies are completely different on the backend but are very similar from the frontend perspective, so we made abstractions that will make your migrations painless. ### Lack of platform-specific competencies @@ -71,13 +67,13 @@ With Vue Storefront you can! We have common interfaces for all integrations of t ### Lack of flexibility -Do you recall the frustration when it wasn't possible to implement your dream design or feature within your backend platform, or adding a single modal window took 2 days? +Do you recall the frustration when it wasn't possible to implement your dream design or feature within your backend platform, or adding a single modal window took few days? **Solution** -You will forget about these issues with Vue Storefront! For the best experience, we divided the system into the smallest and modular chunks. All parts are individual `npm` packages, so switching from one version to another should be as easy as any package installation. -Vue Storefront was built on the firm ground of _microservice_ architecture. Each of these packages is independent and optional, so you decide how much of the framework you want to utilize. Moreover **there are absolutely no limitations in terms of UI customization**. Your theme is just a regular Nuxt.js project which you can customize to any degree. +You will forget about these issues with Vue Storefront! For the best experience, we divided the system into the small and modular chunks. All parts are individual `npm` packages, so switching from one version to another should be as easy as any package installation. +Vue Storefront was built on the firm ground of _microservice_ architecture. Each of these packages is independent and optional, so you decide how much of the framework you want to utilize. Moreover **there are absolutely no limitations in terms of UI customization**. Your theme is just a regular Nuxt.js project, which you can customize to any degree. ## eCommerce Integrations From 7ddac2f397c7d7e5e42dea57f00dec2635b90c34 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Mon, 29 Mar 2021 13:24:21 +0200 Subject: [PATCH 08/14] Update Key Concepts page --- packages/core/docs/README.md | 2 +- packages/core/docs/general/key-concepts.md | 52 +++++++++++----------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/packages/core/docs/README.md b/packages/core/docs/README.md index 415aa75c9eb..4cf741201ac 100644 --- a/packages/core/docs/README.md +++ b/packages/core/docs/README.md @@ -72,7 +72,7 @@ Do you recall the frustration when it wasn't possible to implement your dream de **Solution** -You will forget about these issues with Vue Storefront! For the best experience, we divided the system into the small and modular chunks. All parts are individual `npm` packages, so switching from one version to another should be as easy as any package installation. +You will forget about these issues with Vue Storefront! For the best experience, we divided the system into small and modular chunks. All parts are individual `npm` packages, so switching from one version to another should be as easy as any package installation. Vue Storefront was built on the firm ground of _microservice_ architecture. Each of these packages is independent and optional, so you decide how much of the framework you want to utilize. Moreover **there are absolutely no limitations in terms of UI customization**. Your theme is just a regular Nuxt.js project, which you can customize to any degree. ## eCommerce Integrations diff --git a/packages/core/docs/general/key-concepts.md b/packages/core/docs/general/key-concepts.md index a1a0b4bf24e..5985d559fa3 100644 --- a/packages/core/docs/general/key-concepts.md +++ b/packages/core/docs/general/key-concepts.md @@ -1,53 +1,55 @@ # Key Concepts -This document will walk you through the most important concepts of Vue Storefront. Once you'll grab the ideas behind the software it should be fairly straightforward for you to use it in the right way. +This document will walk you through the most important concepts of Vue Storefront, help you understand the ideas behind it and how to use them in the right way. ## Configuration There are two types of configuration in Vue Storefront: -- `nuxt.config.js` which controls your Nuxt App and frontend-related features of Vue Storefront -- `middleware.config.js` where you add, configure and extend your integrations +- `nuxt.config.js` to control your Nuxt App and frontend-related features of Vue Storefront; +- `middleware.config.js` to add, configure and extend your integrations; -You can read more about configuration [here](/guide/configuration.html) +You can read more about it on the [Configuration](/guide/configuration.html) page. ## Composables ::: tip Composables? Is this a French meal? -Composable is a function that uses [Vue.js Composition API](https://v3.vuejs.org/guide/composition-api-introduction.html) under the hood. It's commonly named with a `use` prefix (eg. `useProduct`, `useCart`). This convention comes from the React community where we can find a very similar pattern - [Hooks](https://reactjs.org/docs/hooks-intro.html), which inspired Vue.js core team to introduce the Composition API. If you are not familiar with this concept, we strongly recommend checking the basics of it [here](https://v3.vuejs.org/guide/composition-api-introduction.html) +Composable is a function that uses [Vue.js Composition API](https://v3.vuejs.org/guide/composition-api-introduction.html) under the hood. It's commonly named with a `use` prefix (eg. `useProduct`, `useCart`). This convention comes from the React community which has a similar pattern called [Hooks](https://reactjs.org/docs/hooks-intro.html), which inspired Vue.js core team to introduce the Composition API. If you are not familiar with this concept, we strongly recommend checking the basics in the official [Vue.js documentation](https://v3.vuejs.org/guide/composition-api-introduction.html). ::: **Composables are the main public API of Vue Storefront** and in many cases the only API except configuration you'll work with. -You can treat each composable as an independent micro-application. They manage their own state, handle SSR and in most cases don't interact with each other (`useUser` and `useCart` are exceptions). +You can treat each composable as an independent micro-application. They manage their state, handle SSR and in most cases don't interact with each other (`useUser` and `useCart` are the exceptions). ```js const { search, product, loading, error } = useProduct(); ``` -You can read more about Vue Storefront composables [here](/guide/composables.html) + +You can read more about them on the [Composables](/guide/composables.html) page. ## Routing -Routes are injected via `@vue-storefront/nuxt-theme` module. Use [extendRoutes](https://nuxtjs.org/guides/configuration-glossary/configuration-router#extendroutes) from `nuxt.config.js` to modify them. +Some routes are injected via `@vue-storefront/nuxt-theme` module. You can use [extendRoutes](https://nuxtjs.org/guides/configuration-glossary/configuration-router#extendroutes) in `nuxt.config.js` to modify them or add your own. + +Additionally, Nuxt.js automatically registers components created in the `pages` folder as new routes. You can read more about this on the [File System Routing](https://nuxtjs.org/docs/2.x/features/file-system-routing/) page. ## Internationalization -By default, we're using `nuxt-i18n` module for internationalization. +By default, Vue Storefront uses `nuxt-i18n` module for internationalization. -You can read more about i18n in Vue Storefront [here](/advanced/internationalization). +You can read more about it on the [Internationalization](/advanced/internationalization) page. ## Middleware -Vue Storefront uses a middleware that is a bridge between front-end and backends (eCommerce or 3rd party services). The front-end always calls middleware that is redirecting requests to correlated destinations. It allows developers to implement custom logic to inject into the lifecycle of the requests or even create custom API endpoints if needed. +Vue Storefront uses middleware as a bridge between the frontend and the backends (eCommerce or 3rd party services). The frontend always calls middleware that forwards requests to corresponding destinations. It allows developers to implement custom logic, inject into the lifecycle of the requests or even create custom API endpoints if needed. -Middleware by default is a part of your Nuxt application but it can be detached and server as a separate node application. +Middleware by default is a part of your Nuxt application, but it can be detached and used as a separate node application. You can read more about Vue Storefront Middleware on the [Server Middleware](/advanced/server-middleware) page. - ## Integrations and extendibility -All the 3rd party integrations (eCommerce, CMS, Search etc) can be added and configured through `middleware.config.js`. +All 3rd party integrations (eCommerce, CMS, Search, etc.) can be added and configured in `middleware.config.js`: ```js //middleware.config.js @@ -58,11 +60,11 @@ module.exports = { } ``` -Each integration has `extensions` field. You can use extensions to: -- Override existing API methods of a certain integration. -- Add new API methods. -- Change method parameters before each/specific it's called. -- Do something after each/specific method is called. +Each integration has an `extensions` field. You can use extensions to: +- override existing API methods of a certain integration; +- add new API methods; +- change method parameters before they are called; +- react to a method being called; ```js { @@ -84,15 +86,15 @@ Each integration has `extensions` field. You can use extensions to: } ``` -Sometime you just need to call specific API client method without using a composable. You have access to all API methods of your registered integrations through `useVSFContext` composable. +Sometimes you just need to call a specific API client method without using a composable. Luckily you have access to all API methods of the registered integrations through `useVSFContext` composable. -The composable returns a list of tags representing your integrations (it's usually either a name of the integration like `$storyblok` or acronym for longer names like `$ct` for commercetools) +The composable returns a list of tags representing your integrations (it's usually either a name of the integration like `$storyblok` or an acronym for longer names like `$ct` for commercetools). ```js const { $ct } = useVsfContext() ``` -You have access to all methods through `api` field of each integration +You have access to all methods through the `api` field of each integration ```js const products = $ct.api.getProducts(params) @@ -100,9 +102,9 @@ const products = $ct.api.getProducts(params) ## Backend-agnostic -Whatever backend services you're using, they are handled more or less the same way on the frontend. No matter what eCommerce platform, CMS, or Search you're using you will always use the same getters and composables so it's easy to work with VSF projects on different tech stacks or try new services without making heavy investments. +Whatever backend services you're using, they are handled more or less the same way on the frontend. No matter what eCommerce platform, CMS, or search platform you're using, you will always use the same getters and composables. This makes it easy to work with VSF projects on different tech stacks or try new services without making heavy investments. -There are some things that are different for each platform though. Main data object of each composable (like `products` in `useProduct`) is **always** a plain response from your platform. If you use getters on this object they will always return agnostic data format +Some things are different for each platform though. The main data object of each composable (like `products` in `useProduct`) is **always** a plain response from your platform. If you use getters on this object they will always return agnostic data format ```js const { search, products } = useProduct() @@ -112,7 +114,7 @@ console.log(products) // type: CommerceToolsProduct[] console.log(productGetters.getAttributes(products.value)) // type: AgnosticProductAttribute[] ``` -Also parameters of functions returned by composables are different for each platform +Parameters of functions returned by composables are different for each platform ```js const { search, products } = useProduct() From a6bb65c54f8d8d3983c7ecf77a1bcd47f8c08bf8 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Mon, 29 Mar 2021 13:29:26 +0200 Subject: [PATCH 09/14] Update Enterprise page --- packages/core/docs/general/enterprise.md | 28 ++++++++++-------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/packages/core/docs/general/enterprise.md b/packages/core/docs/general/enterprise.md index 22cda769982..7c27912b45e 100644 --- a/packages/core/docs/general/enterprise.md +++ b/packages/core/docs/general/enterprise.md @@ -1,25 +1,24 @@ # What is Vue Storefront Enterprise -> Vue Storefront Enterprise is currently available only for Commercetools +> Vue Storefront Enterprise is currently available only for commercetools -Vue Storefront Enterprise is a commercial offering from Vue Storefront core team built on top of the Open Source product. Our goal is to give you all the tools that you could need to launch your Vue Storefront shop and provide you with ready-to-use integrations that will reduce the development time and cost of your project. +Vue Storefront Enterprise is a commercial offering from the Vue Storefront core team built on top of the Open Source product. Its goal is to give you all the tools you need to launch your shop and provide you with ready-to-use integrations that will reduce the development time and cost of your project. -## What are the differences between Open Source and Enterprise version? +## What are the differences between Open Source and Enterprise versions? -In Enterprise Edition you're getting everything that is in Open Source plus: -- Vue Storefront Cloud -- Additional integrations with third-party services. -- Extended integration with eCommerce platform with advanced features. +In Enterprise Edition you're getting everything that's in our Open Source. On top of that we also provide: -Everything with badge in the docs is only available in Vue Storefront Enterprise edition. +- access to [Vue Storefront Cloud](https://www.vuestorefront.io/cloud); +- additional integrations with third-party services; +- extended integration with eCommerce platform with advanced features. -You can learn more about our commercial offering [here](https://www.vuestorefront.io/enterprise). +Everything with badge in the documentation is only available for our Enterprise customers. -# How to use Vue Storefront Enterprise +You can learn more about our commercial offering on the [Enterprise](https://www.vuestorefront.io/enterprise) page. -Enterprise packages within `@vsf-enterprise` scope are part of our private registry. +## How to use Vue Storefront Enterprise -To make use of it create a `.npmrc` file in the root of your project with the following content: +Enterprise packages within `@vsf-enterprise` scope are part of our private registry. To make use of them, create a `.npmrc` file in the root of your project with the following content: ``` @vsf-enterprise:registry=https://registrynpm.storefrontcloud.io @@ -30,8 +29,3 @@ Then log into your account with your Vue Storefront Enterprise credentials: ```bash npm adduser --registry https://registrynpm.storefrontcloud.io ``` - -From there you will use Vue Storefront registry for all packages within `@vsf-enterprise` scope. Other ones will be proxied to NPM. - - - From bcb4b34a9f9998ff61eaab63c7be94a1325fabd3 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Mon, 29 Mar 2021 16:05:20 +0200 Subject: [PATCH 10/14] Update Key Concepts and Theme --- packages/core/docs/general/key-concepts.md | 19 +++- packages/core/docs/guide/theme.md | 100 +++++++-------------- 2 files changed, 47 insertions(+), 72 deletions(-) diff --git a/packages/core/docs/general/key-concepts.md b/packages/core/docs/general/key-concepts.md index 5985d559fa3..e75f613d9f8 100644 --- a/packages/core/docs/general/key-concepts.md +++ b/packages/core/docs/general/key-concepts.md @@ -29,9 +29,22 @@ You can read more about them on the [Composables](/guide/composables.html) page. ## Routing -Some routes are injected via `@vue-storefront/nuxt-theme` module. You can use [extendRoutes](https://nuxtjs.org/guides/configuration-glossary/configuration-router#extendroutes) in `nuxt.config.js` to modify them or add your own. +Out of the box, some routes are injected via `@vue-storefront/nuxt-theme` module: -Additionally, Nuxt.js automatically registers components created in the `pages` folder as new routes. You can read more about this on the [File System Routing](https://nuxtjs.org/docs/2.x/features/file-system-routing/) page. +- Home Page (`/`); +- Category Page (`/c/:slug_1/:slug_2?/:slug_3?/:slug_4?/:slug_5?`); +- Product Page (`/p/:id/:slug/`); +- User Profile Page (`/my-account/:pageName?`); +- Checkout (`/checkout`): + - Shipping (`/checkout/shipping`); + - Billing (`/checkout/billing`); + - Payment (`/checkout/payment`); + - Thank You page (`/checkout/thank-you`); +- Custom 404 page; + +Some [integrations](/integrations) may register additional routes. For example, CMS integrations often override Home Page and add custom, dynamic pages. + +To override existing routes or adding your own, use [extendRoutes](https://nuxtjs.org/guides/configuration-glossary/configuration-router#extendroutes) in `nuxt.config.js`. Additionally, Nuxt.js automatically registers components created in the `pages` folder as new routes. You can read more about this on the [File System Routing](https://nuxtjs.org/docs/2.x/features/file-system-routing/) page. ## Internationalization @@ -39,7 +52,7 @@ By default, Vue Storefront uses `nuxt-i18n` module for internationalization. You can read more about it on the [Internationalization](/advanced/internationalization) page. -## Middleware +## Server Middleware Vue Storefront uses middleware as a bridge between the frontend and the backends (eCommerce or 3rd party services). The frontend always calls middleware that forwards requests to corresponding destinations. It allows developers to implement custom logic, inject into the lifecycle of the requests or even create custom API endpoints if needed. diff --git a/packages/core/docs/guide/theme.md b/packages/core/docs/guide/theme.md index fd411b68ec1..47237a1c947 100644 --- a/packages/core/docs/guide/theme.md +++ b/packages/core/docs/guide/theme.md @@ -1,75 +1,35 @@ # Theme -If you [use our CLI to set up your project](/general/installation) you will end up with a fully functional eCommerce theme connected to your eCommerce backend and a bunch of other services based on [Nuxt.js](https://nuxtjs.org/) - -## High-level overview - -Your theme out of the box will have following features: - -**Pages** - -- Home Page -- Product Listing Page -- Product Details Page -- Mini Cart -- Mini Wishlist -- User Authentication -- User Profile -- Checkout -- Custom 404 page - -**Integrations** +## Directory structure -- eCommerce full scope / eCommerce basic scope -- CMS integration - - Home Page - - Custom CMS Page - - Header - - Footer -- Payment integration +If you followed our [Installation guide](/general/installation), you should have a fully functional e-commerce application. As mentioned in previous documents, Vue Storefront is based on Nuxt.js, so the structure of both applications is similar. Most directories come from Nuxt.js and you can read more about them on their [Directory Structure](https://nuxtjs.org/docs/2.x/get-started/directory-structure) page. -**Other** +* [.nuxt](https://nuxtjs.org/docs/2.x/directory-structure/nuxt); +* [components](https://nuxtjs.org/docs/2.x/directory-structure/components); +* `composables` - contains custom composables that override your integration or are not part of the Vue Storefront core. It may include composables specific to your theme; +* `helpers` - contains helper functions. This is a good place to store methods used in the multiples places of the application; +* `lang` - contains translations for your application. Available locales are configured in the `nuxt.config.js` file; +* [layouts](https://nuxtjs.org/docs/2.x/directory-structure/layouts); +* [middleware](https://nuxtjs.org/docs/2.x/directory-structure/middleware); +* [pages](https://nuxtjs.org/docs/2.x/directory-structure/pages); +* [static](https://nuxtjs.org/docs/2.x/directory-structure/static); +* `middleware.config.js` - configuration file for the [Server Middleware](/advanced/server-middleware); +* [nuxt.config.js](https://nuxtjs.org/docs/2.x/directory-structure/nuxt-config); -- Progressive Web App features -- internationalization +## Storefront UI -A full list of features (for Enterprise version) can be found [here](/enterprise/feature-list.html). + -## Directory structure +Almost every component in our default theme contains other components whose names start with `Sf`. These come from [Storefront UI](http://storefrontui.io/) - a design system and library of Vue.js components dedicated to e-commerce, maintained by the Vue Storefront core team. The library is fully customizable, so it can be used in different contexts and with different designs. -If you're familiar with Nuxt.js, you will quickly notice that the directory structure is almost identical to the standard Nuxt.js project. Since you can read about the Nuxt project folder structure in [Nuxt docs](https://nuxtjs.org/docs/2.x/get-started/directory-structure), we will cover mostly the directories specific to Vue Storefront. - -```js -. -├─ components/ -├─ composables/ // custom, theme-related composables -├─ lang/ // i18n translation keys -├─ layouts/ -├─ middleware/ -│ └─ checkout.js // prevents users from entering checkout steps if certain information is missing -├─ pages/ -├─ static/ -├─ middleware.config.js // integrations configuration -└─ nuxt.config.js -``` +With Storefront UI you're getting [Vue.js components](<(https://storybook.storefrontui.io/)>), [Figma designs](figma.com/file/N0Ct95cSAoODNv7zYS01ng/Storefront-UI-%7C-Design-System?node-id=0%3A1) and [Storybook](https://storybook.storefrontui.io/) to test them. The library works great for the multi-tenancy model as a shared UI library that can be customized differently for each tenant. -## Storefront UI +To learn more about Storefront UI please check its [Documentation](https://docs.storefrontui.io/). ::: tip Want to use another UI library? No problem! -If you don't want to use Storefront UI feel free to remove it from your project - it's just a UI layer and the project can work with any other UI library or a custom code. +If you don't want to use Storefront UI feel free to remove it from your project. It's just a UI layer and the project can work with any other UI library or a custom code. ::: -Our default theme is based on [Storefront UI](http://storefrontui.io/) - a design system and library of Vue.js components dedicated to eCommerce maintained by Vue Storefront core team. The library is fully customizable on multiple levels to make sure that it can be used in different contexts and with different designs. - - - -With Storefront UI you're getting both [Vue.js components](<(https://storybook.storefrontui.io/)>) and [Figma designs](figma.com/file/N0Ct95cSAoODNv7zYS01ng/Storefront-UI-%7C-Design-System?node-id=0%3A1) that match them so it's straightforward for your design team to customize them. The library works great for the multi-tenancy model as a shared UI library that can be customized differently for each tenant. - -To learn more about Storefront UI please check: - -- [Storybook](https://storybook.storefrontui.io/) where you can find a list of all it's available components -- [Documentation](https://docs.storefrontui.io/) where you can find the information about customization possibilities and setup - ## Preinstalled modules and libraries Below you can find a list of the most important Nuxt Modules and libraries that are preinstalled with the default theme: @@ -78,16 +38,18 @@ Below you can find a list of the most important Nuxt Modules and libraries that ### Nuxt Modules -- `@nuxtjs/pwa` -- `nuxt-i18n` -- `@vue-storefront/nuxt` - - `@nuxtjs/composition-api` - - `@nuxt/typescript-build` - - `@nuxtjs/style-resources` - - `nuxt-purgecss` -- `@vue-storefront/nuxt-theme` +- `@nuxtjs/pwa`; +- `nuxt-i18n`; +- `@vue-storefront/nuxt`; + - `@nuxtjs/composition-api`; + - `@nuxt/typescript-build`; + - `@nuxtjs/style-resources`; + - `nuxt-purgecss`; +- `@vue-storefront/nuxt-theme`; + - `vue-lazy-hydration`; ### Libraries -- [`@storefront-ui/vue`](https://storefrontui.io) -- [`wee-validate`](https://vee-validate.logaretm.com/v3) +- [`@storefront-ui/vue`](https://storefrontui.io); +- [`wee-validate`](https://vee-validate.logaretm.com/v3); +- [`lodash`](https://lodash.com/); From d3dc7b418634f691a9bbb6b634bd6ace24b6a111 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Tue, 30 Mar 2021 10:18:21 +0200 Subject: [PATCH 11/14] Update --- packages/core/docs/README.md | 2 +- packages/core/docs/core/api-client.md | 20 -------------------- packages/core/docs/general/key-concepts.md | 2 +- packages/core/docs/guide/theme.md | 6 ++++++ 4 files changed, 8 insertions(+), 22 deletions(-) delete mode 100644 packages/core/docs/core/api-client.md diff --git a/packages/core/docs/README.md b/packages/core/docs/README.md index 4cf741201ac..4b6e80b4fee 100644 --- a/packages/core/docs/README.md +++ b/packages/core/docs/README.md @@ -94,4 +94,4 @@ The speed and flexibility of Vue Storefront wouldn't be possible without the gre If you're already convinced to use Vue Storefront, check the [Installation guide](./general/installation.html). -If you want to learn more, check the [Key Concepts](./general/key-concepts.html) behind Vue Storefront. +If you want to learn more, check the [Key concepts](./general/key-concepts.html) behind Vue Storefront. diff --git a/packages/core/docs/core/api-client.md b/packages/core/docs/core/api-client.md deleted file mode 100644 index e36f2826939..00000000000 --- a/packages/core/docs/core/api-client.md +++ /dev/null @@ -1,20 +0,0 @@ -# API Client - -[[toc]] - ----- -::: tip Installation -If you want to learn how to install the API Client check our [Installation guide](/general/installation.html) -::: - -API Client is a data layer of your eCommerce integration. It provides a friendly abstraction layer over network calls to your eCommerce platform. - -It expresses each network request as a declarative method like `getProduct` or `getCategory`. By having this additional layer we can hide implementation details of **how** we get the data which gives you freedom of introducing major changes in this layer without influencing other parts of the app. - -API Client by itself is a Vanilla JavaScript application and it doesn't require any frontend framework to run. It's usually not used directly in the UI and is responsible only for providing data to Composition Functions. - -## Configuration -::: danger storing credentials - **Never** pass fragile data like API Client secrets as plain strings. -::: - diff --git a/packages/core/docs/general/key-concepts.md b/packages/core/docs/general/key-concepts.md index e75f613d9f8..a6d9b057db0 100644 --- a/packages/core/docs/general/key-concepts.md +++ b/packages/core/docs/general/key-concepts.md @@ -1,4 +1,4 @@ -# Key Concepts +# Key concepts This document will walk you through the most important concepts of Vue Storefront, help you understand the ideas behind it and how to use them in the right way. diff --git a/packages/core/docs/guide/theme.md b/packages/core/docs/guide/theme.md index 47237a1c947..c471ee17cbc 100644 --- a/packages/core/docs/guide/theme.md +++ b/packages/core/docs/guide/theme.md @@ -30,6 +30,12 @@ To learn more about Storefront UI please check its [Documentation](https://docs. If you don't want to use Storefront UI feel free to remove it from your project. It's just a UI layer and the project can work with any other UI library or a custom code. ::: +## Custoziming the theme + +TODO: +* Vue devtools +* styles (and preventing duplicates) + ## Preinstalled modules and libraries Below you can find a list of the most important Nuxt Modules and libraries that are preinstalled with the default theme: From ab3d88a594b411b2e1e3d7d0be59a66fa77fb28d Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Tue, 30 Mar 2021 11:30:02 +0200 Subject: [PATCH 12/14] Update "What is Vue Storefront?" section --- packages/core/docs/README.md | 4 +- yarn.lock | 121 +---------------------------------- 2 files changed, 5 insertions(+), 120 deletions(-) diff --git a/packages/core/docs/README.md b/packages/core/docs/README.md index 4b6e80b4fee..124047b3588 100644 --- a/packages/core/docs/README.md +++ b/packages/core/docs/README.md @@ -4,14 +4,14 @@ ## What is Vue Storefront? -_Vue Storefront_ is a ___platform-agnostic e-commerce PWA frontend framework___ that can work with __any__ backend that you already use, be it e-commerce, CMS, ERP, PIM, or anything else. +_Vue Storefront_ is a ___platform-agnostic e-commerce PWA frontend framework___ that can work with any e-commerce backend API. Additionally, thanks to _low coupling and high cohesion_, it can connect to other services, giving you the freedom to work with the technologies you know and love, be it CMS, ERP, PIM, or anything else.
That's a mouthful, so let's break it down: - - __platform-agnostic__ - we made it possible to work with any platform and service you already use, as long as it has an API like REST or GraphQL. Because of _low coupling and high cohesion_, it can work with multiple platforms at once, giving you the freedom to work with the technologies you need and love. + - __platform-agnostic__ - we made it possible to work with any platform and service you already use, as long as it has an API like REST or GraphQL. - __e-commerce__ - today's shops are much more than just products and carts. That's why we made it easy to integrate other types of services, such as helper service for ERP, versatile search features for PIM, portable checkout for 3rd party payment kiosk, and more. - __PWA__ - it's the technology of the future, designed to give the best performance on any device, with native-like features to satisfy your customer's needs. - __frontend framework__ - _Vue Storefront_ is a set of modular features, glued together using _interfaces_ and _factories_ and powered by [Nuxt.js](https://nuxtjs.org/). diff --git a/yarn.lock b/yarn.lock index cbf267efe4d..626136694ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,7 +26,7 @@ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: - "@babel/highlight" "^7.12.13" + "@babel/highlight" "^7.10.4" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": version "7.12.13" @@ -270,7 +270,7 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": +"@babel/highlight@^7.12.13": version "7.13.10" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== @@ -2485,11 +2485,6 @@ resolved "https://registry.yarnpkg.com/@storefront-ui/shared/-/shared-0.10.2.tgz#144d3a7d5508563ad97c1882fbd291abb0166349" integrity sha512-EWwct/pMYcXhMKGEE2h7blw0XIvcVokhzdzfl5VROSajtflJkJ11hfaOxFWkB5Zgd6IdS9iwR2ayzVjunVRuEA== -"@storefront-ui/shared@0.9.2": - version "0.9.2" - resolved "https://registry.yarnpkg.com/@storefront-ui/shared/-/shared-0.9.2.tgz#b50d6c8baec1a479054fd4a14b786f2809f0598e" - integrity sha512-2JX76IgwTrP/7Ksa5mF9+r1vlaZojKiqrPh9HCDo2yznnseqNOzKVgWn9vIRKxWqofMzmZeleNdriKfoulfFoQ== - "@storefront-ui/vue@0.10.3", "@storefront-ui/vue@^0.10.3": version "0.10.3" resolved "https://registry.yarnpkg.com/@storefront-ui/vue/-/vue-0.10.3.tgz#949b69a0888f85aa0f17fcdaf396972e5c210016" @@ -2509,25 +2504,6 @@ vue-fragment "^1.5.1" vue2-leaflet "^2.5.2" -"@storefront-ui/vue@0.9.2": - version "0.9.2" - resolved "https://registry.yarnpkg.com/@storefront-ui/vue/-/vue-0.9.2.tgz#56593b1cbfe62a5e03c965b5ccc2320edabbf504" - integrity sha512-yHaXY14fswtie4ULw64hbI8HGQ8wGOCdaGvZ1nwkcai0JJtCqLw7VWzCy0kPobZPXzc1fCFTt2KEUBbqPI342A== - dependencies: - "@glidejs/glide" "^3.3.0" - "@storefront-ui/shared" "0.9.2" - body-scroll-lock "^3.0.1" - core-js "^3.6.5" - hammerjs "^2.0.8" - leaflet "^1.5.1" - lozad "^1.14.0" - node-sass "^4.13.1" - sass-loader "^8.0.2" - simplebar-vue "^1.4.0" - vue-drag-drop "^1.1.4" - vue-fragment "^1.5.1" - vue2-leaflet "^2.5.2" - "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -3015,92 +2991,6 @@ resolved "https://registry.yarnpkg.com/@ungap/global-this/-/global-this-0.4.4.tgz#8a1b2cfcd3e26e079a847daba879308c924dd695" integrity sha512-mHkm6FvepJECMNthFuIgpAEFmPOk71UyXuIxYfjytvFTnSDBIz7jmViO+LfHI/AjrazWije0PnSP3+/NlwzqtA== -"@vue-storefront/commercetools-api@^1.1.7": - version "1.1.7" - resolved "https://registry.yarnpkg.com/@vue-storefront/commercetools-api/-/commercetools-api-1.1.7.tgz#deeb78597e65b7da299d953408a3d725ce95967a" - integrity sha512-0Idke1vVvNrLZ+UKjMXgQgnatH9QwX7p7vaGeuKVsBNu31q+WyU5y+NXI1VGol735i2uWeBJNfqrfPAcf08+lQ== - dependencies: - "@apollo/client" "^3.2.9" - "@commercetools/sdk-auth" "^3.0.1" - "@vue-storefront/core" "^2.2.3" - apollo-cache-inmemory "^1.6.6" - apollo-client "^2.6.10" - apollo-link "^1.2.14" - apollo-link-context "^1.0.20" - apollo-link-error "^1.1.13" - apollo-link-http "^1.5.17" - apollo-link-retry "^2.2.16" - graphql "^14.5.8" - graphql-tag "^2.10.1" - isomorphic-fetch "^2.2.1" - -"@vue-storefront/commercetools-theme@./packages/commercetools/theme": - version "1.2.0-rc.2" - dependencies: - "@nuxtjs/pwa" "^3.2.2" - "@storefront-ui/vue" "0.10.3" - "@vue-storefront/commercetools" "^1.2.0-rc.2" - "@vue-storefront/middleware" "^2.3.0-rc.2" - "@vue-storefront/nuxt" "^2.3.0-rc.2" - "@vue-storefront/nuxt-theme" "^2.3.0-rc.2" - cookie-universal-nuxt "^2.1.3" - core-js "^2.6.5" - nuxt "^2.13.3" - nuxt-i18n "^6.5.0" - vee-validate "^3.2.3" - vue-scrollto "^2.17.1" - -"@vue-storefront/commercetools@^1.1.1": - version "1.1.7" - resolved "https://registry.yarnpkg.com/@vue-storefront/commercetools/-/commercetools-1.1.7.tgz#6da3a6c0f017843c0e0ecdbb7b2a1a6e556155ce" - integrity sha512-skw2iVG6xtdYedeZ9GbSC7Y0w8pfE9n/YHVo3CM3k4QDx3y3OBeixf3ZMgxwmc2gYm8tZMNvWhNoB2QQ+vkozg== - dependencies: - "@vue-storefront/commercetools-api" "^1.1.7" - "@vue-storefront/core" "^2.2.3" - js-cookie "^2.2.1" - vue "^2.6.x" - -"@vue-storefront/core@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@vue-storefront/core/-/core-2.2.3.tgz#08b215fd3101d56ae3377d28ad80c92cfc9f4b8e" - integrity sha512-EQnVcNJb+LpSV03gLkNzO6Pr5qjDmeIEo0Br4LdXBGMBj7a0kov2X7zrgf59WoVYl/bnYhQeCzi+Ikuuq87Bjg== - dependencies: - "@vue/composition-api" "1.0.0-beta.21" - express "^4.17.1" - lodash-es "^4.17.15" - vue "^2.6.11" - -"@vue-storefront/nuxt-theme@./packages/core/nuxt-theme-module": - version "2.3.0-rc.2" - dependencies: - ejs "^3.0.2" - lodash.debounce "^4.0.8" - lodash.merge "^4.6.2" - vue-lazy-hydration "^2.0.0-beta.4" - -"@vue-storefront/nuxt-theme@^2.2.1": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@vue-storefront/nuxt-theme/-/nuxt-theme-2.2.3.tgz#7a4f5555b051296bf58fd78c5b95501ffb98beaf" - integrity sha512-1zR8L1PvO0bkGQJDe3Nfo+yz20MrYVS4g8B6I74vboFRtsKbKw7LkStmVWSs0dpx9mSRlVmBSmjPfFMMJcPShQ== - dependencies: - lodash.merge "^4.6.2" - vue-lazy-hydration "^2.0.0-beta.4" - -"@vue-storefront/nuxt@^2.2.1": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@vue-storefront/nuxt/-/nuxt-2.2.3.tgz#f1420204b293fad16a41bf4a6001c339e906e356" - integrity sha512-1JmHULb+cDhHpLHN6iKZKyAs9+sFhzekluHaBAFbCznSkt43RA69apRnNt8vBQsEYwqbXWcRdi9XgrLyDlKtpQ== - dependencies: - "@nuxt/typescript-build" "^2.0.0" - "@nuxtjs/composition-api" "0.17.0" - "@nuxtjs/style-resources" "^1.0.0" - "@vue/composition-api" "1.0.0-beta.21" - chalk "^2.4.2" - chokidar "^3.3.1" - consola "^2.10.1" - lodash "^4.17.15" - nuxt-purgecss "^1.0.0" - "@vue/babel-helper-vue-jsx-merge-props@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81" @@ -6830,7 +6720,7 @@ err-code@^1.0.0: resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= -errno@^0.1.3: +errno@^0.1.3, errno@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== @@ -10852,11 +10742,6 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lozad@^1.14.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/lozad/-/lozad-1.16.0.tgz#86ce732c64c69926ccdebb81c8c90bb3735948b4" - integrity sha512-JBr9WjvEFeKoyim3svo/gsQPTkgG/mOHJmDctZ/+U9H3ymUuvEkqpn8bdQMFsvTMcyRJrdJkLv0bXqGm0sP72w== - lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" From 89f79b4f930c60989fca8f7365eff3780dfba6b6 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Tue, 30 Mar 2021 15:03:01 +0200 Subject: [PATCH 13/14] Update Theme document --- packages/core/docs/guide/theme.md | 110 ++++++++++++++++-- .../core/docs/images/theme/storefront-ui.jpg | Bin 0 -> 62906 bytes .../core/docs/images/theme/vue-devtools.jpg | Bin 0 -> 60885 bytes .../theme/layouts/account.vue | 2 + .../theme/layouts/default.vue | 2 + .../nuxt-theme-module/theme/layouts/error.vue | 3 + 6 files changed, 106 insertions(+), 11 deletions(-) create mode 100644 packages/core/docs/images/theme/storefront-ui.jpg create mode 100644 packages/core/docs/images/theme/vue-devtools.jpg diff --git a/packages/core/docs/guide/theme.md b/packages/core/docs/guide/theme.md index c471ee17cbc..2bb1d03caf5 100644 --- a/packages/core/docs/guide/theme.md +++ b/packages/core/docs/guide/theme.md @@ -1,5 +1,7 @@ # Theme +[[toc]] + ## Directory structure If you followed our [Installation guide](/general/installation), you should have a fully functional e-commerce application. As mentioned in previous documents, Vue Storefront is based on Nuxt.js, so the structure of both applications is similar. Most directories come from Nuxt.js and you can read more about them on their [Directory Structure](https://nuxtjs.org/docs/2.x/get-started/directory-structure) page. @@ -18,31 +20,117 @@ If you followed our [Installation guide](/general/installation), you should have ## Storefront UI - +
+ +
-Almost every component in our default theme contains other components whose names start with `Sf`. These come from [Storefront UI](http://storefrontui.io/) - a design system and library of Vue.js components dedicated to e-commerce, maintained by the Vue Storefront core team. The library is fully customizable, so it can be used in different contexts and with different designs. +Almost every component in our default theme uses components whose names start with `Sf`. These come from [Storefront UI](http://storefrontui.io/) - a design system and library of Vue.js components dedicated to e-commerce, maintained by the Vue Storefront core team. It comes with [Figma designs](https://figma.com/file/N0Ct95cSAoODNv7zYS01ng/Storefront-UI-%7C-Design-System?node-id=0%3A1) and [Storybook](https://storybook.storefrontui.io/) to help you customize and test the components. -With Storefront UI you're getting [Vue.js components](<(https://storybook.storefrontui.io/)>), [Figma designs](figma.com/file/N0Ct95cSAoODNv7zYS01ng/Storefront-UI-%7C-Design-System?node-id=0%3A1) and [Storybook](https://storybook.storefrontui.io/) to test them. The library works great for the multi-tenancy model as a shared UI library that can be customized differently for each tenant. +The library is fully customizable, so it can be used in different contexts and with different designs. +It's great for the multi-tenancy model as a shared UI library that can be customized differently for each tenant. To learn more about Storefront UI please check its [Documentation](https://docs.storefrontui.io/). ::: tip Want to use another UI library? No problem! -If you don't want to use Storefront UI feel free to remove it from your project. It's just a UI layer and the project can work with any other UI library or a custom code. +If you don't want to use Storefront UI, feel free to remove it from your project. It's just a UI layer and the project can work with any other UI library or a custom code. ::: -## Custoziming the theme +## Customizing the theme + +### Learn Nuxt.js + +Before starting to customize the base theme, we highly recommend getting familiar with [Nuxt.js](https://nuxtjs.org/), because the majority of UI functionalities in Vue Storefront are handled by it. This will help you understand the mechanisms behind the framework and how to efficiently extend it. + +### Install Vue.js Devtools + +We also recommend installing [Vue.js Devtools](https://github.com/vuejs/vue-devtools#installation) in your browser. It's an excellent tool for viewing component structure and their current state, inspecting events and routes, and much more. + +
+ +
+ +### Changing existing pages, components, and layouts + +To update existing components (this also includes pages and layouts, which are regular Vue.js components as well) you need to first identify which components need updating. Vue.js Devtools will help us in that. Open the tool and click on the `Select` button above the component tree, then click on the DOM element you want to update and one of the components in the tree should get highlighted. You can look for the component with the same name in the `layout`, `pages`, or `components` directories and update it to your needs. However, there are few exceptions to this rule. + +#### `Sf` components + +If the name of the component starts with `Sf` (indicating that it comes from Storefront UI), you should refer to the direct **parent** component. The behavior and look of such components can be changed by passing different properties and using slots. Refer to the StorefrontUI documentation linked above for more information. + +#### `LazyHydrate` and `Anonymous Component` components + +These two components come from the `vue-lazy-hydration` library and are wrappers around other components. In Vue Storefront they are used to improve the performance, by deferring the hydration process (when components become interactive) and don't affect the look of other components. + +If you encounter one of these components, you should refer to the direct **child** component. + +### Adding new page + +To add a new page, create a new component in the `pages` folder and name it the same as your route using `PascalCase`. + +As an example, let's create the `AboutUs.vue` component. This by itself creates a new route named `/aboutus` thanks to [File System Routing](https://nuxtjs.org/docs/2.x/features/file-system-routing/) in Nuxt.js. In some cases this is enough, however, you can use [extendRoutes](https://nuxtjs.org/guides/configuration-glossary/configuration-router#extendroutes) in `nuxt.config.js` if you want more control over your routes. To follow the convention of using `kebab-case` in URLs, this is what we are going to do. + +Let's add following configuration to `nuxt.config.js` to create new route `/about-us`: -TODO: -* Vue devtools -* styles (and preventing duplicates) +```javascript +// nuxt.config.js + +export default { + router: { + extendRoutes(routes, resolve) { + routes.push({ + name: 'AboutUs', + path: '/about-us', + component: resolve(__dirname, 'pages/AboutUs.vue') + }); + } + } +}; +``` + +For more information about routes we provide out of the box, refer to [Routing](../general/key-concepts.html#routing) section. + +## Updating styles + +There are few ways of updating styles, so we will describe the most optimal ways for the most common cases. + +### Adding global styleheet + +To add global styles that are applied to all pages, use the [css property](https://nuxtjs.org/docs/2.x/configuration-glossary/configuration-css/) in `nuxt.config.js`. + +### Adding stylesheet to specific layout, page, or component + +To add a stylesheet to a specific component, use `@import`, regardless if you are using CSS, SCSS, or LESS. + +```vue + +``` + +### Using variables, mixins, and function in components + +Normally to access style variables, mixins, and functions, we have to import them in every component separately. Thank you [@nuxtjs/style-resources](https://github.com/nuxt-community/style-resources-module#readme) module, we can register them in `nuxt.config.js` and access them without extra `@import` statements. + +:::danger Be careful +Stylesheets in `styleResources` should **only** contain variables, mixins, and functions because behind the scenes, they are included in components during the build process. If you include a file that contains styles, they will be added to every component in your project, which can significantly hurt the performance and application size. +::: + +We use this approach to have access to StorefrontUI helpers in all components: + +```js +// nuxt.config.js +export default { + styleResources: { + scss: [require.resolve('@storefront-ui/shared/styles/_helpers.scss', { paths: [process.cwd()] })] + }, +}; +``` ## Preinstalled modules and libraries Below you can find a list of the most important Nuxt Modules and libraries that are preinstalled with the default theme: - - -### Nuxt Modules +### Nuxt.js modules - `@nuxtjs/pwa`; - `nuxt-i18n`; diff --git a/packages/core/docs/images/theme/storefront-ui.jpg b/packages/core/docs/images/theme/storefront-ui.jpg new file mode 100644 index 0000000000000000000000000000000000000000..650c66dffbc64dc35b7b7d59298412de0090f0d6 GIT binary patch literal 62906 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%0Do=mm<*2mOwCqFopX%PT^FzS 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

!Pv8`3D-L8@$e?Dw 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


Pkb=_zOknydiRHVFzj*r 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 literal 0 HcmV?d00001 diff --git a/packages/core/nuxt-theme-module/theme/layouts/account.vue b/packages/core/nuxt-theme-module/theme/layouts/account.vue index 8e2755e7ad1..e8772433e23 100644 --- a/packages/core/nuxt-theme-module/theme/layouts/account.vue +++ b/packages/core/nuxt-theme-module/theme/layouts/account.vue @@ -19,6 +19,8 @@ import CartSidebar from '~/components/CartSidebar.vue'; import LoginModal from '~/components/LoginModal.vue'; export default { + name: 'AccountLayout', + components: { TopBar, AppHeader, diff --git a/packages/core/nuxt-theme-module/theme/layouts/default.vue b/packages/core/nuxt-theme-module/theme/layouts/default.vue index 19a954f5741..43583c0a50e 100644 --- a/packages/core/nuxt-theme-module/theme/layouts/default.vue +++ b/packages/core/nuxt-theme-module/theme/layouts/default.vue @@ -36,6 +36,8 @@ import LazyHydrate from 'vue-lazy-hydration'; import Notification from '~/components/Notification'; export default { + name: 'DefaultLayout', + components: { LazyHydrate, TopBar, diff --git a/packages/core/nuxt-theme-module/theme/layouts/error.vue b/packages/core/nuxt-theme-module/theme/layouts/error.vue index 7a9999046e5..ba7b7d9fdfc 100644 --- a/packages/core/nuxt-theme-module/theme/layouts/error.vue +++ b/packages/core/nuxt-theme-module/theme/layouts/error.vue @@ -24,7 +24,10 @@ From e53f28556d115d311022d234d0957c472560be43 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Thu, 1 Apr 2021 09:29:27 +0200 Subject: [PATCH 14/14] Remove link to outdated SFUI Figma designs --- packages/core/docs/guide/theme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/docs/guide/theme.md b/packages/core/docs/guide/theme.md index 2bb1d03caf5..5f2c3d13283 100644 --- a/packages/core/docs/guide/theme.md +++ b/packages/core/docs/guide/theme.md @@ -24,7 +24,7 @@ If you followed our [Installation guide](/general/installation), you should have -Almost every component in our default theme uses components whose names start with `Sf`. These come from [Storefront UI](http://storefrontui.io/) - a design system and library of Vue.js components dedicated to e-commerce, maintained by the Vue Storefront core team. It comes with [Figma designs](https://figma.com/file/N0Ct95cSAoODNv7zYS01ng/Storefront-UI-%7C-Design-System?node-id=0%3A1) and [Storybook](https://storybook.storefrontui.io/) to help you customize and test the components. +Almost every component in our default theme uses components whose names start with `Sf`. These come from [Storefront UI](http://storefrontui.io/) - a design system and library of Vue.js components dedicated to e-commerce, maintained by the Vue Storefront core team. It comes with [Storybook](https://storybook.storefrontui.io/) to help you customize and test the components. The library is fully customizable, so it can be used in different contexts and with different designs. It's great for the multi-tenancy model as a shared UI library that can be customized differently for each tenant.