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: </li>
- Nested <li><a
href="#field_summary">Field</a></li> <li><a
href="#constructor_summary">Constructor</a></li> Method
- </ul>
- <ul class="subNavList">
- <li> | Detail: </li>
- <li><a
href="#field_detail">Field</a></li> <li><a
href="#constructor_detail">Constructor</a></li> Method
- </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"> </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 java.lang.String</strong></code> </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 java.lang.String</strong></code> </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"> </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"> </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 static final 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 static final 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: </li>
- Nested <li><a
href="#field_summary">Field</a></li> <li><a
href="#constructor_summary">Constructor</a></li> Method
- </ul>
- <ul class="subNavList">
- <li> | Detail: </li>
- <li><a
href="#field_detail">Field</a></li> <li><a
href="#constructor_detail">Constructor</a></li> Method
- </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. <g:localeSelect name="myLocale" value="${locale}"
/><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><select></CODE> by
default, or a plain list of
+ <CODE><a></CODE> links with <CODE>type="links"</CODE>. With a body it
becomes an iterating tag — 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‑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. <g:localeSelect name="myLocale" value="${locale}" labelType="autonym"
/><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‑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’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_*.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><g:localeSelect available="true"/></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_*.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’s own name (autonym), and published to the servlet context under
the <code>availableLocales</code> attribute.</p>
+</div>
+<div class="paragraph">
+<p>The <code><g:localeSelect available="true"/></code> tag renders a
<code><select></code> limited to those locales. To build a custom
switcher, use the tag’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"><g:each</span> <span class="attribute-name">in</span>=<span
class="string"><span class="delimiter">"</span><span
class="content">${application.getAttribute('availableLocales')}</span><span
class="delimiter">"</span></span> <span
class="attribute-name">var</span>=<span class="string"><span
class="delimiter">"</span><span class="content">locale</span><span
class="delimiter">"</span></span><span cl [...]
- <span class="tag"><a</span> <span
class="attribute-name">href</span>=<span class="string"><span
class="delimiter">"</span><span
class="content">?lang=${locale.toLanguageTag()}</span><span
class="delimiter">"</span></span><span
class="tag">></span>${locale.getDisplayName(locale)}<span
class="tag"></a></span>
-<span class="tag"></g:each></span></code></pre>
+<pre class="CodeRay highlight"><code data-lang="xml"><span
class="tag"><g:localeSelect</span> <span
class="attribute-name">available</span>=<span class="string"><span
class="delimiter">"</span><span class="content">true</span><span
class="delimiter">"</span></span> <span
class="attribute-name">pinDefault</span>=<span class="string"><span
class="delimiter">"</span><span class="content">true</span><span
class="delimiter">"</span></span> <span class="attribute-name">v [...]
+ <span class="tag"><a</span> <span
class="attribute-name">href</span>=<span class="string"><span
class="delimiter">"</span><span
class="content">?lang=${loc.tag}</span><span
class="delimiter">"</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">"</span>< [...]
+<span class="tag"></g:localeSelect></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>*.properties</code> bundle on the classpath is
considered, so locales contributed by plugins — whose bundles are
namespaced (for example <code>spring-security-core_fr.properties</code>)
— are listed alongside your application’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’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’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’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><g:pageProperty
name="page.nav"/></code> and <code><g:pageProperty
name="page.navActions"/></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’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’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_*.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><g:localeSelect available="true"/></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_*.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’s own name (autonym), and published to the servlet context under
the <code>availableLocales</code> attribute.</p>
+</div>
+<div class="paragraph">
+<p>The <code><g:localeSelect available="true"/></code> tag renders a
<code><select></code> limited to those locales. To build a custom
switcher, use the tag’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"><g:each</span> <span class="attribute-name">in</span>=<span
class="string"><span class="delimiter">"</span><span
class="content">${application.getAttribute('availableLocales')}</span><span
class="delimiter">"</span></span> <span
class="attribute-name">var</span>=<span class="string"><span
class="delimiter">"</span><span class="content">locale</span><span
class="delimiter">"</span></span><span cl [...]
- <span class="tag"><a</span> <span
class="attribute-name">href</span>=<span class="string"><span
class="delimiter">"</span><span
class="content">?lang=${locale.toLanguageTag()}</span><span
class="delimiter">"</span></span><span
class="tag">></span>${locale.getDisplayName(locale)}<span
class="tag"></a></span>
-<span class="tag"></g:each></span></code></pre>
+<pre class="CodeRay highlight"><code data-lang="xml"><span
class="tag"><g:localeSelect</span> <span
class="attribute-name">available</span>=<span class="string"><span
class="delimiter">"</span><span class="content">true</span><span
class="delimiter">"</span></span> <span
class="attribute-name">pinDefault</span>=<span class="string"><span
class="delimiter">"</span><span class="content">true</span><span
class="delimiter">"</span></span> <span class="attribute-name">v [...]
+ <span class="tag"><a</span> <span
class="attribute-name">href</span>=<span class="string"><span
class="delimiter">"</span><span
class="content">?lang=${loc.tag}</span><span
class="delimiter">"</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">"</span>< [...]
+<span class="tag"></g:localeSelect></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>*.properties</code> bundle on the classpath is
considered, so locales contributed by plugins — whose bundles are
namespaced (for example <code>spring-security-core_fr.properties</code>)
— are listed alongside your application’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’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’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’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><g:pageProperty
name="page.nav"/></code> and <code><g:pageProperty
name="page.navActions"/></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’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><select></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"><!-- create a locale select --></span>
+<pre class="CodeRay highlight"><code data-lang="xml"><span
class="comment"><!-- a native <select> of every JVM locale
--></span>
<span class="tag"><g:localeSelect</span> <span
class="attribute-name">name</span>=<span class="string"><span
class="delimiter">"</span><span class="content">myLocale</span><span
class="delimiter">"</span></span> <span
class="attribute-name">value</span>=<span class="string"><span
class="delimiter">"</span><span class="content">${locale}</span><span
class="delimiter">"</span></span> <span class="tag">/></span>
-<span class="comment"><!-- list only the locales the application is
translated into --></span>
-<span class="tag"><g:localeSelect</span> <span
class="attribute-name">name</span>=<span class="string"><span
class="delimiter">"</span><span class="content">myLocale</span><span
class="delimiter">"</span></span> <span
class="attribute-name">available</span>=<span class="string"><span
class="delimiter">"</span><span class="content">true</span><span
class="delimiter">"</span></span> <span
class="tag">/></span></code></pre>
+<span class="comment"><!-- restrict to the locales the application is
translated into, each labelled in its
+ own language and ordered by that label --></span>
+<span class="tag"><g:localeSelect</span> <span
class="attribute-name">name</span>=<span class="string"><span
class="delimiter">"</span><span class="content">myLocale</span><span
class="delimiter">"</span></span> <span
class="attribute-name">available</span>=<span class="string"><span
class="delimiter">"</span><span class="content">true</span><span
class="delimiter">"</span></span> <span
class="attribute-name">labelType</span>=<span class="string"><span class="delim
[...]
+
+<span class="comment"><!-- a plain list of links that switch locale via
?lang= --></span>
+<span class="tag"><g:localeSelect</span> <span
class="attribute-name">available</span>=<span class="string"><span
class="delimiter">"</span><span class="content">true</span><span
class="delimiter">"</span></span> <span
class="attribute-name">type</span>=<span class="string"><span
class="delimiter">"</span><span class="content">links</span><span
class="delimiter">"</span></span> <span
class="attribute-name">labelType</span>=<span class="string"><span
class="delimite [...]
+
+<span class="comment"><!-- 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
--></span>
+<span class="tag"><g:localeSelect</span> <span
class="attribute-name">available</span>=<span class="string"><span
class="delimiter">"</span><span class="content">true</span><span
class="delimiter">"</span></span> <span
class="attribute-name">pinDefault</span>=<span class="string"><span
class="delimiter">"</span><span class="content">true</span><span
class="delimiter">"</span></span> <span
class="attribute-name">var</span>=<span class="string"><span class="delimiter
[...]
+ <span class="tag"><li></span><span class="tag"><a</span> <span
class="attribute-name">class</span>=<span class="string"><span
class="delimiter">"</span><span class="content">dropdown-item${loc.active
? ' active' : ''}</span><span class="delimiter">"</span></span>
+ <span class="attribute-name">href</span>=<span class="string"><span
class="delimiter">"</span><span
class="content">?lang=${loc.tag}</span><span
class="delimiter">"</span></span><span
class="tag">></span>${loc.autonym}<span class="tag"></a></span><span
class="tag"></li></span>
+<span class="tag"></g:localeSelect></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><select></code> by default, or a plain list of
<code><a></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_*.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_*.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‑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‑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>