zreader 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 (63) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +21 -0
  3. package/README.md +234 -2
  4. package/dist/blocks-DwR7l7pz.d.ts +20 -0
  5. package/dist/chunk-3WQBK6DE.js +47 -0
  6. package/dist/chunk-3WQBK6DE.js.map +1 -0
  7. package/dist/chunk-DYQNGV46.js +31 -0
  8. package/dist/chunk-DYQNGV46.js.map +1 -0
  9. package/dist/chunk-ISI35TCM.js +62 -0
  10. package/dist/chunk-ISI35TCM.js.map +1 -0
  11. package/dist/chunk-RNSAFDZ5.js +105 -0
  12. package/dist/chunk-RNSAFDZ5.js.map +1 -0
  13. package/dist/config/index.cjs +196 -0
  14. package/dist/config/index.cjs.map +1 -0
  15. package/dist/config/index.d.cts +159 -0
  16. package/dist/config/index.d.ts +159 -0
  17. package/dist/config/index.js +182 -0
  18. package/dist/config/index.js.map +1 -0
  19. package/dist/content/index.d.ts +143 -0
  20. package/dist/content/index.js +379 -0
  21. package/dist/content/index.js.map +1 -0
  22. package/dist/core/index.d.ts +262 -0
  23. package/dist/core/index.js +935 -0
  24. package/dist/core/index.js.map +1 -0
  25. package/dist/editor/index.d.ts +19 -0
  26. package/dist/editor/index.js +277 -0
  27. package/dist/editor/index.js.map +1 -0
  28. package/dist/index-Bp5oIiZd.d.ts +61 -0
  29. package/dist/next/client/index.d.ts +8 -0
  30. package/dist/next/client/index.js +13 -0
  31. package/dist/next/client/index.js.map +1 -0
  32. package/dist/next/index.cjs +272 -0
  33. package/dist/next/index.cjs.map +1 -0
  34. package/dist/next/index.d.cts +47 -0
  35. package/dist/next/index.d.ts +47 -0
  36. package/dist/next/index.js +262 -0
  37. package/dist/next/index.js.map +1 -0
  38. package/dist/next/server/index.d.ts +58 -0
  39. package/dist/next/server/index.js +44 -0
  40. package/dist/next/server/index.js.map +1 -0
  41. package/dist/react/index.d.ts +376 -0
  42. package/dist/react/index.js +2793 -0
  43. package/dist/react/index.js.map +1 -0
  44. package/dist/reader.css +116 -0
  45. package/dist/rehype/index.d.ts +27 -0
  46. package/dist/rehype/index.js +4 -0
  47. package/dist/rehype/index.js.map +1 -0
  48. package/dist/stubs/empty-config.d.ts +9 -0
  49. package/dist/stubs/empty-config.js +7 -0
  50. package/dist/stubs/empty-config.js.map +1 -0
  51. package/dist/stubs/server-only.d.ts +2 -0
  52. package/dist/stubs/server-only.js +6 -0
  53. package/dist/stubs/server-only.js.map +1 -0
  54. package/dist/styles.css +1 -0
  55. package/dist/tailwind.css +41 -0
  56. package/dist/types-xkdpkPxA.d.ts +147 -0
  57. package/dist/user-config/index.d.ts +17 -0
  58. package/dist/user-config/index.js +35 -0
  59. package/dist/user-config/index.js.map +1 -0
  60. package/dist/virtual-config/index.d.ts +6 -0
  61. package/dist/virtual-config/index.js +10 -0
  62. package/dist/virtual-config/index.js.map +1 -0
  63. package/package.json +225 -4
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/storage.ts","../../src/core/schema.ts","../../src/core/store.ts","../../src/core/backup.ts","../../src/core/text.ts","../../src/core/dom.ts"],"names":["enc"],"mappings":"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","file":"index.js","sourcesContent":["/** Pluggable key/value storage. localStorage by default, memory for SSR/tests. */\nexport interface StorageAdapter {\n get(key: string): string | null;\n set(key: string, value: string): void;\n remove(key: string): void;\n keys(prefix?: string): string[];\n /** Notified when another tab/window changes `key` (or any key if `key` is null). */\n subscribe(listener: (key: string | null) => void): () => void;\n}\n\nexport class StorageQuotaError extends Error {\n constructor(\n public readonly key: string,\n cause?: unknown,\n ) {\n super(`Storage quota exceeded while writing \"${key}\"`);\n this.name = \"StorageQuotaError\";\n (this as { cause?: unknown }).cause = cause;\n }\n}\n\nfunction isQuotaError(err: unknown): boolean {\n if (!err || typeof err !== \"object\") return false;\n const e = err as { name?: string; code?: number };\n return (\n e.name === \"QuotaExceededError\" ||\n e.name === \"NS_ERROR_DOM_QUOTA_REACHED\" ||\n e.code === 22 ||\n e.code === 1014\n );\n}\n\nexport function createMemoryAdapter(initial: Record<string, string> = {}): StorageAdapter & {\n dump(): Record<string, string>;\n} {\n const map = new Map(Object.entries(initial));\n return {\n get: (k) => map.get(k) ?? null,\n set: (k, v) => void map.set(k, v),\n remove: (k) => void map.delete(k),\n keys: (prefix = \"\") => [...map.keys()].filter((k) => k.startsWith(prefix)),\n subscribe: () => () => {},\n dump: () => Object.fromEntries(map),\n };\n}\n\n/** Returns `null` when localStorage is unavailable (SSR, privacy mode, sandboxed iframes). */\nexport function getLocalStorage(): Storage | null {\n try {\n if (typeof window === \"undefined\" || !window.localStorage) return null;\n const probe = \"__zr_probe__\";\n window.localStorage.setItem(probe, \"1\");\n window.localStorage.removeItem(probe);\n return window.localStorage;\n } catch {\n return null;\n }\n}\n\nexport function createLocalStorageAdapter(storage: Storage | null = getLocalStorage()): StorageAdapter {\n if (!storage) return createMemoryAdapter();\n return {\n get: (k) => {\n try {\n return storage.getItem(k);\n } catch {\n return null;\n }\n },\n set: (k, v) => {\n try {\n storage.setItem(k, v);\n } catch (err) {\n if (isQuotaError(err)) throw new StorageQuotaError(k, err);\n throw err;\n }\n },\n remove: (k) => {\n try {\n storage.removeItem(k);\n } catch {\n /* ignore */\n }\n },\n keys: (prefix = \"\") => {\n const out: string[] = [];\n for (let i = 0; i < storage.length; i++) {\n const k = storage.key(i);\n if (k != null && k.startsWith(prefix)) out.push(k);\n }\n return out;\n },\n subscribe: (listener) => {\n if (typeof window === \"undefined\") return () => {};\n const onStorage = (e: StorageEvent) => {\n if (e.storageArea && e.storageArea !== storage) return;\n listener(e.key);\n };\n window.addEventListener(\"storage\", onStorage);\n return () => window.removeEventListener(\"storage\", onStorage);\n },\n };\n}\n\n/**\n * Ask the browser not to evict our data (Safari ITP / storage pressure).\n * Resolves to whether persistence is granted. Never throws.\n */\nexport async function requestPersistentStorage(): Promise<boolean> {\n try {\n if (typeof navigator === \"undefined\" || !navigator.storage?.persist) return false;\n if (await navigator.storage.persisted()) return true;\n return await navigator.storage.persist();\n } catch {\n return false;\n }\n}\n","import {\n FONT_FAMILIES,\n LEADINGS,\n MEASURES,\n TEXT_SIZES,\n type Anchor,\n type Bookmark,\n type BookProgress,\n type ChapterProgress,\n type Highlight,\n type Pad,\n type ReaderSettings,\n} from \"./types\";\n\n/**\n * Every persisted value is wrapped in an envelope carrying its schema version so\n * records written by older versions of the package can be migrated forward.\n */\nexport interface Envelope<T = unknown> {\n v: number;\n data: T;\n}\n\nexport type RecordType = \"settings\" | \"highlights\" | \"bookmarks\" | \"progress\" | \"pad\";\n\ntype Migration = (data: unknown) => unknown;\n\n/**\n * `MIGRATIONS[type][i]` upgrades data from version `i + 1` to `i + 2`.\n * Add a function here (never edit an old one) whenever a record shape changes.\n */\nexport const MIGRATIONS: Record<RecordType, Migration[]> = {\n settings: [],\n highlights: [],\n bookmarks: [],\n progress: [],\n pad: [],\n};\n\nexport function currentVersion(type: RecordType, migrations = MIGRATIONS): number {\n return migrations[type].length + 1;\n}\n\nexport function wrap<T>(type: RecordType, data: T, migrations = MIGRATIONS): string {\n return JSON.stringify({ v: currentVersion(type, migrations), data } satisfies Envelope<T>);\n}\n\n/** Parse + migrate. Returns `undefined` for missing, corrupt, or future-version data. */\nexport function unwrap(type: RecordType, raw: string | null, migrations = MIGRATIONS): unknown {\n if (raw == null) return undefined;\n let env: unknown;\n try {\n env = JSON.parse(raw);\n } catch {\n return undefined;\n }\n if (!isObj(env) || typeof env.v !== \"number\" || !(\"data\" in env)) return undefined;\n const target = currentVersion(type, migrations);\n if (env.v > target) return undefined; // written by a newer version; don't clobber-interpret\n let data = env.data;\n for (let v = env.v; v < target; v++) {\n const m = migrations[type][v - 1];\n if (!m) return undefined;\n data = m(data);\n }\n return data;\n}\n\n// ---------------------------------------------------------------------------\n// Validators: tiny hand-written guards (no runtime dependency in core).\n// Invalid list items are dropped individually instead of discarding everything.\n// ---------------------------------------------------------------------------\n\nexport function isObj(x: unknown): x is Record<string, unknown> {\n return typeof x === \"object\" && x !== null && !Array.isArray(x);\n}\nconst str = (x: unknown): x is string => typeof x === \"string\";\nconst num = (x: unknown): x is number => typeof x === \"number\" && Number.isFinite(x);\nconst optStr = (x: unknown) => x === undefined || str(x);\n\nexport function isAnchor(x: unknown): x is Anchor {\n return (\n isObj(x) &&\n str(x.blockId) &&\n num(x.blockStart) &&\n num(x.start) &&\n num(x.end) &&\n x.end >= x.start &&\n str(x.exact) &&\n str(x.prefix) &&\n str(x.suffix) &&\n optStr(x.contentHash)\n );\n}\n\nexport function isHighlight(x: unknown): x is Highlight {\n return (\n isObj(x) &&\n str(x.id) &&\n str(x.bookId) &&\n str(x.chapterId) &&\n isAnchor(x.anchor) &&\n str(x.color) &&\n optStr(x.note) &&\n str(x.createdAt) &&\n str(x.updatedAt)\n );\n}\n\nexport function isBookmark(x: unknown): x is Bookmark {\n return (\n isObj(x) &&\n str(x.id) &&\n str(x.bookId) &&\n str(x.chapterId) &&\n optStr(x.blockId) &&\n optStr(x.label) &&\n optStr(x.excerpt) &&\n str(x.createdAt) &&\n str(x.updatedAt)\n );\n}\n\nfunction isChapterProgress(x: unknown): x is ChapterProgress {\n return (\n isObj(x) &&\n str(x.chapterId) &&\n optStr(x.blockId) &&\n num(x.percent) &&\n typeof x.completed === \"boolean\" &&\n str(x.updatedAt)\n );\n}\n\nexport function sanitizeProgress(x: unknown, bookId: string): BookProgress {\n const out: BookProgress = { bookId, chapters: {} };\n if (!isObj(x)) return out;\n if (isObj(x.chapters)) {\n for (const [k, v] of Object.entries(x.chapters)) if (isChapterProgress(v)) out.chapters[k] = v;\n }\n if (isObj(x.last) && str(x.last.chapterId) && str(x.last.updatedAt) && optStr(x.last.blockId)) {\n out.last = { chapterId: x.last.chapterId, blockId: x.last.blockId as string | undefined, updatedAt: x.last.updatedAt };\n }\n return out;\n}\n\nexport function sanitizeList<T>(x: unknown, guard: (i: unknown) => i is T): T[] {\n return Array.isArray(x) ? x.filter(guard) : [];\n}\n\nexport function sanitizePad(x: unknown): Pad | undefined {\n if (!isObj(x) || !str(x.markdown) || !str(x.updatedAt)) return undefined;\n return { markdown: x.markdown, json: x.json, updatedAt: x.updatedAt };\n}\n\nconst oneOf =\n (list: readonly string[]) =>\n (v: unknown): boolean =>\n typeof v === \"string\" && list.includes(v);\n\nexport function sanitizeSettings(x: unknown, defaults: ReaderSettings): ReaderSettings {\n if (!isObj(x)) return defaults;\n const pick = <K extends keyof ReaderSettings>(k: K, ok: (v: unknown) => boolean): ReaderSettings[K] =>\n (ok(x[k]) ? x[k] : defaults[k]) as ReaderSettings[K];\n return {\n textSize: pick(\"textSize\", oneOf(TEXT_SIZES)),\n leading: pick(\"leading\", oneOf(LEADINGS)),\n measure: pick(\"measure\", oneOf(MEASURES)),\n fontFamily: pick(\"fontFamily\", oneOf(FONT_FAMILIES)),\n highlightMode: pick(\"highlightMode\", (v) => typeof v === \"boolean\"),\n updatedAt: pick(\"updatedAt\", str),\n };\n}\n","import { createLocalStorageAdapter, StorageQuotaError, type StorageAdapter } from \"./storage\";\nimport {\n isBookmark,\n isHighlight,\n sanitizeList,\n sanitizePad,\n sanitizeProgress,\n sanitizeSettings,\n unwrap,\n wrap,\n type RecordType,\n} from \"./schema\";\nimport type {\n Anchor,\n Bookmark,\n BookProgress,\n Highlight,\n Pad,\n PadScope,\n ReaderClientOptions,\n ReaderSettings,\n} from \"./types\";\nimport { DEFAULT_CLIENT_OPTIONS } from \"./defaults\";\n\nexport interface Cell<T> {\n /** Stable reference until the value changes (safe for useSyncExternalStore). */\n get(): T;\n set(next: T | ((prev: T) => T)): void;\n subscribe(listener: () => void): () => void;\n}\n\nexport interface ReaderStoreOptions {\n adapter?: StorageAdapter;\n options?: Partial<ReaderClientOptions>;\n /** Debounce for writes (ms). Writes are also flushed on `pagehide`. */\n writeDelay?: number;\n onError?: (error: unknown) => void;\n now?: () => Date;\n id?: () => string;\n}\n\nexport type ReaderStore = ReturnType<typeof createReaderStore>;\n\nconst enc = encodeURIComponent;\n\nexport function padKeySuffix(scope: PadScope): string {\n switch (scope.kind) {\n case \"global\":\n return \"pad:global\";\n case \"book\":\n return `pad:book:${enc(scope.bookId)}`;\n case \"chapter\":\n return `pad:chapter:${enc(scope.bookId)}:${enc(scope.chapterId)}`;\n }\n}\n\nexport function defaultId(): string {\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (c?.randomUUID) return c.randomUUID();\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function createReaderStore(opts: ReaderStoreOptions = {}) {\n const adapter = opts.adapter ?? createLocalStorageAdapter();\n const options: ReaderClientOptions = { ...DEFAULT_CLIENT_OPTIONS, ...opts.options };\n const prefix = `${options.storagePrefix}:v1:`;\n const writeDelay = opts.writeDelay ?? 200;\n const onError = opts.onError ?? ((e) => console.warn(\"[zreader]\", e));\n const now = () => (opts.now ? opts.now() : new Date()).toISOString();\n const newId = opts.id ?? defaultId;\n\n const defaultSettings: ReaderSettings = { ...options.defaultSettings, updatedAt: new Date(0).toISOString() };\n\n type AnyCell = Cell<unknown> & { reload(): void; flush(): void; key: string };\n const cells = new Map<string, AnyCell>();\n\n function cell<T>(suffix: string, type: RecordType, parse: (raw: unknown) => T): Cell<T> {\n const key = prefix + suffix;\n const existing = cells.get(key);\n if (existing) return existing as unknown as Cell<T>;\n\n let value = parse(unwrap(type, adapter.get(key)));\n let timer: ReturnType<typeof setTimeout> | undefined;\n let dirty = false;\n const listeners = new Set<() => void>();\n const emit = () => listeners.forEach((l) => l());\n\n const flush = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n if (!dirty) return;\n dirty = false;\n try {\n adapter.set(key, wrap(type, value));\n } catch (err) {\n onError(err instanceof StorageQuotaError ? err : new StorageQuotaError(key, err));\n }\n };\n\n const c: AnyCell = {\n key,\n get: () => value as unknown,\n set: (next) => {\n const v = typeof next === \"function\" ? (next as (p: unknown) => unknown)(value) : next;\n if (Object.is(v, value)) return;\n value = v as T;\n dirty = true;\n emit();\n if (writeDelay <= 0) flush();\n else {\n if (timer) clearTimeout(timer);\n timer = setTimeout(flush, writeDelay);\n }\n },\n subscribe: (l) => {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n reload: () => {\n if (dirty) return; // a local write is pending; it wins\n value = parse(unwrap(type, adapter.get(key)));\n emit();\n },\n flush,\n };\n cells.set(key, c);\n return c as unknown as Cell<T>;\n }\n\n const flushAll = () => cells.forEach((c) => c.flush());\n let connections = 0;\n let disconnect: (() => void) | undefined;\n\n /**\n * Start cross-tab sync and flush-on-hide. Ref-counted, so it is safe to call\n * from effects that may run twice (React StrictMode). Returns a disposer.\n */\n function connect(): () => void {\n if (connections++ === 0) {\n const unsubscribeAdapter = adapter.subscribe((key) => {\n if (key == null) cells.forEach((c) => c.reload());\n else cells.get(key)?.reload();\n });\n const onHide = () => flushAll();\n const onVisibility = () => {\n if (document.visibilityState === \"hidden\") flushAll();\n };\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"pagehide\", onHide);\n document.addEventListener(\"visibilitychange\", onVisibility);\n }\n disconnect = () => {\n flushAll();\n unsubscribeAdapter();\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"pagehide\", onHide);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n }\n };\n }\n let done = false;\n return () => {\n if (done) return;\n done = true;\n if (--connections === 0) disconnect?.();\n };\n }\n\n // ------------------------------------------------------------------ cells\n const settings = () => cell<ReaderSettings>(\"settings\", \"settings\", (x) => sanitizeSettings(x, defaultSettings));\n const highlights = (bookId: string) =>\n cell<Highlight[]>(`book:${enc(bookId)}:highlights`, \"highlights\", (x) => sanitizeList(x, isHighlight));\n const bookmarks = (bookId: string) =>\n cell<Bookmark[]>(`book:${enc(bookId)}:bookmarks`, \"bookmarks\", (x) => sanitizeList(x, isBookmark));\n const progress = (bookId: string) =>\n cell<BookProgress>(`book:${enc(bookId)}:progress`, \"progress\", (x) => sanitizeProgress(x, bookId));\n const emptyPad: Pad = { markdown: \"\", updatedAt: new Date(0).toISOString() };\n const pad = (scope: PadScope) => cell<Pad>(padKeySuffix(scope), \"pad\", (x) => sanitizePad(x) ?? emptyPad);\n\n /** Stable values used as the server snapshot during SSR/hydration. */\n const emptyList: never[] = [];\n const emptyProgress = new Map<string, BookProgress>();\n const server = {\n settings: defaultSettings,\n list: emptyList,\n pad: emptyPad,\n progress(bookId: string): BookProgress {\n let p = emptyProgress.get(bookId);\n if (!p) emptyProgress.set(bookId, (p = { bookId, chapters: {} }));\n return p;\n },\n };\n\n // ------------------------------------------------------------- operations\n const api = {\n options,\n adapter,\n server,\n prefix,\n settings,\n highlights,\n bookmarks,\n progress,\n pad,\n\n updateSettings(patch: Partial<Omit<ReaderSettings, \"updatedAt\">>) {\n settings().set((s) => ({ ...s, ...patch, updatedAt: now() }));\n },\n resetSettings() {\n settings().set({ ...defaultSettings, updatedAt: now() });\n },\n\n addHighlight(input: { bookId: string; chapterId: string; anchor: Anchor; color?: string; note?: string }): Highlight {\n const t = now();\n const h: Highlight = {\n id: newId(),\n bookId: input.bookId,\n chapterId: input.chapterId,\n anchor: input.anchor,\n color: input.color ?? options.defaultHighlightColor,\n ...(input.note ? { note: input.note } : {}),\n createdAt: t,\n updatedAt: t,\n };\n highlights(input.bookId).set((list) => [...list, h]);\n return h;\n },\n updateHighlight(bookId: string, id: string, patch: Partial<Pick<Highlight, \"color\" | \"note\" | \"anchor\">>) {\n highlights(bookId).set((list) =>\n list.map((h) => {\n if (h.id !== id) return h;\n const next: Highlight = { ...h, ...patch, updatedAt: now() };\n if (patch.note !== undefined && !patch.note.trim()) delete next.note;\n return next;\n }),\n );\n },\n removeHighlight(bookId: string, id: string) {\n highlights(bookId).set((list) => list.filter((h) => h.id !== id));\n },\n\n addBookmark(input: Omit<Bookmark, \"id\" | \"createdAt\" | \"updatedAt\">): Bookmark {\n const t = now();\n const b: Bookmark = { ...input, id: newId(), createdAt: t, updatedAt: t };\n bookmarks(input.bookId).set((list) => [...list, b]);\n return b;\n },\n removeBookmark(bookId: string, id: string) {\n bookmarks(bookId).set((list) => list.filter((b) => b.id !== id));\n },\n findChapterBookmark(bookId: string, chapterId: string): Bookmark | undefined {\n return bookmarks(bookId)\n .get()\n .find((b) => b.chapterId === chapterId && !b.blockId);\n },\n /** Toggle a whole-chapter bookmark. Returns whether the chapter is now bookmarked. */\n toggleChapterBookmark(bookId: string, chapterId: string, label?: string): boolean {\n const existing = api.findChapterBookmark(bookId, chapterId);\n if (existing) {\n api.removeBookmark(bookId, existing.id);\n return false;\n }\n api.addBookmark({ bookId, chapterId, ...(label ? { label } : {}) });\n return true;\n },\n\n recordProgress(bookId: string, chapterId: string, p: { blockId?: string; percent: number }) {\n const t = now();\n const percent = Math.max(0, Math.min(1, p.percent));\n progress(bookId).set((prev) => {\n const old = prev.chapters[chapterId];\n const completed = (old?.completed ?? false) || percent >= options.progress.completeAt;\n if (old && old.blockId === p.blockId && Math.abs(old.percent - percent) < 0.005 && old.completed === completed) {\n return prev;\n }\n return {\n ...prev,\n chapters: {\n ...prev.chapters,\n [chapterId]: { chapterId, blockId: p.blockId, percent, completed, updatedAt: t },\n },\n last: { chapterId, blockId: p.blockId, updatedAt: t },\n };\n });\n },\n markChapterComplete(bookId: string, chapterId: string, completed = true) {\n const t = now();\n progress(bookId).set((prev) => {\n const old = prev.chapters[chapterId];\n return {\n ...prev,\n chapters: {\n ...prev.chapters,\n [chapterId]: {\n chapterId,\n blockId: old?.blockId,\n percent: completed ? 1 : (old?.percent ?? 0),\n completed,\n updatedAt: t,\n },\n },\n };\n });\n },\n\n savePad(scope: PadScope, markdown: string, json?: unknown) {\n pad(scope).set({ markdown, ...(json !== undefined ? { json } : {}), updatedAt: now() });\n },\n /** Append markdown to a pad from outside the editor (drops the JSON cache so the editor re-parses). */\n appendToPad(scope: PadScope, markdown: string) {\n pad(scope).set((p) => ({\n markdown: p.markdown.trim() ? `${p.markdown.replace(/\\s+$/, \"\")}\\n\\n${markdown}\\n` : `${markdown}\\n`,\n updatedAt: now(),\n }));\n },\n clearPad(scope: PadScope) {\n adapter.remove(prefix + padKeySuffix(scope));\n cells.get(prefix + padKeySuffix(scope))?.reload();\n },\n\n /** All storage keys owned by this store's prefix. */\n keys(): string[] {\n return adapter.keys(prefix);\n },\n flush: flushAll,\n connect,\n /** Drop cached cells so the next read comes from storage (used after imports). */\n reloadAll() {\n cells.forEach((c) => {\n c.flush();\n c.reload();\n });\n },\n };\n return api;\n}\n\n/** Markdown blockquote for a passage, optionally linking back to its source. */\nexport function quoteToMarkdown(text: string, opts: { href?: string; note?: string } = {}): string {\n const quote = text\n .trim()\n .split(/\\r?\\n/)\n .map((l) => `> ${l}`)\n .join(\"\\n\");\n const link = opts.href ? `\\n>\\n> — [source](${opts.href})` : \"\";\n const note = opts.note ? `\\n\\n${opts.note}` : \"\";\n return `${quote}${link}${note}`;\n}\n\n/** Markdown snippet used when sending a highlight to the scratchpad. */\nexport function highlightToMarkdown(h: Pick<Highlight, \"anchor\" | \"note\">, href?: string): string {\n return quoteToMarkdown(h.anchor.exact, { href, note: h.note });\n}\n","import {\n isBookmark,\n isHighlight,\n isObj,\n sanitizeList,\n sanitizePad,\n sanitizeProgress,\n sanitizeSettings,\n unwrap,\n wrap,\n type Envelope,\n type RecordType,\n} from \"./schema\";\nimport type { ReaderStore } from \"./store\";\nimport type { Bookmark, BookProgress, Highlight, Pad, ReaderSettings } from \"./types\";\n\nexport const BACKUP_FORMAT = \"zreader-backup\";\n/** Backups written before the rename to zreader; still accepted on import. */\nexport const LEGACY_BACKUP_FORMATS: readonly string[] = [\"alr-backup\"];\nexport const BACKUP_VERSION = 1;\n\nexport interface Backup {\n format: typeof BACKUP_FORMAT | \"alr-backup\";\n schemaVersion: number;\n exportedAt: string;\n /** Keys are store-relative (prefix stripped), values are stored envelopes. */\n records: Record<string, Envelope>;\n}\n\nexport function recordTypeForKey(key: string): RecordType | null {\n if (key === \"settings\") return \"settings\";\n if (key.startsWith(\"pad:\")) return \"pad\";\n const m = /^book:[^:]+:(highlights|bookmarks|progress)$/.exec(key);\n return (m?.[1] as RecordType | undefined) ?? null;\n}\n\nfunction bookIdFromKey(key: string): string {\n return decodeURIComponent(key.split(\":\")[1] ?? \"\");\n}\n\nexport function exportBackup(store: ReaderStore, opts: { bookId?: string } = {}): Backup {\n store.flush();\n const records: Record<string, Envelope> = {};\n for (const fullKey of store.keys()) {\n const key = fullKey.slice(store.prefix.length);\n if (!recordTypeForKey(key)) continue;\n if (opts.bookId) {\n const enc = encodeURIComponent(opts.bookId);\n if (!key.startsWith(`book:${enc}:`) && !key.startsWith(`pad:book:${enc}`) && !key.startsWith(`pad:chapter:${enc}:`))\n continue;\n }\n try {\n const env = JSON.parse(store.adapter.get(fullKey) ?? \"null\");\n if (isObj(env) && typeof env.v === \"number\") records[key] = env as unknown as Envelope;\n } catch {\n /* skip corrupt */\n }\n }\n return { format: BACKUP_FORMAT, schemaVersion: BACKUP_VERSION, exportedAt: new Date().toISOString(), records };\n}\n\nexport class BackupFormatError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BackupFormatError\";\n }\n}\n\nexport function parseBackup(input: string | unknown): Backup {\n let data: unknown = input;\n if (typeof input === \"string\") {\n try {\n data = JSON.parse(input);\n } catch {\n throw new BackupFormatError(\"Backup is not valid JSON\");\n }\n }\n if (!isObj(data) || (data.format !== BACKUP_FORMAT && !LEGACY_BACKUP_FORMATS.includes(String(data.format))))\n throw new BackupFormatError(\"Not a zreader backup\");\n if (typeof data.schemaVersion !== \"number\" || data.schemaVersion > BACKUP_VERSION)\n throw new BackupFormatError(\"Backup was created by a newer version of the reader\");\n if (!isObj(data.records)) throw new BackupFormatError(\"Backup has no records\");\n return data as unknown as Backup;\n}\n\nfunction newer<T extends { updatedAt: string }>(a: T, b: T): T {\n return a.updatedAt >= b.updatedAt ? a : b;\n}\n\nfunction mergeById<T extends { id: string; updatedAt: string }>(local: T[], incoming: T[]): T[] {\n const map = new Map(local.map((x) => [x.id, x]));\n for (const x of incoming) {\n const cur = map.get(x.id);\n map.set(x.id, cur ? newer(cur, x) : x);\n }\n return [...map.values()].sort((a, b) => (a.id < b.id ? -1 : 1));\n}\n\nfunction mergeProgress(local: BookProgress, incoming: BookProgress): BookProgress {\n const chapters = { ...local.chapters };\n for (const [k, v] of Object.entries(incoming.chapters)) {\n const cur = chapters[k];\n chapters[k] = cur ? newer(cur, v) : v;\n }\n const last = local.last && incoming.last ? newer(local.last, incoming.last) : (local.last ?? incoming.last);\n return { bookId: local.bookId, chapters, ...(last ? { last } : {}) };\n}\n\nexport interface ImportResult {\n imported: number;\n skipped: number;\n}\n\n/**\n * Import a backup. `merge` (default) unions lists by id and keeps the most recently\n * updated version of every record; `replace` wipes this store's keys first.\n */\nexport function importBackup(\n store: ReaderStore,\n input: string | Backup,\n opts: { mode?: \"merge\" | \"replace\" } = {},\n): ImportResult {\n const backup = parseBackup(input);\n const mode = opts.mode ?? \"merge\";\n store.flush();\n if (mode === \"replace\") for (const k of store.keys()) store.adapter.remove(k);\n\n let imported = 0;\n let skipped = 0;\n const defaults = sanitizeSettings(undefined, store.settings().get());\n\n for (const [key, env] of Object.entries(backup.records)) {\n const type = recordTypeForKey(key);\n if (!type) {\n skipped++;\n continue;\n }\n const data = unwrap(type, JSON.stringify(env));\n if (data === undefined) {\n skipped++;\n continue;\n }\n const fullKey = store.prefix + key;\n const localRaw = mode === \"merge\" ? unwrap(type, store.adapter.get(fullKey)) : undefined;\n let out: unknown;\n switch (type) {\n case \"highlights\":\n out = mergeById<Highlight>(sanitizeList(localRaw, isHighlight), sanitizeList(data, isHighlight));\n break;\n case \"bookmarks\":\n out = mergeById<Bookmark>(sanitizeList(localRaw, isBookmark), sanitizeList(data, isBookmark));\n break;\n case \"progress\": {\n const id = bookIdFromKey(key);\n out = mergeProgress(sanitizeProgress(localRaw, id), sanitizeProgress(data, id));\n break;\n }\n case \"pad\": {\n const inc = sanitizePad(data);\n const loc = sanitizePad(localRaw);\n if (!inc) {\n skipped++;\n continue;\n }\n out = loc ? newer<Pad>(loc, inc) : inc;\n break;\n }\n case \"settings\": {\n const inc = sanitizeSettings(data, defaults);\n out = localRaw === undefined ? inc : newer<ReaderSettings>(sanitizeSettings(localRaw, defaults), inc);\n break;\n }\n }\n try {\n store.adapter.set(fullKey, wrap(type, out));\n imported++;\n } catch {\n skipped++;\n }\n }\n store.reloadAll();\n return { imported, skipped };\n}\n\n/** Human-readable export of a book's highlights and notes. */\nexport function highlightsToMarkdown(\n title: string,\n highlights: Highlight[],\n chapterTitle: (chapterId: string) => string = (c) => c,\n): string {\n const byChapter = new Map<string, Highlight[]>();\n for (const h of highlights) {\n const list = byChapter.get(h.chapterId) ?? [];\n list.push(h);\n byChapter.set(h.chapterId, list);\n }\n const out = [`# ${title} — highlights`, \"\"];\n for (const [chapterId, list] of byChapter) {\n out.push(`## ${chapterTitle(chapterId)}`, \"\");\n for (const h of [...list].sort((a, b) => a.anchor.start - b.anchor.start)) {\n out.push(...h.anchor.exact.trim().split(/\\r?\\n/).map((l) => `> ${l}`));\n if (h.note) out.push(\"\", h.note);\n out.push(\"\");\n }\n }\n return out.join(\"\\n\");\n}\n","/**\n * Pure, DOM-free text anchoring helpers. Everything here operates on the\n * concatenated text of a chapter so it can be unit-tested in Node.\n */\nimport search from \"approx-string-match\";\nimport type { Anchor } from \"./types\";\n\nexport const CONTEXT_LENGTH = 32;\n\nexport interface TextSpan {\n start: number;\n end: number;\n}\n\nexport function quoteFor(text: string, start: number, end: number) {\n return {\n exact: text.slice(start, end),\n prefix: text.slice(Math.max(0, start - CONTEXT_LENGTH), start),\n suffix: text.slice(end, end + CONTEXT_LENGTH),\n };\n}\n\n/** Length of the common suffix of `a` and common prefix of `b`, used to score context. */\nfunction commonSuffixLen(a: string, b: string): number {\n let i = 0;\n while (i < a.length && i < b.length && a[a.length - 1 - i] === b[b.length - 1 - i]) i++;\n return i;\n}\nfunction commonPrefixLen(a: string, b: string): number {\n let i = 0;\n while (i < a.length && i < b.length && a[i] === b[i]) i++;\n return i;\n}\n\nfunction score(text: string, anchor: Anchor, start: number, end: number, errors = 0): number {\n const prefix = text.slice(Math.max(0, start - CONTEXT_LENGTH), start);\n const suffix = text.slice(end, end + CONTEXT_LENGTH);\n const ctx = commonSuffixLen(prefix, anchor.prefix) + commonPrefixLen(suffix, anchor.suffix);\n const distance = Math.abs(start - anchor.start) / Math.max(1, text.length);\n return ctx * 2 - errors * 4 - distance * 10;\n}\n\nexport type ResolveStrategy = \"position\" | \"block\" | \"quote\" | \"fuzzy\";\n\n/**\n * Re-anchor a stored anchor in (possibly edited) chapter text.\n * `blockOffset` is the current text offset of the anchor's block, if it still exists.\n */\nexport function resolveInText(\n text: string,\n anchor: Anchor,\n blockOffset?: number,\n): (TextSpan & { strategy: ResolveStrategy }) | null {\n const { exact } = anchor;\n if (!exact) return null;\n\n // 1. Position still points at the same quote.\n if (text.slice(anchor.start, anchor.end) === exact) return { start: anchor.start, end: anchor.end, strategy: \"position\" };\n\n // 2. Same block, same relative offset.\n if (blockOffset !== undefined) {\n const s = blockOffset + anchor.blockStart;\n if (text.slice(s, s + exact.length) === exact) return { start: s, end: s + exact.length, strategy: \"block\" };\n }\n\n // 3. Exact quote elsewhere; disambiguate by context and proximity.\n let best: (TextSpan & { score: number }) | null = null;\n for (let i = text.indexOf(exact); i !== -1; i = text.indexOf(exact, i + 1)) {\n const sc = score(text, anchor, i, i + exact.length);\n if (!best || sc > best.score) best = { start: i, end: i + exact.length, score: sc };\n }\n if (best) return { start: best.start, end: best.end, strategy: \"quote\" };\n\n // 4. Fuzzy match for lightly edited passages.\n if (exact.length < 8) return null;\n const maxErrors = Math.min(64, Math.floor(exact.length * 0.15));\n const matches = search(text, exact, maxErrors);\n let fuzzy: (TextSpan & { score: number }) | null = null;\n for (const m of matches) {\n const sc = score(text, anchor, m.start, m.end, m.errors);\n if (!fuzzy || sc > fuzzy.score) fuzzy = { start: m.start, end: m.end, score: sc };\n }\n return fuzzy ? { start: fuzzy.start, end: fuzzy.end, strategy: \"fuzzy\" } : null;\n}\n\n// --------------------------------------------------------------- sentences\n\ntype Segment = { index: number; segment: string };\n\nfunction segmentSentences(text: string, locale?: string): Segment[] {\n const Seg = (Intl as unknown as { Segmenter?: typeof Intl.Segmenter }).Segmenter;\n if (Seg) {\n return [...new Seg(locale, { granularity: \"sentence\" }).segment(text)].map((s) => ({\n index: s.index,\n segment: s.segment,\n }));\n }\n // Fallback: split after terminal punctuation followed by whitespace.\n const out: Segment[] = [];\n const re = /[^.!?…]*(?:[.!?…]+[\"'”’)\\]]*|$)\\s*/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text)) && m[0]) {\n out.push({ index: m.index, segment: m[0] });\n }\n return out;\n}\n\nfunction trimSpan(text: string, start: number, end: number): TextSpan {\n while (start < end && /\\s/.test(text[start] ?? \"\")) start++;\n while (end > start && /\\s/.test(text[end - 1] ?? \"\")) end--;\n return { start, end };\n}\n\n/**\n * Sentence containing `offset` within `blockText`. Offsets are block-relative.\n */\nexport function sentenceAt(blockText: string, offset: number, locale?: string): TextSpan {\n const segs = segmentSentences(blockText, locale);\n const clamped = Math.max(0, Math.min(offset, Math.max(0, blockText.length - 1)));\n for (const s of segs) {\n if (clamped >= s.index && clamped < s.index + s.segment.length) {\n return trimSpan(blockText, s.index, s.index + s.segment.length);\n }\n }\n return trimSpan(blockText, 0, blockText.length);\n}\n\n/** Expand a block-relative span so it covers whole sentences. */\nexport function expandToSentences(blockText: string, start: number, end: number, locale?: string): TextSpan {\n const a = sentenceAt(blockText, start, locale);\n const b = sentenceAt(blockText, Math.max(start, end - 1), locale);\n return { start: Math.min(a.start, b.start), end: Math.max(a.end, b.end) };\n}\n\nconst WORD = /[\\p{L}\\p{N}_'’-]/u;\n\n/** Expand a span so it doesn't cut words in half, and trim surrounding whitespace. */\nexport function snapToWords(text: string, start: number, end: number): TextSpan {\n while (start > 0 && WORD.test(text[start - 1] ?? \"\") && WORD.test(text[start] ?? \"\")) start--;\n while (end < text.length && WORD.test(text[end] ?? \"\") && WORD.test(text[end - 1] ?? \"\")) end++;\n return trimSpan(text, start, end);\n}\n","/**\n * DOM side of anchoring: map between Ranges and chapter text offsets,\n * resolve stored anchors, paint highlights (CSS Custom Highlight API) and\n * hit-test taps. Never mutates the content DOM, so it is\n * safe with React-rendered (MDX) and server-rendered (HTML) chapters alike.\n */\nimport { quoteFor, resolveInText, sentenceAt, snapToWords, type TextSpan } from \"./text\";\nimport { BLOCK_TAGS, createBlockIdAllocator, createSlugger, normalizeBlockText } from \"./blocks\";\nimport type { Anchor, Highlight, TocEntry } from \"./types\";\n\nexport const BLOCK_ATTR = \"data-block-id\";\nexport const IGNORE_ATTR = \"data-zr-ignore\";\n\ninterface Entry {\n node: Text;\n start: number;\n end: number;\n}\n\nexport interface TextIndex {\n root: Element;\n text: string;\n entries: Entry[];\n}\n\nconst BLOCK_SELECTOR = Array.from(BLOCK_TAGS).join(\",\");\nconst HEADING_TAG = /^H([1-6])$/;\n\n/**\n * Give blocks and headings the ids the build-time plugin would have given them\n * (`zreader/rehype`), for content rendered without it: MDX compiled\n * by your bundler, JSX, third-party HTML. Same traversal order, same hash, so ids\n * match either way. No-op when the content already carries block ids.\n * Only adds attributes; never changes text or structure.\n */\nexport function ensureBlockIds(root: Element): { assigned: number } {\n if (root.querySelector(`[${BLOCK_ATTR}]`)) return { assigned: 0 };\n const allocate = createBlockIdAllocator();\n const slugger = createSlugger();\n let assigned = 0;\n for (const el of Array.from(root.querySelectorAll(BLOCK_SELECTOR))) {\n const text = normalizeBlockText(el.textContent ?? \"\");\n if (HEADING_TAG.test(el.tagName)) {\n const existing = el.getAttribute(\"id\");\n if (existing) slugger.keep(existing);\n else el.setAttribute(\"id\", slugger.slug(text));\n }\n if (el.querySelector(BLOCK_SELECTOR)) continue; // only innermost blocks are anchors\n if (!text) continue;\n el.setAttribute(BLOCK_ATTR, allocate(el.tagName, text));\n assigned++;\n }\n return { assigned };\n}\n\n/** Table of contents from the headings in `root` (those with an `id`). */\nexport function collectToc(root: Element, depth: [min: number, max: number] = [2, 3]): TocEntry[] {\n const out: TocEntry[] = [];\n for (const el of Array.from(root.querySelectorAll(\"h1,h2,h3,h4,h5,h6\"))) {\n const d = Number(HEADING_TAG.exec(el.tagName)?.[1] ?? 0);\n const id = el.getAttribute(\"id\");\n const text = normalizeBlockText(el.textContent ?? \"\");\n if (id && text && d >= depth[0] && d <= depth[1]) out.push({ id, depth: d, text });\n }\n return out;\n}\n\nexport function buildTextIndex(root: Element): TextIndex {\n const entries: Entry[] = [];\n let text = \"\";\n const doc = root.ownerDocument;\n const walker = doc.createTreeWalker(root, 4 /* NodeFilter.SHOW_TEXT */, {\n acceptNode(node) {\n const parent = node.parentElement;\n if (!parent) return 2; // FILTER_REJECT\n if (parent.closest(`[${IGNORE_ATTR}],script,style,noscript,template`)) return 2;\n return 1; // FILTER_ACCEPT\n },\n });\n for (let n = walker.nextNode(); n; n = walker.nextNode()) {\n const t = n as Text;\n const len = t.data.length;\n if (!len) continue;\n entries.push({ node: t, start: text.length, end: text.length + len });\n text += t.data;\n }\n return { root, text, entries };\n}\n\n/** Text offset of a DOM boundary point. */\nexport function pointToOffset(index: TextIndex, container: Node, offset: number): number {\n if (container.nodeType === 3) {\n const e = index.entries.find((x) => x.node === container);\n if (e) return e.start + Math.min(offset, e.end - e.start);\n }\n // Element (or ignored text) boundary: first indexed text node at/after the point.\n const doc = index.root.ownerDocument;\n const probe = doc.createRange();\n probe.setStart(container, offset);\n probe.collapse(true);\n let lo = 0;\n let hi = index.entries.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n const node = index.entries[mid]!.node;\n // comparePoint returns -1 if the point (node,0) is before the probe.\n let cmp: number;\n try {\n cmp = probe.comparePoint(node, 0);\n } catch {\n cmp = 1;\n }\n if (cmp < 0 && !(container.nodeType === 3 && node === container)) lo = mid + 1;\n else hi = mid;\n }\n // If the boundary is inside the text node at lo-1 (e.g. ignored sibling), clamp to its end.\n return lo < index.entries.length ? index.entries[lo]!.start : index.text.length;\n}\n\nexport function offsetToPoint(index: TextIndex, offset: number, preferNext = false): { node: Text; offset: number } | null {\n const { entries } = index;\n if (!entries.length) return null;\n let lo = 0;\n let hi = entries.length - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (entries[mid]!.end < offset || (preferNext && entries[mid]!.end === offset)) lo = mid + 1;\n else hi = mid;\n }\n const e = entries[lo]!;\n return { node: e.node, offset: Math.max(0, Math.min(offset - e.start, e.end - e.start)) };\n}\n\nexport function rangeToSpan(index: TextIndex, range: Range): TextSpan | null {\n if (!index.root.contains(range.commonAncestorContainer) && range.commonAncestorContainer !== index.root) {\n // Clip to root.\n const r = range.cloneRange();\n try {\n if (!index.root.contains(r.startContainer)) r.setStart(index.root, 0);\n if (!index.root.contains(r.endContainer)) r.setEnd(index.root, index.root.childNodes.length);\n } catch {\n return null;\n }\n range = r;\n }\n const start = pointToOffset(index, range.startContainer, range.startOffset);\n const end = pointToOffset(index, range.endContainer, range.endOffset);\n return end > start ? { start, end } : null;\n}\n\nexport function spanToRange(index: TextIndex, span: TextSpan): Range | null {\n const a = offsetToPoint(index, span.start, true);\n const b = offsetToPoint(index, span.end);\n if (!a || !b) return null;\n const r = index.root.ownerDocument.createRange();\n r.setStart(a.node, a.offset);\n r.setEnd(b.node, b.offset);\n return r;\n}\n\nexport function blockElementAt(index: TextIndex, offset: number): Element | null {\n const p = offsetToPoint(index, offset, true);\n return p?.node.parentElement?.closest(`[${BLOCK_ATTR}]`) ?? null;\n}\n\n/** Text span covered by a block element. */\nexport function blockSpan(index: TextIndex, el: Element): TextSpan | null {\n let start = -1;\n let end = -1;\n for (const e of index.entries) {\n if (el.contains(e.node)) {\n if (start < 0) start = e.start;\n end = e.end;\n } else if (start >= 0) break;\n }\n return start < 0 ? null : { start, end };\n}\n\nexport function findBlock(root: Element, blockId: string): Element | null {\n const esc = typeof CSS !== \"undefined\" && CSS.escape ? CSS.escape(blockId) : blockId.replace(/\"/g, '\\\\\"');\n return root.querySelector(`[${BLOCK_ATTR}=\"${esc}\"]`);\n}\n\nexport function describeSpan(index: TextIndex, span: TextSpan, contentHash?: string): Anchor | null {\n const block = blockElementAt(index, span.start);\n if (!block) return null;\n const bs = blockSpan(index, block);\n const q = quoteFor(index.text, span.start, span.end);\n return {\n blockId: block.getAttribute(BLOCK_ATTR) ?? \"\",\n blockStart: span.start - (bs?.start ?? 0),\n start: span.start,\n end: span.end,\n ...q,\n ...(contentHash ? { contentHash } : {}),\n };\n}\n\nexport function resolveAnchor(index: TextIndex, anchor: Anchor): TextSpan | null {\n const block = anchor.blockId ? findBlock(index.root, anchor.blockId) : null;\n const bs = block ? blockSpan(index, block) : null;\n return resolveInText(index.text, anchor, bs?.start);\n}\n\n/** Selection → word-snapped span inside root, or null. */\nexport function selectionSpan(index: TextIndex, selection: Selection | null): TextSpan | null {\n if (!selection || selection.rangeCount === 0 || selection.isCollapsed) return null;\n const range = selection.getRangeAt(0);\n if (!index.root.contains(range.commonAncestorContainer) && !range.intersectsNode(index.root)) return null;\n const span = rangeToSpan(index, range);\n if (!span) return null;\n const snapped = snapToWords(index.text, span.start, span.end);\n return snapped.end > snapped.start ? snapped : null;\n}\n\n/** Sentence (chapter-relative span) at a chapter text offset. */\nexport function sentenceSpanAt(index: TextIndex, offset: number, locale?: string): TextSpan | null {\n const block = blockElementAt(index, offset);\n const bs = block ? blockSpan(index, block) : { start: 0, end: index.text.length };\n if (!bs) return null;\n const local = sentenceAt(index.text.slice(bs.start, bs.end), offset - bs.start, locale);\n return local.end > local.start ? { start: bs.start + local.start, end: bs.start + local.end } : null;\n}\n\n/** Expand a chapter-relative span to whole sentences (within the start and end blocks). */\nexport function expandSpanToSentences(index: TextIndex, span: TextSpan, locale?: string): TextSpan {\n const a = sentenceSpanAt(index, span.start, locale);\n const b = sentenceSpanAt(index, Math.max(span.start, span.end - 1), locale);\n return { start: Math.min(a?.start ?? span.start, b?.start ?? span.start), end: Math.max(a?.end ?? span.end, b?.end ?? span.end) };\n}\n\n/** Chapter text offset under a viewport point (tap / click). */\nexport function offsetFromPoint(index: TextIndex, x: number, y: number): number | null {\n const doc = index.root.ownerDocument as Document & {\n caretPositionFromPoint?: (x: number, y: number) => { offsetNode: Node; offset: number } | null;\n caretRangeFromPoint?: (x: number, y: number) => Range | null;\n };\n let node: Node | null = null;\n let off = 0;\n if (doc.caretPositionFromPoint) {\n const p = doc.caretPositionFromPoint(x, y);\n if (p) {\n node = p.offsetNode;\n off = p.offset;\n }\n } else if (doc.caretRangeFromPoint) {\n const r = doc.caretRangeFromPoint(x, y);\n if (r) {\n node = r.startContainer;\n off = r.startOffset;\n }\n }\n if (!node || !index.root.contains(node)) return null;\n return pointToOffset(index, node, off);\n}\n\n// ------------------------------------------------------------- painting\n\nexport interface ResolvedHighlight {\n highlight: Highlight;\n span: TextSpan;\n range: Range;\n}\n\nexport function supportsHighlightApi(): boolean {\n return typeof CSS !== \"undefined\" && \"highlights\" in CSS && typeof (globalThis as { Highlight?: unknown }).Highlight === \"function\";\n}\n\ntype HighlightRegistry = Map<string, unknown>;\ntype HighlightCtor = new (...ranges: Range[]) => unknown;\n\n/** Registry names used for painting: `::highlight(zr-<color>)` and `::highlight(zr-active)`. */\nexport function highlightName(color: string, namespace = \"zr\"): string {\n return `${namespace}-${color}`;\n}\n\n/**\n * Paint highlights with the CSS Custom Highlight API. The DOM is never mutated\n * and no inline styles are written; colours come from `::highlight()` rules in\n * the stylesheet. Returns a cleanup function (no-op where unsupported).\n */\nexport function paintHighlights(\n resolved: ResolvedHighlight[],\n opts: { activeId?: string | null; namespace?: string } = {},\n): () => void {\n if (!supportsHighlightApi()) return () => {};\n const ns = opts.namespace ?? \"zr\";\n const byName = new Map<string, Range[]>();\n for (const r of resolved) {\n const name = highlightName(r.highlight.id === opts.activeId ? \"active\" : r.highlight.color, ns);\n const list = byName.get(name) ?? [];\n list.push(r.range);\n byName.set(name, list);\n }\n const registry = (CSS as unknown as { highlights: HighlightRegistry }).highlights;\n const Ctor = (globalThis as unknown as { Highlight: HighlightCtor }).Highlight;\n for (const [name, ranges] of byName) registry.set(name, new Ctor(...ranges));\n return () => byName.forEach((_, name) => registry.delete(name));\n}\n\nexport function highlightAtOffset(resolved: ResolvedHighlight[], offset: number): ResolvedHighlight | null {\n // Prefer the shortest highlight covering the offset (most specific).\n let best: ResolvedHighlight | null = null;\n for (const r of resolved) {\n if (offset >= r.span.start && offset < r.span.end) {\n if (!best || r.span.end - r.span.start < best.span.end - best.span.start) best = r;\n }\n }\n return best;\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import * as react from 'react';
2
+ import { PadScope } from 'zreader';
3
+
4
+ interface ScratchpadEditorProps {
5
+ scope: PadScope;
6
+ placeholder?: string;
7
+ autoFocus?: boolean;
8
+ onFocus?: () => void;
9
+ className?: string;
10
+ }
11
+ /**
12
+ * WYSIWYG markdown scratchpad (Tiptap v3). Markdown is the stored format; the
13
+ * editor JSON is cached alongside it for lossless reloads. Typing `- [ ] `
14
+ * creates a checklist item, `# ` a heading, `> ` a quote, and so on.
15
+ */
16
+ declare function ScratchpadEditor({ scope, placeholder, autoFocus, onFocus, className }: ScratchpadEditorProps): react.JSX.Element | null;
17
+
18
+ export { ScratchpadEditor, ScratchpadEditor as default };
19
+ export type { ScratchpadEditorProps };
@@ -0,0 +1,277 @@
1
+ "use client";
2
+ import { useRef, useEffect } from 'react';
3
+ import { useEditor, EditorContent, useEditorState } from '@tiptap/react';
4
+ import StarterKit from '@tiptap/starter-kit';
5
+ import { TaskList, TaskItem } from '@tiptap/extension-list';
6
+ import { Placeholder } from '@tiptap/extensions';
7
+ import { Markdown } from '@tiptap/markdown';
8
+ import { cn } from 'cn';
9
+ import { ListChecksIcon, ListIcon, ListOrderedIcon, BoldIcon, ItalicIcon, StrikethroughIcon, CodeIcon, Heading2Icon, Heading3Icon, QuoteIcon, SquareCodeIcon, Undo2Icon, Redo2Icon } from 'lucide-react';
10
+ import { useReader, usePad } from 'zreader/react';
11
+ import { cva } from 'class-variance-authority';
12
+ import { Separator as Separator$1, Tooltip as Tooltip$1, Slot, Toggle as Toggle$1 } from 'radix-ui';
13
+ import { jsxs, jsx } from 'react/jsx-runtime';
14
+
15
+ // src/editor/index.tsx
16
+ var buttonVariants = cva(
17
+ "inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
18
+ {
19
+ variants: {
20
+ variant: {
21
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
22
+ destructive: "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",
23
+ outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
24
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
25
+ ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
26
+ link: "text-primary underline-offset-4 hover:underline"
27
+ },
28
+ size: {
29
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
30
+ xs: "h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
31
+ sm: "h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",
32
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
33
+ icon: "size-9",
34
+ "icon-xs": "size-6 rounded-md [&_svg:not([class*='size-'])]:size-3",
35
+ "icon-sm": "size-8",
36
+ "icon-lg": "size-10"
37
+ }
38
+ },
39
+ defaultVariants: {
40
+ variant: "default",
41
+ size: "default"
42
+ }
43
+ }
44
+ );
45
+ function Button({
46
+ className,
47
+ variant = "default",
48
+ size = "default",
49
+ asChild = false,
50
+ ...props
51
+ }) {
52
+ const Comp = asChild ? Slot.Root : "button";
53
+ return /* @__PURE__ */ jsx(
54
+ Comp,
55
+ {
56
+ "data-slot": "button",
57
+ "data-variant": variant,
58
+ "data-size": size,
59
+ className: cn(buttonVariants({ variant, size, className })),
60
+ ...props
61
+ }
62
+ );
63
+ }
64
+ function Separator({
65
+ className,
66
+ orientation = "horizontal",
67
+ decorative = true,
68
+ ...props
69
+ }) {
70
+ return /* @__PURE__ */ jsx(
71
+ Separator$1.Root,
72
+ {
73
+ "data-slot": "separator",
74
+ decorative,
75
+ orientation,
76
+ className: cn(
77
+ "shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
78
+ className
79
+ ),
80
+ ...props
81
+ }
82
+ );
83
+ }
84
+ var toggleVariants = cva(
85
+ "inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-[color,box-shadow] outline-none hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
86
+ {
87
+ variants: {
88
+ variant: {
89
+ default: "bg-transparent",
90
+ outline: "border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground"
91
+ },
92
+ size: {
93
+ default: "h-9 min-w-9 px-2",
94
+ sm: "h-8 min-w-8 px-1.5",
95
+ lg: "h-10 min-w-10 px-2.5"
96
+ }
97
+ },
98
+ defaultVariants: {
99
+ variant: "default",
100
+ size: "default"
101
+ }
102
+ }
103
+ );
104
+ function Toggle({
105
+ className,
106
+ variant,
107
+ size,
108
+ ...props
109
+ }) {
110
+ return /* @__PURE__ */ jsx(
111
+ Toggle$1.Root,
112
+ {
113
+ "data-slot": "toggle",
114
+ className: cn(toggleVariants({ variant, size, className })),
115
+ ...props
116
+ }
117
+ );
118
+ }
119
+ function Tooltip({
120
+ ...props
121
+ }) {
122
+ return /* @__PURE__ */ jsx(Tooltip$1.Root, { "data-slot": "tooltip", ...props });
123
+ }
124
+ function TooltipTrigger({
125
+ ...props
126
+ }) {
127
+ return /* @__PURE__ */ jsx(Tooltip$1.Trigger, { "data-slot": "tooltip-trigger", ...props });
128
+ }
129
+ function TooltipContent({
130
+ className,
131
+ sideOffset = 0,
132
+ children,
133
+ ...props
134
+ }) {
135
+ return /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsxs(
136
+ Tooltip$1.Content,
137
+ {
138
+ "data-slot": "tooltip-content",
139
+ sideOffset,
140
+ className: cn(
141
+ "z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-3 py-1.5 text-xs text-balance text-background fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
142
+ className
143
+ ),
144
+ ...props,
145
+ children: [
146
+ children,
147
+ /* @__PURE__ */ jsx(Tooltip$1.Arrow, { className: "z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground" })
148
+ ]
149
+ }
150
+ ) });
151
+ }
152
+ function Mark({ label, pressed, onPressed, disabled, children }) {
153
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [
154
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(Toggle, { size: "sm", "aria-label": label, pressed, onPressedChange: onPressed, disabled, children }) }),
155
+ /* @__PURE__ */ jsx(TooltipContent, { children: label })
156
+ ] });
157
+ }
158
+ function Toolbar({ editor }) {
159
+ const s = useEditorState({
160
+ editor,
161
+ selector: ({ editor: e }) => ({
162
+ bold: e.isActive("bold"),
163
+ italic: e.isActive("italic"),
164
+ strike: e.isActive("strike"),
165
+ code: e.isActive("code"),
166
+ h2: e.isActive("heading", { level: 2 }),
167
+ h3: e.isActive("heading", { level: 3 }),
168
+ bullet: e.isActive("bulletList"),
169
+ ordered: e.isActive("orderedList"),
170
+ task: e.isActive("taskList"),
171
+ quote: e.isActive("blockquote"),
172
+ codeBlock: e.isActive("codeBlock"),
173
+ canUndo: e.can().undo(),
174
+ canRedo: e.can().redo()
175
+ })
176
+ });
177
+ const c = () => editor.chain().focus();
178
+ return /* @__PURE__ */ jsxs(
179
+ "div",
180
+ {
181
+ role: "toolbar",
182
+ "aria-label": "Formatting",
183
+ className: "flex items-center gap-0.5 overflow-x-auto border-b bg-background px-2 py-1 [scrollbar-width:none]",
184
+ children: [
185
+ /* @__PURE__ */ jsx(Mark, { label: "Checklist", pressed: s.task, onPressed: () => c().toggleTaskList().run(), children: /* @__PURE__ */ jsx(ListChecksIcon, {}) }),
186
+ /* @__PURE__ */ jsx(Mark, { label: "Bulleted list", pressed: s.bullet, onPressed: () => c().toggleBulletList().run(), children: /* @__PURE__ */ jsx(ListIcon, {}) }),
187
+ /* @__PURE__ */ jsx(Mark, { label: "Numbered list", pressed: s.ordered, onPressed: () => c().toggleOrderedList().run(), children: /* @__PURE__ */ jsx(ListOrderedIcon, {}) }),
188
+ /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-1 h-5" }),
189
+ /* @__PURE__ */ jsx(Mark, { label: "Bold", pressed: s.bold, onPressed: () => c().toggleBold().run(), children: /* @__PURE__ */ jsx(BoldIcon, {}) }),
190
+ /* @__PURE__ */ jsx(Mark, { label: "Italic", pressed: s.italic, onPressed: () => c().toggleItalic().run(), children: /* @__PURE__ */ jsx(ItalicIcon, {}) }),
191
+ /* @__PURE__ */ jsx(Mark, { label: "Strikethrough", pressed: s.strike, onPressed: () => c().toggleStrike().run(), children: /* @__PURE__ */ jsx(StrikethroughIcon, {}) }),
192
+ /* @__PURE__ */ jsx(Mark, { label: "Inline code", pressed: s.code, onPressed: () => c().toggleCode().run(), children: /* @__PURE__ */ jsx(CodeIcon, {}) }),
193
+ /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-1 h-5" }),
194
+ /* @__PURE__ */ jsx(Mark, { label: "Heading", pressed: s.h2, onPressed: () => c().toggleHeading({ level: 2 }).run(), children: /* @__PURE__ */ jsx(Heading2Icon, {}) }),
195
+ /* @__PURE__ */ jsx(Mark, { label: "Subheading", pressed: s.h3, onPressed: () => c().toggleHeading({ level: 3 }).run(), children: /* @__PURE__ */ jsx(Heading3Icon, {}) }),
196
+ /* @__PURE__ */ jsx(Mark, { label: "Quote", pressed: s.quote, onPressed: () => c().toggleBlockquote().run(), children: /* @__PURE__ */ jsx(QuoteIcon, {}) }),
197
+ /* @__PURE__ */ jsx(Mark, { label: "Code block", pressed: s.codeBlock, onPressed: () => c().toggleCodeBlock().run(), children: /* @__PURE__ */ jsx(SquareCodeIcon, {}) }),
198
+ /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-1 h-5" }),
199
+ /* @__PURE__ */ jsxs(Tooltip, { children: [
200
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", "aria-label": "Undo", disabled: !s.canUndo, onClick: () => c().undo().run(), children: /* @__PURE__ */ jsx(Undo2Icon, {}) }) }),
201
+ /* @__PURE__ */ jsx(TooltipContent, { children: "Undo" })
202
+ ] }),
203
+ /* @__PURE__ */ jsxs(Tooltip, { children: [
204
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", "aria-label": "Redo", disabled: !s.canRedo, onClick: () => c().redo().run(), children: /* @__PURE__ */ jsx(Redo2Icon, {}) }) }),
205
+ /* @__PURE__ */ jsx(TooltipContent, { children: "Redo" })
206
+ ] })
207
+ ]
208
+ }
209
+ );
210
+ }
211
+ function ScratchpadEditor({ scope, placeholder = "Jot notes, ideas and to-dos\u2026 Type \u201C- [ ]\u201D for a checklist.", autoFocus, onFocus, className }) {
212
+ const { store } = useReader();
213
+ const pad = usePad(scope);
214
+ const lastWritten = useRef(pad.markdown);
215
+ const saveTimer = useRef(void 0);
216
+ const editor = useEditor({
217
+ immediatelyRender: false,
218
+ shouldRerenderOnTransaction: false,
219
+ autofocus: autoFocus ? "end" : false,
220
+ extensions: [
221
+ StarterKit.configure({ link: { openOnClick: false, autolink: true } }),
222
+ TaskList,
223
+ TaskItem.configure({ nested: true }),
224
+ Placeholder.configure({ placeholder }),
225
+ Markdown
226
+ ],
227
+ content: pad.json ?? pad.markdown,
228
+ contentType: pad.json ? "json" : "markdown",
229
+ editorProps: {
230
+ attributes: {
231
+ class: cn(
232
+ "prose prose-sm max-w-none min-h-full px-4 py-3 text-foreground outline-none",
233
+ "prose-headings:text-foreground prose-p:my-1.5 prose-p:text-foreground prose-li:text-foreground prose-strong:text-foreground prose-code:text-foreground prose-a:text-primary prose-blockquote:text-muted-foreground prose-blockquote:border-l-border prose-pre:bg-muted prose-pre:text-foreground"
234
+ ),
235
+ "aria-label": "Scratchpad",
236
+ "aria-multiline": "true",
237
+ role: "textbox"
238
+ }
239
+ },
240
+ onFocus: () => onFocus?.(),
241
+ onUpdate: ({ editor: e }) => {
242
+ clearTimeout(saveTimer.current);
243
+ saveTimer.current = setTimeout(() => {
244
+ const md = e.getMarkdown();
245
+ lastWritten.current = md;
246
+ store.savePad(scope, md, e.getJSON());
247
+ }, 300);
248
+ }
249
+ });
250
+ useEffect(
251
+ () => () => {
252
+ clearTimeout(saveTimer.current);
253
+ if (editor && !editor.isDestroyed && lastWritten.current !== editor.getMarkdown()) {
254
+ store.savePad(scope, editor.getMarkdown(), editor.getJSON());
255
+ }
256
+ },
257
+ [editor, store, scope]
258
+ );
259
+ useEffect(() => {
260
+ if (!editor || editor.isDestroyed) return;
261
+ if (pad.markdown === lastWritten.current) return;
262
+ if (pad.json === void 0 || !editor.isFocused) {
263
+ editor.commands.setContent(pad.json ?? pad.markdown, { contentType: pad.json ? "json" : "markdown", emitUpdate: false });
264
+ lastWritten.current = pad.markdown;
265
+ }
266
+ }, [editor, pad]);
267
+ if (!editor) return null;
268
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex h-full min-h-0 flex-col", className), children: [
269
+ /* @__PURE__ */ jsx(Toolbar, { editor }),
270
+ /* @__PURE__ */ jsx(EditorContent, { editor, className: "zr-editor min-h-0 flex-1 overflow-y-auto overscroll-contain" })
271
+ ] });
272
+ }
273
+ var editor_default = ScratchpadEditor;
274
+
275
+ export { ScratchpadEditor, editor_default as default };
276
+ //# sourceMappingURL=index.js.map
277
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/components/ui/button.tsx","../../src/react/components/ui/separator.tsx","../../src/react/components/ui/toggle.tsx","../../src/react/components/ui/tooltip.tsx","../../src/editor/index.tsx"],"names":["jsx","SeparatorPrimitive","cn","cva","TogglePrimitive","TooltipPrimitive","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\nimport { Slot } from \"radix-ui\"\n\nconst buttonVariants = cva(\n \"inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n xs: \"h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-xs\": \"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\nimport { Toggle as TogglePrimitive } from \"radix-ui\"\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-[color,box-shadow] outline-none hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground\",\n },\n size: {\n default: \"h-9 min-w-9 px-2\",\n sm: \"h-8 min-w-8 px-1.5\",\n lg: \"h-10 min-w-10 px-2.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Toggle({\n className,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n","import * as React from \"react\"\nimport { cn } from \"cn\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-3 py-1.5 text-xs text-balance text-background fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import { useEffect, useRef, type ReactNode } from \"react\";\nimport { EditorContent, useEditor, useEditorState, type Editor } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport { TaskItem, TaskList } from \"@tiptap/extension-list\";\nimport { Placeholder } from \"@tiptap/extensions\";\nimport { Markdown } from \"@tiptap/markdown\";\nimport { cn } from \"cn\";\nimport {\n BoldIcon,\n CodeIcon,\n Heading2Icon,\n Heading3Icon,\n ItalicIcon,\n ListChecksIcon,\n ListIcon,\n ListOrderedIcon,\n QuoteIcon,\n Redo2Icon,\n SquareCodeIcon,\n StrikethroughIcon,\n Undo2Icon,\n} from \"lucide-react\";\nimport type { PadScope } from \"zreader\";\nimport { useReader, usePad } from \"zreader/react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { Toggle } from \"@/components/ui/toggle\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@/components/ui/tooltip\";\n\nexport interface ScratchpadEditorProps {\n scope: PadScope;\n placeholder?: string;\n autoFocus?: boolean;\n onFocus?: () => void;\n className?: string;\n}\n\nfunction Mark({ label, pressed, onPressed, disabled, children }: { label: string; pressed: boolean; onPressed: () => void; disabled?: boolean; children: ReactNode }) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Toggle size=\"sm\" aria-label={label} pressed={pressed} onPressedChange={onPressed} disabled={disabled}>\n {children}\n </Toggle>\n </TooltipTrigger>\n <TooltipContent>{label}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction Toolbar({ editor }: { editor: Editor }) {\n const s = useEditorState({\n editor,\n selector: ({ editor: e }) => ({\n bold: e.isActive(\"bold\"),\n italic: e.isActive(\"italic\"),\n strike: e.isActive(\"strike\"),\n code: e.isActive(\"code\"),\n h2: e.isActive(\"heading\", { level: 2 }),\n h3: e.isActive(\"heading\", { level: 3 }),\n bullet: e.isActive(\"bulletList\"),\n ordered: e.isActive(\"orderedList\"),\n task: e.isActive(\"taskList\"),\n quote: e.isActive(\"blockquote\"),\n codeBlock: e.isActive(\"codeBlock\"),\n canUndo: e.can().undo(),\n canRedo: e.can().redo(),\n }),\n });\n const c = () => editor.chain().focus();\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Formatting\"\n className=\"flex items-center gap-0.5 overflow-x-auto border-b bg-background px-2 py-1 [scrollbar-width:none]\"\n >\n <Mark label=\"Checklist\" pressed={s.task} onPressed={() => c().toggleTaskList().run()}>\n <ListChecksIcon />\n </Mark>\n <Mark label=\"Bulleted list\" pressed={s.bullet} onPressed={() => c().toggleBulletList().run()}>\n <ListIcon />\n </Mark>\n <Mark label=\"Numbered list\" pressed={s.ordered} onPressed={() => c().toggleOrderedList().run()}>\n <ListOrderedIcon />\n </Mark>\n <Separator orientation=\"vertical\" className=\"mx-1 h-5\" />\n <Mark label=\"Bold\" pressed={s.bold} onPressed={() => c().toggleBold().run()}>\n <BoldIcon />\n </Mark>\n <Mark label=\"Italic\" pressed={s.italic} onPressed={() => c().toggleItalic().run()}>\n <ItalicIcon />\n </Mark>\n <Mark label=\"Strikethrough\" pressed={s.strike} onPressed={() => c().toggleStrike().run()}>\n <StrikethroughIcon />\n </Mark>\n <Mark label=\"Inline code\" pressed={s.code} onPressed={() => c().toggleCode().run()}>\n <CodeIcon />\n </Mark>\n <Separator orientation=\"vertical\" className=\"mx-1 h-5\" />\n <Mark label=\"Heading\" pressed={s.h2} onPressed={() => c().toggleHeading({ level: 2 }).run()}>\n <Heading2Icon />\n </Mark>\n <Mark label=\"Subheading\" pressed={s.h3} onPressed={() => c().toggleHeading({ level: 3 }).run()}>\n <Heading3Icon />\n </Mark>\n <Mark label=\"Quote\" pressed={s.quote} onPressed={() => c().toggleBlockquote().run()}>\n <QuoteIcon />\n </Mark>\n <Mark label=\"Code block\" pressed={s.codeBlock} onPressed={() => c().toggleCodeBlock().run()}>\n <SquareCodeIcon />\n </Mark>\n <Separator orientation=\"vertical\" className=\"mx-1 h-5\" />\n <Tooltip>\n <TooltipTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon-sm\" aria-label=\"Undo\" disabled={!s.canUndo} onClick={() => c().undo().run()}>\n <Undo2Icon />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Undo</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon-sm\" aria-label=\"Redo\" disabled={!s.canRedo} onClick={() => c().redo().run()}>\n <Redo2Icon />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Redo</TooltipContent>\n </Tooltip>\n </div>\n );\n}\n\n/**\n * WYSIWYG markdown scratchpad (Tiptap v3). Markdown is the stored format; the\n * editor JSON is cached alongside it for lossless reloads. Typing `- [ ] `\n * creates a checklist item, `# ` a heading, `> ` a quote, and so on.\n */\nexport function ScratchpadEditor({ scope, placeholder = \"Jot notes, ideas and to-dos… Type “- [ ]” for a checklist.\", autoFocus, onFocus, className }: ScratchpadEditorProps) {\n const { store } = useReader();\n const pad = usePad(scope);\n const lastWritten = useRef<string | null>(pad.markdown);\n const saveTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n const editor = useEditor({\n immediatelyRender: false,\n shouldRerenderOnTransaction: false,\n autofocus: autoFocus ? \"end\" : false,\n extensions: [\n StarterKit.configure({ link: { openOnClick: false, autolink: true } }),\n TaskList,\n TaskItem.configure({ nested: true }),\n Placeholder.configure({ placeholder }),\n Markdown,\n ],\n content: pad.json ?? pad.markdown,\n contentType: pad.json ? \"json\" : \"markdown\",\n editorProps: {\n attributes: {\n class: cn(\n \"prose prose-sm max-w-none min-h-full px-4 py-3 text-foreground outline-none\",\n \"prose-headings:text-foreground prose-p:my-1.5 prose-p:text-foreground prose-li:text-foreground prose-strong:text-foreground prose-code:text-foreground prose-a:text-primary prose-blockquote:text-muted-foreground prose-blockquote:border-l-border prose-pre:bg-muted prose-pre:text-foreground\",\n ),\n \"aria-label\": \"Scratchpad\",\n \"aria-multiline\": \"true\",\n role: \"textbox\",\n },\n },\n onFocus: () => onFocus?.(),\n onUpdate: ({ editor: e }) => {\n clearTimeout(saveTimer.current);\n saveTimer.current = setTimeout(() => {\n const md = e.getMarkdown();\n lastWritten.current = md;\n store.savePad(scope, md, e.getJSON());\n }, 300);\n },\n });\n\n // Flush pending edits on unmount/scope change.\n useEffect(\n () => () => {\n clearTimeout(saveTimer.current);\n if (editor && !editor.isDestroyed && lastWritten.current !== editor.getMarkdown()) {\n store.savePad(scope, editor.getMarkdown(), editor.getJSON());\n }\n },\n [editor, store, scope],\n );\n\n // External changes (quote-to-pad, other tabs, imports) → reload the document.\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n if (pad.markdown === lastWritten.current) return;\n if (pad.json === undefined || !editor.isFocused) {\n editor.commands.setContent(pad.json ?? pad.markdown, { contentType: pad.json ? \"json\" : \"markdown\", emitUpdate: false });\n lastWritten.current = pad.markdown;\n }\n }, [editor, pad]);\n\n if (!editor) return null;\n return (\n <div className={cn(\"flex h-full min-h-0 flex-col\", className)}>\n <Toolbar editor={editor} />\n <EditorContent editor={editor} className=\"zr-editor min-h-0 flex-1 overflow-y-auto overscroll-contain\" />\n </div>\n );\n}\n\nexport default ScratchpadEditor;\n"]}
@@ -0,0 +1,61 @@
1
+ import { z } from 'zod/v4';
2
+ import { R as ReaderClientOptions } from './types-xkdpkPxA.js';
3
+
4
+ interface GlobLoader {
5
+ kind: "glob";
6
+ /** Directory containing one folder per book. Relative to the project root. */
7
+ base: string;
8
+ /** Chapter files, relative to `base`. */
9
+ pattern: string | string[];
10
+ ignore?: string[];
11
+ }
12
+ /** Astro-style glob loader: `content/books/<book>/{book.json, 01-intro.md, ...}` */
13
+ declare function glob(opts: {
14
+ base: string;
15
+ pattern?: string | string[];
16
+ ignore?: string[];
17
+ }): GlobLoader;
18
+ type PluginList = unknown[];
19
+ interface SanitizeOptions {
20
+ /** Hostnames allowed for <iframe src>. Iframes are stripped unless listed here. */
21
+ allowIframes?: string[];
22
+ /** Extra tags to allow on top of DOMPurify's safe HTML profile. */
23
+ allowTags?: string[];
24
+ /** Extra attributes to allow. */
25
+ allowAttributes?: string[];
26
+ }
27
+ interface ContentConfig {
28
+ loader: GlobLoader;
29
+ schemas: {
30
+ book: z.ZodType;
31
+ chapter: z.ZodType;
32
+ };
33
+ /** Applied to `.md` and `.mdx`. */
34
+ remarkPlugins: PluginList;
35
+ rehypePlugins: PluginList;
36
+ sanitize: SanitizeOptions;
37
+ /** Include chapters with `draft: true`. Defaults to `true` in development. */
38
+ includeDrafts: boolean;
39
+ /** Where compiled chapters are cached. */
40
+ cacheDir: string;
41
+ }
42
+ type DeepPartial<T> = T extends unknown[] ? T : T extends object ? {
43
+ [K in keyof T]?: DeepPartial<T[K]>;
44
+ } : T;
45
+ interface ReaderUserConfig {
46
+ content?: DeepPartial<Omit<ContentConfig, "schemas" | "loader">> & {
47
+ loader?: GlobLoader;
48
+ schemas?: Partial<ContentConfig["schemas"]>;
49
+ };
50
+ reader?: DeepPartial<ReaderClientOptions>;
51
+ }
52
+ interface ResolvedReaderConfig {
53
+ root: string;
54
+ content: ContentConfig;
55
+ reader: ReaderClientOptions;
56
+ }
57
+ /** Identity helper that gives `reader.config.ts` full type-checking. */
58
+ declare function defineConfig(config: ReaderUserConfig): ReaderUserConfig;
59
+
60
+ export { defineConfig as d, glob as g };
61
+ export type { ContentConfig as C, GlobLoader as G, ReaderUserConfig as R, SanitizeOptions as S, ResolvedReaderConfig as a };