Packages
phoenix_kit
1.7.152
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
221 Versions
Jump to
Current section
221 Versions
Compare versions
4
files changed
+46
additions
-13
deletions
unknownCHANGELOG.md
File is too large to be displayed (100 KB limit).
| @@ -1,6 +1,6 @@ | |
| 1 1 | {<<"links">>,[{<<"GitHub">>,<<"https://github.com/BeamLabEU/phoenix_kit">>}]}. |
| 2 2 | {<<"name">>,<<"phoenix_kit">>}. |
| 3 | - {<<"version">>,<<"1.7.151">>}. |
| 3 | + {<<"version">>,<<"1.7.152">>}. |
| 4 4 | {<<"description">>, |
| 5 5 | <<65,32,102,111,117,110,100,97,116,105,111,110,32,102,111,114,32,98,117,105, |
| 6 6 | 108,100,105,110,103,32,69,108,105,120,105,114,32,80,104,111,101,110,105, |
| @@ -184,7 +184,15 @@ defmodule PhoenixKitWeb.Components.UserDashboardNav do | |
| 184 184 | class="cursor-pointer hover:opacity-80 transition-opacity" |
| 185 185 | aria-label={gettext("Account menu")} |
| 186 186 | > |
| 187 | - <.icon name="hero-user-circle" class="w-10 h-10 text-base-content/70" /> |
| 187 | + <%!-- |
| 188 | + Rounded-rectangle placeholder matching the authenticated avatar shape |
| 189 | + (md = w-10 h-10, rounded-lg via its `!rounded-lg`), so the guest and |
| 190 | + signed-in triggers look consistent — a generic person silhouette |
| 191 | + signals "not signed in". |
| 192 | + --%> |
| 193 | + <div class="w-10 h-10 rounded-lg bg-base-300 flex items-center justify-center text-base-content/60"> |
| 194 | + <.icon name="hero-user" class="w-6 h-6" /> |
| 195 | + </div> |
| 188 196 | </div> |
| 189 197 | |
| 190 198 | <ul |
| @@ -224,7 +232,21 @@ defmodule PhoenixKitWeb.Components.UserDashboardNav do | |
| 224 232 | attr(:current_locale, :string, required: true) |
| 225 233 | |
| 226 234 | defp language_menu_section(assigns) do |
| 227 | - assigns = assign(assigns, :user_languages, get_user_languages()) |
| 235 | + # Highlight by BASE code, not full-dialect equality. `@current_locale` |
| 236 | + # may be a base ("en", per the attr doc) or a resolved dialect that |
| 237 | + # differs from the enabled one (e.g. `resolve_dialect("en")` => "en-US" |
| 238 | + # while English is enabled as "en-GB"), so a raw `==` against the |
| 239 | + # enabled dialect never matched on the default locale. Comparing bases |
| 240 | + # makes en/en-GB/en-US all match and works whether the caller passes a |
| 241 | + # base or a dialect — same rule the standalone `Core.LanguageSwitcher` uses. |
| 242 | + current_base = DialectMapper.extract_base(assigns.current_locale) |
| 243 | + |
| 244 | + user_languages = |
| 245 | + Enum.map(get_user_languages(), fn language -> |
| 246 | + Map.put(language, :active?, DialectMapper.extract_base(language.code) == current_base) |
| 247 | + end) |
| 248 | + |
| 249 | + assigns = assign(assigns, :user_languages, user_languages) |
| 228 250 | |
| 229 251 | ~H""" |
| 230 252 | <%= if length(@user_languages) > 1 do %> |
| @@ -242,7 +264,7 @@ defmodule PhoenixKitWeb.Components.UserDashboardNav do | |
| 242 264 | class={[ |
| 243 265 | "w-full flex items-center gap-3 rounded-lg px-4 py-2 text-sm", |
| 244 266 | "focus:outline-none focus-visible:outline-none", |
| 245 | - if(language.code == @current_locale, |
| 267 | + if(language.active?, |
| 246 268 | do: |
| 247 269 | "bg-primary !text-primary-content hover:bg-primary hover:!text-primary-content active:!bg-primary/80", |
| 248 270 | else: |
| @@ -252,7 +274,7 @@ defmodule PhoenixKitWeb.Components.UserDashboardNav do | |
| 252 274 | > |
| 253 275 | <span class="text-lg">{get_language_flag(language.code)}</span> |
| 254 276 | <span>{language.name}</span> |
| 255 | - <%= if language.code == @current_locale do %> |
| 277 | + <%= if language.active? do %> |
| 256 278 | <PhoenixKitWeb.Components.Core.Icons.icon_check class="w-4 h-4 ml-auto" /> |
| 257 279 | <% end %> |
| 258 280 | </a> |
| @@ -388,20 +410,31 @@ defmodule PhoenixKitWeb.Components.UserDashboardNav do | |
| 388 410 | Routes.path(clean_path, locale: base_code) |
| 389 411 | end |
| 390 412 | |
| 391 | - # Remove locale from path |
| 413 | + # Remove locale from path. |
| 414 | + # |
| 415 | + # A path that is *only* a locale segment (e.g. "/ru", "/en-GB") reduces |
| 416 | + # to "/". The empty-`rest` guard matters: `Path.join([])` raises a |
| 417 | + # FunctionClauseError, which used to 500 a host's bare `/:locale` landing |
| 418 | + # route (e.g. a locale-prefixed landing page introduced in 1.7.150+). |
| 392 419 | defp remove_locale_from_path(path) do |
| 393 420 | case String.split(path, "/", trim: true) do |
| 394 421 | [segment | rest] when byte_size(segment) in [2, 5] -> |
| 395 | - # Check if segment looks like a locale |
| 396 | - if String.length(segment) == 2 or |
| 397 | - (String.length(segment) == 5 and String.contains?(segment, "-")) do |
| 398 | - "/" <> Path.join(rest) |
| 399 | - else |
| 400 | - path |
| 422 | + cond do |
| 423 | + not locale_segment?(segment) -> path |
| 424 | + rest == [] -> "/" |
| 425 | + true -> "/" <> Path.join(rest) |
| 401 426 | end |
| 402 427 | |
| 403 428 | _ -> |
| 404 429 | path |
| 405 430 | end |
| 406 431 | end |
| 432 | + |
| 433 | + # A 2-char base code or a 5-char dialect ("en-GB"). Mirrors the original |
| 434 | + # inline guard; kept narrow on purpose so a real 3-char page segment |
| 435 | + # (e.g. "/faq") isn't mistaken for a locale. |
| 436 | + defp locale_segment?(segment) do |
| 437 | + String.length(segment) == 2 or |
| 438 | + (String.length(segment) == 5 and String.contains?(segment, "-")) |
| 439 | + end |
| 407 440 | end |
| @@ -1,7 +1,7 @@ | |
| 1 1 | defmodule PhoenixKit.MixProject do |
| 2 2 | use Mix.Project |
| 3 3 | |
| 4 | - @version "1.7.151" |
| 4 | + @version "1.7.152" |
| 5 5 | @description "A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more" |
| 6 6 | @source_url "https://github.com/BeamLabEU/phoenix_kit" |