@ankhorage/reader 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/dist/features/reader/ReaderViewport.d.ts +4 -0
  3. package/dist/features/reader/ReaderViewport.d.ts.map +1 -0
  4. package/dist/features/reader/ReaderViewport.js +210 -0
  5. package/dist/features/reader/ReaderViewport.js.map +1 -0
  6. package/dist/features/reader/adapters/ReaderView.d.ts +4 -0
  7. package/dist/features/reader/adapters/ReaderView.d.ts.map +1 -0
  8. package/dist/features/reader/adapters/ReaderView.js +5 -0
  9. package/dist/features/reader/adapters/ReaderView.js.map +1 -0
  10. package/dist/features/reader/adapters/ReaderView.native.d.ts +5 -0
  11. package/dist/features/reader/adapters/ReaderView.native.d.ts.map +1 -0
  12. package/dist/features/reader/adapters/ReaderView.native.js +22 -0
  13. package/dist/features/reader/adapters/ReaderView.native.js.map +1 -0
  14. package/dist/features/reader/adapters/ReaderView.web.d.ts +5 -0
  15. package/dist/features/reader/adapters/ReaderView.web.d.ts.map +1 -0
  16. package/dist/features/reader/adapters/ReaderView.web.js +16 -0
  17. package/dist/features/reader/adapters/ReaderView.web.js.map +1 -0
  18. package/dist/features/reader/drivers/EpubReaderDriver.d.ts +20 -0
  19. package/dist/features/reader/drivers/EpubReaderDriver.d.ts.map +1 -0
  20. package/dist/features/reader/drivers/EpubReaderDriver.js +259 -0
  21. package/dist/features/reader/drivers/EpubReaderDriver.js.map +1 -0
  22. package/dist/features/reader/drivers/PdfReaderDriver.d.ts +18 -0
  23. package/dist/features/reader/drivers/PdfReaderDriver.d.ts.map +1 -0
  24. package/dist/features/reader/drivers/PdfReaderDriver.js +198 -0
  25. package/dist/features/reader/drivers/PdfReaderDriver.js.map +1 -0
  26. package/dist/features/reader/epub/EpubArchive.d.ts +11 -0
  27. package/dist/features/reader/epub/EpubArchive.d.ts.map +1 -0
  28. package/dist/features/reader/epub/EpubArchive.js +65 -0
  29. package/dist/features/reader/epub/EpubArchive.js.map +1 -0
  30. package/dist/features/reader/epub/EpubArchiveFetcher.d.ts +11 -0
  31. package/dist/features/reader/epub/EpubArchiveFetcher.d.ts.map +1 -0
  32. package/dist/features/reader/epub/EpubArchiveFetcher.js +44 -0
  33. package/dist/features/reader/epub/EpubArchiveFetcher.js.map +1 -0
  34. package/dist/features/reader/epub/mediaTypes.d.ts +3 -0
  35. package/dist/features/reader/epub/mediaTypes.d.ts.map +1 -0
  36. package/dist/features/reader/epub/mediaTypes.js +26 -0
  37. package/dist/features/reader/epub/mediaTypes.js.map +1 -0
  38. package/dist/features/reader/epub/parseEpubPackage.d.ts +22 -0
  39. package/dist/features/reader/epub/parseEpubPackage.d.ts.map +1 -0
  40. package/dist/features/reader/epub/parseEpubPackage.js +98 -0
  41. package/dist/features/reader/epub/parseEpubPackage.js.map +1 -0
  42. package/dist/features/reader/epub/path.d.ts +4 -0
  43. package/dist/features/reader/epub/path.d.ts.map +1 -0
  44. package/dist/features/reader/epub/path.js +28 -0
  45. package/dist/features/reader/epub/path.js.map +1 -0
  46. package/dist/features/reader/epub/sanitizeEpubDocument.d.ts +3 -0
  47. package/dist/features/reader/epub/sanitizeEpubDocument.d.ts.map +1 -0
  48. package/dist/features/reader/epub/sanitizeEpubDocument.js +90 -0
  49. package/dist/features/reader/epub/sanitizeEpubDocument.js.map +1 -0
  50. package/dist/features/reader/epub/validateEpubArchiveEntriesAsync.d.ts +4 -0
  51. package/dist/features/reader/epub/validateEpubArchiveEntriesAsync.d.ts.map +1 -0
  52. package/dist/features/reader/epub/validateEpubArchiveEntriesAsync.js +50 -0
  53. package/dist/features/reader/epub/validateEpubArchiveEntriesAsync.js.map +1 -0
  54. package/dist/features/reader/errors/ReaderDocumentError.d.ts +6 -0
  55. package/dist/features/reader/errors/ReaderDocumentError.d.ts.map +1 -0
  56. package/dist/features/reader/errors/ReaderDocumentError.js +9 -0
  57. package/dist/features/reader/errors/ReaderDocumentError.js.map +1 -0
  58. package/dist/features/reader/loadReaderSourceAsync.d.ts +2 -0
  59. package/dist/features/reader/loadReaderSourceAsync.d.ts.map +1 -0
  60. package/dist/features/reader/loadReaderSourceAsync.js +49 -0
  61. package/dist/features/reader/loadReaderSourceAsync.js.map +1 -0
  62. package/dist/features/reader/navigation/resolveReaderKeyboardIntent.d.ts +9 -0
  63. package/dist/features/reader/navigation/resolveReaderKeyboardIntent.d.ts.map +1 -0
  64. package/dist/features/reader/navigation/resolveReaderKeyboardIntent.js +19 -0
  65. package/dist/features/reader/navigation/resolveReaderKeyboardIntent.js.map +1 -0
  66. package/dist/features/reader/navigation/resolveReaderNavigationIntent.d.ts +11 -0
  67. package/dist/features/reader/navigation/resolveReaderNavigationIntent.d.ts.map +1 -0
  68. package/dist/features/reader/navigation/resolveReaderNavigationIntent.js +16 -0
  69. package/dist/features/reader/navigation/resolveReaderNavigationIntent.js.map +1 -0
  70. package/dist/features/reader/readerViewportPresentation.d.ts +4 -0
  71. package/dist/features/reader/readerViewportPresentation.d.ts.map +1 -0
  72. package/dist/features/reader/readerViewportPresentation.js +25 -0
  73. package/dist/features/reader/readerViewportPresentation.js.map +1 -0
  74. package/dist/features/reader/toReaderViewportProps.d.ts +4 -0
  75. package/dist/features/reader/toReaderViewportProps.d.ts.map +1 -0
  76. package/dist/features/reader/toReaderViewportProps.js +24 -0
  77. package/dist/features/reader/toReaderViewportProps.js.map +1 -0
  78. package/dist/index.d.ts +3 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +2 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/index.native.d.ts +3 -0
  83. package/dist/index.native.d.ts.map +1 -0
  84. package/dist/index.native.js +2 -0
  85. package/dist/index.native.js.map +1 -0
  86. package/dist/index.web.d.ts +3 -0
  87. package/dist/index.web.d.ts.map +1 -0
  88. package/dist/index.web.js +2 -0
  89. package/dist/index.web.js.map +1 -0
  90. package/dist/types/reader.d.ts +93 -0
  91. package/dist/types/reader.d.ts.map +1 -0
  92. package/dist/types/reader.js +2 -0
  93. package/dist/types/reader.js.map +1 -0
  94. package/package.json +105 -4
  95. package/README.md +0 -3
@@ -0,0 +1,9 @@
1
+ export declare function resolveReaderKeyboardIntent(input: {
2
+ canGoNext: boolean;
3
+ canGoPrevious: boolean;
4
+ direction: 'ltr' | 'rtl';
5
+ hasModifier?: boolean;
6
+ isInteractiveTarget?: boolean;
7
+ key: string;
8
+ }): 'next' | 'previous' | null;
9
+ //# sourceMappingURL=resolveReaderKeyboardIntent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveReaderKeyboardIntent.d.ts","sourceRoot":"","sources":["../../../../src/features/reader/navigation/resolveReaderKeyboardIntent.ts"],"names":[],"mappings":"AAAA,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,CAY7B"}
@@ -0,0 +1,19 @@
1
+ export function resolveReaderKeyboardIntent(input) {
2
+ if (input.hasModifier || input.isInteractiveTarget)
3
+ return null;
4
+ let intent = null;
5
+ if (input.key === 'PageUp')
6
+ intent = 'previous';
7
+ if (input.key === 'PageDown')
8
+ intent = 'next';
9
+ if (input.key === 'ArrowLeft')
10
+ intent = input.direction === 'ltr' ? 'previous' : 'next';
11
+ if (input.key === 'ArrowRight')
12
+ intent = input.direction === 'ltr' ? 'next' : 'previous';
13
+ if (intent === 'next')
14
+ return input.canGoNext ? intent : null;
15
+ if (intent === 'previous')
16
+ return input.canGoPrevious ? intent : null;
17
+ return null;
18
+ }
19
+ //# sourceMappingURL=resolveReaderKeyboardIntent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveReaderKeyboardIntent.js","sourceRoot":"","sources":["../../../../src/features/reader/navigation/resolveReaderKeyboardIntent.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,2BAA2B,CAAC,KAO3C;IACC,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAEhE,IAAI,MAAM,GAA+B,IAAI,CAAC;IAC9C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;QAAE,MAAM,GAAG,UAAU,CAAC;IAChD,IAAI,KAAK,CAAC,GAAG,KAAK,UAAU;QAAE,MAAM,GAAG,MAAM,CAAC;IAC9C,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;QAAE,MAAM,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;IACxF,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY;QAAE,MAAM,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IAEzF,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACtE,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["export function resolveReaderKeyboardIntent(input: {\n canGoNext: boolean;\n canGoPrevious: boolean;\n direction: 'ltr' | 'rtl';\n hasModifier?: boolean;\n isInteractiveTarget?: boolean;\n key: string;\n}): 'next' | 'previous' | null {\n if (input.hasModifier || input.isInteractiveTarget) return null;\n\n let intent: 'next' | 'previous' | null = null;\n if (input.key === 'PageUp') intent = 'previous';\n if (input.key === 'PageDown') intent = 'next';\n if (input.key === 'ArrowLeft') intent = input.direction === 'ltr' ? 'previous' : 'next';\n if (input.key === 'ArrowRight') intent = input.direction === 'ltr' ? 'next' : 'previous';\n\n if (intent === 'next') return input.canGoNext ? intent : null;\n if (intent === 'previous') return input.canGoPrevious ? intent : null;\n return null;\n}\n"]}
@@ -0,0 +1,11 @@
1
+ export declare function resolveReaderNavigationIntent(input: {
2
+ canGoNext: boolean;
3
+ canGoPrevious: boolean;
4
+ deltaX: number;
5
+ deltaY: number;
6
+ direction: 'ltr' | 'rtl';
7
+ hasSelection?: boolean;
8
+ isInteractiveTarget?: boolean;
9
+ viewportWidth: number;
10
+ }): 'next' | 'previous' | null;
11
+ //# sourceMappingURL=resolveReaderNavigationIntent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveReaderNavigationIntent.d.ts","sourceRoot":"","sources":["../../../../src/features/reader/navigation/resolveReaderNavigationIntent.ts"],"names":[],"mappings":"AAAA,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,CAa7B"}
@@ -0,0 +1,16 @@
1
+ export function resolveReaderNavigationIntent(input) {
2
+ if (input.hasSelection || input.isInteractiveTarget)
3
+ return null;
4
+ const horizontalDistance = Math.abs(input.deltaX);
5
+ const verticalDistance = Math.abs(input.deltaY);
6
+ const distanceThreshold = Math.max(48, input.viewportWidth * 0.15);
7
+ if (horizontalDistance <= verticalDistance * 1.25)
8
+ return null;
9
+ if (horizontalDistance <= distanceThreshold)
10
+ return null;
11
+ const movesForward = input.direction === 'ltr' ? input.deltaX < 0 : input.deltaX > 0;
12
+ if (movesForward)
13
+ return input.canGoNext ? 'next' : null;
14
+ return input.canGoPrevious ? 'previous' : null;
15
+ }
16
+ //# sourceMappingURL=resolveReaderNavigationIntent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveReaderNavigationIntent.js","sourceRoot":"","sources":["../../../../src/features/reader/navigation/resolveReaderNavigationIntent.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,6BAA6B,CAAC,KAS7C;IACC,IAAI,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAEjE,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAEnE,IAAI,kBAAkB,IAAI,gBAAgB,GAAG,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,kBAAkB,IAAI,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAEzD,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACrF,IAAI,YAAY;QAAE,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,OAAO,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC","sourcesContent":["export function resolveReaderNavigationIntent(input: {\n canGoNext: boolean;\n canGoPrevious: boolean;\n deltaX: number;\n deltaY: number;\n direction: 'ltr' | 'rtl';\n hasSelection?: boolean;\n isInteractiveTarget?: boolean;\n viewportWidth: number;\n}): 'next' | 'previous' | null {\n if (input.hasSelection || input.isInteractiveTarget) return null;\n\n const horizontalDistance = Math.abs(input.deltaX);\n const verticalDistance = Math.abs(input.deltaY);\n const distanceThreshold = Math.max(48, input.viewportWidth * 0.15);\n\n if (horizontalDistance <= verticalDistance * 1.25) return null;\n if (horizontalDistance <= distanceThreshold) return null;\n\n const movesForward = input.direction === 'ltr' ? input.deltaX < 0 : input.deltaX > 0;\n if (movesForward) return input.canGoNext ? 'next' : null;\n return input.canGoPrevious ? 'previous' : null;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ReaderViewportState } from '../../types/reader.js';
2
+ export declare const LOADING_STATE: ReaderViewportState;
3
+ export declare const READER_STYLES = "\n .reader-root, .reader-root * { box-sizing: border-box; }\n .reader-root { position: absolute; inset: 0; background: #fff; color: #111; height: 100%; outline: none; overflow: hidden; touch-action: pan-y; width: 100%; }\n .reader-dark { background: #111; color: #f5f5f5; }\n .reader-sepia { background: #f4ecd8; color: #3f3527; }\n .reader-content { height: 100%; overflow: auto; position: relative; width: 100%; }\n .reader-content > div:not(.reader-pdf-page) { height: 100%; width: 100%; }\n .reader-pdf-page { --user-unit: 1; --total-scale-factor: calc(var(--scale-factor) * var(--user-unit)); margin: 0 auto; position: relative; }\n .reader-pdf-page canvas { display: block; position: absolute; inset: 0; }\n .reader-pdf-text-layer { --min-font-size: 1; --text-scale-factor: calc(var(--total-scale-factor) * var(--min-font-size)); --min-font-size-inv: calc(1 / var(--min-font-size)); inset: 0; line-height: 1; opacity: 1; overflow: hidden; position: absolute; text-align: initial; text-size-adjust: none; transform-origin: 0 0; }\n .reader-pdf-text-layer span, .reader-pdf-text-layer br { color: transparent; cursor: text; position: absolute; transform-origin: 0 0; user-select: text; white-space: pre; }\n .reader-pdf-text-layer > :not(.markedContent), .reader-pdf-text-layer .markedContent span:not(.markedContent) { --font-height: 0; --scale-x: 1; --rotate: 0deg; font-size: calc(var(--text-scale-factor) * var(--font-height)); transform: rotate(var(--rotate)) scaleX(var(--scale-x)) scale(var(--min-font-size-inv)); }\n .reader-pdf-text-layer .markedContent { display: contents; }\n .reader-pdf-text-layer ::selection { background: rgba(0, 100, 255, 0.35); }\n .reader-pdf-link-layer { inset: 0; pointer-events: none; position: absolute; }\n .reader-pdf-link-layer a { outline-offset: 2px; pointer-events: auto; position: absolute; }\n";
4
+ //# sourceMappingURL=readerViewportPresentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readerViewportPresentation.d.ts","sourceRoot":"","sources":["../../../src/features/reader/readerViewportPresentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,eAAO,MAAM,aAAa,EAAE,mBAM3B,CAAC;AAEF,eAAO,MAAM,aAAa,w0DAgBzB,CAAC"}
@@ -0,0 +1,25 @@
1
+ export const LOADING_STATE = {
2
+ canGoNext: false,
3
+ canGoPrevious: false,
4
+ page: 1,
5
+ progress: 0,
6
+ status: 'loading',
7
+ };
8
+ export const READER_STYLES = `
9
+ .reader-root, .reader-root * { box-sizing: border-box; }
10
+ .reader-root { position: absolute; inset: 0; background: #fff; color: #111; height: 100%; outline: none; overflow: hidden; touch-action: pan-y; width: 100%; }
11
+ .reader-dark { background: #111; color: #f5f5f5; }
12
+ .reader-sepia { background: #f4ecd8; color: #3f3527; }
13
+ .reader-content { height: 100%; overflow: auto; position: relative; width: 100%; }
14
+ .reader-content > div:not(.reader-pdf-page) { height: 100%; width: 100%; }
15
+ .reader-pdf-page { --user-unit: 1; --total-scale-factor: calc(var(--scale-factor) * var(--user-unit)); margin: 0 auto; position: relative; }
16
+ .reader-pdf-page canvas { display: block; position: absolute; inset: 0; }
17
+ .reader-pdf-text-layer { --min-font-size: 1; --text-scale-factor: calc(var(--total-scale-factor) * var(--min-font-size)); --min-font-size-inv: calc(1 / var(--min-font-size)); inset: 0; line-height: 1; opacity: 1; overflow: hidden; position: absolute; text-align: initial; text-size-adjust: none; transform-origin: 0 0; }
18
+ .reader-pdf-text-layer span, .reader-pdf-text-layer br { color: transparent; cursor: text; position: absolute; transform-origin: 0 0; user-select: text; white-space: pre; }
19
+ .reader-pdf-text-layer > :not(.markedContent), .reader-pdf-text-layer .markedContent span:not(.markedContent) { --font-height: 0; --scale-x: 1; --rotate: 0deg; font-size: calc(var(--text-scale-factor) * var(--font-height)); transform: rotate(var(--rotate)) scaleX(var(--scale-x)) scale(var(--min-font-size-inv)); }
20
+ .reader-pdf-text-layer .markedContent { display: contents; }
21
+ .reader-pdf-text-layer ::selection { background: rgba(0, 100, 255, 0.35); }
22
+ .reader-pdf-link-layer { inset: 0; pointer-events: none; position: absolute; }
23
+ .reader-pdf-link-layer a { outline-offset: 2px; pointer-events: auto; position: absolute; }
24
+ `;
25
+ //# sourceMappingURL=readerViewportPresentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readerViewportPresentation.js","sourceRoot":"","sources":["../../../src/features/reader/readerViewportPresentation.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAwB;IAChD,SAAS,EAAE,KAAK;IAChB,aAAa,EAAE,KAAK;IACpB,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,CAAC;IACX,MAAM,EAAE,SAAS;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;CAgB5B,CAAC","sourcesContent":["import type { ReaderViewportState } from '../../types/reader.js';\n\nexport const LOADING_STATE: ReaderViewportState = {\n canGoNext: false,\n canGoPrevious: false,\n page: 1,\n progress: 0,\n status: 'loading',\n};\n\nexport const READER_STYLES = `\n .reader-root, .reader-root * { box-sizing: border-box; }\n .reader-root { position: absolute; inset: 0; background: #fff; color: #111; height: 100%; outline: none; overflow: hidden; touch-action: pan-y; width: 100%; }\n .reader-dark { background: #111; color: #f5f5f5; }\n .reader-sepia { background: #f4ecd8; color: #3f3527; }\n .reader-content { height: 100%; overflow: auto; position: relative; width: 100%; }\n .reader-content > div:not(.reader-pdf-page) { height: 100%; width: 100%; }\n .reader-pdf-page { --user-unit: 1; --total-scale-factor: calc(var(--scale-factor) * var(--user-unit)); margin: 0 auto; position: relative; }\n .reader-pdf-page canvas { display: block; position: absolute; inset: 0; }\n .reader-pdf-text-layer { --min-font-size: 1; --text-scale-factor: calc(var(--total-scale-factor) * var(--min-font-size)); --min-font-size-inv: calc(1 / var(--min-font-size)); inset: 0; line-height: 1; opacity: 1; overflow: hidden; position: absolute; text-align: initial; text-size-adjust: none; transform-origin: 0 0; }\n .reader-pdf-text-layer span, .reader-pdf-text-layer br { color: transparent; cursor: text; position: absolute; transform-origin: 0 0; user-select: text; white-space: pre; }\n .reader-pdf-text-layer > :not(.markedContent), .reader-pdf-text-layer .markedContent span:not(.markedContent) { --font-height: 0; --scale-x: 1; --rotate: 0deg; font-size: calc(var(--text-scale-factor) * var(--font-height)); transform: rotate(var(--rotate)) scaleX(var(--scale-x)) scale(var(--min-font-size-inv)); }\n .reader-pdf-text-layer .markedContent { display: contents; }\n .reader-pdf-text-layer ::selection { background: rgba(0, 100, 255, 0.35); }\n .reader-pdf-link-layer { inset: 0; pointer-events: none; position: absolute; }\n .reader-pdf-link-layer a { outline-offset: 2px; pointer-events: auto; position: absolute; }\n`;\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ReaderViewportProps, ReaderViewProps } from '../../types/reader.js';
2
+ /*** Adapt the independent public ReaderView API to the serializable DOM viewport boundary. */
3
+ export declare function toReaderViewportProps(props: ReaderViewProps): ReaderViewportProps;
4
+ //# sourceMappingURL=toReaderViewportProps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toReaderViewportProps.d.ts","sourceRoot":"","sources":["../../../src/features/reader/toReaderViewportProps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAElF,8FAA8F;AAC9F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,mBAAmB,CAqBjF"}
@@ -0,0 +1,24 @@
1
+ /*** Adapt the independent public ReaderView API to the serializable DOM viewport boundary. */
2
+ export function toReaderViewportProps(props) {
3
+ return {
4
+ sourceUri: props.sourceUri,
5
+ format: props.format,
6
+ appearance: {
7
+ colorScheme: props.appearance?.colorScheme ?? 'system',
8
+ fontScale: props.appearance?.fontScale ?? 1,
9
+ lineHeight: props.appearance?.lineHeight ?? 1.5,
10
+ },
11
+ ...(props.initialLocation === undefined ? {} : { initialLocation: props.initialLocation }),
12
+ ...(props.command === undefined ? {} : { command: props.command }),
13
+ onError: async (event) => {
14
+ await props.onError?.(event);
15
+ },
16
+ onOpenExternalLink: async (event) => {
17
+ await props.onOpenExternalLink?.(event);
18
+ },
19
+ onStateChange: async (state) => {
20
+ await props.onStateChange?.(state);
21
+ },
22
+ };
23
+ }
24
+ //# sourceMappingURL=toReaderViewportProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toReaderViewportProps.js","sourceRoot":"","sources":["../../../src/features/reader/toReaderViewportProps.ts"],"names":[],"mappings":"AAEA,8FAA8F;AAC9F,MAAM,UAAU,qBAAqB,CAAC,KAAsB;IAC1D,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE;YACV,WAAW,EAAE,KAAK,CAAC,UAAU,EAAE,WAAW,IAAI,QAAQ;YACtD,SAAS,EAAE,KAAK,CAAC,UAAU,EAAE,SAAS,IAAI,CAAC;YAC3C,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,UAAU,IAAI,GAAG;SAChD;QACD,GAAG,CAAC,KAAK,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1F,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAClE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,kBAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAClC,MAAM,KAAK,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;QACD,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC7B,MAAM,KAAK,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { ReaderViewportProps, ReaderViewProps } from '../../types/reader.js';\n\n/*** Adapt the independent public ReaderView API to the serializable DOM viewport boundary. */\nexport function toReaderViewportProps(props: ReaderViewProps): ReaderViewportProps {\n return {\n sourceUri: props.sourceUri,\n format: props.format,\n appearance: {\n colorScheme: props.appearance?.colorScheme ?? 'system',\n fontScale: props.appearance?.fontScale ?? 1,\n lineHeight: props.appearance?.lineHeight ?? 1.5,\n },\n ...(props.initialLocation === undefined ? {} : { initialLocation: props.initialLocation }),\n ...(props.command === undefined ? {} : { command: props.command }),\n onError: async (event) => {\n await props.onError?.(event);\n },\n onOpenExternalLink: async (event) => {\n await props.onOpenExternalLink?.(event);\n },\n onStateChange: async (state) => {\n await props.onStateChange?.(state);\n },\n };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export { ReaderView } from './features/reader/adapters/ReaderView.js';
2
+ export type { ReaderAppearance, ReaderCommand, ReaderDocumentFormat, ReaderErrorCode, ReaderErrorEvent, ReaderLocationChangeEvent, ReaderNavigationTrigger, ReaderStatus, ReaderViewportState, ReaderViewProps, ReaderViewStyle, } from './types/reader.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACtE,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,uBAAuB,EACvB,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { ReaderView } from './features/reader/adapters/ReaderView.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC","sourcesContent":["export { ReaderView } from './features/reader/adapters/ReaderView.js';\nexport type {\n ReaderAppearance,\n ReaderCommand,\n ReaderDocumentFormat,\n ReaderErrorCode,\n ReaderErrorEvent,\n ReaderLocationChangeEvent,\n ReaderNavigationTrigger,\n ReaderStatus,\n ReaderViewportState,\n ReaderViewProps,\n ReaderViewStyle,\n} from './types/reader.js';\n"]}
@@ -0,0 +1,3 @@
1
+ export { ReaderView } from './features/reader/adapters/ReaderView.native.js';
2
+ export type { ReaderAppearance, ReaderCommand, ReaderDocumentFormat, ReaderErrorCode, ReaderErrorEvent, ReaderLocationChangeEvent, ReaderNavigationTrigger, ReaderStatus, ReaderViewportState, ReaderViewProps, ReaderViewStyle, } from './types/reader.js';
3
+ //# sourceMappingURL=index.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../src/index.native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iDAAiD,CAAC;AAC7E,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,uBAAuB,EACvB,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ReaderView } from './features/reader/adapters/ReaderView.native.js';
2
+ //# sourceMappingURL=index.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.native.js","sourceRoot":"","sources":["../src/index.native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iDAAiD,CAAC","sourcesContent":["export { ReaderView } from './features/reader/adapters/ReaderView.native.js';\nexport type {\n ReaderAppearance,\n ReaderCommand,\n ReaderDocumentFormat,\n ReaderErrorCode,\n ReaderErrorEvent,\n ReaderLocationChangeEvent,\n ReaderNavigationTrigger,\n ReaderStatus,\n ReaderViewportState,\n ReaderViewProps,\n ReaderViewStyle,\n} from './types/reader.js';\n"]}
@@ -0,0 +1,3 @@
1
+ export { ReaderView } from './features/reader/adapters/ReaderView.web.js';
2
+ export type { ReaderAppearance, ReaderCommand, ReaderDocumentFormat, ReaderErrorCode, ReaderErrorEvent, ReaderLocationChangeEvent, ReaderNavigationTrigger, ReaderStatus, ReaderViewportState, ReaderViewProps, ReaderViewStyle, } from './types/reader.js';
3
+ //# sourceMappingURL=index.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.web.d.ts","sourceRoot":"","sources":["../src/index.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAC1E,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,uBAAuB,EACvB,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ReaderView } from './features/reader/adapters/ReaderView.web.js';
2
+ //# sourceMappingURL=index.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.web.js","sourceRoot":"","sources":["../src/index.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC","sourcesContent":["export { ReaderView } from './features/reader/adapters/ReaderView.web.js';\nexport type {\n ReaderAppearance,\n ReaderCommand,\n ReaderDocumentFormat,\n ReaderErrorCode,\n ReaderErrorEvent,\n ReaderLocationChangeEvent,\n ReaderNavigationTrigger,\n ReaderStatus,\n ReaderViewportState,\n ReaderViewProps,\n ReaderViewStyle,\n} from './types/reader.js';\n"]}
@@ -0,0 +1,93 @@
1
+ import type { DOMProps } from 'expo/dom';
2
+ export type ReaderDocumentFormat = 'epub' | 'pdf';
3
+ export type ReaderStatus = 'idle' | 'loading' | 'ready' | 'error';
4
+ export type ReaderNavigationTrigger = 'swipe' | 'previousControl' | 'nextControl' | 'keyboard' | 'location';
5
+ export type ReaderErrorCode = 'invalid-document' | 'load-failed' | 'protected-document' | 'unsupported-format';
6
+ export interface ReaderLocationChangeEvent {
7
+ readonly format: ReaderDocumentFormat;
8
+ readonly locator: string;
9
+ readonly page: number;
10
+ readonly pageCount?: number;
11
+ readonly progression: number;
12
+ readonly chapterId?: string;
13
+ readonly chapterTitle?: string;
14
+ readonly trigger: ReaderNavigationTrigger;
15
+ }
16
+ export interface ReaderErrorEvent {
17
+ readonly code: ReaderErrorCode;
18
+ readonly format?: ReaderDocumentFormat;
19
+ readonly message: string;
20
+ }
21
+ export interface ReaderAppearance {
22
+ readonly colorScheme: 'dark' | 'light' | 'sepia' | 'system';
23
+ readonly fontScale: number;
24
+ readonly lineHeight: number;
25
+ }
26
+ export interface ReaderCommand {
27
+ readonly id: number;
28
+ readonly sourceUri: string;
29
+ readonly type: 'next' | 'previous';
30
+ }
31
+ export interface ReaderViewStyle {
32
+ readonly width?: number | `${number}%`;
33
+ readonly height?: number | `${number}%`;
34
+ readonly flex?: number;
35
+ }
36
+ export interface ReaderViewProps {
37
+ readonly sourceUri: string;
38
+ readonly format: ReaderDocumentFormat;
39
+ readonly appearance?: Partial<ReaderAppearance>;
40
+ readonly initialLocation?: string;
41
+ readonly command?: ReaderCommand;
42
+ readonly style?: ReaderViewStyle;
43
+ readonly onStateChange?: (state: ReaderViewportState) => void | Promise<void>;
44
+ readonly onError?: (event: ReaderErrorEvent) => void | Promise<void>;
45
+ readonly onOpenExternalLink?: (event: {
46
+ readonly url: string;
47
+ }) => void | Promise<void>;
48
+ }
49
+ export interface ReaderViewportState {
50
+ readonly canGoNext: boolean;
51
+ readonly canGoPrevious: boolean;
52
+ readonly location?: ReaderLocationChangeEvent;
53
+ readonly page: number;
54
+ readonly pageCount?: number;
55
+ readonly progress: number;
56
+ readonly status: 'loading' | 'ready';
57
+ }
58
+ export interface ReaderViewportProps {
59
+ readonly appearance: ReaderAppearance;
60
+ readonly command?: ReaderCommand;
61
+ readonly format: ReaderDocumentFormat;
62
+ readonly initialLocation?: string;
63
+ readonly onError: (event: ReaderErrorEvent) => Promise<void>;
64
+ readonly onOpenExternalLink: (event: {
65
+ readonly url: string;
66
+ }) => Promise<void>;
67
+ readonly onStateChange: (state: ReaderViewportState) => Promise<void>;
68
+ readonly sourceUri: string;
69
+ readonly dom?: DOMProps;
70
+ }
71
+ export interface ReaderDriverState {
72
+ readonly canGoNext: boolean;
73
+ readonly canGoPrevious: boolean;
74
+ readonly chapterId?: string;
75
+ readonly chapterTitle?: string;
76
+ readonly locator: string;
77
+ readonly page: number;
78
+ readonly pageCount?: number;
79
+ readonly progression: number;
80
+ }
81
+ export interface ReaderDriver {
82
+ readonly direction: 'ltr' | 'rtl';
83
+ destroy(): Promise<void>;
84
+ getState(): ReaderDriverState;
85
+ goNext(trigger: ReaderLocationChangeEvent['trigger']): Promise<void>;
86
+ goPrevious(trigger: ReaderLocationChangeEvent['trigger']): Promise<void>;
87
+ }
88
+ export interface ReaderTouchStart {
89
+ readonly interactive: boolean;
90
+ readonly x: number;
91
+ readonly y: number;
92
+ }
93
+ //# sourceMappingURL=reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../src/types/reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/types/reader.ts"],"names":[],"mappings":"","sourcesContent":["import type { DOMProps } from 'expo/dom';\n\nexport type ReaderDocumentFormat = 'epub' | 'pdf';\nexport type ReaderStatus = 'idle' | 'loading' | 'ready' | 'error';\nexport type ReaderNavigationTrigger =\n 'swipe' | 'previousControl' | 'nextControl' | 'keyboard' | 'location';\nexport type ReaderErrorCode =\n 'invalid-document' | 'load-failed' | 'protected-document' | 'unsupported-format';\n\nexport interface ReaderLocationChangeEvent {\n readonly format: ReaderDocumentFormat;\n readonly locator: string;\n readonly page: number;\n readonly pageCount?: number;\n readonly progression: number;\n readonly chapterId?: string;\n readonly chapterTitle?: string;\n readonly trigger: ReaderNavigationTrigger;\n}\n\nexport interface ReaderErrorEvent {\n readonly code: ReaderErrorCode;\n readonly format?: ReaderDocumentFormat;\n readonly message: string;\n}\n\nexport interface ReaderAppearance {\n readonly colorScheme: 'dark' | 'light' | 'sepia' | 'system';\n readonly fontScale: number;\n readonly lineHeight: number;\n}\n\nexport interface ReaderCommand {\n readonly id: number;\n readonly sourceUri: string;\n readonly type: 'next' | 'previous';\n}\n\nexport interface ReaderViewStyle {\n readonly width?: number | `${number}%`;\n readonly height?: number | `${number}%`;\n readonly flex?: number;\n}\n\nexport interface ReaderViewProps {\n readonly sourceUri: string;\n readonly format: ReaderDocumentFormat;\n readonly appearance?: Partial<ReaderAppearance>;\n readonly initialLocation?: string;\n readonly command?: ReaderCommand;\n readonly style?: ReaderViewStyle;\n readonly onStateChange?: (state: ReaderViewportState) => void | Promise<void>;\n readonly onError?: (event: ReaderErrorEvent) => void | Promise<void>;\n readonly onOpenExternalLink?: (event: { readonly url: string }) => void | Promise<void>;\n}\n\nexport interface ReaderViewportState {\n readonly canGoNext: boolean;\n readonly canGoPrevious: boolean;\n readonly location?: ReaderLocationChangeEvent;\n readonly page: number;\n readonly pageCount?: number;\n readonly progress: number;\n readonly status: 'loading' | 'ready';\n}\n\nexport interface ReaderViewportProps {\n readonly appearance: ReaderAppearance;\n readonly command?: ReaderCommand;\n readonly format: ReaderDocumentFormat;\n readonly initialLocation?: string;\n readonly onError: (event: ReaderErrorEvent) => Promise<void>;\n readonly onOpenExternalLink: (event: { readonly url: string }) => Promise<void>;\n readonly onStateChange: (state: ReaderViewportState) => Promise<void>;\n readonly sourceUri: string;\n readonly dom?: DOMProps;\n}\n\nexport interface ReaderDriverState {\n readonly canGoNext: boolean;\n readonly canGoPrevious: boolean;\n readonly chapterId?: string;\n readonly chapterTitle?: string;\n readonly locator: string;\n readonly page: number;\n readonly pageCount?: number;\n readonly progression: number;\n}\n\nexport interface ReaderDriver {\n readonly direction: 'ltr' | 'rtl';\n destroy(): Promise<void>;\n getState(): ReaderDriverState;\n goNext(trigger: ReaderLocationChangeEvent['trigger']): Promise<void>;\n goPrevious(trigger: ReaderLocationChangeEvent['trigger']): Promise<void>;\n}\n\nexport interface ReaderTouchStart {\n readonly interactive: boolean;\n readonly x: number;\n readonly y: number;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,107 @@
1
1
  {
2
2
  "name": "@ankhorage/reader",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Standalone EPUB 3 and PDF reader engine for web and React Native.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/ankhorage/reader.git"
11
+ },
12
+ "homepage": "https://github.com/ankhorage/reader#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/ankhorage/reader/issues"
15
+ },
16
+ "keywords": [
17
+ "ankhorage",
18
+ "reader",
19
+ "epub",
20
+ "pdf",
21
+ "react-native",
22
+ "web"
23
+ ],
24
+ "files": [
25
+ "dist",
26
+ "README.md",
27
+ "CHANGELOG.md",
28
+ "LICENSE"
29
+ ],
30
+ "main": "./dist/index.js",
31
+ "types": "./dist/index.d.ts",
32
+ "exports": {
33
+ ".": {
34
+ "react-native": "./dist/index.native.js",
35
+ "browser": "./dist/index.web.js",
36
+ "types": "./dist/index.d.ts",
37
+ "import": "./dist/index.js",
38
+ "default": "./dist/index.js"
39
+ },
40
+ "./package.json": "./package.json"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "engines": {
46
+ "node": ">=24"
47
+ },
48
+ "scripts": {
49
+ "build": "rm -rf dist tsconfig.tsbuildinfo tsconfig.build.tsbuildinfo && bun x tsc -p tsconfig.build.json",
50
+ "check-types": "bun x tsc --noEmit -p tsconfig.json",
51
+ "typecheck": "bun run check-types",
52
+ "test": "bun test src",
53
+ "prepack": "bun run build",
54
+ "lint": "ankhorage-eslint . --max-warnings=0",
55
+ "lint:fix": "ankhorage-eslint . --fix --max-warnings=0",
56
+ "format": "ankhorage-prettier --write .",
57
+ "format:check": "ankhorage-prettier --check .",
58
+ "knip:check": "ankhorage-knip",
59
+ "changeset": "ankhorage-changeset",
60
+ "changeset:status": "ankhorage-changeset status --since=origin/main",
61
+ "version-packages": "ankhorage-changeset version",
62
+ "docs": "paradox"
63
+ },
64
+ "dependencies": {
65
+ "@readium/navigator": "2.11.1",
66
+ "@readium/shared": "2.6.0",
67
+ "@zip.js/zip.js": "2.23.0",
68
+ "pdfjs-dist": "6.4.299"
69
+ },
70
+ "peerDependencies": {
71
+ "expo": "^57.0.0",
72
+ "react": "19.2.3",
73
+ "react-dom": "19.2.3",
74
+ "react-native": "0.86.x",
75
+ "react-native-web": "~0.21.3"
76
+ },
77
+ "peerDependenciesMeta": {
78
+ "expo": {
79
+ "optional": true
80
+ },
81
+ "react-dom": {
82
+ "optional": true
83
+ },
84
+ "react-native": {
85
+ "optional": true
86
+ },
87
+ "react-native-web": {
88
+ "optional": true
89
+ }
90
+ },
91
+ "packageManager": "bun@1.4.2",
92
+ "devDependencies": {
93
+ "@ankhorage/devtools": "^2.2.2",
94
+ "@ankhorage/paradox": "^0.3.1",
95
+ "@types/bun": "^1.4.2",
96
+ "@types/node": "^26.6.4",
97
+ "@types/react": "^19.3.0",
98
+ "@types/react-dom": "^19.3.0",
99
+ "expo": "57.0.27",
100
+ "react": "19.2.3",
101
+ "react-dom": "19.2.3",
102
+ "react-native": "0.86.3",
103
+ "react-native-web": "~0.21.3",
104
+ "typescript": "~6.0.3",
105
+ "@xmldom/xmldom": "0.9.12"
106
+ }
107
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.