Packages
phoenix_kit
1.7.79
1.7.210
1.7.209
1.7.208
1.7.207
1.7.206
1.7.205
1.7.204
1.7.203
1.7.202
1.7.201
1.7.200
1.7.199
1.7.198
1.7.197
1.7.196
1.7.194
1.7.193
1.7.192
1.7.191
1.7.190
1.7.189
1.7.187
1.7.186
1.7.185
1.7.184
1.7.183
1.7.182
1.7.181
1.7.180
1.7.179
1.7.178
1.7.177
1.7.176
1.7.175
1.7.174
1.7.173
1.7.172
1.7.171
1.7.170
1.7.169
1.7.168
1.7.167
1.7.166
1.7.165
1.7.164
1.7.162
1.7.161
1.7.160
1.7.159
1.7.157
1.7.156
1.7.155
1.7.154
1.7.153
1.7.152
1.7.151
1.7.150
1.7.149
1.7.146
1.7.145
1.7.144
1.7.143
1.7.138
1.7.133
1.7.132
1.7.131
1.7.130
1.7.128
1.7.126
1.7.125
1.7.121
1.7.120
1.7.119
1.7.118
1.7.117
1.7.116
1.7.115
1.7.114
1.7.113
1.7.112
1.7.111
1.7.110
1.7.109
1.7.108
1.7.107
1.7.106
1.7.105
1.7.104
1.7.103
1.7.102
1.7.101
1.7.100
1.7.99
1.7.98
1.7.97
1.7.96
1.7.95
1.7.94
1.7.93
1.7.92
1.7.91
1.7.90
1.7.89
1.7.88
1.7.87
1.7.86
1.7.85
1.7.84
1.7.83
1.7.82
1.7.81
1.7.80
1.7.79
1.7.78
1.7.77
1.7.76
1.7.75
1.7.74
1.7.71
1.7.70
1.7.69
1.7.66
1.7.65
1.7.64
1.7.63
1.7.62
1.7.61
1.7.59
1.7.58
1.7.57
1.7.56
1.7.55
1.7.54
1.7.53
1.7.52
1.7.51
1.7.49
1.7.44
1.7.43
1.7.42
1.7.41
1.7.39
1.7.38
1.7.37
1.7.36
1.7.34
1.7.33
1.7.31
1.7.30
1.7.29
1.7.28
1.7.27
1.7.26
1.7.25
1.7.24
1.7.23
1.7.22
1.7.21
1.7.20
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.20
1.6.19
1.6.18
1.6.17
1.6.16
1.6.15
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.5.2
1.5.1
1.5.0
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.10
1.2.9
1.2.8
1.2.7
1.2.5
1.2.4
1.2.2
1.2.1
1.2.0
1.1.0
1.0.0
A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more
Current section
Files
Jump to
Current section
Files
lib/modules/shop/web/components/shop_layouts.ex
defmodule PhoenixKit.Modules.Shop.Web.Components.ShopLayouts do
@moduledoc """
Shared layout components for the shop storefront public pages.
Provides two components:
- `shop_public_layout/1` - Public navbar + flash + main content wrapper for guest users
- `shop_layout/1` - Top-level layout dispatcher: dashboard for authenticated, public/app for guests
"""
use Phoenix.Component
import PhoenixKitWeb.Components.Core.Icon, only: [icon: 1]
import PhoenixKitWeb.Components.Core.Flash, only: [flash_group: 1]
import PhoenixKitWeb.Components.Core.LanguageSwitcher, only: [language_switcher_dropdown: 1]
import PhoenixKitWeb.LayoutHelpers, only: [dashboard_assigns: 1]
alias PhoenixKit.Modules.Shop
alias PhoenixKit.Utils.Routes
@doc """
Public shop layout with navbar, flash messages, and main content area.
Used for guest users on catalog/category/product pages.
"""
slot :inner_block, required: true
attr :current_language, :string, required: true
attr :current_path, :string, required: true
attr :flash, :map, required: true
def shop_public_layout(assigns) do
~H"""
<div class="min-h-screen bg-base-100">
<%!-- Simple navbar for shop --%>
<nav class="navbar bg-base-100 shadow-sm border-b border-base-200">
<div class="navbar-start">
<.link navigate="/" class="btn btn-ghost text-xl">
<.icon name="hero-home" class="w-5 h-5" />
</.link>
</div>
<div class="navbar-center">
<.link navigate={Shop.catalog_url(@current_language)} class="btn btn-ghost text-xl">
<.icon name="hero-shopping-bag" class="w-5 h-5 mr-2" /> Shop
</.link>
</div>
<div class="navbar-end gap-2">
<.language_switcher_dropdown
current_locale={@current_language}
current_path={@current_path}
/>
<.link navigate={Shop.cart_url(@current_language)} class="btn btn-ghost btn-circle">
<.icon name="hero-shopping-cart" class="w-5 h-5" />
</.link>
<.link navigate={Routes.path("/users/log-in")} class="btn btn-primary btn-sm">
Sign In
</.link>
</div>
</nav>
<%!-- Flash messages --%>
<.flash_group flash={@flash} />
<%!-- Wide content area --%>
<main class="py-6">
{render_slot(@inner_block)}
</main>
</div>
"""
end
@doc """
Top-level layout wrapper for shop pages.
Routes to:
- Dashboard layout for authenticated users
- `shop_public_layout` for guests when `show_sidebar` is true (catalog/category/product pages)
- `LayoutWrapper.app_layout` for guests when `show_sidebar` is false (cart/checkout pages)
"""
slot :inner_block, required: true
attr :authenticated, :boolean, required: true
attr :show_sidebar, :boolean, default: false
attr :flash, :map, required: true
attr :phoenix_kit_current_scope, :any, required: true
attr :url_path, :string, required: true
attr :current_locale, :string, required: true
attr :page_title, :string, required: true
attr :sidebar_after_shop, :any, default: nil
# Used when show_sidebar is true (catalog/category/product pages)
attr :current_language, :string, default: nil
attr :current_path, :string, default: nil
def shop_layout(assigns) do
~H"""
<%= if @authenticated do %>
<PhoenixKitWeb.Layouts.dashboard {dashboard_assigns(assigns)}>
{render_slot(@inner_block)}
</PhoenixKitWeb.Layouts.dashboard>
<% else %>
<%= if @show_sidebar do %>
<.shop_public_layout
flash={@flash}
current_language={@current_language}
current_path={@current_path}
>
{render_slot(@inner_block)}
</.shop_public_layout>
<% else %>
<PhoenixKitWeb.Components.LayoutWrapper.app_layout
flash={@flash}
phoenix_kit_current_scope={@phoenix_kit_current_scope}
current_path={@url_path}
current_locale={@current_locale}
page_title={@page_title}
>
{render_slot(@inner_block)}
</PhoenixKitWeb.Components.LayoutWrapper.app_layout>
<% end %>
<% end %>
"""
end
end