flipbookengine 0.6.5 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +115 -75
- package/README.md +429 -295
- package/dist/components/AnnotationPlacement.d.ts +5 -0
- package/dist/components/AnnotationPopover.d.ts +10 -0
- package/dist/components/App.d.ts +26 -0
- package/dist/components/HotspotLayer.d.ts +14 -0
- package/dist/components/NoteEditor.d.ts +13 -0
- package/dist/components/NotePlacementLayer.d.ts +11 -0
- package/dist/components/NotesPanel.d.ts +17 -0
- package/dist/components/PluginPanels.d.ts +5 -0
- package/dist/components/ReaderHelp.d.ts +3 -0
- package/dist/components/ReaderShortcuts.d.ts +16 -0
- package/dist/components/SearchPanel.d.ts +11 -0
- package/dist/components/TableOfContents.d.ts +1 -0
- package/dist/components/TextLayer.d.ts +8 -0
- package/dist/components/Toolbar.d.ts +7 -1
- package/dist/components/ToolbarMore.d.ts +6 -0
- package/dist/components/Viewer.d.ts +8 -0
- package/dist/core/LayoutManager.d.ts +1 -1
- package/dist/core/PdfRenderer.d.ts +11 -0
- package/dist/core/TextLayerLoader.d.ts +5 -0
- package/dist/core/domSignal.d.ts +2 -0
- package/dist/core-entry.d.ts +14 -0
- package/dist/core.d.ts +1 -0
- package/dist/embed.d.ts +80 -0
- package/dist/engine-DD5qEHLm.js +4657 -0
- package/dist/engine-DD5qEHLm.js.map +1 -0
- package/dist/engine.d.ts +124 -0
- package/dist/feature-Cicli9ie.js +17 -0
- package/dist/feature-Cicli9ie.js.map +1 -0
- package/dist/flipbook-engine.core.js +8 -0
- package/dist/flipbook-engine.core.js.map +1 -0
- package/dist/flipbook-engine.css +1 -1
- package/dist/flipbook-engine.iife.js +51 -55
- package/dist/flipbook-engine.iife.js.map +1 -1
- package/dist/flipbook-engine.js +10 -6
- package/dist/flipbook-engine.js.map +1 -1
- package/dist/flipbook-engine.plugins-annotations.js +14 -0
- package/dist/flipbook-engine.plugins-annotations.js.map +1 -0
- package/dist/flipbook-engine.plugins-bookmarks.js +16 -0
- package/dist/flipbook-engine.plugins-bookmarks.js.map +1 -0
- package/dist/flipbook-engine.plugins-deep-link.js +14 -0
- package/dist/flipbook-engine.plugins-deep-link.js.map +1 -0
- package/dist/flipbook-engine.plugins-hotspots.js +15 -0
- package/dist/flipbook-engine.plugins-hotspots.js.map +1 -0
- package/dist/flipbook-engine.plugins-notes.js +16 -0
- package/dist/flipbook-engine.plugins-notes.js.map +1 -0
- package/dist/flipbook-engine.plugins-search.js +15 -0
- package/dist/flipbook-engine.plugins-search.js.map +1 -0
- package/dist/flipbook-engine.plugins-share.js +13 -0
- package/dist/flipbook-engine.plugins-share.js.map +1 -0
- package/dist/flipbook-engine.plugins-toc.js +14 -0
- package/dist/flipbook-engine.plugins-toc.js.map +1 -0
- package/dist/flipbook-engine.plugins.js +5 -0
- package/dist/flipbook-engine.plugins.js.map +1 -0
- package/dist/flipbook-engine.react.js +1 -1
- package/dist/flipbook-engine.vue.js +1 -1
- package/dist/i18n/locales/en.d.ts +39 -0
- package/dist/i18n/locales/tr.d.ts +39 -0
- package/dist/i18n/service.d.ts +117 -0
- package/dist/index-BhTR2SK6.js +366 -0
- package/dist/index-BhTR2SK6.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/model/annotations.d.ts +15 -0
- package/dist/model/backend.d.ts +8 -0
- package/dist/model/hotspots.d.ts +40 -0
- package/dist/model/note-editor.d.ts +22 -0
- package/dist/model/search.d.ts +25 -0
- package/dist/model/text-layer.d.ts +21 -0
- package/dist/plugins/annotations.d.ts +4 -0
- package/dist/plugins/bookmarks.d.ts +4 -0
- package/dist/plugins/deep-link.d.ts +4 -0
- package/dist/plugins/feature.d.ts +5 -0
- package/dist/plugins/hotspots.d.ts +4 -0
- package/dist/plugins/index.d.ts +65 -0
- package/dist/plugins/notes.d.ts +4 -0
- package/dist/plugins/search.d.ts +4 -0
- package/dist/plugins/share.d.ts +4 -0
- package/dist/plugins/toc.d.ts +4 -0
- package/dist/plugins-annotations.d.ts +1 -0
- package/dist/plugins-bookmarks.d.ts +1 -0
- package/dist/plugins-deep-link.d.ts +1 -0
- package/dist/plugins-hotspots.d.ts +1 -0
- package/dist/plugins-notes.d.ts +1 -0
- package/dist/plugins-search.d.ts +1 -0
- package/dist/plugins-share.d.ts +1 -0
- package/dist/plugins-toc.d.ts +1 -0
- package/dist/plugins.d.ts +1 -0
- package/dist/state/store.d.ts +35 -5
- package/dist/vue/index.d.ts +1 -1
- package/docs/api-reference.md +228 -0
- package/docs/backend-text-layers.md +40 -0
- package/docs/frameworks.md +73 -0
- package/docs/getting-started.md +128 -0
- package/docs/i18n.md +47 -0
- package/docs/migration-0.4.0.md +24 -0
- package/docs/migration-0.5.0.md +25 -0
- package/docs/migration-1.0.0.md +59 -0
- package/docs/plugin-architecture.md +103 -0
- package/docs/release-checklist.md +37 -0
- package/docs/theming.md +61 -0
- package/package.json +52 -1
- package/dist/engine-DhQ2zxpm.js +0 -3535
- package/dist/engine-DhQ2zxpm.js.map +0 -1
package/dist/engine.d.ts
CHANGED
|
@@ -1,10 +1,26 @@
|
|
|
1
|
+
import { FlipbookTextLayerProvider } from './model/text-layer';
|
|
2
|
+
import { FlipbookSearchProvider, FlipbookNoteProvider, FlipbookAnnotationProvider } from './model/backend';
|
|
3
|
+
import { FlipbookNoteDocument, FlipbookNoteEditorFactory } from './model/note-editor';
|
|
1
4
|
import { FlipbookPageAsset } from './model/pages';
|
|
2
5
|
import { FlipbookBackgrounds, FlipbookThemeMode } from './theme/theme';
|
|
3
6
|
import { FlipbookLocale, PartialFlipbookMessages } from './i18n/service';
|
|
4
7
|
import { PdfPageMode } from './core/PdfRenderer';
|
|
5
8
|
import { FlipbookTocEntry } from './model/toc';
|
|
9
|
+
import { FlipbookSearchOptions, FlipbookSearchResult } from './model/search';
|
|
10
|
+
import { FlipbookHotspot } from './model/hotspots';
|
|
11
|
+
import { FlipbookAnnotation } from './model/annotations';
|
|
12
|
+
import { FlipbookEmbedBridge, FlipbookEmbedOptions } from './embed';
|
|
13
|
+
import { FlipbookPluginRegistry, FlipbookPlugin } from './plugins';
|
|
6
14
|
|
|
7
15
|
export interface FlipbookEngineOptions {
|
|
16
|
+
textLayerProvider?: FlipbookTextLayerProvider;
|
|
17
|
+
/** Opt in to selection; turning pages remains available through toolbar/keyboard. */
|
|
18
|
+
textSelection?: boolean;
|
|
19
|
+
searchProvider?: FlipbookSearchProvider;
|
|
20
|
+
noteProvider?: FlipbookNoteProvider;
|
|
21
|
+
annotationProvider?: FlipbookAnnotationProvider;
|
|
22
|
+
noteEditor?: FlipbookNoteEditorFactory;
|
|
23
|
+
noteDocuments?: Record<number, FlipbookNoteDocument>;
|
|
8
24
|
allowDownload?: boolean;
|
|
9
25
|
showThumbs?: boolean;
|
|
10
26
|
showToc?: boolean;
|
|
@@ -27,6 +43,8 @@ export interface FlipbookEngineOptions {
|
|
|
27
43
|
className?: string;
|
|
28
44
|
cssVariables?: Record<string, string>;
|
|
29
45
|
onDownload?: (url: string) => void;
|
|
46
|
+
/** Called after the toolbar creates and shares/copies the current page URL. */
|
|
47
|
+
onShare?: (url: string) => void;
|
|
30
48
|
singleMode?: boolean;
|
|
31
49
|
isSingleMode?: boolean;
|
|
32
50
|
autoPlay?: boolean;
|
|
@@ -39,6 +57,18 @@ export interface FlipbookEngineOptions {
|
|
|
39
57
|
pdfWorkerSrc?: string;
|
|
40
58
|
/** Controls PDF page splitting: auto detects A3 landscape, single disables it, split splits every landscape page. */
|
|
41
59
|
pdfPageMode?: PdfPageMode;
|
|
60
|
+
/** Enables URL-based page deep links and browser history synchronization. */
|
|
61
|
+
deepLink?: boolean;
|
|
62
|
+
/** Zero-based page indexes initially marked as bookmarks. */
|
|
63
|
+
bookmarks?: number[];
|
|
64
|
+
/** Initial host-managed notes keyed by zero-based page index. */
|
|
65
|
+
notes?: Record<number, string>;
|
|
66
|
+
/** Optional interactive overlays anchored to logical pages using 0..1 coordinates. */
|
|
67
|
+
hotspots?: FlipbookHotspot[];
|
|
68
|
+
/** Optional host-provided note markers anchored to logical pages. */
|
|
69
|
+
annotations?: FlipbookAnnotation[];
|
|
70
|
+
/** Plugins installed before the first viewer render. */
|
|
71
|
+
plugins?: FlipbookPlugin[];
|
|
42
72
|
}
|
|
43
73
|
export interface PageImages extends FlipbookPageAsset {
|
|
44
74
|
pageNumber: number;
|
|
@@ -83,12 +113,45 @@ export interface FlipbookEngineEventMap {
|
|
|
83
113
|
message: string;
|
|
84
114
|
cause?: unknown;
|
|
85
115
|
};
|
|
116
|
+
deepLinkChange: {
|
|
117
|
+
pageIndex: number;
|
|
118
|
+
pageNumber: number;
|
|
119
|
+
url: string;
|
|
120
|
+
};
|
|
121
|
+
bookmarkChange: {
|
|
122
|
+
pageIndex: number;
|
|
123
|
+
pageNumber: number;
|
|
124
|
+
bookmarked: boolean;
|
|
125
|
+
};
|
|
126
|
+
noteChange: {
|
|
127
|
+
pageIndex: number;
|
|
128
|
+
pageNumber: number;
|
|
129
|
+
note: string | null;
|
|
130
|
+
};
|
|
131
|
+
searchChange: {
|
|
132
|
+
query: string;
|
|
133
|
+
results: FlipbookSearchResult[];
|
|
134
|
+
};
|
|
135
|
+
hotspotActivate: {
|
|
136
|
+
hotspot: FlipbookHotspot;
|
|
137
|
+
pageIndex: number;
|
|
138
|
+
};
|
|
139
|
+
annotationActivate: {
|
|
140
|
+
annotation: FlipbookAnnotation;
|
|
141
|
+
pageIndex: number;
|
|
142
|
+
};
|
|
143
|
+
annotationChange: {
|
|
144
|
+
annotation: FlipbookAnnotation;
|
|
145
|
+
action: 'save' | 'delete';
|
|
146
|
+
};
|
|
86
147
|
}
|
|
87
148
|
export type FlipbookEngineEventName = keyof FlipbookEngineEventMap;
|
|
88
149
|
export type FlipbookLocaleMessages = PartialFlipbookMessages | Partial<Record<string, PartialFlipbookMessages>>;
|
|
89
150
|
type FlipbookEventHandler<T extends FlipbookEngineEventName> = (payload: FlipbookEngineEventMap[T]) => void;
|
|
90
151
|
export declare class FlipbookEngine {
|
|
91
152
|
private selector;
|
|
153
|
+
private searchSequence;
|
|
154
|
+
private textLayerStop;
|
|
92
155
|
private static readonly DEFAULT_PAGE_VIEWPORT;
|
|
93
156
|
private container;
|
|
94
157
|
private options;
|
|
@@ -111,6 +174,8 @@ export declare class FlipbookEngine {
|
|
|
111
174
|
private readonly pdfRenderedPages;
|
|
112
175
|
private readonly pdfRenderedSources;
|
|
113
176
|
private pdfSourcePageCount;
|
|
177
|
+
private deepLinkListener;
|
|
178
|
+
private readonly pluginRegistry;
|
|
114
179
|
constructor(selector: string | HTMLElement, options?: FlipbookEngineOptions);
|
|
115
180
|
init(pdfUrl: string, imageList?: Array<PageImages | FlipbookPageAsset>): Promise<void>;
|
|
116
181
|
private createPdfPlaceholder;
|
|
@@ -122,6 +187,53 @@ export declare class FlipbookEngine {
|
|
|
122
187
|
goToPage(targetIdx: number): void;
|
|
123
188
|
getTotalPages(): number;
|
|
124
189
|
getCurrentPage(): number;
|
|
190
|
+
/** Returns the normalized host-provided table of contents. */
|
|
191
|
+
getToc(): FlipbookTocEntry[];
|
|
192
|
+
/** Replaces the table of contents and optionally opens its panel. */
|
|
193
|
+
setToc(entries: FlipbookTocEntry[], show?: boolean): void;
|
|
194
|
+
/** Installs a plugin. Plugins installed after init are available to the next render. */
|
|
195
|
+
installPlugin(plugin: FlipbookPlugin): this;
|
|
196
|
+
/** Removes an installed plugin and all of its registered contributions. */
|
|
197
|
+
uninstallPlugin(name: string): boolean;
|
|
198
|
+
/** Returns the names of installed plugins. */
|
|
199
|
+
getPluginNames(): string[];
|
|
200
|
+
/** Calls a namespaced API registered by a plugin. */
|
|
201
|
+
callPluginApi<T = unknown>(pluginName: string, apiName: string, ...args: any[]): Promise<T>;
|
|
202
|
+
/** Internal UI registry used by the built-in DOM renderer. */
|
|
203
|
+
getPluginRegistry(): FlipbookPluginRegistry;
|
|
204
|
+
/** Returns the zero-based page indexes currently marked as bookmarks. */
|
|
205
|
+
getBookmarkedPages(): number[];
|
|
206
|
+
/** Returns whether a zero-based page index is bookmarked. */
|
|
207
|
+
isBookmarked(pageIndex?: number): boolean;
|
|
208
|
+
/** Sets the bookmark state for a zero-based page index and emits bookmarkChange when it changes. */
|
|
209
|
+
setBookmark(pageIndex: number, bookmarked?: boolean): void;
|
|
210
|
+
/** Toggles the bookmark state for a zero-based page index. */
|
|
211
|
+
toggleBookmark(pageIndex?: number): void;
|
|
212
|
+
/** Returns all non-empty host-managed notes keyed by zero-based page index. */
|
|
213
|
+
getNotes(): Record<number, string>;
|
|
214
|
+
/** Returns the note for a zero-based page index, if one exists. */
|
|
215
|
+
getNote(pageIndex?: number): string | undefined;
|
|
216
|
+
/** Sets or clears a host-managed note and emits noteChange when it changes. */
|
|
217
|
+
setNote(pageIndex: number, note: string): void;
|
|
218
|
+
/** Clears the host-managed note for a zero-based page index. */
|
|
219
|
+
clearNote(pageIndex?: number): void;
|
|
220
|
+
/** Searches the loaded PDF text without rendering pages and updates result highlights. */
|
|
221
|
+
search(query: string, options?: FlipbookSearchOptions): Promise<FlipbookSearchResult[]>;
|
|
222
|
+
private mapSearchHighlights;
|
|
223
|
+
/** Clears the current client-side search. */
|
|
224
|
+
clearSearch(): void;
|
|
225
|
+
getSearchResults(): FlipbookSearchResult[];
|
|
226
|
+
/** The native editor commits locally only after host persistence succeeds. */
|
|
227
|
+
saveNote(pageIndex: number, note: string | null, document?: FlipbookNoteDocument): Promise<boolean>;
|
|
228
|
+
getHotspots(pageIndex?: number): FlipbookHotspot[];
|
|
229
|
+
activateHotspot(hotspotId: string): void;
|
|
230
|
+
closeHotspot(): void;
|
|
231
|
+
getAnnotations(pageIndex?: number): FlipbookAnnotation[];
|
|
232
|
+
activateAnnotation(annotationId: string): void;
|
|
233
|
+
closeAnnotation(): void;
|
|
234
|
+
beginAnnotation(): void;
|
|
235
|
+
placeAnnotation(pageIndex: number, x: number, y: number): void;
|
|
236
|
+
saveAnnotation(annotation: FlipbookAnnotation, action?: 'save' | 'delete'): Promise<boolean>;
|
|
125
237
|
getZoom(): number;
|
|
126
238
|
setZoom(zoomLevel: number): void;
|
|
127
239
|
nextPage(): void;
|
|
@@ -130,11 +242,23 @@ export declare class FlipbookEngine {
|
|
|
130
242
|
prevPage(): void;
|
|
131
243
|
setSingleMode(isSingle: boolean): void;
|
|
132
244
|
updateOptions(options: Partial<FlipbookEngineOptions>): void;
|
|
245
|
+
private setupDeepLinkListener;
|
|
246
|
+
private teardownDeepLinkListener;
|
|
247
|
+
private readDeepLinkPage;
|
|
248
|
+
private applyInitialDeepLink;
|
|
249
|
+
private updateDeepLink;
|
|
250
|
+
/** Returns a shareable URL addressing a 1-based page number. */
|
|
251
|
+
getPageUrl(pageIndex?: number): string;
|
|
252
|
+
/** Opens the native share dialog or copies a page URL to the clipboard. */
|
|
253
|
+
sharePage(pageIndex?: number): Promise<string>;
|
|
254
|
+
/** Connects an optional postMessage bridge for iframe/embed integrations. */
|
|
255
|
+
connectEmbed(options?: FlipbookEmbedOptions): FlipbookEmbedBridge;
|
|
133
256
|
setPages(imageList?: Array<PageImages | FlipbookPageAsset>, pdfUrl?: string): Promise<void>;
|
|
134
257
|
private setupQualityLoading;
|
|
135
258
|
private teardownQualityLoading;
|
|
136
259
|
private setupEventSync;
|
|
137
260
|
private captureEventState;
|
|
261
|
+
setTextSelection(enabled: boolean): void;
|
|
138
262
|
destroy(keepContainer?: boolean): void;
|
|
139
263
|
private createAbortError;
|
|
140
264
|
on<T extends FlipbookEngineEventName>(eventName: T, handler: FlipbookEventHandler<T>): () => void;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FlipbookEngine v1.0.0
|
|
3
|
+
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
4
|
+
*/
|
|
5
|
+
function s(t, n) {
|
|
6
|
+
return {
|
|
7
|
+
name: t,
|
|
8
|
+
install(a, r) {
|
|
9
|
+
const c = Object.entries(n(a, r)).map(([e, i]) => r.registerApi(e, i));
|
|
10
|
+
return () => c.forEach((e) => e());
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
s as c
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=feature-Cicli9ie.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-Cicli9ie.js","sources":["../src/plugins/feature.ts"],"sourcesContent":["/**\n * @license FlipbookEngine v1.0.0\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport type { FlipbookEngine } from '../engine';\nimport type { FlipbookPlugin, FlipbookPluginApiHandler, FlipbookPluginContext } from './index';\n\nexport type FeatureApiFactory = (engine: FlipbookEngine, context: FlipbookPluginContext) => Record<string, FlipbookPluginApiHandler>;\n\nexport function createFeaturePlugin(name: string, factory: FeatureApiFactory): FlipbookPlugin {\n return {\n name,\n install(engine, context) {\n const cleanups = Object.entries(factory(engine, context)).map(([apiName, handler]) => context.registerApi(apiName, handler));\n return () => cleanups.forEach((cleanup) => cleanup());\n }\n };\n}\n"],"names":["createFeaturePlugin","name","factory","engine","context","cleanups","apiName","handler","cleanup"],"mappings":"AAAA;AAAA;AAAA;AAAA;AASO,SAASA,EAAoBC,GAAcC,GAA4C;AAC5F,SAAO;AAAA,IACL,MAAAD;AAAA,IACA,QAAQE,GAAQC,GAAS;AACvB,YAAMC,IAAW,OAAO,QAAQH,EAAQC,GAAQC,CAAO,CAAC,EAAE,IAAI,CAAC,CAACE,GAASC,CAAO,MAAMH,EAAQ,YAAYE,GAASC,CAAO,CAAC;AAC3H,aAAO,MAAMF,EAAS,QAAQ,CAACG,MAAYA,GAAS;AAAA,IACtD;AAAA,EAAA;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flipbook-engine.core.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
package/dist/flipbook-engine.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--flipbook-bg-main: var(--bs-body-bg, #f8f9fa);--flipbook-bg-surface: var(--bs-secondary-bg, #ffffff);--flipbook-bg-surface-alt: var(--bs-tertiary-bg, #f1f3f5);--flipbook-bg-panel: var(--bs-dark, #212529);--flipbook-bg-panel-soft: color-mix(in srgb, var(--flipbook-bg-panel) 88%, white 12%);--flipbook-text-main: var(--bs-body-color, #212529);--flipbook-text-muted: var(--bs-secondary-color, #6c757d);--flipbook-toolbar-text: #f8f9fa;--flipbook-toolbar-button-text: #f8f9fa;--flipbook-border: var(--bs-border-color, rgba(0, 0, 0, .15));--flipbook-accent: var(--bs-primary, #0d6efd);--flipbook-accent-text: #ffffff;--flipbook-thumbrail-bg: color-mix(in srgb, var(--flipbook-bg-panel) 95%, black 5%);--flipbook-thumb-bg: #ffffff;--flipbook-thumb-text: #ffffff;--flipbook-thumbscroll-track: rgba(0, 0, 0, .18);--flipbook-thumbscroll-thumb: rgba(255, 255, 255, .22);--flipbook-navbutton-bg: rgba(0, 0, 0, .6);--flipbook-navbutton-text: #ffffff;--flipbook-shadow: rgba(0, 0, 0, .35);--flipbook-bookpage-bg: #ffffff;--flipbook-emptycover-bg: var(--flipbook-bg-panel);--flipbook-download-bg: #198754;--flipbook-download-border: #198754;--flipbook-download-text: #ffffff;--flipbook-settings-bg: var(--flipbook-bg-surface);--flipbook-settings-text: var(--flipbook-text-main);--flipbook-radius-sm: .375rem;--flipbook-radius-md: .5rem;--flipbook-toolbar-height: 60px;--flipbook-thumbs-height: 108px;--flipbook-navbutton-size: 50px;--flipbook-page-padding: clamp(12px, 2vw, 24px);--flipbook-watermark-height: 19px;--flipbook-watermark-top: 6px;--flipbook-watermark-bottom: 6px;--flipbook-presentation-gutter: 18px;--flipbook-font-family: var(--bs-body-font-family, system-ui, -apple-system, "Segoe UI", sans-serif);--flipbook-viewer-bg-color: var(--flipbook-bg-light-color, var(--flipbook-bg-main));--flipbook-viewer-bg-image: var(--flipbook-bg-light-image, none);--flipbook-viewer-bg-size: var(--flipbook-bg-light-size, auto);--flipbook-viewer-bg-position: var(--flipbook-bg-light-position, center);--flipbook-viewer-bg-repeat: var(--flipbook-bg-light-repeat, no-repeat)}[data-bs-theme=dark]{--flipbook-bg-main: var(--bs-body-bg, #121826);--flipbook-bg-surface: var(--bs-secondary-bg, #1b2232);--flipbook-bg-surface-alt: var(--bs-tertiary-bg, #222b3c);--flipbook-bg-panel: #141927;--flipbook-bg-panel-soft: #1d2434;--flipbook-text-main: var(--bs-body-color, #f8f9fa);--flipbook-text-muted: var(--bs-secondary-color, #adb5bd);--flipbook-toolbar-text: #f8f9fa;--flipbook-toolbar-button-text: #f8f9fa;--flipbook-border: var(--bs-border-color, rgba(255, 255, 255, .12));--flipbook-thumbrail-bg: #101522;--flipbook-thumb-bg: #ffffff;--flipbook-settings-bg: #1d2434;--flipbook-settings-text: #f8f9fa;--flipbook-emptycover-bg: #101522;--flipbook-shadow: rgba(0, 0, 0, .5)}.bk-theme-light{color-scheme:light;--flipbook-viewer-bg-color: var(--flipbook-bg-light-color, var(--flipbook-bg-main));--flipbook-viewer-bg-image: var(--flipbook-bg-light-image, none);--flipbook-viewer-bg-size: var(--flipbook-bg-light-size, auto);--flipbook-viewer-bg-position: var(--flipbook-bg-light-position, center);--flipbook-viewer-bg-repeat: var(--flipbook-bg-light-repeat, no-repeat);--flipbook-bg-main: #f8fafc;--flipbook-bg-surface: #ffffff;--flipbook-bg-surface-alt: #f1f5f9;--flipbook-bg-panel: #e2e8f0;--flipbook-bg-panel-soft: #f1f5f9;--flipbook-text-main: #0f172a;--flipbook-text-muted: #64748b;--flipbook-toolbar-text: #0f172a;--flipbook-toolbar-button-text: #334155;--flipbook-border: rgba(15, 23, 42, .1);--flipbook-accent: #4f46e5;--flipbook-accent-text: #ffffff;--flipbook-thumbrail-bg: #f8fafc;--flipbook-thumb-bg: #ffffff;--flipbook-thumb-text: #0f172a;--flipbook-thumbscroll-track: rgba(15, 23, 42, .08);--flipbook-thumbscroll-thumb: rgba(15, 23, 42, .18);--flipbook-navbutton-bg: rgba(15, 23, 42, .65);--flipbook-navbutton-text: #ffffff;--flipbook-shadow: rgba(15, 23, 42, .08);--flipbook-bookpage-bg: #ffffff;--flipbook-emptycover-bg: #e2e8f0;--flipbook-download-bg: #10b981;--flipbook-download-border: #10b981;--flipbook-download-text: #ffffff;--flipbook-settings-bg: #ffffff;--flipbook-settings-text: #0f172a}.bk-theme-dark{color-scheme:dark;--flipbook-viewer-bg-color: var(--flipbook-bg-dark-color, var(--flipbook-bg-main));--flipbook-viewer-bg-image: var(--flipbook-bg-dark-image, none);--flipbook-viewer-bg-size: var(--flipbook-bg-dark-size, auto);--flipbook-viewer-bg-position: var(--flipbook-bg-dark-position, center);--flipbook-viewer-bg-repeat: var(--flipbook-bg-dark-repeat, no-repeat);--flipbook-bg-main: #0b0f19;--flipbook-bg-surface: #111827;--flipbook-bg-surface-alt: #1f2937;--flipbook-bg-panel: #111827;--flipbook-bg-panel-soft: #1f2937;--flipbook-text-main: #f9fafb;--flipbook-text-muted: #9ca3af;--flipbook-toolbar-text: #f9fafb;--flipbook-toolbar-button-text: #e5e7eb;--flipbook-border: rgba(255, 255, 255, .08);--flipbook-accent: #7367f0;--flipbook-accent-text: #ffffff;--flipbook-thumbrail-bg: #0b0f19;--flipbook-thumb-bg: #1f2937;--flipbook-thumb-text: #f9fafb;--flipbook-thumbscroll-track: rgba(255, 255, 255, .08);--flipbook-thumbscroll-thumb: rgba(255, 255, 255, .18);--flipbook-navbutton-bg: rgba(0, 0, 0, .6);--flipbook-navbutton-text: #ffffff;--flipbook-shadow: rgba(0, 0, 0, .5);--flipbook-bookpage-bg: #ffffff;--flipbook-emptycover-bg: #101522;--flipbook-download-bg: #10b981;--flipbook-download-border: #10b981;--flipbook-download-text: #ffffff;--flipbook-settings-bg: #1f2937;--flipbook-settings-text: #f9fafb}.bk-theme-auto{--flipbook-viewer-bg-color: var(--flipbook-bg-light-color, var(--flipbook-bg-main));--flipbook-viewer-bg-image: var(--flipbook-bg-light-image, none);--flipbook-viewer-bg-size: var(--flipbook-bg-light-size, auto);--flipbook-viewer-bg-position: var(--flipbook-bg-light-position, center);--flipbook-viewer-bg-repeat: var(--flipbook-bg-light-repeat, no-repeat)}@media (prefers-color-scheme: dark){.bk-theme-auto{--flipbook-viewer-bg-color: var(--flipbook-bg-dark-color, var(--flipbook-bg-main));--flipbook-viewer-bg-image: var(--flipbook-bg-dark-image, none);--flipbook-viewer-bg-size: var(--flipbook-bg-dark-size, auto);--flipbook-viewer-bg-position: var(--flipbook-bg-dark-position, center);--flipbook-viewer-bg-repeat: var(--flipbook-bg-dark-repeat, no-repeat)}}[data-bs-theme=dark] .bk-theme-auto{--flipbook-viewer-bg-color: var(--flipbook-bg-dark-color, var(--flipbook-bg-main));--flipbook-viewer-bg-image: var(--flipbook-bg-dark-image, none);--flipbook-viewer-bg-size: var(--flipbook-bg-dark-size, auto);--flipbook-viewer-bg-position: var(--flipbook-bg-dark-position, center);--flipbook-viewer-bg-repeat: var(--flipbook-bg-dark-repeat, no-repeat)}.bk-container,.bk-container *{box-sizing:border-box}.bk-container{color:var(--flipbook-text-main);font-family:var(--flipbook-font-family);flex:1;align-self:stretch}.bk-wrapper{position:relative;width:100%;height:100%;display:flex;flex-direction:column;background-color:var(--flipbook-viewer-bg-color);background-image:var(--flipbook-viewer-bg-image);background-size:var(--flipbook-viewer-bg-size);background-position:var(--flipbook-viewer-bg-position);background-repeat:var(--flipbook-viewer-bg-repeat);color:var(--flipbook-text-main);overflow:hidden;font-family:var(--flipbook-font-family);border-radius:var(--flipbook-radius-md);flex:1;align-self:stretch}.bk-main-area{flex:1;position:relative;overflow:hidden;width:100%;min-height:0;background-color:var(--flipbook-viewer-bg-color);background-image:var(--flipbook-viewer-bg-image);background-size:var(--flipbook-viewer-bg-size);background-position:var(--flipbook-viewer-bg-position);background-repeat:var(--flipbook-viewer-bg-repeat)}.bk-container.single-mode .bk-main-area{overflow-y:auto;overflow-x:hidden}.bk-book-wrapper{position:absolute;inset:var(--flipbook-presentation-gutter);padding:0;display:flex;justify-content:center;align-items:center;transition:transform .3s ease;transform-origin:center center}.bk-container.single-mode .bk-book-wrapper{position:relative;min-height:100%;inset:auto;padding:var(--flipbook-presentation-gutter)}.bk-book-wrapper.zoomed{transition:none;cursor:grab}.bk-book-wrapper.zoomed:active{cursor:grabbing}.bk-book-wrapper.zoomed .bk-book{pointer-events:none}.bk-book-sizer{position:relative;margin:0 auto;transition:transform .4s ease}.bk-book-wrapper.bk-is-cover .bk-book-sizer{transform:translate(-25%)}.bk-book-wrapper.bk-is-back-cover .bk-book-sizer{transform:translate(25%)}.bk-container.double-mode:not(.bk-is-cover):not(.bk-is-back-cover) .stf__block{background-color:#00000080}.bk-book{width:100%;height:100%;position:relative}.bk-single-view{display:none;width:100%;height:100%;justify-content:center;align-items:center;overflow:hidden}.bk-single-img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain;box-shadow:0 5px 20px var(--flipbook-shadow);background:var(--flipbook-bookpage-bg);transition:transform .3s ease,opacity .3s ease;pointer-events:none}.slide-left{transform:translate(-100%);opacity:0}.slide-right{transform:translate(100%);opacity:0}.bz-page{background-color:var(--flipbook-bg-main);overflow:hidden;box-shadow:0 0 15px var(--flipbook-shadow)}.page-shadow{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;z-index:5}.bz-page--left .page-shadow{background:linear-gradient(to right,#0000001a,#0000 3%,#0000 85%,#0006)}.bz-page--right .page-shadow{background:linear-gradient(to right,#0006,#0000 15%,#0000 97%,#0000001a)}.bz-page--cover .page-shadow{display:none!important}.page-content{width:100%;height:100%;object-fit:contain;pointer-events:none;background:var(--flipbook-bookpage-bg);display:block}.page-content--split{width:100%;max-width:none;height:100%;object-fit:cover;object-position:left center}.page-content--left{object-position:left center}.page-content--right{object-position:right center}.bk-single-img.page-content--split{width:100%;height:100%;max-width:none;max-height:none;object-fit:cover}.bk-toolbar{height:var(--flipbook-toolbar-height);background:var(--flipbook-bg-panel-soft);color:var(--flipbook-toolbar-text);display:flex;align-items:center;justify-content:space-between;padding:0 15px;z-index:10;flex-shrink:0;border-top:1px solid var(--flipbook-border);gap:.75rem;overflow-x:auto;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.bk-toolbar::-webkit-scrollbar{height:4px}.bk-toolbar::-webkit-scrollbar-thumb{background:var(--flipbook-border);border-radius:999px}.bk-btn-group{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.bk-btn-group--center{flex-grow:1;justify-content:center}.bk-btn{background:transparent;border:1px solid transparent;color:var(--flipbook-toolbar-button-text);width:38px;height:38px;padding:0;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s cubic-bezier(.4,0,.2,1)}.bk-btn:hover{background:color-mix(in srgb,var(--flipbook-text-main) 10%,transparent);transform:translateY(-1px)}.bk-btn:active{transform:translateY(1px)}.bk-btn.active{background:color-mix(in srgb,var(--flipbook-accent) 15%,transparent);color:var(--flipbook-accent)}.bk-btn:focus-visible,.thumb-item:focus-visible,.nav-float:focus-visible{outline:2px solid var(--flipbook-accent);outline-offset:2px}.bk-btn--download{color:var(--flipbook-download-bg)}.bk-btn--download:hover{background:color-mix(in srgb,var(--flipbook-download-bg) 15%,transparent)}#bk-page-info{color:var(--flipbook-toolbar-text);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:14px;min-width:70px;text-align:center;font-weight:700}.bk-thumbs{height:var(--flipbook-thumbs-height);background:var(--flipbook-thumbrail-bg);overflow-x:auto;overflow-y:hidden;padding:4px 12px;gap:10px;z-index:10;display:flex;flex-shrink:0;align-items:center;border-top:1px solid var(--flipbook-border);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.bk-nav-arrows{position:absolute;top:50%;left:0;right:0;width:100%;transform:translateY(-50%);pointer-events:none;z-index:10;display:flex;flex-direction:row;justify-content:space-between;padding:0 20px}.bk-nav-arrow{width:48px;height:48px;border-radius:50%;background:var(--flipbook-bg-surface);border:1px solid var(--flipbook-border);box-shadow:0 4px 15px var(--flipbook-shadow);color:var(--flipbook-text-main);display:flex;align-items:center;justify-content:center;cursor:pointer;pointer-events:auto;transition:all .2s ease;opacity:.7}.bk-nav-arrow:hover{opacity:1;background:var(--flipbook-accent);color:#fff;border-color:var(--flipbook-accent);transform:scale(1.1)}.bk-arrow-icon{width:12px;height:12px;border-top:2px solid currentColor;border-right:2px solid currentColor}.bk-arrow-left{transform:rotate(-135deg);margin-left:4px}.bk-arrow-right{transform:rotate(45deg);margin-right:4px}.bk-watermark{position:absolute;bottom:var(--flipbook-watermark-bottom);left:50%;right:auto;transform:translate(-50%);font-size:11px;color:var(--flipbook-text-muted);background:#ffffff38;background:color-mix(in srgb,var(--flipbook-bg-surface) 60%,transparent);padding:3px 8px;line-height:13px;border-radius:99px;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border:1px solid var(--flipbook-border);z-index:100;box-shadow:0 2px 10px var(--flipbook-shadow);transition:all .2s ease;pointer-events:auto}.bk-watermark{white-space:nowrap;max-width:calc(100% - 2 * var(--flipbook-page-padding))}.bk-watermark:hover{background:var(--flipbook-bg-surface);color:var(--flipbook-text-main);transform:translate(-50%,-2px)}.bk-watermark a{color:inherit;font-weight:600;text-decoration:none}.bk-thumbs::-webkit-scrollbar{height:6px}.bk-thumbs::-webkit-scrollbar-track{background:var(--flipbook-thumbscroll-track);border-radius:999px}.bk-thumbs::-webkit-scrollbar-thumb{background:var(--flipbook-thumbscroll-thumb);border-radius:999px;transition:background-color .2s ease}.bk-thumbs::-webkit-scrollbar-thumb:hover{background:var(--flipbook-accent)}.thumb-item{display:flex;flex-direction:column;align-items:center;cursor:pointer;opacity:.7;transition:all .2s ease;min-width:60px;flex-shrink:0;gap:2px}.thumb-item:hover{opacity:1;transform:translateY(-2px)}.thumb-item.active{opacity:1}.thumb-item.active .thumb-img-wrapper{border-color:var(--flipbook-accent);box-shadow:0 0 0 2px var(--flipbook-accent),0 4px 12px var(--flipbook-shadow)}.thumb-item.active span{color:var(--flipbook-accent);font-weight:700}.thumb-img-wrapper{width:30px;height:42px;background:var(--flipbook-bg-surface);border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-sm);display:flex;align-items:center;justify-content:center;overflow:hidden;box-shadow:0 2px 5px var(--flipbook-shadow);transition:all .2s ease}.thumb-img{width:100%;height:100%;object-fit:cover}.thumb-img--split{width:96px;max-width:none;object-fit:cover}.thumb-img--left{object-position:left center}.thumb-img--right{object-position:right center}.thumb-item span{color:var(--flipbook-thumb-text);font-size:10px;line-height:1;margin-top:2px;font-weight:700}.nav-float{position:absolute;z-index:10;background:var(--flipbook-navbutton-bg);border:none;border-radius:999px;width:var(--flipbook-navbutton-size);height:var(--flipbook-navbutton-size);color:var(--flipbook-navbutton-text);font-size:20px;cursor:pointer;transition:background-color .2s ease;top:50%;transform:translateY(-50%)}.nav-float:hover{background:var(--flipbook-accent)}#nav-prev{left:20px}#nav-next{right:20px}.bk-settings-panel{position:absolute;bottom:70px;right:15px;background:var(--flipbook-settings-bg);color:var(--flipbook-settings-text);border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-md);padding:15px;display:none;z-index:20;min-width:200px;box-shadow:0 10px 30px var(--flipbook-shadow)}.setting-item{display:flex;align-items:center;justify-content:space-between;gap:1rem;font-size:14px;margin-bottom:10px}.setting-item:last-child{margin-bottom:0}.bk-empty-state{display:grid;place-items:center;width:100%;min-height:240px;padding:1.5rem;background:var(--flipbook-bg-main);color:var(--flipbook-text-main);border:1px dashed var(--flipbook-border);border-radius:var(--flipbook-radius-md)}.bk-empty-state__title{margin:0;font-size:1.125rem;font-weight:600}.empty-cover{background-color:var(--flipbook-emptycover-bg)!important;box-shadow:none!important}.bk-attribution{position:absolute;bottom:6px;left:50%;transform:translate(-50%);background:#0f172abf;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);color:#fff;padding:6px 12px;border-radius:var(--flipbook-radius-sm);font-size:11px;text-decoration:none;z-index:20;display:flex;align-items:center;gap:6px;box-shadow:0 4px 12px #0006;border:1px solid rgba(255,255,255,.15);transition:all .2s ease;opacity:.85}.bk-attribution:hover{opacity:1;transform:translate(-50%,-2px);box-shadow:0 6px 16px #0009;border-color:var(--flipbook-accent);color:#fff}.bk-attribution-icon{font-size:13px}.bk-attribution-img{height:24px;width:auto;object-fit:contain;display:block}@media (max-width: 768px){:root{--flipbook-toolbar-height: 50px;--flipbook-thumbs-height: 102px;--flipbook-presentation-gutter: 14px;--flipbook-navbutton-size: 35px;--flipbook-page-padding: 12px}.bk-toolbar{padding:0 5px}.bk-btn{padding:0 8px;font-size:12px;height:32px}.bk-btn-group{gap:4px}#bk-page-info{min-width:50px;font-size:12px}.nav-float{font-size:16px}#nav-prev{left:10px}#nav-next{right:10px}.bk-thumbs{padding:4px 10px;gap:8px;overflow-y:hidden}.thumb-img-wrapper{height:38px;width:27px}.bk-settings-panel{bottom:60px}}.bk-btn.muted{opacity:.5;position:relative}.bk-btn.muted:after{content:"";position:absolute;width:80%;height:2px;background:currentColor;top:50%;left:10%;transform:rotate(-45deg);border-radius:1px}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}.bk-toc{position:absolute;inset:0 auto 0 0;width:min(320px,85%);max-width:100%;display:flex;flex-direction:column;gap:8px;padding:16px;overflow-y:auto;background:var(--flipbook-bg-surface);color:var(--flipbook-text-main);border-right:1px solid var(--flipbook-border);box-shadow:8px 0 24px var(--flipbook-shadow);z-index:30}.bk-toc-heading{color:var(--flipbook-text-main);font-size:.9rem;font-weight:700;letter-spacing:.02em;padding-bottom:8px;border-bottom:1px solid var(--flipbook-border)}.bk-toc-list{list-style:none;margin:0;padding:0}.bk-toc-list .bk-toc-list{padding-left:14px}.bk-toc-item{margin:2px 0}.bk-toc-entry{width:100%;display:flex;align-items:center;gap:8px;border:1px solid transparent;border-radius:var(--flipbook-radius-sm);padding:8px 10px;background:transparent;color:var(--flipbook-text-main);text-align:left;cursor:pointer;font:inherit}.bk-toc-entry:hover,.bk-toc-entry.active{background:color-mix(in srgb,var(--flipbook-accent) 12%,transparent);border-color:var(--flipbook-accent)}.bk-toc-entry:focus-visible{outline:2px solid var(--flipbook-accent);outline-offset:2px}.bk-toc-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bk-toc-page{flex:0 0 auto;color:var(--flipbook-text-muted);font-size:.8rem}.bk-thumbs{gap:8px}.thumb-item{min-width:57px;gap:0}.thumb-img-wrapper{position:relative;width:57px;height:81px}.thumb-img--split{width:200%}.thumb-page-number{position:absolute;left:50%;bottom:3px;transform:translate(-50%);margin:0;padding:0;color:#000!important;background:transparent;border:0;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,.98),0 0 2px rgba(255,255,255,.9);font-size:18px;line-height:20px;font-weight:900;pointer-events:none}.thumb-item.active .thumb-img-wrapper{border-width:1px;box-shadow:0 0 8px color-mix(in srgb,var(--flipbook-accent) 90%,transparent),0 0 2px var(--flipbook-accent)}.thumb-item.active .thumb-page-number{color:#000!important;background:transparent;text-shadow:0 1px 1px rgba(255,255,255,.98),0 0 2px rgba(255,255,255,.9)}@media (max-width: 768px){.bk-thumbs{gap:7px}.thumb-item{min-width:48px}.thumb-img-wrapper{width:48px;height:68px}.thumb-page-number{font-size:16px;line-height:18px}}
|
|
1
|
+
:root{--flipbook-bg-main: var(--bs-body-bg, #f8f9fa);--flipbook-bg-surface: var(--bs-secondary-bg, #ffffff);--flipbook-bg-surface-alt: var(--bs-tertiary-bg, #f1f3f5);--flipbook-bg-panel: var(--bs-dark, #212529);--flipbook-bg-panel-soft: color-mix(in srgb, var(--flipbook-bg-panel) 88%, white 12%);--flipbook-text-main: var(--bs-body-color, #212529);--flipbook-text-muted: var(--bs-secondary-color, #6c757d);--flipbook-toolbar-text: #f8f9fa;--flipbook-toolbar-button-text: #f8f9fa;--flipbook-border: var(--bs-border-color, rgba(0, 0, 0, .15));--flipbook-accent: var(--bs-primary, #0d6efd);--flipbook-accent-text: #ffffff;--flipbook-thumbrail-bg: color-mix(in srgb, var(--flipbook-bg-panel) 95%, black 5%);--flipbook-thumb-bg: #ffffff;--flipbook-thumb-text: #ffffff;--flipbook-thumbscroll-track: rgba(0, 0, 0, .18);--flipbook-thumbscroll-thumb: rgba(255, 255, 255, .22);--flipbook-navbutton-bg: rgba(0, 0, 0, .6);--flipbook-navbutton-text: #ffffff;--flipbook-shadow: rgba(0, 0, 0, .35);--flipbook-bookpage-bg: #ffffff;--flipbook-emptycover-bg: var(--flipbook-bg-panel);--flipbook-download-bg: #198754;--flipbook-download-border: #198754;--flipbook-download-text: #ffffff;--flipbook-settings-bg: var(--flipbook-bg-surface);--flipbook-settings-text: var(--flipbook-text-main);--flipbook-radius-sm: .375rem;--flipbook-radius-md: .5rem;--flipbook-toolbar-height: 60px;--flipbook-thumbs-height: 108px;--flipbook-navbutton-size: 50px;--flipbook-page-padding: clamp(12px, 2vw, 24px);--flipbook-watermark-height: 19px;--flipbook-watermark-top: 6px;--flipbook-watermark-bottom: 6px;--flipbook-presentation-gutter: 18px;--flipbook-font-family: var(--bs-body-font-family, system-ui, -apple-system, "Segoe UI", sans-serif);--flipbook-viewer-bg-color: var(--flipbook-bg-light-color, var(--flipbook-bg-main));--flipbook-viewer-bg-image: var(--flipbook-bg-light-image, none);--flipbook-viewer-bg-size: var(--flipbook-bg-light-size, auto);--flipbook-viewer-bg-position: var(--flipbook-bg-light-position, center);--flipbook-viewer-bg-repeat: var(--flipbook-bg-light-repeat, no-repeat)}[data-bs-theme=dark]{--flipbook-bg-main: var(--bs-body-bg, #121826);--flipbook-bg-surface: var(--bs-secondary-bg, #1b2232);--flipbook-bg-surface-alt: var(--bs-tertiary-bg, #222b3c);--flipbook-bg-panel: #141927;--flipbook-bg-panel-soft: #1d2434;--flipbook-text-main: var(--bs-body-color, #f8f9fa);--flipbook-text-muted: var(--bs-secondary-color, #adb5bd);--flipbook-toolbar-text: #f8f9fa;--flipbook-toolbar-button-text: #f8f9fa;--flipbook-border: var(--bs-border-color, rgba(255, 255, 255, .12));--flipbook-thumbrail-bg: #101522;--flipbook-thumb-bg: #ffffff;--flipbook-settings-bg: #1d2434;--flipbook-settings-text: #f8f9fa;--flipbook-emptycover-bg: #101522;--flipbook-shadow: rgba(0, 0, 0, .5)}.bk-theme-light{color-scheme:light;--flipbook-viewer-bg-color: var(--flipbook-bg-light-color, var(--flipbook-bg-main));--flipbook-viewer-bg-image: var(--flipbook-bg-light-image, none);--flipbook-viewer-bg-size: var(--flipbook-bg-light-size, auto);--flipbook-viewer-bg-position: var(--flipbook-bg-light-position, center);--flipbook-viewer-bg-repeat: var(--flipbook-bg-light-repeat, no-repeat);--flipbook-bg-main: #f8fafc;--flipbook-bg-surface: #ffffff;--flipbook-bg-surface-alt: #f1f5f9;--flipbook-bg-panel: #e2e8f0;--flipbook-bg-panel-soft: #f1f5f9;--flipbook-text-main: #0f172a;--flipbook-text-muted: #64748b;--flipbook-toolbar-text: #0f172a;--flipbook-toolbar-button-text: #334155;--flipbook-border: rgba(15, 23, 42, .1);--flipbook-accent: #4f46e5;--flipbook-accent-text: #ffffff;--flipbook-thumbrail-bg: #f8fafc;--flipbook-thumb-bg: #ffffff;--flipbook-thumb-text: #0f172a;--flipbook-thumbscroll-track: rgba(15, 23, 42, .08);--flipbook-thumbscroll-thumb: rgba(15, 23, 42, .18);--flipbook-navbutton-bg: rgba(15, 23, 42, .65);--flipbook-navbutton-text: #ffffff;--flipbook-shadow: rgba(15, 23, 42, .08);--flipbook-bookpage-bg: #ffffff;--flipbook-emptycover-bg: #e2e8f0;--flipbook-download-bg: #10b981;--flipbook-download-border: #10b981;--flipbook-download-text: #ffffff;--flipbook-settings-bg: #ffffff;--flipbook-settings-text: #0f172a}.bk-theme-dark{color-scheme:dark;--flipbook-viewer-bg-color: var(--flipbook-bg-dark-color, var(--flipbook-bg-main));--flipbook-viewer-bg-image: var(--flipbook-bg-dark-image, none);--flipbook-viewer-bg-size: var(--flipbook-bg-dark-size, auto);--flipbook-viewer-bg-position: var(--flipbook-bg-dark-position, center);--flipbook-viewer-bg-repeat: var(--flipbook-bg-dark-repeat, no-repeat);--flipbook-bg-main: #0b0f19;--flipbook-bg-surface: #111827;--flipbook-bg-surface-alt: #1f2937;--flipbook-bg-panel: #111827;--flipbook-bg-panel-soft: #1f2937;--flipbook-text-main: #f9fafb;--flipbook-text-muted: #9ca3af;--flipbook-toolbar-text: #f9fafb;--flipbook-toolbar-button-text: #e5e7eb;--flipbook-border: rgba(255, 255, 255, .08);--flipbook-accent: #7367f0;--flipbook-accent-text: #ffffff;--flipbook-thumbrail-bg: #0b0f19;--flipbook-thumb-bg: #1f2937;--flipbook-thumb-text: #f9fafb;--flipbook-thumbscroll-track: rgba(255, 255, 255, .08);--flipbook-thumbscroll-thumb: rgba(255, 255, 255, .18);--flipbook-navbutton-bg: rgba(0, 0, 0, .6);--flipbook-navbutton-text: #ffffff;--flipbook-shadow: rgba(0, 0, 0, .5);--flipbook-bookpage-bg: #ffffff;--flipbook-emptycover-bg: #101522;--flipbook-download-bg: #10b981;--flipbook-download-border: #10b981;--flipbook-download-text: #ffffff;--flipbook-settings-bg: #1f2937;--flipbook-settings-text: #f9fafb}.bk-theme-auto{--flipbook-viewer-bg-color: var(--flipbook-bg-light-color, var(--flipbook-bg-main));--flipbook-viewer-bg-image: var(--flipbook-bg-light-image, none);--flipbook-viewer-bg-size: var(--flipbook-bg-light-size, auto);--flipbook-viewer-bg-position: var(--flipbook-bg-light-position, center);--flipbook-viewer-bg-repeat: var(--flipbook-bg-light-repeat, no-repeat)}@media (prefers-color-scheme: dark){.bk-theme-auto{--flipbook-viewer-bg-color: var(--flipbook-bg-dark-color, var(--flipbook-bg-main));--flipbook-viewer-bg-image: var(--flipbook-bg-dark-image, none);--flipbook-viewer-bg-size: var(--flipbook-bg-dark-size, auto);--flipbook-viewer-bg-position: var(--flipbook-bg-dark-position, center);--flipbook-viewer-bg-repeat: var(--flipbook-bg-dark-repeat, no-repeat)}}[data-bs-theme=dark] .bk-theme-auto{--flipbook-viewer-bg-color: var(--flipbook-bg-dark-color, var(--flipbook-bg-main));--flipbook-viewer-bg-image: var(--flipbook-bg-dark-image, none);--flipbook-viewer-bg-size: var(--flipbook-bg-dark-size, auto);--flipbook-viewer-bg-position: var(--flipbook-bg-dark-position, center);--flipbook-viewer-bg-repeat: var(--flipbook-bg-dark-repeat, no-repeat)}.bk-container,.bk-container *{box-sizing:border-box}.bk-container{color:var(--flipbook-text-main);font-family:var(--flipbook-font-family);flex:1;align-self:stretch}.bk-wrapper{position:relative;width:100%;height:100%;display:flex;flex-direction:column;background-color:var(--flipbook-viewer-bg-color);background-image:var(--flipbook-viewer-bg-image);background-size:var(--flipbook-viewer-bg-size);background-position:var(--flipbook-viewer-bg-position);background-repeat:var(--flipbook-viewer-bg-repeat);color:var(--flipbook-text-main);overflow:hidden;font-family:var(--flipbook-font-family);border-radius:var(--flipbook-radius-md);flex:1;align-self:stretch}.bk-main-area{flex:1;position:relative;overflow:hidden;width:100%;min-height:0;background-color:var(--flipbook-viewer-bg-color);background-image:var(--flipbook-viewer-bg-image);background-size:var(--flipbook-viewer-bg-size);background-position:var(--flipbook-viewer-bg-position);background-repeat:var(--flipbook-viewer-bg-repeat)}.bk-container.single-mode .bk-main-area{overflow-y:auto;overflow-x:hidden}.bk-book-wrapper{position:absolute;inset:var(--flipbook-presentation-gutter);padding:0;display:flex;justify-content:center;align-items:center;transition:transform .3s ease;transform-origin:center center}.bk-container.single-mode .bk-book-wrapper{position:relative;min-height:100%;inset:auto;padding:var(--flipbook-presentation-gutter)}.bk-book-wrapper.zoomed{transition:none;cursor:grab}.bk-book-wrapper.zoomed:active{cursor:grabbing}.bk-book-wrapper.zoomed .bk-book{pointer-events:none}.bk-book-sizer{position:relative;margin:0 auto;transition:transform .4s ease}.bk-book-wrapper.bk-is-cover .bk-book-sizer{transform:translate(-25%)}.bk-book-wrapper.bk-is-back-cover .bk-book-sizer{transform:translate(25%)}.bk-container.double-mode:not(.bk-is-cover):not(.bk-is-back-cover) .stf__block{background-color:#00000080}.bk-book{width:100%;height:100%;position:relative}.bk-single-view{display:none;width:100%;height:100%;justify-content:center;align-items:center;overflow:hidden}.bk-single-page{position:relative;display:inline-flex;max-width:100%;max-height:100%}.bk-single-img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain;box-shadow:0 5px 20px var(--flipbook-shadow);background:var(--flipbook-bookpage-bg);transition:transform .3s ease,opacity .3s ease;pointer-events:none}.slide-left{transform:translate(-100%);opacity:0}.slide-right{transform:translate(100%);opacity:0}.bz-page{background-color:var(--flipbook-bg-main);overflow:hidden;box-shadow:0 0 15px var(--flipbook-shadow)}.page-shadow{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;z-index:5}.bz-page--left .page-shadow{background:linear-gradient(to right,#0000001a,#0000 3%,#0000 85%,#0006)}.bz-page--right .page-shadow{background:linear-gradient(to right,#0006,#0000 15%,#0000 97%,#0000001a)}.bz-page--cover .page-shadow{display:none!important}.page-content{width:100%;height:100%;object-fit:contain;pointer-events:none;background:var(--flipbook-bookpage-bg);display:block}.page-content--split{width:100%;max-width:none;height:100%;object-fit:cover;object-position:left center}.page-content--left{object-position:left center}.page-content--right{object-position:right center}.bk-single-img.page-content--split{width:100%;height:100%;max-width:none;max-height:none;object-fit:cover}.bk-plugin-panels{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:25}.bk-plugin-panel{position:absolute;top:var(--flipbook-presentation-gutter);right:var(--flipbook-presentation-gutter);bottom:var(--flipbook-presentation-gutter);width:min(360px,calc(100% - 2 * var(--flipbook-presentation-gutter)));display:none;pointer-events:auto;overflow:auto;color:var(--flipbook-text-main);background:var(--flipbook-bg-surface);border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-md);box-shadow:0 12px 30px var(--flipbook-shadow)}.bk-plugin-panel.is-open{display:block}.bk-plugin-panel-content{min-height:100%}.bk-toolbar{height:var(--flipbook-toolbar-height);background:var(--flipbook-bg-panel-soft);color:var(--flipbook-toolbar-text);display:flex;align-items:center;justify-content:space-between;padding:0 15px;z-index:10;flex-shrink:0;border-top:1px solid var(--flipbook-border);gap:.75rem;overflow-x:auto;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.bk-toolbar::-webkit-scrollbar{height:4px}.bk-toolbar::-webkit-scrollbar-thumb{background:var(--flipbook-border);border-radius:999px}.bk-btn-group{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.bk-btn-group--center{flex-grow:1;justify-content:center}.bk-btn{background:transparent;border:1px solid transparent;color:var(--flipbook-toolbar-button-text);width:38px;height:38px;padding:0;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s cubic-bezier(.4,0,.2,1)}.bk-btn:hover{background:color-mix(in srgb,var(--flipbook-text-main) 10%,transparent);transform:translateY(-1px)}.bk-btn:active{transform:translateY(1px)}.bk-btn:disabled,.bk-btn:disabled:hover{opacity:.45;cursor:not-allowed;transform:none;background:transparent;color:var(--flipbook-text-muted)}.bk-btn.active{background:color-mix(in srgb,var(--flipbook-accent) 15%,transparent);color:var(--flipbook-accent)}.bk-btn:focus-visible,.thumb-item:focus-visible,.nav-float:focus-visible{outline:2px solid var(--flipbook-accent);outline-offset:2px}.bk-btn--plugin{width:auto;min-width:38px;padding:0 .55rem;border-radius:var(--flipbook-radius-sm);gap:.35rem}.bk-plugin-button-icon{line-height:1}.bk-btn--download{color:var(--flipbook-download-bg)}.bk-btn--download:hover{background:color-mix(in srgb,var(--flipbook-download-bg) 15%,transparent)}#bk-page-info{color:var(--flipbook-toolbar-text);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:14px;min-width:70px;text-align:center;font-weight:700}.bk-thumbs{height:var(--flipbook-thumbs-height);background:var(--flipbook-thumbrail-bg);overflow-x:auto;overflow-y:hidden;padding:4px 12px;gap:10px;z-index:10;display:flex;flex-shrink:0;align-items:center;border-top:1px solid var(--flipbook-border);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.bk-nav-arrows{position:absolute;top:50%;left:0;right:0;width:100%;transform:translateY(-50%);pointer-events:none;z-index:10;display:flex;flex-direction:row;justify-content:space-between;padding:0 20px}.bk-nav-arrow{width:48px;height:48px;border-radius:50%;background:var(--flipbook-bg-surface);border:1px solid var(--flipbook-border);box-shadow:0 4px 15px var(--flipbook-shadow);color:var(--flipbook-text-main);display:flex;align-items:center;justify-content:center;cursor:pointer;pointer-events:auto;transition:all .2s ease;opacity:.7}.bk-nav-arrow:hover{opacity:1;background:var(--flipbook-accent);color:#fff;border-color:var(--flipbook-accent);transform:scale(1.1)}.bk-arrow-icon{width:12px;height:12px;border-top:2px solid currentColor;border-right:2px solid currentColor}.bk-arrow-left{transform:rotate(-135deg);margin-left:4px}.bk-arrow-right{transform:rotate(45deg);margin-right:4px}.bk-watermark{position:absolute;bottom:var(--flipbook-watermark-bottom);left:50%;right:auto;transform:translate(-50%);font-size:11px;color:var(--flipbook-text-muted);background:#ffffff38;background:color-mix(in srgb,var(--flipbook-bg-surface) 60%,transparent);padding:3px 8px;line-height:13px;border-radius:99px;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border:1px solid var(--flipbook-border);z-index:100;box-shadow:0 2px 10px var(--flipbook-shadow);transition:all .2s ease;pointer-events:auto}.bk-watermark{white-space:nowrap;max-width:calc(100% - 2 * var(--flipbook-page-padding))}.bk-watermark:hover{background:var(--flipbook-bg-surface);color:var(--flipbook-text-main);transform:translate(-50%,-2px)}.bk-watermark a{color:inherit;font-weight:600;text-decoration:none}.bk-thumbs::-webkit-scrollbar{height:6px}.bk-thumbs::-webkit-scrollbar-track{background:var(--flipbook-thumbscroll-track);border-radius:999px}.bk-thumbs::-webkit-scrollbar-thumb{background:var(--flipbook-thumbscroll-thumb);border-radius:999px;transition:background-color .2s ease}.bk-thumbs::-webkit-scrollbar-thumb:hover{background:var(--flipbook-accent)}.thumb-item{display:flex;flex-direction:column;align-items:center;cursor:pointer;opacity:.7;transition:all .2s ease;min-width:60px;flex-shrink:0;gap:2px}.thumb-item:hover{opacity:1;transform:translateY(-2px)}.thumb-item.active{opacity:1}.thumb-item.active .thumb-img-wrapper{border-color:var(--flipbook-accent);box-shadow:0 0 0 2px var(--flipbook-accent),0 4px 12px var(--flipbook-shadow)}.thumb-item.active span{color:var(--flipbook-accent);font-weight:700}.thumb-img-wrapper{width:30px;height:42px;background:var(--flipbook-bg-surface);border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-sm);display:flex;align-items:center;justify-content:center;overflow:hidden;box-shadow:0 2px 5px var(--flipbook-shadow);transition:all .2s ease}.thumb-img{width:100%;height:100%;object-fit:cover}.thumb-img--split{width:96px;max-width:none;object-fit:cover}.thumb-img--left{object-position:left center}.thumb-img--right{object-position:right center}.thumb-item span{color:var(--flipbook-thumb-text);font-size:10px;line-height:1;margin-top:2px;font-weight:700}.nav-float{position:absolute;z-index:10;background:var(--flipbook-navbutton-bg);border:none;border-radius:999px;width:var(--flipbook-navbutton-size);height:var(--flipbook-navbutton-size);color:var(--flipbook-navbutton-text);font-size:20px;cursor:pointer;transition:background-color .2s ease;top:50%;transform:translateY(-50%)}.nav-float:hover{background:var(--flipbook-accent)}#nav-prev{left:20px}#nav-next{right:20px}.bk-settings-panel{position:absolute;bottom:70px;right:15px;background:var(--flipbook-settings-bg);color:var(--flipbook-settings-text);border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-md);padding:15px;display:none;z-index:20;min-width:200px;box-shadow:0 10px 30px var(--flipbook-shadow)}.setting-item{display:flex;align-items:center;justify-content:space-between;gap:1rem;font-size:14px;margin-bottom:10px}.setting-item:last-child{margin-bottom:0}.bk-empty-state{display:grid;place-items:center;width:100%;min-height:240px;padding:1.5rem;background:var(--flipbook-bg-main);color:var(--flipbook-text-main);border:1px dashed var(--flipbook-border);border-radius:var(--flipbook-radius-md)}.bk-empty-state__title{margin:0;font-size:1.125rem;font-weight:600}.empty-cover{background-color:var(--flipbook-emptycover-bg)!important;box-shadow:none!important}.bk-attribution{position:absolute;bottom:6px;left:50%;transform:translate(-50%);background:#0f172abf;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);color:#fff;padding:6px 12px;border-radius:var(--flipbook-radius-sm);font-size:11px;text-decoration:none;z-index:20;display:flex;align-items:center;gap:6px;box-shadow:0 4px 12px #0006;border:1px solid rgba(255,255,255,.15);transition:all .2s ease;opacity:.85}.bk-attribution:hover{opacity:1;transform:translate(-50%,-2px);box-shadow:0 6px 16px #0009;border-color:var(--flipbook-accent);color:#fff}.bk-attribution-icon{font-size:13px}.bk-attribution-img{height:24px;width:auto;object-fit:contain;display:block}@media (max-width: 768px){:root{--flipbook-toolbar-height: 50px;--flipbook-thumbs-height: 102px;--flipbook-presentation-gutter: 14px;--flipbook-navbutton-size: 35px;--flipbook-page-padding: 12px}.bk-toolbar{padding:0 5px}.bk-btn{padding:0 8px;font-size:12px;height:32px}.bk-btn-group{gap:4px}#bk-page-info{min-width:50px;font-size:12px}.nav-float{font-size:16px}#nav-prev{left:10px}#nav-next{right:10px}.bk-thumbs{padding:4px 10px;gap:8px;overflow-y:hidden}.thumb-img-wrapper{height:38px;width:27px}.bk-settings-panel{bottom:60px}}.bk-btn.muted{opacity:.5;position:relative}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}.bk-toc{position:absolute;inset:0 auto 0 0;width:min(320px,85%);max-width:100%;display:flex;flex-direction:column;gap:8px;padding:16px;overflow-y:auto;background:var(--flipbook-bg-surface);color:var(--flipbook-text-main);border-right:1px solid var(--flipbook-border);box-shadow:8px 0 24px var(--flipbook-shadow);z-index:30}.bk-toc-heading{color:var(--flipbook-text-main);font-size:.9rem;font-weight:700;letter-spacing:.02em;padding-bottom:8px;border-bottom:1px solid var(--flipbook-border)}.bk-toc-list{list-style:none;margin:0;padding:0}.bk-toc-list .bk-toc-list{padding-left:14px}.bk-toc-item{margin:2px 0}.bk-toc-entry{width:100%;display:flex;align-items:center;gap:8px;border:1px solid transparent;border-radius:var(--flipbook-radius-sm);padding:8px 10px;background:transparent;color:var(--flipbook-text-main);text-align:left;cursor:pointer;font:inherit}.bk-toc-entry:hover,.bk-toc-entry.active{background:color-mix(in srgb,var(--flipbook-accent) 12%,transparent);border-color:var(--flipbook-accent)}.bk-toc-entry:focus-visible{outline:2px solid var(--flipbook-accent);outline-offset:2px}.bk-toc-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bk-toc-page{flex:0 0 auto;color:var(--flipbook-text-muted);font-size:.8rem}.bk-thumbs{gap:8px}.thumb-item{min-width:57px;gap:0}.thumb-img-wrapper{position:relative;width:57px;height:81px}.thumb-img--split{width:200%}.thumb-page-number{position:absolute;left:50%;bottom:3px;transform:translate(-50%);margin:0;padding:0;color:#000!important;background:transparent;border:0;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,.98),0 0 2px rgba(255,255,255,.9);font-size:18px;line-height:20px;font-weight:900;pointer-events:none}.thumb-item.active .thumb-img-wrapper{border-width:1px;box-shadow:0 0 8px color-mix(in srgb,var(--flipbook-accent) 90%,transparent),0 0 2px var(--flipbook-accent)}.thumb-item.active .thumb-page-number{color:#000!important;background:transparent;text-shadow:0 1px 1px rgba(255,255,255,.98),0 0 2px rgba(255,255,255,.9)}@media (max-width: 768px){.bk-thumbs{gap:7px}.thumb-item{min-width:48px}.thumb-img-wrapper{width:48px;height:68px}.thumb-page-number{font-size:16px;line-height:18px}}.bk-notes-panel{position:absolute;right:12px;bottom:calc(var(--flipbook-toolbar-height) + 12px);z-index:35;width:min(340px,calc(100% - 24px));display:flex;flex-direction:column;gap:8px;padding:12px;border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-md);background:color-mix(in srgb,var(--flipbook-bg-surface) 94%,transparent);color:var(--flipbook-text-main);box-shadow:0 8px 24px var(--flipbook-shadow);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.bk-notes-heading{font-size:.875rem;font-weight:700;color:var(--flipbook-text-main)}.bk-notes-input{width:100%;min-height:96px;resize:vertical;box-sizing:border-box;border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-sm);padding:8px 10px;background:var(--flipbook-bg-surface-alt);color:var(--flipbook-text-main);font:inherit;line-height:1.4}.bk-notes-input:focus,.bk-search-input:focus{outline:none;border-color:var(--flipbook-accent);box-shadow:0 0 8px color-mix(in srgb,var(--flipbook-accent) 58%,transparent)}.bk-notes-actions{display:flex;justify-content:flex-end;gap:8px}.bk-notes-actions button{border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-sm);padding:6px 10px;background:transparent;color:var(--flipbook-text-main);cursor:pointer;font:inherit;font-size:.8rem}.bk-notes-actions button:hover{border-color:var(--flipbook-accent);color:var(--flipbook-accent)}.bk-notes-save{border-color:var(--flipbook-accent)!important;background:var(--flipbook-accent)!important;color:var(--flipbook-accent-text)!important}@media (max-width: 768px){.bk-notes-panel{right:8px;bottom:calc(var(--flipbook-toolbar-height) + 8px);width:min(320px,calc(100% - 16px))}}.bk-notes-heading-row{display:flex;align-items:center;justify-content:space-between;gap:8px}.bk-notes-close{width:28px;height:28px;padding:0;border:1px solid transparent;border-radius:50%;background:transparent;color:var(--flipbook-text-muted);cursor:pointer;font:inherit;font-size:1.25rem;line-height:1}.bk-notes-close:hover,.bk-notes-close:focus-visible{border-color:var(--flipbook-accent);color:var(--flipbook-accent)}.bk-note-saved{display:flex;flex-direction:column;gap:12px}.bk-note-content{margin:0;min-height:72px;padding:12px;border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-sm);background:var(--flipbook-bg-surface-alt);color:var(--flipbook-text-main);white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.45}.bk-note-actions{display:flex;justify-content:flex-end;gap:8px}.bk-note-badge{border:1px solid var(--flipbook-border);border-radius:999px;padding:5px 11px;background:transparent;color:var(--flipbook-text-main);cursor:pointer;font:inherit;font-size:.8rem}.bk-note-badge:hover,.bk-note-badge:focus-visible{border-color:var(--flipbook-accent);color:var(--flipbook-accent)}.bk-note-badge--delete:hover,.bk-note-badge--delete:focus-visible{border-color:#dc3545;color:#dc3545}.bk-search-panel{position:absolute;left:12px;top:12px;z-index:36;width:min(420px,calc(100% - 24px));max-height:min(70%,420px);display:flex;flex-direction:column;gap:10px;padding:12px;overflow:auto;border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-md);background:color-mix(in srgb,var(--flipbook-bg-surface) 96%,transparent);color:var(--flipbook-text-main);box-shadow:0 8px 24px var(--flipbook-shadow);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.bk-search-heading-row{display:flex;align-items:center;justify-content:space-between;gap:8px}.bk-search-heading{font-size:.875rem}.bk-search-close{width:28px;height:28px;padding:0;border:0;border-radius:50%;background:transparent;color:inherit;cursor:pointer;font-size:20px}.bk-search-form{display:grid;grid-template-columns:1fr auto auto;gap:6px}.bk-search-input{min-width:0;border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-sm);padding:7px 9px;background:var(--flipbook-bg-surface-alt);color:var(--flipbook-text-main);font:inherit}.bk-search-submit,.bk-search-clear{border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-sm);padding:6px 9px;background:transparent;color:var(--flipbook-text-main);cursor:pointer;font:inherit;font-size:.8rem}.bk-search-submit{border-color:var(--flipbook-accent);background:var(--flipbook-accent);color:var(--flipbook-accent-text)}.bk-search-results,.bk-search-result-list{display:flex;flex-direction:column;gap:4px}.bk-search-result{display:grid;grid-template-columns:28px 1fr auto;gap:8px;align-items:start;width:100%;border:1px solid transparent;border-radius:var(--flipbook-radius-sm);padding:7px;background:transparent;color:var(--flipbook-text-main);cursor:pointer;text-align:left;font:inherit}.bk-search-result:hover,.bk-search-result:focus-visible{border-color:var(--flipbook-accent);background:color-mix(in srgb,var(--flipbook-accent) 12%,transparent)}.bk-search-result-page,.bk-search-result-count{color:var(--flipbook-text-muted);font-size:.75rem;font-weight:700}.bk-search-result-text{min-width:0;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.bk-search-empty{color:var(--flipbook-text-muted);font-size:.8rem}.bk-search-highlight-layer{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:6}.bk-search-text-highlight{position:absolute;display:block;min-width:3px;border:1px solid rgba(255,255,255,.88);border-radius:999px;background:#ffffff29;box-shadow:0 0 5px 1px #ffffffeb,0 0 12px 2px color-mix(in srgb,var(--flipbook-accent) 72%,transparent);mix-blend-mode:screen}.bk-search-text-highlight:after{content:"";position:absolute;inset:50% -3px auto;height:2px;border-radius:999px;background:color-mix(in srgb,var(--flipbook-accent) 78%,#fff);box-shadow:0 0 5px var(--flipbook-accent)}.bk-hotspot-layer{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:5}.bk-hotspot{position:absolute;pointer-events:auto;border:2px solid color-mix(in srgb,var(--flipbook-accent) 75%,transparent);border-radius:var(--flipbook-radius-sm);background:color-mix(in srgb,var(--flipbook-accent) 16%,transparent);color:var(--flipbook-text-main);cursor:pointer}.bk-hotspot:hover,.bk-hotspot:focus-visible{background:color-mix(in srgb,var(--flipbook-accent) 28%,transparent)}.bk-hotspot-label{padding:2px 5px;border-radius:4px;background:color-mix(in srgb,var(--flipbook-bg-surface) 88%,transparent);font-size:.7rem}.bk-hotspot-popup{position:absolute;right:10px;top:10px;width:min(280px,calc(100% - 20px));max-height:calc(100% - 20px);overflow:auto;pointer-events:auto;padding:10px;border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-sm);background:color-mix(in srgb,var(--flipbook-bg-surface) 96%,transparent);color:var(--flipbook-text-main);box-shadow:0 8px 24px var(--flipbook-shadow);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.bk-hotspot-popup-heading{display:flex;justify-content:space-between;align-items:center;gap:8px}.bk-hotspot-popup-close{border:0;background:transparent;color:inherit;cursor:pointer;font-size:18px}.bk-hotspot-popup p{margin:8px 0;font-size:.8rem;line-height:1.4}.bk-hotspot-popup a{color:var(--flipbook-accent);font-size:.8rem;overflow-wrap:anywhere}.bk-hotspot-popup-media{margin-top:8px;display:grid;gap:6px}.bk-hotspot-media-image,.bk-hotspot-media-video{display:block;width:100%;max-height:180px;object-fit:contain;border-radius:var(--flipbook-radius-sm);background:color-mix(in srgb,var(--flipbook-bg-surface) 80%,#000)}.bk-hotspot-media-audio{display:block;width:100%}.bk-hotspot-gallery{margin-top:8px;display:grid;gap:7px}.bk-hotspot-gallery-thumbs{display:flex;gap:5px;overflow-x:auto;padding:2px}.bk-hotspot-gallery-thumb{flex:0 0 42px;width:42px;height:42px;padding:2px;border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-sm);background:transparent;cursor:pointer}.bk-hotspot-gallery-thumb.is-selected{border-color:var(--flipbook-accent);box-shadow:0 0 0 1px color-mix(in srgb,var(--flipbook-accent) 65%,transparent)}.bk-hotspot-gallery-thumb img{display:block;width:100%;height:100%;object-fit:cover;border-radius:3px}.bk-hotspot-gallery-selected{display:block;width:100%;max-height:180px;object-fit:contain;border-radius:var(--flipbook-radius-sm);background:color-mix(in srgb,var(--flipbook-bg-surface) 80%,#000)}.bk-hotspot-link{display:inline-block;margin-top:8px;font-weight:600}.bk-annotation-marker{position:absolute;transform:translate(-50%,-50%);width:24px;height:24px;padding:0;border:0;border-radius:50%;background:color-mix(in srgb,#fff 88%,transparent);color:#111;box-shadow:0 1px 5px #ffffffe6;pointer-events:auto;cursor:pointer;font-size:18px;line-height:24px}.bk-annotation-marker:hover,.bk-annotation-marker:focus-visible{outline:2px solid var(--flipbook-accent)}.bk-annotation-popup{position:absolute;left:10px;bottom:10px;width:min(280px,calc(100% - 20px));max-height:calc(100% - 20px);overflow:auto;pointer-events:auto;padding:10px;border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-sm);background:color-mix(in srgb,var(--flipbook-bg-surface) 96%,transparent);color:var(--flipbook-text-main);box-shadow:0 8px 24px var(--flipbook-shadow);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.bk-main-area{isolation:isolate;min-width:0}.bk-watermark{z-index:20}.bk-toc,.bk-search-panel,.bk-notes-panel{box-sizing:border-box;max-height:100%;z-index:40}.bk-toc{width:min(340px,calc(100% - 16px))}.bk-search-panel,.bk-notes-panel{top:8px;left:8px;right:auto;bottom:auto;width:min(380px,calc(100% - 16px));max-height:calc(100% - 16px);overflow:auto}.bk-notes-input{max-height:40dvh}.bk-search-form{display:flex;flex-wrap:wrap;min-width:0}.bk-search-input{flex:1 1 100%;min-width:0;width:100%;box-sizing:border-box}.bk-search-result-text{min-width:0;overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden}.bk-toolbar{overflow:visible}.bk-more{position:relative}.bk-more>summary{list-style:none;font-size:1.5rem}.bk-more>summary::-webkit-details-marker{display:none}.bk-more-menu{position:absolute;z-index:50;right:0;bottom:calc(100% + 8px);width:220px;max-height:60dvh;overflow:auto;padding:8px;box-sizing:border-box;border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-md);background:var(--flipbook-bg-panel);color:var(--flipbook-toolbar-text);box-shadow:0 8px 24px var(--flipbook-shadow)}.bk-more-menu .bk-btn{display:flex;width:100%;min-height:44px;justify-content:flex-start;gap:12px;padding:8px;text-align:left;border-radius:var(--flipbook-radius-sm)}.bk-more-menu svg{flex:0 0 18px}@media (max-width: 767px){.bk-toolbar{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));height:auto;min-height:96px;padding:4px;gap:0}.bk-toolbar>.bk-btn-group{display:contents}.bk-toolbar>.bk-btn-group--center{display:flex;grid-column:1 / -1;grid-row:1;justify-content:center}.bk-toolbar .bk-btn{min-width:0;width:100%;height:44px}.bk-toolbar .bk-btn-group--center .bk-btn{width:44px}}.bk-btn--notes{position:relative}.bk-btn--notes.bk-has-page-note:after{content:"";position:absolute;width:7px;height:7px;border-radius:50%;right:3px;top:3px;background:var(--flipbook-accent);box-shadow:0 0 0 2px var(--flipbook-bg-panel)}.bk-note-total{padding:2px 7px;border-radius:99px;background:var(--flipbook-accent);color:var(--flipbook-accent-text)}.bk-note-privacy{margin:0;font-size:.8rem;color:var(--flipbook-text-muted);line-height:1.5}.bk-note-tabs{display:flex;gap:4px;padding:4px;border-radius:var(--flipbook-radius-md);background:var(--flipbook-bg-surface-alt)}.bk-note-tabs button{flex:1;border:0;padding:10px 6px;min-height:44px;background:transparent;color:var(--flipbook-text-main);border-radius:var(--flipbook-radius-sm);font:inherit}.bk-note-tabs button[aria-pressed=true]{background:var(--flipbook-bg-surface);box-shadow:0 1px 4px var(--flipbook-shadow);color:var(--flipbook-accent)}.bk-add-annotation{flex:none;min-height:44px;border:1px solid var(--flipbook-accent);border-radius:var(--flipbook-radius-sm);padding:10px;font:inherit;cursor:pointer}.bk-note-list{flex-direction:column;gap:8px}.bk-note-list-item{display:flex;flex-direction:column;gap:6px;padding:12px;min-height:64px;text-align:left;border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-md);background:var(--flipbook-bg-surface-alt);color:var(--flipbook-text-main);font:inherit;cursor:pointer}.bk-note-list-item strong{color:var(--flipbook-accent);font-size:.8rem}.bk-note-list-item span{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;white-space:pre-wrap;overflow-wrap:anywhere;font-size:.875rem;line-height:1.5}.bk-note-empty{color:var(--flipbook-text-muted);line-height:1.6}.bk-note-popover{position:absolute;right:8px;top:8px;z-index:60;display:flex;flex-direction:column;gap:10px;width:min(320px,calc(100% - 16px));max-height:calc(100% - 16px);overflow:auto;box-sizing:border-box;padding:12px;background:var(--flipbook-bg-surface);color:var(--flipbook-text-main);border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-md);box-shadow:0 8px 24px var(--flipbook-shadow)}.bk-note-document{white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.6}.bk-note-document p{margin:0 0 .6em}.bk-note-popover .bk-notes-actions{flex-wrap:wrap}.bk-note-popover .bk-notes-actions button{min-height:32px;padding:4px 12px;font-size:.8125rem}@media (pointer: coarse){.bk-note-popover .bk-notes-actions button{min-height:40px}}.bk-note-placement-layer{position:absolute;top:0;right:0;bottom:0;left:0;z-index:70;width:100%;height:100%;margin:0;padding:0;border:2px dashed var(--flipbook-accent);border-radius:0;background:color-mix(in srgb,var(--flipbook-accent) 6%,transparent);cursor:crosshair;touch-action:none}.bk-note-placement-hint{position:absolute;z-index:80;top:8px;left:8px;right:8px;gap:12px;align-items:center;justify-content:space-between;padding:12px;border-radius:var(--flipbook-radius-md);background:var(--flipbook-bg-panel);color:var(--flipbook-toolbar-text);box-shadow:0 4px 12px var(--flipbook-shadow);font-size:.875rem;pointer-events:none}.bk-note-placement-hint button{pointer-events:auto;min-height:44px;padding:8px;border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-sm);background:transparent;color:inherit;font:inherit}.bk-annotation-marker{width:36px;height:36px;font-size:18px;background:var(--flipbook-accent);color:var(--flipbook-accent-text);box-shadow:0 0 0 3px var(--flipbook-bg-surface),0 3px 9px var(--flipbook-shadow);border:0;touch-action:manipulation}.bk-annotation-marker.active{outline:3px solid var(--flipbook-accent-text)}.bk-wrapper :focus-visible{outline:2px solid var(--flipbook-accent);outline-offset:3px}@media (pointer:coarse){.bk-annotation-marker{width:44px;height:44px}}@media (prefers-reduced-motion:reduce){.bk-wrapper *,.bk-wrapper *:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}.bk-shortcuts-dialog{width:min(440px,calc(100vw - 32px));max-height:80dvh;overflow:auto;padding:20px;border:1px solid var(--flipbook-border);border-radius:var(--flipbook-radius-md);background:var(--flipbook-bg-surface);color:var(--flipbook-text-main);box-sizing:border-box}.bk-shortcuts-dialog::backdrop{background:#0008}.bk-shortcuts-dialog dl{display:grid;grid-template-columns:auto 1fr;gap:12px 20px;font-size:.875rem}.bk-shortcuts-dialog dt{font-weight:700}.bk-shortcuts-dialog dd{margin:0}.bk-shortcuts-dialog button{min-height:44px;padding:8px 16px;background:var(--flipbook-accent);color:var(--flipbook-accent-text);border:0;border-radius:var(--flipbook-radius-sm)}.bk-notes-count{position:absolute;top:-2px;right:-2px;font-size:10px;line-height:16px;min-width:16px;padding:0 2px;border-radius:99px;background:var(--flipbook-accent);color:var(--flipbook-accent-text);box-sizing:border-box}.bk-notes-count:empty{display:none}.bk-note-list-items{display:flex;flex-direction:column;gap:8px}.bk-add-annotation{background:var(--flipbook-accent);color:var(--flipbook-accent-text)}.bk-book-wrapper.single-mode .bk-book{display:none!important}.bk-book-wrapper img.page-content{padding:0!important;margin:0!important;border:0!important;box-sizing:border-box}.bk-text-layer{position:absolute;top:0;right:0;bottom:0;left:0;z-index:3;pointer-events:none;container-type:size;overflow:hidden}.bk-text-layer span{position:absolute;color:transparent;white-space:pre;line-height:1;font-family:sans-serif;overflow:hidden;-webkit-user-select:none;user-select:none}.bk-text-layer.is-selectable{pointer-events:auto;touch-action:pan-y;cursor:text}.bk-text-layer.is-selectable span{user-select:text;-webkit-user-select:text}.bk-text-layer span::selection{background:color-mix(in srgb,var(--flipbook-primary,#7367f0) 35%,transparent);color:transparent}
|