mirror of
https://github.com/Kareadita/Kavita.git
synced 2025-07-09 03:04:19 -04:00
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:
parent
70b85e0668
commit
4bd9f243f2
@ -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,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
8
UI/Web/package-lock.json
generated
8
UI/Web/package-lock.json
generated
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
export interface RefreshMetadataEvent {
|
|
||||||
libraryId: number;
|
|
||||||
seriesId: number;
|
|
||||||
}
|
|
@ -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'
|
@ -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'
|
@ -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);
|
||||||
|
@ -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});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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:
|
||||||
|
@ -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,
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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() {
|
||||||
|
@ -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">
|
||||||
|
@ -1,20 +1,16 @@
|
|||||||
@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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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>
|
||||||
|
@ -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;
|
||||||
|
@ -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>
|
||||||
|
@ -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';
|
||||||
|
@ -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;
|
||||||
|
@ -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';
|
||||||
|
@ -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"> -->
|
||||||
|
@ -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 { }
|
||||||
|
@ -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;
|
||||||
|
@ -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('');
|
||||||
|
});
|
||||||
|
});
|
@ -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 '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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>
|
||||||
|
@ -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 { }
|
||||||
|
@ -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';
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
@ -4,11 +4,11 @@
|
|||||||
border-color: var(--card-border-color);
|
border-color: var(--card-border-color);
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
.overlay:hover {
|
.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);
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-overlay {
|
|
||||||
background-color: var(--card-overlay-hover-bg-color);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
@ -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;
|
||||||
|
@ -11,5 +11,5 @@ hr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.text-muted {
|
.text-muted {
|
||||||
color: #d7d7d7 !important;
|
color: var(--text-muted-color) !important;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user