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

lukaszlenart pushed a commit to branch WW-5653-bootstrap5-sample-apps
in repository https://gitbox.apache.org/repos/asf/struts.git

commit 075bffbdd546c86ef42a025f57344c68ed383593
Author: Lukasz Lenart <[email protected]>
AuthorDate: Fri Jul 17 21:02:10 2026 +0200

    WW-5653 docs: add Bootstrap 5 migration implementation plan
    
    Co-Authored-By: Claude Opus 4.8 <[email protected]>
---
 .../2026-07-17-WW-5653-bootstrap5-migration.md     | 490 +++++++++++++++++++++
 1 file changed, 490 insertions(+)

diff --git a/docs/superpowers/plans/2026-07-17-WW-5653-bootstrap5-migration.md 
b/docs/superpowers/plans/2026-07-17-WW-5653-bootstrap5-migration.md
new file mode 100644
index 000000000..200699792
--- /dev/null
+++ b/docs/superpowers/plans/2026-07-17-WW-5653-bootstrap5-migration.md
@@ -0,0 +1,490 @@
+# Bootstrap 5.3.x Sample-App Migration — Implementation Plan
+
+> **For agentic workers:** REQUIRED SUB-SKILL: Use 
superpowers:subagent-driven-development (recommended) or 
superpowers:executing-plans to implement this plan task-by-task. Steps use 
checkbox (`- [ ]`) syntax for tracking.
+
+**Goal:** Migrate `apps/showcase` and `apps/rest-showcase` off vendored 
Bootstrap 3.3.4 onto Bootstrap 5.3.7 served via WebJars, keeping the pages' 
look and behavior (minimal port).
+
+**Architecture:** Bootstrap CSS/JS, Bootstrap Icons, and (showcase-only) 
jQuery are pulled as WebJar dependencies and referenced with the framework's 
`<s:webjar>` tag. Vendored static assets are deleted. Bootstrap-3-only markup 
(glyphicons, panels, navbar, `data-*` hooks, grid classes, alert dismiss) is 
rewritten to its Bootstrap 5 equivalent.
+
+**Tech Stack:** Maven, JSP + Struts UI tags, Bootstrap 5.3.7, Bootstrap Icons 
1.13.1, jQuery 3.7.1, `<s:webjar>` (webjars-locator-lite).
+
+## Global Constraints
+
+- Pinned versions: **bootstrap `5.3.7`** (`org.webjars`), **bootstrap-icons 
`1.13.1`** (`org.webjars.npm`), **jquery `3.7.1`** (`org.webjars`, showcase 
only).
+- The shared `webjars-jquery.version` property is **`4.0.0`** (drives core 
test scope, PR #1789). The showcase MUST use a **separate** 
`webjars-jquery-showcase.version=3.7.1` property — never reuse 
`webjars-jquery.version`.
+- Exact `<s:webjar>` (version-less) paths:
+  - `bootstrap/css/bootstrap.min.css`
+  - `bootstrap/js/bootstrap.bundle.min.js` (bundle includes Popper — required 
for dropdowns/tooltips)
+  - `bootstrap-icons/font/bootstrap-icons.min.css`
+  - `jquery/jquery.min.js`
+- WebJar allowlist per app: 
`struts.webjars.allowlist=jquery,bootstrap,bootstrap-icons` (rest-showcase: 
`bootstrap,bootstrap-icons`). `struts.webjars.enabled` already defaults `true`.
+- Commit convention: prefix every commit `WW-5653 <type>...` and end with 
`Co-Authored-By: Claude Opus 4.8 <[email protected]>`.
+- Work on branch `WW-5653-bootstrap5-sample-apps`. Finish with a **draft** PR.
+- No automated UI tests exist for these apps. Per-task verification is **build 
success + grep assertions**; final verification is **manual browser smoke 
testing**. (This plan intentionally deviates from unit-test TDD — the 
deliverables are JSP/asset changes with no unit-test surface.)
+
+### Icon mapping (glyphicon → Bootstrap Icons)
+
+| Bootstrap 3 | Bootstrap 5 (`bi bi-*`) |
+|-------------|-------------------------|
+| `glyphicon-home` | `bi-house` |
+| `glyphicon-cog` | `bi-gear` |
+| `glyphicon-file` | `bi-file-earmark` |
+| `glyphicon-question-sign` | `bi-question-circle` |
+| `glyphicon-share` | `bi-share` |
+| `glyphicon-upload` | `bi-upload` |
+| `glyphicon-arrow-left` | `bi-arrow-left` |
+| `glyphicon-eye-open` | `bi-eye` |
+| `glyphicon-edit` | `bi-pencil` |
+| `glyphicon-trash` | `bi-trash` |
+
+Markup form: `<span class="glyphicon glyphicon-home"></span>` → `<i class="bi 
bi-house"></i>`.
+
+### Class / attribute mapping (Bootstrap 3 → 5)
+
+| Bootstrap 3 | Bootstrap 5 |
+|-------------|-------------|
+| `panel panel-default` | `card` |
+| `panel-heading` | `card-header` |
+| `panel-title` | `card-title` |
+| `panel-body` | `card-body` |
+| `panel-footer` | `card-footer` |
+| `btn-default` | `btn-secondary` |
+| `col-xs-N` | `col-N` |
+| `data-toggle=` | `data-bs-toggle=` |
+| `data-target=` | `data-bs-target=` |
+| `data-dismiss=` | `data-bs-dismiss=` |
+| `<a class="close">&times;</a>` | `<button type="button" class="btn-close" 
aria-label="Close"></button>` |
+| `pull-right` / `pull-left` | `float-end` / `float-start` |
+| `navbar-default` | `navbar-light bg-light` |
+| `hidden` | `d-none` |
+| `text-right` | `text-end` |
+
+---
+
+### Task 1: POM / dependency wiring
+
+**Files:**
+- Modify: `pom.xml` (properties block, ~line 131)
+- Modify: `parent/pom.xml` (dependencyManagement, ~line 60)
+- Modify: `apps/showcase/pom.xml` (`<dependencies>`, before line 175 
`</dependencies>`)
+- Modify: `apps/rest-showcase/pom.xml` (`<dependencies>`)
+
+**Interfaces:**
+- Produces: managed webjar dependencies + version properties consumed by Tasks 
2 and 4.
+
+- [ ] **Step 1: Add version properties to root `pom.xml`**
+
+In the properties block (next to `webjars-jquery.version`), add:
+
+```xml
+        <webjars-bootstrap.version>5.3.7</webjars-bootstrap.version>
+        
<webjars-bootstrap-icons.version>1.13.1</webjars-bootstrap-icons.version>
+        
<webjars-jquery-showcase.version>3.7.1</webjars-jquery-showcase.version>
+```
+
+Leave the existing `<webjars-jquery.version>4.0.0</webjars-jquery.version>` 
untouched (it drives core test scope).
+
+- [ ] **Step 2: Add managed dependencies to `parent/pom.xml`**
+
+After the existing `org.webjars:jquery` managed dependency block, add:
+
+```xml
+            <dependency>
+                <groupId>org.webjars</groupId>
+                <artifactId>bootstrap</artifactId>
+                <version>${webjars-bootstrap.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.webjars.npm</groupId>
+                <artifactId>bootstrap-icons</artifactId>
+                <version>${webjars-bootstrap-icons.version}</version>
+            </dependency>
+```
+
+Note: `bootstrap-icons` is under group `org.webjars.npm`. Do NOT add a managed 
entry for the showcase jQuery — it is declared directly in the showcase pom 
(Step 3) to keep its version explicit and separate from the shared `jquery` 
managed entry.
+
+- [ ] **Step 3: Add dependencies to `apps/showcase/pom.xml`**
+
+Immediately before `</dependencies>` (line ~175), add:
+
+```xml
+        <dependency>
+            <groupId>org.webjars</groupId>
+            <artifactId>bootstrap</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.webjars.npm</groupId>
+            <artifactId>bootstrap-icons</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.webjars</groupId>
+            <artifactId>jquery</artifactId>
+            <version>${webjars-jquery-showcase.version}</version>
+        </dependency>
+```
+
+The explicit `<version>` overrides the `4.0.0` managed default for the 
showcase only.
+
+- [ ] **Step 4: Add dependencies to `apps/rest-showcase/pom.xml`**
+
+Inside `<dependencies>`, add (no jQuery — rest-showcase uses none):
+
+```xml
+        <dependency>
+            <groupId>org.webjars</groupId>
+            <artifactId>bootstrap</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.webjars.npm</groupId>
+            <artifactId>bootstrap-icons</artifactId>
+        </dependency>
+```
+
+- [ ] **Step 5: Verify dependency resolution**
+
+Run: `mvn -q -pl apps/showcase,apps/rest-showcase -am dependency:resolve 
-DskipAssembly 2>&1 | tail -20`
+Expected: BUILD SUCCESS; `org.webjars:bootstrap:jar:5.3.7`, 
`org.webjars.npm:bootstrap-icons:jar:1.13.1`, and 
`org.webjars:jquery:jar:3.7.1` (for showcase) appear in the tree.
+
+Confirm the showcase jQuery is 3.7.1, not 4.0.0:
+Run: `mvn -q -pl apps/showcase dependency:tree -Dincludes=org.webjars:jquery 
-DskipAssembly 2>&1 | grep jquery`
+Expected: `org.webjars:jquery:jar:3.7.1`.
+
+- [ ] **Step 6: Commit**
+
+```bash
+git add pom.xml parent/pom.xml apps/showcase/pom.xml apps/rest-showcase/pom.xml
+git commit -m "WW-5653 build: add Bootstrap 5, Bootstrap Icons, showcase 
jQuery webjars
+
+Co-Authored-By: Claude Opus 4.8 <[email protected]>"
+```
+
+---
+
+### Task 2: Showcase asset delivery + alert dismiss
+
+**Files:**
+- Modify: `apps/showcase/src/main/webapp/WEB-INF/decorators/main.jsp:64-79`
+- Modify: `apps/showcase/src/main/resources/struts.xml` (constants block, 
~line 37)
+- Delete: `apps/showcase/src/main/webapp/styles/bootstrap.css`, 
`bootstrap.min.css`, `bootstrap.css.map`, `bootstrap-theme.css`, 
`bootstrap-theme.min.css`, `bootstrap-theme.css.map`
+- Delete: `apps/showcase/src/main/webapp/js/bootstrap.min.js`, 
`apps/showcase/src/main/webapp/js/jquery-2.1.4.min.js`
+
+**Interfaces:**
+- Consumes: webjar deps from Task 1.
+- Produces: `<s:webjar>`-served assets used by all showcase pages (Task 3).
+
+- [ ] **Step 1: Replace the CSS/JS head references in `main.jsp`**
+
+Replace lines 64-79 (from the `bootstrapCss` block through the closing 
`</s:script>` of the alert-init block) with exactly this:
+
+```jsp
+    <link rel="stylesheet" type="text/css" media="all" href="<s:webjar 
path='bootstrap/css/bootstrap.min.css'/>"/>
+    <link rel="stylesheet" type="text/css" href="<s:webjar 
path='bootstrap-icons/font/bootstrap-icons.min.css'/>"/>
+    <s:url var="mainCss" value='/styles/main.css' encode='false' 
includeParams='none'/>
+    <s:link href="%{mainCss}" rel="stylesheet" type="text/css" media="all"/>
+
+    <script src="<s:webjar path='jquery/jquery.min.js'/>"></script>
+    <script src="<s:webjar 
path='bootstrap/js/bootstrap.bundle.min.js'/>"></script>
+    <s:script>
+        $(function () {
+            $('ul.alert').each(function () {
+                var wrapper = $('<div class="alert alert-dismissible" />');
+                $(this).before(wrapper);
+                wrapper.append('<button type="button" class="btn-close" 
data-bs-dismiss="alert" aria-label="Close"></button>').append(this);
+            });
+        });
+    </s:script>
+```
+
+Guard note: `<s:webjar>` writes the resolved URL inline, so it goes inside a 
plain `<link>`/`<script>` `href`/`src` attribute — not via `<s:link href>` / 
`<s:script src>`. Keep the existing `mainCss` `<s:url>`/`<s:link>` pair as 
shown.
+
+- [ ] **Step 2: Verify the prettyPrint ready-handler is intact**
+
+Confirm the later block (around old line 91) still reads:
+
+```jsp
+    <s:script>
+        jQuery(document).ready(function() { prettyPrint(); } );
+    </s:script>
+```
+
+Leave it unchanged — jQuery is still served.
+
+- [ ] **Step 3: Add the webjar allowlist constant to showcase `struts.xml`**
+
+After the `struts.allowlist.packageNames` constant (~line 39), add:
+
+```xml
+    <constant name="struts.webjars.allowlist" 
value="jquery,bootstrap,bootstrap-icons"/>
+```
+
+- [ ] **Step 4: Delete vendored static assets**
+
+```bash
+git rm apps/showcase/src/main/webapp/styles/bootstrap.css \
+       apps/showcase/src/main/webapp/styles/bootstrap.min.css \
+       apps/showcase/src/main/webapp/styles/bootstrap.css.map \
+       apps/showcase/src/main/webapp/styles/bootstrap-theme.css \
+       apps/showcase/src/main/webapp/styles/bootstrap-theme.min.css \
+       apps/showcase/src/main/webapp/styles/bootstrap-theme.css.map \
+       apps/showcase/src/main/webapp/js/bootstrap.min.js \
+       apps/showcase/src/main/webapp/js/jquery-2.1.4.min.js
+```
+
+- [ ] **Step 5: Verify no lingering references to deleted assets**
+
+Run: `grep -rn 
"bootstrap.css\|bootstrap.min.js\|bootstrap-theme\|jquery-2.1.4" 
apps/showcase/src/main/webapp`
+Expected: no matches (empty output).
+
+- [ ] **Step 6: Build the showcase WAR**
+
+Run: `mvn -q -pl apps/showcase -am package -DskipAssembly -DskipTests 2>&1 | 
tail -5`
+Expected: BUILD SUCCESS.
+
+- [ ] **Step 7: Commit**
+
+```bash
+git add apps/showcase/src/main/webapp/WEB-INF/decorators/main.jsp 
apps/showcase/src/main/resources/struts.xml
+git commit -m "WW-5653 feat(showcase): serve Bootstrap 5 and jQuery via webjars
+
+Co-Authored-By: Claude Opus 4.8 <[email protected]>"
+```
+
+---
+
+### Task 3: Showcase markup migration
+
+**Files:**
+- Modify: showcase JSPs under `apps/showcase/src/main/webapp/` (~78 files) 
wherever the mapped classes/attributes appear, including 
`WEB-INF/decorators/main.jsp` (navbar, glyphicons).
+
+**Interfaces:**
+- Consumes: Bootstrap 5 assets from Task 2.
+- Produces: fully BS5-compatible markup (final app in Task 6).
+
+- [ ] **Step 1: Inventory every occurrence to migrate**
+
+Run and save the list:
+
+```bash
+grep -rInE 
"glyphicon|panel(-default|-heading|-title|-body|-footer)?\b|btn-default|col-xs-|data-toggle=|data-target=|data-dismiss=|class=\"close\"|pull-(right|left)|navbar-default|\btext-right\b"
 apps/showcase/src/main/webapp --include="*.jsp"
+```
+
+Expected: a non-empty list. Work through it file by file.
+
+- [ ] **Step 2: Migrate glyphicons**
+
+For every `<span class="glyphicon glyphicon-X">...</span>`, replace with `<i 
class="bi bi-Y"></i>` using the icon mapping table in Global Constraints. 
Example — in `main.jsp`:
+
+```jsp
+<li><s:a value="%{home}"><i class="bi bi-house"></i> Home</s:a></li>
+```
+
+- [ ] **Step 3: Migrate panels → cards**
+
+For each panel block, apply: `panel panel-default`→`card`, 
`panel-heading`→`card-header`, `panel-title`→`card-title`, 
`panel-body`→`card-body`, `panel-footer`→`card-footer`. Example:
+
+```html
+<div class="card">
+  <div class="card-header"><h3 class="card-title">Title</h3></div>
+  <div class="card-body">...</div>
+</div>
+```
+
+- [ ] **Step 4: Migrate buttons, grid, utilities, data hooks**
+
+Apply the class/attribute mapping table: `btn-default`→`btn-secondary`, 
`col-xs-N`→`col-N`, `pull-right`→`float-end`, `pull-left`→`float-start`, 
`text-right`→`text-end`, `hidden`→`d-none`, and 
`data-toggle`/`data-target`/`data-dismiss` → `data-bs-*`.
+
+- [ ] **Step 5: Migrate the navbar in `main.jsp`**
+
+Update the BS3 navbar to BS5 structure. Replace `navbar navbar-default` with 
`navbar navbar-expand-lg navbar-light bg-light`; convert the toggle button to:
+
+```html
+<button class="navbar-toggler" type="button" data-bs-toggle="collapse" 
data-bs-target="#navbar-main" aria-controls="navbar-main" aria-expanded="false" 
aria-label="Toggle navigation">
+  <span class="navbar-toggler-icon"></span>
+</button>
+```
+
+Convert dropdown triggers to `class="nav-link dropdown-toggle" 
data-bs-toggle="dropdown"` and dropdown menus to `class="dropdown-menu"` with 
`class="dropdown-item"` links. Keep the existing menu entries and links; only 
the wrapper classes/attributes change.
+
+- [ ] **Step 6: Verify no Bootstrap 3 markup remains**
+
+Run: `grep -rInE 
"glyphicon|panel-(default|heading|title|body|footer)|btn-default|col-xs-|data-toggle=|data-target=|data-dismiss=|class=\"close\"|pull-(right|left)|navbar-default"
 apps/showcase/src/main/webapp --include="*.jsp"`
+Expected: no matches (empty output).
+
+- [ ] **Step 7: Rebuild showcase**
+
+Run: `mvn -q -pl apps/showcase -am package -DskipAssembly -DskipTests 2>&1 | 
tail -5`
+Expected: BUILD SUCCESS.
+
+- [ ] **Step 8: Commit**
+
+```bash
+git add apps/showcase/src/main/webapp
+git commit -m "WW-5653 feat(showcase): migrate JSP markup to Bootstrap 5
+
+Co-Authored-By: Claude Opus 4.8 <[email protected]>"
+```
+
+---
+
+### Task 4: rest-showcase asset delivery
+
+**Files:**
+- Modify: the 5 order JSPs under 
`apps/rest-showcase/src/main/webapp/WEB-INF/content/` (`orders-index.jsp`, 
`orders-show.jsp`, `orders-edit.jsp`, `orders-editNew.jsp`, 
`orders-deleteConfirm.jsp`) — each references `css/bootstrap.min.css` at line 
~32
+- Modify: `apps/rest-showcase/src/main/resources/struts.xml`
+- Delete: `apps/rest-showcase/src/main/webapp/css/bootstrap.css`, 
`bootstrap.min.css`, `bootstrap.css.map`, `bootstrap-theme.css`, 
`bootstrap-theme.min.css`, `bootstrap-theme.css.map`
+
+**Interfaces:**
+- Consumes: webjar deps from Task 1.
+- Produces: `<s:webjar>`-served CSS used by rest-showcase pages (Task 5).
+
+- [ ] **Step 1: Replace the bootstrap CSS reference in each of the 5 JSPs**
+
+Change the line `<s:link href="%{#pageContextPath}/css/bootstrap.min.css" 
rel="stylesheet"></s:link>` to:
+
+```jsp
+    <link rel="stylesheet" href="<s:webjar 
path='bootstrap/css/bootstrap.min.css'/>"/>
+    <link rel="stylesheet" href="<s:webjar 
path='bootstrap-icons/font/bootstrap-icons.min.css'/>"/>
+```
+
+Leave the adjacent `app.css` `<s:link>` untouched.
+
+- [ ] **Step 2: Add the webjar allowlist constant to rest-showcase 
`struts.xml`**
+
+Inside `<struts>`, alongside the other constants (~line 31), add:
+
+```xml
+    <constant name="struts.webjars.allowlist" 
value="bootstrap,bootstrap-icons"/>
+```
+
+- [ ] **Step 3: Delete vendored static CSS**
+
+```bash
+git rm apps/rest-showcase/src/main/webapp/css/bootstrap.css \
+       apps/rest-showcase/src/main/webapp/css/bootstrap.min.css \
+       apps/rest-showcase/src/main/webapp/css/bootstrap.css.map \
+       apps/rest-showcase/src/main/webapp/css/bootstrap-theme.css \
+       apps/rest-showcase/src/main/webapp/css/bootstrap-theme.min.css \
+       apps/rest-showcase/src/main/webapp/css/bootstrap-theme.css.map
+```
+
+- [ ] **Step 4: Verify no lingering references**
+
+Run: `grep -rn "css/bootstrap\|bootstrap-theme" 
apps/rest-showcase/src/main/webapp`
+Expected: no matches.
+
+- [ ] **Step 5: Commit**
+
+```bash
+git add apps/rest-showcase/src/main/webapp 
apps/rest-showcase/src/main/resources/struts.xml
+git commit -m "WW-5653 feat(rest-showcase): serve Bootstrap 5 CSS via webjars
+
+Co-Authored-By: Claude Opus 4.8 <[email protected]>"
+```
+
+---
+
+### Task 5: rest-showcase markup migration
+
+**Files:**
+- Modify: the 5 order JSPs under 
`apps/rest-showcase/src/main/webapp/WEB-INF/content/`
+
+**Interfaces:**
+- Consumes: Bootstrap 5 CSS from Task 4.
+- Produces: BS5-compatible rest-showcase markup (final app in Task 6).
+
+- [ ] **Step 1: Inventory occurrences**
+
+Run: `grep -rInE 
"glyphicon|panel-(default|heading|title|body|footer)|btn-default|col-xs-|pull-(right|left)|</apan>"
 apps/rest-showcase/src/main/webapp --include="*.jsp"`
+Expected: non-empty (glyphicons + the `</apan>` typo).
+
+- [ ] **Step 2: Migrate glyphicons and classes**
+
+Apply the icon and class mapping tables. Example — `orders-index.jsp`:
+
+```jsp
+<a href="orders/${id}" class="btn btn-secondary"><i class="bi bi-eye"></i> 
View</a>
+<a href="orders/${id}/edit" class="btn btn-secondary"><i class="bi 
bi-pencil"></i> Edit</a>
+<a href="orders/${id}/deleteConfirm" class="btn btn-danger"><i class="bi 
bi-trash"></i> Delete</a>
+```
+
+And the "Back to Orders" links: `<i class="bi bi-arrow-left"></i> Back to 
Orders`.
+
+- [ ] **Step 3: Fix the malformed closing tag**
+
+In `orders-editNew.jsp:79`, change `</apan>` to `</span>` — but since that 
`<span class="glyphicon ...">` becomes `<i class="bi bi-arrow-left">`, the 
corrected line is:
+
+```jsp
+        <i class="bi bi-arrow-left"></i> Back to Orders
+```
+
+- [ ] **Step 4: Verify no Bootstrap 3 markup or typo remains**
+
+Run: `grep -rInE 
"glyphicon|panel-(default|heading|title|body|footer)|btn-default|col-xs-|</apan>"
 apps/rest-showcase/src/main/webapp --include="*.jsp"`
+Expected: no matches.
+
+- [ ] **Step 5: Build rest-showcase**
+
+Run: `mvn -q -pl apps/rest-showcase -am package -DskipAssembly -DskipTests 
2>&1 | tail -5`
+Expected: BUILD SUCCESS.
+
+- [ ] **Step 6: Commit**
+
+```bash
+git add apps/rest-showcase/src/main/webapp
+git commit -m "WW-5653 feat(rest-showcase): migrate JSP markup to Bootstrap 5
+
+Co-Authored-By: Claude Opus 4.8 <[email protected]>"
+```
+
+---
+
+### Task 6: Full build, manual verification, draft PR
+
+**Files:** none (verification + PR).
+
+**Interfaces:**
+- Consumes: all prior tasks.
+
+- [ ] **Step 1: Full build**
+
+Run: `mvn clean install -DskipAssembly 2>&1 | tail -15`
+Expected: BUILD SUCCESS across all modules (existing core webjar tests still 
pass — they use the `4.0.0` shared jQuery, unaffected by the showcase's 3.7.1).
+
+- [ ] **Step 2: Run the showcase and smoke-test in a browser**
+
+Run: `mvn -pl apps/showcase jetty:run -DskipAssembly` (then open 
http://localhost:8080/). Verify:
+- Navbar renders; the collapse toggle and dropdown menus (Configuration, File, 
Help) open.
+- Icons render (home, gear, file, question-circle).
+- Alerts show a working close (×) button.
+- Prettify code blocks are highlighted (jQuery ready-handler works).
+- The AJAX validation form (`/validation/ajaxFormSubmit`) submits and shows 
feedback.
+- No 404s for `/static/webjars/bootstrap/...`, `.../bootstrap-icons/...`, 
`.../jquery/...` in the browser network tab.
+
+- [ ] **Step 3: Run the rest-showcase and smoke-test**
+
+Run: `mvn -pl apps/rest-showcase jetty:run -DskipAssembly`. Verify order 
list/show/edit/new/delete pages render with correct styling and `bi` icons; no 
webjar 404s.
+
+- [ ] **Step 4: Push branch and open a DRAFT PR**
+
+```bash
+git push -u origin WW-5653-bootstrap5-sample-apps
+gh pr create --draft \
+  --title "WW-5653 Upgrade Bootstrap to 5.3.x in sample apps" \
+  --body "$(cat <<'EOF'
+Fixes [WW-5653](https://issues.apache.org/jira/browse/WW-5653)
+
+Migrates `apps/showcase` and `apps/rest-showcase` from vendored Bootstrap 
3.3.4 to Bootstrap 5.3.7 served via `<s:webjar>`. Minimal port — pages keep 
their look and behavior.
+
+- Bootstrap 5.3.7 + Bootstrap Icons 1.13.1 via WebJars; vendored static assets 
removed
+- Showcase jQuery kept (3.7.1) via a dedicated 
`webjars-jquery-showcase.version`, decoupled from the shared 
`webjars-jquery.version` (4.0.0, core test scope)
+- Glyphicons → Bootstrap Icons; panels → cards; `data-*` → `data-bs-*`; 
navbar/alert markup updated
+- WebJar allowlist configured per app
+- Verified via manual browser smoke testing (no automated UI tests for these 
apps)
+
+🤖 Generated with [Claude Code](https://claude.com/claude-code)
+EOF
+)"
+```
+
+Expected: PR created in **draft** state. Report the PR URL.

Reply via email to