@readerseye2/cr_viewer 1.0.1

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.
Files changed (162) hide show
  1. package/dist/CR_Viewer.d.ts +24 -0
  2. package/dist/CR_Viewer.d.ts.map +1 -0
  3. package/dist/components/PageSectionWrap.d.ts +15 -0
  4. package/dist/components/PageSectionWrap.d.ts.map +1 -0
  5. package/dist/components/PaginationRender.d.ts +11 -0
  6. package/dist/components/PaginationRender.d.ts.map +1 -0
  7. package/dist/components/RenderParagraph.d.ts +16 -0
  8. package/dist/components/RenderParagraph.d.ts.map +1 -0
  9. package/dist/components/RenderRuns.d.ts +14 -0
  10. package/dist/components/RenderRuns.d.ts.map +1 -0
  11. package/dist/components/ScrollSectionWrap.d.ts +2 -0
  12. package/dist/components/ScrollSectionWrap.d.ts.map +1 -0
  13. package/dist/components/SectionRendererVirtuoso.d.ts +7 -0
  14. package/dist/components/SectionRendererVirtuoso.d.ts.map +1 -0
  15. package/dist/components/btns/MoveSectionBtns.d.ts +18 -0
  16. package/dist/components/btns/MoveSectionBtns.d.ts.map +1 -0
  17. package/dist/components/btns/SolveQuizBtn.d.ts +2 -0
  18. package/dist/components/btns/SolveQuizBtn.d.ts.map +1 -0
  19. package/dist/components/dom.util.d.ts +40 -0
  20. package/dist/components/dom.util.d.ts.map +1 -0
  21. package/dist/components/quiz/QuizRenderer.d.ts +3 -0
  22. package/dist/components/quiz/QuizRenderer.d.ts.map +1 -0
  23. package/dist/components/scroll/CustomScroller.d.ts +4 -0
  24. package/dist/components/scroll/CustomScroller.d.ts.map +1 -0
  25. package/dist/components/spinner/SectionLoadingSpinner.d.ts +2 -0
  26. package/dist/components/spinner/SectionLoadingSpinner.d.ts.map +1 -0
  27. package/dist/components/spinner/Spinner.d.ts +10 -0
  28. package/dist/components/spinner/Spinner.d.ts.map +1 -0
  29. package/dist/hooks/useDebounce.d.ts +16 -0
  30. package/dist/hooks/useDebounce.d.ts.map +1 -0
  31. package/dist/hooks/useLongPressSpan.d.ts +10 -0
  32. package/dist/hooks/useLongPressSpan.d.ts.map +1 -0
  33. package/dist/hooks/useResizeObserver.d.ts +2 -0
  34. package/dist/hooks/useResizeObserver.d.ts.map +1 -0
  35. package/dist/hooks/useSingleDoubleClick.d.ts +16 -0
  36. package/dist/hooks/useSingleDoubleClick.d.ts.map +1 -0
  37. package/dist/hooks/useSwipePageClicks.d.ts +24 -0
  38. package/dist/hooks/useSwipePageClicks.d.ts.map +1 -0
  39. package/dist/index.cjs +33 -0
  40. package/dist/index.css +1 -0
  41. package/dist/index.d.ts +10 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +8723 -0
  44. package/dist/overlay-bars/OverlayLayer.d.ts +3 -0
  45. package/dist/overlay-bars/OverlayLayer.d.ts.map +1 -0
  46. package/dist/overlay-bars/ViewerSettingsSheet.d.ts +6 -0
  47. package/dist/overlay-bars/ViewerSettingsSheet.d.ts.map +1 -0
  48. package/dist/overlay-bars/bottomBar/AudioControlsMini.d.ts +2 -0
  49. package/dist/overlay-bars/bottomBar/AudioControlsMini.d.ts.map +1 -0
  50. package/dist/overlay-bars/bottomBar/FakeAudioControlsMini.d.ts +3 -0
  51. package/dist/overlay-bars/bottomBar/FakeAudioControlsMini.d.ts.map +1 -0
  52. package/dist/overlay-bars/bottomBar/OverlayBottomBar.d.ts +5 -0
  53. package/dist/overlay-bars/bottomBar/OverlayBottomBar.d.ts.map +1 -0
  54. package/dist/overlay-bars/bottomBar/PlayButton.d.ts +13 -0
  55. package/dist/overlay-bars/bottomBar/PlayButton.d.ts.map +1 -0
  56. package/dist/overlay-bars/bottomBar/ProgressScrubber.d.ts +5 -0
  57. package/dist/overlay-bars/bottomBar/ProgressScrubber.d.ts.map +1 -0
  58. package/dist/overlay-bars/bottomBar/StepBtn.d.ts +6 -0
  59. package/dist/overlay-bars/bottomBar/StepBtn.d.ts.map +1 -0
  60. package/dist/overlay-bars/bottomBar/WPMSpeedButtons.d.ts +2 -0
  61. package/dist/overlay-bars/bottomBar/WPMSpeedButtons.d.ts.map +1 -0
  62. package/dist/overlay-bars/topBar/OverlayTopBar.d.ts +5 -0
  63. package/dist/overlay-bars/topBar/OverlayTopBar.d.ts.map +1 -0
  64. package/dist/playback/CR_ViewerPlayback.d.ts +27 -0
  65. package/dist/playback/CR_ViewerPlayback.d.ts.map +1 -0
  66. package/dist/playback/PlaybackBar.d.ts +28 -0
  67. package/dist/playback/PlaybackBar.d.ts.map +1 -0
  68. package/dist/playback/PlaybackToggleButton.d.ts +10 -0
  69. package/dist/playback/PlaybackToggleButton.d.ts.map +1 -0
  70. package/dist/playback/PlaybackViewport.d.ts +30 -0
  71. package/dist/playback/PlaybackViewport.d.ts.map +1 -0
  72. package/dist/playback/index.d.ts +5 -0
  73. package/dist/playback/index.d.ts.map +1 -0
  74. package/dist/playback/types.d.ts +20 -0
  75. package/dist/playback/types.d.ts.map +1 -0
  76. package/dist/recording/PlaybackHandler.d.ts +6 -0
  77. package/dist/recording/PlaybackHandler.d.ts.map +1 -0
  78. package/dist/recording/SettingsChangeEmitter.d.ts +3 -0
  79. package/dist/recording/SettingsChangeEmitter.d.ts.map +1 -0
  80. package/dist/recording/SnapshotRegistrar.d.ts +7 -0
  81. package/dist/recording/SnapshotRegistrar.d.ts.map +1 -0
  82. package/dist/recording/ViewportResizeEmitter.d.ts +7 -0
  83. package/dist/recording/ViewportResizeEmitter.d.ts.map +1 -0
  84. package/dist/stores/audio/crViewer_audio.context.d.ts +10 -0
  85. package/dist/stores/audio/crViewer_audio.context.d.ts.map +1 -0
  86. package/dist/stores/audio/crViewer_audio.hooks.d.ts +6 -0
  87. package/dist/stores/audio/crViewer_audio.hooks.d.ts.map +1 -0
  88. package/dist/stores/audio/crViewer_audio.provider.d.ts +14 -0
  89. package/dist/stores/audio/crViewer_audio.provider.d.ts.map +1 -0
  90. package/dist/stores/audio/crViewer_audio.store.d.ts +65 -0
  91. package/dist/stores/audio/crViewer_audio.store.d.ts.map +1 -0
  92. package/dist/stores/player/index.d.ts +5 -0
  93. package/dist/stores/player/index.d.ts.map +1 -0
  94. package/dist/stores/player/viewerPlayer.context.d.ts +7 -0
  95. package/dist/stores/player/viewerPlayer.context.d.ts.map +1 -0
  96. package/dist/stores/player/viewerPlayer.hooks.d.ts +13 -0
  97. package/dist/stores/player/viewerPlayer.hooks.d.ts.map +1 -0
  98. package/dist/stores/player/viewerPlayer.provider.d.ts +18 -0
  99. package/dist/stores/player/viewerPlayer.provider.d.ts.map +1 -0
  100. package/dist/stores/player/viewerPlayer.store.d.ts +52 -0
  101. package/dist/stores/player/viewerPlayer.store.d.ts.map +1 -0
  102. package/dist/stores/progress/crViewer_progress.context.d.ts +3 -0
  103. package/dist/stores/progress/crViewer_progress.context.d.ts.map +1 -0
  104. package/dist/stores/progress/crViewer_progress.hooks.d.ts +6 -0
  105. package/dist/stores/progress/crViewer_progress.hooks.d.ts.map +1 -0
  106. package/dist/stores/progress/crViewer_progress.provider.d.ts +15 -0
  107. package/dist/stores/progress/crViewer_progress.provider.d.ts.map +1 -0
  108. package/dist/stores/progress/crViewer_progress.store.d.ts +98 -0
  109. package/dist/stores/progress/crViewer_progress.store.d.ts.map +1 -0
  110. package/dist/stores/quizprogress/quiz_progress.context.d.ts +3 -0
  111. package/dist/stores/quizprogress/quiz_progress.context.d.ts.map +1 -0
  112. package/dist/stores/quizprogress/quiz_progress.hooks.d.ts +10 -0
  113. package/dist/stores/quizprogress/quiz_progress.hooks.d.ts.map +1 -0
  114. package/dist/stores/quizprogress/quiz_progress.provider.d.ts +17 -0
  115. package/dist/stores/quizprogress/quiz_progress.provider.d.ts.map +1 -0
  116. package/dist/stores/quizprogress/quiz_progress.store.d.ts +63 -0
  117. package/dist/stores/quizprogress/quiz_progress.store.d.ts.map +1 -0
  118. package/dist/stores/recorder/viewerRecorder.context.d.ts +7 -0
  119. package/dist/stores/recorder/viewerRecorder.context.d.ts.map +1 -0
  120. package/dist/stores/recorder/viewerRecorder.hooks.d.ts +13 -0
  121. package/dist/stores/recorder/viewerRecorder.hooks.d.ts.map +1 -0
  122. package/dist/stores/recorder/viewerRecorder.provider.d.ts +24 -0
  123. package/dist/stores/recorder/viewerRecorder.provider.d.ts.map +1 -0
  124. package/dist/stores/recorder/viewerRecorder.store.d.ts +50 -0
  125. package/dist/stores/recorder/viewerRecorder.store.d.ts.map +1 -0
  126. package/dist/stores/test/tempRecordingStore.d.ts +13 -0
  127. package/dist/stores/test/tempRecordingStore.d.ts.map +1 -0
  128. package/dist/stores/viewer/CRViewer.provider.d.ts +10 -0
  129. package/dist/stores/viewer/CRViewer.provider.d.ts.map +1 -0
  130. package/dist/stores/viewer/crViewer.context.d.ts +7 -0
  131. package/dist/stores/viewer/crViewer.context.d.ts.map +1 -0
  132. package/dist/stores/viewer/crViewer.hooks.d.ts +26 -0
  133. package/dist/stores/viewer/crViewer.hooks.d.ts.map +1 -0
  134. package/dist/stores/viewer/crViewer.store.d.ts +130 -0
  135. package/dist/stores/viewer/crViewer.store.d.ts.map +1 -0
  136. package/dist/types/viewerEvent.types.d.ts +149 -0
  137. package/dist/types/viewerEvent.types.d.ts.map +1 -0
  138. package/dist/utils/audioSrc.d.ts +4 -0
  139. package/dist/utils/audioSrc.d.ts.map +1 -0
  140. package/dist/utils/buildAudioTextMap.d.ts +15 -0
  141. package/dist/utils/buildAudioTextMap.d.ts.map +1 -0
  142. package/dist/utils/calcPage.util.d.ts +42 -0
  143. package/dist/utils/calcPage.util.d.ts.map +1 -0
  144. package/dist/utils/calcPage.util_BACKV3_2399_sf.d.ts +40 -0
  145. package/dist/utils/calcPage.util_BACKV3_2399_sf.d.ts.map +1 -0
  146. package/dist/utils/calcPage.util_BACKclaude.d.ts +40 -0
  147. package/dist/utils/calcPage.util_BACKclaude.d.ts.map +1 -0
  148. package/dist/utils/calcPage.util_BACKclaude_gptagain.d.ts +40 -0
  149. package/dist/utils/calcPage.util_BACKclaude_gptagain.d.ts.map +1 -0
  150. package/dist/utils/calcPage.util_BACKrecent.d.ts +40 -0
  151. package/dist/utils/calcPage.util_BACKrecent.d.ts.map +1 -0
  152. package/dist/utils/calcPage.util_BACKv6_fast_Sf.d.ts +40 -0
  153. package/dist/utils/calcPage.util_BACKv6_fast_Sf.d.ts.map +1 -0
  154. package/dist/utils/doubleRaf.d.ts +3 -0
  155. package/dist/utils/doubleRaf.d.ts.map +1 -0
  156. package/dist/utils/quizSrc.d.ts +3 -0
  157. package/dist/utils/quizSrc.d.ts.map +1 -0
  158. package/dist/utils/sectionRender.util.d.ts +21 -0
  159. package/dist/utils/sectionRender.util.d.ts.map +1 -0
  160. package/dist/utils/text.util.d.ts +3 -0
  161. package/dist/utils/text.util.d.ts.map +1 -0
  162. package/package.json +59 -0
@@ -0,0 +1,24 @@
1
+ import { SectionData, SectionId, SectionSummary } from '@readerseye2/cr_type';
2
+ import { ViewerEventCallback } from './types/viewerEvent.types';
3
+ import { CRViewerHandle } from './stores/recorder/viewerRecorder.provider';
4
+ export type { CRViewerHandle };
5
+ type CRViewerProps = {
6
+ section: SectionData;
7
+ initialViewerState?: Partial<import('./stores/viewer/crViewer.store').CRViewerState>;
8
+ /** 서버에서 불러온 마지막 읽던 위치 (전역 run index) */
9
+ initialProgressRunIndex?: number;
10
+ /** 진입 시 스크롤 잠금 여부 */
11
+ sectionList?: SectionSummary[];
12
+ /** ✅ 섹션 변경 콜백 */
13
+ onSectionChange?: (nextId: SectionId) => void;
14
+ /** ✅ 뷰어 이벤트 콜백 (녹화 등 외부에서 이벤트 수집 시 사용) */
15
+ onViewerEvent?: ViewerEventCallback;
16
+ /** 재생 모드 여부 */
17
+ isPlaybackMode?: boolean;
18
+ /** 재생 모드에서 적용된 scale (페이지네이션 측정 보정용) */
19
+ playbackScale?: number;
20
+ /** 외부 제어용 ref */
21
+ viewerRef?: React.MutableRefObject<CRViewerHandle | null>;
22
+ };
23
+ export default function CR_Viewer({ section, initialViewerState, initialProgressRunIndex, sectionList, onSectionChange, onViewerEvent, isPlaybackMode, playbackScale, viewerRef, }: CRViewerProps): import("react/jsx-runtime").JSX.Element;
24
+ //# sourceMappingURL=CR_Viewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CR_Viewer.d.ts","sourceRoot":"","sources":["../src/CR_Viewer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAuBrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAEhF,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,KAAK,aAAa,GAAG;IACnB,OAAO,EAAE,WAAW,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC,OAAO,gCAAgC,EAAE,aAAa,CAAC,CAAC;IACrF,wCAAwC;IACxC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,qBAAqB;IACrB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,iBAAiB;IACjB,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;IAC9C,0CAA0C;IAC1C,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,eAAe;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB;IACjB,SAAS,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CAC3D,CAAC;AAGF,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAChC,OAAO,EACP,kBAAkB,EAClB,uBAAuB,EACvB,WAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAsB,EACtB,aAAa,EACb,SAAS,GACV,EAAE,aAAa,2CAuEf"}
@@ -0,0 +1,15 @@
1
+ /** 페이지 슬라이스(문단/이미지 공용 인덱스 기반) */
2
+ export type PageSlice = {
3
+ startBlock: number;
4
+ endBlock: number;
5
+ startOffsetInBlock?: number;
6
+ endOffsetInBlock?: number;
7
+ startCharInRun?: number;
8
+ endCharInRun?: number;
9
+ };
10
+ export type PaginationLayout = {
11
+ pages: PageSlice[];
12
+ pageByRunIndex: Int32Array | null;
13
+ };
14
+ export default function PageSectionWrap(): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=PageSectionWrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageSectionWrap.d.ts","sourceRoot":"","sources":["../../src/components/PageSectionWrap.tsx"],"names":[],"mappings":"AA6GA,iCAAiC;AACjC,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IAEjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,cAAc,EAAE,UAAU,GAAG,IAAI,CAAC;CACnC,CAAC;AA0BF,MAAM,CAAC,OAAO,UAAU,eAAe,4CA+UtC"}
@@ -0,0 +1,11 @@
1
+ import { default as React } from 'react';
2
+ import { PageSlice } from './PageSectionWrap';
3
+ type Props = {
4
+ /** paraIndexMap[i] = paraBlocks[i]가 원래 blocks의 몇 번째인지 (문단용 보조 맵) */
5
+ pages: PageSlice[];
6
+ pageIndex: number;
7
+ maxWidth: number;
8
+ };
9
+ declare const PaginationRender: React.FC<Props>;
10
+ export default PaginationRender;
11
+ //# sourceMappingURL=PaginationRender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaginationRender.d.ts","sourceRoot":"","sources":["../../src/components/PaginationRender.tsx"],"names":[],"mappings":"AACA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AASnD,KAAK,KAAK,GAAG;IACX,oEAAoE;IAEpE,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,QAAA,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAiSrC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { FlatGroup } from '../stores/progress/crViewer_progress.store';
2
+ import { ParagraphBlock } from '@readerseye2/cr_type';
3
+ import { default as React } from 'react';
4
+ type Props = {
5
+ block: ParagraphBlock;
6
+ computedMarker?: string;
7
+ ns: string;
8
+ /** ✅ 섹션 전역 오프셋 (prefix[blockIndex]) */
9
+ baseIndex: number;
10
+ sectionId: string;
11
+ preGroups: FlatGroup[];
12
+ };
13
+ declare function RenderParagraph({ block, computedMarker, ns, baseIndex, sectionId, preGroups, }: Props): import("react/jsx-runtime").JSX.Element;
14
+ declare const _default: React.MemoExoticComponent<typeof RenderParagraph>;
15
+ export default _default;
16
+ //# sourceMappingURL=RenderParagraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderParagraph.d.ts","sourceRoot":"","sources":["../../src/components/RenderParagraph.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAE3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,cAAc,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,EAAE,EAAE,MAAM,CAAC;IACX,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,EAAE,CAAC;CACxB,CAAC;AAEF,iBAAS,eAAe,CAAC,EACvB,KAAK,EACL,cAAc,EAGd,EAAE,EACF,SAAS,EACT,SAAS,EACT,SAAS,GACV,EAAE,KAAK,2CA2CP;;AACD,wBAOG"}
@@ -0,0 +1,14 @@
1
+ import { default as React } from 'react';
2
+ import { InlineRun } from '@readerseye2/cr_type';
3
+ import { FlatGroup } from '../stores/progress/crViewer_progress.store';
4
+ type RenderRunsProps = {
5
+ runs: InlineRun[];
6
+ ns: string;
7
+ baseIndex: number;
8
+ sectionId: string;
9
+ preGroups: FlatGroup[];
10
+ };
11
+ /** Run 단위 구독 + 컨테이너 이벤트 위임(더블클릭/롱프레스) */
12
+ declare const _default: React.NamedExoticComponent<RenderRunsProps>;
13
+ export default _default;
14
+ //# sourceMappingURL=RenderRuns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderRuns.d.ts","sourceRoot":"","sources":["../../src/components/RenderRuns.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAMtD,OAAO,KAAK,EACV,SAAS,EAEV,MAAM,2CAA2C,CAAC;AA0BnD,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,EAAE,CAAC;CACxB,CAAC;AAUF,yCAAyC;;AACzC,wBAkGE"}
@@ -0,0 +1,2 @@
1
+ export declare function ScrollSectionWrap(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ScrollSectionWrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollSectionWrap.d.ts","sourceRoot":"","sources":["../../src/components/ScrollSectionWrap.tsx"],"names":[],"mappings":"AA4BA,wBAAgB,iBAAiB,4CAoEhC"}
@@ -0,0 +1,7 @@
1
+ import { Block, SectionData } from '@readerseye2/cr_type';
2
+ export declare function SectionRendererVirtuoso({ section, blocks, nsPrefix, }: {
3
+ section: SectionData;
4
+ blocks: Block[];
5
+ nsPrefix: string;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=SectionRendererVirtuoso.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionRendererVirtuoso.d.ts","sourceRoot":"","sources":["../../src/components/SectionRendererVirtuoso.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA2C/D,wBAAgB,uBAAuB,CAAC,EACtC,OAAO,EACP,MAAM,EACN,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,2CAgSA"}
@@ -0,0 +1,18 @@
1
+ import { default as React } from 'react';
2
+ /**
3
+ * 이전 섹션 버튼
4
+ * - sectionList / currentSectionId / onSectionChange 는 진행 스토어에서 직접 가져옴
5
+ * @param isIcon - true일 경우 아이콘 버튼, false일 경우 풀 버튼 (기본값: false)
6
+ */
7
+ export declare const PrevSectionBtn: React.FC<{
8
+ isIcon?: boolean;
9
+ }>;
10
+ /**
11
+ * 다음 섹션 버튼
12
+ * - sectionList / currentSectionId / onSectionChange 는 진행 스토어에서 직접 가져옴
13
+ * @param isIcon - true일 경우 아이콘 버튼, false일 경우 풀 버튼 (기본값: false)
14
+ */
15
+ export declare const NextSectionBtn: React.FC<{
16
+ isIcon?: boolean;
17
+ }>;
18
+ //# sourceMappingURL=MoveSectionBtns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MoveSectionBtns.d.ts","sourceRoot":"","sources":["../../../src/components/btns/MoveSectionBtns.tsx"],"names":[],"mappings":"AACA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAyBpD;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAgFzD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAgFzD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const SolveQuizBtn: () => import("react/jsx-runtime").JSX.Element | null;
2
+ //# sourceMappingURL=SolveQuizBtn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SolveQuizBtn.d.ts","sourceRoot":"","sources":["../../../src/components/btns/SolveQuizBtn.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,sDAkCxB,CAAC"}
@@ -0,0 +1,40 @@
1
+ /** data-g로 Run 엘리먼트 찾기 */
2
+ export declare const qRunByGI: (container: HTMLElement, gi: number) => HTMLElement | null;
3
+ export declare function findVisibleRunIndexDOMTopFirst_V2(container: HTMLElement, offsetPx?: number, // 상단 보더/패딩 오차 흡수
4
+ epsilonPx?: number, // 같은 라인 묶음 허용 오차
5
+ minSizePx?: number): number;
6
+ /**
7
+ * 화면에 보이는 것 중 "최대한 좌상단"의 읽을만한 run을 고른다.
8
+ * - lineY(컨테이너 상단 + offsetPx) 보다 위(top < lineY)는 후보에서 제외
9
+ * - lineY 이상 중 최소 top을 먼저 구하고, 그 top + epsilon 안에 드는 것들 중
10
+ * GI가 가장 작은(=더 왼쪽) run을 선택
11
+ * - 후보가 하나도 없으면 lineY에 가장 가까운 top을 fallback
12
+ */
13
+ export declare function findVisibleRunIndexDOMTopFirst(container: HTMLElement, offsetPx?: number, // 0보다는 8~16 추천 (상단 보더/패딩 오차 흡수)
14
+ epsilonPx?: number, // 같은 라인 묶음 허용 오차
15
+ minSizePx?: number): number;
16
+ /** 가장 가까운 가시 GI (상단 + 24px 기준) */
17
+ /** 특정 GI 엘리먼트가 DOM에 나타날 때까지 기다림 */
18
+ export declare const waitForRunInDOM: (container: HTMLElement, gi: number, { timeoutMs, intervalMs }?: {
19
+ timeoutMs?: number;
20
+ intervalMs?: number;
21
+ }) => Promise<HTMLElement | null>;
22
+ /** 현재 컨테이너에서 20~80% 밴드의 가시 GI 범위 */
23
+ export declare const getVisibleRangeDOM: (container: HTMLElement) => {
24
+ first: number;
25
+ last: number;
26
+ } | null;
27
+ /** 대상 GI가 보이는지 */
28
+ export declare const isGIVisible: (container: HTMLElement, gi: number) => boolean;
29
+ /** 대상 GI를 상단 + ratio 위치에 오도록 1회 보정 */
30
+ export declare const alignRunOnce: (container: HTMLElement, gi: number, { topPaddingRatio, behavior }?: {
31
+ topPaddingRatio?: number | undefined;
32
+ behavior?: ScrollBehavior | undefined;
33
+ }) => boolean;
34
+ export declare function waitForScrollIdle(container: HTMLElement, quietMs?: number): Promise<void>;
35
+ export declare const alignRunOnceAsync: (container: HTMLElement, gi: number, { topPaddingRatio, behavior, quietMs }?: {
36
+ topPaddingRatio?: number | undefined;
37
+ behavior?: ScrollBehavior | undefined;
38
+ quietMs?: number | undefined;
39
+ }) => Promise<boolean>;
40
+ //# sourceMappingURL=dom.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.util.d.ts","sourceRoot":"","sources":["../../src/components/dom.util.ts"],"names":[],"mappings":"AAEA,0BAA0B;AAC1B,eAAO,MAAM,QAAQ,GAAI,WAAW,WAAW,EAAE,IAAI,MAAM,KAAG,WAAW,GAAG,IAE3E,CAAC;AACF,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,WAAW,EACtB,QAAQ,SAAK,EAAE,iBAAiB;AAChC,SAAS,SAAM,EAAE,iBAAiB;AAClC,SAAS,SAAM,GACd,MAAM,CAwER;AACD;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,WAAW,EACtB,QAAQ,SAAK,EAAE,gCAAgC;AAC/C,SAAS,SAAM,EAAE,iBAAiB;AAClC,SAAS,SAAM,GACd,MAAM,CA6ER;AACD,kCAAkC;AAElC,mCAAmC;AACnC,eAAO,MAAM,eAAe,GAC1B,WAAW,WAAW,EACtB,IAAI,MAAM,EACV,4BAAuC;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,KACtF,OAAO,CAAC,WAAW,GAAG,IAAI,CAS5B,CAAC;AAEF,oCAAoC;AACpC,eAAO,MAAM,kBAAkB,GAC7B,WAAW,WAAW,KACrB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAmBpC,CAAC;AAEF,kBAAkB;AAClB,eAAO,MAAM,WAAW,GAAI,WAAW,WAAW,EAAE,IAAI,MAAM,YAM7D,CAAC;AAEF,sCAAsC;AACtC,eAAO,MAAM,YAAY,GACvB,WAAW,WAAW,EACtB,IAAI,MAAM,EACV;;;CAAoE,KACnE,OASF,CAAC;AAGF,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBtF;AAED,eAAO,MAAM,iBAAiB,GAC5B,WAAW,WAAW,EACtB,IAAI,MAAM,EACV;;;;CAAqF,KACpF,OAAO,CAAC,OAAO,CAmBjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import('react').NamedExoticComponent<object>;
2
+ export default _default;
3
+ //# sourceMappingURL=QuizRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuizRenderer.d.ts","sourceRoot":"","sources":["../../../src/components/quiz/QuizRenderer.tsx"],"names":[],"mappings":";AAuBA,wBAsHG"}
@@ -0,0 +1,4 @@
1
+ import { Components } from 'react-virtuoso';
2
+ declare const CustomScroller: Components<unknown, unknown>['Scroller'];
3
+ export default CustomScroller;
4
+ //# sourceMappingURL=CustomScroller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomScroller.d.ts","sourceRoot":"","sources":["../../../src/components/scroll/CustomScroller.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,QAAA,MAAM,cAAc,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,UAAU,CAc3D,CAAC;AAEH,eAAe,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function SectionLoadingSpinner(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=SectionLoadingSpinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionLoadingSpinner.d.ts","sourceRoot":"","sources":["../../../src/components/spinner/SectionLoadingSpinner.tsx"],"names":[],"mappings":"AAKA,wBAAgB,qBAAqB,4CASpC"}
@@ -0,0 +1,10 @@
1
+ type SpinnerProps = {
2
+ /** 배경을 전체 덮는 오버레이로 표시할지 여부 */
3
+ /** 크기(px) */
4
+ size?: number;
5
+ /** 회전 속도 (초 단위) */
6
+ speed?: number;
7
+ };
8
+ export default function Spinner({ size, speed }: SpinnerProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=Spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../../src/components/spinner/Spinner.tsx"],"names":[],"mappings":"AAEA,KAAK,YAAY,GAAG;IAClB,8BAA8B;IAE9B,aAAa;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAAE,IAAS,EAAE,KAAW,EAAE,EAAE,YAAY,2CAcvE"}
@@ -0,0 +1,16 @@
1
+ import { DebounceSettings } from 'lodash';
2
+ type DebouncedFn<T extends (...args: any[]) => any> = ((...args: Parameters<T>) => void) & {
3
+ cancel: () => void;
4
+ flush: () => void;
5
+ };
6
+ type UseDebounceOptions = DebounceSettings;
7
+ /**
8
+ * lodash.debounce 래퍼 훅
9
+ * - 항상 최신 fn을 호출(stale closure 방지)
10
+ * - beforeDebounceFunc로 "디바운스 진입 직전" 훅 제공
11
+ * - leading/trailing/maxWait 옵션 지원
12
+ * - cancel()/flush() 메서드 제공
13
+ */
14
+ export declare function useDebounce<T extends (...args: any[]) => any>(fn: T, delay?: number, beforeDebounceFunc?: () => void, options?: UseDebounceOptions): DebouncedFn<T>;
15
+ export {};
16
+ //# sourceMappingURL=useDebounce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDebounce.d.ts","sourceRoot":"","sources":["../../src/hooks/useDebounce.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAE/C,KAAK,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG;IACzF,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,KAAK,kBAAkB,GAAG,gBAAgB,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC3D,EAAE,EAAE,CAAC,EACL,KAAK,SAAM,EACX,kBAAkB,CAAC,EAAE,MAAM,IAAI,EAC/B,OAAO,CAAC,EAAE,kBAAkB,GAC3B,WAAW,CAAC,CAAC,CAAC,CAsChB"}
@@ -0,0 +1,10 @@
1
+ export declare function useLongPressSpan(onLongPress: (e: React.PointerEvent | React.TouchEvent | React.MouseEvent) => void, delay?: number): {
2
+ onPointerDown: (e: React.PointerEvent) => void;
3
+ onPointerUp: () => void;
4
+ onPointerLeave: () => void;
5
+ onPointerCancel: () => void;
6
+ onContextMenu: (e: React.MouseEvent) => void;
7
+ onClickCapture: (e: React.MouseEvent) => void;
8
+ onDoubleClickCapture: (e: React.MouseEvent) => void;
9
+ };
10
+ //# sourceMappingURL=useLongPressSpan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLongPressSpan.d.ts","sourceRoot":"","sources":["../../src/hooks/useLongPressSpan.ts"],"names":[],"mappings":"AAGA,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,KAAK,IAAI,EAClF,KAAK,SAAM;uBAaL,KAAK,CAAC,YAAY;;;;uBAgBc,KAAK,CAAC,UAAU;wBAQf,KAAK,CAAC,UAAU;8BAAhB,KAAK,CAAC,UAAU;EAqBxD"}
@@ -0,0 +1,2 @@
1
+ export declare function useResizeObserver(targets: Array<React.RefObject<HTMLElement | null>>, onResize: () => void): void;
2
+ //# sourceMappingURL=useResizeObserver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResizeObserver.d.ts","sourceRoot":"","sources":["../../src/hooks/useResizeObserver.ts"],"names":[],"mappings":"AAKA,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,EACnD,QAAQ,EAAE,MAAM,IAAI,QAqDrB"}
@@ -0,0 +1,16 @@
1
+ type UseSingleDoubleClickOptions<E = HTMLElement> = {
2
+ /** 단일 클릭 콜백 (지연 호출됨) */
3
+ onSingle?: (ev: React.MouseEvent<E>) => void;
4
+ /** 더블 클릭 콜백 (즉시 호출) */
5
+ onDouble?: (ev: React.MouseEvent<E>) => void;
6
+ /** 싱글 호출 지연 시간(ms). 더블클릭이 들어오면 이 타이머가 취소됨 */
7
+ delay?: number;
8
+ /** 토글/클릭을 무시할 요소 필터 (예: 버튼, 링크, 오디오 영역 등) */
9
+ shouldIgnoreTarget?: (target: EventTarget | null) => boolean;
10
+ };
11
+ export declare function useSingleDoubleClick<E extends HTMLElement = HTMLDivElement>({ onSingle, onDouble, delay, shouldIgnoreTarget, }: UseSingleDoubleClickOptions<E>): {
12
+ onClick: (e: React.MouseEvent<E>) => void;
13
+ onDoubleClick: (e: React.MouseEvent<E>) => void;
14
+ };
15
+ export {};
16
+ //# sourceMappingURL=useSingleDoubleClick.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSingleDoubleClick.d.ts","sourceRoot":"","sources":["../../src/hooks/useSingleDoubleClick.ts"],"names":[],"mappings":"AAEA,KAAK,2BAA2B,CAAC,CAAC,GAAG,WAAW,IAAI;IAClD,wBAAwB;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC7C,uBAAuB;IACvB,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC7C,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,KAAK,OAAO,CAAC;CAC9D,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EAAE,EAC3E,QAAQ,EACR,QAAQ,EACR,KAAW,EACX,kBAAkB,GACnB,EAAE,2BAA2B,CAAC,CAAC,CAAC;iBAczB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;uBAmBnB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;EAc1B"}
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+ type Opts<E = HTMLElement> = {
3
+ onPrev: () => void;
4
+ onNext: () => void;
5
+ onSingle?: (ev: React.MouseEvent<E>) => void;
6
+ onDouble?: (ev: React.MouseEvent<E>) => void;
7
+ shouldIgnoreTarget?: (t: EventTarget | null) => boolean;
8
+ horizontalThreshold?: number;
9
+ verticalTolerance?: number;
10
+ velocityThreshold?: number;
11
+ singleDelayMs?: number;
12
+ doubleClickWindowMs?: number;
13
+ suppressAfterSwipeMs?: number;
14
+ };
15
+ export declare function useSwipePagerClicks<E extends HTMLElement = HTMLDivElement>(opts: Opts<E>): {
16
+ onPointerDown: (e: React.PointerEvent<E>) => void;
17
+ onPointerMove: (e: React.PointerEvent<E>) => void;
18
+ onPointerUp: (e: React.PointerEvent<E>) => void;
19
+ onPointerCancel: () => void;
20
+ onClick: (e: React.MouseEvent<E>) => void;
21
+ onDoubleClick: (e: React.MouseEvent<E>) => void;
22
+ };
23
+ export default useSwipePagerClicks;
24
+ //# sourceMappingURL=useSwipePageClicks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSwipePageClicks.d.ts","sourceRoot":"","sources":["../../src/hooks/useSwipePageClicks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,KAAK,IAAI,CAAC,CAAC,GAAG,WAAW,IAAI;IAC3B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAE7C,kBAAkB,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,KAAK,OAAO,CAAC;IAGxD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAG7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;uBA0EjF,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;uBAerB,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;qBAwCrB,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;;iBAwCrB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;uBAyBnB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;EAoC1B;AAED,eAAe,mBAAmB,CAAC"}