You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2023/05/16 02:09:20 UTC

[openmeetings] 01/01: [OPENMEETINGS-2774] initial commit to fix styles in the emails

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

solomax pushed a commit to branch OPENMEETINGS-2774-emails
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 15d6e294762fa282d9245815f6feb6ebf9dc159e
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Tue May 16 09:09:03 2023 +0700

    [OPENMEETINGS-2774] initial commit to fix styles in the emails
---
 .../mail/template/AbstractTemplatePage.html        | 109 +++++++++++++++++++++
 ...emplatePanel.java => AbstractTemplatePage.java} |  31 ++++--
 .../mail/template/AbstractTemplatePanel.html       |  27 -----
 .../service/mail/template/FeedbackTemplate.java    |   5 +-
 .../service/mail/template/InvitationTemplate.java  |   5 +-
 .../mail/template/RegisterUserTemplate.java        |   5 +-
 .../template/RequestContactConfirmTemplate.java    |   5 +-
 .../mail/template/RequestContactTemplate.java      |   5 +-
 .../mail/template/ResetPasswordTemplate.java       |   5 +-
 .../template/subject/SubjectEmailTemplate.java     |   6 +-
 .../apache/openmeetings/web/app/Application.java   |   2 +-
 .../apache/openmeetings/web/pages/BasePage.html    |  54 +++++-----
 .../apache/openmeetings/web/pages/BasePage.java    |   3 +
 13 files changed, 180 insertions(+), 82 deletions(-)

diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePage.html b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePage.html
new file mode 100644
index 000000000..6cac8cf76
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePage.html
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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>
+<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-9.xsd">
+	<head>
+		<meta name="viewport" content="width=device-width, initial-scale=1.0">
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<style>
+			.main {
+				background-color: #f5f5f5;
+				font-family: 'Segoe UI', sans-serif;
+				-webkit-font-smoothing: antialiased;
+				font-size: 14px;
+				line-height: 1.4;
+				margin: 0;
+				padding: 0;
+				-ms-text-size-adjust: 100%;
+				-webkit-text-size-adjust: 100%;
+				font-size: 14px;
+			}
+			h2 {
+				font-size: 25px;
+				font-weight: normal;
+				margin: 0;
+				margin-bottom: 15px;
+			}
+			p, span {
+				margin-bottom: 1em;
+			}
+			a {
+				color: #007bff;
+				text-decoration: none;
+			}
+			.container {
+				max-width: 580px;
+				margin: 0 auto;
+				padding: 20px;
+				width: 100%;
+			}
+			.wrapper {
+				max-width: 540px;
+				margin: 0 auto;
+				padding: 15px;
+				width: 100%;
+				border-radius: 5px;
+				background-color: #fff;
+			}
+			.action a {
+				box-sizing: border-box;
+				cursor: pointer;
+				display: inline-block;
+				font-weight: bold;
+				margin: 0;
+				border-radius: 5px;
+				padding: 12px 25px;
+				background-color: #3498db;
+				border-color: #3498db;
+				color: #ffffff;
+			}
+			@media only screen and (max-width: 620px) {
+				.container {
+					padding: 0;
+					width: 100%;
+					text-align: center;
+				}
+				.wrapper {
+					max-width: 560px;
+					margin: 0 auto;
+					padding: 10px;
+					border-left-width: 0;
+					border-radius: 0;
+					border-right-width: 0;
+				}
+				.wrapper .action {
+					text-align: center;
+					margin-top: 25px;
+				}
+
+				.wrapper .action a {
+					display: block;
+					margin: 0;
+					padding: 12px 25px;
+				}
+			}
+		</style>
+	</head>
+	<body>
+		<div wicket:id="container">
+			<wicket:child/>
+		</div>
+	</body>
+</html>
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePanel.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePage.java
similarity index 58%
rename from openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePanel.java
rename to openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePage.java
index 4d352cdff..50d75ef17 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePanel.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePage.java
@@ -22,25 +22,40 @@ import java.util.Locale;
 
 import org.apache.openmeetings.IApplication;
 import org.apache.openmeetings.IWebSession;
+import org.apache.wicket.Application;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Session;
+import org.apache.wicket.core.util.string.ComponentRenderer;
 import org.apache.wicket.markup.html.TransparentWebMarkupContainer;
-import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.protocol.http.WebSession;
+import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
+import org.apache.wicket.protocol.http.mock.MockHttpSession;
+import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
+import org.apache.wicket.request.Request;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-public abstract class AbstractTemplatePanel extends Panel {
+public abstract class AbstractTemplatePage extends WebPage {
 	private static final long serialVersionUID = 1L;
-	public static final String COMP_ID = "template";
+	public static final String COMP_ID = "container";
 	protected final Locale locale;
+	protected final ComponentRenderer renderer;
 
 	@SpringBean
 	protected IApplication app;
 
-	protected AbstractTemplatePanel(Locale locale) {
-		super(COMP_ID);
+	protected AbstractTemplatePage(Locale locale) {
 		this.locale = locale;
-		add(new TransparentWebMarkupContainer("container").add(AttributeModifier.append("dir", Session.isRtlLanguage(this.locale) ? "rtl" : "ltr")));
+		add(new TransparentWebMarkupContainer(COMP_ID).add(AttributeModifier.append("dir", Session.isRtlLanguage(this.locale) ? "rtl" : "ltr")));
+		final Application a = Application.get();
+		renderer = new ComponentRenderer(a) {
+			@Override
+			protected Request newRequest() {
+				return new ServletWebRequest(
+						new MockHttpServletRequest(a, new MockHttpSession(app.getServletContext()), app.getServletContext())
+						, "");
+			}
+		};
 	}
 
 	public static IWebSession getOmSession() {
@@ -50,4 +65,8 @@ public abstract class AbstractTemplatePanel extends Panel {
 	public String getString(String id, Locale locale, String... params) {
 		return app.getOmString(id, locale, params);
 	}
+
+	protected String renderEmail() {
+		return renderer.renderPage(() -> this).toString();
+	}
 }
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePanel.html b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePanel.html
deleted file mode 100644
index 3d7d28310..000000000
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePanel.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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>
-<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-9.xsd">
-<wicket:panel>
-	<div wicket:id="container">
-		<wicket:child/>
-	</div>
-</wicket:panel>
-</html>
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/FeedbackTemplate.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/FeedbackTemplate.java
index a16970db9..ca5eca9e9 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/FeedbackTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/FeedbackTemplate.java
@@ -20,11 +20,10 @@ package org.apache.openmeetings.service.mail.template;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getApplicationName;
 
-import org.apache.wicket.core.util.string.ComponentRenderer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.ExternalLink;
 
-public class FeedbackTemplate extends AbstractTemplatePanel {
+public class FeedbackTemplate extends AbstractTemplatePage {
 	private static final long serialVersionUID = 1L;
 
 	private FeedbackTemplate(String username, String email, String message) {
@@ -37,6 +36,6 @@ public class FeedbackTemplate extends AbstractTemplatePanel {
 	}
 
 	public static String getEmail(String username, String email, String message) {
-		return ComponentRenderer.renderComponent(new FeedbackTemplate(username, email, message)).toString();
+		return new FeedbackTemplate(username, email, message).renderEmail();
 	}
 }
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/InvitationTemplate.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/InvitationTemplate.java
index d65e4e336..b0c584184 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/InvitationTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/InvitationTemplate.java
@@ -24,12 +24,11 @@ import java.util.Locale;
 
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.util.LocaleHelper;
-import org.apache.wicket.core.util.string.ComponentRenderer;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.ExternalLink;
 
-public class InvitationTemplate extends AbstractTemplatePanel {
+public class InvitationTemplate extends AbstractTemplatePage {
 	private static final long serialVersionUID = 1L;
 
 	private InvitationTemplate(Locale locale, String invitorName, String message, String link, boolean room) {
@@ -54,6 +53,6 @@ public class InvitationTemplate extends AbstractTemplatePanel {
 
 	public static String getEmail(User invitee, String invitorName, String message, String link, boolean room) {
 		ensureApplication(invitee.getLanguageId());
-		return ComponentRenderer.renderComponent(new InvitationTemplate(LocaleHelper.getLocale(invitee), invitorName, message, link, room)).toString();
+		return new InvitationTemplate(LocaleHelper.getLocale(invitee), invitorName, message, link, room).renderEmail();
 	}
 }
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/RegisterUserTemplate.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/RegisterUserTemplate.java
index aaf500210..ef99df49a 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/RegisterUserTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/RegisterUserTemplate.java
@@ -21,12 +21,11 @@ package org.apache.openmeetings.service.mail.template;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getApplicationName;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getBaseUrl;
 
-import org.apache.wicket.core.util.string.ComponentRenderer;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.ExternalLink;
 
-public class RegisterUserTemplate extends AbstractTemplatePanel {
+public class RegisterUserTemplate extends AbstractTemplatePage {
 	private static final long serialVersionUID = 1L;
 
 	private RegisterUserTemplate(String username, String email, String verificationUrl) {
@@ -43,6 +42,6 @@ public class RegisterUserTemplate extends AbstractTemplatePanel {
 	}
 
 	public static String getEmail(String username, String email, String verificationUrl) {
-		return ComponentRenderer.renderComponent(new RegisterUserTemplate(username, email, verificationUrl)).toString();
+		return new RegisterUserTemplate(username, email, verificationUrl).renderEmail();
 	}
 }
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/RequestContactConfirmTemplate.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/RequestContactConfirmTemplate.java
index d81b5eaf9..dafe952b0 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/RequestContactConfirmTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/RequestContactConfirmTemplate.java
@@ -20,10 +20,9 @@ package org.apache.openmeetings.service.mail.template;
 
 import org.apache.openmeetings.db.entity.user.UserContact;
 import org.apache.openmeetings.db.util.LocaleHelper;
-import org.apache.wicket.core.util.string.ComponentRenderer;
 import org.apache.wicket.markup.html.basic.Label;
 
-public class RequestContactConfirmTemplate extends AbstractTemplatePanel {
+public class RequestContactConfirmTemplate extends AbstractTemplatePage {
 	private static final long serialVersionUID = 1L;
 
 	private RequestContactConfirmTemplate(UserContact contact) {
@@ -35,6 +34,6 @@ public class RequestContactConfirmTemplate extends AbstractTemplatePanel {
 	}
 
 	public static String getEmail(UserContact contact) {
-		return ComponentRenderer.renderComponent(new RequestContactConfirmTemplate(contact)).toString();
+		return new RequestContactConfirmTemplate(contact).renderEmail();
 	}
 }
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/RequestContactTemplate.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/RequestContactTemplate.java
index 207e0139f..0098c3892 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/RequestContactTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/RequestContactTemplate.java
@@ -20,11 +20,10 @@ package org.apache.openmeetings.service.mail.template;
 
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.util.LocaleHelper;
-import org.apache.wicket.core.util.string.ComponentRenderer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.ExternalLink;
 
-public class RequestContactTemplate extends AbstractTemplatePanel {
+public class RequestContactTemplate extends AbstractTemplatePage {
 	private static final long serialVersionUID = 1L;
 
 	private RequestContactTemplate(User userToAdd, User user) {
@@ -38,6 +37,6 @@ public class RequestContactTemplate extends AbstractTemplatePanel {
 	}
 
 	public static String getEmail(User userToAdd, User user) {
-		return ComponentRenderer.renderComponent(new RequestContactTemplate(userToAdd, user)).toString();
+		return new RequestContactTemplate(userToAdd, user).renderEmail();
 	}
 }
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/ResetPasswordTemplate.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/ResetPasswordTemplate.java
index 42b8c38c3..508617401 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/ResetPasswordTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/ResetPasswordTemplate.java
@@ -18,11 +18,10 @@
  */
 package org.apache.openmeetings.service.mail.template;
 
-import org.apache.wicket.core.util.string.ComponentRenderer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.ExternalLink;
 
-public class ResetPasswordTemplate extends AbstractTemplatePanel {
+public class ResetPasswordTemplate extends AbstractTemplatePage {
 	private static final long serialVersionUID = 1L;
 
 	private ResetPasswordTemplate(String link) {
@@ -33,6 +32,6 @@ public class ResetPasswordTemplate extends AbstractTemplatePanel {
 	}
 
 	public static String getEmail(String link) {
-		return ComponentRenderer.renderComponent(new ResetPasswordTemplate(link)).toString();
+		return new ResetPasswordTemplate(link).renderEmail();
 	}
 }
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/SubjectEmailTemplate.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/SubjectEmailTemplate.java
index be298c55b..ab24ee40e 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/SubjectEmailTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/SubjectEmailTemplate.java
@@ -20,11 +20,11 @@ package org.apache.openmeetings.service.mail.template.subject;
 
 import java.util.Locale;
 
-import org.apache.openmeetings.service.mail.template.AbstractTemplatePanel;
+import org.apache.openmeetings.service.mail.template.AbstractTemplatePage;
 import org.apache.wicket.core.util.string.ComponentRenderer;
 import org.apache.wicket.markup.html.panel.Fragment;
 
-public abstract class SubjectEmailTemplate extends AbstractTemplatePanel {
+public abstract class SubjectEmailTemplate extends AbstractTemplatePage {
 	private static final long serialVersionUID = 1L;
 	private String email = null;
 	private String subject = null;
@@ -35,7 +35,7 @@ public abstract class SubjectEmailTemplate extends AbstractTemplatePanel {
 	}
 
 	SubjectEmailTemplate create() {
-		email = ComponentRenderer.renderComponent(this).toString();
+		email = renderEmail();
 		subject = ComponentRenderer.renderComponent(getSubjectFragment()).toString();
 		created = true;
 		return this;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
index a7905396b..de6884a63 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
@@ -303,7 +303,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 		}
 		getHeaderResponseDecorators().add(FilteringHeaderResponse::new);
 		super.init();
-		final IBootstrapSettings settings = new BootstrapSettings();
+		final IBootstrapSettings settings = new BootstrapSettings().setAutoAppendResources(false);
 		Bootstrap.builder().withBootstrapSettings(settings).install(this);
 		WysiwygLibrarySettings.get().setBootstrapCssReference(null);
 		WysiwygLibrarySettings.get().setBootstrapDropDownJavaScriptReference(null);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html
index 222059244..17b42b1a4 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html
@@ -24,33 +24,33 @@
 	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
 	<meta name="viewport" content="height=device-height, initial-scale=1, width=device-width, initial-scale=1" />
 	<link rel="apple-touch-icon" href="images/icons/apple-icon-180.png">
-    <meta name="apple-mobile-web-app-capable" content="yes">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-2048-2732.jpg" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-2732-2048.jpg" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-1668-2388.jpg" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-2388-1668.jpg" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-1536-2048.jpg" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-2048-1536.jpg" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-1668-2224.jpg" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-2224-1668.jpg" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-1620-2160.jpg" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-2160-1620.jpg" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-1284-2778.jpg" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-2778-1284.jpg" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-1170-2532.jpg" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-2532-1170.jpg" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-1125-2436.jpg" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-2436-1125.jpg" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-1242-2688.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-2688-1242.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-828-1792.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-1792-828.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-1242-2208.jpg" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-2208-1242.jpg" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-750-1334.jpg" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-1334-750.jpg" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-640-1136.jpg" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
-    <link rel="apple-touch-startup-image" href="images/icons/apple-splash-1136-640.jpg" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
+	<meta name="apple-mobile-web-app-capable" content="yes">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-2048-2732.jpg" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-2732-2048.jpg" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-1668-2388.jpg" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-2388-1668.jpg" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-1536-2048.jpg" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-2048-1536.jpg" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-1668-2224.jpg" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-2224-1668.jpg" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-1620-2160.jpg" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-2160-1620.jpg" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-1284-2778.jpg" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-2778-1284.jpg" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-1170-2532.jpg" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-2532-1170.jpg" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-1125-2436.jpg" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-2436-1125.jpg" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-1242-2688.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-2688-1242.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-828-1792.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-1792-828.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-1242-2208.jpg" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-2208-1242.jpg" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-750-1334.jpg" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-1334-750.jpg" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-640-1136.jpg" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
+	<link rel="apple-touch-startup-image" href="images/icons/apple-splash-1136-640.jpg" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
 	<link rel="manifest" href="services/info/manifest.webmanifest">
 	<link rel="shortcut icon" href="public/favicon.png" type="image/png"/>
 	<wicket:header-items/>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java
index b60cf46c7..7ca824dea 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java
@@ -53,6 +53,8 @@ import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.string.Strings;
 import org.wicketstuff.urlfragment.AsyncUrlFragmentAwarePage;
 
+import de.agilecoders.wicket.core.Bootstrap;
+import de.agilecoders.wicket.core.markup.html.bootstrap.behavior.BootstrapResourcesBehavior;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome6CssReference;
 
 public abstract class BasePage extends AsyncUrlFragmentAwarePage {
@@ -145,6 +147,7 @@ public abstract class BasePage extends AsyncUrlFragmentAwarePage {
 			response.render(OnDomReadyHeaderItem.forScript(script));
 		}
 		response.render(CssHeaderItem.forReference(FontAwesome6CssReference.instance()));
+		BootstrapResourcesBehavior.instance().renderHead(Bootstrap.getSettings(getApplication()), response);
 		response.render(new FilteredHeaderItem(CssHeaderItem.forUrl("css/custom.css"), CUSTOM_CSS_FILTER));
 	}