first commit
6
.dockerignore
Normal file
@ -0,0 +1,6 @@
|
||||
node_modules
|
||||
Dockerfile
|
||||
.dockerignore
|
||||
.git
|
||||
.gitignore
|
||||
.yarnrc
|
12
.editorconfig
Normal file
@ -0,0 +1,12 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
1
.gitattributes
vendored
Normal file
@ -0,0 +1 @@
|
||||
* text=auto eol=lf
|
79
.gitignore
vendored
Normal file
@ -0,0 +1,79 @@
|
||||
*node_modules
|
||||
node_modules
|
||||
|
||||
# para arquivos sass e scss
|
||||
|
||||
storefront/styles/css
|
||||
**/*.sass-cache/
|
||||
**/*.css.map
|
||||
|
||||
# Para arquivos de desenvolvimnto
|
||||
public/
|
||||
src\arquivos\sass\lib\_sprite.scss
|
||||
|
||||
# gulp
|
||||
dist/
|
||||
.temp/
|
||||
# node
|
||||
|
||||
### Node ###
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variables file
|
||||
.env
|
||||
|
||||
.scannerwork
|
10
.gitpod.yml
Normal file
@ -0,0 +1,10 @@
|
||||
# This configuration file was automatically generated by Gitpod.
|
||||
# Please adjust to your needs (see https://www.gitpod.io/docs/config-gitpod-file)
|
||||
# and commit this file to your remote git repository to share the goodness with others.
|
||||
|
||||
tasks:
|
||||
- init: yarn install
|
||||
vscode:
|
||||
extensions:
|
||||
- dbaeumer.vscode-eslint
|
||||
|
1
.husky/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
_
|
4
.husky/commit-msg
Normal file
@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
. "$(dirname "$0")/_/husky.sh"
|
||||
|
||||
yarn commitlint --edit $1
|
8
.husky/common.sh
Normal file
@ -0,0 +1,8 @@
|
||||
command_exists () {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Workaround for Windows 10, Git Bash and Yarn
|
||||
if command_exists winpty && test -t 1; then
|
||||
exec < /dev/tty
|
||||
fi
|
4
.husky/pre-commit
Normal file
@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
. "$(dirname "$0")/_/husky.sh"
|
||||
|
||||
yarn lerna run --concurrency 3 --stream lint --since HEAD --exclude-dependents
|
9
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"sonarsource.sonarlint-vscode",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"editorconfig.editorconfig",
|
||||
"esbenp.prettier-vscode",
|
||||
"eamodio.gitlens"
|
||||
]
|
||||
}
|
18
Dockerfile
Normal file
@ -0,0 +1,18 @@
|
||||
FROM node:14
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN npm i -g vtex concurrently gulp
|
||||
RUN yarn
|
||||
|
||||
|
||||
COPY . .
|
||||
RUN mkdir /root/.vtex
|
||||
RUN chmod o+rx /root
|
||||
RUN chown -R node /root/.vtex
|
||||
RUN ln -s /root/.vtex /home/node/
|
||||
|
||||
|
||||
CMD ["yarn", "vlink"]
|
||||
|
||||
|
14
README.md
Normal file
@ -0,0 +1,14 @@
|
||||
# {NOME DA LOJA}
|
||||
|
||||
## Instalação e desenvolvimento
|
||||
|
||||
[Voce pode encontrar a base o desenvolvimento de cada projeto aqui](https://gitlab.com/agenciam3/pattern/documentacao/-/blob/master/vtex/IO/implementa%C3%A7%C3%A3o-io.md)
|
||||
|
||||
## Custom - Apps
|
||||
|
||||
## Especificações de produto
|
||||
|
||||
## Estruturas customizadas do Master Data
|
||||
|
||||
NODEJS >= 12
|
||||
|
19
bitbucket-pipelines.yml
Normal file
@ -0,0 +1,19 @@
|
||||
image: maven:3.3.9
|
||||
|
||||
clone:
|
||||
depth: full
|
||||
|
||||
pipelines:
|
||||
pull-requests:
|
||||
"**":
|
||||
- step:
|
||||
name: SonarQube analysis
|
||||
script:
|
||||
- pipe: sonarsource/sonarqube-scan:1.0.0
|
||||
variables:
|
||||
SONAR_HOST_URL: ${SONAR_HOST_URL} # Get the value from the repository/workspace variable.
|
||||
SONAR_TOKEN: ${SONAR_TOKEN} # Get the value from the repository/workspace variable. You shouldn't set secret in clear text here.
|
||||
|
||||
definitions:
|
||||
caches:
|
||||
sonar: ~/.sonar
|
22
checkout/.eslintrc.js
Normal file
@ -0,0 +1,22 @@
|
||||
module.exports = {
|
||||
env: {
|
||||
browser: true,
|
||||
commonjs: true,
|
||||
es6: false,
|
||||
jquery: true,
|
||||
},
|
||||
globals: {
|
||||
Modulo: true,
|
||||
},
|
||||
extends: ["eslint:recommended", "plugin:prettier/recommended"],
|
||||
plugins: ["prettier"],
|
||||
parserOptions: {
|
||||
ecmaVersion: 10,
|
||||
sourceType: "module",
|
||||
},
|
||||
rules: {
|
||||
"prettier/prettier": "error",
|
||||
"linebreak-style": ["warn", "unix"],
|
||||
"no-undef": "off",
|
||||
},
|
||||
};
|
6
checkout/.prettierrc.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"tabWidth": 4,
|
||||
"useTabs": false
|
||||
}
|
140
checkout/gulpfile.js
Normal file
@ -0,0 +1,140 @@
|
||||
const gulp = require("gulp"),
|
||||
gulpif = require("gulp-if"),
|
||||
del = require("del"),
|
||||
connect = require("gulp-connect"),
|
||||
sourcemaps = require("gulp-sourcemaps"),
|
||||
autoprefixer = require("gulp-autoprefixer"),
|
||||
rename = require("gulp-rename"),
|
||||
sass = require("gulp-sass")(require("sass"));
|
||||
|
||||
/**
|
||||
___ _ _ _ _
|
||||
/ __| |_ ___ __| |_____ _ _| |_ ___ ___| |_ _ _ _ __
|
||||
| (__| ' \/ -_) _| / / _ \ || | _| (_-</ -_) _| || | '_ \
|
||||
\___|_||_\___\__|_\_\___/\_,_|\__| /__/\___|\__|\_,_| .__/
|
||||
|_|
|
||||
*/
|
||||
|
||||
const webpack = require("webpack");
|
||||
const pacote = require("../package.json");
|
||||
|
||||
const isProduction = process.env.NODE_ENV === "production";
|
||||
|
||||
const paths = {
|
||||
styles: {
|
||||
src: "src/arquivos/sass/*.{scss,css,sass}",
|
||||
lib: "src/arquivos/sass/lib",
|
||||
watch: "src/arquivos/sass/**/*.scss",
|
||||
},
|
||||
scripts: {
|
||||
watch: "src/arquivos/js/**/*.js",
|
||||
},
|
||||
img: {
|
||||
src: "src/arquivos/img/*.{png,gif,jpg}",
|
||||
watch: "src/arquivos/img/**/*.{png,gif,jpg}",
|
||||
},
|
||||
fonts: {
|
||||
src: "src/arquivos/fonts/**.*",
|
||||
},
|
||||
output: "dist",
|
||||
outputStatic: "dist/arquivos",
|
||||
tmp: ".temp",
|
||||
};
|
||||
|
||||
function clean() {
|
||||
return del([paths.output, paths.tmp]);
|
||||
}
|
||||
|
||||
function styles() {
|
||||
return gulp
|
||||
.src(paths.styles.src)
|
||||
.pipe(gulpif(!isProduction, sourcemaps.init()))
|
||||
.pipe(
|
||||
sass({
|
||||
outputStyle: "compressed",
|
||||
}).on("error", sass.logError)
|
||||
)
|
||||
.pipe(
|
||||
autoprefixer({
|
||||
cascade: false,
|
||||
})
|
||||
)
|
||||
.pipe(
|
||||
rename({
|
||||
prefix: pacote.name + "--",
|
||||
extname: ".css",
|
||||
})
|
||||
)
|
||||
.pipe(gulpif(!isProduction, sourcemaps.write()))
|
||||
.pipe(gulp.dest(paths.outputStatic))
|
||||
.pipe(connect.reload());
|
||||
}
|
||||
|
||||
function scripts() {
|
||||
let webpackConfig = require("./webpack.dev.js");
|
||||
|
||||
if (process.env.NODE_ENV === "production") {
|
||||
webpackConfig = require("./webpack.prod.js");
|
||||
}
|
||||
|
||||
return new Promise((resolve) =>
|
||||
webpack(webpackConfig, (err, stats) => {
|
||||
if (err) console.log("Webpack", err);
|
||||
|
||||
console.log(
|
||||
stats.toString({
|
||||
all: false,
|
||||
modules: false,
|
||||
maxModules: 0,
|
||||
errors: true,
|
||||
warnings: true,
|
||||
moduleTrace: true,
|
||||
errorDetails: true,
|
||||
colors: true,
|
||||
chunks: true,
|
||||
})
|
||||
);
|
||||
|
||||
resolve();
|
||||
connect.reload();
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
function customFonts() {
|
||||
return gulp
|
||||
.src(paths.fonts.src)
|
||||
.pipe(
|
||||
rename((path) => ({
|
||||
dirname: "",
|
||||
basename: path.basename,
|
||||
extname: path.extname + ".css",
|
||||
}))
|
||||
)
|
||||
.pipe(gulp.dest(paths.outputStatic))
|
||||
.pipe(connect.reload());
|
||||
}
|
||||
|
||||
function watch() {
|
||||
devServer();
|
||||
gulp.watch(paths.scripts.watch, { ignoreInitial: false }, scripts);
|
||||
gulp.watch(paths.styles.watch, { ignoreInitial: false }, styles);
|
||||
gulp.watch(paths.fonts.src, { ignoreInitial: false }, customFonts);
|
||||
}
|
||||
|
||||
function devServer() {
|
||||
connect.server({
|
||||
root: paths.output,
|
||||
livereload: true,
|
||||
port: 3000,
|
||||
});
|
||||
}
|
||||
|
||||
const build = gulp.series(clean, gulp.parallel(scripts, styles, customFonts));
|
||||
|
||||
exports.build = build;
|
||||
exports.clean = clean;
|
||||
exports.scripts = scripts;
|
||||
exports.styles = styles;
|
||||
exports.devServer = devServer;
|
||||
exports.watch = gulp.series(build, watch);
|
56
checkout/package.json
Normal file
@ -0,0 +1,56 @@
|
||||
{
|
||||
"name": "checkout",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"license": "UNLICENSED",
|
||||
"scripts": {
|
||||
"dev": "cross-env NODE_ENV=development gulp watch",
|
||||
"prod": "cross-env NODE_ENV=production gulp build",
|
||||
"lint": "eslint ./src --fix"
|
||||
},
|
||||
"dependencies": {
|
||||
"@agenciam3/pkg": "^1.1.13",
|
||||
"@babel/plugin-transform-async-to-generator": "^7.14.5",
|
||||
"cookie": "^0.4.1",
|
||||
"del": "^6.0.0",
|
||||
"glob": "^7.1.7",
|
||||
"gulp": "^4.0.2",
|
||||
"gulp-autoprefixer": "^8.0.0",
|
||||
"gulp-concat": "^2.6.1",
|
||||
"gulp-connect": "^5.7.0",
|
||||
"gulp-if": "^3.0.0",
|
||||
"gulp-rename": "^2.0.0",
|
||||
"gulp-sass": "^5.0.0",
|
||||
"gulp-sourcemaps": "^3.0.0",
|
||||
"jquery": "^3.6.0",
|
||||
"sass": "^1.38.1",
|
||||
"terser-webpack-plugin": "^5.1.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.15.0",
|
||||
"@babel/preset-env": "^7.15.0",
|
||||
"@babel/preset-react": "^7.14.5",
|
||||
"babel-loader": "^8.2.2",
|
||||
"cross-env": "^7.0.3",
|
||||
"eslint-config-prettier": "^8.3.0",
|
||||
"eslint-plugin-prettier": "^3.4.1",
|
||||
"lint-staged": "^11.1.2",
|
||||
"prettier": "^2.3.2",
|
||||
"webpack": "^5.51.1",
|
||||
"webpack-merge": "^5.8.0"
|
||||
},
|
||||
"babel": {
|
||||
"presets": [
|
||||
"@babel/env",
|
||||
"@babel/react"
|
||||
]
|
||||
},
|
||||
"browserslist": [
|
||||
"defaults"
|
||||
],
|
||||
"lint-staged": {
|
||||
"src/**/*": [
|
||||
"yarn lint"
|
||||
]
|
||||
}
|
||||
}
|
BIN
checkout/src/arquivos/fonts/NeoSansPro-Regular.otf
Normal file
BIN
checkout/src/arquivos/img/amex.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
checkout/src/arquivos/img/arrow-left.png
Normal file
After Width: | Height: | Size: 347 B |
BIN
checkout/src/arquivos/img/boleto.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
checkout/src/arquivos/img/cace.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
checkout/src/arquivos/img/ck-facebook.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
checkout/src/arquivos/img/ck-instagram.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
checkout/src/arquivos/img/ck-twitter.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
checkout/src/arquivos/img/ck-youtube.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
checkout/src/arquivos/img/dataweb.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
checkout/src/arquivos/img/elo.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
checkout/src/arquivos/img/hipercard.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
checkout/src/arquivos/img/linkedin.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
checkout/src/arquivos/img/lock.png
Normal file
After Width: | Height: | Size: 456 B |
BIN
checkout/src/arquivos/img/logo-checkout.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
checkout/src/arquivos/img/m3-gray.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
checkout/src/arquivos/img/m3-white.png
Normal file
After Width: | Height: | Size: 736 B |
BIN
checkout/src/arquivos/img/m3.png
Normal file
After Width: | Height: | Size: 1018 B |
BIN
checkout/src/arquivos/img/master-card.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
checkout/src/arquivos/img/paypal.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
checkout/src/arquivos/img/visa.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
checkout/src/arquivos/img/vtex-gray.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
checkout/src/arquivos/img/vtex-pci.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
checkout/src/arquivos/img/vtex-white.png
Normal file
After Width: | Height: | Size: 991 B |
BIN
checkout/src/arquivos/img/vtex.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
14
checkout/src/arquivos/js/checkout.js
Normal file
@ -0,0 +1,14 @@
|
||||
import CheckoutUI from "./components/CheckoutUI";
|
||||
import { Container } from "@agenciam3/pkg";
|
||||
import Exemple from "./components/Exemple";
|
||||
import ExempleEvent from "./components/ExempleEvent";
|
||||
// import CatalogService from "./services/CatalogService";
|
||||
// import CheckoutService from "./services/checkout/CheckoutService";
|
||||
|
||||
const m3Checkout = new Container({
|
||||
appName: "m3-checkout",
|
||||
// services: [CatalogService, CheckoutService],
|
||||
components: [CheckoutUI, Exemple, ExempleEvent],
|
||||
});
|
||||
|
||||
m3Checkout.start();
|
69
checkout/src/arquivos/js/components/CheckoutUI.js
Normal file
@ -0,0 +1,69 @@
|
||||
import { isSmallerThen768 } from "../helpers/MediasMatch";
|
||||
import { alterarTamanhoImagemSrcVtex } from "../helpers/vtexUtils";
|
||||
import waitForEl from "../helpers/waitForEl";
|
||||
|
||||
export default class CheckoutUI {
|
||||
constructor() {
|
||||
this.init();
|
||||
|
||||
if (isSmallerThen768) {
|
||||
this.selectors();
|
||||
this.events();
|
||||
this.setFooterDropdown();
|
||||
}
|
||||
}
|
||||
|
||||
selectors() {
|
||||
this.title = $(".footerCheckout__title");
|
||||
this.contents = $(".footerCheckout__content");
|
||||
}
|
||||
|
||||
events() {
|
||||
this.title.click(this.toggleFooterDropdown.bind(this));
|
||||
}
|
||||
|
||||
setFooterDropdown() {
|
||||
for (let i = 0; i < this.title.length; i++) {
|
||||
this.title[i].classList.add("dropdown__title");
|
||||
this.contents[i].classList.add("dropdown__content--closed");
|
||||
}
|
||||
}
|
||||
|
||||
toggleFooterDropdown(event) {
|
||||
event.target.classList.toggle("closed");
|
||||
|
||||
event.target.nextElementSibling.classList.toggle(
|
||||
"dropdown__content--closed"
|
||||
);
|
||||
}
|
||||
|
||||
init() {
|
||||
this.configThumb();
|
||||
waitForEl(".product-image img", this.resizeImages.bind(this));
|
||||
$(window).on("orderFormUpdated.vtex", this.resizeImages.bind(this));
|
||||
}
|
||||
|
||||
configThumb() {
|
||||
if (isSmallerThen768) {
|
||||
this.width = 73;
|
||||
this.height = 96;
|
||||
} else {
|
||||
this.width = 63;
|
||||
this.height = 83;
|
||||
}
|
||||
}
|
||||
|
||||
resizeImages() {
|
||||
$(".product-image img").each((i, el) => {
|
||||
const $el = $(el);
|
||||
$el.attr(
|
||||
"src",
|
||||
alterarTamanhoImagemSrcVtex(
|
||||
$el.attr("src"),
|
||||
this.width,
|
||||
this.height
|
||||
)
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
18
checkout/src/arquivos/js/components/Exemple.js
Normal file
@ -0,0 +1,18 @@
|
||||
import waitForEl from "../helpers/waitForEl";
|
||||
|
||||
export default class Exemple {
|
||||
constructor() {
|
||||
this.init();
|
||||
}
|
||||
|
||||
async init() {
|
||||
await this.selectors();
|
||||
console.log(this.item);
|
||||
}
|
||||
|
||||
async selectors() {
|
||||
this.item = await waitForEl(
|
||||
".summary-cart-template-holder .cart-items"
|
||||
);
|
||||
}
|
||||
}
|
12
checkout/src/arquivos/js/components/ExempleEvent.js
Normal file
@ -0,0 +1,12 @@
|
||||
export default class ExempleEvent {
|
||||
constructor() {
|
||||
this.eventos();
|
||||
}
|
||||
eventos() {
|
||||
$(window).on("orderFormUpdated.vtex", this.onUpdate.bind(this));
|
||||
}
|
||||
|
||||
onUpdate(orderForm) {
|
||||
console.log(orderForm);
|
||||
}
|
||||
}
|
34
checkout/src/arquivos/js/helpers/HashRouter.js
Normal file
@ -0,0 +1,34 @@
|
||||
/**
|
||||
* Helper de para ultização de eventos sobre a navegação por hash
|
||||
*/
|
||||
|
||||
export default class HashRouter {
|
||||
constructor(routes) {
|
||||
this.routes = routes;
|
||||
window.addEventListener("hashchange", this.hashChange.bind(this));
|
||||
this.init();
|
||||
}
|
||||
|
||||
hashChange(e) {
|
||||
const from = new URL(e.oldURL).hash || "/";
|
||||
const to = new URL(e.newURL).hash || "/";
|
||||
|
||||
this.routes.forEach((route) => {
|
||||
if (route.path === to) {
|
||||
route.onEnter && route.onEnter();
|
||||
} else if (route.path === from) {
|
||||
route.onLeave && route.onLeave();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
init() {
|
||||
const actualHash = window.location.hash || "/";
|
||||
|
||||
this.routes.forEach((route) => {
|
||||
if (route.path === actualHash) {
|
||||
route.onEnter && route.onEnter();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
1
checkout/src/arquivos/js/helpers/MediasMatch.js
Normal file
@ -0,0 +1 @@
|
||||
export const isSmallerThen768 = window.matchMedia("(max-width:768px)").matches;
|
75
checkout/src/arquivos/js/helpers/cookie.js
Normal file
@ -0,0 +1,75 @@
|
||||
/* eslint-disable no-useless-escape */
|
||||
import cookie from "cookie";
|
||||
class Cookie {
|
||||
get(sKey) {
|
||||
if (!sKey) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const cookies = cookie.parse(document.cookie);
|
||||
return cookies[sKey] || null;
|
||||
}
|
||||
|
||||
set(sKey, sValue, vEnd, sPath, sDomain, bSecure) {
|
||||
if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) {
|
||||
return false;
|
||||
}
|
||||
var sExpires = "";
|
||||
if (vEnd) {
|
||||
switch (vEnd.constructor) {
|
||||
case Number:
|
||||
sExpires =
|
||||
vEnd === Infinity
|
||||
? "; expires=Fri, 31 Dec 9999 23:59:59 GMT"
|
||||
: "; max-age=" + vEnd;
|
||||
break;
|
||||
case String:
|
||||
sExpires = "; expires=" + vEnd;
|
||||
break;
|
||||
case Date:
|
||||
sExpires = "; expires=" + vEnd.toUTCString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
document.cookie =
|
||||
encodeURIComponent(sKey) +
|
||||
"=" +
|
||||
encodeURIComponent(sValue) +
|
||||
sExpires +
|
||||
(sDomain ? "; domain=" + sDomain : "") +
|
||||
(sPath ? "; path=" + sPath : "") +
|
||||
(bSecure ? "; secure" : "");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
delete(sKey, sPath, sDomain) {
|
||||
if (!this.hasItem(sKey)) {
|
||||
return false;
|
||||
}
|
||||
document.cookie =
|
||||
encodeURIComponent(sKey) +
|
||||
"=; expires=Thu, 01 Jan 1970 00:00:00 GMT" +
|
||||
(sDomain ? "; domain=" + sDomain : "") +
|
||||
(sPath ? "; path=" + sPath : "");
|
||||
return true;
|
||||
}
|
||||
|
||||
has(sKey) {
|
||||
if (!sKey) {
|
||||
return false;
|
||||
}
|
||||
return new RegExp(
|
||||
"(?:^|;\\s*)" +
|
||||
encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") +
|
||||
"\\s*\\="
|
||||
).test(document.cookie);
|
||||
}
|
||||
|
||||
keys() {
|
||||
return cookie.parse(document.cookie);
|
||||
}
|
||||
}
|
||||
|
||||
export default new Cookie();
|
28
checkout/src/arquivos/js/helpers/isPage.js
Normal file
@ -0,0 +1,28 @@
|
||||
/**
|
||||
* Função para verificar se estamos em uma das paginas
|
||||
* que são passadas por argumento
|
||||
* @param {array} [varname] um array de strings
|
||||
* @return {Boolean} [description]
|
||||
*/
|
||||
|
||||
function isPage() {
|
||||
const identificacaoMetaPage = $('meta[name="page"]').prop("content") || "";
|
||||
const classTagBody = $("body").attr("class") || "";
|
||||
const pageDataLayer =
|
||||
typeof dataLayer !== "undefined"
|
||||
? window.dataLayer[0].pageCategory
|
||||
: "";
|
||||
|
||||
for (const i in arguments) {
|
||||
// resultado-busca na tag body
|
||||
if (
|
||||
identificacaoMetaPage.search(arguments[i]) >= 0 ||
|
||||
pageDataLayer === arguments[i] ||
|
||||
classTagBody.search(arguments[i]) >= 0
|
||||
)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
export default isPage;
|
74
checkout/src/arquivos/js/helpers/vtexUtils.js
Normal file
@ -0,0 +1,74 @@
|
||||
/**
|
||||
* Altera as dimenções especificadas na url da img
|
||||
* @param {string} src url da imagem na VTEX
|
||||
* @param {int} width
|
||||
* @param {int} height
|
||||
* @return {string} url da imagem com o tamanho alterado
|
||||
*/
|
||||
|
||||
export function alterarTamanhoImagemSrcVtex(src, width, height) {
|
||||
if (typeof src == "undefined") {
|
||||
console.warn("Parametro 'src' não recebido.");
|
||||
|
||||
return;
|
||||
}
|
||||
width = typeof width == "undefined" ? 1 : width;
|
||||
height = typeof height == "undefined" ? width : height;
|
||||
|
||||
src = src.replace(
|
||||
/\/(\d+)(-(\d+-\d+)|(_\d+))\//g,
|
||||
"/$1-" + width + "-" + height + "/"
|
||||
);
|
||||
return src;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtem Preco
|
||||
* caso o preco recebido seja um Float ou int,
|
||||
* 'Ex.': 10.2 ->'10,20'
|
||||
* Recebendo uma string o valor sera retornado como um float
|
||||
* 'Ex.': 'R$1.234,30' -> 1234.3
|
||||
* @param {FloatZstring} price preço
|
||||
* @return {[type]} [description]
|
||||
*/
|
||||
export function getPrice(price) {
|
||||
if (!price) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (isNaN(price)) {
|
||||
return parseFloat(
|
||||
price.replace("R$", "").replace(".", "").replace(",", ".")
|
||||
);
|
||||
} else {
|
||||
price = price || 0;
|
||||
price = price.toLocaleString("pt-BR", {
|
||||
minimumFractionDigits: 2,
|
||||
maximumFractionDigits: 2,
|
||||
});
|
||||
|
||||
return price;
|
||||
}
|
||||
}
|
||||
|
||||
export function formatCurrency() {
|
||||
return Number(value).toLocaleString("pt-BR", {
|
||||
style: "currency",
|
||||
currency: "BRL",
|
||||
});
|
||||
}
|
||||
|
||||
export function getSellerChannel() {
|
||||
var name = "VTEXSC=sc=";
|
||||
var ca = document.cookie.split(";");
|
||||
let res = "1";
|
||||
ca.forEach((c) => {
|
||||
let value = String(c);
|
||||
while (value.charAt(0) == " ") value = value.substring(1);
|
||||
if (value.indexOf(name) == 0) {
|
||||
res = value.substring(name.length, value.length);
|
||||
}
|
||||
});
|
||||
|
||||
return res;
|
||||
}
|
22
checkout/src/arquivos/js/helpers/waitForEl.js
Normal file
@ -0,0 +1,22 @@
|
||||
/**
|
||||
* Espera um elemento exitir no dom e executa o callback
|
||||
*
|
||||
* @param {string} selector seletor do elemento que dejesa esperar pela criação
|
||||
* @param {function} callback Função a ser executada quando tal elemento existir
|
||||
*/
|
||||
|
||||
export default function waitForEl(selector) {
|
||||
return new Promise((resolve) => {
|
||||
function waitForElCb(s) {
|
||||
const el = jQuery(s);
|
||||
if (el.length) {
|
||||
resolve(el);
|
||||
} else {
|
||||
setTimeout(function () {
|
||||
waitForElCb(selector);
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
waitForElCb(selector);
|
||||
});
|
||||
}
|
25
checkout/src/arquivos/js/lib/Evento.js
Normal file
@ -0,0 +1,25 @@
|
||||
var Evento = function () {
|
||||
var _this = this;
|
||||
_this.handlers = [];
|
||||
|
||||
_this.subscribe = function (fn) {
|
||||
this.handlers.push(fn);
|
||||
}.bind(_this);
|
||||
|
||||
_this.unsubscribe = function (fn) {
|
||||
this.handlers = this.handlers.filter(function (item) {
|
||||
if (item !== fn) {
|
||||
return item;
|
||||
}
|
||||
});
|
||||
}.bind(_this);
|
||||
|
||||
_this.fire = function (dados, thisObj) {
|
||||
var scope = thisObj || window;
|
||||
this.handlers.forEach(function (item) {
|
||||
item.call(scope, dados);
|
||||
});
|
||||
}.bind(_this);
|
||||
};
|
||||
|
||||
export default Evento;
|
105
checkout/src/arquivos/js/lib/RestricaoDeConclusao.js
Normal file
@ -0,0 +1,105 @@
|
||||
import Evento from "./Evento";
|
||||
|
||||
var RestricaoDeConculsao = function (funcaoDeAvaliacao, mensagemDeErro) {
|
||||
var _this = this,
|
||||
_regraAtiva = true,
|
||||
_mensagemDeErro;
|
||||
|
||||
var eventos = {
|
||||
tentativaDeFinalizacao: new Evento(),
|
||||
aplicavel: new Evento(),
|
||||
naoAplicavel: new Evento(),
|
||||
};
|
||||
_this.on = function (evento, fn) {
|
||||
if (Reflect.has(eventos, evento)) {
|
||||
eventos[evento].subscribe(fn);
|
||||
}
|
||||
};
|
||||
_this.off = function (evento, fn) {
|
||||
if (Reflect.has(eventos, evento)) {
|
||||
eventos[evento].unsubscribe(fn);
|
||||
}
|
||||
};
|
||||
_this.mensagemDeErro = function (
|
||||
mensagemDeErro = "Forneca as informações para finalizar a compra"
|
||||
) {
|
||||
if (mensagemDeErro) _mensagemDeErro = mensagemDeErro;
|
||||
return _mensagemDeErro;
|
||||
};
|
||||
|
||||
_this.inicializar = function configurarEventos() {
|
||||
$(window).on("orderFormUpdated.vtex", atualizacaoDoPedido);
|
||||
window.vtexjs.checkout.getOrderForm();
|
||||
};
|
||||
|
||||
function feedback(tipo, titulo, detalhe) {
|
||||
var message = {
|
||||
content: {
|
||||
title: titulo,
|
||||
detail: detalhe,
|
||||
},
|
||||
type: tipo,
|
||||
};
|
||||
if ("undefined" != typeof $) {
|
||||
$(window).trigger("addMessage", message);
|
||||
} else {
|
||||
console.warn("Erro ao acionar front-messages-ui");
|
||||
}
|
||||
}
|
||||
|
||||
function clickBtnDesabilitado(event) {
|
||||
event.preventDefault();
|
||||
feedback("warning", "Erro ", _mensagemDeErro);
|
||||
eventos.tentativaDeFinalizacao.fire();
|
||||
}
|
||||
|
||||
function aplicavel(alternativa) {
|
||||
// se a regra estiver desativada não sera aplicada
|
||||
alternativa = alternativa && _regraAtiva;
|
||||
var evento = alternativa ? "aplicavel" : "naoAplicavel";
|
||||
eventos[evento].fire();
|
||||
ativacao(alternativa);
|
||||
}
|
||||
|
||||
function ativacao(alternativa) {
|
||||
var $btnContainer = $(".payment-submit-wrap,.payment-submit-hide");
|
||||
var btns = $btnContainer.find("button");
|
||||
|
||||
btns.each(function (i, el) {
|
||||
$(el).toggleClass("btn-warning", alternativa);
|
||||
});
|
||||
|
||||
if (!alternativa) {
|
||||
$btnContainer.off("click", clickBtnDesabilitado);
|
||||
} else {
|
||||
$btnContainer.on("click", clickBtnDesabilitado);
|
||||
}
|
||||
}
|
||||
|
||||
_this.ativar = function () {
|
||||
_regraAtiva = true;
|
||||
ativacao(_regraAtiva);
|
||||
};
|
||||
_this.desativar = function () {
|
||||
_regraAtiva = false;
|
||||
ativacao(_regraAtiva);
|
||||
};
|
||||
|
||||
function atualizacaoDoPedido(event, orderform) {
|
||||
var ehAplicavel = funcaoDeAvaliacao.call(funcaoDeAvaliacao, orderform);
|
||||
if (typeof ehAplicavel === "boolean") {
|
||||
aplicavel(ehAplicavel);
|
||||
} else {
|
||||
aplicavel(false);
|
||||
console.error(
|
||||
"função de avaliação retornando resultado indefinido.\n",
|
||||
ehAplicavel
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
_this.mensagemDeErro(mensagemDeErro);
|
||||
_this.inicializar();
|
||||
};
|
||||
|
||||
export default RestricaoDeConculsao;
|
17
checkout/src/arquivos/js/services/CatalogService.js
Normal file
@ -0,0 +1,17 @@
|
||||
export default class CatalogService {
|
||||
async getSkusData(skus) {
|
||||
const skusPromises = skus.map(this.getSkuData);
|
||||
|
||||
const responses = await Promise.all(skusPromises);
|
||||
|
||||
return Promise.all(responses.map((r) => r.json()));
|
||||
}
|
||||
|
||||
getSkuData(sku) {
|
||||
const urlSku = "/produto/sku/" + sku;
|
||||
|
||||
return fetch(urlSku, {
|
||||
method: "GET",
|
||||
});
|
||||
}
|
||||
}
|
29
checkout/src/arquivos/js/services/checkout/CartItem.js
Normal file
@ -0,0 +1,29 @@
|
||||
export default class CartItem {
|
||||
constructor({
|
||||
productID,
|
||||
skuID,
|
||||
url,
|
||||
imageUrl,
|
||||
name,
|
||||
priceOf,
|
||||
price,
|
||||
maxInstallmentAmount,
|
||||
maxInstallmentValue,
|
||||
qtd,
|
||||
id,
|
||||
availableQtd,
|
||||
}) {
|
||||
this.id = id;
|
||||
this.productID = productID;
|
||||
this.skuID = skuID;
|
||||
this.url = url;
|
||||
this.imageUrl = imageUrl;
|
||||
this.name = name;
|
||||
this.priceOf = priceOf;
|
||||
this.price = price;
|
||||
this.maxInstallmentAmount = maxInstallmentAmount;
|
||||
this.maxInstallmentValue = maxInstallmentValue;
|
||||
this.qtd = qtd;
|
||||
this.availableQtd = availableQtd;
|
||||
}
|
||||
}
|
@ -0,0 +1,97 @@
|
||||
import { getSalesChannel } from "Helpers/utils";
|
||||
import { PubSub } from "@agenciam3/pkg/dist/lib/index";
|
||||
import CartItem from "./CartItem";
|
||||
|
||||
export default class CheckoutService {
|
||||
constructor() {
|
||||
this.eventsName = {
|
||||
CHECKOUT_UPDATED: "CHECKOUT_UPDATED",
|
||||
ORDERFORM_UPDATED: "ORDERFORM_UPDATED",
|
||||
};
|
||||
this.events = new PubSub();
|
||||
if (window.vtexjs) {
|
||||
this.checkout = window.vtexjs.checkout;
|
||||
this.orderform = window.vtexjs.checkout.orderForm;
|
||||
this.events.subscribe(
|
||||
this.eventsName.ORDERFORM_UPDATED,
|
||||
this._orderFormUpdated.bind(this)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
_orderFormUpdated(evt, orderForm) {
|
||||
const cartItems = this._mapOrderFormToCartItems(orderForm);
|
||||
this.events.publish(this.eventsName.CHECKOUT_UPDATED, cartItems);
|
||||
}
|
||||
|
||||
async addItemsToCart(items) {
|
||||
try {
|
||||
return await this.checkout.addToCart(
|
||||
items,
|
||||
null,
|
||||
getSalesChannel()
|
||||
);
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
}
|
||||
|
||||
async rmAllItems() {
|
||||
try {
|
||||
return await this.checkout.removeAllItems();
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
}
|
||||
|
||||
async updateCartItemsQtd(items, qtd) {
|
||||
try {
|
||||
const orderForm = await this.checkout.getOrderForm();
|
||||
let itemIndex;
|
||||
for (let i = 0; i < orderForm.items.length; i++) {
|
||||
if (orderForm.items[i].uniqueId == items.id) {
|
||||
itemIndex = i;
|
||||
}
|
||||
}
|
||||
const updateItem = {
|
||||
index: itemIndex,
|
||||
quantity: qtd,
|
||||
};
|
||||
|
||||
return await window.vtexjs.checkout.updateItems(
|
||||
[updateItem],
|
||||
null,
|
||||
false
|
||||
);
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
}
|
||||
|
||||
async getCartItems() {
|
||||
try {
|
||||
const orderform = await this.checkout.getOrderForm();
|
||||
return this._mapOrderFormToCartItems(orderform);
|
||||
} catch (err) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
_mapOrderFormToCartItems(orderform) {
|
||||
if (orderform.items.length === 0) return [];
|
||||
return orderform.items.map(
|
||||
(item) =>
|
||||
new CartItem({
|
||||
id: item.uniqueId,
|
||||
imageUrl: item.imageUrl,
|
||||
skuID: item.id,
|
||||
productID: item.productId,
|
||||
qtd: item.quantity,
|
||||
price: item.price,
|
||||
priceOf: item.listPrice,
|
||||
name: item.name,
|
||||
url: item.detailUrl,
|
||||
})
|
||||
);
|
||||
}
|
||||
}
|
5
checkout/src/arquivos/sass/checkout.scss
Normal file
@ -0,0 +1,5 @@
|
||||
@import "./utils/all";
|
||||
|
||||
|
||||
@import "./partials/header";
|
||||
@import "./partials/footer";
|
289
checkout/src/arquivos/sass/checkout/_checkout-autenticacao.scss
Normal file
@ -0,0 +1,289 @@
|
||||
.checkout-container {
|
||||
.client-pre-email {
|
||||
border-color: $color-gray4;
|
||||
font-family: $font-family;
|
||||
padding-top: 8px;
|
||||
|
||||
.link-cart {
|
||||
a {
|
||||
color: $color-black;
|
||||
font-size: 14px;
|
||||
|
||||
&:hover {
|
||||
color: lighen($color-black, 10);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.pre-email {
|
||||
flex-direction: column;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
h3 {
|
||||
margin-bottom: 16px;
|
||||
|
||||
span {
|
||||
color: #303030;
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
small {
|
||||
color: $color-gray4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.client-email {
|
||||
margin: 0 0 16px;
|
||||
|
||||
input {
|
||||
box-shadow: none;
|
||||
color: $color-black;
|
||||
font-family: $font-family;
|
||||
padding: 0 16px;
|
||||
border: 2px solid $color-gray3;
|
||||
box-sizing: border-box;
|
||||
border-radius: 5px;
|
||||
|
||||
@media (max-width: 490px) {
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
button {
|
||||
background-color: $color-black;
|
||||
border-radius: 5px;
|
||||
border: none;
|
||||
font-family: $font-family;
|
||||
height: 54px;
|
||||
right: 0;
|
||||
top: 0;
|
||||
|
||||
@media (max-width: 490px) {
|
||||
height: 48px;
|
||||
margin: 0;
|
||||
position: absolute;
|
||||
}
|
||||
}
|
||||
|
||||
span.help.error {
|
||||
color: red;
|
||||
}
|
||||
}
|
||||
|
||||
.emailInfo {
|
||||
padding: 16px;
|
||||
background-color: $color-white;
|
||||
border: 1px solid $color-gray4;
|
||||
border-radius: 0;
|
||||
|
||||
h3 {
|
||||
color: #303030;
|
||||
margin: 0 0 8px 0;
|
||||
}
|
||||
|
||||
ul {
|
||||
margin: 0;
|
||||
|
||||
li {
|
||||
span {
|
||||
color: $color-black;
|
||||
}
|
||||
|
||||
i::before {
|
||||
color: $color-black;
|
||||
font-size: 1rem;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
i::before {
|
||||
color: $color-black;
|
||||
font-size: 6rem;
|
||||
opacity: 0.5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.shipping-data,
|
||||
.payment-data,
|
||||
.client-profile-data {
|
||||
.accordion-group {
|
||||
border-radius: 0;
|
||||
border: 1px solid $color-gray4;
|
||||
font-family: $font-family;
|
||||
padding: 16px;
|
||||
|
||||
.accordion-heading {
|
||||
span {
|
||||
color: #303030;
|
||||
margin-bottom: 8px;
|
||||
padding: 0;
|
||||
|
||||
i::before {
|
||||
fill: #303030;
|
||||
}
|
||||
}
|
||||
|
||||
a {
|
||||
align-items: center;
|
||||
background-color: #303030;
|
||||
border-radius: 8px;
|
||||
border: none;
|
||||
color: $color-white;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding: 6px 5px 6px 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.accordion-inner {
|
||||
padding: 0;
|
||||
|
||||
/* General configurations */
|
||||
|
||||
.client-notice {
|
||||
color: $color-black;
|
||||
}
|
||||
|
||||
p {
|
||||
label {
|
||||
color: $color-black;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
select,
|
||||
input {
|
||||
border-radius: 0;
|
||||
border: 1px solid $color-gray4;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.help.error {
|
||||
color: red;
|
||||
}
|
||||
}
|
||||
|
||||
.box-client-info-pj {
|
||||
.link a#is-corporate-client,
|
||||
.link a#not-corporate-client {
|
||||
color: $color-black;
|
||||
font-weight: 500;
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
.state-inscription-box span {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
button.submit {
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
background: $color-black;
|
||||
margin-top: 8px;
|
||||
outline: none;
|
||||
transition: all 0.2s linear;
|
||||
|
||||
&:hover {
|
||||
background: lighten($color-black, 5);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background: darken($color-black, 5);
|
||||
}
|
||||
}
|
||||
|
||||
/* Shipping configurations */
|
||||
|
||||
.ship-postalCode small a {
|
||||
color: #303030;
|
||||
font-weight: 500;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.vtex-omnishipping-1-x-deliveryGroup {
|
||||
p {
|
||||
color: #303030;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.shp-lean {
|
||||
border: 1px solid $color-gray4;
|
||||
border-radius: 0;
|
||||
|
||||
label {
|
||||
background-color: $color-white;
|
||||
box-shadow: none;
|
||||
color: #303030;
|
||||
padding: 8px 12px;
|
||||
|
||||
svg path {
|
||||
fill: #d8c8ac;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.delivery-address-title {
|
||||
color: #303030;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.shp-summary-group-info {
|
||||
border-color: $color-gray4;
|
||||
}
|
||||
|
||||
.address-summary {
|
||||
background: none;
|
||||
border-color: $color-gray4;
|
||||
border-radius: 0;
|
||||
color: #303030;
|
||||
padding: 12px;
|
||||
|
||||
@include mq(md, max) {
|
||||
background-position: 8px 9px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #303030;
|
||||
font-weight: 500;
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
.shp-summary-group-price,
|
||||
.shp-summary-package {
|
||||
color: $color-gray4;
|
||||
}
|
||||
|
||||
.shp-summary-group-price {
|
||||
padding-right: 16px;
|
||||
}
|
||||
|
||||
.shp-summary-package {
|
||||
padding-left: 16px;
|
||||
}
|
||||
|
||||
.vtex-omnishipping-1-x-summaryChange {
|
||||
border-color: #303030;
|
||||
color: #303030;
|
||||
}
|
||||
|
||||
.vtex-omnishipping-1-x-deliveryChannelsToggle {
|
||||
background-color: #d8c8ac;
|
||||
border: 1px solid #d8c8ac;
|
||||
}
|
||||
|
||||
.vtex-omnishipping-1-x-deliveryOptionActive {
|
||||
text-shadow: 1.3px 1px lighten($color-black, 50);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
814
checkout/src/arquivos/sass/checkout/_checkout-carrinho.scss
Normal file
@ -0,0 +1,814 @@
|
||||
.container {
|
||||
@include mq(md, max) {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.cart-template {
|
||||
font-family: $font-family;
|
||||
@include mq(md, max) {
|
||||
padding: 0 0;
|
||||
}
|
||||
.item-unit-label {
|
||||
display: none;
|
||||
}
|
||||
.cart {
|
||||
border: 3px solid $color-gray3;
|
||||
box-sizing: border-box;
|
||||
border-radius: 5px;
|
||||
padding: 16px;
|
||||
|
||||
@include mq(md, max) {
|
||||
margin: 0px 0 25px 0;
|
||||
border-left: none;
|
||||
border-right: none;
|
||||
border-radius: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.cart-fixed {
|
||||
font-family: $font-family;
|
||||
|
||||
h2 {
|
||||
background: $color-white;
|
||||
border: none;
|
||||
color: #303030;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.item-unavailable {
|
||||
padding: 0;
|
||||
|
||||
&-message {
|
||||
padding: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.cart {
|
||||
border: 1px solid $color-gray4;
|
||||
|
||||
ul li {
|
||||
border-top: none;
|
||||
margin-top: 0;
|
||||
padding-top: 0;
|
||||
|
||||
&:not(:first-child) {
|
||||
margin-top: 8px;
|
||||
padding-top: 8px;
|
||||
border-top: 1px solid #e5e5e5;
|
||||
}
|
||||
|
||||
.shipping-date,
|
||||
.price {
|
||||
color: #7d7d7d;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.summary-template-holder {
|
||||
border-top: none;
|
||||
background: $color-white;
|
||||
}
|
||||
|
||||
#go-to-cart-button a {
|
||||
color: #303030;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.summary-totalizers {
|
||||
td.info {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
#payment-data-submit {
|
||||
background: $color-black;
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
color: $color-white;
|
||||
outline: none;
|
||||
transition: all 0.2s linear;
|
||||
&:hover {
|
||||
background: lighten($color-black, 5);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background: darken($color-black, 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.lookatme {
|
||||
background-color: $color-white;
|
||||
}
|
||||
|
||||
.cart-items {
|
||||
.product-item {
|
||||
padding: 16px 0;
|
||||
}
|
||||
|
||||
th {
|
||||
color: $color-black;
|
||||
padding: 0 0 16px;
|
||||
font-style: normal;
|
||||
font-weight: bold;
|
||||
font-size: 14px;
|
||||
line-height: 16px;
|
||||
|
||||
@include mq(md, max) {
|
||||
&.quantity-price,
|
||||
&.shipping-date {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.product-image {
|
||||
height: auto;
|
||||
padding: 0;
|
||||
width: 60px;
|
||||
|
||||
@include mq(sm, max) {
|
||||
width: 72px;
|
||||
}
|
||||
|
||||
img {
|
||||
height: 60px;
|
||||
max-width: 100%;
|
||||
width: auto;
|
||||
|
||||
@include mq(sm, max) {
|
||||
height: 72px;
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.product-name {
|
||||
padding-right: 0;
|
||||
|
||||
@include mq(lg, max) {
|
||||
width: 250px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: $color-blue;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-size: 12px;
|
||||
line-height: 14px;
|
||||
transition: ease-in 0.22s all;
|
||||
|
||||
&:hover {
|
||||
color: darken($color-blue, 10);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
@media (max-width: 490px) {
|
||||
margin-left: 23px;
|
||||
}
|
||||
}
|
||||
|
||||
.brand,
|
||||
.seller {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
td.shipping-date {
|
||||
color: $color-gray2;
|
||||
font-size: 12px;
|
||||
line-height: 14px;
|
||||
|
||||
@include mq(md, max) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.product-price {
|
||||
min-width: 100px;
|
||||
@include mq(md, max) {
|
||||
min-width: 78px;
|
||||
}
|
||||
@media (max-width: 490px) {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
span.list-price {
|
||||
color: $color-gray2;
|
||||
font-size: 12px;
|
||||
line-height: 14px;
|
||||
text-decoration-line: line-through;
|
||||
@include mq(sm, max) {
|
||||
font-size: 12px;
|
||||
line-height: 14px;
|
||||
}
|
||||
|
||||
.old-product-price-label {
|
||||
text-transform: lowercase;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
td.quantity {
|
||||
align-items: center;
|
||||
border: 1px solid $color-gray3;
|
||||
border-radius: 0;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin: 6px auto 0;
|
||||
max-height: 38px;
|
||||
max-width: 118px;
|
||||
padding: 0;
|
||||
width: max-content !important;
|
||||
|
||||
@media (max-width: 490px) {
|
||||
margin-left: 84px !important;
|
||||
}
|
||||
|
||||
input {
|
||||
background-color: $color-white;
|
||||
border: 1px solid $color-gray3;
|
||||
border-radius: 0;
|
||||
border-width: 0 1px;
|
||||
display: block;
|
||||
max-height: 38px;
|
||||
margin: 0 !important;
|
||||
padding: 8px 0;
|
||||
width: 38px;
|
||||
color: $color-gray2;
|
||||
box-shadow: none;
|
||||
|
||||
@include mq(lg, max) {
|
||||
width: 24px !important;
|
||||
}
|
||||
}
|
||||
|
||||
.icon-plus-sign,
|
||||
.icon-minus-sign {
|
||||
&::before {
|
||||
color: $color-black;
|
||||
display: block;
|
||||
font-weight: 500;
|
||||
padding: 1px 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.icon-minus-sign {
|
||||
&:before {
|
||||
content: "-";
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
.icon-plus-sign {
|
||||
&:before {
|
||||
content: "+";
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
.item-quantity-change {
|
||||
@media (max-width: 979px) and (min-width: 768px) {
|
||||
position: inherit;
|
||||
bottom: inherit;
|
||||
left: inherit;
|
||||
height: inherit;
|
||||
width: inherit;
|
||||
top: inherit;
|
||||
}
|
||||
|
||||
@media (max-width: 490px) {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.quantity-price,
|
||||
.best-price {
|
||||
.icon-question-sign {
|
||||
display: none;
|
||||
}
|
||||
span {
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-size: 14px;
|
||||
line-height: 16px;
|
||||
color: $color-black;
|
||||
}
|
||||
}
|
||||
|
||||
.quantity-price {
|
||||
@include mq(md, max) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.item-remove {
|
||||
@media (max-width: 490px) {
|
||||
top: 0;
|
||||
}
|
||||
.icon::before {
|
||||
color: $color-gray4;
|
||||
font-size: 15px;
|
||||
|
||||
@include mq(md, max) {
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.item-unavailable-message {
|
||||
background-color: #d8c8ac;
|
||||
color: $color-white;
|
||||
|
||||
.icon-warning-sign {
|
||||
color: #bb4f4f;
|
||||
}
|
||||
|
||||
.top-arrow {
|
||||
border-bottom-color: #d8c8ac;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.summary {
|
||||
.cart-more-options {
|
||||
margin: 0;
|
||||
width: max-content;
|
||||
|
||||
.srp-container {
|
||||
padding: 0 0 0 10px;
|
||||
|
||||
@include mq(md, max) {
|
||||
padding: 0 16px;
|
||||
}
|
||||
|
||||
.srp-main-title {
|
||||
margin: 32px 0 12px;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-size: 24px;
|
||||
line-height: 28px;
|
||||
color: $color-gray2;
|
||||
|
||||
@include mq(md, max) {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.srp-description {
|
||||
color: $color-gray2;
|
||||
font-size: 12px;
|
||||
line-height: 18px;
|
||||
margin: 0 0 12px;
|
||||
}
|
||||
|
||||
button.shp-open-options {
|
||||
background-color: $color-gray5;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
color: $color-gray2;
|
||||
font-size: 16px;
|
||||
letter-spacing: 0.05em;
|
||||
line-height: 19px;
|
||||
font-weight: 500;
|
||||
outline: none;
|
||||
padding: 12px 40px;
|
||||
transition: all 0.2s linear;
|
||||
|
||||
&:hover {
|
||||
background-color: lighten($color-gray5, 5);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: darken($color-gray5, 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.srp-data {
|
||||
width: 280px;
|
||||
|
||||
@include mq(cstm, max) {
|
||||
width: calc(100vw - 32px);
|
||||
}
|
||||
|
||||
@include mq(md, max) {
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.srp-pickup-my-location__button {
|
||||
background-color: $color-black;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
color: $color-white;
|
||||
outline: none;
|
||||
width: 100%;
|
||||
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
line-height: 16px;
|
||||
letter-spacing: 0.05em;
|
||||
|
||||
&:hover {
|
||||
background-color: lighten($color-black, 5);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: darken($color-black, 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.srp-toggle {
|
||||
margin: 0 0 34px;
|
||||
|
||||
&__wrapper {
|
||||
background-color: $color-white;
|
||||
border-radius: 100px;
|
||||
width: 100%;
|
||||
font-family: $font-family;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-size: 14px;
|
||||
line-height: 16px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
&__current {
|
||||
border: 1px solid $color-blue;
|
||||
border-radius: 100px;
|
||||
}
|
||||
|
||||
.blue {
|
||||
color: $color-blue;
|
||||
}
|
||||
|
||||
label {
|
||||
width: 50%;
|
||||
|
||||
&:active {
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.srp-postal-code {
|
||||
.ship-postalCode {
|
||||
label {
|
||||
font-family: $font-family;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-size: 12px;
|
||||
line-height: 14px;
|
||||
color: $color-black;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
input {
|
||||
border: 1px solid $color-gray3;
|
||||
border-radius: 5px;
|
||||
box-shadow: none;
|
||||
color: $color-gray3;
|
||||
font-size: 12px;
|
||||
height: 36px;
|
||||
padding: 12px 8px;
|
||||
width: 172px;
|
||||
}
|
||||
|
||||
& ~ button {
|
||||
background-color: $color-black;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
color: $color-white;
|
||||
font-size: 12px;
|
||||
height: 36px;
|
||||
letter-spacing: 1px;
|
||||
outline: none;
|
||||
position: absolute;
|
||||
right: -150px;
|
||||
top: 36px;
|
||||
transition: all 0.2s linear;
|
||||
width: 96px;
|
||||
text-transform: uppercase;
|
||||
|
||||
&:hover {
|
||||
background-color: lighten($color-black, 5);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: darken($color-black, 5);
|
||||
}
|
||||
}
|
||||
|
||||
small a {
|
||||
font-family: $font-family;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-size: 10px;
|
||||
line-height: 12px;
|
||||
color: $color-blue;
|
||||
margin-top: 7px;
|
||||
}
|
||||
|
||||
span.help.error {
|
||||
color: red;
|
||||
font-size: 12px;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
top: 17px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.srp-result {
|
||||
strong,
|
||||
.srp-items {
|
||||
color: #303030;
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#deliver-at-text a {
|
||||
color: #303030;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
|
||||
&:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
.srp-shipping-current-single {
|
||||
border: 1px solid $color-gray4;
|
||||
border-radius: 0;
|
||||
color: #303030;
|
||||
margin: 16px 0 0;
|
||||
padding: 4px 12px;
|
||||
|
||||
svg path {
|
||||
fill: #d8c8ac;
|
||||
}
|
||||
}
|
||||
|
||||
.srp-delivery-select {
|
||||
border: 1px solid $color-gray4;
|
||||
}
|
||||
|
||||
.srp-delivery-select-container {
|
||||
border: 1px solid $color-gray4;
|
||||
border-radius: 0;
|
||||
|
||||
.srp-shipping-current-many {
|
||||
&__name {
|
||||
color: #303030;
|
||||
}
|
||||
|
||||
&__sla {
|
||||
color: #7d7d7d;
|
||||
}
|
||||
|
||||
&__price {
|
||||
color: #7d7d7d;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
&__arrow svg {
|
||||
fill: $color-gray4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-totalizers {
|
||||
padding: 0;
|
||||
width: 346px;
|
||||
|
||||
.coupon-data {
|
||||
#cart-link-coupon-add {
|
||||
text-decoration: none;
|
||||
&:hover {
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
span {
|
||||
font-family: $font-family;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-size: 12px;
|
||||
line-height: 14px;
|
||||
color: $color-blue;
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
|
||||
@include mq(md, max) {
|
||||
padding: 0 16px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.coupon-column {
|
||||
.coupon {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.link-coupon-add {
|
||||
color: #303030;
|
||||
font-size: 12px;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.coupon-label label {
|
||||
margin-bottom: 12px;
|
||||
font-family: $font-family;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-size: 12px;
|
||||
line-height: 14px;
|
||||
color: $color-gray2;
|
||||
cursor: none;
|
||||
}
|
||||
|
||||
.coupon-fields {
|
||||
margin-bottom: 32px;
|
||||
|
||||
@include mq(sm, max) {
|
||||
span {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
i {
|
||||
position: absolute;
|
||||
right: 91px;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
input {
|
||||
border: 2px solid $color-gray3;
|
||||
border-radius: 5px;
|
||||
box-shadow: none;
|
||||
color: $color-gray4;
|
||||
font-size: 12px;
|
||||
height: 34px;
|
||||
padding: 0 12px;
|
||||
max-width: 160px;
|
||||
|
||||
@include mq(sm, max) {
|
||||
max-width: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
button {
|
||||
background: $color-black;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
color: $color-white;
|
||||
font-size: 12px;
|
||||
height: 36px;
|
||||
letter-spacing: 1px;
|
||||
margin-left: 6px;
|
||||
outline: none;
|
||||
transition: all 0.2s linear;
|
||||
width: 94px;
|
||||
text-transform: uppercase;
|
||||
|
||||
@include mq(md, max) {
|
||||
width: 138px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: lighten($color-black, 5);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: darken($color-black, 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.accordion-group {
|
||||
tr {
|
||||
border-color: #e5e5e5;
|
||||
|
||||
td {
|
||||
&.empty {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&.info,
|
||||
&.monetary {
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-size: 14px;
|
||||
line-height: 16px;
|
||||
color: $color-black;
|
||||
padding: 12px 0;
|
||||
}
|
||||
|
||||
&.info {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
&.monetary {
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tfoot {
|
||||
td.info,
|
||||
td.monetary {
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-size: 18px;
|
||||
line-height: 21px;
|
||||
color: $color-black;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.cart-links-bottom {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 343px;
|
||||
|
||||
@include mq(md, max) {
|
||||
padding: 0 16px;
|
||||
width: calc(100% - 32px);
|
||||
float: none;
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
|
||||
@include mq(md, min) {
|
||||
margin: 0;
|
||||
padding-bottom: 50px;
|
||||
}
|
||||
|
||||
.link-choose-more-products-wrapper {
|
||||
display: block;
|
||||
text-align: center;
|
||||
margin-bottom: 16px;
|
||||
|
||||
@include mq(md, max) {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
a {
|
||||
font-family: $font-family;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-size: 12px;
|
||||
line-height: 14px;
|
||||
color: $color-blue;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-place-order-wrapper {
|
||||
a {
|
||||
background: $color-green;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
display: block;
|
||||
font-size: 0;
|
||||
transition: ease-in 0.22s all;
|
||||
padding: 12px 19px;
|
||||
|
||||
&:hover {
|
||||
background-color: darken($color-green, 5);
|
||||
}
|
||||
|
||||
&:after {
|
||||
content: "finalizar compra";
|
||||
font-family: $font-family;
|
||||
font-weight: 500;
|
||||
font-size: 13px;
|
||||
letter-spacing: 0.05em;
|
||||
color: $color-white;
|
||||
text-transform: uppercase;
|
||||
vertical-align: middle;
|
||||
line-height: 19px;
|
||||
text-shadow: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
footer {
|
||||
// display: none;
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
body .container-main.container-order-form{
|
||||
padding: 0 16px!important;
|
||||
}
|
38
checkout/src/arquivos/sass/checkout/_checkout-vazio.scss
Normal file
@ -0,0 +1,38 @@
|
||||
.empty-cart {
|
||||
font-family: $font-family;
|
||||
&-content {
|
||||
color: $color-black;
|
||||
text-align: center;
|
||||
|
||||
@include mq(md, max) {
|
||||
padding: 0 16px;
|
||||
}
|
||||
}
|
||||
|
||||
&-title {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
&-links {
|
||||
.link-choose-products {
|
||||
background: $color-black;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
transition: ease-in 0.22s all;
|
||||
outline: none;
|
||||
font-family: $font-family;
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
line-height: 16px;
|
||||
text-align: center;
|
||||
letter-spacing: 0.05em;
|
||||
color: $color-white;
|
||||
text-transform: uppercase;
|
||||
|
||||
&:hover {
|
||||
background: lighten($color-black, 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
122
checkout/src/arquivos/sass/checkout/_checkout.scss
Normal file
@ -0,0 +1,122 @@
|
||||
@import "./checkout-vazio";
|
||||
@import "./checkout-carrinho";
|
||||
@import "./checkout-pagamento";
|
||||
@import "./checkout-autenticacao";
|
||||
|
||||
html {
|
||||
height: 100%;
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
footer {
|
||||
margin-top: auto;
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-height: 100%;
|
||||
padding-top: 0;
|
||||
|
||||
@include mq(md, max) {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
&.body-cart {
|
||||
font-family: $font-family;
|
||||
}
|
||||
|
||||
&.body-cart,
|
||||
&.body-order-form {
|
||||
@include mq(xl, min) {
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
@include mq(lg, max) {
|
||||
padding-bottom: 0 !important;
|
||||
}
|
||||
|
||||
@include mq(md, max) {
|
||||
padding-right: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.container-cart {
|
||||
@include mq(xl, min) {
|
||||
width: 1024px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.btn-success {
|
||||
background: $color-black;
|
||||
text-shadow: none;
|
||||
|
||||
&:hover {
|
||||
background: lighten($color-black, 15%);
|
||||
}
|
||||
}
|
||||
|
||||
.emailInfo h3 {
|
||||
color: $color-black !important;
|
||||
}
|
||||
|
||||
#cart-title,
|
||||
#orderform-title {
|
||||
color: $color-gray2;
|
||||
font-family: $font-family;
|
||||
font-weight: 500;
|
||||
font-size: 36px;
|
||||
line-height: 42px;
|
||||
margin: 40px 0 30px;
|
||||
letter-spacing: 0.1em;
|
||||
text-transform: uppercase;
|
||||
|
||||
@include mq(md, max) {
|
||||
margin-left: 30px;
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown {
|
||||
&__content {
|
||||
&--closed {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
&__title {
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
|
||||
&::before,
|
||||
&::after {
|
||||
content: "";
|
||||
background: $color-gray2;
|
||||
display: block;
|
||||
float: right;
|
||||
height: 2px;
|
||||
width: 8px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
&::before {
|
||||
transform: rotate(0deg);
|
||||
transition: 0.3s;
|
||||
}
|
||||
|
||||
&::after {
|
||||
transform: rotate(90deg);
|
||||
transition: 0.3s;
|
||||
margin-right: -8px;
|
||||
}
|
||||
|
||||
&.closed::before {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
&.closed::after {
|
||||
transform: rotate(0);
|
||||
}
|
||||
}
|
||||
}
|
1
checkout/src/arquivos/sass/partials/_breadcrumb.scss
Normal file
@ -0,0 +1 @@
|
||||
/* _breadcrumb.scss */
|
1
checkout/src/arquivos/sass/partials/_flags.scss
Normal file
@ -0,0 +1 @@
|
||||
/* _flags.scss */
|
178
checkout/src/arquivos/sass/partials/_footer.scss
Normal file
@ -0,0 +1,178 @@
|
||||
/* _footer.scss */
|
||||
.footerCheckout {
|
||||
border-top: none;
|
||||
color: $color-gray2;
|
||||
width: 100%;
|
||||
|
||||
&__wrapper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
&__top {
|
||||
align-items: flex-start;
|
||||
background-color: $color-gray3;
|
||||
display: flex;
|
||||
justify-content: space-evenly;
|
||||
padding: 24px 0;
|
||||
|
||||
@include mq(md, max) {
|
||||
flex-direction: column;
|
||||
padding: 32px 24px;
|
||||
}
|
||||
}
|
||||
|
||||
&__doubts,
|
||||
&__informations {
|
||||
@include mq(md, max) {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
&__content {
|
||||
@include mq(md, max) {
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
}
|
||||
|
||||
&__title,
|
||||
&__subtitle,
|
||||
&__item,
|
||||
&__link {
|
||||
font-size: 12px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
&__title {
|
||||
color: $color-gray2;
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
line-height: 16px;
|
||||
|
||||
@include mq(md, max) {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
}
|
||||
|
||||
&__subtitle {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
&__link a {
|
||||
color: $color-gray2;
|
||||
|
||||
&:hover {
|
||||
color: darken($color-gray2, 10);
|
||||
}
|
||||
}
|
||||
|
||||
&__socialMedia {
|
||||
display: flex;
|
||||
|
||||
.footerCheckout__link {
|
||||
transition: all 0.2s linear;
|
||||
|
||||
&:not(:last-child) {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
opacity: 0.75;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&__bottom {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
background-color: $color-white;
|
||||
justify-content: space-between;
|
||||
padding: 16px 32px;
|
||||
|
||||
@include mq(md, max) {
|
||||
align-items: flex-start;
|
||||
flex-direction: column;
|
||||
padding: 16px;
|
||||
}
|
||||
@media (max-width: 375px) {
|
||||
align-items: flex-start;
|
||||
flex-direction: column;
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
&__wrapper {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
max-width: 62%;
|
||||
width: 100%;
|
||||
|
||||
@include mq(md, max) {
|
||||
max-width: 100%;
|
||||
flex-direction: column-reverse;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&__address {
|
||||
color: $color-gray2;
|
||||
font-family: $font-family;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-size: 10px;
|
||||
line-height: 12px;
|
||||
text-transform: capitalize;
|
||||
max-width: 40%;
|
||||
|
||||
@include mq(md, max) {
|
||||
margin-bottom: 24px;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
&__stamps {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
justify-self: center;
|
||||
|
||||
@include mq(md, max) {
|
||||
align-self: center;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
&__divider {
|
||||
background-color: $color-gray4;
|
||||
display: inline-block;
|
||||
height: 24px;
|
||||
margin: 0 8px;
|
||||
width: 1px;
|
||||
}
|
||||
}
|
||||
|
||||
&__developedBy ul {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
|
||||
li:last-child {
|
||||
margin-left: 16px;
|
||||
}
|
||||
|
||||
a {
|
||||
align-items: center;
|
||||
color: $color-gray2;
|
||||
display: flex;
|
||||
font-family: $font-family;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-size: 10px;
|
||||
line-height: 12px;
|
||||
text-decoration: none;
|
||||
|
||||
span {
|
||||
margin-right: 8px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
38
checkout/src/arquivos/sass/partials/_header.scss
Normal file
@ -0,0 +1,38 @@
|
||||
/* _header.scss */
|
||||
.headerCheckout {
|
||||
&__wrapper {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 12px 0;
|
||||
|
||||
@include mq(md, max) {
|
||||
padding: 18px 8px;
|
||||
}
|
||||
}
|
||||
|
||||
&__logo {
|
||||
img {
|
||||
height: 52px;
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
&__safeBuy {
|
||||
span {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
text-transform: uppercase;
|
||||
font-family: $font-family;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-size: 12px;
|
||||
line-height: 14px;
|
||||
color: $color-gray;
|
||||
}
|
||||
|
||||
i {
|
||||
margin-right: 8px;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
/* _mais-categorias.scss */
|
1
checkout/src/arquivos/sass/partials/_menu.scss
Normal file
@ -0,0 +1 @@
|
||||
/* _menu.scss */
|
1
checkout/src/arquivos/sass/partials/_prateleira.scss
Normal file
@ -0,0 +1 @@
|
||||
/* _prateleira.scss */
|
57
checkout/src/arquivos/sass/utils/_animacao.scss
Normal file
@ -0,0 +1,57 @@
|
||||
|
||||
|
||||
@keyframes notificacao{
|
||||
0% {
|
||||
transform:rotate(0deg);
|
||||
}
|
||||
50% {
|
||||
transform:rotate(3deg) translateX(-3px);
|
||||
}
|
||||
100% {
|
||||
transform:rotate(-3deg) translateX(3px);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@keyframes addcart{
|
||||
0% {
|
||||
margin-left:0px;
|
||||
}
|
||||
50% {
|
||||
margin-left:-2px;
|
||||
}
|
||||
100% {
|
||||
margin-left:2px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@keyframes spin {
|
||||
from { transform:rotate(0deg); }
|
||||
to { transform:rotate(360deg); }
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
from { opacity:0; }
|
||||
to { opacity:1; }
|
||||
}
|
||||
|
||||
@keyframes sk-scaleout {
|
||||
0% { transform: scale(0) }
|
||||
100% {
|
||||
transform: scale(1.0);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes cascadeInSimple {
|
||||
0% {
|
||||
opacity:0;
|
||||
transform: translateX(-100%)
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity:1;
|
||||
transform: translateX(0)
|
||||
}
|
||||
}
|
222
checkout/src/arquivos/sass/utils/_mixin.scss
Normal file
@ -0,0 +1,222 @@
|
||||
/**
|
||||
* @reference (https://github.com/engageinteractive/core/blob/master/src/scss/utility/_mixins.scss)
|
||||
*/
|
||||
@mixin push--auto {
|
||||
margin: {
|
||||
left: auto;
|
||||
right: auto;
|
||||
}
|
||||
}
|
||||
@mixin pseudo($display: block, $pos: absolute, $content: ''){
|
||||
content: $content;
|
||||
display: $display;
|
||||
position: $pos;
|
||||
}
|
||||
|
||||
|
||||
@mixin position($top: false,$right: false, $bottom:false, $left: false){
|
||||
@if( $top ){
|
||||
top:$top;
|
||||
}
|
||||
@if( $right ){
|
||||
right:$right;
|
||||
}
|
||||
@if( $left ){
|
||||
left:$left;
|
||||
}
|
||||
@if( $bottom ){
|
||||
bottom:$bottom;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin responsive-ratio($x,$y, $pseudo: false) {
|
||||
$padding: unquote( ( $y / $x ) * 100 + '%' );
|
||||
@if $pseudo {
|
||||
&:before {
|
||||
@include pseudo($pos: relative);
|
||||
width: 100%;
|
||||
padding-top: $padding;
|
||||
}
|
||||
} @else {
|
||||
padding-top: $padding;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin css-triangle($color, $direction, $size: 6px, $position: absolute, $round: false){
|
||||
@include pseudo($pos: $position);
|
||||
width: 0;
|
||||
height: 0;
|
||||
@if $round {
|
||||
border-radius: 3px;
|
||||
}
|
||||
@if $direction == down {
|
||||
border-left: $size solid transparent;
|
||||
border-right: $size solid transparent;
|
||||
border-top: $size solid $color;
|
||||
margin-top: 0 - round( $size / 2.5 );
|
||||
} @else if $direction == up {
|
||||
border-left: $size solid transparent;
|
||||
border-right: $size solid transparent;
|
||||
border-bottom: $size solid $color;
|
||||
margin-bottom: 0 - round( $size / 2.5 );
|
||||
} @else if $direction == right {
|
||||
border-top: $size solid transparent;
|
||||
border-bottom: $size solid transparent;
|
||||
border-left: $size solid $color;
|
||||
margin-right: -$size;
|
||||
} @else if $direction == left {
|
||||
border-top: $size solid transparent;
|
||||
border-bottom: $size solid transparent;
|
||||
border-right: $size solid $color;
|
||||
margin-left: -$size;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin input-placeholder {
|
||||
&.placeholder { @content; }
|
||||
&:-moz-placeholder { @content; }
|
||||
&::-moz-placeholder { @content; }
|
||||
&:-ms-input-placeholder { @content; }
|
||||
&::-webkit-input-placeholder { @content; }
|
||||
}
|
||||
|
||||
@mixin hardware($backface: true, $perspective: 1000) {
|
||||
@if $backface {
|
||||
backface-visibility: hidden;
|
||||
}
|
||||
perspective: $perspective;
|
||||
}
|
||||
|
||||
@mixin truncate($truncation-boundary) {
|
||||
max-width: $truncation-boundary;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
@mixin appearance($val: none) {
|
||||
-webkit-appearance: $val;
|
||||
-moz-appearance: $val;
|
||||
appearance: $val;
|
||||
}
|
||||
|
||||
|
||||
@mixin separador($cor,$p-right: 5px) {
|
||||
position: relative;
|
||||
padding-right: $p-right;
|
||||
display: inline-block;
|
||||
&:after{
|
||||
content:' ';
|
||||
display: block;
|
||||
width: 1px;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: 0;
|
||||
transform: translateY(-50%);
|
||||
background-color: $cor;
|
||||
}
|
||||
&:last-child:after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin mq($width, $type: min) {
|
||||
@if map_has_key($grid-breakpoints, $width) {
|
||||
$width: map_get($grid-breakpoints, $width);
|
||||
@if $type == max {
|
||||
$width: $width - 1px;
|
||||
}
|
||||
@media only screen and (#{$type}-width: $width) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@mixin mq_range($min, $max) {
|
||||
@if (map_has_key($grid-breakpoints, $min) and map_has_key($grid-breakpoints, $max)) {
|
||||
|
||||
$width_max: map_get($grid-breakpoints, $max);
|
||||
$width_min: map_get($grid-breakpoints, $min);
|
||||
$width_max: $width_max - 1px;
|
||||
@media only screen and (min-width: $width_min) and (max-width:$width_max) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@mixin z-index($nome:'',$soma:0){
|
||||
@if map_has_key($z-index, $nome) {
|
||||
z-index: (map_get($z-index,$nome )+$soma) ;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin scrollbar($width:8px,$bg-color:#eee, $trak-color:#aaa,$trak-color-hover:#999,$border-radius:0 ){
|
||||
&::-webkit-scrollbar {
|
||||
width: $width;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar-track {
|
||||
background-color: $bg-color;
|
||||
border-radius: $border-radius;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background-color: $trak-color;
|
||||
border-radius: $border-radius;
|
||||
&:hover {
|
||||
background: $trak-color-hover;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@function map-get-next($map, $key, $fallback: false, $return: value) {
|
||||
|
||||
// Check if map is valid
|
||||
@if type-of($map) == map {
|
||||
|
||||
// Check if key exists in map
|
||||
@if map-has-key($map, $key) {
|
||||
|
||||
// Init index counter variable
|
||||
$i: 0;
|
||||
|
||||
// Init key index
|
||||
$key-index: false;
|
||||
|
||||
// Traverse map for key
|
||||
@each $map-key, $map-value in $map {
|
||||
// Update index
|
||||
$i: $i + 1;
|
||||
|
||||
// If map key found, set key index
|
||||
@if $map-key == $key {
|
||||
$key-index: $i;
|
||||
}
|
||||
|
||||
// If next index return next value or key based on $return
|
||||
@if $i == $key-index + 1 {
|
||||
@if $return == key {
|
||||
@return $map-key;
|
||||
} @else {
|
||||
@return $map-value;
|
||||
}
|
||||
}
|
||||
|
||||
// If last entry return false
|
||||
@if $i == length($map) {
|
||||
@return $fallback;
|
||||
}
|
||||
}
|
||||
|
||||
@warn 'No next map item for key #{$key}';
|
||||
@return $fallback;
|
||||
}
|
||||
|
||||
@warn 'No valid key #{$key} in map';
|
||||
@return $fallback;
|
||||
}
|
||||
|
||||
@warn 'No valid map';
|
||||
@return $fallback;
|
||||
}
|
91
checkout/src/arquivos/sass/utils/_responsive-visibility.scss
Normal file
@ -0,0 +1,91 @@
|
||||
// Mixins de definição
|
||||
@mixin visibility($parent, $display:block) {
|
||||
@if $display==none {
|
||||
$display: block;
|
||||
}
|
||||
#{$parent} {
|
||||
display: $display !important;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin visibility-table($parent) {
|
||||
table#{$parent} {
|
||||
display: table !important;
|
||||
}
|
||||
tr#{$parent} {
|
||||
display: table-row !important;
|
||||
}
|
||||
th#{$parent},
|
||||
td#{$parent} {
|
||||
display: table-cell !important;
|
||||
}
|
||||
}
|
||||
|
||||
// [converter] $parent hack
|
||||
@mixin invisibility($parent) {
|
||||
#{$parent} {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@each $slug,$width in $grid-breakpoints {
|
||||
$class: unquote('.visible-'+$slug);
|
||||
$classOnly: unquote('.visible-only-'+$slug);
|
||||
@include invisibility($class);
|
||||
@include invisibility($classOnly);
|
||||
}
|
||||
|
||||
@each $slug,$width in $grid-breakpoints {
|
||||
$class: unquote('.visible-'+$slug);
|
||||
$value: map-get-next($grid-breakpoints,$slug);
|
||||
$media: '(max-width: '+ (($value)-1) +')';
|
||||
@if($value == false){
|
||||
$media: '(min-width: '+ $width +')';
|
||||
}
|
||||
@media only screen and #{$media} {
|
||||
@include visibility($class);
|
||||
@include visibility($class+'-inline-block',inline-block);
|
||||
@include visibility($class+'-inline',inline);
|
||||
@include visibility-table($class);
|
||||
}
|
||||
}
|
||||
|
||||
@each $slug,$width in $grid-breakpoints {
|
||||
$class: unquote('.visible-only-'+$slug);
|
||||
$value: map-get-next($grid-breakpoints,$slug);
|
||||
$media: '(min-width: '+ $width +') and (max-width: '+ $value +')';
|
||||
@if($value == false){
|
||||
$media: '(min-width: '+ (($width)+1) +')';
|
||||
}
|
||||
@media only screen and #{$media} {
|
||||
@include visibility($class);
|
||||
@include visibility($class+'-inline-block',inline-block);
|
||||
@include visibility($class+'-inline',inline);
|
||||
@include visibility-table($class);
|
||||
}
|
||||
}
|
||||
|
||||
@each $slug,$width in $grid-breakpoints {
|
||||
$class: unquote('.invisible-'+$slug);
|
||||
$value: map-get-next($grid-breakpoints,$slug);
|
||||
$media: '(max-width: '+ (($value)-1) +')';
|
||||
@if($value == false){
|
||||
$media: '(min-width: '+ $width +')';
|
||||
}
|
||||
@media only screen and #{$media} {
|
||||
@include invisibility($class);
|
||||
}
|
||||
}
|
||||
|
||||
@each $slug,$width in $grid-breakpoints {
|
||||
$class: unquote('.invisible-only-'+$slug);
|
||||
$value: map-get-next($grid-breakpoints,$slug);
|
||||
$media: '(min-width: '+ $width +') and (max-width: '+ $value +')';
|
||||
@if($value == false){
|
||||
$media: '(min-width: '+$width +')';
|
||||
}
|
||||
@media only screen and #{$media} {
|
||||
@include invisibility($class);
|
||||
}
|
||||
}
|
36
checkout/src/arquivos/sass/utils/_variaveis.scss
Normal file
@ -0,0 +1,36 @@
|
||||
/* fonts */
|
||||
@import url("https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap");
|
||||
$font-family: "Roboto", sans-serif;
|
||||
|
||||
/* Colors */
|
||||
$color-black: #292929;
|
||||
|
||||
$color-white: #fff;
|
||||
|
||||
$color-gray: #6c6c6c;
|
||||
$color-gray2: #7d7d7d;
|
||||
$color-gray3: #f0f0f0;
|
||||
$color-gray4: #8d8d8d;
|
||||
$color-gray5: #e5e5e5;
|
||||
|
||||
$color-blue: #4267b2;
|
||||
|
||||
$color-green: #4caf50;
|
||||
|
||||
/* Grid breakpoints */
|
||||
$grid-breakpoints: (
|
||||
xs: 0,
|
||||
cstm: 400,
|
||||
sm: 576px,
|
||||
md: 768px,
|
||||
lg: 992px,
|
||||
xl: 1200px
|
||||
) !default;
|
||||
|
||||
$z-index: (
|
||||
level1: 5,
|
||||
level2: 10,
|
||||
level3: 15,
|
||||
level4: 20,
|
||||
level5: 25
|
||||
) !default;
|
5
checkout/src/arquivos/sass/utils/all.scss
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
@import "variaveis";
|
||||
@import "mixin";
|
||||
@import "utils";
|
||||
@import "animacao";
|
49
checkout/src/arquivos/sass/utils/utils.scss
Normal file
@ -0,0 +1,49 @@
|
||||
.sprite{
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.no-buttom {
|
||||
border: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: auto;
|
||||
overflow: visible;
|
||||
|
||||
background: transparent;
|
||||
outline: none;
|
||||
text-align: inherit;
|
||||
|
||||
/* inherit font & color from ancestor */
|
||||
color: inherit;
|
||||
font: inherit;
|
||||
|
||||
/* Normalize `line-height`. Cannot be changed from `normal` in Firefox 4+. */
|
||||
line-height: normal;
|
||||
|
||||
/* Corrects font smoothing for webkit */
|
||||
-webkit-font-smoothing: inherit;
|
||||
-moz-osx-font-smoothing: inherit;
|
||||
|
||||
/* Corrects inability to style clickable `input` types in iOS */
|
||||
appearance: none;
|
||||
|
||||
&::-moz-focus-inner {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.itens-inline{
|
||||
>*{ display: inline-block;}
|
||||
}
|
||||
|
||||
%notificacao{
|
||||
|
||||
padding: 7.5px 10px ;
|
||||
min-height: 1em;
|
||||
border-radius: 3px;
|
||||
border-right: solid 5px;
|
||||
display: block;
|
||||
}
|
116
checkout/src/template-checkout/checkout-footer.html
Normal file
@ -0,0 +1,116 @@
|
||||
<footer>
|
||||
<div class="footerCheckout">
|
||||
<div class="footerCheckout__top">
|
||||
<div class="footerCheckout__doubts">
|
||||
<div class="footerCheckout__title">
|
||||
Dúvidas
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__content">
|
||||
<div class="footerCheckout__link">
|
||||
<a href="/sobre">Sobre</a>
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__link">
|
||||
<a href="/pagamento">Formas de Pagamento</a>
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__link">
|
||||
<a href="/entrega">Entrega</a>
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__link">
|
||||
<a href="/troca-e-devolucao">Trocas e Devoluções</a>
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__link">
|
||||
<a href="/privacidade">Segurança e Privacidade</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="footerCheckout__informations">
|
||||
<div class="footerCheckout__title">
|
||||
Fale Conosco
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__content">
|
||||
<div class="footerCheckout__link">
|
||||
<a href="mailto:sac@sualoja.com.br">sac@sualoja.com.br</a>
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__item">
|
||||
Sac: (00) 0000-0000
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__subtitle">
|
||||
Funcionamento:
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__item">
|
||||
Segunda à Sexta - 08h às 18h.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__socialMedia">
|
||||
<div class="footerCheckout__link">
|
||||
<a href="https://www.facebook.com/digitalm3">
|
||||
@TODO: fb icon
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__link">
|
||||
<a href="https://www.instagram.com/agenciam3/">
|
||||
@TODO: instagram ico
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__link">
|
||||
<a href="https://twitter.com/twitter">
|
||||
@TODO: twitter icon
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__link">
|
||||
<a href="https://www.youtube.com/">
|
||||
@TODO: youtube icon
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__bottom">
|
||||
<div class="footerCheckout__bottom__wrapper">
|
||||
<div class="footerCheckout__address">
|
||||
<span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__stamps">
|
||||
@TODO: creditcard icons
|
||||
<span class="footerCheckout__stamps__divider"></span>
|
||||
@TODO: vtex pci icon
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footerCheckout__developedBy">
|
||||
<ul>
|
||||
<li>
|
||||
<a href="https://vtex.com/br-pt/">
|
||||
<span>Powered By</span>
|
||||
@TODO: vtex icon
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="https://agenciam3.com/">
|
||||
<span>Developed By</span>
|
||||
@TODO: m3 icon
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
15
checkout/src/template-checkout/checkout-header.html
Normal file
@ -0,0 +1,15 @@
|
||||
<header class="headerCheckout">
|
||||
<div class="container">
|
||||
<div class="headerCheckout__wrapper" >
|
||||
<div class="headerCheckout__logo">
|
||||
<a href="/">
|
||||
<img src="/arquivos/logo-checkout.png" alt="agenciam3"/>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="headerCheckout__safeBuy">
|
||||
<span><Compra segura</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
30
checkout/webpack.common.js
Normal file
@ -0,0 +1,30 @@
|
||||
const webpack = require("webpack");
|
||||
const path = require("path");
|
||||
var shopName = require("../package.json").name;
|
||||
/**
|
||||
* Configuração do webpack
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
entry: {
|
||||
checkout: "./src/arquivos/js/checkout.js",
|
||||
},
|
||||
output: {
|
||||
path: path.resolve(__dirname, "./dist/arquivos"),
|
||||
filename: shopName + "--[name]-bundle.js",
|
||||
},
|
||||
resolve: {
|
||||
alias: {
|
||||
Helpers: path.resolve(__dirname, "..", "src/arquivos/js/helpers"),
|
||||
Lib: path.resolve(__dirname, "..", "src/arquivos/js/lib"),
|
||||
Config: path.resolve(__dirname, "..", "src/arquivos/js/config"),
|
||||
App: path.resolve(__dirname, "..", "src/arquivos/js/app"),
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
new webpack.ProvidePlugin({
|
||||
$: "jquery",
|
||||
jQuery: "jquery",
|
||||
}),
|
||||
],
|
||||
};
|
30
checkout/webpack.dev.js
Normal file
@ -0,0 +1,30 @@
|
||||
const webpack = require("webpack");
|
||||
const { merge } = require("webpack-merge");
|
||||
const common = require("./webpack.common.js");
|
||||
const path = require("path");
|
||||
|
||||
module.exports = merge(common, {
|
||||
devtool: "inline-source-map",
|
||||
mode: "development",
|
||||
externals: {
|
||||
vtexjs: "vtexjs",
|
||||
jquery: "jQuery",
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.(js|jsx)$/,
|
||||
exclude: /(node_modules|bower_components)/,
|
||||
include: path.resolve(__dirname, "..", "src/arquivos/js"),
|
||||
use: {
|
||||
loader: "babel-loader",
|
||||
options: {
|
||||
presets: [["@babel/preset-env"], "@babel/react"],
|
||||
plugins: ["@babel/plugin-transform-async-to-generator"],
|
||||
cacheDirectory: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
47
checkout/webpack.prod.js
Normal file
@ -0,0 +1,47 @@
|
||||
const { merge } = require("webpack-merge");
|
||||
const common = require("./webpack.common.js");
|
||||
const TerserPlugin = require("terser-webpack-plugin");
|
||||
|
||||
module.exports = merge(common, {
|
||||
externals: {
|
||||
jquery: "jQuery",
|
||||
vtexjs: "vtexjs",
|
||||
},
|
||||
mode: "production",
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.(js|jsx)$/,
|
||||
exclude: /node_modules\/(?!(@agenciam3\/pkg)\/).*/,
|
||||
use: {
|
||||
loader: "babel-loader",
|
||||
options: {
|
||||
presets: [["@babel/preset-env"], "@babel/react"],
|
||||
plugins: ["@babel/plugin-transform-async-to-generator"],
|
||||
cacheDirectory: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
optimization: {
|
||||
usedExports: true,
|
||||
minimize: true,
|
||||
minimizer: [
|
||||
new TerserPlugin({
|
||||
extractComments: true,
|
||||
terserOptions: {
|
||||
keep_classnames: true,
|
||||
keep_fnames: true,
|
||||
compress: {
|
||||
pure_funcs: [
|
||||
"console.table",
|
||||
"console.debug",
|
||||
"console.log",
|
||||
],
|
||||
},
|
||||
},
|
||||
}),
|
||||
],
|
||||
},
|
||||
});
|
4
commitlint.config.js
Normal file
@ -0,0 +1,4 @@
|
||||
module.exports = {
|
||||
extends: ["@commitlint/config-conventional"],
|
||||
ignores: [(message) => message.includes("Release")],
|
||||
};
|
3
custom/.eslintignore
Normal file
@ -0,0 +1,3 @@
|
||||
node_modules/
|
||||
coverage/
|
||||
*.snap.ts
|
35
custom/.eslintrc.js
Normal file
@ -0,0 +1,35 @@
|
||||
module.exports = {
|
||||
env: {
|
||||
browser: true,
|
||||
es2021: true,
|
||||
node: true,
|
||||
},
|
||||
extends: [
|
||||
"eslint:recommended",
|
||||
"plugin:react/recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
],
|
||||
settings: {
|
||||
react: {
|
||||
pragma: "React",
|
||||
version: "detect",
|
||||
},
|
||||
},
|
||||
parser: "@typescript-eslint/parser",
|
||||
parserOptions: {
|
||||
ecmaFeatures: {
|
||||
jsx: true,
|
||||
},
|
||||
ecmaVersion: 12,
|
||||
sourceType: "module",
|
||||
},
|
||||
plugins: ["react", "@typescript-eslint"],
|
||||
rules: {
|
||||
indent: ["error", 4],
|
||||
"linebreak-style": ["error", "unix"],
|
||||
quotes: ["error", "double"],
|
||||
semi: ["error", "always"],
|
||||
"@typescript-eslint/no-explicit-any": "off",
|
||||
"@typescript-eslint/explicit-module-boundary-types": "off",
|
||||
},
|
||||
};
|
6
custom/.vtexignore
Normal file
@ -0,0 +1,6 @@
|
||||
react/**/__tests__/**
|
||||
react/**/__mocks__/**
|
||||
react/**/__snapshots__/**
|
||||
react/**/*.test.js
|
||||
react/**/*.test.ts
|
||||
react/**/*.test.tsx
|
0
custom/CHANGELOG.md
Normal file
9
custom/README.md
Normal file
@ -0,0 +1,9 @@
|
||||
# M3 Custom Template
|
||||
|
||||
**Esse projeto possui a pasta <span style="color:red;">node</span>, delete ela para componentes simples.**
|
||||
|
||||
## Uso no store fronte
|
||||
|
||||
Documentar aqui um exemplo de implementação
|
||||
|
||||
|
22
custom/manifest.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"vendor": "agenciamagma",
|
||||
"name": "m3-custom",
|
||||
"version": "0.1.6",
|
||||
"title": "m3-custom",
|
||||
"description": "m3-custom component",
|
||||
"defaultLocale": "pt-BR",
|
||||
"builders": {
|
||||
"messages": "1.x",
|
||||
"store": "0.x",
|
||||
"react": "3.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"vtex.styleguide": "9.x",
|
||||
"vtex.css-handles": "0.x",
|
||||
"vtex.native-types": "0.x",
|
||||
"vtex.store-graphql": "2.x",
|
||||
"vtex.search-graphql": "0.x",
|
||||
"vtex.checkout-graphql": "0.x"
|
||||
},
|
||||
"$schema": "https://raw.githubusercontent.com/vtex/node-vtex-api/master/gen/manifest.schema"
|
||||
}
|
4
custom/messages/context.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"editor.countdown.title": "Countdown",
|
||||
"editor.countdown.description": "Countdown component"
|
||||
}
|
4
custom/messages/en.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"editor.countdown.title": "Countdown",
|
||||
"editor.countdown.description": "Countdown component"
|
||||
}
|
4
custom/messages/es.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"editor.countdown.title": "Cuenta regresiva",
|
||||
"editor.countdown.description": "Cuenta regresiva component"
|
||||
}
|
4
custom/messages/pt.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"editor.countdown.title": "Contagem regressiva",
|
||||
"editor.countdown.description": "Componente de contagem regressiva"
|
||||
}
|
27
custom/package.json
Normal file
@ -0,0 +1,27 @@
|
||||
{
|
||||
"name": "custom",
|
||||
"license": "UNLICENSED",
|
||||
"version": "1.0.0",
|
||||
"scripts": {
|
||||
"lint": "eslint --ext js,jsx,ts,tsx . --fix",
|
||||
"format": "prettier --write \"**/*.{ts,js,json}\"",
|
||||
"install:all": "concurrently \"cd react && yarn install\""
|
||||
},
|
||||
"devDependencies": {
|
||||
"@typescript-eslint/eslint-plugin": "^4.18.0",
|
||||
"@typescript-eslint/parser": "^4.18.0",
|
||||
"@vtex/prettier-config": "0.1.4",
|
||||
"eslint": "7.12.1",
|
||||
"eslint-config-vtex": "12.3.2",
|
||||
"eslint-config-vtex-react": "^6.2.1",
|
||||
"eslint-plugin-react": "^7.23.1",
|
||||
"husky": "^5.2.0",
|
||||
"lint-staged": "10.1.1",
|
||||
"prettier": "2.0.2",
|
||||
"typescript": "3.8.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"husky": "^5.2.0",
|
||||
"react": "^17.0.2"
|
||||
}
|
||||
}
|
6
custom/react/.prettierrc.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"tabWidth": 4,
|
||||
"useTabs": false
|
||||
}
|
3
custom/react/B2bForm.tsx
Normal file
@ -0,0 +1,3 @@
|
||||
import { B2bForm } from "./components/B2bForm/B2bForm";
|
||||
|
||||
export default B2bForm;
|
3
custom/react/DynamicMenu.tsx
Normal file
@ -0,0 +1,3 @@
|
||||
import { DynamicMenu } from "./components/Menu/DynamicMenu";
|
||||
|
||||
export default DynamicMenu;
|
3
custom/react/Exemple.tsx
Normal file
@ -0,0 +1,3 @@
|
||||
import { Exemple } from "./components/Exemple/Exemple";
|
||||
|
||||
export default Exemple;
|
32
custom/react/ResponsiveRender.tsx
Normal file
@ -0,0 +1,32 @@
|
||||
import ResponsiveRender from "./components/UI/ResponsiveRender/ResponsiveRender";
|
||||
export default ResponsiveRender;
|
||||
|
||||
|
||||
/*
|
||||
props: {
|
||||
type: "min" | "max", "range"
|
||||
width: "phone" | "tablet" | "desktop" | number(in pixels)
|
||||
},
|
||||
children: []
|
||||
|
||||
|
||||
--- Storefront Exemples ---
|
||||
|
||||
"m3-responsive-render#titulo-desktop": {
|
||||
"props": {
|
||||
"type": "min",
|
||||
"width": "desktop"
|
||||
},
|
||||
"children":["rich-text#titulo"]
|
||||
}
|
||||
|
||||
- Range -
|
||||
"m3-responsive-render#titulo-desktop": {
|
||||
"props": {
|
||||
"type": "range",
|
||||
"width": "tablet, desktop"
|
||||
},
|
||||
"children":["rich-text#titulo-tablet"]
|
||||
}
|
||||
|
||||
*/
|
6
custom/react/components/B2bForm/B2bForm.css
Normal file
@ -0,0 +1,6 @@
|
||||
.container {
|
||||
margin: 0 auto;
|
||||
max-width: 900px;
|
||||
padding: 16px;
|
||||
}
|
||||
|
83
custom/react/components/B2bForm/B2bForm.tsx
Normal file
@ -0,0 +1,83 @@
|
||||
import React, { useState } from "react";
|
||||
import { Formik, FormikHelpers } from "formik";
|
||||
|
||||
import styles from "./B2bForm.css";
|
||||
import { registerSchema } from "./B2bFormRegisterSchema";
|
||||
import saveData from "./B2bFormSaveData";
|
||||
import FormStep from "./steps/FormStep";
|
||||
import SuccessStep from "./steps/SuccessStep";
|
||||
import ErrorStep from "./steps/ErrorStep";
|
||||
|
||||
export interface FormFields {
|
||||
corporateDocument: string;
|
||||
document: string;
|
||||
postalCode: string;
|
||||
street: string;
|
||||
complement: string;
|
||||
number: string;
|
||||
neighborhood: string;
|
||||
city: string;
|
||||
state: string;
|
||||
corporateName: string;
|
||||
stateRegistration: string;
|
||||
tradeName: string;
|
||||
businessPhone: string;
|
||||
phone: string;
|
||||
firstName: string;
|
||||
lastName: string;
|
||||
email: string;
|
||||
}
|
||||
|
||||
const initialValues: FormFields = {
|
||||
corporateDocument: "",
|
||||
document: "",
|
||||
postalCode: "",
|
||||
street: "",
|
||||
complement: "",
|
||||
number: "",
|
||||
neighborhood: "",
|
||||
city: "",
|
||||
state: "",
|
||||
corporateName: "",
|
||||
stateRegistration: "",
|
||||
tradeName: "",
|
||||
businessPhone: "",
|
||||
phone: "",
|
||||
firstName: "",
|
||||
lastName: "",
|
||||
email: "",
|
||||
};
|
||||
|
||||
|
||||
export const B2bForm: StorefrontFunctionComponent = () => {
|
||||
const [step, setStep] = useState<"form" | "success" | "error">("form");
|
||||
|
||||
const onSubmit = async (values: FormFields, { setSubmitting }: FormikHelpers<FormFields>) => {
|
||||
try {
|
||||
await saveData(values);
|
||||
setSubmitting(false);
|
||||
setStep("success");
|
||||
} catch (error) {
|
||||
setSubmitting(false);
|
||||
setStep("error");
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className={styles.container}>
|
||||
<Formik
|
||||
initialValues={initialValues}
|
||||
validationSchema={registerSchema}
|
||||
onSubmit={onSubmit}
|
||||
>
|
||||
{() => (
|
||||
<>
|
||||
{step === "form" && (<FormStep></FormStep>)}
|
||||
{step === "success" && (<SuccessStep></SuccessStep>)}
|
||||
{step === "error" && (<ErrorStep></ErrorStep>)}
|
||||
</>
|
||||
)}
|
||||
</Formik>
|
||||
</div >
|
||||
);
|
||||
};
|