From dba0c26558cee14999ac7c394560f6e980d93c09 Mon Sep 17 00:00:00 2001 From: Ola Date: Wed, 30 Mar 2022 22:36:00 +0200 Subject: [PATCH] #80366 create docs in Vitepress --- .gitignore | 2 + Magento_Theme/web/js/select.babel.js | 4 +- README.md | 81 +-- Snowdog_Components/README.md | 122 ---- docs/.vitepress/config.js | 113 ++++ docs/.vitepress/theme/custom.css | 33 ++ docs/.vitepress/theme/index.js | 4 + docs/alpaca-step-by-step.md | 427 -------------- .../getting-started/alpaca-setup-guide.md | 357 ++++++++++++ .../getting-started}/magento-setup-guide.md | 44 +- .../which-version-should-i-use.md | 10 + docs/guide/index.md | 9 + docs/guide/introduction/alpaca-packages.md | 94 +++ docs/guide/introduction/browser-support.md | 3 + .../third-party-module-compatibility.md | 24 + docs/{ => guide}/migration-guide.md | 77 +-- docs/guide/working-with-alpaca/blog.md | 12 + docs/guide/working-with-alpaca/components.md | 196 +++++++ docs/guide/working-with-alpaca/fonts.md | 21 + docs/guide/working-with-alpaca/frontools.md | 56 ++ docs/guide/working-with-alpaca/images.md | 79 +++ docs/guide/working-with-alpaca/javascript.md | 3 + docs/guide/working-with-alpaca/magepack.md | 63 ++ .../main-content-elements.md | 14 + docs/guide/working-with-alpaca/sliders.md | 171 ++++++ docs/guide/working-with-alpaca/styles.md | 44 ++ docs/guide/working-with-alpaca/svg-icons.md | 73 +++ docs/images/attribute-description.png | Bin 0 -> 35894 bytes .../category-bottom-descriptions-1.webp | Bin 0 -> 60844 bytes docs/images/expanded-menu-1.webp | Bin 0 -> 36172 bytes docs/images/expanded-menu-2.webp | Bin 0 -> 17752 bytes docs/images/menu-configuration.png | Bin 0 -> 48825 bytes docs/images/product-bullets.webp | Bin 0 -> 42350 bytes docs/images/snowdog-full.svg | 1 + docs/images/stock-status-1.webp | Bin 0 -> 39470 bytes docs/images/stock-status-2.webp | Bin 0 -> 19926 bytes docs/index.md | 28 + docs/package.json | 18 + docs/public/logo.svg | 1 + docs/public/snowdog.png | Bin 0 -> 3215 bytes docs/working-with-alpaca.md | 417 -------------- docs/yarn.lock | 541 ++++++++++++++++++ 42 files changed, 2032 insertions(+), 1110 deletions(-) delete mode 100644 Snowdog_Components/README.md create mode 100644 docs/.vitepress/config.js create mode 100644 docs/.vitepress/theme/custom.css create mode 100644 docs/.vitepress/theme/index.js delete mode 100644 docs/alpaca-step-by-step.md create mode 100644 docs/guide/getting-started/alpaca-setup-guide.md rename docs/{ => guide/getting-started}/magento-setup-guide.md (89%) create mode 100644 docs/guide/getting-started/which-version-should-i-use.md create mode 100644 docs/guide/index.md create mode 100644 docs/guide/introduction/alpaca-packages.md create mode 100644 docs/guide/introduction/browser-support.md create mode 100644 docs/guide/introduction/third-party-module-compatibility.md rename docs/{ => guide}/migration-guide.md (75%) create mode 100644 docs/guide/working-with-alpaca/blog.md create mode 100644 docs/guide/working-with-alpaca/components.md create mode 100644 docs/guide/working-with-alpaca/fonts.md create mode 100644 docs/guide/working-with-alpaca/frontools.md create mode 100644 docs/guide/working-with-alpaca/images.md create mode 100644 docs/guide/working-with-alpaca/javascript.md create mode 100644 docs/guide/working-with-alpaca/magepack.md create mode 100644 docs/guide/working-with-alpaca/main-content-elements.md create mode 100644 docs/guide/working-with-alpaca/sliders.md create mode 100644 docs/guide/working-with-alpaca/styles.md create mode 100644 docs/guide/working-with-alpaca/svg-icons.md create mode 100644 docs/images/attribute-description.png create mode 100644 docs/images/category-bottom-descriptions-1.webp create mode 100644 docs/images/expanded-menu-1.webp create mode 100644 docs/images/expanded-menu-2.webp create mode 100644 docs/images/menu-configuration.png create mode 100644 docs/images/product-bullets.webp create mode 100644 docs/images/snowdog-full.svg create mode 100644 docs/images/stock-status-1.webp create mode 100644 docs/images/stock-status-2.webp create mode 100644 docs/index.md create mode 100644 docs/package.json create mode 100644 docs/public/logo.svg create mode 100644 docs/public/snowdog.png delete mode 100644 docs/working-with-alpaca.md create mode 100644 docs/yarn.lock diff --git a/.gitignore b/.gitignore index bf04367f0..685522f37 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,8 @@ # Dependencies Snowdog_Components/node_modules +docs/node_modules + # Build Snowdog_Components/build diff --git a/Magento_Theme/web/js/select.babel.js b/Magento_Theme/web/js/select.babel.js index b96eb1f4d..ed3a84854 100644 --- a/Magento_Theme/web/js/select.babel.js +++ b/Magento_Theme/web/js/select.babel.js @@ -1,6 +1,6 @@ define([ 'jquery', - 'select2', + // 'select2', 'domReady!' ], function ($) { 'use strict' @@ -48,6 +48,6 @@ define([ } config.options = Object.assign(defaultOptions, config.options); - $(`#${selectId}`).select2(config.options); + // $(`#${selectId}`).select2(config.options); } }) diff --git a/README.md b/README.md index 4ae0bdd92..0755e5166 100644 --- a/README.md +++ b/README.md @@ -1,76 +1,35 @@
Alpaca Logo -[![Latest Stable Version](http://poser.pugx.org/snowdog/theme-frontend-alpaca/v)](https://packagist.org/packages/snowdog/theme-frontend-alpaca) [![Total Downloads](http://poser.pugx.org/snowdog/theme-frontend-alpaca/downloads)](https://packagist.org/packages/snowdog/theme-frontend-alpaca)
-📚 [Docs](./docs) | 📝 [Changelog](./CHANGELOG.md)
+[![Latest Stable Version](http://poser.pugx.org/snowdog/theme-frontend-alpaca/v)](https://packagist.org/packages/snowdog/theme-frontend-alpaca) Magento 2.4.3 [![Total Downloads](http://poser.pugx.org/snowdog/theme-frontend-alpaca/downloads)](https://packagist.org/packages/snowdog/theme-frontend-alpaca) +📚 [Documentation](https://alpaca-docs.vercel.app/) | 📝 [Changelog](./CHANGELOG.md) | 🔺 [Migration Guide](https://alpaca-docs.vercel.app/guide/migration-guide.html) + +🔹 [Component Library](https://magento2-alpaca-theme.vercel.app/)
🔹 [Magento OS Demo](https://alpaca-community.snowdog.dev/)
🔹 [Adobe Commerce Demo](https://alpaca-commerce.snowdog.dev/)
-🔹 [Components Preview](https://magento2-alpaca-theme-git-master-snowdog1.vercel.app/)
-# Magento 2 Theme Frontend Alpaca -> `2.26.0` includes a lot of changes and has different file structure, please go to [Migration Guide](.doc/MIGRATION_GUIDE.md) for more information. +# Magento 2 Alpaca Theme +📝 **Component-based** +* Built on top of a collection of reusable components - guided by clear rules to ensure design consistency. -✅ Compatible with Magento 2.4.3
-📝 Component-based
-📚 Feature-rich
-🎨 Themable
-💅 Polished
-♿️ Accessible
-⚡️ Easy to set up
+🎨 **Themable** +* Gives a lot of flexibility to customize the look of the store. -## Key features -* Polished component system, built with [Sass](https://sass-lang.com/) and [Fractal](https://fractal.build/), on which you can work on outside of Magento to speed up development process. -* It makes it easy to customize design. -* Advanced menu built with [Snowdog Module Menu](https://github.com/SnowdogApps/magento2-menu) -* Optimised images - responsive images, lazyloading, webp, and aspect ratio -* SVG icons that can be used in CMS content -* Customisable content with banners -* Customizable slider built with [slick](https://kenwheeler.github.io/slick/) -* Content types built with [Blackbird Content Manager](https://www.advancedcontentmanager.com/) for slider and blog articles +📚 **Feature-rich** +* Comes in a package with a set of modules. +* Compatible with the majority of Magento Open Source and Adobe Commerce features. -And much more. Check how to work with different features in [Working with Alpaca guide](./docs/working-with-alpaca.md) +💅 **Polished** +* We've put a lot of work into the little things. -## Alpaca Packages -Alpaca Theme is a part of [Alpaca Packages](https://github.com/SnowdogApps/magento2-alpaca-packages) - a set of open source modules that cover Alpaca base features. -It includes: -* [magepal/magento2-gmailsmtpapp](https://github.com/magepal/magento2-gmail-smtp-app) -* [magepal/magento2-googletagmanager](https://github.com/magepal/magento2-google-tag-manager) -* [mailchimp/mc-magento2](https://github.com/mailchimp/mc-magento2) -* [smile/elasticsuite](https://github.com/Smile-SA/elasticsuite) -* [snowdog/module-alpaca-general](https://github.com/SnowdogApps/magento2-alpaca-general) -* [snowdog/module-bullet-points](https://github.com/SnowdogApps/magento2-bullet-points) -* [snowdog/module-csp](https://github.com/SnowdogApps/magento2-module-csp) -* [snowdog/module-category-attributes](https://github.com/SnowdogApps/magento2-category-attributes) -* [snowdog/module-menu](https://github.com/SnowdogApps/magento2-menu) -* [snowdog/module-product-attribute-description](https://github.com/SnowdogApps/magento2-product-attribute-description) -* [snowdog/module-shipping-latency](https://github.com/SnowdogApps/magento2-shipping-latency) -* [snowdog/module-wishlist-unlocker](https://github.com/SnowdogApps/magento2-wishlist-unlocker) -* [webshopapps/module-matrixrate](https://github.com/webshopapps/module-matrixrate) +♿️ **Accessible** +* WCAG AA level compliant -## Third-party module compatibility -Besides modules included in [Alpaca Packages](#alpaca-packages), Alpaca supports the following modules: -* Open source: - * paradoxlabs/authnetcim - * paradoxlabs/tokenbase - * authorizenet/magento-module-creditcard - * [snowdog/module-alpaca-acm](https://github.com/SnowdogApps/magento2-alpaca-acm) - Alpaca customisations for paid `blackbird/contentmanager` extension +⚡️ **Fast Child Theme Setup** +* Create Alpaca Child Theme in your Magento project by running one command. -* Paid: - * amasty/adminactionslog - * amasty/module-gdpr - * amasty/module-gift-card - * amasty/module-google-rich-snippets - * amasty/module-product-feed - * amasty/module-shipping-rules - * amasty/module-special-promo - * amasty/module-store-locator - * amasty/payrestriction - * amasty/shiprestriction - * apptrian/facebook-pixel - * blackbird/contentmanager - * vladimirpopov/webforms +--- -## Installation -Check [Alpaca installation step by step guide](./docs/alpaca-step-by-step.md) +To learn more about Alpaca, check [documentation](https://alpaca-docs.vercel.app/). diff --git a/Snowdog_Components/README.md b/Snowdog_Components/README.md deleted file mode 100644 index 9b09438a4..000000000 --- a/Snowdog_Components/README.md +++ /dev/null @@ -1,122 +0,0 @@ -# Alpaca Components - -## Introduction -Components library of Alpaca [design system](https://www.uxpin.com/studio/blog/design-systems-vs-pattern-libraries-vs-style-guides-whats-difference/) created to speed up the process of working with design on Magento 2 stores, by creating each UI element, module, and view in a simplified, front-end developer friendly, environment. - -This components library is built on top of [Fractal.js](http://fractal.build/guide). -It's separate npm package, created based on [Alpaca Components](https://github.com/SnowdogApps/magento2-alpaca-components). To make the work easier, now it's implemented inside the theme, as a part of theme composer package. - -Magento 2 experience is not required to work with this code. - -## Requirements -- node version >=16 <17.0.0 installed globally -- npm or yarn installed globally - -## Installation -- Install dependencies using `yarn` -- Run `yarn dev` to start Fractal.js development server -- Run `yarn build` if you want to generate static files (for example to deploy them) - -## How to create a components library on top of Alpaca Components -1. Copy-paste `package.json`, `gulpfile.js`, `.eslintignore`, `.eslintrc`, `.sass-lint.yml`, `.stylelintrc` files into `theme-frontend-/Snowdog_Components`: - -2. Update project name in `package.json` and `gulpfile.js` - -3. Copy `styles.scss` and `checkout.scss` from `theme-frontend-alpaca/Snowdog_Components/docs/styles/` and add child project variables import there. - -4. Create `modules.mjs` file with an array of paths to parent components libraries. To inherit dependencies from Alpaca components, you have to define path to `theme-forntend-alpaca/Snowdog_Components`. - In most cases, inside Magento, it will look like this: - ```js - export default[ - "../../../snowdog/theme-frontend-alpaca/Snowdog_Components" - ] - ``` -5. Customize or add new files following the same structure as in Alpaca components - -6. Components imports are located in files in: `vendor/snowdog/theme-frontend-alpaca/Snowdog_Components/components/styles`, copy appropriate file(s) from there in your child theme to import extended or new component(s) - -6. Run `yarn` and `yarn dev` to run components in fractal.build. :tada: - -## Directory structure -- `components` directory is what you are going to import into the Magento 2 theme. -- `docs` and `public` are just for the local environment purposes, you will find there sample images, testing libs, utility styles etc. - -## Core concepts -### Components architecture -Components are divided into 4 groups based on [Atomic Design](http://atomicdesign.bradfrost.com/chapter-2/) system: -1. Atoms - - Contains code that other components can use in any place, for example, typography, icons or SASS variables. -2. Molecules - - Smallest UI parts, for example, buttons - - Molecules can't depend on other molecule - - Molecules shouldn't have any layout -3. Organisms - - More complex UI parts like search form or header - - Takes Molecules or other Organisms and combine them together adding layout and context -4. Templates - - Takes Molecules or Organisms and combine them together adding final layout and context - - You should be able to show it to client/PM as a preview of ready to use store view - - You shouldn't create any new UI elements, everything needs to be reusable. - -### Naming -* Group name needs to be plural -* Component name needs to be singular -* Component name shouldn't be related to any project or place in the layout - - Bad: `top-banner` - - Good: `dropdown-list` or `collapsible-list` -* Avoid using `box`, `block`, `item`, `info`, `text`, `cms`, especially combined together, for example `info-box` -* Avoid naming two components in similar way i.e. `cms-subcategories` and `cms-subcategory` - -### Colors -* By default Alpaca components uses up to 7 step grayscale -* `$color-primary` & `$color-secondary` are mainly used inside components styles - -### SASS Variables naming - -Follow BEM-like naming convention i.e. when you component name is `button` and you are creating a variable for a `padding` it should be `$button__padding`. - -Same as in BEM, you are not allowed to build construction like `$button__icon__padding`, it should be `$button__icon-padding`. - -Variables related to the pseudo-classes and pseudo-selectors should be treated as a BEM elements `$button__color-hover`. - -Also, BEM modifier are allowed in variables `$button__padding--secondary`, you can even stack them like this `$button__padding--secondary--dark`. - -To target variable to specific breakpoint adding `\@breakpoint` at the end of the variable name `$button__padding\@medium`. Always use `small`, `medium`, `large` etc. to describe the breakpoint. - -Examples of proper variables names: -```scss -$swatch__option-border -$swatch__option-border-color-hover - -$swatch__option-image-height\@large - -$swatch__option-size--small -$swatch__option-image-width--small -$swatch__option-image-width--small\@large -``` - -## Accessibility -Components are tested with [axe-core](https://github.com/dequelabs/axe-core). The results are displayed as a console output in browser tools. -A11y test files you can find in `/public/tests/` - -## Common JS files -General concept for JS files is that we load them inside component .hbs file using: -1) `` -2) If component that contains JS file is required by other component we are using `script` variable to avoid problems with duplicated declaration of JS files. This variable can be defined in config.js file and JS script is loaded in .hbs file using: -``` -{{#if script}} - -{{/if}} -``` -Above method is recommended for most JS scripts used in components, but requires additional config which can be complex, especially in the `Templates` views where current component that contains JS file is loaded multiple times. Good example of that kind component type is `dropdown-list` which on one view is loaded in: sidemenu, header minicart, filters and in footer. -To avoid problems with complex config and duplicated declaration of JS files `common-js` component is created in `Atoms`. -This component contain only common-js.hbs file where JS scripts created in components can be loaded globally using: -3) `` -This component is used in `_preview.hbs` file after lib JS files are loaded. -Do not use `common-js` component for libs files and for JS scripts created in components that are not loaded multiple time on one view. - -## Show on scroll elements -To show sticky elements on product page (tabs header & `add-to-cart` component) we use [aos lib](https://github.com/michalsnik/aos/tree/v2) - -## Components notes -In more complex component there is a README.md added, when you can find information about usage, features or a11y implementation. Please check it. In fractal UI, it's available in `Notes` Tab diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js new file mode 100644 index 000000000..456e86d7a --- /dev/null +++ b/docs/.vitepress/config.js @@ -0,0 +1,113 @@ +module.exports = { + lang: 'en-US', + title: 'Alpaca', + description: 'Theme for Magento 2', + head: [['link', { rel: 'icon', href: `/snowdog.png` }]], + themeConfig: { + repo: 'SnowdogApps/magento2-alpaca-theme', + docsDir: 'docs', + docsBranch: 'master', + editLinks: true, + editLinkText: 'Edit this page on GitHub', + lastUpdated: 'Last Updated', + nav: [ + { text: 'Guide', link: '/guide', activeMatch: '^/$|^/guide/' }, + { text: "Contact", link: "https://snow.dog/contact" }, + ], + sidebar: { + '/': [ + { + text: 'Introduction', + children: [ + { + text: 'Overview', + link: '/guide/' + }, + { + text: 'Alpaca Packages', + link: '/guide/introduction/alpaca-packages' + }, + { + text: 'Third-Party Module Compatibility', + link: '/guide/introduction/third-party-module-compatibility' + }, + { + text: 'Browser support', + link: '/guide/introduction/browser-support' + } + ] + }, + { + text: 'Getting Started', + children: [ + { + text: 'Alpaca Setup Guide', + link: '/guide/getting-started/alpaca-setup-guide' + }, + { + text: 'Magento Setup Guide', + link: '/guide/getting-started/magento-setup-guide' + }, + { + text: 'Which version should I use?', + link: '/guide/getting-started/which-version-should-i-use' + } + ] + }, + { + text: 'Working with Alpaca', + children: [ + { + text: 'Frontools', + link: '/guide/working-with-alpaca/frontools' + }, + { + text: 'Components', + link: '/guide/working-with-alpaca/components' + }, + { + text: 'Styles', + link: '/guide/working-with-alpaca/styles' + }, + { + text: 'Fonts', + link: '/guide/working-with-alpaca/fonts' + }, + { + text: 'JavaScript', + link: '/guide/working-with-alpaca/javascript' + }, + { + text: 'Main Content Elements', + link: '/guide/working-with-alpaca/main-content-elements' + }, + { + text: 'Images', + link: '/guide/working-with-alpaca/images' + }, + { + text: 'SVG Icons', + link: '/guide/working-with-alpaca/svg-icons' + }, + { + text: 'Sliders', + link: '/guide/working-with-alpaca/sliders' + }, + { + text: 'Blog', + link: '/guide/working-with-alpaca/blog' + }, + { + text: 'Magepack', + link: '/guide/working-with-alpaca/magepack' + } + ] + }, + { + text: 'Migration Guide', + link: '/guide/migration-guide' + } + ] + } + } +} diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css new file mode 100644 index 000000000..d7cd63e6d --- /dev/null +++ b/docs/.vitepress/theme/custom.css @@ -0,0 +1,33 @@ +:root { + --c-brand: #1a1b1d; + --code-bg-color: #1a1b1d; + --c-brand-light: #1a1b1d; + --code-inline-bg-color: #eaeaea; + --c-accent: #0075e4; +} + +#main-title { + position: absolute; + clip: rect(0 0 0 0); + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; +} + +a { + color: var(--c-accent); +} + +.action .item { + border-radius: 0 !important; +} + +code { + color: var(--c-brand); +} + +.custom-block.tip { + border-color: var(--c-accent); +} diff --git a/docs/.vitepress/theme/index.js b/docs/.vitepress/theme/index.js new file mode 100644 index 000000000..42fe9a936 --- /dev/null +++ b/docs/.vitepress/theme/index.js @@ -0,0 +1,4 @@ +import DefaultTheme from 'vitepress/theme' +import './custom.css' + +export default DefaultTheme diff --git a/docs/alpaca-step-by-step.md b/docs/alpaca-step-by-step.md deleted file mode 100644 index 191650228..000000000 --- a/docs/alpaca-step-by-step.md +++ /dev/null @@ -1,427 +0,0 @@ -# Set up Alpaca Theme on Magento 2.4 - -This is a step-by-step guide of how to install Snowdog's Alpaca Theme and child theme based on Alpaca Theme on working Magento 2.4 project.
-If you need to help with setup Magento project locally, check our [Magento 2 setup guide here](magento-setup-guide.md)
- -Alpaca Theme components and templates preview - see [Alpaca Components Preview](https://magento2-alpaca-theme-git-master-snowdog1.vercel.app/)
-Alpaca Theme preview: [Alpaca Magento OS](https://alpaca-community.snowdog.dev/), [Alpaca Magento Commerce](https://alpaca-commerce.snowdog.dev/)
- -## Create Alpaca Child Theme with npx: -There is a tool that make a full child theme based on alpaca in existing Magento project with one command: -Try it out running `npx create-alpaca-theme` in your Magento root directory (node@16 and working Magento 2.4 required). -More info: [alpaca boilerplate npm project page](#to-do-here) - -// TO DO update table of contents -## Table of Contents - * [Requirements](#requirements) - * [Alpaca Versions](#alpaca-versions) - * [Set up Alpaca Theme](#set-up-alpaca-theme) - * [Set up Alpaca Child Theme](#set-up-alpaca-child-theme) - * [Working with Alpaca Theme](#working-with-alpaca-theme) - * [Useful Links](#useful-links) - -## Requirements -* Working Magento 2.4 project -* Node version 16 -* [yarn](https://yarnpkg.com/) (we recommended yarn but you can also use npm to install dependencies and run node command). - -## Alpaca versions -This guide is adjusted to the latest version of Alpaca theme: ^2.26 and work with Magento 2.4.3 -If you work with older Magento version, use appropriate Alpaca Theme: -* Alpaca 2.14.0 supports Magento 2.4.2 -* Alpaca 2.13.0 supports Magento 2.4.1 -* Alpaca 2.12.* supports Magento 2.3.6 - -Check [Changelog file](../CHANGELOG.md) for more details
. - - -## Set up Alpaca Theme - When using **Valet Plus** run commands in main project directory, with **Warden** remember to launch shell session see [Warden usage and common commands](https://docs.warden.dev/usage.html) - -1. Add Snowdog Alpaca Packages:
- ``` - composer require snowdog/module-alpaca-packages - ``` - See [content of Alpaca Packages here](https://github.com/SnowdogApps/magento2-alpaca-packages) -2. Install Alpaca Theme latest version: - ``` - composer require snowdog/theme-frontend-alpaca:^2.26 - ``` -3. Add frontools: - ``` - composer require snowdog/frontools - ``` - [Learn about Frontools here](https://github.com/SnowdogApps/magento2-frontools) -4. Run db queries to add to your database all Alpaca CMS block & content - [Copy db queries from here](https://github.com/SnowdogApps/create-alpaca-theme/blob/master/templates/database/queries.sql) - -5. Upgrade application, DB data and schema (_[learn more here](https://devdocs.magento.com/guides/v2.4/install-gde/install/cli/install-cli-subcommands-db-upgr.html#instgde-cli-db-upgr)_): - ``` - bin/magento setup:upgrade - ``` -6. Setup frontools - * in `/` create files: - `theme.json`: - ```json - { - "alpaca": { - "src": "vendor/snowdog/theme-frontend-alpaca", - "dest": "pub/static/frontend/Snowdog/alpaca", - "locale": ["en_US"], - "ignore": [ - "**/node_modules/**", - "**/Snowdog_Components/docs/**", - "**/Snowdog_Components/build/**" - ] - } - } - ``` - - `browser-sync.json`, adjust file for your local domain: - ```json - [ - { - "proxy": ".test", - "rewriteRules": [ - { - "match": "..test", - "replace": "" - } - ] - }, - { - "proxy": "b2b..test", - "rewriteRules": [ - { - "match": ".b2b..test", - "replace": "" - } - ] - } - ] - ``` - - * Go to `vendor/snowdog/frontools` and run commands: - ```` - yarn - yarn setup - yarn styles && yarn svg && yarn babel - ```` - Setting up frontools creates symlinks. After set up, `yarn` commands are available from `/tools`
- -7. Log in to admin panel. - - You can find admin page URL in `app/etc/env.php` file in `backend` section (`frontName` parameter) - - You can create new admin user by using magento CLI: - ``` - bin/magento admin:user:create --admin-user="YOUR_USER_NAME" --admin-password="YOUR_PASS" --admin-firstname="Test" --admin-lastname="Test" --admin-email="test@test.com" - ``` - - Go to `Content -> Design -> Configuration`, and choose Alpaca Theme -8. Flush cache storage - `System -> Tools -> Cache Managment` or run command below: - ``` - bin/magento cache:flush - ``` -9. Run Alpaca components - - go to `vendor/snowdog/theme-frontend-alpaca/Snowdog_Components` - - run `yarn` to install node dependencies - - run `yarn dev` and check localhost to see Alpaca components in development mode. -

-Congrats! You've installed Alpaca Theme successfully!
- -To create your own child theme, see the instruction below: -## Set up Alpaca Child Theme -After installing Alpaca theme, you can create child theme based on Alpaca Theme as a separate composer package (in `vendor` directory) or in `app/design/frontend` directory. -In this guide, we will create it in `app/design/frontend`. - -1. Go to `app/design/frontend` and create directories with your Vendor name and with you theme name: `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME`, example: `app/design/frontend/Snowdog/alpaca-child` -2. Create configuration theme's files: -Inside `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME`, create `registration.php` and `theme.xml` files. - * `registration.php`: - - ```php - - CHILD_THEME_NAME - Snowdog/alpaca - - preview.jpg - - - ``` - Adjust `CHILD_THEME_NAME` - -3. Copy theme files: -Copy following files from Alpaca theme (`vendor/snowdog/theme-frontend-alpaca`): -* `.editorconfig` -* `.eslintignore` -* `.gitignore` -* `preview.jpg` -You can create also `README.md` and `CHANGELOG.md` files. - -4. Adjust styles inheritance in child theme: -### Add basic styles and child theme variables: -In components: - * `app/design/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/components/Atoms/variables/_CHILD_THEME_NAME-variables.scss` - child theme variables, where you can create basic variables for a child theme or overwrite those from `vendor/snowdog/theme-frontend-alpaca/Snowdog_Components/components/Atoms/variables/_variables.scss` - change assigned value without `!default` - * `app/design/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/docs/styles/styles.scss`: - ```scss - // Variables - @import '../../components/Atoms/variables/variables'; - - // Child theme variables (imported after alpaca variables) - @import "../../components/Atoms/variables/CHILD_THEME_NAME-variables"; - - // Components - @import '../../components/styles/critical'; - @import '../../components/styles/non-critical'; - - // Styles necessary only for Fractal purposes - @import 'fractal'; - ``` - - * `app/design/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/docs/styles/checkout.scss` - ```scss - // Variables - @import '../../components/Atoms/variables/variables'; - - // Child theme variables - @import "../../components/Atoms/variables/CHILD_THEME_NAME-variables"; - - // Components - @import '../../components/styles/critical-checkout'; - @import '../../components/styles/checkout'; - - // Styles necessary only for Fractal purposes - @import 'fractal'; - ``` - -In theme: - * `app/design/VENDOR_NAME/CHILD_THEME_NAME/styles/styles.scss`: - - ```scss - // Variables - @import '../Snowdog_Components/components/Atoms/variables/variables'; - - // Child theme variables - @import "../Snowdog_Components/components/Atoms/variables/CHILD_THEME_NAME-variables"; - - // Components - @import '../Snowdog_Components/components/styles/non-critical'; - - // Theme partials - @import '../Amasty_Storelocator/styles/module'; - @import '../Amasty_GiftCard/styles/module'; - @import '../Magento_Ui/styles/module'; - @import '../Magento_Catalog/styles/module'; - @import '../Magento_Customer/styles/module'; - @import '../VladimirPopov_WebForms/styles/module'; - @import '../Magento_PageBuilder/styles/module'; - @import '../Magento_QuickOrder/styles/module'; - @import '../Yotpo_Yotpo/styles/module'; - @import '../Magento_Msrp/styles/module'; - @import '../PayPal_Braintree/styles/module'; - @import '../Magento_ReCaptchaFrontendUi/styles/module'; - @import '../Magento_Theme/styles/module-non-critical'; - - // Show sections hidden in critical.scss - .page-main, - .footer { - display: block !important; - } - ``` - - * `app/design/VENDOR_NAME/CHILD_THEME_NAME/styles/critical.scss`: - - ```scss - // Variables - @import '../Snowdog_Components/components/Atoms/variables/variables'; - - // Child theme variables - @import "../Snowdog_Components/components/Atoms/variables/CHILD_THEME_NAME-variables"; - - // Components - @import '../Snowdog_Components/components/styles/critical'; - @import '../Magento_Theme/styles/module-critical'; - - // Hide non-critical sections, before loading full stylesheet - .page-main, - .footer, - .breadcrumbs { - display: none; - } - ``` - * `app/design/VENDOR_NAME/CHILD_THEME_NAME/styles/critical-checkout.scss`: - ```scss - // Variables - @import '../Snowdog_Components/components/Atoms/variables/variables'; - - // Child theme variables - @import "../Snowdog_Components/components/Atoms/variables/CHILD_THEME_NAME-variables"; - - // Components - @import '../Snowdog_Components/components/styles/critical-checkout'; - @import '../Magento_Theme/styles/module-critical'; - - // Hide non-critical sections, before loading full stylesheet - .page-main, - .footer, - .breadcrumbs { - display: none; - } - - ``` - * `app/design/VENDOR_NAME/CHILD_THEME_NAME/Magento_Checkout/styles/checkout.scss`: - ```scss - // Mixins - @import '../../Snowdog_Components/components/styles/mixins'; - - // Component variables - @import '../../Snowdog_Components/components/Atoms/variables/variables'; - // Child theme variables - @import "../../Snowdog_Components/components/Atoms/variables/CHILD_THEME_NAME-variables"; - - // Components partials for checkout - @import '../../Snowdog_Components/components/styles/checkout'; - - // Theme partials for checkout - @import '../../Amasty_GiftCard/styles/module'; - @import '../../Magento_Msrp/styles/module'; - @import '../../Magento_Ui/styles/module'; - @import '../../Magento_PageBuilder/styles/module'; - @import '../../Magento_ReCaptchaFrontendUi/styles/module'; - @import '../../Magento_Theme/styles/module-non-critical'; - @import '../../PayPal_Braintree/styles/module'; - - // Show sections hidden in critical.scss - .page-main, - .footer { - display: block !important; - } - ``` - - -### Extend components styles: -It's a quick guide to create extended styles for `button` component. -More details about styles in Alpaca Theme & components and theits inheritance, you can find in [Working with Alpaca guide](./working-with-alpaca.md) - - * Button Alpaca component styles can be found at: `vendor/snowdog/theme-frontend-alpaca/Snowdog_Components/components/Molecules/button/_button.scss` - * In your child theme, create 3 files: - 1) `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/components/Molecules/button/_CHILD_THEME_NAME-button-variables.scss`: - ```scss - // change button text color: - $button__text-color: $seafoam-blue; - ``` - 2) `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/components/Molecules/button/_CHILD_THEME_NAME-button.scss`: - ```scss - // EDIT/ADD COMPONENT STYLES ACCORDING TO YOUR NEEDS - // to test you can check .button { background-color: blue !important; } - ``` - 3) `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/components/Molecules/button/_button-extend.scss`: - ```scss - @import 'CHILD_THEME_NAME-button-variables'; - @import 'button'; - @import 'CHILD_THEME_NAME-button'; - ``` - you need to change all imports of `_button.scss` to `_button-extend.scss`: - * copy `vendor/snowdog/theme-frontend-alpaca/Snowdog_Components/components/styles/_critical-checkout.scss` to `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/components/styles/_critical-checkout.scss` and change line `@import '../Molecules/button/button';` to `@import '../Molecules/button/button-extend';` - * copy `vendor/snowdog/theme-frontend-alpaca/Snowdog_Components/components/styles/_critical.scss` to `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/components/styles/_critical-checkout.scss` and change line `@import '../Molecules/button/button';` to `@import '../Molecules/button/button-extend';` - - If you extend a component imported in `non-critical` styles, you need to copy `vendor/snowdog/theme-frontend-alpaca/Snowdog_Components/components/styles/_non-critical.scss` and `vendor/snowdog/theme-frontend-alpaca/Snowdog_Components/components/styles/_checkout.scss` and update component's import styles to `...-extend.scss` accordingly. - - -5. Create components: -1) From Alpaca components directory (`vendor/snowdog/theme-frontend-alpaca/Snwodog_Components`) copy follwing files: -* `.browserslistrc` -* `.editorconfig` -* `.eslintignore` -* `.eslintrc.json` -* `.node-version` -* `.sass-lint.yml` -* `.stylelintrc` -* `gulpfile.mjs` -* `package.json` - -2) in `package.json` and `gulpfile.mjs` replace `Alpaca` name to `CHILD_THEME_NAME` -3) Set inheritance from Alpaca component by creating `modules.mjs` file with following content: -```mjs -export default [ - "../../../../../../vendor/snowdog/theme-frontend-alpaca/Snowdog_Components" -] -``` -4) run `yarn` to install dependencies -5) run `yarn dev` to work with components in dev mode. - -6. Create frontools config file to compile theme static assets: -Go to `dev/tools/frontools/themes.json` and add or adjust your theme: -```json -{ - "alpaca": { - "src": "vendor/snowdog/theme-frontend-alpaca", - "dest": "pub/static/frontend/Snowdog/alpaca", - "locale": ["en_US"], - "ignore": [ - "**/node_modules/**", - "**/Snowdog_Components/docs/**", - "**/Snowdog_Components/build/**" - ] - }, - "YOUR_THEME_NAME": { - "src": "app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME", - "dest": "pub/static/frontend/VENDOR_NAME/CHILD_THEME_NAME", - "parent": "alpaca", - "locale": ["en_US"], - "ignore": [ - "**/node_modules/**", - "**/Snowdog_Components/docs/**", - "**/Snowdog_Components/build/**" - ] - } -} - -``` -7. Go to `dev/tools/frontools/browser-sync.json` and set proper values: -```json -{ - "proxy": "your-local-domain.test", - "rewriteRules": [ - { - "match": ".your-local-domain.test", - "replace": "" - } - ] -} - -``` -8. Upgrade application, DB data and schema: - ``` - bin/magento setup:upgrade - ``` -9. Frontools are already installed with Alpaca theme, so after update config, go to `/tool`and run: - ```` - yarn styles && yarn svg && yarn babel - ```` -10. Log in to the admin panel. -11. Go to `Content -> Design -> Configuration`, and choose your theme -12. Flush cache storage. - -## Useful Links - * [Snowdog Frontools](https://github.com/SnowdogApps/magento2-frontools) - * [Valet Plus](https://github.com/weprovide/valet-plus/wiki/Database) - * [Fractal guide](https://fractal.build/guide/) - * [Alpaca Packages](https://github.com/SnowdogApps/magento2-alpaca-packages) - * [Alpaca Components guide](https://github.com/SnowdogApps/magento2-alpaca-theme/blob/master/Snowdog_Components/README.md) - * [Alpaca Components preview](https://magento2-alpaca-theme-git-master-snowdog1.vercel.app/) - * [Theme inheritance magento docs](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/themes/theme-inherit.html) - * [Layout instructions magento docs](https://devdocs.magento.com/guides/v2.4/frontend-dev-guide/layouts/xml-instructions.html) -**** -2021 **[SNOW.DOG](https://www.snow.dog)** diff --git a/docs/guide/getting-started/alpaca-setup-guide.md b/docs/guide/getting-started/alpaca-setup-guide.md new file mode 100644 index 000000000..b87c0451f --- /dev/null +++ b/docs/guide/getting-started/alpaca-setup-guide.md @@ -0,0 +1,357 @@ +# Alpaca Setup Guide +In this guide we will be covering how to set up Alpaca and create Alpaca Child Theme in an existing Magento project. + +If you need to help with setting up Magento project, check our [Magento 2 Setup Guide](/guide/getting-started/magento-setup-guide.html). + +## Requirements +* Magento `2.4` project +* Node `>=16 <17.0.0` +* [yarn](https://yarnpkg.com/) (we recommend yarn but you can also use npm to install dependencies and run node commands) + +## Set up Alpaca Automatically +Use [Create Alpaca Theme](https://www.npmjs.com/package/@snowdog/create-alpaca-theme) to automatically: +* Install Alpaca on your existing Magento 2.4 project +* Create Alpaca Child Theme +* Set up [frontools](/guide/working-with-alpaca/frontools.html) +* Add exemplary Alpaca content elements to data base (optional) + +**Simply run in your Magento project root:** +```shell +npx @snowdog/create-alpaca-theme +``` +[Check more info here.](https://www.npmjs.com/package/@snowdog/create-alpaca-theme) + +## Set up Alpaca Manually +This is a step-by-step guide on how to install Alpaca and Alpaca Child Theme. It covers the same steps that are done automatically [here](#set-up-alpaca-automatically). + +The guide is adjusted for Theme Alpaca `>= 2.26.0`. + +### Set up Alpaca Theme +::: info + When using **Valet Plus** run commands in main project directory, with **Warden** remember to launch shell session see [Warden usage and common commands](https://docs.warden.dev/usage.html) +::: + +1. Add Snowdog Alpaca Packages: + ```shell + composer require snowdog/module-alpaca-packages + ``` + See [content of Alpaca Packages here](https://github.com/SnowdogApps/magento2-alpaca-packages) +2. Install Alpaca Theme latest version: + ```shell + composer require snowdog/theme-frontend-alpaca:^2.26 + ``` +3. Add frontools: + ```shell + composer require snowdog/frontools + ``` + [Learn about Frontools here](https://github.com/SnowdogApps/magento2-frontools) +4. Run db queries to add to your database all Alpaca CMS block & content + [Copy db queries from here](https://github.com/SnowdogApps/create-alpaca-theme/blob/master/templates/database/queries.sql) + +5. Upgrade application, DB data and schema (_[learn more here](https://devdocs.magento.com/guides/v2.4/install-gde/install/cli/install-cli-subcommands-db-upgr.html#instgde-cli-db-upgr)_): + ```shell + bin/magento setup:upgrade + ``` +6. Setup frontools + * In `dev/tools/frontools/config` create files: + 1. `theme.json` + ```json + { + "alpaca": { + "src": "vendor/snowdog/theme-frontend-alpaca", + "dest": "pub/static/frontend/Snowdog/alpaca", + "locale": ["en_US"], + "ignore": [ + "**/node_modules/**", + "**/Snowdog_Components/docs/**", + "**/Snowdog_Components/build/**" + ] + } + } + ``` + + 2. `browser-sync.json` + ```json + { + "proxy": ".test", + "rewriteRules": [ + { + "match": "..test", + "replace": "" + } + ] + } + ``` + Replace `` + + * Go to `vendor/snowdog/frontools` and run commands: + ```shell + yarn + yarn setup + yarn styles && yarn svg && yarn babel + ``` + Setting up frontools creates a convenient symlink `tools` in the project root directory. + +7. In Admin go to `Content -> Design -> Configuration`, and choose Alpaca Theme + ::: tip + * You can find admin page URL in `app/etc/env.php` file in `backend` section (`frontName` parameter) + + * You can create a new admin user by using magento CLI: + ```shell + bin/magento admin:user:create --admin-user="YOUR_USER_NAME" --admin-password="YOUR_PASS" --admin-firstname="Test" --admin-lastname="Test" --admin-email="test@test.com" + ``` + ::: +8. Flush cache storage - `System -> Tools -> Cache Management` or run command below: + ``` + bin/magento cache:flush + ``` +9. Run Alpaca Components locally + - Go to `vendor/snowdog/theme-frontend-alpaca/Snowdog_Components` + - Run `yarn` to install node dependencies + - Run `yarn dev` and check localhost to see Alpaca Components +
+ +Congrats! You've installed Alpaca Theme successfully! 🎉 + +### Set up Alpaca Child Theme +After installing Alpaca theme, you can create child theme based on Alpaca Theme as a separate composer package (in `vendor` directory) or in `app/design/frontend` directory. +In this guide, we will create it in `app/design/frontend`. + +1. Go to `app/design/frontend` and create directories with your Vendor name and with you theme name: `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME`, example: `app/design/frontend/Snowdog/alpaca-child` +2. Create configuration files in `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME`: + 1. `registration.php`: + ```php + + CHILD_THEME_NAME + Snowdog/alpaca + + preview.jpg + + + ``` + Replace `CHILD_THEME_NAME` + +3. Copy `vendor/snowdog/theme-frontend-alpaca` files: +* `.editorconfig` +* `.eslintignore` +* `.gitignore` +* `preview.jpg` +You can create also `README.md` and `CHANGELOG.md` files. + +4. Add Alpaca styles + 1. `app/design/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/components/Atoms/variables/_CHILD_THEME_NAME-variables.scss` + + You can add there base variables or overwrite those from Alpaca (`vendor/snowdog/theme-frontend-alpaca/Snowdog_Components/components/Atoms/variables/_variables.scss`) + ::: warning + Don't use `!default` flag when changing Alpaca variables values + ::: + + 2. `app/design/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/docs/styles/styles.scss` + ```scss + // Variables + @import '../../components/Atoms/variables/variables'; + + // Child theme variables (imported after alpaca variables) + @import "../../components/Atoms/variables/CHILD_THEME_NAME-variables"; + + // Components + @import '../../components/styles/critical'; + @import '../../components/styles/non-critical'; + + // Styles necessary only for Fractal purposes + @import 'fractal'; + ``` + + 3. `app/design/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/docs/styles/checkout.scss` + ```scss + // Variables + @import '../../components/Atoms/variables/variables'; + + // Child theme variables + @import "../../components/Atoms/variables/CHILD_THEME_NAME-variables"; + + // Components + @import '../../components/styles/critical-checkout'; + @import '../../components/styles/checkout'; + + // Styles necessary only for Fractal purposes + @import 'fractal'; + ``` + + 4. `app/design/VENDOR_NAME/CHILD_THEME_NAME/styles/styles.scss` + ```scss + // Variables + @import '../Snowdog_Components/components/Atoms/variables/variables'; + + // Child theme variables + @import "../Snowdog_Components/components/Atoms/variables/CHILD_THEME_NAME-variables"; + + // Components + @import '../Snowdog_Components/components/styles/non-critical'; + + // Theme partials + @import '../Amasty_Storelocator/styles/module'; + @import '../Amasty_GiftCard/styles/module'; + @import '../Magento_Ui/styles/module'; + @import '../Magento_Catalog/styles/module'; + @import '../Magento_Customer/styles/module'; + @import '../VladimirPopov_WebForms/styles/module'; + @import '../Magento_PageBuilder/styles/module'; + @import '../Magento_QuickOrder/styles/module'; + @import '../Yotpo_Yotpo/styles/module'; + @import '../Magento_Msrp/styles/module'; + @import '../PayPal_Braintree/styles/module'; + @import '../Magento_ReCaptchaFrontendUi/styles/module'; + @import '../Magento_Theme/styles/module-non-critical'; + + // Show sections hidden in critical.scss + .page-main, + .footer { + display: block !important; + } + ``` + + 5. `app/design/VENDOR_NAME/CHILD_THEME_NAME/styles/critical.scss` + ```scss + // Variables + @import '../Snowdog_Components/components/Atoms/variables/variables'; + + // Child theme variables + @import "../Snowdog_Components/components/Atoms/variables/CHILD_THEME_NAME-variables"; + + // Components + @import '../Snowdog_Components/components/styles/critical'; + @import '../Magento_Theme/styles/module-critical'; + + // Hide non-critical sections, before loading full stylesheet + .page-main, + .footer, + .breadcrumbs { + display: none; + } + ``` + 6. `app/design/VENDOR_NAME/CHILD_THEME_NAME/styles/critical-checkout.scss` + ```scss + // Variables + @import '../Snowdog_Components/components/Atoms/variables/variables'; + + // Child theme variables + @import "../Snowdog_Components/components/Atoms/variables/CHILD_THEME_NAME-variables"; + + // Components + @import '../Snowdog_Components/components/styles/critical-checkout'; + @import '../Magento_Theme/styles/module-critical'; + + // Hide non-critical sections, before loading full stylesheet + .page-main, + .footer, + .breadcrumbs { + display: none; + } + + ``` + 7. `app/design/VENDOR_NAME/CHILD_THEME_NAME/Magento_Checkout/styles/checkout.scss` + ```scss + // Mixins + @import '../../Snowdog_Components/components/styles/mixins'; + + // Component variables + @import '../../Snowdog_Components/components/Atoms/variables/variables'; + // Child theme variables + @import "../../Snowdog_Components/components/Atoms/variables/CHILD_THEME_NAME-variables"; + + // Components partials for checkout + @import '../../Snowdog_Components/components/styles/checkout'; + + // Theme partials for checkout + @import '../../Amasty_GiftCard/styles/module'; + @import '../../Magento_Msrp/styles/module'; + @import '../../Magento_Ui/styles/module'; + @import '../../Magento_PageBuilder/styles/module'; + @import '../../Magento_ReCaptchaFrontendUi/styles/module'; + @import '../../Magento_Theme/styles/module-non-critical'; + @import '../../PayPal_Braintree/styles/module'; + + // Show sections hidden in critical.scss + .page-main, + .footer { + display: block !important; + } + ``` + +5. Create Components + 1. Copy (`vendor/snowdog/theme-frontend-alpaca/Snwodog_Components`) files: + * `.browserslistrc` + * `.editorconfig` + * `.eslintignore` + * `.eslintrc.json` + * `.node-version` + * `.sass-lint.yml` + * `.stylelintrc` + * `gulpfile.mjs` + * `package.json` + + 2. in `package.json` and `gulpfile.mjs` replace `Alpaca` name to `CHILD_THEME_NAME` + 3. Set inheritance from Alpaca components by creating `modules.mjs` file with following content: + ```js + export default [ + "../../../../../../vendor/snowdog/theme-frontend-alpaca/Snowdog_Components" + ] + ``` + 4. Run `yarn` to install dependencies + 5. Run `yarn dev` to work with components in dev mode. + +6. Add the new theme to `dev/tools/frontools/themes.json` + ```json + { + "alpaca": { + "src": "vendor/snowdog/theme-frontend-alpaca", + "dest": "pub/static/frontend/Snowdog/alpaca", + "locale": ["en_US"], + "ignore": [ + "**/node_modules/**", + "**/Snowdog_Components/docs/**", + "**/Snowdog_Components/build/**" + ] + }, + "YOUR_THEME_NAME": { + "src": "app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME", + "dest": "pub/static/frontend/VENDOR_NAME/CHILD_THEME_NAME", + "parent": "alpaca", + "locale": ["en_US"], + "ignore": [ + "**/node_modules/**", + "**/Snowdog_Components/docs/**", + "**/Snowdog_Components/build/**" + ] + } + } + ``` +7. Upgrade application, DB data and schema: + ```shell + bin/magento setup:upgrade + ``` +8. Frontools are already installed with Alpaca theme, so after update config, go to `/tools`and run: + ````shell + yarn styles && yarn svg && yarn babel + ```` +10. Log in to the admin panel. +11. In Admin go to `Content -> Design -> Configuration`, and choose the new theme +12. Flush cache storage: + ```shell + bin/magento cache:flush + ``` +Congrats! You've created Alpaca Child Theme successfully! 🎉 diff --git a/docs/magento-setup-guide.md b/docs/guide/getting-started/magento-setup-guide.md similarity index 89% rename from docs/magento-setup-guide.md rename to docs/guide/getting-started/magento-setup-guide.md index d9bf2edbb..ee773b340 100644 --- a/docs/magento-setup-guide.md +++ b/docs/guide/getting-started/magento-setup-guide.md @@ -1,32 +1,21 @@ -# Magento 2 setup guide -It's a quick guide to setup Magento 2 project on your local environment and configure it for development purposes. +# Magento 2 Setup Guide +If you have Magento already set up, you can skip this guide. -## Table of Contents - * [Requirements](#requirements) - * [Install and configure Magento 2](#install-and-configure-magento-2) - * [Configure with Valet Plus](configure-with-valet-plus) - * [Configure with Warden](configure-with-warden) - * [Configuration for development purposes](configuration-for-development-purposes) +To make working in local environment easier, we recommend using one of the tools listed below: + * [Valet+](https://github.com/weprovide/valet-plus/wiki) - works on macOS. It doesn't use Vagrant or Docker but configures your Mac to always run Nginx in the background when your machine starts. + * [Warden](https://docs.warden.dev/) - works on MacOS, Linux and Windows (WSL). It's based on Docker containers. + +Of course you can run Magento 2 projects without those tools _(see [Magneto 2 docs](https://devdocs.magento.com/guides/v2.4/install-gde/composer.html))_, however in this guide we will be covering set up with Valet+ and Warden. ## Requirements -* Before we start, make sure you meet the requirements needed to run Magento 2.4 projects: +Make sure: +* You meet requirements needed to run Magento 2.4 projects: * See [system requirements](https://devdocs.magento.com/guides/v2.4/install-gde/system-requirements.html) * See [complete guide of prerequisites necessary to run Magento 2](https://devdocs.magento.com/guides/v2.4/install-gde/prereq/prereq-overview.html) +* You have Valet+ or Warden successfully installed -* To make working in local environment easier, I recommend using one of tools listed below: - - * See [Valet Plus wiki](https://github.com/weprovide/valet-plus/wiki) - works on macOS - * See [Warden 2 docs](https://docs.warden.dev/installing.html#prerequisites) - works on macOS, Linux and Windows - -* Of course you can run Magento 2 projects without those tools _(see [Magneto 2 docs](https://devdocs.magento.com/guides/v2.4/install-gde/composer.html))_, however in this tutorial we will be covering set up with Valet Plus and Warden. - -## Install and configure Magento 2 -Local environment setup with Valet+ or Warden. Working env with one of those tools is required to move forward with this guide. - -### Configure with Valet Plus -(_For configuration with Warden see paragraph below_)
-Valet+ is a development environment for macOS. It doesn't use Vagrant or Docker but configures your Mac to always run Nginx in the background when your machine starts. - +## Installation +### Valet+ 1. Install Magento 2 Community Edition in your valet directory ``` composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition @@ -191,10 +180,7 @@ Valet+ is a development environment for macOS. It doesn't use Vagrant or Docker valet secure ``` -### Configure with Warden -(_If you're using Valet Plus, skip to next paragraph_)
-Warden is a similar to Valet+ for setting up local project environment. As opposed to Valet+, Warden works on MacOS, Linux and Windows (WSL). It's based on Docker containers.
-See [Warden Magento 2 docs.](https://docs.warden.dev/environments/magento2.html) +### Warden 1. Install Magento 2 ``` composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition @@ -396,7 +382,9 @@ See [Warden Magento 2 docs.](https://docs.warden.dev/environments/magento2.html) * See Warden [databse documentation.](https://docs.warden.dev/configuration/database.html) * Make sure database section in `env.php ` file is properly set. -### Configuration for development purposes (for both Valet+ and Warden env): +## Configuration for development purposes +The following steps are common for Valet+ and Warden. + 1. Disable 2FA and CSP for development purposes - run: ``` bin/magento module:disable Magento_TwoFactorAuth Magento_Csp diff --git a/docs/guide/getting-started/which-version-should-i-use.md b/docs/guide/getting-started/which-version-should-i-use.md new file mode 100644 index 000000000..b364f9c51 --- /dev/null +++ b/docs/guide/getting-started/which-version-should-i-use.md @@ -0,0 +1,10 @@ +# Which version should I use? + +| Magento Version | Alpaca Latest Version | +| --------------- |:---------------------:| +| 2.4.3 | 2.26.0 | +| 2.4.2 | 2.24.1 | +| 2.4.1 | 2.13.0 | +| 2.3.6 | 2.12.* | + +Check [changelog](https://github.com/SnowdogApps/magento2-alpaca-theme/blob/master/CHANGELOG.md) for more information.
diff --git a/docs/guide/index.md b/docs/guide/index.md new file mode 100644 index 000000000..b5a6b41d0 --- /dev/null +++ b/docs/guide/index.md @@ -0,0 +1,9 @@ +# Overview +Alpaca is a Magento 2 Theme built on top of Alpaca [design system](https://www.uxpin.com/studio/blog/design-systems-vs-pattern-libraries-vs-style-guides-whats-difference/) crafted for ecommerce. + +## Demos +* [Magento Open Source](https://alpaca-community.snowdog.dev/)
+* [Adobe Commerce](https://alpaca-commerce.snowdog.dev/)
+ +## Component Library +[Browse Alpaca Components](https://magento2-alpaca-theme.vercel.app/)
diff --git a/docs/guide/introduction/alpaca-packages.md b/docs/guide/introduction/alpaca-packages.md new file mode 100644 index 000000000..079f1b154 --- /dev/null +++ b/docs/guide/introduction/alpaca-packages.md @@ -0,0 +1,94 @@ +# Alpaca Packages +Alpaca Theme is a part of [Alpaca Packages](https://github.com/SnowdogApps/magento2-alpaca-packages) - a set of open source modules that are required for some of Alpaca's base features. + +## Snowdog Menu +[snowdog/module-menu](https://github.com/SnowdogApps/magento2-menu)
+ +* Gives greater control over site navigation menus than native Magento 2 offers. Provides a drag-and-drop interface to build menus with links to categories, products, CMS pages, or custom URLs in the admin. +* Used for desktop, mobile and footer menus. Example content can be imported with [these database queries](https://github.com/SnowdogApps/create-alpaca-theme/blob/master/templates/database/queries.sql). +* You can modify the look of menu items by including Alpaca CSS classes in menu nodes configuration. + + For example: to create a column, add a menu node with type "wrapper" and classes `list__column list__column--hidden`. + + Check [Mega Menu](https://magento2-alpaca-theme.vercel.app/components/detail/mega-menu.html), [Side Menu](https://magento2-alpaca-theme.vercel.app/components/detail/side-menu.html) and [Footer](https://magento2-alpaca-theme.vercel.app/components/detail/footer--default.html) to see more options. + +![expanded-menu-1](/images/expanded-menu-1.webp) +![expanded-menu-2](/images/expanded-menu-2.webp) +![menu-configuration](/images/menu-configuration.png) + +## Snowdog Product Bullet Points +[snowdog/module-bullet-points](https://github.com/SnowdogApps/magento2-bullet-points)
+ +Allows for additional product content on the category page list view to provide customers with more information about each product. + +![product-bullets](/images/product-bullets.webp) + +## Snowdog Shipping Latency +[snowdog/module-shipping-latency](https://github.com/SnowdogApps/magento2-shipping-latency)
+ +Replaces default "In Stock/Out of Stock" indicators on category and product detail pages with custom labels to give customers more insight into the availability of products. +Displays popup content when stock indicator is clicked to inform customers about low stock, back in stock dates, delivery lead times, or any other messaging. +* [Theme implementation for Catalog](https://github.com/SnowdogApps/magento2-alpaca-theme/tree/master/Magento_Catalog/templates/product/list.phtml) +* [Theme implementation for PDP](https://github.com/SnowdogApps/magento2-alpaca-theme/tree/master/Magento_Catalog/templates/product/view/shipping-latency.phtml) + + +![stock-status-1](/images/stock-status-1.webp) +![stock-status-2](/images/stock-status-2.webp) + +## Snowdog Product Attribute Descriptions +[snowdog/module-product-attribute-description](https://github.com/SnowdogApps/magento2-product-attribute-description)
+ +Allows for including a "More information" button next to attributes in category and search page layered navigation to explain what each attribute means to help guide customers. + +* [Theme implementation for catalog tooltip](https://github.com/SnowdogApps/magento2-alpaca-theme/tree/master/Smile_ElasticsuiteCatalog/templates/layer/filter/attribute.phtml) +* [Theme implementation for swatches](https://github.com/SnowdogApps/magento2-alpaca-theme/tree/master/Magento_Swatches/templates/product/layered/renderer.phtml) +* [Theme implementation for range filter](https://github.com/SnowdogApps/magento2-alpaca-theme/tree/master/Smile_ElasticsuiteCatalog/templates/layer/filter/slider.phtml) + +![attribute-description](/images/attribute-description.png) + +## Snowdog Category Bottom Descriptions +[snowdog/module-category-attributes](https://github.com/SnowdogApps/magento2-category-attributes)
+ +Allows adding content to the bottom of a category to help guide user experience and improve SEO. + +![category-bottom-descriptions-1](/images/category-bottom-descriptions-1.webp) + +## Snowdog CSP +[snowdog/module-csp](https://github.com/SnowdogApps/magento2-module-csp)
+ +Adds CSP rules for resources utilized in Alpaca. + +## Snowdog WishList Unlocker +[snowdog/module-wishlist-unlocker](https://github.com/SnowdogApps/magento2-wishlist-unlocker)
+ +Allows adding more than 3 products to the wishlist. Gives the ability to set the limit inside Magento whishlist configuration. + +## Snowdog Alpaca General +[snowdog/module-alpaca-general](https://github.com/SnowdogApps/magento2-alpaca-general)
+ +Includes some general Alpaca adjustments and fixes. + +## Smile ElasticSuite Search +[smile/elasticsuite](https://github.com/Smile-SA/elasticsuite)
+ +Provides out the box a lot of features usually only available with proprietary merchandising tools. + +## MagePal SMTP Extension +[magepal/magento2-gmailsmtpapp](https://github.com/magepal/magento2-gmail-smtp-app)
+ +Send all transactional emails using Google App, Gmail, Amazon Simple Email Service (SES), Microsoft Office365 or any other SMTP servers. + +## MagePal Google Tag Manager +[magepal/magento2-googletagmanager](https://github.com/magepal/magento2-google-tag-manager)
+ +Makes Google Tag Manager easier. + +## MailChimp +[mailchimp/mc-magento2](https://github.com/mailchimp/mc-magento2)
+ +Syncs all data (subscriber, customers, orders, products) and enables marketing automation with email campaigns, automations, ads, postcards and more. + +## Matrixrate Shipping +[webshopapps/module-matrixrate](https://github.com/webshopapps/module-matrixrate)
+ + Gives the ability to define custom shipping methods and rates based on destination, cart, or product data via a CSV. Matrixrates Shipping grants the flexibility to cover custom shipping rates for business needs where standard carriers are more rigid. diff --git a/docs/guide/introduction/browser-support.md b/docs/guide/introduction/browser-support.md new file mode 100644 index 000000000..a1135e42d --- /dev/null +++ b/docs/guide/introduction/browser-support.md @@ -0,0 +1,3 @@ +# Browser support +We support browsers that have more than 1% of market share in North America and Europe.
+[Check the list of compatible browsers.](https://browserslist.dev/?q=PiAxJSBpbiBhbHQtbmEsID4gMSUgaW4gYWx0LWV1) diff --git a/docs/guide/introduction/third-party-module-compatibility.md b/docs/guide/introduction/third-party-module-compatibility.md new file mode 100644 index 000000000..2b1e0d934 --- /dev/null +++ b/docs/guide/introduction/third-party-module-compatibility.md @@ -0,0 +1,24 @@ +# Third-Party Module Compatibility +Besides modules included in [Alpaca Packages](#alpaca-packages), Alpaca supports the following modules: +* **Open source:** + * paradoxlabs/authnetcim + * paradoxlabs/tokenbase + * authorizenet/magento-module-creditcard + * creativestyle/magesuite-magepack + * [snowdog/module-alpaca-acm](https://github.com/SnowdogApps/magento2-alpaca-acm) (Alpaca customisations for paid `blackbird/contentmanager` extension) + * yireo/magento2-webp2 + +* **Paid:** + * amasty/adminactionslog + * amasty/module-gdpr + * amasty/module-gift-card + * amasty/module-google-rich-snippets + * amasty/module-product-feed + * amasty/module-shipping-rules + * amasty/module-special-promo + * amasty/module-store-locator + * amasty/payrestriction + * amasty/shiprestriction + * apptrian/facebook-pixel + * blackbird/contentmanager + * vladimirpopov/webforms diff --git a/docs/migration-guide.md b/docs/guide/migration-guide.md similarity index 75% rename from docs/migration-guide.md rename to docs/guide/migration-guide.md index bfec6665b..03b5e8f05 100644 --- a/docs/migration-guide.md +++ b/docs/guide/migration-guide.md @@ -1,6 +1,13 @@ -# Migration guide for Alpaca theme >= 2.26.0 +# Migration guide +## >= 2.26.0 -## New files +### Tools +You can use [this helper](https://github.com/SnowdogApps/theme-alpaca-upgrade-helper) to update child theme styles to Alpaca version >= 2.26.0 automatically. + +Then move to [this](#start-here-when-using-upgrade-helper) step. + +### Step by step guide +**New files overview** ``` theme-frontend-alpaca/ ├── styles/ @@ -24,11 +31,6 @@ theme-frontend-alpaca/ └── _module-non-critical.scss ``` -## Tools -You can use [this helper](https://github.com/SnowdogApps/theme-alpaca-upgrade-helper) to update child theme styles to Alpaca version >= 2.26.0 - -## Step by step guide - 1. Remove `/styles/styles.scss` 2. Copy `critical.scss`, `critical-checkout.scss`, `styles.scss` files from `vendor/snowdog/theme-frontend-alpaca/styles` to `/styles` @@ -99,9 +101,10 @@ Also in `/Snowdog_Components/docs/styles/checkout.scss` // Styles necessary only for Fractal purposes @import 'fractal'; ``` +### [*Start here when using upgrade helper*] 9. Adjust fractal components inheritance: * replace `/Snowdog_Components/modules.json` file with an array of paths to Alpaca components libraries with `modules.mjs` and adjust the content, example: -```mjs +```js export default [ "../../../../../../vendor/snowdog/theme-frontend-alpaca/Snowdog_Components" ] @@ -109,67 +112,35 @@ export default [ * copy content of `vendor/snowdog/theme-frontend-alpaca/Snowdog_Components/gulpfile.mjs` to child theme (`/Snowdog_Components/gulpfile.mjs`) components and adjust child components customisations if needed. 10. Update the following component configuration options in `.config.js` files to their new version: -* `preview: '@checkout'` -> +* `preview: '@checkout'` to: ```js meta: { checkout: true } ``` -* `preview: '@docs-only-styles'` -> +* `preview: '@docs-only-styles'` to: ```js meta: { docsOnlyStyles: true } ``` -## Magento_Theme module -* If you've overwritten `root.phtml` file please adjust content to the newest changes in `theme-frontend-alpaca/Magento_Theme/templates/root.phtml` +11. Remove `Snowdog_Components/components/Atoms/_fonts/_fonts.scss` and add `Snowdog_Components/docs/styles/docs-only-styles/_fonts.scss` instead -```php -assetRepo->createAsset('css/critical-checkout.css')->getContent(); - $inlineStyles = str_replace('../images', $this->getViewFileUrl('images'), $criticalStyles); - $inlineStyles = str_replace('critical.css.map', $this->getViewFileUrl('css/critical-checkout.css.map'), $inlineStyles); - } else { - $criticalStyles = $this->assetRepo->createAsset('css/critical.css')->getContent(); - $inlineStyles = str_replace('../images', $this->getViewFileUrl('images'), $criticalStyles); - $inlineStyles = str_replace('critical.css.map', $this->getViewFileUrl('css/critical.css.map'), $inlineStyles); - } -?> - - - - - - - - -``` +#### Magento_Theme module +* If you've overwritten `root.phtml` file please adjust content to the newest changes in `theme-frontend-alpaca/Magento_Theme/templates/root.phtml` * Styles which use `@extend` rule are moved to `Magento_Theme/styles/_module-critical.scss` and `Magento_Theme/styles/_module-non-critical.scss` -## Minicart +#### Minicart Theme Alpaca `2.26.0` requires [snowdog/module-alpaca-general](https://github.com/SnowdogApps/magento2-alpaca-general): `1.5.0`. We introduced an option to remove quantity input in minicart in `Admin > Store > Configuration > Snowdog > Alpaca General > Mini Cart > Qty`. -## Magepack -In `magepack.config.js` change: -* `Magento_Wishlist/js/add-to-wishlist-mixin` -> `Magento_Wishlist/js/add-to-wishlist-mixin.babel` +#### Magepack +In `magepack.config.js`: +1. Change: +* `Magento_Wishlist/js/add-to-wishlist-mixin` to `Magento_Wishlist/js/add-to-wishlist-mixin.babel` +2. Remove: +* `'Magento_Theme/js/lib/lazysizes.min': 'Magento_Theme/js/lib/lazysizes.min'` +* `'Magento_Theme/js/lib/picturefill.min': 'Magento_Theme/js/lib/picturefill.min'` diff --git a/docs/guide/working-with-alpaca/blog.md b/docs/guide/working-with-alpaca/blog.md new file mode 100644 index 000000000..53d649a29 --- /dev/null +++ b/docs/guide/working-with-alpaca/blog.md @@ -0,0 +1,12 @@ +# Blog +[Demo](https://alpaca-community.snowdog.dev/blog) + +## Installation +Required modules: +* [Blackbird Advanced Content Manager](https://www.advancedcontentmanager.com/) +* [snowdog/module-alpaca-acm](https://github.com/SnowdogApps/magento2-alpaca-acm) + +After modules installation import content types from [Snowdog Alpaca ACM /imports directory](https://github.com/SnowdogApps/magento2-alpaca-acm/tree/master/imports) in `Admin -> Content -> Content Manager -> Content Types -> Import Content Types button`. +## Usage +* Add articles in `Admin -> Content -> Contents -> Articles` +* Blog will be available under [/blog](https://alpaca-community.snowdog.dev/blog) diff --git a/docs/guide/working-with-alpaca/components.md b/docs/guide/working-with-alpaca/components.md new file mode 100644 index 000000000..96e929597 --- /dev/null +++ b/docs/guide/working-with-alpaca/components.md @@ -0,0 +1,196 @@ +# Components +Theme Alpaca styles are based on reusable components. They're created in a simplified, front-end developer friendly environment to speed up the process of working with design on Magento 2 stores. + +Alpaca Components are built inside Theme Alpaca (`Snowdog_Components` directory) - it isn't a separate composer package or git repository. + +## Browse Components Locally + +In `Snowdog_Components` directory (inside Alpaca or Alpaca Child Theme) run: +```` +yarn && yarn dev +```` +Then go to http://localhost:4000/ and start exploring 🎉 + +::: tip +Check [Alpaca Setup Guide](/guide/getting-started/alpaca-setup-guide.html) for more details. +::: +## Core Concepts +### Styles +Styles are written in [Sass](https://sass-lang.com/). They're **used across Magento Theme**. + +### Fractal +Components are built with [Fractal](https://fractal.build/) using [Handlebars](https://handlebarsjs.com/). JS scripts and `.hbs` templates are only for Fractal purpose and they are **not used in Magento**. +### Architecture +``` +theme-frontend-alpaca/ +├── Snowdog_Components/ +│ ├── components/ +│ │ ├──Atoms/ +│ │ ├──Molecules/ +│ │ ├──Organisms/ +│ │ ├──Templates/ +│ │ ├──styles/ +│ │ │ ├── _critical.scss +│ │ │ ├── _non-critical.scss +│ │ │ ├── _checkout.scss +│ │ │ ├── _critical-checkout.scss +│ │ │ └── ... +``` + +**Components are divided into 4 groups based on [Atomic Design](http://atomicdesign.bradfrost.com/chapter-2/) system:** +1. **Atoms** + - Contains code that other components can use in any place, for example, typography, icons or SASS variables. +2. **Molecules** + - Smallest UI parts, for example, buttons + - Molecules can't depend on other molecule + - Molecules shouldn't have any layout +3. **Organisms** + - More complex UI parts like search form or header + - Takes Molecules or other Organisms and combine them together adding layout and context +4. **Templates** + - Takes Molecules or Organisms and combine them together adding final layout and context + - You should be able to show it to client/PM as a preview of ready to use store view + - You shouldn't create any new UI elements, everything needs to be reusable. + +**Component styles are imported in `Snowdog_Components/components/styles` in the appropriate file(s):** +* `_critical.scss` - styles for above-the-fold content that's loaded inline ([learn about Critical CSS](https://web.dev/extract-critical-css/)) +* `_non-critical.scss` - the rest of styles + +The above files aren't loaded in checkout. Instead, there are separate files for checkout: +* `_critical-checkout.scss` checkout styles for above-the-fold content that's loaded inline +* `_checkout.scss` - the rest of checkout styles + +The reason behind it is that checkout requires some unique components. On the other hand, there are a lot of components that are never used in checkout. Loading all component styles on every page would result in a lot of unused CSS. +### Inheritance +Components inside Alpaca Child Theme inherit components from Alpaca Theme. This means that unless component files are overwritten in Child Theme, they're copied from Alpaca during build process. + +### Global Variables +The base of our design system are global variables. They include colors, typography, spacers, breakpoints and more. They're used across components and other modules to maintain visual consistency. They make it easy to customize the general look of the store.
+[Check all variables here](https://github.com/SnowdogApps/magento2-alpaca-theme/blob/master/Snowdog_Components/components/Atoms/variables/_variables.scss). + +### Component Variables +Components have most of the styles defined with variables. You can change the look of components by overriding these variables. Component variables simplify the process of design customization. They significantly reduce the need for overriding styles which helps to save time and keep the code clean. + +## Component Notes +More complex components include a `README.md`. You can find there information about usage, features and a11y implementation. In Fractal UI they're available in `Notes` tab. + +## Accessibility +Components are tested with [axe-core](https://github.com/dequelabs/axe-core). The results are displayed as a console output in browser tools. +A11y test files are located in in `Snowdog_Components/public/tests`. + +## Customization +### Global Variables +* Create `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/components/Atoms/variables/_CHILD_THEME_NAME-variables.scss` +* Modify any [Alpaca variable values](https://github.com/SnowdogApps/magento2-alpaca-theme/blob/master/Snowdog_Components/components/Atoms/variables/_variables.scss) or create new ones. +* Import the file after Alpaca variables (search `// Variables` in Theme Alpaca to find all of the files that require variables import). +::: warning +In child theme don't use `!default` flag when changing variables declared in Alpaca theme or creating new variables for your needs. +::: +### Component styles +**As an example, here's how to customize `button` component styles:** + +Button Alpaca component styles can be found in `theme-frontend-alpaca/Snowdog_Components/components/Molecules/button/_button.scss`. + +**1. In your Alpaca Child Theme, create 3 files:** +* `Snowdog_Components/components/Molecules/button/_CHILD_THEME_NAME-button-variables.scss`: + + Here you can overwrite variables from `theme-frontend-alpaca/Snowdog_Components/components/Molecules/button/_button-variables.scss` or add new ones. + ```scss + // Example: change button text color + $button__text-color: $seafoam-blue; + ``` +* `Snowdog_Components/components/Molecules/button/_CHILD_THEME_NAME-button.scss`: + ```scss + // Example: add new button variant + .button { + &--tertiary { + background-color: $seafoam-blue; + } + } + ``` +* `Snowdog_Components/components/Molecules/button/_button-extend.scss`: + ```scss + @import 'CHILD_THEME_NAME-button-variables'; + @import 'button'; // original Alpaca button styles + @import 'CHILD_THEME_NAME-button'; + ``` + +**2. Change all imports of `_button.scss` to `_button-extend.scss`:** +::: tip +To check where button styles are imported, you can use global search in your IDE. In this case, search `/button'` in `theme-frontend-alpaca`. +::: +* Copy `vendor/snowdog/theme-frontend-alpaca/Snowdog_Components/components/styles/_critical-checkout.scss` to your Child Theme and change line `@import '../Molecules/button/button';` to `@import '../Molecules/button/button-extend';` +* Copy `vendor/snowdog/theme-frontend-alpaca/Snowdog_Components/components/styles/_critical.scss` to your Child Theme and change line `@import '../Molecules/button/button';` to `@import '../Molecules/button/button-extend';` + +### Component configuration file +Data from `.config.js` is used inside `.hbs` template. To change some values, copy `.config.js` to Child Theme and adjust. Follow the same file structure as in Alpaca. + +### Component template +Copy component `hbs` file to Child Theme and add customizations there. Follow the same file structure as in Alpaca. + + +## Good practices +1. **Classes naming** + + Use [BEM](https://css-tricks.com/bem-101/). +2. **Components Naming**
+ * Group name needs to be plural + * Component name needs to be singular + * Component name shouldn't be related to any project or place in the layout + - Bad: `top-banner` + - Good: `dropdown-list` or `collapsible-list` + * Avoid using `box`, `block`, `item`, `info`, `text`, `cms`, especially combined together, for example `info-box` + * Avoid naming two components in a similar way i.e. `cms-subcategories` and `cms-subcategory` +3. **SASS Variables Naming**
+ Follow BEM-like naming convention, i.e. in `button` component, a variable for button `padding` should be called `$button__padding`. + + Same as in BEM, you are not allowed to use multiple `__`, i.e. instead of `$button__icon__padding` call the variable `$button__icon-padding`. + + Variables related to the pseudo-classes and pseudo-selectors should be treated as a BEM elements `$button__color-hover`. + + Also, BEM modifiers are allowed in variables, i.e. `$button__padding--secondary` for `button` component secondary variant. + + For variables used in specific breakpoints, add `\@breakpoint` at the end of the variable name, i.e. `$button__padding\@medium`. Always use `small`, `medium`, `large` etc. to describe the breakpoint. + + Examples of proper variables names: + ```scss + $swatch__option-border + $swatch__option-border-color-hover + + $swatch__option-image-height\@large + + $swatch__option-size--small + $swatch__option-image-width--small + $swatch__option-image-width--small\@large + ``` +4. **Use global variables instead of hard coded values.**
+ This makes the design more consistent and the project easier to maintain. +5. **Use component variables if possible to change component's styling.**
+ Components in Theme Alpaca have most of the styles defined with variables. So instead of overriding the styles, change variable values. [Example - Badge](https://github.com/SnowdogApps/magento2-alpaca-theme/tree/master/Snowdog_Components/components/Molecules/badge). Write additional CSS only if variables don't cover your needs. +6. **Don't use component specific variables in other components.**
+7. **Don't base mixins on component specific variables.**
+8. **Don't use `@extend` between components** (unless it's based on placeholders, and those placeholders are not tightly coupled with components).
+ + +## JavaScript +::: warning +Component JS files are only used inside Fractal. For Magento, we need to build JS files using RequireJS. +::: +### Add JS to Component +Component related js is loaded inside `hbs` files. +```js + +``` +If a component that contains JS file is required by other component, we are using `script` variable defined in `config.js`. This helps to avoid problems with duplicated declaration of JS files. +``` +{{#if script}} + +{{/if}} +``` + +### Common JS +Above method is recommended for most JS scripts used in components, but requires additional config which can be complex, especially in the `Templates`. There can be multiple components that contain the same JS file. A good example of this kind of JS is `dropdown-list.js`. In one `Template` it's used in sidemenu, header minicart, filters and footer. + +To avoid problems with complex configs and duplicated declarations of JS files, there's `Atoms/common-js` component. `common-js.hbs` contains scripts that are reused multiples times across the same views. This file is loaded globally. + +Do not use `common-js` component for library files and for JS scripts created in components that are not loaded multiple time on the same views. diff --git a/docs/guide/working-with-alpaca/fonts.md b/docs/guide/working-with-alpaca/fonts.md new file mode 100644 index 000000000..25ae284e5 --- /dev/null +++ b/docs/guide/working-with-alpaca/fonts.md @@ -0,0 +1,21 @@ +# Fonts +This guide explains how to change fonts in Alpaca Child Theme. + +1. Add fonts to `web/fonts` directory +2. Copy `Magento_Theme/templates/root.phtml` from Alpaca Theme +3. In `Magento_Theme/templates/root.phtml`: + * Swap preloaded Alpaca font files with the new ones + * Swap `@font-face` rules in ` \ No newline at end of file diff --git a/docs/images/stock-status-1.webp b/docs/images/stock-status-1.webp new file mode 100644 index 0000000000000000000000000000000000000000..d938f78d00cfe3753aade873c8e51a7b11668ed8 GIT binary patch literal 39470 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 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..4c27f55f3 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,28 @@ +--- +home: true +heroImage: /logo.svg +heroAlt: Alpaca logo +actionText: Get Started +actionLink: /guide/ +altActionText: Install +altActionLink: /guide/getting-started/alpaca-setup-guide + +features: + - title: 📝 Component-based + details: Built on top of a collection of reusable components - guided by clear rules to ensure design consistency. + - title: 📚 Feature-rich + details: Comes in a package with a set of modules. Compatible with the majority of Magento OS and Adobe Commerce features. + - title: ⚡️ Fast Child Theme Setup + details: Create Alpaca Child Theme in your Magento project by running one command. + - title: 🎨 Themable + details: Gives a lot of flexibility to customize the look of the store. + - title: ♿️ Accessible + details: WCAG AA level compliant + - title: 💅 Polished + details: We've put a lot of work into the little things. + +footer: MIT Licensed | Copyright © 2017-present Snowdog +--- +
+ Snowdog Logo +
diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 000000000..465690d37 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,18 @@ +{ + "name": "alpaca-docs", + "private": true, + "scripts": { + "docs:dev": "vitepress dev .", + "docs:build": "vitepress build .", + "docs:serve": "vitepress serve ." + }, + "engines": { + "node": ">=14.13 <17" + }, + "volta": { + "node": "16.13.1" + }, + "devDependencies": { + "vitepress": "^0.22.3" + } +} diff --git a/docs/public/logo.svg b/docs/public/logo.svg new file mode 100644 index 000000000..00ee26dc3 --- /dev/null +++ b/docs/public/logo.svg @@ -0,0 +1 @@ + diff --git a/docs/public/snowdog.png b/docs/public/snowdog.png new file mode 100644 index 0000000000000000000000000000000000000000..cd369ccff4ff41df71a0f7c4774624a3778f7a7e GIT binary patch literal 3215 zcmah~c~n%_8UOB^H#<1PKFBt}Ahcq@V3d?)9+7~E2o;hT6`5!?7?Xer1WACoibga> zaH)u(Ga8pxt>BU(OPLq3t|((7ktQs!B_fK;ghiP3_0jgU{imn*+;hL*{e8dR_nmjo zd-rY6Se)!EnJxhU=adDBO8^KC5+LGnq5XvFIv2zli?Uu%&R@hqmSsJ=A~tad6)aht z3DjWsS^%dxDTxVL8-I9Gjdl%0I$imrgZ(P+9R1Cu`OQh~r}kd|NmzHc;UjxU(ElH` zFYlV%L+ih7$_ku!xP*#}o>${P`)fusLy}+dfKC0Pb)nohDgMGV+o3H)>z1c%KFj^v=7Q#er+C#FhXnkp%Z<&5Fh ze;DsTpJ675MwwRZdEkMPieb<~lBz z>Ih1zhbu&EvF2n3(mTIGg~U#mNTrcgNKCQojv%w+-J1@gPPXh_s*U}wyyjvyyDIJ<|?7*?VZYD);Acbaf3=9e-7dH2TKZW{+1E%b?sOsT_2i>{#9GjqAh| zm@1Iu!C36*o3Lwibe%3z_INF?!}^G|7iT=5O(hVesAKP^m1ywBc*Kp{(-t7ys%PKM zYUEXwTZHueRV{wF)di>BeZaS;UvBP&Yw{{rC@x13xnTGco~k&3Ex&Yj9`#WY+Zdx4 zaqTvXBb(hUhEmdIEro_*7aCF?+jE}dZ`_=r{fa`F(!>t?$-&(Z@GlXfa|zJY)rgHM z<#rc2WcktX21M)M#qmfiEFtiD9vFj^a3BpJc2BL?$fHF=-uiUvG79DabL1z5o)5w? zCu6AcuiU-De6|}g=bkLW1WMV7(;wbz`PwWCKkb3H-O4r;HFVS z64eQ%gzGegHy!r`1l^^+CNWI=h%2Wd6lezKp1}9tlVcA+5*BO7ND%&eaxABtk~`7= znH&pXDr7~9p075%Kvet1(Hs(pt(Ho}$Up+_tcw%e;VU^$3o^2de`N+M;w&}^Q;pZ0 zWG{$KP?1b8hOwLwy$m~qjj9xTFem8dV~3QS!+Ff)`%lysUGKqI1UMUpv>Q{2E;V-x zV?P*T%`wx#&I(YirP2}5#6QRJF<@j5);>I?CEo{%y)_LGUCb$qMBPU1nBm#rBTjRg zE8JXr?X;E*7f|eJ8K+6$G>szDhtYXEmrJmt$QKBlm-)S#X!Y;@f_oXT;mM&*U$#d& z@!ol=E)a^0&B}dyzZ`&ol-L7zPHvA2x;zlP0#*zNAv#n-n6|mzsozb)(7x3;qN)=gMT~+uJuqc{iC8bD-zs#j zc^60Qx24Vz{Ta zt8HG0vbXp1DPk#G42k%HPN!KcxaI|=pB-rW<1fwONwOadyQwjO2ecM<=2y*^gQVS2KZ(H@v z$G4HmWrM2h#H-*~q>`(RrI5(HX&udGGF{~rK0kfOmI`d&4870tCW-=0$patTWgY2? zD!gd&&U3A(q$u|=yW9LK&y}_WTw<38MfN&qdj;wb^8YJ)*m_Q-X=aj?*zSlOi_MhSzP_`x<=XDo`KynGe({{wp!vy(d3Jl%~of5!)fi2vUTL5 zr-nh9i;{VI**qMqS;~H0wjWT=tSZB5vg46qu+vS+?B$P4e2F)*udsFVF)rLxt*rvM zMMSV+hj(5Vl0$me-750p1yd{DFwYz2X?WMO_GW>F66qi zFEM2>W_S~GHCP1#+c7oLo=_u;o1V=iK|ZAWp(0r0Kn;VTO#7I24?x?qboz@&tO`Ow zr)`Tt^(Q%Xf5AJj-2aLX#(38pOQ)w%m&7&^OV;(Jvl#!8J@lPnjSE~m?=2fWuSU=B zyRJRt$c!MiMt)g2KtyKJzdqoYFo=AQH-VE!#?ZH8l%>)=f8R;=5c2hM!d6N2OEr#Q zzWb>;BBS9Y#u9$*jTYPPu?SIE);gYEI}&7+(R}@Cu>GjR0%TGDEr|P!r1ZUD8kqo% zqM?8|!h)hAt;4@9;&r)-kgg7TXOoHQAQw8SLYej^}UMTtZRFKtC_TBmcxMY`GslZb+oPV~F=U zQ`uW&T}`ll?95obXlZpcAxTeRKOu@?L>5@ptj4xX(Qn|o`g3Z~bM{DQU==7?C9%C_ z%Z-4LDxs295mt0vy@PhdY`v+*lqD NUSFJe_BGAszXK92HTM7j literal 0 HcmV?d00001 diff --git a/docs/working-with-alpaca.md b/docs/working-with-alpaca.md deleted file mode 100644 index 08a8a4345..000000000 --- a/docs/working-with-alpaca.md +++ /dev/null @@ -1,417 +0,0 @@ -# Working with Alpaca - -You'll find here information how to work with different features of Alpaca Theme. -For installation details, check [Step by step Alpaca installation guide](./alpaca-step-by-step.md) - -## Table of Contents - * [Requirements](#requirements) - * [Frontools](#frontools) - * [Components](#components) - * [Customisation of Alpaca Components](#alpaca-components-customisation) - * [Customising theme files](#customising-theme-files) - * [Styles](#styles) - * [JS](#js) - * [Images](#images) - * [Responsive images](#responsive-images) - * [Lazyloading images](#lazyloading-images) - * [Preventing images from jumping on load](#preventing-images-from-jumping-on-load) - * [SVG icons](#svg-icons) - * [Sliders](#sliders) - * [Header and Footer](#header-and-footer) - * [Homepage](#homepage) - * [Working with Snowdog Modules](#working-with-snowdog-modules) - * [Magepack](#magepack) - -## Requirements -* Working Magento 2.4.3 -* Node version 16 -* [yarn](https://yarnpkg.com/) (we recommended yarn but you can also use npm to install dependencies and run node command). - -## Frontools - Set of front-end tools for Magento 2. Run commands below in `tools`. - - When developing run comand below to watch for style changes and running processing tasks: - ```` - yarn watch - ```` - - You can also use `yarn dev` to run [browserSync](https://browsersync.io/) and inheritance, babel, styles, watch tasks. - ```` - yarn dev - ```` - **NOTE!** To run `yarn dev`, set correct proxy values in file - `dev/tools/frontools/config/browser-sync.json` - - After every application upgrade (`bin/magento setup:upgrade` command) run: - ```` - yarn styles && yarn svg && yarn babel - ```` - - Config files are kept in `dev/tools/frontools/config`. - - `themes.json` file is essential. It needs to be set properly, without it frontools won't work. See [themes.json example.](https://github.com/SnowdogApps/magento2-frontools/blob/master/config/themes.json.sample) - - Setting up frontools creates symlink, after set up, `yarn` commands are available from `/tools` - - To learn how to fully utilize frontools see [frontools readme.md](https://github.com/SnowdogApps/magento2-frontools#magento-2-frontools) - -## Components - * `theme-frontend-alpaca/Snowdog_Components` it's separate [fractal.build](https://fractal.build/guide/) tool integrated with Alpaca Theme, which allows you to work with Magento UI styles easier and faster. It is not set as a separate composer package (neither separate git repository) to work with Magento theme easier and faster. But you can work on components separately and run them outside of Magento. - * Check it out, go to **Snowdog_Components** (`app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components`), install node dependencies and run dev command: - ```` - yarn - yarn dev - ```` - * Go to `http://localhost:4000/` to play with components. To learn how to change components, **read section below**. - * Component styles in Alpaca follow [Atomic Design Methodology](https://atomicdesign.bradfrost.com/chapter-2/). Components are divided into Atomic groups, that is: - * Atoms - * Molecules - * Organisms - * Templates
- * Styles written in fractal components are used in Magento theme. JS scripts and hbs templates are only for fractal purpose and they are not used inside Magento theme. - * Check full styles structure in `vendor/snowdog/theme-frontend-alpaca/Snowdog_Components` - * **NOTE!** Detailled instruction how to set child theme inherited from Alapca theme you can find in out [Step by step Alpaca installation guide](./alpaca-step-by-step.md) -## Alpaca Components customisation - - Customising components with variables - * You can overwrite any of Alpaca Components variabales in child theme in - `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/components/Atoms/variables/_CHILD_THEME_NAME-variables.scss` - * Child theme variables should be imported after Alpaca variables. Use values without `!default` to change variables declared in Alpaca theme or create new variables for your needs. - * You can customise your styles by changing variables values - global or components variables), extending styles by using Alpaca's and custom and overwrite styles by creating totally new styles for components. - * For Components, we use 2 create 2 main `.scss` files in `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/docs/styles/`: - * `styles.scss` - * `checkout.scss` - * Main `.scss` files are required in child components to use custom child theme's variables. - - Customising components - * Customize or add new files following the same structure as in Alpaca Components. - Create file `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/components/Molecules/button/_button-extend.scss` - ```scss - @import 'CHILD_THEME_NAME-button-variables'; // optional; - @import 'button'; - @import 'CHILD_THEME_NAME-button'; - ``` - Inside `button-extend.scss`, `CHILD_THEME_NAME-button-variables` is a file where you change component's variable, `button` is an original Alpaca Component style and `CHILD_THEME_NAME-button` contains additional or overwritten by child theme styles.
- * you need to import extended component, to do it, copy file(s) from `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/Snowdog_Components/components/styles` and change `@import '../Molecules/button/button';` to `@import '../Molecules/button/button-extend';` - * You can overwrite any component in your child theme by maintaining the same file structure (`.hbs`, `config.js`, `.scss`). - * Read more about Alpaca components [here](https://github.com/SnowdogApps/magento2-alpaca-theme/blob/master/Snowdog_Components/README.md) -## Customising theme files - * To customise layout `XML` files and template `.phtml` files, follow Magento theme inheritance [standard.](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/themes/theme-inherit.html) - * Rememeber that: - * Templates have to be overwritten in child theme - * Layouts can be extended from parent theme, so there is no need for copying and overwriting file. Add, remove, change what you need. -## Styles -Are was mentionned before, Styles in Alpaca are separated: -* Components styles inside `theme-frontend-alpaca/Snowdog_Components` to work with components directly.
- -Those styles are also imported inside the theme in `theme-frontend-alpaca/styles/` directory -* For Magento we need to create 3 main `.scss` files inside child theme: - * `styles.scss` in `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/styles/styles.scss` where components and theme styles are imported. And where child theme variable are imported after Alpaca variables - * `critical.scss` in `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/styles/critical.scss` to load basic critical styles for page loading. - * `critical-checkout.scss` in `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/styles/critical-checkout.scss` to load basic critical styles for checkout page loading. - * `gallery-styles.scss` in `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/styles/gallery-styles.scss` to load styles for fotorama gallery. - * `checkout.scss` in `app/design/frontend/VENDOR_NAME/CHILD_THEME_NAME/Magento_Checkout/styles/checkout.scss` where components and checkout styles are imported - -* During styles compilation for theme, following directories are ignored: -``` -"**/node_modules/**", -"**/Snowdog_Components/docs/**", -"**/Snowdog_Components/build/**" -``` -It should be added in `themes.json` in [frontools config](#https://github.com/SnowdogApps/magento2-frontools/blob/master/config/themes.json.sample) as ignores files - -## JS -* JS files from components are not imported in theme, they are only demonstrative. For theme we need to build JS files using RequireJS. -* If you use ES6 in theme's js files, you should use babel support, just add `.babel` in file name before `.js` extension, example: [script for tabs](../Magento_Theme/web/js/tab.babel.js) and run `yarn babel` with frontools - -## Images -### Responsive images - -* to display responsive image for banners and slider items, we use: -* template `picture.phtml`: `vendor/snowdog/theme-frontend-alpaca/Magento_Theme/templates/html/picture.phtml` you can adjust it for your needs in the child theme. -* usage of phtml in cms block/page: -``` -{{block class="Magento\Framework\View\Element\Template" template="Magento_Theme::html/picture.phtml" img480="" img768="" img960="" img1024="" img1328="" img_full="" picture_class="image" picture_alt="" }} -``` -* by default you can use different image for media query breakpoints, you can also implement images with different device-pixel-ratio, check the template's code for details -* `picture_class` is a required attribute - -## Lazyloading images -We use [lazysizes](https://github.com/aFarkas/lazysizes) in project, so when you implement images with `` tag (ex. in CMS content), use: -* placeholder in `src` attribute: `data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAABCAQAAABN/Pf1AAAAC0lEQVR42mNkwAIAACoAAgu1Hc4AAAAASUVORK5CYII=` -* image url in `data-src` attribute -* `lazyload` class on `` tag - -This solution is already implemented on responsive solution in `picture.phtml` template - -## Preventing images from jumping on load -* to prevent jumping we need aspect ratio of image which we can calculate with formula: $aspectRatio = (imgHeight / imgWidth) * 100 -* usage for single image (with lazyloading): -``` -
- <descriptive alternative text for image> -
-``` -* usage for images added with picture.phtml. To work we need set `img_ratio_width` and `img_ratio_height`: -``` -{{block class="Magento\Framework\View\Element\Template" template="Magento_Theme::html/picture.phtml" img_default="cms/home/banners/my-file.jpg" picture_class="image" img_ratio_width="656" img_ratio_height="264"}} -``` -* aspect ratio for responsive images implemented using `picture.phtml`: -If responsive images - images for different viewports - have different aspect ratio than the default image, we should implement each of them: either in picture content type (if blackbird contentmanager is used), or in picture.phtml template. We need to add a unique `id` and `picture_class` attribute, which is required to make it works. -Use additional attributes for responsive aspect ratio: - `img_ratio_width_480` -> for image max-width 480px - `img_ratio_width_768` -> for image max-width 768px - `img_ratio_width_1024` -> for image max-width 1024px - `img_ratio_width_1328` -> for image min-width 1025px - -usage example: -``` -{{block class="Magento\Framework\View\Element\Template" template="Magento_Theme::html/picture.phtml" img_768="" img_1024="" img_full="" img_default="" picture_class="image" picture_alt="" img_ratio_width="1200" img_ratio_height="600" img_ratio_width_768="768" img_ratio_height_768="500" img_ratio_width_1024="472" img_ratio_height_1024="376" img_ratio_width_1328="1328" img_ratio_height_1328="1200" id=""}} -``` -!Important Note: -If responsive image aspect ratio is added, additional styles inline are generated, so use it ONLY if needed (if aspect ratio for responsive image is different that for default image) to keep your code as clean as possible. - -## SVG icons - -* {{block class="Magento\Framework\View\Element\Template" template="Magento_Theme::html/svg-icon.phtml" icon="" icon_class="icon" title="" role="presentation" focusable="false"}} -* as `icon` value use icon id (Alpaca components) -* as `title` use accessible title that describe the icon image -* base class for icon is `icon` you can add, adjust class according to your needs -* a11y - use role="presentation" and focusable="false" if an icon is only decorative to hide in a11y API tree -## Sliders -Sliders in Alpaca re build with `blackbird/contentmanager` extension
-* There is one template for all sliders. You can find it in [Magento_Theme/templates/html/slider.phtml](../Magento_Theme/templates/html/slider.phtml). It is based on [slick slider](https://kenwheeler.github.io/slick/).
-How to use: -1. If possible define block in xml: -``` - - - //required option with uniq name - - some_slider_name - - - //required option for sliders using content type `pictures` as slides - - some_picture_block_name - - - // optional option used to define slider variant - - some_class_name - - - // optional option used to define classes for slider title - - heading heading--first-level margin-0 - - - - // required block with name parameter same as defined in slider_block argument - - -``` -if not use: -``` -$sliderBlock = $this->getLayout() - ->createBlock("Magento\Framework\View\Element\Template") - ->setTemplate("Magento_Theme::html/slider.phtml"); -``` -2. Initialize "before-slides" block in .phtml file -``` -getSliderBlock(); // -$sliderBlockBefore->setData(['slider_html'=>'before-slides', ...]); -?> -toHtml(); ?> -``` - -"..." - additional config options: -``` -$sliderBlock->setData([ - 'slider_html' => 'before-slides', //required option - 'slider_class' => '', //optional slider class name - 'wrapper_class' => '', //optional slider wrapper class name - 'display_title' => '', //optional bool value - 'slider_title' => '', //optional slider title - 'title_class' => '', //optional slider title class name - 'content_before' => '', //optional content before slides - 'arrows' => '', //optional bool value - 'is_ajax' => '', //bool value - set to true when slides are loaded with ajax - - //below options are optional and described in: [https://kenwheeler.github.io/slick/#settings] - 'infinite' => '', //default true - 'mobile_first' => '', //default true - 'center_mode' => '', //default false - 'dots' => '', //default true - 'autoplay' => '', //default false - 'autoplay_speed' => '', //default 3000 - 'pause_on_focus' => '', //default true - 'pause_on_hover' => '', //default true - 'slides_to_show' => '', //default 1 - 'slides_to_scroll' => '', //default 1 - 'responsive_config' => '', //default false -]); -``` - -3. Render html for slides - -``` - $item) : ?> -
- ... -
- -``` - -4. Initialize "after-slides" block in .phtml file -``` -setData(['slider_html'=>'after-slides', ...]); -?> -toHtml(); ?> -``` - -5. Sliders created using Advanced Content Manager can be placed in any CMS content using Content Manager Content List widget. -Click on "Insert Widget..." button when editing CMS content with wysiwyg editor. Select "Content Manager Content List" as Widget Type. Set options: -"Content Type" -> "Sliders" -"Number of Contents to Display" -> 1 -"Template" -> "Slider Content List Template" -"Condition" -> Slider ID is "your-slider-id" -"Attributes to show" -> not required -Click on "Insert Widget" - -6. Full width variant - -To display slider full width, just add class `slider--full-with`, by extending block `home-slider` with argument `slider_class` in `cms_index_index.xml`. - -## Header and Footer - * To display and customise content in header or footer we use CMS block ([read more](https://docs.magento.com/user-guide/cms/blocks.html)) - * See default structure - `vendor/snowdog/theme-frontend-alpaca/Magento_Theme/layout/default.xml`. -## Homepage - * To display homepage content we use static blocks. - * See default structure - `vendor/snowdog/theme-frontend-alpaca/Magento_Cms/layout/cms_index_index.xml` - -## Working with Snowdog Modules - Snowdog Modules is a set of open source modules used with Alpaca Theme installed via [Magento 2 Alpaca Packages](https://github.com/SnowdogApps/magento2-alpaca-packages). You can find list of installed modules in [README description](../README.md#description) section. - - ### Magento2 menu - snowdog/magento2-menu - * Provides powerful menu editor to replace category based menus in Magento 2. - * Displays desktop menu, mobile menu or footer links menu - * You can use Alpaca styles implementation to use different configuration of menu items, by adding classes to nodes, check Alpaca components for details to build menu's adjusted to your project's needs, for example: to create a column, create node "wrapper" with Node CSS Classes: list__column list__column--hidden - * Example data can be imported [with alpaca db queries](https://github.com/SnowdogApps/create-alpaca-theme/blob/master/templates/database/queries.sql)). - * See [Magento 2 menu details](https://github.com/SnowdogApps/magento2-menu). - ### Shipping latency - snowdog/module-shipping-latency - * It is an extension allowing to display additional informations about shipping time - * Extension work on catalog and product detail page, to customise it you need to set attribute (dropdown) option and create cms block for popup content - * See [Shipping latency module details](https://github.com/SnowdogApps/magento2-shipping-latency). - * [Theme implementation for catalog](../Magento_Catalog/templates/product/list.phtml) - * [Theme implementation for PDP](../Magento_Catalog/templates/product/view/shipping-latency.phtml) - - ### Bullet points - snowdog/module-bullet-points - * Extension is used to display product attributes listed on product list item on catalog page - * See [Bullet points module details](https://github.com/SnowdogApps/magento2-bullet-points). - - ### Category attributes - snowdog/module-category-attributes - * This extension adds a field for additional content on the bottom of catalog page - * See [Category attributes module details](https://github.com/SnowdogApps/magento2-category-attributes). - - ### Product attribute description - snowdog/module-product-attribute-description - * This extension allows to add additional description for attribute, implemented from admin level - * See [Product attribute description module details](https://github.com/SnowdogApps/magento2-product-attribute-description). - * [theme implementation on catalog level as an additional tooltip](../Smile_ElasticsuiteCatalog/templates/layer/filter/attribute.phtml) - * [theme implementation in swatches](../Magento_Swatches/templates/product/layered/renderer.phtml) - * [theme implementation in range filter](../Smile_ElasticsuiteCatalog/templates/layer/filter/slider.phtml) - ### Wishlist unlocker - snowdog/module-wishlist-unlocker - * This extension allows to show more than 3 items in sidebar wishlist (M2 default is 3) - * Limit value can be set in admin: `Store -> Configuration -> Customer -> Wish List -> General Option -> Items Limit` - * See [Wishlist unlocker description module details](https://github.com/SnowdogApps/magento2-wishlist-unlocker). - -## Blog -* we use Blackbird Content Manager `blackbird/contentmanager` for blog - -## Magepack -for Magento version < 2.3.6, mixins.js module patch is required/ [Patch provided and explained here](https://github.com/magento/baler/issues/23) - -Magepack is already integrated with [Frontools](https://github.com/SnowdogApps/magento2-frontools) - -### Generate magepack config -To start using magepack we need to generate magepack config. -Before start: -* clear Magento cache -* compile assest for production mode (in `/tools` directory): -``` -yarn styles --prod && yarn babel --prod && yarn svg -``` -* generate config with command (with appropriate path for each site): -``` -yarn magepackGenerate --cms-url="https://baseUrl/" --category-url="https://baseUrl/categoryPage" --product-url="https://baseUrl/productPage" -``` -Magepack config will be generated in `/tools` as `magepack.config.js` (which is a symlink to vendor/snowdog/frontools/magepack.config.js). -You can move this file to main repo or to other location, add this to `.gitignore` and commit changes. - -With commited magepack config, during deployment, after assets compilation, run magepack bundling: -``` -yarn magepackBundle --config -``` - -### Add assets -* If you added fonts or external assets that can be load with `preload`, add them in: -`vendor/snowdog/theme-frontend-alpaca/Magento_Theme/templates/root.phtml` with `preload` attribute. - -* if assets come from external module which is not always enable, add preload assets in following way: -in module folder inside theme: - * using xml layout add block in `head.additional` and in custom template add assets: - ``` - - ``` - an example can be found here: `vendor/snowdog/theme-frontend-alpaca/Amasty_GdprCookie` - -### Test magepack locally - -To test magepack locally: -* clear and enable cache, -* enable merging, minifying and magepack budnling in your db: -``` -bin/magento config:set dev/js/enable_magepack_js_bundling 1 -bin/magento config:set dev/js/merge_files 1 -bin/magento config:set dev/js/minify_files 1 -bin/magento config:set dev/css/minify_files 1 -bin/magento config:set dev/css/merge_css_files 1 -``` -* run tools compilation for production: -``` -yarn styles --prod && yarn babel --prod && yarn svg -``` -* generate magepack config: -yarn magepackGenerate .. - -* switch to production mode: -``` -bin/magento deploy:mode:set production -``` -* bundle magepack -in `/tools` -``` -yarn magepackBundle --config -``` -* clear cache -* check results in browser diff --git a/docs/yarn.lock b/docs/yarn.lock new file mode 100644 index 000000000..4fe03e6c9 --- /dev/null +++ b/docs/yarn.lock @@ -0,0 +1,541 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@algolia/autocomplete-core@1.5.2": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.5.2.tgz#ec0178e07b44fd74a057728ac157291b26cecf37" + integrity sha512-DY0bhyczFSS1b/CqJlTE/nQRtnTAHl6IemIkBy0nEWnhDzRDdtdx4p5Uuk3vwAFxwEEgi1WqKwgSSMx6DpNL4A== + dependencies: + "@algolia/autocomplete-shared" "1.5.2" + +"@algolia/autocomplete-preset-algolia@1.5.2": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.5.2.tgz#36c5638cc6dba6ea46a86e5a0314637ca40a77ca" + integrity sha512-3MRYnYQFJyovANzSX2CToS6/5cfVjbLLqFsZTKcvF3abhQzxbqwwaMBlJtt620uBUOeMzhdfasKhCc40+RHiZw== + dependencies: + "@algolia/autocomplete-shared" "1.5.2" + +"@algolia/autocomplete-shared@1.5.2": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.5.2.tgz#e157f9ad624ab8fd940ff28bd2094cdf199cdd79" + integrity sha512-ylQAYv5H0YKMfHgVWX0j0NmL8XBcAeeeVQUmppnnMtzDbDnca6CzhKj3Q8eF9cHCgcdTDdb5K+3aKyGWA0obug== + +"@algolia/cache-browser-local-storage@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.0.tgz#f8aa4fe31104b19d616ea392f9ed5c2ea847d964" + integrity sha512-nj1vHRZauTqP/bluwkRIgEADEimqojJgoTRCel5f6q8WCa9Y8QeI4bpDQP28FoeKnDRYa3J5CauDlN466jqRhg== + dependencies: + "@algolia/cache-common" "4.13.0" + +"@algolia/cache-common@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.13.0.tgz#27b83fd3939d08d72261b36a07eeafc4cb4d2113" + integrity sha512-f9mdZjskCui/dA/fA/5a+6hZ7xnHaaZI5tM/Rw9X8rRB39SUlF/+o3P47onZ33n/AwkpSbi5QOyhs16wHd55kA== + +"@algolia/cache-in-memory@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.13.0.tgz#10801a74550cbabb64b59ff08c56bce9c278ff2d" + integrity sha512-hHdc+ahPiMM92CQMljmObE75laYzNFYLrNOu0Q3/eyvubZZRtY2SUsEEgyUEyzXruNdzrkcDxFYa7YpWBJYHAg== + dependencies: + "@algolia/cache-common" "4.13.0" + +"@algolia/client-account@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.13.0.tgz#f8646dd40d1e9e3353e10abbd5d6c293ea92a8e2" + integrity sha512-FzFqFt9b0g/LKszBDoEsW+dVBuUe1K3scp2Yf7q6pgHWM1WqyqUlARwVpLxqyc+LoyJkTxQftOKjyFUqddnPKA== + dependencies: + "@algolia/client-common" "4.13.0" + "@algolia/client-search" "4.13.0" + "@algolia/transporter" "4.13.0" + +"@algolia/client-analytics@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.13.0.tgz#a00bd02df45d71becb9dd4c5c993d805f2e1786d" + integrity sha512-klmnoq2FIiiMHImkzOm+cGxqRLLu9CMHqFhbgSy9wtXZrqb8BBUIUE2VyBe7azzv1wKcxZV2RUyNOMpFqmnRZA== + dependencies: + "@algolia/client-common" "4.13.0" + "@algolia/client-search" "4.13.0" + "@algolia/requester-common" "4.13.0" + "@algolia/transporter" "4.13.0" + +"@algolia/client-common@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.13.0.tgz#8bc373d164dbdcce38b4586912bbe162492bcb86" + integrity sha512-GoXfTp0kVcbgfSXOjfrxx+slSipMqGO9WnNWgeMmru5Ra09MDjrcdunsiiuzF0wua6INbIpBQFTC2Mi5lUNqGA== + dependencies: + "@algolia/requester-common" "4.13.0" + "@algolia/transporter" "4.13.0" + +"@algolia/client-personalization@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.13.0.tgz#10fb7af356422551f11a67222b39c52306f1512c" + integrity sha512-KneLz2WaehJmNfdr5yt2HQETpLaCYagRdWwIwkTqRVFCv4DxRQ2ChPVW9jeTj4YfAAhfzE6F8hn7wkQ/Jfj6ZA== + dependencies: + "@algolia/client-common" "4.13.0" + "@algolia/requester-common" "4.13.0" + "@algolia/transporter" "4.13.0" + +"@algolia/client-search@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.13.0.tgz#2d8ff8e755c4a37ec89968f3f9b358eed005c7f0" + integrity sha512-blgCKYbZh1NgJWzeGf+caKE32mo3j54NprOf0LZVCubQb3Kx37tk1Hc8SDs9bCAE8hUvf3cazMPIg7wscSxspA== + dependencies: + "@algolia/client-common" "4.13.0" + "@algolia/requester-common" "4.13.0" + "@algolia/transporter" "4.13.0" + +"@algolia/logger-common@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.13.0.tgz#be2606e71aae618a1ff1ea9a1b5f5a74284b35a8" + integrity sha512-8yqXk7rMtmQJ9wZiHOt/6d4/JDEg5VCk83gJ39I+X/pwUPzIsbKy9QiK4uJ3aJELKyoIiDT1hpYVt+5ia+94IA== + +"@algolia/logger-console@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.13.0.tgz#f28028a760e3d9191e28a10b12925e48f6c9afde" + integrity sha512-YepRg7w2/87L0vSXRfMND6VJ5d6699sFJBRWzZPOlek2p5fLxxK7O0VncYuc/IbVHEgeApvgXx0WgCEa38GVuQ== + dependencies: + "@algolia/logger-common" "4.13.0" + +"@algolia/requester-browser-xhr@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.0.tgz#e2483f4e8d7f09e27cd0daf6c77711d15c5a919f" + integrity sha512-Dj+bnoWR5MotrnjblzGKZ2kCdQi2cK/VzPURPnE616NU/il7Ypy6U6DLGZ/ZYz+tnwPa0yypNf21uqt84fOgrg== + dependencies: + "@algolia/requester-common" "4.13.0" + +"@algolia/requester-common@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.13.0.tgz#47fb3464cfb26b55ba43676d13f295d812830596" + integrity sha512-BRTDj53ecK+gn7ugukDWOOcBRul59C4NblCHqj4Zm5msd5UnHFjd/sGX+RLOEoFMhetILAnmg6wMrRrQVac9vw== + +"@algolia/requester-node-http@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.13.0.tgz#7d981bbd31492f51dd11820a665f9d8906793c37" + integrity sha512-9b+3O4QFU4azLhGMrZAr/uZPydvzOR4aEZfSL8ZrpLZ7fbbqTO0S/5EVko+QIgglRAtVwxvf8UJ1wzTD2jvKxQ== + dependencies: + "@algolia/requester-common" "4.13.0" + +"@algolia/transporter@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.13.0.tgz#f6379e5329efa2127da68c914d1141f5f21dbd07" + integrity sha512-8tSQYE+ykQENAdeZdofvtkOr5uJ9VcQSWgRhQ9h01AehtBIPAczk/b2CLrMsw5yQZziLs5cZ3pJ3478yI+urhA== + dependencies: + "@algolia/cache-common" "4.13.0" + "@algolia/logger-common" "4.13.0" + "@algolia/requester-common" "4.13.0" + +"@babel/parser@^7.16.4": + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.8.tgz#2817fb9d885dd8132ea0f8eb615a6388cca1c240" + integrity sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ== + +"@docsearch/css@3.0.0", "@docsearch/css@^3.0.0-alpha.41": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.0.0.tgz#fe57b474802ffd706d3246eab25d52fac8aa3698" + integrity sha512-1kkV7tkAsiuEd0shunYRByKJe3xQDG2q7wYg24SOw1nV9/2lwEd4WrUYRJC/ukGTl2/kHeFxsaUvtiOy0y6fFA== + +"@docsearch/js@^3.0.0-alpha.41": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@docsearch/js/-/js-3.0.0.tgz#394a99f68895503d57faf523ecec0b25b02f638c" + integrity sha512-j3tUJWlgW3slYqzGB8fm7y05kh2qqrIK1dZOXHeMUm/5gdKE85fiz/ltfCPMDFb/MXF+bLZChJXSMzqY0Ck30Q== + dependencies: + "@docsearch/react" "3.0.0" + preact "^10.0.0" + +"@docsearch/react@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.0.0.tgz#d02ebdc67573412185a6a4df13bc254c7c0da491" + integrity sha512-yhMacqS6TVQYoBh/o603zszIb5Bl8MIXuOc6Vy617I74pirisDzzcNh0NEaYQt50fVVR3khUbeEhUEWEWipESg== + dependencies: + "@algolia/autocomplete-core" "1.5.2" + "@algolia/autocomplete-preset-algolia" "1.5.2" + "@docsearch/css" "3.0.0" + algoliasearch "^4.0.0" + +"@vitejs/plugin-vue@^2.2.0": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-2.2.4.tgz#ab8b199ca82496b05d2654c5f34ffcf9b947243d" + integrity sha512-ev9AOlp0ljCaDkFZF3JwC/pD2N4Hh+r5srl5JHM6BKg5+99jiiK0rE/XaRs3pVm1wzyKkjUy/StBSoXX5fFzcw== + +"@vue/compiler-core@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.31.tgz#d38f06c2cf845742403b523ab4596a3fda152e89" + integrity sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/shared" "3.2.31" + estree-walker "^2.0.2" + source-map "^0.6.1" + +"@vue/compiler-dom@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz#b1b7dfad55c96c8cc2b919cd7eb5fd7e4ddbf00e" + integrity sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg== + dependencies: + "@vue/compiler-core" "3.2.31" + "@vue/shared" "3.2.31" + +"@vue/compiler-sfc@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz#d02b29c3fe34d599a52c5ae1c6937b4d69f11c2f" + integrity sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.31" + "@vue/compiler-dom" "3.2.31" + "@vue/compiler-ssr" "3.2.31" + "@vue/reactivity-transform" "3.2.31" + "@vue/shared" "3.2.31" + estree-walker "^2.0.2" + magic-string "^0.25.7" + postcss "^8.1.10" + source-map "^0.6.1" + +"@vue/compiler-ssr@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz#4fa00f486c9c4580b40a4177871ebbd650ecb99c" + integrity sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw== + dependencies: + "@vue/compiler-dom" "3.2.31" + "@vue/shared" "3.2.31" + +"@vue/reactivity-transform@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz#0f5b25c24e70edab2b613d5305c465b50fc00911" + integrity sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.31" + "@vue/shared" "3.2.31" + estree-walker "^2.0.2" + magic-string "^0.25.7" + +"@vue/reactivity@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.31.tgz#fc90aa2cdf695418b79e534783aca90d63a46bbd" + integrity sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw== + dependencies: + "@vue/shared" "3.2.31" + +"@vue/runtime-core@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.31.tgz#9d284c382f5f981b7a7b5971052a1dc4ef39ac7a" + integrity sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA== + dependencies: + "@vue/reactivity" "3.2.31" + "@vue/shared" "3.2.31" + +"@vue/runtime-dom@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.31.tgz#79ce01817cb3caf2c9d923f669b738d2d7953eff" + integrity sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g== + dependencies: + "@vue/runtime-core" "3.2.31" + "@vue/shared" "3.2.31" + csstype "^2.6.8" + +"@vue/server-renderer@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.31.tgz#201e9d6ce735847d5989403af81ef80960da7141" + integrity sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg== + dependencies: + "@vue/compiler-ssr" "3.2.31" + "@vue/shared" "3.2.31" + +"@vue/shared@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.31.tgz#c90de7126d833dcd3a4c7534d534be2fb41faa4e" + integrity sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ== + +algoliasearch@^4.0.0: + version "4.13.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.13.0.tgz#e36611fda82b1fc548c156ae7929a7f486e4b663" + integrity sha512-oHv4faI1Vl2s+YC0YquwkK/TsaJs79g2JFg5FDm2rKN12VItPTAeQ7hyJMHarOPPYuCnNC5kixbtcqvb21wchw== + dependencies: + "@algolia/cache-browser-local-storage" "4.13.0" + "@algolia/cache-common" "4.13.0" + "@algolia/cache-in-memory" "4.13.0" + "@algolia/client-account" "4.13.0" + "@algolia/client-analytics" "4.13.0" + "@algolia/client-common" "4.13.0" + "@algolia/client-personalization" "4.13.0" + "@algolia/client-search" "4.13.0" + "@algolia/logger-common" "4.13.0" + "@algolia/logger-console" "4.13.0" + "@algolia/requester-browser-xhr" "4.13.0" + "@algolia/requester-common" "4.13.0" + "@algolia/requester-node-http" "4.13.0" + "@algolia/transporter" "4.13.0" + +csstype@^2.6.8: + version "2.6.20" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.20.tgz#9229c65ea0b260cf4d3d997cb06288e36a8d6dda" + integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA== + +esbuild-android-64@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.27.tgz#b868bbd9955a92309c69df628d8dd1945478b45c" + integrity sha512-LuEd4uPuj/16Y8j6kqy3Z2E9vNY9logfq8Tq+oTE2PZVuNs3M1kj5Qd4O95ee66yDGb3isaOCV7sOLDwtMfGaQ== + +esbuild-android-arm64@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.27.tgz#e7d6430555e8e9c505fd87266bbc709f25f1825c" + integrity sha512-E8Ktwwa6vX8q7QeJmg8yepBYXaee50OdQS3BFtEHKrzbV45H4foMOeEE7uqdjGQZFBap5VAqo7pvjlyA92wznQ== + +esbuild-darwin-64@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.27.tgz#4dc7484127564e89b4445c0a560a3cb50b3d68e1" + integrity sha512-czw/kXl/1ZdenPWfw9jDc5iuIYxqUxgQ/Q+hRd4/3udyGGVI31r29LCViN2bAJgGvQkqyLGVcG03PJPEXQ5i2g== + +esbuild-darwin-arm64@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.27.tgz#469e59c665f84a8ed323166624c5e7b9b2d22ac1" + integrity sha512-BEsv2U2U4o672oV8+xpXNxN9bgqRCtddQC6WBh4YhXKDcSZcdNh7+6nS+DM2vu7qWIWNA4JbRG24LUUYXysimQ== + +esbuild-freebsd-64@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.27.tgz#895df03bf5f87094a56c9a5815bf92e591903d70" + integrity sha512-7FeiFPGBo+ga+kOkDxtPmdPZdayrSzsV9pmfHxcyLKxu+3oTcajeZlOO1y9HW+t5aFZPiv7czOHM4KNd0tNwCA== + +esbuild-freebsd-arm64@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.27.tgz#0b72a41a6b8655e9a8c5608f2ec1afdcf6958441" + integrity sha512-8CK3++foRZJluOWXpllG5zwAVlxtv36NpHfsbWS7TYlD8S+QruXltKlXToc/5ZNzBK++l6rvRKELu/puCLc7jA== + +esbuild-linux-32@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.27.tgz#43b8ba3803b0bbe7f051869c6a8bf6de1e95de28" + integrity sha512-qhNYIcT+EsYSBClZ5QhLzFzV5iVsP1YsITqblSaztr3+ZJUI+GoK8aXHyzKd7/CKKuK93cxEMJPpfi1dfsOfdw== + +esbuild-linux-64@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.27.tgz#dc8072097327ecfadba1735562824ce8c05dd0bd" + integrity sha512-ESjck9+EsHoTaKWlFKJpPZRN26uiav5gkI16RuI8WBxUdLrrAlYuYSndxxKgEn1csd968BX/8yQZATYf/9+/qg== + +esbuild-linux-arm64@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.27.tgz#c52b58cbe948426b1559910f521b0a3f396f10b8" + integrity sha512-no6Mi17eV2tHlJnqBHRLekpZ2/VYx+NfGxKcBE/2xOMYwctsanCaXxw4zapvNrGE9X38vefVXLz6YCF8b1EHiQ== + +esbuild-linux-arm@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.27.tgz#df869dbd67d4ee3a04b3c7273b6bd2b233e78a18" + integrity sha512-JnnmgUBdqLQO9hoNZQqNHFWlNpSX82vzB3rYuCJMhtkuaWQEmQz6Lec1UIxJdC38ifEghNTBsF9bbe8dFilnCw== + +esbuild-linux-mips64le@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.27.tgz#a2b646d9df368b01aa970a7b8968be6dd6b01d19" + integrity sha512-NolWP2uOvIJpbwpsDbwfeExZOY1bZNlWE/kVfkzLMsSgqeVcl5YMen/cedRe9mKnpfLli+i0uSp7N+fkKNU27A== + +esbuild-linux-ppc64le@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.27.tgz#9a21af766a0292578a3009c7408b8509cac7cefd" + integrity sha512-/7dTjDvXMdRKmsSxKXeWyonuGgblnYDn0MI1xDC7J1VQXny8k1qgNp6VmrlsawwnsymSUUiThhkJsI+rx0taNA== + +esbuild-linux-riscv64@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.27.tgz#344a27f91568056a5903ad5841b447e00e78d740" + integrity sha512-D+aFiUzOJG13RhrSmZgrcFaF4UUHpqj7XSKrIiCXIj1dkIkFqdrmqMSOtSs78dOtObWiOrFCDDzB24UyeEiNGg== + +esbuild-linux-s390x@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.27.tgz#73a7309bd648a07ef58f069658f989a5096130db" + integrity sha512-CD/D4tj0U4UQjELkdNlZhQ8nDHU5rBn6NGp47Hiz0Y7/akAY5i0oGadhEIg0WCY/HYVXFb3CsSPPwaKcTOW3bg== + +esbuild-netbsd-64@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.27.tgz#482a587cdbd18a6c264a05136596927deb46c30a" + integrity sha512-h3mAld69SrO1VoaMpYl3a5FNdGRE/Nqc+E8VtHOag4tyBwhCQXxtvDDOAKOUQexBGca0IuR6UayQ4ntSX5ij1Q== + +esbuild-openbsd-64@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.27.tgz#e99f8cdc63f1628747b63edd124d53cf7796468d" + integrity sha512-xwSje6qIZaDHXWoPpIgvL+7fC6WeubHHv18tusLYMwL+Z6bEa4Pbfs5IWDtQdHkArtfxEkIZz77944z8MgDxGw== + +esbuild-sunos-64@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.27.tgz#8611d825bcb8239c78d57452e83253a71942f45c" + integrity sha512-/nBVpWIDjYiyMhuqIqbXXsxBc58cBVH9uztAOIfWShStxq9BNBik92oPQPJ57nzWXRNKQUEFWr4Q98utDWz7jg== + +esbuild-windows-32@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.27.tgz#c06374206d4d92dd31d4fda299b09f51a35e82f6" + integrity sha512-Q9/zEjhZJ4trtWhFWIZvS/7RUzzi8rvkoaS9oiizkHTTKd8UxFwn/Mm2OywsAfYymgUYm8+y2b+BKTNEFxUekw== + +esbuild-windows-64@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.27.tgz#756631c1d301dfc0d1a887deed2459ce4079582f" + integrity sha512-b3y3vTSl5aEhWHK66ngtiS/c6byLf6y/ZBvODH1YkBM+MGtVL6jN38FdHUsZasCz9gFwYs/lJMVY9u7GL6wfYg== + +esbuild-windows-arm64@0.14.27: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.27.tgz#ad7e187193dcd18768b16065a950f4441d7173f4" + integrity sha512-I/reTxr6TFMcR5qbIkwRGvldMIaiBu2+MP0LlD7sOlNXrfqIl9uNjsuxFPGEG4IRomjfQ5q8WT+xlF/ySVkqKg== + +esbuild@^0.14.14: + version "0.14.27" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.27.tgz#41fe0f1b6b68b9f77cac025009bc54bb96e616f1" + integrity sha512-MZQt5SywZS3hA9fXnMhR22dv0oPGh6QtjJRIYbgL1AeqAoQZE+Qn5ppGYQAoHv/vq827flj4tIJ79Mrdiwk46Q== + optionalDependencies: + esbuild-android-64 "0.14.27" + esbuild-android-arm64 "0.14.27" + esbuild-darwin-64 "0.14.27" + esbuild-darwin-arm64 "0.14.27" + esbuild-freebsd-64 "0.14.27" + esbuild-freebsd-arm64 "0.14.27" + esbuild-linux-32 "0.14.27" + esbuild-linux-64 "0.14.27" + esbuild-linux-arm "0.14.27" + esbuild-linux-arm64 "0.14.27" + esbuild-linux-mips64le "0.14.27" + esbuild-linux-ppc64le "0.14.27" + esbuild-linux-riscv64 "0.14.27" + esbuild-linux-s390x "0.14.27" + esbuild-netbsd-64 "0.14.27" + esbuild-openbsd-64 "0.14.27" + esbuild-sunos-64 "0.14.27" + esbuild-windows-32 "0.14.27" + esbuild-windows-64 "0.14.27" + esbuild-windows-arm64 "0.14.27" + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + +magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +nanoid@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +postcss@^8.1.10, postcss@^8.4.6: + version "8.4.12" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.12.tgz#1e7de78733b28970fa4743f7da6f3763648b1905" + integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg== + dependencies: + nanoid "^3.3.1" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +preact@^10.0.0: + version "10.6.6" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.6.6.tgz#f1899bc8dab7c0788b858481532cb3b5d764a520" + integrity sha512-dgxpTFV2vs4vizwKohYKkk7g7rmp1wOOcfd4Tz3IB3Wi+ivZzsn/SpeKJhRENSE+n8sUfsAl4S3HiCVT923ABw== + +prismjs@^1.25.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" + integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== + +resolve@^1.22.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rollup@^2.59.0: + version "2.70.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.70.1.tgz#824b1f1f879ea396db30b0fc3ae8d2fead93523e" + integrity sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA== + optionalDependencies: + fsevents "~2.3.2" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +vite@^2.8.1: + version "2.8.6" + resolved "https://registry.yarnpkg.com/vite/-/vite-2.8.6.tgz#32d50e23c99ca31b26b8ccdc78b1d72d4d7323d3" + integrity sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug== + dependencies: + esbuild "^0.14.14" + postcss "^8.4.6" + resolve "^1.22.0" + rollup "^2.59.0" + optionalDependencies: + fsevents "~2.3.2" + +vitepress@^0.22.3: + version "0.22.3" + resolved "https://registry.yarnpkg.com/vitepress/-/vitepress-0.22.3.tgz#5d29741497fa4dd4d08e65d529310cf92897b52f" + integrity sha512-Yfvu/rent2vp/TXIDZMutS6ft2TJPn4xngS48PYFWDEbuFI2ccUAXM481lF1qVVnCKxfh4g8e/KPvevSJdg1Bw== + dependencies: + "@docsearch/css" "^3.0.0-alpha.41" + "@docsearch/js" "^3.0.0-alpha.41" + "@vitejs/plugin-vue" "^2.2.0" + prismjs "^1.25.0" + vite "^2.8.1" + vue "^3.2.31" + +vue@^3.2.31: + version "3.2.31" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.31.tgz#e0c49924335e9f188352816788a4cca10f817ce6" + integrity sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw== + dependencies: + "@vue/compiler-dom" "3.2.31" + "@vue/compiler-sfc" "3.2.31" + "@vue/runtime-dom" "3.2.31" + "@vue/server-renderer" "3.2.31" + "@vue/shared" "3.2.31"