From 9b28c248257a79511714e942b9bc5eb68918f381 Mon Sep 17 00:00:00 2001 From: Sam Nabi Date: Tue, 28 Nov 2017 16:24:10 -0500 Subject: [PATCH] Remove confirm page; order details form on Cart page; simplify gateway snippets; reusable transaction summary snippet --- .gitignore | 1 - content/1-shop/confirm/confirm.en.txt | 5 - content/site.en.txt | 6 +- .../assets/css/shopkit.00a8e6.0077dd.css | 138 +++--- site/plugins/shopkit/assets/css/shopkit.css | 2 + .../shopkit/assets/css/shopkit.css.map | 2 +- site/plugins/shopkit/assets/css/shopkit.scss | 6 + site/plugins/shopkit/assets/js/cart.js | 2 +- .../shopkit/assets/js/expand-collapse-min.js | 1 - site/plugins/shopkit/blueprints/confirm.yml | 10 - site/plugins/shopkit/blueprints/order.yml | 5 + site/plugins/shopkit/controllers/cart.php | 37 +- site/plugins/shopkit/controllers/confirm.php | 96 ----- site/plugins/shopkit/controllers/orders.php | 3 + site/plugins/shopkit/controllers/process.php | 65 ++- .../shopkit/gateways/paylater/callback.php | 29 +- .../shopkit/gateways/paylater/process.php | 52 +-- .../gateways/paypalexpress/process.php | 103 ++--- .../shopkit/gateways/square/callback.php | 4 +- .../shopkit/gateways/square/process.php | 394 +++++++++--------- .../gateways/stripecheckout/callback.php | 4 +- .../gateways/stripecheckout/process.php | 78 +--- site/plugins/shopkit/languages/de.php | 2 + site/plugins/shopkit/languages/en.php | 2 + site/plugins/shopkit/languages/es.php | 2 + site/plugins/shopkit/languages/fr.php | 3 + site/plugins/shopkit/registry/blueprints.php | 1 - site/plugins/shopkit/registry/controllers.php | 1 - site/plugins/shopkit/registry/snippets.php | 1 + site/plugins/shopkit/registry/templates.php | 1 - site/plugins/shopkit/shopkit.php | 24 +- .../shopkit/snippets/order.details.php | 110 +++++ site/plugins/shopkit/snippets/order.pdf.php | 80 ++-- site/plugins/shopkit/templates/cart.php | 73 +++- site/plugins/shopkit/templates/confirm.php | 60 --- site/plugins/shopkit/templates/process.php | 16 +- 36 files changed, 681 insertions(+), 738 deletions(-) delete mode 100644 content/1-shop/confirm/confirm.en.txt delete mode 100644 site/plugins/shopkit/assets/js/expand-collapse-min.js delete mode 100755 site/plugins/shopkit/blueprints/confirm.yml delete mode 100644 site/plugins/shopkit/controllers/confirm.php create mode 100644 site/plugins/shopkit/snippets/order.details.php delete mode 100644 site/plugins/shopkit/templates/confirm.php diff --git a/.gitignore b/.gitignore index ed6b882..270e407 100755 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,6 @@ # Ignore non-default content files /content/1-shop/* !/content/1-shop/cart -!/content/1-shop/confirm !/content/1-shop/countries !/content/1-shop/terms-conditions /content/1-shop/orders/* diff --git a/content/1-shop/confirm/confirm.en.txt b/content/1-shop/confirm/confirm.en.txt deleted file mode 100644 index 3e26e98..0000000 --- a/content/1-shop/confirm/confirm.en.txt +++ /dev/null @@ -1,5 +0,0 @@ -Title: Confirm order details - ----- - -Text: Please enter your email and mailing address so we can get in touch with you. \ No newline at end of file diff --git a/content/site.en.txt b/content/site.en.txt index 17abfce..6520000 100755 --- a/content/site.en.txt +++ b/content/site.en.txt @@ -190,4 +190,8 @@ Square-token-live: ---- -Square-location: \ No newline at end of file +Square-location: + +---- + +Tax-included: 0 \ No newline at end of file diff --git a/site/plugins/shopkit/assets/css/shopkit.00a8e6.0077dd.css b/site/plugins/shopkit/assets/css/shopkit.00a8e6.0077dd.css index 7f53a02..c0d0d54 100644 --- a/site/plugins/shopkit/assets/css/shopkit.00a8e6.0077dd.css +++ b/site/plugins/shopkit/assets/css/shopkit.00a8e6.0077dd.css @@ -5,7 +5,7 @@ audio, canvas, progress, video { display: inline-block; } progress, sub, sup { vertical-align: baseline; } -[type=checkbox], [type=radio], legend { box-sizing: border-box; padding: 0; } +[type=checkbox], [type=radio], legend { -webkit-box-sizing: border-box; box-sizing: border-box; padding: 0; } html { font-family: sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; } @@ -17,7 +17,7 @@ h1 { font-size: 2em; margin: .67em 0; } figure { margin: 1em 40px; } -hr { box-sizing: content-box; height: 0; } +hr { -webkit-box-sizing: content-box; box-sizing: content-box; height: 0; } code, kbd, pre, samp { font-family: monospace,monospace; font-size: 1em; } @@ -25,7 +25,7 @@ a { background-color: transparent; -webkit-text-decoration-skip: objects; } a:active, a:hover { outline-width: 0; } -abbr[title] { border-bottom: none; text-decoration: underline; text-decoration: underline dotted; } +abbr[title] { border-bottom: none; text-decoration: underline; -webkit-text-decoration: underline dotted; text-decoration: underline dotted; } b, strong { font-weight: bolder; } @@ -45,7 +45,7 @@ audio:not([controls]) { display: none; height: 0; } img { border-style: none; } -svg:not(:root) { overflow: hidden; } +svg:not(html) { overflow: hidden; } button, input, optgroup, select, textarea { font-family: sans-serif; font-size: 100%; margin: 0; } @@ -76,11 +76,11 @@ summary { display: list-item; } [hidden], template { display: none; } /** Global settings */ -html { height: 100%; box-sizing: border-box; } +html { height: 100%; -webkit-box-sizing: border-box; box-sizing: border-box; } body { min-height: 100%; background-position: center top; background-attachment: fixed; background-repeat: repeat-y; background-size: 100% auto; /* Fallback */ background-size: cover; } -*, *:before, *:after { box-sizing: inherit; } +*, *:before, *:after { -webkit-box-sizing: inherit; box-sizing: inherit; } * + * { margin-top: 1em; } @@ -93,16 +93,16 @@ body, br, th, td, option { margin-top: 0; } /** Layout */ .wrapper { position: relative; background-color: rgba(255, 255, 255, 0.9); overflow: hidden; padding: 0.5em 0.5em 5em; } -.wrapper::before { content: ''; position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: -1; background-position: center top; background-attachment: fixed; background-repeat: repeat-y; background-size: 100% auto; /* Fallback */ background-size: cover; } +.wrapper:before { content: ''; position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: -1; background-position: center top; background-attachment: fixed; background-repeat: repeat-y; background-size: 100% auto; /* Fallback */ background-size: cover; } @media (min-width: 45em) { .wrapper { padding: 1em 1em 5em; } } .wrapper-main { width: 100%; padding: 1em; position: relative; } .wrapper-main main { border-bottom: 2px solid #0BA2DA; padding-bottom: 2em; } -@media (min-width: 45em) { .wrapper { display: flex; align-items: flex-start; } - .sidebar { order: 1; width: 15em; flex-shrink: 0; margin: 0 1em 0 0; } - .wrapper-main { order: 2; flex-grow: 1; } } -@media (min-width: 75em) { .wrapper { justify-content: center; max-width: 80em; margin-left: auto; margin-right: auto; } +@media (min-width: 45em) { .wrapper { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: start; -ms-flex-align: start; align-items: flex-start; } + .sidebar { -webkit-box-ordinal-group: 2; -ms-flex-order: 1; order: 1; width: 15em; -ms-flex-negative: 0; flex-shrink: 0; margin: 0 1em 0 0; } + .wrapper-main { -webkit-box-ordinal-group: 3; -ms-flex-order: 2; order: 2; -webkit-box-flex: 1; -ms-flex-positive: 1; flex-grow: 1; } } +@media (min-width: 75em) { .wrapper { -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; max-width: 80em; margin-left: auto; margin-right: auto; } .sidebar { width: 18em; } } /** Typography */ @font-face { font-family: 'asap'; src: url("../fonts/asap-bold.woff2") format("woff2"), url("../fonts/asap-bold.woff") format("woff"); font-weight: bold; font-style: normal; } @@ -115,8 +115,8 @@ html, body, input, textarea, button, select, option { color: black; line-height: :not(pre) > code, :not(pre) > kbd, :not(pre) > samp { font-size: 1em; font-family: courier, monospace; color: inherit; padding: 0.2em 0.5em; background: rgba(0, 0, 0, 0.08); background: rgba(0, 0, 0, 0.1); } -a { color: #0F76CE; text-decoration: none; transition: color 0.2s; } -a:hover, a:focus { text-decoration: underline; text-decoration-color: #9BBDDB; } +a { color: #0F76CE; text-decoration: none; -webkit-transition: color 0.2s; -o-transition: color 0.2s; transition: color 0.2s; } +a:hover, a:focus { text-decoration: underline; -webkit-text-decoration-color: #9BBDDB; text-decoration-color: #9BBDDB; } a:active, a:target { color: #9BBDDB; } .menu a:hover, .menu a:focus, nav a:hover, nav a:focus, .list a:hover, .list a:focus { text-decoration: none; } @@ -129,7 +129,7 @@ video, iframe, img, figure, audio, object { max-width: 100%; } figure { margin: 1em 0; } -svg { display: inline-block; width: 1.5em; height: 1.5em; vertical-align: top; fill: #0BA2DA; transition: fill 0.2s; } +svg { display: inline-block; width: 1.5em; height: 1.5em; vertical-align: top; fill: #0BA2DA; -webkit-transition: fill 0.2s; -o-transition: fill 0.2s; transition: fill 0.2s; } table { border-collapse: collapse; } table td { border: 1px solid rgba(0, 0, 0, 0.08); padding: 0.5em; } @@ -137,7 +137,7 @@ table td { border: 1px solid rgba(0, 0, 0, 0.08); padding: 0.5em; } hr { height: 2px; width: 100%; background: rgba(0, 0, 0, 0.08); border: none; } /** Buttons */ -button, .button, input[type="submit"] { display: inline-block; color: black; padding: 0.2em 0.5em; cursor: pointer; transition: background-color 0.2s, border-color 0.2s; background-color: rgba(0, 0, 0, 0.08); border: 2px solid black; border-color: rgba(0, 0, 0, 0.1); } +button, .button, input[type="submit"] { display: inline-block; color: black; padding: 0.2em 0.5em; cursor: pointer; -webkit-transition: background-color 0.2s, border-color 0.2s; -o-transition: background-color 0.2s, border-color 0.2s; transition: background-color 0.2s, border-color 0.2s; background-color: rgba(0, 0, 0, 0.08); border: 2px solid black; border-color: rgba(0, 0, 0, 0.1); } button:hover, button:focus, .button:hover, .button:focus, input[type="submit"]:hover, input[type="submit"]:focus { border-color: rgba(0, 0, 0, 0.2); text-decoration: none; } button:active, .button:active, input[type="submit"]:active { color: black; background-color: rgba(0, 0, 0, 0.15); } button.accent, button.warning, button.success, .button.accent, .button.warning, .button.success, input[type="submit"].accent, input[type="submit"].warning, input[type="submit"].success { color: white; background-color: #0BA2DA; border-color: rgba(0, 0, 0, 0.2); } @@ -148,7 +148,7 @@ button.warning, .button.warning, input[type="submit"].warning { background-color button.warning:active, .button.warning:active, input[type="submit"].warning:active { background-color: #ccb000; } button.success, .button.success, input[type="submit"].success { background-color: #2ecc40; } button.success:active, .button.success:active, input[type="submit"].success:active { background-color: #25a233; } -button.admin, .button.admin, input[type="submit"].admin { font-size: 0.8rem; color: black; border-radius: 10em; } +button.admin, .button.admin, input[type="submit"].admin { font-size: 12.8px; font-size: 0.8rem; color: black; border-radius: 10em; } button.admin svg, .button.admin svg, input[type="submit"].admin svg { fill: black; } button.admin:hover, button.admin:focus, .button.admin:hover, .button.admin:focus, input[type="submit"].admin:hover, input[type="submit"].admin:focus { text-decoration: none; } button[disabled], .button[disabled], input[type="submit"][disabled] { cursor: not-allowed; color: rgba(0, 0, 0, 0.3); background-color: rgba(0, 0, 0, 0.08); border-color: rgba(0, 0, 0, 0.1); } @@ -161,16 +161,16 @@ button[aria-expanded] svg { width: 1em; height: 1em; } button[aria-expanded="true"] .expand, button[aria-expanded="false"] .collapse { display: none; } -button[aria-expanded] + * { margin-top: 0; overflow-y: hidden; opacity: 1; } +button[aria-expanded] + * { margin-top: 0; overflow-y: hidden; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; opacity: 1; } button[aria-expanded] + * > li:first-child { margin-top: 1em; } -button[aria-expanded="false"] + * { opacity: 0; max-height: 0 !important; /* Overrides the inline max-height applied by JavaScript */ } +button[aria-expanded="false"] + * { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; opacity: 0; max-height: 0 !important; /* Overrides the inline max-height applied by JavaScript */ } -.animate button[aria-expanded] + * { transition: max-height 0.3s, opacity 0.5s; } +.animate button[aria-expanded] + * { -webkit-transition: max-height 0.3s, opacity 0.5s; -o-transition: max-height 0.3s, opacity 0.5s; transition: max-height 0.3s, opacity 0.5s; } .menu button[aria-expanded] { margin-left: 0.5em; } -.badge { color: #2ecc40; font-size: 0.8rem; } +.badge { color: #2ecc40; font-size: 12.8px; font-size: 0.8rem; } /** Notification banners */ .notification { background-color: #D6EDF5; padding: 1em; border: 2px solid rgba(0, 0, 0, 0.08); } @@ -180,7 +180,7 @@ button[aria-expanded="false"] + * { opacity: 0; max-height: 0 !important; /* Ove .notification.success { background-color: #ade6b4; } /** Breadcrumb menus */ -.breadcrumb { margin-top: 0; font-size: 0.8rem; border-bottom: 2px solid rgba(0, 0, 0, 0.08); padding: 0 1em 1em; } +.breadcrumb { margin-top: 0; font-size: 12.8px; font-size: 0.8rem; border-bottom: 2px solid rgba(0, 0, 0, 0.08); padding: 0 1em 1em; } .breadcrumb li { display: inline-block; } .breadcrumb li:after { content: '/'; color: rgba(0, 0, 0, 0.3); display: inline-block; margin: 0 0.5em; } .breadcrumb li:last-child:after { content: ''; } @@ -206,7 +206,7 @@ form button, form input[type="submit"] { display: block; margin-top: 1.6em; } label { display: block; } -label > span { font-size: 0.8rem; display: block; } +label > span { font-size: 12.8px; font-size: 0.8rem; display: block; } label > span.help { margin-top: 0; color: rgba(0, 0, 0, 0.6); } @media (min-width: 40em) { .inline label { display: inline-block; vertical-align: top; margin-top: 1em; margin-right: 1em; } } @@ -214,6 +214,8 @@ option + option { margin-top: 0; } fieldset { border: 0; padding: 0; margin-bottom: 3em; } +[aria-invalid="true"]:not(:focus):not(:valid) { -webkit-box-shadow: 0 0 0 2px #CC1F1A; box-shadow: 0 0 0 2px #CC1F1A; } + .forRobots { visibility: hidden; z-index: -1; position: absolute; } /** Logo */ @@ -228,20 +230,20 @@ fieldset { border: 0; padding: 0; margin-bottom: 3em; } /** Login form */ .login { text-align: right; } .login .notification { text-align: left; } -.login > button[aria-expanded] { font-size: 0.8rem; } -.login form { display: flex; flex-direction: column; text-align: left; right: 1em; background-color: white; padding: 0 1em; z-index: 2; } +.login > button[aria-expanded] { font-size: 12.8px; font-size: 0.8rem; } +.login form { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; text-align: left; right: 1em; background-color: white; padding: 0 1em; z-index: 2; } .login form input { width: 100%; } .login ul { padding-left: 0; text-align: center; width: 100%; } -.login ul li { margin-top: 0; display: inline-block; font-size: 0.8rem; margin: 0 0.5em; } +.login ul li { margin-top: 0; display: inline-block; font-size: 12.8px; font-size: 0.8rem; margin: 0 0.5em; } .animate .login form { position: absolute; border: 2px solid #0BA2DA; /* For some reason border height is included in the document flow, causing a jump when the .animate is applied. So we're waiting until the form is removed from document flow to add the border. */ } /** Admin menu */ -.user { margin-bottom: 1em; border-bottom: 2px solid rgba(0, 0, 0, 0.08); display: flex; flex-wrap: wrap; width: 100%; justify-content: center; } +.user { margin-bottom: 1em; border-bottom: 2px solid rgba(0, 0, 0, 0.08); display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; width: 100%; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; } .user a { margin: 0 0.5em 1em; } /** Primary navigation menu Top-level pages (including cart) */ -.menu.primary { display: flex; flex-wrap: wrap; width: 100%; justify-content: center; align-items: center; } +.menu.primary { display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; width: 100%; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; } .menu.primary a { margin: 0 0.5em 0.5em; padding: 0.2em 0.5em; } .menu.primary a:not(.button):not(.flag) { border-bottom: 2px solid rgba(0, 0, 0, 0.08); border-top: 2px solid transparent; /* Align better with .cart button */ color: inherit; } .menu.primary a:not(.button):not(.flag):hover, .menu.primary a:not(.button):not(.flag):focus { color: #0BA2DA; border-bottom-color: #9FCEDF; } @@ -254,17 +256,17 @@ fieldset { border: 0; padding: 0; margin-bottom: 3em; } .menu.primary .flag img { width: 1.5em; display: inline-block; vertical-align: middle; } /** Sidebar */ -.sidebar section, .sidebar h1 { padding: 1rem; } +.sidebar section, .sidebar h1 { padding: 16px; padding: 1rem; } .sidebar section { margin-top: 0; } .sidebar section > h3 { margin-top: 0; border-bottom: 2px solid rgba(0, 0, 0, 0.08); } .sidebar section > .menu.categories { margin-top: 0; } -.search { display: flex; align-items: space-between; } -.search input { width: 50%; flex-grow: 1; margin-right: 0.5em; } +.search { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: space-between; -ms-flex-align: space-between; align-items: space-between; } +.search input { width: 50%; -webkit-box-flex: 1; -ms-flex-positive: 1; flex-grow: 1; margin-right: 0.5em; } .search button { margin-top: 0; } -.menu.tags li, .menu.brands li { margin: 0; display: inline; font-size: 0.8rem; line-height: 2; } +.menu.tags li, .menu.brands li { margin: 0; display: inline; font-size: 12.8px; font-size: 0.8rem; line-height: 2; } .menu.tags li a, .menu.brands li a { display: inline; background: rgba(0, 0, 0, 0.08); padding: 0.2em 0.5em; } .menu.tags li a:hover, .menu.tags li a:focus, .menu.brands li a:hover, .menu.brands li a:focus { background-color: #0BA2DA; color: white; } .menu.tags li a:active, .menu.brands li a:active { background-color: #097EAA; } @@ -281,32 +283,32 @@ fieldset { border: 0; padding: 0; margin-bottom: 3em; } /** Featured product list */ .list.products.featured li { border: 2px solid rgba(0, 0, 0, 0.08); } -.list.products.featured .product, .list.products.featured .product:hover, .list.products.featured .product:focus, .list.products.featured:hover .product, .list.products.featured:focus .product { box-shadow: none; background: none; } +.list.products.featured .product, .list.products.featured .product:hover, .list.products.featured .product:focus, .list.products.featured:hover .product, .list.products.featured:focus .product { -webkit-box-shadow: none; box-shadow: none; background: none; } .list.products.featured .product h3 { margin-top: 0.25em; } .list.products.featured .description { margin: 0.5em; } -.list.products.featured .variant { font-size: 0.8rem; } +.list.products.featured .variant { font-size: 12.8px; font-size: 0.8rem; } .list.products.featured form { margin-top: 0.25em; } .list.products.featured button { margin-top: 0.5em; } /** Category list */ -.list.categories { display: flex; flex-wrap: wrap; margin-top: 2em; margin-left: -0.5em; margin-right: -0.5em; } -.list.categories li { background-color: #0BA2DA; margin: 0.5em; flex-grow: 1; } +.list.categories { display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; margin-top: 2em; margin-left: -0.5em; margin-right: -0.5em; } +.list.categories li { background-color: #0BA2DA; margin: 0.5em; -webkit-box-flex: 1; -ms-flex-positive: 1; flex-grow: 1; } .list.categories li, .list.categories a { background-repeat: no-repeat; background-size: cover; background-position: center center; } -.list.categories a { font-size: 1.5em; background-size: auto 100%; display: flex; min-height: 200px; color: white; position: relative; } -.list.categories a span { align-self: flex-end; width: 100%; padding: 0 1rem 0.5rem 1rem; z-index: 1; } -.list.categories a span:before { position: absolute; content: ''; top: 0; right: 0; bottom: 0; left: 0; background-image: linear-gradient(10deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.2) 50%, transparent 100%); z-index: -1; } -.list.categories a:hover span:before, .list.categories a:focus span:before { background-image: linear-gradient(10deg, rgba(0, 0, 0, 0.8) 0%, hsla(196,90%,45%,0.3) 100%); } +.list.categories a { font-size: 1.5em; background-size: auto 100%; display: -webkit-box; display: -ms-flexbox; display: flex; min-height: 200px; color: white; position: relative; } +.list.categories a span { -ms-flex-item-align: end; align-self: flex-end; width: 100%; padding: 0 16px 8px 16px; padding: 0 1rem 0.5rem 1rem; z-index: 1; } +.list.categories a span:before { position: absolute; content: ''; top: 0; right: 0; bottom: 0; left: 0; background-image: -o-linear-gradient(80deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.2) 50%, transparent 100%); background-image: linear-gradient(10deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.2) 50%, transparent 100%); z-index: -1; } +.list.categories a:hover span:before, .list.categories a:focus span:before { background-image: -o-linear-gradient(80deg, rgba(0, 0, 0, 0.8) 0%, hsla(196,90%,45%,0.3) 100%); background-image: linear-gradient(10deg, rgba(0, 0, 0, 0.8) 0%, hsla(196,90%,45%,0.3) 100%); } @media (min-width: 45em) { .list.categories li { width: 40%; } } @media (min-width: 75em) { .list.categories li { width: 20%; } } /** Product list */ -.brand { font-size: 0.8rem; text-transform: uppercase; } +.brand { font-size: 12.8px; font-size: 0.8rem; text-transform: uppercase; } .list.products { margin-top: 1em; } .list.products li { position: relative; } -.list.products li:hover .product, .list.products li:focus .product { background: rgba(0, 0, 0, 0.08); box-shadow: inset 0 -4px 0 -2px #0BA2DA, inset 0 0 0 2px rgba(0, 0, 0, 0.08); } +.list.products li:hover .product, .list.products li:focus .product { background: rgba(0, 0, 0, 0.08); -webkit-box-shadow: inset 0 -4px 0 -2px #0BA2DA, inset 0 0 0 2px rgba(0, 0, 0, 0.08); box-shadow: inset 0 -4px 0 -2px #0BA2DA, inset 0 0 0 2px rgba(0, 0, 0, 0.08); } .list.products li:hover .product h3, .list.products li:focus .product h3 { color: #0F76CE; } -.list.products .product { display: block; color: black; box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.08); } +.list.products .product { display: block; color: black; -webkit-box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.08); box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.08); } .list.products .product img { display: block; width: 100%; } .list.products .product .description { margin-top: 0; padding: 1em; } .list.products .product h3 { margin-top: 0; margin-bottom: 0; font-size: 1.25em; line-height: 1.2; } @@ -320,10 +322,10 @@ fieldset { border: 0; padding: 0; margin-bottom: 3em; } .list.products .fullscreen svg { display: block; fill: #0BA2DA; } .list.products .product:hover + .fullscreen, .list.products .product:focus + .fullscreen, .list.products .fullscreen:hover, .list.products .fullscreen:focus { display: block; } -@media (min-width: 30em) { .list.products { display: flex; flex-wrap: wrap; margin-left: -0.5em; margin-right: -0.5em; } - .list.products li { margin: 0.5em; width: 12em; flex-grow: 1; display: flex; } +@media (min-width: 30em) { .list.products { display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; margin-left: -0.5em; margin-right: -0.5em; } + .list.products li { margin: 0.5em; width: 12em; -webkit-box-flex: 1; -ms-flex-positive: 1; flex-grow: 1; display: -webkit-box; display: -ms-flexbox; display: flex; } .list.products .product { width: 100%; } - .list.products img { flex-shrink: 0; } } + .list.products img { -ms-flex-negative: 0; flex-shrink: 0; } } @media (min-width: 45em) { .list.products li { max-width: 24em; } } .related { margin-top: 2em; border-top: 2px solid rgba(0, 0, 0, 0.08); } @@ -339,40 +341,40 @@ main.product .brand + h1 { margin-top: 0; } .variants form .action { margin-top: 0.5em; } .variants form .action select { margin: 0 0 0.5em; display: block; max-width: 100%; } .variants form .action button { display: inline-block; margin: 0; } -.variants form .action .remaining { margin-top: 0.25em; margin-bottom: 0; font-size: 0.8rem; color: #0BA2DA; } +.variants form .action .remaining { margin-top: 0.25em; margin-bottom: 0; font-size: 12.8px; font-size: 0.8rem; color: #0BA2DA; } -@media (min-width: 45em) { .product-details { display: flex; } +@media (min-width: 45em) { .product-details { display: -webkit-box; display: -ms-flexbox; display: flex; } .variants form { margin-right: 1em; margin-left: 0; width: 10em; } .variants form:first-child { margin-top: 0; } .slider + .variants { text-align: left; margin-left: 1em; } .slider + .variants form { margin-right: 0; } } /** Image slider */ .slider { position: relative; } -.slider .slide { background-size: 100%; background-position: center; opacity: 0; height: 0; overflow: hidden; transition: opacity 0.2s ease-in-out; margin-top: 0; } +.slider .slide { background-size: 100%; background-position: center; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; opacity: 0; height: 0; overflow: hidden; -webkit-transition: opacity 0.2s ease-in-out; -o-transition: opacity 0.2s ease-in-out; transition: opacity 0.2s ease-in-out; margin-top: 0; } .slider .slide img { display: block; max-height: 15em; margin: 0 auto; } .slider input { display: none; } -.slider input:checked + .slide { height: auto; opacity: 1; } +.slider input:checked + .slide { height: auto; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; opacity: 1; } .slider .thumbnails { width: 100%; list-style: none; font-size: 0; text-align: center; padding-left: 0; } -.slider .thumbnails li { font-size: 1rem; display: inline-block; margin: 0.5rem; width: 5em; max-width: 50px; } -.slider .thumbnails img { width: 100%; border-radius: 100%; display: block; border: 2px solid white; box-shadow: 0 0 0 2px #0BA2DA; cursor: pointer; } +.slider .thumbnails li { font-size: 16px; font-size: 1rem; display: inline-block; margin: 8px; margin: 0.5rem; width: 5em; max-width: 50px; } +.slider .thumbnails img { width: 100%; border-radius: 100%; display: block; border: 2px solid white; -webkit-box-shadow: 0 0 0 2px #0BA2DA; box-shadow: 0 0 0 2px #0BA2DA; cursor: pointer; } @media (min-width: 45em) { .slider .slide img { max-height: 20em; } } @media (min-width: 75em) { .slider .slide img { max-height: 30em; } } /** Slideshow */ -.slideshow-nav { text-align: center; font-size: 0.8rem; } +.slideshow-nav { text-align: center; font-size: 12.8px; font-size: 0.8rem; } .slideshow-nav .button { margin: 0 1em; } .slideshow-nav .button[disabled] svg { fill: rgba(0, 0, 0, 0.15); } .slideshow-nav svg { fill: black; display: block; margin: 0.2em auto 0; } -a.slideshow { display: block; color: black; box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.08); } -a.slideshow:hover, a.slideshow:focus { background: rgba(0, 0, 0, 0.08); box-shadow: inset 0 -4px 0 -2px #0BA2DA, inset 0 0 0 2px rgba(0, 0, 0, 0.08); text-decoration: none; } +a.slideshow { display: block; color: black; -webkit-box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.08); box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.08); } +a.slideshow:hover, a.slideshow:focus { background: rgba(0, 0, 0, 0.08); -webkit-box-shadow: inset 0 -4px 0 -2px #0BA2DA, inset 0 0 0 2px rgba(0, 0, 0, 0.08); box-shadow: inset 0 -4px 0 -2px #0BA2DA, inset 0 0 0 2px rgba(0, 0, 0, 0.08); text-decoration: none; } a.slideshow:hover h3, a.slideshow:focus h3 { color: #0F76CE; } a.slideshow .description { margin-top: 0; padding: 1em; } a.slideshow .description h3, a.slideshow .description p { margin-top: 0; margin-bottom: 0; } a.slideshow .description .price { color: #0BA2DA; margin-top: 1em; margin-bottom: 1em; } -@media (min-width: 75em) { a.slideshow { display: flex; } - a.slideshow img { flex-grow: 1; } +@media (min-width: 75em) { a.slideshow { display: -webkit-box; display: -ms-flexbox; display: flex; } + a.slideshow img { -webkit-box-flex: 1; -ms-flex-positive: 1; flex-grow: 1; } a.slideshow img + .description { max-width: 15em; } } /** Cart page */ .table-overflow { overflow-x: auto; } @@ -390,13 +392,13 @@ a.slideshow .description .price { color: #0BA2DA; margin-top: 1em; margin-bottom .checkout tbody tr td:first-child { width: 100%; display: block; text-align: left; padding-top: 0.5em; } .checkout tbody tr td:not(:first-child) { padding-bottom: 0.5em; } .checkout tbody tr td:first-child { border-top: 2px solid rgba(0, 0, 0, 0.08); } -.checkout tbody tr button { font-size: 0.8rem; } +.checkout tbody tr button { font-size: 12.8px; font-size: 0.8rem; } .checkout tfoot { border-top: 2px solid rgba(0, 0, 0, 0.08); } .checkout tfoot tr { display: block; font-size: 0; } .checkout tfoot tr:last-child { font-weight: bold; } -.checkout tfoot tr td { font-size: 1rem; width: 50%; } +.checkout tfoot tr td { font-size: 16px; font-size: 1rem; width: 50%; } .checkout tfoot tr td:first-child { text-align: left; } -.checkout tfoot .discount { text-align: right; font-size: 0.8rem; white-space: nowrap; } +.checkout tfoot .discount { text-align: right; font-size: 12.8px; font-size: 0.8rem; white-space: nowrap; } .checkout tfoot .discount input, .checkout tfoot .discount button { display: inline-block; } .checkout tfoot .discount input { max-width: 40%; } .checkout .quantity { white-space: nowrap; margin-right: 0.5em; } @@ -404,7 +406,7 @@ a.slideshow .description .price { color: #0BA2DA; margin-top: 1em; margin-bottom .checkout .quantity button { background: inherit; border: none; padding: 0; margin: 0; } .checkout .quantity button svg { fill: rgba(0, 0, 0, 0.3); } .checkout .quantity button[disabled] svg { fill: rgba(0, 0, 0, 0.08); } -.checkout select[name="country"] + button, .checkout select[name="shipping"] + button { font-size: 0.8rem; display: inline-block; vertical-align: middle; margin: 0.25em 0 1em 0.5em; } +.checkout select[name="country"] + button, .checkout select[name="shipping"] + button { font-size: 12.8px; font-size: 0.8rem; display: inline-block; vertical-align: middle; margin: 0.25em 0 1em 0.5em; } @media (min-width: 30em) { .checkout thead tr, .checkout tbody tr, .checkout tfoot tr { display: table-row; } .checkout td, .checkout tbody tr td:first-child { width: auto; display: table-cell; } @@ -419,7 +421,7 @@ a.slideshow .description .price { color: #0BA2DA; margin-top: 1em; margin-bottom .gateways button { vertical-align: top; display: inline-block; max-width: 15em; margin-right: 1em; } .gateways button img { max-height: 2.5em; max-width: 100%; display: block; margin: 0 auto; padding: 0 0.5em 0.5em; } -.gateways button .notification { font-size: 0.8rem; color: black; margin: 0 -0.5rem -0.2rem; } +.gateways button .notification { font-size: 12.8px; font-size: 0.8rem; color: black; margin: 0 -8px -3.2px; margin: 0 -0.5rem -0.2rem; } /** Orders page */ .orders { min-width: 100%; border-collapse: collapse; } @@ -431,39 +433,39 @@ a.slideshow .description .price { color: #0BA2DA; margin-top: 1em; margin-bottom .orders th > button { white-space: nowrap; font-weight: bold; } .orders th:last-child { padding-right: 0; } .orders th:nth-child(3), .orders td:nth-child(3) { text-align: right; } -.orders .filter { font-weight: normal; font-size: 0.8rem; } +.orders .filter { font-weight: normal; font-size: 12.8px; font-size: 0.8rem; } .orders .filter label { white-space: nowrap; } .orders .filter button { margin-top: 0.5em; } .orders td { vertical-align: top; } .orders td, .orders th { border: none; } .orders ul { padding: 0; margin: 0 0 0 1em; } .orders table { width: 100%; } -.orders td input[type="submit"], .orders td button { margin-top: 0.5em; font-size: 0.8rem; } +.orders td input[type="submit"], .orders td button { margin-top: 0.5em; font-size: 12.8px; font-size: 0.8rem; } /** Gateway pages */ .gateway { max-width: 40em; margin: 0 auto 3em; padding-bottom: 2em; border-bottom: 2px solid #0BA2DA; } .gateway .logo { display: block; padding-bottom: 0.5em; border-bottom: 2px solid rgba(0, 0, 0, 0.08); } .gateway .logo img { max-width: 5em; } -.txn-summary { display: flex; justify-content: space-between; border-bottom: 2px solid #0BA2DA; padding-bottom: 1em; } +.txn-summary { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; border-bottom: 2px solid #0BA2DA; padding-bottom: 1em; } .txn-summary > * + * { margin-top: 0; } #sq-card label, #sq-card iframe { display: block; } #sq-card iframe { margin-top: 0; } -#sq-card .sq-input { outline: 1px auto rgba(0, 0, 0, 0.15); border: 3px solid white; box-sizing: content-box; width: calc(100% - 8px); } +#sq-card .sq-input { outline: 1px auto rgba(0, 0, 0, 0.15); border: 3px solid white; -webkit-box-sizing: content-box; box-sizing: content-box; width: calc(100% - 8px); } #sq-card .sq-input--focus { outline: 1px auto #0BA2DA; } #sq-card .sq-input--error { outline: 1px auto #ffdc00; } #sq-card #sq-expiration-date, #sq-card #sq-cvv, #sq-card #sq-postal-code { max-width: 5em; } #sq-card > div { padding: 1em; } #sq-card > div:first-child { background-color: rgba(0, 0, 0, 0.08); border-radius: 0.5em; } #sq-card > div { margin-top: 0; } -#sq-card .exp-cvv { display: flex; justify-content: space-between; } +#sq-card .exp-cvv { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; } #sq-card .exp-cvv div { margin-top: 0; } #sq-card { margin: 2em 0; } #sq-card .card { background-position: top -2px right 1em; background-size: auto 2em; background-repeat: no-repeat; border: 1px solid rgba(0, 0, 0, 0.08); max-width: 18em; /* Roughly twice the height, to approximate the ratio of a credit card */ } -@media (min-width: 30em) { #sq-card { display: flex; } } +@media (min-width: 30em) { #sq-card { display: -webkit-box; display: -ms-flexbox; display: flex; } } #sq-card.visa .card { background-image: url("/assets/plugins/shopkit/img/visa.png"); background-color: #E9F3F7; } #sq-card.masterCard .card { background-image: url("/assets/plugins/shopkit/img/mastercard.png"); background-color: #FFF8EC; } @@ -474,4 +476,4 @@ a.slideshow .description .price { color: #0BA2DA; margin-top: 1em; margin-bottom #sq-card.discover .card { background-image: url("/assets/plugins/shopkit/img/discover.png"); background-color: #FEF4EB; } -/*# sourceMappingURL=shopkit.css.map */ +/*# sourceMappingURL=shopkit.css.map */ \ No newline at end of file diff --git a/site/plugins/shopkit/assets/css/shopkit.css b/site/plugins/shopkit/assets/css/shopkit.css index b467470..69d03b4 100644 --- a/site/plugins/shopkit/assets/css/shopkit.css +++ b/site/plugins/shopkit/assets/css/shopkit.css @@ -214,6 +214,8 @@ option + option { margin-top: 0; } fieldset { border: 0; padding: 0; margin-bottom: 3em; } +[aria-invalid="true"]:not(:focus):not(:valid) { -webkit-box-shadow: 0 0 0 2px #CC1F1A; box-shadow: 0 0 0 2px #CC1F1A; } + .forRobots { visibility: hidden; z-index: -1; position: absolute; } /** Logo */ diff --git a/site/plugins/shopkit/assets/css/shopkit.css.map b/site/plugins/shopkit/assets/css/shopkit.css.map index 850b1cc..d5efe47 100644 --- a/site/plugins/shopkit/assets/css/shopkit.css.map +++ b/site/plugins/shopkit/assets/css/shopkit.css.map @@ -1 +1 @@ -{"version":3,"sources":["shopkit.scss"],"names":[],"mappings":"AAAA,4EAA4E;AAAA,oBAAgB,kBAAgB,EAAA;;AAAC,iCAA4B,sBAAoB,EAAA;;AAAC,qBAAiB,yBAAuB,EAAA;;AAAC,wCAAoC,+BAAqB,CAArB,uBAAqB,CAAC,WAAS,EAAA;;AAAC,OAAK,wBAAsB,CAAC,2BAAyB,CAAC,+BAA6B,EAAA;;AAAC,OAAK,UAAQ,EAAA;;AAAC,wFAA4E,eAAa,EAAA;;AAAC,KAAG,eAAa,CAAC,gBAAc,EAAA;;AAAC,SAAO,iBAAe,EAAA;;AAAC,KAAG,gCAAsB,CAAtB,wBAAsB,CAAC,UAAQ,EAAA;;AAAC,uBAAkB,iCAA+B,CAAC,eAAa,EAAA;;AAAC,IAAE,8BAA4B,CAAC,sCAAoC,EAAA;;AAAC,oBAAiB,iBAAe,EAAA;;AAAC,cAAY,oBAAkB,CAAC,2BAAyB,CAAC,0CAAgC,CAAhC,kCAAgC,EAAA;;AAAC,YAAS,oBAAkB,EAAA;;AAAC,MAAI,mBAAiB,EAAA;;AAAC,OAAK,uBAAqB,CAAC,YAAU,EAAA;;AAAC,QAAM,eAAa,EAAA;;AAAC,WAAQ,eAAa,CAAC,eAAa,CAAC,mBAAiB,EAAA;;AAAC,MAAI,eAAa,EAAA;;AAAC,MAAI,WAAS,EAAA;;AAAC,wBAAsB,cAAY,CAAC,UAAQ,EAAA;;AAAC,MAAI,mBAAiB,EAAA;;AAAC,gBAAe,iBAAe,EAAA;;AAAC,4CAAsC,wBAAsB,CAAC,gBAAc,CAAC,UAAQ,EAAA;;AAAC,iBAAc,qBAAmB,EAAA;;AAAC,0DAAqD,2BAAyB,EAAA;;AAAC,6HAAwH,mBAAiB,CAAC,WAAS,EAAA;;AAAC,iHAA4G,+BAA6B,EAAA;;AAAC,WAAS,yBAAuB,CAAC,cAAY,CAAC,4BAA0B,EAAA;;AAAC,SAAO,eAAa,CAAC,eAAa,CAAC,gBAAc,CAAC,oBAAkB,EAAA;;AAAC,WAAS,eAAa,EAAA;;AAAC,qFAAkF,aAAW,EAAA;;AAAC,gBAAc,8BAA4B,CAAC,qBAAmB,EAAA;;AAAC,wFAAqF,yBAAuB,EAAA;;AAAC,+BAA6B,2BAAyB,CAAC,cAAY,EAAA;;AAAC,UAAQ,mBAAiB,EAAA;;AAAC,qBAAkB,cAAY,EAAA;;AAGllE,uBAGG;AAEH,OACC,aAAY,CACZ,+BAAsB,CAAtB,uBAAsB,EAAA;;AAGvB,OACC,iBAAgB,CAChB,gCAA+B,CAC/B,6BAA4B,CAC5B,4BAA2B,CAC3B,2BAA0B,CAAE,cAAc,CAC1C,uBAAsB,EAAA;;AAGvB,uBAEE,4BAAmB,CAAnB,oBAAmB,EAAA;;AAGrB,QAEC,gBAAe,EAAA;;AAEhB,2BACE,cAAa,EAAA;;AAIf,+BAGG;AA+BH,sBAGG;AAEH,QACC,yBAAwB,EAAA;;AAGzB,cAGG;AAEH,WACC,mBAAkB,CAClB,2CAAqC,CACpC,iBAAgB,CACjB,yBAAwB,EAAA;;AAEzB,kBACC,YAAW,CACX,mBAAkB,CAClB,OAAM,CAAE,SAAQ,CAAE,UAAS,CAAE,QAAO,CACpC,YAAW,CACX,gCAA+B,CAC/B,6BAA4B,CAC5B,4BAA2B,CAC3B,2BAA0B,CAAE,cAAc,CAC1C,uBAAsB,EAAA;;AAGvB,2BACC,WACC,qBAAoB,EAAA,EAAA;AAItB,gBACC,YAAW,CACX,aAAY,CACZ,mBAAkB,EAAA;AAClB,qBACC,iCAAgC,CAChC,oBAAmB,EAAA;;AAIrB,2BACC,WACC,qBAAa,CAAb,qBAAa,CAAb,cAAa,CACb,yBAAuB,CAAvB,sBAAuB,CAAvB,wBAAuB,EAAA;EAExB,WACC,6BAAQ,CAAR,kBAAQ,CAAR,SAAQ,CACR,YAAW,CACX,qBAAc,CAAd,eAAc,CACd,kBAAiB,EAAA;EAElB,gBACC,6BAAQ,CAAR,kBAAQ,CAAR,SAAQ,CACR,oBAAY,CAAZ,qBAAY,CAAZ,aAAY,EAAA,EAAA;AAId,2BACC,WACC,yBAAuB,CAAvB,sBAAuB,CAAvB,wBAAuB,CACvB,gBAAe,CACf,kBAAiB,CACjB,mBAAkB,EAAA;EAEnB,WACC,YAAW,EAAA,EAAA;AAOb,kBAGG;AAEH,aACC,oBAAmB,CACnB,oGACkD,CAClD,kBAAiB,CACjB,mBAAkB,EAAA;AAGnB,aACC,oBAAmB,CACnB,gHACwD,CACxD,kBAAiB,CACjB,mBAAkB,EAAA;AAGnB,aACC,oBAAmB,CACnB,wGACoD,CACpD,oBAAmB,CACnB,mBAAkB,EAAA;AAGnB,aACC,oBAAmB,CACnB,0GACqD,CACrD,oBAAmB,CACnB,mBAAkB,EAAA;AAGnB,sDAOC,aAAY,CACZ,iBAAgB,CAChB,+JAA8J,EAAA;;AAI9J,wJAOC,qKAAoK,EAAA;;AAOtK,sDAGC,eAAc,CACd,gCAA+B,CAC9B,eAAc,CACd,qBAAoB,CACpB,gCApLqB,CAqLrB,+BAA2B,EAAA;;AAM7B,IACC,eA/Ka,CAgLb,sBAAqB,CACrB,+BAAsB,CAAtB,0BAAsB,CAAtB,uBAAsB,EAAA;AAEtB,mBAEC,2BAA0B,CAC1B,uCArL2C,CAqL3C,+BArL2C,EAAA;AAwL5C,qBAEC,eA1L2C,EAAA;;AAiM5C,uFAEC,sBAAqB,EAAA;;AAOvB,eAEC,WAAU,CACV,iBAAgB,EAAA;AAEhB,qBACC,iBAAgB,EAAA;;AAKlB,gBAGG;AAEH,4CACC,gBAAe,EAAA;;AAGhB,SACC,cAAa,EAAA;;AAGd,MACC,sBAAqB,CACrB,aAAY,CACZ,cAAa,CACb,oBAAmB,CACnB,cA9Oe,CA+Of,8BAAqB,CAArB,yBAAqB,CAArB,sBAAqB,EAAA;;AAGtB,QACE,0BAAyB,EAAA;AAEzB,WACC,sCAAuB,CACvB,eAAc,EAAA;;AAIjB,KACC,YAAW,CACX,YAAW,CACX,gCArQsB,CAsQtB,aAAY,EAAA;;AAIb,eAGG;AAEH,wCAGC,sBAAqB,CACrB,aAAY,CACZ,qBAAoB,CACpB,gBAAe,CACf,6DAAoD,CAApD,wDAAoD,CAApD,qDAAoD,CACpD,sCAvRsB,CAwRtB,wBAAuB,CACvB,iCAA6B,EAAA;AAE7B,mHAEC,iCAA6B,CAC7B,sBAAqB,EAAA;AAGtB,6DACC,aAAY,CACZ,sCAlSyB,EAAA;AAqS1B,2LAGC,aAAY,CACZ,0BAnSc,CAoSd,iCAA6B,EAAA;AAE7B,ieAEC,iCAA6B,EAAA;AAG9B,0PACC,0BA1S6B,EAAA;AA6S9B,+NACC,YAAW,EAAA;AAIb,gEACC,0BA5Se,CA6Sf,aAAY,EAAA;AAEZ,qFACC,0BAAsC,EAAA;AAIxC,gEACC,0BAlTe,EAAA;AAoTf,qFACC,0BAAsC,EAAA;AAIxC,0DACC,kBAvTa,CAuTb,kBAvTa,CAwTb,aAAY,CACZ,oBAAmB,EAAA;AAEnB,sEACC,YAAW,EAAA;AAGZ,uJAEC,sBAAqB,EAAA;AAIvB,sEACC,oBAAmB,CACnB,0BA3V0B,CA4V1B,sCA9VqB,CA+VrB,iCAA6B,EAAA;AAE7B,yQAGC,sCApWoB,CAqWpB,iCAA6B,EAAA;AAI/B,oDACC,eAAc,CACd,iBAAgB,CAChB,cAAa,EAAA;;AAOf,wBACC,cAAa,CAAE,qBAAqB,CACpC,WAAU,CACV,UAAS,CACT,oBAAmB,CACnB,eAAc,EAAA;;AAEf,4BACC,WAAU,CACV,YAAW,EAAA;;AAEZ,gFAEC,cAAa,EAAA;;AAGd,4BACC,cAAa,CACb,mBAAkB,CAClB,mEAAU,CAAV,WAAU,EAAA;AAEV,6CACC,gBAAe,EAAA;;AAGjB,oCACC,iEAAU,CAAV,WAAU,CACV,yBAAwB,CAAE,2DAA2D,EAAA;;AAEtF,qCACC,kDAAyC,CAAzC,6CAAyC,CAAzC,0CAAyC,EAAA;;AAG1C,8BACC,mBAAkB,EAAA;;AAMnB,SACC,eAzYgB,CA0YhB,kBAvYc,CAuYd,kBAvYc,EAAA;;AA4Yf,4BAGG;AAEH,gBACC,0BA7ZgD,CA8ZhD,aAAY,CACZ,sCAAuB,EAAA;;AAGxB,wBACC,0BA7ZkD,EAAA;;AAganD,wBACC,0BA9ZkD,EAAA;;AAkanD,wBAGG;AAEH,cACC,cAAa,CACb,kBAvac,CAuad,kBAvac,CAwad,6CAA8B,CAC9B,mBAAkB,EAAA;AAElB,iBACC,sBAAqB,EAAA;AAErB,uBACC,aAAY,CACZ,0BApcyB,CAqczB,sBAAqB,CACrB,gBAAe,EAAA;AAGhB,kCACC,YAAW,EAAA;;AAMd,qBAGG;AAEH,YACC,iBAAgB,CAChB,mBAAkB,CAClB,sCA1dsB,CA2dtB,qBAAoB,EAAA;AAEpB,eACC,sBAAqB,CACrB,iBAAgB,EAAA;;AAKlB,aAGG;AAEH,mCAIC,eAAc,CACd,iBAAgB,CAChB,gBAAe,EAAA;;AAGhB,4EAIC,wBAAuB,CACvB,sCAA2B,CAC3B,qBAAoB,CAAE,cAAc,CACpC,iCAAgC,CAChC,YAAW,CACX,gBAAe,EAAA;AAEf,oGACC,YAAW,EAAA;AAGZ,oGACC,sBA3fc,EAAA;;AA+fhB,WACC,iBAAgB,EAAA;;AAGjB,kBACC,sCA3gBsB,EAAA;;AA8gBvB,kBACC,aAAY,CACZ,gBAAe,CACf,iBAAgB,EAAA;;AAGjB,yCAEC,eAAc,CACd,kBAAiB,EAAA;;AAGlB,QACC,eAAc,EAAA;;AAEf,eACC,kBAxgBc,CAwgBd,kBAxgBc,CAygBd,eAAc,EAAA;AAEd,oBACC,cAAa,CACb,0BAhiB2B,EAAA;;AAmiB7B,2BACC,gBACC,sBAAqB,CACrB,oBAAmB,CACnB,gBAAe,CACf,kBAAiB,EAAA,EAAA;AAInB,kBACC,cAAa,EAAA;;AAGd,WACC,UAAS,CACT,WAAU,CACV,mBAAkB,EAAA;;AAInB,aACC,mBAAkB,CAClB,YAAW,CACX,mBAAkB,EAAA;;AAMnB,YAGG;AAEH,QACC,UAAS,EAAA;AAET,qBACC,eAAc,EAAA;AAGf,YACC,eAAc,EAAA;;AAIhB,iBACC,cAAa,EAAA;;AAGd,2BACC,iBACC,eAAc,EAAA;EAGf,sBACC,cAAa,EAAA,EAAA;AAMf,kBAGG;AAEH,SACC,kBAAiB,EAAA;AAEjB,uBACC,iBAAgB,EAAA;AAGjB,iCACC,kBA3lBa,CA2lBb,kBA3lBa,EAAA;AA8lBd,cACC,qBAAa,CAAb,qBAAa,CAAb,cAAa,CACb,6BAAsB,CAAtB,8BAAsB,CAAtB,2BAAsB,CAAtB,uBAAsB,CACtB,iBAAgB,CAChB,WAAU,CACV,wBAAuB,CACvB,eAAc,CACd,WAAU,EAAA;AAEV,oBACC,YAAW,EAAA;AAIb,YACC,gBAAe,CACf,mBAAkB,CAClB,YAAW,EAAA;AAEX,eACC,cAAa,CACb,sBAAqB,CACrB,kBApnBY,CAonBZ,kBApnBY,CAqnBZ,gBAAe,EAAA;;AAKlB,uBACC,mBAAkB,CAClB,0BAAyB,CAAE,mMAAmM,EAAA;;AAG/N,kBAGG;AAEH,QACC,mBAAkB,CAClB,6CAA8B,CAC9B,qBAAa,CAAb,qBAAa,CAAb,cAAa,CACb,oBAAe,CAAf,gBAAe,CACf,YAAW,CACX,yBAAuB,CAAvB,sBAAuB,CAAvB,wBAAuB,EAAA;AAEvB,UACC,oBAAmB,EAAA;;AAIrB,gEAIG;AAEH,gBACC,qBAAa,CAAb,qBAAa,CAAb,cAAa,CACb,oBAAe,CAAf,gBAAe,CACf,YAAW,CACX,yBAAuB,CAAvB,sBAAuB,CAAvB,wBAAuB,CACvB,0BAAmB,CAAnB,uBAAmB,CAAnB,oBAAmB,EAAA;AAEnB,kBACC,sBAAqB,CACrB,qBAAoB,EAAA;AAGrB,0CACC,6CAA8B,CAC9B,kCAAiC,CAAE,oCAAoC,CACvE,eAAc,EAAA;AAEd,+FAEC,eAzrBa,CA0rBb,6BAvrB+C,EAAA;AA0rBhD,iDACC,eA3rB+C,EAAA;AA8rBhD,iDACC,6BAlsBa,EAAA;AAssBf,2BACC,UAAS,CACT,WAAU,CACV,oBAAmB,EAAA;AAGpB,sBACC,eAAc,EAAA;AAGf,0BACC,cAAa,CACb,gBAAe,CACf,uBAAsB,EAAA;AAGvB,sBACC,WAAU,CACV,eAAc,EAAA;AAEd,0BACC,aAAY,CACZ,sBAAqB,CACrB,uBAAsB,EAAA;;AAMzB,eAGG;AAEH,gCAEC,cAAa,CAAb,cAAa,EAAA;;AAGd,mBACC,cAAa,EAAA;AAEb,wBACC,cAAa,CACb,6CAA8B,EAAA;AAG/B,sCACC,cAAa,EAAA;;AAIf,UACC,qBAAa,CAAb,qBAAa,CAAb,cAAa,CACb,iCAA0B,CAA1B,8BAA0B,CAA1B,2BAA0B,EAAA;AAE1B,gBACC,WAAU,CACV,oBAAY,CAAZ,qBAAY,CAAZ,aAAY,CACZ,oBAAmB,EAAA;AAGpB,iBACC,cAAa,EAAA;;AAMd,iCACC,UAAS,CACT,gBAAe,CACf,kBA/vBa,CA+vBb,kBA/vBa,CAgwBb,eAAc,EAAA;AAGd,qCACC,gBAAe,CACf,gCA3xBoB,CA4xBpB,qBAAoB,EAAA;AAEpB,iGAEC,0BAzxBY,CA0xBZ,aAAY,EAAA;AAGb,mDACC,0BA5xB4B,EAAA;;AAkyBhC,cAAc,iBAAgB,EAAA;;AAC9B,kBAAkB,cAAa,EAAA;;AAE9B,iBACC,kBAAiB,EAAA;AAElB,+CAEC,eAAc,CACd,cAAa,EAAA;;AAMf,0BAGG;AAEH,wBACC,cAAa,EAAA;;AAId,6BAGG;AAIF,6BACC,sCAAuB,EAAA;AAGvB,mMAKC,yBAAgB,CAAhB,iBAAgB,CAChB,iBAAgB,EAAA;AAGjB,sCACC,mBAAkB,EAAA;AAGnB,uCACC,cAAa,EAAA;AAGd,mCACC,kBA30BY,CA20BZ,kBA30BY,EAAA;AA80Bb,+BACC,mBAAkB,EAAA;AAGnB,iCACC,kBAAiB,EAAA;;AAMpB,qBAGG;AAEH,mBACC,qBAAa,CAAb,qBAAa,CAAb,cAAa,CACb,oBAAe,CAAf,gBAAe,CACf,gBAAe,CACf,oBAAmB,CACnB,qBAAoB,EAAA;AAEpB,sBACC,0BAr3Bc,CAs3Bd,cAAa,CACb,oBAAY,CAAZ,qBAAY,CAAZ,aAAY,EAAA;AAGb,0CACC,6BAA4B,CAC5B,uBAAsB,CACtB,mCAAkC,EAAA;AAGnC,qBACC,iBAAgB,CAChB,2BAA0B,CAC1B,qBAAa,CAAb,qBAAa,CAAb,cAAa,CACb,kBAAiB,CACjB,aAAY,CACZ,mBAAkB,EAAA;AAElB,0BACC,yBAAoB,CAApB,qBAAoB,CACpB,YAAW,CACX,yBAA2B,CAA3B,4BAA2B,CAC3B,WAAU,EAAA;AAEV,iCACC,mBAAkB,CAClB,YAAW,CACX,OAAM,CAAE,SAAQ,CAAE,UAAS,CAAE,QAAO,CACpC,6GAAqG,CAArG,0GAAqG,CACrG,YAAW,EAAA;AAIb,6EAEC,gGAAsF,CAAtF,6FAAsF,EAAA;;AAKzF,2BACC,sBAAsB,WAAU,EAAA,EAAA;AAGjC,2BACC,sBAAsB,WAAU,EAAA,EAAA;AAIjC,oBAGG;AAEH,SACC,kBA95Bc,CA85Bd,kBA95Bc,CA+5Bd,0BAAyB,EAAA;;AAG1B,iBACC,gBAAe,EAAA;AAEf,oBACC,mBAAkB,EAAA;AAElB,qEAEC,gCAh8BoB,CAi8BpB,qFAA8D,CAA9D,6EAA8D,EAAA;AAE9D,2EACC,eAv7BU,EAAA;AA47Bb,0BACC,eAAc,CACd,aAAY,CACZ,wDAAiC,CAAjC,gDAAiC,EAAA;AAEjC,8BACC,eAAc,CACd,YAAW,EAAA;AAGZ,uCACC,cAAa,CACb,aAAY,EAAA;AAGb,6BACC,cAAa,CACb,iBAAgB,CAChB,kBAAiB,CACjB,iBAAgB,EAAA;AAEhB,iCACC,kBAAiB,CACjB,iBAAgB,EAAA;AAIlB,iCACC,eA99Ba,CA+9Bb,aAAY,CACZ,sBAAqB,CACrB,mBAAkB,EAAA;AAElB,qCACC,eAAc,CACd,iBAAgB,CAChB,cAAa,EAAA;AAKhB,6BACC,mBAAkB,CAClB,WAAU,CACV,aAAY,CACZ,UAAS,CACT,cAAa,CACb,oBAAmB,CACnB,eAAc,CACd,wBAAuB,CACvB,wBAAuB,EAAA;AAEvB,qEAEC,0BAx/Ba,EAAA;AA0/Bb,6EACC,YAAW,EAAA;AAIb,oCACC,0BA9/B6B,EAAA;AAigC9B,iCACC,eAAc,CACd,cArgCa,EAAA;AAwgCf,+JAIC,eAAc,EAAA;;AAIhB,2BACC,iBACC,qBAAa,CAAb,qBAAa,CAAb,cAAa,CACb,oBAAe,CAAf,gBAAe,CACf,oBAAmB,CACnB,qBAAoB,EAAA;EAEpB,oBACC,cAAa,CACb,YAAW,CACX,oBAAY,CAAZ,qBAAY,CAAZ,aAAY,CACZ,qBAAa,CAAb,qBAAa,CAAb,cAAa,EAAA;EAGd,0BACC,YAAW,EAAA;EAGZ,qBACC,qBAAc,CAAd,eAAc,EAAA,EAAA;AAKjB,2BACC,oBACC,gBAAe,EAAA,EAAA;AAIjB,WACC,gBAAe,CACf,0CAA2B,EAAA;;AAG5B,oBAGG;AAGF,uBACC,mBAAkB,EAAA;AAEnB,2BACC,cAAa,EAAA;;AAIf,YACC,UAAS,CACT,mBAAkB,EAAA;;AAGnB,iBACC,sCAAuB,CACvB,eAAc,CACd,oBAAmB,CACnB,gBAAe,CACf,sBAAqB,CACrB,oBAAmB,CACnB,iBAAgB,EAAA;AAEhB,oBACC,UAAS,CACT,iBAAgB,EAAA;AAGjB,gCACC,kBAAiB,EAAA;AAGlB,yBACC,kBAAiB,EAAA;AAEjB,gCACC,kBAAiB,CACjB,eAAc,CACd,gBAAe,EAAA;AAGhB,gCACC,sBAAqB,CACrB,UAAS,EAAA;AAGV,oCACC,mBAAkB,CAClB,iBAAgB,CAChB,kBA1lCY,CA0lCZ,kBA1lCY,CA2lCZ,eA1mCa,EAAA;;AA+mChB,2BAEC,mBACC,qBAAa,CAAb,qBAAa,CAAb,cAAa,EAAA;EAGd,iBACC,kBAAiB,CACjB,eAAc,CACd,YAAW,EAAA;EAEZ,6BACC,cAAa,EAAA;EAGd,sBACC,iBAAgB,CAChB,iBAAgB,EAAA;EAEhB,2BACC,gBAAe,EAAA,EAAA;AAMlB,oBAGG;AAEH,UACC,mBAAkB,EAAA;AAElB,iBACC,sBAAqB,CACrB,4BAA2B,CAC3B,iEAAU,CAAV,WAAU,CACV,UAAS,CACT,iBAAgB,CAChB,6CAAoC,CAApC,wCAAoC,CAApC,qCAAoC,CACpC,cAAa,EAAA;AAEb,qBACC,eAAc,CACd,iBAAgB,CAChB,eAAc,EAAA;AAIhB,gBACC,cAAa,EAAA;AAEb,iCACC,aAAY,CACZ,mEAAU,CAAV,WAAU,EAAA;AAIZ,sBACC,YAAW,CACX,iBAAgB,CAChB,aAAY,CACZ,mBAAkB,CAClB,gBAAe,EAAA;AAEf,yBACC,gBAAe,CAAf,gBAAe,CACf,sBAAqB,CACrB,YAAc,CAAd,eAAc,CACd,WAAU,CACV,gBAAe,EAAA;AAGhB,0BACC,YAAW,CACX,oBAAmB,CACnB,eAAc,CACd,wBAAuB,CACvB,sCAA6B,CAA7B,8BAA6B,CAC7B,gBAAe,EAAA;;AAKlB,2BACC,qBACC,iBAAgB,EAAA,EAAA;AAIlB,2BACC,qBACC,iBAAgB,EAAA,EAAA;AAKlB,iBAGG;AAEH,iBACC,mBAAkB,CAClB,kBAzsCc,CAysCd,kBAzsCc,EAAA;AA2sCd,yBACC,cAAa,EAAA;AAEb,uCACC,0BApuCwB,EAAA;AAwuC1B,qBACC,YAAW,CACX,eAAc,CACd,qBAAoB,EAAA;;AAItB,cACC,eAAc,CACd,aAAY,CACZ,wDAAiC,CAAjC,gDAAiC,EAAA;AAEjC,uCAEC,gCAvvCqB,CAwvCrB,qFAA8D,CAA9D,6EAA8D,CAC9D,sBAAqB,EAAA;AAErB,6CACC,eA/uCW,EAAA;AAmvCb,2BACC,cAAa,CACb,aAAY,EAAA;AAEZ,0DAEC,cAAa,CACb,iBAAgB,EAAA;AAGjB,kCACC,eApwCa,CAqwCb,gBAAe,CACf,mBAAkB,EAAA;;AAKrB,2BACC,cACC,qBAAa,CAAb,qBAAa,CAAb,cAAa,EAAA;EAEb,kBAAM,oBAAY,CAAZ,qBAAY,CAAZ,aAAY,EAAA;EAClB,iCACC,gBAAe,EAAA,EAAA;AAMlB,iBAGG;AAEH,kBACC,iBAAgB,EAAA;;AAGjB,YACC,gBAAe,CACf,0BAAyB,CACzB,kBAAiB,EAAA;AAEjB,kBAAU,cAAa,EAAA;AAEvB,eACC,sBAAqB,EAAA;AAErB,mBACC,YAAW,CACX,oBAAmB,EAAA;AAGpB,2BACC,gBAAe,EAAA;AACf,iCACC,YAAW,CACX,eAAc,CACd,YAAW,EAAA;AAIb,sBACC,YAAW,CACX,gBAAe,EAAA;AAIjB,6BAEC,aAAY,EAAA;AAGb,qBACC,cAAa,EAAA;AAGd,qBACC,YAAW,CACX,eAAc,EAAA;AAEd,oCACC,YAAW,CACX,eAAc,CACd,iBAAgB,CAChB,mBAAkB,EAAA;AAGnB,0CACC,sBAAqB,EAAA;AAGtB,oCACC,0CAA2B,EAAA;AAG5B,4BACC,kBA50CY,CA40CZ,kBA50CY,EAAA;AAg1Cd,kBACC,0CAA2B,EAAA;AAE3B,qBACC,eAAc,CACd,aAAY,EAAA;AAEZ,gCACC,kBAAiB,EAAA;AAGlB,wBACC,gBAAe,CAAf,gBAAe,CACf,WAAU,EAAA;AAEV,oCACC,iBAAgB,EAAA;AAKnB,4BACC,kBAAiB,CACjB,kBAv2CY,CAu2CZ,kBAv2CY,CAw2CZ,oBAAmB,EAAA;AAEnB,oEAEC,sBAAqB,EAAA;AAGtB,kCACC,eAAc,EAAA;AAKjB,sBACC,oBAAmB,CACnB,oBAAmB,EAAA;AAEpB,yDAEC,sBAAqB,CACrB,uBAAsB,EAAA;AAEvB,6BACC,oBAAmB,CACnB,aAAY,CACZ,WAAU,CACV,UAAS,EAAA;AAET,iCACC,yBAz5CyB,EAAA;AA45C1B,2CACC,0BA/5CoB,EAAA;AAm6CtB,wFAEC,kBA/4Ca,CA+4Cb,kBA/4Ca,CAg5Cb,sBAAqB,CACrB,uBAAsB,CACtB,2BAA0B,EAAA;;AAI5B,2BAEE,6DAGC,mBAAkB,EAAA;EAGnB,kDAEC,YAAW,CACX,oBAAmB,EAAA;EAGpB,6BAEC,eAAc,EAAA;EAGf,0BACC,iBAAgB,EAAA;EAGjB,wBACC,0CAA2B,EAAA;EAG5B,iCACC,gBAAe,CACf,iBAAgB,EAAA;EAGjB,wBACC,YAAW,EAAA;EAEX,oCACC,kBAAiB,EAAA;EAElB,6CACC,iBAAgB,EAAA,EAAA;AAOnB,SACC,sBAAqB,CACrB,kBAAiB,EAAA;;AAMlB,mBACC,oBAAmB,CACnB,sBAAqB,CACrB,gBAAe,CACf,kBAAiB,EAAA;AAEjB,uBACC,kBAAiB,CACjB,gBAAe,CACf,eAAc,CACd,eAAc,CACd,uBAAsB,EAAA;AAGvB,iCACC,kBA39CY,CA29CZ,kBA39CY,CA49CZ,aAAY,CACZ,sBAAyB,CAAzB,0BAAyB,EAAA;;AAM5B,mBAGG;AAEH,UACC,gBAAe,CACf,0BAAyB,EAAA;AAEzB,gBAAU,cAAa,EAAA;AAEvB,4BACC,0CAA2B,CAC3B,2BAA0B,EAAA;AAE1B,wCAAgB,gBAAe,EAAA;AAC/B,uCAAe,iBAAgB,EAAA;AAGhC,aACC,iBAAgB,CAChB,yBAAwB,EAAA;AAExB,sBACC,oBAAmB,CACnB,kBAAiB,EAAA;AAGlB,wBACC,iBAAgB,EAAA;AAIlB,mDAEC,kBAAiB,EAAA;AAGlB,kBACC,oBAAmB,CACnB,kBA3gDa,CA2gDb,kBA3gDa,EAAA;AA6gDb,wBACC,oBAAmB,EAAA;AAGpB,yBACC,kBAAiB,EAAA;AAInB,aACC,oBAAmB,EAAA;AAGpB,yBAEC,aAAY,EAAA;AAGb,aACC,WAAU,CACV,kBAAiB,EAAA;AAGlB,gBACC,YAAW,EAAA;AAGZ,qDAEC,kBAAiB,CACjB,kBA3iDa,CA2iDb,kBA3iDa,EAAA;;AAgjDf,qBAGG;AAEH,WACC,gBAAe,CACf,mBAAkB,CAClB,oBAAmB,CACnB,iCAAgC,EAAA;AAEhC,iBACC,eAAc,CACd,sBAAqB,CACrB,6CAA8B,EAAA;AAE9B,qBACC,eAAc,EAAA;;AAKjB,eACC,qBAAa,CAAb,qBAAa,CAAb,cAAa,CACb,0BAA8B,CAA9B,uBAA8B,CAA9B,+BAA8B,CAC9B,iCAAgC,CAChC,oBAAmB,EAAA;AAEnB,uBACC,cAAa,EAAA;;AAKd,kCAEE,eAAc,EAAA;AAEhB,kBACC,cAAa,EAAA;AAEd,qBACC,sCAA2B,CAC3B,wBAAuB,CACvB,gCAAuB,CAAvB,wBAAuB,CACvB,wBAAuB,EAAA;AAExB,4BACE,0BAAyB,EAAA;AAE3B,4BACE,0BAA0B,EAAA;AAG5B,2EAGC,eAAc,EAAA;AAGf,iBACC,aAAY,EAAA;AAGb,6BACC,sCAvoDqB,CAwoDrB,qBAAoB,EAAA;AAGrB,iBACC,cAAa,EAAA;AAGd,oBACC,qBAAa,CAAb,qBAAa,CAAb,cAAa,CACb,0BAA8B,CAA9B,uBAA8B,CAA9B,+BAA8B,EAAA;AAE9B,wBACC,cAAa,EAAA;;AAKhB,WACC,cAAa,EAAA;AAEb,iBACC,wCAAuC,CACvC,0BAAyB,CACzB,6BAA4B,CAC5B,sCAAuB,CACvB,gBAAe,CAAE,yEAAyE,EAAA;;AAI5F,2BACC,WACC,qBAAa,CAAb,qBAAa,CAAb,cAAa,EAAA,EAAA;AAIf,sBACC,8DAA6D,CAC7D,0BAAyB,EAAA;;AAE1B,4BACC,oEAAmE,CACnE,0BAAyB,EAAA;;AAE1B,qBACC,6DAA4D,CAC5D,0BAAyB,EAAA;;AAE1B,iCACC,8DAA6D,CAC7D,0BAAyB,EAAA;;AAE1B,0BACC,kEAAiE,CACjE,0BAAyB,EAAA","file":"shopkit.css"} \ No newline at end of file +{"version":3,"sources":["shopkit.scss"],"names":[],"mappings":"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","file":"shopkit.css"} \ No newline at end of file diff --git a/site/plugins/shopkit/assets/css/shopkit.scss b/site/plugins/shopkit/assets/css/shopkit.scss index aaed155..a9cda14 100644 --- a/site/plugins/shopkit/assets/css/shopkit.scss +++ b/site/plugins/shopkit/assets/css/shopkit.scss @@ -61,6 +61,8 @@ $warningPale: desaturate(lighten($warning, 30), 10); $success: #2ecc40; $successPale: desaturate(lighten($success, 30), 10); +$danger: #CC1F1A; + $text-s: 0.8rem; $breakpoint-xs-s: 30em; @@ -608,6 +610,10 @@ fieldset { margin-bottom: 3em; } +[aria-invalid="true"]:not(:focus):not(:valid) { + box-shadow: 0 0 0 2px $danger; +} + // Honeypot field .forRobots { visibility: hidden; diff --git a/site/plugins/shopkit/assets/js/cart.js b/site/plugins/shopkit/assets/js/cart.js index 8c03811..ccdec94 100644 --- a/site/plugins/shopkit/assets/js/cart.js +++ b/site/plugins/shopkit/assets/js/cart.js @@ -23,7 +23,7 @@ // Attach listeners to
because its child elements may be replaced by new DOM document.querySelector('main').addEventListener('submit', function(event){ - // Only continue if it's an add/remove action + // Handle add/remove actions with ajax if (event.target.action.value != 'add' && event.target.action.value != 'remove') return true; // Stop standard submit action diff --git a/site/plugins/shopkit/assets/js/expand-collapse-min.js b/site/plugins/shopkit/assets/js/expand-collapse-min.js deleted file mode 100644 index e1bff74..0000000 --- a/site/plugins/shopkit/assets/js/expand-collapse-min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){function e(e){e.style.maxHeight=e.offsetHeight+"px"}if(!!(document.querySelectorAll&&window.addEventListener&&document.documentElement.classList&&document.documentElement.getAttribute&&document.documentElement.setAttribute)){for(var t=document.querySelectorAll("button[aria-expanded]"),n=t.length-1;n>=0;n--){var i=t[n],o=i.nextElementSibling;e(o),window.addEventListener("resize",e(o)),i.style.display="inline-block",console.log(window.location.hash),"#login"==window.location.hash&&"loginform"==i.getAttribute("aria-controls")?document.getElementById("email").focus():i.setAttribute("aria-expanded","false"),i.addEventListener("click",function(){"false"==this.getAttribute("aria-expanded")?(this.setAttribute("aria-expanded","true"),"loginform"==this.getAttribute("aria-controls")&&document.getElementById("email").focus()):this.setAttribute("aria-expanded","false")})}setTimeout(function(){document.documentElement.className+=" animate"},500)}}(); \ No newline at end of file diff --git a/site/plugins/shopkit/blueprints/confirm.yml b/site/plugins/shopkit/blueprints/confirm.yml deleted file mode 100755 index 07551b1..0000000 --- a/site/plugins/shopkit/blueprints/confirm.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Confirm order -pages: false -options: - delete: false - status: false - template: false - url: false -fields: - title: title - text: wysiwyg \ No newline at end of file diff --git a/site/plugins/shopkit/blueprints/order.yml b/site/plugins/shopkit/blueprints/order.yml index cef62de..c2f7e29 100644 --- a/site/plugins/shopkit/blueprints/order.yml +++ b/site/plugins/shopkit/blueprints/order.yml @@ -50,9 +50,14 @@ fields: type: text readonly: true width: 1/2 + taxes: + label: taxes + type: textarea + readonly: true tax: label: tax type: text + help: total tax readonly: true discount: label: discount diff --git a/site/plugins/shopkit/controllers/cart.php b/site/plugins/shopkit/controllers/cart.php index 982aeb7..b201604 100755 --- a/site/plugins/shopkit/controllers/cart.php +++ b/site/plugins/shopkit/controllers/cart.php @@ -31,27 +31,35 @@ if ($action == 'delete') delete($id); } + // Set txn object + $txn = page(s::get('txn')); + // Set country - $countries = page('/shop/countries')->children()->invisible(); - if ($country = get('country')) { + $countries = page('shop/countries')->children()->invisible(); + if ($txn->shipping_address()->isNotEmpty()) { + $txn_shipping_address = $txn->shipping_address()->yaml(); + } else { + $txn_shipping_address = []; + } + if ($country = esc(get('country'))) { // First: See if country was sent through a form submission. - if ($c = $countries->filterBy('countrycode',$country)->first()) { - // Translate country code to UID if needed - $country = $c->uid(); - } - page(s::get('txn'))->update(['country' => $country], $site->defaultLanguage()->code()); + $txn_shipping_address['country'] = $country; + $txn->update(['shipping_address' => yaml::encode($txn_shipping_address)], $site->defaultLanguage()->code()); } else if (page(s::get('txn'))->country()->isNotEmpty()) { // Second option: the country has already been set in the session. // Do nothing. } else if ($user and $user->country() != '') { // Third option: get country from user profile - page(s::get('txn'))->update(['country' => $user->country()], $site->defaultLanguage()->code()); + $txn_shipping_address['country'] = $user->country(); + $txn->update(['shipping_address' => yaml::encode($txn_shipping_address)], $site->defaultLanguage()->code()); } else if ($site->defaultcountry()->isNotEmpty()) { // Fourth option: get default country from site options - page(s::get('txn'))->update(['country' => $site->defaultcountry()], $site->defaultLanguage()->code()); + $txn_shipping_address['country'] = $site->defaultcountry(); + $txn->update(['shipping_address' => yaml::encode($txn_shipping_address)], $site->defaultLanguage()->code()); } else { // Last resort: choose the first available country - page(s::get('txn'))->update(['country' => $countries->first()->uid()], $site->defaultLanguage()->code()); + $txn_shipping_address['country'] = $countries->first()->uid(); + $txn->update(['shipping_address' => yaml::encode($txn_shipping_address)], $site->defaultLanguage()->code()); } // Get shipping rates @@ -75,7 +83,7 @@ } } else if (page(s::get('txn'))->shippingmethod()->isNotEmpty() and !empty($shippingMethods) and !get('country')) { // Second option: the shipping has already been set in the session, and the country hasn't changed - $currentMethod = page(s::get('txn'))->shippingmethod(); + $currentMethod = $txn->shippingmethod(); foreach ($shippingMethods as $key => $method) { if ($currentMethod == $method['title']) { $shippingMethod = $method; @@ -85,7 +93,7 @@ // Last resort: choose the first shipping method $shippingMethod = array_shift($shippingMethods); } - page(s::get('txn'))->update([ + $txn->update([ 'shippingmethod' => $shippingMethod['title'], 'shipping' => $shippingMethod['rate'], ], $site->defaultLanguage()->code()); @@ -94,7 +102,7 @@ $discount = getDiscount(); // Get cart total - $total = cartSubtotal(getItems()) + (float) page(s::get('txn'))->shipping()->value; + $total = cartSubtotal(getItems()) + (float) $txn->shipping()->value; if (!$site->tax_included()->bool()) $total = $total + cartTax()['total']; // Handle discount codes @@ -106,13 +114,14 @@ return [ - 'items' => getItems(), + 'user' => $user, 'countries' => $countries, 'shipping_rates' => $shipping_rates, 'discount' => $discount, 'total' => $total, 'giftCertificate' => $giftCertificate, 'gateways' => $gateways, + 'txn' => $txn ]; } }; \ No newline at end of file diff --git a/site/plugins/shopkit/controllers/confirm.php b/site/plugins/shopkit/controllers/confirm.php deleted file mode 100644 index 975f7cc..0000000 --- a/site/plugins/shopkit/controllers/confirm.php +++ /dev/null @@ -1,96 +0,0 @@ -url()); - - // Prepopulate form details - if (get('payer_name') or get('payer_email') or get('payer_address')) { - // First, get the already-submitted information - $payer_name = get('payer_name'); - $payer_email = get('payer_email'); - $payer_address = get('payer_address'); - } else if ($txn->payer_name()->isNotEmpty() or $txn->payer_email()->isNotEmpty() or $txn->payer_address()->isNotEmpty()) { - // Second, see if there are already payer details in the transaction file - $payer_name = $txn->payer_name(); - $payer_email = $txn->payer_email(); - $payer_address = $txn->payer_address(); - } else if ($user = $site->user()) { - // Third, populate info from the logged in user's profile - $payer_name = $user->firstname().' '.$user->lastname(); - $payer_email = $user->email(); - $payer_address = page('shop/countries/'.$user->country())->title(); - } else { - // Last, leave the fields blank - $payer_name = ''; - $payer_email = ''; - $payer_address = ''; - } - - - - // Validate form submission - if (isset($_POST['txn_id'])) { - $valid = false; - if (get('payer_name') and get('payer_email')) { - if (!$site->mailing_address()->bool()) { - // No address required, we're good. - $valid = true; - } else if ($site->mailing_address()->bool() and get('payer_address')) { - // Address provided, we're good. - $valid = true; - } else { - // No address provided. - $valid = false; - $message = _t('error-address'); - } - } else { - // No name or email provided. - $valid = false; - $message = _t('error-name-email'); - } - - if ($valid) { - // Save customer details to the transaction file (in the default language) - try { - $txn->update([ - 'payer-name' => get('payer_name'), - 'payer-email' => get('payer_email'), - 'payer-address' => get('payer_address'), - ], $site->defaultLanguage()->code()); - - // Notify customer - snippet('mail.order.notify.status', ['txn' => $txn, 'lang' => $site->language()]); - - } catch(Exception $e) { - // Update failed - snippet('mail.order.update.error', [ - 'txn' => $txn, - 'payment_status' => $txn->status(), - 'payer_name' => get('payer_name'), - 'payer_email' => get('payer_email'), - 'payer_address' => get('payer_address'), - 'lang' => $site->language(), - ]); - } - - - // Empty the cart by setting a new txn id - s::destroy(); - - // Redirect to orders page - go(page('shop/orders')->url().'?txn_id='.$txn->txn_id()); - } - } - - // Form is invalid or hasn't been submitted yet - return [ - 'txn' => $txn, - 'payer_name' => $payer_name, - 'payer_email' => $payer_email, - 'payer_address' => $payer_address, - 'message' => isset($message) ? $message : false, - ]; -}; \ No newline at end of file diff --git a/site/plugins/shopkit/controllers/orders.php b/site/plugins/shopkit/controllers/orders.php index efee6ae..c70ad0a 100755 --- a/site/plugins/shopkit/controllers/orders.php +++ b/site/plugins/shopkit/controllers/orders.php @@ -15,6 +15,9 @@ if (get('txn_id') != '') { // If single transaction ID passed, show just that one order $orders = $page->children()->sortBy('txn_date','desc')->filterBy('txn_id',get('txn_id')); + + // Empty the cart by setting a new txn id (successful payment gateway callbacks will end up here) + s::destroy(); } else if ($user and $user->role() == 'admin') { // If admin, show all orders except abandoned $orders = $page->children()->sortBy('txn_date','desc'); diff --git a/site/plugins/shopkit/controllers/process.php b/site/plugins/shopkit/controllers/process.php index c1e5ba9..4ff5016 100644 --- a/site/plugins/shopkit/controllers/process.php +++ b/site/plugins/shopkit/controllers/process.php @@ -8,9 +8,60 @@ // Honeypot trap for robots if (get('subject') != '') go(page('error')->url()); + // Start the validation + $invalidFields = ''; + + // Validate personal details + $fieldsToValidate = [ + 'firstname' => v::minLength(esc(get('firstname')), 1), + 'lastname' => v::minLength(esc(get('lastname')), 1), + 'email' => v::email(esc(get('email'))) + ]; + foreach ($fieldsToValidate as $key => $value) { + if ($value === false) { + $invalidFields .= $key.','; + } + } + + // Validate mailing address + if ($site->mailing_address()->bool()) { + $fieldsToValidate = [ + 'address1' => v::minLength(esc(get('address1')), 1), + 'city' => v::minLength(esc(get('city')), 1), + 'state' => v::minLength(esc(get('state')), 1), + 'postcode' => v::minLength(esc(get('postcode'), 1)) + ]; + foreach ($fieldsToValidate as $key => $value) { + if ($value === false) { + $invalidFields .= $key.','; + } + } + } + // Validate terms and conditions checkbox if ($tc = page('shop/terms-conditions') and $tc->text()->isNotEmpty() and get('tac') !== 'agree') { - go(page('shop/cart')->url().'/valid'.url::paramSeparator().'false/#tac'); + $invalidFields .= 'tac,'; + } + + // Write personal details & mailing address to the transaction file + page(s::get('txn'))->update([ + 'payer-id' => $user ? $user->username() : '', + 'payer-firstname' => esc(get('firstname')), + 'payer-lastname' => esc(get('lastname')), + 'payer-email' => esc(get('email')), + 'shipping-address' => yaml::encode([ + 'address1' => esc(get('address1')), + 'address2' => esc(get('address2')), + 'city' => esc(get('city')), + 'state' => esc(get('state')), + 'country' => esc(get('country')), + 'postcode' => esc(get('postcode')) + ]) + ], $site->defaultLanguage()->code()); + + // Return to cart if there are invalid fields + if ($invalidFields != '') { + go(page('shop/cart')->url().'/invalid'.url::paramSeparator().substr($invalidFields, 0, -1).'#details'); } // Set up variables @@ -37,19 +88,9 @@ 'tax' => number_format(cartTax()['total'],$decimal_places,'.',''), 'taxes' => yaml::encode(cartTax()), 'giftcode' => s::get('giftcode'), - 'giftcertificate' => null !== get('giftCertificateAmount') ? number_format(get('giftCertificateAmount'),$decimal_places,'.','') : '0.00', + 'giftcertificate' => null !== get('giftCertificateAmount') ? number_format(get('giftCertificateAmount'),$decimal_places,'.','') : '0.00' ], $site->defaultLanguage()->code()); - // Add payer info if it's available at this point - if ($user) { - page(s::get('txn'))->update([ - 'payer-id' => $user->username(), - 'payer-name' => $user->firstname().' '.$user->lastname(), - 'payer-email' => $user->email(), - 'payer-address' => page('shop/countries/'.$user->country())->title() - ], $site->defaultLanguage()->code()); - } - // Update the site's giftcard balance if ($giftCertificateRemaining = get('giftCertificateRemaining')) { $certificates = $site->gift_certificates()->yaml(); diff --git a/site/plugins/shopkit/gateways/paylater/callback.php b/site/plugins/shopkit/gateways/paylater/callback.php index 3490ed2..95fb1a0 100644 --- a/site/plugins/shopkit/gateways/paylater/callback.php +++ b/site/plugins/shopkit/gateways/paylater/callback.php @@ -3,34 +3,13 @@ // Set transaction $txn = page('shop/orders/'.param('id')); -// Set email if available -if (get('payer_email') != '') { - try { - // Update transaction record - $txn->update([ - 'payer-email' => get('payer_email'), - ], $site->defaultLanguage()->code()); - } catch(Exception $e) { - // $txn->update() failed - snippet('mail.order.update.error', [ - 'txn' => $txn, - 'payment_status' => 'pending', - 'payer_name' => $txn->payer_name(), - 'payer_email' => get('payer_email'), - 'payer_address' => $txn->payer_email(), - 'lang' => $site->language(), - ]); - return false; - } -} - try { // Update stock and notify staff snippet('order.callback', [ 'txn' => $txn, 'status' => 'pending', 'payer_name' => $txn->payer_name(), - 'payer_email' => get('payer_email') != '' ? get('payer_email') : $txn->payer_email(), + 'payer_email' => $txn->payer_email(), 'payer_address' => $txn->payer_address(), 'lang' => $site->language(), ]); @@ -40,7 +19,7 @@ 'txn' => $txn, 'payment_status' => 'pending', 'payer_name' => $txn->payer_name(), - 'payer_email' => get('payer_email') != '' ? get('payer_email') : $txn->payer_email(), + 'payer_email' => $txn->payer_email(), 'payer_address' => $txn->payer_address(), 'lang' => $site->language(), ]); @@ -49,7 +28,7 @@ go(page('shop/cart')->url()); } -// Go to confirm page -go(page('shop/confirm')->url().'/id'.url::paramSeparator().$txn->txn_id()); +// Continue to order summary +go(page('shop/orders')->url().'?txn_id='.$txn->txn_id()); ?> \ No newline at end of file diff --git a/site/plugins/shopkit/gateways/paylater/process.php b/site/plugins/shopkit/gateways/paylater/process.php index 03c6405..abb342a 100644 --- a/site/plugins/shopkit/gateways/paylater/process.php +++ b/site/plugins/shopkit/gateways/paylater/process.php @@ -1,51 +1 @@ -user(); - - /** - * Variables passed from /shop/cart/process/GATEWAY/TXN_ID - * - * $txn Transaction page object - */ - - if ($user and $user->email() != '') { - // Email is already set - go(page('shop/cart/callback')->url().'/gateway'.url::paramSeparator().'paylater/id'.url::paramSeparator().$txn->txn_id()); - } else { - // Get email so we can send customer notifications - ?> - - - - - <?= $site->title()->html() ?> | <?= page('shop/cart')->title() ?> - - - - -
- - - -
- - - - - -
- -

-
- - - - \ No newline at end of file +url().'/gateway'.url::paramSeparator().'paylater/id'.url::paramSeparator().$txn->txn_id()) ?> \ No newline at end of file diff --git a/site/plugins/shopkit/gateways/paypalexpress/process.php b/site/plugins/shopkit/gateways/paypalexpress/process.php index 0d0812a..ec5338a 100644 --- a/site/plugins/shopkit/gateways/paypalexpress/process.php +++ b/site/plugins/shopkit/gateways/paypalexpress/process.php @@ -1,66 +1,37 @@ - - - - - - <?= $site->title()->html() ?> | <?= page('shop/cart')->title() ?> - - - -

- -
- - - - - - - - - - - - - products()->toStructure() as $i => $item) { ?> - - - - {'sale-amount'}->value != '' ? $item->{'sale-amount'}->value : $item->amount()->value ?> - - - - - - - - - - - - - - - - - - -
- - - - \ No newline at end of file +
+ + + + + + + + + + + + + products()->toStructure() as $i => $item) { ?> + + + + {'sale-amount'}->value != '' ? $item->{'sale-amount'}->value : $item->amount()->value ?> + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/site/plugins/shopkit/gateways/square/callback.php b/site/plugins/shopkit/gateways/square/callback.php index caad120..b25bb61 100644 --- a/site/plugins/shopkit/gateways/square/callback.php +++ b/site/plugins/shopkit/gateways/square/callback.php @@ -138,8 +138,8 @@ 'lang' => $site->language(), ]); - // Continue to confirmation - go(page('shop/confirm')->url().'/id'.url::paramSeparator().$txn->txn_id()); + // Continue to order summary + go(page('shop/orders')->url().'?txn_id='.$txn->txn_id()); } catch(Exception $e) { // Updates or notification failed diff --git a/site/plugins/shopkit/gateways/square/process.php b/site/plugins/shopkit/gateways/square/process.php index cf9e07e..c0bc0ea 100644 --- a/site/plugins/shopkit/gateways/square/process.php +++ b/site/plugins/shopkit/gateways/square/process.php @@ -1,9 +1,7 @@ url()); - // Set variables -$txn = page(s::get('txn')); +$site = site(); +$shipping = $txn->shipping_address()->toStructure(); /** * Variables passed from /shop/cart/process/GATEWAY/TXN_ID @@ -16,204 +14,202 @@ // Get Application ID $application_id = $site->square_status() == 'live' ? $site->square_id_live() : $site->square_id_sandbox(); - ?> - $site, 'page' => page('shop/cart')]) ?> -
-
- $site]) ?> -
-
- : - txn_id() ?> -
-
- : - subtotal()->value + $txn->shipping()->value - $txn->discount()->value - $txn->giftcertificate()->value; - if (!$site->tax_included()->bool()) $total = $total + $txn->tax()->value; - ?> - currency_code() ?> -
-
- - - -
-
- -
-
-
- -
-
-
- -
-
-
+ + + + +
+
+ +
+
+
+ +
- -
+ +
- - -
- - - -
- - - - - - - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - -
-
-
+
+
+ +
shipping_address()->toStructure()->postcode() ?>
+
- \ No newline at end of file + + +
+ + + +
+ + + + + + + + + + + +
+ +
+ + + + + + +
+ +
+ + +
+
\ No newline at end of file diff --git a/site/plugins/shopkit/gateways/stripecheckout/callback.php b/site/plugins/shopkit/gateways/stripecheckout/callback.php index 3a9f20a..79c625a 100644 --- a/site/plugins/shopkit/gateways/stripecheckout/callback.php +++ b/site/plugins/shopkit/gateways/stripecheckout/callback.php @@ -64,8 +64,8 @@ 'lang' => $site->language(), ]); - // Continue to confirmation - go(page('shop/confirm')->url().'/id'.url::paramSeparator().$txn->txn_id().'?payer_email='.$customer->email); + // Continue to order summary + go(page('shop/orders')->url().'?txn_id='.$txn->txn_id()); } catch(Exception $e) { // Updates or notification failed diff --git a/site/plugins/shopkit/gateways/stripecheckout/process.php b/site/plugins/shopkit/gateways/stripecheckout/process.php index 79f0811..b365b5c 100644 --- a/site/plugins/shopkit/gateways/stripecheckout/process.php +++ b/site/plugins/shopkit/gateways/stripecheckout/process.php @@ -1,12 +1,4 @@ $site->stripecheckout_status() == 'sandbox' ? $site->stripecheckout_key_test_publishable() : $site->stripecheckout_key_live_publishable() ]; \Stripe\Stripe::setApiKey($stripe['secret_key']); -?> - - - - - <?= $site->title()->html() ?> | <?= page('shop/cart')->title() ?> - - - - -
- subtotal()->value + $txn->shipping()->value - $txn->discount()->value - $txn->giftcertificate()->value; - if (!$site->tax_included()->bool()) $amount = $amount + $txn->tax()->value; - $amount = number_format($amount, decimalPlaces($site->currency_code()), '', ''); - ?> - - -
- - - -
- -

-
+// Set the total chargeable amount +$amount = $txn->subtotal()->value + $txn->shipping()->value - $txn->discount()->value - $txn->giftcertificate()->value; +if (!$site->tax_included()->bool()) $amount = $amount + $txn->tax()->value; +$amount = number_format($amount, decimalPlaces($site->currency_code()), '', ''); +?> - - - \ No newline at end of file + +
+ + + +
\ No newline at end of file diff --git a/site/plugins/shopkit/languages/de.php b/site/plugins/shopkit/languages/de.php index 0945bf9..9f8a933 100644 --- a/site/plugins/shopkit/languages/de.php +++ b/site/plugins/shopkit/languages/de.php @@ -204,6 +204,8 @@ 'terms-conditions' => 'Ich akzeptiere die', // "Allgemeine Geschäftsbedingungen" wird als Link in der Vorlage angehängt. 'terms-conditions-invalid' => 'Bitte akzeptieren Sie die Allgemeinen Geschäftsbedingungen.', +'country-shipping-help' => 'Wählen Sie aus den Versandoptionen oben', + // site/plugins/shopkit/templates/confirm.php diff --git a/site/plugins/shopkit/languages/en.php b/site/plugins/shopkit/languages/en.php index fdb7463..fb44f90 100644 --- a/site/plugins/shopkit/languages/en.php +++ b/site/plugins/shopkit/languages/en.php @@ -205,6 +205,8 @@ 'terms-conditions' => 'I accept the', // "Terms and Conditions" is appended as a link in the template. 'terms-conditions-invalid' => 'Please accept the Terms and Conditions.', +'country-shipping-help' => 'Select from Shipping options above', + // site/plugins/shopkit/templates/confirm.php diff --git a/site/plugins/shopkit/languages/es.php b/site/plugins/shopkit/languages/es.php index c66827a..4f7210b 100644 --- a/site/plugins/shopkit/languages/es.php +++ b/site/plugins/shopkit/languages/es.php @@ -204,6 +204,8 @@ 'terms-conditions' => 'Acepto los', // "Terms and Conditions" is appended as a link in the template. 'terms-conditions-invalid' => 'Por favor acepte los Términos y Condiciones.', +'country-shipping-help' => 'Seleccione entre las opciones de envío anteriores', + // site/plugins/shopkit/templates/confirm.php diff --git a/site/plugins/shopkit/languages/fr.php b/site/plugins/shopkit/languages/fr.php index 91c2359..0e489de 100644 --- a/site/plugins/shopkit/languages/fr.php +++ b/site/plugins/shopkit/languages/fr.php @@ -206,6 +206,9 @@ 'terms-conditions' => 'J\'accepte les', // "Conditions" sera ajouté par le template 'terms-conditions-invalid' => 'SVP acceptez les Conditions.', +'country-shipping-help' => 'Sélectionnez parmi les options de transport ci-dessus', + + // site/plugins/shopkit/templates/confirm.php 'order-details' => 'Détails de la commande', diff --git a/site/plugins/shopkit/registry/blueprints.php b/site/plugins/shopkit/registry/blueprints.php index af2fb8e..702c64d 100644 --- a/site/plugins/shopkit/registry/blueprints.php +++ b/site/plugins/shopkit/registry/blueprints.php @@ -10,7 +10,6 @@ // Register blueprints $kirby->set('blueprint', 'cart', __DIR__.DS.'..'.DS.'blueprints'.DS.'cart.yml'); $kirby->set('blueprint', 'category', __DIR__.DS.'..'.DS.'blueprints'.DS.'category.yml'); -$kirby->set('blueprint', 'confirm', __DIR__.DS.'..'.DS.'blueprints'.DS.'confirm.yml'); $kirby->set('blueprint', 'contact', __DIR__.DS.'..'.DS.'blueprints'.DS.'contact.yml'); $kirby->set('blueprint', 'countries', __DIR__.DS.'..'.DS.'blueprints'.DS.'countries.yml'); $kirby->set('blueprint', 'country', __DIR__.DS.'..'.DS.'blueprints'.DS.'country.yml'); diff --git a/site/plugins/shopkit/registry/controllers.php b/site/plugins/shopkit/registry/controllers.php index 742e852..f9ae16e 100644 --- a/site/plugins/shopkit/registry/controllers.php +++ b/site/plugins/shopkit/registry/controllers.php @@ -3,7 +3,6 @@ // Register controllers $kirby->set('controller', 'cart', __DIR__.DS.'..'.DS.'controllers'.DS.'cart.php'); $kirby->set('controller', 'category', __DIR__.DS.'..'.DS.'controllers'.DS.'category.php'); -$kirby->set('controller', 'confirm', __DIR__.DS.'..'.DS.'controllers'.DS.'confirm.php'); $kirby->set('controller', 'orders', __DIR__.DS.'..'.DS.'controllers'.DS.'orders.php'); $kirby->set('controller', 'product', __DIR__.DS.'..'.DS.'controllers'.DS.'product.php'); $kirby->set('controller', 'process', __DIR__.DS.'..'.DS.'controllers'.DS.'process.php'); diff --git a/site/plugins/shopkit/registry/snippets.php b/site/plugins/shopkit/registry/snippets.php index 6179d94..e7c6696 100644 --- a/site/plugins/shopkit/registry/snippets.php +++ b/site/plugins/shopkit/registry/snippets.php @@ -25,6 +25,7 @@ $kirby->set('snippet', 'menu.user', __DIR__.DS.'..'.DS.'snippets'.DS.'menu.user.php'); $kirby->set('snippet', 'notifications', __DIR__.DS.'..'.DS.'snippets'.DS.'notifications.php'); $kirby->set('snippet', 'order.callback', __DIR__.DS.'..'.DS.'snippets'.DS.'order.callback.php'); +$kirby->set('snippet', 'order.details', __DIR__.DS.'..'.DS.'snippets'.DS.'order.details.php'); $kirby->set('snippet', 'order.pdf', __DIR__.DS.'..'.DS.'snippets'.DS.'order.pdf.php'); $kirby->set('snippet', 'search', __DIR__.DS.'..'.DS.'snippets'.DS.'search.php'); $kirby->set('snippet', 'sidebar', __DIR__.DS.'..'.DS.'snippets'.DS.'sidebar.php'); diff --git a/site/plugins/shopkit/registry/templates.php b/site/plugins/shopkit/registry/templates.php index 1eb8b92..65b202a 100644 --- a/site/plugins/shopkit/registry/templates.php +++ b/site/plugins/shopkit/registry/templates.php @@ -4,7 +4,6 @@ $kirby->set('template', 'cart', __DIR__.DS.'..'.DS.'templates'.DS.'cart.php'); $kirby->set('template', 'callback', __DIR__.DS.'..'.DS.'templates'.DS.'callback.php'); $kirby->set('template', 'category', __DIR__.DS.'..'.DS.'templates'.DS.'category.php'); -$kirby->set('template', 'confirm', __DIR__.DS.'..'.DS.'templates'.DS.'confirm.php'); $kirby->set('template', 'contact', __DIR__.DS.'..'.DS.'templates'.DS.'contact.php'); $kirby->set('template', 'countries', __DIR__.DS.'..'.DS.'templates'.DS.'countries.php'); $kirby->set('template', 'country', __DIR__.DS.'..'.DS.'templates'.DS.'country.php'); diff --git a/site/plugins/shopkit/shopkit.php b/site/plugins/shopkit/shopkit.php index d7826d0..d0d6c12 100755 --- a/site/plugins/shopkit/shopkit.php +++ b/site/plugins/shopkit/shopkit.php @@ -40,8 +40,16 @@ $txn->update(['txn-id' => s::id()], $site->defaultLanguage()->code()); $txn->move(s::id()); s::remove('oldid'); - if ($user and $user->country() != '') { - $txn->update(['country' => $user->country()], $site->defaultLanguage()->code()); + + // Add user information if it's available + if ($user) { + $txn->update([ + 'payer-id' => $user->username(), + 'payer-firstname' => $user->firstname(), + 'payer-lastname' => $user->lastname(), + 'payer-email' => $user->email(), + 'country' => $user->country() + ], $site->defaultLanguage()->code()); } } @@ -162,6 +170,18 @@ function add($id, $quantity) { 'session-start' => $timestamp, 'session-end' => $timestamp ], $site->defaultLanguage()->code()); + + // Add user information if it's available + if ($user = $site->user()) { + page('shop/orders/'.s::id())->update([ + 'payer-id' => $user->username(), + 'payer-firstname' => $user->firstname(), + 'payer-lastname' => $user->lastname(), + 'payer-email' => $user->email(), + 'country' => $user->country() + ], $site->defaultLanguage()->code()); + } + s::set('txn', 'shop/orders/'.s::id()); } diff --git a/site/plugins/shopkit/snippets/order.details.php b/site/plugins/shopkit/snippets/order.details.php new file mode 100644 index 0000000..23e2e7b --- /dev/null +++ b/site/plugins/shopkit/snippets/order.details.php @@ -0,0 +1,110 @@ + + +

+ +

: txn_id() ?>

+ +

+ payer_firstname() ?> payer_lastname() ?> (payer_email() ?>) + mailing_address()->bool()) { ?> +
+ shipping_address()->toStructure()->address1() ?>
+ shipping_address()->toStructure()->address2()->isNotEmpty() ? $txn->shipping_address()->toStructure()->address2().'
' : '' ?> + shipping_address()->toStructure()->city() ?>, shipping_address()->toStructure()->state() ?>
+ shipping_address()->toStructure()->country() ?>
+ shipping_address()->toStructure()->postcode() ?> + +

+ +
+ + + + + + + + + + + products()->toStructure() as $item) { ?> + + + + + + + + + + + + + + + + + + + + + + taxes()->yaml() as $tax_rate => $tax_amt) { ?> + + + + + + + + + discount()->value > 0) { ?> + + + + + + + + giftcertificate()->value > 0) { ?> + + + + + + + + + + + + + +
+ name() ?>
+ sku()->isNotEmpty(), 'SKU '.$item->sku().' / ') ?> + variant()->isNotEmpty(), $item->variant()) ?> + option()->isNotEmpty(), ' / '.$item->option()) ?> +
quantity() ?> + {'sale-amount'}->value === false) { + echo formatPrice(($item->amount()->value) * $item->quantity()->value); + } else { + echo ''.formatPrice($item->amount()->value * $item->quantity()->value).'
'; + echo formatPrice($item->{'sale-amount'}->value * $item->quantity()->value); + } + ?> +
subtotal()->value) ?>
+
+ + shipping_address()->toStructure()->country() ?> – shippingmethod() ?> + +
shipping()->value) ?>
%
discount()->value) ?>
giftcertificate()->value) ?>
+ subtotal()->value + $txn->shipping()->value - $txn->discount()->value - $txn->giftcertificate()->value; + if (!$site->tax_included()->bool()) $total = $total + $txn->tax()->value; + ?> + currency_code() ?> + +
+
\ No newline at end of file diff --git a/site/plugins/shopkit/snippets/order.pdf.php b/site/plugins/shopkit/snippets/order.pdf.php index bdc0c24..04b3f73 100644 --- a/site/plugins/shopkit/snippets/order.pdf.php +++ b/site/plugins/shopkit/snippets/order.pdf.php @@ -36,69 +36,47 @@ $html .= '
'; -$html .= '

'._t('invoice').' No. '.$p->txn_id()->value.' ('._t($p->status()->value).')

'; +$html .= '

'._t('transaction-id').' No. '.$p->txn_id()->value.' ('._t($p->status()->value).')

'; + $html .= '

'.date('F j, Y H:i',$p->txn_date()->value).'

'; -$html .= '

'._t('bill-to').'
'; -if ($p->payer_name() != '') $html .= $p->payer_name()->value.'
'; -$html .= $p->payer_email()->value.'

'; -$html .= $p->payer_address()->kirbytext(); $html .= '
'; if (strpos($p->products(),'uri:')) { - // Show product overview - foreach ($p->products()->toStructure() as $product) { - $html .= '

'.$product->name().'
'.$product->variant(); - $html .= $product->option()->isNotEmpty() ? ' / '.$product->option() : ''; - $html .= ' / '._t('qty').$product->quantity(); - $html .= ''; - - // Include license keys - if ($product->{'license-keys'}->value and in_array($p->status(), ['paid', 'shipped'])) { - $html .= "
"._t('license-keys').': '; - foreach ($product->{'license-keys'} as $key => $license_key) { - $html .= $license_key; - if (count($product->{'license-keys'}) - 1 !== $key) { - $html .= ' | '; - } - } - $html .= ''; - } - - $html .= '

'; - } + $html .= snippet('order.details', ['txn' => $p], true); } else { + $html .= '

'._t('bill-to').'
'; + if ($p->payer_name() != '') $html .= $p->payer_name()->value.'
'; + $html .= $p->payer_email()->value.'

'; + $html .= $p->payer_address()->kirbytext(); // Old transaction files from Shopkit 1.0.5 and earlier $html .= $p->products()->kirbytext()->bidi(); -} - -$html .= '
'; -$html .= '

'._t('subtotal').': '.formatPrice($p->subtotal()->value).'

'; -$html .= '

'._t('discount').': '.formatPrice($p->discount()->value).'

'; -$html .= '

'._t('shipping').': '.formatPrice($p->shipping()->value).'

'; - -if ($p->taxes()->value) { - // List each tax rate separately - foreach ($p->taxes()->toStructure() as $key => $value) { - if ($key === 'total') { - if ($p->taxes()->toStructure()->count() > 1) { - continue; - } else { - $html .= '

'._t('tax').': '.formatPrice($value->value).'

'; + $html .= '
'; + $html .= '

'._t('subtotal').': '.formatPrice($p->subtotal()->value).'

'; + $html .= '

'._t('discount').': '.formatPrice($p->discount()->value).'

'; + $html .= '

'._t('shipping').': '.formatPrice($p->shipping()->value).'

'; + if ($p->taxes()->value) { + // List each tax rate separately + foreach ($p->taxes()->toStructure() as $key => $value) { + if ($key === 'total') { + if ($p->taxes()->toStructure()->count() > 1) { + continue; + } else { + $html .= '

'._t('tax').': '.formatPrice($value->value).'

'; + } } + $html .= '

'._t('tax').' '.((float) $key * 100).'%: '.formatPrice($value->value).'

'; } - $html .= '

'._t('tax').' '.((float) $key * 100).'%: '.formatPrice($value->value).'

'; + } else { + // Fallback for old tax structure (single total only) + $html .= '

'._t('tax').': '.formatPrice($p->tax()->value).'

'; } -} else { - // Fallback for old tax structure (single total only) - $html .= '

'._t('tax').': '.formatPrice($p->tax()->value).'

'; -} - -$total = (float) $p->subtotal()->value + (float) $p->shipping()->value - (float) $p->discount()->value; -if (!$site->tax_included()->bool()) $total = $total + (float) $p->tax()->value; -$html .= '

'._t('total').': '.formatPrice($total).'

';; -$html .= '

'._t('gift-certificate').': – '.formatPrice($p->giftcertificate()->value).'

'; + $total = (float) $p->subtotal()->value + (float) $p->shipping()->value - (float) $p->discount()->value; + if (!$site->tax_included()->bool()) $total = $total + (float) $p->tax()->value; + $html .= '

'._t('total').': '.formatPrice($total).'

'; + $html .= '

'._t('gift-certificate').': – '.formatPrice($p->giftcertificate()->value).'

'; +} // Load the html $dompdf->loadHtml($html); diff --git a/site/plugins/shopkit/templates/cart.php b/site/plugins/shopkit/templates/cart.php index 9219098..1fcbefd 100644 --- a/site/plugins/shopkit/templates/cart.php +++ b/site/plugins/shopkit/templates/cart.php @@ -9,7 +9,7 @@ text()->kirbytext() ?> -products()->toStructure()->count() === 0) { ?> +products()->toStructure()->count() === 0) { ?>

@@ -28,7 +28,7 @@ - $item) { ?> + $item) { ?> uri()) ?> @@ -134,7 +134,7 @@
shippingmethod() == $rate['title'],'checked') ?>> + shippingmethod() == $rate['title'],'checked') ?>> @@ -216,7 +216,7 @@ - +
@@ -232,13 +232,68 @@ + +

+ +
+ + + + + +
+ + mailing_address()->bool()) { ?> +

+ +
+ + + + + + + + + + + +
+ + text()->isNotEmpty()) { ?> diff --git a/site/plugins/shopkit/templates/confirm.php b/site/plugins/shopkit/templates/confirm.php deleted file mode 100644 index f09b961..0000000 --- a/site/plugins/shopkit/templates/confirm.php +++ /dev/null @@ -1,60 +0,0 @@ - -
- -
- -

title() ?>

- -text()->kirbytext()->bidi() ?> - -

- -
    - products()->toStructure() as $product) { ?> -
  • - name() ?> / variant() ?> option() != '' ? '/ '.$product->option() : '' ?> / quantity() ?> -
  • - -
  • - subtotal()->value + (float) $txn->shipping()->value - (float) $txn->discount()->value; ?> - : currency_code() ?> -
  • -
- -

- - -
- -
- - - - - - - - - - - - - - - - -
-
- - \ No newline at end of file diff --git a/site/plugins/shopkit/templates/process.php b/site/plugins/shopkit/templates/process.php index 1c3cf5c..3b7e8ec 100644 --- a/site/plugins/shopkit/templates/process.php +++ b/site/plugins/shopkit/templates/process.php @@ -1 +1,15 @@ - $txn]) ?> \ No newline at end of file + $site, 'page' => page('shop/cart')]) ?> +
+
+ + ← Back to cart + + $site]) ?> + + $txn]) ?> + + $txn]) ?> + +
+
+ \ No newline at end of file