feat(main): Add base theme: This is the falcon theme out of the box.

This is falcon v3.1.2
This commit is contained in:
2025-11-18 14:04:01 +01:00
parent 3a7f2db331
commit 6849b8eefd
605 changed files with 49820 additions and 0 deletions

View File

@ -0,0 +1,139 @@
{**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*}
{extends file='checkout/_partials/steps/checkout-step.tpl'}
{block name='step_content'}
<div class="js-address-form">
<form
method="POST"
data-id-address="{$id_address}"
action="{url entity='order' params=['id_address' => $id_address]}"
data-refresh-url="{url entity='order' params=['ajax' => 1, 'action' => 'addressForm']}"
>
{if $use_same_address}
<p class="mb-4">
{if $cart.is_virtual}
{l s='The selected address will be used as your personal address (for invoice).' d='Shop.Theme.Checkout'}
{else}
{l s='The selected address will be used both as your personal address (for invoice) and as your delivery address.' d='Shop.Theme.Checkout'}
{/if}
</p>
{else}
<h2 class="h4">{l s='Shipping Address' d='Shop.Theme.Checkout'}</h2>
{/if}
{if $show_delivery_address_form}
<div id="delivery-address">
{render file = 'checkout/_partials/address-form.tpl'
ui = $address_form
use_same_address = $use_same_address
type = "delivery"
form_has_continue_button = $form_has_continue_button
}
</div>
{elseif $customer.addresses|count > 0}
<div id="delivery-addresses" class="address-selector js-address-selector row">
{include file = 'checkout/_partials/address-selector-block.tpl'
addresses = $customer.addresses
name = "id_address_delivery"
selected = $id_address_delivery
type = "delivery"
interactive = !$show_delivery_address_form and !$show_invoice_address_form
}
</div>
{if isset($delivery_address_error)}
<p class="alert alert-danger js-address-error" name="alert-delivery" id="id-failure-address-{$delivery_address_error.id_address}">{$delivery_address_error.exception}</p>
{else}
<p class="alert alert-danger js-address-error" name="alert-delivery" style="display: none">{l s="Your address is incomplete, please update it." d="Shop.Notifications.Error"}</p>
{/if}
<div class="add-address mt-2 mb-3">
<a class="btn btn-outline-primary btn-sm" href="{$new_address_delivery_url}">{l s='add new address' d='Shop.Theme.Actions'}</a>
</div>
{if $use_same_address && !$cart.is_virtual}
<p>
<a data-link-action="different-invoice-address" href="{$use_different_address_url}">
{l s='Billing address differs from shipping address' d='Shop.Theme.Checkout'}
</a>
</p>
{/if}
{/if}
{if !$use_same_address}
<h2 class="h4">{l s='Your Invoice Address' d='Shop.Theme.Checkout'}</h2>
{if $show_invoice_address_form}
<div id="invoice-address">
{render file = 'checkout/_partials/address-form.tpl'
ui = $address_form
use_same_address = $use_same_address
type = "invoice"
form_has_continue_button = $form_has_continue_button
}
</div>
{else}
<div id="invoice-addresses" class="address-selector js-address-selector row">
{include file = 'checkout/_partials/address-selector-block.tpl'
addresses = $customer.addresses
name = "id_address_invoice"
selected = $id_address_invoice
type = "invoice"
interactive = !$show_delivery_address_form and !$show_invoice_address_form
}
</div>
{if isset($invoice_address_error)}
<p class="alert alert-danger js-address-error" name="alert-invoice" id="id-failure-address-{$invoice_address_error.id_address}">{$invoice_address_error.exception}</p>
{else}
<p class="alert alert-danger js-address-error" name="alert-invoice" style="display: none">{l s="Your address is incomplete, please update it." d="Shop.Notifications.Error"}</p>
{/if}
<div class="add-address mt-2 mb-3">
<a class="btn btn-outline-primary btn-sm" href="{$new_address_invoice_url}">{l s='add new address' d='Shop.Theme.Actions'}</a>
</div>
{/if}
{/if}
{if !$form_has_continue_button}
<div class="text-right">
<button type="submit" class="btn btn-primary continue d-none d-md-inline-block" name="confirm-addresses" value="1">
{l s='Continue' d='Shop.Theme.Actions'}
</button>
<button type="submit" class="btn btn-primary continue btn-block d-block d-md-none" name="confirm-addresses" value="1">
{l s='Continue' d='Shop.Theme.Actions'}
</button>
<input type="hidden" id="not-valid-addresses" class="js-not-valid-addresses" value="{$not_valid_addresses}">
</div>
{/if}
</form>
</div>
{/block}

View File

@ -0,0 +1,53 @@
{**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*}
{block name='step'}
<section id = "{$identifier}"
class = "{[
'checkout-step' => true,
'-current' => $step_is_current,
'-reachable' => $step_is_reachable,
'-complete' => $step_is_complete,
'js-current-step' => $step_is_current
]|classnames}"
>
<div class="card-header checkout-step__header" id="heading-{$identifier}" data-identifier="{$identifier}">
<p class="step-title js-step-title h5 mb-0">
<span class="step-number">{$position}.</span>
{$title}
<i class="material-icons font-reset rtl-no-flip text-success mx-2">&#xE876;</i>
{if $step_is_reachable}
<button class="step-edit text-muted btn btn-sm btn-link float-right py-0" data-toggle="collapse" data-target="#content-{$identifier}" aria-expanded="{if $step_is_current}true{else}false{/if}" aria-controls="content-{$identifier}">
<i class="material-icons edit small">mode_edit</i> {l s='Edit' d='Shop.Theme.Actions'}
</button>
{/if}
</p>
</div>
<div class="content checkout-step__content card-body">
{block name='step_content'}DUMMY STEP CONTENT{/block}
</div>
</section>
{/block}

View File

@ -0,0 +1,141 @@
{extends file='checkout/_partials/steps/checkout-step.tpl'}
{block name='step_content'}
{hook h='displayPaymentTop'}
{* used by javascript to correctly handle cart updates when we are on payment step (eg vouchers added) *}
<div style="display:none" class="js-cart-payment-step-refresh"></div>
{if !empty($display_transaction_updated_info)}
<p class="cart-payment-step-refreshed-info">
{l s='Transaction amount has been correctly updated' d='Shop.Theme.Checkout'}
</p>
{/if}
{if $is_free}
<p class="cart-payment-step-not-needed-info">{l s='No payment needed for this order' d='Shop.Theme.Checkout'}</p>
{/if}
<div class="payment-options {if $is_free}d-none{/if}">
{foreach from=$payment_options item="module_options"}
{foreach from=$module_options item="option"}
<div
id="{$option.id}-container"
class="mb-3 checkout-option-block checkout-option {if $selected_payment_option == $option.id || $is_free}selected{/if}">
<input class="ps-shown-by-js custom-control-input{if $option.binary} binary{/if}" id="{$option.id}"
data-module-name="{$option.module_name}" name="payment-option" type="radio" required
{if $selected_payment_option == $option.id || $is_free} checked {/if}>
<label class="card mb-0 cursor-pointer h-100" for="{$option.id}">
<div class="card-body checkout-option__body py-sm-3 px-sm-4 p-2">
<div class="checkout-option__row row align-items-center">
<div class="col-auto checkout-option__col checkout-option__col--thumb">
<div class="checkout-option__thumb">
{if $option.logo}
<img src="{$option.logo}" class="checkout-option__img img-fluid" />
{else}
<img src="{$urls.img_url}checkout/payment_default.svg" class="checkout-option__img img-fluid" />
{/if}
</div>
</div>
<div class="col checkout-option__col">
<p class="h5 mb-0">
{$option.call_to_action_text}
</p>
</div>
</div>
</div>
</label>
</div>
<div
id="pay-with-{$option.id}-form"
style="display:none"
class="js-payment-option-form {if $option.id != $selected_payment_option} ps-hidden {/if}"
>
{if $option.form}
{$option.form nofilter}
{else}
<form id="payment-form" method="POST" action="{$option.action nofilter}">
{foreach from=$option.inputs item=input}
<input type="{$input.type}" name="{$input.name}" value="{$input.value}">
{/foreach}
<button style="display:none" id="pay-with-{$option.id}" type="submit"></button>
</form>
{/if}
</div>
{if $option.additionalInformation}
<div id="{$option.id}-additional-information"
style="display:none"
class="mt-2 js-additional-information definition-list additional-information{if $option.id != $selected_payment_option} ps-hidden {/if}">
<div class="alert alert-info">
{$option.additionalInformation nofilter}
</div>
</div>
{/if}
{/foreach}
{foreachelse}
<p class="alert alert-danger">{l s='Unfortunately, there are no payment method available.' d='Shop.Theme.Checkout'}</p>
{/foreach}
</div>
{if $conditions_to_approve|count}
<p style="display:none;" class="ps-hidden-by-js">
{* At the moment, we're not showing the checkboxes when JS is disabled
because it makes ensuring they were checked very tricky and overcomplicates
the template. Might change later.
*}
{l s='By confirming the order, you certify that you have read and agree with all of the conditions below:' d='Shop.Theme.Checkout'}
</p>
<form id="conditions-to-approve" method="GET" class="mt-3">
{foreach from=$conditions_to_approve item="condition" key="condition_name"}
<div class="custom-control custom-checkbox">
<input id="conditions_to_approve[{$condition_name}]" name="conditions_to_approve[{$condition_name}]" required
type="checkbox" value="1" class="ps-shown-by-js custom-control-input">
<label class="custom-control-label js-terms"
for="conditions_to_approve[{$condition_name}]">{$condition nofilter}</label>
</div>
{/foreach}
</form>
{/if}
{hook h='displayCheckoutBeforeConfirmation'}
{if $show_final_summary}
{include file='checkout/_partials/order-final-summary.tpl'}
{/if}
<div id="payment-confirmation" class="mt-4 js-payment-confirmation">
<div class="ps-shown-by-js">
<div class="text-center">
<button type="submit" class="btn btn-primary btn-lg d-none d-md-inline-block {if !$selected_payment_option} disabled {/if}">
{l s='Place order' d='Shop.Theme.Checkout'}
</button>
<button type="submit" class="btn btn-primary btn-lg btn-block d-block d-md-none {if !$selected_payment_option} disabled {/if}">
{l s='Place order' d='Shop.Theme.Checkout'}
</button>
</div>
{if $show_final_summary}
<article class="alert alert-danger mt-2 js-alert-payment-conditions" role="alert" data-alert="danger">
{l
s='Please make sure you\'ve chosen a [1]payment method[/1] and accepted the [2]terms and conditions[/2].'
sprintf=[
'[1]' => '<a href="#checkout-payment-step">',
'[/1]' => '</a>',
'[2]' => '<a href="#conditions-to-approve">',
'[/2]' => '</a>'
]
d='Shop.Theme.Checkout'
}
</article>
{/if}
</div>
<div class="ps-hidden-by-js">
{if $selected_payment_option and $all_conditions_approved}
<label for="pay-with-{$selected_payment_option}">{l s='Order with an obligation to pay' d='Shop.Theme.Checkout'}</label>
{/if}
</div>
</div>
{hook h='displayPaymentByBinaries'}
{/block}

View File

@ -0,0 +1,107 @@
{extends file='checkout/_partials/steps/checkout-step.tpl'}
{block name='step_content'}
{hook h='displayPersonalInformationTop' customer=$customer}
{if $customer.is_logged && !$customer.is_guest}
<p class="identity">
{* [1][/1] is for a HTML tag. *}
{l s='Connected as [1]%firstname% %lastname%[/1].'
d='Shop.Theme.Customeraccount'
sprintf=[
'[1]' => "<a href='{$urls.pages.identity}'>",
'[/1]' => "</a>",
'%firstname%' => $customer.firstname,
'%lastname%' => $customer.lastname
]
}
</p>
<p>
{* [1][/1] is for a HTML tag. *}
{l
s='Not you? [1]Log out[/1]'
d='Shop.Theme.Customeraccount'
sprintf=[
'[1]' => "<a href='{$urls.actions.logout}'>",
'[/1]' => "</a>"
]
}
</p>
{if !isset($empty_cart_on_logout) || $empty_cart_on_logout}
<p><small>{l s='If you sign out now, your cart will be emptied.' d='Shop.Theme.Checkout'}</small></p>
{/if}
<div class="text-right">
<form method="GET" action="{$urls.pages.order}">
<button
class="continue btn btn-primary d-none d-md-inline-block"
name="controller"
type="submit"
value="order"
>
{l s='Continue' d='Shop.Theme.Actions'}
</button>
<button
class="continue btn btn-primary btn-block d-block d-md-none"
name="controller"
type="submit"
value="order"
>
{l s='Continue' d='Shop.Theme.Actions'}
</button>
</form>
</div>
{else}
<div class="user-form user-form--sm">
<ul class="nav nav-pills nav-fill mb-3" role="tablist">
<li class="nav-item">
<a
class="nav-link {if !$show_login_form}active{/if}"
data-toggle="tab"
href="#checkout-guest-form"
role="tab"
aria-controls="checkout-guest-form"
{if !$show_login_form} aria-selected="true"{/if}
>
{if $guest_allowed}
{l s='Order as a guest' d='Shop.Theme.Checkout'}
{else}
{l s='Create an account' d='Shop.Theme.Customeraccount'}
{/if}
</a>
</li>
<li class="nav-item">
<a
class="nav-link {if $show_login_form}active{/if}"
data-link-action="show-login-form"
data-toggle="tab"
href="#checkout-login-form"
role="tab"
aria-controls="checkout-login-form"
{if $show_login_form} aria-selected="true"{/if}
>
{l s='Sign in' d='Shop.Theme.Actions'}
</a>
</li>
</ul>
</div>
<div class="tab-content">
<div class="tab-pane {if !$show_login_form}active{/if}" id="checkout-guest-form" role="tabpanel" {if $show_login_form}aria-hidden="true"{/if}>
{render file='checkout/_partials/customer-form.tpl' ui=$register_form guest_allowed=$guest_allowed}
</div>
<div class="tab-pane {if $show_login_form}active{/if}" id="checkout-login-form" role="tabpanel" {if !$show_login_form}aria-hidden="true"{/if}>
<div class="user-form user-form--sm">
{render file='checkout/_partials/login-form.tpl' ui=$login_form}
</div>
</div>
</div>
{/if}
{/block}

View File

@ -0,0 +1,134 @@
{**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*}
{extends file='checkout/_partials/steps/checkout-step.tpl'}
{block name='step_content'}
<div id="hook-display-before-carrier">
{$hookDisplayBeforeCarrier nofilter}
</div>
<div class="delivery-options-list">
{if $delivery_options|count}
<form
class="clearfix"
id="js-delivery"
data-url-update="{url entity='order' params=['ajax' => 1, 'action' => 'selectDeliveryOption']}"
method="post"
>
<div class="form-fields">
{block name='delivery_options'}
<div class="delivery-options">
{foreach from=$delivery_options item=carrier key=carrier_id}
<div class="mb-3 checkout-option-block checkout-option js-delivery-option {if $delivery_option == $carrier_id} selected{/if}">
<input class="custom-control-input" type="radio" name="delivery_option[{$id_address}]" id="delivery_option_{$carrier.id}" value="{$carrier_id}"{if $delivery_option == $carrier_id} checked{/if}>
<label class="card mb-0 cursor-pointer h-100" for="delivery_option_{$carrier.id}">
<div class="card-body checkout-option__body py-sm-3 px-sm-4 p-2">
<div class="checkout-option__row row align-items-center">
<div class="col-auto checkout-option__col checkout-option__col--thumb">
<div class="checkout-option__thumb">
{if $carrier.logo}
<img src="{$carrier.logo}" alt="{$carrier.name}" class="checkout-option__img img-fluid" />
{else}
<img src="{$urls.img_url}checkout/carrier_default.svg" class="checkout-option__img img-fluid" />
{/if}
</div>
</div>
<div class="col checkout-option__col">
<div class="checkout-option__row checkout-option__row--inner row align-items-center">
<div class="col checkout-option__col checkout-option__col--text">
<p class="h5 mb-0">
{$carrier.name}
</p>
<span class="checkout-option__delay text-muted font-sm">{$carrier.delay}</span>
</div>
<div class="col-sm-auto col-12 checkout-option__col checkout-option__col--price mt-sm-0 mt-1">
<div class="checkout-option__price price text-right">
{$carrier.price}
</div>
</div>
</div>
</div>
</div>
</div>
</label>
</div>
<div class="carrier-extra-content js-carrier-extra-content my-3"{if $delivery_option != $carrier_id} style="display:none;"{/if}>{$carrier.extraContent nofilter}</div>
{/foreach}
</div>
{/block}
<div class="order-options">
<div id="delivery">
<label for="delivery_message">{l s='If you would like to add a comment about your order, please write it in the field below.' d='Shop.Theme.Checkout'}</label>
<textarea class="form-control" rows="4" cols="120" id="delivery_message" name="delivery_message">{$delivery_message}</textarea>
</div>
{if $recyclablePackAllowed}
<div class="form-group my-3">
<div class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" id="input_recyclable" name="recyclable" value="1" {if $recyclable} checked {/if}>
<label class="custom-control-label" for="input_recyclable">{l s='I would like to receive my order in recycled packaging.' d='Shop.Theme.Checkout'}</label>
</div>
</div>
{/if}
{if $gift.allowed}
<div class="form-group my-3">
<div class="custom-control custom-checkbox">
<input class="custom-control-input js-gift-checkbox" type="checkbox" id="input_gift" name="gift" value="1" {if $gift.isGift} checked {/if}>
<label class="custom-control-label" for="input_gift">{$gift.label}</label>
</div>
</div>
<div id="gift" class="collapse{if $gift.isGift} in{/if}">
<label for="gift_message">{l s='If you\'d like, you can add a note to the gift:' d='Shop.Theme.Checkout'}</label>
<textarea class="form-control" rows="4" cols="120" id="gift_message" name="gift_message">{$gift.message}</textarea>
</div>
{/if}
</div>
</div>
<div class="text-right mt-3">
<button type="submit" class="continue btn btn-primary d-none d-md-inline-block" name="confirmDeliveryOption" value="1">
{l s='Continue' d='Shop.Theme.Actions'}
</button>
<button type="submit" class="continue btn btn-primary btn-block d-block d-md-none" name="confirmDeliveryOption" value="1">
{l s='Continue' d='Shop.Theme.Actions'}
</button>
</div>
</form>
{else}
<p class="alert alert-danger">{l s='Unfortunately, there are no carriers available for your delivery address.' d='Shop.Theme.Checkout'}</p>
{/if}
</div>
<div id="hook-display-after-carrier">
{$hookDisplayAfterCarrier nofilter}
</div>
<div id="extra_carrier"></div>
{/block}

View File

@ -0,0 +1,34 @@
{**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*}
{block name='step'}
<section class="checkout-step -unreachable" id="{$identifier}">
<div class="card-header checkout-step__header" id="heading-{$identifier}" data-identifier="{$identifier}">
<p class="step-title h5 mb-0 js-step-title">
<span class="step-number">{$position}.</span>
{$title}
</p>
</div>
</section>
{/block}