This is an automated email from the ASF dual-hosted git repository.

asf-ci-deploy pushed a commit to branch asf-site-production
in repository https://gitbox.apache.org/repos/asf/grails-website.git


The following commit(s) were added to refs/heads/asf-site-production by this 
push:
     new 88d831c8e3c Deploying to documentation branch - 07:52:33
88d831c8e3c is described below

commit 88d831c8e3ca591af29b685ac90eabbb4f33380e
Author: jdaugherty <[email protected]>
AuthorDate: Sun Jul 19 07:52:36 2026 +0000

    Deploying to documentation branch - 07:52:33
---
 docs/snapshot/api/allclasses-frame.html            |   1 -
 .../grails/plugin/springsecurity/ui/Constants.html | 333 ---------------------
 .../plugin/springsecurity/ui/package-frame.html    |   2 +-
 .../plugin/springsecurity/ui/package-summary.html  |   8 -
 docs/snapshot/api/index-all.html                   |  12 +-
 .../org/grails/plugins/web/taglib/FormTagLib.html  |  26 +-
 .../developer-manual/gettingStarted.html           |   2 +-
 .../grails-data/developer-manual/introduction.html |   2 +-
 .../grails-data/developer-manual/stepByStep.html   |   2 +-
 .../grails-data/developer-manual/testing.html      |   2 +-
 .../developer-manual/understandingApi.html         |   2 +-
 .../understandingApi/datastoreBasics.html          |   2 +-
 .../understandingApi/gormApis.html                 |   2 +-
 .../understandingApi/gormEnhancer.html             |   2 +-
 .../understandingApi/implementingCrud.html         |   2 +-
 .../understandingApi/implementingQueries.html      |   2 +-
 .../understandingApi/secondaryIndexes.html         |   2 +-
 .../grails-data/whats-new-manual/index.html        |   2 +-
 docs/snapshot/guide/i18n.html                      |  16 +-
 docs/snapshot/guide/single.html                    |  72 ++++-
 docs/snapshot/guide/upgrading.html                 |  56 ++++
 docs/snapshot/ref/Tags - GSP/localeSelect.html     |  46 ++-
 .../ref/Versions/Grails BOM Hibernate5.html        |   2 +-
 .../ref/Versions/Grails BOM Hibernate7.html        |   2 +-
 docs/snapshot/ref/Versions/Grails BOM.html         |   2 +-
 25 files changed, 210 insertions(+), 392 deletions(-)

diff --git a/docs/snapshot/api/allclasses-frame.html 
b/docs/snapshot/api/allclasses-frame.html
index 6f1c5167c2e..b58877d0a59 100644
--- a/docs/snapshot/api/allclasses-frame.html
+++ b/docs/snapshot/api/allclasses-frame.html
@@ -594,7 +594,6 @@
 <li><a 
href="org/grails/datastore/mapping/core/connections/ConnectionSourcesProvider.html"
 title="interface in org.grails.datastore.mapping.core.connections" 
target="classFrame"><I>ConnectionSourcesProvider</I></a></li>
 <li><a 
href="org/grails/datastore/mapping/core/connections/ConnectionSourcesSupport.html"
 title="class in org.grails.datastore.mapping.core.connections" 
target="classFrame">ConnectionSourcesSupport</a></li>
 <li><a href="grails/build/logging/ConsoleLogger.html" title="interface in 
grails.build.logging" target="classFrame"><I>ConsoleLogger</I></a></li>
-<li><a href="grails/plugin/springsecurity/ui/Constants.html" title="class in 
grails.plugin.springsecurity.ui" target="classFrame">Constants</a></li>
 <li><a href="grails/validation/Constrained.html" title="interface in 
grails.validation" target="classFrame"><I>Constrained</I></a></li>
 <li><a href="grails/gorm/validation/Constrained.html" title="interface in 
grails.gorm.validation" target="classFrame"><I>Constrained</I></a></li>
 <li><a href="org/grails/scaffolding/model/property/Constrained.html" 
title="class in org.grails.scaffolding.model.property" 
target="classFrame">Constrained</a></li>
diff --git a/docs/snapshot/api/grails/plugin/springsecurity/ui/Constants.html 
b/docs/snapshot/api/grails/plugin/springsecurity/ui/Constants.html
deleted file mode 100644
index 7a2b8ea3f04..00000000000
--- a/docs/snapshot/api/grails/plugin/springsecurity/ui/Constants.html
+++ /dev/null
@@ -1,333 +0,0 @@
-<!--
-
-     Licensed to the Apache Software Foundation (ASF) under one
-     or more contributor license agreements.  See the NOTICE file
-     distributed with this work for additional information
-     regarding copyright ownership.  The ASF licenses this file
-     to you under the Apache License, Version 2.0 (the
-     "License"); you may not use this file except in compliance
-     with the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing,
-     software distributed under the License is distributed on an
-     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-     KIND, either express or implied.  See the License for the
-     specific language governing permissions and limitations
-     under the License.
-
--->
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
-<!-- **************************************************************** -->
-<!-- *  PLEASE KEEP COMPLICATED EXPRESSIONS OUT OF THESE TEMPLATES, * -->
-<!-- *  i.e. only iterate & print data where possible. Thanks, Jez. * -->
-<!-- **************************************************************** -->
-
-<html>
-<head>
-    <!-- Generated by groovydoc (5.0.7) -->
-    <title>Constants (Grails 8.0.0-SNAPSHOT)</title>
-    
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-    <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut 
icon">
-    <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
-    <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" 
title="Style">
-
-<body class="center">
-<script type="text/javascript"><!--
-if (location.href.indexOf('is-external=true') == -1) {
-    parent.document.title="Constants (Grails 8.0.0-SNAPSHOT)";
-}
-//-->
-</script>
-<noscript>
-    <div>JavaScript is disabled on your browser.</div>
-</noscript>
-<!-- ========= START OF TOP NAVBAR ======= -->
-<div class="topNav"><a name="navbar_top">
-    <!--   -->
-</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a 
name="navbar_top_firstrow">
-    <!--   -->
-</a>
-    <ul class="navList" title="Navigation">
-        <li><a href="../../../../overview-summary.html">Overview</a></li>
-        <li><a href="package-summary.html">Package</a></li>
-        <li class="navBarCell1Rev">Class</li>
-        <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
-        <li><a href="../../../../index-all.html">Index</a></li>
-        <li><a href="../../../../help-doc.html">Help</a></li>
-    </ul>
-</div>
-
-<div class="subNav">
-    <div>
-        <ul class="navList">
-            <li><a 
href="../../../../index.html?grails/plugin/springsecurity/ui/Constants" 
target="_top">Frames</a></li>
-            <li><a href="Constants.html" target="_top">No Frames</a></li>
-        </ul>
-    </div>
-    <div>
-        <ul class="subNavList">
-            <li>Summary:&nbsp;</li>
-            Nested&nbsp;&nbsp;&nbsp;<li><a 
href="#field_summary">Field</a></li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<li><a 
href="#constructor_summary">Constructor</a></li>&nbsp;&nbsp;&nbsp;Method&nbsp;&nbsp;&nbsp;
-        </ul>
-        <ul class="subNavList">
-            <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
-            <li><a 
href="#field_detail">Field</a></li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<li><a 
href="#constructor_detail">Constructor</a></li>&nbsp;&nbsp;&nbsp;Method&nbsp;&nbsp;&nbsp;
-        </ul>
-    </div>
-    <a name="skip-navbar_top">
-        <!--   -->
-    </a></div>
-<!-- ========= END OF TOP NAVBAR ========= -->
-
-<!-- ======== START OF CLASS DATA ======== -->
-<div class="header">
-
-    <div class="subTitle">Package: 
<strong>grails.plugin.springsecurity.ui</strong></div>
-
-    <h2 title="[Groovy] Class Constants" class="title">[Groovy] Class 
Constants</h2>
-</div>
-<div class="contentContainer">
-<ul class="inheritance">
-<li><ul 
class="inheritance"></ul></li><li>grails.plugin.springsecurity.ui.Constants
-</ul>
-<div class="description">
-    <ul class="blockList">
-        <li class="blockList">
-
-
-            <!-- todo: direct known subclasses -->
-            <hr>
-
-<pre>@groovy.transform.CompileStatic
-final class Constants
-extends java.lang.Object</pre>
-
-    <p> Used in jquery.js and jquery-ui.css. 
<DL><DT><B>Authors:</B></DT><DD><a href='mailto:[email protected]'>Burt 
Beckwith</a></DD></DL></p>
-
-          </li>
-    </ul>
-</div>
-
-<div class="summary">
-    <ul class="blockList">
-        <li class="blockList">
-        <!-- =========== NESTED CLASS SUMMARY =========== -->
-        
-
-        <!-- =========== ENUM CONSTANT SUMMARY =========== -->
-        
-        <!-- =========== FIELD SUMMARY =========== -->
-        
-            <ul class="blockList">
-                <li class="blockList"><a name="field_summary"><!--   --></a>
-                    <h3>Field Summary</h3>
-                    <ul class="blockList">
-                    <table class="overviewSummary" border="0" cellpadding="3" 
cellspacing="0" summary="Enum constants summary table">
-                        <caption><span>Fields</span><span 
class="tabEnd">&nbsp;</span></caption>
-                        <tr>
-                            <th class="colFirst" scope="col">Modifiers</th>
-                            <th class="colLast" scope="col">Name</th>
-                            <th class="colLast" scope="col">Description</th>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td 
class="colFirst"><code><strong>static&nbsp;java.lang.String</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a 
href="#JQUERY_UI_VERSION">JQUERY_UI_VERSION</a></code></td>
-                            <td class="colLast"></td>
-                        </tr>
-                        
-                        <tr class="rowColor">
-                            <td 
class="colFirst"><code><strong>static&nbsp;java.lang.String</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a 
href="#JQUERY_VERSION">JQUERY_VERSION</a></code></td>
-                            <td class="colLast"></td>
-                        </tr>
-                        
-                    </table>
-                   </ul>
-                </li>
-                
-            </ul>
-        
-
-        <!-- =========== PROPERTY SUMMARY =========== -->
-        
-
-        <!-- =========== ELEMENT SUMMARY =========== -->
-        
-
-        
-        <!-- ======== CONSTRUCTOR SUMMARY ======== -->
-        <ul class="blockList">
-                <li class="blockList"><a name="constructor_summary"><!--   
--></a>
-                    <h3>Constructor Summary</h3>
-                    <ul class="blockList">
-                    <table class="overviewSummary" border="0" cellpadding="3" 
cellspacing="0" summary="Constructors Summary table">
-                        <caption><span>Constructors</span><span 
class="tabEnd">&nbsp;</span></caption>
-                        <tr>
-                            <th class="colFirst" scope="col">Constructor and 
description</th>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst">
-                                <code><strong><a 
href="#Constants()">Constants</a></strong>()</code><br></td>
-                        </tr>
-                        
-                    </table>
-                   </ul>
-              </li>
-        </ul>
-        
-
-        
-        <!-- ========== METHOD SUMMARY =========== -->
-        <ul class="blockList">
-            
-            <li class="blockList"><a name="method_summary"><!--   --></a>
-                    <h3>Inherited Methods Summary</h3>
-                    <ul class="blockList">
-                    <table class="overviewSummary" border="0" cellpadding="3" 
cellspacing="0" summary="Inherited Methods Summary table">
-                        <caption><span>Inherited Methods</span><span 
class="tabEnd">&nbsp;</span></caption>
-                        <tr>
-                            <th class="colFirst" scope="col">Methods inherited 
from class</th>
-                            <th class="colLast" scope="col">Name</th>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code>class 
java.lang.Object</code></td>
-                            <td 
class="colLast"><code>java.lang.Object#equals(java.lang.Object), 
java.lang.Object#getClass(), java.lang.Object#hashCode(), 
java.lang.Object#notify(), java.lang.Object#notifyAll(), 
java.lang.Object#toString(), java.lang.Object#wait(), 
java.lang.Object#wait(long), java.lang.Object#wait(long, int)</code></td>
-                        </tr>
-                    </table>
-                   </ul>
-              </li>
-                
-        </ul>
-        
-    </li>
-    </ul>
-</div>
-
-<div class="details">
-    <ul class="blockList">
-        <li class="blockList">
-           
-
-            
-            <!-- =========== FIELD DETAIL =========== -->
-            <ul class="blockList">
-                <li class="blockList"><a name="field_detail">
-                    <!--   -->
-                </a>
-                    <h3>Field Detail</h3>
-                    
-                        <a name="JQUERY_UI_VERSION"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                
<h4>public&nbsp;static&nbsp;final&nbsp;java.lang.String 
<strong>JQUERY_UI_VERSION</strong></h4>
-                                <p></p>
-                            </li>
-                        </ul>
-                    
-                        <a name="JQUERY_VERSION"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                
<h4>public&nbsp;static&nbsp;final&nbsp;java.lang.String 
<strong>JQUERY_VERSION</strong></h4>
-                                <p></p>
-                            </li>
-                        </ul>
-                    
-                </li>
-            </ul>
-            
-
-            
-
-            
-
-            
-            <!-- =========== CONSTRUCTOR DETAIL =========== -->
-            <ul class="blockList">
-                <li class="blockList"><a name="constructor_detail">
-                    <!--   -->
-                </a>
-                    <h3>Constructor Detail</h3>
-                    
-                        <a name="Constants()"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4><strong>Constants</strong>()</h4>
-                                <p></p>
-                            </li>
-                        </ul>
-                    
-                </li>
-            </ul>
-            
-
-
-            
-        </li>
-    </ul>
-</div>
-
-<!-- ========= END OF CLASS DATA ========= -->
-<!-- ======= START OF BOTTOM NAVBAR ====== -->
-<div class="bottomNav"><a name="navbar_bottom">
-    <!--   -->
-</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a 
name="navbar_bottom_firstrow">
-    <!--   -->
-</a>
-    <ul class="navList" title="Navigation">
-        <li><a href="../../../../overview-summary.html">Overview</a></li>
-        <li><a href="package-summary.html">Package</a></li>
-        <li class="navBarCell1Rev">Class</li>
-        <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
-        <li><a href="../../../../index-all.html">Index</a></li>
-        <li><a href="../../../../help-doc.html">Help</a></li>
-    </ul>
-</div>
-
-<div class="subNav">
-    <div>
-        <ul class="navList">
-            <li><a 
href="../../../../index.html?grails/plugin/springsecurity/ui/Constants" 
target="_top">Frames</a></li>
-            <li><a href="Constants.html" target="_top">No Frames</a></li>
-        </ul>
-    </div>
-    <div>
-        <ul class="subNavList">
-            <li>Summary:&nbsp;</li>
-            Nested&nbsp;&nbsp;&nbsp;<li><a 
href="#field_summary">Field</a></li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<li><a 
href="#constructor_summary">Constructor</a></li>&nbsp;&nbsp;&nbsp;Method&nbsp;&nbsp;&nbsp;
-        </ul>
-        <ul class="subNavList">
-            <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
-            <li><a 
href="#field_detail">Field</a></li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<li><a 
href="#constructor_detail">Constructor</a></li>&nbsp;&nbsp;&nbsp;Method&nbsp;&nbsp;&nbsp;
-        </ul>
-    </div>
-    <p><!-- Matomo -->
-<script>
-    var _paq = window._paq = window._paq || [];
-    /* tracker methods like "setCustomDimension" should be called before 
"trackPageView" */
-    _paq.push(["setDoNotTrack", true]);
-    _paq.push(["disableCookies"]);
-    _paq.push(['trackPageView']);
-    _paq.push(['enableLinkTracking']);
-    (function() {
-        var u="https://analytics.apache.org/";;
-        _paq.push(['setTrackerUrl', u+'matomo.php']);
-        _paq.push(['setSiteId', '79']);
-        var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0];
-        g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
-    })();
-</script>
-<!-- End Matomo Code --></p>
-    <a name="skip-navbar_bottom">
-        <!--   -->
-    </a>
-    </div>
-</div>
-<!-- ======== END OF BOTTOM NAVBAR ======= -->
-</body>
-</html>
diff --git 
a/docs/snapshot/api/grails/plugin/springsecurity/ui/package-frame.html 
b/docs/snapshot/api/grails/plugin/springsecurity/ui/package-frame.html
index ba174b3edf0..7682af8ca67 100644
--- a/docs/snapshot/api/grails/plugin/springsecurity/ui/package-frame.html
+++ b/docs/snapshot/api/grails/plugin/springsecurity/ui/package-frame.html
@@ -51,7 +51,7 @@
 <div class="indexContainer">
     <h2>Classes</h2>
     <ul>
-        <li><a href="Constants.html" title="class in 
grails.plugin.springsecurity.ui" target="classFrame">Constants</a></li><li><a 
href="ForgotPasswordCommand.html" title="class in 
grails.plugin.springsecurity.ui" 
target="classFrame">ForgotPasswordCommand</a></li><li><a 
href="RegisterCommand.html" title="class in grails.plugin.springsecurity.ui" 
target="classFrame">RegisterCommand</a></li><li><a 
href="ResetPasswordCommand.html" title="class in 
grails.plugin.springsecurity.ui" target="cla [...]
+        <li><a href="ForgotPasswordCommand.html" title="class in 
grails.plugin.springsecurity.ui" 
target="classFrame">ForgotPasswordCommand</a></li><li><a 
href="RegisterCommand.html" title="class in grails.plugin.springsecurity.ui" 
target="classFrame">RegisterCommand</a></li><li><a 
href="ResetPasswordCommand.html" title="class in 
grails.plugin.springsecurity.ui" 
target="classFrame">ResetPasswordCommand</a></li><li><a 
href="SecurityQuestionsCommand.html" title="class in grails.plugin.spri [...]
     </ul>
 </div>
 
diff --git 
a/docs/snapshot/api/grails/plugin/springsecurity/ui/package-summary.html 
b/docs/snapshot/api/grails/plugin/springsecurity/ui/package-summary.html
index 5c045673632..67f33e10a30 100644
--- a/docs/snapshot/api/grails/plugin/springsecurity/ui/package-summary.html
+++ b/docs/snapshot/api/grails/plugin/springsecurity/ui/package-summary.html
@@ -114,14 +114,6 @@ function windowTitle()
                         <th class="colFirst" scope="col">Class</th>
                         <th class="colLast" scope="col">Description</th>
                     </tr>
-<tr class="altColor">
-                            <td class="colOne">
-                                <strong><a href="Constants.html" title="class 
in grails/plugin/springsecurity/ui">
-                                    Constants
-                                </a></strong>
-                            </td>
-                            <td>Used in jquery.js and jquery-ui.css.</td>
-                        </tr>
 <tr class="altColor">
                             <td class="colOne">
                                 <strong><a href="ForgotPasswordCommand.html" 
title="class in grails/plugin/springsecurity/ui">
diff --git a/docs/snapshot/api/index-all.html b/docs/snapshot/api/index-all.html
index f023e09bfe3..5546d79796a 100644
--- a/docs/snapshot/api/index-all.html
+++ b/docs/snapshot/api/index-all.html
@@ -7652,10 +7652,6 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/taglib/TagOutput.ConstantClosure.html#ConstantClosure(java.lang.Object)"
 title="Constructor in 
TagOutput.ConstantClosure">ConstantClosure(java.lang.Object)</a></span> - 
Constructor in <a 
href="org/grails/taglib/TagOutput.ConstantClosure.html">TagOutput.ConstantClosure</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a 
href="grails/plugin/springsecurity/ui/Constants.html" title="Class in 
grails.plugin.springsecurity.ui">Constants</a></span> - Class in <a 
href="./grails/plugin/springsecurity/ui/package-summary.html">grails.plugin.springsecurity.ui</a>
-</dt><dd><div class="block">Used in jquery.js and jquery-ui.css.</div></dd>
-<dt><span class="strong"><a 
href="grails/plugin/springsecurity/ui/Constants.html#Constants()" 
title="Constructor in Constants">Constants()</a></span> - Constructor in <a 
href="grails/plugin/springsecurity/ui/Constants.html">Constants</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/scaffolding/model/property/Constrained.html" title="Class in 
org.grails.scaffolding.model.property">Constrained</a></span> - Class in <a 
href="./org/grails/scaffolding/model/property/package-summary.html">org.grails.scaffolding.model.property</a>
 </dt><dd><div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/scaffolding/model/property/Constrained.html#constrained1" 
title="Property in Constrained">constrained1</a></span> - Property in <a 
href="org/grails/scaffolding/model/property/Constrained.html">Constrained</a>
@@ -33684,10 +33680,6 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd><div class="block"></div></dd>
 <dt><span class="strong"><a 
href="org/grails/datastore/mapping/query/jpa/JpaQueryInfo.html#JpaQueryInfo(java.lang.String,
 java.util.List)" title="Constructor in 
JpaQueryInfo">JpaQueryInfo(java.lang.String, java.util.List)</a></span> - 
Constructor in <a 
href="org/grails/datastore/mapping/query/jpa/JpaQueryInfo.html">JpaQueryInfo</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a 
href="grails/plugin/springsecurity/ui/Constants.html#JQUERY_UI_VERSION" 
title="Field in Constants">JQUERY_UI_VERSION</a></span> - Field in <a 
href="grails/plugin/springsecurity/ui/Constants.html">Constants</a>
-</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a 
href="grails/plugin/springsecurity/ui/Constants.html#JQUERY_VERSION" 
title="Field in Constants">JQUERY_VERSION</a></span> - Field in <a 
href="grails/plugin/springsecurity/ui/Constants.html">Constants</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/doc/DocPublisher.html#js" 
title="Property in DocPublisher">js</a></span> - Property in <a 
href="grails/doc/DocPublisher.html">DocPublisher</a>
 </dt><dd> <div class="block">The directory containing any Javascript to use 
(will override defaults) *</div></dd>
 <dt><span class="strong"><a href="grails/converters/JSON.html" title="Class in 
grails.converters">JSON</a></span> - Class in <a 
href="./grails/converters/package-summary.html">grails.converters</a>
@@ -35172,8 +35164,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a 
href="grails/views/mvc/SmartViewResolver.html#localeResolver" title="Property 
in SmartViewResolver">localeResolver</a></span> - Property in <a 
href="grails/views/mvc/SmartViewResolver.html">SmartViewResolver</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a 
href="org/grails/plugins/web/taglib/FormTagLib.html#localeSelect(java.util.Map)"
 title="Method in FormTagLib">localeSelect(java.util.Map)</a></span> - Method 
in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
-</dt><dd> <div class="block">A helper tag for creating locale 
selects.</div></dd>
+<dt><span class="strong"><a 
href="org/grails/plugins/web/taglib/FormTagLib.html#localeSelect(java.util.Map, 
groovy.lang.Closure)" title="Method in FormTagLib">localeSelect(java.util.Map, 
groovy.lang.Closure)</a></span> - Method in <a 
href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+</dt><dd> <div class="block">A helper tag for locale selection.</div></dd>
 <dt><span class="strong"><a 
href="grails/plugin/geb/support/LocalhostDownloadSupport.html" title="Class in 
grails.plugin.geb.support">LocalhostDownloadSupport</a></span> - Class in <a 
href="./grails/plugin/geb/support/package-summary.html">grails.plugin.geb.support</a>
 </dt><dd><div class="block"> <DL><DT><B>Authors:</B></DT><DD>Mattias 
Reichel</DD></DL></div></dd>
 <dt><span class="strong"><a 
href="grails/plugin/geb/support/LocalhostDownloadSupport.html#LocalhostDownloadSupport(geb.Browser,
 java.lang.String)" title="Constructor in 
LocalhostDownloadSupport">LocalhostDownloadSupport(geb.Browser, 
java.lang.String)</a></span> - Constructor in <a 
href="grails/plugin/geb/support/LocalhostDownloadSupport.html">LocalhostDownloadSupport</a>
diff --git a/docs/snapshot/api/org/grails/plugins/web/taglib/FormTagLib.html 
b/docs/snapshot/api/org/grails/plugins/web/taglib/FormTagLib.html
index 4c7cc2c845e..c157db0c6c9 100644
--- a/docs/snapshot/api/org/grails/plugins/web/taglib/FormTagLib.html
+++ b/docs/snapshot/api/org/grails/plugins/web/taglib/FormTagLib.html
@@ -279,7 +279,7 @@ implements <a 
href='../../../../../org.springframework.context.ApplicationContex
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td 
class="colLast"><code>java.lang.Object</code></td>
-                            <td class="colLast"><code><strong><a 
href="#localeSelect(java.util.Map)">localeSelect</a></strong>(java.util.Map 
attrs)</code><br>A helper tag for creating locale selects.</td>
+                            <td class="colLast"><code><strong><a 
href="#localeSelect(java.util.Map, 
groovy.lang.Closure)">localeSelect</a></strong>(java.util.Map attrs, 
groovy.lang.Closure body)</code><br>A helper tag for locale selection.</td>
                         </tr>
                         
                         <tr class="altColor">
@@ -557,15 +557,27 @@ implements <a 
href='../../../../../org.springframework.context.ApplicationContex
                             </li>
                         </ul>
                     
-                        <a name="localeSelect(java.util.Map)"><!-- --></a>
+                        <a name="localeSelect(java.util.Map, 
groovy.lang.Closure)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>java.lang.Object 
<strong>localeSelect</strong>(java.util.Map attrs)</h4>
-                                <p> A helper tag for creating locale 
selects.<br/>
-
- eg. &lt;g:localeSelect name="myLocale" value="${locale}" 
/&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED The name of the 
select</DD></DL><DL><DT><B>attr:</B></DT><DD>value The set locale, defaults to 
the current request locale if not 
specified</DD></DL><DL><DT><B>attr:</B></DT><DD>locale The locale to use for 
formatting the locale names. Defaults to the current request locale and then 
the system default locale if not 
specified</DD></DL><DL><DT><B>attr:</B></DT><DD>available If [...]
+                                <h4>java.lang.Object 
<strong>localeSelect</strong>(java.util.Map attrs, groovy.lang.Closure 
body)</h4>
+                                <p> A helper tag for locale selection.<br/>
+
+ <p>With no body it renders a control: a native <CODE>&lt;select&gt;</CODE> by 
default, or a plain list of
+ <CODE>&lt;a&gt;</CODE> links with <CODE>type="links"</CODE>. With a body it 
becomes an iterating tag &mdash; it
+ resolves the locales once and renders the body for each, exposing a 
per-locale model under the
+ <CODE>var</CODE> attribute so the caller supplies its own markup (a Bootstrap 
dropdown, a footer
+ list, etc.). The model exposes: <CODE>locale</CODE>, <CODE>tag</CODE> 
(BCP&#8209;47), <CODE>code</CODE>
+ (<CODE>language_COUNTRY</CODE>), <CODE>autonym</CODE> (the name in its own 
language), <CODE>name</CODE> (the
+ name in the display locale), <CODE>label</CODE>, <CODE>active</CODE> (matches 
the current locale),
+ <CODE>default</CODE> (matches the configured default) and <CODE>index</CODE>.
+
+ eg. &lt;g:localeSelect name="myLocale" value="${locale}" labelType="autonym" 
/&gt;<DL><DT><B>attr:</B></DT><DD>name The name of the select (select 
mode)</DD></DL><DL><DT><B>attr:</B></DT><DD>value The selected locale, defaults 
to the current request locale if not 
specified</DD></DL><DL><DT><B>attr:</B></DT><DD>available If <code>true</code>, 
list only the locales the application is translated into
  (those with a <code>messages_*.properties</code> bundle, as published to the 
servlet context by
- the i18n plugin) instead of every locale the JVM knows about. Defaults to 
<code>false</code>.</DD></DL> </p>
+ the i18n plugin) instead of every locale the JVM knows about. Defaults to 
<code>false</code>.</DD></DL><DL><DT><B>attr:</B></DT><DD>type 
<code>select</code> (default) or <code>links</code>. Ignored when a body is 
supplied.</DD></DL><DL><DT><B>attr:</B></DT><DD>labelType The option/link 
label: <code>autonym</code> (each locale in its own language),
+ <code>name</code> (in the display locale), <code>both</code>, or omitted for 
the legacy
+ <code>"language, [COUNTRY,] name"</code> 
label.</DD></DL><DL><DT><B>attr:</B></DT><DD>sort If <code>true</code>, order 
the locales by their label using a locale-independent 
collator.</DD></DL><DL><DT><B>attr:</B></DT><DD>tags If <code>true</code>, 
option/link keys are BCP&#8209;47 language tags (<code>en-US</code>)
+ rather than the legacy <code>en_US</code> 
form.</DD></DL><DL><DT><B>attr:</B></DT><DD>pinDefault If <code>true</code> 
(body mode), the configured default locale is emitted 
first.</DD></DL><DL><DT><B>attr:</B></DT><DD>param The request parameter name 
used for <code>links</code>-mode hrefs. Defaults to 
<code>lang</code>.</DD></DL><DL><DT><B>attr:</B></DT><DD>var Enables body mode: 
the name of the per-locale model variable exposed to the body.</DD></DL> </p>
                             </li>
                         </ul>
                     
diff --git a/docs/snapshot/grails-data/developer-manual/gettingStarted.html 
b/docs/snapshot/grails-data/developer-manual/gettingStarted.html
index 76f79739efd..49360b11be5 100644
--- a/docs/snapshot/grails-data/developer-manual/gettingStarted.html
+++ b/docs/snapshot/grails-data/developer-manual/gettingStarted.html
@@ -523,7 +523,7 @@ cd grails-core</pre>
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-07-18 16:18:57 UTC
+Last updated 2026-07-19 05:30:31 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/introduction.html 
b/docs/snapshot/grails-data/developer-manual/introduction.html
index 5964fcd831a..d1b45d9633e 100644
--- a/docs/snapshot/grails-data/developer-manual/introduction.html
+++ b/docs/snapshot/grails-data/developer-manual/introduction.html
@@ -476,7 +476,7 @@ body.book #toc,body.book #preamble,body.book 
h1.sect0,body.book .sect1>h2{page-b
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-07-18 16:18:57 UTC
+Last updated 2026-07-19 05:30:31 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/stepByStep.html 
b/docs/snapshot/grails-data/developer-manual/stepByStep.html
index f1fa1060b35..f24b9a25ace 100644
--- a/docs/snapshot/grails-data/developer-manual/stepByStep.html
+++ b/docs/snapshot/grails-data/developer-manual/stepByStep.html
@@ -621,7 +621,7 @@ class XyzTestSuite {
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-07-18 16:18:57 UTC
+Last updated 2026-07-19 05:30:31 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/testing.html 
b/docs/snapshot/grails-data/developer-manual/testing.html
index 993f69ae357..124340de9a0 100644
--- a/docs/snapshot/grails-data/developer-manual/testing.html
+++ b/docs/snapshot/grails-data/developer-manual/testing.html
@@ -511,7 +511,7 @@ class PagedResultSpec extends GormDatastoreSpec{
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-07-18 16:18:57 UTC
+Last updated 2026-07-19 05:30:31 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi.html 
b/docs/snapshot/grails-data/developer-manual/understandingApi.html
index 2deb8147f73..2424648e731 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi.html
@@ -454,7 +454,7 @@ body.book #toc,body.book #preamble,body.book 
h1.sect0,body.book .sect1>h2{page-b
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-07-18 16:18:57 UTC
+Last updated 2026-07-19 05:30:31 UTC
 </div>
 </div>
 </body>
diff --git 
a/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
 
b/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
index 685444ff9c6..dac6bd7e617 100644
--- 
a/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
+++ 
b/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
@@ -561,7 +561,7 @@ protected Session createSession(PropertyResolver 
connDetails) {
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-07-18 16:18:57 UTC
+Last updated 2026-07-19 05:30:31 UTC
 </div>
 </div>
 </body>
diff --git 
a/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html 
b/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
index cdad11c4068..ac1ede889a0 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
@@ -496,7 +496,7 @@ class Neo4jEntityTraitProvider implements 
GormEntityTraitProvider {
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-07-18 16:18:57 UTC
+Last updated 2026-07-19 05:30:31 UTC
 </div>
 </div>
 </body>
diff --git 
a/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html 
b/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
index 8d7f5d46824..217bb5af854 100644
--- 
a/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
+++ 
b/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
@@ -488,7 +488,7 @@ enhancer.enhance()</code></pre>
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-07-18 16:18:57 UTC
+Last updated 2026-07-19 05:30:31 UTC
 </div>
 </div>
 </body>
diff --git 
a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
 
b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
index 906fe9fc2de..7ac483f1d54 100644
--- 
a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
+++ 
b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
@@ -673,7 +673,7 @@ protected void deleteEntry(String family, final Object key, 
final Object entry)
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-07-18 16:18:57 UTC
+Last updated 2026-07-19 05:30:31 UTC
 </div>
 </div>
 </body>
diff --git 
a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
 
b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
index d41578c1b30..230252c20c0 100644
--- 
a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
+++ 
b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
@@ -588,7 +588,7 @@ If, for instance, the underlying datastore does not support 
the calculation of a
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-07-18 16:18:57 UTC
+Last updated 2026-07-19 05:30:31 UTC
 </div>
 </div>
 </body>
diff --git 
a/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
 
b/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
index af4415dba23..072132b23e2 100644
--- 
a/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
+++ 
b/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
@@ -526,7 +526,7 @@ If the underlying datastore supports secondary indexes then 
it is ok to just ret
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-07-18 16:18:57 UTC
+Last updated 2026-07-19 05:30:31 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/whats-new-manual/index.html 
b/docs/snapshot/grails-data/whats-new-manual/index.html
index a8268ace5ce..efdae961095 100644
--- a/docs/snapshot/grails-data/whats-new-manual/index.html
+++ b/docs/snapshot/grails-data/whats-new-manual/index.html
@@ -527,7 +527,7 @@ body.book #toc,body.book #preamble,body.book 
h1.sect0,body.book .sect1>h2{page-b
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-07-18 16:18:57 UTC
+Last updated 2026-07-19 05:30:31 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/guide/i18n.html b/docs/snapshot/guide/i18n.html
index 8bcb28bcdf8..6e265f8728e 100644
--- a/docs/snapshot/guide/i18n.html
+++ b/docs/snapshot/guide/i18n.html
@@ -289,16 +289,22 @@ Companies deploy assistants like this [](https://kapa.ai) 
on docs via [website w
 <p>Grails will automatically switch the user&#8217;s locale and subsequent 
requests will use the switched locale.</p>
 </div>
 <div class="paragraph">
-<p>To offer a language selector, the i18n plugin discovers the locales your 
application is actually translated into by scanning the classpath for 
<code>messages_&#42;.properties</code> bundles (plus the default locale, 
configurable via <code>grails.i18n.default.locale</code>). This list is exposed 
as the <code>AvailableLocaleResolver</code> bean and published to the servlet 
context under the <code>availableLocales</code> attribute. The 
<code>&lt;g:localeSelect available="true"/&gt;</code [...]
+<p>To offer a language selector, the i18n plugin discovers the locales your 
application is actually translated into by scanning the classpath for 
<code>messages_&#42;.properties</code> bundles (plus the default locale, 
configurable via <code>grails.i18n.default.locale</code>). This list is exposed 
as the <code>AvailableLocaleResolver</code> bean, ordered by each 
locale&#8217;s own name (autonym), and published to the servlet context under 
the <code>availableLocales</code> attribute.</p>
+</div>
+<div class="paragraph">
+<p>The <code>&lt;g:localeSelect available="true"/&gt;</code> tag renders a 
<code>&lt;select&gt;</code> limited to those locales. To build a custom 
switcher, use the tag&#8217;s body form: it resolves and orders the locales and 
flags the active (<code>loc.active</code>) and configured-default 
(<code>loc.default</code>) entries, while your markup decides how each is 
rendered:</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="xml"><span 
class="tag">&lt;g:each</span> <span class="attribute-name">in</span>=<span 
class="string"><span class="delimiter">&quot;</span><span 
class="content">${application.getAttribute('availableLocales')}</span><span 
class="delimiter">&quot;</span></span> <span 
class="attribute-name">var</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">locale</span><span 
class="delimiter">&quot;</span></span><span cl [...]
-    <span class="tag">&lt;a</span> <span 
class="attribute-name">href</span>=<span class="string"><span 
class="delimiter">&quot;</span><span 
class="content">?lang=${locale.toLanguageTag()}</span><span 
class="delimiter">&quot;</span></span><span 
class="tag">&gt;</span>${locale.getDisplayName(locale)}<span 
class="tag">&lt;/a&gt;</span>
-<span class="tag">&lt;/g:each&gt;</span></code></pre>
+<pre class="CodeRay highlight"><code data-lang="xml"><span 
class="tag">&lt;g:localeSelect</span> <span 
class="attribute-name">available</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">true</span><span 
class="delimiter">&quot;</span></span> <span 
class="attribute-name">pinDefault</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">true</span><span 
class="delimiter">&quot;</span></span> <span class="attribute-name">v [...]
+    <span class="tag">&lt;a</span> <span 
class="attribute-name">href</span>=<span class="string"><span 
class="delimiter">&quot;</span><span 
class="content">?lang=${loc.tag}</span><span 
class="delimiter">&quot;</span></span><span class="error">$</span><span 
class="error">{</span><span class="attribute-name">loc.active</span> <span 
class="error">?</span> <span class="error">'</span> <span 
class="attribute-name">aria-current</span>=<span class="string"><span 
class="delimiter">&quot;</span>< [...]
+<span class="tag">&lt;/g:localeSelect&gt;</span></code></pre>
 </div>
 </div>
 <div class="paragraph">
+<p>Alternatively, iterate the published <code>availableLocales</code> list 
directly.</p>
+</div>
+<div class="paragraph">
 <p>By default every <code>&#42;.properties</code> bundle on the classpath is 
considered, so locales contributed by plugins &mdash; whose bundles are 
namespaced (for example <code>spring-security-core_fr.properties</code>) 
&mdash; are listed alongside your application&#8217;s own. Candidate suffixes 
are validated against the ISO language codes (and the ISO country codes when a 
country is present), so non-i18n properties files (such as 
<code>application.properties</code>) are ignored. To r [...]
 </div>
 <div class="listingblock">
@@ -311,7 +317,7 @@ Companies deploy assistants like this [](https://kapa.ai) 
on docs via [website w
 </div>
 </div>
 <div class="paragraph">
-<p>Applications created with <code>grails create-app</code> include a 
ready-made language dropdown in the default layout that uses exactly this 
mechanism.</p>
+<p>Applications created with <code>grails create-app</code> include a 
ready-made Bootstrap language dropdown in the default layout, built with the 
<code>g:localeSelect</code> body form shown above.</p>
 </div>
 <div class="paragraph">
 <p>By default, Grails uses <a 
href="https://docs.spring.io/spring-framework/docs/7.0.8/javadoc-api/org/springframework/web/servlet/i18n/SessionLocaleResolver.html";>SessionLocaleResolver</a>
 as the <code>localeResolver</code> bean.</p>
diff --git a/docs/snapshot/guide/single.html b/docs/snapshot/guide/single.html
index 3c7a63771eb..ee34b1c859a 100644
--- a/docs/snapshot/guide/single.html
+++ b/docs/snapshot/guide/single.html
@@ -5074,6 +5074,62 @@ Grails 8 changes such as Spring Boot 4) needs an update 
for that reason.
 </table>
 </div>
 </div>
+<div class="sect3">
+<h4 id="_36_jquery_webjar_upgraded_to_4_0_0">36. jQuery Webjar Upgraded to 
4.0.0</h4>
+<div class="paragraph">
+<p>The jQuery webjar managed by the <code>grails-bom</code> 
(<code>org.webjars.npm:jquery</code>) moves from 3.7.1 to 4.0.0.
+jQuery 4 is a major release: it drops Internet Explorer and other legacy 
browsers and removes long-deprecated utilities such as 
<code>jQuery.trim</code>, <code>jQuery.type</code>, 
<code>jQuery.isArray</code>, <code>jQuery.isFunction</code>, 
<code>jQuery.proxy</code>, and <code>jQuery.isWindow</code>.
+See the <a href="https://jquery.com/upgrade-guide/4.0/";>jQuery 4.0 Upgrade 
Guide</a> for the complete list of changes.</p>
+</div>
+<div class="paragraph">
+<p>Because the version is managed by the BOM, any application that references 
the jQuery webjar without an explicit version picks up 4.0.0 automatically once 
it adopts the Grails 8 BOM.
+This includes the generated create-app welcome page, whose assets have been 
verified against 4.0.0.</p>
+</div>
+<div class="paragraph">
+<p>If your application&#8217;s own JavaScript relies on the removed APIs, 
migrate those call sites.
+If you are not ready to migrate, pin the previous version in your gradle 
build:</p>
+</div>
+<div class="listingblock">
+<div class="title">gradle.properties</div>
+<div class="content">
+<pre class="CodeRay highlight"><code 
data-lang="properties">jquery.version=3.7.1</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_37_spring_security_ui_rewritten_on_bootstrap_5">37. 
spring-security-ui Rewritten on Bootstrap 5</h4>
+<div class="paragraph">
+<p>The <code>spring-security-ui</code> plugin&#8217;s screens are rewritten on 
Bootstrap 5 with no bundled styling of their own.
+The plugin no longer ships or depends on jQuery UI, jquery-form, jGrowl, 
DataTables, bgiframe or the bundled jdMenu/positionBy plugins, and every plugin 
stylesheet and image has been removed — dialogs are Bootstrap modals, tabs are 
nav-tabs, notifications render through <code>g:flashMessages</code>, and the 
autocomplete search uses a native <code>datalist</code>.
+jQuery (4.x) and Bootstrap are expected from the host application, as provided 
by the create-app layout.</p>
+</div>
+<div class="paragraph">
+<p>Plugin pages now render through the host application&#8217;s own layout — 
configured with <code>grails.plugin.springsecurity.ui.gsp.parentLayout</code> 
(default <code>main</code>) — inheriting its theme, including Bootstrap dark 
mode, locale selector and branding.
+The security menu and login state are contributed to the host navbar through 
<code>nav</code> and <code>navActions</code> content blocks, which the 
create-app layout renders with <code>&lt;g:pageProperty 
name="page.nav"/&gt;</code> and <code>&lt;g:pageProperty 
name="page.navActions"/&gt;</code>; a custom layout that wants the menu in its 
navbar renders the same page properties.</p>
+</div>
+<div class="paragraph">
+<p>If you upgrade an application that customized the plugin:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Views previously copied into the application with 
<code>s2ui-override</code> reference removed stylesheets and rely on the old 
table-based markup of the <code>s2ui</code> field-row tags, which now emit 
Bootstrap form groups; regenerate or update those copies.</p>
+</li>
+<li>
+<p>CSS written against the old <code>s2ui_*</code> and <code>jd_menu</code> 
classes no longer has anything to match; restyle against Bootstrap classes.</p>
+</li>
+<li>
+<p>Applications that used the plugin&#8217;s transitive webjars (jQuery UI, 
jGrowl, DataTables, jquery-form) must now declare those dependencies 
themselves.</p>
+</li>
+<li>
+<p>The <code>grails.plugin.springsecurity.ui.Constants</code> class and the 
<code>spring-security-ui-register.js</code> and 
<code>spring-security-ui-*</code> stylesheet assets have been removed.</p>
+</li>
+<li>
+<p><code>LogoutController</code> now declares a computed 
<code>allowedMethods</code> restricting its action to POST while 
<code>logout.postOnly</code> is active (the default), making the restriction 
visible to tooling such as the create-app welcome page.</p>
+</li>
+</ul>
+</div>
+</div>
 </div>
 
 
@@ -36076,16 +36132,22 @@ You can find the full list of available CodeNarc 
rules at <a href="https://coden
 <p>Grails will automatically switch the user&#8217;s locale and subsequent 
requests will use the switched locale.</p>
 </div>
 <div class="paragraph">
-<p>To offer a language selector, the i18n plugin discovers the locales your 
application is actually translated into by scanning the classpath for 
<code>messages_&#42;.properties</code> bundles (plus the default locale, 
configurable via <code>grails.i18n.default.locale</code>). This list is exposed 
as the <code>AvailableLocaleResolver</code> bean and published to the servlet 
context under the <code>availableLocales</code> attribute. The 
<code>&lt;g:localeSelect available="true"/&gt;</code [...]
+<p>To offer a language selector, the i18n plugin discovers the locales your 
application is actually translated into by scanning the classpath for 
<code>messages_&#42;.properties</code> bundles (plus the default locale, 
configurable via <code>grails.i18n.default.locale</code>). This list is exposed 
as the <code>AvailableLocaleResolver</code> bean, ordered by each 
locale&#8217;s own name (autonym), and published to the servlet context under 
the <code>availableLocales</code> attribute.</p>
+</div>
+<div class="paragraph">
+<p>The <code>&lt;g:localeSelect available="true"/&gt;</code> tag renders a 
<code>&lt;select&gt;</code> limited to those locales. To build a custom 
switcher, use the tag&#8217;s body form: it resolves and orders the locales and 
flags the active (<code>loc.active</code>) and configured-default 
(<code>loc.default</code>) entries, while your markup decides how each is 
rendered:</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="xml"><span 
class="tag">&lt;g:each</span> <span class="attribute-name">in</span>=<span 
class="string"><span class="delimiter">&quot;</span><span 
class="content">${application.getAttribute('availableLocales')}</span><span 
class="delimiter">&quot;</span></span> <span 
class="attribute-name">var</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">locale</span><span 
class="delimiter">&quot;</span></span><span cl [...]
-    <span class="tag">&lt;a</span> <span 
class="attribute-name">href</span>=<span class="string"><span 
class="delimiter">&quot;</span><span 
class="content">?lang=${locale.toLanguageTag()}</span><span 
class="delimiter">&quot;</span></span><span 
class="tag">&gt;</span>${locale.getDisplayName(locale)}<span 
class="tag">&lt;/a&gt;</span>
-<span class="tag">&lt;/g:each&gt;</span></code></pre>
+<pre class="CodeRay highlight"><code data-lang="xml"><span 
class="tag">&lt;g:localeSelect</span> <span 
class="attribute-name">available</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">true</span><span 
class="delimiter">&quot;</span></span> <span 
class="attribute-name">pinDefault</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">true</span><span 
class="delimiter">&quot;</span></span> <span class="attribute-name">v [...]
+    <span class="tag">&lt;a</span> <span 
class="attribute-name">href</span>=<span class="string"><span 
class="delimiter">&quot;</span><span 
class="content">?lang=${loc.tag}</span><span 
class="delimiter">&quot;</span></span><span class="error">$</span><span 
class="error">{</span><span class="attribute-name">loc.active</span> <span 
class="error">?</span> <span class="error">'</span> <span 
class="attribute-name">aria-current</span>=<span class="string"><span 
class="delimiter">&quot;</span>< [...]
+<span class="tag">&lt;/g:localeSelect&gt;</span></code></pre>
 </div>
 </div>
 <div class="paragraph">
+<p>Alternatively, iterate the published <code>availableLocales</code> list 
directly.</p>
+</div>
+<div class="paragraph">
 <p>By default every <code>&#42;.properties</code> bundle on the classpath is 
considered, so locales contributed by plugins &mdash; whose bundles are 
namespaced (for example <code>spring-security-core_fr.properties</code>) 
&mdash; are listed alongside your application&#8217;s own. Candidate suffixes 
are validated against the ISO language codes (and the ISO country codes when a 
country is present), so non-i18n properties files (such as 
<code>application.properties</code>) are ignored. To r [...]
 </div>
 <div class="listingblock">
@@ -36098,7 +36160,7 @@ You can find the full list of available CodeNarc rules 
at <a href="https://coden
 </div>
 </div>
 <div class="paragraph">
-<p>Applications created with <code>grails create-app</code> include a 
ready-made language dropdown in the default layout that uses exactly this 
mechanism.</p>
+<p>Applications created with <code>grails create-app</code> include a 
ready-made Bootstrap language dropdown in the default layout, built with the 
<code>g:localeSelect</code> body form shown above.</p>
 </div>
 <div class="paragraph">
 <p>By default, Grails uses <a 
href="https://docs.spring.io/spring-framework/docs/7.0.8/javadoc-api/org/springframework/web/servlet/i18n/SessionLocaleResolver.html";>SessionLocaleResolver</a>
 as the <code>localeResolver</code> bean.</p>
diff --git a/docs/snapshot/guide/upgrading.html 
b/docs/snapshot/guide/upgrading.html
index 833df41a4ee..9dc33de46bf 100644
--- a/docs/snapshot/guide/upgrading.html
+++ b/docs/snapshot/guide/upgrading.html
@@ -2692,6 +2692,62 @@ Grails 8 changes such as Spring Boot 4) needs an update 
for that reason.
 </table>
 </div>
 </div>
+<div class="sect3">
+<h4 id="_36_jquery_webjar_upgraded_to_4_0_0">36. jQuery Webjar Upgraded to 
4.0.0</h4>
+<div class="paragraph">
+<p>The jQuery webjar managed by the <code>grails-bom</code> 
(<code>org.webjars.npm:jquery</code>) moves from 3.7.1 to 4.0.0.
+jQuery 4 is a major release: it drops Internet Explorer and other legacy 
browsers and removes long-deprecated utilities such as 
<code>jQuery.trim</code>, <code>jQuery.type</code>, 
<code>jQuery.isArray</code>, <code>jQuery.isFunction</code>, 
<code>jQuery.proxy</code>, and <code>jQuery.isWindow</code>.
+See the <a href="https://jquery.com/upgrade-guide/4.0/";>jQuery 4.0 Upgrade 
Guide</a> for the complete list of changes.</p>
+</div>
+<div class="paragraph">
+<p>Because the version is managed by the BOM, any application that references 
the jQuery webjar without an explicit version picks up 4.0.0 automatically once 
it adopts the Grails 8 BOM.
+This includes the generated create-app welcome page, whose assets have been 
verified against 4.0.0.</p>
+</div>
+<div class="paragraph">
+<p>If your application&#8217;s own JavaScript relies on the removed APIs, 
migrate those call sites.
+If you are not ready to migrate, pin the previous version in your gradle 
build:</p>
+</div>
+<div class="listingblock">
+<div class="title">gradle.properties</div>
+<div class="content">
+<pre class="CodeRay highlight"><code 
data-lang="properties">jquery.version=3.7.1</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_37_spring_security_ui_rewritten_on_bootstrap_5">37. 
spring-security-ui Rewritten on Bootstrap 5</h4>
+<div class="paragraph">
+<p>The <code>spring-security-ui</code> plugin&#8217;s screens are rewritten on 
Bootstrap 5 with no bundled styling of their own.
+The plugin no longer ships or depends on jQuery UI, jquery-form, jGrowl, 
DataTables, bgiframe or the bundled jdMenu/positionBy plugins, and every plugin 
stylesheet and image has been removed — dialogs are Bootstrap modals, tabs are 
nav-tabs, notifications render through <code>g:flashMessages</code>, and the 
autocomplete search uses a native <code>datalist</code>.
+jQuery (4.x) and Bootstrap are expected from the host application, as provided 
by the create-app layout.</p>
+</div>
+<div class="paragraph">
+<p>Plugin pages now render through the host application&#8217;s own layout — 
configured with <code>grails.plugin.springsecurity.ui.gsp.parentLayout</code> 
(default <code>main</code>) — inheriting its theme, including Bootstrap dark 
mode, locale selector and branding.
+The security menu and login state are contributed to the host navbar through 
<code>nav</code> and <code>navActions</code> content blocks, which the 
create-app layout renders with <code>&lt;g:pageProperty 
name="page.nav"/&gt;</code> and <code>&lt;g:pageProperty 
name="page.navActions"/&gt;</code>; a custom layout that wants the menu in its 
navbar renders the same page properties.</p>
+</div>
+<div class="paragraph">
+<p>If you upgrade an application that customized the plugin:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Views previously copied into the application with 
<code>s2ui-override</code> reference removed stylesheets and rely on the old 
table-based markup of the <code>s2ui</code> field-row tags, which now emit 
Bootstrap form groups; regenerate or update those copies.</p>
+</li>
+<li>
+<p>CSS written against the old <code>s2ui_*</code> and <code>jd_menu</code> 
classes no longer has anything to match; restyle against Bootstrap classes.</p>
+</li>
+<li>
+<p>Applications that used the plugin&#8217;s transitive webjars (jQuery UI, 
jGrowl, DataTables, jquery-form) must now declare those dependencies 
themselves.</p>
+</li>
+<li>
+<p>The <code>grails.plugin.springsecurity.ui.Constants</code> class and the 
<code>spring-security-ui-register.js</code> and 
<code>spring-security-ui-*</code> stylesheet assets have been removed.</p>
+</li>
+<li>
+<p><code>LogoutController</code> now declares a computed 
<code>allowedMethods</code> restricting its action to POST while 
<code>logout.postOnly</code> is active (the default), making the restriction 
visible to tooling such as the create-app welcome page.</p>
+</li>
+</ul>
+</div>
+</div>
 </div>
 
 
diff --git a/docs/snapshot/ref/Tags - GSP/localeSelect.html 
b/docs/snapshot/ref/Tags - GSP/localeSelect.html
index 63b1a1aa56a..5e181649683 100644
--- a/docs/snapshot/ref/Tags - GSP/localeSelect.html    
+++ b/docs/snapshot/ref/Tags - GSP/localeSelect.html    
@@ -185,39 +185,71 @@ Companies deploy assistants like this [](https://kapa.ai) 
on docs via [website w
 <div class="sect2">
 <h3 id="_purpose">Purpose</h3>
 <div class="paragraph">
-<p>Generates an HTML select with <code>Locale</code>s as values</p>
+<p>Renders a locale selector. Without a body it produces a control (a native 
<code>&lt;select&gt;</code> or a list of links); with a body it iterates the 
locales and renders your own markup for each.</p>
 </div>
 </div>
 <div class="sect2">
 <h3 id="_examples">Examples</h3>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="xml"><span 
class="comment">&lt;!-- create a locale select --&gt;</span>
+<pre class="CodeRay highlight"><code data-lang="xml"><span 
class="comment">&lt;!-- a native &lt;select&gt; of every JVM locale 
--&gt;</span>
 <span class="tag">&lt;g:localeSelect</span> <span 
class="attribute-name">name</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">myLocale</span><span 
class="delimiter">&quot;</span></span> <span 
class="attribute-name">value</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">${locale}</span><span 
class="delimiter">&quot;</span></span> <span class="tag">/&gt;</span>
 
-<span class="comment">&lt;!-- list only the locales the application is 
translated into --&gt;</span>
-<span class="tag">&lt;g:localeSelect</span> <span 
class="attribute-name">name</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">myLocale</span><span 
class="delimiter">&quot;</span></span> <span 
class="attribute-name">available</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">true</span><span 
class="delimiter">&quot;</span></span> <span 
class="tag">/&gt;</span></code></pre>
+<span class="comment">&lt;!-- restrict to the locales the application is 
translated into, each labelled in its
+     own language and ordered by that label --&gt;</span>
+<span class="tag">&lt;g:localeSelect</span> <span 
class="attribute-name">name</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">myLocale</span><span 
class="delimiter">&quot;</span></span> <span 
class="attribute-name">available</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">true</span><span 
class="delimiter">&quot;</span></span> <span 
class="attribute-name">labelType</span>=<span class="string"><span class="delim 
[...]
+
+<span class="comment">&lt;!-- a plain list of links that switch locale via 
?lang= --&gt;</span>
+<span class="tag">&lt;g:localeSelect</span> <span 
class="attribute-name">available</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">true</span><span 
class="delimiter">&quot;</span></span> <span 
class="attribute-name">type</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">links</span><span 
class="delimiter">&quot;</span></span> <span 
class="attribute-name">labelType</span>=<span class="string"><span 
class="delimite [...]
+
+<span class="comment">&lt;!-- body form: supply your own markup (e.g. a 
Bootstrap dropdown) and reuse the tag's
+     locale resolution, sorting, autonym labels and active/default detection 
--&gt;</span>
+<span class="tag">&lt;g:localeSelect</span> <span 
class="attribute-name">available</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">true</span><span 
class="delimiter">&quot;</span></span> <span 
class="attribute-name">pinDefault</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">true</span><span 
class="delimiter">&quot;</span></span> <span 
class="attribute-name">var</span>=<span class="string"><span class="delimiter 
[...]
+    <span class="tag">&lt;li&gt;</span><span class="tag">&lt;a</span> <span 
class="attribute-name">class</span>=<span class="string"><span 
class="delimiter">&quot;</span><span class="content">dropdown-item${loc.active 
? ' active' : ''}</span><span class="delimiter">&quot;</span></span>
+           <span class="attribute-name">href</span>=<span class="string"><span 
class="delimiter">&quot;</span><span 
class="content">?lang=${loc.tag}</span><span 
class="delimiter">&quot;</span></span><span 
class="tag">&gt;</span>${loc.autonym}<span class="tag">&lt;/a&gt;</span><span 
class="tag">&lt;/li&gt;</span>
+<span class="tag">&lt;/g:localeSelect&gt;</span></code></pre>
 </div>
 </div>
 </div>
 <div class="sect2">
 <h3 id="_description">Description</h3>
 <div class="paragraph">
+<p>Without a body the tag renders a control: a native 
<code>&lt;select&gt;</code> by default, or a plain list of 
<code>&lt;a&gt;</code> links with <code>type="links"</code>. With a body it 
renders that body once per locale, exposing a per-locale model under the 
<code>var</code> attribute so you supply your own markup (for example the 
Bootstrap dropdown in the <code>create-app</code> default layout).</p>
+</div>
+<div class="paragraph">
 <p>Attributes</p>
 </div>
 <div class="ulist">
 <ul>
 <li>
-<p><code>name</code> - The name to be used for the select box</p>
+<p><code>name</code> - The name to be used for the select box (select mode)</p>
 </li>
 <li>
 <p><code>value</code> (optional) - The selected <a 
href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Locale.html";>Locale</a>;
 defaults to the current request locale if not specified</p>
 </li>
 <li>
-<p><code>locale</code> (optional) - The <a 
href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Locale.html";>Locale</a>
 to use for formatting the locale names. Defaults to the current request locale 
and then the system default locale if not specified</p>
+<p><code>available</code> (optional) - If <code>true</code>, lists only the 
locales the application is actually translated into (those with a 
<code>messages_&#42;.properties</code> bundle on the classpath, as discovered 
by the i18n plugin) rather than every locale the JVM knows about. Defaults to 
<code>false</code>.</p>
 </li>
 <li>
-<p><code>available</code> (optional) - If <code>true</code>, lists only the 
locales the application is actually translated into (those with a 
<code>messages_&#42;.properties</code> bundle on the classpath, as discovered 
by the i18n plugin) rather than every locale the JVM knows about. Defaults to 
<code>false</code>.</p>
+<p><code>type</code> (optional) - <code>select</code> (default) or 
<code>links</code>. Ignored when a body is supplied.</p>
+</li>
+<li>
+<p><code>labelType</code> (optional) - The option/link label: 
<code>autonym</code> (each locale in its own language, e.g. 
<code>Deutsch</code>), <code>name</code> (in the display locale, e.g. 
<code>German</code>), <code>both</code>, or omitted for the legacy 
<code>"language, [COUNTRY,] name"</code> label.</p>
+</li>
+<li>
+<p><code>sort</code> (optional) - If <code>true</code>, orders the locales by 
their label using a locale-independent collator.</p>
+</li>
+<li>
+<p><code>tags</code> (optional) - If <code>true</code>, option/link keys are 
BCP&#8209;47 language tags (<code>en-US</code>) rather than the legacy 
<code>en_US</code> form.</p>
+</li>
+<li>
+<p><code>pinDefault</code> (optional) - If <code>true</code> (body mode), 
emits the configured default locale (<code>grails.i18n.default.locale</code>, 
falling back to <code>spring.web.locale</code>) first, so it can be pinned to 
the top of a switcher.</p>
+</li>
+<li>
+<p><code>param</code> (optional) - The request parameter name used for 
<code>links</code>-mode hrefs. Defaults to <code>lang</code>.</p>
+</li>
+<li>
+<p><code>var</code> (optional) - Enables body mode: the name of the per-locale 
model variable exposed to the body. The model exposes <code>locale</code>, 
<code>tag</code> (BCP&#8209;47), <code>code</code> 
(<code>language_COUNTRY</code>), <code>autonym</code> (the name in its own 
language), <code>name</code> (the name in the display locale), 
<code>label</code>, <code>active</code> (matches the current locale), 
<code>default</code> (matches the configured default) and 
<code>index</code>.</p>
 </li>
 </ul>
 </div>
diff --git a/docs/snapshot/ref/Versions/Grails BOM Hibernate5.html 
b/docs/snapshot/ref/Versions/Grails BOM Hibernate5.html
index 8db2eec647f..956314e3b75 100644
--- a/docs/snapshot/ref/Versions/Grails BOM Hibernate5.html     
+++ b/docs/snapshot/ref/Versions/Grails BOM Hibernate5.html     
@@ -15460,7 +15460,7 @@ Companies deploy assistants like this 
[](https://kapa.ai) on docs via [website w
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">1907</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">org.webjars.npm</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">jquery</p></td>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">3.7.1</p></td>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">4.0.0</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">${jquery.version}</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">grails-hibernate5-bom</p></td>
 </tr>
diff --git a/docs/snapshot/ref/Versions/Grails BOM Hibernate7.html 
b/docs/snapshot/ref/Versions/Grails BOM Hibernate7.html
index 4ff534d01f4..ffe8483ca85 100644
--- a/docs/snapshot/ref/Versions/Grails BOM Hibernate7.html     
+++ b/docs/snapshot/ref/Versions/Grails BOM Hibernate7.html     
@@ -15612,7 +15612,7 @@ Companies deploy assistants like this 
[](https://kapa.ai) on docs via [website w
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">1926</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">org.webjars.npm</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">jquery</p></td>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">3.7.1</p></td>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">4.0.0</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">${jquery.version}</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">grails-hibernate7-bom</p></td>
 </tr>
diff --git a/docs/snapshot/ref/Versions/Grails BOM.html 
b/docs/snapshot/ref/Versions/Grails BOM.html
index a6fcf801cd5..c26c941a6b7 100644
--- a/docs/snapshot/ref/Versions/Grails BOM.html        
+++ b/docs/snapshot/ref/Versions/Grails BOM.html        
@@ -15469,7 +15469,7 @@ Variant BOMs are also available: <a 
href="Grails%20BOM%20Hibernate5.html">Grails
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">1907</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">org.webjars.npm</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">jquery</p></td>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">3.7.1</p></td>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">4.0.0</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">${jquery.version}</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">grails-bom</p></td>
 </tr>

Reply via email to