├── .eslintrc.js ├── .gitignore ├── .theme-check.yml ├── .vscode ├── extensions.json ├── settings.json └── tasks.json ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── _stock ├── collections │ ├── collection-1.jpg │ ├── collection-2.jpg │ ├── collection-3.jpg │ ├── collection-4.jpg │ ├── collection-5.jpg │ └── collection-6.jpg ├── lifestyle │ ├── lifestyle-1.jpg │ └── lifestyle-2.jpg ├── no-image.jpg └── products │ ├── product-1.jpg │ ├── product-2.jpg │ ├── product-3.jpg │ ├── product-4.jpg │ ├── product-5.jpg │ └── product-6.jpg ├── assets ├── base.css ├── base.js ├── cart.css ├── cart.js ├── collection.css ├── collection.js ├── custom.css ├── custom.js ├── product.css ├── product.js ├── search.js ├── sections.css ├── sections.js ├── variables.css.liquid ├── vendor-bootstrap.bundle.min.js ├── vendor-bootstrap.min.css ├── vendor-swiper.bundle.min.css └── vendor-swiper.bundle.min.js ├── config ├── settings_data.json └── settings_schema.json ├── layout ├── password.liquid └── theme.liquid ├── locales └── en.default.json ├── package.json ├── sections ├── announcement-bar.liquid ├── article-main.liquid ├── blog-header.liquid ├── blog-main.liquid ├── blog-slider.liquid ├── card-list.liquid ├── card-slider.liquid ├── cart-count-badge.liquid ├── collection-header.liquid ├── collection-products.liquid ├── contact-form.liquid ├── faq.liquid ├── featured-collections.liquid ├── featured-products.liquid ├── footer-group.json ├── footer.liquid ├── header-group.json ├── hero-carousel.liquid ├── html.liquid ├── media-with-text.liquid ├── navbar.liquid ├── newsletter.liquid ├── offcanvas-cart.liquid ├── page-content.liquid ├── password-main.liquid ├── predictive-search.liquid ├── product-main.liquid ├── richtext.liquid ├── search-main.liquid ├── separator.liquid └── testimonials.liquid ├── snippets ├── article-card.liquid ├── cart-count-badge.liquid ├── cart-footer.liquid ├── cart-items.liquid ├── cart-note.liquid ├── collection-card.liquid ├── collection-filters.liquid ├── collection-utilities.liquid ├── footer-block.liquid ├── image-url.liquid ├── meta-tags.liquid ├── modal-localization.liquid ├── navbar-desktop-icons.liquid ├── navbar-desktop-menu.liquid ├── navbar-logo.liquid ├── offcanvas-cart.liquid ├── offcanvas-menu.liquid ├── offcanvas-search.liquid ├── pagination.liquid ├── payment-icons.liquid ├── product-block-atc-button.liquid ├── product-block-collapse.liquid ├── product-block-liquid.liquid ├── product-block-media-gallery.liquid ├── product-block-options.liquid ├── product-block-price.liquid ├── product-block-richtext.liquid ├── product-block-separator.liquid ├── product-block-stock-indicator.liquid ├── product-block-title.liquid ├── product-block-trust-icons.liquid ├── product-card-form.liquid ├── product-card-price.liquid ├── product-card.liquid ├── product-custom-badge.liquid ├── product-rating-badge.liquid ├── rich-snippets.liquid ├── section-header.liquid ├── social-icons.liquid ├── styles-scripts.liquid └── svg-icons.liquid ├── src └── bootstrap.scss └── templates ├── 404.liquid ├── article.json ├── blog.json ├── cart.liquid ├── collection.json ├── gift_card.liquid ├── index.json ├── list-collections.json ├── page.about.json ├── page.contact.json ├── page.faq.json ├── page.liquid ├── password.json ├── product.json └── search.json /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2021: true 5 | }, 6 | extends: [ 7 | 'standard' 8 | ], 9 | parserOptions: { 10 | ecmaVersion: 'latest', 11 | sourceType: 'module' 12 | }, 13 | rules: { 14 | indent: ['error', 2] 15 | }, 16 | ignorePatterns: ['**/[vendor]*.js'], 17 | globals: { 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # General 2 | node_modules 3 | config.yml 4 | .DS_Store 5 | package-lock.json -------------------------------------------------------------------------------- /.theme-check.yml: -------------------------------------------------------------------------------- 1 | NestedSnippet: 2 | enabled: false 3 | SchemaJsonFormat: 4 | enabled: false -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["shopify.theme-check-vscode"] 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "css.styleSheets": [ 3 | "/assets/utilities.css" 4 | ], 5 | "search.exclude": { 6 | "/assets/bootstrap.bundle.js": true, 7 | "/assets/bootstrap.css": true 8 | }, 9 | "task.allowAutomaticTasks": "on" 10 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "label": "npm watch", 6 | "type": "shell", 7 | "command": "npm run watch", 8 | "presentation": { 9 | "reveal": "always", 10 | "panel": "new", 11 | "group": "1" 12 | }, 13 | "runOptions": { "runOn": "folderOpen" } 14 | }, 15 | { 16 | "label": "theme watch", 17 | "type": "shell", 18 | "command": "theme watch --allow-live", 19 | "presentation": { 20 | "reveal": "always", 21 | "panel": "new", 22 | "group": "1" 23 | }, 24 | "runOptions": { "runOn": "folderOpen" } 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | # Change Log 3 | 4 | ## [5.0.0] - 2024-03-23 5 | - New release 6 | 7 | ## [4.0.0] - 2022-12-26 8 | - New release 9 | 10 | ## [3.1.0] - 2021-06-02 11 | - Small fix with fonts missing semicolumn #57 12 | - Recommended products JS issue in the homepage #58 13 | - Megamenu in offcanvas menu is missing #60 14 | - Search page is missing styles #62 15 | - Delete empty file "section/offcanvas-menu.liquid" #59 16 | - Update package.json required dependencies #64 17 | - Issue on the collection filters, when 2 values are the same #65 18 | - Options selector script doesn't work with 3 product options #66 19 | - Newsletter section has wrong closing div tag #67 20 | - Fonts should be loaded below the bootstrap.css file #68 21 | 22 | ## [3.0.0] - 2021-05-16 -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at info@kondasoft.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 KondaSoft 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # KS BootShop - Free Shopify Theme 2 | Free Shopify theme powered by the Bootstrap framework (v5), developed respecting Shopify theme requirements, accessibility best practices, and of course our own experience developing high-quality themes for more than 15 years. We aim to make this project the most complete, robust, and awesome Shopify Theme for the Bootstrap framework. 3 | 4 | ## Highlighted features: 5 | * Advanced styling for each section (New) 6 | * Powered by [Bootstrap framework](https://getbootstrap.com/) (v5) 7 | * Developed respecting [Shopify themes requirements](https://shopify.dev/tutorials/review-theme-store-requirements) 8 | * All elements are fully accessible with [aria attributes](https://www.w3.org/WAI/standards-guidelines/aria/) 9 | * No Javascript framework dependencies (e.g. jQuery) 10 | * Support for [native image lazy-loading](https://web.dev/native-lazy-loading/) 11 | * PageSeed score 96/100 [check results](https://developers.google.com/speed/pagespeed/insights/?url=https%3A%2F%2Fks-bootshop.myshopify.com%2F&tab=desktop) 12 | * All Shopify required homepage sections (~20) 13 | * All Shopify templates (cart, product, etc.) have their corresponding settings 14 | * Product layout option grid or list 15 | * Ajax add to cart 16 | * Recommended products section [Learn more](https://shopify.dev/tutorials/develop-theme-recommended-products) 17 | 18 | ## Sections 19 | * Announcement bar 20 | * Card slider/list 21 | * Contact form 22 | * FAQ 23 | * Featured collections 24 | * Featured Products 25 | * Hero carousel 26 | * HTML 27 | * Media with text 28 | * Newsletter 29 | * Richtext 30 | * Separator 31 | * Testimonials 32 | 33 | ## Premium Shopify Themes 34 | Ready to take your Shopify store to the next level with advanced features like: 35 | - Cart upsells 36 | - Cart goal 37 | - Cart gift 38 | - Shipping Calculator 39 | - Quantity Breaks 40 | - Combo cross-sells 41 | - Wishlist 42 | - Recently viewed 43 | - Megamenu 44 | - Color swatches 45 | - Quick view 46 | - Inventory bar 47 | - Bundle Builder 48 | - and much more... 49 | 50 | [Browse 15+ Premium Shopify Themes](https://www.kondasoft.com/collections/shopify-themes) 51 | 52 | ## Demo 53 | https://ks-bootshop.myshopify.com 54 | 55 | ## Download Theme 56 | https://github.com/kondasoft/ks-bootshop/releases 57 | 58 | ## Installation 59 | **Note:** Please, make sure you are familiar with [Theme kit](https://shopify.github.io/themekit/), and official documentation before proceeding. We are assuming that at this point you have already installed the Theme Kit. 60 | 61 | ### 1- Clone this repository (download theme files) 62 | Create a new folder on your computer, `cd` to it, and run the following command to copy all theme files from our GitHub repository master branch. Note: Include the dot at the end of the command to clone into your current directory. 63 | 64 | `git clone https://github.com/kondasoft/ks-bootshop .` 65 | 66 | ### 2- Create and configure theme with Theme Kit 67 | Run the following command to create a new theme in your Shopify store along with our theme files that you have just downloaded: 68 | 69 | `theme new --password=[your-api-password] --store=[your-store.myshopify.com] --name="ks-bootshop-v3"` 70 | 71 | Optional: Run this command to open your Shopify store with our theme in preview mode. 72 | 73 | `theme open` 74 | 75 | ## Customization 76 | Please don't directly modify theme files as you will lose any changes when you upgrade our theme. The recommended way to handle this is by creating a copy of our theme and then modifying it. Please follow this [official tutorial](https://help.shopify.com/en/manual/online-store/legacy/using-themes/managing-themes/duplicating-themes) to learn more. 77 | 78 | Also, we have provided 2 blank files (`custom.css` and `custom.js`) which are inside the `assets` folder. It is recommended that you use these 2 files to add your styles and scripts since they will not be changed during the upgrade. 79 | 80 | ### Modifying styles (SCSS) 81 | We have provided only a few additional styles for this Shopify theme, and all of those are done via plain CSS in the `assets` folder. Our goal for this theme is to provide a solid foundation, completely backed by the Bootstrap framework, so that you can easily get it going with the framework you already know and love. 82 | 83 | All bootstrap-related styles and variables are in the `src/bootstrap.scss` file. Assuming that you already know how to work with [Bootstrap variables](https://getbootstrap.com/docs/5.1/customize/overview/), feel free to modify this file, especially the color variables at the top of the file. 84 | 85 | After that, install all the needed npm packages that are already defined in the `packages.json` file 86 | `npm install` 87 | 88 | Now, you can compile the `bootstrap.scss` file that you have just modified using the following command: 89 | `npm run bs-css` or `npm run watch` (to continuously watch for changes) 90 | 91 | To deploy your changes on your Shopify store run the following Theme Kit command: 92 | `theme deploy` or: `theme watch` 93 | 94 | ## Support 95 | Please submit a [new issue](https://github.com/kondasoft/ks-bootshop/issues/new) in case you want to submit a bug or feature request. Also, you can visit our [website](https://www.kondasoft.com/) for more help. 96 | 97 | ## Copyright and license 98 | Copyright 2024 [kondasoft.com](https://www.kondasoft.com). The code was released under the [MIT License](https://github.com/kondasoft/ks-bootshop/blob/master/LICENSE). 99 | -------------------------------------------------------------------------------- /_stock/collections/collection-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/collections/collection-1.jpg -------------------------------------------------------------------------------- /_stock/collections/collection-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/collections/collection-2.jpg -------------------------------------------------------------------------------- /_stock/collections/collection-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/collections/collection-3.jpg -------------------------------------------------------------------------------- /_stock/collections/collection-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/collections/collection-4.jpg -------------------------------------------------------------------------------- /_stock/collections/collection-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/collections/collection-5.jpg -------------------------------------------------------------------------------- /_stock/collections/collection-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/collections/collection-6.jpg -------------------------------------------------------------------------------- /_stock/lifestyle/lifestyle-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/lifestyle/lifestyle-1.jpg -------------------------------------------------------------------------------- /_stock/lifestyle/lifestyle-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/lifestyle/lifestyle-2.jpg -------------------------------------------------------------------------------- /_stock/no-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/no-image.jpg -------------------------------------------------------------------------------- /_stock/products/product-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/products/product-1.jpg -------------------------------------------------------------------------------- /_stock/products/product-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/products/product-2.jpg -------------------------------------------------------------------------------- /_stock/products/product-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/products/product-3.jpg -------------------------------------------------------------------------------- /_stock/products/product-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/products/product-4.jpg -------------------------------------------------------------------------------- /_stock/products/product-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/products/product-5.jpg -------------------------------------------------------------------------------- /_stock/products/product-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kondasoft/ks-bootshop/91bf0a8f91f3d6990a35837f9689416ce59d7bca/_stock/products/product-6.jpg -------------------------------------------------------------------------------- /assets/base.js: -------------------------------------------------------------------------------- 1 | /* 2 | © 2024 KondaSoft 3 | https://www.kondasoft.com 4 | */ 5 | 6 | console.log('KS BootShop - Free Shopify Theme by KondaSoft.com | Learn more at https://www.kondasoft.com') 7 | 8 | // Init Bootstrap tooltips 9 | document.querySelectorAll('[data-bs-toggle="tooltip"]') 10 | .forEach((el) => new window.bootstrap.Tooltip(el)) 11 | 12 | // Init Bootstrap popovers 13 | document.querySelectorAll('[data-bs-toggle="popover"]') 14 | .forEach((el) => new window.bootstrap.Popover(el)) 15 | 16 | // Debouce 17 | window.theme.debounce = function (callback, wait = 200) { 18 | let timeout 19 | return (...args) => { 20 | const context = this 21 | clearTimeout(timeout) 22 | timeout = setTimeout(() => callback.apply(context, args), wait) 23 | } 24 | } 25 | 26 | // Throttle 27 | window.theme.throttle = function (callback, timeFrame = 200) { 28 | let lastTime = 0 29 | return function () { 30 | const now = Date.now() 31 | if (now - lastTime >= timeFrame) { 32 | callback() 33 | lastTime = now 34 | } 35 | } 36 | } 37 | 38 | // Create cookie 39 | window.theme.createCookie = function (name, value, days) { 40 | let date, expires 41 | if (days) { 42 | date = new Date() 43 | date.setDate(date.getDate() + days) 44 | expires = '; expires=' + date.toUTCString() 45 | } else { 46 | expires = '' 47 | } 48 | document.cookie = name + '=' + value + expires + '; path=/' 49 | } 50 | 51 | // Detect scroll 52 | window.addEventListener('scroll', () => { 53 | if (window.scrollY > 0) { 54 | document.documentElement.classList.add('has-scrolled') 55 | } else { 56 | document.documentElement.classList.remove('has-scrolled') 57 | } 58 | }) 59 | 60 | // Calculate "xx time ago" 61 | window.theme.calcTimeAgo = function (timestamp) { 62 | const now = new Date().getTime() 63 | const diff = now - timestamp 64 | 65 | let text 66 | 67 | if (diff < 60000) { 68 | text = window.theme.locales.times.moments 69 | } else if (diff < 3.6e+6) { 70 | const min = Math.round((diff) / 60000) 71 | text = min === 1 72 | ? `${min} ${window.theme.locales.times.minute}` 73 | : `${min} ${window.theme.locales.times.minutes}` 74 | } else if (diff < 8.64e+7) { 75 | const hours = Math.round((diff) / 3.6e+6) 76 | text = hours === 1 77 | ? `${hours} ${window.theme.locales.times.hour}` 78 | : `${hours} ${window.theme.locales.times.hours}` 79 | } else { 80 | const days = Math.round((diff) / 8.64e+7) 81 | text = days === 1 82 | ? `${days} ${window.theme.locales.times.day}` 83 | : `${days} ${window.theme.locales.times.days}` 84 | } 85 | 86 | return `${text} ${window.theme.locales.times.ago}` 87 | } 88 | 89 | // Format money 90 | window.Shopify.formatMoney = function (cents, moneyFormat = window.Shopify.moneyFormat) { 91 | if (typeof cents === 'string') { 92 | cents = cents.replace('.', '') 93 | } 94 | 95 | let value = '' 96 | const placeholderRegex = /\{\{\s*(\w+)\s*\}\}/ 97 | 98 | function defaultOption (opt, def) { 99 | return (typeof opt === 'undefined' ? def : opt) 100 | } 101 | 102 | function formatWithDelimiters (number, precision, thousands, decimal) { 103 | precision = defaultOption(precision, 2) 104 | thousands = defaultOption(thousands, ',') 105 | decimal = defaultOption(decimal, '.') 106 | 107 | if (isNaN(number) || number == null) { 108 | return 0 109 | } 110 | 111 | number = (number / 100.0).toFixed(precision) 112 | 113 | const parts = number.split('.') 114 | const dollars = parts[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1' + thousands) 115 | const cents = parts[1] ? (decimal + parts[1]) : '' 116 | 117 | return dollars + cents 118 | } 119 | 120 | switch (moneyFormat.match(placeholderRegex)[1]) { 121 | case 'amount': 122 | value = formatWithDelimiters(cents, 2) 123 | break 124 | case 'amount_no_decimals': 125 | value = formatWithDelimiters(cents, 0) 126 | break 127 | case 'amount_with_comma_separator': 128 | value = formatWithDelimiters(cents, 2, '.', ',') 129 | break 130 | case 'amount_no_decimals_with_comma_separator': 131 | value = formatWithDelimiters(cents, 0, '.', ',') 132 | break 133 | } 134 | 135 | return moneyFormat.replace(placeholderRegex, value) 136 | } 137 | 138 | // Resize images 139 | window.Shopify.resizeImage = function (src, size, crop = '') { 140 | return src.replace(/_(pico|icon|thumb|small|compact|medium|large|grande|original|1024x1024|2048x2048|master)+\./g, '.') 141 | .replace(/\.jpg|\.png|\.gif|\.jpeg/g, (match) => { 142 | if (crop.length) { 143 | crop = `_crop_${crop}` 144 | } 145 | return `_${size}${crop}${match}` 146 | }) 147 | } 148 | 149 | // Shopify's callenge page 150 | document.querySelector('.btn.shopify-challenge__button') 151 | ?.classList.add('btn-primary') 152 | 153 | // Shopify's errors messages 154 | const errors = document.querySelector('.errors') 155 | if (errors) { 156 | errors.classList.add('alert', 'alert-danger') 157 | } 158 | 159 | // Wrap Shopify's section apps within a container 160 | document.querySelectorAll('.shopify-section > .shopify-app-block').forEach(elem => { 161 | elem.classList.add('container') 162 | }) 163 | 164 | // Detect viewport with the Intersection Observer API 165 | const observer = new IntersectionObserver((entries) => { 166 | entries.forEach((entry) => { 167 | if (entry.isIntersecting) { 168 | entry.target.classList.add('viewport-entered') 169 | } else { 170 | entry.target.classList.remove('viewport-entered') 171 | } 172 | }) 173 | }, { threshold: 0.4 }) 174 | 175 | document.querySelectorAll('.viewport-detect').forEach((el) => { 176 | observer.observe(el) 177 | }) 178 | 179 | // Swiper Slider 180 | class SwiperSlider extends HTMLElement { 181 | constructor () { 182 | super() 183 | 184 | this.init() 185 | 186 | document.addEventListener('shopify:section:load', (event) => { 187 | if (event.detail.sectionId === this.dataset.sectionId) { 188 | this.init() 189 | } 190 | }) 191 | } 192 | 193 | init () { 194 | this.slider = new window.Swiper(this.querySelector('.swiper'), { 195 | speed: this.speed, 196 | autoplay: this.autoplay, 197 | navigation: this.navigation, 198 | pagination: this.pagination, 199 | scrollbar: this.scrollbar, 200 | breakpoints: this.breakpoints, 201 | rewind: true 202 | }) 203 | } 204 | 205 | speed = Number(this.dataset.sliderSpeed) 206 | 207 | autoplay = this.dataset.sliderAutoplay === '0' 208 | ? undefined 209 | : { delay: Number(this.dataset.sliderAutoplay) * 1000 } 210 | 211 | navigation = { 212 | enabled: this.dataset.sliderNavigation === 'true', 213 | prevEl: '.swiper-button-prev', 214 | nextEl: '.swiper-button-next' 215 | } 216 | 217 | pagination = { 218 | enabled: this.dataset.sliderPagination === 'true', 219 | el: '.swiper-pagination', 220 | type: 'bullets', 221 | dynamicBullets: true, 222 | dynamicMainBullets: 2, 223 | renderFraction: function (currentClass, totalClass) { 224 | return `/` 225 | } 226 | } 227 | 228 | scrollbar = { 229 | enabled: this.dataset.sliderScrollbar === 'true', 230 | el: this.querySelector('.swiper-scrollbar'), 231 | draggable: true 232 | } 233 | 234 | breakpoints = { 235 | 0: { slidesPerView: Number(this.dataset.breakpointMobile) }, 236 | 600: { slidesPerView: Number(this.dataset.breakpointTablet) }, 237 | 1200: { slidesPerView: Number(this.dataset.breakpointDesktop) } 238 | } 239 | } 240 | customElements.define('swiper-slider', SwiperSlider) 241 | 242 | /* 243 | Localization form 244 | */ 245 | document.querySelectorAll('.shopify-localization-form button').forEach(btn => { 246 | btn.addEventListener('click', () => { 247 | btn.closest('form').querySelector('[name="country_code"]').value = btn.dataset.isoCode 248 | btn.closest('form').submit() 249 | }) 250 | }) 251 | -------------------------------------------------------------------------------- /assets/cart.css: -------------------------------------------------------------------------------- 1 | /* 2 | © 2024 KondaSoft 3 | https://www.kondasoft.com 4 | */ 5 | 6 | /* 7 | Offcanvas cart 8 | */ 9 | .offcanvas-cart .offcanvas-body { 10 | transition: all 0.2s ease-out; 11 | } 12 | 13 | .offcanvas-cart .loading .offcanvas-body { 14 | opacity: 0.2; 15 | } 16 | 17 | .offcanvas-cart .cart-container { 18 | display: flex; 19 | flex-direction: column; 20 | height: 100%; 21 | } 22 | 23 | .offcanvas-cart .offcanvas-footer { 24 | padding: 1rem; 25 | border-top: 1px solid var(--bs-border-color); 26 | } 27 | 28 | .offcanvas-cart .cart-subtotal { 29 | display: flex; 30 | justify-content: space-between; 31 | align-items: center; 32 | } 33 | 34 | .offcanvas-cart .btn-checkout { 35 | width: 100%; 36 | display: flex; 37 | align-items: center; 38 | justify-content: center; 39 | position: relative; 40 | } 41 | 42 | .offcanvas-cart .cart-empty { 43 | } 44 | 45 | @media (max-width: 575px) { 46 | .offcanvas-cart { 47 | width: 100% !important; 48 | } 49 | } 50 | 51 | /* 52 | Cart Goal 53 | */ 54 | 55 | 56 | /* 57 | Cart Upsell 58 | */ 59 | 60 | 61 | /* 62 | Cart note 63 | */ 64 | 65 | 66 | /* 67 | Shipping calculator 68 | */ 69 | -------------------------------------------------------------------------------- /assets/cart.js: -------------------------------------------------------------------------------- 1 | /* 2 | © 2024 KondaSoft 3 | https://www.kondasoft.com 4 | */ 5 | 6 | class Cart extends HTMLElement { 7 | constructor () { 8 | super() 9 | 10 | this.querySelectorAll('[name="updates[]"]').forEach(input => 11 | input.addEventListener('change', () => 12 | this.change(input.dataset.lineItemKey, Number(input.value)) 13 | ) 14 | ) 15 | 16 | this.querySelectorAll('.btn-line-item-remove').forEach(btn => 17 | btn.addEventListener('click', () => 18 | this.change(btn.dataset.lineItemKey, 0) 19 | ) 20 | ) 21 | 22 | this.showOffcanvasIfUrl() 23 | this.adjustCollapses() 24 | } 25 | 26 | async add (formData) { 27 | formData.append('sections', ['cart-count-badge', 'offcanvas-cart']) 28 | formData.append('sections_url', window.location.pathname) 29 | 30 | const response = await fetch(`${window.Shopify.routes.cart_add_url}.js`, { 31 | method: 'POST', 32 | body: formData 33 | }) 34 | console.log(response) 35 | const data = await response.json() 36 | console.log(data) 37 | 38 | if (response.ok) { 39 | window.dispatchEvent(new CustomEvent('kt.cart.added', { detail: data })) 40 | this.reloadCartElements(data.sections) 41 | } else { 42 | this.showError(data.description) 43 | } 44 | 45 | document.querySelectorAll('.offcanvas').forEach(offcanvas => { 46 | if (offcanvas.id === 'offcanvas-cart') { 47 | window.bootstrap.Offcanvas.getOrCreateInstance(offcanvas).show() 48 | } else { 49 | window.bootstrap.Offcanvas.getOrCreateInstance(offcanvas).hide() 50 | } 51 | }) 52 | } 53 | 54 | async change (id, quantity) { 55 | this.classList.add('loading') 56 | 57 | const response = await fetch(`${window.Shopify.routes.cart_change_url}.js`, { 58 | method: 'POST', 59 | headers: { 'Content-Type': 'application/json' }, 60 | body: JSON.stringify({ 61 | id, 62 | quantity, 63 | sections: ['cart-count-badge', 'offcanvas-cart'], 64 | sections_url: window.location.pathname 65 | }) 66 | }) 67 | console.log(response) 68 | const data = await response.json() 69 | console.log(data) 70 | 71 | if (response.ok) { 72 | window.dispatchEvent(new CustomEvent('kt.cart.changed', { detail: data })) 73 | this.reloadCartElements(data.sections) 74 | } else { 75 | this.showError(data.description) 76 | } 77 | 78 | this.classList.remove('loading') 79 | } 80 | 81 | reloadCartElements (sections) { 82 | for (const [key, value] of Object.entries(sections)) { 83 | const newDoc = new DOMParser().parseFromString(value, 'text/html') 84 | 85 | switch (key) { 86 | case 'cart-count-badge': 87 | document.querySelectorAll('.cart-count-badge').forEach(elem => { 88 | const newDoc = new DOMParser().parseFromString(value, 'text/html') 89 | elem.replaceWith(newDoc.querySelector('.cart-count-badge')) 90 | }) 91 | break 92 | case 'offcanvas-cart': 93 | this.replaceWith(newDoc.querySelector('cart-container')) 94 | break 95 | } 96 | } 97 | 98 | window.dispatchEvent(new CustomEvent('kt.cart.reloaded')) 99 | } 100 | 101 | showError (message) { 102 | const alert = this.querySelector('.alert') 103 | 104 | if (alert) { 105 | alert.querySelector('[data-alert-msg]').innerHTML = message 106 | alert.removeAttribute('hidden') 107 | } 108 | } 109 | 110 | showOffcanvasIfUrl () { 111 | if (new URLSearchParams(window.location.search).has('cart')) { 112 | const offcanvas = document.querySelector('#offcanvas-cart') 113 | 114 | if (offcanvas) { 115 | window.bootstrap.Offcanvas.getOrCreateInstance(offcanvas).show() 116 | } 117 | } 118 | } 119 | 120 | adjustCollapses () { 121 | this.querySelectorAll('[data-bs-toggle="collapse"]').forEach(elem => { 122 | elem.addEventListener('click', () => { 123 | setTimeout(() => { 124 | const offcanvasBody = this.querySelector('.offcanvas-body') 125 | offcanvasBody.scroll({ top: offcanvasBody.scrollHeight, behavior: 'smooth' }) 126 | }, 250) 127 | }) 128 | }) 129 | } 130 | } 131 | customElements.define('cart-container', Cart) 132 | 133 | class CartNote extends HTMLElement { 134 | constructor () { 135 | super() 136 | 137 | this.input = this.querySelector('textarea') 138 | this.btn = this.querySelector('button') 139 | this.btn.addEventListener('click', this.onSubmit.bind(this)) 140 | } 141 | 142 | async onSubmit () { 143 | this.btn.classList.add('loading') 144 | 145 | await fetch(`${window.Shopify.routes.cart_update_url}.js`, { 146 | method: 'POST', 147 | headers: { 'Content-Type': 'application/json' }, 148 | body: JSON.stringify({ note: this.input.value }) 149 | }) 150 | 151 | this.btn.innerHTML = `✓ ${this.btn.dataset.textNoteSaved}` 152 | 153 | setTimeout(() => { 154 | this.btn.innerHTML = this.btn.dataset.textBtnSave 155 | }, 3000) 156 | 157 | this.btn.classList.remove('loading') 158 | } 159 | } 160 | customElements.define('cart-note', CartNote) 161 | -------------------------------------------------------------------------------- /assets/collection.css: -------------------------------------------------------------------------------- 1 | /* 2 | © 2024 KondaSoft 3 | https://www.kondasoft.com 4 | */ 5 | 6 | /* 7 | Collection header 8 | */ 9 | .collection-header { 10 | border-top-style: solid; 11 | border-bottom-style: solid; 12 | text-align: center; 13 | } 14 | 15 | 16 | /* 17 | Collection products 18 | */ 19 | .collection-products { 20 | border-top-style: solid; 21 | border-bottom-style: solid; 22 | } 23 | 24 | .product-list { 25 | list-style: none; 26 | padding: 0; 27 | margin: 0; 28 | transition: all .2s ease-out; 29 | } 30 | 31 | .collection-utilities { 32 | display: flex; 33 | justify-content: space-between; 34 | align-items: center; 35 | } 36 | 37 | .sort-by input + label { 38 | cursor: pointer; 39 | } 40 | 41 | .sort-by input:checked + label { 42 | color: var(--bs-primary); 43 | } 44 | 45 | .sort-by input:focus-visible + label { 46 | box-shadow: var(--bs-focus-box-shadow); 47 | } 48 | 49 | /* 50 | Collection filters 51 | */ 52 | #offcanvas-collection-filters { 53 | width: 320px; 54 | } 55 | 56 | .collection-filters { 57 | display: flex; 58 | flex-direction: column; 59 | height: 100%; 60 | } 61 | 62 | .collection-filters .collapse-wrapper { 63 | border-bottom: none; 64 | margin: 0; 65 | } 66 | 67 | .collection-filters .collapse-wrapper button[data-bs-toggle=collapse] { 68 | background-color: var(--bs-light); 69 | padding: 0.75rem 1rem; 70 | font-weight: 500; 71 | } 72 | 73 | .collection-filters .collapse-wrapper button[data-bs-toggle=collapse]::after { 74 | right: 0.75rem; 75 | } 76 | 77 | .collection-filters .collapse-wrapper .collapse-inner { 78 | padding: .25rem 1rem 1.5rem; 79 | } 80 | 81 | .collection-filters .form-check { 82 | font-size: 0.9rem; 83 | margin-top: 0.25rem; 84 | margin-bottom: 0.25rem; 85 | } 86 | 87 | 88 | /* 89 | Collection card 90 | */ 91 | .collection-card-link { 92 | display: block; 93 | text-decoration: none; 94 | color: currentColor; 95 | } 96 | 97 | .collection-card-link:focus-visible { 98 | outline: 0; 99 | box-shadow: var(--bs-focus-box-shadow); 100 | } 101 | 102 | .collection-card-title { 103 | transition: all 200ms ease-out; 104 | } 105 | 106 | .collection-card-img-wrapper { 107 | position: relative; 108 | } 109 | 110 | .collection-card-img-wrapper img { 111 | width: 100%; 112 | } 113 | 114 | .collection-card-title-normal { 115 | margin-top: 0.5rem; 116 | } 117 | 118 | .collection-card-link:hover .collection-card-title-normal, 119 | .collection-card-link:focus .collection-card-title-normal { 120 | opacity: .8; 121 | } 122 | 123 | 124 | -------------------------------------------------------------------------------- /assets/collection.js: -------------------------------------------------------------------------------- 1 | /* 2 | © 2024 KondaSoft 3 | https://www.kondasoft.com 4 | */ 5 | 6 | const loadCollection = async () => { 7 | const collectionProducts = document.querySelector('.collection-products') 8 | const productList = collectionProducts.querySelector('.product-list') 9 | const filters = document.querySelector('.collection-filters') 10 | 11 | if (productList) { 12 | productList.style.opacity = '.2' 13 | } 14 | 15 | const response = await fetch(window.location.href) 16 | const data = await response.text() 17 | const parser = new DOMParser() 18 | const newDocument = parser.parseFromString(data, 'text/html') 19 | 20 | collectionProducts?.replaceWith(newDocument.querySelector('.collection-products')) 21 | filters?.replaceWith(newDocument.querySelector('.collection-filters')) 22 | 23 | window.dispatchEvent(new CustomEvent('kt.collection.loaded')) 24 | 25 | const newCollectionProducts = document.querySelector('.collection-products') 26 | const navbarHeight = document.querySelector('[id*="__navbar"].sticky-top')?.clientHeight || 0 27 | newCollectionProducts.style.scrollMarginTop = `${navbarHeight}px` 28 | newCollectionProducts.scrollIntoView() 29 | } 30 | 31 | class CollectionFilters extends HTMLElement { 32 | constructor () { 33 | super() 34 | 35 | this.form = this.querySelector('form') 36 | 37 | this.form.querySelectorAll('input').forEach(input => { 38 | input.addEventListener('change', () => { 39 | const params = new URLSearchParams(new FormData(this.form)) 40 | const url = `${window.location.pathname}?${params.toString()}` 41 | window.history.replaceState({}, '', url) 42 | 43 | loadCollection() 44 | }) 45 | }) 46 | 47 | this.querySelectorAll('.btn-filters-clear-all').forEach(btn => { 48 | const params = new URLSearchParams(window.location.search) 49 | 50 | for (const key of params.keys()) { 51 | if (key.includes('filter.')) { 52 | btn.removeAttribute('hidden') 53 | } 54 | } 55 | 56 | btn.addEventListener('click', () => { 57 | for (const key of [...params.keys()]) { 58 | if (key.includes('filter.')) { 59 | params.delete(key) 60 | } 61 | } 62 | 63 | const url = `${window.location.pathname}?${params.toString()}` 64 | window.history.replaceState({}, '', url) 65 | loadCollection() 66 | }) 67 | }) 68 | } 69 | } 70 | customElements.define('collection-filters', CollectionFilters) 71 | 72 | class SortBy extends HTMLElement { 73 | constructor () { 74 | super() 75 | 76 | this.querySelectorAll('input').forEach(input => { 77 | input.addEventListener('change', () => { 78 | this.setUrl(input.value) 79 | loadCollection() 80 | }) 81 | }) 82 | } 83 | 84 | setUrl (value) { 85 | const params = new URLSearchParams(window.location.search) 86 | params.set('sort_by', value) 87 | params.delete('page') 88 | const url = `${window.location.pathname}?${params.toString()}` 89 | window.history.replaceState({}, '', url) 90 | } 91 | } 92 | customElements.define('sort-by', SortBy) 93 | 94 | class Pagination extends HTMLElement { 95 | constructor () { 96 | super() 97 | 98 | this.querySelectorAll('a').forEach(elem => { 99 | elem.addEventListener('click', (event) => { 100 | event.preventDefault() 101 | 102 | this.setUrl(elem.dataset.newPage) 103 | loadCollection() 104 | }) 105 | }) 106 | } 107 | 108 | setUrl (value) { 109 | const params = new URLSearchParams(window.location.search) 110 | params.set('page', value) 111 | const url = `${window.location.pathname}?${params.toString()}` 112 | window.history.replaceState({}, '', url) 113 | } 114 | } 115 | customElements.define('collection-pagination', Pagination) 116 | -------------------------------------------------------------------------------- /assets/custom.css: -------------------------------------------------------------------------------- 1 | /* 2 | Add here your own custom css styles 3 | */ -------------------------------------------------------------------------------- /assets/custom.js: -------------------------------------------------------------------------------- 1 | /* 2 | Add here your own custom javascript codes 3 | */ 4 | -------------------------------------------------------------------------------- /assets/search.js: -------------------------------------------------------------------------------- 1 | /* 2 | © 2024 KondaSoft 3 | https://www.kondasoft.com 4 | */ 5 | 6 | class PredictiveSearch extends HTMLElement { 7 | constructor () { 8 | super() 9 | 10 | this.form = this.querySelector('form.search-form') 11 | this.input = this.form.querySelector('input[type="search"]') 12 | this.results = this.form.querySelector('#predictive-search') 13 | this.status = this.form.querySelector('#predictive-search-status') 14 | 15 | this.emptyContainer = this.querySelector('.search-empty') 16 | this.cartUpsells = this.querySelector('.cart-upsells') 17 | 18 | this.input.addEventListener('input', window.theme.debounce((event) => { 19 | this.getSearchResults() 20 | }, 300).bind(this)) 21 | 22 | document.querySelector('#offcanvas-search')?.addEventListener('shown.bs.offcanvas', () => { 23 | this.input.focus() 24 | }) 25 | this.accessibilityEventIsInit = false 26 | } 27 | 28 | async getSearchResults () { 29 | const searchTerm = this.input.value.trim() 30 | 31 | if (searchTerm.length) { 32 | const response = await fetch(`${window.Shopify.routes.predictive_search_url}?q=${searchTerm}&resources[type]=${this.dataset.resourcesType}&resources[limit]=10§ion_id=predictive-search`) 33 | 34 | if (response.ok) { 35 | const data = await response.text() 36 | const resultsMarkup = new DOMParser().parseFromString(data, 'text/html').querySelector('#shopify-section-predictive-search').innerHTML 37 | 38 | this.results.innerHTML = resultsMarkup 39 | 40 | this.emptyContainer.setAttribute('hidden', 'hidden') 41 | this.cartUpsells.setAttribute('hidden', 'hidden') 42 | this.input.setAttribute('aria-expanded', 'true') 43 | this.status.textContent = this.querySelector('#predictive-search-results').dataset.resultsText 44 | 45 | this.results.querySelectorAll('.jdgm-prev-badge__stars').forEach(elem => { 46 | elem.setAttribute('tabindex', '-1') 47 | }) 48 | this.handleAccessibility() 49 | } else { 50 | // TODO: Handle errors 51 | } 52 | } else { 53 | this.emptyContainer.removeAttribute('hidden') 54 | this.cartUpsells.removeAttribute('hidden') 55 | this.results.innerHTML = '' 56 | this.input.setAttribute('aria-expanded', 'false') 57 | this.input.removeAttribute('aria-activedescendant') 58 | this.status.textContent = '' 59 | } 60 | } 61 | 62 | handleAccessibility () { 63 | let x = -1 64 | 65 | function listenKeyup (event) { 66 | const items = this.querySelectorAll('#predictive-search-results a, #predictive-search-results button') 67 | 68 | if (!items.length) return 69 | 70 | if (event.code === 'ArrowUp' || event.code === 'ArrowDown') { 71 | items.forEach(elem => { 72 | elem.closest('[role="option"]').setAttribute('aria-selected', 'false') 73 | }) 74 | } 75 | 76 | switch (event.code) { 77 | case 'ArrowUp': 78 | if (x <= 0) { 79 | x = items.length 80 | } 81 | x-- 82 | items.forEach((elem, index) => { 83 | if (index === x) { 84 | elem.focus() 85 | elem.closest('[role="option"]').setAttribute('aria-selected', 'true') 86 | this.input.setAttribute('aria-activedescendant', elem.closest('[role="option"]').getAttribute('id')) 87 | } 88 | }) 89 | break 90 | case 'ArrowDown': 91 | if (x === items.length - 1) { 92 | x = -1 93 | } 94 | x++ 95 | items.forEach((elem, index) => { 96 | if (index === x) { 97 | elem.focus() 98 | elem.closest('[role="option"]').setAttribute('aria-selected', 'true') 99 | this.input.setAttribute('aria-activedescendant', elem.closest('[role="option"]').getAttribute('id')) 100 | } 101 | }) 102 | break 103 | case 'Enter': 104 | console.log('Enter') 105 | break 106 | } 107 | } 108 | 109 | if (!this.accessibilityEventIsInit) { 110 | this.addEventListener('keyup', listenKeyup) 111 | this.accessibilityEventIsInit = true 112 | } 113 | } 114 | } 115 | 116 | customElements.define('predictive-search', PredictiveSearch) 117 | -------------------------------------------------------------------------------- /assets/sections.js: -------------------------------------------------------------------------------- 1 | /* 2 | © 2024 KondaSoft 3 | https://www.kondasoft.com 4 | */ 5 | 6 | class Navbar extends HTMLElement { 7 | constructor () { 8 | super() 9 | 10 | this.handleDropdownsBackdrop() 11 | this.handleHeaderReveal() 12 | this.adjustOffcanvasMenu() 13 | } 14 | 15 | adjustOffcanvasMenu () { 16 | const offcanvasMenu = document.querySelector('#offcanvas-menu') 17 | const navbarMobile = document.querySelector('#navbar-mobile') 18 | 19 | offcanvasMenu?.addEventListener('show.bs.offcanvas', () => { 20 | const navbarSpacing = document.querySelector('#navbar-mobile').getBoundingClientRect().bottom 21 | offcanvasMenu.style.height = `${window.innerHeight - navbarSpacing}px` 22 | 23 | navbarMobile.querySelector('.svg-icon-menu')?.classList.add('svg-icon-menu-close') 24 | }) 25 | 26 | offcanvasMenu?.addEventListener('hide.bs.offcanvas', () => { 27 | navbarMobile.querySelector('.svg-icon-menu')?.classList.remove('svg-icon-menu-close') 28 | }) 29 | } 30 | 31 | handleHeaderReveal () { 32 | let oldScroll = window.scrollY 33 | const headerGroup = document.querySelector('#header-group') 34 | 35 | window.addEventListener('scroll', () => { 36 | const newScroll = window.scrollY 37 | if (newScroll > oldScroll) { 38 | if (newScroll > headerGroup.clientHeight) { 39 | headerGroup.classList.add('hide') 40 | } 41 | } else if (newScroll < oldScroll) { 42 | headerGroup.classList.remove('hide') 43 | } 44 | 45 | oldScroll = Math.max(window.scrollY, 0) 46 | }) 47 | } 48 | 49 | handleDropdownsBackdrop () { 50 | this.querySelectorAll('#navbar-desktop .dropdown-toggle').forEach(dropdown => { 51 | dropdown.addEventListener('hidden.bs.dropdown', () => { 52 | if (!document.querySelector('#navbar-desktop .dropdown-toggle.show')) { 53 | document.body.classList.remove('navbar-dropdown-open') 54 | } 55 | }) 56 | dropdown.addEventListener('show.bs.dropdown', () => { 57 | document.body.classList.add('navbar-dropdown-open') 58 | }) 59 | }) 60 | } 61 | } 62 | customElements.define('navbar-wrapper', Navbar) 63 | -------------------------------------------------------------------------------- /assets/variables.css.liquid: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | Fonts 3 | {% endcomment %} 4 | {{ settings.font_headings | font_face: font_display: 'swap' }} 5 | 6 | {% unless settings.font_body.system %} 7 | {{ settings.font_body | font_face: font_display: 'swap' }} 8 | {{ settings.font_body | font_modify: 'weight', '500' | font_face: font_display: 'swap' }} 9 | {{ settings.font_body | font_modify: 'weight', '700' | font_face: font_display: 'swap' }} 10 | {{ settings.font_body | font_modify: 'style', 'italic' | font_face: font_display: 'swap' }} 11 | {% endunless %} 12 | 13 | :root { 14 | {%- comment -%} 15 | Colors 16 | {%- endcomment -%} 17 | --bs-primary: {{ settings.color_primary }}; 18 | --bs-primary-rgb: {{ settings.color_primary | color_to_rgb | remove: 'rgb(' | remove: ')' }}; 19 | --bs-secondary: {{ settings.color_secondary }}; 20 | --bs-secondary-rgb: {{ settings.color_secondary | color_to_rgb | remove: 'rgb(' | remove: ')' }}; 21 | --bs-body-bg: {{ settings.color_body_bg }}; 22 | --bs-body-bg-rgb: {{ settings.color_body_bg | color_to_rgb | remove: 'rgb(' | remove: ')' }}; 23 | --bs-body-color: {{ settings.color_body_color }}; 24 | --bs-body-color-rgb: {{ settings.color_body_color | color_to_rgb | remove: 'rgb(' | remove: ')' }}; 25 | 26 | {% comment -%} 27 | General 28 | {%- endcomment -%} 29 | --bs-container-max-width: {{ settings.container_max_width | append: 'px' }}; 30 | --bs-border-radius: {{ settings.border_radius | append: 'rem' }}; 31 | 32 | {% comment -%} 33 | Typography 34 | {%- endcomment -%} 35 | --bs-body-font-family: {{ settings.font_body.family }}, {{ settings.font_body.fallback_families }}; 36 | --bs-body-font-weight: {{ settings.font_body.weight }}; 37 | --bs-body-font-size: {{ settings.font_body_size | append: 'rem' }}; 38 | --bs-headings-font-family: {{ settings.font_headings.family }}, {{ settings.font_headings.fallback_families }}; 39 | --bs-headings-font-weight: {{ settings.font_headings.weight }}; 40 | --bs-headings-text-transform: {{ settings.headings_text_transform }}; 41 | 42 | {% comment -%} 43 | Modal/Dialog 44 | {%- endcomment -%} 45 | --bs-dialog-backdrop-color-rgb: {{ settings.dialog_backdrop_color | color_to_rgb | remove: 'rgb(' | remove: ')' }}; 46 | --bs-dialog-backdrop-opacity: {{ settings.dialog_backdrop_opacity | append: '%' }}; 47 | --bs-dialog-backdrop-blur: {{ settings.dialog_backdrop_blur | append: 'px' }}; 48 | --bs-dialog-backdrop-blur: {{ settings.dialog_backdrop_blur | append: 'px' }}; 49 | --bs-dialog-header-bg-color-rgb: {{ settings.dialog_header_bg_color | prepend: 'var(--bs-' | append: '-rgb)' }}; 50 | --bs-dialog-header-bg-opacity: {{ settings.dialog_header_bg_opacity | append: '%' }}; 51 | --bs-dialog-header-text-color: {{ settings.dialog_header_text_color }}; 52 | --bs-dialog-header-border-width: {{ settings.dialog_header_border_width | append: 'px' }}; 53 | --bs-dialog-header-border-color-rgb: {{ settings.dialog_header_border_color | prepend: 'var(--bs-' | append: '-rgb)' }}; 54 | --bs-dialog-header-border-opacity: {{ settings.dialog_header_border_opacity | append: '%' }}; 55 | --bs-dialog-header-title-font-size: {{ settings.dialog_header_title_font_size | append: 'em' }}; 56 | 57 | {% comment -%} 58 | Various 59 | {%- endcomment -%} 60 | --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(var(--bs-body-color-rgb), 0.075); 61 | --bs-box-shadow-md: 0 0.25rem 0.5rem rgba(var(--bs-body-color-rgb), 0.125); 62 | --bs-box-shadow-lg: 0 .5rem 1rem rgba(var(--bs-body-color-rgb), 0.175); 63 | --bs-focus-box-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb), .125); 64 | --bs-box-shadow: var(--bs-box-shadow-md); 65 | } 66 | 67 | {%- comment -%} 68 | Buttons 69 | {%- endcomment -%} 70 | .btn { 71 | --bs-btn-font-size: {{ settings.btn_font_size | append: 'rem' }}; 72 | --bs-btn-text-transform: {{ settings.btn_text_transform }}; 73 | --bs-btn-font-family-new: {{ settings.btn_font_family }}; 74 | --bs-btn-font-weight: {{ settings.btn_font_weight }}; 75 | --bs-btn-letter-spacing: {{ settings.btn_letter_spacing | times: 0.05 | append: 'rem' }}; 76 | --bs-btn-bg-gradient: {% if settings.btn_bg_gradient %}var(--bs-gradient){% endif %}; 77 | --bs-btn-padding-x: {{ settings.btn_padding_x | append: 'rem' }}; 78 | --bs-btn-padding-y: {{ settings.btn_padding_y | append: 'rem' }}; 79 | } 80 | 81 | {%- comment -%} 82 | Other 83 | {%- endcomment -%} 84 | .form-check-input:checked[type=radio] { 85 | --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23{{ settings.color_body_bg | remove: '#' }}'/%3e%3c/svg%3e"); 86 | } 87 | -------------------------------------------------------------------------------- /config/settings_data.json: -------------------------------------------------------------------------------- 1 | { 2 | "current": { 3 | "color_primary": "#0d6efd", 4 | "color_secondary": "#455a64", 5 | "color_body_bg": "#ffffff", 6 | "color_body_color": "#212529", 7 | "container_max_width": 1350, 8 | "border_radius": 0.3, 9 | "logo": "shopify:\/\/shop_images\/logo.png", 10 | "favicon": "shopify:\/\/shop_images\/favicon.png", 11 | "font_body": "sans-serif", 12 | "font_headings": "ubuntu_n4", 13 | "btn_text_transform": "none", 14 | "btn_font_family": "var(--bs-body-font-family)", 15 | "btn_font_weight": "500", 16 | "btn_letter_spacing": 1, 17 | "btn_bg_gradient": true, 18 | "btn_padding_x": 1, 19 | "btn_padding_y": 0.3, 20 | "dialog_backdrop_color": "#212529", 21 | "dialog_header_bg_color": "secondary", 22 | "dialog_header_bg_opacity": 5, 23 | "dialog_header_text_color": "body-color", 24 | "dialog_header_border_width": 1, 25 | "dialog_header_border_color": "secondary", 26 | "dialog_header_border_opacity": 10, 27 | "dialog_header_title_font_size": 1.3, 28 | "product_card_img_mode": "carousel", 29 | "product_card_img_orientation": "ratio-1x1", 30 | "product_card_img_border": "img-thumbnail", 31 | "product_card_carousel_controls_color": "body-color", 32 | "product_card_carousel_transition": "slide", 33 | "product_card_badge_discount_type": "value", 34 | "product_card_title_font_size": "fs-lg", 35 | "product_card_show_atc_form": true, 36 | "product_card_atc_style": "quick-view", 37 | "product_card_color_swatches": "Color, color", 38 | "cart_icon": "cart", 39 | "cart_goal_value": "USD:100, \nEUR:50", 40 | "cart_goal_bg_color_before": "bg-primary", 41 | "cart_goal_bg_color_after": "bg-primary", 42 | "cart_upsells_title": "You might like", 43 | "cart_upsells_collection": "best-selling", 44 | "cart_upsells_limit": 5, 45 | "cart_gift_upsell_product": "gift-wrap", 46 | "recently_viewed": true, 47 | "social_facebook": "#", 48 | "social_instagram": "#", 49 | "social_x": "#", 50 | "social_tiktok": "#", 51 | "social_youtube": "#", 52 | "checkout_logo_image": "shopify:\/\/shop_images\/logo.png", 53 | "checkout_logo_size": "small", 54 | "checkout_accent_color": "#dc3545", 55 | "checkout_button_color": "#dc3545", 56 | "product_countdown_time": "1718358803", 57 | "product_countdown_bg_color": "bg-primary", 58 | "product_countdown_bg_opacity": 10, 59 | "product_countdown_text_color": "text-primary", 60 | "product_countdown_border_width": 1, 61 | "product_countdown_border_color": "border-primary", 62 | "product_countdown_border_opacity": 49, 63 | "cart_gift_product": "gift-wrap", 64 | "cart_upsells_bg_light": false, 65 | "btn_shine_effect": true, 66 | "headings_text_transform": "uppercase", 67 | "headings_letter_spacing": 1, 68 | "color_tertiary": "#1f2937", 69 | "btn_border_width": 1, 70 | "body_letter_spacing": 0, 71 | "font_h1_size_mobile": 2.5, 72 | "font_h2_size_mobile": 2, 73 | "color_body_text": "#1f2937", 74 | "font_desktop_h3_size": 2.5, 75 | "font_h5_size": 1.5, 76 | "product_img_orientation": "ratio-1x1", 77 | "product_img_border": "img-thumbnail", 78 | "product_img_controls_color": "dark", 79 | "product_sale_badge_discount_type": "value", 80 | "product_sale_badge_bg_color": "bg-danger", 81 | "product_buy_btn_color": "btn-secondary", 82 | "color_dark": "#27272a", 83 | "color_light": "#f8f9fa", 84 | "gradient_primary": "linear-gradient(90deg, rgba(146, 64, 14, 1), rgba(205, 103, 41, 1) 100%)", 85 | "gradient_secondary": "linear-gradient(90deg, rgba(18, 18, 18, 1) 1%, rgba(50, 50, 50, 1) 99%)", 86 | "product_card_controls_color": "dark", 87 | "product_card_wishlist_color": "text-primary", 88 | "product_card_img_carousel_dark": false, 89 | "cart_img_border": "img-thumbnail", 90 | "content_for_index": [], 91 | "blocks": { 92 | "14060646107696862457": { 93 | "type": "shopify:\/\/apps\/judge-me-reviews\/blocks\/judgeme_core\/61ccd3b1-a9f2-4160-9fe9-4fec8413e5d8", 94 | "disabled": false, 95 | "settings": {} 96 | } 97 | } 98 | } 99 | } -------------------------------------------------------------------------------- /layout/password.liquid: -------------------------------------------------------------------------------- 1 | 2 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | {%- unless settings.favicon == blank -%} 15 | 16 | {%- endunless -%} 17 | 18 |Start typing to see results<\/p>", 52 | "continue_shopping": "Continue Shopping", 53 | "input_label": "Search our store...", 54 | "btn_label": "Search", 55 | "suggestions": "Suggestions", 56 | "products": "Products", 57 | "collections": "Collections", 58 | "articles": "Blog posts", 59 | "pages": "Pages", 60 | "results": { 61 | "one": "{{ count }} result found", 62 | "other": "{{ count }} results found" 63 | }, 64 | "search_for": "Search for \"{{ terms }}\"", 65 | "search_page": { 66 | "title": "Search our store", 67 | "title_search_performed": "Search results", 68 | "no_results": "No results found for \"{{ terms }}\". Check the spelling or use a different word or phrase.", 69 | "results_with_count_and_term": { 70 | "one": "{{ count }} result found for “{{ terms }}”", 71 | "other": "{{ count }} results found for “{{ terms }}”" 72 | }, 73 | "count_products": { 74 | "one": "{{ count }} product", 75 | "other": "{{ count }} products" 76 | } 77 | } 78 | }, 79 | "wishlist": { 80 | "title": "Wishlist", 81 | "empty_html": "
Your wishlist is currently empty<\/p>", 82 | "continue_shopping": "Continue Shopping", 83 | "wishlist": "Wishlist", 84 | "add": "Add to wishlist", 85 | "remove": "Remove from wishlist" 86 | }, 87 | "recently_viewed": { 88 | "title": "Recently Viewed", 89 | "empty_html": "
Your list is currently empty<\/p>",
90 | "continue_shopping": "Continue Shopping",
91 | "remove_all": "Remove all"
92 | },
93 | "newsletter": {
94 | "input_label": "Enter your email address...",
95 | "confirmation_text": "Thanks for subscribing, you'll hear from us soon.",
96 | "submit_button": "Subscribe"
97 | },
98 | "404_page": {
99 | "title": "404 - Page not found",
100 | "subtext": "The page you were looking for does not exist",
101 | "button": "Go back to homepage"
102 | },
103 | "times": {
104 | "ago": "ago",
105 | "moments": "moments",
106 | "second": "second",
107 | "seconds": "seconds",
108 | "minute": "minute",
109 | "minutes": "minutes",
110 | "hour": "hour",
111 | "hours": "hours",
112 | "day": "day",
113 | "days": "days",
114 | "expired": "Offer has expired!"
115 | },
116 | "localization": {
117 | "title": "Localization"
118 | },
119 | "payment_icons": {
120 | "secure": "100% secure & protected payments"
121 | },
122 | "password_page": {
123 | "input_label": "Password",
124 | "btn_label": "Enter"
125 | }
126 | },
127 | "collection": {
128 | "empty_html": "No products found! View all »<\/a>",
129 | "sort_by": "Sort by",
130 | "count_products": {
131 | "one": "{{ count }} product",
132 | "other": "{{ count }} products"
133 | },
134 | "filters": {
135 | "btn_text": "Filters",
136 | "title": "Filters",
137 | "reset": "Reset",
138 | "from": "From",
139 | "to": "To",
140 | "view_more": "View more",
141 | "clear_filter": "Clear filter",
142 | "clear_all": "Clear all filters",
143 | "view_results": {
144 | "one": "View {{ count }} product",
145 | "other": "View {{ count }} products"
146 | }
147 | }
148 | },
149 | "product": {
150 | "add_to_cart": "Add to cart",
151 | "buy_it_now": "Buy it now",
152 | "save": "Save",
153 | "sold_out": "Sold out",
154 | "unavilable": "Unavilable",
155 | "quantity": "Quantity",
156 | "unavailable": "Unavailable",
157 | "product_options": "Product options",
158 | "choose_options": "Choose options",
159 | "select_variant": "Selecto variant",
160 | "quick_view": "Quick view",
161 | "regular_price": "Regular price",
162 | "sale_price": "Sale price",
163 | "stock_indicator": {
164 | "low_stock_html": {
165 | "one": "Only, {{ count }} item<\/b> is in stock!",
166 | "other": "Only, {{ count }} items<\/b> are in stock!"
167 | },
168 | "normal_stock_html": "Currently, {{ count }} items<\/b> are in stock!",
169 | "no_stock": "Unfortunately, this item is sold-out!",
170 | "untracked_stock": "Currently, this item has stock"
171 | }
172 | },
173 | "cart": {
174 | "title": "Cart",
175 | "empty_html": " Your cart is currently empty<\/p>",
176 | "continue_shopping": "Continue Shopping",
177 | "quantity": "Quantity",
178 | "property_view_file": "View file",
179 | "applied_discounts": "Applied discounts",
180 | "subtotal": "Subtotal",
181 | "taxes_shipping_at_checkout_html": "Taxes & Shipping<\/a> calculated at checkout",
182 | "checkout": "Checkout",
183 | "note": {
184 | "title": "Add a note to your order",
185 | "label": "Your message...",
186 | "button": "Save note",
187 | "saved": "Note saved"
188 | },
189 | "shipping_calculator": {
190 | "title": "Calculate shipping",
191 | "country": "Country",
192 | "province": "Province",
193 | "zip": "Zip",
194 | "btn_label": "Calculate",
195 | "no_results": "No shipping rates found!"
196 | },
197 | "gift_upsell": {
198 | "title": "Add gift wrapping"
199 | }
200 | }
201 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "scripts": {
3 | "watch": "npm-watch",
4 | "bs-scss": "sass --no-source-map src/bootstrap.scss:assets/vendor-bootstrap.css && postcss assets/vendor-bootstrap.css --replace --no-map --use autoprefixer && minify assets/vendor-bootstrap.css > assets/vendor-bootstrap.min.css && rm assets/vendor-bootstrap.css",
5 | "bs-js": "cp node_modules/bootstrap/dist/js/bootstrap.bundle.min.js assets/vendor-bootstrap.bundle.min.js",
6 | "swiper": "cp node_modules/swiper/swiper-bundle.min.js assets/vendor-swiper.bundle.min.js && cp node_modules/swiper/swiper-bundle.min.css assets/vendor-swiper.bundle.min.css"
7 | },
8 | "watch": {
9 | "bs-scss": {
10 | "patterns": [
11 | "src"
12 | ],
13 | "extensions": "scss",
14 | "runOnChangeOnly": true
15 | }
16 | },
17 | "dependencies": {
18 | "bootstrap": "^5.3.2",
19 | "swiper": "^11.0.6"
20 | },
21 | "devDependencies": {
22 | "autoprefixer": "^10.4.17",
23 | "caniuse-lite": "^1.0.30001585",
24 | "eslint": "^8.56.0",
25 | "eslint-config-standard": "^17.1.0",
26 | "eslint-plugin-import": "^2.29.1",
27 | "eslint-plugin-n": "^16.6.2",
28 | "eslint-plugin-promise": "^6.1.1",
29 | "minify": "^11.0.1",
30 | "npm-watch": "^0.11.0",
31 | "postcss": "^8.4.35",
32 | "postcss-cli": "^11.0.0",
33 | "sass": "^1.70.0"
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/sections/article-main.liquid:
--------------------------------------------------------------------------------
1 | Add on optional description for this section<\/p>",
20 | "header_description_font_size": "fs-md",
21 | "btn_color": "btn-primary",
22 | "btn_size": "",
23 | "notice": " By signing up for email, you agree to our Terms of Service<\/a> and Privacy Policy<\/a>.<\/p>",
24 | "pt": 11,
25 | "pb": 11
26 | }
27 | },
28 | "footer": {
29 | "type": "footer",
30 | "blocks": {
31 | "8b92bb0f-7aaa-4462-8660-b6a23bd9c31c": {
32 | "type": "menu",
33 | "settings": {
34 | "menu": "shop",
35 | "title_font_size": "fs-xl",
36 | "title": "Collections"
37 | }
38 | },
39 | "79b0b9d4-1bf4-4490-a48e-94be1aecf12a": {
40 | "type": "menu",
41 | "settings": {
42 | "menu": "company",
43 | "title_font_size": "fs-xl",
44 | "title": "Company"
45 | }
46 | },
47 | "7468602d-7e94-4bd5-9673-02b2f8269581": {
48 | "type": "menu",
49 | "settings": {
50 | "menu": "footer",
51 | "title_font_size": "fs-xl",
52 | "title": "Policies"
53 | }
54 | },
55 | "0f9016c8-7819-40d8-a874-905df26582ca": {
56 | "type": "richtext",
57 | "settings": {
58 | "title": "About us",
59 | "title_font_size": "fs-xl",
60 | "description": " Finish your Shopify store within days, not months. 15+ years of coding experience, 50k+ customers served!<\/p>",
61 | "btn_primary_text": "Browse themes",
62 | "btn_primary_url": "https:\/\/www.kondasoft.com\/collections\/shopify-themes",
63 | "btn_primary_color": "btn-primary",
64 | "btn_secondary_text": "Learn more",
65 | "btn_secondary_url": "https:\/\/www.kondasoft.com\/collections\/shopify-themes",
66 | "btn_secondary_color": "btn-light-white"
67 | }
68 | }
69 | },
70 | "block_order": [
71 | "8b92bb0f-7aaa-4462-8660-b6a23bd9c31c",
72 | "79b0b9d4-1bf4-4490-a48e-94be1aecf12a",
73 | "7468602d-7e94-4bd5-9673-02b2f8269581",
74 | "0f9016c8-7819-40d8-a874-905df26582ca"
75 | ],
76 | "settings": {
77 | "bg_color": "bg-secondary",
78 | "bg_opacity": 100,
79 | "bg_gradient": "bg-gradient",
80 | "text_color": "text-white",
81 | "border_top_width": 0,
82 | "border_bottom_width": 0,
83 | "border_color": "border-white",
84 | "border_opacity": 100,
85 | "social_icons": true,
86 | "show_payment_icons": true,
87 | "show_powered_by": true,
88 | "pt": 10,
89 | "pb": 7
90 | }
91 | }
92 | },
93 | "order": [
94 | "newsletter_fL4LWF",
95 | "footer"
96 | ]
97 | }
--------------------------------------------------------------------------------
/sections/header-group.json:
--------------------------------------------------------------------------------
1 | {
2 | "type": "header",
3 | "name": "Header Group",
4 | "sections": {
5 | "announcement_bar_Ge9W3V": {
6 | "type": "announcement-bar",
7 | "blocks": {
8 | "slide_j46kwk": {
9 | "type": "slide",
10 | "settings": {
11 | "announcement": "Announce something important here"
12 | }
13 | },
14 | "slide_mwF4Tk": {
15 | "type": "slide",
16 | "settings": {
17 | "announcement": "Free Shipping For All Orders Over $100"
18 | }
19 | }
20 | },
21 | "block_order": [
22 | "slide_j46kwk",
23 | "slide_mwF4Tk"
24 | ],
25 | "settings": {
26 | "bg_color": "bg-primary",
27 | "bg_opacity": 100,
28 | "bg_gradient": "bg-gradient",
29 | "text_color": "text-white",
30 | "border_top_width": 0,
31 | "border_bottom_width": 0,
32 | "border_color": "border-body",
33 | "border_opacity": 100,
34 | "container_max_width": "600",
35 | "font_size": "fs-xs",
36 | "font_size_desktop": "fs-desktop-sm",
37 | "text_transform": "",
38 | "letter_spacing": 1,
39 | "carousel_autoplay": 5,
40 | "carousel_vertical": true,
41 | "pt": 4,
42 | "pb": 4
43 | }
44 | },
45 | "navbar": {
46 | "type": "navbar",
47 | "blocks": {
48 | "37d4f863-aecd-4a86-87c1-a5887bf87140": {
49 | "type": "mobile",
50 | "settings": {
51 | "container_max_width": "",
52 | "logo": "shopify:\/\/shop_images\/ks-bootshop-logo.png",
53 | "logo_height": 30,
54 | "main_menu": "dropdown-menu",
55 | "collections_menu": "",
56 | "social_icons": true,
57 | "pt": 2,
58 | "pb": 2
59 | }
60 | },
61 | "069e870e-aed4-4929-bf73-c0daca8be18e": {
62 | "type": "desktop",
63 | "settings": {
64 | "container_max_width": "",
65 | "logo": "shopify:\/\/shop_images\/ks-bootshop-logo.png",
66 | "logo_height": 32,
67 | "main_menu": "dropdown-menu",
68 | "pt": 5,
69 | "pb": 5
70 | }
71 | }
72 | },
73 | "block_order": [
74 | "37d4f863-aecd-4a86-87c1-a5887bf87140",
75 | "069e870e-aed4-4929-bf73-c0daca8be18e"
76 | ],
77 | "settings": {
78 | "bg_color": "bg-body",
79 | "bg_opacity": 100,
80 | "bg_gradient": "",
81 | "text_color": "text-body",
82 | "border_top_width": 0,
83 | "border_bottom_width": 0,
84 | "border_color": "border-body",
85 | "border_opacity": 100,
86 | "shadow": "shadow-sm"
87 | }
88 | }
89 | },
90 | "order": [
91 | "announcement_bar_Ge9W3V",
92 | "navbar"
93 | ]
94 | }
--------------------------------------------------------------------------------
/sections/html.liquid:
--------------------------------------------------------------------------------
1 | Current time is: {{ \"now\" | date: \"%Y-%m-%d %H:%M\" }} Add on optional description for this section
40 | {{ shop.password_message }}
41 |
53 | {{ 'general.search.search_page.count_products' | t: count: search.results_count }}
54 |
58 | {{ 'general.search.search_page.no_results' | t: terms: search.terms }}
59 |
30 | {{ line_item.variant.title }}
31 |
35 | {{ line_item.selling_plan_allocation.selling_plan.name }}
36 |
96 | {% if line_item.original_line_price > line_item.final_line_price %}
97 |
16 | {{ 'collection.count_products' | t: count: collection.products_count }}
17 |
13 | {% if product.compare_at_price > product.price %}
14 |
6 | {{ 'general.404_page.subtext' | t }}
7 | Add on optional description for this blog<\/p>",
21 | "description_font_size": "fs-md",
22 | "pt": 11,
23 | "pb": 11,
24 | "pt_desktop": 13,
25 | "pb_desktop": 13
26 | }
27 | },
28 | "template-blog": {
29 | "type": "blog-main",
30 | "settings": {
31 | "bg_color": "bg-body",
32 | "bg_opacity": 100,
33 | "bg_gradient": "",
34 | "text_color": "text-body",
35 | "border_top_width": 0,
36 | "border_bottom_width": 0,
37 | "border_color": "border-body",
38 | "border_opacity": 100,
39 | "container_max_width": "",
40 | "limit": 48,
41 | "show_article_count": true,
42 | "show_tags": true,
43 | "tags_btn_color": "btn-outline-primary",
44 | "article_card_text_align": "text-start",
45 | "article_card_img_orientation": "ratio-16x9",
46 | "article_card_img_border": "img-thumbnail",
47 | "article_card_title_size": "fs-xl",
48 | "article_card_meta": true,
49 | "article_card_tags": true,
50 | "article_card_excerpt": false,
51 | "breakpoint_mobile": 1,
52 | "breakpoint_tablet": 2,
53 | "breakpoint_desktop": 3,
54 | "pt": 10,
55 | "pb": 10
56 | }
57 | }
58 | },
59 | "order": [
60 | "blog_header_7BFLtm",
61 | "template-blog"
62 | ]
63 | }
--------------------------------------------------------------------------------
/templates/cart.liquid:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/templates/collection.json:
--------------------------------------------------------------------------------
1 | {
2 | "sections": {
3 | "collection_header_JKf7mh": {
4 | "type": "collection-header",
5 | "settings": {
6 | "bg_color": "bg-primary",
7 | "bg_opacity": 10,
8 | "bg_gradient": "",
9 | "text_color": "text-white",
10 | "border_top_width": 0,
11 | "border_bottom_width": 0,
12 | "border_color": "border-body",
13 | "border_opacity": 100,
14 | "container_max_width": "600",
15 | "img_show": true,
16 | "img_overlay_color": "#000000",
17 | "img_overlay_opacity": 30,
18 | "img_overlay_blur": 0,
19 | "title_font_size": "h2",
20 | "description_show": true,
21 | "description_font_size": "fs-md",
22 | "pt": 12,
23 | "pb": 12,
24 | "pt_desktop": 14,
25 | "pb_desktop": 14
26 | }
27 | },
28 | "collection_products_Fx3hb6": {
29 | "type": "collection-products",
30 | "settings": {
31 | "bg_color": "bg-body",
32 | "bg_opacity": 100,
33 | "bg_gradient": "",
34 | "text_color": "text-body",
35 | "border_top_width": 0,
36 | "border_bottom_width": 0,
37 | "border_color": "border-body",
38 | "border_opacity": 100,
39 | "container_max_width": "",
40 | "limit": 48,
41 | "show_product_count": true,
42 | "show_filters": true,
43 | "filters_btn_color": "btn-outline-secondary",
44 | "show_sort_by": true,
45 | "sort_by_btn_color": "btn-outline-secondary",
46 | "breakpoint_mobile": 2,
47 | "breakpoint_tablet": 3,
48 | "breakpoint_desktop": 4,
49 | "pt": 10,
50 | "pb": 10
51 | }
52 | },
53 | "da87b500-2710-4252-99e4-4bd5db55af39": {
54 | "type": "separator",
55 | "disabled": true,
56 | "settings": {
57 | "bg_color": "bg-body text-body",
58 | "bg_opacity": 10,
59 | "height": 1,
60 | "container": "container",
61 | "container_max_width": "",
62 | "pt": 0,
63 | "pb": 0
64 | }
65 | }
66 | },
67 | "order": [
68 | "collection_header_JKf7mh",
69 | "collection_products_Fx3hb6",
70 | "da87b500-2710-4252-99e4-4bd5db55af39"
71 | ]
72 | }
--------------------------------------------------------------------------------
/templates/gift_card.liquid:
--------------------------------------------------------------------------------
1 | {% layout none %}
2 |
3 | {% assign formatted_initial_value = gift_card.initial_value | money_without_trailing_zeros %}
4 | {% assign formatted_initial_value_stripped = formatted_initial_value | strip_html %}
5 |
6 |
7 |
8 |
9 | Use this code at checkout to redeem your gift card. Add on optional description for this section<\/p>",
18 | "header_description_font_size": "fs-md",
19 | "slider_speed": 300,
20 | "slider_navigation": true,
21 | "slider_pagination": true,
22 | "slider_pagination_type": "bullets",
23 | "slider_scrollbar": true,
24 | "slider_partial_slides_mobile": false,
25 | "slider_autoplay": 0,
26 | "collection_card_text_align": "text-center",
27 | "collection_card_img_orientation": "ratio-4x3",
28 | "collection_card_img_border": "img-thumbnail",
29 | "collection_card_show_title": true,
30 | "collection_card_title_font_size": "fs-lg",
31 | "collection_card_title_position": "collection-card-title-bottom",
32 | "collection_card_show_product_count": true,
33 | "breakpoint_mobile": 1,
34 | "breakpoint_tablet": 2,
35 | "breakpoint_desktop": 4,
36 | "pt": 10,
37 | "pb": 10
38 | }
39 | }
40 | },
41 | "order": [
42 | "featured_collections_CGE4nM"
43 | ]
44 | }
45 |
--------------------------------------------------------------------------------
/templates/page.about.json:
--------------------------------------------------------------------------------
1 | {
2 | "sections": {
3 | "hero_carousel_tdHVay": {
4 | "type": "hero-carousel",
5 | "blocks": {
6 | "slide_eGdG3z": {
7 | "type": "slide",
8 | "settings": {
9 | "img_desktop": "shopify:\/\/shop_images\/lifestyle-1.jpg",
10 | "overlay_color": "#000000",
11 | "overlay_opacity": 30,
12 | "overlay_blur": 5,
13 | "subtitle": "Optional Subtitle",
14 | "title": "Welcome to our store",
15 | "description": " An optional description for this page<\/p>",
16 | "btn_primary_text": "",
17 | "btn_primary_url": "",
18 | "btn_secondary_text": "",
19 | "btn_secondary_url": ""
20 | }
21 | }
22 | },
23 | "block_order": [
24 | "slide_eGdG3z"
25 | ],
26 | "settings": {
27 | "bg_color": "bg-body",
28 | "bg_opacity": 100,
29 | "bg_gradient": "",
30 | "text_color": "text-white",
31 | "border_top_width": 0,
32 | "border_bottom_width": 0,
33 | "border_color": "border-body",
34 | "border_opacity": 100,
35 | "carousel_controls": true,
36 | "carousel_indicators": true,
37 | "carousel_transition": "slide",
38 | "carousel_transition_duration": 500,
39 | "carousel_autoplay": 5,
40 | "carousel_effect": "carousel-zoom-in",
41 | "media_mobile_height": 400,
42 | "media_desktop_height": 500,
43 | "media_adapt": false,
44 | "media_full": false,
45 | "caption_max_width": "900",
46 | "caption_position": "carousel-caption-center",
47 | "subtitle_font_size": "fs-md",
48 | "title_font_size": "h2",
49 | "description_font_size": "fs-lg",
50 | "btn_primary_color": "btn-primary",
51 | "btn_secondary_color": "btn-secondary",
52 | "btn_font_size": "fs-md",
53 | "pt": 0,
54 | "pb": 0
55 | }
56 | },
57 | "18e3bb8e-f1ba-421c-91c3-37c1c5b25a2a": {
58 | "type": "separator",
59 | "disabled": true,
60 | "settings": {
61 | "bg_color": "bg-body text-body",
62 | "bg_opacity": 10,
63 | "height": 1,
64 | "container": "true",
65 | "container_max_width": "",
66 | "pt": 0,
67 | "pb": 0
68 | }
69 | },
70 | "91fa2e27-741f-431f-b658-c6ce03d0f6eb": {
71 | "type": "page-content",
72 | "settings": {
73 | "bg_color": "bg-body",
74 | "bg_opacity": 100,
75 | "bg_gradient": "",
76 | "text_color": "text-body",
77 | "border_top_width": 0,
78 | "border_bottom_width": 0,
79 | "border_color": "border-body",
80 | "border_opacity": 10,
81 | "container_max_width": "800",
82 | "show_title": true,
83 | "title_font_size": "h1",
84 | "description_font_size": "fs-md",
85 | "pt": 9,
86 | "pb": 9
87 | }
88 | },
89 | "54fb0ae0-8c55-432c-8b0a-1211e6ba4a0e": {
90 | "type": "card-list",
91 | "blocks": {
92 | "template--15889379819659__54fb0ae0-8c55-432c-8b0a-1211e6ba4a0e-item-1": {
93 | "type": "item",
94 | "settings": {
95 | "img": "shopify:\/\/shop_images\/product-1_baca2f7d-a8b0-4db2-aa52-c4074f562b1d.jpg",
96 | "title": "John Doe",
97 | "description": " CEO & Founder<\/p>",
98 | "btn_text": "Learn more",
99 | "btn_url": ""
100 | }
101 | },
102 | "template--15889379819659__54fb0ae0-8c55-432c-8b0a-1211e6ba4a0e-item-2": {
103 | "type": "item",
104 | "settings": {
105 | "img": "shopify:\/\/shop_images\/product-5_4bfb97ab-4193-4461-a4e3-6e06d63b8249.jpg",
106 | "title": "Jane Doe",
107 | "description": " Marketing<\/p>",
108 | "btn_text": "Learn more",
109 | "btn_url": ""
110 | }
111 | },
112 | "template--15889379819659__54fb0ae0-8c55-432c-8b0a-1211e6ba4a0e-item-4": {
113 | "type": "item",
114 | "settings": {
115 | "img": "shopify:\/\/shop_images\/product-3.jpg",
116 | "title": "Jim Doe",
117 | "description": " Sales<\/p>",
118 | "btn_text": "Learn more",
119 | "btn_url": ""
120 | }
121 | },
122 | "template--15889379819659__54fb0ae0-8c55-432c-8b0a-1211e6ba4a0e-item-3": {
123 | "type": "item",
124 | "settings": {
125 | "img": "shopify:\/\/shop_images\/product-2_51119e0e-dd95-4bc4-85bc-2db1278575ad.jpg",
126 | "title": "Jill Doe",
127 | "description": " Developer<\/p>",
128 | "btn_text": "Learn more",
129 | "btn_url": ""
130 | }
131 | }
132 | },
133 | "block_order": [
134 | "template--15889379819659__54fb0ae0-8c55-432c-8b0a-1211e6ba4a0e-item-1",
135 | "template--15889379819659__54fb0ae0-8c55-432c-8b0a-1211e6ba4a0e-item-2",
136 | "template--15889379819659__54fb0ae0-8c55-432c-8b0a-1211e6ba4a0e-item-4",
137 | "template--15889379819659__54fb0ae0-8c55-432c-8b0a-1211e6ba4a0e-item-3"
138 | ],
139 | "settings": {
140 | "bg_color": "bg-gradient-body-light text-body",
141 | "bg_opacity": 100,
142 | "bg_gradient": "",
143 | "text_color": "text-body",
144 | "border_top_width": 0,
145 | "border_bottom_width": 0,
146 | "border_color": "border-body",
147 | "border_opacity": 100,
148 | "container_max_width": "",
149 | "header_title": "Our Team",
150 | "header_title_font_size": "h2",
151 | "header_description": " Add on optional description for this section<\/p>",
152 | "header_description_font_size": "fs-md",
153 | "item_bg_color": "bg-body",
154 | "item_bg_opacity": 100,
155 | "item_text_color": "text-body",
156 | "item_border_width": 1,
157 | "item_border_color": "border-body",
158 | "item_border_opacity": 100,
159 | "item_shadow": "shadow-sm",
160 | "item_text_align": "text-center",
161 | "item_img_orientation": "ratio-4x3",
162 | "item_title_font_size": "h5",
163 | "item_description_font_size": "fs-md",
164 | "item_btn_color": "btn-primary",
165 | "item_btn_size": "btn-sm",
166 | "breakpoint_mobile": 1,
167 | "breakpoint_tablet": 2,
168 | "breakpoint_desktop": 4,
169 | "pt": 6,
170 | "pb": 11
171 | }
172 | },
173 | "664feedb-7180-4e8f-a84d-1cf45bc1dd42": {
174 | "type": "richtext",
175 | "settings": {
176 | "bg_color": "bg-body",
177 | "bg_opacity": 100,
178 | "bg_gradient": "",
179 | "text_color": "text-body",
180 | "border_top_width": 0,
181 | "border_bottom_width": 0,
182 | "border_color": "border-body",
183 | "border_opacity": 100,
184 | "container_max_width": "900",
185 | "text_align": "text-center",
186 | "title": "Want to get in touch?!",
187 | "title_font_size": "h3",
188 | "description": " Please contact us anytime from Monday to Friday<\/p>",
189 | "description_font_size": "",
190 | "btn_primary_text": "Contact us",
191 | "btn_primary_url": "shopify:\/\/pages\/contact-us",
192 | "btn_primary_color": "btn-outline-primary",
193 | "btn_secondary_text": "",
194 | "btn_secondary_url": "",
195 | "btn_secondary_color": "btn-secondary",
196 | "pt": 6,
197 | "pb": 12
198 | }
199 | },
200 | "cfc6ff50-e3a5-4219-8350-f2db73f829c8": {
201 | "type": "separator",
202 | "disabled": true,
203 | "settings": {
204 | "bg_color": "bg-light text-body",
205 | "bg_opacity": 10,
206 | "height": 1,
207 | "container": "container",
208 | "container_max_width": "",
209 | "pt": 0,
210 | "pb": 0
211 | }
212 | }
213 | },
214 | "order": [
215 | "hero_carousel_tdHVay",
216 | "18e3bb8e-f1ba-421c-91c3-37c1c5b25a2a",
217 | "91fa2e27-741f-431f-b658-c6ce03d0f6eb",
218 | "54fb0ae0-8c55-432c-8b0a-1211e6ba4a0e",
219 | "664feedb-7180-4e8f-a84d-1cf45bc1dd42",
220 | "cfc6ff50-e3a5-4219-8350-f2db73f829c8"
221 | ]
222 | }
--------------------------------------------------------------------------------
/templates/page.contact.json:
--------------------------------------------------------------------------------
1 | {
2 | "sections": {
3 | "ba94d905-ea2f-4198-8472-5296b1853fb5": {
4 | "type": "contact-form",
5 | "settings": {
6 | "bg_color": "bg-body",
7 | "bg_opacity": 100,
8 | "bg_gradient": "",
9 | "text_color": "text-body",
10 | "border_top_width": 0,
11 | "border_bottom_width": 0,
12 | "border_color": "border-body",
13 | "border_opacity": 100,
14 | "container_max_width": "",
15 | "header_title": "Contact form",
16 | "header_title_font_size": "h1",
17 | "header_description": " Add on optional description for this section<\/p>",
18 | "header_description_font_size": "",
19 | "img": "shopify:\/\/shop_images\/product-1_d69f3fea-71ab-46c3-a095-43b62ba2a441.jpg",
20 | "img_orientation": "ratio-3x4",
21 | "img_border": "img-thumbnail",
22 | "pt": 10,
23 | "pb": 10
24 | }
25 | },
26 | "5d7e9d3e-ba1d-498d-a3fd-144ce2e406e5": {
27 | "type": "separator",
28 | "disabled": true,
29 | "settings": {
30 | "bg_color": "bg-light text-body",
31 | "bg_opacity": 10,
32 | "height": 1,
33 | "container": "container",
34 | "container_max_width": "",
35 | "pt": 0,
36 | "pb": 0
37 | }
38 | },
39 | "9b5ef318-8d23-40cd-a163-d1f62c2d0834": {
40 | "type": "richtext",
41 | "settings": {
42 | "bg_color": "bg-body",
43 | "bg_opacity": 100,
44 | "bg_gradient": "",
45 | "text_color": "text-body",
46 | "border_top_width": 0,
47 | "border_bottom_width": 0,
48 | "border_color": "border-body",
49 | "border_opacity": 100,
50 | "container_max_width": "900",
51 | "text_align": "text-center",
52 | "title": "Looking for FAQs?",
53 | "title_font_size": "h3",
54 | "description": " View answers to some of the most common questions.<\/p>",
55 | "description_font_size": "",
56 | "btn_primary_text": "Read FAQs",
57 | "btn_primary_url": "shopify:\/\/pages\/faqs",
58 | "btn_primary_color": "btn-outline-primary",
59 | "btn_secondary_text": "",
60 | "btn_secondary_url": "",
61 | "btn_secondary_color": "btn-secondary",
62 | "pt": 8,
63 | "pb": 12
64 | }
65 | }
66 | },
67 | "order": [
68 | "ba94d905-ea2f-4198-8472-5296b1853fb5",
69 | "5d7e9d3e-ba1d-498d-a3fd-144ce2e406e5",
70 | "9b5ef318-8d23-40cd-a163-d1f62c2d0834"
71 | ]
72 | }
--------------------------------------------------------------------------------
/templates/page.faq.json:
--------------------------------------------------------------------------------
1 | {
2 | "sections": {
3 | "91492711-8ea6-4c3d-b346-30c8b72100ec": {
4 | "type": "faq",
5 | "blocks": {
6 | "template--15846749896843__91492711-8ea6-4c3d-b346-30c8b72100ec-item-1": {
7 | "type": "item",
8 | "settings": {
9 | "title": "Where do you ship?",
10 | "description": " We ship all around the world... Please provide here you own shipping information, including times, prices, options etc.<\/p>"
11 | }
12 | },
13 | "template--15846749896843__91492711-8ea6-4c3d-b346-30c8b72100ec-item-2": {
14 | "type": "item",
15 | "settings": {
16 | "title": "How long will it take to receive my order",
17 | "description": " This depends on whether it is an International or a Domestic order. All orders within the U.S. are considered domestic orders and they are shipped and delivered within 2-5 business days. Please see International Orders for more details.<\/p>"
18 | }
19 | },
20 | "template--15846749896843__91492711-8ea6-4c3d-b346-30c8b72100ec-item-3": {
21 | "type": "item",
22 | "settings": {
23 | "title": "What payment methods do you support?",
24 | "description": " We accept PayPal, Visa, MasterCard, Discover, and American Express but feel free to contact us for other payment options.<\/p>"
25 | }
26 | },
27 | "template--15846749896843__91492711-8ea6-4c3d-b346-30c8b72100ec-item-4": {
28 | "type": "item",
29 | "settings": {
30 | "title": "How can I track my order?",
31 | "description": " We will send tracking information to the e-mail address associated with your order once the item has shipped. If you have not received your tracking information and it has been over 2 business day, please contact us at (012) 123 - 4567<\/p>"
32 | }
33 | },
34 | "template--15846749896843__91492711-8ea6-4c3d-b346-30c8b72100ec-item-5": {
35 | "type": "item",
36 | "settings": {
37 | "title": "Can I order as a gift for someone else?",
38 | "description": " When ordering as a gift for someone, be sure to enter in your email address to receive all summary information but enter in the recipient’s name and shipping information. We will be sure to keep all prices and receipts out of the package.<\/p>"
39 | }
40 | },
41 | "template--15846749896843__91492711-8ea6-4c3d-b346-30c8b72100ec-item-6": {
42 | "type": "item",
43 | "settings": {
44 | "title": "How can I get a refund for my order?",
45 | "description": " If for any reason you are not completely satisfied with your purchase, within 30 days of placing your order, we will refund you for your purchase with no questions asked.<\/p>"
46 | }
47 | }
48 | },
49 | "block_order": [
50 | "template--15846749896843__91492711-8ea6-4c3d-b346-30c8b72100ec-item-1",
51 | "template--15846749896843__91492711-8ea6-4c3d-b346-30c8b72100ec-item-2",
52 | "template--15846749896843__91492711-8ea6-4c3d-b346-30c8b72100ec-item-3",
53 | "template--15846749896843__91492711-8ea6-4c3d-b346-30c8b72100ec-item-4",
54 | "template--15846749896843__91492711-8ea6-4c3d-b346-30c8b72100ec-item-5",
55 | "template--15846749896843__91492711-8ea6-4c3d-b346-30c8b72100ec-item-6"
56 | ],
57 | "settings": {
58 | "bg_color": "bg-body",
59 | "bg_opacity": 100,
60 | "bg_gradient": "",
61 | "text_color": "text-body",
62 | "border_top_width": 0,
63 | "border_bottom_width": 0,
64 | "border_color": "border-body",
65 | "border_opacity": 100,
66 | "container_max_width": "",
67 | "open_first_item": true,
68 | "header_title": "FAQs",
69 | "header_title_font_size": "h1",
70 | "header_description": "
20 | {{ article.title }}
21 |
22 | {% if section.settings.article_meta %}
23 |
26 | {% endif %}
27 |
23 | {{ page.title }}
24 |
25 | {% endunless %}
26 |
30 | {% else %}
31 |
32 | {{ shop.name }}
33 |
34 | {% endif %}
35 |
36 |
23 | {{- 'general.search.products' | t }} ({{- predictive_search.resources.products.size -}})
24 |
25 |
30 | {%- for product in predictive_search.resources.products -%}
31 |
56 | {%- endif -%}
57 |
46 | {{ product.title }}
47 |
48 | {% render 'product-rating-badge', product: product %}
49 | {% render 'product-card-price', product: product %}
50 |
13 | {% if search.performed %}
14 | {{ 'general.search.search_page.title_search_performed' | t }}
15 | {% else %}
16 | {{ 'general.search.search_page.title' | t }}
17 | {% endif %}
18 |
19 |
44 |
18 |
13 | {% for line_item in cart.items %}
14 |
118 | {% endif %}
--------------------------------------------------------------------------------
/snippets/cart-note.liquid:
--------------------------------------------------------------------------------
1 | {% if settings.cart_note_show and cart.items != empty %}
2 |
24 |
25 | {{ line_item.product.title }}
26 |
27 |
28 | {% unless line_item.product.has_only_default_variant %}
29 |
40 | {% for property in line_item.properties %}
41 | {% assign first_character_in_key = property.first | slice: 0 %}
42 | {% unless first_character_in_key == '_' %}
43 |
56 | {% endunless %}
57 | {% if line_item.line_level_discount_allocations.size > 0 %}
58 |
61 | {%- for discount in line_item.line_level_discount_allocations -%}
62 |
68 | {% endif %}
69 |
98 | {{ line_item.original_line_price | money }}
99 |
100 | {% endif %}
101 |
102 | {{ line_item.final_line_price | money }}
103 |
104 |
70 |
71 | {% liquid
72 | # theme-check-enable ImgLazyLoading
73 | # theme-check-enable RemoteAsset
74 | %}
--------------------------------------------------------------------------------
/snippets/meta-tags.liquid:
--------------------------------------------------------------------------------
1 | {%- liquid
2 | assign og_title = page_title | default: shop.name
3 | assign og_url = canonical_url | default: request.origin
4 | assign og_type = 'website'
5 | assign og_description = page_description | default: shop.description | default: shop.name
6 |
7 | if request.page_type == 'product'
8 | assign og_type = 'product'
9 | elsif request.page_type == 'article'
10 | assign og_type = 'article'
11 | elsif request.page_type == 'password'
12 | assign og_url = request.origin
13 | endif
14 | %}
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | {%- if page_image -%}
23 |
24 |
25 |
26 |
27 | {%- endif -%}
28 |
29 | {%- if request.page_type == 'product' -%}
30 |
31 |
32 | {%- endif -%}
33 |
34 | {%- if settings.social_twitter_link != blank -%}
35 |
36 | {%- endif -%}
37 |
38 |
39 |
--------------------------------------------------------------------------------
/snippets/modal-localization.liquid:
--------------------------------------------------------------------------------
1 | {% if localization.available_countries.size > 1 %}
2 |
47 | {% endif %}
--------------------------------------------------------------------------------
/snippets/navbar-desktop-icons.liquid:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/snippets/navbar-desktop-menu.liquid:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/snippets/navbar-logo.liquid:
--------------------------------------------------------------------------------
1 |
4 | {% if block.settings.logo %}
5 | {% assign logo_height_x2 = block.settings.logo_height | times: 2 %}
6 |
13 | {% else %}
14 |
15 | {{ shop.name }}
16 |
17 | {% endif %}
18 |
--------------------------------------------------------------------------------
/snippets/offcanvas-cart.liquid:
--------------------------------------------------------------------------------
1 |
11 | {{ 'cart.title' | t }}
12 |
13 |
16 |
29 | {{ 'general.search.title' | t }}
30 |
31 |
34 | current_variant.price %}hidden{% endunless %}>
17 |
18 | {{ 'product.regular_price' | t }}
19 |
20 | {{ current_variant.compare_at_price | money_without_trailing_zeros }}
21 |
22 |
23 |
24 | {% if current_variant.compare_at_price > current_variant.price %}
25 |
26 | {{ 'product.sale_price' | t }}
27 |
28 | {% endif %}
29 | {{ current_variant.price | money_without_trailing_zeros }}
30 |
31 |
32 | current_variant.price %}hidden{% endunless %}>
36 | {{ 'product.save' | t }}
37 | {% if current_variant.compare_at_price > 0 %}
38 | {% if block.settings.badge_discount_type == 'percentage' %}
39 | {{ current_variant.compare_at_price | minus: current_variant.price | times: 100 | divided_by: current_variant.compare_at_price | round | append: '%' }}
40 | {% else %}
41 | {{ current_variant.compare_at_price | minus: current_variant.price | money_without_trailing_zeros }}
42 | {% endif %}
43 | {% endif %}
44 |
45 |
46 |
49 | {{ 'product.sold_out' | t }}
50 |
51 |
11 | {{ block.settings.title }}
12 |
13 | {% endunless %}
14 | {% if block.settings.description != blank or block.settings.product_description != false %}
15 |
15 |
7 | {{ product.title }}
8 |
--------------------------------------------------------------------------------
/snippets/product-block-trust-icons.liquid:
--------------------------------------------------------------------------------
1 | {% liquid
2 | assign pt = block.settings.pt | prepend: 'pt-'
3 | assign pb = block.settings.pb | prepend: 'pb-'
4 |
5 | if block.settings.text_1 != blank
6 | assign text_list = block.settings.text_1 | append: ','
7 | endif
8 | if block.settings.text_2 != blank
9 | assign text_list = block.settings.text_2 | append: ',' | prepend: text_list
10 | endif
11 | if block.settings.text_3 != blank
12 | assign text_list = block.settings.text_3 | append: ',' | prepend: text_list
13 | endif
14 | if block.settings.text_4 != blank
15 | assign text_list = block.settings.text_4 | append: ',' | prepend: text_list
16 | endif
17 |
18 | assign text_list = text_list | split: ','
19 | %}
20 |
21 |
--------------------------------------------------------------------------------
/snippets/product-card-form.liquid:
--------------------------------------------------------------------------------
1 | {% comment %}
2 | Renders an "Add to cart" button or a "Quick view" button if the product has multiple variants
3 | Usually it is used with the product card
4 |
5 | Accepts:
6 | - product: {object} The product object
7 | - btn_color {string} (Optional) The button color class (bootstrap) to apply to the button
8 |
9 | Usage:
10 | {% render 'product-card-form' product: product %}
11 | {% endcomment %}
12 |
13 | {% liquid
14 | assign btn_color = btn_color | default: settings.product_card_atc_btn_color
15 | %}
16 |
17 |
15 |
16 | {{ 'product.regular_price' | t }}
17 |
18 | {{ product.compare_at_price | money_without_trailing_zeros }}
19 |
20 |
21 |
22 | {{ 'product.sale_price' | t }}
23 |
24 | {{ product.price | money_without_trailing_zeros }}
25 |
26 | {% else %}
27 |
28 | {{ product.price | money_without_trailing_zeros }}
29 |
30 | {% endif %}
31 |
41 | {{ product.title }}
42 |
43 | {% render 'product-rating-badge', product: product %}
44 | {% render 'product-card-price', product: product %}
45 |
46 | {% if settings.product_card_show_atc_form %}
47 | {% render 'product-card-form', product: product %}
48 | {% endif %}
49 |
15 | {{ section.settings.header_title }}
16 |
17 | {% endunless %}
18 | {% unless section.settings.header_description == blank %}
19 |
3 | {{ 'general.404_page.title' | t }}
4 |
5 | Here's your gift card!
66 | {% unless gift_card.enabled %}
67 | Disabled
68 | {% endunless %}
69 | {% if gift_card.expired and gift_card.enabled %}
70 | Expired on {{ gift_card.expires_on | date: "%d/%m/%y" }}
71 | {% endif %}
72 | {% if gift_card.expired != true and gift_card.expires_on and gift_card.enabled %}
73 | Expires on {{ gift_card.expires_on | date: "%d/%m/%y" }}
74 | {% endif %}
75 |
84 | {% assign initial_value_size = formatted_initial_value | size %}
85 |