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:19 UTC

[openmeetings] branch OPENMEETINGS-2774-emails created (now 15d6e2947)

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

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


      at 15d6e2947 [OPENMEETINGS-2774] initial commit to fix styles in the emails

This branch includes the following new commits:

     new 15d6e2947 [OPENMEETINGS-2774] initial commit to fix styles in the emails

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



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

Posted by so...@apache.org.
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));
 	}