This commit is contained in:
Loretta 2025-09-02 13:15:26 +02:00
commit af70b60273
110 changed files with 25346 additions and 0 deletions

View File

@ -83,6 +83,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nop.Plugin.Misc.SignalRApi"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nop.Plugin.Misc.FruitBankPlugin", "..\Nopcommerce.Common\4.70\Plugins\Nop.Plugin.Misc.AIPlugin\Nop.Plugin.Misc.FruitBankPlugin.csproj", "{3E893AC2-29F1-48FC-B33F-F73C6EE2BE90}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nop.Plugin.Misc.MangoCore", "..\Nopcommerce.Common\4.70\Plugins\Nop.Plugin.Misc.MangoCore\Nop.Plugin.Misc.MangoCore.csproj", "{3976CB1D-8080-4B84-8C01-1F98BFCAF2B3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -479,6 +481,18 @@ Global
{3E893AC2-29F1-48FC-B33F-F73C6EE2BE90}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{3E893AC2-29F1-48FC-B33F-F73C6EE2BE90}.Release|x86.ActiveCfg = Release|Any CPU
{3E893AC2-29F1-48FC-B33F-F73C6EE2BE90}.Release|x86.Build.0 = Release|Any CPU
{3976CB1D-8080-4B84-8C01-1F98BFCAF2B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3976CB1D-8080-4B84-8C01-1F98BFCAF2B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3976CB1D-8080-4B84-8C01-1F98BFCAF2B3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{3976CB1D-8080-4B84-8C01-1F98BFCAF2B3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{3976CB1D-8080-4B84-8C01-1F98BFCAF2B3}.Debug|x86.ActiveCfg = Debug|Any CPU
{3976CB1D-8080-4B84-8C01-1F98BFCAF2B3}.Debug|x86.Build.0 = Debug|Any CPU
{3976CB1D-8080-4B84-8C01-1F98BFCAF2B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3976CB1D-8080-4B84-8C01-1F98BFCAF2B3}.Release|Any CPU.Build.0 = Release|Any CPU
{3976CB1D-8080-4B84-8C01-1F98BFCAF2B3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{3976CB1D-8080-4B84-8C01-1F98BFCAF2B3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{3976CB1D-8080-4B84-8C01-1F98BFCAF2B3}.Release|x86.ActiveCfg = Release|Any CPU
{3976CB1D-8080-4B84-8C01-1F98BFCAF2B3}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -519,6 +533,8 @@ Global
{6B8063A1-3E1C-5775-A93B-FA498F2CC1F4} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
{300D2B68-B626-E8D1-4BBE-BBBE6EF0314C} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
{6F3A2969-6F87-CC4B-1197-B035C9DF40E6} = {0742FDF3-0F2E-4C64-9521-E58A7FF2ED26}
{3E893AC2-29F1-48FC-B33F-F73C6EE2BE90} = {0742FDF3-0F2E-4C64-9521-E58A7FF2ED26}
{3976CB1D-8080-4B84-8C01-1F98BFCAF2B3} = {0742FDF3-0F2E-4C64-9521-E58A7FF2ED26}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {EE72A8B2-332A-4175-9319-6726D36E9D25}

View File

@ -106,6 +106,22 @@
{
"SystemName": "Misc.FruitBankPlugin",
"Version": "1.00"
},
{
"SystemName": "Misc.MangoCorePlugin",
"Version": "1.00"
},
{
"SystemName": "NopStation.Core",
"Version": "4.80.1.0"
},
{
"SystemName": "NopStation.Plugin.Theme.CarHaven",
"Version": "4.80.1.0"
},
{
"SystemName": "NopStation.Plugin.Widgets.CategoryBanners",
"Version": "4.80.1.0"
}
],
"PluginNamesToUninstall": [],

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,120 @@
body {
font: normal 9pt Arial, Helvetica, sans-serif;
color: #000;
}
table {
width: 100%;
border: 0;
border-collapse: collapse;
border-spacing: 0;
}
li {
list-style: none;
}
a {
color: inherit;
}
.order-details-page .order-overview {
margin: 0 0 25px;
}
.order-details-page .order-overview .order-number {
font-size: 11pt;
text-transform: uppercase;
padding-block: 10px;
}
.order-details-page .order-overview-content li {
margin: 5px 0;
}
.order-details-page .order-overview .order-total strong {
font-size: 10pt;
}
.order-details-page .order-details-area {
margin: 0 0 25px;
overflow: hidden;
display: flex;
}
.order-details-page ul {
padding-inline-start: 0px;
}
.order-details-page .order-details-area > div {
flex: 1 0 auto;
margin-bottom: 40px;
margin-block-end: 1%;
}
.order-details-page .order-details-area li.title {
margin: 10px 0 5px;
font-weight: bold;
}
.order-details-page .order-details-area li:first-child {
margin-top: 0;
}
.order-details-page .data-table {
border: 1px solid;
}
.order-details-page .data-table th {
border: 1px solid;
padding: 5px 10px;
font-weight: bold;
white-space: nowrap;
}
.order-details-page .data-table td {
border: 1px solid;
padding: 5px 10px;
}
.order-details-page .data-table .sku,
.order-details-page .data-table .picture,
.order-details-page .data-table .unit-price,
.order-details-page .data-table .quantity,
.order-details-page .data-table .total {
white-space: nowrap;
text-align: center;
}
.order-details-page .data-table .unit-price,
.order-details-page .data-table .quantity,
.order-details-page .data-table .total {
width: 15%;
}
.order-details-page .data-table label {
display: none;
}
.order-details-page .section {
margin: 30px 0;
}
.order-details-page .section .title {
margin: 0 0 10px;
}
.order-details-page .section.totals {
display: flex;
justify-content: flex-end;
}
.order-details-page .tax-shipping-info,
.order-details-page .selected-checkout-attributes {
margin: 20px 0;
text-align:end;
}
.order-details-page .cart-total-right {
white-space: nowrap;
}
.order-details-page .cart-total td {
padding-inline-start: 10px;
padding-block: 5px;
text-align: end;
}
.order-details-page td.cart-total-left {
font-weight: bold;
text-align: start;
}
.order-details-page .total-info
{
min-width: 200px;
}

View File

@ -0,0 +1,469 @@

@media all and (max-width: 1000px) {
.inputs .gender,
.inputs label {
text-align: left;
display: block;
max-width: 400px;
margin-inline: auto;
}
.inputs .gender span > * {
margin: 0 6px 0 0;
}
.login-page .customer-blocks > div {
max-width: 100%;
}
.header .header-upper {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
width: 100%;
background: var(--dark-bg);
padding: 10px;
}
.header .header-upper .header-logo {
display: flex;
align-items: center;
justify-content: center;
gap: 20px;
}
.header .header-upper .header-logo .header-menu-toggle {
display: block;
font-size: 26px;
color: var(--dark);
cursor: pointer;
background: none;
border: none;
}
.header .header-upper .header-logo > a {
max-width: 110px;
}
.header .header-upper > div {
order: 1;
}
.header .header-upper > .search-box {
order: 2;
width: 100%;
padding-top: 10px;
}
.header .header-upper .search-box input.search-box-text {
width: calc(100% - 46px);
}
.header .header-selectors-wrapper {
display: none;
}
#topcartlink {
margin: 0;
}
#topcartlink .cart-label {
display: none;
}
.header-links-wrapper {
padding: 0;
}
.header-links > ul {
display: flex;
justify-content: flex-end;
align-items: center;
gap: 10px;
}
.user-dropdown ul {
transform: translateX(-50%);
}
.user-dropdown .fa {
line-height: 16px;
}
/*** GLOBAL TABLES ***/
.cart {
display: block;
}
.cart colgroup,
.cart thead {
display: none;
}
.cart tbody {
display: block;
overflow: hidden;
}
.cart tr {
display: block;
float: left;
width: 100%;
margin: 40px 0 0;
border: 1px solid #ddd;
}
.cart td {
display: block;
border: none;
padding: 10px;
}
.cart td.remove-from-cart {
margin: 0 0 15px;
border-bottom: 1px solid #ddd;
background-color: #eee;
padding: 10px;
}
.cart td.product-picture {
border-top: 1px solid #ddd;
padding: 15px 10px 5px;
}
.cart td.product {
min-width: 0;
border-bottom: 1px solid #ddd;
padding: 5px 10px 15px;
text-align: center;
}
.cart td.quantity {
display: block;
padding: 0 10px;
vertical-align: middle;
}
.cart td.quantity label {
display: block;
margin-bottom: 10px;
}
.cart td.unit-price,
.cart td.subtotal {
display: inline-block;
padding: 20px 10px;
vertical-align: middle;
}
.order-details-page .data-table {
display: block;
}
.order-details-page .data-table colgroup,
.order-details-page .data-table thead {
display: none;
}
.order-details-page .data-table tbody {
display: block;
overflow: hidden;
}
.order-details-page .data-table tr {
display: block;
float: left;
width: 100%;
margin: 40px 0 0;
border: 1px solid #ddd;
}
.order-details-page .data-table td {
display: block;
border: none;
padding: 10px;
}
.order-details-page .data-table td.product,
.order-details-page .data-table td.tracking-number {
min-width: 0;
border-bottom: 1px solid #ddd;
padding: 5px 10px 15px;
text-align: center;
}
/*** MOBILE NAVIGATION ***/
.menu-toggle {
background: var(--theme-color) url('../images/menu-icon.png') right center no-repeat;
padding: 15px;
font-size: 15px;
font-weight: bold;
color: #fff;
text-transform: uppercase;
cursor: pointer;
}
.top-menu.notmobile {
display: none;
}
.header-menu {
position: fixed;
top: 0;
left: -110vw; /* Initially hidden */
width: 100%;
max-width: 350px;
height: 100%;
background-color: #fff;
box-shadow: 2px 0 5px rgba(0, 0, 0, 0.2);
overflow-y: auto;
transition: left 0.3s ease-in-out;
z-index: 1000;
padding: 40px 10px;
border-radius: var(--itembox-picture-radius);
border-top-left-radius: 0;
}
.close-header-menu {
position: absolute;
top: 4px;
right: 4px;
width: 36px;
height: 36px;
padding: 2px;
font-size: 18px;
color: var(--theme-color);
background: var(--dark-bg);
border: none;
text-transform: uppercase;
cursor: pointer;
}
.header-menu.show {
left: 0; /* Slide in when class "show" is added */
}
.top-menu > li {
position: relative;
margin: 1px 0;
background-color: #f6f6f6;
}
.top-menu > li > a {
display: block;
min-height: 55px;
padding: 18px;
font-size: 15px;
color: #555;
}
.top-menu > li > a:focus {
position: relative;
z-index: 1;
}
.top-menu .sublist {
background-color: #fff;
padding: 0;
position: fixed;
top: 0;
left: -110vw;
width: 100%;
max-width: 350px;
transition: all 0.3s ease-in-out;
height: 100%;
overflow-y: auto;
z-index: 1001;
}
.top-menu .sublist.active {
left: 0;
}
.top-menu .sublist li:not(:last-child) {
border-bottom: 1px solid #ddd;
position: relative;
}
.top-menu .sublist li a {
display: block;
padding: 15px 18px;
font-size: 15px;
}
.sublist-toggle {
position: absolute;
top: 0;
right: 0;
width: 55px;
height: 55px;
border-left: 1px solid #fff;
padding: 15px;
font-size: 15px;
font-weight: bold;
color: var(--dark);
text-transform: uppercase;
cursor: pointer;
font-family: FontAwesome;
display: flex;
justify-content: center;
align-items: center;
}
.sublist-toggle::after {
content: "\f061";
font-weight: lighter;
}
.sublist .sublist-toggle {
height: 49px;
}
.sublist .sublist li {
background-color: #f6f6f6;
}
.sublist .sublist .sublist li {
background-color: #fff;
}
.block-category-navigation {
display: none;
}
.block-account-navigation {
float: none;
margin: auto !important;
}
.write-review .review-rating {
text-align: center;
}
.write-review .review-rating div.name-description {
width: 100%;
margin: 0 5px 0 0;
text-align: center;
}
.product-review-box {
width: fit-content;
}
.page-title {
display: flex;
justify-content: space-between;
}
.user-dropdown .user-dropdown-toggle {
font-size: 0;
line-height: 1;
min-width: 70px;
}
.user-dropdown .fa {
margin: 0;
}
.header-links li {
margin: 0;
}
.top-menu .sublist .parent-links {
display: flex;
justify-content: flex-start;
align-items: stretch;
background: var(--dark);
color: var(--white);
margin: 0;
position: relative;
}
.top-menu .sublist .parent-links a {
width: calc(100% - 30px);
padding-block: 10px;
}
.top-menu .sublist .parent-links .close-sublist {
position: absolute;
top: 0;
right: 0;
width: 40px;
height: 40px;
padding: 5px;
font-size: 18px;
color: var(--white);
background: var(--dark-bg);
border: none;
text-transform: uppercase;
cursor: pointer;
line-height: 1;
border-left: 1px solid #888;
}
/*side bar for filter on catalog page*/
.sidebar-toggle-btn {
background: none;
border: none;
font-size: 30px;
color: #333;
cursor: pointer;
transition: color 0.3s ease;
margin-left: auto;
}
.sidebar-toggle-btn:hover {
color: #007bff; /* Change to your preferred color on hover */
}
.side-2 {
position: fixed;
top: 0;
left: -102vw;
width: 320px;
max-width: 100%;
height: 100%;
background: #fff;
transition: left 0.3s ease-in-out;
z-index: 1001;
padding: 50px 20px 20px;
overflow: auto;
}
.side-2.sidebar-open {
left: 0;
}
/* Sidebar close button styles */
.side-2 .sidebar-close-btn {
position: absolute;
top: 4px;
right: 4px;
width: 36px;
height: 36px;
padding: 2px;
font-size: 18px;
color: var(--theme-color);
background: var(--dark-bg);
border: 0;
text-transform: uppercase;
cursor: pointer;
}
.side-2 .sidebar-close-btn:hover {
color: #f44336; /* Red color when hovered */
}
/* Overlay styles */
.sidebar-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
opacity: 0;
visibility: hidden;
transition: opacity 0.3s ease-in-out;
z-index: 1000;
}
.sidebar-overlay.overlay-active {
opacity: 1;
visibility: visible;
}
/*welcome topics*/
.welcome-container {
grid-template-columns: 1fr;
text-align: center;
gap: 10px;
}
.welcome-text {
text-align: center;
background: rgba(255,255,255,0.75);
padding: 20px;
}
/*********** Homepage Features ***********/
.feature-item {
flex-direction: column !important;
text-align: center;
gap: 20px;
}
.feature-item img, .feature-content {
width: 100%;
}
.home-page-category-grid .title, .sub-category-grid .title {
font-size: 18px;
}
}

View File

@ -0,0 +1,503 @@

@media all and (max-width: 1000px) {
.inputs .gender,
.inputs label {
text-align: right;
display: block;
max-width: 400px;
margin-inline: auto;
}
.inputs .gender span > * {
margin: 0 0 0 6px;
}
.login-page .customer-blocks > div {
max-width: 100%;
}
.header .header-upper {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
width: 100%;
background: var(--dark-bg);
padding: 10px;
}
.header .header-upper .header-logo {
display: flex;
align-items: center;
justify-content: center;
gap: 20px;
}
.header .header-upper .header-logo .header-menu-toggle {
display: block;
font-size: 26px;
color: var(--dark);
cursor: pointer;
background: none;
border: none;
}
.header .header-upper .header-logo > a {
max-width: 110px;
}
.header .header-upper > div {
order: 1;
}
.header .header-upper > .search-box {
order: 2;
width: 100%;
padding-top: 10px;
}
.header .header-upper .search-box input.search-box-text {
width: calc(100% - 46px);
}
.header .header-selectors-wrapper {
display: none;
}
#topcartlink {
margin: 0;
}
#topcartlink .cart-label {
display: none;
}
.header-links-wrapper {
padding: 0;
}
.header-links > ul {
display: flex;
justify-content: flex-end;
align-items: center;
gap: 10px;
}
.user-dropdown ul {
transform: translateX(50%);
}
.user-dropdown .fa {
line-height: 16px;
}
/*** GLOBAL TABLES ***/
.cart {
display: block;
}
.cart colgroup,
.cart thead {
display: none;
}
.cart tbody {
display: block;
overflow: hidden;
}
.cart tr {
display: block;
float: right;
width: 100%;
margin: 40px 0 0;
border: 1px solid #ddd;
}
.cart td {
display: block;
border: none;
padding: 10px;
}
.cart td.remove-from-cart {
margin: 0 0 15px;
border-bottom: 1px solid #ddd;
background-color: #eee;
padding: 10px;
}
.cart td.product-picture {
border-top: 1px solid #ddd;
padding: 15px 10px 5px;
}
.cart td.product {
min-width: 0;
border-bottom: 1px solid #ddd;
padding: 5px 10px 15px;
text-align: center;
}
.cart td.quantity {
display: block;
padding: 0 10px;
vertical-align: middle;
}
.cart td.quantity label {
display: block;
margin-bottom: 10px;
}
.cart td.unit-price,
.cart td.subtotal {
display: inline-block;
padding: 20px 10px;
vertical-align: middle;
}
.order-details-page .data-table {
display: block;
}
.order-details-page .data-table colgroup,
.order-details-page .data-table thead {
display: none;
}
.order-details-page .data-table tbody {
display: block;
overflow: hidden;
}
.order-details-page .data-table tr {
display: block;
float: right;
width: 100%;
margin: 40px 0 0;
border: 1px solid #ddd;
}
.order-details-page .data-table td {
display: block;
border: none;
padding: 10px;
}
.order-details-page .data-table td.product,
.order-details-page .data-table td.tracking-number {
min-width: 0;
border-bottom: 1px solid #ddd;
padding: 5px 10px 15px;
text-align: center;
}
/*** MOBILE NAVIGATION ***/
.menu-toggle {
background: var(--theme-color) url('../images/menu-icon.png') left center no-repeat;
padding: 15px;
font-size: 15px;
font-weight: bold;
color: #fff;
text-transform: uppercase;
cursor: pointer;
}
.top-menu.notmobile {
display: none;
}
.header-menu {
position: fixed;
top: 0;
right: -110vw; /* Initially hidden */
width: 100%;
max-width: 350px;
height: 100%;
background-color: #fff;
box-shadow: -2px 0 5px rgba(0, 0, 0, 0.2);
overflow-y: auto;
transition: right 0.3s ease-in-out;
z-index: 1000;
padding: 40px 10px;
border-radius: var(--itembox-picture-radius);
border-top-right-radius: 0;
}
.close-header-menu {
position: absolute;
top: 4px;
left: 4px;
width: 36px;
height: 36px;
padding: 2px;
font-size: 18px;
color: var(--theme-color);
background: var(--dark-bg);
border: none;
text-transform: uppercase;
cursor: pointer;
}
.header-menu.show {
right: 0; /* Slide in when class "show" is added */
}
.top-menu > li {
position: relative;
margin: 1px 0;
background-color: #f6f6f6;
}
.top-menu > li > a {
display: block;
min-height: 55px;
padding: 18px;
font-size: 15px;
color: #555;
}
.top-menu > li > a:focus {
position: relative;
z-index: 1;
}
.top-menu .sublist {
background-color: #fff;
padding: 0;
position: fixed;
top: 0;
right: -110vw;
width: 100%;
max-width: 350px;
transition: all 0.3s ease-in-out;
height: 100%;
overflow-y: auto;
z-index: 1001;
}
.top-menu .sublist.active {
right: 0;
}
.top-menu .sublist li:not(:last-child) {
border-bottom: 1px solid #ddd;
position: relative;
}
.top-menu .sublist li a {
display: block;
padding: 15px 18px;
font-size: 15px;
}
.sublist-toggle {
position: absolute;
top: 0;
left: 0;
width: 55px;
height: 55px;
border-right: 1px solid #fff;
padding: 15px;
font-size: 15px;
font-weight: bold;
color: var(--dark);
text-transform: uppercase;
cursor: pointer;
font-family: FontAwesome;
display: flex;
justify-content: center;
align-items: center;
}
.sublist-toggle::after {
content: "\f061";
font-weight: lighter;
}
.sublist .sublist-toggle {
height: 49px;
}
.sublist .sublist li {
background-color: #f6f6f6;
}
.sublist .sublist .sublist li {
background-color: #fff;
}
.block-category-navigation {
display: none;
}
.block-account-navigation {
float: none;
margin: auto !important;
}
.write-review .review-rating {
text-align: center;
}
.write-review .review-rating div.name-description {
width: 100%;
margin: 0 0 0 5px;
text-align: center;
}
.product-review-box {
width: fit-content;
}
.page-title {
display: flex;
justify-content: space-between;
}
.user-dropdown .user-dropdown-toggle {
font-size: 0;
line-height: 1;
min-width: 70px;
}
.user-dropdown .fa {
margin: 0;
}
.header-links li {
margin: 0;
}
.top-menu .sublist .parent-links {
display: flex;
justify-content: flex-start;
align-items: stretch;
background: var(--dark);
color: var(--white);
margin: 0;
position: relative;
}
.top-menu .sublist .parent-links a {
width: calc(100% - 30px);
padding-block: 10px;
}
.top-menu .sublist .parent-links .close-sublist {
position: absolute;
top: 0;
left: 0;
width: 40px;
height: 40px;
padding: 5px;
font-size: 18px;
color: var(--white);
background: var(--dark-bg);
border: none;
text-transform: uppercase;
cursor: pointer;
line-height: 1;
border-right: 1px solid #888;
}
/*side bar for filter on catalog page*/
.sidebar-toggle-btn {
background: none;
border: none;
font-size: 30px;
color: #333;
cursor: pointer;
transition: color 0.3s ease;
margin-right: auto;
}
.sidebar-toggle-btn:hover {
color: #007bff; /* Change to your preferred color on hover */
}
.side-2 {
position: fixed;
top: 0;
right: -102vw;
width: 320px;
max-width: 100%;
height: 100%;
background: #fff;
transition: right 0.3s ease-in-out;
z-index: 1001;
padding: 50px 20px 20px;
overflow: auto;
}
.side-2.sidebar-open {
right: 0;
}
/* Sidebar close button styles */
.side-2 .sidebar-close-btn {
position: absolute;
top: 4px;
left: 4px;
width: 36px;
height: 36px;
padding: 2px;
font-size: 18px;
color: var(--theme-color);
background: var(--dark-bg);
border: 0;
text-transform: uppercase;
cursor: pointer;
}
.side-2 .sidebar-close-btn:hover {
color: #f44336; /* Red color when hovered */
}
/* Overlay styles */
.sidebar-overlay {
position: fixed;
top: 0;
right: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
opacity: 0;
visibility: hidden;
transition: opacity 0.3s ease-in-out;
z-index: 1000;
}
.sidebar-overlay.overlay-active {
opacity: 1;
visibility: visible;
}
/*welcome topics*/
.welcome-container {
grid-template-columns: 1fr;
text-align: center;
gap: 10px;
}
.welcome-text {
text-align: center;
background: rgba(255,255,255,0.75);
padding: 20px;
}
/*********** Homepage Features ***********/
.feature-item {
flex-direction: column !important;
text-align: center;
gap: 20px;
}
.feature-item img, .feature-content {
width: 100%;
}
.home-page-category-grid .title, .sub-category-grid .title {
font-size: 18px;
}
}

View File

@ -0,0 +1,134 @@

@media all and (max-width: 768px) {
.header-selectors-wrapper {
border-bottom: 1px solid #ddd;
padding: 10px 0;
display: flex;
gap: 10px;
}
.header-selectors-wrapper > div {
flex-grow: 1;
}
.spice-categories .intro-text {
font-size: 1rem;
padding: 0 10px;
}
.spice-categories .spice-item {
flex-direction: column;
text-align: center;
}
.spice-categories .spice-item img,
.spice-categories .spice-text {
width: 100%;
}
.spice-categories .spice-text {
padding: 10px;
}
.spice-categories .spice-text h3 {
font-size: 1.5rem;
}
.spice-categories .btn {
padding: 10px 18px;
}
.review-rating .name-description {
text-align: center;
width: 100%;
display: block;
}
.write-review .review-rating div {
text-align: center;
padding-bottom: 10px;
display: inline-block;
}
/*** ESTIMATE SHIPPING POPUP ***/
.shipping-address {
flex-flow: column;
}
.address-item {
width: 100%;
}
.estimate-shipping-row-item.address-item + .estimate-shipping-row-item.address-item {
padding-left: 0px;
padding-top: 8px;
}
.home-page-category-grid .title, .sub-category-grid .title {
font-size: 16px;
width: 100%;
background: rgba(0, 0, 0, 0.4);
}
/*********** Category Box ***********/
.home-page-category-grid .item-grid .item-box:first-child {
width: 100%;
}
.home-page-category-grid .item-grid .item-box:nth-child(2n+1) {
clear: none;
}
.home-page-category-grid .item-grid .item-box:nth-child(2n+2) {
clear: both;
}
.category-grid .item-grid .item-box {
margin-bottom: 10px;
}
/*********** product-box ***********/
.item-box .details {
padding: 0 5px;
}
.item-box .product-item .product-title {
font-size: 16px;
display: -webkit-box;
-webkit-line-clamp: 2; /* Limits to 2 lines */
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
max-width: 100%; /* Adjust as needed */
height: 50px;
}
.item-box .buttons {
gap: 0;
}
.item-box .product-box-add-to-cart-button,
.item-box .add-to-compare-list-button {
font-size: 12px;
}
.item-box .product-box-add-to-cart-button::before,
.item-box .add-to-compare-list-button::before {
font-size: 12px;
}
.container {
padding-inline: 30px;
}
/*********** footer ***********/
.follow-us {
text-align: left;
}
.follow-us .newsletter-email {
padding-bottom: 0;
border: none;
margin-bottom: 0;
}
.follow-us > div {
margin-bottom: 15px;
}
.follow-us .social li:first-child {
margin-left: 0;
}
}

View File

@ -0,0 +1,147 @@

@media all and (max-width: 768px) {
.header-selectors-wrapper {
border-bottom: 1px solid #ddd;
padding: 10px 0;
display: flex;
gap: 10px;
}
.header-selectors-wrapper > div {
flex-grow: 1;
}
.spice-categories .intro-text {
font-size: 1rem;
padding: 0 10px;
}
.spice-categories .spice-item {
flex-direction: column;
text-align: center;
}
.spice-categories .spice-item img,
.spice-categories .spice-text {
width: 100%;
}
.spice-categories .spice-text {
padding: 10px;
}
.spice-categories .spice-text h3 {
font-size: 1.5rem;
}
.spice-categories .btn {
padding: 10px 18px;
}
.review-rating .name-description {
text-align: center;
width: 100%;
display: block;
}
.write-review .review-rating div {
text-align: center;
padding-bottom: 10px;
display: inline-block;
}
/*** ESTIMATE SHIPPING POPUP ***/
.shipping-address {
flex-flow: column;
}
.address-item {
width: 100%;
}
.estimate-shipping-row-item.address-item + .estimate-shipping-row-item.address-item {
padding-right: 0px;
padding-top: 8px;
}
.home-page-category-grid .title, .sub-category-grid .title {
font-size: 16px;
width: 100%;
background: rgba(0, 0, 0, 0.4);
}
/*********** Category Box ***********/
.home-page-category-grid .item-grid .item-box:first-child {
width: 100%;
}
.home-page-category-grid .item-grid .item-box:nth-child(2n+1) {
clear: none;
}
.home-page-category-grid .item-grid .item-box:nth-child(2n+2) {
clear: both;
}
.category-grid .item-grid .item-box {
margin-bottom: 10px;
}
/*********** product-box ***********/
.item-box .details {
padding: 0 5px;
}
.item-box .product-item .product-title {
font-size: 16px;
display: -webkit-box;
-webkit-line-clamp: 2; /* Limits to 2 lines */
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
max-width: 100%; /* Adjust as needed */
height: 50px;
}
.item-box .buttons {
gap: 0;
}
.item-box .product-box-add-to-cart-button,
.item-box .add-to-compare-list-button {
font-size: 12px;
}
.item-box .product-box-add-to-cart-button::before,
.item-box .add-to-compare-list-button::before {
font-size: 12px;
}
.container {
padding-inline: 30px;
}
/*********** footer ***********/
.follow-us {
text-align: right;
}
.follow-us .newsletter-email {
padding-bottom: 0;
border: none;
margin-bottom: 0;
}
.follow-us > div {
margin-bottom: 15px;
}
.follow-us .social li:first-child {
margin-right: 0;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,5 @@
@media all and (min-width: 1240px) {
:root {
--layout-outer-width: 1180px;
}
}

View File

@ -0,0 +1,5 @@
@media all and (min-width: 1240px) {
:root {
--layout-outer-width: 1180px;
}
}

View File

@ -0,0 +1,167 @@

@media all and (min-width: 1367px) {
:root {
--layout-outer-width : 1300px;
}
/*** GLOBAL STYLES ***/
html:not(.html-home-page) .master-wrapper-content,
.html-home-page .topic-block,
.html-home-page .home-page-category-grid,
.html-home-page .news-list-homepage,
.html-home-page .home-page-polls,
.html-home-page .home-page-product-grid {
width: var(--layout-outer-width);
}
.inputs label {
width: 430px;
}
.center-2 .inputs label {
width: 213px;
}
.inputs.accept-consent label {
width: auto;
}
/*** HEADER ***/
.header .header-upper {
width: var(--layout-outer-width);
}
/*** NAVIGATION ***/
.header-menu .top-menu {
width: var(--layout-outer-width);
}
.header-menu > ul > li {
padding: 0 20px;
}
.header-menu > ul > li > a,
.header-menu > ul > li > span {
font-size: 18px;
}
/*** FOOTER ***/
.footer-upper {
width: var(--layout-outer-width);
padding: 35px 30px;
}
.footer-lower {
width: var(--layout-outer-width);
padding: 25px 20px;
}
/*** PRODUCT REVIEWS ***/
.product-review-item .review-title {
max-width: 1050px;
}
.write-review .review-rating div.name-description {
margin: 0 5px 0 0;
min-width: 430px;
}
/*** REGISTRATION, LOGIN, ACCOUNT ***/
.login-page .returning-wrapper input[type="text"],
.login-page .returning-wrapper input[type="email"],
.login-page .returning-wrapper input[type="password"] {
width: 360px;
}
.registration-page .vat-note {
margin-left: 385px;
}
.customer-info-page .vat-note,
.customer-info-page .vat-status,
.customer-info-page .email-to-revalidate-note {
margin-left: 225px;
}
/*** SHOPPING CART ***/
.cart-footer .totals {
width: 395px;
margin: 0;
}
.cart-footer .cart-collaterals {
width: 760px;
margin: 0;
}
.cart-footer .cart-collaterals .deals {
float: left;
width: 360px;
}
.cart-footer .cart-collaterals .shipping {
float: right;
width: 360px;
}
.cart-footer .estimate-shipping .inputs label {
display: inline-block;
width: 35%;
}
.cart-footer .estimate-shipping .inputs input,
.cart-footer .estimate-shipping .inputs select {
width: 65%;
}
/*** CHECKOUT ***/
.shipping-method .method-list li,
.payment-method .method-list li {
margin: 20px 1%;
}
.payment-info .info td:first-child {
width: 375px !important;
}
.payment-info .info td:only-child {
width: 100% !important;
}
/*** FORUM & PROFILE ***/
.forum-actions .pager,
.topic-actions .pager {
max-width: 600px !important;
}
.topic-post .post-text {
width: 930px;
max-width: 100%;
}
}

View File

@ -0,0 +1,167 @@

@media all and (min-width: 1367px) {
:root {
--layout-outer-width: 1300px;
}
/*** GLOBAL STYLES ***/
html:not(.html-home-page) .master-wrapper-content,
.html-home-page .topic-block,
.html-home-page .home-page-category-grid,
.html-home-page .news-list-homepage,
.html-home-page .home-page-polls,
.html-home-page .home-page-product-grid {
width: var(--layout-outer-width);
}
.inputs label {
width: 430px;
}
.center-2 .inputs label {
width: 213px;
}
.inputs.accept-consent label {
width: auto;
}
/*** HEADER ***/
.header .header-upper {
width: var(--layout-outer-width);
}
/*** NAVIGATION ***/
.header-menu .top-menu {
width: var(--layout-outer-width);
}
.header-menu > ul > li {
padding: 0 20px;
}
.header-menu > ul > li > a,
.header-menu > ul > li > span {
font-size: 18px;
}
/*** FOOTER ***/
.footer-upper {
width: var(--layout-outer-width);
padding: 35px 30px;
}
.footer-lower {
width: var(--layout-outer-width);
padding: 25px 20px;
}
/*** PRODUCT REVIEWS ***/
.product-review-item .review-title {
max-width: 1050px;
}
.write-review .review-rating div.name-description {
margin: 0 0 0 5px;
min-width: 430px;
}
/*** REGISTRATION, LOGIN, ACCOUNT ***/
.login-page .returning-wrapper input[type="text"],
.login-page .returning-wrapper input[type="email"],
.login-page .returning-wrapper input[type="password"] {
width: 360px;
}
.registration-page .vat-note {
margin-right: 385px;
}
.customer-info-page .vat-note,
.customer-info-page .vat-status,
.customer-info-page .email-to-revalidate-note {
margin-right: 225px;
}
/*** SHOPPING CART ***/
.cart-footer .totals {
width: 395px;
margin: 0;
}
.cart-footer .cart-collaterals {
width: 760px;
margin: 0;
}
.cart-footer .cart-collaterals .deals {
float: right;
width: 360px;
}
.cart-footer .cart-collaterals .shipping {
float: left;
width: 360px;
}
.cart-footer .estimate-shipping .inputs label {
display: inline-block;
width: 35%;
}
.cart-footer .estimate-shipping .inputs input,
.cart-footer .estimate-shipping .inputs select {
width: 65%;
}
/*** CHECKOUT ***/
.shipping-method .method-list li,
.payment-method .method-list li {
margin: 20px 1%;
}
.payment-info .info td:first-child {
width: 375px !important;
}
.payment-info .info td:only-child {
width: 100% !important;
}
/*** FORUM & PROFILE ***/
.forum-actions .pager,
.topic-actions .pager {
max-width: 600px !important;
}
.topic-post .post-text {
width: 930px;
max-width: 100%;
}
}

View File

@ -0,0 +1,191 @@

@media all and (min-width: 481px) {
:root {
--layout-outer-width: 92%;
}
/*** GLOBAL ***/
html:not(.html-home-page) .master-wrapper-content,
.html-home-page .topic-block,
.html-home-page .home-page-category-grid,
.html-home-page .news-list-homepage,
.html-home-page .home-page-polls,
.html-home-page .home-page-product-grid {
width: var(--layout-outer-width);
}
/*** GLOBAL TABLES ***/
.cart tr {
width: 46%;
margin: 40px 2% 0;
}
.cart tr:nth-child(2n+1) {
clear: both;
}
.order-details-page .data-table tr {
width: 46%;
margin: 40px 2% 0;
}
.order-details-page .data-table tr:nth-child(2n+1) {
clear: both;
}
/*** HEADER ***/
.header-selectors-wrapper > div {
display: inline-block;
width: 30%;
margin: 10px auto;
}
.search-box input.search-box-text {
width: 280px;
}
.ui-autocomplete {
width: 280px !important;
}
.ui-autocomplete img {
display: inline;
}
/*** FOOTER ***/
.follow-us,
.footer-block {
width: 85%;
}
.newsletter-email input[type="text"] {
width: 240px;
}
/*** CATEGORY ***/
.item-box {
width: 48%;
margin: 0 1% 50px;
}
.item-box:nth-child(2n+1) {
clear: both;
}
.item-box .product-rating-box {
margin: 0 0 15px;
}
.item-box .prices {
min-height: 40px;
}
.item-box .product-title {
min-height: 52px;
font-size: 22px;
line-height: 1.2;
}
/*** PRODUCT PAGE ***/
.overview-buttons div {
display: inline-block;
width: auto;
margin: 0 1px 2px;
}
/*** WISHLIST ***/
.wishlist-content .button-2 {
display: inline-block;
width: auto;
min-width: 140px;
margin: 0 1px 5px;
}
/*** TOPICS ***/
.enter-password-form input[type="password"] {
width: 260px;
}
/*** FORUM & PROFILE ***/
.forums-header {
background-color: #f9f9f9;
padding: 30px 20px 20px;
}
.ui-tabs-nav li {
display: inline-block;
min-width: 150px;
margin: 0 5px -1px;
/*override jQuery UI styles, do not delete doubled properties*/
margin: 0 5px -1px !important;
}
.private-messages-page .buttons .button-1,
.private-messages-page .buttons .button-2,
.private-message-view-page .buttons .button-1,
.private-message-view-page .buttons .button-2 {
display: inline-block;
width: auto;
margin: 1px;
}
.topic-post .post-text {
float: left;
width: 90.5%;
text-align: left;
}
.forum-group .forum-table th.latest-post,
.forum-group .forum-table th.topics,
.forum-group .forum-table th.posts,
.forum-group .forum-table td.latest-post,
.forum-group .forum-table td.topics,
.forum-group .forum-table td.posts {
display: table-cell;
}
.topic-group .forum-table th.latest-post,
.topic-group .forum-table td.latest-post {
display: table-cell;
}
.forum-table td.image {
max-width: 40px;
}
.forum-table td.image div {
max-width: 100%;
background-size: contain;
}
/*** ESTIMATE SHIPPING POPUP ***/
.estimate-shipping-popup {
padding: 25px;
}
}

View File

@ -0,0 +1,191 @@

@media all and (min-width: 481px) {
:root {
--layout-outer-width: 92%;
}
/*** GLOBAL ***/
html:not(.html-home-page) .master-wrapper-content,
.html-home-page .topic-block,
.html-home-page .home-page-category-grid,
.html-home-page .news-list-homepage,
.html-home-page .home-page-polls,
.html-home-page .home-page-product-grid {
width: var(--layout-outer-width);
}
/*** GLOBAL TABLES ***/
.cart tr {
width: 46%;
margin: 40px 2% 0;
}
.cart tr:nth-child(2n+1) {
clear: both;
}
.order-details-page .data-table tr {
width: 46%;
margin: 40px 2% 0;
}
.order-details-page .data-table tr:nth-child(2n+1) {
clear: both;
}
/*** HEADER ***/
.header-selectors-wrapper > div {
display: inline-block;
width: 30%;
margin: 10px auto;
}
.search-box input.search-box-text {
width: 280px;
}
.ui-autocomplete {
width: 280px !important;
}
.ui-autocomplete img {
display: inline;
}
/*** FOOTER ***/
.follow-us,
.footer-block {
width: 85%;
}
.newsletter-email input[type="text"] {
width: 240px;
}
/*** CATEGORY ***/
.item-box {
width: 48%;
margin: 0 1% 50px;
}
.item-box:nth-child(2n+1) {
clear: both;
}
.item-box .product-rating-box {
margin: 0 0 15px;
}
.item-box .prices {
min-height: 40px;
}
.item-box .product-title {
min-height: 52px;
font-size: 22px;
line-height: 1.2;
}
/*** PRODUCT PAGE ***/
.overview-buttons div {
display: inline-block;
width: auto;
margin: 0 1px 2px;
}
/*** WISHLIST ***/
.wishlist-content .button-2 {
display: inline-block;
width: auto;
min-width: 140px;
margin: 0 1px 5px;
}
/*** TOPICS ***/
.enter-password-form input[type="password"] {
width: 260px;
}
/*** FORUM & PROFILE ***/
.forums-header {
background-color: #f9f9f9;
padding: 30px 20px 20px;
}
.ui-tabs-nav li {
display: inline-block;
min-width: 150px;
margin: 0 5px -1px;
/*override jQuery UI styles, do not delete doubled properties*/
margin: 0 5px -1px !important;
}
.private-messages-page .buttons .button-1,
.private-messages-page .buttons .button-2,
.private-message-view-page .buttons .button-1,
.private-message-view-page .buttons .button-2 {
display: inline-block;
width: auto;
margin: 1px;
}
.topic-post .post-text {
float: right;
width: 90.5%;
text-align: right;
}
.forum-group .forum-table th.latest-post,
.forum-group .forum-table th.topics,
.forum-group .forum-table th.posts,
.forum-group .forum-table td.latest-post,
.forum-group .forum-table td.topics,
.forum-group .forum-table td.posts {
display: table-cell;
}
.topic-group .forum-table th.latest-post,
.topic-group .forum-table td.latest-post {
display: table-cell;
}
.forum-table td.image {
max-width: 40px;
}
.forum-table td.image div {
max-width: 100%;
background-size: contain;
}
/*** ESTIMATE SHIPPING POPUP ***/
.estimate-shipping-popup {
padding: 25px;
}
}

View File

@ -0,0 +1,780 @@

@media all and (min-width: 769px) {
:root {
--layout-outer-width: 94%;
}
/* Reverse Layout for Even Items */
.spice-categories .spice-item:nth-child(even) {
flex-direction: row-reverse;
}
/**** GLOBAL ***/
html:not(.html-home-page) .master-wrapper-content,
.html-home-page .topic-block,
.html-home-page .home-page-category-grid,
.html-home-page .news-list-homepage,
.html-home-page .home-page-polls,
.html-home-page .home-page-product-grid {
width: var(--layout-outer-width);
}
.home-page-polls li {
min-width: 100px;
}
/**** GLOBAL TABLES ***/
.cart tr {
width: 31.33333%;
margin: 40px 1% 0;
}
.cart tr:nth-child(2n+1) {
clear: none;
}
.cart tr:nth-child(3n+1) {
clear: both;
}
.order-details-page .data-table tr {
width: 31.33333%;
margin: 40px 1% 0;
}
.order-details-page .data-table tr:nth-child(2n+1) {
clear: none;
}
.order-details-page .data-table tr:nth-child(3n+1) {
clear: both;
}
/*** HEADER ***/
.header-selectors-wrapper > div {
width: 20%;
}
/*** FOOTER ***/
.footer-block {
display: inline-block;
width: 25.33333%;
margin: 0 4%;
vertical-align: top;
}
.footer-block .title {
margin: 0 0 15px;
background: none;
padding: 0;
cursor: auto;
}
.footer-block .list {
display: block !important; /* prevents toggle display:none on resize */
background: none;
padding: 0;
}
.footer-block .title strong {
font-weight: 700;
}
.footer-block .list li {
padding: 5px 0;
font-size: 18px;
}
.footer-block .list a {
display: inline;
padding: 0;
}
/*footer ui*/
.follow-us {
display: flex;
justify-content: center;
gap: 30px;
flex-wrap: wrap;
padding-block: 40px;
width: 100%;
}
.follow-us > div {
width: calc(33% - 20px);
margin: 0;
text-align: center;
}
.follow-us .title {
text-align: center;
}
.newsletter-email {
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 0;
padding-bottom: 0;
border: 0;
}
/*** Homepage Categories TABLES ***/
/* Target only the home page category grid */
.home-page-category-grid .category-item {
overflow: hidden;
}
.home-page-category-grid .item-box .picture,
.home-page-category-grid .item-box .picture a {
position: static;
margin: 0;
}
.home-page-category-grid .item-grid {
display: grid;
grid-template-columns: repeat(6, 1fr);
gap: 16px;
}
/* Style for each item */
.home-page-category-grid .item-grid .item-box {
width: 100%;
margin: 0;
grid-column: span 2;
grid-row: span 1;
}
.home-page-category-grid .item-box:nth-child(5n + 4),
.home-page-category-grid .item-box:nth-child(5n + 5) {
grid-column: span 3;
grid-row: span 1;
}
/* Every first item in a set of 5 spans 2 columns and 2 rows */
.home-page-category-grid .item-box:nth-child(5n + 1) {
grid-column: span 4;
grid-row: span 2;
}
/*** CATEGORY ***/
.product-selectors {
text-align: left;
}
.product-selectors .product-viewmode {
display: inline-block;
float: right;
}
.product-selectors .product-viewmode span {
display: none;
}
.product-selectors .product-viewmode a {
display: inline-block;
width: 24px;
height: 32px;
margin: 0 0 0 12px;
background-position: center;
background-repeat: no-repeat;
opacity: 0.5;
}
.product-selectors .product-viewmode a.grid {
background-image: url('../images/view-grid.png');
}
.product-selectors .product-viewmode a.list {
background-image: url('../images/view-list.png');
}
.product-selectors .product-viewmode a.selected {
opacity: 1;
}
.item-box {
width: 47%;
margin: 0 1.5% 50px;
}
.category-grid .item-box:nth-child(2n+1) {
clear: none;
}
.category-grid .item-box:nth-child(3n+1) {
clear: both;
}
.item-box:nth-child(n+1) {
clear: none;
}
.item-box:nth-child(2n+1) {
clear: both;
}
.product-list .item-box {
float: none;
width: auto;
margin: 0 5px 30px;
padding-bottom: 30px;
}
.product-list .item-box:not(:last-child) {
border-bottom: 1px solid #ddd;
}
.product-list .item-box .product-item:after {
content: "";
display: block;
clear: both;
}
.product-list .item-box .picture {
float: left;
width: 220px;
}
.product-list .item-box:hover .picture a img,
.product-list .item-box:focus .picture a img {
opacity: 1;
}
.product-list .item-box .picture:hover a img,
.product-list .item-box .picture:focus a img {
opacity: 0.85;
}
.product-list .item-box .picture ~ .buttons,
.product-list .item-box .picture + .details {
margin: 0 0 0 240px;
}
.product-list .item-box .product-title {
height: auto;
padding: 10px 0;
font-size: 18px;
}
.product-list .item-box .description {
display: block;
margin: 0 0 10px;
line-height: 22px;
}
.product-list .item-box .prices {
min-height: initial;
margin: 0 0 15px;
}
.product-list .item-box .buttons {
}
.product-list .item-box .product-box-add-to-cart-button {
width: auto;
min-width: 150px;
padding: 0 20px;
}
.product-list .item-box .add-to-compare-list-button,
.product-list .item-box .add-to-wishlist-button {
width: auto;
padding-inline: 30px;
}
/*** PRODUCT PAGE ***/
.gallery {
width: 550px;
}
.variant-picture {
float: left;
}
.variant-picture + .variant-overview {
width: auto;
margin: 0 0 0 240px;
}
.variant-overview {
text-align: left;
}
/*** PRODUCT REVIEWS ***/
.product-review-item .review-title {
float: left;
max-width: 600px;
}
.product-review-item .product-review-box {
float: right;
}
.write-review .review-rating div {
display: inline-block;
margin: 0 0 0 5px;
cursor: default;
vertical-align: middle;
font-size: 14px;
height: 17px;
}
/*** REGISTRATION, LOGIN, ACCOUNT ***/
.address-list-page .section,
.order-list-page .section,
.return-request-list-page .section {
display: inline-block;
width: 45%;
margin: 20px 1%;
vertical-align: top;
}
.recurring-payments {
width: 100% !important;
margin: 20px 0 !important;
}
/*** SHOPPING CART ***/
.order-progress {
padding: 20px;
}
.order-progress li {
margin: 0 10px;
}
.order-progress a {
min-width: 80px;
}
.cart-options .common-buttons {
text-align: right;
}
.cart-options .checkout-attributes,
.cart-options .selected-checkout-attributes {
padding: 0 10px;
}
.cart-footer .totals {
float: right;
width: 45%;
margin: 0 2.5%;
}
.cart-footer .terms-of-service {
text-align: left;
}
.cart-footer .checkout-buttons,
.cart-footer .addon-buttons {
text-align: right;
}
.cart-footer .cart-collaterals {
float: left;
width: 45%;
margin: 0 2.5%;
}
.cart-footer .cart-collaterals div,
.cart-footer .cart-collaterals label {
text-align: left;
}
.cart-footer .estimate-shipping label {
display: block;
margin: 0 0 10px;
}
.cart-footer .estimate-shipping .buttons {
text-align: right;
}
/*** CHECKOUT ***/
.checkout-page .selected-checkout-attributes {
float: right;
text-align: right;
}
.checkout-page .cart-footer .totals {
max-width: 350px;
margin: 0;
}
.checkout-page .address-grid {
overflow: hidden;
}
.checkout-page .address-item {
display: inline-block;
vertical-align: top;
zoom: 1;
width: 48%;
margin: 0 1% 40px;
}
.shipping-method .method-list li,
.payment-method .method-list li {
display: inline-block;
width: 25%;
margin: 20px 2%;
vertical-align: top;
}
.shipping-method .method-name {
background-color: #f6f6f6;
padding: 10px;
}
.payment-method .payment-logo {
display: block;
background-color: #f6f6f6;
padding: 10px;
}
.payment-method .payment-details {
display: block;
width: auto;
min-width: 0;
margin: 10px 0 0;
text-align: center;
}
.payment-info .info {
padding: 30px 75px;
}
.order-review-data,
.order-details-area,
.shipment-details-area {
overflow: hidden;
}
.order-review-data > div,
.order-details-area > div,
.shipment-details-area > div {
float: left;
width: 48%;
margin: 0 1% 40px;
}
/*** ORDER DETAILS & SHIPPING DETAILS ***/
.order-details-page .section.options {
text-align: right;
}
.order-details-page .selected-checkout-attributes {
padding: 0 10px;
}
.order-details-page .tax-shipping-info {
text-align: right;
}
.order-details-page .totals {
float: right;
clear: both;
}
.shipment-details-page .tracking-number .tracking-url {
color: var(--theme-color);
}
/*** BLOG & NEWS ***/
.blog-posts .tags {
float: right;
width: 80%;
text-align: right;
}
.blog-posts .buttons {
float: left;
width: 20%;
text-align: left;
}
.new-comment {
text-align: center;
}
.new-comment .buttons {
text-align: center;
}
.comment-list .comment {
display: table;
width: 100%;
margin: 0;
}
.comment-list .comment:last-child {
border-bottom: 1px solid #ddd;
}
.comment-info {
display: table-cell;
width: 15%;
margin: 0;
vertical-align: top;
}
.comment-info .username {
min-height: 40px;
margin: 0;
border: none;
text-align: center;
}
.comment-info .avatar {
border: none;
}
.comment-info .avatar img {
max-width: 80%;
max-height: 80%;
}
.comment-content {
display: table-cell;
width: 85%;
border-left: 1px solid #ddd;
vertical-align: top;
text-align: left;
}
.comment-time {
min-height: 40px;
margin: 0;
background-color: #f6f6f6;
padding: 10px 15px;
font-size: 14px;
font-weight: normal;
}
.comment-title {
margin: 0 0 -20px;
padding: 20px;
}
.comment-body {
padding: 20px;
}
/*** FORUM & PROFILE ***/
.forum-actions,
.topic-actions {
overflow: hidden;
}
.forum-actions .actions,
.topic-actions .actions {
float: left;
}
.forum-actions .pager,
.topic-actions .pager {
float: right;
max-width: 450px;
}
.forum-actions .pager li,
.topic-actions .pager li {
margin: 2px 4px;
}
.forum-actions .pager.upper {
display: block;
}
.topic-actions.lower .actions {
display: block;
}
.topic-posts {
margin: 0 0 30px;
}
.topic-post {
display: table;
width: 100%;
margin: 0;
}
.topic-post .post-info {
display: table-cell;
width: 15%;
margin: 0;
vertical-align: top;
text-align: left;
}
.topic-post .user-info {
width: auto;
}
.topic-post .username {
min-height: 40px;
margin: 0;
border: none;
text-align: center;
}
.topic-post .avatar {
margin: auto;
border: none;
}
.topic-post .avatar img {
max-width: 80%;
max-height: 80%;
}
.topic-post .user-stats li {
margin: 0;
}
.topic-post .send-pm {
margin: 0 0 20px;
}
.topic-post .pm-button,
.profile-info-box .pm-button {
padding: 8px 16px;
font-size: 13px;
}
.topic-post .post-content {
display: table-cell;
width: 85%;
border-left: 1px solid #ddd;
vertical-align: top;
text-align: left;
}
.topic-post .post-head {
min-height: 40px;
overflow: hidden;
background-color: #f6f6f6;
}
.topic-post .post-time {
float: left;
margin: 0;
font-size: 14px;
font-weight: normal;
}
.topic-post .post-actions {
float: right;
margin: 0;
}
.topic-post .post-actions a {
margin: 0;
line-height: 20px;
}
.topic-post .post-actions .manage-post a {
}
.topic-post .post-actions .quote-post a {
min-width: 70px;
}
.topic-post .post-actions a.post-link-button {
margin: 0 0 0 10px;
border-left: 1px solid #ddd;
text-align: center;
}
.topic-post .post-text {
padding: 20px 5px;
}
.topic-post .post-vote {
padding: 20px 0 20px 15px;
}
.forum-table th.replies,
.forum-table th.views,
.forum-table th.votes,
.forum-table td.replies,
.forum-table td.views,
.forum-table td.votes {
display: table-cell;
}
.forum-table td.image {
max-width: none;
}
.forum-table td.image div {
max-width: none;
background-size: initial;
}
.ui-tabs-nav {
text-align: left;
}
.ui-tabs-nav li {
margin: 0 10px -1px 0;
/*override jQuery UI styles, do not delete doubled properties*/
margin: 0 10px -1px 0 !important;
}
.profile-info-box .avatar {
float: left;
margin: 0 15px 15px 0;
}
.profile-info-box .profile-stats {
float: left;
text-align: left;
}
.profile-info-box .title {
text-align: left;
}
.profile-info-box .send-pm {
clear: both;
text-align: left;
}
}

View File

@ -0,0 +1,783 @@

@media all and (min-width: 769px) {
:root {
--layout-outer-width: 94%;
}
/* Reverse Layout for Even Items */
.spice-categories .spice-item:nth-child(even) {
flex-direction: row-reverse;
}
/**** GLOBAL ***/
html:not(.html-home-page) .master-wrapper-content,
.html-home-page .topic-block,
.html-home-page .home-page-category-grid,
.html-home-page .news-list-homepage,
.html-home-page .home-page-polls,
.html-home-page .home-page-product-grid {
width: var(--layout-outer-width);
}
.home-page-polls li {
min-width: 100px;
}
/**** GLOBAL TABLES ***/
.cart tr {
width: 31.33333%;
margin: 40px 1% 0;
}
.cart tr:nth-child(2n+1) {
clear: none;
}
.cart tr:nth-child(3n+1) {
clear: both;
}
.order-details-page .data-table tr {
width: 31.33333%;
margin: 40px 1% 0;
}
.order-details-page .data-table tr:nth-child(2n+1) {
clear: none;
}
.order-details-page .data-table tr:nth-child(3n+1) {
clear: both;
}
/*** HEADER ***/
.header-selectors-wrapper > div {
width: 20%;
}
/*** FOOTER ***/
.footer-block {
display: inline-block;
width: 25.33333%;
margin: 0 4%;
vertical-align: top;
}
.footer-block .title {
margin: 0 0 15px;
background: none;
padding: 0;
cursor: auto;
}
.footer-block .list {
display: block !important; /* prevents toggle display:none on resize */
background: none;
padding: 0;
}
.footer-block .title strong {
font-weight: 700;
}
.footer-block .list li {
padding: 5px 0;
font-size: 18px;
}
.footer-block .list a {
display: inline;
padding: 0;
}
/*footer ui*/
.follow-us {
display: flex;
justify-content: center;
gap: 30px;
flex-wrap: wrap;
padding-block: 40px;
width: 100%;
}
.follow-us > div {
width: calc(33% - 20px);
margin: 0;
text-align: center;
}
.follow-us .title {
text-align: center;
}
.newsletter-email {
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 0;
padding-bottom: 0;
border: 0;
}
/*** Homepage Categories TABLES ***/
/* Target only the home page category grid */
.home-page-category-grid .category-item {
overflow: hidden;
}
.home-page-category-grid .item-box .picture,
.home-page-category-grid .item-box .picture a {
position: static;
margin: 0;
}
.home-page-category-grid .item-grid {
display: grid;
grid-template-columns: repeat(6, 1fr);
gap: 16px;
}
/* Style for each item */
.home-page-category-grid .item-grid .item-box {
width: 100%;
margin: 0;
grid-column: span 2;
grid-row: span 1;
}
.home-page-category-grid .item-box:nth-child(5n + 4),
.home-page-category-grid .item-box:nth-child(5n + 5) {
grid-column: span 3;
grid-row: span 1;
}
/* Every first item in a set of 5 spans 2 columns and 2 rows */
.home-page-category-grid .item-box:nth-child(5n + 1) {
grid-column: span 4;
grid-row: span 2;
}
/*** CATEGORY ***/
.product-selectors {
text-align: right;
}
.product-selectors .product-viewmode {
display: inline-block;
float: left;
}
.product-selectors .product-viewmode span {
display: none;
}
.product-selectors .product-viewmode a {
display: inline-block;
width: 24px;
height: 32px;
margin: 0 12px 0 0;
background-position: center;
background-repeat: no-repeat;
opacity: 0.5;
}
.product-selectors .product-viewmode a.grid {
background-image: url('../images/view-grid.png');
}
.product-selectors .product-viewmode a.list {
background-image: url('../images/view-list.png');
}
.product-selectors .product-viewmode a.selected {
opacity: 1;
}
.item-box {
width: 47%;
margin: 0 1.5% 50px;
}
.category-grid .item-box:nth-child(2n+1) {
clear: none;
}
.category-grid .item-box:nth-child(3n+1) {
clear: both;
}
.item-box:nth-child(n+1) {
clear: none;
}
.item-box:nth-child(2n+1) {
clear: both;
}
.product-list .item-box {
float: none;
width: auto;
margin: 0 5px 30px;
padding-bottom: 30px;
}
.product-list .item-box:not(:last-child) {
border-bottom: 1px solid #ddd;
}
.product-list .item-box .product-item:after {
content: "";
display: block;
clear: both;
}
.product-list .item-box .picture {
float: right;
width: 220px;
}
.product-list .item-box:hover .picture a img,
.product-list .item-box:focus .picture a img {
opacity: 1;
}
.product-list .item-box .picture:hover a img,
.product-list .item-box .picture:focus a img {
opacity: 0.85;
}
.product-list .item-box .picture ~ .buttons,
.product-list .item-box .picture + .details {
margin: 0 240px 0 0;
}
.product-list .item-box .product-title {
height: auto;
padding: 10px 0;
font-size: 18px;
}
.product-list .item-box .description {
display: block;
margin: 0 0 10px;
line-height: 22px;
}
.product-list .item-box .prices {
min-height: initial;
margin: 0 0 15px;
}
.product-list .item-box .buttons {
}
.product-list .item-box .product-box-add-to-cart-button {
width: auto;
min-width: 150px;
padding: 0 20px;
}
.product-list .item-box .add-to-compare-list-button,
.product-list .item-box .add-to-wishlist-button {
width: auto;
padding-inline: 30px;
}
/*** PRODUCT PAGE ***/
.gallery {
width: 550px;
}
.variant-picture {
float: right;
}
.variant-picture + .variant-overview {
width: auto;
margin: 0 240px 0 0;
}
.variant-overview {
text-align: right;
}
/*** PRODUCT REVIEWS ***/
.product-review-item .review-title {
float: right;
max-width: 600px;
}
.product-review-item .product-review-box {
float: left;
}
.write-review .review-rating div {
display: inline-block;
margin: 0 5px 0 0;
cursor: default;
vertical-align: middle;
font-size: 14px;
height: 17px;
}
/*** REGISTRATION, LOGIN, ACCOUNT ***/
.address-list-page .section,
.order-list-page .section,
.return-request-list-page .section {
display: inline-block;
width: 45%;
margin: 20px 1%;
vertical-align: top;
}
.recurring-payments {
width: 100% !important;
margin: 20px 0 !important;
}
/*** SHOPPING CART ***/
.order-progress {
padding: 20px;
}
.order-progress li {
margin: 0 10px;
}
.order-progress a {
min-width: 80px;
}
.cart-options .common-buttons {
text-align: left;
}
.cart-options .checkout-attributes,
.cart-options .selected-checkout-attributes {
padding: 0 10px;
}
.cart-footer .totals {
float: left;
width: 45%;
margin: 0 2.5%;
}
.cart-footer .terms-of-service {
text-align: right;
}
.cart-footer .checkout-buttons,
.cart-footer .addon-buttons {
text-align: left;
}
.cart-footer .cart-collaterals {
float: right;
width: 45%;
margin: 0 2.5%;
}
.cart-footer .cart-collaterals div,
.cart-footer .cart-collaterals label {
text-align: right;
}
.cart-footer .estimate-shipping label {
display: block;
margin: 0 0 10px;
}
.cart-footer .estimate-shipping .buttons {
text-align: left;
}
/*** CHECKOUT ***/
.checkout-page .selected-checkout-attributes {
float: left;
text-align: left;
}
.checkout-page .cart-footer .totals {
max-width: 350px;
margin: 0;
}
.checkout-page .address-grid {
overflow: hidden;
}
.checkout-page .address-item {
display: inline-block;
vertical-align: top;
zoom: 1;
width: 48%;
margin: 0 1% 40px;
}
.shipping-method .method-list li,
.payment-method .method-list li {
display: inline-block;
width: 25%;
margin: 20px 2%;
vertical-align: top;
}
.shipping-method .method-name {
background-color: #f6f6f6;
padding: 10px;
}
.payment-method .payment-logo {
display: block;
background-color: #f6f6f6;
padding: 10px;
}
.payment-method .payment-details {
display: block;
width: auto;
min-width: 0;
margin: 10px 0 0;
text-align: center;
}
.payment-info .info {
padding: 30px 75px;
}
.order-review-data,
.order-details-area,
.shipment-details-area {
overflow: hidden;
}
.order-review-data > div,
.order-details-area > div,
.shipment-details-area > div {
float: right;
width: 48%;
margin: 0 1% 40px;
}
/*** ORDER DETAILS & SHIPPING DETAILS ***/
.order-details-page .section.options {
text-align: left;
}
.order-details-page .selected-checkout-attributes {
padding: 0 10px;
}
.order-details-page .tax-shipping-info {
text-align: left;
}
.order-details-page .totals {
float: left;
clear: both;
}
.shipment-details-page .tracking-number .tracking-url {
color: var(--theme-color);
}
/*** BLOG & NEWS ***/
.blog-posts .tags {
float: left;
width: 80%;
text-align: left;
}
.blog-posts .buttons {
float: right;
width: 20%;
text-align: right;
}
.new-comment {
text-align: center;
}
.new-comment .buttons {
text-align: center;
}
.comment-list .comment {
display: table;
width: 100%;
margin: 0;
}
.comment-list .comment:last-child {
border-bottom: 1px solid #ddd;
}
.comment-info {
display: table-cell;
width: 15%;
margin: 0;
vertical-align: top;
}
.comment-info .username {
min-height: 40px;
margin: 0;
border: none;
text-align: center;
}
.comment-info .avatar {
border: none;
}
.comment-info .avatar img {
max-width: 80%;
max-height: 80%;
}
.comment-content {
display: table-cell;
width: 85%;
border-right: 1px solid #ddd;
vertical-align: top;
text-align: right;
}
.comment-time {
min-height: 40px;
margin: 0;
background-color: #f6f6f6;
padding: 10px 15px;
font-size: 14px;
font-weight: normal;
}
.comment-title {
margin: 0 0 -20px;
padding: 20px;
}
.comment-body {
padding: 20px;
}
/*** FORUM & PROFILE ***/
.forum-actions,
.topic-actions {
overflow: hidden;
}
.forum-actions .actions,
.topic-actions .actions {
float: right;
}
.forum-actions .pager,
.topic-actions .pager {
float: left;
max-width: 450px;
}
.forum-actions .pager li,
.topic-actions .pager li {
margin: 2px 4px;
}
.forum-actions .pager.upper {
display: block;
}
.topic-actions.lower .actions {
display: block;
}
.topic-posts {
margin: 0 0 30px;
}
.topic-post {
display: table;
width: 100%;
margin: 0;
}
.topic-post .post-info {
display: table-cell;
width: 15%;
margin: 0;
vertical-align: top;
text-align: right;
}
.topic-post .user-info {
width: auto;
}
.topic-post .username {
min-height: 40px;
margin: 0;
border: none;
text-align: center;
}
.topic-post .avatar {
margin: auto;
border: none;
}
.topic-post .avatar img {
max-width: 80%;
max-height: 80%;
}
.topic-post .user-stats li {
margin: 0;
}
.topic-post .send-pm {
margin: 0 0 20px;
}
.topic-post .pm-button,
.profile-info-box .pm-button {
padding: 8px 16px;
font-size: 13px;
}
.topic-post .post-content {
display: table-cell;
width: 85%;
border-right: 1px solid #ddd;
vertical-align: top;
text-align: right;
}
.topic-post .post-head {
min-height: 40px;
overflow: hidden;
background-color: #f6f6f6;
}
.topic-post .post-time {
float: right;
margin: 0;
font-size: 14px;
font-weight: normal;
}
.topic-post .post-actions {
float: left;
margin: 0;
}
.topic-post .post-actions a {
margin: 0;
line-height: 20px;
}
.topic-post .post-actions .manage-post a {
}
.topic-post .post-actions .quote-post a {
min-width: 70px;
}
.topic-post .post-actions a.post-link-button {
margin: 0 10px 0 0;
border-right: 1px solid #ddd;
text-align: center;
}
.topic-post .post-text {
padding: 20px 5px;
}
.topic-post .post-vote {
padding: 20px 15px 20px 0;
}
.forum-table th.replies,
.forum-table th.views,
.forum-table th.votes,
.forum-table td.replies,
.forum-table td.views,
.forum-table td.votes {
display: table-cell;
}
.forum-table td.image {
max-width: none;
}
.forum-table td.image div {
max-width: none;
background-size: initial;
}
.ui-tabs-nav {
text-align: right;
}
.ui-tabs-nav li {
margin: 0 0 -1px 10px;
/*override jQuery UI styles, do not delete doubled properties*/
margin: 0 0 -1px 10px !important;
}
.profile-info-box .avatar {
float: right;
margin: 0 0 15px 15px;
}
.profile-info-box .profile-stats {
float: right;
text-align: right;
}
.profile-info-box .title {
text-align: right;
}
.profile-info-box .send-pm {
clear: both;
text-align: right;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,6 @@
body {
}
:root {
--theme-color: #E60000;
--active-color: #fb9b06;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 985 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 987 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 989 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 943 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1022 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 823 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1002 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 975 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 989 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 990 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 677 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1022 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 959 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 980 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 777 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 B

View File

@ -0,0 +1,49 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="../css/styles.css">
<link rel="stylesheet" href="../css/responsive-min-769.css">
</head>
<body>
<section class="feature-highlights">
<div class="container">
<h2 class="section-title">Why Choose Our Automobiles?</h2>
<div class="feature-item">
<img src="/images/uploaded/speed.jpg" alt="High Speed Performance">
<div class="feature-content">
<h3>Unmatched Speed & Performance</h3>
<p>Experience top-tier acceleration and control with our advanced automobile technology.</p>
</div>
</div>
<div class="feature-item">
<img src="/images/uploaded/safety.jpg" alt="Advanced Safety Features">
<div class="feature-content">
<h3>Advanced Safety Features</h3>
<p>Equipped with AI-powered braking, lane assistance, and 360-degree cameras.</p>
</div>
</div>
<div class="feature-item">
<img src="/images/uploaded/cofort.jpg" alt="Luxury Interior">
<div class="feature-content">
<h3>Luxury & Comfort</h3>
<p>Premium leather seats, ambient lighting, and state-of-the-art infotainment system.</p>
</div>
</div>
<div class="feature-item">
<img src="/images/uploaded/eco-friendly.jpg" alt="Eco-Friendly Technology">
<div class="feature-content">
<h3>Eco-Friendly Innovation</h3>
<p>Our hybrid & electric models reduce emissions while maximizing efficiency.</p>
</div>
</div>
</div>
</section>
</body>
</html>

View File

@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="../css/styles.css">
<link rel="stylesheet" href="../css/responsive-min-769.css">
</head>
<body>
<section class="welcome-section">
<div class="welcome-container">
<div class="welcome-image"><img src="/images/uploaded/banner_4_680x397_crop_top.webp" alt="About Our Store"></div>
<div class="welcome-text">
<h1>Welcome!</h1>
<h2>About Our Store</h2>
<p>
For 25 years, weve set the standard in used car retailing with one of the most trusted vehicle programs. Our commitment to quality means every car undergoes a rigorous inspection, ensuring reliability and peace of mind.
</p>
<p>
From family cars to luxury rides, we have options for every budget. Visit us today and let us help you find the perfect car!
</p>
</div>
</div>
</section>
</body>
</html>

View File

@ -0,0 +1,141 @@
@model CategoryModel
@using Nop.Core.Domain.Catalog
@using Nop.Core.Domain.Common
@using Nop.Core.Domain.Seo
@inject Nop.Core.IWebHelper webHelper
@inject SeoSettings seoSettings
@inject CommonSettings commonSettings
@{
Layout = "_ColumnsTwo";
//title
NopHtml.AddTitleParts(!string.IsNullOrEmpty(Model.MetaTitle) ? Model.MetaTitle : Model.Name);
//meta
NopHtml.AddMetaDescriptionParts(Model.MetaDescription);
NopHtml.AddMetaKeywordParts(Model.MetaKeywords);
//page class
NopHtml.AppendPageCssClassParts("html-category-page");
if (seoSettings.CanonicalUrlsEnabled)
{
var categoryUrl = Url.RouteUrl<Category>(new { SeName = Model.SeName }, webHelper.GetCurrentRequestProtocol()).ToLowerInvariant();
NopHtml.AddCanonicalUrlParts(categoryUrl, seoSettings.QueryStringInCanonicalUrlsEnabled);
}
var breadcrumbDelimiter = commonSettings.BreadcrumbDelimiter;
NopHtml.AddJsonLdParts(Model.JsonLd);
}
@*category breadcrumb*@
@section Breadcrumb
{
@if (Model.DisplayCategoryBreadcrumb)
{
<div class="breadcrumb">
<ul>
<li>
<a href="@Url.RouteUrl("Homepage")" title="@T("Categories.Breadcrumb.Top")">@T("Categories.Breadcrumb.Top")</a>
<span class="delimiter">@breadcrumbDelimiter</span>
</li>
@{ int position = 1; }
@foreach (var cat in Model.CategoryBreadcrumb)
{
var isLastCategory = cat.Id == Model.Id;
<li>
@if (isLastCategory)
{
<strong class="current-item">@cat.Name</strong>
<span id="@(Url.RouteUrl<Category>(new { SeName = cat.SeName }))"></span>
}
else
{
<a href="@(Url.RouteUrl<Category>(new { SeName = cat.SeName }))" title="@cat.Name">
<span>@cat.Name</span>
</a>
<span class="delimiter">@breadcrumbDelimiter</span>
}
</li>
position++;
}
</ul>
</div>
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CategoryDetailsAfterBreadcrumb, additionalData = Model })
}
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CategoryDetailsTop, additionalData = Model })
}
@section CatalogFilters {
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CategoryDetailsBeforeFilters, additionalData = Model })
@await Html.PartialAsync("_CatalogFilters", Model.CatalogProductsModel)
}
<div class="page category-page">
<div class="page-title">
<h1>@Model.Name</h1>
</div>
<div class="page-body">
@*description*@
@if (!string.IsNullOrWhiteSpace(Model.Description))
{
<div class="category-description">
@Html.Raw(Model.Description)
</div>
}
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CategoryDetailsBeforeSubcategories, additionalData = Model })
@*subcategories*@
@if (Model.SubCategories.Count > 0)
{
<div class="category-grid sub-category-grid">
<div class="item-grid">
@foreach (var item in Model.SubCategories)
{
<div class="item-box">
<div class="sub-category-item">
<h2 class="title">
<a href="@(Url.RouteUrl<Category>(new { SeName = item.SeName }))" title="@item.PictureModel.Title">
@item.Name
</a>
</h2>
<div class="picture">
<a href="@(Url.RouteUrl<Category>(new { SeName = item.SeName }))" title="@item.PictureModel.Title">
<img alt="@item.PictureModel.AlternateText" src="@item.PictureModel.ImageUrl" title="@item.PictureModel.Title" />
</a>
</div>
</div>
</div>
}
</div>
</div>
}
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CategoryDetailsBeforeFeaturedProducts, additionalData = Model })
@*featured products*@
@if (Model.FeaturedProducts.Count > 0)
{
<div class="product-grid featured-product-grid">
<div class="title">
<strong>@T("Products.FeaturedProducts")</strong>
</div>
<div class="item-grid">
@foreach (var item in Model.FeaturedProducts)
{
<div class="item-box">
@await Html.PartialAsync("_ProductBox", item)
</div>
}
</div>
</div>
}
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CategoryDetailsAfterFeaturedProducts, additionalData = Model })
@await Html.PartialAsync("_CatalogSelectors", Model.CatalogProductsModel)
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CategoryDetailsBeforeProductList, additionalData = Model })
@{
var catalogProductsViewData = new ViewDataDictionary(ViewData);
catalogProductsViewData["fetchUrl"] = Html.Raw(Url.RouteUrl("GetCategoryProducts", new { categoryId = Model.Id }));
}
@await Html.PartialAsync("_CatalogProducts", Model.CatalogProductsModel, catalogProductsViewData)
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.CategoryDetailsBottom, additionalData = Model })
</div>
</div>

View File

@ -0,0 +1,136 @@
@model LoginModel
@using Nop.Core
@using Nop.Core.Domain.Customers
@inject IWebHelper webHelper
@{
Layout = "_ColumnsOne";
//title
NopHtml.AddTitleParts(T("PageTitle.Login").Text);
//page class
NopHtml.AppendPageCssClassParts("html-login-page");
//register URL with return URL (if specified)
var registerUrl = Url.RouteUrl("Register", new { returnUrl = this.Context.Request.Query["returnUrl"] }, webHelper.GetCurrentRequestProtocol());
}
<div class="page login-page">
<div class="page-title">
<h1>@T("Account.Login.Welcome")</h1>
</div>
@await Html.PartialAsync("_ExternalAuthentication.Errors")
<div class="page-body">
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.LoginTop, additionalData = Model })
<div class="customer-blocks">
@if (Model.RegistrationType == UserRegistrationType.Disabled)
{
<div class="new-wrapper">
<div class="title">
@T("Account.Register")
</div>
<div class="text">
@T("Account.Register.Result.Disabled")
</div>
</div>
}
else if (Model.CheckoutAsGuest)
{
<div class="new-wrapper checkout-as-guest-or-register-block">
<div class="title">
<strong>@T("Account.Login.CheckoutAsGuestOrRegister")</strong>
</div>
<div class="text">
@await Component.InvokeAsync(typeof(TopicBlockViewComponent), new { systemName = "CheckoutAsGuestOrRegister" })
</div>
<div class="buttons">
<button type="button" class="button-1 checkout-as-guest-button" onclick="location.href='@Url.RouteUrl("Checkout")'">@T("Account.Login.CheckoutAsGuest")</button>
<button type="button" class="button-1 register-button" onclick="location.href='@registerUrl'">@T("Account.Register")</button>
</div>
</div>
}
else
{
<div class="new-wrapper register-block">
<div class="title">
<strong>@T("Account.Login.NewCustomer")</strong>
</div>
<div class="text">
@T("Account.Login.NewCustomerText")
</div>
<div class="buttons">
<button type="button" class="button-1 register-button" onclick="location.href='@registerUrl'">@T("Account.Register")</button>
</div>
</div>
}
<div class="returning-wrapper fieldset">
<form asp-route="Login" asp-route-returnurl="@Context.Request.Query["ReturnUrl"]" method="post" autocomplete="off">
<div asp-validation-summary="ModelOnly" class="message-error">@T("Account.Login.Unsuccessful")</div>
<div class="form-fields">
<div class="title">
<strong>@T("Account.Login.ReturningCustomer")</strong>
</div>
@if (Model.UsernamesEnabled)
{
<div class="inputs">
<label asp-for="Username" asp-postfix=":"></label>
<input asp-for="Username" class="username" autofocus="autofocus" />
<span asp-validation-for="Username"></span>
</div>
}
else
{
<div class="inputs">
<label asp-for="Email" asp-postfix=":"></label>
<input asp-for="Email" class="email" autofocus="autofocus" />
<span asp-validation-for="Email"></span>
</div>
}
<div class="inputs">
<label asp-for="Password" asp-postfix=":"></label>
<div class="login-password">
<input asp-for="Password" class="password" />
<span class="password-eye"></span>
</div>
<span asp-validation-for="Password"></span>
</div>
<div class="inputs reversed">
<input asp-for="RememberMe" />
<label asp-for="RememberMe"></label>
<span class="forgot-password">
<a asp-route="PasswordRecovery">@T("Account.Login.ForgotPassword")</a>
</span>
</div>
@if (Model.DisplayCaptcha)
{
<nop-captcha />
}
<div class="buttons">
<button type="submit" class="button-1 login-button">@T("Account.Login.LoginButton")</button>
</div>
</div>
</form>
</div>
</div>
<div class="external-authentication">
@await Component.InvokeAsync(typeof(ExternalMethodsViewComponent), "ExternalAuthentication")
</div>
@await Component.InvokeAsync(typeof(TopicBlockViewComponent), new { systemName = "LoginRegistrationInfo" })
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.LoginBottom, additionalData = Model })
</div>
</div>
<script asp-location="Footer">
$(function () {
const password = $("#@Html.IdFor(m => m.Password)");
$(".password-eye").on("click", function () {
// toggle the type attribute
const type = password.attr("type") === "password" ? "text" : "password";
password.attr("type", type);
// toggle the icon
$(this).toggleClass("password-eye-open");
});
});
</script>

View File

@ -0,0 +1,449 @@
@model RegisterModel
@{
Layout = "_ColumnsOne";
//title
NopHtml.AddTitleParts(T("PageTitle.Register").Text);
//page class
NopHtml.AppendPageCssClassParts("html-registration-page");
}
<div class="page registration-page">
<div class="page-title">
<h1>@T("Account.Register")</h1>
</div>
<div class="page-body">
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.RegisterTop, additionalData = Model })
<form asp-route="Register" asp-route-returnurl="@Context.Request.Query["ReturnUrl"]" method="post" autocomplete="off">
<div asp-validation-summary="ModelOnly" class="message-error"></div>
<div class="fieldset">
<div class="title">
<strong>@T("Account.YourPersonalDetails")</strong>
</div>
<div class="form-fields">
@if (Model.GenderEnabled)
{
<div class="inputs">
<label for="gender">@T("Account.Fields.Gender"):</label>
<div id="gender" class="gender">
<span class="male">
<input type="radio" asp-for="Gender" value="M" checked="@(Model.Gender == "M")" id="gender-male" />
<label class="forcheckbox" for="gender-male">@T("Account.Fields.Gender.Male")</label>
</span>
<span class="female">
<input type="radio" asp-for="Gender" value="F" checked="@(Model.Gender == "F")" id="gender-female" />
<label class="forcheckbox" for="gender-female">@T("Account.Fields.Gender.Female")</label>
</span>
@if (Model.NeutralGenderEnabled)
{
<span class="Neutral">
<input type="radio" asp-for="Gender" value="N" checked="@(Model.Gender == "N")" id="gender-neutral" />
<label class="forcheckbox" for="gender-neutral">@T("Account.Fields.Gender.Neutral")</label>
</span>
}
</div>
</div>
}
@if (Model.FirstNameEnabled)
{
<div class="inputs">
<label asp-for="FirstName" asp-postfix=":"></label>
<input asp-for="FirstName" />
@if (Model.FirstNameRequired)
{
<nop-required />
}
<span asp-validation-for="FirstName"></span>
</div>
}
@if (Model.LastNameEnabled)
{
<div class="inputs">
<label asp-for="LastName" asp-postfix=":"></label>
<input asp-for="LastName" />
@if (Model.LastNameRequired)
{
<nop-required />
}
<span asp-validation-for="LastName"></span>
</div>
}
@if (Model.DateOfBirthEnabled)
{
<div class="inputs date-of-birth">
<label>@T("Account.Fields.DateOfBirth"):</label>
<nop-date-picker asp-day-name="@Html.NameFor(x => x.DateOfBirthDay)"
asp-month-name="@Html.NameFor(x => x.DateOfBirthMonth)"
asp-year-name="@Html.NameFor(x => x.DateOfBirthYear)"
asp-begin-year="@(DateTime.Now.AddYears(-110))"
asp-end-year="@(DateTime.UtcNow)"
asp-selected-date="@Model.ParseDateOfBirth()" />
@if (Model.DateOfBirthRequired)
{
<nop-required />
}
<span asp-validation-for="DateOfBirthDay"></span>
<span asp-validation-for="DateOfBirthMonth"></span>
<span asp-validation-for="DateOfBirthYear"></span>
</div>
}
<div class="inputs">
<label asp-for="Email" asp-postfix=":"></label>
<input asp-for="Email" />
<nop-required />
<span asp-validation-for="Email"></span>
</div>
@if (Model.EnteringEmailTwice)
{
<div class="inputs">
<label asp-for="ConfirmEmail" asp-postfix=":"></label>
<input asp-for="ConfirmEmail" />
<nop-required />
<span asp-validation-for="ConfirmEmail"></span>
</div>
}
@if (Model.UsernamesEnabled)
{
<div class="inputs">
<label asp-for="Username" asp-postfix=":"></label>
<input asp-for="Username" />
<nop-required />
<span asp-validation-for="Username"></span>
@if (Model.CheckUsernameAvailabilityEnabled)
{
@await Html.PartialAsync("_CheckUsernameAvailability")
}
</div>
}
</div>
</div>
@if (Model.CompanyEnabled || Model.DisplayVatNumber)
{
<div class="fieldset">
<div class="title">
<strong>@T("Account.CompanyDetails")</strong>
</div>
<div class="form-fields">
@if (Model.CompanyEnabled)
{
<div class="inputs">
<label asp-for="Company" asp-postfix=":"></label>
<input asp-for="Company" />
@if (Model.CompanyRequired)
{
<nop-required />
}
<span asp-validation-for="Company"></span>
</div>
}
@if (Model.DisplayVatNumber)
{
<div class="inputs">
<label asp-for="VatNumber" asp-postfix=":"></label>
<input asp-for="VatNumber" />
@if (Model.VatNumberRequired)
{
<nop-required />
}
<span asp-validation-for="VatNumber"></span>
<span class="vat-note"><em>@T("Account.Fields.VatNumber.Note")</em></span>
</div>
}
</div>
</div>
}
@if (Model.StreetAddressEnabled ||
Model.StreetAddress2Enabled ||
Model.ZipPostalCodeEnabled ||
Model.CityEnabled ||
Model.CountyEnabled ||
Model.CountryEnabled)
{
<div class="fieldset">
<div class="title">
<strong>@T("Account.YourAddress")</strong>
</div>
<div class="form-fields">
@if (Model.StreetAddressEnabled)
{
<div class="inputs">
<label asp-for="StreetAddress" asp-postfix=":"></label>
<input asp-for="StreetAddress" />
@if (Model.StreetAddressRequired)
{
<nop-required />
}
<span asp-validation-for="StreetAddress"></span>
</div>
}
@if (Model.StreetAddress2Enabled)
{
<div class="inputs">
<label asp-for="StreetAddress2" asp-postfix=":"></label>
<input asp-for="StreetAddress2" />
@if (Model.StreetAddress2Required)
{
<nop-required />
}
<span asp-validation-for="StreetAddress2"></span>
</div>
}
@if (Model.ZipPostalCodeEnabled)
{
<div class="inputs">
<label asp-for="ZipPostalCode" asp-postfix=":"></label>
<input asp-for="ZipPostalCode" />
@if (Model.ZipPostalCodeRequired)
{
<nop-required />
}
<span asp-validation-for="ZipPostalCode"></span>
</div>
}
@if (Model.CountyEnabled)
{
<div class="inputs">
<label asp-for="County" asp-postfix=":"></label>
<input asp-for="County" />
@if (Model.CountyRequired)
{
<nop-required />
}
<span asp-validation-for="County"></span>
</div>
}
@if (Model.CityEnabled)
{
<div class="inputs">
<label asp-for="City" asp-postfix=":"></label>
<input asp-for="City" />
@if (Model.CityRequired)
{
<nop-required />
}
<span asp-validation-for="City"></span>
</div>
}
@if (Model.CountryEnabled)
{
<div class="inputs">
<label asp-for="CountryId" asp-postfix=":"></label>
<select asp-for="CountryId" asp-items="Model.AvailableCountries"
data-trigger="country-select"
data-url="@(Url.RouteUrl("GetStatesByCountryId"))"
data-stateprovince="#@Html.IdFor(model => model.StateProvinceId)"
data-loading="#states-loading-progress"></select>
@if (Model.CountryRequired)
{
<nop-required />
}
<span asp-validation-for="CountryId"></span>
</div>
}
@if (Model.CountryEnabled && Model.StateProvinceEnabled)
{
<div class="inputs">
<label asp-for="StateProvinceId" asp-postfix=":"></label>
<select asp-for="StateProvinceId" asp-items="Model.AvailableStates"></select>
@if (Model.StateProvinceRequired)
{
<nop-required />
}
<span id="states-loading-progress" style="display: none;" class="please-wait">@T("Common.Wait")</span>
<span asp-validation-for="StateProvinceId"></span>
</div>
}
</div>
</div>
}
@if (Model.PhoneEnabled || Model.FaxEnabled)
{
<div class="fieldset">
<div class="title">
<strong>@T("Account.YourContactInformation")</strong>
</div>
<div class="form-fields">
@if (Model.PhoneEnabled)
{
<div class="inputs">
<label asp-for="Phone" asp-postfix=":"></label>
<input asp-for="Phone" />
@if (Model.PhoneRequired)
{
<nop-required />
}
<span asp-validation-for="Phone"></span>
</div>
}
@if (Model.FaxEnabled)
{
<div class="inputs">
<label asp-for="Fax" asp-postfix=":"></label>
<input asp-for="Fax" />
@if (Model.FaxRequired)
{
<nop-required />
}
<span asp-validation-for="Fax"></span>
</div>
}
</div>
</div>
}
@if (Model.NewsletterEnabled || Model.CustomerAttributes.Count > 0)
{
<div class="fieldset">
<div class="title">
<strong>@T("Account.Options")</strong>
</div>
<div class="form-fields">
@if (Model.NewsletterEnabled)
{
<div class="inputs">
<label asp-for="Newsletter" asp-postfix=":"></label>
<input asp-for="Newsletter" />
<span asp-validation-for="Newsletter"></span>
</div>
}
@if (Model.CustomerAttributes.Count > 0)
{
@await Html.PartialAsync("_CustomerAttributes", Model.CustomerAttributes)
}
</div>
</div>
}
@if (Model.AllowCustomersToSetTimeZone)
{
<div class="fieldset">
<div class="title">
<strong>@T("Account.Preferences")</strong>
</div>
<div class="form-fields">
<div class="inputs">
<label asp-for="TimeZoneId" asp-postfix=":"></label>
<select asp-for="TimeZoneId" asp-items="Model.AvailableTimeZones"></select>
<span asp-validation-for="TimeZoneId"></span>
</div>
</div>
</div>
}
<div class="fieldset">
<div class="title">
<strong>@T("Account.YourPassword")</strong>
</div>
<div class="form-fields">
<div class="inputs">
<label asp-for="Password" asp-postfix=":"></label>
<input asp-for="Password" />
<nop-required />
<span asp-validation-for="Password"></span>
</div>
<div class="inputs">
<label asp-for="ConfirmPassword" asp-postfix=":"></label>
<input asp-for="ConfirmPassword" />
<nop-required />
<span asp-validation-for="ConfirmPassword"></span>
</div>
@if (Model.DisplayCaptcha)
{
<nop-captcha />
}
@if (Model.HoneypotEnabled)
{
@Html.Raw(Html.GenerateHoneypotInput())
}
</div>
</div>
@if (Model.AcceptPrivacyPolicyEnabled || Model.GdprConsents.Count > 0)
{
<div class="fieldset">
<div class="title">
<strong>@T("Account.UserAgreement")</strong>
</div>
<div class="form-fields">
@if (Model.AcceptPrivacyPolicyEnabled)
{
<script asp-location="Footer">
$(function() {
$('#register-button').on('click', function() {
if ($('#accept-consent').is(':checked')) {
//do some stuff
return true;
} else {
//just show validation errors, don't post
alert('@Html.Raw(JavaScriptEncoder.Default.Encode(T("Account.Fields.AcceptPrivacyPolicy.Required").Text))');
return false;
}
});
});
</script>
<div class="inputs accept-consent">
<input id="accept-consent" type="checkbox" name="accept-consent" />
<label for="accept-consent">@T("Account.Fields.AcceptPrivacyPolicy")</label>
@if (Model.AcceptPrivacyPolicyPopup)
{
<span class="read" id="read-privacyinfo">@T("Account.Fields.AcceptPrivacyPolicy.Read")</span>
<script asp-location="Footer">
$(function() {
$('#read-privacyinfo').on('click',
function(e) {
displayPopupContentFromUrl(
'@Url.RouteUrl("TopicPopup", new {SystemName = "privacyinfo"})',
'@T("Account.Fields.AcceptPrivacyPolicy")');
});
});
</script>
}
else
{
<a class="read" id="read-privacyinfo" href="@Url.RouteTopicUrl("privacyinfo")">@T("Account.Fields.AcceptPrivacyPolicy.Read")</a>
}
</div>
}
@if (Model.GdprConsents.Count > 0)
{
foreach (var consent in Model.GdprConsents)
{
if (consent.IsRequired)
{
<script asp-location="Footer">
$(function() {
$('#register-button').on('click', function() {
if ($('#consent@(consent.Id)').is(':checked')) {
//do some stuff
return true;
} else {
//just show validation errors, don't post
alert('@Html.Raw(JavaScriptEncoder.Default.Encode(consent.RequiredMessage))');
return false;
}
});
});
</script>
}
<div class="inputs accept-consent">
<input id="consent@(consent.Id)" type="checkbox" name="consent@(consent.Id)" checked="@consent.Accepted" />
<label for="consent@(consent.Id)">@consent.Message</label>
</div>
}
}
</div>
</div>
}
<div class="buttons">
<button type="submit" name="register-button" id="register-button" class="button-1 register-next-step-button">@T("Account.Register.Button")</button>
</div>
</form>
<div class="external-authentication">
@await Component.InvokeAsync(typeof(ExternalMethodsViewComponent), "ExternalAuthentication")
</div>
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.RegisterBottom, additionalData = Model })
</div>
</div>

View File

@ -0,0 +1,44 @@
@using Nop.Services.Localization
@using Nop.Core
@inject ILocalizationService localizationService
@inject IStoreContext storeContext
@{
Layout = "_ColumnsOne";
var homepageTitle = await localizationService.GetLocalizedAsync(await storeContext.GetCurrentStoreAsync(), s => s.HomepageTitle);
//title
if (!string.IsNullOrEmpty(homepageTitle))
{
NopHtml.AddTitleParts(homepageTitle);
}
var homepageDescription = await localizationService.GetLocalizedAsync(await storeContext.GetCurrentStoreAsync(), s => s.HomepageDescription);
//meta
if (!string.IsNullOrEmpty(homepageDescription))
{
NopHtml.AddMetaDescriptionParts(homepageDescription);
}
//page class
NopHtml.AppendPageCssClassParts("html-home-page");
}
<div class="page home-page">
<div class="page-body">
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HomepageTop })
@await Component.InvokeAsync(typeof(TopicBlockViewComponent), new { systemName = "HomepageText" })
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HomepageBeforeCategories })
@await Component.InvokeAsync(typeof(HomepageCategoriesViewComponent))
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HomepageBeforeProducts })
@await Component.InvokeAsync(typeof(HomepageProductsViewComponent))
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HomepageBeforeBestSellers })
@await Component.InvokeAsync(typeof(HomepageBestSellersViewComponent))
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HomepageBeforeNews })
@await Component.InvokeAsync(typeof(HomepageNewsViewComponent))
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HomepageBeforePoll })
@await Component.InvokeAsync(typeof(HomepagePollsViewComponent))
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HomepageBottom })
</div>
</div>

View File

@ -0,0 +1,213 @@
@model ProductDetailsModel
@using Nop.Core
@using Nop.Core.Domain.Catalog
@using Nop.Core.Domain.Seo
@using Nop.Services.Html
@inject IHtmlFormatter htmlFormatter
@inject IWebHelper webHelper
@inject SeoSettings seoSettings
@{
Layout = "_ColumnsOne";
//title
NopHtml.AddTitleParts(!string.IsNullOrEmpty(Model.MetaTitle) ? Model.MetaTitle : Model.Name);
//meta
NopHtml.AddMetaDescriptionParts(Model.MetaDescription);
NopHtml.AddMetaKeywordParts(Model.MetaKeywords);
//page class
NopHtml.AppendPageCssClassParts("html-product-details-page");
//canonical URL
if (seoSettings.CanonicalUrlsEnabled)
{
var productUrl = Url.RouteUrl<Product>(new { SeName = Model.SeName }, webHelper.GetCurrentRequestProtocol()).ToLowerInvariant();
NopHtml.AddCanonicalUrlParts(productUrl, seoSettings.QueryStringInCanonicalUrlsEnabled);
}
//open graph META tags
if (seoSettings.OpenGraphMetaTags)
{
NopHtml.AddHeadCustomParts("<meta property=\"og:type\" content=\"product\" />");
NopHtml.AddHeadCustomParts("<meta property=\"og:title\" content=\"" + Html.Encode(Model.Name) + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"og:description\" content=\"" + Html.Encode(htmlFormatter.StripTags(Model.MetaDescription)) + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"og:image\" content=\"" + Model.DefaultPictureModel.ImageUrl + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"og:image:url\" content=\"" + Model.DefaultPictureModel.ImageUrl + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"og:url\" content=\"" + webHelper.GetThisPageUrl(false) + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"og:site_name\" content=\"" + Html.Encode(Model.CurrentStoreName) + "\" />");
}
//Twitter META tags
if (seoSettings.TwitterMetaTags)
{
NopHtml.AddHeadCustomParts("<meta property=\"twitter:card\" content=\"summary\" />");
NopHtml.AddHeadCustomParts("<meta property=\"twitter:site\" content=\"" + Html.Encode(Model.CurrentStoreName) + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"twitter:title\" content=\"" + Html.Encode(Model.Name) + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"twitter:description\" content=\"" + Html.Encode(htmlFormatter.StripTags(Model.MetaDescription)) + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"twitter:image\" content=\"" + Model.DefaultPictureModel.ImageUrl + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"twitter:url\" content=\"" + webHelper.GetThisPageUrl(false) + "\" />");
}
NopHtml.AddJsonLdParts(Model.JsonLd);
}
<!--product breadcrumb-->
@section Breadcrumb
{
@await Html.PartialAsync("_ProductBreadcrumb", Model.Breadcrumb)
}
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsAfterBreadcrumb, additionalData = Model })
<div class="page product-details-page">
<div class="page-body">
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsTop, additionalData = Model })
<form asp-route="Product" asp-route-sename="@Model.SeName" method="post" id="product-details-form">
<div data-productid="@Model.Id">
<div class="product-essential">
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsEssentialTop, additionalData = Model })
<div class="gallery">
<!--product pictures-->
@await Html.PartialAsync("_ProductDetailsPictures", Model)
<!--product videos-->
@await Html.PartialAsync("_ProductDetailsVideos", Model)
</div>
<div class="overview">
@await Html.PartialAsync("_Discontinued", Model)
<div class="product-name">
<h1>
@Model.Name
</h1>
</div>
@if (!string.IsNullOrEmpty(Model.ShortDescription))
{
<div class="short-description">
@Html.Raw(Model.ShortDescription)
</div>
}
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsOverviewTop, additionalData = Model })
<!--product reviews-->
@await Html.PartialAsync("_ProductReviewOverview", Model.ProductReviewOverview)
<!--product manufacturers-->
@await Html.PartialAsync("_ProductManufacturers", Model.ProductManufacturers)
<!--compare, email a friend-->
<div class="overview-buttons">
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsInsideOverviewButtonsBefore, additionalData = Model })
@await Html.PartialAsync("_CompareProductsButton", Model)
@await Html.PartialAsync("_ProductEmailAFriendButton", Model)
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsInsideOverviewButtonsAfter, additionalData = Model })
</div>
@await Html.PartialAsync("_ShareButton", Model)
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsOverviewBottom, additionalData = Model })
</div>
@if (!string.IsNullOrEmpty(Model.FullDescription))
{
<div class="full-description">
@Html.Raw(Model.FullDescription)
</div>
}
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsEssentialBottom, additionalData = Model })
</div>
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsBeforeCollateral, additionalData = Model })
<div class="product-collateral">
<!--associated products-->
<div class="product-variant-list">
@foreach (var variant in Model.AssociatedProducts)
{
<div class="product-variant-line" data-productid="@variant.Id">
@if (!string.IsNullOrWhiteSpace(variant.DefaultPictureModel.ImageUrl))
{
<div class="variant-picture">
<img alt="@variant.DefaultPictureModel.AlternateText" src="@variant.DefaultPictureModel.ImageUrl"
title="@variant.DefaultPictureModel.Title" id="main-product-img-@variant.Id" />
</div>
}
<div class="variant-overview">
@if (!string.IsNullOrWhiteSpace(variant.Name))
{
<div class="variant-name">
@variant.Name
</div>
}
@if (!string.IsNullOrWhiteSpace(variant.ShortDescription))
{
<div class="variant-description">
@Html.Raw(variant.ShortDescription)
</div>
}
<!--availability-->
@await Html.PartialAsync("_Availability", variant)
<!--SKU, MAN, GTIN, vendor-->
@await Html.PartialAsync("_SKU_Man_GTIN_Ven", variant)
<!--delivery-->
@await Html.PartialAsync("_DeliveryInfo", variant)
<!--sample download-->
@await Html.PartialAsync("_DownloadSample", variant)
<!--attributes-->
@{
var dataDictAttributes = new ViewDataDictionary(ViewData);
dataDictAttributes.TemplateInfo.HtmlFieldPrefix = $"attributes_{variant.Id}";
@await Html.PartialAsync("_ProductAttributes", variant, dataDictAttributes)
}
<!--gift card-->
@{
var dataDictGiftCard = new ViewDataDictionary(ViewData);
dataDictGiftCard.TemplateInfo.HtmlFieldPrefix = $"giftcard_{variant.Id}";
@await Html.PartialAsync("_GiftCardInfo", variant.GiftCard, dataDictGiftCard)
}
<!--rental info-->
@{
var dataDictRental = new ViewDataDictionary(ViewData);
dataDictRental.TemplateInfo.HtmlFieldPrefix = $"rental_{variant.Id}";
@await Html.PartialAsync("_RentalInfo", variant, dataDictRental)
}
<!--price & add to cart-->
@{
var dataDictPrice = new ViewDataDictionary(ViewData);
dataDictPrice.TemplateInfo.HtmlFieldPrefix = $"price_{variant.Id}";
@await Html.PartialAsync("_ProductPrice", variant.ProductPrice, dataDictPrice)
}
<!--price breaks-->
@await Html.PartialAsync("_ProductTierPrices", variant.TierPrices)
@{
var dataDictAddToCart = new ViewDataDictionary(ViewData);
dataDictAddToCart.TemplateInfo.HtmlFieldPrefix = $"addtocart_{variant.Id}";
@await Html.PartialAsync("_AddToCart", variant.AddToCart, dataDictAddToCart)
}
<!--estimate shipping-->
@{
var dataDictEstimateShipping = new ViewDataDictionary(ViewData);
dataDictEstimateShipping.TemplateInfo.HtmlFieldPrefix = $"estimate_shipping_{variant.Id}";
@await Html.PartialAsync("_ProductEstimateShipping", variant.ProductEstimateShipping, dataDictEstimateShipping)
}
<!--wishlist-->
@{
var dataDictAddToWishlist = new ViewDataDictionary(ViewData);
dataDictAddToWishlist.TemplateInfo.HtmlFieldPrefix = $"addtocart_{variant.Id}";
@await Html.PartialAsync("_AddToWishlist", variant.AddToCart, dataDictAddToWishlist)
}
</div>
</div>
}
@if (!Model.AssociatedProducts.Any())
{
<div class="no-associated-products">
@T("Products.NoAssociatedProducts")
</div>
}
</div>
@await Html.PartialAsync("_ProductSpecifications", Model.ProductSpecificationModel)
@await Html.PartialAsync("_ProductTags", Model.ProductTags)
</div>
@*we do not display "also purchased" for grouped products
@await Component.InvokeAsync(typeof(ProductsAlsoPurchasedViewComponent), new { productId = Model.Id })*@
@await Component.InvokeAsync(typeof(RelatedProductsViewComponent), new { productId = Model.Id })
</div>
</form>
<!--product reviews-->
@if (Model.ProductReviewOverview.AllowCustomerReviews)
{
@await Html.PartialAsync("_ProductReviews", Model.ProductReviews)
}
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsBottom, additionalData = Model })
</div>
</div>

View File

@ -0,0 +1,177 @@
@model ProductDetailsModel
@using Nop.Core
@using Nop.Core.Domain.Catalog
@using Nop.Core.Domain.Seo
@using Nop.Services.Html
@inject IHtmlFormatter htmlFormatter
@inject IWebHelper webHelper
@inject SeoSettings seoSettings
@{
Layout = "_ColumnsOne";
//title
NopHtml.AddTitleParts(!string.IsNullOrEmpty(Model.MetaTitle) ? Model.MetaTitle : Model.Name);
//meta
NopHtml.AddMetaDescriptionParts(Model.MetaDescription);
NopHtml.AddMetaKeywordParts(Model.MetaKeywords);
//page class
NopHtml.AppendPageCssClassParts("html-product-details-page");
//canonical URL
if (seoSettings.CanonicalUrlsEnabled)
{
var productUrl = Url.RouteUrl<Product>(new { SeName = Model.SeName }, webHelper.GetCurrentRequestProtocol()).ToLowerInvariant();
NopHtml.AddCanonicalUrlParts(productUrl, seoSettings.QueryStringInCanonicalUrlsEnabled);
}
//open graph META tags
if (seoSettings.OpenGraphMetaTags)
{
NopHtml.AddHeadCustomParts("<meta property=\"og:type\" content=\"product\" />");
NopHtml.AddHeadCustomParts("<meta property=\"og:title\" content=\"" + Html.Encode(Model.Name) + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"og:description\" content=\"" + Html.Encode(htmlFormatter.StripTags(Model.MetaDescription)) + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"og:image\" content=\"" + Model.DefaultPictureModel.ImageUrl + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"og:image:url\" content=\"" + Model.DefaultPictureModel.ImageUrl + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"og:url\" content=\"" + webHelper.GetThisPageUrl(false) + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"og:site_name\" content=\"" + Html.Encode(Model.CurrentStoreName) + "\" />");
}
//Twitter META tags
if (seoSettings.TwitterMetaTags)
{
NopHtml.AddHeadCustomParts("<meta property=\"twitter:card\" content=\"summary\" />");
NopHtml.AddHeadCustomParts("<meta property=\"twitter:site\" content=\"" + Html.Encode(Model.CurrentStoreName) + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"twitter:title\" content=\"" + Html.Encode(Model.Name) + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"twitter:description\" content=\"" + Html.Encode(htmlFormatter.StripTags(Model.MetaDescription)) + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"twitter:image\" content=\"" + Model.DefaultPictureModel.ImageUrl + "\" />");
NopHtml.AddHeadCustomParts("<meta property=\"twitter:url\" content=\"" + webHelper.GetThisPageUrl(false) + "\" />");
}
NopHtml.AddJsonLdParts(Model.JsonLd);
}
<!--product breadcrumb-->
@section Breadcrumb
{
@await Html.PartialAsync("_ProductBreadcrumb", Model.Breadcrumb)
}
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsAfterBreadcrumb, additionalData = Model })
<div class="page product-details-page">
<div class="page-body">
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsTop, additionalData = Model })
<form asp-route="Product" asp-route-sename="@Model.SeName" method="post" id="product-details-form">
<div data-productid="@Model.Id">
<div class="product-essential">
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsEssentialTop, additionalData = Model })
<div class="gallery">
<!--product pictures-->
@await Html.PartialAsync("_ProductDetailsPictures", Model)
<!--product videos-->
@await Html.PartialAsync("_ProductDetailsVideos", Model)
</div>
<div class="overview">
@await Html.PartialAsync("_Discontinued", Model)
<div class="product-name">
<h1>
@Model.Name
</h1>
</div>
@if (!string.IsNullOrEmpty(Model.ShortDescription))
{
<div class="short-description">
@Html.Raw(Model.ShortDescription)
</div>
}
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsOverviewTop, additionalData = Model })
<!--product reviews-->
@await Html.PartialAsync("_ProductReviewOverview", Model.ProductReviewOverview)
<!--manufacturers-->
@await Html.PartialAsync("_ProductManufacturers", Model.ProductManufacturers)
<!--availability-->
@await Html.PartialAsync("_Availability", Model)
<!--SKU, MAN, GTIN, vendor-->
@await Html.PartialAsync("_SKU_Man_GTIN_Ven", Model)
<!--delivery-->
@await Html.PartialAsync("_DeliveryInfo", Model)
<!--sample download-->
@await Html.PartialAsync("_DownloadSample", Model)
<!--attributes-->
@{
var dataDictAttributes = new ViewDataDictionary(ViewData);
dataDictAttributes.TemplateInfo.HtmlFieldPrefix = $"attributes_{Model.Id}";
@await Html.PartialAsync("_ProductAttributes", Model, dataDictAttributes)
}
<!--gift card-->
@{
var dataDictGiftCard = new ViewDataDictionary(ViewData);
dataDictGiftCard.TemplateInfo.HtmlFieldPrefix = $"giftcard_{Model.Id}";
@await Html.PartialAsync("_GiftCardInfo", Model.GiftCard, dataDictGiftCard)
}
<!--rental info-->
@{
var dataDictRental = new ViewDataDictionary(ViewData);
dataDictRental.TemplateInfo.HtmlFieldPrefix = $"rental_{Model.Id}";
@await Html.PartialAsync("_RentalInfo", Model, dataDictRental)
}
<!--price & add to cart & estimate shipping-->
@{
var dataDictPrice = new ViewDataDictionary(ViewData);
dataDictPrice.TemplateInfo.HtmlFieldPrefix = $"price_{Model.Id}";
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductPriceTop, additionalData = Model })
@await Html.PartialAsync("_ProductPrice", Model.ProductPrice, dataDictPrice)
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductPriceBottom, additionalData = Model })
@await Html.PartialAsync("_ProductTierPrices", Model.TierPrices)
<div class="cart-compare-wrap">
@{
var dataDictAddToCart = new ViewDataDictionary(ViewData);
dataDictAddToCart.TemplateInfo.HtmlFieldPrefix = $"addtocart_{Model.Id}";
}
@await Html.PartialAsync("_AddToCart", Model.AddToCart, dataDictAddToCart)
@await Html.PartialAsync("_CompareProductsButton", Model)
</div>
@await Html.PartialAsync("_ProductEstimateShipping", Model.ProductEstimateShipping)
}
<!--wishlist, compare, email a friend-->
<div class="overview-buttons">
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsInsideOverviewButtonsBefore, additionalData = Model })
@{
var dataDictAddToWishlist = new ViewDataDictionary(ViewData);
dataDictAddToWishlist.TemplateInfo.HtmlFieldPrefix = $"addtocart_{Model.Id}";
@await Html.PartialAsync("_AddToWishlist", Model.AddToCart, dataDictAddToWishlist)
}
@await Html.PartialAsync("_ProductEmailAFriendButton", Model)
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsInsideOverviewButtonsAfter, additionalData = Model })
</div>
@await Html.PartialAsync("_ShareButton", Model)
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsOverviewBottom, additionalData = Model })
</div>
@if (!string.IsNullOrEmpty(Model.FullDescription))
{
<div class="full-description">
@Html.Raw(Model.FullDescription)
</div>
}
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsEssentialBottom, additionalData = Model })
</div>
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsBeforeCollateral, additionalData = Model })
<div class="product-collateral">
@await Html.PartialAsync("_ProductSpecifications", Model.ProductSpecificationModel)
@await Html.PartialAsync("_ProductTags", Model.ProductTags)
</div>
@await Component.InvokeAsync(typeof(ProductsAlsoPurchasedViewComponent), new { productId = Model.Id })
@await Component.InvokeAsync(typeof(RelatedProductsViewComponent), new { productId = Model.Id })
</div>
</form>
<!--product reviews-->
@if (Model.ProductReviewOverview.AllowCustomerReviews)
{
@await Html.PartialAsync("_ProductReviews", Model.ProductReviews)
}
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsBottom, additionalData = Model })
</div>
</div>

View File

@ -0,0 +1,100 @@
@model ProductDetailsModel.AddToCartModel
@using Nop.Core.Domain.Orders
@if (Model.UpdatedShoppingCartItemId > 0)
{
<input asp-for="UpdatedShoppingCartItemId" type="hidden" />
}
@if (!Model.DisableBuyButton || Model.CustomerEntersPrice)
{
<div class="add-to-cart">
@if (Model.CustomerEntersPrice)
{
<div class="customer-entered-price">
<div class="price-input">
<label asp-for="CustomerEnteredPrice" asp-postfix=":" class="enter-price-label"></label>
@*round price*@
<input asp-for="CustomerEnteredPrice" value="@Convert.ToInt32(Math.Ceiling(Model.CustomerEnteredPrice))" class="enter-price-input" />
</div>
<div class="price-range">
@Model.CustomerEnteredPriceRange
</div>
</div>
}
@if (!string.IsNullOrEmpty(Model.MinimumQuantityNotification))
{
<div class="min-qty-notification">@Model.MinimumQuantityNotification</div>
}
@if (!Model.DisableBuyButton)
{
<div class="add-to-cart-panel">
<label asp-for="EnteredQuantity" asp-postfix=":" class="qty-label"></label>
@if (Model.AllowedQuantities.Count > 0)
{
<select asp-for="EnteredQuantity" asp-items="Model.AllowedQuantities" id="product_enteredQuantity_@Model.ProductId" class="qty-dropdown" aria-label=@T("Products.Qty.AriaLabel")></select>
<script asp-location="Footer">
$(function() {
$("#product_enteredQuantity_@Model.ProductId").on("change", function () {
var data = {
productId: @Model.ProductId,
quantity: $('#product_enteredQuantity_@Model.ProductId').find(":selected").text()
};
$(document).trigger({ type: "product_quantity_changed", changedData: data });
});
});
</script>
}
else
{
<input asp-for="EnteredQuantity" id="product_enteredQuantity_@Model.ProductId" class="qty-input" type="text" aria-label=@T("Products.Qty.AriaLabel")/>
<script asp-location="Footer">
//when a customer clicks 'Enter' button we submit the "add to cart" button (if visible)
$(function() {
$("#@Html.IdFor(model => model.EnteredQuantity)").on("keydown", function(event) {
if (event.keyCode == 13) {
$("#add-to-cart-button-@Model.ProductId").trigger("click");
return false;
}
});
$("#product_enteredQuantity_@Model.ProductId").on("input propertychange paste", function () {
var data = {
productId: @Model.ProductId,
quantity: $('#product_enteredQuantity_@Model.ProductId').val()
};
$(document).trigger({ type: "product_quantity_changed", changedData: data });
});
});
</script>
}
@{
var addToCartText = "";
if (Model.UpdatedShoppingCartItemId > 0 && Model.UpdateShoppingCartItemType.HasValue && Model.UpdateShoppingCartItemType.Value == ShoppingCartType.ShoppingCart)
{
addToCartText = T("ShoppingCart.AddToCart.Update").Text;
}
else
{
addToCartText = T("ShoppingCart.AddToCart").Text;
if (Model.IsRental)
{
addToCartText = T("ShoppingCart.Rent").Text;
}
if (Model.AvailableForPreOrder)
{
addToCartText = T("ShoppingCart.PreOrder").Text;
}
}
<button type="button" id="add-to-cart-button-@Model.ProductId" class="button-1 add-to-cart-button" data-productid="@Model.ProductId" onclick="AjaxCart.addproducttocart_details('@Url.RouteUrl("AddProductToCart-Details", new {productId = Model.ProductId, shoppingCartTypeId = (int) ShoppingCartType.ShoppingCart})', '#product-details-form');return false;">@T("Nopstation.Theme.CarHaven.ProductBox.BuyNow")</button>
}
</div>
if (!string.IsNullOrEmpty(Model.PreOrderAvailabilityStartDateTimeUserTime))
{
<div class="pre-order-availability-date">
<label>@T("ShoppingCart.PreOrderAvailability"):</label>
@Html.Raw(Model.PreOrderAvailabilityStartDateTimeUserTime)
</div>
}
}
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.ProductDetailsAddInfo, additionalData = Model })
</div>
}

View File

@ -0,0 +1,242 @@
@model FooterModel
@using Nop.Core
@using Nop.Core.Domain.Tax
@using Nop.Core.Domain.Topics
@using Nop.Services.Configuration;
@using Nop.Services.Localization
@using Nop.Services.Media;
@inject IWorkContext workContext
@inject ILocalizationService localizationService
@inject IPictureService pictureService
@inject IStoreContext storeContext
@inject ISettingService settingService
@inject IThemeContext themeContext
@{
var themeName = await themeContext.GetWorkingThemeNameAsync();
var language = await workContext.GetWorkingLanguageAsync();
var store = await storeContext.GetCurrentStoreAsync();
var storeName = await localizationService.GetLocalizedAsync(store, s => s.Name);
var columns = 1;
var hideDesignedByNopStation = await settingService.GetSettingByKeyAsync<bool>(
"CarHavenSettings.HideDesignedByNopStationAtFooter", storeId: store.Id,loadSharedValueIfNotFound: true);
var showSupportedCards = await settingService.GetSettingByKeyAsync<bool>(
"CarHavenSettings.ShowSupportedCardsAtFooter", storeId: store.Id, loadSharedValueIfNotFound: true);
var supportedCardsImageUrl = "";
var pictureId = 0;
if (hideDesignedByNopStation)
{
columns++;
}
if (showSupportedCards)
{
columns++;
pictureId = await settingService.GetSettingByKeyAsync<int>("CarHavenSettings.FooterSupportedCardsPictureId",
storeId: store.Id,
loadSharedValueIfNotFound: true
);
supportedCardsImageUrl = await pictureService.GetPictureUrlAsync(pictureId);
}
if (!Model.HidePoweredByNopCommerce)
columns++;
}
<div class="footer">
<div class="footer-upper">
<div class="footer-links">
<div class="footer-block information">
<div class="title">
<strong>@T("Footer.Information")</strong>
</div>
<ul class="list">
@if (Model.SitemapEnabled && Model.DisplaySitemapFooterItem)
{
<li><a href="@Url.RouteUrl("Sitemap")">@T("Sitemap")</a></li>
}
@foreach (var topic in Model.Topics.Where(x => x.IncludeInFooterColumn1).ToList())
{
<li><a href="@(Url.RouteUrl<Topic>(new { SeName = topic.SeName }))">@topic.Name</a></li>
}
@if (Model.DisplayContactUsFooterItem)
{
<li><a href="@Url.RouteUrl("ContactUs")">@T("ContactUs")</a></li>
}
</ul>
</div>
<div class="footer-block customer-service">
<div class="title">
<strong>@T("Footer.CustomerService")</strong>
</div>
<ul class="list">
@if (Model.SearchEnabled && Model.DisplayProductSearchFooterItem)
{
<li><a href="@Url.RouteUrl("ProductSearch")">@T("Search")</a> </li>
}
@if (Model.NewsEnabled && Model.DisplayNewsFooterItem)
{
<li><a href="@Url.RouteUrl("NewsArchive")">@T("News")</a></li>
}
@if (Model.BlogEnabled && Model.DisplayBlogFooterItem)
{
<li><a href="@Url.RouteUrl("Blog")">@T("Blog")</a></li>
}
@if (Model.ForumEnabled && Model.DisplayForumsFooterItem)
{
<li><a href="@Url.RouteUrl("Boards")">@T("Forum.Forums")</a></li>
}
@if (Model.RecentlyViewedProductsEnabled && Model.DisplayRecentlyViewedProductsFooterItem)
{
<li><a href="@Url.RouteUrl("RecentlyViewedProducts")">@T("Products.RecentlyViewedProducts")</a></li>
}
@if (Model.CompareProductsEnabled && Model.DisplayCompareProductsFooterItem)
{
<li><a href="@Url.RouteUrl("CompareProducts")">@T("Products.Compare.List")</a></li>
}
@if (Model.NewProductsEnabled && Model.DisplayNewProductsFooterItem)
{
<li><a href="@Url.RouteUrl("NewProducts")">@T("Products.NewProducts")</a></li>
}
@foreach (var topic in Model.Topics.Where(x => x.IncludeInFooterColumn2).ToList())
{
<li><a href="@(Url.RouteUrl<Topic>(new { SeName = topic.SeName }))">@topic.Name</a></li>
}
@if (Model.AllowCustomersToCheckGiftCardBalance)
{
<li><a href="@Url.RouteUrl("CheckGiftCardBalance")">@T("CheckGiftCardBalance")</a></li>
}
</ul>
</div>
<div class="footer-block my-account">
<div class="title">
<strong>@T("Footer.MyAccount")</strong>
</div>
<ul class="list">
@if (Model.DisplayCustomerInfoFooterItem)
{
<li><a href="@Url.RouteUrl("CustomerInfo")">@T("Account.MyAccount")</a></li>
}
@if (Model.DisplayCustomerOrdersFooterItem)
{
<li><a href="@Url.RouteUrl("CustomerOrders")">@T("Account.CustomerOrders")</a></li>
}
@if (Model.DisplayCustomerAddressesFooterItem)
{
<li><a href="@Url.RouteUrl("CustomerAddresses")">@T("Account.CustomerAddresses")</a></li>
}
@if (Model.ShoppingCartEnabled && Model.DisplayShoppingCartFooterItem)
{
<li><a href="@Url.RouteUrl("ShoppingCart")">@T("ShoppingCart")</a></li>
}
@if (Model.WishlistEnabled && Model.DisplayWishlistFooterItem)
{
<li><a href="@Url.RouteUrl("Wishlist")">@T("Wishlist")</a></li>
}
@if (Model.AllowCustomersToApplyForVendorAccount && Model.DisplayApplyVendorAccountFooterItem)
{
<li><a href="@Url.RouteUrl("ApplyVendorAccount")">@T("Vendors.ApplyAccount")</a></li>
}
@foreach (var topic in Model.Topics.Where(x => x.IncludeInFooterColumn3).ToList())
{
<li><a href="@(Url.RouteUrl<Topic>(new { SeName = topic.SeName }))">@topic.Name</a></li>
}
</ul>
</div>
</div>
<div class="follow-us">
@await Component.InvokeAsync(typeof(NewsletterBoxViewComponent))
<div class="social">
<div class="title">
<strong>@T("Footer.FollowUs")</strong>
</div>
@await Component.InvokeAsync(typeof(SocialButtonsViewComponent))
</div>
<div class="payment-method">
@if (showSupportedCards == true)
{
<div class="title">
<strong>@T("NopStation.Theme.CarHaven.FooterSupportedCards.Title")</strong>
</div>
<div class="payment-methods">
<img class="payment-method-image" src="@supportedCardsImageUrl" alt="Payment methods" title="Payment methods" />
</div>
}
</div>
</div>
</div>
<div class="footer-lower">
@if (!Model.HidePoweredByNopCommerce)
{
<div class="footer-powered-by">
@*Would you like to remove the "Powered by nopCommerce" link in the bottom of the footer?
Please find more info at https://www.nopcommerce.com/nopcommerce-copyright-removal-key*@
Powered by <a href="@(OfficialSite.Main)" target="_blank" @(Model.IsHomePage ? string.Empty : "rel=nofollow")>nopCommerce</a>
</div>
}
@if (!hideDesignedByNopStation)
{
<div class="footer-powered-by">
Designed By <img class="nopstation-logo" alt="Designed by nopStation" title="Designed by nopStation" src="/Themes/CarHaven/Content/images/designed-by-nopstation.png" width="98" height="22">
</div>
}
<div class="footer-info">
<span class="footer-disclaimer">@T("Content.CopyrightNotice", DateTime.Now.Year, Model.StoreName)</span>
@if (Model.DisplayTaxShippingInfoFooter)
{
var inclTax = await workContext.GetTaxDisplayTypeAsync() == TaxDisplayType.IncludingTax;
<span class="footer-tax-shipping">
@T(inclTax ? "Footer.TaxShipping.InclTax" : "Footer.TaxShipping.ExclTax", Url.RouteTopicUrl("shippinginfo"))
</span>
}
</div>
@await Component.InvokeAsync(typeof(StoreThemeSelectorViewComponent))
</div>
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.Footer, additionalData = Model })
</div>
<script asp-location="Footer">
$(function() {
$('.footer-block .title').on('click', function () {
var e = window, a = 'inner';
if (!('innerWidth' in window)) {
a = 'client';
e = document.documentElement || document.body;
}
var result = { width: e[a + 'Width'], height: e[a + 'Height'] };
if (result.width < 769) {
$(this).siblings('.list').slideToggle('slow');
}
});
});
</script>
<script asp-location="Footer">
$(function() {
$('.block .title').on('click', function () {
var e = window, a = 'inner';
if (!('innerWidth' in window)) {
a = 'client';
e = document.documentElement || document.body;
}
var result = { width: e[a + 'Width'], height: e[a + 'Height'] };
if (result.width < 1001) {
$(this).siblings('.listbox').slideToggle('slow');
}
});
});
</script>

View File

@ -0,0 +1,101 @@
@model HeaderLinksModel
@using Nop.Core.Domain.Customers
@inject Nop.Core.IWebHelper webHelper
<div class="header-links">
<ul>
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HeaderLinksBefore, additionalData = Model })
@if (Model.IsAuthenticated)
{
<li class="user-dropdown">
<span class="user-dropdown-toggle">
<span class="fa fa-user-o" aria-hidden="true"></span>
@Model.CustomerName.ToString().ToLower()
</span>
<ul >
@if (Model.WishlistEnabled)
{
<li>
<a href="@Url.RouteUrl("Wishlist")" class="ico-wishlist">
<span class="wishlist-label">@T("Wishlist")</span>
<span class="wishlist-qty">@T("Wishlist.HeaderQuantity", Model.WishlistItems)</span>
</a>
</li>
}
<li><a href="@Url.RouteUrl("CustomerInfo")" class="ico-account">@T("Account.MyAccount")@*@Model.CustomerName*@</a></li>
<li><a href="@Url.RouteUrl("Logout")" class="ico-logout">@T("Account.Logout")</a></li>
</ul>
</li>
}
else
{
var returnUrl = Context.Request.Query.TryGetValue("returnUrl", out var url) && !StringValues.IsNullOrEmpty(url)
? url.ToString()
: webHelper.GetRawUrl(Context.Request);
<li class="user-dropdown">
<span class="user-dropdown-toggle">
<span class="fa fa-user-o" aria-hidden="true"></span>
@T("Account.Login")
</span>
<ul>
@if (Model.RegistrationType != UserRegistrationType.Disabled)
{
<li><a href="@Url.RouteUrl("Register", new { returnUrl })" class="ico-register">@T("Account.Register")</a></li>
}
<li><a href="@Url.RouteUrl("Login", new { returnUrl })" class="ico-login">@T("Account.Login")</a></li>
</ul>
</li>
}
@if (Model.AllowPrivateMessages)
{
<li>
<a href="@Url.RouteUrl("PrivateMessages", new { tab = "" })" class="ico-inbox">
<span class="inbox-label">@T("PrivateMessages.Inbox")</span>
<span class="inbox-unread">@Model.UnreadPrivateMessages</span>
</a>
</li>
}
@if (Model.ShoppingCartEnabled)
{
<li id="topcartlink">
<a href="@Url.RouteUrl("ShoppingCart")" class="ico-cart">
<span class="cart-label">@T("ShoppingCart")</span>
<span class="cart-qty">@T("ShoppingCart.HeaderQuantity", Model.ShoppingCartItems)</span>
</a>
</li>
}
@await Component.InvokeAsync(typeof(WidgetViewComponent), new { widgetZone = PublicWidgetZones.HeaderLinksAfter, additionalData = Model })
</ul>
@if (Model.AllowPrivateMessages && !string.IsNullOrEmpty(Model.AlertMessage))
{
//new private message notification
<script asp-location="Footer">
$(function() {
displayPopupNotification('@Html.Raw(JavaScriptEncoder.Default.Encode(Model.AlertMessage))', 'success', false);
});
</script>
}
@if (Model.ShoppingCartEnabled)
{
<script asp-location="Footer">
$(function() {
$('.header').on('mouseenter', '#topcartlink', function () {
$('#flyout-cart').addClass('active');
});
$('.header').on('mouseleave', '#topcartlink', function () {
$('#flyout-cart').removeClass('active');
});
$('.header').on('mouseenter', '#flyout-cart', function () {
$('#flyout-cart').addClass('active');
});
$('.header').on('mouseleave', '#flyout-cart', function () {
$('#flyout-cart').removeClass('active');
});
});
</script>
}
</div>

Some files were not shown because too many files have changed in this diff Show More