html-flip-book-react 0.0.0-alpha.73 → 0.0.0-alpha.75
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/dist/FlipBook.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { type BookmarkProvider as BaseBookmarkProvider, type HistoryMapper, type MouseMode, type PageFlipParams, type PageSemantics } from "html-flip-book-vanilla";
|
|
2
|
+
import "../../base/src/flipbook.scss";
|
|
3
|
+
import "../../base/src/pages.scss";
|
|
4
|
+
import "../../base/src/bookmarks.scss";
|
|
2
5
|
import "../../base/src/mouse-mode.scss";
|
|
3
6
|
import type { DownloadConfig } from "html-flip-book-vanilla/download";
|
|
4
7
|
import type React from "react";
|
package/dist/FlipBook.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlipBook.d.ts","sourceRoot":"","sources":["../src/FlipBook.tsx"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,gBAAgB,IAAI,oBAAoB,EAG7C,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"FlipBook.d.ts","sourceRoot":"","sources":["../src/FlipBook.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.flipbook--select-text .page:not(.page--flipping){-webkit-user-select:text;user-select:text}.toc-page{background-color:#fffef8;font-family:inherit;line-height:1.6;height:100%;box-sizing:border-box;container-type:inline-size;overflow:hidden;display:flex;flex-direction:column;padding:8% 6%}.toc-page__scroll{flex:1;min-width:0;min-height:0;overflow-x:hidden;overflow-y:auto}.flipbook-page-content .toc-page__scroll{flex:0 0 auto;overflow:visible}.toc-heading{text-align:center;overflow-wrap:anywhere;margin-bottom:24px;color:#2c1810;font-size:1.4rem;border-bottom:none}.toc-list{list-style:none;padding:0;margin:0}.toc-list li{margin-bottom:8px}.toc-link{display:flex;flex-direction:row;align-items:baseline;width:100%;box-sizing:border-box;padding:8px 4px;background:none;border:none;cursor:pointer;font-family:inherit;font-size:.75em;text-align:inherit;color:inherit;text-decoration:none;transition:background-color .15s ease}.toc-link:hover{background-color:#0000000d}.toc-link:focus{outline:2px solid #1a3a5c;outline-offset:2px}.toc-title{flex:0 1 auto;min-width:0;overflow-wrap:anywhere}.toc-dots{flex-grow:1;border-bottom:1px dotted #999;margin:0 8px;min-width:20px}.toc-page-num{flex-shrink:0;white-space:nowrap;font-weight:600;color:#1a3a5c}@container (max-width: 160px){.toc-link{flex-wrap:wrap}.toc-title{flex-basis:100%}.toc-dots{min-width:0;margin:0;margin-inline-end:8px}}.flipbook-toolbar-download-wrap{position:relative;display:inline-flex}.flipbook-toolbar-download-trigger{display:flex;align-items:center;justify-content:center}.flipbook-toolbar-download-menu{position:fixed;margin:0;box-sizing:border-box;min-width:min(320px,90vw);width:max-content;max-width:min(400px,95vw);max-height:min(70vh,480px);overflow-y:auto;padding:8px 0;background-color:#18181cfa;border-radius:12px;box-shadow:0 8px 30px #00000059,0 1px 3px #00000026;z-index:10000;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.flipbook-toolbar-download-menu--open-up{margin:0}.flipbook-toolbar-download-mode{display:flex;flex-direction:column;gap:2px;padding:4px 8px;border:none;margin:0;min-width:0}.flipbook-toolbar-download-radio-label{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;color:#ffffffeb;font-size:14px;cursor:pointer;transition:background-color .15s ease;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;user-select:none;min-width:0}.flipbook-toolbar-download-radio-label span{flex:0 1 auto;min-width:min-content;overflow:visible;white-space:nowrap}.flipbook-toolbar-download-radio-label:hover{background-color:#ffffff14}.flipbook-toolbar-download-radio-label:active{background-color:#ffffff1f}.flipbook-toolbar-download-radio{width:18px;height:18px;accent-color:#6ea8fe;flex-shrink:0}.flipbook-toolbar-download-range{display:flex;flex-wrap:wrap;flex-direction:row;align-items:center;gap:10px;padding:12px 16px;border-top:1px solid rgba(255,255,255,.1);margin-top:4px}.flipbook-toolbar-download-range-label{display:inline-flex;align-items:center;gap:8px;color:#ffffffbf;font-size:13px;font-weight:500;letter-spacing:.02em;text-transform:uppercase}.flipbook-toolbar-download-range-select{padding:8px 10px;border-radius:8px;border:1px solid rgba(255,255,255,.18);background:#ffffff0f;color:#fff;font-family:inherit;font-size:14px;min-width:5ch;text-align:start;direction:inherit;transition:border-color .15s ease;outline:none}.flipbook-toolbar-download-range-select:focus{border-color:#6ea8fe99}.flipbook-toolbar-download-range-select option{color:#000;background:#fff}.flipbook-toolbar-download-error{margin:8px 8px 0;padding:8px 12px;border-radius:8px;background:#ff6b6b24;color:#ff8787;font-size:13px;text-align:start}.flipbook-toolbar-download-menuitem{display:block;width:calc(100% - 16px);margin:4px 8px 0;padding:12px 16px;border:none;background:#6ea8fe2e;color:#6ea8fe;font-family:inherit;font-size:14px;font-weight:600;text-align:center;cursor:pointer;border-radius:8px;transition:background-color .15s ease,transform .1s ease;-webkit-tap-highlight-color:transparent}.flipbook-toolbar-download-menuitem:hover:not(:disabled){background-color:#6ea8fe47}.flipbook-toolbar-download-menuitem:active:not(:disabled){transform:scale(.97);background-color:#6ea8fe59}.flipbook-toolbar-download-menuitem:disabled{opacity:.5;cursor:not-allowed}.flipbook-toolbar-download-primary{margin-top:8px}.flipbook-toolbar-download-extra{padding:4px 16px 8px;border-top:1px solid rgba(255,255,255,.1);margin-top:8px;color:#ffffffbf;font-size:13px;text-align:start}.flipbook-toolbar-download-range-download{padding:10px 16px;border:none;border-radius:8px;background:#ffffff26;color:#fff;font-size:14px;font-weight:500;cursor:pointer;transition:background-color .15s ease}.flipbook-toolbar-download-range-download:hover:not(:disabled){background:#ffffff40}.flipbook-toolbar-download-range-download:disabled{opacity:.5;cursor:not-allowed}.flipbook-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 16px;min-height:48px;box-sizing:border-box;background-color:#000000b3;border-radius:8px;-webkit-user-select:none;user-select:none;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.flipbook-toolbar-start{display:flex;align-items:center;gap:8px;flex:1;justify-content:flex-start}.flipbook-toolbar-nav-cluster{display:flex;align-items:center;gap:8px;flex-shrink:0}.flipbook-toolbar--rtl .flipbook-toolbar-button>*{transform:scaleX(-1)}.flipbook-toolbar--rtl .flipbook-toolbar-mouse-mode>*{transform:none}.flipbook-toolbar-end{display:flex;align-items:center;gap:8px;flex:1;justify-content:flex-end}.flipbook-toolbar-button{display:flex;align-items:center;justify-content:center;width:40px;height:40px;padding:0;border:none;border-radius:6px;background-color:transparent;color:#fff;font-size:20px;cursor:pointer;transition:background-color .2s ease,opacity .2s ease}.flipbook-toolbar-button:hover:not(:disabled){background-color:#ffffff26}.flipbook-toolbar-button:active:not(:disabled){background-color:#ffffff40}.flipbook-toolbar-button:focus-visible{outline:2px solid #fff;outline-offset:2px}.flipbook-toolbar-button:disabled{opacity:.4;cursor:not-allowed}.flipbook-toolbar-mouse-mode[aria-pressed=true]{background-color:#ffffff40}.flipbook-toolbar-mouse-mode-icon{display:inline-flex;align-items:center;gap:3px;font-size:15px;font-weight:600;line-height:1}.flipbook-toolbar-mouse-mode-caret{display:inline-block;width:9px;height:18px;background:currentColor;-webkit-mask:url(data:image/png;base64,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) center / 18px 18px no-repeat;mask:url(data:image/png;base64,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) center / 18px 18px no-repeat}.flipbook-toolbar-prev,.flipbook-toolbar-next{font-size:28px;font-weight:700}.flipbook-toolbar-first,.flipbook-toolbar-last{font-size:16px}.flipbook-toolbar-fullscreen{font-size:18px}.flipbook-toolbar-fullscreen--active{background-color:#ffffff1a}.flipbook-toc-icon--flip-h{transform:scaleX(-1)}span.flipbook-toolbar-indicator{display:inline-flex;align-items:center;justify-content:center;color:inherit;font-size:14px;font-weight:500;text-align:center;padding:0 4px;white-space:nowrap}input.flipbook-toolbar-indicator{display:inline-block;font-family:inherit;font-size:14px;font-weight:500;text-align:center;box-sizing:border-box;border:1px solid transparent;border-radius:4px;padding:4px 8px;min-width:3ch;color:inherit;white-space:nowrap;transition:background-color .2s ease,color .2s ease}input.flipbook-toolbar-indicator--editing{background:#fff;color:#1a1a1a}input.flipbook-toolbar-indicator:focus{outline:2px solid currentColor;outline-offset:2px}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
|
|
1
|
+
.flipbook{height:100%;width:100%;overflow:hidden}.flipbook-debug-bar{position:absolute;bottom:0;left:0;width:100%;min-height:48px;background-color:#00000080;color:#fff;padding:10px;box-sizing:border-box;display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;z-index:9999}.flipbook-debug-bar--hidden{display:none!important}.page--cover-interior{overflow:hidden}.page--cover-interior-inset{padding-top:var(--cover-inset, 5%);padding-bottom:var(--cover-inset, 5%);padding-left:var(--cover-inset-left, var(--cover-inset, 5%));padding-right:var(--cover-inset-right, var(--cover-inset, 5%));background:#fffef8;background-clip:content-box}.page{position:absolute;backface-visibility:hidden;transform-style:preserve-3d;background:#fff;contain:layout style paint;--inner-shadow-shadow: 0;--inner-shadow-highlight: 0;--inner-shadow-edge: right}.page:before,.page:after{content:"";position:absolute;inset:0;pointer-events:none;backface-visibility:hidden;transition:opacity .12s ease;will-change:opacity;z-index:var(--flipbook-shading-z-index, 10)}.page:before{background:linear-gradient(to var(--inner-shadow-edge),rgba(0,0,0,calc(.35 * var(--inner-shadow-shadow))) 0%,rgba(0,0,0,0) 40%);opacity:var(--inner-shadow-shadow);mix-blend-mode:multiply}.page:after{background:linear-gradient(to var(--inner-shadow-edge),rgba(255,255,255,calc(.4 * var(--inner-shadow-highlight))) 0%,rgba(255,255,255,0) 45%);opacity:var(--inner-shadow-highlight)}.flipbook--no-page-shadow .page:before,.flipbook--no-page-shadow .page:after{opacity:0!important}.page--no-shadow:before,.page--no-shadow:after{opacity:0!important}.page--folded:before{background:var(--fold-shading, none);opacity:1;transition:none;mix-blend-mode:normal}.page--folded:after{opacity:0;transition:none}.page--flipping{contain:strict;-webkit-user-select:none;user-select:none;scrollbar-color:transparent transparent}.page--flipping::-webkit-scrollbar{display:none}.page--flipping *{scrollbar-color:transparent transparent!important}.page--flipping *::-webkit-scrollbar{display:none!important}.page>*{max-width:100%;max-height:100%;height:100%;width:100%;box-sizing:border-box}.page[data-scrollbar-side=left]{--flipbook-page-scroll-direction: rtl}.page[data-scrollbar-side=right]{--flipbook-page-scroll-direction: ltr}.page[data-reading-direction=ltr]{--flipbook-page-content-direction: ltr}.page[data-reading-direction=rtl]{--flipbook-page-content-direction: rtl}.flipbook-page-scrollport{width:100%;height:100%;overflow:auto;overscroll-behavior:contain;direction:var(--flipbook-page-scroll-direction, ltr)}.flipbook-page-content{width:100%;height:100%;min-height:100%;overflow:visible}.flipbook-page-content:not([dir]){direction:var(--flipbook-page-content-direction, ltr)}.page .flipbook-page-content>*{width:100%;min-height:100%;height:auto;max-width:100%;max-height:none;box-sizing:border-box;overflow:visible}.page .flipbook-page-content>.flipbook-page-bounded{height:100%;max-height:100%}.flipbook-bookmarks{--bookmark-default-depth: 52px;--bookmark-default-length: 24px;position:absolute;inset:0;pointer-events:none}.flipbook-bookmarks[data-orientation=parallel]{--bookmark-default-depth: 28px;--bookmark-default-length: 72px}.flipbook-bookmarks[hidden],.flipbook-bookmarks__rail[hidden],.flipbook-bookmark[hidden]{display:none}.flipbook-bookmarks__measure{position:absolute;width:var(--flipbook-bookmark-depth, var(--bookmark-default-depth));height:var(--flipbook-bookmark-length, var(--bookmark-default-length));margin-top:var(--flipbook-bookmark-stack-step, calc(var(--flipbook-bookmark-depth, var(--bookmark-default-depth)) * .3));visibility:hidden}.flipbook-bookmarks__rail{position:absolute;display:flex;gap:var(--flipbook-bookmark-gap, 4px);box-sizing:border-box;min-width:0;min-height:0;direction:ltr;overflow:auto;overscroll-behavior:contain;scrollbar-width:none;pointer-events:auto;touch-action:pan-x pan-y}.flipbook-bookmarks__rail::-webkit-scrollbar{display:none}.flipbook-bookmarks__rail--left,.flipbook-bookmarks__rail--right{display:block;overflow:hidden;z-index:0}.flipbook-bookmarks__rail--left>.flipbook-bookmark-slot,.flipbook-bookmarks__rail--right>.flipbook-bookmark-slot{position:absolute}.flipbook-bookmarks__rail--left>.flipbook-bookmark-slot{right:0}.flipbook-bookmarks__rail--right>.flipbook-bookmark-slot{left:0}.flipbook-bookmarks__rail--top,.flipbook-bookmarks__rail--bottom{flex-direction:row;overflow-y:hidden}.flipbook-bookmarks[data-attachment=leaf] .flipbook-bookmarks__rail--top,.flipbook-bookmarks[data-attachment=leaf] .flipbook-bookmarks__rail--bottom{gap:0;overflow:hidden}.flipbook-bookmarks__leaf-rail{display:grid;flex:0 0 50%;box-sizing:border-box;min-width:0;height:100%;gap:var(--flipbook-bookmark-gap, 4px);grid-template-columns:repeat(var(--bookmark-count),var(--flipbook-bookmark-length, var(--bookmark-default-length)));grid-template-rows:100%;overflow:auto;scrollbar-width:none;overscroll-behavior:contain;touch-action:pan-x pan-y}.flipbook-bookmarks__leaf-rail[data-leaf-side=left]{direction:rtl;order:0}.flipbook-bookmarks__leaf-rail[data-leaf-side=right]{direction:ltr;order:1}.flipbook-bookmarks__leaf-rail>.flipbook-bookmark-slot{grid-column:var(--bookmark-slot);grid-row:1}.flipbook-bookmark-slot{--bookmark-exposed-depth: var(--flipbook-bookmark-depth, var(--bookmark-default-depth, 52px));--bookmark-exposed-length: var(--flipbook-bookmark-length, var(--bookmark-default-length, 24px));--bookmark-exposed-major: var(--bookmark-exposed-depth);--bookmark-full-horizontal: max(var(--bookmark-exposed-major), min(var(--flipbook-bookmark-full-length, 220px), calc(100vw - 16px) ));--bookmark-full-vertical: max(var(--bookmark-exposed-major), min(var(--flipbook-bookmark-full-length, 220px), calc(100vh - 16px) ));position:relative;flex:0 0 var(--bookmark-exposed-length);width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;pointer-events:auto}.flipbook-bookmark-slot[data-orientation=parallel]{--bookmark-exposed-major: var(--bookmark-exposed-length)}.flipbook-bookmark-slot>.flipbook-bookmark{position:absolute;inset:0 auto auto 0;width:var(--bookmark-full-horizontal);height:100%;flex:none}.flipbook:not(.flipbook--select-text) .flipbook-bookmark-slot,.flipbook:not(.flipbook--select-text) .flipbook-bookmark{touch-action:pan-y}.flipbook--select-text .flipbook-bookmark-slot,.flipbook--select-text .flipbook-bookmark{touch-action:auto}.flipbook-bookmark-slot[data-orientation=parallel][data-edge=left]>.flipbook-bookmark,.flipbook-bookmark-slot[data-orientation=parallel][data-edge=right]>.flipbook-bookmark,.flipbook-bookmark-slot[data-orientation=perpendicular][data-edge=top]>.flipbook-bookmark,.flipbook-bookmark-slot[data-orientation=perpendicular][data-edge=bottom]>.flipbook-bookmark{width:100%;height:var(--bookmark-full-vertical)}.flipbook-bookmark-slot[data-orientation=perpendicular][data-edge=right]>.flipbook-bookmark,.flipbook-bookmark-slot[data-orientation=parallel][data-edge=bottom]>.flipbook-bookmark{left:auto;right:0}.flipbook-bookmark-slot[data-orientation=parallel][data-edge=right]>.flipbook-bookmark,.flipbook-bookmark-slot[data-orientation=perpendicular][data-edge=bottom]>.flipbook-bookmark{top:auto;bottom:0}.flipbook-bookmark{position:relative;flex:0 0 var(--flipbook-bookmark-length, var(--bookmark-default-length));display:grid;place-items:center;min-width:0;min-height:0;margin:0;padding:3px;box-sizing:border-box;overflow:hidden;border:1px solid #71869c;border-radius:2px;background:#dce8f4;color:#20364b;font:inherit;font-size:12px;line-height:1.2;cursor:pointer;-webkit-user-select:none;user-select:none}.flipbook-bookmark:hover,.flipbook-bookmark[aria-current=page]{background:#bfd5e9}.flipbook-bookmark:focus-visible{outline:2px solid #204f7b;outline-offset:-3px}.flipbook-bookmark__content{position:absolute;top:0;left:0;display:grid;place-items:center;width:var(--bookmark-exposed-major, 52px);height:100%;box-sizing:border-box;padding:3px;max-width:100%;max-height:100%;min-width:0;min-height:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;contain:layout paint;transition:opacity .18s ease}.flipbook-bookmark__content[hidden]{display:none}.flipbook-bookmark[data-mouse-mode=turn]{touch-action:pan-y}.flipbook-bookmark[data-mouse-mode=select]{-webkit-user-select:text;user-select:text;touch-action:auto}.flipbook-bookmark[data-mouse-mode=select] .flipbook-bookmark__content,.flipbook-bookmark[data-mouse-mode=select] .flipbook-bookmark__expanded-content{contain:layout;pointer-events:auto;-webkit-user-select:text;user-select:text}.flipbook-bookmark[data-orientation=parallel][data-edge=left],.flipbook-bookmark[data-orientation=parallel][data-edge=right],.flipbook-bookmark[data-orientation=perpendicular][data-edge=top],.flipbook-bookmark[data-orientation=perpendicular][data-edge=bottom]{writing-mode:vertical-rl}.flipbook-bookmark[data-orientation=parallel][data-edge=left]>.flipbook-bookmark__content,.flipbook-bookmark[data-orientation=parallel][data-edge=right]>.flipbook-bookmark__content,.flipbook-bookmark[data-orientation=perpendicular][data-edge=top]>.flipbook-bookmark__content,.flipbook-bookmark[data-orientation=perpendicular][data-edge=bottom]>.flipbook-bookmark__content{width:100%;height:var(--bookmark-exposed-major, 52px)}.flipbook-bookmark[data-orientation=perpendicular][data-edge=right]>.flipbook-bookmark__content,.flipbook-bookmark[data-orientation=parallel][data-edge=bottom]>.flipbook-bookmark__content{left:auto;right:0}.flipbook-bookmark[data-orientation=parallel][data-edge=right]>.flipbook-bookmark__content,.flipbook-bookmark[data-orientation=perpendicular][data-edge=bottom]>.flipbook-bookmark__content{top:auto;bottom:0}.flipbook-bookmark[data-preview-open=true]>.flipbook-bookmark__content{opacity:0}.flipbook-bookmark-preview{position:fixed;z-index:2147483000;pointer-events:auto;transition:left .18s ease,top .18s ease,clip-path .18s ease}.flipbook-bookmark-preview[hidden]{display:none}.flipbook-bookmark-preview[data-open=false] .flipbook-bookmark__content{opacity:1}.flipbook-bookmark--expanded{position:absolute;width:100%;height:100%}.flipbook-bookmark__expanded-content{position:absolute;inset:3px;display:flex;align-items:center;min-width:0;min-height:0;overflow:hidden;white-space:nowrap;writing-mode:inherit;opacity:0;transition:opacity .18s ease}.flipbook-bookmark__expanded-content[hidden]{display:none}.flipbook-bookmark__renderer{display:contents}.flipbook-bookmark-default{display:flex;align-items:baseline;gap:6px}.flipbook-bookmark-default small{opacity:.7}.flipbook-bookmark-preview[data-open=true] .flipbook-bookmark__expanded-content{opacity:1}@media(prefers-reduced-motion:reduce){.flipbook-bookmark-preview,.flipbook-bookmark--expanded,.flipbook-bookmark__content,.flipbook-bookmark__expanded-content{transition:none}}.flipbook--select-text .page:not(.page--flipping){-webkit-user-select:text;user-select:text}.toc-page{background-color:#fffef8;font-family:inherit;line-height:1.6;height:100%;box-sizing:border-box;container-type:inline-size;overflow:hidden;display:flex;flex-direction:column;padding:8% 6%}.toc-page__scroll{flex:1;min-width:0;min-height:0;overflow-x:hidden;overflow-y:auto}.flipbook-page-content .toc-page__scroll{flex:0 0 auto;overflow:visible}.toc-heading{text-align:center;overflow-wrap:anywhere;margin-bottom:24px;color:#2c1810;font-size:1.4rem;border-bottom:none}.toc-list{list-style:none;padding:0;margin:0}.toc-list li{margin-bottom:8px}.toc-link{display:flex;flex-direction:row;align-items:baseline;width:100%;box-sizing:border-box;padding:8px 4px;background:none;border:none;cursor:pointer;font-family:inherit;font-size:.75em;text-align:inherit;color:inherit;text-decoration:none;transition:background-color .15s ease}.toc-link:hover{background-color:#0000000d}.toc-link:focus{outline:2px solid #1a3a5c;outline-offset:2px}.toc-title{flex:0 1 auto;min-width:0;overflow-wrap:anywhere}.toc-dots{flex-grow:1;border-bottom:1px dotted #999;margin:0 8px;min-width:20px}.toc-page-num{flex-shrink:0;white-space:nowrap;font-weight:600;color:#1a3a5c}@container (max-width: 160px){.toc-link{flex-wrap:wrap}.toc-title{flex-basis:100%}.toc-dots{min-width:0;margin:0;margin-inline-end:8px}}.flipbook-toolbar-download-wrap{position:relative;display:inline-flex}.flipbook-toolbar-download-trigger{display:flex;align-items:center;justify-content:center}.flipbook-toolbar-download-menu{position:fixed;margin:0;box-sizing:border-box;min-width:min(320px,90vw);width:max-content;max-width:min(400px,95vw);max-height:min(70vh,480px);overflow-y:auto;padding:8px 0;background-color:#18181cfa;border-radius:12px;box-shadow:0 8px 30px #00000059,0 1px 3px #00000026;z-index:10000;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.flipbook-toolbar-download-menu--open-up{margin:0}.flipbook-toolbar-download-mode{display:flex;flex-direction:column;gap:2px;padding:4px 8px;border:none;margin:0;min-width:0}.flipbook-toolbar-download-radio-label{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;color:#ffffffeb;font-size:14px;cursor:pointer;transition:background-color .15s ease;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;user-select:none;min-width:0}.flipbook-toolbar-download-radio-label span{flex:0 1 auto;min-width:min-content;overflow:visible;white-space:nowrap}.flipbook-toolbar-download-radio-label:hover{background-color:#ffffff14}.flipbook-toolbar-download-radio-label:active{background-color:#ffffff1f}.flipbook-toolbar-download-radio{width:18px;height:18px;accent-color:#6ea8fe;flex-shrink:0}.flipbook-toolbar-download-range{display:flex;flex-wrap:wrap;flex-direction:row;align-items:center;gap:10px;padding:12px 16px;border-top:1px solid rgba(255,255,255,.1);margin-top:4px}.flipbook-toolbar-download-range-label{display:inline-flex;align-items:center;gap:8px;color:#ffffffbf;font-size:13px;font-weight:500;letter-spacing:.02em;text-transform:uppercase}.flipbook-toolbar-download-range-select{padding:8px 10px;border-radius:8px;border:1px solid rgba(255,255,255,.18);background:#ffffff0f;color:#fff;font-family:inherit;font-size:14px;min-width:5ch;text-align:start;direction:inherit;transition:border-color .15s ease;outline:none}.flipbook-toolbar-download-range-select:focus{border-color:#6ea8fe99}.flipbook-toolbar-download-range-select option{color:#000;background:#fff}.flipbook-toolbar-download-error{margin:8px 8px 0;padding:8px 12px;border-radius:8px;background:#ff6b6b24;color:#ff8787;font-size:13px;text-align:start}.flipbook-toolbar-download-menuitem{display:block;width:calc(100% - 16px);margin:4px 8px 0;padding:12px 16px;border:none;background:#6ea8fe2e;color:#6ea8fe;font-family:inherit;font-size:14px;font-weight:600;text-align:center;cursor:pointer;border-radius:8px;transition:background-color .15s ease,transform .1s ease;-webkit-tap-highlight-color:transparent}.flipbook-toolbar-download-menuitem:hover:not(:disabled){background-color:#6ea8fe47}.flipbook-toolbar-download-menuitem:active:not(:disabled){transform:scale(.97);background-color:#6ea8fe59}.flipbook-toolbar-download-menuitem:disabled{opacity:.5;cursor:not-allowed}.flipbook-toolbar-download-primary{margin-top:8px}.flipbook-toolbar-download-extra{padding:4px 16px 8px;border-top:1px solid rgba(255,255,255,.1);margin-top:8px;color:#ffffffbf;font-size:13px;text-align:start}.flipbook-toolbar-download-range-download{padding:10px 16px;border:none;border-radius:8px;background:#ffffff26;color:#fff;font-size:14px;font-weight:500;cursor:pointer;transition:background-color .15s ease}.flipbook-toolbar-download-range-download:hover:not(:disabled){background:#ffffff40}.flipbook-toolbar-download-range-download:disabled{opacity:.5;cursor:not-allowed}.flipbook-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 16px;min-height:48px;box-sizing:border-box;background-color:#000000b3;border-radius:8px;-webkit-user-select:none;user-select:none;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.flipbook-toolbar-start{display:flex;align-items:center;gap:8px;flex:1;justify-content:flex-start}.flipbook-toolbar-nav-cluster{display:flex;align-items:center;gap:8px;flex-shrink:0}.flipbook-toolbar--rtl .flipbook-toolbar-button>*{transform:scaleX(-1)}.flipbook-toolbar--rtl .flipbook-toolbar-mouse-mode>*{transform:none}.flipbook-toolbar-end{display:flex;align-items:center;gap:8px;flex:1;justify-content:flex-end}.flipbook-toolbar-button{display:flex;align-items:center;justify-content:center;width:40px;height:40px;padding:0;border:none;border-radius:6px;background-color:transparent;color:#fff;font-size:20px;cursor:pointer;transition:background-color .2s ease,opacity .2s ease}.flipbook-toolbar-button:hover:not(:disabled){background-color:#ffffff26}.flipbook-toolbar-button:active:not(:disabled){background-color:#ffffff40}.flipbook-toolbar-button:focus-visible{outline:2px solid #fff;outline-offset:2px}.flipbook-toolbar-button:disabled{opacity:.4;cursor:not-allowed}.flipbook-toolbar-mouse-mode[aria-pressed=true]{background-color:#ffffff40}.flipbook-toolbar-mouse-mode-icon{display:inline-flex;align-items:center;gap:3px;font-size:15px;font-weight:600;line-height:1}.flipbook-toolbar-mouse-mode-caret{display:inline-block;width:9px;height:18px;background:currentColor;-webkit-mask:url(data:image/png;base64,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) center / 18px 18px no-repeat;mask:url(data:image/png;base64,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) center / 18px 18px no-repeat}.flipbook-toolbar-prev,.flipbook-toolbar-next{font-size:28px;font-weight:700}.flipbook-toolbar-first,.flipbook-toolbar-last{font-size:16px}.flipbook-toolbar-fullscreen{font-size:18px}.flipbook-toolbar-fullscreen--active{background-color:#ffffff1a}.flipbook-toc-icon--flip-h{transform:scaleX(-1)}span.flipbook-toolbar-indicator{display:inline-flex;align-items:center;justify-content:center;color:inherit;font-size:14px;font-weight:500;text-align:center;padding:0 4px;white-space:nowrap}input.flipbook-toolbar-indicator{display:inline-block;font-family:inherit;font-size:14px;font-weight:500;text-align:center;box-sizing:border-box;border:1px solid transparent;border-radius:4px;padding:4px 8px;min-width:3ch;color:inherit;white-space:nowrap;transition:background-color .2s ease,color .2s ease}input.flipbook-toolbar-indicator--editing{background:#fff;color:#1a1a1a}input.flipbook-toolbar-indicator:focus{outline:2px solid currentColor;outline-offset:2px}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
|
package/dist/flip-book.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flip-book.js","sources":["../src/TocPage.tsx","../src/FlipBook.tsx"],"sourcesContent":["import type { PageSemantics } from \"html-flip-book-vanilla\";\nimport type React from \"react\";\nimport \"./TocPage.css\";\n\n/**\n * Entry in the table of contents.\n */\nexport interface TocEntry {\n\t/** Page index to navigate to */\n\tpageIndex: number;\n\t/** Display title (from pageSemantics.indexToTitle or custom) */\n\ttitle: string;\n\t/** Semantic page name/number (from pageSemantics.indexToSemanticName) */\n\tsemanticName: string;\n}\n\n/**\n * Props for the TocPage component.\n */\nexport interface TocPageProps {\n\t/** Callback to navigate to a specific page */\n\tonNavigate: (pageIndex: number) => void;\n\t/** Total number of pages in the book */\n\ttotalPages: number;\n\t/** Page semantics for generating titles and page numbers */\n\tpageSemantics?: PageSemantics;\n\t/** Custom heading text. Default: \"Table of Contents\" */\n\theading?: string;\n\t/** Custom CSS class for the container */\n\tclassName?: string;\n\t/** Reading direction for RTL support */\n\tdirection?: \"ltr\" | \"rtl\";\n\t/**\n\t * Filter function to determine which pages appear in TOC.\n\t * By default, only pages with a title are included.\n\t */\n\tfilter?: (entry: TocEntry, pageIndex: number) => boolean;\n\t/** URL for an entry. When provided, modified clicks use native browser navigation. */\n\tgetHref?: (entry: TocEntry) => string | null | undefined;\n\t/**\n\t * Custom render function for TOC entries.\n\t * If not provided, uses default rendering.\n\t */\n\trenderEntry?: (entry: TocEntry, onClick: () => void, href?: string) => React.ReactNode;\n}\n\n/**\n * Default filter: include pages that have a non-empty title.\n */\nconst defaultFilter = (entry: TocEntry): boolean => entry.title.length > 0;\n\n/**\n * A table of contents page component for FlipBook.\n *\n * Automatically generates TOC entries from pageSemantics, showing pages\n * that have titles. Entries display title with fallback to semantic name,\n * then page index.\n *\n * @example\n * ```tsx\n * <TocPage\n * onNavigate={(pageIndex) => flipBookRef.current?.flipToPage(pageIndex)}\n * totalPages={20}\n * pageSemantics={mySemantics}\n * heading=\"Contents\"\n * direction=\"rtl\"\n * />\n * ```\n */\nconst TocPage: React.FC<TocPageProps> = ({\n\tonNavigate,\n\ttotalPages,\n\tpageSemantics,\n\theading = \"Table of Contents\",\n\tclassName,\n\tdirection = \"ltr\",\n\tfilter = defaultFilter,\n\tgetHref,\n\trenderEntry,\n}) => {\n\t// Generate TOC entries for all pages\n\tconst entries: TocEntry[] = [];\n\tfor (let i = 0; i < totalPages; i++) {\n\t\tconst title = pageSemantics?.indexToTitle(i) ?? \"\";\n\t\tconst semanticName = pageSemantics?.indexToSemanticName(i) ?? \"\";\n\t\tconst entry: TocEntry = { pageIndex: i, title, semanticName };\n\n\t\tif (filter(entry, i)) {\n\t\t\tentries.push(entry);\n\t\t}\n\t}\n\n\tconst renderDefaultEntry = (entry: TocEntry, onClick: () => void, href?: string) => {\n\t\t// Title on one side (left in LTR, right in RTL); semantic name or page index on the other\n\t\tconst title = entry.title || entry.semanticName || `Page ${entry.pageIndex + 1}`;\n\t\tconst pageOrSemantic = entry.semanticName || String(entry.pageIndex + 1);\n\n\t\tconst content = (\n\t\t\t<>\n\t\t\t\t<span className=\"toc-title\">{title}</span>\n\t\t\t\t<span className=\"toc-dots\" aria-hidden />\n\t\t\t\t<span className=\"toc-page-num\">{pageOrSemantic}</span>\n\t\t\t</>\n\t\t);\n\n\t\treturn (\n\t\t\t<li key={entry.pageIndex}>\n\t\t\t\t{href ? (\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={href}\n\t\t\t\t\t\tclassName=\"toc-link\"\n\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tevent.button !== 0 ||\n\t\t\t\t\t\t\t\tevent.ctrlKey ||\n\t\t\t\t\t\t\t\tevent.metaKey ||\n\t\t\t\t\t\t\t\tevent.shiftKey ||\n\t\t\t\t\t\t\t\tevent.altKey\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tonClick();\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</a>\n\t\t\t\t) : (\n\t\t\t\t\t<button type=\"button\" className=\"toc-link\" onClick={onClick}>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</li>\n\t\t);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`toc-page ${className ?? \"\"}`.trim()}\n\t\t\tstyle={{ direction, textAlign: direction === \"rtl\" ? \"right\" : \"left\" }}\n\t\t>\n\t\t\t<div className=\"toc-page__scroll\">\n\t\t\t\t<h2 className=\"toc-heading\">{heading}</h2>\n\t\t\t\t<ul className=\"toc-list\">\n\t\t\t\t\t{entries.map((entry) => {\n\t\t\t\t\t\tconst onClick = () => onNavigate(entry.pageIndex);\n\t\t\t\t\t\tconst href = getHref?.(entry) ?? undefined;\n\t\t\t\t\t\treturn renderEntry\n\t\t\t\t\t\t\t? renderEntry(entry, onClick, href)\n\t\t\t\t\t\t\t: renderDefaultEntry(entry, onClick, href);\n\t\t\t\t\t})}\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport { TocPage };\n","import {\n\ttype BookmarkProvider as BaseBookmarkProvider,\n\ttype Bookmark,\n\tFlipBook as FlipBookBase,\n\ttype HistoryMapper,\n\ttype MouseMode,\n\ttype PageFlipParams,\n\ttype PageSemantics,\n} from \"html-flip-book-vanilla\";\nimport \"../../base/src/mouse-mode.scss\";\nimport type { DownloadConfig } from \"html-flip-book-vanilla/download\";\nimport type React from \"react\";\nimport { Children, forwardRef, useEffect, useImperativeHandle, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\n/** Bookmark content is rendered with React and keeps access to the consumer's contexts. */\nexport type BookmarkProvider = BaseBookmarkProvider<React.ReactNode>;\n\ninterface BookmarkSlot {\n\tkey: string;\n\tbookmark: Bookmark;\n\telement: HTMLElement;\n\trenderer: BookmarkProvider[\"renderBookmark\"];\n}\n\n/**\n * Imperative handle exposed via ref for programmatic control of the FlipBook.\n * Flipbook methods (flipNext, jumpToPage, etc.) are called internally by commands;\n * consumers interact through commands (execute) and getters (ref).\n *\n * @example\n * ```tsx\n * const ref = useRef<FlipBookHandle>(null);\n * const page = ref.current?.getCurrentPageIndex();\n * ```\n */\nexport interface FlipBookHandle {\n\t/** Animate flip to the next page */\n\tflipNext: () => Promise<void>;\n\t/** Animate flip to the previous page */\n\tflipPrev: () => Promise<void>;\n\t/** Animate flip to a specific page index */\n\tflipToPage: (pageIndex: number) => Promise<void>;\n\t/** Jump to a specific page instantly without animation */\n\tjumpToPage: (pageIndex: number) => void;\n\t/** Show a router-selected page without adding a browser history entry. */\n\trestorePage: (pageIndex: number) => void;\n\t/** Toggle debug toolbar visibility (when debug mode is enabled). Bound to Ctrl+Alt+D by default. */\n\ttoggleDebugBar?: () => void;\n\t/** Get the current (leftmost visible) page index */\n\tgetCurrentPageIndex: () => number;\n\t/** Get the total number of pages */\n\tgetTotalPages: () => number;\n\t/** Get the \"of\" value for the indicator (e.g. total label). Defaults to total pages when not set. */\n\tgetOf: () => string | number;\n\t/** Check if currently at the first page */\n\tisFirstPage: () => boolean;\n\t/** Check if currently at the last page */\n\tisLastPage: () => boolean;\n\t/** Get download configuration for the book. Undefined when no download is configured. */\n\tgetDownloadConfig: () => DownloadConfig | undefined;\n\t/** Get the configured table of contents page index. */\n\tgetTocPageIndex: () => number;\n\t/** Current mouse interaction mode. Touch gestures are unaffected. */\n\tgetMouseMode: () => MouseMode;\n\t/** Switch between continuous page turning and native text selection. */\n\tsetMouseMode: (mode: MouseMode, options?: { persist?: boolean }) => void;\n}\n\n/**\n * Configuration for book covers.\n */\nexport interface CoverConfig {\n\t/**\n\t * Make covers \"hard\" - no page curl effect on covers.\n\t * When true, cover pages appear flat without the soft page bend.\n\t * Default: false\n\t */\n\thardCovers?: boolean;\n\t/**\n\t * Disable shadow effects on cover pages.\n\t * Default: false\n\t */\n\tnoShadow?: boolean;\n\t/**\n\t * Page indices that are considered cover pages.\n\t * Default: [0] (front cover only). Use [0, totalPages-1] for front and back covers.\n\t * If \"auto\", uses first and last pages as covers.\n\t */\n\tcoverIndices?: number[] | \"auto\";\n\t/**\n\t * CSS class applied to interior sides of cover leaves (the endpaper).\n\t * Sets the page background to the cover color; the white endpaper inset\n\t * is created automatically by the infrastructure.\n\t */\n\tinteriorCoverClassName?: string;\n\t/**\n\t * Override interiorCoverClassName for the front cover interior specifically.\n\t */\n\tfrontInteriorCoverClassName?: string;\n\t/**\n\t * Override interiorCoverClassName for the back cover interior specifically.\n\t */\n\tbackInteriorCoverClassName?: string;\n\t/**\n\t * Inset size for the interior endpaper frame.\n\t * Any valid CSS length (e.g. \"5%\", \"12px\"). Default: \"5%\".\n\t */\n\tcoverInset?: string;\n}\n\n/**\n * Handlers for FlipBook events. Pass via the `handlers` prop.\n */\nexport interface FlipBookHandlers {\n\t/** Fired when a flip animation starts. Params: leaf index, page indices, semantics, direction. */\n\tonPageFlipping?: (params: PageFlipParams) => void;\n\t/** Fired when a flip completes. Params: leaf index, page indices, semantics, direction. */\n\tonPageFlipped?: (params: PageFlipParams) => void;\n}\n\n/**\n * Props for the FlipBook React component.\n */\nexport interface FlipBookProps {\n\t/** Array of React elements to render as pages */\n\tpages: React.ReactNode[];\n\t/** CSS class name for the flipbook container */\n\tclassName: string;\n\t/** Define which pages are covers for special styling */\n\tpageSemantics?: PageSemantics;\n\t/** Page bookmark content, placement, ordering, and optional click behavior. */\n\tbookmarkProvider?: BookmarkProvider;\n\t/** Opt in to bookmarks. Without a custom provider, use the TOC and its chapter entries. Default: false. */\n\tenableBookmarks?: boolean;\n\t/** Enable debug mode */\n\tdebug?: boolean;\n\t/** Reading direction: 'ltr' (left-to-right) or 'rtl' (right-to-left) */\n\tdirection?: \"rtl\" | \"ltr\";\n\t/** Initial mouse interaction mode. Default: 'turn'. */\n\tmouseMode?: MouseMode;\n\t/** Optional localStorage key used to remember the user's mouse mode. */\n\tmouseModeStorageKey?: string;\n\t/** Indices of leaves that should start in the turned (flipped) state */\n\tinitialTurnedLeaves?: number[];\n\t/** Velocity threshold (px/s) for fast swipe to complete flip. Default: 500 */\n\tfastDeltaThreshold?: number;\n\t/**\n\t * Number of leaves to keep rendered before and after the current position.\n\t * When set, only leaves within the buffer range are visible for performance.\n\t * Default: undefined (all leaves are always rendered)\n\t */\n\tleavesBuffer?: number;\n\t/**\n\t * Configuration for cover pages (front and back covers).\n\t */\n\tcoverConfig?: CoverConfig;\n\t/**\n\t * Override for the \"of\" part of the page indicator (e.g. a gematria letter for the total, like \"נ\" for 50 in Hebrew books).\n\t * Defaults to total pages count when not set.\n\t */\n\tof?: string | number;\n\t/**\n\t * Aspect ratio for inner pages (text block leaves).\n\t * Default: { width: 2, height: 3 }\n\t */\n\tleafAspectRatio?: { width: number; height: number };\n\t/**\n\t * Aspect ratio for cover boards (slightly larger than leaf).\n\t * The delta between cover and leaf aspect ratios determines the visible frame.\n\t * Default: { width: 2.15, height: 3.15 }\n\t */\n\tcoverAspectRatio?: { width: number; height: number };\n\t/**\n\t * Event handlers. Use this to pass callbacks (e.g. onPageFlipped) instead of top-level props.\n\t */\n\thandlers?: FlipBookHandlers;\n\t/**\n\t * When set, syncs the flip-book with browser history: pushState on flip, restore page on back/forward,\n\t * and adopt the page named by the current URL on mount.\n\t * When omitted and enableHistory is not false, the built-in `#page/{name}` hash mapper is used.\n\t */\n\thistoryMapper?: HistoryMapper;\n\t/**\n\t * Table of contents page index (book-level). Populates the store used by goToToc command and TocButton.\n\t * Default: 4.\n\t */\n\ttocPageIndex?: number;\n\t/**\n\t * Download configuration: entire book and page-range handlers plus filename hints.\n\t * Toolbar's DownloadDropdown reads this from the flipbook ref.\n\t * When omitted and enableDownload is not false, the built-in JSON page-index default is used.\n\t */\n\tdownloadConfig?: DownloadConfig;\n\t/**\n\t * When false, disables the inner page shadow/highlight (e.g. to avoid flicker with multiple books).\n\t * Default: true.\n\t */\n\tpageShadow?: boolean;\n\t/**\n\t * When true, uses aggressive containment on pages during flip animations\n\t * so the browser can operate on a cached GPU texture rather than\n\t * re-rendering content every frame. Reduces jank when flipping rapidly.\n\t * Default: true.\n\t */\n\tsnapshotDuringFlip?: boolean;\n\t/**\n\t * When false, history integration is disabled entirely. When true or omitted, the provided\n\t * historyMapper is used, or the built-in hash-based default when none is provided.\n\t */\n\tenableHistory?: boolean;\n\t/**\n\t * When false, download is disabled entirely (getDownloadConfig returns undefined). When true or\n\t * omitted, the provided downloadConfig is used, or the built-in JSON page-index default when none\n\t * is provided.\n\t */\n\tenableDownload?: boolean;\n}\n\n/**\n * A React component for creating realistic page-flip animations.\n *\n * @example\n * ```tsx\n * import { FlipBook } from 'html-flip-book-react';\n *\n * function App() {\n * const ref = useRef<FlipBookHandle>(null);\n * return (\n * <FlipBook\n * ref={ref}\n * pages={[<div>Page 1</div>, <div>Page 2</div>]}\n * className=\"my-book\"\n * direction=\"ltr\"\n * />\n * );\n * }\n * ```\n */\nconst FlipBookReact = forwardRef<FlipBookHandle, FlipBookProps>(\n\t(\n\t\t{\n\t\t\tpages,\n\t\t\tclassName,\n\t\t\tdebug = false,\n\t\t\tdirection = \"ltr\",\n\t\t\tmouseMode = \"turn\",\n\t\t\tmouseModeStorageKey,\n\t\t\tpageSemantics = undefined,\n\t\t\tbookmarkProvider,\n\t\t\tenableBookmarks = false,\n\t\t\tinitialTurnedLeaves = [],\n\t\t\tfastDeltaThreshold,\n\t\t\tleavesBuffer,\n\t\t\tpageShadow = true,\n\t\t\tsnapshotDuringFlip = true,\n\t\t\tenableHistory,\n\t\t\tenableDownload,\n\t\t\tcoverConfig,\n\t\t\tof,\n\t\t\tleafAspectRatio,\n\t\t\tcoverAspectRatio,\n\t\t\thandlers,\n\t\t\thistoryMapper,\n\t\t\ttocPageIndex,\n\t\t\tdownloadConfig,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst [currentPageIndex, setCurrentPageIndex] = useState(() => {\n\t\t\t// Derive the initial page index from initialTurnedLeaves so the\n\t\t\t// leavesBuffer renders around the correct page on the very first\n\t\t\t// render — before the base flipbook's useEffect fires.\n\t\t\t// Must match the base flipbook's model: visible spread starts at\n\t\t\t// lastTurnedLeaf * 2 + 1 (back of the last turned leaf).\n\t\t\tif (initialTurnedLeaves && initialTurnedLeaves.length > 0) {\n\t\t\t\tconst lastTurnedLeaf = Math.max(...initialTurnedLeaves);\n\t\t\t\tconst firstVisiblePage = lastTurnedLeaf * 2 + 1;\n\t\t\t\tif (firstVisiblePage >= pages.length) {\n\t\t\t\t\tconst lastLeaf = Math.ceil(pages.length / 2) - 1;\n\t\t\t\t\treturn lastLeaf * 2;\n\t\t\t\t}\n\t\t\t\treturn firstVisiblePage;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\t\tconst setPageIndexRef = useRef(setCurrentPageIndex);\n\t\tconst [bookmarkSlots, setBookmarkSlots] = useState<BookmarkSlot[]>([]);\n\t\tsetPageIndexRef.current = setCurrentPageIndex;\n\t\tconst ofRef = useRef(of);\n\t\tofRef.current = of;\n\n\t\t// Debounce buffer-related re-renders during rapid consecutive page flips.\n\t\t// When leavesBuffer is set, each onPageChanged triggers a React re-render\n\t\t// that recalculates which pages to mount/unmount — expensive with complex\n\t\t// content (e.g. Hebrew text, perushim). By debouncing, rapid flips (>1 at\n\t\t// a time) batch into a single re-render after settling. The page indicator\n\t\t// reads directly from the imperative handle (flipBook.current) and is not\n\t\t// affected by this debounce.\n\t\tconst BUFFER_DEBOUNCE_MS = 80;\n\t\tconst pageChangedTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\t\t// Leaves whose flip animation is in flight. The base keeps their page\n\t\t// wrappers visible even outside the leavesBuffer window, so their content\n\t\t// must stay mounted too — otherwise a revealed flipping page renders blank\n\t\t// (issue #167). Cleared once flips settle and the buffer window recenters.\n\t\tconst inflightLeavesRef = useRef<Set<number>>(new Set());\n\t\tconst [, setInflightVersion] = useState(0);\n\t\tconst onPageChangedRef = useRef((index: number) => {\n\t\t\tsetPageIndexRef.current?.(index);\n\t\t});\n\t\tonPageChangedRef.current = (index: number) => {\n\t\t\tif (pageChangedTimerRef.current != null) {\n\t\t\t\tclearTimeout(pageChangedTimerRef.current);\n\t\t\t}\n\t\t\tif (leavesBuffer == null) {\n\t\t\t\t// No buffer — update immediately; no expensive mount/unmount cycle.\n\t\t\t\tsetPageIndexRef.current?.(index);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpageChangedTimerRef.current = setTimeout(() => {\n\t\t\t\tpageChangedTimerRef.current = null;\n\t\t\t\tinflightLeavesRef.current.clear();\n\t\t\t\tsetPageIndexRef.current?.(index);\n\t\t\t}, BUFFER_DEBOUNCE_MS);\n\t\t};\n\t\tconst onPageFlippingRef = useRef((params: PageFlipParams) => {\n\t\t\thandlers?.onPageFlipping?.(params);\n\t\t});\n\t\tonPageFlippingRef.current = (params) => {\n\t\t\tif (leavesBuffer != null) {\n\t\t\t\t// The flipping leaf holds the page on the trailing edge of the target\n\t\t\t\t// spread: backward flips carry pageIndices[1] on their back, forward\n\t\t\t\t// flips carry pageIndices[0] on their front.\n\t\t\t\tconst edgePage =\n\t\t\t\t\tparams.direction === \"backward\" ? params.pageIndices[1] : params.pageIndices[0];\n\t\t\t\tconst flippingLeaf = Math.floor(edgePage / 2);\n\t\t\t\tif (!inflightLeavesRef.current.has(flippingLeaf)) {\n\t\t\t\t\tinflightLeavesRef.current.add(flippingLeaf);\n\t\t\t\t\tsetInflightVersion((v) => v + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\thandlers?.onPageFlipping?.(params);\n\t\t};\n\n\t\t// Clean up debounce timer on unmount.\n\t\tuseEffect(() => {\n\t\t\treturn () => {\n\t\t\t\tif (pageChangedTimerRef.current != null) {\n\t\t\t\t\tclearTimeout(pageChangedTimerRef.current);\n\t\t\t\t}\n\t\t\t};\n\t\t}, []);\n\n\t\tconst flipBook = useRef(\n\t\t\tnew FlipBookBase({\n\t\t\t\tpageSemantics: pageSemantics,\n\t\t\t\tenableBookmarks,\n\t\t\t\tpagesCount: pages.length,\n\t\t\t\tdirection: direction,\n\t\t\t\tmouseMode,\n\t\t\t\tinitialTurnedLeaves: initialTurnedLeaves,\n\t\t\t\tfastDeltaThreshold: fastDeltaThreshold,\n\t\t\t\tleavesBuffer: leavesBuffer,\n\t\t\t\tleafAspectRatio: leafAspectRatio,\n\t\t\t\tcoverAspectRatio: coverAspectRatio,\n\t\t\t\tcoverPageIndices: coverConfig?.coverIndices,\n\t\t\t\tonPageChanged: (index: number) => onPageChangedRef.current(index),\n\t\t\t\tonPageFlipping: (params) => onPageFlippingRef.current(params),\n\t\t\t\tonPageFlipped: handlers?.onPageFlipped,\n\t\t\t\thistoryMapper,\n\t\t\t\ttocPageIndex: tocPageIndex ?? 4,\n\t\t\t\tdownloadConfig,\n\t\t\t\tpageShadow,\n\t\t\t\tsnapshotDuringFlip,\n\t\t\t\tenableHistory,\n\t\t\t\tenableDownload,\n\t\t\t}),\n\t\t);\n\n\t\t// Expose imperative handle: flipbook methods (called by commands) and getters (for UI)\n\t\tuseImperativeHandle(\n\t\t\tref,\n\t\t\t() => ({\n\t\t\t\tflipNext: () => flipBook.current.flipNext(),\n\t\t\t\tflipPrev: () => flipBook.current.flipPrev(),\n\t\t\t\tflipToPage: (pageIndex: number) => flipBook.current.flipToPage(pageIndex),\n\t\t\t\tjumpToPage: (pageIndex: number) => flipBook.current.jumpToPage(pageIndex),\n\t\t\t\trestorePage: (pageIndex: number) => flipBook.current.restorePage(pageIndex),\n\t\t\t\ttoggleDebugBar: () => {\n\t\t\t\t\tconst selectorClass = className.split(/\\s+/)[0];\n\t\t\t\t\tconst root = document.querySelector(`.${selectorClass}`);\n\t\t\t\t\tconst bar = root?.querySelector(\".flipbook-debug-bar\");\n\t\t\t\t\tif (bar) bar.classList.toggle(\"flipbook-debug-bar--hidden\");\n\t\t\t\t},\n\t\t\t\tgetCurrentPageIndex: () => flipBook.current.currentPageIndex,\n\t\t\t\tgetTotalPages: () => flipBook.current.totalPages,\n\t\t\t\tgetOf: () => (ofRef.current !== undefined ? ofRef.current : flipBook.current.totalPages),\n\t\t\t\tisFirstPage: () => flipBook.current.isFirstPage,\n\t\t\t\tisLastPage: () => flipBook.current.isLastPage,\n\t\t\t\tgetDownloadConfig: () => flipBook.current.getDownloadConfig(),\n\t\t\t\tgetTocPageIndex: () => flipBook.current.getTocPageIndex(),\n\t\t\t\tgetMouseMode: () => flipBook.current.getMouseMode(),\n\t\t\t\tsetMouseMode: (mode: MouseMode, options?: { persist?: boolean }) => {\n\t\t\t\t\tflipBook.current.setMouseMode(mode);\n\t\t\t\t\tif (mouseModeStorageKey && options?.persist !== false) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlocalStorage.setItem(mouseModeStorageKey, mode);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Private browsing may deny storage; the mode still works this session.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}),\n\t\t\t[className, mouseModeStorageKey],\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tconst currentFlipBook = flipBook.current;\n\t\t\tconst selectorClass = className.split(/\\s+/)[0];\n\t\t\tcurrentFlipBook.render(`.${selectorClass}`, debug);\n\t\t\tif (mouseModeStorageKey) {\n\t\t\t\ttry {\n\t\t\t\t\tconst savedMode = localStorage.getItem(mouseModeStorageKey);\n\t\t\t\t\tif (savedMode === \"turn\" || savedMode === \"select\")\n\t\t\t\t\t\tcurrentFlipBook.setMouseMode(savedMode);\n\t\t\t\t} catch {\n\t\t\t\t\t// Storage is optional.\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetCurrentPageIndex(currentFlipBook.currentPageIndex);\n\n\t\t\t// Cleanup function to destroy Hammer instance and event listeners\n\t\t\treturn () => {\n\t\t\t\tcurrentFlipBook.destroy();\n\t\t\t};\n\t\t}, [className, debug, mouseModeStorageKey]);\n\n\t\tconst previousBookmarksEnabled = useRef(enableBookmarks);\n\t\tuseEffect(() => {\n\t\t\tif (previousBookmarksEnabled.current === enableBookmarks) return;\n\t\t\tpreviousBookmarksEnabled.current = enableBookmarks;\n\t\t\tflipBook.current.setBookmarksEnabled(enableBookmarks);\n\t\t}, [enableBookmarks]);\n\n\t\tuseEffect(() => {\n\t\t\tconst currentFlipBook = flipBook.current;\n\t\t\tif (!bookmarkProvider) {\n\t\t\t\tsetBookmarkSlots([]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet active = true;\n\t\t\tconst slots = new Map<string, BookmarkSlot>();\n\t\t\tconst renderSlot = (bookmark: Bookmark, expanded: boolean): HTMLElement => {\n\t\t\t\tconst key = `${expanded ? \"expanded\" : \"brief\"}:${bookmark.id}`;\n\t\t\t\tlet slot = slots.get(key);\n\t\t\t\tif (!slot) {\n\t\t\t\t\tslot = {\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tbookmark,\n\t\t\t\t\t\telement: Object.assign(document.createElement(\"span\"), {\n\t\t\t\t\t\t\tclassName: \"flipbook-bookmark__renderer\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\trenderer: expanded\n\t\t\t\t\t\t\t? bookmarkProvider.renderExpandedBookmark\n\t\t\t\t\t\t\t: bookmarkProvider.renderBookmark,\n\t\t\t\t\t};\n\t\t\t\t\tslots.set(key, slot);\n\t\t\t\t}\n\t\t\t\tslot.bookmark = bookmark;\n\t\t\t\treturn slot.element;\n\t\t\t};\n\t\t\tconst provider: BaseBookmarkProvider = {\n\t\t\t\t...bookmarkProvider,\n\t\t\t\tgetBookmarks: (context) => {\n\t\t\t\t\tconst bookmarks = bookmarkProvider.getBookmarks(context);\n\t\t\t\t\tconst ids = new Set(bookmarks.map((bookmark) => bookmark.id));\n\t\t\t\t\tfor (const [key, slot] of slots) {\n\t\t\t\t\t\tif (!ids.has(slot.bookmark.id)) slots.delete(key);\n\t\t\t\t\t}\n\t\t\t\t\t// The base renderer creates the slots synchronously after this query.\n\t\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t\tif (!active) return;\n\t\t\t\t\t\tfor (const [id, slot] of slots) {\n\t\t\t\t\t\t\tif (!slot.element.isConnected) slots.delete(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetBookmarkSlots([...slots.values()]);\n\t\t\t\t\t});\n\t\t\t\t\treturn bookmarks;\n\t\t\t\t},\n\t\t\t\trenderBookmark: (bookmark) => renderSlot(bookmark, false),\n\t\t\t\trenderExpandedBookmark: bookmarkProvider.renderExpandedBookmark\n\t\t\t\t\t? (bookmark) => renderSlot(bookmark, true)\n\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t\tcurrentFlipBook.setBookmarkProvider(provider);\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t\tcurrentFlipBook.setBookmarkProvider(undefined);\n\t\t\t};\n\t\t}, [bookmarkProvider]);\n\n\t\t// Sync pageShadow to DOM when prop changes (base option is set at construct time).\n\t\tuseEffect(() => {\n\t\t\tconst selectorClass = className.split(/\\s+/)[0];\n\t\t\tconst el = document.querySelector(`.${selectorClass}`);\n\t\t\tif (!el) return;\n\t\t\tif (pageShadow) {\n\t\t\t\tel.classList.remove(\"flipbook--no-page-shadow\");\n\t\t\t} else {\n\t\t\t\tel.classList.add(\"flipbook--no-page-shadow\");\n\t\t\t}\n\t\t}, [className, pageShadow]);\n\n\t\t// Use Children.toArray to get stable keys for each page element\n\t\tconst pagesWithKeys = Children.toArray(pages);\n\t\tconst totalPages = pagesWithKeys.length;\n\n\t\t// Determine cover page indices\n\t\tconst coverIndicesSet = new Set(\n\t\t\tcoverConfig?.coverIndices === \"auto\"\n\t\t\t\t? [0, totalPages - 1]\n\t\t\t\t: (coverConfig?.coverIndices ?? [0]),\n\t\t);\n\t\tconst isCoverPage = (index: number) => coverIndicesSet.has(index);\n\n\t\t// Compute interior cover page indices (the other side of each cover leaf).\n\t\t// Leaf pairs: [0,1], [2,3], ... — interior is the paired page on the same leaf.\n\t\tconst interiorCoverMap = new Map<number, \"front\" | \"back\">();\n\t\tif (\n\t\t\tcoverConfig?.interiorCoverClassName ||\n\t\t\tcoverConfig?.frontInteriorCoverClassName ||\n\t\t\tcoverConfig?.backInteriorCoverClassName\n\t\t) {\n\t\t\tfor (const coverIdx of coverIndicesSet) {\n\t\t\t\tconst interiorIdx = coverIdx % 2 === 0 ? coverIdx + 1 : coverIdx - 1;\n\t\t\t\tif (interiorIdx >= 0 && interiorIdx < totalPages && !coverIndicesSet.has(interiorIdx)) {\n\t\t\t\t\t// First cover index = front, others = back\n\t\t\t\t\tconst role = coverIdx === Math.min(...coverIndicesSet) ? \"front\" : \"back\";\n\t\t\t\t\tinteriorCoverMap.set(interiorIdx, role);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst coverInset = coverConfig?.coverInset ?? \"5%\";\n\n\t\t// Build CSS class for a page\n\t\tconst getPageClassName = (index: number): string => {\n\t\t\tconst classes = [\"page\"];\n\t\t\tif (isCoverPage(index)) {\n\t\t\t\tclasses.push(\"page--cover\");\n\t\t\t\tif (coverConfig?.hardCovers) {\n\t\t\t\t\tclasses.push(\"page--hard\");\n\t\t\t\t}\n\t\t\t\tif (coverConfig?.noShadow) {\n\t\t\t\t\tclasses.push(\"page--no-shadow\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst interiorRole = interiorCoverMap.get(index);\n\t\t\tif (interiorRole) {\n\t\t\t\tclasses.push(\"page--cover-interior\");\n\t\t\t\tconst cls =\n\t\t\t\t\tinteriorRole === \"front\"\n\t\t\t\t\t\t? (coverConfig?.frontInteriorCoverClassName ?? coverConfig?.interiorCoverClassName)\n\t\t\t\t\t\t: (coverConfig?.backInteriorCoverClassName ?? coverConfig?.interiorCoverClassName);\n\t\t\t\tif (cls) classes.push(cls);\n\t\t\t}\n\t\t\treturn classes.join(\" \");\n\t\t};\n\n\t\t// When leavesBuffer is set, only mount content for pages within the buffer (keep .page wrappers for layout).\n\t\t// Use a small margin so content is ready before vanilla shows the leaf (avoids empty flash when flipping).\n\t\t// Cover pages are always mounted — they are cover-sized and sit behind leaf-sized pages,\n\t\t// acting as the physical book boards. Unmounting them would remove the realistic frame effect.\n\t\tconst contentByIndex =\n\t\t\tleavesBuffer != null && totalPages > 0\n\t\t\t\t? (() => {\n\t\t\t\t\t\tconst currentLeaf = Math.floor(currentPageIndex / 2);\n\t\t\t\t\t\tconst leavesCount = Math.ceil(totalPages / 2);\n\t\t\t\t\t\tconst margin = 2; // extra leaves each side so content exists when vanilla reveals them\n\t\t\t\t\t\tconst leafStart = Math.max(0, currentLeaf - leavesBuffer - margin);\n\t\t\t\t\t\tconst leafEnd = Math.min(leavesCount - 1, currentLeaf + leavesBuffer + margin);\n\t\t\t\t\t\tconst pageStart = leafStart * 2;\n\t\t\t\t\t\tconst pageEnd = Math.min(totalPages - 1, leafEnd * 2 + 1);\n\t\t\t\t\t\tconst inRange = new Set(\n\t\t\t\t\t\t\tArray.from({ length: pageEnd - pageStart + 1 }, (_, i) => pageStart + i),\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// Always include cover leaf pages so the larger cover boards remain mounted.\n\t\t\t\t\t\tfor (const idx of coverIndicesSet) {\n\t\t\t\t\t\t\tinRange.add(idx);\n\t\t\t\t\t\t\t// Also include the other side of the cover leaf\n\t\t\t\t\t\t\tconst partner = idx % 2 === 0 ? idx + 1 : idx - 1;\n\t\t\t\t\t\t\tif (partner >= 0 && partner < totalPages) {\n\t\t\t\t\t\t\t\tinRange.add(partner);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn (index: number) =>\n\t\t\t\t\t\t\tinRange.has(index) || inflightLeavesRef.current.has(Math.floor(index / 2))\n\t\t\t\t\t\t\t\t? (pagesWithKeys.at(index) ?? null)\n\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t})()\n\t\t\t\t: (index: number) => pagesWithKeys.at(index) ?? null;\n\n\t\t/** Wrap interior cover pages with the endpaper inset frame (3-sided: no inset on spine). */\n\t\tconst renderPageContent = (index: number) => {\n\t\t\tconst content = contentByIndex(index);\n\t\t\tif (interiorCoverMap.has(index)) {\n\t\t\t\t// Determine spine side: even pages (engine convention: pageIndex%2===1) are on the\n\t\t\t\t// left in LTR / right in RTL. Their spine is on the opposite side.\n\t\t\t\tconst isEvenPage = index % 2 === 1; // engine: (pageIndex+1)%2===1 → odd; so %2===1 → even\n\t\t\t\tconst spineOnRight = isEvenPage !== (direction === \"rtl\");\n\t\t\t\tconst insetStyle = {\n\t\t\t\t\t\"--cover-inset\": coverInset,\n\t\t\t\t\t...(spineOnRight ? { \"--cover-inset-right\": \"0px\" } : { \"--cover-inset-left\": \"0px\" }),\n\t\t\t\t} as Record<string, string>;\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"page--cover-interior-inset\" style={insetStyle}>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn content;\n\t\t};\n\n\t\treturn (\n\t\t\t<div className={className}>\n\t\t\t\t{pagesWithKeys.map((_, index) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: stable slot identity for buffer/mount correctness\n\t\t\t\t\t\tkey={`page-${index}`}\n\t\t\t\t\t\tclassName={getPageClassName(index)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"flipbook-page-scrollport\">\n\t\t\t\t\t\t\t<div className=\"flipbook-page-content\" dir={direction}>\n\t\t\t\t\t\t\t\t{renderPageContent(index)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t\t{bookmarkSlots.map(({ key, bookmark, element, renderer }) =>\n\t\t\t\t\tcreatePortal(renderer ? renderer(bookmark) : bookmark.label, element, key),\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nFlipBookReact.displayName = \"FlipBook\";\n\nexport type {\n\tBookmark,\n\tBookmarkContext,\n\tBookmarkPlacement,\n\tFlipPageSemantic,\n\tHistoryMapper,\n\tMouseMode,\n\tPageFlipParams,\n\tPageSemantics,\n} from \"html-flip-book-vanilla\";\nexport { createDefaultHistoryMapper } from \"html-flip-book-vanilla\";\nexport type { TocEntry, TocPageProps } from \"./TocPage\";\nexport { TocPage } from \"./TocPage\";\nexport { FlipBookReact as FlipBook };\n"],"names":["defaultFilter","entry","TocPage","onNavigate","totalPages","pageSemantics","heading","className","direction","filter","getHref","renderEntry","entries","i","title","semanticName","renderDefaultEntry","onClick","href","pageOrSemantic","content","jsxs","Fragment","jsx","event","FlipBookReact","forwardRef","pages","debug","mouseMode","mouseModeStorageKey","bookmarkProvider","enableBookmarks","initialTurnedLeaves","fastDeltaThreshold","leavesBuffer","pageShadow","snapshotDuringFlip","enableHistory","enableDownload","coverConfig","of","leafAspectRatio","coverAspectRatio","handlers","historyMapper","tocPageIndex","downloadConfig","ref","currentPageIndex","setCurrentPageIndex","useState","firstVisiblePage","setPageIndexRef","useRef","bookmarkSlots","setBookmarkSlots","ofRef","BUFFER_DEBOUNCE_MS","pageChangedTimerRef","inflightLeavesRef","setInflightVersion","onPageChangedRef","index","onPageFlippingRef","params","edgePage","flippingLeaf","v","useEffect","flipBook","FlipBookBase","useImperativeHandle","pageIndex","selectorClass","bar","mode","options","currentFlipBook","savedMode","previousBookmarksEnabled","active","slots","renderSlot","bookmark","expanded","key","slot","provider","context","bookmarks","ids","id","el","pagesWithKeys","Children","coverIndicesSet","isCoverPage","interiorCoverMap","coverIdx","interiorIdx","role","coverInset","getPageClassName","classes","interiorRole","cls","contentByIndex","currentLeaf","leavesCount","margin","leafStart","leafEnd","pageStart","pageEnd","inRange","_","idx","partner","renderPageContent","spineOnRight","insetStyle","element","renderer","createPortal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"flip-book.js","sources":["../src/TocPage.tsx","../src/FlipBook.tsx"],"sourcesContent":["import type { PageSemantics } from \"html-flip-book-vanilla\";\nimport type React from \"react\";\nimport \"./TocPage.css\";\n\n/**\n * Entry in the table of contents.\n */\nexport interface TocEntry {\n\t/** Page index to navigate to */\n\tpageIndex: number;\n\t/** Display title (from pageSemantics.indexToTitle or custom) */\n\ttitle: string;\n\t/** Semantic page name/number (from pageSemantics.indexToSemanticName) */\n\tsemanticName: string;\n}\n\n/**\n * Props for the TocPage component.\n */\nexport interface TocPageProps {\n\t/** Callback to navigate to a specific page */\n\tonNavigate: (pageIndex: number) => void;\n\t/** Total number of pages in the book */\n\ttotalPages: number;\n\t/** Page semantics for generating titles and page numbers */\n\tpageSemantics?: PageSemantics;\n\t/** Custom heading text. Default: \"Table of Contents\" */\n\theading?: string;\n\t/** Custom CSS class for the container */\n\tclassName?: string;\n\t/** Reading direction for RTL support */\n\tdirection?: \"ltr\" | \"rtl\";\n\t/**\n\t * Filter function to determine which pages appear in TOC.\n\t * By default, only pages with a title are included.\n\t */\n\tfilter?: (entry: TocEntry, pageIndex: number) => boolean;\n\t/** URL for an entry. When provided, modified clicks use native browser navigation. */\n\tgetHref?: (entry: TocEntry) => string | null | undefined;\n\t/**\n\t * Custom render function for TOC entries.\n\t * If not provided, uses default rendering.\n\t */\n\trenderEntry?: (entry: TocEntry, onClick: () => void, href?: string) => React.ReactNode;\n}\n\n/**\n * Default filter: include pages that have a non-empty title.\n */\nconst defaultFilter = (entry: TocEntry): boolean => entry.title.length > 0;\n\n/**\n * A table of contents page component for FlipBook.\n *\n * Automatically generates TOC entries from pageSemantics, showing pages\n * that have titles. Entries display title with fallback to semantic name,\n * then page index.\n *\n * @example\n * ```tsx\n * <TocPage\n * onNavigate={(pageIndex) => flipBookRef.current?.flipToPage(pageIndex)}\n * totalPages={20}\n * pageSemantics={mySemantics}\n * heading=\"Contents\"\n * direction=\"rtl\"\n * />\n * ```\n */\nconst TocPage: React.FC<TocPageProps> = ({\n\tonNavigate,\n\ttotalPages,\n\tpageSemantics,\n\theading = \"Table of Contents\",\n\tclassName,\n\tdirection = \"ltr\",\n\tfilter = defaultFilter,\n\tgetHref,\n\trenderEntry,\n}) => {\n\t// Generate TOC entries for all pages\n\tconst entries: TocEntry[] = [];\n\tfor (let i = 0; i < totalPages; i++) {\n\t\tconst title = pageSemantics?.indexToTitle(i) ?? \"\";\n\t\tconst semanticName = pageSemantics?.indexToSemanticName(i) ?? \"\";\n\t\tconst entry: TocEntry = { pageIndex: i, title, semanticName };\n\n\t\tif (filter(entry, i)) {\n\t\t\tentries.push(entry);\n\t\t}\n\t}\n\n\tconst renderDefaultEntry = (entry: TocEntry, onClick: () => void, href?: string) => {\n\t\t// Title on one side (left in LTR, right in RTL); semantic name or page index on the other\n\t\tconst title = entry.title || entry.semanticName || `Page ${entry.pageIndex + 1}`;\n\t\tconst pageOrSemantic = entry.semanticName || String(entry.pageIndex + 1);\n\n\t\tconst content = (\n\t\t\t<>\n\t\t\t\t<span className=\"toc-title\">{title}</span>\n\t\t\t\t<span className=\"toc-dots\" aria-hidden />\n\t\t\t\t<span className=\"toc-page-num\">{pageOrSemantic}</span>\n\t\t\t</>\n\t\t);\n\n\t\treturn (\n\t\t\t<li key={entry.pageIndex}>\n\t\t\t\t{href ? (\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={href}\n\t\t\t\t\t\tclassName=\"toc-link\"\n\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tevent.button !== 0 ||\n\t\t\t\t\t\t\t\tevent.ctrlKey ||\n\t\t\t\t\t\t\t\tevent.metaKey ||\n\t\t\t\t\t\t\t\tevent.shiftKey ||\n\t\t\t\t\t\t\t\tevent.altKey\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tonClick();\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</a>\n\t\t\t\t) : (\n\t\t\t\t\t<button type=\"button\" className=\"toc-link\" onClick={onClick}>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</li>\n\t\t);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`toc-page ${className ?? \"\"}`.trim()}\n\t\t\tstyle={{ direction, textAlign: direction === \"rtl\" ? \"right\" : \"left\" }}\n\t\t>\n\t\t\t<div className=\"toc-page__scroll\">\n\t\t\t\t<h2 className=\"toc-heading\">{heading}</h2>\n\t\t\t\t<ul className=\"toc-list\">\n\t\t\t\t\t{entries.map((entry) => {\n\t\t\t\t\t\tconst onClick = () => onNavigate(entry.pageIndex);\n\t\t\t\t\t\tconst href = getHref?.(entry) ?? undefined;\n\t\t\t\t\t\treturn renderEntry\n\t\t\t\t\t\t\t? renderEntry(entry, onClick, href)\n\t\t\t\t\t\t\t: renderDefaultEntry(entry, onClick, href);\n\t\t\t\t\t})}\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport { TocPage };\n","import {\n\ttype BookmarkProvider as BaseBookmarkProvider,\n\ttype Bookmark,\n\tFlipBook as FlipBookBase,\n\ttype HistoryMapper,\n\ttype MouseMode,\n\ttype PageFlipParams,\n\ttype PageSemantics,\n} from \"html-flip-book-vanilla\";\n// Bundle the complete core stylesheet into this package's styles entry, so\n// React consumers get pages, covers, scrollports and bookmarks from\n// `html-flip-book-react/styles.css` alone — the vanilla package stays a\n// JavaScript-only dependency here.\nimport \"../../base/src/flipbook.scss\";\nimport \"../../base/src/pages.scss\";\nimport \"../../base/src/bookmarks.scss\";\nimport \"../../base/src/mouse-mode.scss\";\nimport type { DownloadConfig } from \"html-flip-book-vanilla/download\";\nimport type React from \"react\";\nimport { Children, forwardRef, useEffect, useImperativeHandle, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\n/** Bookmark content is rendered with React and keeps access to the consumer's contexts. */\nexport type BookmarkProvider = BaseBookmarkProvider<React.ReactNode>;\n\ninterface BookmarkSlot {\n\tkey: string;\n\tbookmark: Bookmark;\n\telement: HTMLElement;\n\trenderer: BookmarkProvider[\"renderBookmark\"];\n}\n\n/**\n * Imperative handle exposed via ref for programmatic control of the FlipBook.\n * Flipbook methods (flipNext, jumpToPage, etc.) are called internally by commands;\n * consumers interact through commands (execute) and getters (ref).\n *\n * @example\n * ```tsx\n * const ref = useRef<FlipBookHandle>(null);\n * const page = ref.current?.getCurrentPageIndex();\n * ```\n */\nexport interface FlipBookHandle {\n\t/** Animate flip to the next page */\n\tflipNext: () => Promise<void>;\n\t/** Animate flip to the previous page */\n\tflipPrev: () => Promise<void>;\n\t/** Animate flip to a specific page index */\n\tflipToPage: (pageIndex: number) => Promise<void>;\n\t/** Jump to a specific page instantly without animation */\n\tjumpToPage: (pageIndex: number) => void;\n\t/** Show a router-selected page without adding a browser history entry. */\n\trestorePage: (pageIndex: number) => void;\n\t/** Toggle debug toolbar visibility (when debug mode is enabled). Bound to Ctrl+Alt+D by default. */\n\ttoggleDebugBar?: () => void;\n\t/** Get the current (leftmost visible) page index */\n\tgetCurrentPageIndex: () => number;\n\t/** Get the total number of pages */\n\tgetTotalPages: () => number;\n\t/** Get the \"of\" value for the indicator (e.g. total label). Defaults to total pages when not set. */\n\tgetOf: () => string | number;\n\t/** Check if currently at the first page */\n\tisFirstPage: () => boolean;\n\t/** Check if currently at the last page */\n\tisLastPage: () => boolean;\n\t/** Get download configuration for the book. Undefined when no download is configured. */\n\tgetDownloadConfig: () => DownloadConfig | undefined;\n\t/** Get the configured table of contents page index. */\n\tgetTocPageIndex: () => number;\n\t/** Current mouse interaction mode. Touch gestures are unaffected. */\n\tgetMouseMode: () => MouseMode;\n\t/** Switch between continuous page turning and native text selection. */\n\tsetMouseMode: (mode: MouseMode, options?: { persist?: boolean }) => void;\n}\n\n/**\n * Configuration for book covers.\n */\nexport interface CoverConfig {\n\t/**\n\t * Make covers \"hard\" - no page curl effect on covers.\n\t * When true, cover pages appear flat without the soft page bend.\n\t * Default: false\n\t */\n\thardCovers?: boolean;\n\t/**\n\t * Disable shadow effects on cover pages.\n\t * Default: false\n\t */\n\tnoShadow?: boolean;\n\t/**\n\t * Page indices that are considered cover pages.\n\t * Default: [0] (front cover only). Use [0, totalPages-1] for front and back covers.\n\t * If \"auto\", uses first and last pages as covers.\n\t */\n\tcoverIndices?: number[] | \"auto\";\n\t/**\n\t * CSS class applied to interior sides of cover leaves (the endpaper).\n\t * Sets the page background to the cover color; the white endpaper inset\n\t * is created automatically by the infrastructure.\n\t */\n\tinteriorCoverClassName?: string;\n\t/**\n\t * Override interiorCoverClassName for the front cover interior specifically.\n\t */\n\tfrontInteriorCoverClassName?: string;\n\t/**\n\t * Override interiorCoverClassName for the back cover interior specifically.\n\t */\n\tbackInteriorCoverClassName?: string;\n\t/**\n\t * Inset size for the interior endpaper frame.\n\t * Any valid CSS length (e.g. \"5%\", \"12px\"). Default: \"5%\".\n\t */\n\tcoverInset?: string;\n}\n\n/**\n * Handlers for FlipBook events. Pass via the `handlers` prop.\n */\nexport interface FlipBookHandlers {\n\t/** Fired when a flip animation starts. Params: leaf index, page indices, semantics, direction. */\n\tonPageFlipping?: (params: PageFlipParams) => void;\n\t/** Fired when a flip completes. Params: leaf index, page indices, semantics, direction. */\n\tonPageFlipped?: (params: PageFlipParams) => void;\n}\n\n/**\n * Props for the FlipBook React component.\n */\nexport interface FlipBookProps {\n\t/** Array of React elements to render as pages */\n\tpages: React.ReactNode[];\n\t/** CSS class name for the flipbook container */\n\tclassName: string;\n\t/** Define which pages are covers for special styling */\n\tpageSemantics?: PageSemantics;\n\t/** Page bookmark content, placement, ordering, and optional click behavior. */\n\tbookmarkProvider?: BookmarkProvider;\n\t/** Opt in to bookmarks. Without a custom provider, use the TOC and its chapter entries. Default: false. */\n\tenableBookmarks?: boolean;\n\t/** Enable debug mode */\n\tdebug?: boolean;\n\t/** Reading direction: 'ltr' (left-to-right) or 'rtl' (right-to-left) */\n\tdirection?: \"rtl\" | \"ltr\";\n\t/** Initial mouse interaction mode. Default: 'turn'. */\n\tmouseMode?: MouseMode;\n\t/** Optional localStorage key used to remember the user's mouse mode. */\n\tmouseModeStorageKey?: string;\n\t/** Indices of leaves that should start in the turned (flipped) state */\n\tinitialTurnedLeaves?: number[];\n\t/** Velocity threshold (px/s) for fast swipe to complete flip. Default: 500 */\n\tfastDeltaThreshold?: number;\n\t/**\n\t * Number of leaves to keep rendered before and after the current position.\n\t * When set, only leaves within the buffer range are visible for performance.\n\t * Default: undefined (all leaves are always rendered)\n\t */\n\tleavesBuffer?: number;\n\t/**\n\t * Configuration for cover pages (front and back covers).\n\t */\n\tcoverConfig?: CoverConfig;\n\t/**\n\t * Override for the \"of\" part of the page indicator (e.g. a gematria letter for the total, like \"נ\" for 50 in Hebrew books).\n\t * Defaults to total pages count when not set.\n\t */\n\tof?: string | number;\n\t/**\n\t * Aspect ratio for inner pages (text block leaves).\n\t * Default: { width: 2, height: 3 }\n\t */\n\tleafAspectRatio?: { width: number; height: number };\n\t/**\n\t * Aspect ratio for cover boards (slightly larger than leaf).\n\t * The delta between cover and leaf aspect ratios determines the visible frame.\n\t * Default: { width: 2.15, height: 3.15 }\n\t */\n\tcoverAspectRatio?: { width: number; height: number };\n\t/**\n\t * Event handlers. Use this to pass callbacks (e.g. onPageFlipped) instead of top-level props.\n\t */\n\thandlers?: FlipBookHandlers;\n\t/**\n\t * When set, syncs the flip-book with browser history: pushState on flip, restore page on back/forward,\n\t * and adopt the page named by the current URL on mount.\n\t * When omitted and enableHistory is not false, the built-in `#page/{name}` hash mapper is used.\n\t */\n\thistoryMapper?: HistoryMapper;\n\t/**\n\t * Table of contents page index (book-level). Populates the store used by goToToc command and TocButton.\n\t * Default: 4.\n\t */\n\ttocPageIndex?: number;\n\t/**\n\t * Download configuration: entire book and page-range handlers plus filename hints.\n\t * Toolbar's DownloadDropdown reads this from the flipbook ref.\n\t * When omitted and enableDownload is not false, the built-in JSON page-index default is used.\n\t */\n\tdownloadConfig?: DownloadConfig;\n\t/**\n\t * When false, disables the inner page shadow/highlight (e.g. to avoid flicker with multiple books).\n\t * Default: true.\n\t */\n\tpageShadow?: boolean;\n\t/**\n\t * When true, uses aggressive containment on pages during flip animations\n\t * so the browser can operate on a cached GPU texture rather than\n\t * re-rendering content every frame. Reduces jank when flipping rapidly.\n\t * Default: true.\n\t */\n\tsnapshotDuringFlip?: boolean;\n\t/**\n\t * When false, history integration is disabled entirely. When true or omitted, the provided\n\t * historyMapper is used, or the built-in hash-based default when none is provided.\n\t */\n\tenableHistory?: boolean;\n\t/**\n\t * When false, download is disabled entirely (getDownloadConfig returns undefined). When true or\n\t * omitted, the provided downloadConfig is used, or the built-in JSON page-index default when none\n\t * is provided.\n\t */\n\tenableDownload?: boolean;\n}\n\n/**\n * A React component for creating realistic page-flip animations.\n *\n * @example\n * ```tsx\n * import { FlipBook } from 'html-flip-book-react';\n *\n * function App() {\n * const ref = useRef<FlipBookHandle>(null);\n * return (\n * <FlipBook\n * ref={ref}\n * pages={[<div>Page 1</div>, <div>Page 2</div>]}\n * className=\"my-book\"\n * direction=\"ltr\"\n * />\n * );\n * }\n * ```\n */\nconst FlipBookReact = forwardRef<FlipBookHandle, FlipBookProps>(\n\t(\n\t\t{\n\t\t\tpages,\n\t\t\tclassName,\n\t\t\tdebug = false,\n\t\t\tdirection = \"ltr\",\n\t\t\tmouseMode = \"turn\",\n\t\t\tmouseModeStorageKey,\n\t\t\tpageSemantics = undefined,\n\t\t\tbookmarkProvider,\n\t\t\tenableBookmarks = false,\n\t\t\tinitialTurnedLeaves = [],\n\t\t\tfastDeltaThreshold,\n\t\t\tleavesBuffer,\n\t\t\tpageShadow = true,\n\t\t\tsnapshotDuringFlip = true,\n\t\t\tenableHistory,\n\t\t\tenableDownload,\n\t\t\tcoverConfig,\n\t\t\tof,\n\t\t\tleafAspectRatio,\n\t\t\tcoverAspectRatio,\n\t\t\thandlers,\n\t\t\thistoryMapper,\n\t\t\ttocPageIndex,\n\t\t\tdownloadConfig,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst [currentPageIndex, setCurrentPageIndex] = useState(() => {\n\t\t\t// Derive the initial page index from initialTurnedLeaves so the\n\t\t\t// leavesBuffer renders around the correct page on the very first\n\t\t\t// render — before the base flipbook's useEffect fires.\n\t\t\t// Must match the base flipbook's model: visible spread starts at\n\t\t\t// lastTurnedLeaf * 2 + 1 (back of the last turned leaf).\n\t\t\tif (initialTurnedLeaves && initialTurnedLeaves.length > 0) {\n\t\t\t\tconst lastTurnedLeaf = Math.max(...initialTurnedLeaves);\n\t\t\t\tconst firstVisiblePage = lastTurnedLeaf * 2 + 1;\n\t\t\t\tif (firstVisiblePage >= pages.length) {\n\t\t\t\t\tconst lastLeaf = Math.ceil(pages.length / 2) - 1;\n\t\t\t\t\treturn lastLeaf * 2;\n\t\t\t\t}\n\t\t\t\treturn firstVisiblePage;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\t\tconst setPageIndexRef = useRef(setCurrentPageIndex);\n\t\tconst [bookmarkSlots, setBookmarkSlots] = useState<BookmarkSlot[]>([]);\n\t\tsetPageIndexRef.current = setCurrentPageIndex;\n\t\tconst ofRef = useRef(of);\n\t\tofRef.current = of;\n\n\t\t// Debounce buffer-related re-renders during rapid consecutive page flips.\n\t\t// When leavesBuffer is set, each onPageChanged triggers a React re-render\n\t\t// that recalculates which pages to mount/unmount — expensive with complex\n\t\t// content (e.g. Hebrew text, perushim). By debouncing, rapid flips (>1 at\n\t\t// a time) batch into a single re-render after settling. The page indicator\n\t\t// reads directly from the imperative handle (flipBook.current) and is not\n\t\t// affected by this debounce.\n\t\tconst BUFFER_DEBOUNCE_MS = 80;\n\t\tconst pageChangedTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\t\t// Leaves whose flip animation is in flight. The base keeps their page\n\t\t// wrappers visible even outside the leavesBuffer window, so their content\n\t\t// must stay mounted too — otherwise a revealed flipping page renders blank\n\t\t// (issue #167). Cleared once flips settle and the buffer window recenters.\n\t\tconst inflightLeavesRef = useRef<Set<number>>(new Set());\n\t\tconst [, setInflightVersion] = useState(0);\n\t\tconst onPageChangedRef = useRef((index: number) => {\n\t\t\tsetPageIndexRef.current?.(index);\n\t\t});\n\t\tonPageChangedRef.current = (index: number) => {\n\t\t\tif (pageChangedTimerRef.current != null) {\n\t\t\t\tclearTimeout(pageChangedTimerRef.current);\n\t\t\t}\n\t\t\tif (leavesBuffer == null) {\n\t\t\t\t// No buffer — update immediately; no expensive mount/unmount cycle.\n\t\t\t\tsetPageIndexRef.current?.(index);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpageChangedTimerRef.current = setTimeout(() => {\n\t\t\t\tpageChangedTimerRef.current = null;\n\t\t\t\tinflightLeavesRef.current.clear();\n\t\t\t\tsetPageIndexRef.current?.(index);\n\t\t\t}, BUFFER_DEBOUNCE_MS);\n\t\t};\n\t\tconst onPageFlippingRef = useRef((params: PageFlipParams) => {\n\t\t\thandlers?.onPageFlipping?.(params);\n\t\t});\n\t\tonPageFlippingRef.current = (params) => {\n\t\t\tif (leavesBuffer != null) {\n\t\t\t\t// The flipping leaf holds the page on the trailing edge of the target\n\t\t\t\t// spread: backward flips carry pageIndices[1] on their back, forward\n\t\t\t\t// flips carry pageIndices[0] on their front.\n\t\t\t\tconst edgePage =\n\t\t\t\t\tparams.direction === \"backward\" ? params.pageIndices[1] : params.pageIndices[0];\n\t\t\t\tconst flippingLeaf = Math.floor(edgePage / 2);\n\t\t\t\tif (!inflightLeavesRef.current.has(flippingLeaf)) {\n\t\t\t\t\tinflightLeavesRef.current.add(flippingLeaf);\n\t\t\t\t\tsetInflightVersion((v) => v + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\thandlers?.onPageFlipping?.(params);\n\t\t};\n\n\t\t// Clean up debounce timer on unmount.\n\t\tuseEffect(() => {\n\t\t\treturn () => {\n\t\t\t\tif (pageChangedTimerRef.current != null) {\n\t\t\t\t\tclearTimeout(pageChangedTimerRef.current);\n\t\t\t\t}\n\t\t\t};\n\t\t}, []);\n\n\t\tconst flipBook = useRef(\n\t\t\tnew FlipBookBase({\n\t\t\t\tpageSemantics: pageSemantics,\n\t\t\t\tenableBookmarks,\n\t\t\t\tpagesCount: pages.length,\n\t\t\t\tdirection: direction,\n\t\t\t\tmouseMode,\n\t\t\t\tinitialTurnedLeaves: initialTurnedLeaves,\n\t\t\t\tfastDeltaThreshold: fastDeltaThreshold,\n\t\t\t\tleavesBuffer: leavesBuffer,\n\t\t\t\tleafAspectRatio: leafAspectRatio,\n\t\t\t\tcoverAspectRatio: coverAspectRatio,\n\t\t\t\tcoverPageIndices: coverConfig?.coverIndices,\n\t\t\t\tonPageChanged: (index: number) => onPageChangedRef.current(index),\n\t\t\t\tonPageFlipping: (params) => onPageFlippingRef.current(params),\n\t\t\t\tonPageFlipped: handlers?.onPageFlipped,\n\t\t\t\thistoryMapper,\n\t\t\t\ttocPageIndex: tocPageIndex ?? 4,\n\t\t\t\tdownloadConfig,\n\t\t\t\tpageShadow,\n\t\t\t\tsnapshotDuringFlip,\n\t\t\t\tenableHistory,\n\t\t\t\tenableDownload,\n\t\t\t}),\n\t\t);\n\n\t\t// Expose imperative handle: flipbook methods (called by commands) and getters (for UI)\n\t\tuseImperativeHandle(\n\t\t\tref,\n\t\t\t() => ({\n\t\t\t\tflipNext: () => flipBook.current.flipNext(),\n\t\t\t\tflipPrev: () => flipBook.current.flipPrev(),\n\t\t\t\tflipToPage: (pageIndex: number) => flipBook.current.flipToPage(pageIndex),\n\t\t\t\tjumpToPage: (pageIndex: number) => flipBook.current.jumpToPage(pageIndex),\n\t\t\t\trestorePage: (pageIndex: number) => flipBook.current.restorePage(pageIndex),\n\t\t\t\ttoggleDebugBar: () => {\n\t\t\t\t\tconst selectorClass = className.split(/\\s+/)[0];\n\t\t\t\t\tconst root = document.querySelector(`.${selectorClass}`);\n\t\t\t\t\tconst bar = root?.querySelector(\".flipbook-debug-bar\");\n\t\t\t\t\tif (bar) bar.classList.toggle(\"flipbook-debug-bar--hidden\");\n\t\t\t\t},\n\t\t\t\tgetCurrentPageIndex: () => flipBook.current.currentPageIndex,\n\t\t\t\tgetTotalPages: () => flipBook.current.totalPages,\n\t\t\t\tgetOf: () => (ofRef.current !== undefined ? ofRef.current : flipBook.current.totalPages),\n\t\t\t\tisFirstPage: () => flipBook.current.isFirstPage,\n\t\t\t\tisLastPage: () => flipBook.current.isLastPage,\n\t\t\t\tgetDownloadConfig: () => flipBook.current.getDownloadConfig(),\n\t\t\t\tgetTocPageIndex: () => flipBook.current.getTocPageIndex(),\n\t\t\t\tgetMouseMode: () => flipBook.current.getMouseMode(),\n\t\t\t\tsetMouseMode: (mode: MouseMode, options?: { persist?: boolean }) => {\n\t\t\t\t\tflipBook.current.setMouseMode(mode);\n\t\t\t\t\tif (mouseModeStorageKey && options?.persist !== false) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlocalStorage.setItem(mouseModeStorageKey, mode);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Private browsing may deny storage; the mode still works this session.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}),\n\t\t\t[className, mouseModeStorageKey],\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tconst currentFlipBook = flipBook.current;\n\t\t\tconst selectorClass = className.split(/\\s+/)[0];\n\t\t\tcurrentFlipBook.render(`.${selectorClass}`, debug);\n\t\t\tif (mouseModeStorageKey) {\n\t\t\t\ttry {\n\t\t\t\t\tconst savedMode = localStorage.getItem(mouseModeStorageKey);\n\t\t\t\t\tif (savedMode === \"turn\" || savedMode === \"select\")\n\t\t\t\t\t\tcurrentFlipBook.setMouseMode(savedMode);\n\t\t\t\t} catch {\n\t\t\t\t\t// Storage is optional.\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetCurrentPageIndex(currentFlipBook.currentPageIndex);\n\n\t\t\t// Cleanup function to destroy Hammer instance and event listeners\n\t\t\treturn () => {\n\t\t\t\tcurrentFlipBook.destroy();\n\t\t\t};\n\t\t}, [className, debug, mouseModeStorageKey]);\n\n\t\tconst previousBookmarksEnabled = useRef(enableBookmarks);\n\t\tuseEffect(() => {\n\t\t\tif (previousBookmarksEnabled.current === enableBookmarks) return;\n\t\t\tpreviousBookmarksEnabled.current = enableBookmarks;\n\t\t\tflipBook.current.setBookmarksEnabled(enableBookmarks);\n\t\t}, [enableBookmarks]);\n\n\t\tuseEffect(() => {\n\t\t\tconst currentFlipBook = flipBook.current;\n\t\t\tif (!bookmarkProvider) {\n\t\t\t\tsetBookmarkSlots([]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet active = true;\n\t\t\tconst slots = new Map<string, BookmarkSlot>();\n\t\t\tconst renderSlot = (bookmark: Bookmark, expanded: boolean): HTMLElement => {\n\t\t\t\tconst key = `${expanded ? \"expanded\" : \"brief\"}:${bookmark.id}`;\n\t\t\t\tlet slot = slots.get(key);\n\t\t\t\tif (!slot) {\n\t\t\t\t\tslot = {\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tbookmark,\n\t\t\t\t\t\telement: Object.assign(document.createElement(\"span\"), {\n\t\t\t\t\t\t\tclassName: \"flipbook-bookmark__renderer\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\trenderer: expanded\n\t\t\t\t\t\t\t? bookmarkProvider.renderExpandedBookmark\n\t\t\t\t\t\t\t: bookmarkProvider.renderBookmark,\n\t\t\t\t\t};\n\t\t\t\t\tslots.set(key, slot);\n\t\t\t\t}\n\t\t\t\tslot.bookmark = bookmark;\n\t\t\t\treturn slot.element;\n\t\t\t};\n\t\t\tconst provider: BaseBookmarkProvider = {\n\t\t\t\t...bookmarkProvider,\n\t\t\t\tgetBookmarks: (context) => {\n\t\t\t\t\tconst bookmarks = bookmarkProvider.getBookmarks(context);\n\t\t\t\t\tconst ids = new Set(bookmarks.map((bookmark) => bookmark.id));\n\t\t\t\t\tfor (const [key, slot] of slots) {\n\t\t\t\t\t\tif (!ids.has(slot.bookmark.id)) slots.delete(key);\n\t\t\t\t\t}\n\t\t\t\t\t// The base renderer creates the slots synchronously after this query.\n\t\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t\tif (!active) return;\n\t\t\t\t\t\tfor (const [id, slot] of slots) {\n\t\t\t\t\t\t\tif (!slot.element.isConnected) slots.delete(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetBookmarkSlots([...slots.values()]);\n\t\t\t\t\t});\n\t\t\t\t\treturn bookmarks;\n\t\t\t\t},\n\t\t\t\trenderBookmark: (bookmark) => renderSlot(bookmark, false),\n\t\t\t\trenderExpandedBookmark: bookmarkProvider.renderExpandedBookmark\n\t\t\t\t\t? (bookmark) => renderSlot(bookmark, true)\n\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t\tcurrentFlipBook.setBookmarkProvider(provider);\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t\tcurrentFlipBook.setBookmarkProvider(undefined);\n\t\t\t};\n\t\t}, [bookmarkProvider]);\n\n\t\t// Sync pageShadow to DOM when prop changes (base option is set at construct time).\n\t\tuseEffect(() => {\n\t\t\tconst selectorClass = className.split(/\\s+/)[0];\n\t\t\tconst el = document.querySelector(`.${selectorClass}`);\n\t\t\tif (!el) return;\n\t\t\tif (pageShadow) {\n\t\t\t\tel.classList.remove(\"flipbook--no-page-shadow\");\n\t\t\t} else {\n\t\t\t\tel.classList.add(\"flipbook--no-page-shadow\");\n\t\t\t}\n\t\t}, [className, pageShadow]);\n\n\t\t// Use Children.toArray to get stable keys for each page element\n\t\tconst pagesWithKeys = Children.toArray(pages);\n\t\tconst totalPages = pagesWithKeys.length;\n\n\t\t// Determine cover page indices\n\t\tconst coverIndicesSet = new Set(\n\t\t\tcoverConfig?.coverIndices === \"auto\"\n\t\t\t\t? [0, totalPages - 1]\n\t\t\t\t: (coverConfig?.coverIndices ?? [0]),\n\t\t);\n\t\tconst isCoverPage = (index: number) => coverIndicesSet.has(index);\n\n\t\t// Compute interior cover page indices (the other side of each cover leaf).\n\t\t// Leaf pairs: [0,1], [2,3], ... — interior is the paired page on the same leaf.\n\t\tconst interiorCoverMap = new Map<number, \"front\" | \"back\">();\n\t\tif (\n\t\t\tcoverConfig?.interiorCoverClassName ||\n\t\t\tcoverConfig?.frontInteriorCoverClassName ||\n\t\t\tcoverConfig?.backInteriorCoverClassName\n\t\t) {\n\t\t\tfor (const coverIdx of coverIndicesSet) {\n\t\t\t\tconst interiorIdx = coverIdx % 2 === 0 ? coverIdx + 1 : coverIdx - 1;\n\t\t\t\tif (interiorIdx >= 0 && interiorIdx < totalPages && !coverIndicesSet.has(interiorIdx)) {\n\t\t\t\t\t// First cover index = front, others = back\n\t\t\t\t\tconst role = coverIdx === Math.min(...coverIndicesSet) ? \"front\" : \"back\";\n\t\t\t\t\tinteriorCoverMap.set(interiorIdx, role);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst coverInset = coverConfig?.coverInset ?? \"5%\";\n\n\t\t// Build CSS class for a page\n\t\tconst getPageClassName = (index: number): string => {\n\t\t\tconst classes = [\"page\"];\n\t\t\tif (isCoverPage(index)) {\n\t\t\t\tclasses.push(\"page--cover\");\n\t\t\t\tif (coverConfig?.hardCovers) {\n\t\t\t\t\tclasses.push(\"page--hard\");\n\t\t\t\t}\n\t\t\t\tif (coverConfig?.noShadow) {\n\t\t\t\t\tclasses.push(\"page--no-shadow\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst interiorRole = interiorCoverMap.get(index);\n\t\t\tif (interiorRole) {\n\t\t\t\tclasses.push(\"page--cover-interior\");\n\t\t\t\tconst cls =\n\t\t\t\t\tinteriorRole === \"front\"\n\t\t\t\t\t\t? (coverConfig?.frontInteriorCoverClassName ?? coverConfig?.interiorCoverClassName)\n\t\t\t\t\t\t: (coverConfig?.backInteriorCoverClassName ?? coverConfig?.interiorCoverClassName);\n\t\t\t\tif (cls) classes.push(cls);\n\t\t\t}\n\t\t\treturn classes.join(\" \");\n\t\t};\n\n\t\t// When leavesBuffer is set, only mount content for pages within the buffer (keep .page wrappers for layout).\n\t\t// Use a small margin so content is ready before vanilla shows the leaf (avoids empty flash when flipping).\n\t\t// Cover pages are always mounted — they are cover-sized and sit behind leaf-sized pages,\n\t\t// acting as the physical book boards. Unmounting them would remove the realistic frame effect.\n\t\tconst contentByIndex =\n\t\t\tleavesBuffer != null && totalPages > 0\n\t\t\t\t? (() => {\n\t\t\t\t\t\tconst currentLeaf = Math.floor(currentPageIndex / 2);\n\t\t\t\t\t\tconst leavesCount = Math.ceil(totalPages / 2);\n\t\t\t\t\t\tconst margin = 2; // extra leaves each side so content exists when vanilla reveals them\n\t\t\t\t\t\tconst leafStart = Math.max(0, currentLeaf - leavesBuffer - margin);\n\t\t\t\t\t\tconst leafEnd = Math.min(leavesCount - 1, currentLeaf + leavesBuffer + margin);\n\t\t\t\t\t\tconst pageStart = leafStart * 2;\n\t\t\t\t\t\tconst pageEnd = Math.min(totalPages - 1, leafEnd * 2 + 1);\n\t\t\t\t\t\tconst inRange = new Set(\n\t\t\t\t\t\t\tArray.from({ length: pageEnd - pageStart + 1 }, (_, i) => pageStart + i),\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// Always include cover leaf pages so the larger cover boards remain mounted.\n\t\t\t\t\t\tfor (const idx of coverIndicesSet) {\n\t\t\t\t\t\t\tinRange.add(idx);\n\t\t\t\t\t\t\t// Also include the other side of the cover leaf\n\t\t\t\t\t\t\tconst partner = idx % 2 === 0 ? idx + 1 : idx - 1;\n\t\t\t\t\t\t\tif (partner >= 0 && partner < totalPages) {\n\t\t\t\t\t\t\t\tinRange.add(partner);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn (index: number) =>\n\t\t\t\t\t\t\tinRange.has(index) || inflightLeavesRef.current.has(Math.floor(index / 2))\n\t\t\t\t\t\t\t\t? (pagesWithKeys.at(index) ?? null)\n\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t})()\n\t\t\t\t: (index: number) => pagesWithKeys.at(index) ?? null;\n\n\t\t/** Wrap interior cover pages with the endpaper inset frame (3-sided: no inset on spine). */\n\t\tconst renderPageContent = (index: number) => {\n\t\t\tconst content = contentByIndex(index);\n\t\t\tif (interiorCoverMap.has(index)) {\n\t\t\t\t// Determine spine side: even pages (engine convention: pageIndex%2===1) are on the\n\t\t\t\t// left in LTR / right in RTL. Their spine is on the opposite side.\n\t\t\t\tconst isEvenPage = index % 2 === 1; // engine: (pageIndex+1)%2===1 → odd; so %2===1 → even\n\t\t\t\tconst spineOnRight = isEvenPage !== (direction === \"rtl\");\n\t\t\t\tconst insetStyle = {\n\t\t\t\t\t\"--cover-inset\": coverInset,\n\t\t\t\t\t...(spineOnRight ? { \"--cover-inset-right\": \"0px\" } : { \"--cover-inset-left\": \"0px\" }),\n\t\t\t\t} as Record<string, string>;\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"page--cover-interior-inset\" style={insetStyle}>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn content;\n\t\t};\n\n\t\treturn (\n\t\t\t<div className={className}>\n\t\t\t\t{pagesWithKeys.map((_, index) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: stable slot identity for buffer/mount correctness\n\t\t\t\t\t\tkey={`page-${index}`}\n\t\t\t\t\t\tclassName={getPageClassName(index)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"flipbook-page-scrollport\">\n\t\t\t\t\t\t\t<div className=\"flipbook-page-content\" dir={direction}>\n\t\t\t\t\t\t\t\t{renderPageContent(index)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t\t{bookmarkSlots.map(({ key, bookmark, element, renderer }) =>\n\t\t\t\t\tcreatePortal(renderer ? renderer(bookmark) : bookmark.label, element, key),\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nFlipBookReact.displayName = \"FlipBook\";\n\nexport type {\n\tBookmark,\n\tBookmarkContext,\n\tBookmarkPlacement,\n\tFlipPageSemantic,\n\tHistoryMapper,\n\tMouseMode,\n\tPageFlipParams,\n\tPageSemantics,\n} from \"html-flip-book-vanilla\";\nexport { createDefaultHistoryMapper } from \"html-flip-book-vanilla\";\nexport type { TocEntry, TocPageProps } from \"./TocPage\";\nexport { TocPage } from \"./TocPage\";\nexport { FlipBookReact as FlipBook };\n"],"names":["defaultFilter","entry","TocPage","onNavigate","totalPages","pageSemantics","heading","className","direction","filter","getHref","renderEntry","entries","i","title","semanticName","renderDefaultEntry","onClick","href","pageOrSemantic","content","jsxs","Fragment","jsx","event","FlipBookReact","forwardRef","pages","debug","mouseMode","mouseModeStorageKey","bookmarkProvider","enableBookmarks","initialTurnedLeaves","fastDeltaThreshold","leavesBuffer","pageShadow","snapshotDuringFlip","enableHistory","enableDownload","coverConfig","of","leafAspectRatio","coverAspectRatio","handlers","historyMapper","tocPageIndex","downloadConfig","ref","currentPageIndex","setCurrentPageIndex","useState","firstVisiblePage","setPageIndexRef","useRef","bookmarkSlots","setBookmarkSlots","ofRef","BUFFER_DEBOUNCE_MS","pageChangedTimerRef","inflightLeavesRef","setInflightVersion","onPageChangedRef","index","onPageFlippingRef","params","edgePage","flippingLeaf","v","useEffect","flipBook","FlipBookBase","useImperativeHandle","pageIndex","selectorClass","bar","mode","options","currentFlipBook","savedMode","previousBookmarksEnabled","active","slots","renderSlot","bookmark","expanded","key","slot","provider","context","bookmarks","ids","id","el","pagesWithKeys","Children","coverIndicesSet","isCoverPage","interiorCoverMap","coverIdx","interiorIdx","role","coverInset","getPageClassName","classes","interiorRole","cls","contentByIndex","currentLeaf","leavesCount","margin","leafStart","leafEnd","pageStart","pageEnd","inRange","_","idx","partner","renderPageContent","spineOnRight","insetStyle","element","renderer","createPortal"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "html-flip-book-react",
|
|
3
3
|
"description": "Flip Book React Component",
|
|
4
|
-
"version": "0.0.0-alpha.
|
|
4
|
+
"version": "0.0.0-alpha.75",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "DoradSoft",
|
|
7
7
|
"main": "./dist/flip-book.js",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"react-dom": "^18.0.0 || ^19.0.0"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"html-flip-book-vanilla": "0.0.0-alpha.
|
|
42
|
+
"html-flip-book-vanilla": "0.0.0-alpha.75"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/react": "^19.2.13",
|