Theme Cleanup (#1089)

* Fixed e-ink theme not properly applying correctly

* Fixed some seed changes. Changed card checkboxes to use our themed ones

* Fixed recently added carousel not going to recently-added page

* Fixed an issue where no results found would show when searching for a library name

* Cleaned up list a bit, typeahead dropdown still needs work

* Added a TODO to streamline series-card component

* Removed ng-lazyload-image module since we don't use it. We use lazysizes

* Darken card on hover

* Fixing accordion focus style

* ux pass updates

- Fixed typeahead width
- Fixed changelog download buttons
- Fixed a select
- Fixed various input box-shadows
- Fixed all anchors to only have underline on hover
- Added navtab hover and active effects

* more ux pass

- Fixed spacing on theme cards
- Fixed some light theme issues
- Exposed text-muted-color for theme card subtitle color

* UX pass fixes

- Changed back to bright green for primary on dark theme
- Changed fa icon to black on e-ink

* Merged changelog component

* Fixed anchor buttons text decoration

* Changed nav tabs to have a background color instead of open active state

* When user is not authenticated, make sure we set default theme (dark)

* Cleanup on carousel

* Updated Users tab to use small buttons with icons to align with Library tab

* Cleaned up brand to not underline, removed default link underline on hover in dropdown and pill tabs

* Fixed collection detail posters not rendering

Co-authored-by: Robbie Davis <robbie@therobbiedavis.com>
This commit is contained in:
Joseph Milazzo 2022-02-18 07:03:19 -08:00 committed by GitHub
parent 70b85e0668
commit 4bd9f243f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
51 changed files with 279 additions and 163 deletions

View File

@ -46,7 +46,7 @@ namespace API.Data
Name = "E-Ink", Name = "E-Ink",
NormalizedName = Parser.Parser.Normalize("E-Ink"), NormalizedName = Parser.Parser.Normalize("E-Ink"),
Provider = ThemeProvider.System, Provider = ThemeProvider.System,
FileName = "eink.scss", FileName = "e-ink.scss",
IsDefault = false, IsDefault = false,
}, },
}; };

View File

@ -9173,14 +9173,6 @@
"tslib": "^2.0.0" "tslib": "^2.0.0"
} }
}, },
"ng-lazyload-image": {
"version": "9.1.2",
"resolved": "https://registry.npmjs.org/ng-lazyload-image/-/ng-lazyload-image-9.1.2.tgz",
"integrity": "sha512-E5oz5HdTRtYW/TH+jceT4VMcRXKdX9Ut82eEwt2K0/bFAXKU14HluCFa8cMidPBgSa08Mlf+gmoKCTvAfUPgag==",
"requires": {
"tslib": "^2.3.0"
}
},
"ngx-file-drop": { "ngx-file-drop": {
"version": "13.0.0", "version": "13.0.0",
"resolved": "https://registry.npmjs.org/ngx-file-drop/-/ngx-file-drop-13.0.0.tgz", "resolved": "https://registry.npmjs.org/ngx-file-drop/-/ngx-file-drop-13.0.0.tgz",

View File

@ -38,7 +38,6 @@
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"lazysizes": "^5.3.2", "lazysizes": "^5.3.2",
"ng-circle-progress": "^1.6.0", "ng-circle-progress": "^1.6.0",
"ng-lazyload-image": "^9.1.2",
"ngx-file-drop": "^13.0.0", "ngx-file-drop": "^13.0.0",
"ngx-toastr": "^14.2.1", "ngx-toastr": "^14.2.1",
"rxjs": "~7.5.4", "rxjs": "~7.5.4",

View File

@ -1,4 +0,0 @@
export interface RefreshMetadataEvent {
libraryId: number;
seriesId: number;
}

View File

@ -1,5 +1,5 @@
import { Pipe, PipeTransform } from '@angular/core'; import { Pipe, PipeTransform } from '@angular/core';
import { PersonRole } from './_models/person'; import { PersonRole } from '../_models/person';
@Pipe({ @Pipe({
name: 'personRole' name: 'personRole'

View File

@ -1,5 +1,5 @@
import { Pipe, PipeTransform } from '@angular/core'; import { Pipe, PipeTransform } from '@angular/core';
import { PublicationStatus } from './_models/metadata/publication-status'; import { PublicationStatus } from '../_models/metadata/publication-status';
@Pipe({ @Pipe({
name: 'publicationStatus' name: 'publicationStatus'

View File

@ -84,6 +84,8 @@ export class AccountService implements OnDestroy {
} else { } else {
this.themeService.setTheme(this.themeService.defaultTheme); this.themeService.setTheme(this.themeService.defaultTheme);
} }
} else {
this.themeService.setTheme(this.themeService.defaultTheme);
} }
this.currentUserSource.next(user); this.currentUserSource.next(user);

View File

@ -149,6 +149,7 @@ export class SeriesService {
} }
scan(libraryId: number, seriesId: number) { scan(libraryId: number, seriesId: number) {
// TODO: Pipe and put a toaster up: this.toastr.info('Scan queued for ' + series.name);
return this.httpClient.post(this.baseUrl + 'series/scan', {libraryId: libraryId, seriesId: seriesId}); return this.httpClient.post(this.baseUrl + 'series/scan', {libraryId: libraryId, seriesId: seriesId});
} }

View File

@ -8,8 +8,12 @@
</h4> </h4>
<h6 class="card-subtitle mb-2 text-muted">Published: {{update.publishDate | date: 'short'}}</h6> <h6 class="card-subtitle mb-2 text-muted">Published: {{update.publishDate | date: 'short'}}</h6>
<pre class="card-text update-body" [innerHtml]="update.updateBody | safeHtml"></pre>
<a *ngIf="!update.isDocker" href="{{update.updateUrl}}" class="btn btn-{{indx === 0 ? 'primary' : 'secondary'}} float-end" target="_blank">Download</a> <pre class="card-text update-body">
<app-read-more class="float-end" [text]="update.updateBody" [maxLength]="500"></app-read-more>
</pre>
<a *ngIf="!update.isDocker && update.updateVersion === installedVersion" href="{{update.updateUrl}}" class="btn disabled btn-{{indx === 0 ? 'primary' : 'secondary'}} float-end" target="_blank">Installed</a>
<a *ngIf="!update.isDocker && update.updateVersion !== installedVersion" href="{{update.updateUrl}}" class="btn btn-{{indx === 0 ? 'primary' : 'secondary'}} float-end" target="_blank">Download</a>
</div> </div>
</div> </div>
</ng-container> </ng-container>

View File

@ -45,9 +45,9 @@
<span class="visually-hidden">(You)</span> <span class="visually-hidden">(You)</span>
</span> </span>
<div class="float-end" *ngIf="canEditMember(member)"> <div class="float-end" *ngIf="canEditMember(member)">
<button class="btn btn-danger me-2" (click)="deleteUser(member)" placement="top" ngbTooltip="Delete User" attr.aria-label="Delete User {{member.username | titlecase}}"><i class="fa fa-trash" aria-hidden="true"></i></button> <button class="btn btn-danger btn-sm me-2" (click)="deleteUser(member)" placement="top" ngbTooltip="Delete User" attr.aria-label="Delete User {{member.username | titlecase}}"><i class="fa fa-trash" aria-hidden="true"></i></button>
<button class="btn btn-secondary me-2" (click)="updatePassword(member)" placement="top" ngbTooltip="Change Password" attr.aria-label="Change Password for {{member.username | titlecase}}"><i class="fa fa-key" aria-hidden="true"></i></button> <button class="btn btn-secondary btn-sm me-2" (click)="updatePassword(member)" placement="top" ngbTooltip="Change Password" attr.aria-label="Change Password for {{member.username | titlecase}}"><i class="fa fa-key" aria-hidden="true"></i></button>
<button class="btn btn-primary" (click)="openEditUser(member)" placement="top" ngbTooltip="Edit" attr.aria-label="Edit {{member.username | titlecase}}"><i class="fa fa-pen" aria-hidden="true"></i></button> <button class="btn btn-primary btn-sm" (click)="openEditUser(member)" placement="top" ngbTooltip="Edit" attr.aria-label="Edit {{member.username | titlecase}}"><i class="fa fa-pen" aria-hidden="true"></i></button>
</div> </div>
</h4> </h4>
<div>Last Active: <div>Last Active:

View File

@ -31,12 +31,12 @@ import { ReadingListModule } from './reading-list/reading-list.module';
import { SAVER, getSaver } from './shared/_providers/saver.provider'; import { SAVER, getSaver } from './shared/_providers/saver.provider';
import { ConfigData } from './_models/config-data'; import { ConfigData } from './_models/config-data';
import { NavEventsToggleComponent } from './nav-events-toggle/nav-events-toggle.component'; import { NavEventsToggleComponent } from './nav-events-toggle/nav-events-toggle.component';
import { PersonRolePipe } from './person-role.pipe'; import { PersonRolePipe } from './_pipes/person-role.pipe';
import { SeriesMetadataDetailComponent } from './series-metadata-detail/series-metadata-detail.component'; import { SeriesMetadataDetailComponent } from './series-metadata-detail/series-metadata-detail.component';
import { AllSeriesComponent } from './all-series/all-series.component'; import { AllSeriesComponent } from './all-series/all-series.component';
import { PublicationStatusPipe } from './publication-status.pipe';
import { RegistrationModule } from './registration/registration.module'; import { RegistrationModule } from './registration/registration.module';
import { GroupedTypeaheadComponent } from './grouped-typeahead/grouped-typeahead.component'; import { GroupedTypeaheadComponent } from './grouped-typeahead/grouped-typeahead.component';
import { PublicationStatusPipe } from './_pipes/publication-status.pipe';
import { ThemeTestComponent } from './theme-test/theme-test.component'; import { ThemeTestComponent } from './theme-test/theme-test.component';
@ -71,7 +71,7 @@ import { ThemeTestComponent } from './theme-test/theme-test.component';
NgbDropdownModule, // Nav NgbDropdownModule, // Nav
NgbPopoverModule, // Nav Events toggle NgbPopoverModule, // Nav Events toggle
NgbRatingModule, // Series Detail NgbRatingModule, // Series Detail & Filter
NgbNavModule, NgbNavModule,
NgbPaginationModule, NgbPaginationModule,
@ -85,6 +85,7 @@ import { ThemeTestComponent } from './theme-test/theme-test.component';
ReadingListModule, ReadingListModule,
RegistrationModule, RegistrationModule,
ToastrModule.forRoot({ ToastrModule.forRoot({
positionClass: 'toast-bottom-right', positionClass: 'toast-bottom-right',
preventDuplicates: true, preventDuplicates: true,

View File

@ -335,7 +335,7 @@
<i class="fa fa-arrow-down" title="Descending"></i> <i class="fa fa-arrow-down" title="Descending"></i>
</ng-template> </ng-template>
</button> </button>
<select id="sort-options" class="form-control" formControlName="sortField" style="height: 38px;"> <select id="sort-options" class="form-select" formControlName="sortField" style="height: 38px;">
<option [value]="SortField.SortName">Sort Name</option> <option [value]="SortField.SortName">Sort Name</option>
<option [value]="SortField.Created">Created</option> <option [value]="SortField.Created">Created</option>
<option [value]="SortField.LastModified">Last Modified</option> <option [value]="SortField.LastModified">Last Modified</option>

View File

@ -23,7 +23,7 @@
<div class="not-read-badge" *ngIf="read === 0 && total > 0"></div> <div class="not-read-badge" *ngIf="read === 0 && total > 0"></div>
<div class="bulk-mode {{bulkSelectionService.hasSelections() ? 'always-show' : ''}}" (click)="handleSelection($event)" *ngIf="allowSelection"> <div class="bulk-mode {{bulkSelectionService.hasSelections() ? 'always-show' : ''}}" (click)="handleSelection($event)" *ngIf="allowSelection">
<input type="checkbox" attr.aria-labelledby="{{title}}_{{entity?.id}}" [ngModel]="selected" [ngModelOptions]="{standalone: true}"> <input type="checkbox" class="form-check-input" attr.aria-labelledby="{{title}}_{{entity?.id}}" [ngModel]="selected" [ngModelOptions]="{standalone: true}">
</div> </div>
<div class="count" *ngIf="count > 1"> <div class="count" *ngIf="count > 1">
@ -34,7 +34,7 @@
<div class="card-body" *ngIf="title.length > 0 || actions.length > 0"> <div class="card-body" *ngIf="title.length > 0 || actions.length > 0">
<div> <div>
<span class="card-title" placement="top" id="{{title}}_{{entity?.id}}" [ngbTooltip]="tooltipTitle" (click)="handleClick()" tabindex="0"> <span class="card-title" placement="top" id="{{title}}_{{entity?.id}}" [ngbTooltip]="tooltipTitle" (click)="handleClick($event)" tabindex="0">
<span *ngIf="isPromoted()"> <span *ngIf="isPromoted()">
<i class="fa fa-angle-double-up" aria-hidden="true"></i> <i class="fa fa-angle-double-up" aria-hidden="true"></i>
<span class="visually-hidden">(promoted)</span> <span class="visually-hidden">(promoted)</span>

View File

@ -97,6 +97,7 @@ $image-width: 160px;
input[type="checkbox"] { input[type="checkbox"] {
width: 20px; width: 20px;
height: 20px; height: 20px;
color: var(--checkbox-bg-color);
} }
} }
@ -157,9 +158,5 @@ $image-width: 160px;
width: 100%; width: 100%;
height: 230px; height: 230px;
z-index: 10; z-index: 10;
transition: opacity 0.2s; transition: all 0.2s;
}
.card-overlay:hover {
opacity: 0;
} }

View File

@ -7,7 +7,6 @@ import { EditSeriesModalComponent } from './_modals/edit-series-modal/edit-serie
import { EditCollectionTagsComponent } from './_modals/edit-collection-tags/edit-collection-tags.component'; import { EditCollectionTagsComponent } from './_modals/edit-collection-tags/edit-collection-tags.component';
import { ChangeCoverImageModalComponent } from './_modals/change-cover-image/change-cover-image-modal.component'; import { ChangeCoverImageModalComponent } from './_modals/change-cover-image/change-cover-image-modal.component';
import { BookmarksModalComponent } from './_modals/bookmarks-modal/bookmarks-modal.component'; import { BookmarksModalComponent } from './_modals/bookmarks-modal/bookmarks-modal.component';
import { LazyLoadImageModule } from 'ng-lazyload-image';
import { NgbTooltipModule, NgbCollapseModule, NgbPaginationModule, NgbDropdownModule, NgbProgressbarModule, NgbNavModule, NgbRatingModule } from '@ng-bootstrap/ng-bootstrap'; import { NgbTooltipModule, NgbCollapseModule, NgbPaginationModule, NgbDropdownModule, NgbProgressbarModule, NgbNavModule, NgbRatingModule } from '@ng-bootstrap/ng-bootstrap';
import { CardActionablesComponent } from './card-item/card-actionables/card-actionables.component'; import { CardActionablesComponent } from './card-item/card-actionables/card-actionables.component';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@ -61,7 +60,6 @@ import { BookmarkComponent } from './bookmark/bookmark.component';
NgbRatingModule, NgbRatingModule,
NgbNavModule, //Series Detail NgbNavModule, //Series Detail
LazyLoadImageModule,
NgbPaginationModule, // CardDetailLayoutComponent NgbPaginationModule, // CardDetailLayoutComponent
NgbDropdownModule, NgbDropdownModule,
NgbProgressbarModule, NgbProgressbarModule,

View File

@ -2,7 +2,7 @@ import { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output }
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { ToastrService } from 'ngx-toastr'; import { ToastrService } from 'ngx-toastr';
import { take, takeUntil, takeWhile } from 'rxjs/operators'; import { take } from 'rxjs/operators';
import { Series } from 'src/app/_models/series'; import { Series } from 'src/app/_models/series';
import { AccountService } from 'src/app/_services/account.service'; import { AccountService } from 'src/app/_services/account.service';
import { ImageService } from 'src/app/_services/image.service'; import { ImageService } from 'src/app/_services/image.service';
@ -11,7 +11,6 @@ import { SeriesService } from 'src/app/_services/series.service';
import { ConfirmService } from 'src/app/shared/confirm.service'; import { ConfirmService } from 'src/app/shared/confirm.service';
import { ActionService } from 'src/app/_services/action.service'; import { ActionService } from 'src/app/_services/action.service';
import { EditSeriesModalComponent } from '../_modals/edit-series-modal/edit-series-modal.component'; import { EditSeriesModalComponent } from '../_modals/edit-series-modal/edit-series-modal.component';
import { RefreshMetadataEvent } from 'src/app/_models/events/refresh-metadata-event';
import { MessageHubService } from 'src/app/_services/message-hub.service'; import { MessageHubService } from 'src/app/_services/message-hub.service';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';

View File

@ -8,8 +8,8 @@
</div> </div>
<div> <div>
<swiper <swiper
#swiper
[slidesPerView]="'auto'" [slidesPerView]="'auto'"
(init)="onSwiper($event)"
[freeMode]="true"> [freeMode]="true">
<ng-template *ngFor="let item of items; index as i;" swiperSlide> <ng-template *ngFor="let item of items; index as i;" swiperSlide>
<ng-container [ngTemplateOutlet]="carouselItemTemplate" [ngTemplateOutletContext]="{ $implicit: item, idx: i }"></ng-container> <ng-container [ngTemplateOutlet]="carouselItemTemplate" [ngTemplateOutletContext]="{ $implicit: item, idx: i }"></ng-container>

View File

@ -16,7 +16,6 @@ export class CarouselReelComponent implements OnInit {
swiper: Swiper | undefined; swiper: Swiper | undefined;
trackByIdentity: (index: number, item: any) => string; trackByIdentity: (index: number, item: any) => string;
get isEnd() { get isEnd() {

View File

@ -1,7 +1,7 @@
<div class="container-fluid" *ngIf="collectionTag !== undefined" style="padding-top: 10px"> <div class="container-fluid" *ngIf="collectionTag !== undefined" style="padding-top: 10px">
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-2 col-xs-4 col-sm-6"> <div class="col-md-2 col-xs-4 col-sm-6 poster">
<app-image class="poster" maxWidth="481px" [imageUrl]="tagImage"></app-image> <app-image maxWidth="481px" [imageUrl]="tagImage"></app-image>
</div> </div>
<div class="col-md-10 col-xs-8 col-sm-6"> <div class="col-md-10 col-xs-8 col-sm-6">
<div class="row g-0"> <div class="row g-0">

View File

@ -1,19 +1,15 @@
@import '~bootstrap/scss/mixins/breakpoints';
.poster { .poster {
width: 100%; width: 100%;
max-height: 481px; max-width: 300px;
} }
@media(max-width: var(--grid-breakpoints-sm)) {
// Including breakpoint has issue with resovling variable, so copying gridpoints here
@include media-breakpoint-down(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)) {
.poster { .poster {
display: none; display: none;
} }
} }
@include media-breakpoint-down(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)) { @media(max-width: var(--grid-breakpoints-sm)) {
.read-btn--text { .read-btn--text {
display: none; display: none;
} }

View File

@ -85,7 +85,8 @@
</ul> </ul>
</ng-container> </ng-container>
<ng-container *ngIf="noResultsTemplate != undefined && searchTerm.length > 0 && !grouppedData.persons.length && !grouppedData.collections.length && !grouppedData.series.length && !grouppedData.persons.length && !grouppedData.tags.length && !grouppedData.genres.length"> <ng-container *ngIf="noResultsTemplate != undefined && searchTerm.length > 0 && !grouppedData.persons.length && !grouppedData.collections.length
&& !grouppedData.series.length && !grouppedData.persons.length && !grouppedData.tags.length && !grouppedData.genres.length && !grouppedData.libraries.length">
<ul class="list-group results"> <ul class="list-group results">
<li class="list-group-item"> <li class="list-group-item">
<ng-container [ngTemplateOutlet]="noResultsTemplate"></ng-container> <ng-container [ngTemplateOutlet]="noResultsTemplate"></ng-container>

View File

@ -42,20 +42,6 @@ form {
display: flex; display: flex;
} }
// .close {
// cursor: pointer;
// position: absolute;
// top: 7px;
// right: 10px;
// }
// @media only screen and (max-width:650px) {
// .close {
// top: 50%;
// transform: translate(0, -60%);
// }
// }
input { input {
outline: 0 !important; outline: 0 !important;
@ -67,7 +53,7 @@ form {
text-indent: 0 !important; text-indent: 0 !important;
line-height: inherit !important; line-height: inherit !important;
box-shadow: none !important; box-shadow: none !important;
width: 200px; width: 300px;
transition-property: all; transition-property: all;
transition-duration: 0.3s; transition-duration: 0.3s;
display: block; display: block;

View File

@ -25,7 +25,7 @@
</ng-template> </ng-template>
</app-carousel-reel> </app-carousel-reel>
<app-carousel-reel [items]="recentlyAddedChapters" title="Recently Added"> <app-carousel-reel [items]="recentlyAddedChapters" title="Recently Added" (sectionClick)="handleSectionClick($event)">
<ng-template #carouselItem let-item let-position="idx"> <ng-template #carouselItem let-item let-position="idx">
<app-card-item [entity]="item" [title]="item.title" [subtitle]="item.seriesName" [imageUrl]="imageService.getRecentlyAddedItem(item)" <app-card-item [entity]="item" [title]="item.title" [subtitle]="item.seriesName" [imageUrl]="imageService.getRecentlyAddedItem(item)"
[supressArchiveWarning]="true" (clicked)="handleRecentlyAddedChapterClick(item)"></app-card-item> [supressArchiveWarning]="true" (clicked)="handleRecentlyAddedChapterClick(item)"></app-card-item>

View File

@ -3,7 +3,6 @@ import { Title } from '@angular/platform-browser';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { ReplaySubject, Subject } from 'rxjs'; import { ReplaySubject, Subject } from 'rxjs';
import { debounceTime, take, takeUntil } from 'rxjs/operators'; import { debounceTime, take, takeUntil } from 'rxjs/operators';
import { RefreshMetadataEvent } from '../_models/events/refresh-metadata-event';
import { SeriesAddedEvent } from '../_models/events/series-added-event'; import { SeriesAddedEvent } from '../_models/events/series-added-event';
import { SeriesRemovedEvent } from '../_models/events/series-removed-event'; import { SeriesRemovedEvent } from '../_models/events/series-removed-event';
import { Library } from '../_models/library'; import { Library } from '../_models/library';

View File

@ -39,6 +39,10 @@
font-family: var(--brand-font-family); font-family: var(--brand-font-family);
font-weight: bold; font-weight: bold;
&:hover {
text-decoration: none;
}
.logo { .logo {
max-height: 28px; max-height: 28px;
vertical-align: top; vertical-align: top;

View File

@ -15,7 +15,6 @@ import { DownloadService } from '../shared/_services/download.service';
import { KEY_CODES, UtilityService } from '../shared/_services/utility.service'; import { KEY_CODES, UtilityService } from '../shared/_services/utility.service';
import { ReviewSeriesModalComponent } from '../_modals/review-series-modal/review-series-modal.component'; import { ReviewSeriesModalComponent } from '../_modals/review-series-modal/review-series-modal.component';
import { Chapter } from '../_models/chapter'; import { Chapter } from '../_models/chapter';
import { RefreshMetadataEvent } from '../_models/events/refresh-metadata-event';
import { ScanSeriesEvent } from '../_models/events/scan-series-event'; import { ScanSeriesEvent } from '../_models/events/scan-series-event';
import { SeriesRemovedEvent } from '../_models/events/series-removed-event'; import { SeriesRemovedEvent } from '../_models/events/series-removed-event';
import { LibraryType } from '../_models/library'; import { LibraryType } from '../_models/library';

View File

@ -1,3 +1,7 @@
<img #img class="lazyload" [src]="imageService.placeholderImage" [attr.data-src]="imageUrl" <img #img class="lazyload" [src]="imageService.placeholderImage" [attr.data-src]="imageUrl"
(error)="imageService.updateErroredImage($event)" (error)="imageService.updateErroredImage($event)"
aria-hidden="true"> aria-hidden="true">
<!-- <img #img [defaultImage]="imageService.placeholderImage" [lazyload]="imageUrl"
(error)="imageService.updateErroredImage($event)"
aria-hidden="true"> -->

View File

@ -45,20 +45,18 @@ import { ImageComponent } from './image/image.component';
NgCircleProgressModule.forRoot(), NgCircleProgressModule.forRoot(),
], ],
exports: [ exports: [
SafeHtmlPipe, SafeHtmlPipe, // Used globally
SentenceCasePipe, SentenceCasePipe, // Used globablly
ReadMoreComponent, ReadMoreComponent, // Used globably
DrawerComponent, DrawerComponent, // Can be replaced with boostrap offscreen canvas (v5)
TagBadgeComponent, ShowIfScrollbarDirective, // Used book reader only?
ShowIfScrollbarDirective, A11yClickDirective, // Used globally
A11yClickDirective, SeriesFormatComponent, // Used globally
SeriesFormatComponent, TagBadgeComponent, // Used globally
SeriesFormatComponent, CircularLoaderComponent, // Used in Cards only
TagBadgeComponent, PersonBadgeComponent, // Used Series Detail
CircularLoaderComponent, BadgeExpanderComponent, // Used globally
PersonBadgeComponent, ImageComponent // Used globally
BadgeExpanderComponent,
ImageComponent
], ],
}) })
export class SharedModule { } export class SharedModule { }

View File

@ -1,3 +1,7 @@
form {
position: relative;
}
input { input {
width: 15px; width: 15px;
opacity: 1px; opacity: 1px;
@ -42,6 +46,7 @@ input {
.dropdown { .dropdown {
width: 100%; width: 100%;
min-width: 10rem;
background: var(--input-bg-color); background: var(--input-bg-color);
z-index:1000; z-index:1000;
margin: 2px 0 0; margin: 2px 0 0;
@ -56,6 +61,7 @@ input {
.list-group-item { .list-group-item {
padding: 5px 10px; padding: 5px 10px;
width: 100%;
} }
@ -64,9 +70,6 @@ input {
} }
} }
.list-group-item {
cursor: pointer;
}
.spinner-border { .spinner-border {
position: absolute; position: absolute;

View File

@ -0,0 +1,26 @@
import { ThemeProvider } from '../../_models/preferences/site-theme';
import { SiteThemeProviderPipe } from './site-theme-provider.pipe';
describe('SiteThemeProviderPipe', () => {
let siteThemeProviderPipe: SiteThemeProviderPipe;
beforeEach(() => {
siteThemeProviderPipe = new SiteThemeProviderPipe();
})
it('translates system to System', () => {
expect(siteThemeProviderPipe.transform(ThemeProvider.System)).toBe('System');
});
it('translates user to User', () => {
expect(siteThemeProviderPipe.transform(ThemeProvider.User)).toBe('User');
});
it('translates null to empty string', () => {
expect(siteThemeProviderPipe.transform(null)).toBe('');
});
it('translates undefined to empty string', () => {
expect(siteThemeProviderPipe.transform(undefined)).toBe('');
});
});

View File

@ -0,0 +1,22 @@
import { Pipe, PipeTransform } from '@angular/core';
import { ThemeProvider } from 'src/app/_models/preferences/site-theme';
@Pipe({
name: 'siteThemeProvider'
})
export class SiteThemeProviderPipe implements PipeTransform {
transform(provider: ThemeProvider | undefined | null): string {
if (provider === null || provider === undefined) return '';
switch(provider) {
case ThemeProvider.System:
return 'System';
case ThemeProvider.User:
return 'User';
default:
return '';
}
}
}

View File

@ -10,13 +10,10 @@
<div class="row g-0"> <div class="row g-0">
<ng-container *ngFor="let theme of (themeService.themes$ | async)"> <ng-container *ngFor="let theme of (themeService.themes$ | async)">
<div class="card col-auto me-3" style="width: 18rem;"> <div class="card col-auto me-3 mb-3" style="width: 18rem;">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">{{theme.name | sentenceCase}}</h5> <h5 class="card-title">{{theme.name | sentenceCase}}</h5>
<h6 class="card-subtitle mb-2 text-muted">{{theme.provider === ThemeProvider.System ? 'System' : 'User'}}</h6> <h6 class="card-subtitle mb-2 text-muted">{{theme.provider | siteThemeProvider}}</h6>
<!-- <p class="card-text">
<i class="far fa-file-code" style="font-size: 24px" aria-hidden="true"></i>
</p> -->
<button class="btn btn-secondary me-2" [disabled]="theme.isDefault" *ngIf="isAdmin" (click)="updateDefault(theme)">Set Default</button> <button class="btn btn-secondary me-2" [disabled]="theme.isDefault" *ngIf="isAdmin" (click)="updateDefault(theme)">Set Default</button>
<button class="btn btn-primary" (click)="applyTheme(theme)" [disabled]="currentTheme?.id === theme.id">{{currentTheme?.id === theme.id ? 'Applied' : 'Apply'}}</button> <button class="btn btn-primary" (click)="applyTheme(theme)" [disabled]="currentTheme?.id === theme.id">{{currentTheme?.id === theme.id ? 'Applied' : 'Apply'}}</button>
</div> </div>

View File

@ -9,6 +9,8 @@ import { UserSettingsRoutingModule } from './user-settings-routing.module';
import { ApiKeyComponent } from './api-key/api-key.component'; import { ApiKeyComponent } from './api-key/api-key.component';
import { SharedModule } from '../shared/shared.module'; import { SharedModule } from '../shared/shared.module';
import { ThemeManagerComponent } from './theme-manager/theme-manager.component'; import { ThemeManagerComponent } from './theme-manager/theme-manager.component';
import { SiteThemeProviderPipe } from './_pipes/site-theme-provider.pipe';
@ -17,7 +19,8 @@ import { ThemeManagerComponent } from './theme-manager/theme-manager.component';
SeriesBookmarksComponent, SeriesBookmarksComponent,
UserPreferencesComponent, UserPreferencesComponent,
ApiKeyComponent, ApiKeyComponent,
ThemeManagerComponent ThemeManagerComponent,
SiteThemeProviderPipe,
], ],
imports: [ imports: [
CommonModule, CommonModule,
@ -28,6 +31,9 @@ import { ThemeManagerComponent } from './theme-manager/theme-manager.component';
NgxSliderModule, NgxSliderModule,
UserSettingsRoutingModule, UserSettingsRoutingModule,
SharedModule // SentenceCase pipe SharedModule // SentenceCase pipe
],
exports: [
SiteThemeProviderPipe
] ]
}) })
export class UserSettingsModule { } export class UserSettingsModule { }

View File

@ -3,7 +3,7 @@
// Import themes which define the css variables we use to customize the app // Import themes which define the css variables we use to customize the app
@import './theme/themes/light'; @import './theme/themes/light';
@import './theme/themes/dark'; @import './theme/themes/dark';
@import './theme/themes/eink'; @import './theme/themes/e-ink';
// Import colors for overrides of bootstrap theme // Import colors for overrides of bootstrap theme
@import './theme/toastr'; @import './theme/toastr';

View File

@ -9,6 +9,8 @@ $theme-colors: (
); );
$form-select-indicator-color:#cecece; $form-select-indicator-color:#cecece;
$accordion-icon-color: #cecece;
$accordion-icon-active-color: #cecece;
$grid-breakpoints-xs: 0; $grid-breakpoints-xs: 0;
$grid-breakpoints-sm: 576px; $grid-breakpoints-sm: 576px;

View File

@ -13,12 +13,19 @@
} }
} }
.accordion-button:not(.collapsed) { .accordion-button {
&:not(.collapsed) {
color: var(--accordion-header-text-color); color: var(--accordion-header-text-color);
background-color: var(--accordion-body-bg-color); background-color: var(--accordion-body-bg-color);
} }
.accordion-button.collapsed { &.collapsed {
color: var(--accordion-header-collapsed-text-color); color: var(--accordion-header-collapsed-text-color);
background-color: var(--accordion-header-collapsed-bg-color); background-color: var(--accordion-header-collapsed-bg-color);
} }
&:focus {
border-color: var(--accordion-button-focus-border-color);
box-shadow: var(--accordion-button-focus-box-shadow);
}
}

View File

@ -6,6 +6,15 @@ a:not(.dark-exempt) {
} }
} }
a.btn {
color: inherit;
text-decoration: none;
&:hover {
text-decoration: none;
}
}
a.read-more-link { a.read-more-link {
font-weight: bold; font-weight: bold;
text-decoration: none; text-decoration: none;
@ -13,3 +22,11 @@ a.read-more-link {
cursor: pointer; cursor: pointer;
color: var(--body-text-color) !important; color: var(--body-text-color) !important;
} }
a {
text-decoration: none;
&:hover {
text-decoration: underline;
}
}

View File

@ -69,3 +69,7 @@ button:disabled, .form-control:disabled, .form-control[readonly], .disabled, :di
button i.fa { button i.fa {
color: var(--btn-fa-icon-color); color: var(--btn-fa-icon-color);
} }
.btn-check:focus + .btn, .btn:focus {
box-shadow: 0 0 0 0.25rem var(--btn-focus-boxshadow-color);
}

View File

@ -4,11 +4,11 @@
border-color: var(--card-border-color); border-color: var(--card-border-color);
position: relative; position: relative;
.overlay:hover {
background-color: var(--card-overlay-hover-bg-color);
}
.card-overlay { .card-overlay {
background-color: var(--card-overlay-bg-color);
&:hover {
background-color: var(--card-overlay-hover-bg-color); background-color: var(--card-overlay-hover-bg-color);
} }
} }
}

View File

@ -8,8 +8,13 @@
border-color: var(--checkbox-checked-bg-color); border-color: var(--checkbox-checked-bg-color);
} }
&:focus, &:hover { &:hover {
border-color: var(--checkbox-focus-border-color); border-color: var(--checkbox-focus-border-color);
} }
&:focus {
border-color: var(--checkbox-focus-border-color);
box-shadow: 0 0 0 0.25rem var(--checkbox-focus-boxshadow-color);
}
} }

View File

@ -10,6 +10,7 @@
&:hover, &:focus { &:hover, &:focus {
color: var(--dropdown-item-hover-text-color); color: var(--dropdown-item-hover-text-color);
background-color: var(--dropdown-item-hover-bg-color); background-color: var(--dropdown-item-hover-bg-color);
text-decoration: none;
} }
} }
} }

View File

@ -7,6 +7,7 @@ input, .form-control {
border-color: var(--input-focused-border-color); border-color: var(--input-focused-border-color);
background-color: var(--input-bg-color); background-color: var(--input-bg-color);
color: var(--input-text-color); color: var(--input-text-color);
box-shadow: 0 0 0 0.25rem var(--input-focus-boxshadow-color);
} }
&:read-only { &:read-only {

View File

@ -3,7 +3,6 @@
background-color: var(--list-group-item-bg-color); background-color: var(--list-group-item-bg-color);
border-color: var(--list-group-item-border-color); border-color: var(--list-group-item-border-color);
// TODO: We need a css class where we can exclude hover effects, like when list is just used for layout purposes
&:hover { &:hover {
color: var(--list-group-hover-text-color); color: var(--list-group-hover-text-color);
background-color: var(--list-group-hover-bg-color); background-color: var(--list-group-hover-bg-color);
@ -12,6 +11,7 @@
&.active { &.active {
color: var(--list-group-hover-text-color); color: var(--list-group-hover-text-color);
background-color: var(--list-group-hover-bg-color); background-color: var(--list-group-hover-bg-color);
border-color: var(--list-group-active-border-color);
} }
&.no-hover:hover { &.no-hover:hover {

View File

@ -3,6 +3,7 @@
&:hover, &:focus { &:hover, &:focus {
color: var(--nav-link-hover-text-color); color: var(--nav-link-hover-text-color);
text-decoration: none;
} }
&.active { &.active {
@ -21,6 +22,7 @@
.nav-link { .nav-link {
color: var(--nav-link-text-color); color: var(--nav-link-text-color);
position: relative;
&.active, &:focus { &.active, &:focus {
color: var(--nav-tab-active-text-color); color: var(--nav-tab-active-text-color);
@ -29,6 +31,11 @@
border-left-color: var(--nav-tab-border-left); border-left-color: var(--nav-tab-border-left);
border-bottom-color: var(--nav-tab-border-bottom); border-bottom-color: var(--nav-tab-border-bottom);
border-right-color: var(--nav-tab-border-right); border-right-color: var(--nav-tab-border-right);
transform: scaleY(1);
}
&.active::before {
transform: scaleY(1);
} }
&:hover { &:hover {
@ -36,9 +43,26 @@
background-color: var(--nav-tab-hover-bg-color); background-color: var(--nav-tab-hover-bg-color);
border-top-color: var(--nav-tab-hover-border-top); border-top-color: var(--nav-tab-hover-border-top);
border-left-color: var(--nav-tab-hover-border-left); border-left-color: var(--nav-tab-hover-border-left);
border-bottom-color: var(--nav-tab-border-hover-bottom); border-bottom-color: var(--nav-tab-hover-border-bottom);
border-right-color: var(--nav-tab-border-hover-right); border-right-color: var(--nav-tab-hover-border-right);
border-color: var(--nav-tab-border-hover-color); }
&.active:hover {
background-color: var(--nav-tab-active-hover-bg-color);
}
&::before {
content: "";
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
transform: scaleY(0);
transform-origin: bottom center;
background: var(--nav-tab-active-hover-bg-color);
z-index: -1;
transition: transform 0.2s;
} }
} }

View File

@ -4,4 +4,8 @@ input[type='radio'] {
&:hover { &:hover {
accent-color: var(--radio-hover-accent-color); accent-color: var(--radio-hover-accent-color);
} }
&:focus {
box-shadow: 0 0 0 0.25rem var(--radio-focus-boxshadow-color);
}
} }

View File

@ -7,6 +7,7 @@
border-color: var(--input-focused-border-color); border-color: var(--input-focused-border-color);
background-color: var(--input-bg-color); background-color: var(--input-bg-color);
color: var(--input-text-color); color: var(--input-text-color);
box-shadow: 0 0 0 0.25rem var(--input-focus-boxshadow-color);
} }
&:read-only { &:read-only {

View File

@ -22,19 +22,21 @@
--input-text-color: #fff; --input-text-color: #fff;
--input-placeholder-color: #aeaeae; --input-placeholder-color: #aeaeae;
--input-border-color: #ccc; --input-border-color: #ccc;
--input-focus-boxshadow-color: rgb(255 255 255 / 50%);
/* Buttons */ /* Buttons */
--btn-focus-boxshadow-color: rgb(255 255 255 / 50%);
--btn-primary-text-color: white; --btn-primary-text-color: white;
--btn-primary-bg-color: var(--primary-color-darker-shade); --btn-primary-bg-color: var(--primary-color);
--btn-primary-border-color: var(--primary-color-darker-shade); --btn-primary-border-color: var(--primary-color);
--btn-primary-hover-text-color: white; --btn-primary-hover-text-color: white;
--btn-primary-hover-bg-color: var(--primary-color-darkest-shade); --btn-primary-hover-bg-color: var(--primary-color-darker-shade);
--btn-primary-hover-border-color: var(--primary-color-darkest-shade); --btn-primary-hover-border-color: var(--primary-color-darker-shade);
--btn-alt-bg-color: #424c72; --btn-alt-bg-color: #424c72;
--btn-alt-border-color: #444f75; --btn-alt-border-color: #444f75;
--btn-alt-hover-bg-color: #3b4466; --btn-alt-hover-bg-color: #3b4466;
--btn-alt-focus-bg-color: #343c59; --btn-alt-focus-bg-color: #343c59;
--btn-alt-focus-boxshadow-color: rgb(68 79 117 / 50%); --btn-alt-focus-boxshadow-color: rgb(255 255 255 / 50%);
--btn-fa-icon-color: white; --btn-fa-icon-color: white;
--btn-disabled-bg-color: #343a40; --btn-disabled-bg-color: #343a40;
--btn-disabled-text-color: white; --btn-disabled-text-color: white;
@ -43,26 +45,25 @@
/* Nav (Tabs) */ /* Nav (Tabs) */
--nav-tab-border-color: rgba(44, 118, 88, 0.7); --nav-tab-border-color: rgba(44, 118, 88, 0.7);
--nav-tab-text-color: var(--body-text-color); --nav-tab-text-color: var(--body-text-color);
--nav-tab-bg-color: var(--bs-body-bg); --nav-tab-bg-color: var(--primary-color);
--nav-tab-hover-border-color: var(--primary-color-dark-shade); --nav-tab-hover-border-color: var(--primary-color);
--nav-tab-active-text-color: white; --nav-tab-active-text-color: white;
--nav-tab-border-hover-color: transparent; --nav-tab-border-hover-color: transparent;
--nav-tab-hover-text-color: var(--body-text-color); --nav-tab-hover-text-color: var(--body-text-color);
--nav-tab-hover-bg-color: var(--primary-color-dark-shade); --nav-tab-hover-bg-color: transparent;
--nav-tab-border-top: rgba(44, 118, 88, 0.7); --nav-tab-border-top: rgba(44, 118, 88, 0.7);
--nav-tab-border-left: rgba(44, 118, 88, 0.7); --nav-tab-border-left: rgba(44, 118, 88, 0.7);
--nav-tab-border-bottom: var(--bs-body-bg); --nav-tab-border-bottom: rgba(44, 118, 88, 0.7);
--nav-tab-border-right: rgba(44, 118, 88, 0.7); --nav-tab-border-right: rgba(44, 118, 88, 0.7);
--nav-tab-border-hover-top: var(--primary-color-dark-shade); --nav-tab-hover-border-top: rgba(44, 118, 88, 0.7);
--nav-tab-border-hover-left: var(--primary-color-dark-shade); --nav-tab-hover-border-left: rgba(44, 118, 88, 0.7);
--nav-tab-border-hover-bottom: rgba(44, 118, 88, 0.7); --nav-tab-hover-border-bottom: var(--bs-body-bg);
--nav-tab-border-hover-right: var(--primary-color-dark-shade); --nav-tab-hover-border-right: rgba(44, 118, 88, 0.7);
--nav-tab-active-hover-bg-color: var(--primary-color);
--nav-link-bg-color: var(--primary-color-dark-shade); --nav-link-bg-color: var(--primary-color);
--nav-link-active-text-color: white; --nav-link-active-text-color: white;
--nav-link-text-color: white; --nav-link-text-color: white;
/* Header */ /* Header */
--nav-header-text-color: white; --nav-header-text-color: white;
--nav-header-bg-color: rgb(22, 27, 34); --nav-header-bg-color: rgb(22, 27, 34);
@ -77,6 +78,7 @@
--checkbox-checked-bg-color: var(--primary-color); --checkbox-checked-bg-color: var(--primary-color);
--checkbox-border-color: var(--input-focused-border-color); --checkbox-border-color: var(--input-focused-border-color);
--checkbox-focus-border-color: var(--primary-color); --checkbox-focus-border-color: var(--primary-color);
--checkbox-focus-boxshadow-color: rgb(255 255 255 / 50%);
/* Tag Badge */ /* Tag Badge */
--tagbadge-border-color: rgba(239, 239, 239, 0.125); --tagbadge-border-color: rgba(239, 239, 239, 0.125);
@ -89,6 +91,7 @@
--list-group-item-border-color: rgba(239, 239, 239, 0.125); --list-group-item-border-color: rgba(239, 239, 239, 0.125);
--list-group-hover-text-color: white; --list-group-hover-text-color: white;
--list-group-hover-bg-color: var(--accordion-body-bg-color); --list-group-hover-bg-color: var(--accordion-body-bg-color);
--list-group-active-border-color: none;
/* Popover */ /* Popover */
--popover-body-bg-color: var(--navbar-bg-color); --popover-body-bg-color: var(--navbar-bg-color);
@ -105,7 +108,7 @@
/* Dropdown */ /* Dropdown */
--dropdown-item-hover-text-color: white; --dropdown-item-hover-text-color: white;
--dropdown-item-hover-bg-color: var(--primary-color-dark-shade); --dropdown-item-hover-bg-color: var(--primary-color);
--dropdown-item-text-color: var(--navbar-text-color); --dropdown-item-text-color: var(--navbar-text-color);
--dropdown-item-bg-color: var(--navbar-bg-color); --dropdown-item-bg-color: var(--navbar-bg-color);
--dropdown-overlay-color: rgba(0,0,0,0.5); --dropdown-overlay-color: rgba(0,0,0,0.5);
@ -118,6 +121,8 @@
--accordion-body-text-color: var(--body-text-color); --accordion-body-text-color: var(--body-text-color);
--accordion-header-collapsed-text-color: rgba(74, 198, 148, 0.9); --accordion-header-collapsed-text-color: rgba(74, 198, 148, 0.9);
--accordion-header-collapsed-bg-color: rgba(22,27,34,0.5); --accordion-header-collapsed-bg-color: rgba(22,27,34,0.5);
--accordion-button-focus-border-color: unset;
--accordion-button-focus-box-shadow: unset;
/* Breadcrumb */ /* Breadcrumb */
--breadcrumb-bg-color: #292d32; --breadcrumb-bg-color: #292d32;
@ -145,6 +150,7 @@
--card-text-color: var(--body-text-color); --card-text-color: var(--body-text-color);
--card-border-color: rgba(239, 239, 239, 0.125); --card-border-color: rgba(239, 239, 239, 0.125);
--card-progress-bar-color: var(--primary-color); --card-progress-bar-color: var(--primary-color);
--card-overlay-bg-color: rgba(0, 0, 0, 0);
--card-overlay-hover-bg-color: rgba(0, 0, 0, 0.2); --card-overlay-hover-bg-color: rgba(0, 0, 0, 0.2);
/* Slider */ /* Slider */
@ -160,7 +166,8 @@
/* Radios */ /* Radios */
--radio-accent-color: var(--primary-color); --radio-accent-color: var(--primary-color);
--radio-hover-accent-color: var(--primary-color-dark-shade); --radio-hover-accent-color: var(--primary-color);
--radio-focus-boxshadow-color: rgb(255 255 255 / 50%);
/* Carousel */ /* Carousel */
--carousel-header-text-color: var(--body-text-color); --carousel-header-text-color: var(--body-text-color);

View File

@ -1,4 +1,4 @@
:root .bg-eink { :root .bg-e-ink {
--color-scheme: light; --color-scheme: light;
--primary-color: black; --primary-color: black;
--primary-color-dark-shade: #3B9E76; --primary-color-dark-shade: #3B9E76;
@ -22,12 +22,22 @@
--input-border-color: #ccc; --input-border-color: #ccc;
/* Buttons */ /* Buttons */
--btn-primary-text-color: white; --btn-primary-text-color: black;
--btn-primary-bg-color: white;
--btn-primary-border-color: black;
--btn-primary-hover-text-color: white;
--btn-primary-hover-bg-color: black;
--btn-primary-hover-border-color: black;
--btn-alt-bg-color: #424c72; --btn-alt-bg-color: #424c72;
--btn-alt-border-color: #444f75; --btn-alt-border-color: #444f75;
--btn-alt-hover-bg-color: #3b4466; --btn-alt-hover-bg-color: #3b4466;
--btn-alt-focus-bg-color: #343c59; --btn-alt-focus-bg-color: #343c59;
--btn-alt-focus-boxshadow-color: rgb(68 79 117 / 50%); --btn-alt-focus-boxshadow-color: rgb(68 79 117 / 50%);
--btn-fa-icon-color: black;
--btn-disabled-bg-color: #020202;
--btn-disabled-text-color: white;
--btn-disabled-border-color: #6c757d;
/* Nav */ /* Nav */
--nav-link-active-text-color: white; --nav-link-active-text-color: white;
@ -87,6 +97,7 @@
--list-group-hover-text-color: black; --list-group-hover-text-color: black;
--list-group-hover-bg-color: #eaeaea; --list-group-hover-bg-color: #eaeaea;
--list-group-item-border-color: rgba(239, 239, 239, 0.125); --list-group-item-border-color: rgba(239, 239, 239, 0.125);
--list-group-active-border-color: none;
/* Dropdown */ /* Dropdown */
--dropdown-item-hover-text-color: white; --dropdown-item-hover-text-color: white;

View File

@ -22,7 +22,7 @@
--input-border-color: #ccc; --input-border-color: #ccc;
/* Buttons */ /* Buttons */
--btn-primary-text-color: white; --btn-primary-text-color: black;
--btn-alt-bg-color: #424c72; --btn-alt-bg-color: #424c72;
--btn-alt-border-color: #444f75; --btn-alt-border-color: #444f75;
--btn-alt-hover-bg-color: #3b4466; --btn-alt-hover-bg-color: #3b4466;
@ -41,7 +41,7 @@
--nav-tab-border-hover-color: transparent; --nav-tab-border-hover-color: transparent;
/* Checkboxes */ /* Checkboxes */
--checkbox-checked-bg-color: var(--primary-color); --checkbox-checked-bg-color: black;
--checkbox-bg-color: white; --checkbox-bg-color: white;
--checkbox-border-color: var(--primary-color); --checkbox-border-color: var(--primary-color);
--checkbox-focus-border-color: var(--input-border-color); --checkbox-focus-border-color: var(--input-border-color);
@ -70,6 +70,7 @@
--grid-breakpoints-xl: $grid-breakpoint-xl; --grid-breakpoints-xl: $grid-breakpoint-xl;
--body-font-family: "EBGaramond", "Helvetica Neue", sans-serif; --body-font-family: "EBGaramond", "Helvetica Neue", sans-serif;
--brand-font-family: "Spartan", sans-serif; --brand-font-family: "Spartan", sans-serif;
--text-muted-color: #aaa;
/* Breadcrumb */ /* Breadcrumb */
--breadcrumb-bg-color: #eaeaea; --breadcrumb-bg-color: #eaeaea;
@ -79,6 +80,7 @@
--card-text-color: #000; --card-text-color: #000;
--card-border-color: #ccc; --card-border-color: #ccc;
--card-progress-bar-color: var(--primary-color); --card-progress-bar-color: var(--primary-color);
--card-overlay-bg-color: rgba(0, 0, 0, 0);
--card-overlay-hover-bg-color: rgba(0, 0, 0, 0.2); --card-overlay-hover-bg-color: rgba(0, 0, 0, 0.2);
/* List items */ /* List items */
@ -87,6 +89,7 @@
--list-group-hover-text-color: inherit; --list-group-hover-text-color: inherit;
--list-group-hover-bg-color: #eaeaea; --list-group-hover-bg-color: #eaeaea;
--list-group-item-border-color: rgba(239, 239, 239, 0.125); --list-group-item-border-color: rgba(239, 239, 239, 0.125);
--list-group-active-border-color: none;
/* Dropdown */ /* Dropdown */
--dropdown-item-hover-text-color: white; --dropdown-item-hover-text-color: white;

View File

@ -11,5 +11,5 @@ hr {
} }
.text-muted { .text-muted {
color: #d7d7d7 !important; color: var(--text-muted-color) !important;
} }