diff --git a/angular.json b/angular.json
index 67369a96..ca960e1d 100755
--- a/angular.json
+++ b/angular.json
@@ -59,6 +59,11 @@
"input": "src/themes/dspace/styles/theme.scss",
"inject": false,
"bundleName": "dspace-theme"
+ },
+ {
+ "input": "src/themes/dspace-exercise/styles/theme.scss",
+ "inject": false,
+ "bundleName": "dspace-theme"
}
],
"scripts": [],
diff --git a/src/themes/dspace-exercise/app/header-nav-wrapper/header-navbar-wrapper.component.html b/src/themes/dspace-exercise/app/header-nav-wrapper/header-navbar-wrapper.component.html
new file mode 100755
index 00000000..8c10efcb
--- /dev/null
+++ b/src/themes/dspace-exercise/app/header-nav-wrapper/header-navbar-wrapper.component.html
@@ -0,0 +1,3 @@
+
diff --git a/src/themes/dspace-exercise/app/header-nav-wrapper/header-navbar-wrapper.component.scss b/src/themes/dspace-exercise/app/header-nav-wrapper/header-navbar-wrapper.component.scss
new file mode 100755
index 00000000..1daf4ebd
--- /dev/null
+++ b/src/themes/dspace-exercise/app/header-nav-wrapper/header-navbar-wrapper.component.scss
@@ -0,0 +1,7 @@
+:host {
+ // The header-navbar-wrapper should not have a z-index, otherwise it would cover the media viewer despite its higher z-index
+ position: relative;
+ div#header-navbar-wrapper {
+ border-bottom: 5px var(--ds-header-navbar-border-bottom-color) solid;
+ }
+}
diff --git a/src/themes/dspace-exercise/app/header-nav-wrapper/header-navbar-wrapper.component.ts b/src/themes/dspace-exercise/app/header-nav-wrapper/header-navbar-wrapper.component.ts
new file mode 100755
index 00000000..36e23e17
--- /dev/null
+++ b/src/themes/dspace-exercise/app/header-nav-wrapper/header-navbar-wrapper.component.ts
@@ -0,0 +1,13 @@
+import { Component } from '@angular/core';
+import { HeaderNavbarWrapperComponent as BaseComponent } from '../../../../app/header-nav-wrapper/header-navbar-wrapper.component';
+
+/**
+ * This component represents a wrapper for the horizontal navbar and the header
+ */
+@Component({
+ selector: 'ds-header-navbar-wrapper',
+ styleUrls: ['header-navbar-wrapper.component.scss'],
+ templateUrl: 'header-navbar-wrapper.component.html',
+})
+export class HeaderNavbarWrapperComponent extends BaseComponent {
+}
diff --git a/src/themes/dspace-exercise/app/header/header.component.html b/src/themes/dspace-exercise/app/header/header.component.html
new file mode 100755
index 00000000..205abfd4
--- /dev/null
+++ b/src/themes/dspace-exercise/app/header/header.component.html
@@ -0,0 +1,25 @@
+
diff --git a/src/themes/dspace-exercise/app/header/header.component.scss b/src/themes/dspace-exercise/app/header/header.component.scss
new file mode 100755
index 00000000..2fc85782
--- /dev/null
+++ b/src/themes/dspace-exercise/app/header/header.component.scss
@@ -0,0 +1,26 @@
+@media screen and (min-width: map-get($grid-breakpoints, md)) {
+ nav.navbar {
+ display: none;
+ }
+ .header {
+ background-color: var(--ds-header-bg);
+ }
+}
+
+.navbar-brand img {
+ @media screen and (max-width: map-get($grid-breakpoints, md)) {
+ height: var(--ds-header-logo-height-xs);
+ }
+}
+.navbar-toggler .navbar-toggler-icon {
+ background-image: none !important;
+ line-height: 1.5;
+}
+
+.navbar-toggler {
+ color: var(--ds-header-icon-color);
+
+ &:hover, &:focus {
+ color: var(--ds-header-icon-color-hover);
+ }
+}
diff --git a/src/themes/dspace-exercise/app/header/header.component.ts b/src/themes/dspace-exercise/app/header/header.component.ts
new file mode 100755
index 00000000..6da89b47
--- /dev/null
+++ b/src/themes/dspace-exercise/app/header/header.component.ts
@@ -0,0 +1,13 @@
+import { Component } from '@angular/core';
+import { HeaderComponent as BaseComponent } from '../../../../app/header/header.component';
+
+/**
+ * Represents the header with the logo and simple navigation
+ */
+@Component({
+ selector: 'ds-header',
+ styleUrls: ['header.component.scss'],
+ templateUrl: 'header.component.html',
+})
+export class HeaderComponent extends BaseComponent {
+}
diff --git a/src/themes/dspace-exercise/app/home-page/home-news/home-news.component.html b/src/themes/dspace-exercise/app/home-page/home-news/home-news.component.html
new file mode 100755
index 00000000..29711c1b
--- /dev/null
+++ b/src/themes/dspace-exercise/app/home-page/home-news/home-news.component.html
@@ -0,0 +1,39 @@
+
+
+
+
+
+
DSpace 7
+
DSpace is the world leading open source repository platform that enables
+ organisations to:
+
+
+
+ - easily ingest documents, audio, video, datasets and their corresponding Dublin Core
+ metadata
+
+ - open up this content to local and global audiences, thanks to the OAI-PMH interface and
+ Google Scholar optimizations
+
+ - issue permanent urls and trustworthy identifiers, including optional integrations with
+ handle.net and DataCite DOI
+
+
+
Join an international community of leading institutions using DSpace.
+
The test user accounts below have their password set to the name of this
+ software in lowercase.
+
+ - Demo Site Administrator = dspacedemo+admin@gmail.com
+ - Demo Community Administrator = dspacedemo+commadmin@gmail.com
+ - Demo Collection Administrator = dspacedemo+colladmin@gmail.com
+ - Demo Submitter = dspacedemo+submit@gmail.com
+
+
+
+
+
Photo by @inspiredimages
+
diff --git a/src/themes/dspace-exercise/app/home-page/home-news/home-news.component.scss b/src/themes/dspace-exercise/app/home-page/home-news/home-news.component.scss
new file mode 100755
index 00000000..3c3aa8b4
--- /dev/null
+++ b/src/themes/dspace-exercise/app/home-page/home-news/home-news.component.scss
@@ -0,0 +1,73 @@
+:host {
+ display: block;
+
+ div.background-image-container {
+ color: white;
+ position: relative;
+
+ .background-image > img {
+ background-color: var(--bs-info);
+ position: absolute;
+ z-index: -1;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ object-position: top;
+ }
+
+ .container {
+ position: relative;
+ text-shadow: 1px 1px 4px rgba(0, 0, 0, 0.6);
+
+ &:before, &:after {
+ content: '';
+ display: block;
+ width: var(--ds-banner-background-gradient-width);
+ height: 100%;
+ top: 0;
+ position: absolute;
+ }
+
+ &:before {
+ background: linear-gradient(to left, var(--ds-banner-text-background), transparent);
+ left: calc(-1 * var(--ds-banner-background-gradient-width));
+
+ }
+
+ &:after {
+ background: linear-gradient(to right, var(--ds-banner-text-background), transparent);
+ right: calc(-1 * var(--ds-banner-background-gradient-width));
+ }
+
+ background-color: var(--ds-banner-text-background);
+ }
+
+
+ small.credits {
+ a {
+ color: inherit;
+ }
+
+ opacity: 0.3;
+ position: absolute;
+ right: var(--bs-spacer);
+ bottom: 0;
+ }
+ }
+
+ .jumbotron {
+ background-color: transparent;
+ }
+
+ a {
+ color: var(--ds-home-news-link-color);
+
+ @include hover {
+ color: var(--ds-home-news-link-hover-color);
+ }
+ }
+}
+
+
diff --git a/src/themes/dspace-exercise/app/home-page/home-news/home-news.component.ts b/src/themes/dspace-exercise/app/home-page/home-news/home-news.component.ts
new file mode 100755
index 00000000..d4032011
--- /dev/null
+++ b/src/themes/dspace-exercise/app/home-page/home-news/home-news.component.ts
@@ -0,0 +1,14 @@
+import { Component } from '@angular/core';
+import { HomeNewsComponent as BaseComponent } from '../../../../../app/home-page/home-news/home-news.component';
+
+@Component({
+ selector: 'ds-home-news',
+ styleUrls: ['./home-news.component.scss'],
+ templateUrl: './home-news.component.html'
+})
+
+/**
+ * Component to render the news section on the home page
+ */
+export class HomeNewsComponent extends BaseComponent {}
+
diff --git a/src/themes/dspace-exercise/app/navbar/navbar.component.html b/src/themes/dspace-exercise/app/navbar/navbar.component.html
new file mode 100755
index 00000000..f2e231d4
--- /dev/null
+++ b/src/themes/dspace-exercise/app/navbar/navbar.component.html
@@ -0,0 +1,26 @@
+
diff --git a/src/themes/dspace-exercise/app/navbar/navbar.component.scss b/src/themes/dspace-exercise/app/navbar/navbar.component.scss
new file mode 100755
index 00000000..28ead2f1
--- /dev/null
+++ b/src/themes/dspace-exercise/app/navbar/navbar.component.scss
@@ -0,0 +1,65 @@
+nav.navbar {
+ align-items: baseline;
+
+ .navbar-inner-container {
+ border-top: 1px var(--ds-header-navbar-border-top-color) solid;
+ }
+}
+
+.navbar-nav {
+ background-color: var(--ds-navbar-bg);
+}
+
+/** Mobile menu styling **/
+@media screen and (max-width: map-get($grid-breakpoints, md)-0.02) {
+ .navbar {
+ width: 100vw;
+ background-color: var(--bs-white);
+ position: absolute;
+ overflow: hidden;
+ height: 0;
+ z-index: var(--ds-nav-z-index);
+ &.open {
+ height: 100vh; //doesn't matter because wrapper is sticky
+ border-bottom: 5px var(--ds-header-navbar-border-bottom-color) solid; // open navbar covers header-navbar-wrapper border
+ }
+ }
+}
+
+@media screen and (min-width: map-get($grid-breakpoints, md)) {
+ .reset-padding-md {
+ margin-left: calc(var(--bs-spacer) / -2);
+ margin-right: calc(var(--bs-spacer) / -2);
+ }
+}
+
+/* TODO remove when https://github.com/twbs/bootstrap/issues/24726 is fixed */
+.navbar-expand-md.navbar-container {
+ @media screen and (max-width: map-get($grid-breakpoints, md)-0.02) {
+ > .navbar-inner-container {
+ padding: 0 var(--bs-spacer);
+ a.navbar-brand {
+ display: none;
+ }
+ .navbar-collapsed {
+ display: none;
+ }
+ }
+ padding: 0;
+ }
+ height: 80px;
+}
+
+a.navbar-brand img {
+ max-height: var(--ds-header-logo-height);
+}
+
+.navbar-nav {
+ ::ng-deep a.nav-link {
+ color: var(--ds-navbar-link-color);
+
+ &:hover, &:focus {
+ color: var(--ds-navbar-link-color-hover);
+ }
+ }
+}
diff --git a/src/themes/dspace-exercise/app/navbar/navbar.component.ts b/src/themes/dspace-exercise/app/navbar/navbar.component.ts
new file mode 100755
index 00000000..321351a9
--- /dev/null
+++ b/src/themes/dspace-exercise/app/navbar/navbar.component.ts
@@ -0,0 +1,15 @@
+import { Component } from '@angular/core';
+import { NavbarComponent as BaseComponent } from '../../../../app/navbar/navbar.component';
+import { slideMobileNav } from '../../../../app/shared/animations/slide';
+
+/**
+ * Component representing the public navbar
+ */
+@Component({
+ selector: 'ds-navbar',
+ styleUrls: ['./navbar.component.scss'],
+ templateUrl: './navbar.component.html',
+ animations: [slideMobileNav]
+})
+export class NavbarComponent extends BaseComponent {
+}
diff --git a/src/themes/dspace-exercise/assets/fonts/.gitkeep b/src/themes/dspace-exercise/assets/fonts/.gitkeep
new file mode 100755
index 00000000..e69de29b
diff --git a/src/themes/dspace-exercise/assets/images/.gitkeep b/src/themes/dspace-exercise/assets/images/.gitkeep
new file mode 100755
index 00000000..e69de29b
diff --git a/src/themes/dspace-exercise/assets/images/banner-half.jpg b/src/themes/dspace-exercise/assets/images/banner-half.jpg
new file mode 100755
index 00000000..31610cc3
Binary files /dev/null and b/src/themes/dspace-exercise/assets/images/banner-half.jpg differ
diff --git a/src/themes/dspace-exercise/assets/images/banner-half.webp b/src/themes/dspace-exercise/assets/images/banner-half.webp
new file mode 100755
index 00000000..f11cfb78
Binary files /dev/null and b/src/themes/dspace-exercise/assets/images/banner-half.webp differ
diff --git a/src/themes/dspace-exercise/assets/images/banner-tall.jpg b/src/themes/dspace-exercise/assets/images/banner-tall.jpg
new file mode 100755
index 00000000..d3103112
Binary files /dev/null and b/src/themes/dspace-exercise/assets/images/banner-tall.jpg differ
diff --git a/src/themes/dspace-exercise/assets/images/banner-tall.webp b/src/themes/dspace-exercise/assets/images/banner-tall.webp
new file mode 100755
index 00000000..a4ec97f2
Binary files /dev/null and b/src/themes/dspace-exercise/assets/images/banner-tall.webp differ
diff --git a/src/themes/dspace-exercise/assets/images/banner.jpg b/src/themes/dspace-exercise/assets/images/banner.jpg
new file mode 100755
index 00000000..5f18b6cb
Binary files /dev/null and b/src/themes/dspace-exercise/assets/images/banner.jpg differ
diff --git a/src/themes/dspace-exercise/assets/images/banner.webp b/src/themes/dspace-exercise/assets/images/banner.webp
new file mode 100755
index 00000000..7745766f
Binary files /dev/null and b/src/themes/dspace-exercise/assets/images/banner.webp differ
diff --git a/src/themes/dspace-exercise/assets/images/favicons/android-chrome-192x192.png b/src/themes/dspace-exercise/assets/images/favicons/android-chrome-192x192.png
new file mode 100755
index 00000000..1aaffb1b
Binary files /dev/null and b/src/themes/dspace-exercise/assets/images/favicons/android-chrome-192x192.png differ
diff --git a/src/themes/dspace-exercise/assets/images/favicons/android-chrome-512x512.png b/src/themes/dspace-exercise/assets/images/favicons/android-chrome-512x512.png
new file mode 100755
index 00000000..2d35f496
Binary files /dev/null and b/src/themes/dspace-exercise/assets/images/favicons/android-chrome-512x512.png differ
diff --git a/src/themes/dspace-exercise/assets/images/favicons/apple-touch-icon.png b/src/themes/dspace-exercise/assets/images/favicons/apple-touch-icon.png
new file mode 100755
index 00000000..58ff41f3
Binary files /dev/null and b/src/themes/dspace-exercise/assets/images/favicons/apple-touch-icon.png differ
diff --git a/src/themes/dspace-exercise/assets/images/favicons/favicon.ico b/src/themes/dspace-exercise/assets/images/favicons/favicon.ico
new file mode 100755
index 00000000..a5dfd5e3
Binary files /dev/null and b/src/themes/dspace-exercise/assets/images/favicons/favicon.ico differ
diff --git a/src/themes/dspace-exercise/assets/images/favicons/favicon.svg b/src/themes/dspace-exercise/assets/images/favicons/favicon.svg
new file mode 100755
index 00000000..8ea65cb7
--- /dev/null
+++ b/src/themes/dspace-exercise/assets/images/favicons/favicon.svg
@@ -0,0 +1,7 @@
+
+
+
diff --git a/src/themes/dspace-exercise/assets/images/favicons/manifest.webmanifest b/src/themes/dspace-exercise/assets/images/favicons/manifest.webmanifest
new file mode 100755
index 00000000..1784ba2b
--- /dev/null
+++ b/src/themes/dspace-exercise/assets/images/favicons/manifest.webmanifest
@@ -0,0 +1,19 @@
+{
+ "name": "DSpace",
+ "short_name": "DSpace",
+ "icons": [
+ {
+ "src": "android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#091119",
+ "background_color": "#091119",
+ "display": "standalone"
+}
diff --git a/src/themes/dspace-exercise/eager-theme.module.ts b/src/themes/dspace-exercise/eager-theme.module.ts
new file mode 100755
index 00000000..63dff9da
--- /dev/null
+++ b/src/themes/dspace-exercise/eager-theme.module.ts
@@ -0,0 +1,51 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { SharedModule } from '../../app/shared/shared.module';
+import { HomeNewsComponent } from './app/home-page/home-news/home-news.component';
+import { NavbarComponent } from './app/navbar/navbar.component';
+import { HeaderComponent } from './app/header/header.component';
+import { HeaderNavbarWrapperComponent } from './app/header-nav-wrapper/header-navbar-wrapper.component';
+import { RootModule } from '../../app/root.module';
+import { NavbarModule } from '../../app/navbar/navbar.module';
+import { SharedBrowseByModule } from '../../app/shared/browse-by/shared-browse-by.module';
+import { ResultsBackButtonModule } from '../../app/shared/results-back-button/results-back-button.module';
+
+/**
+ * Add components that use a custom decorator to ENTRY_COMPONENTS as well as DECLARATIONS.
+ * This will ensure that decorator gets picked up when the app loads
+ */
+const ENTRY_COMPONENTS = [];
+
+const DECLARATIONS = [
+ ...ENTRY_COMPONENTS,
+ HomeNewsComponent,
+ HeaderComponent,
+ HeaderNavbarWrapperComponent,
+ NavbarComponent,
+];
+
+@NgModule({
+ imports: [
+ CommonModule,
+ SharedModule,
+ SharedBrowseByModule,
+ ResultsBackButtonModule,
+ RootModule,
+ NavbarModule,
+ ],
+ declarations: DECLARATIONS,
+ providers: [
+ ...ENTRY_COMPONENTS.map((component) => ({provide: component}))
+ ],
+})
+/**
+ * This module is included in the main bundle that gets downloaded at first page load. So it should
+ * contain only the themed components that have to be available immediately for the first page load,
+ * and the minimal set of imports required to make them work. Anything you can cut from it will make
+ * the initial page load faster, but may cause the page to flicker as components that were already
+ * rendered server side need to be lazy-loaded again client side
+ *
+ * Themed EntryComponents should also be added here
+ */
+export class EagerThemeModule {
+}
diff --git a/src/themes/dspace-exercise/lazy-theme.module.ts b/src/themes/dspace-exercise/lazy-theme.module.ts
new file mode 100755
index 00000000..cdaae815
--- /dev/null
+++ b/src/themes/dspace-exercise/lazy-theme.module.ts
@@ -0,0 +1,132 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { AdminRegistriesModule } from '../../app/admin/admin-registries/admin-registries.module';
+import { AdminSearchModule } from '../../app/admin/admin-search-page/admin-search.module';
+import {
+ AdminWorkflowModuleModule
+} from '../../app/admin/admin-workflow-page/admin-workflow.module';
+import {
+ BitstreamFormatsModule
+} from '../../app/admin/admin-registries/bitstream-formats/bitstream-formats.module';
+import { BrowseByModule } from '../../app/browse-by/browse-by.module';
+import {
+ CollectionFormModule
+} from '../../app/collection-page/collection-form/collection-form.module';
+import { CommunityFormModule } from '../../app/community-page/community-form/community-form.module';
+import { CoreModule } from '../../app/core/core.module';
+import { DragDropModule } from '@angular/cdk/drag-drop';
+import { EditItemPageModule } from '../../app/item-page/edit-item-page/edit-item-page.module';
+import { FormsModule } from '@angular/forms';
+import { HttpClientModule } from '@angular/common/http';
+import { IdlePreloadModule } from 'angular-idle-preload';
+import {
+ JournalEntitiesModule
+} from '../../app/entity-groups/journal-entities/journal-entities.module';
+import { MyDspaceSearchModule } from '../../app/my-dspace-page/my-dspace-search.module';
+import { MenuModule } from '../../app/shared/menu/menu.module';
+import { NavbarModule } from '../../app/navbar/navbar.module';
+import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
+import { ProfilePageModule } from '../../app/profile-page/profile-page.module';
+import { RegisterEmailFormModule } from '../../app/register-email-form/register-email-form.module';
+import {
+ ResearchEntitiesModule
+} from '../../app/entity-groups/research-entities/research-entities.module';
+import { ScrollToModule } from '@nicky-lenaers/ngx-scroll-to';
+import { SearchPageModule } from '../../app/search-page/search-page.module';
+import { SharedModule } from '../../app/shared/shared.module';
+import { StatisticsModule } from '../../app/statistics/statistics.module';
+import { StoreModule } from '@ngrx/store';
+import { StoreRouterConnectingModule } from '@ngrx/router-store';
+import { TranslateModule } from '@ngx-translate/core';
+import { HomePageModule } from '../../app/home-page/home-page.module';
+import { AppModule } from '../../app/app.module';
+import { ItemPageModule } from '../../app/item-page/item-page.module';
+import { RouterModule } from '@angular/router';
+import { CommunityListPageModule } from '../../app/community-list-page/community-list-page.module';
+import { InfoModule } from '../../app/info/info.module';
+import { StatisticsPageModule } from '../../app/statistics-page/statistics-page.module';
+import { CommunityPageModule } from '../../app/community-page/community-page.module';
+import { CollectionPageModule } from '../../app/collection-page/collection-page.module';
+import { SubmissionModule } from '../../app/submission/submission.module';
+import { MyDSpacePageModule } from '../../app/my-dspace-page/my-dspace-page.module';
+import { SearchModule } from '../../app/shared/search/search.module';
+import {
+ ResourcePoliciesModule
+} from '../../app/shared/resource-policies/resource-policies.module';
+import { ComcolModule } from '../../app/shared/comcol/comcol.module';
+import { RootModule } from '../../app/root.module';
+import { BrowseByPageModule } from '../../app/browse-by/browse-by-page.module';
+import { ResultsBackButtonModule } from '../../app/shared/results-back-button/results-back-button.module';
+import { SharedBrowseByModule } from '../../app/shared/browse-by/shared-browse-by.module';
+import { ItemVersionsModule } from '../../app/item-page/versions/item-versions.module';
+import { ItemSharedModule } from 'src/app/item-page/item-shared.module';
+
+const DECLARATIONS = [
+];
+
+@NgModule({
+ imports: [
+ AdminRegistriesModule,
+ AdminSearchModule,
+ AdminWorkflowModuleModule,
+ AppModule,
+ RootModule,
+ BitstreamFormatsModule,
+ BrowseByModule,
+ BrowseByPageModule,
+ ResultsBackButtonModule,
+ CollectionFormModule,
+ CollectionPageModule,
+ CommonModule,
+ CommunityFormModule,
+ CommunityListPageModule,
+ CommunityPageModule,
+ CoreModule,
+ DragDropModule,
+ ItemSharedModule,
+ ItemPageModule,
+ EditItemPageModule,
+ ItemVersionsModule,
+ FormsModule,
+ HomePageModule,
+ HttpClientModule,
+ IdlePreloadModule,
+ InfoModule,
+ JournalEntitiesModule,
+ MenuModule,
+ MyDspaceSearchModule,
+ NavbarModule,
+ NgbModule,
+ ProfilePageModule,
+ RegisterEmailFormModule,
+ ResearchEntitiesModule,
+ RouterModule,
+ ScrollToModule,
+ SearchPageModule,
+ SharedModule,
+ SharedBrowseByModule,
+ StatisticsModule,
+ StatisticsPageModule,
+ StoreModule,
+ StoreRouterConnectingModule,
+ TranslateModule,
+ SubmissionModule,
+ MyDSpacePageModule,
+ MyDspaceSearchModule,
+ SearchModule,
+ FormsModule,
+ ResourcePoliciesModule,
+ ComcolModule,
+ ],
+ declarations: DECLARATIONS,
+})
+
+/**
+ * This module serves as an index for all the components in this theme.
+ * It should import all other modules, so the compiler knows where to find any components referenced
+ * from a component in this theme
+ * It is purposefully not exported, it should never be imported anywhere else, its only purpose is
+ * to give lazily loaded components a context in which they can be compiled successfully
+ */
+class LazyThemeModule {
+}
diff --git a/src/themes/dspace-exercise/styles/_global-styles.scss b/src/themes/dspace-exercise/styles/_global-styles.scss
new file mode 100755
index 00000000..5bd4c19b
--- /dev/null
+++ b/src/themes/dspace-exercise/styles/_global-styles.scss
@@ -0,0 +1,23 @@
+// Add any global css for the theme here
+
+// imports the base global style
+@import '../../../styles/_global-styles.scss';
+
+.facet-filter, .setting-option {
+ background-color: var(--bs-light);
+ border-radius: var(--bs-border-radius);
+
+ &.p-3 {
+ // Needs !important because the original bootstrap class uses it
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .badge-secondary {
+ background-color: var(--bs-primary);
+ }
+
+ h4 {
+ font-size: 1.1rem
+ }
+}
diff --git a/src/themes/dspace-exercise/styles/_theme_css_variable_overrides.scss b/src/themes/dspace-exercise/styles/_theme_css_variable_overrides.scss
new file mode 100755
index 00000000..516eff9f
--- /dev/null
+++ b/src/themes/dspace-exercise/styles/_theme_css_variable_overrides.scss
@@ -0,0 +1,11 @@
+// Override or add CSS variables for your theme here
+
+:root {
+ --ds-header-logo-height: 40px;
+ --ds-banner-text-background: rgba(0, 0, 0, 0.45);
+ --ds-banner-background-gradient-width: 300px;
+ --ds-home-news-link-color: #{$green};
+ --ds-home-news-link-hover-color: #{darken($green, 15%)};
+ --ds-header-navbar-border-bottom-color: #{$green};
+}
+
diff --git a/src/themes/dspace-exercise/styles/_theme_sass_variable_overrides.scss b/src/themes/dspace-exercise/styles/_theme_sass_variable_overrides.scss
new file mode 100755
index 00000000..b5799c97
--- /dev/null
+++ b/src/themes/dspace-exercise/styles/_theme_sass_variable_overrides.scss
@@ -0,0 +1,41 @@
+// DSpace works with CSS variables for its own components, and has a mapping of all bootstrap Sass
+// variables to CSS equivalents (see src/styles/_bootstrap_variables_mapping.scss). However Bootstrap
+// still uses Sass variables internally. So if you want to override bootstrap (or other sass
+// variables) you can do so here. Their CSS counterparts will include the changes you make here
+
+@import url('https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200;0,300;0,400;0,600;0,700;0,800;1,200;1,300;1,400;1,600;1,700;1,800&display=swap');
+
+$font-family-sans-serif: 'Nunito', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+
+$navbar-dark-color: #FFFFFF;
+
+/* Reassign color vars to semantic color scheme */
+$blue: #2b4e72 !default;
+$green: #92C642 !default;
+$cyan: #207698 !default;
+$yellow: #ec9433 !default;
+$red: #CF4444 !default;
+$dark: #43515f !default;
+
+$gray-800: #343a40 !default;
+$gray-700: #495057 !default;
+$gray-400: #ced4da !default;
+$gray-100: #f8f9fa !default;
+
+$body-color: $gray-800 !default; // Bootstrap $gray-800
+
+$table-accent-bg: $gray-100 !default; // Bootstrap $gray-100
+$table-hover-bg: $gray-400 !default; // Bootstrap $gray-400
+
+$yiq-contrasted-threshold: 170 !default;
+
+$theme-colors: (
+ primary: $dark,
+ secondary: $gray-700,
+ success: $green,
+ info: $cyan,
+ warning: $yellow,
+ danger: $red,
+ light: $gray-100,
+ dark: $dark
+) !default;
diff --git a/src/themes/dspace-exercise/styles/theme.scss b/src/themes/dspace-exercise/styles/theme.scss
new file mode 100755
index 00000000..05c96f33
--- /dev/null
+++ b/src/themes/dspace-exercise/styles/theme.scss
@@ -0,0 +1,12 @@
+// This file combines the other scss files in to one. You usually shouldn't edit this file directly
+
+@import './_theme_sass_variable_overrides.scss';
+@import '../../../styles/_variables.scss';
+@import '../../../styles/_mixins.scss';
+@import '../../../styles/helpers/font_awesome_imports.scss';
+@import '../../../styles/_vendor.scss';
+@import '../../../styles/_custom_variables.scss';
+@import './_theme_css_variable_overrides.scss';
+@import '../../../styles/bootstrap_variables_mapping.scss';
+@import '../../../styles/_truncatable-part.component.scss';
+@import './_global-styles.scss';