diff --git a/.github/dependabot.yml b/.github/dependabot.yml.upstream similarity index 100% rename from .github/dependabot.yml rename to .github/dependabot.yml.upstream diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml.upstream similarity index 100% rename from .github/workflows/build.yml rename to .github/workflows/build.yml.upstream diff --git a/.github/workflows/codescan.yml b/.github/workflows/codescan.yml.upstream similarity index 100% rename from .github/workflows/codescan.yml rename to .github/workflows/codescan.yml.upstream diff --git a/.github/workflows/docker-ksul.yml b/.github/workflows/docker-ksul.yml new file mode 100644 index 0000000000..bef4dd90dd --- /dev/null +++ b/.github/workflows/docker-ksul.yml @@ -0,0 +1,57 @@ +# DSpace Docker image build for hub.docker.com +name: Docker images + +# Run this Build for all pushes to 'main' or maintenance branches, or tagged releases. +# Also run for PRs to ensure PR doesn't break Docker build process +# NOTE: uses "reusable-docker-build.yml" in kstatelibraries/kstatelibraries to +# actually build each of the Docker images +# https://github.com/kstatelibraries/kstatelibraries/blob/main/.github/workflows/reusable-docker-build.yml +# +on: + push: + branches: + - 'ksul_dspace-**' + tags: + - 'ksul_dspace-**' + pull_request: + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + ############################################################# + # Build/Push the 'kstatelibraries/krex-dspace-angular' image + ############################################################# + krex-dspace-angular: + # Ensure this job never runs on forked repos. It's only executed for 'kstatelibraries/dspace-angular' + if: github.repository == 'kstatelibraries/dspace-angular' + # Use the reusable-docker-build.yml script from kstatelibraries/kstatelibraries repo to build our Docker image + uses: kstatelibraries/.github/.github/workflows/reusable-docker-build.yml@main + with: + build_id: dspace-dspace-angular-dev + image_name: kstatelibraries/krex-dspace-angular + dockerfile_path: ./Dockerfile + arch_matrix: "[ 'linux/amd64' ]" + secrets: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_ACCESS_TOKEN: ${{ secrets.DOCKER_ACCESS_TOKEN }} + + ############################################################# + # Build/Push the 'kstatelibraries/krex-dspace-angular' image ('-dist' tag) + ############################################################# + krex-dspace-angular-dist: + # Ensure this job never runs on forked repos. It's only executed for 'kstatelibraries/dspace-angular' + if: github.repository == 'kstatelibraries/dspace-angular' + # Use the reusable-docker-build.yml script from kstatelibraries/kstatelibraries repo to build our Docker image + uses: kstatelibraries/.github/.github/workflows/reusable-docker-build.yml@main + with: + build_id: krex-dspace-angular-dist + image_name: kstatelibraries/krex-dspace-angular + dockerfile_path: ./Dockerfile.dist + arch_matrix: "[ 'linux/amd64' ]" + # As this is a "dist" image, its tags are all suffixed with "-dist". Otherwise, it uses the same + # tagging logic as the primary 'kstatelibraries/krex-dspace-angular' image above. + tags_flavor: suffix=-dist + secrets: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_ACCESS_TOKEN: ${{ secrets.DOCKER_ACCESS_TOKEN }} diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml.upstream similarity index 100% rename from .github/workflows/docker.yml rename to .github/workflows/docker.yml.upstream diff --git a/.github/workflows/issue_opened.yml b/.github/workflows/issue_opened.yml.upstream similarity index 100% rename from .github/workflows/issue_opened.yml rename to .github/workflows/issue_opened.yml.upstream diff --git a/.github/workflows/label_merge_conflicts.yml b/.github/workflows/label_merge_conflicts.yml.upstream similarity index 100% rename from .github/workflows/label_merge_conflicts.yml rename to .github/workflows/label_merge_conflicts.yml.upstream diff --git a/.github/workflows/port_merged_pull_request.yml b/.github/workflows/port_merged_pull_request.yml.upstream similarity index 100% rename from .github/workflows/port_merged_pull_request.yml rename to .github/workflows/port_merged_pull_request.yml.upstream diff --git a/.github/workflows/pull_request_opened.yml b/.github/workflows/pull_request_opened.yml.upstream similarity index 100% rename from .github/workflows/pull_request_opened.yml rename to .github/workflows/pull_request_opened.yml.upstream diff --git a/angular.json b/angular.json index cf348ef8d5..5904914f41 100644 --- a/angular.json +++ b/angular.json @@ -59,6 +59,16 @@ "inject": false, "bundleName": "dspace-theme" }, + { + "input": "src/themes/krex/styles/theme.scss", + "inject": false, + "bundleName": "krex-theme" + }, + { + "input": "src/themes/etdr/styles/theme.scss", + "inject": false, + "bundleName": "etdr-theme" + }, "node_modules/leaflet/dist/leaflet.css", "node_modules/leaflet.markercluster/dist/MarkerCluster.Default.css", "node_modules/leaflet.markercluster/dist/MarkerCluster.css" diff --git a/config/config.yml b/config/config.yml index 109db60ca9..29dde50d27 100644 --- a/config/config.yml +++ b/config/config.yml @@ -3,3 +3,7 @@ rest: host: sandbox.dspace.org port: 443 nameSpace: /server + +themes: + - name: krex + extends: dspace diff --git a/src/app/item-page/full/full-item-page.component.html b/src/app/item-page/full/full-item-page.component.html index 43ecae9f17..51be33f482 100644 --- a/src/app/item-page/full/full-item-page.component.html +++ b/src/app/item-page/full/full-item-page.component.html @@ -3,13 +3,13 @@
@if (itemRD?.payload; as item) {
- - + + @if (!item.isWithdrawn || (isAdmin$|async)) {
- - + +
@if (!fromSubmissionObject) {
diff --git a/src/app/shared/auth-nav-menu/auth-nav-menu.component.ts b/src/app/shared/auth-nav-menu/auth-nav-menu.component.ts index ccf536b9a9..1e29a6be25 100644 --- a/src/app/shared/auth-nav-menu/auth-nav-menu.component.ts +++ b/src/app/shared/auth-nav-menu/auth-nav-menu.component.ts @@ -50,6 +50,7 @@ import { HostWindowService } from '../host-window.service'; import { ThemedLogInComponent } from '../log-in/themed-log-in.component'; import { BrowserOnlyPipe } from '../utils/browser-only.pipe'; import { ThemedUserMenuComponent } from './user-menu/themed-user-menu.component'; +import { AuthMethodType } from 'src/app/core/auth/models/auth.method-type'; @Component({ selector: 'ds-base-auth-nav-menu', @@ -75,6 +76,8 @@ export class AuthNavMenuComponent implements OnInit { */ public isAuthenticated$: Observable; + public allowedAuthMethods: AuthMethodType[] = [AuthMethodType.Shibboleth]; + /** * True if the authentication is loading. * @type {boolean} diff --git a/src/app/shared/log-in/log-in.component.ts b/src/app/shared/log-in/log-in.component.ts index c2cacebbe2..84172ce264 100644 --- a/src/app/shared/log-in/log-in.component.ts +++ b/src/app/shared/log-in/log-in.component.ts @@ -10,18 +10,17 @@ import { Store, } from '@ngrx/store'; import { Observable } from 'rxjs'; - +import { map } from 'rxjs/operators'; // Imported map operator import { AuthService } from '../../core/auth/auth.service'; import { AuthMethodsService } from '../../core/auth/auth-methods.service'; import { AuthMethod } from '../../core/auth/models/auth.method'; import { AuthMethodType } from '../../core/auth/models/auth.method-type'; -import { - getAuthenticationError, +import { getAuthenticationError, isAuthenticated, isAuthenticationLoading, } from '../../core/auth/selectors'; import { CoreState } from '../../core/core-state.model'; -import { hasValue } from '../empty.util'; +import { hasValue, isEmpty } from '../empty.util'; import { ThemedLoadingComponent } from '../loading/themed-loading.component'; import { LogInContainerComponent } from './container/log-in-container.component'; import { AUTH_METHOD_FOR_DECORATOR_MAP } from './methods/log-in.methods-decorator'; @@ -38,7 +37,6 @@ import { AUTH_METHOD_FOR_DECORATOR_MAP } from './methods/log-in.methods-decorato ], }) export class LogInComponent implements OnInit { - /** * A boolean representing if LogInComponent is in a standalone page * @type {boolean} @@ -54,9 +52,14 @@ export class LogInComponent implements OnInit { */ @Input() showRegisterLink = true; + /** + * Specific methods allowed to be rendered (empty array allows all) + */ + @Input() allowedAuthMethods: AuthMethodType[] = []; + /** * The list of authentication methods available - * @type {AuthMethod[]} + * @type {Observable} */ public authMethods: Observable; @@ -79,7 +82,12 @@ export class LogInComponent implements OnInit { } ngOnInit(): void { - this.authMethods = this.authMethodsService.getAuthMethods(AUTH_METHOD_FOR_DECORATOR_MAP, this.excludedAuthMethod); + // KSUl-MODIFICATION Fetch backend methods and map-filter them based on allowedAuthMethods rules + this.authMethods = this.authMethodsService.getAuthMethods(AUTH_METHOD_FOR_DECORATOR_MAP, this.excludedAuthMethod).pipe( + map((methods: AuthMethod[]) => methods.filter((authMethod: AuthMethod) => + isEmpty(this.allowedAuthMethods) || this.allowedAuthMethods.includes(authMethod.authMethodType) + )) + ); // set loading this.loading = this.store.pipe(select(isAuthenticationLoading)); diff --git a/src/app/shared/log-in/themed-log-in.component.ts b/src/app/shared/log-in/themed-log-in.component.ts index 5845bdecc5..ec64fd7654 100644 --- a/src/app/shared/log-in/themed-log-in.component.ts +++ b/src/app/shared/log-in/themed-log-in.component.ts @@ -1,4 +1,4 @@ -import { +import { Component, Input, } from '@angular/core'; @@ -15,15 +15,16 @@ import { LogInComponent } from './log-in.component'; templateUrl: './../theme-support/themed.component.html', }) export class ThemedLogInComponent extends ThemedComponent { - @Input() isStandalonePage: boolean; @Input() excludedAuthMethod: AuthMethodType; + @Input() allowedAuthMethods: AuthMethodType[] = []; // Added allowed array input + @Input() showRegisterLink: boolean; protected inAndOutputNames: (keyof LogInComponent & keyof this)[] = [ - 'isStandalonePage', 'excludedAuthMethod', 'showRegisterLink', + 'isStandalonePage', 'excludedAuthMethod', 'allowedAuthMethods', 'showRegisterLink', ]; protected getComponentName(): string { diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index c0b620d24d..5b213e3889 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1,4 +1,5 @@ { + "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", "401.link.home-page": "Take me to the home page", @@ -31,7 +32,7 @@ "error-page.description.404": "Page not found", - "error-page.orcid.generic-error": "An error occurred during login via ORCID. Make sure you have shared your ORCID account email address with DSpace. If the error persists, contact the administrator", + "error-page.orcid.generic-error": "An error occurred during login via ORCID. Make sure you have shared your ORCID account email address with K-REx. If the error persists, contact the administrator", "listelement.badge.access-status": "Access status:", @@ -151,7 +152,7 @@ "admin.registries.metadata.breadcrumbs": "Metadata registry", - "admin.registries.metadata.description": "The metadata registry maintains a list of all metadata fields available in the repository. These fields may be divided amongst multiple schemas. However, DSpace requires the qualified Dublin Core schema.", + "admin.registries.metadata.description": "The metadata registry maintains a list of all metadata fields available in the repository. These fields may be divided amongst multiple schemas. However, K-REx requires the qualified Dublin Core schema.", "admin.registries.metadata.form.create": "Create metadata schema", @@ -1793,7 +1794,7 @@ "dso-selector.set-scope.community.head": "Select a search scope", - "dso-selector.set-scope.community.button": "Search all of DSpace", + "dso-selector.set-scope.community.button": "Search all of K-REx", "dso-selector.set-scope.community.or-divider": "or", @@ -2205,11 +2206,11 @@ "home.breadcrumbs": "Home", - "home.search-form.placeholder": "Search the repository ...", + "home.search-form.placeholder": "Search scholarly works, historical documents and images...", "home.title": "Home", - "home.top-level-communities.head": "Communities in DSpace", + "home.top-level-communities.head": "Communities in K-REx", "home.top-level-communities.help": "Select a community to browse its collections.", @@ -2281,7 +2282,7 @@ "info.feedback.title": "Feedback", - "info.feedback.info": "Thanks for sharing your feedback about the DSpace system. Your comments are appreciated!", + "info.feedback.info": "Thanks for sharing your feedback about the K-REx system. Your comments are appreciated!", "info.feedback.email_help": "This address will be used to follow up on your feedback.", @@ -2979,11 +2980,11 @@ "item.preview.dc.date.issued": "Published date:", - "item.preview.dc.description": "Description:", + "item.preview.dc.description": "Description", "item.preview.dc.description.abstract": "Abstract:", - "item.preview.dc.identifier.other": "Other identifier:", + "item.preview.dc.identifier.other": "Other Identifier", "item.preview.dc.language.iso": "Language:", @@ -3011,8 +3012,6 @@ "item.preview.dc.rights": "Rights", - "item.preview.dc.identifier.other": "Other Identifier", - "item.preview.dc.relation.issn": "ISSN", "item.preview.dc.identifier.isbn": "ISBN", @@ -3071,8 +3070,6 @@ "item.preview.dc.identifier.openalex": "OpenAlex Identifier", - "item.preview.dc.description": "Description", - "item.select.confirm": "Confirm selected", "item.select.empty": "No items to show", @@ -3395,7 +3392,7 @@ "login.form.forgot-password": "Have you forgotten your password?", - "login.form.header": "Please log in to DSpace", + "login.form.header": "Please log in to K-REx", "login.form.new-user": "New user? Click here to register.", @@ -3407,7 +3404,7 @@ "login.form.saml": "Log in with SAML", - "login.form.shibboleth": "Log in with Shibboleth", + "login.form.shibboleth": "Log in with K-State eID", "login.form.submit": "Log in", @@ -3415,7 +3412,7 @@ "login.breadcrumbs": "Login", - "logout.form.header": "Log out from DSpace", + "logout.form.header": "Log out from K-REx", "logout.form.submit": "Log out", @@ -3455,7 +3452,7 @@ "menu.section.browse_community_by_title": "By Title", - "menu.section.browse_global": "All of DSpace", + "menu.section.browse_global": "Browse K-REx", "menu.section.browse_global_by_author": "By Author", @@ -3469,7 +3466,7 @@ "menu.section.browse_global_by_title": "By Title", - "menu.section.browse_global_communities_and_collections": "Communities & Collections", + "menu.section.browse_global_communities_and_collections": "All communities and collections", "menu.section.browse_global_geospatial_map": "By Geolocation (Map)", @@ -3597,7 +3594,7 @@ "metadata-export-search.submit.error": "Starting the export has failed", - "mydspace.breadcrumbs": "MyDSpace", + "mydspace.breadcrumbs": "MyK-REx", "mydspace.description": "", @@ -3651,7 +3648,7 @@ "mydspace.results.no-uri": "No URI", - "mydspace.search-form.placeholder": "Search in MyDSpace...", + "mydspace.search-form.placeholder": "Search in MyK-REx...", "mydspace.show.workflow": "Workflow tasks", @@ -3671,7 +3668,7 @@ "mydspace.status.mydspaceWorkspace": "Workspace", - "mydspace.title": "MyDSpace", + "mydspace.title": "MyK-REx", "mydspace.upload.upload-failed": "Error creating new workspace. Please verify the content uploaded before retry.", @@ -3691,7 +3688,7 @@ "notification.suggestion.please": "Please", - "nav.browse.header": "All of DSpace", + "nav.browse.header": "All of K-REx", "nav.community-browse.header": "By Community", @@ -3707,7 +3704,7 @@ "nav.main.description": "Main navigation bar", - "nav.mydspace": "MyDSpace", + "nav.mydspace": "MyK-REx", "nav.profile": "Profile", @@ -4331,7 +4328,7 @@ "register-page.registration.header": "New user registration", - "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", + "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to K-REx.", "register-page.registration.email": "Email Address *", @@ -4431,7 +4428,7 @@ "repository.title": "DSpace Repository", - "repository.title.prefix": "DSpace Repository :: ", + "repository.title.prefix": "K-REx :: ", "resource-policies.add.button": "Add", @@ -4590,6 +4587,7 @@ "search.filters.applied.f.original_bundle_filenames": "File name", "search.filters.applied.f.original_bundle_descriptions": "File description", + "search.filters.applied.f.has_geospatial_metadata": "Has geographical location", "search.filters.applied.f.itemtype": "Type", @@ -4872,7 +4870,7 @@ "search.form.search_dspace": "All repository", - "search.form.scope.all": "All of DSpace", + "search.form.scope.all": "All of K-REx", "search.results.head": "Search Results", @@ -5038,9 +5036,9 @@ "submission.import-external.title.none": "Import metadata from an external source", - "submission.import-external.page.hint": "Enter a query above to find items from the web to import in to DSpace.", + "submission.import-external.page.hint": "Enter a query above to find items from the web to import in to K-REx.", - "submission.import-external.back-to-my-dspace": "Back to MyDSpace", + "submission.import-external.back-to-my-dspace": "Back to MyK-REx", "submission.import-external.search.placeholder": "Search the external source", @@ -5914,7 +5912,7 @@ "thumbnail.person.placeholder": "No Profile Picture Available", - "title": "DSpace", + title: "K-REx", "vocabulary-treeview.header": "Hierarchical tree view", @@ -6449,152 +6447,263 @@ "service.overview.delete.header": "Delete Service", "ldn-registered-services.title": "Registered Services", + "ldn-registered-services.table.name": "Name", + "ldn-registered-services.table.description": "Description", + "ldn-registered-services.table.status": "Status", + "ldn-registered-services.table.action": "Action", + "ldn-registered-services.new": "NEW", + "ldn-registered-services.new.breadcrumbs": "Registered Services", "ldn-service.overview.table.enabled": "Enabled", + "ldn-service.overview.table.disabled": "Disabled", + "ldn-service.overview.table.clickToEnable": "Click to enable", + "ldn-service.overview.table.clickToDisable": "Click to disable", "ldn-edit-registered-service.title": "Edit Service", + "ldn-create-service.title": "Create service", + "service.overview.create.modal": "Create Service", + "service.overview.create.body": "Please confirm the creation of this service.", + "ldn-service-status": "Status", + "service.confirm.create": "Create", + "service.refuse.create": "Cancel", + "ldn-register-new-service.title": "Register a new service", + "ldn-new-service.form.label.submit": "Save", + "ldn-new-service.form.label.name": "Name", + "ldn-new-service.form.label.description": "Description", + "ldn-new-service.form.label.url": "Service URL", + "ldn-new-service.form.label.ip-range": "Service IP range", + "ldn-new-service.form.label.score": "Level of trust", + "ldn-new-service.form.label.ldnUrl": "LDN Inbox URL", + "ldn-new-service.form.placeholder.name": "Please provide service name", + "ldn-new-service.form.placeholder.description": "Please provide a description regarding your service", + "ldn-new-service.form.placeholder.url": "Please input the URL for users to check out more information about the service", + "ldn-new-service.form.placeholder.lowerIp": "IPv4 range lower bound", + "ldn-new-service.form.placeholder.upperIp": "IPv4 range upper bound", + "ldn-new-service.form.placeholder.ldnUrl": "Please specify the URL of the LDN Inbox", + "ldn-new-service.form.placeholder.score": "Please enter a value between 0 and 1. Use the “.” as decimal separator", + "ldn-service.form.label.placeholder.default-select": "Select a pattern", "ldn-service.form.pattern.ack-accept.label": "Acknowledge and Accept", + "ldn-service.form.pattern.ack-accept.description": "This pattern is used to acknowledge and accept a request (offer). It implies an intention to act on the request.", + "ldn-service.form.pattern.ack-accept.category": "Acknowledgements", "ldn-service.form.pattern.ack-reject.label": "Acknowledge and Reject", + "ldn-service.form.pattern.ack-reject.description": "This pattern is used to acknowledge and reject a request (offer). It signifies no further action regarding the request.", + "ldn-service.form.pattern.ack-reject.category": "Acknowledgements", "ldn-service.form.pattern.ack-tentative-accept.label": "Acknowledge and Tentatively Accept", + "ldn-service.form.pattern.ack-tentative-accept.description": "This pattern is used to acknowledge and tentatively accept a request (offer). It implies an intention to act, which may change.", + "ldn-service.form.pattern.ack-tentative-accept.category": "Acknowledgements", "ldn-service.form.pattern.ack-tentative-reject.label": "Acknowledge and Tentatively Reject", + "ldn-service.form.pattern.ack-tentative-reject.description": "This pattern is used to acknowledge and tentatively reject a request (offer). It signifies no further action, subject to change.", + "ldn-service.form.pattern.ack-tentative-reject.category": "Acknowledgements", "ldn-service.form.pattern.announce-endorsement.label": "Announce Endorsement", + "ldn-service.form.pattern.announce-endorsement.description": "This pattern is used to announce the existence of an endorsement, referencing the endorsed resource.", + "ldn-service.form.pattern.announce-endorsement.category": "Announcements", "ldn-service.form.pattern.announce-ingest.label": "Announce Ingest", + "ldn-service.form.pattern.announce-ingest.description": "This pattern is used to announce that a resource has been ingested.", + "ldn-service.form.pattern.announce-ingest.category": "Announcements", "ldn-service.form.pattern.announce-relationship.label": "Announce Relationship", + "ldn-service.form.pattern.announce-relationship.description": "This pattern is used to announce a relationship between two resources.", + "ldn-service.form.pattern.announce-relationship.category": "Announcements", "ldn-service.form.pattern.announce-review.label": "Announce Review", + "ldn-service.form.pattern.announce-review.description": "This pattern is used to announce the existence of a review, referencing the reviewed resource.", + "ldn-service.form.pattern.announce-review.category": "Announcements", "ldn-service.form.pattern.announce-service-result.label": "Announce Service Result", + "ldn-service.form.pattern.announce-service-result.description": "This pattern is used to announce the existence of a 'service result', referencing the relevant resource.", + "ldn-service.form.pattern.announce-service-result.category": "Announcements", "ldn-service.form.pattern.request-endorsement.label": "Request Endorsement", + "ldn-service.form.pattern.request-endorsement.description": "This pattern is used to request endorsement of a resource owned by the origin system.", + "ldn-service.form.pattern.request-endorsement.category": "Requests", "ldn-service.form.pattern.request-ingest.label": "Request Ingest", + "ldn-service.form.pattern.request-ingest.description": "This pattern is used to request that the target system ingest a resource.", + "ldn-service.form.pattern.request-ingest.category": "Requests", "ldn-service.form.pattern.request-review.label": "Request Review", + "ldn-service.form.pattern.request-review.description": "This pattern is used to request a review of a resource owned by the origin system.", + "ldn-service.form.pattern.request-review.category": "Requests", "ldn-service.form.pattern.undo-offer.label": "Undo Offer", + "ldn-service.form.pattern.undo-offer.description": "This pattern is used to undo (retract) an offer previously made.", + "ldn-service.form.pattern.undo-offer.category": "Undo", "ldn-new-service.form.label.placeholder.selectedItemFilter": "No Item Filter Selected", + "ldn-new-service.form.label.ItemFilter": "Item Filter", + "ldn-new-service.form.label.automatic": "Automatic", + "ldn-new-service.form.error.name": "Name is required", + "ldn-new-service.form.error.url": "URL is required", + "ldn-new-service.form.error.ipRange": "Please enter a valid IP range", + "ldn-new-service.form.hint.ipRange": "Please enter a valid IpV4 in both range bounds (note: for single IP, please enter the same value in both fields)", + "ldn-new-service.form.error.ldnurl": "LDN URL is required", + "ldn-new-service.form.error.patterns": "At least a pattern is required", + "ldn-new-service.form.error.score": "Please enter a valid score (between 0 and 1). Use the “.” as decimal separator", "ldn-new-service.form.label.inboundPattern": "Supported Pattern", + "ldn-new-service.form.label.addPattern": "+ Add more", + "ldn-new-service.form.label.removeItemFilter": "Remove", + "ldn-register-new-service.breadcrumbs": "New Service", + "service.overview.delete.body": "Are you sure you want to delete this service?", + "service.overview.edit.body": "Do you confirm the changes?", + "service.overview.edit.modal": "Edit Service", + "service.detail.update": "Confirm", + "service.detail.return": "Cancel", + "service.overview.reset-form.body": "Are you sure you want to discard the changes and leave?", + "service.overview.reset-form.modal": "Discard Changes", + "service.overview.reset-form.reset-confirm": "Discard", + "admin.registries.services-formats.modify.success.head": "Successful Edit", + "admin.registries.services-formats.modify.success.content": "The service has been edited", + "admin.registries.services-formats.modify.failure.head": "Failed Edit", + "admin.registries.services-formats.modify.failure.content": "The service has not been edited", + "ldn-service-notification.created.success.title": "Successful Create", + "ldn-service-notification.created.success.body": "The service has been created", + "ldn-service-notification.created.failure.title": "Failed Create", + "ldn-service-notification.created.failure.body": "The service has not been created", + "ldn-service-notification.created.warning.title": "Please select at least one Inbound Pattern", + "ldn-enable-service.notification.success.title": "Successful status updated", + "ldn-enable-service.notification.success.content": "The service status has been updated", + "ldn-service-delete.notification.success.title": "Successful Deletion", + "ldn-service-delete.notification.success.content": "The service has been deleted", + "ldn-service-delete.notification.error.title": "Failed Deletion", + "ldn-service-delete.notification.error.content": "The service has not been deleted", + "service.overview.reset-form.reset-return": "Cancel", + "service.overview.delete": "Delete service", + "ldn-edit-service.title": "Edit service", + "ldn-edit-service.form.label.name": "Name", + "ldn-edit-service.form.label.description": "Description", + "ldn-edit-service.form.label.url": "Service URL", + "ldn-edit-service.form.label.ldnUrl": "LDN Inbox URL", + "ldn-edit-service.form.label.inboundPattern": "Inbound Pattern", + "ldn-edit-service.form.label.noInboundPatternSelected": "No Inbound Pattern", + "ldn-edit-service.form.label.selectedItemFilter": "Selected Item Filter", + "ldn-edit-service.form.label.selectItemFilter": "No Item Filter", + "ldn-edit-service.form.label.automatic": "Automatic", + "ldn-edit-service.form.label.addInboundPattern": "+ Add more", + "ldn-edit-service.form.label.submit": "Save", + "ldn-edit-service.breadcrumbs": "Edit Service", + "ldn-service.control-constaint-select-none": "Select none", "ldn-register-new-service.notification.error.title": "Error", + "ldn-register-new-service.notification.error.content": "An error occurred while creating this process", + "ldn-register-new-service.notification.success.title": "Success", + "ldn-register-new-service.notification.success.content": "The process was successfully created", "submission.sections.notify.info": "The selected service is compatible with the item according to its current status. {{ service.name }}: {{ service.description }}", @@ -6616,6 +6725,7 @@ "menu.section.services_new": "LDN Service", "quality-assurance.topics.description-with-target": "Below you can see all the topics received from the subscriptions to {{source}} in regards to the", + "quality-assurance.events.description": "Below the list of all the suggestions for the selected topic {{topic}}, related to {{source}}.", "quality-assurance.events.description-with-topic-and-target": "Below the list of all the suggestions for the selected topic {{topic}}, related to {{source}} and ", @@ -7213,4 +7323,126 @@ "item.preview.organization.address.addressLocality": "City", "item.preview.organization.alternateName": "Alternative name", -} + + "curation-task.task.estaipsize.label": "Estimate Storage Space for AIP(s)", + + "curation-task.task.readodometer.label": "Read Odometer", + + "curation-task.task.transmitaip.label": "Transmit AIP(s) to Storage", + + "curation-task.task.transmitsingleaip.label": "Transmit Single Object AIP to Storage", + + "curation-task.task.verifyaip.label": "Verify AIP(s) exist in Storage", + + "curation-task.task.fetchaip.label": "Fetch AIP(s) from Storage", + + "curation-task.task.auditaip.label": "Audit against AIP(s)", + + "curation-task.task.removeaip.label": "Remove AIP(s) from Storage", + + "curation-task.task.restorefromaip.label": "Restore Missing Object(s) from AIP(s)", + + "curation-task.task.replacewithaip.label": "Replace Existing Object(s) with AIP(s)", + + "curation-task.task.restorekeepexisting.label": "Restore Missing Object(s) but Keep Existing Objects", + + "curation-task.task.restoresinglefromaip.label": "Restore Single Object from AIP", + + "curation-task.task.replacesinglewithaip.label": "Replace Single Object with AIP", + + "repository.title.prefixDSpace": "K-REx ::", + + "info.about.breadcrumbs": "About the K-State Research Exchange", + + "menu.section.about": "About", + + "info.about.head": "About the K-State Research Exchange", + + "info.about.title": "About the K-State Research Exchange", + + "info.policies.breadcrumbs": "Policies", + + "info.policies.head": "K-REx Policies", + + "info.policies.title": "K-REx Policies", + + "menu.section.policies": "Policies", + + "info.license.breadcrumbs": "K-REx License", + + "info.license.head": "Standard K-REx license - Nonexclusive distribution", + + "info.license.title": "K-REx License", + + "info.guidelines.symbols.breadcrumbs": "ETDR Guidelines: Symbols", + + "info.guidelines.symbols.head": "Guidelines for Entering a Title or Abstract That Contains Symbols", + + "info.guidelines.symbols.title": "ETDR Guidelines: Symbols", + + "info.guidelines.attachments.breadcrumbs": "ETDR Guidelines: Attachments", + + "info.guidelines.attachments.head": "ETDR Guidelines: Attachments", + + "info.guidelines.attachments.title": "ETDR Guidelines: Attachments", + + "info.guidelines.authors.breadcrumbs": "ETDR Guidelines: Author Name", + + "info.guidelines.authors.head": "ETDR Guidelines: Author Name", + + "info.guidelines.authors.title": "ETDR Guidelines: Author Name", + + "info.guidelines.keywords.breadcrumbs": "ETDR Guidelines: Keywords", + + "info.guidelines.keywords.head": "ETDR Guidelines: Keywords", + + "info.guidelines.keywords.title": "ETDR Guidelines: Keywords", + + "browse.metadata.datepublished": "Published Date", + + "browse.comcol.by.datepublished": "By Published Date", + + "browse.metadata.datepublished.breadcrumbs": "Browse by Published Date", + + "menu.section.browse_global_by_datepublished": "By Published Date", + + "search.filters.filter.etdrAdvisor.head": "Major advisor", + + "search.filters.filter.etdrAdvisor.placeholder": "Major advisor name", + + "search.filters.filter.etdrAdvisor.label": "Search major advisor name", + + "search.filters.applied.f.etdrAdvisor": "Major advisor", + + "search.filters.filter.etdrDepartment.head": "Degree Awarding Department", + + "search.filters.filter.etdrDepartment.placeholder": "Degree Awarding Department", + + "search.filters.filter.etdrDepartment.label": "Search Degree Awarding Department", + + "search.filters.applied.f.etdrDepartment": "Degree Awarding Department", + + "menu.section.navigate": "Communities and collections", + + "menu.section.navigate.search_all": "Search all content", + + "menu.section.navigate.digital_archives": "K-State Libraries Digital Collections", + + "menu.section.navigate.etdr": "Graduate Theses, Dissertations, and Reports", + + "menu.section.navigate.rscad": "Research, Scholarly and Creative Activities, and Discovery Works", + + "submission.sections.submit.progressbar.describe.stepone.etdpageone.authors.hint": "Enter your name in the same form as it appears on your title page. Use standard capitalization; do not enter your name in all capital letters. For more information on how to enter names, follow the steps here.", + + "submission.sections.submit.progressbar.describe.stepone.etdpageone.title.hint": "Copy and paste the title of your ETDR. If your title contains mathematical operators or other symbols that do not display properly within the Title input box, follow the steps here.", + + "submission.sections.submit.progressbar.describe.stepone.etdpageone.professors.hint": "Select your major professor(s). If you have co-major professors, hold down the Ctrl key and left click to select multiple names. If your major professor is not listed, select \"Major Professor Not Listed\".", + + "submission.sections.submit.progressbar.describe.stepone.etdpageone.language.hint": "Select the language of the main content of the item. If the language does not appear in the list below, please select 'Other'. If the content does not really have a language (for example, if it is a dataset or an image) pleaseselect 'N/A'.", + + "submission.sections.submit.progressbar.describe.stepone.etdpagetwo.keywords.hint": "Enter from 1 to 6 keywords for your ETDR. See here for selecting keywords. Select the \"Add\" button after entering a keyword or keyword phrase.", + + "submission.sections.submit.progressbar.describe.stepone.etdpagetwo.symbols.hint": "Copy and paste the text of your abstract here. Do not include the heading \"Abstract.\" If your abstract contains mathematical operators or other symbols that do not display properly within the Abstract input box, follow the steps here.", + + "submission.sections.submit.progressbar.describe.stepone.etdpagetwo.sponsorship.hint": "(Optional) Enter the names of agencies, if any, that helped to fund your research. Do not use acronyms or abbreviations. If you did not have a source of funding for your research, leave this space blank.", +} \ No newline at end of file diff --git a/src/themes/etdr/app/item-page/full/full-item-page.component.html b/src/themes/etdr/app/item-page/full/full-item-page.component.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/etdr/app/item-page/full/full-item-page.component.scss b/src/themes/etdr/app/item-page/full/full-item-page.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/etdr/app/item-page/full/full-item-page.component.ts b/src/themes/etdr/app/item-page/full/full-item-page.component.ts new file mode 100644 index 0000000000..b0ac5b03f3 --- /dev/null +++ b/src/themes/etdr/app/item-page/full/full-item-page.component.ts @@ -0,0 +1,51 @@ +import { + AsyncPipe, + KeyValuePipe, +} from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, +} from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; + +import { ThemedItemAlertsComponent } from '../../../../../app/item-page/alerts/themed-item-alerts.component'; +import { CollectionsComponent } from '../../../../../app/item-page/field-components/collections/collections.component'; +import { ThemedFullFileSectionComponent } from '../../../../../app/item-page/full/field-components/file-section/themed-full-file-section.component'; +import { FullItemPageComponent as BaseComponent } from '../../../../../app/item-page/full/full-item-page.component'; +import { ThemedItemPageTitleFieldComponent } from '../../../../../app/item-page/simple/field-components/specific-field/title/themed-item-page-field.component'; +import { ItemVersionsComponent } from '../../../../../app/item-page/versions/item-versions.component'; +import { ItemVersionsNoticeComponent } from '../../../../../app/item-page/versions/notice/item-versions-notice.component'; +import { fadeInOut } from '../../../../../app/shared/animations/fade'; +import { DsoEditMenuComponent } from '../../../../../app/shared/dso-page/dso-edit-menu/dso-edit-menu.component'; +import { ErrorComponent } from '../../../../../app/shared/error/error.component'; +import { ThemedLoadingComponent } from '../../../../../app/shared/loading/themed-loading.component'; +import { VarDirective } from '../../../../../app/shared/utils/var.directive'; + +@Component({ + selector: 'ds-themed-full-item-page', + // styleUrls: ['./full-item-page.component.scss'], + styleUrls: ['../../../../../app/item-page/full/full-item-page.component.scss'], + // templateUrl: './full-item-page.component.html', + templateUrl: '../../../../../app/item-page/full/full-item-page.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + animations: [fadeInOut], + imports: [ + AsyncPipe, + CollectionsComponent, + DsoEditMenuComponent, + ErrorComponent, + ItemVersionsComponent, + ItemVersionsNoticeComponent, + KeyValuePipe, + RouterLink, + ThemedFullFileSectionComponent, + ThemedItemAlertsComponent, + ThemedItemPageTitleFieldComponent, + ThemedLoadingComponent, + TranslateModule, + VarDirective, + ], +}) +export class FullItemPageComponent extends BaseComponent { +} diff --git a/src/themes/etdr/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.html b/src/themes/etdr/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.html new file mode 100644 index 0000000000..15960bdc9d --- /dev/null +++ b/src/themes/etdr/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.html @@ -0,0 +1,6 @@ +

+
+ {{ type.toLowerCase() + '.page.titleprefix' | translate }} +
+ {{ dsoNameService.getName(item) }} +

diff --git a/src/themes/etdr/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.ts b/src/themes/etdr/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.ts new file mode 100644 index 0000000000..0856583567 --- /dev/null +++ b/src/themes/etdr/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.ts @@ -0,0 +1,18 @@ +import { Component } from '@angular/core'; +import { + ItemPageTitleFieldComponent as BaseComponent +} from '../../../../../../../../app/item-page/simple/field-components/specific-field/title/item-page-title-field.component'; +import { CommonModule } from '@angular/common'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'ds-item-page-title-field', + // templateUrl: './item-page-title-field.component.html', + imports: [ + CommonModule, + TranslateModule, + ], + templateUrl: '../../../../../../../../app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.html', +}) +export class ItemPageTitleFieldComponent extends BaseComponent { +} diff --git a/src/themes/etdr/app/item-page/simple/item-types/item-page.component.html b/src/themes/etdr/app/item-page/simple/item-types/item-page.component.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/etdr/app/item-page/simple/item-types/item-page.component.scss b/src/themes/etdr/app/item-page/simple/item-types/item-page.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/etdr/app/item-page/simple/item-types/item-page.component.ts b/src/themes/etdr/app/item-page/simple/item-types/item-page.component.ts new file mode 100644 index 0000000000..dee1f4aca9 --- /dev/null +++ b/src/themes/etdr/app/item-page/simple/item-types/item-page.component.ts @@ -0,0 +1,51 @@ +import { + AsyncPipe, + KeyValuePipe, +} from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, +} from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; + +import { ThemedItemAlertsComponent } from '../../../../../../app/item-page/alerts/themed-item-alerts.component'; +import { CollectionsComponent } from '../../../../../../app/item-page/field-components/collections/collections.component'; +import { ThemedFullFileSectionComponent } from '../../../../../../app/item-page/full/field-components/file-section/themed-full-file-section.component'; +import { FullItemPageComponent as BaseComponent } from '../../../../../../app/item-page/full/full-item-page.component'; +import { ThemedItemPageTitleFieldComponent } from '../../../../../../app/item-page/simple/field-components/specific-field/title/themed-item-page-field.component'; +import { ItemVersionsComponent } from '../../../../../../app/item-page/versions/item-versions.component'; +import { ItemVersionsNoticeComponent } from '../../../../../../app/item-page/versions/notice/item-versions-notice.component'; +import { fadeInOut } from '../../../../../../app/shared/animations/fade'; +import { DsoEditMenuComponent } from '../../../../../../app/shared/dso-page/dso-edit-menu/dso-edit-menu.component'; +import { ErrorComponent } from '../../../../../../app/shared/error/error.component'; +import { ThemedLoadingComponent } from '../../../../../../app/shared/loading/themed-loading.component'; +import { VarDirective } from '../../../../../../app/shared/utils/var.directive'; + +@Component({ + selector: 'ds-themed-full-item-page', + // styleUrls: ['./full-item-page.component.scss'], + styleUrls: ['../../../../../app/item-page/full/full-item-page.component.scss'], + // templateUrl: './full-item-page.component.html', + templateUrl: '../../../../../app/item-page/full/full-item-page.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + animations: [fadeInOut], + imports: [ + AsyncPipe, + CollectionsComponent, + DsoEditMenuComponent, + ErrorComponent, + ItemVersionsComponent, + ItemVersionsNoticeComponent, + KeyValuePipe, + RouterLink, + ThemedFullFileSectionComponent, + ThemedItemAlertsComponent, + ThemedItemPageTitleFieldComponent, + ThemedLoadingComponent, + TranslateModule, + VarDirective, + ], +}) +export class FullItemPageComponent extends BaseComponent { +} diff --git a/src/themes/etdr/app/item-page/simple/item-types/untyped-item/untyped-item.component.html b/src/themes/etdr/app/item-page/simple/item-types/untyped-item/untyped-item.component.html new file mode 100644 index 0000000000..3cb381312a --- /dev/null +++ b/src/themes/etdr/app/item-page/simple/item-types/untyped-item/untyped-item.component.html @@ -0,0 +1,116 @@ + +
+
+ + +
+
+ +
+ + + +
+
+
+ + + + + +
+ +
+ + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/src/themes/etdr/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss b/src/themes/etdr/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/etdr/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts b/src/themes/etdr/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts new file mode 100644 index 0000000000..e68c26ed81 --- /dev/null +++ b/src/themes/etdr/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts @@ -0,0 +1,64 @@ +import { AsyncPipe } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, +} from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; + +import { Context } from '../../../../../../../app/core/shared/context.model'; +import { Item } from '../../../../../../../app/core/shared/item.model'; +import { ViewMode } from '../../../../../../../app/core/shared/view-mode.model'; +import { CollectionsComponent } from '../../../../../../../app/item-page/field-components/collections/collections.component'; +import { ThemedMediaViewerComponent } from '../../../../../../../app/item-page/media-viewer/themed-media-viewer.component'; +import { MiradorViewerComponent } from '../../../../../../../app/item-page/mirador-viewer/mirador-viewer.component'; +import { ThemedFileSectionComponent } from '../../../../../../../app/item-page/simple/field-components/file-section/themed-file-section.component'; +import { ItemPageAbstractFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component'; +import { ItemPageCcLicenseFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/cc-license/item-page-cc-license-field.component'; +import { ItemPageDateFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/date/item-page-date-field.component'; +import { GenericItemPageFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/generic/generic-item-page-field.component'; +import { GeospatialItemPageFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/geospatial/geospatial-item-page-field.component'; +import { ThemedItemPageTitleFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/title/themed-item-page-field.component'; +import { ItemPageUriFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/uri/item-page-uri-field.component'; +import { UntypedItemComponent as BaseComponent } from '../../../../../../../app/item-page/simple/item-types/untyped-item/untyped-item.component'; +import { ThemedMetadataRepresentationListComponent } from '../../../../../../../app/item-page/simple/metadata-representation-list/themed-metadata-representation-list.component'; +import { DsoEditMenuComponent } from '../../../../../../../app/shared/dso-page/dso-edit-menu/dso-edit-menu.component'; +import { MetadataFieldWrapperComponent } from '../../../../../../../app/shared/metadata-field-wrapper/metadata-field-wrapper.component'; +import { listableObjectComponent } from '../../../../../../../app/shared/object-collection/shared/listable-object/listable-object.decorator'; +import { ThemedResultsBackButtonComponent } from '../../../../../../../app/shared/results-back-button/themed-results-back-button.component'; +import { ThemedThumbnailComponent } from '../../../../../../../app/thumbnail/themed-thumbnail.component'; + +@listableObjectComponent(Item, ViewMode.StandalonePage, Context.Any, 'custom') +@Component({ + selector: 'ds-untyped-item', + // styleUrls: ['./untyped-item.component.scss'], + styleUrls: [ + '../../../../../../../app/item-page/simple/item-types/untyped-item/untyped-item.component.scss', + ], + // templateUrl: './untyped-item.component.html', + templateUrl: '../../../../../../../app/item-page/simple/item-types/untyped-item/untyped-item.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + AsyncPipe, + CollectionsComponent, + DsoEditMenuComponent, + GenericItemPageFieldComponent, + GeospatialItemPageFieldComponent, + ItemPageAbstractFieldComponent, + ItemPageCcLicenseFieldComponent, + ItemPageDateFieldComponent, + ItemPageUriFieldComponent, + MetadataFieldWrapperComponent, + MiradorViewerComponent, + RouterLink, + ThemedFileSectionComponent, + ThemedItemPageTitleFieldComponent, + ThemedMediaViewerComponent, + ThemedMetadataRepresentationListComponent, + ThemedResultsBackButtonComponent, + ThemedThumbnailComponent, + TranslateModule, + ], +}) +export class UntypedItemComponent extends BaseComponent { +} diff --git a/src/themes/etdr/assets/fonts/.gitkeep b/src/themes/etdr/assets/fonts/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/etdr/assets/i18n/en.json5 b/src/themes/etdr/assets/i18n/en.json5 new file mode 100644 index 0000000000..a4cf20e773 --- /dev/null +++ b/src/themes/etdr/assets/i18n/en.json5 @@ -0,0 +1,8 @@ +{ +"item.page.etdr.graduationmonth": "Graduation Month", +"item.page.etdr.degree": "Degree", +"item.page.etdr.department": "Department", +"item.page.etdr.advisor": "Major Professor", +"item.page.etdr.date": "Date", +"item.page.etdr.type": "Type", +} diff --git a/src/themes/etdr/assets/images/.gitkeep b/src/themes/etdr/assets/images/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/etdr/eager-theme.module.ts b/src/themes/etdr/eager-theme.module.ts new file mode 100644 index 0000000000..126fc07e80 --- /dev/null +++ b/src/themes/etdr/eager-theme.module.ts @@ -0,0 +1,42 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +import { RootModule } from '../../app/root.module'; +import { FullItemPageComponent } from './app/item-page/full/full-item-page.component'; +import { ItemPageTitleFieldComponent } from './app/item-page/simple/field-components/specific-field/title/item-page-title-field.component'; + + +/** + * 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, + FullItemPageComponent, + ItemPageTitleFieldComponent, +]; + +@NgModule({ + imports: [ + CommonModule, + RootModule, + ...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/etdr/styles/_global-styles.scss b/src/themes/etdr/styles/_global-styles.scss new file mode 100644 index 0000000000..f0af67fb7c --- /dev/null +++ b/src/themes/etdr/styles/_global-styles.scss @@ -0,0 +1,4 @@ +// Add any global css for the theme here + +// imports the krex global style +@import '../../krex/styles/_global-styles.scss'; diff --git a/src/themes/etdr/styles/_theme_css_variable_overrides.scss b/src/themes/etdr/styles/_theme_css_variable_overrides.scss new file mode 100644 index 0000000000..b4ebe66da0 --- /dev/null +++ b/src/themes/etdr/styles/_theme_css_variable_overrides.scss @@ -0,0 +1 @@ +// Override or add CSS variables for your theme here diff --git a/src/themes/etdr/styles/_theme_sass_variable_overrides.scss b/src/themes/etdr/styles/_theme_sass_variable_overrides.scss new file mode 100644 index 0000000000..3c3329cde1 --- /dev/null +++ b/src/themes/etdr/styles/_theme_sass_variable_overrides.scss @@ -0,0 +1,3 @@ +// Note that we only add styles we want to override from the krex theme here. +// We do not use the SASS "!default" here because we want to set the values no +// matter whether they are already defined or not. diff --git a/src/themes/etdr/styles/theme.scss b/src/themes/etdr/styles/theme.scss new file mode 100644 index 0000000000..93ad1f9612 --- /dev/null +++ b/src/themes/etdr/styles/theme.scss @@ -0,0 +1,15 @@ +// This file combines the other scss files in to one. You usually shouldn't edit this file directly + +// Define our theme's sass overrides first, then krex theme's +@import './_theme_sass_variable_overrides.scss'; +@import '../../krex/styles/_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 '../../krex/styles/_theme_css_variable_overrides.scss'; +@import '../../../styles/bootstrap_variables_mapping.scss'; +@import '../../../styles/_truncatable-part.component.scss'; +@import './_global-styles.scss'; diff --git a/src/themes/krex/app/footer/footer.component.html b/src/themes/krex/app/footer/footer.component.html new file mode 100644 index 0000000000..29b8d49702 --- /dev/null +++ b/src/themes/krex/app/footer/footer.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/themes/krex/app/footer/footer.component.scss b/src/themes/krex/app/footer/footer.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/krex/app/footer/footer.component.ts b/src/themes/krex/app/footer/footer.component.ts new file mode 100644 index 0000000000..1b153053b7 --- /dev/null +++ b/src/themes/krex/app/footer/footer.component.ts @@ -0,0 +1,27 @@ +import { + AsyncPipe, + DatePipe, +} from '@angular/common'; +import { Component } from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; + +import { FooterComponent as BaseComponent } from '../../../../app/footer/footer.component'; +import { KsuFooterComponent } from '../ksu-footer/ksu-footer.component'; + +@Component({ + selector: 'ds-themed-footer', + styleUrls: ['./footer.component.scss'], + // styleUrls: ['../../../../app/footer/footer.component.scss'], + templateUrl: './footer.component.html', + // templateUrl: '../../../../app/footer/footer.component.html', + imports: [ + AsyncPipe, + DatePipe, + KsuFooterComponent, + RouterLink, + TranslateModule, + ], +}) +export class FooterComponent extends BaseComponent { +} diff --git a/src/themes/krex/app/header-nav-wrapper/header-navbar-wrapper.component.html b/src/themes/krex/app/header-nav-wrapper/header-navbar-wrapper.component.html new file mode 100644 index 0000000000..4fa423d1ef --- /dev/null +++ b/src/themes/krex/app/header-nav-wrapper/header-navbar-wrapper.component.html @@ -0,0 +1,11 @@ +
+ + + @if ((isMobile$ | async)) { +
+ +
+ } +
diff --git a/src/themes/krex/app/header-nav-wrapper/header-navbar-wrapper.component.scss b/src/themes/krex/app/header-nav-wrapper/header-navbar-wrapper.component.scss new file mode 100644 index 0000000000..5293fdfb57 --- /dev/null +++ b/src/themes/krex/app/header-nav-wrapper/header-navbar-wrapper.component.scss @@ -0,0 +1,80 @@ +:host { + --ds-header-navbar-border-bottom-style: solid var(--ds-header-navbar-border-bottom-height) var(--ds-header-navbar-border-bottom-color); + --ds-expandable-navbar-border-top-style: solid var(--ds-expandable-navbar-border-top-height) var(--ds-expandable-navbar-border-top-color); + --ds-expandable-navbar-height: calc(100vh - var(--ds-header-height)); + + div#header-navbar-wrapper { + // The header-navbar-wrapper should not have a z-index, otherwise it would cover the media viewer despite its higher z-index + position: relative; // required by the mobile collapsible navbar + border-bottom: var(--ds-header-navbar-border-bottom-style); // gets covered by mobile navbar wrapper, when open + + div#mobile-navbar-wrapper { + width: 100%; + background-color: var(--ds-expandable-navbar-bg); + position: absolute; + z-index: var(--ds-nav-z-index); + overflow: hidden; + + nav#collapsible-mobile-navbar { + // Following parameters are changed by slideMobileNav animation + min-height: var(--ds-expandable-navbar-height); + height: auto; + border-bottom: var(--ds-header-navbar-border-bottom-style); + } + } + } + + /* MENU ITEMS */ + + ::ng-deep { + .ds-menu-item, .ds-menu-toggler-wrapper { + text-decoration: none; + } + + nav#desktop-navbar { // in header component + #main-site-navigation { + /* Desktop menu */ + + .ds-menu-item-wrapper, .ds-menu-item, .ds-menu-toggler-wrapper { + // fill navbar height (required by dropdown menus) and center content + display: flex; + align-items: center; + height: 100%; + } + .ds-menu-item { + // define here the style for top-level navbar menu items + padding: var(--ds-navbar-item-vertical-padding) var(--ds-navbar-item-horizontal-padding); + } + .ds-menu-item, .ds-menu-toggler-wrapper { + color: var(--ds-navbar-link-color) !important; + &:hover, &:focus { + color: var(--ds-navbar-link-color-hover) !important; + } + } + + /* desktop submenu */ + + .dropdown-menu { + .ds-menu-item { + // define here the style for second-level navbar menu items + padding: var(--ds-navbar-dropdown-item-vertical-padding) var(--ds-navbar-dropdown-item-horizontal-padding); + } + } + + } + } + + nav#collapsible-mobile-navbar { // in header-navbar-wrapper component + + border-top: var(--ds-expandable-navbar-border-top-style); + padding-top: var(--ds-expandable-navbar-padding-top); + + #main-site-navigation { + .ds-menu-item { + padding: var(--ds-expandable-navbar-item-vertical-padding) 0; + } + } + + } + } +} diff --git a/src/themes/krex/app/header-nav-wrapper/header-navbar-wrapper.component.ts b/src/themes/krex/app/header-nav-wrapper/header-navbar-wrapper.component.ts new file mode 100644 index 0000000000..2bf262b0f2 --- /dev/null +++ b/src/themes/krex/app/header-nav-wrapper/header-navbar-wrapper.component.ts @@ -0,0 +1,26 @@ +import { AsyncPipe } from '@angular/common'; +import { Component } from '@angular/core'; +import { TranslateModule } from '@ngx-translate/core'; + +import { ThemedHeaderComponent } from '../../../../app/header/themed-header.component'; +import { HeaderNavbarWrapperComponent as BaseComponent } from '../../../../app/header-nav-wrapper/header-navbar-wrapper.component'; +import { ThemedNavbarComponent } from '../../../../app/navbar/themed-navbar.component'; +import { slideMobileNav } from '../../../../app/shared/animations/slide'; + +/** + * This component represents a wrapper for the horizontal navbar and the header + */ +@Component({ + selector: 'ds-themed-header-navbar-wrapper', + styleUrls: ['header-navbar-wrapper.component.scss'], + templateUrl: 'header-navbar-wrapper.component.html', + imports: [ + AsyncPipe, + ThemedHeaderComponent, + ThemedNavbarComponent, + TranslateModule, + ], + animations: [slideMobileNav], +}) +export class HeaderNavbarWrapperComponent extends BaseComponent { +} diff --git a/src/themes/krex/app/header/header.component.html b/src/themes/krex/app/header/header.component.html new file mode 100644 index 0000000000..a4356dab17 --- /dev/null +++ b/src/themes/krex/app/header/header.component.html @@ -0,0 +1,39 @@ + + +
+
+ +
+ + @if ((isMobile$ | async) !== true) { + + } +
+ +
+ + + + @if ((isMobile$ | async)) { +
+ +
+ } +
+
+
diff --git a/src/themes/krex/app/header/header.component.scss b/src/themes/krex/app/header/header.component.scss new file mode 100644 index 0000000000..5aae8af017 --- /dev/null +++ b/src/themes/krex/app/header/header.component.scss @@ -0,0 +1,28 @@ +:host { + #main-site-header { + min-height: var(--ds-header-height); + + @include media-breakpoint-up(md) { + height: var(--ds-header-height); + } + + background-color: var(--ds-header-bg); + + &-container { + min-height: var(--ds-header-height); + } + } + + img#header-logo { + height: var(--ds-header-logo-height); + } + + button#navbar-toggler { + color: var(--ds-header-icon-color); + + &:hover, &:focus { + color: var(--ds-header-icon-color-hover); + } + } + +} diff --git a/src/themes/krex/app/header/header.component.ts b/src/themes/krex/app/header/header.component.ts new file mode 100644 index 0000000000..07c1f150db --- /dev/null +++ b/src/themes/krex/app/header/header.component.ts @@ -0,0 +1,50 @@ +import { AsyncPipe } from '@angular/common'; +import { + Component, + OnInit, +} from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; +import { Observable } from 'rxjs'; +import { ThemedLangSwitchComponent } from 'src/app/shared/lang-switch/themed-lang-switch.component'; + +import { ContextHelpToggleComponent } from '../../../../app/header/context-help-toggle/context-help-toggle.component'; +import { HeaderComponent as BaseComponent } from '../../../../app/header/header.component'; +import { ThemedNavbarComponent } from '../../../../app/navbar/themed-navbar.component'; +import { ThemedSearchNavbarComponent } from '../../../../app/search-navbar/themed-search-navbar.component'; +import { ThemedAuthNavMenuComponent } from '../../../../app/shared/auth-nav-menu/themed-auth-nav-menu.component'; +import { ImpersonateNavbarComponent } from '../../../../app/shared/impersonate-navbar/impersonate-navbar.component'; +import { KsuEnvironmentBannerComponent } from '../ksu-environment-banner/ksu-environment-banner.component'; +import { KsuHeaderComponent } from '../ksu-header/ksu-header.component'; + +/** + * Represents the header with the logo and simple navigation + */ +@Component({ + selector: 'ds-themed-header', + styleUrls: ['header.component.scss'], + templateUrl: 'header.component.html', + imports: [ + AsyncPipe, + ContextHelpToggleComponent, + ImpersonateNavbarComponent, + KsuEnvironmentBannerComponent, + KsuHeaderComponent, + NgbDropdownModule, + RouterLink, + ThemedAuthNavMenuComponent, + ThemedLangSwitchComponent, + ThemedNavbarComponent, + ThemedSearchNavbarComponent, + TranslateModule, + ], +}) +export class HeaderComponent extends BaseComponent implements OnInit { + public isNavBarCollapsed$: Observable; + + ngOnInit() { + super.ngOnInit(); + this.isNavBarCollapsed$ = this.menuService.isMenuCollapsed(this.menuID); + } +} diff --git a/src/themes/krex/app/home-page/home-news/home-news.component.html b/src/themes/krex/app/home-page/home-news/home-news.component.html new file mode 100644 index 0000000000..c49f1b4f56 --- /dev/null +++ b/src/themes/krex/app/home-page/home-news/home-news.component.html @@ -0,0 +1,45 @@ +
+
+
+
+
+

K-State Research Exchange (K-REx)

+

The university's digital repository. + +

+ + + +
+
+ + + +
+
+ + + + + + +
\ No newline at end of file diff --git a/src/themes/krex/app/home-page/home-news/home-news.component.scss b/src/themes/krex/app/home-page/home-news/home-news.component.scss new file mode 100644 index 0000000000..c9f488cc43 --- /dev/null +++ b/src/themes/krex/app/home-page/home-news/home-news.component.scss @@ -0,0 +1,83 @@ +:host { + display: block; + + div.background-image-container { + color: white; + position: relative; + // font-weight: 600; + + .background-image > img { + background-color: var(--bs-primary); + 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; + } + } + + .home-news-content { + background-color: var(--ds-home-news-content-background); + } + + .jumbotron { + background-color: transparent; + } + + a { + color: var(--ds-home-news-link-color); + + &:hover { + color: var(--ds-home-news-link-hover-color); + } + } + + .lead { + font-size: 1.25rem; + font-weight: 400; + } +} + + diff --git a/src/themes/krex/app/home-page/home-news/home-news.component.ts b/src/themes/krex/app/home-page/home-news/home-news.component.ts new file mode 100644 index 0000000000..67406d60e4 --- /dev/null +++ b/src/themes/krex/app/home-page/home-news/home-news.component.ts @@ -0,0 +1,20 @@ +import { Component } from '@angular/core'; +import { TranslateModule } from '@ngx-translate/core'; +import { HomeNewsComponent as BaseComponent } from 'src/app/home-page/home-news/home-news.component'; +import { ThemedSearchFormComponent } from 'src/app/shared/search-form/themed-search-form.component'; + +@Component({ + selector: 'ds-themed-home-news', + imports: [ + ThemedSearchFormComponent, + TranslateModule, + ], + 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/krex/app/home-page/home-page.component.html b/src/themes/krex/app/home-page/home-page.component.html new file mode 100644 index 0000000000..88c97d8a0c --- /dev/null +++ b/src/themes/krex/app/home-page/home-page.component.html @@ -0,0 +1,22 @@ + + +@if (showDiscoverFilters) { + + + +} +@if (!showDiscoverFilters) { +
+ + +
+} + + + + diff --git a/src/themes/krex/app/home-page/home-page.component.scss b/src/themes/krex/app/home-page/home-page.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/krex/app/home-page/home-page.component.ts b/src/themes/krex/app/home-page/home-page.component.ts new file mode 100644 index 0000000000..1d60001c6c --- /dev/null +++ b/src/themes/krex/app/home-page/home-page.component.ts @@ -0,0 +1,29 @@ +import { NgTemplateOutlet } from '@angular/common'; +import { Component } from '@angular/core'; +import { TranslateModule } from '@ngx-translate/core'; + +import { HomeCoarComponent } from '../../../../app/home-page/home-coar/home-coar.component'; +import { ThemedHomeNewsComponent } from '../../../../app/home-page/home-news/themed-home-news.component'; +import { HomePageComponent as BaseComponent } from '../../../../app/home-page/home-page.component'; +import { ThemedTopLevelCommunityListComponent } from '../../../../app/home-page/top-level-community-list/themed-top-level-community-list.component'; +import { SuggestionsPopupComponent } from '../../../../app/notifications/suggestions/popup/suggestions-popup.component'; +import { ThemedConfigurationSearchPageComponent } from '../../../../app/search-page/themed-configuration-search-page.component'; +import { KsuHomeBelowSearchBarComponent } from './ksu-home-below-search-bar/ksu-home-below-search-bar.component'; + +@Component({ + selector: 'ds-themed-home-page', + styleUrls: ['../../../../app/home-page/home-page.component.scss'], + templateUrl: './home-page.component.html', + imports: [ + HomeCoarComponent, + KsuHomeBelowSearchBarComponent, + NgTemplateOutlet, + SuggestionsPopupComponent, + ThemedConfigurationSearchPageComponent, + ThemedHomeNewsComponent, + ThemedTopLevelCommunityListComponent, + TranslateModule, + ], +}) +export class HomePageComponent extends BaseComponent { +} diff --git a/src/themes/krex/app/home-page/ksu-home-below-search-bar/ksu-home-below-search-bar.component.html b/src/themes/krex/app/home-page/ksu-home-below-search-bar/ksu-home-below-search-bar.component.html new file mode 100644 index 0000000000..5b368ffdad --- /dev/null +++ b/src/themes/krex/app/home-page/ksu-home-below-search-bar/ksu-home-below-search-bar.component.html @@ -0,0 +1,68 @@ +
+ +
+
+
+

Graduate students

+
+
+

Submit Electronic Thesis, Dissertation or Report (ETDR).

+ +

+ + + Submit ETDR + + +

+
+ +
+
+ +
+
+ + +
+

Faculty

+
+
+

Submit Research, Scholarly and Creative Activities, and Discovery (RSCAD) Works.

+

+ + + Submit RSCAD + + +

+
+ + +
+
+
+ + diff --git a/src/themes/krex/app/home-page/ksu-home-below-search-bar/ksu-home-below-search-bar.component.scss b/src/themes/krex/app/home-page/ksu-home-below-search-bar/ksu-home-below-search-bar.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/krex/app/home-page/ksu-home-below-search-bar/ksu-home-below-search-bar.component.ts b/src/themes/krex/app/home-page/ksu-home-below-search-bar/ksu-home-below-search-bar.component.ts new file mode 100644 index 0000000000..819637bbb0 --- /dev/null +++ b/src/themes/krex/app/home-page/ksu-home-below-search-bar/ksu-home-below-search-bar.component.ts @@ -0,0 +1,14 @@ +import { Component } from '@angular/core'; +import { RouterLink } from '@angular/router'; + +@Component({ + selector: 'ds-ksu-home-below-search-bar', + imports: [ + RouterLink, + ], + templateUrl: './ksu-home-below-search-bar.component.html', + styleUrl: './ksu-home-below-search-bar.component.scss', +}) +export class KsuHomeBelowSearchBarComponent { + +} diff --git a/src/themes/krex/app/ksu-environment-banner/ksu-environment-banner.component.html b/src/themes/krex/app/ksu-environment-banner/ksu-environment-banner.component.html new file mode 100644 index 0000000000..e641aa9822 --- /dev/null +++ b/src/themes/krex/app/ksu-environment-banner/ksu-environment-banner.component.html @@ -0,0 +1,4 @@ +@if (bannerEnabled) { +
{{ bannerText }}
+} + diff --git a/src/themes/krex/app/ksu-environment-banner/ksu-environment-banner.component.scss b/src/themes/krex/app/ksu-environment-banner/ksu-environment-banner.component.scss new file mode 100644 index 0000000000..f04571105b --- /dev/null +++ b/src/themes/krex/app/ksu-environment-banner/ksu-environment-banner.component.scss @@ -0,0 +1,3 @@ +:host { + text-align: center; +} diff --git a/src/themes/krex/app/ksu-environment-banner/ksu-environment-banner.component.ts b/src/themes/krex/app/ksu-environment-banner/ksu-environment-banner.component.ts new file mode 100644 index 0000000000..2dfdb980be --- /dev/null +++ b/src/themes/krex/app/ksu-environment-banner/ksu-environment-banner.component.ts @@ -0,0 +1,32 @@ +import { + Component, + Inject, + OnInit, +} from '@angular/core'; +import { + APP_CONFIG, + AppConfig, +} from 'src/config/app-config.interface'; + +@Component({ + selector: 'ds-ksu-environment-banner', + imports: [], + templateUrl: './ksu-environment-banner.component.html', + styleUrl: './ksu-environment-banner.component.scss', +}) +export class KsuEnvironmentBannerComponent implements OnInit { + bannerText = ''; + bannerEnabled = false; + bannerStyle = {}; + + constructor(@Inject(APP_CONFIG) private appConfig: AppConfig) { + } + + ngOnInit(): void { + const bannerConfig = this.appConfig['environmentBanner']; // eslint-disable-line @typescript-eslint/dot-notation + + this.bannerText = bannerConfig?.text; + this.bannerEnabled = bannerConfig?.enabled; + this.bannerStyle = { 'color': bannerConfig?.foregroundColor, 'background-color': bannerConfig?.backgroundColor }; + } +} diff --git a/src/themes/krex/app/ksu-footer/ksu-footer.component.html b/src/themes/krex/app/ksu-footer/ksu-footer.component.html new file mode 100644 index 0000000000..017d4a687c --- /dev/null +++ b/src/themes/krex/app/ksu-footer/ksu-footer.component.html @@ -0,0 +1,115 @@ + + + diff --git a/src/themes/krex/app/ksu-footer/ksu-footer.component.scss b/src/themes/krex/app/ksu-footer/ksu-footer.component.scss new file mode 100644 index 0000000000..3db8d4084d --- /dev/null +++ b/src/themes/krex/app/ksu-footer/ksu-footer.component.scss @@ -0,0 +1,681 @@ +/*footer*/ + +.footer-ksu { + width: 100%; + background-color: #e0e0e0; + padding-top: 20px; + padding-bottom: 16px; + /*height: 200px; /*Bella Added for clarity*/ +} + +.footer-ksu .footer-ksu__inner { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + height: 100%; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center +} + +@media (min-width:768px) { + .footer-ksu .footer-ksu__inner { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row + } + +} + +.footer-ksu .footer-ksu__logo { + margin-bottom: 12px +} + +.footer-ksu .footer-ksu__logo>img { + width: 250px +} + +@media (min-width:768px) { + .footer-ksu .footer-ksu__logo { + margin-right: 72px + } +} + +@media (min-width:1024px) { + .footer-ksu .footer-ksu__logo { + margin-right: 30px + } +} + +.footer-ksu .footer-ksu__menu-container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + margin-top: 20px; + min-width: 250px +} + +@media (min-width:1024px) { + .footer-ksu .footer-ksu__menu-container { + margin-top: 0 + } +} + +.footer-ksu .footer-ksu__menu { + list-style: none; + margin-left: 0; + margin-bottom: 16px; + margin-right: auto +} + +@media (min-width:1024px) { + .footer-ksu .footer-ksu__menu { + margin-bottom: 8px + } +} + +@media (min-width:1024px) { + .footer-ksu .footer-ksu__menu-item { + display: inline-block; + padding-left: 16px; + border-right: 1px solid #000; + padding-right: 16px + } + .footer-ksu .footer-ksu__menu-item:first-child { + padding-left: 0 + } + .footer-ksu .footer-ksu__menu-item:last-child { + padding-right: 16px; + border-right: none + } +} + +.footer-ksu .footer-ksu__menu-link { + color: #000; + font-size: 16px; + line-height: 24px +} + +.footer-ksu .footer-ksu__menu-link:active, +.footer-ksu .footer-ksu__menu-link:focus, +.footer-ksu .footer-ksu__menu-link:link, +.footer-ksu .footer-ksu__menu-link:visited { + color: #000; + text-decoration: none +} + +.footer-ksu .footer-ksu__menu-link:hover { + color: #000; + text-decoration: underline +} + +.footer-ksu .footer-ksu__menu-link .degree-stats { + width: 140px; + height: auto; + vertical-align: baseline +} + +/*purple footer*/ + + +.global-footer__container { + width: 100%; + padding: 2.5rem 1.25rem; + position: relative; + background-position: center center; + opacity: 1; + z-index: 1; + background-color: #512888 +} + +.global-footer__container:before { + content: ''; + background-image: url(/assets/krex/images/1200px-Kansas_State_University_seal.png); + background-repeat: no-repeat; + background-position: center center; + background-size: cover; + opacity: .05; + top: 0; + left: 0; + bottom: 0; + right: 0; + position: absolute; + z-index: -1 +} + +@media print, +screen and (min-width:64em) { + .global-footer__container { + height: 24.0625rem; + padding: 6.25rem + } +} + +.global-footer__inner { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + text-align: center; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-content: center; + -ms-flex-line-pack: center; + align-content: center; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column +} + +@media print, +screen and (min-width:64em) { + .global-footer__inner { + text-align: left; + -webkit-justify-content: space-around; + -ms-flex-pack: distribute; + justify-content: space-around; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row + } +} + +.global-footer__inner p { + color: #fff; + margin: 0; + font-size: 1.25rem; + line-height: 1.75rem +} + +.global-footer__left, +.global-footer__right { + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center +} + +.global-footer__right { + margin-top: 2.5rem +} + +@media print, +screen and (min-width:64em) { + .global-footer__right { + margin-top: 0 + } +} + +.global-footer__right p:first-child { + margin-bottom: 2.25rem +} + +.global-footer__large-text { + font-weight: 700; + text-transform: uppercase +} + +.global-footer__divider { + display: none; + margin: 0 1.25rem; + color: #fff; + font-size: 1.125rem; + line-height: 1.75rem +} + +@media print, +screen and (min-width:48em) { + .global-footer__divider { + display: inline-block + } +} + +.global-footer__address-link { + display: block; + color: #fff +} + +.global-footer__address-link:active, +.global-footer__address-link:focus, +.global-footer__address-link:link, +.global-footer__address-link:visited { + color: #fff; + text-decoration: none +} + +.global-footer__address-link:focus { + outline: .0625rem solid #fff +} + +.global-footer__address-link:hover { + color: #fff +} + +@media print, +screen and (min-width:48em) { + .global-footer__address-link { + display: inline-block + } +} + + +.footer-links { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + margin-bottom: 2.5rem; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center +} + +@media print, +screen and (min-width:64em) { + .footer-links { + margin-bottom: 1.25rem + } +} + +.footer-links__link-container { + display: inline-block; + width: 3.75rem; + height: 3.75rem +} + +.footer-links__link-container:not(:first-child) { + margin-left: 1.25rem +} + +@media print, +screen and (min-width:48em) { + .footer-links__link-container { + width: 4.375rem; + height: 4.375rem + } + .footer-links__link-container:not(:first-child) { + margin-left: 2.375rem + } +} + +.footer-links__link { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + width: 100%; + height: 100%; + background-color: transparent; + border-color: #f0ad00; + border-width: .125rem; + border-style: solid; + border-radius: 50%; + padding: .9375rem; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-transition: background-color .2s linear, border-color .2s linear; + transition: background-color .2s linear, border-color .2s linear +} + +.footer-links__link:active, +.footer-links__link:link, +.footer-links__link:visited { + text-decoration: none +} + +.footer-links__link:focus, +.footer-links__link:hover { + text-decoration: none; + border-color: #fff; + background-color: #fff; + outline: 0 +} + +.footer-links__link:focus svg, +.footer-links__link:hover svg { + fill: #512888 +} + +.footer-links__link svg { + width: 2.125rem; + height: 2.125rem; + fill: #fff; + -webkit-transition: fill .2s linear; + transition: fill .2s linear +} + +[hidden] { + display: none +} + +.programs-grid .link-button { + color: #fff; + margin-bottom: 1.25rem +} + +.programs-grid .link-button:active, +.programs-grid .link-button:focus, +.programs-grid .link-button:link, +.programs-grid .link-button:visited { + color: #fff +} + +.programs-grid .link-button:hover { + color: #fff +} + +.link-button { + color: #512888; + font-family: myriad-pro, "Open Sans", Helvetica, Arial, sans-serif; + font-weight: 700; + font-style: normal; + font-size: 1.25rem; + line-height: 1.5rem +} + +.link-button:active, +.link-button:focus, +.link-button:hover, +.link-button:link, +.link-button:visited { + color: #512888; + text-decoration: none +} + +.link-button:focus svg, +.link-button:hover svg { + margin-left: .9375rem +} + +.link-button svg { + fill: #f0ad00; + width: .75rem; + height: .75rem; + -webkit-transform: rotate(0); + transform: rotate(0); + margin-left: .3125rem; + -webkit-transition: margin-left .2s linear; + transition: margin-left .2s linear +} + +.brei-icon { + fill: white; +} + +#main-menu .navbar-nav > li > a:focus { + text-decoration: none; + border-bottom: 4px solid #825EB9; +} + +#ksu-search-block a:link,#ksu-search-block a:visited { + color: #fff; + text-decoration: none; +} + +#ksu-footer-links li a, #ksu-footer-links li a:link { + color: #fff; + text-decoration: none; +} + +#ksu-footer-addr a, #ksu-footer-addr a:link, #ksu-footer-addr a:visited, #ksu-footer-line2 > li > a, #ksu-footer-line2 > li > a:link, #ksu-footer-line2 > li > a:visited { + color: #fff; + text-decoration: none; +} + +a:link,a:visited,a:hover,a:active,a:focus { + color: #512888; +} + +h2 a:link { + font-size: 1.5em !important; +} + +h3 a:link { + font-size: 1.125em !important; +} + +h4 a:link { + font-size: 1em !important; +} + +h5 a:link { + font-size: 0.875em !important; +} + +h6 a:link { + font-size: 0.7em !important; +} + +a:link { text-decoration: none; } + +.ksul-guide-label { + text-align: right; + font-size: 1.3rem; + font-style: italic; + padding-right: .5rem; + color: white; + background-color: #512888; +} + +.s-lib-box-content a { + color: rgb(81, 40, 136) !important; + font-weight: bold !important; + font-family: myriad-pro, "Open Sans", Helvetica, Arial, sans-serif !important; + /*font-size: medium !important;*/ +} + +.s-lib-box-content a span { + color: #512888 !important; +} + +.s-lib-box .s-lib-box-title { + text-align: left; + font-size: 1.5rem !important; + border-bottom: 3px solid #d1d1c9; + padding-left:0px; + display: block; + margin-left: 0; + margin-right: 0; + font-weight: bold; + background-color: #ffffff; + color: #512888; +} + +.s-lg-tabs-side .s-lib-box-container { + padding: .5rem; + border:lightgrey solid .9rem; +border-radius:3px; +} + + +.unit-bar { + position: relative; + z-index: 99; + color: #512888; + background-color: #fff; + padding: 0 1rem 0 0; + font-size: 1.5rem; + padding-left: 1.25rem; + padding-right: 1.25rem +} + +@media print, +screen and (min-width:64em) { + .unit-bar { + padding-left: 1.875rem; + padding-right: 1.875rem + } +} + +@media screen and (min-width:75em) { + .unit-bar { + padding-left: 6.25rem; + padding-right: 6.25rem + } +} + +.unit-bar.dark { + background-color: #512888; + color: #fff +} + +.unit-bar__container { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + height: 3.5rem +} + +.unit-bar__link, +.unit-bar__link:active, +.unit-bar__link:focus, +.unit-bar__link:hover, +.unit-bar__link:link, +.unit-bar__link:visited { + text-decoration: none; + color: currentColor; + padding: 5px; + max-height: 3.5rem +} + +.unit-bar__link:focus { + outline: 5px solid #f0ad00 +} + +.unit-bar__logo { + margin-right: 1rem; + line-height: 0 +} + +.unit-bar__logo>a { + padding-left: 0 +} + +.unit-bar__logo svg { + display: block; + width: 2.5rem; + height: 2rem +} + +.unit-bar__bar { + position: relative; + border-left: 1.4px solid currentColor; + margin-right: 1rem; + height: 2rem; + vertical-align: middle +} + +.unit-bar__name { + position: relative; + margin-right: 85px; + font-weight: 700; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + line-height: 0 +} + +.unit-bar__name>a:link { + position: relative; + top: -3px; + overflow: hidden; + text-overflow: ellipsis; + line-height: 1; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical +} + +.unit-bar__menu-buttons { + height: 100%; + position: absolute; + top: 0; + right: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + width: 5.125rem; + height: 100%; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + background-color: #512888 +} + +@media print, +screen and (min-width:64em) { + .unit-bar__menu-buttons { + display: none + } +} + +.unit-bar__menu-buttons svg { + width: 2.375rem; + height: 2.375rem; + fill: #fff +} + +.unit-bar__menu-buttons .brei-icon-close { + display: none +} + +.js-menu-open .unit-bar__menu-buttons .brei-icon-menu { + display: none +} + +.js-menu-open .unit-bar__menu-buttons .brei-icon-close { + display: block +} diff --git a/src/themes/krex/app/ksu-footer/ksu-footer.component.ts b/src/themes/krex/app/ksu-footer/ksu-footer.component.ts new file mode 100644 index 0000000000..4d08f27836 --- /dev/null +++ b/src/themes/krex/app/ksu-footer/ksu-footer.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-ksu-footer', + imports: [], + templateUrl: './ksu-footer.component.html', + styleUrl: './ksu-footer.component.scss', +}) +export class KsuFooterComponent { + +} diff --git a/src/themes/krex/app/ksu-header/ksu-header.component.html b/src/themes/krex/app/ksu-header/ksu-header.component.html new file mode 100644 index 0000000000..92b303bf92 --- /dev/null +++ b/src/themes/krex/app/ksu-header/ksu-header.component.html @@ -0,0 +1,59 @@ +
+ + + +
diff --git a/src/themes/krex/app/ksu-header/ksu-header.component.scss b/src/themes/krex/app/ksu-header/ksu-header.component.scss new file mode 100644 index 0000000000..9b0b0bcd20 --- /dev/null +++ b/src/themes/krex/app/ksu-header/ksu-header.component.scss @@ -0,0 +1,1421 @@ + +@charset "UTF-8"; +@media print, +screen and (min-width:40em) { + .reveal, + .reveal.large, + .reveal.small, + .reveal.tiny { + right: auto; + left: auto; + margin: 0 auto + } + +} +/*override SpringShare's page width*/ +.container{ +width: 100%; +} + + + +html { + -webkit-box-sizing: border-box; + box-sizing: border-box; + font-size: 100%; + line-height: 1.15; + -webkit-text-size-adjust: 100%; +} + +body { + font-family: myriad-pro, "Open Sans", Helvetica, Arial, sans-serif; + font-weight: normal; + font-style: normal; + font-size: 16px; + color: #333333; + line-height: 1.625em; + padding: 0; + +} + +body * { + background-color: transparent; + background-position: top center; + background-repeat: no-repeat; + word-break: break-word; + word-wrap: break-word; + -webkit-box-sizing: border-box; + box-sizing: border-box; + +} + +/* Working on */ +.s-lib-side-borders{ + width: 100%; + max-width: 87.25rem; + margin: 0 auto; +} + +@media only screen and (max-width: 1440px) { + .s-lib-side-borders{ + max-width: 77rem; +} +} + +@media only screen and (max-width: 1024px) { + .s-lib-side-borders{ + max-width: 55rem; +} +} + +@media only screen and (max-width: 768px) { + .s-lib-side-borders{ + max-width: 40rem; +} +} + +@media only screen and (max-width: 425px) { + .s-lib-side-borders{ + max-width: 22rem; +} +body * { +word-break: normal; + word-wrap: normal; +} +} + +@media only screen and (max-width: 375px) { + .s-lib-side-borders{ + max-width: 20rem; +} +body * { +word-break: normal; + word-wrap: normal; +} +} + +@media only screen and (max-width: 320px) { + .s-lib-side-borders{ + max-width: 17rem; +} +body * { +word-break: normal; + word-wrap: normal; +} +} + +.s-lib-profile-email .label-info { + background-color: #ffffff; + box-shadow: 3px 3px 3px; +} + +.s-lib-profile-email .label-info[href]:hover { + background-color: #512888; + color: #fff !important; +} + +.s-lib-profile-email .label-info[href]:focus { + background-color: #512888; + color: #fff; +} + +#s-lg-az-reset.btn.btn-default.btn-sm.s-lib-hide { + background-color: #edaf11; +} + + +.hf-body { + font-family: myriad-pro,"Open Sans",Helvetica,Arial,sans-serif; + font-weight: 400; + font-style: normal; + overflow-x: hidden; + font-size: 1.25rem; + line-height: 1.875; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + background: #fff; + color: #000; +} + +button, +html, +input, +select, +textarea { + color: #222 +} + + + +div { + display: block; +} + +nav { + display: block; +} + +p, li, ul, ol { +font-size: 20px; +line-height:32px; +} + + +a:link { + color: #512888; + text-decoration: underline; +} + +a:link:focus { + outline: .0625rem solid #000 +} + +a:link:focus, +a:link:hover { + color: #331958 +} + +a { + line-height: inherit; + color: #512888; + text-decoration: none; + cursor: pointer; +} + +.top-nav { + position: relative; + z-index: 99; + background-color: #eee; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + font-size: .875rem; + height: 2rem; + line-height: 1rem; + padding-left: 1.25rem; + padding-right: 1.25rem; + width: 100%; + font-family: myriad-pro,"Open Sans",Helvetica,Arial,sans-serif; +} + + +@media print, +screen and (min-width:64em) { + body * { + font-size: 1.375rem; + line-height: 2; + } + + .top-nav { + padding-left: 1.875rem; + padding-right: 1.875rem + } + .scrolled .top-nav { + visibility: hidden; + opacity: 0 + } + .level-container__padding { + margin: 0 1.875rem; + padding-bottom: 1.875rem + } + .campaign-landing .level-container__padding, + .high-level .level-container__padding { + margin: 3.125rem 1.875rem + } + .campaign-landing .statistics__item, + .high-level .statistics__item { + padding: 3.125rem + } + + + +} + +@media screen and (min-width:75em) { + .top-nav { + padding-left: 6.25rem; + padding-right: 6.25rem + } + + .level-container__padding { + margin: 0 6.25rem; + padding-bottom: 6.25rem + } + .high-level .level-container__padding { + margin: 3.125rem 6.25rem + } + .standard-level .level-container__padding { + margin: 0 6.25rem; + padding-bottom: 3.125rem + } + .campaign-landing .level-container__padding { + margin: 6.25rem 6.25rem; + padding-bottom: 3.125rem + } + .campaign-landing .statistics__container, + .high-level .statistics__container { + margin: 0 6.25rem -1.875rem + } + + + +} + +@media screen and (min-width:81.25em) { + .top-nav { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + visibility: visible; + opacity: 1; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-transition: visibility .2s, opacity .2s linear; + transition: visibility .2s, opacity .2s linear + } + +} + +.top-nav a { + color: #000; + text-decoration: none +} + +.top-nav a:focus, +.top-nav a:hover { + text-decoration: underline +} + +.top-nav a:focus { + outline: .125rem solid #f0ad00 +} + +.top-nav .ksu-name { + color: #512888; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + white-space: nowrap; + +} + +.top-nav__inner { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center +} + +.campaign-landing .top-nav { + display: none +} + + +.top-nav.expanded .top-nav__menu { + -webkit-transform: scaleX(1); + transform: scaleX(1) +} + +.top-nav.expanded .top-nav__menu-item { + display: inline-block +} + +.top-nav.expanded .brei-icon-double-chevron { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + margin-right: .75rem; + margin-left: 0 +} + +.top-nav.expanded .top-nav__signin:hover .brei-icon-double-chevron { + margin-right: 0; + margin-left: .875rem; +} + +.top-nav.expanded .ksu-name { + visibility: hidden; +} + +@media (min-width:1024px) { + .top-nav.expanded .ksu-name { + visibility: visible; + } +} + +.top-nav .logo { + padding: 0; + max-width: 17.5rem; +} + +.top-nav__container { + position: relative; + padding-left: 1.875rem; + +} + +.top-nav__menu-container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + width: 100%; + height: 100%; + margin-left: auto; + max-width: none; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + opacity: 1; + -webkit-transition: opacity .2s linear; + transition: opacity .2s linear +} + +.top-nav__menu { + font-size: 0; + list-style: none; + margin: 0; + overflow: hidden; + -webkit-transform: scaleX(0); + transform: scaleX(0); + -webkit-transform-origin: right; + transform-origin: right; + -webkit-transition: -webkit-transform .2s ease-in; + transition: -webkit-transform .2s ease-in; + transition: transform .2s ease-in; + transition: transform .2s ease-in, -webkit-transform .2s ease-in +} + +.top-nav__menu-item { + display: inline-block; + display: none; + padding: .125rem; +} + +.top-nav__menu-item:not(:last-child) { + margin-right: .75rem; + padding-right: .75rem; + border-right: .0625rem solid #000; +} + +@media screen and (min-width:90em) { + .top-nav__menu-item:not(:last-child) { + margin-right: 1.25rem; + padding-right: 1.25rem; + } + +} + +.top-nav__signin { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + width: 5.5rem; + min-width: 4.6875rem; + font-size: 0; + position: relative; + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; +} + +.top-nav__signin svg { + display: none; +} + +.top-nav__menu-link span { + display: none; +} + +@media print, +screen and (min-width:48em) { + .top-nav__signin svg { + display: block; + } +.top-nav__menu-link span { + display: inline; + } + + .statistics__container { + background-color: transparent; + padding: 0; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center + } + .campaign-landing .statistics__container, + .high-level .statistics__container { + margin: 0 1.875rem -1.875rem + } + + +} + +.top-nav__signin:hover .brei-icon-double-chevron { + margin-right: .5rem; + margin-left: 0; +} + +.top-nav__browse { + margin-left: 1.25rem; +} + +.top-nav__menu-link { + color: #000; + margin-left: .3125rem; + font-size: .875rem; + line-height: 1rem; + text-decoration: none; +} + +.top-nav__menu-link:active, +.top-nav__menu-link:focus, +.top-nav__menu-link:link { + color: #000; + text-decoration: none; +} + +.top-nav__menu-link:hover { + color: #000; +} + + + + + +.top-nav .brei-icon-double-chevron { + width: .875rem; + height: .875rem; + margin-left: .9375rem; + margin-right: 0; + fill: #f0ad00; + -webkit-transform: rotate(0); + transform: rotate(0); + -webkit-transition: margin-left .2s ease-in, margin-right .2s ease-in, -webkit-transform .2s ease-in; + transition: margin-left .2s ease-in, margin-right .2s ease-in, -webkit-transform .2s ease-in; + transition: transform .2s ease-in, margin-left .2s ease-in, margin-right .2s ease-in; + transition: transform .2s ease-in, margin-left .2s ease-in, margin-right .2s ease-in, -webkit-transform .2s ease-in +} + +.top-nav__search-zone { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + width: 4.0625rem; + height: 100%; + padding: 0; + background-color: transparent; + -webkit-box-flex: 1; + -webkit-flex: 1 0 auto; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + position: absolute; + right: 0; + top: 0; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + z-index: 9; + -webkit-box-ordinal-group: 3; + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; + -webkit-transition-property: background-color, width; + transition-property: background-color, width; + -webkit-transition-duration: .2s; + transition-duration: .2s; + -webkit-transition-timing-function: linear; + transition-timing-function: linear; +} + +.top-nav__search-container { + display: block; + margin: 0; + padding: .125rem; + position: absolute; + top: 0; + right: 0; +} + +.top-nav__search-box { + width: 2.875rem; + height: 2.875rem; + margin-top: .125rem; + background-color: #fff; + border: .125rem solid #fff; + border-radius: 1.5rem; + padding: .625rem 3.375rem .625rem 1.875rem; + opacity: 0; + -webkit-transition-property: opacity, width; + transition-property: opacity, width; + -webkit-transition-duration: .2s; + transition-duration: .2s; + -webkit-transition-timing-function: linear; + transition-timing-function: linear +} + +.top-nav__search-box input { + display: none; + width: 100%; + padding: 0; + border: 0; + font-family: myriad-pro, "Open Sans", Helvetica, Arial, sans-serif; + font-weight: 400; + font-style: normal; + font-size: 1rem; + line-height: 1.5rem; +} + +.top-nav__search-label { + display: none; +} + +.top-nav__search { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + width: 2.875rem; + height: 2.875rem; + background-color: transparent; + border: .125rem solid #f0ad00; + border-radius: 50%; + position: relative; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-transition: border .2s linear; + transition: border .2s linear; +} + +.top-nav__search:active, +.top-nav__search:focus, +.top-nav__search:link, +.top-nav__search:visited { + text-decoration: none; +} + +.top-nav__search:focus { + outline: .0625rem solid #000; +} + +.top-nav__search:hover { + text-decoration: none +} + +.top-nav__search svg { + width: 1.25rem; + height: 1.25rem; + fill: #512888 +} + + +*, ::after, ::before { + -webkit-box-sizing: inherit; + box-sizing: inherit; +} + + +::selection { + background: #b3d4fc; + text-shadow: none; +} + +.maxwidth { + width: 100%; + max-width: 87.25rem; + margin: 0 auto; +} + + +h1,h2,h3,h4,h5,h6 { + margin: 5px 0 5px 0; + font-weight: inherit; +} + +h1 { + font-size: 2em; + color: #512888; + margin-top: 0.67em; + margin-bottom: 0.67em; + margin-left: 0; + margin-right: 0; + font-weight: bold; +} +h2 { + font-size: 1.5em !important; + border-bottom: 3px solid #d1d1c9; + padding-left:0px; + display: block; + margin-top: 0.83em; + margin-bottom: 0.83em; + margin-left: 0; + margin-right: 0; + font-weight: bold; +} +h3 { + font-size: 1.27em; + margin-top: 1em; + margin-bottom: 1em; + margin-left: 0; + margin-right: 0; + font-weight: bold; + color: rgb(51,51,51); +} + +h4 { + font-size: 1.125em; + font-weight: bold; + line-height: 1.5em; + color: rgb(81,40,136); +} + +h5 { + font-size: 1.0em; + line-height: 1.2em; + color: rgb(0,0,0); +} + +h6 { + font-size: 0.875em; + color: rgb(51,51,51); +} + +.campaign-landing .statistics, +.high-level .statistics { + margin: 2rem 0 0; + padding: 0 +} + +.campaign-landing .statistics__container, +.high-level .statistics__container { + width: auto; + background-color: #fff; + margin: 0 1.25rem -1.875rem; + padding: 1.25rem; + -webkit-box-shadow: 0 0 3.9375rem -.4375rem rgba(167, 167, 167, .43); + box-shadow: 0 0 3.9375rem -.4375rem rgba(167, 167, 167, .43); + z-index: 9 +} + +/*footer*/ + +.footer-ksu { + width: 100%; + background-color: #e0e0e0; + padding-top: 20px; + padding-bottom: 16px; + /*height: 200px; /*Bella Added for clarity*/ +} + +.footer-ksu .footer-ksu__inner { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + height: 100%; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center +} + +@media (min-width:768px) { + .footer-ksu .footer-ksu__inner { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row + } + +} + +.footer-ksu .footer-ksu__logo { + margin-bottom: 12px +} + +.footer-ksu .footer-ksu__logo>img { + width: 250px +} + +@media (min-width:768px) { + .footer-ksu .footer-ksu__logo { + margin-right: 72px + } +} + +@media (min-width:1024px) { + .footer-ksu .footer-ksu__logo { + margin-right: 30px + } +} + +.footer-ksu .footer-ksu__menu-container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + margin-top: 20px; + min-width: 250px +} + +@media (min-width:1024px) { + .footer-ksu .footer-ksu__menu-container { + margin-top: 0 + } +} + +.footer-ksu .footer-ksu__menu { + list-style: none; + margin-left: 0; + margin-bottom: 16px; + margin-right: auto +} + +@media (min-width:1024px) { + .footer-ksu .footer-ksu__menu { + margin-bottom: 8px + } +} + +@media (min-width:1024px) { + .footer-ksu .footer-ksu__menu-item { + display: inline-block; + padding-left: 16px; + border-right: 1px solid #000; + padding-right: 16px + } + .footer-ksu .footer-ksu__menu-item:first-child { + padding-left: 0 + } + .footer-ksu .footer-ksu__menu-item:last-child { + padding-right: 16px; + border-right: none + } +} + +.footer-ksu .footer-ksu__menu-link { + color: #000; + font-size: 16px; + line-height: 24px +} + +.footer-ksu .footer-ksu__menu-link:active, +.footer-ksu .footer-ksu__menu-link:focus, +.footer-ksu .footer-ksu__menu-link:link, +.footer-ksu .footer-ksu__menu-link:visited { + color: #000; + text-decoration: none +} + +.footer-ksu .footer-ksu__menu-link:hover { + color: #000; + text-decoration: underline +} + +.footer-ksu .footer-ksu__menu-link .degree-stats { + width: 140px; + height: auto; + vertical-align: baseline +} + +/*purple footer*/ + + +.global-footer__container { + width: 100%; + padding: 2.5rem 1.25rem; + position: relative; + background-position: center center; + opacity: 1; + z-index: 1; + background-color: #512888 +} + +.global-footer__container:before { + content: ''; + background-image: url(/assets/krex/images/1200px-Kansas_State_University_seal.png); + background-repeat: no-repeat; + background-position: center center; + background-size: cover; + opacity: .05; + top: 0; + left: 0; + bottom: 0; + right: 0; + position: absolute; + z-index: -1 +} + +@media print, +screen and (min-width:64em) { + .global-footer__container { + height: 24.0625rem; + padding: 6.25rem + } +} + +.global-footer__inner { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + text-align: center; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-content: center; + -ms-flex-line-pack: center; + align-content: center; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column +} + +@media print, +screen and (min-width:64em) { + .global-footer__inner { + text-align: left; + -webkit-justify-content: space-around; + -ms-flex-pack: distribute; + justify-content: space-around; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row + } +} + +.global-footer__inner p { + color: #fff; + margin: 0; + font-size: 1.25rem; + line-height: 1.75rem +} + +.global-footer__left, +.global-footer__right { + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center +} + +.global-footer__right { + margin-top: 2.5rem +} + +@media print, +screen and (min-width:64em) { + .global-footer__right { + margin-top: 0 + } +} + +.global-footer__right p:first-child { + margin-bottom: 2.25rem +} + +.global-footer__large-text { + font-weight: 700; + text-transform: uppercase +} + +.global-footer__divider { + display: none; + margin: 0 1.25rem; + color: #fff; + font-size: 1.125rem; + line-height: 1.75rem +} + +@media print, +screen and (min-width:48em) { + .global-footer__divider { + display: inline-block + } +} + +.global-footer__address-link { + display: block; + color: #fff +} + +.global-footer__address-link:active, +.global-footer__address-link:focus, +.global-footer__address-link:link, +.global-footer__address-link:visited { + color: #fff; + text-decoration: none +} + +.global-footer__address-link:focus { + outline: .0625rem solid #fff +} + +.global-footer__address-link:hover { + color: #fff +} + +@media print, +screen and (min-width:48em) { + .global-footer__address-link { + display: inline-block + } +} + + +.footer-links { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + margin-bottom: 2.5rem; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center +} + +@media print, +screen and (min-width:64em) { + .footer-links { + margin-bottom: 1.25rem + } +} + +.footer-links__link-container { + display: inline-block; + width: 3.75rem; + height: 3.75rem +} + +.footer-links__link-container:not(:first-child) { + margin-left: 1.25rem +} + +@media print, +screen and (min-width:48em) { + .footer-links__link-container { + width: 4.375rem; + height: 4.375rem + } + .footer-links__link-container:not(:first-child) { + margin-left: 2.375rem + } +} + +.footer-links__link { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + width: 100%; + height: 100%; + background-color: transparent; + border-color: #f0ad00; + border-width: .125rem; + border-style: solid; + border-radius: 50%; + padding: .9375rem; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-transition: background-color .2s linear, border-color .2s linear; + transition: background-color .2s linear, border-color .2s linear +} + +.footer-links__link:active, +.footer-links__link:link, +.footer-links__link:visited { + text-decoration: none +} + +.footer-links__link:focus, +.footer-links__link:hover { + text-decoration: none; + border-color: #fff; + background-color: #fff; + outline: 0 +} + +.footer-links__link:focus svg, +.footer-links__link:hover svg { + fill: #512888 +} + +.footer-links__link svg { + width: 2.125rem; + height: 2.125rem; + fill: #fff; + -webkit-transition: fill .2s linear; + transition: fill .2s linear +} + +[hidden] { + display: none +} + +.programs-grid .link-button { + color: #fff; + margin-bottom: 1.25rem +} + +.programs-grid .link-button:active, +.programs-grid .link-button:focus, +.programs-grid .link-button:link, +.programs-grid .link-button:visited { + color: #fff +} + +.programs-grid .link-button:hover { + color: #fff +} + +.link-button { + color: #512888; + font-family: myriad-pro, "Open Sans", Helvetica, Arial, sans-serif; + font-weight: 700; + font-style: normal; + font-size: 1.25rem; + line-height: 1.5rem +} + +.link-button:active, +.link-button:focus, +.link-button:hover, +.link-button:link, +.link-button:visited { + color: #512888; + text-decoration: none +} + +.link-button:focus svg, +.link-button:hover svg { + margin-left: .9375rem +} + +.link-button svg { + fill: #f0ad00; + width: .75rem; + height: .75rem; + -webkit-transform: rotate(0); + transform: rotate(0); + margin-left: .3125rem; + -webkit-transition: margin-left .2s linear; + transition: margin-left .2s linear +} + +.brei-icon { + fill: white; +} + +#main-menu .navbar-nav > li > a:focus { + text-decoration: none; + border-bottom: 4px solid #825EB9; +} + +#ksu-search-block a:link,#ksu-search-block a:visited { + color: #fff; + text-decoration: none; +} + +#ksu-footer-links li a, #ksu-footer-links li a:link { + color: #fff; + text-decoration: none; +} + +#ksu-footer-addr a, #ksu-footer-addr a:link, #ksu-footer-addr a:visited, #ksu-footer-line2 > li > a, #ksu-footer-line2 > li > a:link, #ksu-footer-line2 > li > a:visited { + color: #fff; + text-decoration: none; +} + +a:link,a:visited,a:hover,a:active,a:focus { + color: #512888; +} + +h2 a:link { + font-size: 1.5em !important; +} + +h3 a:link { + font-size: 1.125em !important; +} + +h4 a:link { + font-size: 1em !important; +} + +h5 a:link { + font-size: 0.875em !important; +} + +h6 a:link { + font-size: 0.7em !important; +} + +a:link { text-decoration: none; } + +.ksul-guide-label { + text-align: right; + font-size: 1.3rem; + font-style: italic; + padding-right: .5rem; + color: white; + background-color: #512888; +} + +.s-lib-box-content a { + color: rgb(81, 40, 136) !important; + font-weight: bold !important; + font-family: "Lucida Grande",Verdana,Arial,sans-serif !important; + font-size: medium !important; +} + +.s-lib-box-content a span { + color: #512888 !important; +} + +.s-lib-box .s-lib-box-title { + text-align: left; + font-size: 1.5rem !important; + border-bottom: 3px solid #d1d1c9; + padding-left:0px; + display: block; + margin-left: 0; + margin-right: 0; + font-weight: bold; + background-color: #ffffff; + color: #512888; +} + +.s-lg-tabs-side .s-lib-box-container { + padding: .5rem; + border:lightgrey solid .9rem; +border-radius:3px; +} + + +.unit-bar { + position: relative; + z-index: 99; + color: #512888; + background-color: #fff; + padding: 0 1rem 0 0; + font-size: 1.5rem; + padding-left: 1.25rem; + padding-right: 1.25rem +} + +@media print, +screen and (min-width:64em) { + .unit-bar { + padding-left: 1.875rem; + padding-right: 1.875rem + } +} + +@media screen and (min-width:75em) { + .unit-bar { + padding-left: 6.25rem; + padding-right: 6.25rem + } +} + +.unit-bar.dark { + background-color: #512888; + color: #fff +} + +.unit-bar__container { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + height: 3.5rem +} + +.unit-bar__link, +.unit-bar__link:active, +.unit-bar__link:focus, +.unit-bar__link:hover, +.unit-bar__link:link, +.unit-bar__link:visited { + text-decoration: none; + color: currentColor; + padding: 5px; + max-height: 3.5rem +} + +.unit-bar__link:focus { + outline: 5px solid #f0ad00 +} + +.unit-bar__logo { + margin-right: 1rem; + line-height: 0 +} + +.unit-bar__logo>a { + padding-left: 0 +} + +.unit-bar__logo svg { + display: block; + width: 2.5rem; + height: 2rem +} + +.unit-bar__bar { + position: relative; + border-left: 1.4px solid currentColor; + margin-right: 1rem; + height: 2rem; + vertical-align: middle +} + +.unit-bar__name { + position: relative; + margin-right: 85px; + font-weight: 700; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + line-height: 0 +} + +.unit-bar__name>a:link { + position: relative; + top: -3px; + overflow: hidden; + text-overflow: ellipsis; + line-height: 1; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical +} + +.unit-bar__menu-buttons { + height: 100%; + position: absolute; + top: 0; + right: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + width: 5.125rem; + height: 100%; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + background-color: #512888 +} + +@media print, +screen and (min-width:64em) { + .unit-bar__menu-buttons { + display: none + } +} + +.unit-bar__menu-buttons svg { + width: 2.375rem; + height: 2.375rem; + fill: #fff +} + +.unit-bar__menu-buttons .brei-icon-close { + display: none +} + +.js-menu-open .unit-bar__menu-buttons .brei-icon-menu { + display: none +} + +.js-menu-open .unit-bar__menu-buttons .brei-icon-close { + display: block +} diff --git a/src/themes/krex/app/ksu-header/ksu-header.component.ts b/src/themes/krex/app/ksu-header/ksu-header.component.ts new file mode 100644 index 0000000000..99b6492834 --- /dev/null +++ b/src/themes/krex/app/ksu-header/ksu-header.component.ts @@ -0,0 +1,14 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-ksu-header', + imports: [], + templateUrl: './ksu-header.component.html', + styleUrls: ['./ksu-header.component.scss'], +}) +export class KsuHeaderComponent { + expandNavBar() { + const element = document.getElementById('top-navID'); + element?.classList.toggle('expanded'); + } +} diff --git a/src/themes/krex/app/login-page/login-page.component.html b/src/themes/krex/app/login-page/login-page.component.html new file mode 100644 index 0000000000..1eb5d3fa2a --- /dev/null +++ b/src/themes/krex/app/login-page/login-page.component.html @@ -0,0 +1,11 @@ +
+
+
+ +

{{"login.form.header" | translate}}

+ +
+
+
+ diff --git a/src/themes/krex/app/login-page/login-page.component.scss b/src/themes/krex/app/login-page/login-page.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/krex/app/login-page/login-page.component.ts b/src/themes/krex/app/login-page/login-page.component.ts new file mode 100644 index 0000000000..23edbd9693 --- /dev/null +++ b/src/themes/krex/app/login-page/login-page.component.ts @@ -0,0 +1,19 @@ +import { Component } from '@angular/core'; +import { TranslateModule } from '@ngx-translate/core'; +import { AuthMethodType } from 'src/app/core/auth/models/auth.method-type'; +import { LoginPageComponent as BaseComponent } from 'src/app/login-page/login-page.component'; +import { ThemedLogInComponent } from 'src/app/shared/log-in/themed-log-in.component'; + +@Component({ + selector: 'ds-themed-login-page', + imports: [ + ThemedLogInComponent, + TranslateModule, + ], + templateUrl: './login-page.component.html', + styleUrl: './login-page.component.scss', +}) +export class LoginPageComponent extends BaseComponent { + public readonly AuthMethodType = AuthMethodType; + public allowedAuthMethods: AuthMethodType[] = [AuthMethodType.Shibboleth]; +} diff --git a/src/themes/krex/app/navbar/navbar.component.html b/src/themes/krex/app/navbar/navbar.component.html new file mode 100644 index 0000000000..86bf3a0ff9 --- /dev/null +++ b/src/themes/krex/app/navbar/navbar.component.html @@ -0,0 +1,9 @@ +@if ((isMobile$ | async) && (isAuthenticated$ | async)) { + +} + diff --git a/src/themes/krex/app/navbar/navbar.component.scss b/src/themes/krex/app/navbar/navbar.component.scss new file mode 100644 index 0000000000..32c65c8c97 --- /dev/null +++ b/src/themes/krex/app/navbar/navbar.component.scss @@ -0,0 +1,3 @@ +:host { + +} diff --git a/src/themes/krex/app/navbar/navbar.component.ts b/src/themes/krex/app/navbar/navbar.component.ts new file mode 100644 index 0000000000..2861aea8f5 --- /dev/null +++ b/src/themes/krex/app/navbar/navbar.component.ts @@ -0,0 +1,32 @@ +import { + AsyncPipe, + NgClass, + NgComponentOutlet, +} from '@angular/common'; +import { Component } from '@angular/core'; +import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; + +import { NavbarComponent as BaseComponent } from '../../../../app/navbar/navbar.component'; +import { slideMobileNav } from '../../../../app/shared/animations/slide'; +import { ThemedUserMenuComponent } from '../../../../app/shared/auth-nav-menu/user-menu/themed-user-menu.component'; + +/** + * Component representing the public navbar + */ +@Component({ + selector: 'ds-themed-navbar', + styleUrls: ['./navbar.component.scss'], + templateUrl: './navbar.component.html', + animations: [slideMobileNav], + imports: [ + AsyncPipe, + NgbDropdownModule, + NgClass, + NgComponentOutlet, + ThemedUserMenuComponent, + TranslateModule, + ], +}) +export class NavbarComponent extends BaseComponent { +} diff --git a/src/themes/krex/app/shared/search-form/search-form.component.html b/src/themes/krex/app/shared/search-form/search-form.component.html new file mode 100644 index 0000000000..92d3279ff4 --- /dev/null +++ b/src/themes/krex/app/shared/search-form/search-form.component.html @@ -0,0 +1,22 @@ +
+
+
+
+ @if (showScopeSelector) { + + } + + + + +
+
+
+
diff --git a/src/themes/krex/app/shared/search-form/search-form.component.scss b/src/themes/krex/app/shared/search-form/search-form.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/krex/app/shared/search-form/search-form.component.spec.ts b/src/themes/krex/app/shared/search-form/search-form.component.spec.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/krex/app/shared/search-form/search-form.component.ts b/src/themes/krex/app/shared/search-form/search-form.component.ts new file mode 100644 index 0000000000..1219243e39 --- /dev/null +++ b/src/themes/krex/app/shared/search-form/search-form.component.ts @@ -0,0 +1,23 @@ +import { AsyncPipe } from '@angular/common'; +import { Component } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; +import { SearchFormComponent as BaseComponent } from 'src/app/shared/search-form/search-form.component'; +import { BrowserOnlyPipe } from 'src/app/shared/utils/browser-only.pipe'; + +@Component({ + selector: 'ds-themed-search-form', + imports: [ + AsyncPipe, + BrowserOnlyPipe, + FormsModule, + NgbTooltipModule, + TranslateModule, + ], + templateUrl: './search-form.component.html', + styleUrls: ['../../../../../app/shared/search-form/search-form.component.scss'], +}) +export class SearchFormComponent extends BaseComponent { + +} diff --git a/src/themes/krex/assets/fonts/.gitkeep b/src/themes/krex/assets/fonts/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/krex/assets/i18n/en.json5 b/src/themes/krex/assets/i18n/en.json5 new file mode 100644 index 0000000000..41ea7abb05 --- /dev/null +++ b/src/themes/krex/assets/i18n/en.json5 @@ -0,0 +1,85 @@ +{ + "curation-task.task.estaipsize.label": "Estimate Storage Space for AIP(s)", + "curation-task.task.readodometer.label": "Read Odometer", + "curation-task.task.transmitaip.label": "Transmit AIP(s) to Storage", + "curation-task.task.transmitsingleaip.label": "Transmit Single Object AIP to Storage", + "curation-task.task.verifyaip.label": "Verify AIP(s) exist in Storage", + "curation-task.task.fetchaip.label": "Fetch AIP(s) from Storage", + "curation-task.task.auditaip.label": "Audit against AIP(s)", + "curation-task.task.removeaip.label": "Remove AIP(s) from Storage", + "curation-task.task.restorefromaip.label": "Restore Missing Object(s) from AIP(s)", + "curation-task.task.replacewithaip.label": "Replace Existing Object(s) with AIP(s)", + "curation-task.task.restorekeepexisting.label": "Restore Missing Object(s) but Keep Existing Objects", + "curation-task.task.restoresinglefromaip.label": "Restore Single Object from AIP", + "curation-task.task.replacesinglewithaip.label": "Replace Single Object with AIP", + "admin.registries.metadata.description": "The metadata registry maintains a list of all metadata fields available in the repository. These fields may be divided amongst multiple schemas. However, K-REx requires the qualified Dublin Core schema.", + "dso-selector.set-scope.community.button": "Search all of K-REx", + "error-page.orcid.generic-error": "An error occurred during login via ORCID. Make sure you have shared your ORCID account email address with K-REx. If the error persists, contact the administrator", + "home.top-level-communities.head": "Communities in K-REx", + "info.feedback.info": "Thanks for sharing your feedback about the K-REx system. Your comments are appreciated!", + "login.form.header": "Please log in to K-REx", + "logout.form.header": "Log out from K-REx", + "menu.section.browse_global": "Browse K-REx", + "mydspace.breadcrumbs": "MyK-REx", + "mydspace.title": "MyK-REx", + "mydspace.search-form.placeholder": "Search in MyK-REx...", + "nav.browse.header": "All of K-REx", + "nav.mydspace": "MyK-REx", + "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to K-REx.", + "repository.title.prefix": "K-REx :: ", + "repository.title.prefixDSpace": "K-REx ::", + "search.form.scope.all": "All of K-REx", + "submission.import-external.back-to-my-dspace": "Back to MyK-REx", + "submission.import-external.page.hint": "Enter a query above to find items from the web to import in to K-REx.", + "login.form.shibboleth": "Log in with K-State eID", + "info.about.breadcrumbs": "About the K-State Research Exchange", + "menu.section.about": "About", + "info.about.head": "About the K-State Research Exchange", + "info.about.title": "About the K-State Research Exchange", + "info.policies.breadcrumbs": "Policies", + "info.policies.head": "K-REx Policies", + "info.policies.title": "K-REx Policies", + "menu.section.policies": "Policies", + "info.license.breadcrumbs": "K-REx License", + "info.license.head": "Standard K-REx license - Nonexclusive distribution", + "info.license.title": "K-REx License", + "title": "K-REx", + "info.guidelines.symbols.breadcrumbs": "ETDR Guidelines: Symbols", + "info.guidelines.symbols.head": "Guidelines for Entering a Title or Abstract That Contains Symbols", + "info.guidelines.symbols.title": "ETDR Guidelines: Symbols", + "info.guidelines.attachments.breadcrumbs": "ETDR Guidelines: Attachments", + "info.guidelines.attachments.head": "ETDR Guidelines: Attachments", + "info.guidelines.attachments.title": "ETDR Guidelines: Attachments", + "info.guidelines.authors.breadcrumbs": "ETDR Guidelines: Author Name", + "info.guidelines.authors.head": "ETDR Guidelines: Author Name", + "info.guidelines.authors.title": "ETDR Guidelines: Author Name", + "info.guidelines.keywords.breadcrumbs": "ETDR Guidelines: Keywords", + "info.guidelines.keywords.head": "ETDR Guidelines: Keywords", + "info.guidelines.keywords.title": "ETDR Guidelines: Keywords", + "menu.section.browse_global_communities_and_collections": "All communities and collections", + "browse.metadata.datepublished": "Published Date", + "browse.comcol.by.datepublished": "By Published Date", + "browse.metadata.datepublished.breadcrumbs": "Browse by Published Date", + "menu.section.browse_global_by_datepublished": "By Published Date", + "home.search-form.placeholder": "Search scholarly works, historical documents and images...", + "search.filters.filter.etdrAdvisor.head": "Major advisor", + "search.filters.filter.etdrAdvisor.placeholder": "Major advisor name", + "search.filters.filter.etdrAdvisor.label": "Search major advisor name", + "search.filters.applied.f.etdrAdvisor": "Major advisor", + "search.filters.filter.etdrDepartment.head": "Degree Awarding Department", + "search.filters.filter.etdrDepartment.placeholder": "Degree Awarding Department", + "search.filters.filter.etdrDepartment.label": "Search Degree Awarding Department", + "search.filters.applied.f.etdrDepartment": "Degree Awarding Department", + "menu.section.navigate": "Communities and collections", + "menu.section.navigate.search_all": "Search all content", + "menu.section.navigate.digital_archives": "K-State Libraries Digital Collections", + "menu.section.navigate.etdr": "Graduate Theses, Dissertations, and Reports", + "menu.section.navigate.rscad": "Research, Scholarly and Creative Activities, and Discovery Works", + "submission.sections.submit.progressbar.describe.stepone.etdpageone.authors.hint": "Enter your name in the same form as it appears on your title page. Use standard capitalization; do not enter your name in all capital letters. For more information on how to enter names, follow the steps here.", + "submission.sections.submit.progressbar.describe.stepone.etdpageone.title.hint": "Copy and paste the title of your ETDR. If your title contains mathematical operators or other symbols that do not display properly within the Title input box, follow the steps here.", + "submission.sections.submit.progressbar.describe.stepone.etdpageone.professors.hint": "Select your major professor(s). If you have co-major professors, hold down the Ctrl key and left click to select multiple names. If your major professor is not listed, select \"Major Professor Not Listed\".", + "submission.sections.submit.progressbar.describe.stepone.etdpageone.language.hint": "Select the language of the main content of the item. If the language does not appear in the list below, please select 'Other'. If the content does not really have a language (for example, if it is a dataset or an image) pleaseselect 'N/A'.", + "submission.sections.submit.progressbar.describe.stepone.etdpagetwo.keywords.hint": "Enter from 1 to 6 keywords for your ETDR. See here for selecting keywords. Select the \"Add\" button after entering a keyword or keyword phrase.", + "submission.sections.submit.progressbar.describe.stepone.etdpagetwo.symbols.hint": "Copy and paste the text of your abstract here. Do not include the heading \"Abstract.\" If your abstract contains mathematical operators or other symbols that do not display properly within the Abstract input box, follow the steps here.", + "submission.sections.submit.progressbar.describe.stepone.etdpagetwo.sponsorship.hint": "(Optional) Enter the names of agencies, if any, that helped to fund your research. Do not use acronyms or abbreviations. If you did not have a source of funding for your research, leave this space blank.", +} diff --git a/src/themes/krex/assets/images/.gitkeep b/src/themes/krex/assets/images/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/krex/assets/images/1200px-Kansas_State_University_seal.png b/src/themes/krex/assets/images/1200px-Kansas_State_University_seal.png new file mode 100644 index 0000000000..b22444425b Binary files /dev/null and b/src/themes/krex/assets/images/1200px-Kansas_State_University_seal.png differ diff --git a/src/themes/krex/assets/images/KREx_sidebar.jpg b/src/themes/krex/assets/images/KREx_sidebar.jpg new file mode 100644 index 0000000000..753d1576e1 Binary files /dev/null and b/src/themes/krex/assets/images/KREx_sidebar.jpg differ diff --git a/src/themes/krex/assets/images/banner-half.jpg b/src/themes/krex/assets/images/banner-half.jpg new file mode 100644 index 0000000000..b37534e369 Binary files /dev/null and b/src/themes/krex/assets/images/banner-half.jpg differ diff --git a/src/themes/krex/assets/images/banner-half.webp b/src/themes/krex/assets/images/banner-half.webp new file mode 100644 index 0000000000..e2272037bf Binary files /dev/null and b/src/themes/krex/assets/images/banner-half.webp differ diff --git a/src/themes/krex/assets/images/banner-tall.jpg b/src/themes/krex/assets/images/banner-tall.jpg new file mode 100644 index 0000000000..d310311296 Binary files /dev/null and b/src/themes/krex/assets/images/banner-tall.jpg differ diff --git a/src/themes/krex/assets/images/banner-tall.webp b/src/themes/krex/assets/images/banner-tall.webp new file mode 100644 index 0000000000..a4ec97f2bc Binary files /dev/null and b/src/themes/krex/assets/images/banner-tall.webp differ diff --git a/src/themes/krex/assets/images/banner.jpg b/src/themes/krex/assets/images/banner.jpg new file mode 100644 index 0000000000..ea7f4701c8 Binary files /dev/null and b/src/themes/krex/assets/images/banner.jpg differ diff --git a/src/themes/krex/assets/images/banner.webp b/src/themes/krex/assets/images/banner.webp new file mode 100644 index 0000000000..437c89d075 Binary files /dev/null and b/src/themes/krex/assets/images/banner.webp differ diff --git a/src/themes/krex/assets/images/favicons/favicon.ico b/src/themes/krex/assets/images/favicons/favicon.ico new file mode 100644 index 0000000000..53458d5640 Binary files /dev/null and b/src/themes/krex/assets/images/favicons/favicon.ico differ diff --git a/src/themes/krex/assets/images/research-exchange_purple-bkg.jpg b/src/themes/krex/assets/images/research-exchange_purple-bkg.jpg new file mode 100644 index 0000000000..68a6ac68a9 Binary files /dev/null and b/src/themes/krex/assets/images/research-exchange_purple-bkg.jpg differ diff --git a/src/themes/krex/eager-theme.module.ts b/src/themes/krex/eager-theme.module.ts new file mode 100644 index 0000000000..d5df2bf8aa --- /dev/null +++ b/src/themes/krex/eager-theme.module.ts @@ -0,0 +1,57 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +import { RootModule } from '../../app/root.module'; +import { FooterComponent } from './app/footer/footer.component'; +import { HeaderComponent } from './app/header/header.component'; +import { HeaderNavbarWrapperComponent } from './app/header-nav-wrapper/header-navbar-wrapper.component'; +import { HomeNewsComponent } from './app/home-page/home-news/home-news.component'; +import { HomePageComponent } from './app/home-page/home-page.component'; +import { LoginPageComponent } from './app/login-page/login-page.component'; +import { NavbarComponent } from './app/navbar/navbar.component'; +import { SearchFormComponent } from './app/shared/search-form/search-form.component'; +import { KsuEnvironmentBannerComponent } from './app/ksu-environment-banner/ksu-environment-banner.component'; +import { KsuHeaderComponent } from './app/ksu-header/ksu-header.component'; +import { KsuFooterComponent } from './app/ksu-footer/ksu-footer.component'; + + +/** + * 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, + KsuEnvironmentBannerComponent, + KsuHeaderComponent, + FooterComponent, + KsuFooterComponent, + SearchFormComponent, +]; + +@NgModule({ + imports: [ + CommonModule, + RootModule, + ...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/krex/lazy-theme.module.ts b/src/themes/krex/lazy-theme.module.ts new file mode 100644 index 0000000000..dd6ba3307e --- /dev/null +++ b/src/themes/krex/lazy-theme.module.ts @@ -0,0 +1,53 @@ +import { DragDropModule } from '@angular/cdk/drag-drop'; +import { CommonModule } from '@angular/common'; +import { + provideHttpClient, + withInterceptorsFromDi, +} from '@angular/common/http'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { StoreRouterConnectingModule } from '@ngrx/router-store'; +import { StoreModule } from '@ngrx/store'; +import { TranslateModule } from '@ngx-translate/core'; +import { ScrollToModule } from '@nicky-lenaers/ngx-scroll-to'; + +import { RootModule } from '../../app/root.module'; + +import { KsuHomeBelowSearchBarComponent } from './app/home-page/ksu-home-below-search-bar/ksu-home-below-search-bar.component'; +import { LoginPageComponent } from './app/login-page/login-page.component'; +import { HomePageComponent } from './app/home-page/home-page.component'; + +const DECLARATIONS = [ +]; + +@NgModule({ + declarations: DECLARATIONS, + imports: [ + RootModule, + CommonModule, + DragDropModule, + FormsModule, + NgbModule, + RouterModule, + ScrollToModule, + StoreModule, + StoreRouterConnectingModule, + TranslateModule, + FormsModule, + ], + providers: [ + provideHttpClient(withInterceptorsFromDi()), + ], +}) + +/** + * 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/krex/styles/_global-styles.scss b/src/themes/krex/styles/_global-styles.scss new file mode 100644 index 0000000000..fd235cf879 --- /dev/null +++ b/src/themes/krex/styles/_global-styles.scss @@ -0,0 +1,27 @@ +// Add any global css for the theme here + +// imports the base global style +@import '../../../styles/_global-styles.scss'; + +.facet-filter, .setting-option, .advanced-search { + 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; + } + + .bg-secondary { + background-color: var(--bs-primary); + } + + a { + color: $brand-primary; + } + + h4, .h4 { + font-size: 1.1rem + } +} diff --git a/src/themes/krex/styles/_theme_css_variable_overrides.scss b/src/themes/krex/styles/_theme_css_variable_overrides.scss new file mode 100644 index 0000000000..7b0e70f7b6 --- /dev/null +++ b/src/themes/krex/styles/_theme_css_variable_overrides.scss @@ -0,0 +1,36 @@ +// Override or add CSS variables for your theme here + +:root { + + @include media-breakpoint-up(md) { + --ds-header-logo-height: 40px; + --ds-header-height: 80px; + } + @include media-breakpoint-down(sm) { + --ds-header-logo-height: 50px; + --ds-header-height: 90px; + } + + --ds-banner-text-background: rgba(0, 0, 0, 0.58); + --ds-banner-background-gradient-width: 300px; + + --ds-header-navbar-border-bottom-height: 5px; + + /* set the next two properties as `--ds-header-navbar-border-bottom-*` + in order to keep the bottom border of the header when navbar is expanded */ + + --ds-expandable-navbar-border-top-color: #{$white}; + --ds-expandable-navbar-border-top-height: 0; + --ds-expandable-navbar-padding-top: 0; + + --ds-item-page-img-field-default-inline-height: 24px; + --ds-item-page-img-field-ror-inline-height: var(--ds-item-page-img-field-default-inline-height); + + + /* K-REx Changes */ + --ds-header-navbar-border-bottom-color: #{$brand-primary}; + --ds-navbar-link-color: #{$brand-primary}; + --ds-navbar-link-color-hover: #{darken($brand-primary, 15%)}; + --ds-breadcrumb-link-color: #{$brand-primary}; +} + diff --git a/src/themes/krex/styles/_theme_sass_variable_overrides.scss b/src/themes/krex/styles/_theme_sass_variable_overrides.scss new file mode 100644 index 0000000000..048f7490da --- /dev/null +++ b/src/themes/krex/styles/_theme_sass_variable_overrides.scss @@ -0,0 +1,99 @@ +// 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. + +// When this file is going to be compiled, internal Bootstrap variables won't have been declared yet, +// therefore if you want to use any Bootstrap variable you also need to declare it here. + +// All SASS variables from the base theme are also included here. Do not use the '!default' flag +// here if you want to override them. + + +/*** FONT FAMILIES ***/ + +@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'); + +// // K-State Fonts +@import url('https://use.typekit.net/qra4olf.css'); + +// $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"; +// K-State Font Family +$font-family-sans-serif: myriad-pro, "Open Sans", Helvetica, Arial, sans-serif; + + + +/*** SEMANTIC COLOR SCHEME ***/ + +// Gray scale (uncomment the variables that you want to override or that you need to use in this file) +//$white: #fff; +//$gray-100: #f8f9fa; +//$gray-200: #e9ecef; +//$gray-300: #dee2e6; +//$gray-400: #ced4da; +//$gray-500: #adb5bd; +//$gray-600: #6c757d; +//$gray-700: #495057; +//$gray-800: #343a40; +//$gray-900: #212529; +//$black: #000; + +// Other colors (uncomment the variables that you want to override or that you need to use in this file) +//$blue: #007bff !default; +//$indigo: #6610f2 !default; +//$purple: #6f42c1 !default; +//$pink: #e83e8c !default; +//$red: #dc3545 !default; +//$orange: #fd7e14 !default; +//$yellow: #ffc107 !default; +//$green: #28a745 !default; +//$teal: #20c997 !default; +//$cyan: #17a2b8 !default; + +// Define or override other colors here +// ... +// K-State Purple +$brand-primary: #512888; +$kstate-purple: $brand-primary; + +// Override semantic colors here +$primary: #512888; // Gray +$secondary: #495057; // As Bootstrap $gray-700 +$success: #92c642; // Lime +$info: #1e6f90; // Light blue +$warning: #ec9433; // Orange +$danger: #cf4444; // Red +$light: #f8f9fa; // As Bootstrap $gray-100 +$dark: #43515f; // Dark blue + +// Add new semantic colors here (you don't need to add existing semantic colors) +$theme-custom-semantic-colors: ( + kstate-purple: $kstate-purple, +); + +/*** OTHER BOOTSTRAP VARIABLES ***/ + +$min-contrast-ratio: 2.06 !default; + +$body-color: #343a40; // As Bootstrap $gray-800 + +$link-color: $brand-primary; // K-state Purple +$link-decoration: none; +$link-hover-color: darken($link-color, 15%); +$link-hover-decoration: underline; + +$table-accent-bg: #f8f9fa; // As Bootstrap $gray-100 +$table-hover-bg: #ced4da; // As Bootstrap $gray-400 + +$navbar-dark-color: #fff; + + +/*** CUSTOM DSPACE VARIABLES ***/ + +$ds-home-news-link-color: #D2FC93; +$ds-header-navbar-border-bottom-color: #92c642; + +$ds-breadcrumb-link-color: #154E66 !default; +$ds-breadcrumb-link-active-color: #040D11 !default; + +$font-size-base: 1.125rem; // KSU Override \ No newline at end of file diff --git a/src/themes/krex/styles/theme.scss b/src/themes/krex/styles/theme.scss new file mode 100644 index 0000000000..dfa8274cf6 --- /dev/null +++ b/src/themes/krex/styles/theme.scss @@ -0,0 +1,15 @@ +// 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'; + +$theme-colors: map-merge($theme-colors, $theme-custom-semantic-colors); + +@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';