@yui540/comimi 0.1.0
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/README.md +44 -0
- package/dist/components/arrow-buttons.d.ts +8 -0
- package/dist/components/arrow-buttons.d.ts.map +1 -0
- package/dist/components/arrow-buttons.styles.d.ts +2 -0
- package/dist/components/arrow-buttons.styles.d.ts.map +1 -0
- package/dist/components/center-message.d.ts +4 -0
- package/dist/components/center-message.d.ts.map +1 -0
- package/dist/components/center-message.styles.d.ts +2 -0
- package/dist/components/center-message.styles.d.ts.map +1 -0
- package/dist/components/controls-dock.d.ts +44 -0
- package/dist/components/controls-dock.d.ts.map +1 -0
- package/dist/components/controls-dock.styles.d.ts +2 -0
- package/dist/components/controls-dock.styles.d.ts.map +1 -0
- package/dist/components/error-icon.d.ts +3 -0
- package/dist/components/error-icon.d.ts.map +1 -0
- package/dist/components/error-icon.styles.d.ts +2 -0
- package/dist/components/error-icon.styles.d.ts.map +1 -0
- package/dist/components/icons.d.ts +3 -0
- package/dist/components/icons.d.ts.map +1 -0
- package/dist/components/icons.styles.d.ts +2 -0
- package/dist/components/icons.styles.d.ts.map +1 -0
- package/dist/components/inputs.d.ts +36 -0
- package/dist/components/inputs.d.ts.map +1 -0
- package/dist/components/inputs.styles.d.ts +2 -0
- package/dist/components/inputs.styles.d.ts.map +1 -0
- package/dist/components/loading-icon.d.ts +3 -0
- package/dist/components/loading-icon.d.ts.map +1 -0
- package/dist/components/loading-icon.styles.d.ts +2 -0
- package/dist/components/loading-icon.styles.d.ts.map +1 -0
- package/dist/components/menu-panel.d.ts +36 -0
- package/dist/components/menu-panel.d.ts.map +1 -0
- package/dist/components/menu-panel.styles.d.ts +2 -0
- package/dist/components/menu-panel.styles.d.ts.map +1 -0
- package/dist/components/notifications.d.ts +3 -0
- package/dist/components/notifications.d.ts.map +1 -0
- package/dist/components/notifications.styles.d.ts +2 -0
- package/dist/components/notifications.styles.d.ts.map +1 -0
- package/dist/components/page-layout.d.ts +15 -0
- package/dist/components/page-layout.d.ts.map +1 -0
- package/dist/components/page-stage.d.ts +28 -0
- package/dist/components/page-stage.d.ts.map +1 -0
- package/dist/components/page-stage.styles.d.ts +2 -0
- package/dist/components/page-stage.styles.d.ts.map +1 -0
- package/dist/components/rabbit-mascot.d.ts +2 -0
- package/dist/components/rabbit-mascot.d.ts.map +1 -0
- package/dist/components/rabbit-mascot.styles.d.ts +2 -0
- package/dist/components/rabbit-mascot.styles.d.ts.map +1 -0
- package/dist/components/settings-panel.d.ts +28 -0
- package/dist/components/settings-panel.d.ts.map +1 -0
- package/dist/components/settings-panel.styles.d.ts +2 -0
- package/dist/components/settings-panel.styles.d.ts.map +1 -0
- package/dist/components/splash-screen.d.ts +3 -0
- package/dist/components/splash-screen.d.ts.map +1 -0
- package/dist/components/splash-screen.styles.d.ts +2 -0
- package/dist/components/splash-screen.styles.d.ts.map +1 -0
- package/dist/components/tooltip.styles.d.ts +2 -0
- package/dist/components/tooltip.styles.d.ts.map +1 -0
- package/dist/components/view-mode-switcher.d.ts +16 -0
- package/dist/components/view-mode-switcher.d.ts.map +1 -0
- package/dist/components/view-mode-switcher.styles.d.ts +2 -0
- package/dist/components/view-mode-switcher.styles.d.ts.map +1 -0
- package/dist/components/viewer-root.d.ts +5 -0
- package/dist/components/viewer-root.d.ts.map +1 -0
- package/dist/components/viewer-root.styles.d.ts +2 -0
- package/dist/components/viewer-root.styles.d.ts.map +1 -0
- package/dist/core/asset-loader.d.ts +7 -0
- package/dist/core/asset-loader.d.ts.map +1 -0
- package/dist/core/event-emitter.d.ts +8 -0
- package/dist/core/event-emitter.d.ts.map +1 -0
- package/dist/core/manga-viewer-core.d.ts +41 -0
- package/dist/core/manga-viewer-core.d.ts.map +1 -0
- package/dist/defaults.d.ts +9 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/i18n/i18n.d.ts +9 -0
- package/dist/i18n/i18n.d.ts.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1820 -0
- package/dist/manga-viewer.global.js +2344 -0
- package/dist/renderer/renderer-callbacks.d.ts +18 -0
- package/dist/renderer/renderer-callbacks.d.ts.map +1 -0
- package/dist/renderer/viewer-renderer.d.ts +51 -0
- package/dist/renderer/viewer-renderer.d.ts.map +1 -0
- package/dist/storage/indexed-db-storage.d.ts +23 -0
- package/dist/storage/indexed-db-storage.d.ts.map +1 -0
- package/dist/store/reducer.d.ts +3 -0
- package/dist/store/reducer.d.ts.map +1 -0
- package/dist/store/store.d.ts +11 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/styles/media.d.ts +13 -0
- package/dist/styles/media.d.ts.map +1 -0
- package/dist/styles/style-registry.d.ts +2 -0
- package/dist/styles/style-registry.d.ts.map +1 -0
- package/dist/types.d.ts +163 -0
- package/dist/types.d.ts.map +1 -0
- package/docs/USAGE.md +248 -0
- package/locales/en.json +37 -0
- package/locales/ja.json +37 -0
- package/package.json +42 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LayoutMode, ViewerSettings, ViewerState } from "../types";
|
|
2
|
+
export interface RendererCallbacks {
|
|
3
|
+
goToPage(pageIndex: number): void;
|
|
4
|
+
nextPage(): void;
|
|
5
|
+
previousPage(): void;
|
|
6
|
+
commitNextPage(): void;
|
|
7
|
+
commitPreviousPage(): void;
|
|
8
|
+
toggleOverlay(force?: boolean): void;
|
|
9
|
+
toggleAutoPageTurn(): void;
|
|
10
|
+
updateSettings(settings: Partial<ViewerSettings>): void;
|
|
11
|
+
setLayoutMode(layoutMode: LayoutMode): void;
|
|
12
|
+
setTheaterHeight(heightPx: number): void;
|
|
13
|
+
setPanel(panel: ViewerState["panel"]): void;
|
|
14
|
+
setZoom(scale: number, panX?: number, panY?: number): void;
|
|
15
|
+
setPan(panX: number, panY: number): void;
|
|
16
|
+
resetZoom(): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=renderer-callbacks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-callbacks.d.ts","sourceRoot":"","sources":["../../src/renderer/renderer-callbacks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,IAAI,IAAI,CAAC;IACjB,YAAY,IAAI,IAAI,CAAC;IACrB,cAAc,IAAI,IAAI,CAAC;IACvB,kBAAkB,IAAI,IAAI,CAAC;IAC3B,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,kBAAkB,IAAI,IAAI,CAAC;IAC3B,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IACxD,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,SAAS,IAAI,IAAI,CAAC;CACnB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { AssetLoader } from "../core/asset-loader";
|
|
2
|
+
import { I18n } from "../i18n/i18n";
|
|
3
|
+
import type { ViewerState } from "../types";
|
|
4
|
+
import type { RendererCallbacks } from "./renderer-callbacks";
|
|
5
|
+
export declare class ViewerRenderer {
|
|
6
|
+
private container;
|
|
7
|
+
private callbacks;
|
|
8
|
+
private assetLoader;
|
|
9
|
+
private i18n;
|
|
10
|
+
private root;
|
|
11
|
+
private cleanup;
|
|
12
|
+
private mouseStart?;
|
|
13
|
+
private touchStart?;
|
|
14
|
+
private pinchStart?;
|
|
15
|
+
private pageStage;
|
|
16
|
+
private pageTurnTimer?;
|
|
17
|
+
private splashRemoveTimer?;
|
|
18
|
+
private splash?;
|
|
19
|
+
private isPageTurnAnimating;
|
|
20
|
+
private suppressNextClick;
|
|
21
|
+
private prevOverlayVisible;
|
|
22
|
+
private overlayApplyRaf?;
|
|
23
|
+
private menuPanel?;
|
|
24
|
+
private viewModeSwitcher?;
|
|
25
|
+
private controlsDock?;
|
|
26
|
+
private resizeHandle?;
|
|
27
|
+
private viewSizeObserver?;
|
|
28
|
+
constructor(container: HTMLElement, callbacks: RendererCallbacks, assetLoader: AssetLoader, i18n: I18n, className?: string);
|
|
29
|
+
private observeViewSize;
|
|
30
|
+
update(state: ViewerState): void;
|
|
31
|
+
private applyOverlayVisibility;
|
|
32
|
+
showSplash(): void;
|
|
33
|
+
destroy(): void;
|
|
34
|
+
getElement(): HTMLElement;
|
|
35
|
+
isAnimatingPageTurn(): boolean;
|
|
36
|
+
animatePageTurn(state: ViewerState, direction: "previous" | "next", onComplete: () => void): boolean;
|
|
37
|
+
isMobileViewport(): boolean;
|
|
38
|
+
private clampPan;
|
|
39
|
+
private clampedZoom;
|
|
40
|
+
private syncResizeHandle;
|
|
41
|
+
private createResizeHandle;
|
|
42
|
+
private bindGestures;
|
|
43
|
+
private handleSwipeEnd;
|
|
44
|
+
private requestPageTurn;
|
|
45
|
+
private constrainDragOffset;
|
|
46
|
+
private applyEdgeResistance;
|
|
47
|
+
private setStageDragOffset;
|
|
48
|
+
private getPageTurnTargetOffset;
|
|
49
|
+
private isInteractiveTarget;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=viewer-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer-renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/viewer-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAgBnD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAY9D,qBAAa,cAAc;IAqBvB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,IAAI;IAvBd,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,UAAU,CAAC,CAAsC;IACzD,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,iBAAiB,CAAC,CAAS;IACnC,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,YAAY,CAAC,CAAiB;IACtC,OAAO,CAAC,gBAAgB,CAAC,CAAiB;gBAGhC,SAAS,EAAE,WAAW,EACtB,SAAS,EAAE,iBAAiB,EAC5B,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,EAClB,SAAS,CAAC,EAAE,MAAM;IAapB,OAAO,CAAC,eAAe;IAqBvB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAyGhC,OAAO,CAAC,sBAAsB;IAW9B,UAAU,IAAI,IAAI;IAalB,OAAO,IAAI,IAAI;IAgBf,UAAU,IAAI,WAAW;IAIzB,mBAAmB,IAAI,OAAO;IAI9B,eAAe,CACb,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,UAAU,GAAG,MAAM,EAC9B,UAAU,EAAE,MAAM,IAAI,GACrB,OAAO;IAqBV,gBAAgB,IAAI,OAAO;IAI3B,OAAO,CAAC,QAAQ;IAwBhB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,kBAAkB;IAmC1B,OAAO,CAAC,YAAY;IA8NpB,OAAO,CAAC,cAAc;IAoCtB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,uBAAuB;IAQ/B,OAAO,CAAC,mBAAmB;CAuB5B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ViewerSettings } from "../types";
|
|
2
|
+
export interface StorageOptions {
|
|
3
|
+
enabled?: boolean;
|
|
4
|
+
databaseName?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class IndexedDbStorage {
|
|
7
|
+
private enabled;
|
|
8
|
+
private databaseName;
|
|
9
|
+
private dbPromise?;
|
|
10
|
+
constructor(options?: StorageOptions);
|
|
11
|
+
getSettings(): Promise<ViewerSettings | undefined>;
|
|
12
|
+
saveSettings(settings: ViewerSettings): Promise<void>;
|
|
13
|
+
getProgress(mangaId: string): Promise<number | undefined>;
|
|
14
|
+
saveProgress(mangaId: string, pageIndex: number): Promise<void>;
|
|
15
|
+
saveLayout(layout: Record<string, unknown>): Promise<void>;
|
|
16
|
+
getLayout<T extends Record<string, unknown>>(): Promise<T | undefined>;
|
|
17
|
+
private get;
|
|
18
|
+
private put;
|
|
19
|
+
private delete;
|
|
20
|
+
private store;
|
|
21
|
+
private open;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=indexed-db-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexed-db-storage.d.ts","sourceRoot":"","sources":["../../src/storage/indexed-db-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI/C,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAuB;gBAE7B,OAAO,GAAE,cAAmB;IAKlC,WAAW,IAAI,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAKlD,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAQzD,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1D,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;YAK9D,GAAG;YAUH,GAAG;YASH,MAAM;YASN,KAAK;IASnB,OAAO,CAAC,IAAI;CAqBb"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../src/store/reducer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE1D,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CAyI7E"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ViewerAction, ViewerState } from "../types";
|
|
2
|
+
export type StoreListener = (state: ViewerState, previous: ViewerState) => void;
|
|
3
|
+
export declare class ViewerStore {
|
|
4
|
+
private state;
|
|
5
|
+
private listeners;
|
|
6
|
+
constructor(initialState: ViewerState);
|
|
7
|
+
getState(): ViewerState;
|
|
8
|
+
dispatch(action: ViewerAction): void;
|
|
9
|
+
subscribe(listener: StoreListener): () => void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG1D,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC;AAEhF,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,SAAS,CAA4B;gBAEjC,YAAY,EAAE,WAAW;IAIrC,QAAQ,IAAI,WAAW;IAIvB,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAcpC,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;CAM/C"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const maxWidthMediaQuery: (maxWidth: number) => string;
|
|
2
|
+
export declare const minWidthMediaQuery: (minWidth: number) => string;
|
|
3
|
+
export declare const minMaxWidthMediaQuery: (minWidth: number, maxWidth: number) => string;
|
|
4
|
+
export declare const breakPoints: {
|
|
5
|
+
mediumSmall: number;
|
|
6
|
+
};
|
|
7
|
+
export declare const media: {
|
|
8
|
+
mediumUp: string;
|
|
9
|
+
smallDown: string;
|
|
10
|
+
tablet: string;
|
|
11
|
+
desktop: string;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/styles/media.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,WACd,CAAC;AAEtC,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,WACd,CAAC;AAEtC,eAAO,MAAM,qBAAqB,GAAI,UAAU,MAAM,EAAE,UAAU,MAAM,WACH,CAAC;AAEtE,eAAO,MAAM,WAAW;;CAEvB,CAAC;AAEF,eAAO,MAAM,KAAK;;;;;CAKjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-registry.d.ts","sourceRoot":"","sources":["../../src/styles/style-registry.ts"],"names":[],"mappings":"AAsCA,wBAAgB,kBAAkB,IAAI,IAAI,CAUzC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
export type ReadingDirection = "rtl" | "ltr";
|
|
2
|
+
export type PageTurnMode = "single" | "spread";
|
|
3
|
+
export type LayoutMode = "inline" | "theater" | "browserFullscreen" | "nativeFullscreen";
|
|
4
|
+
export interface Manga {
|
|
5
|
+
id: string;
|
|
6
|
+
title: string;
|
|
7
|
+
author?: string;
|
|
8
|
+
pages: MangaPage[];
|
|
9
|
+
metadata?: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export type MangaPage = ImagePage | HtmlPage;
|
|
12
|
+
interface BasePage {
|
|
13
|
+
id: string;
|
|
14
|
+
label?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ImagePage extends BasePage {
|
|
17
|
+
type: "image";
|
|
18
|
+
src: string;
|
|
19
|
+
thumbnailSrc?: string;
|
|
20
|
+
width?: number;
|
|
21
|
+
height?: number;
|
|
22
|
+
alt?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface HtmlPage extends BasePage {
|
|
25
|
+
type: "html";
|
|
26
|
+
html: string;
|
|
27
|
+
sandbox?: string;
|
|
28
|
+
aspectRatio?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface ViewerSettings {
|
|
31
|
+
locale: string;
|
|
32
|
+
hasCover: boolean;
|
|
33
|
+
readingDirection: ReadingDirection;
|
|
34
|
+
pageTurnMode: PageTurnMode;
|
|
35
|
+
layoutMode: LayoutMode;
|
|
36
|
+
autoPageTurnIntervalMs: number;
|
|
37
|
+
pageTurnAnimation: boolean;
|
|
38
|
+
zoom: {
|
|
39
|
+
min: number;
|
|
40
|
+
max: number;
|
|
41
|
+
step: number;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export interface ViewerNotification {
|
|
45
|
+
id: string;
|
|
46
|
+
message: string;
|
|
47
|
+
createdAt: number;
|
|
48
|
+
tone?: "info" | "success" | "error";
|
|
49
|
+
}
|
|
50
|
+
export interface ViewerState {
|
|
51
|
+
manga: Manga;
|
|
52
|
+
currentPageIndex: number;
|
|
53
|
+
visiblePageIndexes: number[];
|
|
54
|
+
overlayVisible: boolean;
|
|
55
|
+
autoPageTurnEnabled: boolean;
|
|
56
|
+
zoomScale: number;
|
|
57
|
+
panX: number;
|
|
58
|
+
panY: number;
|
|
59
|
+
settings: ViewerSettings;
|
|
60
|
+
layout: {
|
|
61
|
+
mode: LayoutMode;
|
|
62
|
+
theaterHeightPx?: number;
|
|
63
|
+
};
|
|
64
|
+
notifications: ViewerNotification[];
|
|
65
|
+
panel: "none" | "settings" | "menu" | "pages" | "shortcuts";
|
|
66
|
+
}
|
|
67
|
+
export type TranslationMap = Record<string, string>;
|
|
68
|
+
export interface MangaViewerOptions {
|
|
69
|
+
manga: Manga;
|
|
70
|
+
initialPageIndex?: number;
|
|
71
|
+
locale?: string;
|
|
72
|
+
translations?: TranslationMap;
|
|
73
|
+
settings?: Partial<ViewerSettings>;
|
|
74
|
+
storage?: {
|
|
75
|
+
enabled?: boolean;
|
|
76
|
+
databaseName?: string;
|
|
77
|
+
};
|
|
78
|
+
className?: string;
|
|
79
|
+
events?: Partial<ViewerEventHandlersMap>;
|
|
80
|
+
}
|
|
81
|
+
export interface MangaViewerInstance {
|
|
82
|
+
destroy(): void;
|
|
83
|
+
setManga(manga: Manga): Promise<void>;
|
|
84
|
+
setPages(pages: MangaPage[]): Promise<void>;
|
|
85
|
+
getState(): Readonly<ViewerState>;
|
|
86
|
+
updateSettings(settings: Partial<ViewerSettings>): Promise<void>;
|
|
87
|
+
goToPage(pageIndex: number): void;
|
|
88
|
+
nextPage(): void;
|
|
89
|
+
previousPage(): void;
|
|
90
|
+
toggleOverlay(force?: boolean): void;
|
|
91
|
+
toggleAutoPageTurn(): void;
|
|
92
|
+
toggleFullscreen(): Promise<void>;
|
|
93
|
+
on<T extends ViewerEventName>(eventName: T, handler: ViewerEventHandler<T>): () => void;
|
|
94
|
+
}
|
|
95
|
+
export interface ViewerEventMap {
|
|
96
|
+
ready: {
|
|
97
|
+
manga: Manga;
|
|
98
|
+
};
|
|
99
|
+
pageChange: {
|
|
100
|
+
pageIndex: number;
|
|
101
|
+
page: MangaPage;
|
|
102
|
+
};
|
|
103
|
+
settingsChange: {
|
|
104
|
+
settings: ViewerSettings;
|
|
105
|
+
};
|
|
106
|
+
layoutChange: {
|
|
107
|
+
layoutMode: LayoutMode;
|
|
108
|
+
};
|
|
109
|
+
destroy: void;
|
|
110
|
+
}
|
|
111
|
+
export type ViewerEventName = keyof ViewerEventMap;
|
|
112
|
+
export type ViewerEventHandler<T extends ViewerEventName> = (payload: ViewerEventMap[T]) => void;
|
|
113
|
+
export type ViewerEventHandlersMap = {
|
|
114
|
+
[K in ViewerEventName]: ViewerEventHandler<K>;
|
|
115
|
+
};
|
|
116
|
+
export type ViewerAction = {
|
|
117
|
+
type: "setManga";
|
|
118
|
+
manga: Manga;
|
|
119
|
+
pageIndex?: number;
|
|
120
|
+
} | {
|
|
121
|
+
type: "goToPage";
|
|
122
|
+
pageIndex: number;
|
|
123
|
+
} | {
|
|
124
|
+
type: "nextPage";
|
|
125
|
+
} | {
|
|
126
|
+
type: "previousPage";
|
|
127
|
+
} | {
|
|
128
|
+
type: "setOverlayVisible";
|
|
129
|
+
visible: boolean;
|
|
130
|
+
} | {
|
|
131
|
+
type: "toggleAutoPageTurn";
|
|
132
|
+
} | {
|
|
133
|
+
type: "updateSettings";
|
|
134
|
+
settings: Partial<ViewerSettings>;
|
|
135
|
+
} | {
|
|
136
|
+
type: "setLayoutMode";
|
|
137
|
+
layoutMode: LayoutMode;
|
|
138
|
+
} | {
|
|
139
|
+
type: "setTheaterHeight";
|
|
140
|
+
heightPx: number;
|
|
141
|
+
} | {
|
|
142
|
+
type: "setZoom";
|
|
143
|
+
scale: number;
|
|
144
|
+
panX?: number;
|
|
145
|
+
panY?: number;
|
|
146
|
+
} | {
|
|
147
|
+
type: "setPan";
|
|
148
|
+
panX: number;
|
|
149
|
+
panY: number;
|
|
150
|
+
} | {
|
|
151
|
+
type: "resetZoom";
|
|
152
|
+
} | {
|
|
153
|
+
type: "setPanel";
|
|
154
|
+
panel: ViewerState["panel"];
|
|
155
|
+
} | {
|
|
156
|
+
type: "pushNotification";
|
|
157
|
+
notification: ViewerNotification;
|
|
158
|
+
} | {
|
|
159
|
+
type: "removeNotification";
|
|
160
|
+
id: string;
|
|
161
|
+
};
|
|
162
|
+
export {};
|
|
163
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/docs/USAGE.md
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# comimi — 使い方
|
|
2
|
+
|
|
3
|
+
`@yui540/comimi` のフルリファレンスです。簡単な概要はリポジトリトップの `README.md` を参照してください。
|
|
4
|
+
|
|
5
|
+
## インストール
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm install @yui540/comimi
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { createMangaViewer } from "@yui540/comimi";
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
CDN 利用時は `dist/manga-viewer.global.js` を読み込み、`window.MangaViewer.createMangaViewer(...)` を呼び出してください。
|
|
16
|
+
|
|
17
|
+
## クイックスタート
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { createMangaViewer } from "@yui540/comimi";
|
|
21
|
+
|
|
22
|
+
const viewer = createMangaViewer(document.querySelector("#viewer")!, {
|
|
23
|
+
manga: {
|
|
24
|
+
id: "sample",
|
|
25
|
+
title: "モノクロ世界にようこそ",
|
|
26
|
+
author: "yui540",
|
|
27
|
+
pages: [
|
|
28
|
+
{ id: "p0", type: "image", src: "/pages/0.webp" },
|
|
29
|
+
{ id: "p1", type: "image", src: "/pages/1.webp" },
|
|
30
|
+
{ id: "p2", type: "image", src: "/pages/2.webp" }
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
locale: "ja",
|
|
34
|
+
settings: {
|
|
35
|
+
layoutMode: "inline",
|
|
36
|
+
readingDirection: "rtl",
|
|
37
|
+
hasCover: true
|
|
38
|
+
},
|
|
39
|
+
events: {
|
|
40
|
+
pageChange: ({ pageIndex }) => console.log("page", pageIndex + 1)
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
viewer.nextPage();
|
|
45
|
+
viewer.goToPage(10);
|
|
46
|
+
viewer.destroy();
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## API
|
|
50
|
+
|
|
51
|
+
### `createMangaViewer(container, options)`
|
|
52
|
+
|
|
53
|
+
`container` 内にビューワーをマウントして `MangaViewerInstance` を返します。`container` の既存の子要素はライブラリが生成するDOMに置き換えられます。
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
interface MangaViewerInstance {
|
|
57
|
+
destroy(): void;
|
|
58
|
+
setManga(manga: Manga): Promise<void>;
|
|
59
|
+
setPages(pages: MangaPage[]): Promise<void>;
|
|
60
|
+
getState(): Readonly<ViewerState>;
|
|
61
|
+
updateSettings(settings: Partial<ViewerSettings>): Promise<void>;
|
|
62
|
+
goToPage(pageIndex: number): void;
|
|
63
|
+
nextPage(): void;
|
|
64
|
+
previousPage(): void;
|
|
65
|
+
toggleOverlay(force?: boolean): void;
|
|
66
|
+
toggleAutoPageTurn(): void;
|
|
67
|
+
toggleFullscreen(): Promise<void>;
|
|
68
|
+
on<T extends ViewerEventName>(
|
|
69
|
+
eventName: T,
|
|
70
|
+
handler: ViewerEventHandler<T>
|
|
71
|
+
): () => void;
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### オプション
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
interface MangaViewerOptions {
|
|
79
|
+
manga: Manga;
|
|
80
|
+
initialPageIndex?: number;
|
|
81
|
+
locale?: string; // "ja" | "en"、または独自キー(translations と併用)
|
|
82
|
+
translations?: TranslationMap;
|
|
83
|
+
settings?: Partial<ViewerSettings>;
|
|
84
|
+
storage?: { enabled?: boolean; databaseName?: string };
|
|
85
|
+
className?: string;
|
|
86
|
+
events?: Partial<{
|
|
87
|
+
ready: (e: { manga: Manga }) => void;
|
|
88
|
+
pageChange: (e: { pageIndex: number; page: MangaPage }) => void;
|
|
89
|
+
settingsChange: (e: { settings: ViewerSettings }) => void;
|
|
90
|
+
layoutChange: (e: { layoutMode: LayoutMode }) => void;
|
|
91
|
+
destroy: () => void;
|
|
92
|
+
}>;
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## ページ
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
type MangaPage = ImagePage | HtmlPage;
|
|
100
|
+
|
|
101
|
+
interface ImagePage {
|
|
102
|
+
id: string;
|
|
103
|
+
type: "image";
|
|
104
|
+
src: string;
|
|
105
|
+
thumbnailSrc?: string;
|
|
106
|
+
width?: number;
|
|
107
|
+
height?: number;
|
|
108
|
+
alt?: string;
|
|
109
|
+
label?: string;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
interface HtmlPage {
|
|
113
|
+
id: string;
|
|
114
|
+
type: "html";
|
|
115
|
+
html: string; // 文字列。innerHTML としてそのまま挿入される
|
|
116
|
+
sandbox?: string; // iframe を含む場合に指定推奨
|
|
117
|
+
aspectRatio?: number;
|
|
118
|
+
label?: string;
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
`id` は画像要素のキャッシュと進捗保存のキーに使われるので、安定した値を渡してください。
|
|
123
|
+
|
|
124
|
+
## 設定
|
|
125
|
+
|
|
126
|
+
| フィールド | デフォルト | 説明 |
|
|
127
|
+
|---|---|---|
|
|
128
|
+
| `locale` | `"ja"` | UI言語 |
|
|
129
|
+
| `hasCover` | `true` | 表紙ありモード(見開き時、1ページ目を単独表示) |
|
|
130
|
+
| `readingDirection` | `"rtl"` | `"rtl"`(右→左、日本語漫画)/ `"ltr"` |
|
|
131
|
+
| `pageTurnMode` | `"single"` | `"single"` / `"spread"`(2ページ見開き) |
|
|
132
|
+
| `layoutMode` | `"inline"` | `"inline"`, `"theater"`, `"browserFullscreen"`, `"nativeFullscreen"` |
|
|
133
|
+
| `autoPageTurnIntervalMs` | `5000` | 自動再生の間隔 (ms) |
|
|
134
|
+
| `pageTurnAnimation` | `true` | ページめくり時のスライドアニメ |
|
|
135
|
+
| `zoom.min` / `.max` / `.step` | `1` / `4` / `0.25` | ズームの範囲とステップ |
|
|
136
|
+
|
|
137
|
+
## レイアウトモード
|
|
138
|
+
|
|
139
|
+
| モード | 挙動 |
|
|
140
|
+
|---|---|
|
|
141
|
+
| `inline` | 親要素内に収まる(デスクトップ max 900px / モバイル max 500px)。アスペクト比固定・角丸・薄影あり |
|
|
142
|
+
| `theater` | 横幅100%、下のハンドルをドラッグして高さ可変 |
|
|
143
|
+
| `browserFullscreen` | `position: fixed; inset: 0` — Fullscreen API を使わずブラウザいっぱいに表示 |
|
|
144
|
+
| `nativeFullscreen` | Fullscreen API を使用。失敗時は `browserFullscreen` にフォールバック |
|
|
145
|
+
|
|
146
|
+
## キーボードショートカット
|
|
147
|
+
|
|
148
|
+
ビューワーのルート要素にフォーカスがある時のみ有効です。
|
|
149
|
+
|
|
150
|
+
| キー | 動作 |
|
|
151
|
+
|---|---|
|
|
152
|
+
| `←` / `Space` | 左に移動(`readingDirection` に応じて前/次ページ) |
|
|
153
|
+
| `→` / `Shift+Space` | 右に移動 |
|
|
154
|
+
| `A` | 自動再生のトグル |
|
|
155
|
+
| `N` | レイアウト: 標準 (inline) |
|
|
156
|
+
| `W` | レイアウト: ワイド (theater) |
|
|
157
|
+
| `F` | レイアウト: 全画面 (browserFullscreen) |
|
|
158
|
+
| `P` | 1ページ ↔ 見開きの切替 |
|
|
159
|
+
| `M` | メニューパネルのトグル |
|
|
160
|
+
| `S` | 設定パネルのトグル |
|
|
161
|
+
| `Escape` | 開いているパネルを閉じる / フルスクリーンを解除 |
|
|
162
|
+
|
|
163
|
+
## ジェスチャー
|
|
164
|
+
|
|
165
|
+
- 背景クリック / タップ: オーバーレイの表示切替
|
|
166
|
+
- 左右端のクリック: 前 / 次ページ(`readingDirection` に応じて向きが変わる)
|
|
167
|
+
- スワイプ: ページ移動。端では弾性的に抵抗あり
|
|
168
|
+
- ピンチ: ズーム(`zoom.min`〜`zoom.max` でクランプ)
|
|
169
|
+
- ズーム中のドラッグ: パン(ページの範囲内にクランプ)
|
|
170
|
+
- ダブルクリック / ダブルタップ: 1x ↔ 2x の切替
|
|
171
|
+
|
|
172
|
+
## 永続化 (IndexedDB)
|
|
173
|
+
|
|
174
|
+
`storage.enabled` を `false` にしない限り、`indexedDB` が利用可能な環境では以下を自動で保存します。
|
|
175
|
+
|
|
176
|
+
- 全体設定(locale, readingDirection, hasCover, pageTurnMode, animation, autoPageTurnIntervalMs)
|
|
177
|
+
- 現在のレイアウトモードと theater の高さ
|
|
178
|
+
- 漫画ごとの現在ページ(`manga.id` をキーに保存)
|
|
179
|
+
|
|
180
|
+
データベース名は既定で `manga-viewer`。`storage.databaseName` で上書きできます。
|
|
181
|
+
|
|
182
|
+
## i18n
|
|
183
|
+
|
|
184
|
+
ビルトインのロケールは `ja` と `en` です。`translations` オプションでキーを上書き/追加できます。
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
createMangaViewer(container, {
|
|
188
|
+
manga,
|
|
189
|
+
locale: "fr",
|
|
190
|
+
translations: {
|
|
191
|
+
"overlay.settings": "Réglages",
|
|
192
|
+
"settings.cover": "Couverture"
|
|
193
|
+
// 上書きしたいキーだけでOK
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
全キーは `locales/ja.json` を参照してください。未定義キーは `ja` → キー文字列自体、の順でフォールバックします。
|
|
199
|
+
|
|
200
|
+
## イベント
|
|
201
|
+
|
|
202
|
+
```ts
|
|
203
|
+
interface ViewerEventMap {
|
|
204
|
+
ready: { manga: Manga };
|
|
205
|
+
pageChange: { pageIndex: number; page: MangaPage };
|
|
206
|
+
settingsChange: { settings: ViewerSettings };
|
|
207
|
+
layoutChange: { layoutMode: LayoutMode };
|
|
208
|
+
destroy: void;
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
初期登録は `options.events`、後付け/解除は以下:
|
|
213
|
+
|
|
214
|
+
```ts
|
|
215
|
+
const off = viewer.on("layoutChange", ({ layoutMode }) => { ... });
|
|
216
|
+
off(); // 解除
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## ディレクトリ構成
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
src/
|
|
223
|
+
├── index.ts 公開エントリ (createMangaViewer + 型)
|
|
224
|
+
├── types.ts 公開する型定義
|
|
225
|
+
├── defaults.ts デフォルト設定 / 派生stateの計算
|
|
226
|
+
├── core/ ライフサイクル / イベント / アセットローダ
|
|
227
|
+
├── store/ Flux 風の store + reducer
|
|
228
|
+
├── renderer/ DOM を所有する単一の ViewerRenderer
|
|
229
|
+
├── components/ 各 UI コンポーネント (dock, menu, settings, ...)
|
|
230
|
+
├── i18n/ 翻訳ルックアップ
|
|
231
|
+
├── storage/ IndexedDB ラッパ
|
|
232
|
+
└── styles/ CSS レジストリ / media query ヘルパ
|
|
233
|
+
locales/
|
|
234
|
+
├── ja.json
|
|
235
|
+
└── en.json
|
|
236
|
+
examples/preview/ Vite ベースのローカルプレビュー
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## 開発
|
|
240
|
+
|
|
241
|
+
```sh
|
|
242
|
+
npm install
|
|
243
|
+
npm run dev # examples/preview を Vite dev server で起動
|
|
244
|
+
npm run typecheck # tsc --noEmit
|
|
245
|
+
npm run build # bundle + .d.ts を dist/ に出力
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
プレビューは `examples/preview/` にあり、`examples/preview/sample-comic/*.webp` を `import.meta.glob` 経由で読み込みます。
|
package/locales/en.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"overlay.autoPageTurn": "Auto play",
|
|
3
|
+
"overlay.layout": "Layout",
|
|
4
|
+
"overlay.settings": "Settings",
|
|
5
|
+
"overlay.menu": "Menu",
|
|
6
|
+
"overlay.centerHint.desktop": "Click the center to close",
|
|
7
|
+
"overlay.centerHint.mobile": "Tap the center to close",
|
|
8
|
+
"splash.loading": "Starting viewer",
|
|
9
|
+
"autoplay.start": "Auto play started",
|
|
10
|
+
"autoplay.stop": "Auto play stopped",
|
|
11
|
+
"pageMode.single": "Single",
|
|
12
|
+
"pageMode.spread": "Spread",
|
|
13
|
+
"layout.inline": "Standard",
|
|
14
|
+
"layout.theater": "Wide",
|
|
15
|
+
"layout.browserFullscreen": "Fullscreen",
|
|
16
|
+
"settings.title": "Settings",
|
|
17
|
+
"settings.cover": "Has cover",
|
|
18
|
+
"settings.direction": "Page turn direction",
|
|
19
|
+
"settings.interval": "Auto play interval",
|
|
20
|
+
"settings.interval.unit": "s",
|
|
21
|
+
"settings.animation": "Page turn animation",
|
|
22
|
+
"settings.direction.rtl": "Right to left",
|
|
23
|
+
"settings.direction.ltr": "Left to right",
|
|
24
|
+
"menu.openShortcuts": "Keyboard shortcuts",
|
|
25
|
+
"menu.openPages": "Page list",
|
|
26
|
+
"menu.back": "Back",
|
|
27
|
+
"shortcut.section.page": "Page navigation",
|
|
28
|
+
"shortcut.section.viewMode": "View mode",
|
|
29
|
+
"shortcut.section.general": "General",
|
|
30
|
+
"shortcut.moveLeft": "Move left",
|
|
31
|
+
"shortcut.moveRight": "Move right",
|
|
32
|
+
"shortcut.autoPageTurnLabel": "Auto play",
|
|
33
|
+
"shortcut.pageModeToggle": "Toggle spread",
|
|
34
|
+
"seek.previewAlt": "Preview of page {{page}}",
|
|
35
|
+
"loading": "Loading",
|
|
36
|
+
"error.pageRequestFailed": "Request failed for page {{page}}"
|
|
37
|
+
}
|
package/locales/ja.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"overlay.autoPageTurn": "自動再生",
|
|
3
|
+
"overlay.layout": "表示モード",
|
|
4
|
+
"overlay.settings": "設定",
|
|
5
|
+
"overlay.menu": "メニュー",
|
|
6
|
+
"overlay.centerHint.desktop": "閉じるには画面中央をクリック",
|
|
7
|
+
"overlay.centerHint.mobile": "閉じるには画面中央をタップ",
|
|
8
|
+
"splash.loading": "ビューワーを起動中",
|
|
9
|
+
"autoplay.start": "自動再生を開始",
|
|
10
|
+
"autoplay.stop": "自動再生を停止",
|
|
11
|
+
"pageMode.single": "1ページ",
|
|
12
|
+
"pageMode.spread": "見開き",
|
|
13
|
+
"layout.inline": "標準",
|
|
14
|
+
"layout.theater": "ワイド",
|
|
15
|
+
"layout.browserFullscreen": "全画面",
|
|
16
|
+
"settings.title": "設定",
|
|
17
|
+
"settings.cover": "表紙あり",
|
|
18
|
+
"settings.direction": "ページ移動方向",
|
|
19
|
+
"settings.interval": "自動再生の秒数",
|
|
20
|
+
"settings.interval.unit": "秒",
|
|
21
|
+
"settings.animation": "ページ移動アニメーション",
|
|
22
|
+
"settings.direction.rtl": "右",
|
|
23
|
+
"settings.direction.ltr": "左",
|
|
24
|
+
"menu.openShortcuts": "キーボードショートカット",
|
|
25
|
+
"menu.openPages": "ページ一覧",
|
|
26
|
+
"menu.back": "もどる",
|
|
27
|
+
"shortcut.section.page": "ページ移動",
|
|
28
|
+
"shortcut.section.viewMode": "表示モード",
|
|
29
|
+
"shortcut.section.general": "全般",
|
|
30
|
+
"shortcut.moveLeft": "左に移動",
|
|
31
|
+
"shortcut.moveRight": "右に移動",
|
|
32
|
+
"shortcut.autoPageTurnLabel": "自動再生",
|
|
33
|
+
"shortcut.pageModeToggle": "見開き切り替え",
|
|
34
|
+
"seek.previewAlt": "{{page}}ページのプレビュー",
|
|
35
|
+
"loading": "読み込み中",
|
|
36
|
+
"error.pageRequestFailed": "{{page}}ページのリクエストに失敗しました"
|
|
37
|
+
}
|