diff --git a/.directory b/.directory new file mode 100644 index 0000000..ec6044c --- /dev/null +++ b/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=folder-chytanka diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 09a4d2c..2a50b7e 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -17,25 +17,21 @@ permissions: jobs: build: runs-on: ubuntu-latest - strategy: matrix: node-version: [22.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: "npm" - run: npm ci --force - run: npm install -g @angular/cli > /dev/null - run: ng build --output-path dist - - - name: Copy index.html to 404.html - run: cp dist/browser/index.html dist/browser/404.html + - run: cp dist/browser/index.html dist/browser/404.html - name: Upload artifact uses: actions/upload-pages-artifact@v3 diff --git a/package.json b/package.json index a37f20a..0f1370a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chytanka", - "version": "0.13.32", + "version": "0.14.33", "scripts": { "ng": "ng", "start": "ng serve", diff --git a/src/app/@site-modules/@common-read/ui/common-read/common-read.component.html b/src/app/@site-modules/@common-read/ui/common-read/common-read.component.html index 81f8cad..bd1c10a 100644 --- a/src/app/@site-modules/@common-read/ui/common-read/common-read.component.html +++ b/src/app/@site-modules/@common-read/ui/common-read/common-read.component.html @@ -2,7 +2,10 @@ @if (!(loading$ | async)) { + [episode]="episode"> +
+ + } } diff --git a/src/app/@site-modules/comick/comick.service.ts b/src/app/@site-modules/comick/comick.service.ts index b375ea1..b66b528 100644 --- a/src/app/@site-modules/comick/comick.service.ts +++ b/src/app/@site-modules/comick/comick.service.ts @@ -1,20 +1,25 @@ import { HttpClient } from '@angular/common/http'; -import { inject, Injectable } from '@angular/core'; +import { inject, Injectable, PLATFORM_ID } from '@angular/core'; import { Observable, map } from 'rxjs'; import { environment } from '../../../environments/environment'; import { CompositionEpisode } from '../@common-read'; import { ProxyService } from '../../shared/data-access/proxy.service'; +import { isPlatformServer } from '@angular/common'; @Injectable({ providedIn: 'root' }) export class ComickService { + platformId = inject(PLATFORM_ID) http: HttpClient = inject(HttpClient) proxy: ProxyService = inject(ProxyService) getComposition(id: string): Observable { - // this.proxy.proxyUrl() - return this.http.get((environment.comickHost + id)) + const url = isPlatformServer(this.platformId) + ? environment.comickHost + id + : this.proxy.proxyUrl(environment.comickHost + id); + + return this.http.get(url) .pipe(map((data) => { return this.map(data) })) } @@ -30,11 +35,11 @@ export class ComickService { width: item.w }; })).filter((i: any) => i.src) - // .map((img: any) => { - // return { - // src: this.proxy.proxyUrl(`${img.src}`) - // } - // }) + // .map((img: any) => { + // return { + // src: this.proxy.proxyUrl(`${img.src}`) + // } + // }) }; diff --git a/src/app/@site-modules/imgchest/imgchest-shell.component.ts b/src/app/@site-modules/imgchest/imgchest-shell.component.ts new file mode 100644 index 0000000..2439035 --- /dev/null +++ b/src/app/@site-modules/imgchest/imgchest-shell.component.ts @@ -0,0 +1,45 @@ +import { Component } from '@angular/core'; +import { ImgchestService } from './imgchest.service'; +import { Base64 } from '../../shared/utils'; +import { of, switchMap } from 'rxjs'; +import { CommonReadModule, ReadBaseComponent } from '../@common-read'; +import { IMGCHEST_PATH } from '../../app-routing.module'; + +@Component({ + imports: [CommonReadModule], + selector: 'app-imgchest-shell', + template: ` + + + Imgchest logo + + +
+

{{lang.ph().imagesVia}}Imgchest + API. + {{lang.ph().thanks}}
{{lang.ph().detalisCopy}}

+
` +}) +export default class ImgchestShellComponent extends ReadBaseComponent { + + override episode$ = this.combineParamMapAndRefresh() + .pipe(this.tapStartLoading(), + switchMap(([params]) => { + const idParam = params?.get('id'); + + if (!idParam) return of(null); + + const id = (Base64.isBase64(idParam)) ? Base64.fromBase64(idParam) : idParam; + const id64 = Base64.toBase64(id); + + return (this.imgchest.getComposition(id)).pipe(this.catchError(), this.tapSetMetaTags(), + this.tapSaveToHistory(IMGCHEST_PATH, id64), + this.tapSaveToCurrentPlaylistItem(IMGCHEST_PATH, id), + + + this.finalizeLoading()); + }) + ); + + constructor(public imgchest: ImgchestService) { super() } +} diff --git a/src/app/@site-modules/imgchest/imgchest.service.ts b/src/app/@site-modules/imgchest/imgchest.service.ts new file mode 100644 index 0000000..6cc9c0f --- /dev/null +++ b/src/app/@site-modules/imgchest/imgchest.service.ts @@ -0,0 +1,113 @@ +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { inject, Injectable, PLATFORM_ID } from '@angular/core'; +import { environment } from '../../../environments/environment'; +import { Observable, map } from 'rxjs'; +import { CompositionEpisode, CompositionImage } from '../@common-read'; +import { ProxyService } from '../../shared/data-access/proxy.service'; +import { isPlatformServer } from '@angular/common'; +interface ImgchestRespCompImage { + id: string; + description: string; + link: string; + position: number + created: string; +} +interface ImgchestRespComp { + id: string; + title: string; + username: string; + privacy: string; + report_status: number; + views: number; + nsfw: number; + image_count: number; + created: string; + images: Array; +} +interface ImgchestResp { + data: any | ImgchestRespComp +} + +@Injectable({ + providedIn: 'root' +}) +export class ImgchestService { + private readonly clientId: string = 'T0eSFX9IOg0Okcg7g3UN7jp8MDreLglRyYKYkw2Gd74de321'; + platformId = inject(PLATFORM_ID) + + proxy: ProxyService = inject(ProxyService) + http: HttpClient = inject(HttpClient) + + constructor() { } + + getComposition(id: string): Observable { + const headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.clientId}` + }); + + const url = isPlatformServer(this.platformId) + ? environment.imgchestHost + id + : this.proxy.proxyUrl(environment.imgchestHost + id); + + return this.http.get(url, { headers }) + .pipe(map((data: ImgchestResp) => { return this.map(data.data) })) + } + + + map(data: ImgchestRespComp): CompositionEpisode { + const res: CompositionEpisode = { + title: data.title, + episode: 0, + nsfw: (data.nsfw) as unknown as boolean, + images: data.images.map((i): CompositionImage => { + return { + src: this.proxy.proxyUrl(i.link), + alt: i.description, + } + }) + + } + return res; + } + +} + +/** +{ + "data": { + "id": "wl7l2rvgo4x", + "title": null, + "username": "Anonymous", + "privacy": "hidden", + "report_status": 1, + "views": 1, + "nsfw": 0, + "image_count": 3, + "created": "2025-06-13T13:37:01.000000Z", + "images": [ + { + "id": "46acqe3zkk7", + "description": null, + "link": "https:\/\/cdn.imgchest.com\/files\/46acqe3zkk7.jpg", + "position": 1, + "created": "2025-06-13T13:37:01.000000Z" + }, + { + "id": "yvdcwog6vpy", + "description": null, + "link": "https:\/\/cdn.imgchest.com\/files\/yvdcwog6vpy.jpg", + "position": 2, + "created": "2025-06-13T13:37:02.000000Z" + }, + { + "id": "yxkczok2ro7", + "description": null, + "link": "https:\/\/cdn.imgchest.com\/files\/yxkczok2ro7.jpg", + "position": 3, + "created": "2025-06-13T13:37:03.000000Z" + } + ] + } +} + + */ \ No newline at end of file diff --git a/src/app/@site-modules/mangadex/mangadex.service.ts b/src/app/@site-modules/mangadex/mangadex.service.ts index 68e9942..00f3858 100644 --- a/src/app/@site-modules/mangadex/mangadex.service.ts +++ b/src/app/@site-modules/mangadex/mangadex.service.ts @@ -1,9 +1,10 @@ import { HttpClient } from '@angular/common/http'; -import { inject, Injectable } from '@angular/core'; +import { inject, Injectable, PLATFORM_ID } from '@angular/core'; import { environment } from '../../../environments/environment'; import { Observable, catchError, map, throwError } from 'rxjs'; import { CompositionEpisode, CompositionImage } from '../@common-read'; import { ProxyService } from '../../shared/data-access/proxy.service'; +import { isPlatformServer } from '@angular/common'; interface MdChapterImages { hash: string; @@ -63,11 +64,16 @@ interface MdMangaResp { providedIn: 'root' }) export class MangadexService { + platformId = inject(PLATFORM_ID) http: HttpClient = inject(HttpClient) proxy: ProxyService = inject(ProxyService) getChapterImages(id: string): Observable { - return this.http.get(this.proxy.proxyUrl(environment.mangadexHost + id)) + const url = isPlatformServer(this.platformId) + ? environment.mangadexHost + id + : this.proxy.proxyUrl(environment.mangadexHost + id); + + return this.http.get(url) .pipe( map((data: MdChapterImagesResp) => data.chapter.dataSaver.map((item: string) => { return { @@ -81,7 +87,11 @@ export class MangadexService { } getChapter(id: string): Observable { - return this.http.get(this.proxy.proxyUrl(environment.mangadexChapter + id)) + const url = isPlatformServer(this.platformId) + ? environment.mangadexChapter + id + : this.proxy.proxyUrl(environment.mangadexChapter + id); + + return this.http.get(url) .pipe( map((data: MdChapterResp) => { return { @@ -99,7 +109,11 @@ export class MangadexService { getManga(id: string): Observable<{ nsfw: boolean }> { - return this.http.get(this.proxy.proxyUrl(environment.mangadexManga + id)).pipe(this.nsfwMap()) + const url = isPlatformServer(this.platformId) + ? environment.mangadexManga + id + : this.proxy.proxyUrl(environment.mangadexManga + id); + + return this.http.get(url).pipe(this.nsfwMap()) } nsfwMap() { diff --git a/src/app/@site-modules/nhentai/nhentai.service.ts b/src/app/@site-modules/nhentai/nhentai.service.ts index a250f77..7480de4 100644 --- a/src/app/@site-modules/nhentai/nhentai.service.ts +++ b/src/app/@site-modules/nhentai/nhentai.service.ts @@ -1,19 +1,25 @@ import { HttpClient } from '@angular/common/http'; -import { inject, Injectable } from '@angular/core'; +import { inject, Injectable, PLATFORM_ID } from '@angular/core'; import { Observable, map } from 'rxjs'; import { environment } from '../../../environments/environment'; import { CompositionEpisode } from '../@common-read'; import { ProxyService } from '../../shared/data-access/proxy.service'; +import { isPlatformServer } from '@angular/common'; @Injectable({ providedIn: 'root' }) export class NhentaiService { + platformId = inject(PLATFORM_ID) http: HttpClient = inject(HttpClient) proxy: ProxyService = inject(ProxyService) getComposition(id: string): Observable { - return this.http.get(this.proxy.proxyUrl(environment.nhentaiHost + id)) + const url = isPlatformServer(this.platformId) + ? environment.nhentaiHost + id + : this.proxy.proxyUrl(environment.nhentaiHost + id); + + return this.http.get(url) .pipe(map((data) => { return this.map(data) })) } diff --git a/src/app/@site-modules/pixiv/pixiv.service.ts b/src/app/@site-modules/pixiv/pixiv.service.ts index f5bf89c..2cbfd9d 100644 --- a/src/app/@site-modules/pixiv/pixiv.service.ts +++ b/src/app/@site-modules/pixiv/pixiv.service.ts @@ -1,19 +1,25 @@ import { HttpClient } from '@angular/common/http'; -import { inject, Injectable } from '@angular/core'; +import { inject, Injectable, PLATFORM_ID } from '@angular/core'; import { Observable, map } from 'rxjs'; import { environment } from '../../../environments/environment'; import { CompositionEpisode, CompositionPublisher } from '../@common-read'; import { ProxyService } from '../../shared/data-access/proxy.service'; +import { isPlatformServer } from '@angular/common'; @Injectable({ providedIn: 'root' }) export class PixivService { + platformId = inject(PLATFORM_ID) http: HttpClient = inject(HttpClient) proxy: ProxyService = inject(ProxyService) getComposition(id: string): Observable { - return this.http.get(this.proxy.proxyUrl(environment.pixivHost + id)) + const url = isPlatformServer(this.platformId) + ? environment.pixivHost + id + : this.proxy.proxyUrl(environment.pixivHost + id); + + return this.http.get(url) .pipe(map((data) => { return this.map(data.body) })) } diff --git a/src/app/@site-modules/yandere/yandere.service.ts b/src/app/@site-modules/yandere/yandere.service.ts index 3b2453d..385b8a8 100644 --- a/src/app/@site-modules/yandere/yandere.service.ts +++ b/src/app/@site-modules/yandere/yandere.service.ts @@ -1,20 +1,26 @@ -import { inject, Injectable } from '@angular/core'; +import { inject, Injectable, PLATFORM_ID } from '@angular/core'; import { environment } from '../../../environments/environment'; import { HttpClient } from '@angular/common/http'; import { Observable, map } from 'rxjs'; import { CompositionEpisode } from '../@common-read'; import { Base64 } from '../../shared/utils'; import { ProxyService } from '../../shared/data-access/proxy.service'; +import { isPlatformServer } from '@angular/common'; @Injectable({ providedIn: 'root' }) export class YandereService { + platformId = inject(PLATFORM_ID) http: HttpClient = inject(HttpClient) proxy: ProxyService = inject(ProxyService) getComposition(id: string): Observable { - return this.http.get(this.proxy.proxyUrl(environment.yanderePoolsHost + id)) + const url = isPlatformServer(this.platformId) + ? environment.yanderePoolsHost + id + : this.proxy.proxyUrl(environment.yanderePoolsHost + id); + + return this.http.get(url) .pipe(map((data) => { return this.map(data) })) } diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index dd26c3a..defa330 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -19,6 +19,7 @@ export function urlMatcher(segments: UrlSegment[], group: UrlSegmentGroup, route export const MANGADEX_PATH = `mangadex`; export const TELEGRAPH_PATH = `telegraph`; export const IMGUR_PATH = `imgur`; +export const IMGCHEST_PATH = `imgchest`; export const REDDIT_PATH = `reddit`; export const READ_PATH = `read`; export const LIST_PATH = `list`; @@ -34,6 +35,7 @@ const linkParserMod: LoadChildrenCallback = () => import('./link-parser/link-par // const blankaryMod = () => import('./@site-modules/blankary/blankary-shell.component') const comickMod = () => import('./@site-modules/comick/comick-shell.component') const imgurMod = () => import('./@site-modules/imgur/imgur-shell.component') +const imgchestMod = () => import('./@site-modules/imgchest/imgchest-shell.component') const mangadexMod = () => import('./@site-modules/mangadex/mangadex-shell.component') const nhentaiMod = () => import('./@site-modules/nhentai/nhentai-shell.component') const pixivMod = () => import('./@site-modules/pixiv/pixiv-shell.component') @@ -52,6 +54,7 @@ const siteModulesMap = new Map() // .set(BLANKARY_PATH + '/:id', blankaryMod) .set(COMICK_PATH + '/:id', comickMod) .set(IMGUR_PATH + '/:id', imgurMod) + .set(IMGCHEST_PATH + '/:id', imgchestMod) .set(MANGADEX_PATH + '/:id', mangadexMod) .set(NHENTAI_PATH + '/:id', nhentaiMod) .set(PIXIV_PATH + '/:id', pixivMod) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 6229458..f0e5dde 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -7,39 +7,41 @@ import { environment } from '../environments/environment'; const SCALE_GAP = 128; @Component({ - selector: 'chtnk-root', - template: `
`, - styles: [` - // :host { - // display: flex; - // } - `], - standalone: false + selector: 'chtnk-root', + template: `
`, + styles: [``], + standalone: false }) export class AppComponent { private readonly document = inject(DOCUMENT); platformId = inject(PLATFORM_ID) - + constructor(public lang: LangService, private route: ActivatedRoute) { this.lang.updateManifest() this.lang.updateTranslate() + this.route.pathFromRoot[0].queryParams.subscribe(async q => { + const l = q['lang'] + + if (l) { + this.lang.setLang(l) + } + + if (l && this.lang.manifests.has(l)) { + this.lang.updateManifest() + } + }) + if (isPlatformBrowser(this.platformId) && window.console && environment.prod) { const msg = `What are you looking for here? The plot twist is in the next volume!` - console.log(`%c${msg}`, "background-color: #166496; color: #ffd60a; font-size: 4rem; font-family: monospace; padding: 8px 16px"); - } + console.log(`%c${msg}`, "background-color: #166496; color: #ffd60a; font-size: 4rem; font-family: monospace; padding: 8px 16px"); + } + + } ngOnInit() { this.initScaleDifference(); - - this.route.pathFromRoot[0].queryParams.subscribe(q => { - const l = q['lang'] - if (l && this.lang.manifests.has(l)) { - this.lang.setLang(l) - this.lang.updateManifest() - } - }) } @HostListener('window:resize') diff --git a/src/app/app.routes.server.ts b/src/app/app.routes.server.ts index b16fed7..3687362 100644 --- a/src/app/app.routes.server.ts +++ b/src/app/app.routes.server.ts @@ -1,10 +1,10 @@ import { RenderMode, ServerRoute } from '@angular/ssr'; export const serverRoutes: ServerRoute[] = [ - { - path: '', - renderMode: RenderMode.Prerender, - }, + // { + // path: '', + // renderMode: RenderMode.Prerender, + // }, { path: '**', // All other routes will be rendered on the server (SSR) renderMode: RenderMode.Server, diff --git a/src/app/link-parser/data-access/link-parser.service.ts b/src/app/link-parser/data-access/link-parser.service.ts index f6c3d9e..509b665 100644 --- a/src/app/link-parser/data-access/link-parser.service.ts +++ b/src/app/link-parser/data-access/link-parser.service.ts @@ -17,6 +17,7 @@ export class LinkParserService { "Comick", "NHentai", "Yandere Pools", + "Imgchest", // "Blankary", "Pixiv" ].sort()) diff --git a/src/app/link-parser/link-parser/link-parser.component.scss b/src/app/link-parser/link-parser/link-parser.component.scss index ba28c5f..1307f29 100644 --- a/src/app/link-parser/link-parser/link-parser.component.scss +++ b/src/app/link-parser/link-parser/link-parser.component.scss @@ -65,6 +65,11 @@ aside { min-height: 0; padding: 4ch; display: grid; + + @media (max-aspect-ratio: 1) or (max-width: 640px) { + padding: 2ch; + + } } lp-footer, @@ -107,12 +112,12 @@ lp-header { // filter: blur(3px); } -:host:has(input[type=url]:focus) { +// :host:has(input[type=url]:focus) { - lp-footer, - lp-header, - #createListLink { - opacity: 0; - pointer-events: none; - } -} \ No newline at end of file +// lp-footer, +// lp-header, +// #createListLink { +// opacity: 0; +// pointer-events: none; +// } +// } \ No newline at end of file diff --git a/src/app/link-parser/link-parser/link-parser.component.ts b/src/app/link-parser/link-parser/link-parser.component.ts index d43e023..0223394 100644 --- a/src/app/link-parser/link-parser/link-parser.component.ts +++ b/src/app/link-parser/link-parser/link-parser.component.ts @@ -1,8 +1,9 @@ -import { ChangeDetectionStrategy, Component, computed, HostBinding, inject } from '@angular/core'; +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; import { LangService } from '../../shared/data-access/lang.service'; import { MetaTagsService } from '../../shared/data-access/meta-tags.service'; import { LinkParserService } from '../data-access/link-parser.service'; import { LinkParserSettingsService } from '../data-access/link-parser-settings.service'; +import { take } from 'rxjs'; @Component({ selector: 'app-link-parser', @@ -23,8 +24,13 @@ export class LinkParserComponent { public parser: LinkParserService = inject(LinkParserService) public setts = inject(LinkParserSettingsService) - constructor() { - this.initMeta() + constructor() { } + + ngOnInit() { + // this.initMeta() + this.lang.langChanged$.pipe(take(1)).subscribe(() => { + this.initMeta() + }); } initMeta() { diff --git a/src/app/link-parser/ui/footer/footer.component.scss b/src/app/link-parser/ui/footer/footer.component.scss index ae1f811..4c25488 100644 --- a/src/app/link-parser/ui/footer/footer.component.scss +++ b/src/app/link-parser/ui/footer/footer.component.scss @@ -1,8 +1,3 @@ made-in-ukraine, app-lang-toggle { margin-left: auto; } - -app-overlay { - position: absolute; - background: unset; -} \ No newline at end of file diff --git a/src/app/link-parser/ui/header/header.component.scss b/src/app/link-parser/ui/header/header.component.scss index 7a6c830..3036883 100644 --- a/src/app/link-parser/ui/header/header.component.scss +++ b/src/app/link-parser/ui/header/header.component.scss @@ -1,9 +1,3 @@ - -app-overlay{ - position: absolute; - background: unset; -} - app-lang-toggle { margin-left: auto; } \ No newline at end of file diff --git a/src/app/link-parser/ui/parser-form/parser-form.component.html b/src/app/link-parser/ui/parser-form/parser-form.component.html index 01576d1..813b4af 100644 --- a/src/app/link-parser/ui/parser-form/parser-form.component.html +++ b/src/app/link-parser/ui/parser-form/parser-form.component.html @@ -1,15 +1,16 @@

-
+
-
-
-
+ + +
diff --git a/src/app/link-parser/ui/parser-form/parser-form.component.scss b/src/app/link-parser/ui/parser-form/parser-form.component.scss index a2fe853..6cd35b2 100644 --- a/src/app/link-parser/ui/parser-form/parser-form.component.scss +++ b/src/app/link-parser/ui/parser-form/parser-form.component.scss @@ -1,7 +1,8 @@ :host { - display: grid; - row-gap: 1ch; - grid-template-columns: auto minmax(auto, 80ch) auto; + display: flex; + flex-direction: column; + row-gap: 2ch; + // grid-template-columns: auto minmax(auto, 80ch) auto; } .logo-text { @@ -129,23 +130,26 @@ app-text-embracer { @keyframes halloween { 0% { --halloween-base: #A0FF00; - + } 50% { - --halloween-base: #FF7518; + --halloween-base: #FF7518; } 100% { - --halloween-base: #6C2DC7; + --halloween-base: #6C2DC7; } } .form-wrapper { - grid-column: 2; + min-width: 0; + // grid-column: 2; display: grid; gap: 2ch; padding: 0px; + + place-content: center; } form { @@ -157,6 +161,17 @@ form { position: relative; } +app-file-change ::ng-deep .button { + padding-inline: 2ch; + font-family: 'Courier New', Courier, monospace; + // background: unset; + + text-overflow: ellipsis; +max-width: 90vw; + overflow: hidden; + white-space: nowrap; +} + input[type=url], textarea { display: block; diff --git a/src/app/link-parser/ui/parser-form/parser-form.component.ts b/src/app/link-parser/ui/parser-form/parser-form.component.ts index 021724f..a2fd831 100644 --- a/src/app/link-parser/ui/parser-form/parser-form.component.ts +++ b/src/app/link-parser/ui/parser-form/parser-form.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, computed, inject, PLATFORM_ID, signal, Signal, WritableSignal } from '@angular/core'; +import { AfterContentInit, AfterViewInit, ChangeDetectionStrategy, Component, computed, inject, PLATFORM_ID, signal, Signal, WritableSignal } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { LangService } from '../../../shared/data-access/lang.service'; import { Base64 } from '../../../shared/utils'; @@ -6,6 +6,8 @@ import { LinkParserSettingsService } from '../../data-access/link-parser-setting import { LinkParserService } from '../../data-access/link-parser.service'; import { ImgurLinkParser, MangadexLinkParser, TelegraphLinkParser, RedditLinkParser, ZenkoLinkParser, NhentaiLinkParser, YandereParser, PixivLinkParser, BlankaryLinkParser, JsonLinkParser } from '../../utils'; import { ComickLinkParser } from '../../utils/comick-link-parser'; +import { ImgchestLinkParser } from '../../utils/imgchest-link-parser'; +import { MetaTagsService } from '../../../shared/data-access/meta-tags.service'; @Component({ selector: 'app-parser-form', @@ -44,6 +46,7 @@ export class ParserFormComponent { this.parser.parsers.push(new ComickLinkParser) this.parser.parsers.push(new YandereParser) this.parser.parsers.push(new PixivLinkParser) + this.parser.parsers.push(new ImgchestLinkParser) // this.parser.parsers.push(new BlankaryLinkParser) this.parser.parsers.push(new JsonLinkParser) } @@ -107,6 +110,7 @@ export class ParserFormComponent { comick: '//comick.io/favicon.ico', yandere: '//yande.re/favicon.ico', pixiv: '//pixiv.net/favicon.ico', + imgchest: '//imgchest.com/assets/img/favicons/favicon-32x32.png?v=2', // blankary: '//blankary.com/favicon.ico', read: 'data:image/svg+xml,🗯️' } diff --git a/src/app/link-parser/utils/imgchest-link-parser.ts b/src/app/link-parser/utils/imgchest-link-parser.ts new file mode 100644 index 0000000..65ea129 --- /dev/null +++ b/src/app/link-parser/utils/imgchest-link-parser.ts @@ -0,0 +1,6 @@ +import { LinkParser } from "./link-parser"; + +export class ImgchestLinkParser extends LinkParser { + override regex = /imgchest\.com\/p\/([\w\d-]+)/; + override site = 'imgchest'; +}; diff --git a/src/app/list/list-shell/list-shell.component.ts b/src/app/list/list-shell/list-shell.component.ts index a0c6a14..632842e 100644 --- a/src/app/list/list-shell/list-shell.component.ts +++ b/src/app/list/list-shell/list-shell.component.ts @@ -4,16 +4,17 @@ import { BlankaryLinkParser, ImgurLinkParser, JsonLinkParser, LinkParser, Mangad import { DomManipulationService } from '../../shared/data-access'; import { LangService } from '../../shared/data-access/lang.service'; import { ComickLinkParser } from '../../link-parser/utils/comick-link-parser'; +import { ImgchestLinkParser } from '../../link-parser/utils/imgchest-link-parser'; @Component({ - selector: 'app-list-shell', - templateUrl: './list-shell.component.html', - styleUrls: [ - './list-shell.component.scss', - '../../shared/ui/@styles/input-group.scss' - ], - standalone: false + selector: 'app-list-shell', + templateUrl: './list-shell.component.html', + styleUrls: [ + './list-shell.component.scss', + '../../shared/ui/@styles/input-group.scss' + ], + standalone: false }) export class ListShellComponent { public inputValue: WritableSignal = signal('') @@ -92,6 +93,7 @@ export class ListShellComponent { this.parser.parsers.push(new ComickLinkParser) this.parser.parsers.push(new YandereParser) this.parser.parsers.push(new PixivLinkParser) + this.parser.parsers.push(new ImgchestLinkParser) // this.parser.parsers.push(new BlankaryLinkParser) this.parser.parsers.push(new JsonLinkParser) } diff --git a/src/app/shared/data-access/lang.service.ts b/src/app/shared/data-access/lang.service.ts index e69a78a..763eb0e 100644 --- a/src/app/shared/data-access/lang.service.ts +++ b/src/app/shared/data-access/lang.service.ts @@ -1,6 +1,6 @@ import { ChangeDetectorRef, Injectable, PLATFORM_ID, WritableSignal, inject, signal } from '@angular/core'; import { Phrases } from '../utils/phrases'; -import { Observable, map, of } from 'rxjs'; +import { Observable, Subject, map, of } from 'rxjs'; import { HttpClient } from '@angular/common/http'; import { ViewModeOption } from './viewer.service'; import { DOCUMENT, isPlatformBrowser } from '@angular/common'; @@ -24,6 +24,9 @@ export class LangService { ['uk', "manifest-uk.webmanifest"] ]); + private langChanged = new Subject(); + langChanged$ = this.langChanged.asObservable(); + langOpt = LANG_OPTIONS platformId = inject(PLATFORM_ID) private readonly document = inject(DOCUMENT); @@ -32,8 +35,8 @@ export class LangService { lang: WritableSignal = signal( (!isPlatformBrowser(this.platformId)) ? DEFAULT_LANG : - - localStorage?.getItem(LANG_STORAGE_NAME) ?? DEFAULT_LANG) + + localStorage?.getItem(LANG_STORAGE_NAME) ?? DEFAULT_LANG) ; linkManifestElement: WritableSignal = signal(this.document.querySelector('link[rel="manifest"]')) @@ -46,12 +49,12 @@ export class LangService { setLang(lang: string) { this.lang.set(lang) this.document.documentElement.lang = lang - - if(!isPlatformBrowser(this.platformId)) return; - - localStorage.setItem(LANG_STORAGE_NAME, lang) this.updateTranslate(); + // this.langChanged.next(); + if (!isPlatformBrowser(this.platformId)) return; + + localStorage.setItem(LANG_STORAGE_NAME, lang) this.vibro.vibrateLangToggle(this.lang()) } @@ -60,13 +63,16 @@ export class LangService { } updateTranslate() { - if (this.lang() == 'en') { - this.ph.set(new Phrases()); - return; + if (this.lang() == 'en') { + this.ph.set(new Phrases()); + this.langChanged.next(); + return; } - this.getTranslate(this.lang()).subscribe(data =>{ + this.getTranslate(this.lang()).subscribe(data => { this.ph.set(data) + this.langChanged.next(); + }) } diff --git a/src/app/shared/data-access/meta-tags.service.ts b/src/app/shared/data-access/meta-tags.service.ts index 2d17550..3d3744a 100644 --- a/src/app/shared/data-access/meta-tags.service.ts +++ b/src/app/shared/data-access/meta-tags.service.ts @@ -65,7 +65,7 @@ export class MetaTagsService { setOg() { this.meta.updateTag({ property: 'og:site_name', content: 'Chytanka' }) this.meta.updateTag({ property: 'og:locale', content: 'uk_UA' }) - this.meta.updateTag({ property: 'og:type', content: 'object' }) + this.meta.updateTag({ property: 'og:type', content: 'website' }) } setOgUrl(url: string) { diff --git a/src/app/shared/data-access/viewer.service.ts b/src/app/shared/data-access/viewer.service.ts index a1f26f7..550d00a 100644 --- a/src/app/shared/data-access/viewer.service.ts +++ b/src/app/shared/data-access/viewer.service.ts @@ -36,22 +36,25 @@ export class ViewerService { } initNightlight() { - if(!isPlatformBrowser(this.platformId)) return; - - const n = Number(localStorage.getItem('nightlight')) ?? 0; + this.nightlight.set(6500); + + if (!isPlatformBrowser(this.platformId)) return; + + const n = Number(localStorage.getItem('nightlight') ?? 6500); this.nightlight.set(n); } setNightlight(n: number) { - if(!isPlatformBrowser(this.platformId)) return; - this.nightlight.set(n); + + if (!isPlatformBrowser(this.platformId)) return; + localStorage.setItem('nightlight', n.toString()) } initViewModeOption() { - if(!isPlatformBrowser(this.platformId)) return; - + if (!isPlatformBrowser(this.platformId)) return; + const localOpt: ViewModeOption = JSON.parse(localStorage?.getItem(VIEW_MODE_OPT_NAME) ?? '{}'); const opt: ViewModeOption = this.getViewModeOptionByCode(localOpt?.code) ?? VIEV_MODE_OPTIONS[0] this.setViewModeOption(opt); diff --git a/src/app/shared/ui/file-change/file-change.component.html b/src/app/shared/ui/file-change/file-change.component.html index 2306670..8d165a5 100644 --- a/src/app/shared/ui/file-change/file-change.component.html +++ b/src/app/shared/ui/file-change/file-change.component.html @@ -1,6 +1,6 @@ - + @if(showDragAndDropZone){
diff --git a/src/app/shared/ui/file-change/file-change.component.scss b/src/app/shared/ui/file-change/file-change.component.scss index b299ce6..be14bb1 100644 --- a/src/app/shared/ui/file-change/file-change.component.scss +++ b/src/app/shared/ui/file-change/file-change.component.scss @@ -19,4 +19,9 @@ z-index: 1; border-radius: .25ch; } +} + +.button { + width: 100%; + text-align: unset; } \ No newline at end of file diff --git a/src/app/shared/ui/file-change/file-change.component.ts b/src/app/shared/ui/file-change/file-change.component.ts index ac3721d..d879914 100644 --- a/src/app/shared/ui/file-change/file-change.component.ts +++ b/src/app/shared/ui/file-change/file-change.component.ts @@ -18,6 +18,7 @@ export class FileChangeComponent implements OnInit { lang = inject(LangService) accept = input([]) + label = input("Open File") input: HTMLInputElement | undefined; showDragAndDropZone: boolean = false; diff --git a/src/app/shared/ui/manga-page/manga-page-even.component.html b/src/app/shared/ui/manga-page/manga-page-even.component.html index 88e6e80..4482967 100644 --- a/src/app/shared/ui/manga-page/manga-page-even.component.html +++ b/src/app/shared/ui/manga-page/manga-page-even.component.html @@ -12,4 +12,6 @@
-
\ No newline at end of file + + + \ No newline at end of file diff --git a/src/app/shared/ui/manga-page/manga-page-even.component.scss b/src/app/shared/ui/manga-page/manga-page-even.component.scss index e49a26c..4089250 100644 --- a/src/app/shared/ui/manga-page/manga-page-even.component.scss +++ b/src/app/shared/ui/manga-page/manga-page-even.component.scss @@ -1,7 +1,17 @@ +svg { + aspect-ratio: 257/364; + border: 1px solid; + grid-area: 1/4; + width: 100%; + pointer-events: none; + user-select: none; + visibility: hidden; +} + :host { display: grid; max-height: 100vh; - aspect-ratio: 2/3; + aspect-ratio: 257/364; --side-gap: 2rem; background-color: #fff; diff --git a/src/app/shared/ui/manga-page/manga-page.component.html b/src/app/shared/ui/manga-page/manga-page.component.html index 417eb96..724f98a 100644 --- a/src/app/shared/ui/manga-page/manga-page.component.html +++ b/src/app/shared/ui/manga-page/manga-page.component.html @@ -15,4 +15,5 @@ \ No newline at end of file + --> + \ No newline at end of file diff --git a/src/app/shared/ui/manga-page/manga-page.component.scss b/src/app/shared/ui/manga-page/manga-page.component.scss index 5b9588a..fd6d0d3 100644 --- a/src/app/shared/ui/manga-page/manga-page.component.scss +++ b/src/app/shared/ui/manga-page/manga-page.component.scss @@ -2,7 +2,7 @@ --side-gap: 2rem; display: grid; max-height: 100vh; - aspect-ratio: 2/3; + aspect-ratio: 257/364; background-color: #fff; color: #000; gap: 2ch 1ch; @@ -12,6 +12,16 @@ counter-reset: read-order; } +svg { + aspect-ratio: 257/364; + border: 1px solid; + grid-area: 1/4; + width: 100%; + pointer-events: none; + user-select: none; + visibility: hidden; +} + section { opacity: .8; border: .4ch solid; diff --git a/src/app/shared/ui/overlay/overlay.component.scss b/src/app/shared/ui/overlay/overlay.component.scss index 6651262..235dda3 100644 --- a/src/app/shared/ui/overlay/overlay.component.scss +++ b/src/app/shared/ui/overlay/overlay.component.scss @@ -2,28 +2,30 @@ display: flex; gap: 1ch; align-items: center; - opacity: 0; position: fixed; bottom: 0; left: 0; width: 100%; z-index: 1; - padding: 1ch calc(1rem + .25ch) 1.25ch 1rem; + // padding: 1ch calc(1rem + .25ch) 1.25ch 1rem; + padding: 2ch 3ch; pointer-events: none; - transition: opacity var(--t) cubic-bezier(.4, 0, 1, 1); - - font-size: 14px; + transition: transform var(--t) ease-in-out; + font-size: .8rem; line-height: 1; - background: var(--surface); - background: oklch(from var(--surface) calc(l + .05) c h); - &.show { - opacity: 1; - pointer-events: unset; - } + transform: translateY(100%); &.top { top: 0; bottom: unset; + transform: translateY(-100%); + + } + + &.show { + transform: translateY(0); + // opacity: 1; + pointer-events: unset; } } \ No newline at end of file diff --git a/src/app/shared/ui/viewer/components/viewer-footer/viewer-footer.component.scss b/src/app/shared/ui/viewer/components/viewer-footer/viewer-footer.component.scss index e69de29..e050ea1 100644 --- a/src/app/shared/ui/viewer/components/viewer-footer/viewer-footer.component.scss +++ b/src/app/shared/ui/viewer/components/viewer-footer/viewer-footer.component.scss @@ -0,0 +1,4 @@ +app-overlay { + padding-bottom: 2ch; + padding-top: unset; +} \ No newline at end of file diff --git a/src/app/shared/ui/viewer/components/viewer-header/viewer-header.component.html b/src/app/shared/ui/viewer/components/viewer-header/viewer-header.component.html index b114b22..18bdb0d 100644 --- a/src/app/shared/ui/viewer/components/viewer-header/viewer-header.component.html +++ b/src/app/shared/ui/viewer/components/viewer-header/viewer-header.component.html @@ -1,7 +1,7 @@ @if(!embedHelper.isEmbedded()){ 🏠 - + } @else { } @@ -10,7 +10,7 @@ } - {{episode?.title}} + {{episode?.title}} diff --git a/src/app/shared/ui/viewer/components/viewer-header/viewer-header.component.scss b/src/app/shared/ui/viewer/components/viewer-header/viewer-header.component.scss index 6f22513..d3150d2 100644 --- a/src/app/shared/ui/viewer/components/viewer-header/viewer-header.component.scss +++ b/src/app/shared/ui/viewer/components/viewer-header/viewer-header.component.scss @@ -76,7 +76,6 @@ textarea { .title { text-overflow: ellipsis; - overflow: hidden; white-space: nowrap; } \ No newline at end of file diff --git a/src/app/shared/ui/viewer/viewer.component.html b/src/app/shared/ui/viewer/viewer.component.html index edc75f9..9183a8f 100644 --- a/src/app/shared/ui/viewer/viewer.component.html +++ b/src/app/shared/ui/viewer/viewer.component.html @@ -29,8 +29,9 @@ [labelDisagree]="lang.ph().nsfwLabelDisagree" /> }
- +
@@ -39,8 +40,8 @@ }
-
- +
+
- map-hand-drawn-paper +
@@ -57,10 +57,6 @@ src="/assets/images/web-comics-svgrepo-com.svg" alt="map-hand-drawn-paper">
- -

Кінець епізоду

@if(episode?.publisher?.id) { -

Робота від {{episode?.publisher?.name}}

-
+

Робота від {{episode?.publisher?.name}}

+
@for (l of episode?.publisher?.links; track $index) { {{l.title}} } @@ -99,19 +97,6 @@
} - -
@defer{ diff --git a/src/app/shared/ui/viewer/viewer.component.scss b/src/app/shared/ui/viewer/viewer.component.scss index dda63fe..a88eb68 100644 --- a/src/app/shared/ui/viewer/viewer.component.scss +++ b/src/app/shared/ui/viewer/viewer.component.scss @@ -86,16 +86,17 @@ figure { } } -span.title { - text-shadow: 0 0 0.25ch black; - font-weight: bold; - color: white; -} +// span.title { +// text-shadow: 0 0 0.25ch black; +// font-weight: bold; +// color: white; +// border: 2px dashed cyan; +// } -span.separator { - user-select: none; - opacity: .5; -} +// span.separator { +// user-select: none; +// opacity: .5; +// } @@ -110,4 +111,18 @@ span.separator { img { pointer-events: none; user-select: none; +} +// .last-hint-page { +// // width: 100%; +// border: 2px dashed red; +// } +// app-manga-page-even { +// min-height: 0; +// max-height: 100dvh; +// width: 50vw; +// } + +app-manga-page-even.long, .last-hint-page.long { + height: unset; + width: 100%; } \ No newline at end of file diff --git a/src/app/shared/ui/viewer/viewer.long.component.scss b/src/app/shared/ui/viewer/viewer.long.component.scss index 4ce93e0..a936939 100644 --- a/src/app/shared/ui/viewer/viewer.long.component.scss +++ b/src/app/shared/ui/viewer/viewer.long.component.scss @@ -9,7 +9,7 @@ .view.long { // max-width: 100%; margin: 0 auto; - max-width: 72ch; + max-width: 800px; manga-page, app-manga-page-even { diff --git a/src/app/shared/ui/viewer/viewer.pages.component.scss b/src/app/shared/ui/viewer/viewer.pages.component.scss index 9e59bce..33638fe 100644 --- a/src/app/shared/ui/viewer/viewer.pages.component.scss +++ b/src/app/shared/ui/viewer/viewer.pages.component.scss @@ -1,12 +1,14 @@ .view.pages { --r: 0; overflow-x: auto; + overflow-y: hidden; + height: 100dvh; scroll-behavior: smooth; scroll-snap-type: x mandatory; display: flex; user-select: none; touch-action: pan-x; - + scrollbar-width: none; &:focus { outline: 0; } diff --git a/src/app/shared/ui/warm-control/warm-control.component.html b/src/app/shared/ui/warm-control/warm-control.component.html index f724312..85a1d02 100644 --- a/src/app/shared/ui/warm-control/warm-control.component.html +++ b/src/app/shared/ui/warm-control/warm-control.component.html @@ -1,7 +1,4 @@ - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/app/shared/ui/warm-control/warm-control.component.scss b/src/app/shared/ui/warm-control/warm-control.component.scss index 5cd21a2..ae9bd42 100644 --- a/src/app/shared/ui/warm-control/warm-control.component.scss +++ b/src/app/shared/ui/warm-control/warm-control.component.scss @@ -1,46 +1,58 @@ -:host{ +:host { --size-3: 1ch; - --size-1: 1ch; - --radius-2: .5ch; - --surface-2: hsl(203.44 8% 16%); - --surface-1: #ffd60a; - --link: #166496; + --size-1: 1ch; + --radius-2: .5ch; + --surface-2: hsl(203.44 8% 16%); + --surface-1: #ffd60a; + --link: #166496; position: relative; } input[type=range][orient=vertical] { - // appearance: slider-vertical; + appearance: slider-vertical; + -webkit-appearance: none; + -webkit-appearance: slider-vertical; writing-mode: vertical-rl; - width: 8px; + writing-mode: bt-lr; + width: 100%; height: 0; + min-height: 0; padding: 0 5px; transition: all var(--t) ease-in-out; opacity: 0; pointer-events: none; + z-index: 10; + position: absolute; + bottom: calc(100% + 1ch); + right: 0; + left: 0; - position: absolute; - bottom: calc(100% + 1ch); right: 0%; + &::-webkit-slider-thumb { + cursor: ns-resize; + } +} - &:focus { - height: 175px; - height: 50vh; - opacity: 1; +input[type=range][orient=vertical].active { + min-height: 175px; + height: 50vh; + opacity: 1; pointer-events: unset; - } } +::-moz-range-track { + border: 0; +} + +input[type=range][orient=vertical]::-moz-focus-inner { + border: 0; +} label { - // padding-inline: var(--size-3); - // padding-block: var(--size-1); - // border-radius: var(--radius-2); cursor: pointer; -display: block; - // background: var(--surface-2); - + display: block; } -:host:has(input[type=range][orient=vertical]:focus) label { +:host:has(input[type=range][orient=vertical]:focus) label { background-color: var(--link); - color: var(--surface-1); + color: var(--surface-1); } \ No newline at end of file diff --git a/src/app/shared/ui/warm-control/warm-control.component.ts b/src/app/shared/ui/warm-control/warm-control.component.ts index aee23fe..dae430e 100644 --- a/src/app/shared/ui/warm-control/warm-control.component.ts +++ b/src/app/shared/ui/warm-control/warm-control.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, signal } from '@angular/core'; import { LangService } from '../../data-access/lang.service'; @Component({ @@ -9,8 +9,9 @@ import { LangService } from '../../data-access/lang.service'; standalone: false }) export class WarmControlComponent { + active = signal(false) - @Input() value: any; + @Input() value: number = 6500; @Output() valueChange = new EventEmitter(); @@ -20,4 +21,8 @@ export class WarmControlComponent { } constructor(public lang: LangService){} + + toggleActive() { + this.active.update(v=>!v); + } } diff --git a/src/app/shared/ui/warm-filter/warm-filter.component.ts b/src/app/shared/ui/warm-filter/warm-filter.component.ts index 3ad3e57..372bdba 100644 --- a/src/app/shared/ui/warm-filter/warm-filter.component.ts +++ b/src/app/shared/ui/warm-filter/warm-filter.component.ts @@ -9,7 +9,7 @@ import { ChangeDetectionStrategy, Component, computed, HostBinding, input, Input }) export class WarmFilterComponent { - kelvin = input(5000) + kelvin = input(6500) matrixKelvin = computed(() => { const { r, g, b } = this.kelvinToRgbMatrix(this.kelvin()) diff --git a/src/app/shared/utils/phrases.ts b/src/app/shared/utils/phrases.ts index 5427742..285142d 100644 --- a/src/app/shared/utils/phrases.ts +++ b/src/app/shared/utils/phrases.ts @@ -1,7 +1,7 @@ export class Phrases { title: string = "Chytanka — read it easily and comfortably!"; shortTitle: string = "Chytanka"; - enterLink: string = "Enter link to episode on the supported sites"; + enterLink: string = "Insert link to episode on the supported sites"; orOpenFile = "or open file" slogan: string = "and read it easily and comfortably!"; sloganPride: string = "Read freely! Love boldly!"; diff --git a/src/assets/fonts/Troubleside.ttf b/src/assets/fonts/Troubleside.ttf deleted file mode 100644 index 376787e..0000000 Binary files a/src/assets/fonts/Troubleside.ttf and /dev/null differ diff --git a/src/assets/fonts/Troubleside.woff2 b/src/assets/fonts/Troubleside.woff2 new file mode 100644 index 0000000..e7324b9 Binary files /dev/null and b/src/assets/fonts/Troubleside.woff2 differ diff --git a/src/assets/langs/uk.json b/src/assets/langs/uk.json index ae12fef..5b58941 100644 --- a/src/assets/langs/uk.json +++ b/src/assets/langs/uk.json @@ -1,7 +1,7 @@ { "title": "Читанка — читай легко і комфортно!", "shortTitle": "Читанка", - "enterLink": "Введи посилання на епізод з сайтів, що підтримуютсья", + "enterLink": "Встав посилання на епізод з сайтів, що підтримуютсья", "orOpenFile":" або відкрий файл", "slogan": "і читай легко та зручно!", "letsgo": "Вйо до", diff --git a/src/assets/logos/imgchest.png b/src/assets/logos/imgchest.png new file mode 100644 index 0000000..396524b Binary files /dev/null and b/src/assets/logos/imgchest.png differ diff --git a/src/environments/environment.development.ts b/src/environments/environment.development.ts index 43a512b..feff8d8 100644 --- a/src/environments/environment.development.ts +++ b/src/environments/environment.development.ts @@ -1,4 +1,4 @@ -const PROXY = `https://proxy.chytanka.ink/api?url=` +const PROXY = `http://localhost:5000/api?url=` export const environment = { version: "0.13.32-2025.6.8", @@ -6,6 +6,7 @@ export const environment = { proxy: PROXY, blankaryoHost: `https://blankary.com/page/`, imgurHost: 'https://api.imgur.com/3/album/', + imgchestHost: 'https://api.imgchest.com/v1/post/', mangadexHost: `https://api.mangadex.org/at-home/server/`, mangadexChapter: `https://api.mangadex.org/chapter/`, mangadexManga: `https://api.mangadex.org/manga/`, diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 06cb969..71312fa 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -6,6 +6,7 @@ export const environment = { proxy: PROXY, blankaryoHost: `https://blankary.com/page/`, imgurHost: 'https://api.imgur.com/3/album/', + imgchestHost: 'https://api.imgchest.com/v1/post/', mangadexHost: `https://api.mangadex.org/at-home/server/`, mangadexChapter: `https://api.mangadex.org/chapter/`, mangadexManga: `https://api.mangadex.org/manga/`, diff --git a/src/manifest-uk.webmanifest b/src/manifest-uk.webmanifest index a426c55..63ef401 100644 --- a/src/manifest-uk.webmanifest +++ b/src/manifest-uk.webmanifest @@ -5,7 +5,6 @@ "categories": [ "entertainment", "books", - "books", "photo" ], "theme_color": "#002741", diff --git a/src/manifest.webmanifest b/src/manifest.webmanifest index c43446b..fb39bff 100644 --- a/src/manifest.webmanifest +++ b/src/manifest.webmanifest @@ -5,7 +5,6 @@ "categories": [ "entertainment", "books", - "books", "photo" ], "theme_color": "#002741", diff --git a/src/styles.scss b/src/styles.scss index 171d819..d5b0946 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,6 +1,6 @@ @font-face { font-family: 'Troubleside'; - src: url('/assets/fonts/Troubleside.ttf'); + src: url('/assets/fonts/Troubleside.woff2'); font-display: swap; }