18 |
--------------------------------------------------------------------------------
/components/02-elements/price/_price.scss:
--------------------------------------------------------------------------------
1 | $price__spacing : $spacer !default;
2 | $price__color--special : $green !default;
3 | $price__font-weight : $font-weight-bold !default;
4 | $price__font-weight--old : $font-weight-normal !default;
5 | $price__font-weight--special: $font-weight-bold !default;
6 |
7 | .price {
8 | &__value {
9 | font-weight: $price__font-weight;
10 |
11 | &--old {
12 | text-decoration: line-through;
13 | font-weight: $price__font-weight--old;
14 | margin-right: $price__spacing;
15 | }
16 |
17 | &--special {
18 | color: $price__color--special;
19 | font-weight: $price__font-weight--special;
20 |
21 | & > ins {
22 | text-decoration: none;
23 | }
24 | }
25 |
26 | &--between {
27 | display: block;
28 |
29 | &:last-child {
30 | margin-top: $price__spacing;
31 | }
32 | }
33 | }
34 |
35 | &__text {
36 | font-weight: $price__font-weight--old;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/components/02-elements/price/price.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | name: 'price',
3 | context: {
4 | regularPrice: '1 400.00',
5 | specialPrice: '',
6 | prefix: {
7 | tag: '',
8 | text: '$'
9 | },
10 | suffix: {
11 | tag: '',
12 | text: ''
13 | },
14 | },
15 | variants: [
16 | {
17 | name: 'with-special-price',
18 | context: {
19 | oldPriceClass: '',
20 | prefix: {
21 | tag: '',
22 | closingTag: '',
23 | text: '$'
24 | },
25 | regularPrice: '1 400.00',
26 | regularPriceClass: '',
27 | specialPrice: '1 299.99',
28 | specialPriceClass: '',
29 | suffix: {
30 | tag: '',
31 | closingTag: '',
32 | text: ''
33 | },
34 | }
35 | },
36 | {
37 | name: 'between',
38 | context: {
39 | priceClass: 'price__value--between',
40 | textBeforeFromPrice: 'From',
41 | textBeforeToPrice: 'To',
42 | fromPrice: '61.00',
43 | toPrice: '79.00',
44 | }
45 | }
46 | ]
47 | }
48 |
--------------------------------------------------------------------------------
/components/02-elements/price/price.hbs:
--------------------------------------------------------------------------------
1 |
20 |
--------------------------------------------------------------------------------
/components/02-elements/rating/README.md:
--------------------------------------------------------------------------------
1 | # Rating component
2 |
3 | ## Accessible rating
4 | * Rating component (which shows the average rate) should be focusable (`tabindex="0"`) and should have `aria-label` set with descriptive value and average rating value.
5 | * Rating--rate component has to be usable with keyboard.
6 | It acts like a small form with `input type="button"` behing the stars. moving focus we see that background changes and with space click we can set the field selected/star active.
7 |
8 | What should be done to keep it working for AT:
9 | * keep ratio inputs in `fieldset` and add `legend` to set some label
10 | * use `role="listbox"` `aria-required="true"` and `aria-labelledby="
"` to make list of options with required rating field
11 | * use `role="option"` & `aria-selected` on the input radio wrapper
12 | * use `aria-label` for input radio `label` elements
13 |
--------------------------------------------------------------------------------
/components/02-elements/rating/rating.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | context: {
3 | ariaLabel: 'Average rating: 72%',
4 | title: 'Average rating: 72%',
5 | star: {
6 | attributes: 'style="width: 72%"'
7 | }
8 | },
9 | variants: [
10 | {
11 | name: 'rate',
12 | context: {
13 | script: true,
14 | star: {
15 | attributes: ''
16 | },
17 | rateItems: [
18 | {
19 | id: 'Rating_1',
20 | name: 'ratings[1]',
21 | labelText: 'Rate option, 1 of 5. Click to vote'
22 | },
23 | {
24 | id: 'Rating_2',
25 | name: 'ratings[2]',
26 | labelText: 'Rate option, 2 of 5. Click to vote'
27 | },
28 | {
29 | id: 'Rating_3',
30 | name: 'ratings[3]',
31 | labelText: 'Rate option, 3 of 5. Click to vote'
32 | },
33 | {
34 | id: 'Rating_4',
35 | name: 'ratings[4]',
36 | labelText: 'Rate option, 4 of 5. Click to vote'
37 | },
38 | {
39 | id: 'Rating_5',
40 | name: 'ratings[5]',
41 | labelText: 'Rate option, 5 of 5. Click to vote'
42 | }
43 | ]
44 | }
45 | }
46 | ]
47 | }
48 |
--------------------------------------------------------------------------------
/components/02-elements/rating/rating.hbs:
--------------------------------------------------------------------------------
1 |
22 |
--------------------------------------------------------------------------------
/components/02-elements/skip-nav/_skip-nav.scss:
--------------------------------------------------------------------------------
1 | .skip-nav {
2 | @include visually-hidden('focus');
3 | padding: 12px $spacer--extra-large;
4 | top: 0;
5 | left: 0;
6 |
7 | &.focus-visible,
8 | &:hover {
9 | position: absolute;
10 | margin: $spacer;
11 | background-color: $color-primary;
12 | color: $black;
13 | }
14 |
15 | &--relative {
16 | &.focus-visible,
17 | &:hover {
18 | display: block;
19 | position: relative;
20 | margin: $spacer--medium;
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/components/02-elements/skip-nav/skip-nav--list.hbs:
--------------------------------------------------------------------------------
1 |
13 |
14 | {{#if script}}
15 |
16 | {{/if}}
17 |
--------------------------------------------------------------------------------
/components/02-elements/skip-nav/skip-nav.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | context: {
3 | text: 'Skip to content',
4 | anchor: '#maincontent',
5 | script: true
6 | },
7 | variants: [
8 | {
9 | name: 'list',
10 | context: {
11 | anchor: [
12 | {
13 | value: '#header',
14 | text: 'Go to top'
15 | },
16 | {
17 | value: '#maincontent',
18 | text: 'Go to main content'
19 | }
20 | ]
21 | }
22 | }
23 | ]
24 | }
25 |
--------------------------------------------------------------------------------
/components/02-elements/skip-nav/skip-nav.hbs:
--------------------------------------------------------------------------------
1 |
5 | {{ text }}
6 |
7 | {{#if script}}
8 |
9 | {{/if}}
10 |
--------------------------------------------------------------------------------
/components/02-elements/skip-nav/skip-nav.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | const skipNavLink = document.querySelector('.skip-nav');
3 |
4 | function skipNavigation(skipElem) {
5 | skipElem.addEventListener('click', (e) => {
6 | let targetElem = document.querySelector(e.target.hash);
7 | if (targetElem) {
8 | targetElem.setAttribute('tabindex', -1)
9 | targetElem.focus();
10 | targetElem.addEventListener('focusout', (e) => {
11 | e.target.removeAttribute('tabindex');
12 | })
13 | }
14 | })
15 | }
16 |
17 | skipNavigation(skipNavLink);
18 |
--------------------------------------------------------------------------------
/components/02-elements/swatch/README.md:
--------------------------------------------------------------------------------
1 | # Swatches accessibility
2 |
3 | Swatches require following aria structure to be accessible for assistive technology and keyboard:
4 |
5 | 1. Swatches wrapper `.swatch__wrapper` should have following aria attributes:
6 | * `role="listbox"` to easy list swatch's options
7 | * `aria-activedescendant` with value of selected swatch option
8 | * `tabindex="0"` to make element focusable
9 | * `aria-required` with value `true` or `false` depending if swatch option is required
10 | * `aria-invalid` with value `true` if required field is not filled (if none of options is selected) or with the value `false` if required field is field (option is selected)
11 |
12 | 2. Swatch option `.swatch__option` should have following aria attributes:
13 | * `role="option"` to show options of swatch
14 | * `tabindex="0"` to make element focusable
15 | * `aria-label` with value of the name/label of swatch option if the swatch option is not a text but graphic element - icon or image (color option - ex: "Green")
16 | * `aria-describedby` with value of the listbox label/heading if exist
17 | * `aria-selected` with value `true` if the option was selected
18 |
--------------------------------------------------------------------------------
/components/02-elements/swatch/swatch.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{#if heading}}
3 | <{{{ heading.tag }}}
4 | id="{{ heading.id }}"
5 | class="swatch__title {{ heading.class }}"
6 | >
7 | {{ heading.text }}
8 | {{{ heading.tag }}}>
9 | {{/if}}
10 |
11 |
15 | {{#each options }}
16 |
24 |
28 | {{ this.text }}
29 |
30 |
31 | {{/each }}
32 |
33 |
34 |
35 | {{#if script}}
36 |
37 | {{/if}}
38 |
--------------------------------------------------------------------------------
/components/02-elements/swatch/swatch.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | (function() { // eslint-disable-line
4 | const swatchWrapper = document.querySelector('.swatch__wrapper'),
5 | swatchOptions = swatchWrapper.querySelectorAll('.swatch__option-container');
6 |
7 | swatchOptions.forEach(option => {
8 | option.addEventListener('click', () => {
9 | swatchOptions.forEach(option => {
10 | option.classList.remove('selected');
11 | option.setAttribute('aria-selected', 'false');
12 | })
13 |
14 | option.classList.add('selected');
15 | swatchWrapper.setAttribute('aria-activedescendant', option.id);
16 | option.setAttribute('aria-selected', 'true');
17 | })
18 | })
19 | })();
20 |
--------------------------------------------------------------------------------
/components/02-elements/table/README.md:
--------------------------------------------------------------------------------
1 | # Tables accessibility
2 |
3 | * Use table semantics elements: `table`, `tbody`, `tr`, `th`, `td`
4 | * Use `scope="col"` or `scope="row"` for table headings (`th` elements)
5 | * use `capion` element to describe what kind of data are presented in the table
6 | * To make mobile table accessible, please add apropriate aria roles:
7 | * `role="columnheader"` for `th` elements
8 | * `role="row"` for `row` elements
9 | * `role="gridcell"` for `td` elements
10 |
11 | In desktop mode (wide screens) HTML5 tags are sufficient to make HTML table accessible. However, we change display mode on small screen to set our table visible without horizontal scrolling, so we need to ad apropriate aria roles to make it focusable and well read by AT.
12 |
--------------------------------------------------------------------------------
/components/03-modules/active-filters/active-filters.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | context: {
3 | clear: {
4 | href: '#',
5 | text: 'Clear all',
6 | title: 'Clear all filters',
7 | },
8 | filters: [
9 | {
10 | label: 'Label',
11 | value: 'Value',
12 | ariaLabel: 'Disable filter: Label - Value',
13 | icon: {
14 | id: 'close',
15 | title: 'Close',
16 | class: 'active-filters__remove-icon'
17 | }
18 | },
19 | {
20 | label: 'Label',
21 | value: 'Value',
22 | ariaLabel: 'Disable filter: Label - Value',
23 | icon: {
24 | id: 'close',
25 | title: 'Close',
26 | class: 'active-filters__remove-icon'
27 | }
28 | },
29 | {
30 | label: 'Label',
31 | value: 'Value',
32 | ariaLabel: 'Disable filter: Label - Value',
33 | icon: {
34 | id: 'close',
35 | title: 'Close',
36 | class: 'active-filters__remove-icon'
37 | }
38 | }
39 | ]
40 | }
41 | };
42 |
--------------------------------------------------------------------------------
/components/03-modules/active-filters/active-filters.hbs:
--------------------------------------------------------------------------------
1 |
28 |
--------------------------------------------------------------------------------
/components/03-modules/additional-content/_additional-content.scss:
--------------------------------------------------------------------------------
1 | $additional-content__image-margin : 0 0 41px !default;
2 | $additional-content__image-margin\@large : 0 0 32px !default;
3 | $additional-section-width : 48% !default;
4 | .additional-content {
5 | &__image {
6 | margin: $additional-content__image-margin;
7 | @include mq($screen-l) {
8 | margin: $additional-content__image-margin\@large;
9 | }
10 | }
11 | &__info {
12 | @include mq($screen-l) {
13 | display: flex;
14 | flex-flow: row nowrap;
15 | justify-content: space-between;
16 | }
17 |
18 | }
19 | &__section {
20 | @include mq($screen-l) {
21 | flex: 0 0 $additional-section-width;
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/components/03-modules/additional-content/additional-content.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | context: {
3 | class: '',
4 | contentInfo: {
5 | class: ''
6 | },
7 | image: {
8 | class: 'additional-content__image',
9 | defaultSrc: '',
10 | sources: [
11 | {
12 | src: '/images/product-view/banner.jpg',
13 | mediaQuery: '(min-width: 768px)'
14 | }
15 | ],
16 | alt: 'image alt text'
17 | },
18 | firstSection: {
19 | class: '',
20 | html: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.
'
21 | },
22 | secondSection: {
23 | class: '',
24 | html: 'It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
'
25 | }
26 | }
27 | };
28 |
--------------------------------------------------------------------------------
/components/03-modules/additional-content/additional-content.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@image--picture' image }}
3 |
4 |
5 | {{{ firstSection.html }}}
6 |
7 |
8 | {{{ secondSection.html }}}
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/components/03-modules/brief-info/brief-info.hbs:
--------------------------------------------------------------------------------
1 |
2 | <{{heading.tag}} class="brief-info__heading {{heading.class}}">
3 | {{heading.text}}
4 | {{heading.tag}}>
5 |
25 |
26 |
--------------------------------------------------------------------------------
/components/03-modules/bundle-option/bundle-option--checkbox.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{#if title}}
3 | <{{{title.tag}}} class="bundle-option__title">
4 | {{ title.message }}
5 | {{{title.tag}}}>
6 | {{/if}}
7 |
8 | {{#each checkboxes }}
9 | {{ render '@checkbox' this merge=true }}
10 | {{/each}}
11 |
12 | {{#if qty }}
13 | {{ render '@input' qty merge=true }}
14 | {{/if}}
15 |
16 |
--------------------------------------------------------------------------------
/components/03-modules/bundle-option/bundle-option--select.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{#if title}}
3 | <{{{title.tag}}} class="bundle-option__title">
4 | {{ title.message }}
5 | {{{title.tag}}}>
6 | {{/if}}
7 |
8 | {{ render '@select' select merge=true }}
9 |
10 | {{#if qty }}
11 | {{ render '@input' qty merge=true }}
12 | {{/if}}
13 |
14 |
--------------------------------------------------------------------------------
/components/03-modules/bundle-option/bundle-option.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{#if title}}
3 | <{{{title.tag}}} class="bundle-option__title">
4 | {{ title.message }}
5 | {{{title.tag}}}>
6 | {{/if}}
7 |
8 | {{ render '@radio' radio merge=true }}
9 |
10 | {{#if qty }}
11 | {{ render '@input' qty merge=true }}
12 | {{/if}}
13 |
14 |
--------------------------------------------------------------------------------
/components/03-modules/cart-list-item/cart-list-item.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{ render '@image' productImage }}
4 |
5 |
6 |
7 |
8 | {{ productName }}
9 |
10 |
11 |
12 | {{ render '@input' qtyInput }}
13 |
14 |
15 | {{ productPrice }}
16 |
17 |
18 | {{ render '@list--description' attributes }}
19 |
20 |
21 | {{ render '@button--icon' editIcon }}
22 | {{ render '@button--icon' removeIcon }}
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/components/03-modules/dashboard/actions-toolbar/_actions-toolbar.scss:
--------------------------------------------------------------------------------
1 | $dashboard-actions-toolbar__margin : 0 !default;
2 | $dashboard-actions-toolbar__item-margin : $spacer 0 0 0 !default;
3 | $dashboard-actions-toolbar__item-margin\@medium: 0 $spacer 0 0 !default;
4 |
5 | .dashboard-actions-toolbar {
6 | display: flex;
7 | flex-direction: column;
8 | margin: $dashboard-actions-toolbar__margin;
9 |
10 | @include mq($screen-m) {
11 | flex-direction: row;
12 | }
13 |
14 | &__item {
15 | margin: $dashboard-actions-toolbar__item-margin;
16 |
17 | @include mq($screen-m) {
18 | margin: $dashboard-actions-toolbar__item-margin\@medium;
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/components/03-modules/dashboard/actions-toolbar/actions-toolbar.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | label: 'Actions toolbar',
3 | name: 'dashboard-actions-toolbar',
4 | context: {
5 | buttons: [
6 | {
7 | tag: 'button',
8 | class: 'dashboard-actions-toolbar__item',
9 | attributes: 'type="button"',
10 | text: 'Action 1'
11 | },
12 | {
13 | tag: 'button',
14 | class: 'dashboard-actions-toolbar__item',
15 | attributes: 'type="button"',
16 | text: 'Action 2'
17 | },
18 | ]
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/components/03-modules/dashboard/actions-toolbar/actions-toolbar.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{#each buttons }}
3 | {{ render '@button' this }}
4 | {{/each}}
5 |
6 |
--------------------------------------------------------------------------------
/components/03-modules/dashboard/form/_form.scss:
--------------------------------------------------------------------------------
1 | $dashborad-form-margin: 30px !default;
2 |
3 | .dashboard-form {
4 | &__title {
5 | margin-bottom: $dashborad-form-margin;
6 | padding-bottom: 10px;
7 | border-bottom: 1px solid $gray;
8 | }
9 |
10 | &__divider,
11 | &__select {
12 | margin-bottom: $dashborad-form-margin;
13 | }
14 |
15 | &--hidden {
16 | display: none;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/components/03-modules/dashboard/items/_items.scss:
--------------------------------------------------------------------------------
1 | $dashboard-items-padding : 15px !default;
2 | $dashboard-items-margin : 15px !default;
3 | $dashboard-items__item-max-width : calc(50% - #{$spacer--medium}) !default;
4 | $dashboard-items__item-margin : 15px $spacer--medium 15px 0 !default;
5 |
6 | .dashboard-items {
7 | &__title {
8 | margin-bottom: $dashboard-items-margin;
9 | padding-bottom: 10px;
10 | border-bottom: 1px solid $gray;
11 | }
12 |
13 | &__content {
14 | margin: 0;
15 | }
16 |
17 | &__address {
18 | margin-bottom: $dashboard-items-margin;
19 | }
20 |
21 | &__item {
22 | max-width: $dashboard-items__item-max-width;
23 | margin: $dashboard-items__item-margin;
24 | padding: $dashboard-items-padding 0;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/components/03-modules/dashboard/items/items.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | label: 'Items',
3 | name: 'dashboard-items',
4 | context: {
5 | title: 'Addresses',
6 | informations: [
7 | {
8 | title: 'Contact information',
9 | class: 'col-sm-3',
10 | information: 'qweqwe qwe qwe@qwe.com',
11 | actions: {
12 | links: [
13 | {
14 | title: 'Edit'
15 | },
16 | {
17 | title: 'Change password'
18 | }
19 | ]
20 | }
21 | },
22 | {
23 | title: 'Address second',
24 | class: 'col-sm-3',
25 | information: 'Second address qwe@qwe.com',
26 | actions: {
27 | links: [
28 | {
29 | title: 'Edit'
30 | }
31 | ]
32 | }
33 | }
34 | ]
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/components/03-modules/dashboard/items/items.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{#if title }}
3 |
4 | {{ title }}
5 |
6 | {{/if}}
7 | {{#if informations }}
8 |
9 | {{#each informations }}
10 |
11 | {{#if this.title }}
12 |
13 | {{ this.title }}
14 |
15 | {{/if}}
16 | {{#if this.information }}
17 |
18 | {{ this.information }}
19 |
20 | {{/if}}
21 | {{#if actions }}
22 | {{> '@action' actions }}
23 | {{/if}}
24 |
25 | {{/each}}
26 |
27 | {{/if}}
28 |
29 |
--------------------------------------------------------------------------------
/components/03-modules/dashboard/nav/nav.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{ actualPage }}
4 |
5 |
6 |
7 |
8 | {{ title }}
9 |
10 |
11 | {{> '@list--link' list }}
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/components/03-modules/dashboard/nav/nav.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 |
3 | const content = document.querySelector('.dashboard-nav__content'),
4 | currentItem = content.querySelector('.dashboard-nav__item.current'),
5 | mobileNav = document.querySelector('.dashboard-nav__mobile');
6 |
7 | mobileNav.innerHTML = currentItem.textContent;
8 |
9 | mobileNav.addEventListener('click', () => {
10 | mobileNav.classList.toggle('dashboard-nav__mobile--active');
11 | content.classList.toggle('dashboard-nav__content--visible');
12 | });
13 |
--------------------------------------------------------------------------------
/components/03-modules/dashboard/table/_table.scss:
--------------------------------------------------------------------------------
1 | $dashboard-table-margin: $spacer--medium !default;
2 |
3 | .dashboard-table {
4 | overflow: hidden;
5 |
6 | &--tab {
7 | padding: 10px;
8 | margin-bottom: $dashboard-table-margin;
9 | border: 1px solid $gray;
10 |
11 | .dashboard-table__content {
12 | margin-bottom: 0;
13 | }
14 | }
15 |
16 | &__header {
17 | display: flex;
18 | flex-wrap: nowrap;
19 | align-items: flex-end;
20 | margin-bottom: $dashboard-table-margin;
21 | padding-bottom: 10px;
22 | border-bottom: 1px solid $gray;
23 | }
24 |
25 | &__content {
26 | margin-bottom: $dashboard-table-margin;
27 | overflow-x: auto;
28 | }
29 |
30 | &__table {
31 | margin: 0;
32 | }
33 |
34 | &__link {
35 | display: inline-flex;
36 | &.focus-visible {
37 | @include focus-inline();
38 | }
39 | }
40 |
41 | &__spacer {
42 | margin-right: $spacer;
43 | }
44 |
45 | &__title {
46 | margin-bottom: 0;
47 | margin-right: $dashboard-table-margin;
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/components/03-modules/dashboard/table/table.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{#if title }}
3 |
11 | {{/if }}
12 |
13 | {{ render '@table' table }}
14 |
15 |
16 |
--------------------------------------------------------------------------------
/components/03-modules/filter/filter--category.hbs:
--------------------------------------------------------------------------------
1 |
2 |
8 | {{ render '@heading' title }}
9 | {{ render '@icon' icon }}
10 |
11 |
16 | {{ render '@list--link' categories }}
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/components/03-modules/filter/filter--range.hbs:
--------------------------------------------------------------------------------
1 |
2 |
8 | {{ render '@heading' title }}
9 | {{ render '@icon' icon }}
10 |
11 |
16 | {{ text }}
17 | {{#if componentObject }}
18 | {{ render (component componentObject.name) componentObject.config }}
19 | {{/if }}
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/components/03-modules/filter/filter--swatch.hbs:
--------------------------------------------------------------------------------
1 |
2 |
8 | {{ render '@heading' title }}
9 | {{ render '@icon' icon }}
10 |
11 |
31 |
32 |
--------------------------------------------------------------------------------
/components/03-modules/filter/filter.hbs:
--------------------------------------------------------------------------------
1 |
2 |
8 | {{ render '@heading' title }}
9 | {{ render '@icon' icon }}
10 |
11 |
16 |
17 | {{#each checkboxes }}
18 |
19 | {{render '@checkbox--link' this }}
20 |
21 | {{/each }}
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/components/03-modules/filters/filters.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | title: 'Filters',
3 | context: {
4 | tag: 'div',
5 | activeFiltersHeading: 'Now Shopping by',
6 | skip: {
7 | tag: 'button',
8 | class: 'button button--secondary filters__skip-button',
9 | attributes: 'type="button"',
10 | text: 'Skip to products'
11 | },
12 | allFiltersHeading: 'Shopping Options',
13 | switcherIcon: {
14 | id: 'angle-down',
15 | title: 'Arrow down',
16 | class: 'filters__switcher-icon'
17 | },
18 | divider: {
19 | class: 'filters__divider'
20 | },
21 | dropdownList: {
22 | class: 'dropdown-list--secondary'
23 | }
24 | }
25 | };
26 |
--------------------------------------------------------------------------------
/components/03-modules/filters/filters.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | (function Filters() {
4 | const filters = {
5 | init() {
6 | this.switcher = document.querySelector('.filters__switcher');
7 | this.icon = document.querySelector('.filters__switcher-icon');
8 | this.filters = document.querySelector('.filters__list');
9 | this.switcher.addEventListener('click', this.toggle.bind(this));
10 | },
11 | toggle() {
12 | switch (this.switcher.dataset.stateCurrent) {
13 | case 'hidden':
14 | this.show();
15 | break;
16 | case 'display':
17 | this.hide();
18 | break
19 | }
20 | },
21 | show() {
22 | this.filters.classList.remove('filters__list--mobile-hidden');
23 | this.icon.classList.add('filters__switcher-icon--active');
24 | this.switcher.dataset.stateCurrent = 'display'
25 | },
26 | hide() {
27 | document.querySelector('.filters__list').classList.add('filters__list--mobile-hidden');
28 | this.icon.classList.remove('filters__switcher-icon--active');
29 | this.switcher.dataset.stateCurrent = 'hidden';
30 | }
31 | };
32 | filters.init();
33 | }());
34 |
35 |
--------------------------------------------------------------------------------
/components/03-modules/footer/footer.hbs:
--------------------------------------------------------------------------------
1 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/components/03-modules/footer/footer.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const scrollToTop = document.querySelector('.footer__scroll-top');
4 |
5 | scrollToTop.addEventListener('click', () => {
6 | window.scrollTo(0, 0);
7 | });
8 |
--------------------------------------------------------------------------------
/components/03-modules/gallery/gallery.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | title: 'Product grid item',
3 | context: {
4 | class: '',
5 | typeHorizontal: false,
6 | imageMain: {
7 | dataSrc: '/images/gallery/product-img-496-496.jpg'
8 | },
9 | thumbs: [
10 | {
11 | imageThumb: {
12 | dataSrc: '/images/gallery/product-img-80-80.jpg',
13 | active: true
14 | }
15 | },
16 | {
17 | imageThumb: {
18 | dataSrc: '/images/gallery/product-img-80-80.jpg'
19 | }
20 | },
21 | {
22 | imageThumb: {
23 | dataSrc: '/images/gallery/product-img-80-80.jpg'
24 | }
25 | },
26 | {
27 | imageThumb: {
28 | dataSrc: '/images/gallery/product-img-80-80.jpg'
29 | }
30 | }
31 | ]
32 | },
33 | variants: [
34 | {
35 | name: 'horizontal',
36 | context: {
37 | typeHorizontal: true
38 | },
39 | },
40 | {
41 | name: 'with-label',
42 | context: {
43 | productLabel: {
44 | class: 'badge--new gallery__product-label',
45 | text: 'new'
46 | }
47 | }
48 | }
49 | ]
50 | };
51 |
--------------------------------------------------------------------------------
/components/03-modules/minicart-content/minicart-content.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | {{ counter}}
6 |
7 |
8 |
9 | {{ total }}
10 |
11 |
12 | {{ price }}
13 |
14 |
15 |
16 |
17 | {{ render '@button--secondary' checkoutButton }}
18 |
19 |
20 | {{#each products}}
21 | {{ render '@minicart-product' this merge=true }}
22 | {{/each}}
23 |
24 |
29 |
30 |
--------------------------------------------------------------------------------
/components/03-modules/minicart-product/minicart-product.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{ render '@image' productImage }}
4 |
5 |
6 |
11 | {{#if configurable }}
12 | {{ render '@dropdown-list' attributes }}
13 | {{/if}}
14 |
15 | {{ productPrice }}
16 |
17 |
18 |
19 | {{ render '@input' productQty }}
20 | {{#if updateQty }}
21 | {{ render '@button' updateQty }}
22 | {{/if}}
23 |
24 |
25 | {{ render '@button--icon' editIcon }}
26 | {{ render '@button--icon' removeIcon }}
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/components/03-modules/newsletter/newsletter.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | collated: true,
3 | preview: '@docs-only-styles',
4 | context: {
5 | heading: {
6 | text: 'Sing up to our twisted newsletter'
7 | },
8 | input: {
9 | class: 'newsletter__input',
10 | field: {
11 | placeholder: 'Enter your email address',
12 | id: 'newsletterEmail',
13 | name: 'newsletterEamil',
14 | class: 'newsletter__field'
15 | },
16 | label: {
17 | class: 'newsletter__label',
18 | hidden: true,
19 | text: 'Email for newsletter subscription'
20 | }
21 | },
22 | button: {
23 | tag: 'button',
24 | text: 'Submit',
25 | class: 'newsletter__button'
26 | },
27 | checkbox: {
28 | class: 'newsletter__checkbox',
29 | id: 'newsletter',
30 | label: {
31 | text: 'I agree to Terms and conditions and I am happy to receive your newsletter with all your promotions.'
32 | }
33 | }
34 | }
35 | };
36 |
--------------------------------------------------------------------------------
/components/03-modules/newsletter/newsletter.hbs:
--------------------------------------------------------------------------------
1 |
14 |
--------------------------------------------------------------------------------
/components/03-modules/popup/popup.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | context: {
3 | popupTrigger: true,
4 | buttonPopupTrigger: {
5 | class: 'popup-trigger',
6 | text: 'Popup trigger button',
7 | attributes: 'data-popuptrigger="popup-1" type="button"'
8 | },
9 | class: '',
10 | popupId: 'popup-1',
11 | content: 'button',
12 | buttonClose: {
13 | tag: 'button',
14 | text: '',
15 | class: 'button--icon popup__close-button',
16 | icon: {
17 | id: 'close',
18 | title: 'Close',
19 | class: 'button__icon popup__close-button-icon'
20 | },
21 | attributes: 'type="button" aria-label="close popup button, click to close the popup"'
22 | },
23 | script: true
24 | }
25 | };
26 |
--------------------------------------------------------------------------------
/components/03-modules/popup/popup.hbs:
--------------------------------------------------------------------------------
1 | {{#if popupTrigger }}
2 | {{ render '@button' buttonPopupTrigger merge=true }}
3 | {{/if}}
4 |
14 |
15 | {{#if script }}
16 |
17 | {{/if}}
18 |
--------------------------------------------------------------------------------
/components/03-modules/product-view/product-review/product-review.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{ title }}
4 |
5 |
6 | {{ render '@review--summary' summary merge=true }}
7 |
8 |
9 |
10 | {{#each reviews }}
11 |
12 | {{ render '@review--default' this }}
13 |
14 | {{/each}}
15 |
16 |
17 | {{ render '@review--add' }}
18 |
19 |
--------------------------------------------------------------------------------
/components/03-modules/quantity-update/quantity-update.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | context: {
3 | input: {
4 | id: 'qty',
5 | min: '1',
6 | defaultValue: '1',
7 | ariaLabel: 'Change the quantity'
8 | },
9 | minusQtyButton: {
10 | tag: 'button',
11 | class: 'button--icon quantity-update__button quantity-update__button--minus quantity-update__button--disabled',
12 | attributes: 'type="button" aria-label="Decrease the quantity"',
13 | icon: {
14 | id: 'minus',
15 | title: 'Minus mark',
16 | class: 'button__icon quantity-update__icon'
17 | }
18 | },
19 | plusQtyButton: {
20 | tag: 'button',
21 | class: 'button--icon quantity-update__button quantity-update__button--plus',
22 | attributes: 'type="button" aria-label="Increase the quantity"',
23 | icon: {
24 | id: 'plus',
25 | title: 'Plus mark',
26 | class: 'button__icon quantity-update__icon'
27 | }
28 | },
29 | script: true
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/components/03-modules/quantity-update/quantity-update.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{> '@button--icon' minusQtyButton }}
3 |
4 |
11 |
12 | {{> '@button--icon' plusQtyButton }}
13 |
14 | {{#if script}}
15 |
16 | {{/if}}
17 |
--------------------------------------------------------------------------------
/components/03-modules/range/range.hbs:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 | {{ render '@input' rangeInputLower }}
9 |
10 | {{ filter.suffix.lowerText }}
11 |
12 | -
13 | {{ render '@input' rangeInputUpper }}
14 |
15 | {{ filter.suffix.upperText }}
16 |
17 |
18 |
19 | {{ render '@button--secondary' apply }}
20 | {{#if script}}
21 |
22 | {{/if}}
23 |
--------------------------------------------------------------------------------
/components/03-modules/review/review--add.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{ addTitle }}:
4 |
5 | {{ productTitle }}
6 |
7 |
8 | {{ render '@rating--rate' rate merge=true }}
9 |
10 | {{ render '@input' nickname }}
11 | {{ render '@input' summary }}
12 | {{ render '@input--textarea' textReview }}
13 | {{ render '@button' submitReview merge=true }}
14 |
15 | * Required fields
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/components/03-modules/review/review--summary.hbs:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/components/03-modules/review/review.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ author }}
5 |
6 |
7 | {{ date }}
8 |
9 | {{> '@rating' rating }}
10 |
11 |
12 |
13 | {{ title }}
14 |
15 |
16 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/components/03-modules/side-menu/side-menu.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | title: 'Header module',
3 | context: {
4 | sideMenuIconOpen: {
5 | id: 'mobile-menu',
6 | title: 'Mobile menu',
7 | class: 'side-menu__trigger-icon'
8 | },
9 | sideMenuIconClose: {
10 | id: 'close',
11 | title: 'Close',
12 | class: 'side-menu__trigger-icon'
13 | },
14 | dropdown: {
15 | id: 'dropdown-side-menu',
16 | class: 'side-menu__dropdown'
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/components/03-modules/side-menu/side-menu.hbs:
--------------------------------------------------------------------------------
1 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/components/03-modules/side-menu/side-menu.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | class SideMenu {
4 | constructor() {
5 | this.sideMenuContainer = document.querySelector('.side-menu');
6 | this.sideMenuOverlay = this.sideMenuContainer.querySelector('.side-menu__overlay');
7 | this.menuTrigger = this.sideMenuContainer.querySelectorAll('.side-menu__trigger');
8 | this.init();
9 | }
10 |
11 | toggleSideMenu() {
12 | this.sideMenuContainer.classList.toggle('side-menu--is-open');
13 |
14 | if (this.sideMenuContainer.classList.contains('side-menu--is-open')) {
15 | document.body.style.overflow = 'hidden';
16 | }
17 | else {
18 | document.body.style.overflow = 'auto';
19 | }
20 | }
21 |
22 | setListeners() {
23 | this.menuTrigger.forEach(el => {
24 | el.addEventListener('click', () => {
25 | this.toggleSideMenu();
26 | });
27 | });
28 |
29 | this.sideMenuOverlay.addEventListener('click', () => {
30 | this.toggleSideMenu();
31 | });
32 | }
33 |
34 | init() {
35 | this.setListeners();
36 | }
37 | }
38 |
39 | new SideMenu();
40 |
--------------------------------------------------------------------------------
/components/03-modules/sidebar-block/sidebar-block--recently-ordered.hbs:
--------------------------------------------------------------------------------
1 |
23 |
--------------------------------------------------------------------------------
/components/03-modules/sidebar-block/sidebar-block.hbs:
--------------------------------------------------------------------------------
1 |
22 |
--------------------------------------------------------------------------------
/components/03-modules/slider/slider.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{#each slides }}
5 |
9 | {{ render (component content) contentContext }}
10 |
11 | {{/each}}
12 |
13 |
14 |
15 |
16 | {{render '@button--icon' iconPrev }}
17 |
18 | {{render '@button--icon' iconNext }}
19 |
20 |
21 | {{#if navigation }}
22 |
23 | {{/if}}
24 |
25 |
26 | {{#if script }}
27 |
28 | {{/if}}
29 |
--------------------------------------------------------------------------------
/components/03-modules/title-wrapper/_title-wrapper.scss:
--------------------------------------------------------------------------------
1 | $title-wrapper__margin : 0 0 $spacer--medium 0 !default;
2 |
3 | .title-wrapper {
4 | margin: $title-wrapper__margin;
5 | flex-direction: column;
6 |
7 | @include mq($screen_m) {
8 | flex-direction: row;
9 | }
10 |
11 | &__actions {
12 | display: flex;
13 | justify-content: center;
14 | flex-direction: column;
15 | }
16 | }
17 |
18 |
--------------------------------------------------------------------------------
/components/03-modules/title-wrapper/title-wrapper.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | context: {
3 | title: {
4 | text: 'main title',
5 | tag: 'h1',
6 | class: 'heading heading--page'
7 | },
8 | button: {
9 | tag: 'button',
10 | class: 'button button--secondary',
11 | attributes: 'type="button"',
12 | text: 'I am a button'
13 | }
14 | }
15 | };
16 |
--------------------------------------------------------------------------------
/components/03-modules/title-wrapper/title-wrapper.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@heading' title }}
3 | {{#if button }}
4 |
5 | {{ render '@button--secondary' button }}
6 |
7 | {{/if }}
8 |
9 |
--------------------------------------------------------------------------------
/components/04-views/_components.scss:
--------------------------------------------------------------------------------
1 | // -----
2 | // Views
3 | // -----
4 |
5 | @import 'b2b/quickorder/quickorder';
6 | @import 'cart/actions';
7 | @import 'cart/discount';
8 | @import 'cart/main';
9 | @import 'cart/summary';
10 | @import 'cart/totals';
11 | @import 'catalog/grid/grid';
12 | @import 'catalog/list/list';
13 | @import 'compare/compare';
14 | @import 'confirmation-link/confirmation-link';
15 | @import 'dashboard/default/dashboard';
16 | @import 'dashboard/product-reviews/product-reviews';
17 | @import 'dashboard/company-structure/company-structure';
18 | @import 'dashboard/company-users/company-users';
19 | @import 'dashboard/my-quotes/my-quotes';
20 | @import 'dashboard/requisition-lists/requisition-lists--view';
21 | @import 'dashboard/roles-and-permissions/roles-and-permissions';
22 | @import 'dashboard/wishlist/wishlist';
23 | @import 'email-to-friend/email-to-friend';
24 | @import 'forgot-password/forgot-password';
25 | @import 'home/home';
26 | @import 'login/login';
27 | @import 'product-view/product-view';
28 | @import 'registration/registration';
29 |
--------------------------------------------------------------------------------
/components/04-views/cart/_actions.scss:
--------------------------------------------------------------------------------
1 | $cart-actions__margin : 15px !default;
2 | $cart-actions__padding: 10px !default;
3 |
4 | .cart-actions {
5 | display: flex;
6 | flex-wrap: wrap;
7 | margin-top: $cart-actions__margin;
8 |
9 | &__button {
10 | width: 100%;
11 | margin-bottom: $cart-actions__margin;
12 | @include mq($screen-m) {
13 | width: 190px;
14 | margin: 0 0 $cart-actions__margin $cart-actions__margin;
15 | padding: 0 $cart-actions__padding;
16 | }
17 |
18 | &--continue {
19 | @include mq($screen-m) {
20 | margin: 0 auto 0 0;
21 | }
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/components/04-views/cart/_main.scss:
--------------------------------------------------------------------------------
1 | $cart__margin : $spacer--large !default;
2 | $cart__border : 1px solid $gray-lighter !default;
3 |
4 | $cart__bottom-margin : 0 !default;
5 | $cart__bottom-padding : $spacer 0 0 0 !default;
6 |
7 | .cart {
8 | display: flex;
9 | margin-bottom: $cart__margin;
10 |
11 | &__bottom {
12 | display: flex;
13 | margin: $cart__bottom-margin;
14 | padding: $cart__bottom-padding;
15 | border-top: $cart__border;
16 | }
17 |
18 | &__products-list {
19 | margin: 0;
20 | border-top: $cart__border;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/components/04-views/cart/_totals.scss:
--------------------------------------------------------------------------------
1 | $cart-totals__padding : 15px !default;
2 | $cart-totals__margin : 15px !default;
3 | $cart-totals__border : 1px solid #d9d9d9 !default;
4 | $cart-totals__font-size : $font-size-base !default;
5 | $cart-totals__padding--summary : ($cart-totals__padding - 5) !default;
6 | $cart-totals__font-size--summary: $font-size-base !default;
7 |
8 | .cart-totals {
9 | padding-top: $cart-totals__padding;
10 | border-top: $cart-totals__border;
11 |
12 | &__row {
13 | padding-bottom: $cart-totals__margin;
14 | font-size: $cart-totals__font-size;
15 |
16 | &--summary {
17 | margin-bottom: $cart-totals__margin;
18 | padding-top: $cart-totals__padding--summary;
19 | border-top: $cart-totals__border;
20 | font-weight: 600;
21 | font-size: $cart-totals__font-size--summary;
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/components/04-views/catalog/grid/_grid.scss:
--------------------------------------------------------------------------------
1 | $catalog-grid__gap : $spacer--medium !default;
2 | $catalog-grid__margin : 0 !default;
3 | $catalog-grid__padding: $spacer--medium 0 $spacer--large 0 !default;
4 | $catalog-grid__border : 1px solid $gray-light !default;
5 |
6 | .catalog-grid {
7 | display: grid;
8 | grid-template-columns: 1fr 1fr;
9 | grid-gap: $catalog-grid__gap;
10 | margin: $catalog-grid__margin;
11 | padding: $catalog-grid__padding;
12 | border-bottom: $catalog-grid__border;
13 | list-style: none;
14 |
15 | @include mq($screen-m) {
16 | grid-template-columns: 1fr 1fr 1fr;
17 | }
18 |
19 | @include isIE() {
20 | display: flex;
21 | flex-wrap: wrap;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/components/04-views/catalog/grid/grid.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | name: 'grid-view',
3 | context: {
4 | gridItem: {
5 | tag: 'li'
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/components/04-views/catalog/list/list.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | name: 'list-view'
3 | }
4 |
--------------------------------------------------------------------------------
/components/04-views/confirmation-link/_confirmation-link.scss:
--------------------------------------------------------------------------------
1 | $confirmation-link__max-width : 600px !default;
2 | $confirmation-link__margin-bottom : $spacer--extra-large !default;
3 | $confirmation-link__link-margin-top: $spacer--medium !default;
4 |
5 | .confirmation-link {
6 | max-width: $confirmation-link__max-width;
7 | margin-bottom: $confirmation-link__margin-bottom;
8 |
9 | &__link {
10 | display: block;
11 | margin-top: $confirmation-link__link-margin-top;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/components/04-views/confirmation-link/confirmation-link.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | context: {
3 | mainHeading: {
4 | tag: 'h1',
5 | class: 'heading heading--page',
6 | text: 'Send confirmation link'
7 | },
8 | info: 'Please enter your email below and we will send you the confirmation link.',
9 | email: {
10 | label: {
11 | text: 'Email',
12 | hidden: false
13 | },
14 | field: {
15 | id: 'email',
16 | name: 'email',
17 | type: 'email'
18 | }
19 | },
20 | submit: {
21 | tag: 'button',
22 | attributes: 'type="submit"',
23 | text: 'Send confirmation link'
24 | },
25 | back: {
26 | href: '#',
27 | class: 'confirmation-link__link',
28 | text: 'Back to Sign In'
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/components/04-views/confirmation-link/confirmation-link.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 | {{ render '@heading' mainHeading }}
6 |
14 |
15 |
16 |
17 | {{ render '@footer' }}
18 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/account-info/account-info.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | context: {
3 | buttons: {
4 | class: 'dashboard__actions',
5 | sides: [
6 | {
7 | action: [
8 | {
9 | button: true,
10 | title: 'Save'
11 | }
12 | ]
13 | },
14 | {
15 | action: [
16 | {
17 | title: 'Go Back'
18 | }
19 | ]
20 | }
21 | ],
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/account-info/account-info.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 | {{ render '@dashboard-nav' }}
7 |
8 |
9 | {{ render '@dashboard-form' }}
10 | {{> '@action' buttons }}
11 |
12 |
13 |
14 |
15 | {{ render '@footer' }}
16 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/address-book/address-book--edit.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 |
12 | {{> '@dashboard-form' contactInfo }}
13 |
14 | {{> '@dashboard-form' address }}
15 |
16 |
17 | {{> '@action' buttons }}
18 |
19 |
20 |
21 |
22 |
23 | {{ render '@footer' }}
24 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/address-book/address-book.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{> '@dashboard-items' addresses }}
12 |
13 | {{> '@dashboard-items' additionalAddresses }}
14 |
15 | {{> '@action' buttons }}
16 |
17 |
18 |
19 |
20 |
21 | {{ render '@footer' }}
22 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/company-profile/company-profile--edit.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 | {{ render '@dashboard-nav' }}
7 |
8 |
9 | {{ render '@heading' mainTitle }}
10 | {{> '@dashboard-form' form }}
11 | {{> '@action' buttons }}
12 |
13 |
14 |
15 |
16 | {{ render '@footer' }}
17 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/company-profile/company-profile.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 | {{ render '@dashboard-nav' }}
7 |
8 |
9 | {{ render '@title-wrapper' titleWrapper }}
10 | {{> '@dashboard-items' accountInformation }}
11 | {{> '@dashboard-items' legalAddress }}
12 | {{> '@dashboard-items' contacts }}
13 |
14 |
15 |
16 |
17 | {{ render '@footer' }}
18 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/company-structure/_company-structure.scss:
--------------------------------------------------------------------------------
1 | .company-structure {
2 | &__actions {
3 | margin-bottom: $spacer--medium;
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/company-structure/company-structure.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 | {{ render '@dashboard-nav' }}
7 |
8 |
9 | {{ render '@title-wrapper' titleWrapper }}
10 | {{ render '@heading' businessStructureHeading }}
11 | {{ render '@dashboard-actions-toolbar' businessStructureActions }}
12 |
13 |
14 |
15 |
16 | {{ render '@footer' }}
17 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/company-users/_company-users.scss:
--------------------------------------------------------------------------------
1 | .company-users {
2 | &__filters {
3 | margin-bottom: $spacer--medium;
4 | }
5 |
6 | &__actions {
7 | margin: $spacer--medium 0;
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/company-users/company-users.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 | {{ render '@dashboard-nav' }}
7 |
8 |
9 | {{ render '@title-wrapper' titleWrapper }}
10 | {{ render '@dashboard-actions-toolbar' filtersActions }}
11 | {{> '@dashboard-table' users }}
12 | {{ render '@toolbar' toolbar merge=true }}
13 | {{ render '@dashboard-actions-toolbar' actions }}
14 |
15 |
16 |
17 |
18 | {{ render '@footer' }}
19 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/default/dashboard.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{ render '@dashboard-table' }}
12 |
13 | {{> '@dashboard-items' account }}
14 |
15 | {{> '@dashboard-items' addreses }}
16 |
17 |
18 |
19 |
20 |
21 | {{ render '@footer' }}
22 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/downloadable-product/downloadable-product.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{> '@dashboard-table' products }}
12 |
13 | {{> '@action' button }}
14 |
15 |
16 |
17 |
18 |
19 | {{ render '@footer' }}
20 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/empty/empty.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | context: {
3 | message: {
4 | text: 'You have no items in your wish list'
5 | },
6 | action: {
7 | sides: [
8 | {
9 | action: [
10 | {
11 | title: 'Back'
12 | }
13 | ]
14 | }
15 | ]
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/empty/empty.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{> '@message' message }}
12 |
13 | {{> '@action' action }}
14 |
15 |
16 |
17 |
18 |
19 | {{ render '@footer' }}
20 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/gift-card/gift-card.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | context: {
3 | form: {
4 | title: 'Gift Card',
5 | fields: [
6 | {
7 | input: {
8 | class: 'dashboard-form__divider',
9 | field: {
10 | id: 'giftCardCode',
11 | name: 'giftCardCode',
12 | placeholder: 'Enter gitf card code'
13 | }
14 | }
15 | }
16 | ]
17 | },
18 | buttons: {
19 | sides: [
20 | {
21 | action: [
22 | {
23 | button: true,
24 | title: 'Reedem Gift Card'
25 | }
26 | ]
27 | },
28 | {
29 | action: [
30 | {
31 | button: true,
32 | title: 'Check statuc and balance'
33 | }
34 | ]
35 | }
36 | ]
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/gift-card/gift-card.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{> '@dashboard-form' form }}
12 |
13 | {{> '@action' buttons }}
14 |
15 |
16 |
17 |
18 |
19 | {{ render '@footer' }}
20 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/gift-registry/gift-registry--form.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{> '@dashboard-form' generalInformation }}
12 |
13 | {{> '@dashboard-form' eventInformation }}
14 |
15 | {{> '@dashboard-form' eventInformationSecondPart }}
16 |
17 | {{> '@dashboard-form' registrantInformation }}
18 |
19 | {{> '@action' addRegistrant }}
20 |
21 | {{> '@dashboard-form' shippingAddress }}
22 |
23 | {{> '@dashboard-form' hiddenNewAddressForm }}
24 |
25 | {{> '@action' buttons }}
26 |
27 |
28 |
29 |
30 |
31 | {{ render '@footer' }}
32 |
33 |
34 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/gift-registry/gift-registry--form.js:
--------------------------------------------------------------------------------
1 | 'use static'
2 |
3 | const hiddenForm = document.querySelector('.dashboard__form'),
4 | select = document.querySelector('.dashboard__address select');
5 |
6 | select.addEventListener('change', (event) => {
7 | if (event.detail.value === 'newAddress') {
8 | hiddenForm.classList.remove('dashboard__form--hidden');
9 | }
10 | else {
11 | hiddenForm.classList.add('dashboard__form--hidden');
12 | }
13 | });
14 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/gift-registry/gift-registry--general-information.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{> '@dashboard-form' form }}
12 |
13 | {{> '@action' buttons }}
14 |
15 |
16 |
17 |
18 |
19 | {{ render '@footer' }}
20 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/gift-registry/gift-registry.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{> '@dashboard-table' giftRegistry }}
12 |
13 | {{> '@action' buttons }}
14 |
15 |
16 |
17 |
18 |
19 | {{ render '@footer' }}
20 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/invitation/invitation--form.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{> '@dashboard-form' form }}
12 |
13 | {{> '@action' buttons }}
14 |
15 |
16 |
17 |
18 |
19 | {{ render '@footer' }}
20 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/invitation/invitation.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{> '@dashboard-table' invitations }}
12 |
13 | {{> '@action' buttons }}
14 |
15 |
16 |
17 |
18 |
19 | {{ render '@footer' }}
20 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/my-orders/my-orders--return.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 |
12 | {{ title }}
13 |
14 |
15 |
16 | {{> '@information' info }}
17 |
18 |
19 | {{> '@input' contactEmailAddress }}
20 |
21 | {{> '@dashboard-form' form }}
22 |
23 | {{> '@action' addReturnItem }}
24 |
25 | {{> '@input--textarea' comments }}
26 |
27 | {{> '@action' action }}
28 |
29 |
30 |
31 |
32 |
33 | {{ render '@footer' }}
34 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/my-orders/my-orders.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 | {{ render '@dashboard-nav' }}
7 |
8 |
9 | {{ render '@dashboard-table' }}
10 | {{ render '@toolbar--pager' toolbar merge=true }}
11 | {{> '@action' action }}
12 |
13 |
14 |
15 |
16 | {{ render '@footer' }}
17 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/my-quotes/_my-quotes.scss:
--------------------------------------------------------------------------------
1 | .my-quotes {
2 | &__filters {
3 | margin-bottom: $spacer--medium;
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/my-quotes/my-quotes.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 | {{ render '@dashboard-nav' }}
7 |
8 |
9 | {{ render '@title-wrapper' titleWrapper }}
10 | {{ render '@dashboard-actions-toolbar' filtersActions }}
11 | {{> '@dashboard-table' users }}
12 | {{ render '@toolbar' toolbar merge=true }}
13 |
14 |
15 |
16 |
17 | {{ render '@footer' }}
18 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/newsletter-sub/newsletter-sub.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | context: {
3 | form: {
4 | title: 'Subscription option',
5 | checkboxes: [
6 | {
7 | checkbox: {
8 | class: 'dashboard-form__divider',
9 | id: 'subscription',
10 | label: {
11 | text: 'General Subscription'
12 | }
13 | }
14 | }
15 | ]
16 | },
17 | buttons: {
18 | sides: [
19 | {
20 | action: [
21 | {
22 | button: true,
23 | title: 'Save'
24 | }
25 | ]
26 | },
27 | {
28 | action: [
29 | {
30 | title: 'Back'
31 | }
32 | ]
33 | }
34 | ]
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/newsletter-sub/newsletter-sub.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{> '@dashboard-form' form }}
12 |
13 | {{> '@action' buttons }}
14 |
15 |
16 |
17 |
18 |
19 | {{ render '@footer' }}
20 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/order-by-sku/order-by-sku.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{> '@dashboard-form' form }}
12 |
13 | {{> '@action' addRow }}
14 |
15 | {{> '@information' uploadInfo }}
16 |
17 | {{> '@file-upload' fileUpload }}
18 |
19 | {{> '@action' buttons }}
20 |
21 |
22 |
23 |
24 |
25 | {{ render '@footer' }}
26 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/product-reviews/_product-reviews.scss:
--------------------------------------------------------------------------------
1 | $product-reviews__image-margin : $spacer auto !default;
2 | $product-reviews__image-max-width : 300px !default;
3 | $product-reviews__details-margin-bottom: $spacer--medium !default;
4 | $product-reviews__product-name-margin : 0 !default;
5 |
6 | .product-reviews {
7 | &__image {
8 | display: block;
9 | margin: $product-reviews__image-margin;
10 | max-width: $product-reviews__image-max-width;
11 | }
12 |
13 | &__details {
14 | display: flex;
15 | justify-content: space-between;
16 | align-items: center;
17 | margin-bottom: $product-reviews__details-margin-bottom;
18 | }
19 |
20 | &__name {
21 | margin: $product-reviews__product-name-margin;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/product-reviews/product-reviews--details.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
32 |
33 |
34 |
35 |
36 | {{ render '@footer' }}
37 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/product-reviews/product-reviews.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{> '@dashboard-table' reviews }}
12 |
13 | {{> '@action' button }}
14 |
15 |
16 |
17 |
18 |
19 | {{ render '@footer' }}
20 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/requisition-lists/_requisition-lists--view.scss:
--------------------------------------------------------------------------------
1 | $requisition-list-view__margin: 0 0 $spacer--medium 0 !default;
2 |
3 | .requisition-list-view {
4 | &__description {
5 | margin: $requisition-list-view__margin;
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/requisition-lists/requisition-lists--view.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 | {{ render '@dashboard-nav' }}
7 |
8 |
9 |
10 | {{ render '@title-wrapper' titleWrapper }}
11 |
12 | {{ description }}
13 |
14 |
15 | {{ render '@dashboard-actions-toolbar' }}
16 |
17 |
18 |
19 |
20 | {{ render '@footer' }}
21 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/requisition-lists/requisition-lists.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 | {{ render '@dashboard-nav' }}
7 |
8 |
9 | {{ render '@title-wrapper' titleWrapper }}
10 | {{> '@dashboard-table' itemsOrdered }}
11 | {{ render '@toolbar' toolbar merge=true }}
12 |
13 |
14 |
15 |
16 | {{ render '@footer' }}
17 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/returns/returns--details.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 |
12 |
13 | {{ returnNumer }}
14 |
15 |
16 |
17 | {{ returnStatus }}
18 |
19 |
20 |
21 | {{> '@dashboard-items' addresses }}
22 |
23 | {{> '@dashboard-table' returns }}
24 |
25 | {{> '@dashboard-form' comments }}
26 |
27 | {{> '@action' buttons }}
28 |
29 |
30 |
31 |
32 |
33 | {{ render '@footer' }}
34 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/returns/returns.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{> '@dashboard-table' returns }}
12 |
13 | {{> '@action' buttons }}
14 |
15 |
16 |
17 |
18 |
19 | {{ render '@footer' }}
20 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/reward-points/reward-points.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{> '@information' info }}
12 |
13 | {{> '@dashboard-table' points }}
14 |
15 | {{> '@dashboard-form' form }}
16 |
17 | {{> '@action' buttons }}
18 |
19 |
20 |
21 |
22 |
23 | {{ render '@footer' }}
24 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/roles-and-permissions/_roles-and-permissions.scss:
--------------------------------------------------------------------------------
1 | $roles-and-permissions__margin: $spacer--medium 0 !default;
2 |
3 | .roles-and-permissions {
4 | &__actions {
5 | margin: $roles-and-permissions__margin;
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/roles-and-permissions/roles-and-permissions--edit.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 | {{ render '@dashboard-nav' }}
7 |
8 |
9 | {{ render '@heading' mainTitle }}
10 | {{> '@dashboard-form' form }}
11 | {{> '@action' buttons }}
12 |
13 |
14 |
15 |
16 | {{ render '@footer' }}
17 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/roles-and-permissions/roles-and-permissions.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 | {{ render '@dashboard-nav' }}
7 |
8 |
9 | {{ render '@title-wrapper' titleWrapper }}
10 | {{> '@dashboard-table' itemsOrdered }}
11 | {{ render '@toolbar' toolbar merge=true }}
12 | {{ render '@dashboard-actions-toolbar' actions }}
13 |
14 |
15 |
16 |
17 | {{ render '@footer' }}
18 |
--------------------------------------------------------------------------------
/components/04-views/dashboard/store-credit/store-credit.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 |
7 | {{ render '@dashboard-nav' }}
8 |
9 |
10 |
11 | {{ render '@information' }}
12 |
13 |
14 |
15 |
16 |
17 | {{ render '@footer' }}
18 |
--------------------------------------------------------------------------------
/components/04-views/forgot-password/forgot-password.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 |
6 | {{ render '@heading' mainHeading }}
7 |
8 | {{ info }}
9 |
10 |
19 |
20 |
21 |
22 |
23 | {{ render '@footer' }}
24 |
--------------------------------------------------------------------------------
/components/04-views/home/home.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{ render '@header' }}
3 |
4 |
5 | {{ render '@banner' }}
6 |
7 |
8 | {{ render '@banner' bannerSmall1 }}
9 | {{ render '@banner' bannerSmall2 }}
10 | {{ render '@banner' bannerSmall3 }}
11 |
12 |
13 | {{ render '@banner' bannerMedium1 }}
14 | {{ render '@banner' bannerMedium2 }}
15 |
16 |
17 | {{ render '@heading' brandBlockHeading }}
18 | {{ render '@list--link-content' brandsList }}
19 |
20 |
21 |
22 | {{{ cmsBlock }}}
23 |
24 |
25 |
26 |
27 |
28 |
29 | {{ render '@footer' }}
30 |
--------------------------------------------------------------------------------
/components/_a11y-tests.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ title }}
5 |
6 |
7 | {{> @libs }}
8 |
9 |
10 |
11 |
12 | There is no a11y erros! Well done!
13 |
14 |
15 |
16 | {{{ yield }}}
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/components/_docs-only-styles.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ title }}
5 |
6 |
7 | {{> @libs }}
8 |
9 |
10 | {{{ yield }}}
11 |
12 |
13 |
--------------------------------------------------------------------------------
/components/_preview.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ title }}
5 |
6 |
7 | {{> @libs }}
8 |
9 |
10 | {{{ yield }}}
11 |
12 |
13 |
--------------------------------------------------------------------------------
/components/_styles.scss:
--------------------------------------------------------------------------------
1 | @import '01-globals/components';
2 | @import '02-elements/components';
3 | @import '03-modules/components';
4 | @import '04-views/components';
5 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "snowdog/module-alpaca-components",
3 | "description": "Components of the Alpaca theme for Magento 2",
4 | "license": "MIT",
5 | "type": "magento2-module"
6 | }
7 |
--------------------------------------------------------------------------------
/docs/styles/_fractal.scss:
--------------------------------------------------------------------------------
1 | // -----
2 | // Documentation
3 | // -----
4 |
5 | @import 'docs-only-styles/button';
6 | @import 'docs-only-styles/filter';
7 | @import 'docs-only-styles/grid';
8 | @import 'docs-only-styles/icons';
9 | @import 'docs-only-styles/list';
10 | @import 'docs-only-styles/minicart-product';
11 | @import 'docs-only-styles/newsletter';
12 | @import 'docs-only-styles/product';
13 | @import 'docs-only-styles/search';
14 |
15 |
16 | // -----
17 | // A11y test
18 | // -----
19 |
20 | @import 'a11y-tests/a11y-tests';
21 |
--------------------------------------------------------------------------------
/docs/styles/a11y-tests/_a11y-tests.scss:
--------------------------------------------------------------------------------
1 | .a11y-test {
2 | padding: 15px;
3 | border-bottom: 10px solid #31e37d;
4 | &--error {
5 | border-color: red;
6 | .a11y-test__success-msg {
7 | display: none;
8 | }
9 | }
10 | &__success-msg {
11 | color: #31e37d;
12 | }
13 | &__error-msg {
14 | color: red;
15 | }
16 | &__error-element {
17 | outline: 5px solid red;
18 | }
19 | &__error-preview {
20 | max-width: 500px;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/docs/styles/docs-only-styles/_button.scss:
--------------------------------------------------------------------------------
1 | .docs-only-styles {
2 | .button {
3 | margin-bottom: 5px;
4 | vertical-align: top;
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/docs/styles/docs-only-styles/_filter.scss:
--------------------------------------------------------------------------------
1 | .docs-only-styles {
2 | @extend .dropdown-list--secondary;
3 | .filter {
4 | &__content {
5 | height: auto;
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/docs/styles/docs-only-styles/_grid.scss:
--------------------------------------------------------------------------------
1 | .docs-only-styles {
2 | .col-large .row__content {
3 | height: 8em;
4 | }
5 | .grid-container {
6 | padding: 0 $spacer--medium;
7 | }
8 | .row {
9 | &__content {
10 | margin-bottom: $spacer--medium;
11 | padding: $spacer;
12 | background: $gray-light;
13 | text-align: center;
14 | font-size: 16px;
15 | font-weight: bold;
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/docs/styles/docs-only-styles/_icons.scss:
--------------------------------------------------------------------------------
1 | .docs-only-styles {
2 | .icons {
3 | padding: 10px;
4 | display: flex;
5 | flex-wrap: wrap;
6 | &__item {
7 | width: 100px;
8 | margin: 20px;
9 |
10 | }
11 | &__single-icon {
12 | margin: 0 auto;
13 | }
14 | &__name {
15 | display: block;
16 | margin-top: 20px;
17 | text-align: center;
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/docs/styles/docs-only-styles/_list.scss:
--------------------------------------------------------------------------------
1 | .docs-only-styles {
2 | .list {
3 | &--with-icon {
4 | .list__item {
5 | background-color: $gray-darker;
6 | }
7 | }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/docs/styles/docs-only-styles/_minicart-product.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/docs/styles/docs-only-styles/_minicart-product.scss
--------------------------------------------------------------------------------
/docs/styles/docs-only-styles/_newsletter.scss:
--------------------------------------------------------------------------------
1 | .docs-only-styles {
2 | .newsletter {
3 | background: $gray-darkest;
4 | @include mq($screen-l) {
5 | background: $gray-darker;
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/docs/styles/docs-only-styles/_product.scss:
--------------------------------------------------------------------------------
1 | .docs-only-styles {
2 | .product {
3 | list-style-type: none;
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/docs/styles/docs-only-styles/_search.scss:
--------------------------------------------------------------------------------
1 | .docs-only-styles {
2 | .search {
3 | position: relative;
4 | top: 100px;
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/docs/styles/styles.scss:
--------------------------------------------------------------------------------
1 | // Variables
2 | @import '../../components/01-globals/variables/variables';
3 |
4 | // Components
5 | @import '../../components/styles';
6 |
7 | // Styles necessary only for Fractal purpoueses
8 | @import 'fractal';
9 |
--------------------------------------------------------------------------------
/now.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 2,
3 | "alias": "alpaca-components.now.sh",
4 | "builds": [
5 | { "src": "package.json", "use": "@now/static-build", "config": { "distDir": "dest" } }
6 | ]
7 | }
8 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "alpaca-components",
3 | "scripts": {
4 | "dev": "gulp dev",
5 | "build": "gulp",
6 | "now-build": "gulp --ci"
7 | },
8 | "dependencies": {
9 | "@frctl/fractal": "~1.1.7",
10 | "autoprefixer": "~9.6.0",
11 | "eslint-config-idiomatic": "~4.0.0",
12 | "fs-extra": "~8.0.1",
13 | "globby": "~9.2.0",
14 | "gulp": "~4.0.1",
15 | "gulp-eslint": "~5.0.0",
16 | "gulp-if": "~2.0.2",
17 | "gulp-logger": "^0.0.2",
18 | "gulp-notify": "~3.2.0",
19 | "gulp-plumber": "~1.2.0",
20 | "gulp-postcss": "~8.0.0",
21 | "gulp-sass": "~4.0.2",
22 | "gulp-sass-error": "~1.0.5",
23 | "gulp-sass-lint": "~1.4.0",
24 | "gulp-sourcemaps": "~2.6.1",
25 | "gulp-svg-sprite": "~1.5.0",
26 | "gulp-util": "~3.0.8",
27 | "path": "~0.12.7",
28 | "postcss-reporter": "~6.0.1",
29 | "stylelint": "~10.1.0",
30 | "stylelint-config-standard": "~18.3.0"
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/public/images/banner/banner-1024_416.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/banner/banner-1024_416.jpg
--------------------------------------------------------------------------------
/public/images/banner/banner-1170_300.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/banner/banner-1170_300.png
--------------------------------------------------------------------------------
/public/images/banner/banner-1920_512.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/banner/banner-1920_512.jpg
--------------------------------------------------------------------------------
/public/images/banner/banner-320_176.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/banner/banner-320_176.jpg
--------------------------------------------------------------------------------
/public/images/banner/banner-480_480.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/banner/banner-480_480.png
--------------------------------------------------------------------------------
/public/images/banner/banner-768_402.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/banner/banner-768_402.png
--------------------------------------------------------------------------------
/public/images/banner/banner-768_416.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/banner/banner-768_416.jpg
--------------------------------------------------------------------------------
/public/images/banner/banner-992_254.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/banner/banner-992_254.png
--------------------------------------------------------------------------------
/public/images/catalog-grid-item/product-1_320_312.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/catalog-grid-item/product-1_320_312.jpg
--------------------------------------------------------------------------------
/public/images/catalog-grid-item/product-2_320_312.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/catalog-grid-item/product-2_320_312.jpg
--------------------------------------------------------------------------------
/public/images/catalog-grid-item/product-3_320_312.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/catalog-grid-item/product-3_320_312.jpg
--------------------------------------------------------------------------------
/public/images/catalog-grid-item/product-color-swatch-image-1-32_40.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/catalog-grid-item/product-color-swatch-image-1-32_40.jpg
--------------------------------------------------------------------------------
/public/images/gallery/product-img-384-384.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/gallery/product-img-384-384.jpg
--------------------------------------------------------------------------------
/public/images/gallery/product-img-496-496.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/gallery/product-img-496-496.jpg
--------------------------------------------------------------------------------
/public/images/gallery/product-img-80-80.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/gallery/product-img-80-80.jpg
--------------------------------------------------------------------------------
/public/images/home/banners/banner-medium-discover_304-176.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/banners/banner-medium-discover_304-176.jpg
--------------------------------------------------------------------------------
/public/images/home/banners/banner-medium-discover_464-256.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/banners/banner-medium-discover_464-256.jpg
--------------------------------------------------------------------------------
/public/images/home/banners/banner-medium-discover_656-360.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/banners/banner-medium-discover_656-360.jpg
--------------------------------------------------------------------------------
/public/images/home/banners/banner-medium-discover_752-360.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/banners/banner-medium-discover_752-360.jpg
--------------------------------------------------------------------------------
/public/images/home/banners/banner-medium-new_304-176.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/banners/banner-medium-new_304-176.jpg
--------------------------------------------------------------------------------
/public/images/home/banners/banner-medium-new_464-256.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/banners/banner-medium-new_464-256.jpg
--------------------------------------------------------------------------------
/public/images/home/banners/banner-medium-new_656-360.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/banners/banner-medium-new_656-360.jpg
--------------------------------------------------------------------------------
/public/images/home/banners/banner-medium-new_752-360.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/banners/banner-medium-new_752-360.jpg
--------------------------------------------------------------------------------
/public/images/home/banners/banner-small-gear_304-184.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/banners/banner-small-gear_304-184.jpg
--------------------------------------------------------------------------------
/public/images/home/banners/banner-small-gear_432-248.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/banners/banner-small-gear_432-248.jpg
--------------------------------------------------------------------------------
/public/images/home/banners/banner-small-men_304-184.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/banners/banner-small-men_304-184.jpg
--------------------------------------------------------------------------------
/public/images/home/banners/banner-small-men_432-248.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/banners/banner-small-men_432-248.jpg
--------------------------------------------------------------------------------
/public/images/home/banners/banner-small-women_304-184.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/banners/banner-small-women_304-184.jpg
--------------------------------------------------------------------------------
/public/images/home/banners/banner-small-women_432-248.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/banners/banner-small-women_432-248.jpg
--------------------------------------------------------------------------------
/public/images/home/brand-example_112-112.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/home/brand-example_112-112.png
--------------------------------------------------------------------------------
/public/images/icons/arrow-down.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/public/images/login/banner-304-144.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/login/banner-304-144.jpg
--------------------------------------------------------------------------------
/public/images/login/banner-304-144@2x.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/login/banner-304-144@2x.jpg
--------------------------------------------------------------------------------
/public/images/login/banner-304-144@3x.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/login/banner-304-144@3x.jpg
--------------------------------------------------------------------------------
/public/images/login/banner-464-360@2x.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/login/banner-464-360@2x.jpg
--------------------------------------------------------------------------------
/public/images/login/banner-656-360.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/login/banner-656-360.jpg
--------------------------------------------------------------------------------
/public/images/product-view/banner.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/product-view/banner.jpg
--------------------------------------------------------------------------------
/public/images/product-view/slider-image.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/product-view/slider-image.jpg
--------------------------------------------------------------------------------
/public/images/product/cart-product-160_160.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/product/cart-product-160_160.jpg
--------------------------------------------------------------------------------
/public/images/product/minicart-product-72_72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/product/minicart-product-72_72.png
--------------------------------------------------------------------------------
/public/images/product/product-base.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/product/product-base.jpg
--------------------------------------------------------------------------------
/public/images/product/product-img-230_180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/product/product-img-230_180.png
--------------------------------------------------------------------------------
/public/images/product/product-img-70_46.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/product/product-img-70_46.png
--------------------------------------------------------------------------------
/public/images/product/product-second.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/product/product-second.jpg
--------------------------------------------------------------------------------
/public/images/slider/slider-1500_500.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/slider/slider-1500_500.png
--------------------------------------------------------------------------------
/public/images/slider/slider-1920_500.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/slider/slider-1920_500.png
--------------------------------------------------------------------------------
/public/images/slider/slider-480_510.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/slider/slider-480_510.png
--------------------------------------------------------------------------------
/public/images/slider/slider-768_500.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/slider/slider-768_500.png
--------------------------------------------------------------------------------
/public/images/slider/slider-992_646.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/slider/slider-992_646.png
--------------------------------------------------------------------------------
/public/images/swatch/swatch-green.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/swatch/swatch-green.jpg
--------------------------------------------------------------------------------
/public/images/swatch/swatch-orange.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/swatch/swatch-orange.jpg
--------------------------------------------------------------------------------
/public/images/swatch/swatch-red.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/swatch/swatch-red.jpg
--------------------------------------------------------------------------------
/public/images/swatch/swatch-white.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SnowdogApps/magento2-alpaca-components/1a88626c3fe124052d2e8b2fa4c78ee6067af856/public/images/swatch/swatch-white.jpg
--------------------------------------------------------------------------------
/public/tests/a11y-test.js:
--------------------------------------------------------------------------------
1 | 'use-strict'
2 |
3 |
4 | function logError(error) {
5 | const a11yWrap = document.getElementById('a11y-test');
6 | const errorMsg = `${error.name}
7 | ${error.message}`;
8 |
9 | error.element.classList.add('a11y-test__error-element');
10 | console.log(`%c ${error.name}\n\n${error.message}`, 'color: #ff5252');
11 | a11yWrap.classList.add('a11y-test--error');
12 | a11yWrap.innerHTML += errorMsg;
13 | }
14 |
15 | document.addEventListener('DOMContentLoaded', function() {
16 | accessibilityjs.scanForProblems(document, logError)
17 | });
18 |
--------------------------------------------------------------------------------
/static.json:
--------------------------------------------------------------------------------
1 | {
2 | "root": "dest/"
3 | }
4 |
--------------------------------------------------------------------------------