Tutorials

How can I add a customer-selected gift wrapping option?
This tutorial will walk you through adding a "Gift wrap" checkbox to the product page, which when selected will add the product to the cart with the additional £1 charge associated with it being gift wrapped.
First, define some settings to control the behaviour of gift wrapping:
\Aero\Common\Facades\Settings::group('gift-wrap', function (\Aero\Common\Settings\SettingGroup $group) {
    $group->float('price')->default(100)->map(function ($value) {
        return new \Aero\Cart\CartPrice(request()->store()->currency, $value ?? 0);
    });
});
\Aero\Catalog\Models\Variant::settings(function (\Aero\Common\Settings\ModelSettingGroup $group) {
    $group->boolean('has_gift_wrap')->default(false);
});
Now, add a macro for 
has_gift_wrap so that we can cast it to js, so that it will be available in Vue:
\Aero\Catalog\Models\Variant::macro('getHasGiftWrapAttribute', function () {
    return $this->setting('has_gift_wrap');
});
Aero\Catalog\Models\Variant::addCastToJs('has_gift_wrap');
We can now display a checkbox on the 
product.twig page when a variant supports it:
<div v-if="variant && variant.has_gift_wrap">
    <input type="checkbox" id="gift-wrap">
    <label for="gift-wrap">Gift Wrap? ({{ setting('gift-wrap.price') }})</label>
</div>
And then we listen to an item being added to the cart and set the 
has_gift_wrap bool from this checkbox:
{% js %}
    <script>
        window.AeroEvents.on('product.add-to-cart', (data) => {
            const el = document.getElementById('gift-wrap');
            data.has_gift_wrap = el?.checked ?? false;
            return data;
        });
    </script>
{% endjs %}
Finally, we extend the cart item builder to add the gift wrap option when selected:
\Aero\Store\Pipelines\CartItemBuilder::extend(function (\Aero\Cart\CartItem $item, \Closure $next) {
    $hasGiftWrap = $item->model->setting('has_gift_wrap') && request()->get('has_gift_wrap');
    if ($hasGiftWrap) {
        $price = setting('gift-wrap.price');
        $option = \Aero\Cart\CartItemOption::create('Gift Wrap');
        $option->setPriceInc($price->inc()->value);
        $item->addOption($option)->setNotCombinable();
    }
    return $next($item);
});
Checkout the 
aerocargo/product-options module, for an easier way to do things like this.
 