diff --git a/ui/bundle_templates.js b/ui/bundle_templates.js
index 95dfd733e4..5aa1ef359e 100644
--- a/ui/bundle_templates.js
+++ b/ui/bundle_templates.js
@@ -140,5 +140,13 @@ window.templates = {
campaignAssignLayout:
require('./src/templates/campaign/campaign-assign-layout.hbs'),
},
+ welcome: {
+ welcomeCard:
+ require('./src/templates/welcome/welcome-card.hbs'),
+ serviceCard:
+ require('./src/templates/welcome/service-card.hbs'),
+ othersCard:
+ require('./src/templates/welcome/others-card.hbs'),
+ },
};
diff --git a/ui/src/pages/welcome/welcome-page.js b/ui/src/pages/welcome/welcome-page.js
new file mode 100644
index 0000000000..c4b615098e
--- /dev/null
+++ b/ui/src/pages/welcome/welcome-page.js
@@ -0,0 +1,78 @@
+import './welcome-page.scss';
+
+$(function () {
+
+ for (let index = 0; index < onboardingCard.length; index++) {
+ const card = onboardingCard[index];
+
+ const $newCard = $(templates.welcome.welcomeCard(card));
+
+ $newCard.on('click', function (e) {
+ e.preventDefault();
+ var targetId = $(this).attr("href");
+ var targetElement = $(targetId);
+
+ if (targetElement.length) {
+ var offset = targetElement.offset().top - 100;
+
+ $("html, body").animate({
+ scrollTop: offset
+ }, 800);
+
+ targetElement.css({
+ "border": "3px solid #0e70f6",
+ "transition": "border-color 1s ease-out"
+ });
+
+ setTimeout(function () {
+ targetElement.css("border-color", "transparent");
+ }, 1000);
+ }
+ });
+
+ $newCard.appendTo('.welcome-page .onboarding-cards-container');
+ }
+
+ for (let index = 0; index < serviceCards.length; index++) {
+ const card = serviceCards[index];
+
+ let targetContainer = null;
+
+ if (card.featureFlag === "displays.view") {
+ targetContainer = ".service-card-container .displays-enabled";
+ } else if (Array.isArray(card.featureFlag) && card.featureFlag.includes("library.view") || card.featureFlag.includes("layout.view")) {
+ targetContainer = ".service-card-container .library-layout-enabled";
+ } else if (card.featureFlag === "schedule.view") {
+ targetContainer = ".service-card-container .schedule-enabled";
+ }
+
+ if (targetContainer && $(targetContainer).length) {
+ const $serviceCard = $(templates.welcome.serviceCard(card));
+ $serviceCard.appendTo(targetContainer);
+ }
+ }
+
+ for (let index = 0; index < othersCards.length; index++) {
+ const card = othersCards[index];
+
+ const $othersCard = $(templates.welcome.othersCard(card));
+
+ $othersCard.appendTo('.welcome-page .others-card-container');
+ }
+
+ var scrollUpButton = $(".scroll-up");
+
+ $(window).on("scroll", function () {
+ if ($(window).scrollTop() > 200) {
+ scrollUpButton.fadeIn();
+ } else {
+ scrollUpButton.fadeOut();
+ }
+ });
+
+ scrollUpButton.on("click", function (e) {
+ e.preventDefault();
+ $("html, body").animate({ scrollTop: 0 }, "smooth");
+ });
+
+});
diff --git a/ui/src/pages/welcome/welcome-page.scss b/ui/src/pages/welcome/welcome-page.scss
new file mode 100644
index 0000000000..8585f1c377
--- /dev/null
+++ b/ui/src/pages/welcome/welcome-page.scss
@@ -0,0 +1,316 @@
+$blue: #0e70f6;
+$blue-dark: #0b5ac5;
+$orange: #eb7857;
+$orange-dark: #bc6046;
+
+@mixin box-shadow($shadow: 0px 5px 30px 0px rgba(0, 0, 0, 0.1)) {
+ box-shadow: $shadow;
+}
+
+.welcome-page {
+ display: flex;
+ flex-direction: column;
+ background-color: #ffffff;
+ background-size: cover;
+ background-position: top;
+ background-repeat: no-repeat;
+ padding: 80px 80px;
+ overflow: hidden;
+ position: relative;
+ top: -15px;
+ right: -8px;
+}
+
+.welcome-header {
+ display: flex;
+ width: 100%;
+ align-items: center;
+
+ h2 {
+ font-size: 40px;
+ color: $blue;
+ margin-bottom: 16px;
+ }
+
+ p {
+ font-size: 20px;
+ }
+
+ .header-text-content {
+ display: flex;
+ flex-direction: column;
+ width: 50%;
+ padding-right: 120px;
+ }
+
+ .header-image-box {
+ display: flex;
+ width: 50%;
+ }
+}
+
+@media (max-width: 1400px) {
+ .welcome-page {
+ padding: 60px 40px;
+ }
+ .welcome-header {
+ flex-direction: column;
+ row-gap: 40px;
+
+ .header-text-content {
+ width: 100%;
+ padding-right: 0;
+ }
+ .header-image-box {
+ width: 100%;
+ }
+ }
+
+ .onboarding-cards-container {
+ margin-top: 40px !important;
+ }
+
+ .service-card-container {
+ margin-top: 40px !important;
+ }
+}
+
+@media (max-width: 1290px) {
+ .others-card-container {
+ grid-template-columns: 1fr !important;
+ }
+}
+
+@media (max-width: 1215px) {
+ .welcome-page {
+ padding: 35px 30px;
+ }
+
+ .service-card {
+ flex-direction: column;
+ flex-wrap: wrap;
+
+ .service-card-text {
+ margin-top: 20px;
+ }
+ }
+}
+
+@media (max-width: 995px) {
+ .onboarding-cards-container {
+ display: grid !important;
+ grid-template-columns: 1fr 1fr;
+
+ .onboarding-card {
+ width: 100%;
+ }
+ }
+
+ .line-curve {
+ bottom: -15% !important;
+ }
+
+ .welcome-page {
+ right: -4px;
+ }
+}
+
+.btn-rounded {
+ border-radius: 100px;
+ padding: 7px 20px;
+ font-size: 16px;
+ font-weight: bold;
+ transition: background-color 0.3s ease;
+ text-decoration: none !important;
+}
+
+.btn-orange {
+ background-color: $orange;
+ color: #fff;
+ border: none;
+
+ &:hover {
+ background-color: $orange-dark;
+ color: #fff;
+ }
+}
+
+.btn-outlined {
+ background-color: #fff;
+ color: $blue;
+ border: 2px solid $blue;
+
+ &:hover {
+ background-color: $blue;
+ color: #fff;
+ }
+}
+
+.onboarding-cards-container {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 20px;
+ margin-top: 80px;
+ position: relative;
+}
+
+.onboarding-card {
+ @include box-shadow;
+ display: flex;
+ flex-direction: column;
+ border-radius: 8px;
+ height: 160px;
+ width: 234px;
+ padding: 20px;
+ justify-content: space-between;
+ color: $blue;
+ transition: background-color 0.3s ease;
+ background-color: #ffffff;
+ z-index: 2;
+ cursor: pointer;
+ text-decoration: none;
+
+ h3 {
+ font-size: 20px;
+ line-height: 16px;
+ margin-bottom: 0;
+ font-weight: 600;
+ text-decoration: none;
+ }
+
+ &:hover {
+ background-color: $blue;
+ color: #ffffff;
+ text-decoration: none;
+ }
+}
+
+.onboarding-welcome-image {
+ @include box-shadow;
+ border-radius: 20px;
+ width: 100%;
+ height: 500px;
+ object-fit: cover;
+}
+
+.service-card {
+ @include box-shadow;
+ display: flex;
+ padding: 40px;
+ column-gap: 86px;
+ border-radius: 20px;
+ background-color: #ffffff;
+ position: relative;
+ z-index: 2;
+
+ h3 {
+ color: $blue;
+ font-size: 20px;
+ margin: 0;
+ }
+ p {
+ color: #484848;
+ font-size: 16px;
+ margin-bottom: 0;
+ }
+ .text-link {
+ text-decoration: underline !important;
+ font-weight: 600 !important;
+ color: #484848;
+ }
+ .service-card-image {
+ width: 274px;
+ height: 154px;
+ }
+ .service-card-text {
+ display: flex;
+ flex-direction: column;
+ row-gap: 20px;
+ }
+}
+
+.line-curve {
+ position: absolute;
+ z-index: 0;
+ right: -50%;
+ bottom: -50%;
+ height: 137.9px !important;
+}
+
+.others-card-container {
+ margin-top: 40px;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr;
+ gap: 32px;
+}
+
+.others-card {
+ @include box-shadow;
+ display: flex;
+ flex-direction: column;
+ padding: 24px;
+ row-gap: 15px;
+ background-color: #fff;
+ border-radius: 20px;
+ align-items: start;
+
+ h3 {
+ font-size: 24px;
+ font-weight: 600;
+ color: #1775f6;
+ }
+
+ p {
+ font-size: 16px;
+ color: #484848;
+ line-height: normal;
+ }
+
+ a {
+ color: #1775f6;
+ font-size: 16px;
+ font-weight: 500;
+ text-decoration: none;
+
+ &:hover {
+ text-decoration: none;
+ color: $blue-dark;
+ }
+ }
+
+ .links-list {
+ display: flex;
+ column-gap: 24px;
+ margin-top: auto;
+ }
+}
+
+.optional-link {
+ color: #1775f6;
+ text-decoration: underline;
+ position: relative;
+ font-size: 16px;
+ font-weight: bold;
+ padding: 9px 20px;
+
+ &::after {
+ content: " >";
+ font-weight: bold;
+ position: absolute;
+ right: 8px;
+ }
+
+ &:hover {
+ color: $blue-dark;
+ }
+}
+
+.scroll-up {
+ position: fixed;
+ margin: 30px;
+ bottom: 0;
+ right: 0;
+ z-index: 3;
+}
diff --git a/ui/src/templates/welcome/others-card.hbs b/ui/src/templates/welcome/others-card.hbs
new file mode 100644
index 0000000000..6fa0db2af0
--- /dev/null
+++ b/ui/src/templates/welcome/others-card.hbs
@@ -0,0 +1,9 @@
+
+

+
{{title}}
+
{{text}}
+
+ {{{links}}} {{!-- Triple curly braces render raw HTML --}}
+
+
\ No newline at end of file
diff --git a/ui/src/templates/welcome/service-card.hbs b/ui/src/templates/welcome/service-card.hbs
new file mode 100644
index 0000000000..cae8afba8a
--- /dev/null
+++ b/ui/src/templates/welcome/service-card.hbs
@@ -0,0 +1,17 @@
+
+

+
+
{{title}}
+
{{{text}}}
+
+
+
\ No newline at end of file
diff --git a/ui/src/templates/welcome/welcome-card.hbs b/ui/src/templates/welcome/welcome-card.hbs
new file mode 100644
index 0000000000..a5c6453b2d
--- /dev/null
+++ b/ui/src/templates/welcome/welcome-card.hbs
@@ -0,0 +1,6 @@
+
+ {{ title }}
+
+

+
+
\ No newline at end of file
diff --git a/views/components.twig b/views/components.twig
deleted file mode 100644
index 801f420d27..0000000000
--- a/views/components.twig
+++ /dev/null
@@ -1,40 +0,0 @@
-{% macro welcomeCard(title, iconName) %}
-
-
{{ title | raw }}
-
-
 }}theme/default/img/onboarding/{{iconName}}.svg)
-
-
-{% endmacro %}
-
-{% macro serviceCard(title, text, firstLink, secondLink, imageUrl, otherLink="") %}
-
-
 }}theme/default/img/onboarding/{{ imageUrl }}.png)
-
-
{{ title }}
-
{{ text | raw }}
-
-
-
-{% endmacro %}
-
-{% macro othersCard(title, text, links, iconName) %}
-
-
 }}theme/default/img/onboarding/{{iconName}}.svg)
-
{{title}}
-
{{text}}
-
- {{ links | raw }}
-
-
-{% endmacro %}
\ No newline at end of file
diff --git a/views/welcome-page.twig b/views/welcome-page.twig
index 8016ad9d73..eec9f94a45 100644
--- a/views/welcome-page.twig
+++ b/views/welcome-page.twig
@@ -21,145 +21,169 @@
*/
#}
{% extends "authed.twig" %}
-{% import "components.twig" as components %}
-
-{% set isXiboThemed = theme.getThemeConfig("app_name") == "Xibo" %}
{% block title %}{{ "Welcome"|trans }} | {% endblock %}
{% block pageContent %}