noteloom 0.4.0 → 0.6.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 (69) hide show
  1. package/README.md +162 -1026
  2. package/dist/canvas.cjs +1 -1
  3. package/dist/canvas.js +1 -1
  4. package/dist/collab.cjs +1 -1
  5. package/dist/collab.cjs.map +1 -1
  6. package/dist/collab.js +157 -102
  7. package/dist/collab.js.map +1 -1
  8. package/dist/comments.cjs +1 -1
  9. package/dist/comments.js +3 -3
  10. package/dist/index.cjs +1 -1
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.d.ts +29 -1
  13. package/dist/index.js +1600 -1542
  14. package/dist/index.js.map +1 -1
  15. package/dist/shared/{CommentThreadCard-CAJ3oPdr.cjs → CommentThreadCard-DcCHq2Dy.cjs} +2 -2
  16. package/dist/shared/{CommentThreadCard-CAJ3oPdr.cjs.map → CommentThreadCard-DcCHq2Dy.cjs.map} +1 -1
  17. package/dist/shared/{CommentThreadCard-Cxf8GwHJ.js → CommentThreadCard-DwtE85Xx.js} +2 -2
  18. package/dist/shared/{CommentThreadCard-Cxf8GwHJ.js.map → CommentThreadCard-DwtE85Xx.js.map} +1 -1
  19. package/dist/shared/{CommentsPanel-CES4uzye.cjs → CommentsPanel-BRgACUu_.cjs} +2 -2
  20. package/dist/shared/{CommentsPanel-CES4uzye.cjs.map → CommentsPanel-BRgACUu_.cjs.map} +1 -1
  21. package/dist/shared/{CommentsPanel-BwVVyMOC.js → CommentsPanel-D4eP-K_f.js} +3 -3
  22. package/dist/shared/{CommentsPanel-BwVVyMOC.js.map → CommentsPanel-D4eP-K_f.js.map} +1 -1
  23. package/dist/shared/VersionHistory-BRBYQgj5.cjs +12 -0
  24. package/dist/shared/VersionHistory-BRBYQgj5.cjs.map +1 -0
  25. package/dist/shared/{VersionHistory-Bg6fufP5.js → VersionHistory-D9sIIAYN.js} +221 -206
  26. package/dist/shared/VersionHistory-D9sIIAYN.js.map +1 -0
  27. package/dist/shared/VoiceListeningIndicator-DgLMmGSP.js +342 -0
  28. package/dist/shared/VoiceListeningIndicator-DgLMmGSP.js.map +1 -0
  29. package/dist/shared/VoiceListeningIndicator-Dw0fggpE.cjs +2 -0
  30. package/dist/shared/VoiceListeningIndicator-Dw0fggpE.cjs.map +1 -0
  31. package/dist/shared/{icons-C1_s0jKK.js → icons-Bdptdx1e.js} +307 -277
  32. package/dist/shared/{icons-C1_s0jKK.js.map → icons-Bdptdx1e.js.map} +1 -1
  33. package/dist/shared/{icons-DtCsXuU6.cjs → icons-DabR_JDW.cjs} +3 -3
  34. package/dist/shared/{icons-DtCsXuU6.cjs.map → icons-DabR_JDW.cjs.map} +1 -1
  35. package/dist/shared/{index-D9WEXpYM.cjs → index-B7_F6NA9.cjs} +2 -2
  36. package/dist/shared/{index-D9WEXpYM.cjs.map → index-B7_F6NA9.cjs.map} +1 -1
  37. package/dist/shared/{index-B9jyyL8u.js → index-DOIEccLM.js} +52 -52
  38. package/dist/shared/{index-B9jyyL8u.js.map → index-DOIEccLM.js.map} +1 -1
  39. package/dist/shared/{leafBlockFactory-A9eUhSe-.js → leafBlockFactory-ChlzpKIn.js} +2 -2
  40. package/dist/shared/{leafBlockFactory-A9eUhSe-.js.map → leafBlockFactory-ChlzpKIn.js.map} +1 -1
  41. package/dist/shared/{leafBlockFactory-Dp382eP8.cjs → leafBlockFactory-D3SCDvzc.cjs} +2 -2
  42. package/dist/shared/{leafBlockFactory-Dp382eP8.cjs.map → leafBlockFactory-D3SCDvzc.cjs.map} +1 -1
  43. package/dist/shared/{serialize-T9Odwx24.js → serialize-C1rjLsIz.js} +2 -2
  44. package/dist/shared/{serialize-T9Odwx24.js.map → serialize-C1rjLsIz.js.map} +1 -1
  45. package/dist/shared/{serialize-DWEfk0vU.cjs → serialize-k0zXqwEM.cjs} +2 -2
  46. package/dist/shared/{serialize-DWEfk0vU.cjs.map → serialize-k0zXqwEM.cjs.map} +1 -1
  47. package/dist/shared/{starter-kit-CY5wzYDf.js → starter-kit-CJzWMyF8.js} +683 -673
  48. package/dist/shared/{starter-kit-CY5wzYDf.js.map → starter-kit-CJzWMyF8.js.map} +1 -1
  49. package/dist/shared/starter-kit-Ch2LEpzF.cjs +27 -0
  50. package/dist/shared/{starter-kit-lPN-NpJ5.cjs.map → starter-kit-Ch2LEpzF.cjs.map} +1 -1
  51. package/dist/shared/{usePopoverEdgeClamp-gmFm0CnI.js → usePopoverEdgeClamp-B9KNv9SE.js} +2 -2
  52. package/dist/shared/{usePopoverEdgeClamp-gmFm0CnI.js.map → usePopoverEdgeClamp-B9KNv9SE.js.map} +1 -1
  53. package/dist/shared/{usePopoverEdgeClamp-CDG26jBM.cjs → usePopoverEdgeClamp-gRlLQeVG.cjs} +2 -2
  54. package/dist/shared/{usePopoverEdgeClamp-CDG26jBM.cjs.map → usePopoverEdgeClamp-gRlLQeVG.cjs.map} +1 -1
  55. package/dist/starter-kit.cjs +1 -1
  56. package/dist/starter-kit.js +2 -2
  57. package/dist/versions.cjs +1 -1
  58. package/dist/versions.js +1 -1
  59. package/dist/voice.cjs +1 -1
  60. package/dist/voice.js +1 -1
  61. package/package.json +2 -2
  62. package/dist/shared/VersionHistory-Bg6fufP5.js.map +0 -1
  63. package/dist/shared/VersionHistory-DELa2Wbq.cjs +0 -12
  64. package/dist/shared/VersionHistory-DELa2Wbq.cjs.map +0 -1
  65. package/dist/shared/VoiceListeningIndicator-BOfVmLK0.js +0 -338
  66. package/dist/shared/VoiceListeningIndicator-BOfVmLK0.js.map +0 -1
  67. package/dist/shared/VoiceListeningIndicator-DNX8JlQM.cjs +0 -2
  68. package/dist/shared/VoiceListeningIndicator-DNX8JlQM.cjs.map +0 -1
  69. package/dist/shared/starter-kit-lPN-NpJ5.cjs +0 -27
@@ -1 +1 @@
1
- {"version":3,"file":"serialize-DWEfk0vU.cjs","sources":["../../src/clipboard/serialize.js"],"sourcesContent":["/**\n * Serializes an ordered list of top-level (sibling) block ids into the three\n * clipboard payloads. All per-type formatting is delegated to the registry\n * (toHTML/toPlainText) — this module only owns cross-block concerns: joining\n * blocks together and grouping consecutive `listItem` blocks into one\n * wrapping <ul>/<ol> (a single list item's toHTML only knows about itself,\n * not its siblings).\n */\nimport { genId } from '../utils/idGen.js';\n\nexport function serializeBlockRange(store, registry, blockIds, inlineRegistry) {\n const ctx = { store, registry, inlineRegistry };\n return {\n html: serializeHTML(store, registry, blockIds, ctx),\n text: blockIds\n .map((id) => {\n const block = store.getBlock(id);\n return registry.get(block.type).toPlainText(block, ctx);\n })\n .join('\\n'),\n json: JSON.stringify({ version: 1, blocks: blockIds.map((id) => captureSubtree(store, id)) }),\n };\n}\n\nfunction serializeHTML(store, registry, blockIds, ctx) {\n let html = '';\n let i = 0;\n while (i < blockIds.length) {\n const block = store.getBlock(blockIds[i]);\n if (block.type === 'listItem') {\n const ordered = Boolean(block.props.ordered);\n let itemsHTML = '';\n let j = i;\n while (j < blockIds.length) {\n const candidate = store.getBlock(blockIds[j]);\n if (candidate.type !== 'listItem' || Boolean(candidate.props.ordered) !== ordered) break;\n itemsHTML += registry.get('listItem').toHTML(candidate, ctx);\n j += 1;\n }\n const tag = ordered ? 'ol' : 'ul';\n html += `<${tag}>${itemsHTML}</${tag}>`;\n i = j;\n } else if (block.type === 'blockquote') {\n // Same grouping idea as listItem above: each blockquote block's own\n // toHTML only emits its own line (a <p>), since the model keeps\n // multi-line quotes as separate sibling blocks rather than one\n // container — consecutive quote siblings share one wrapping\n // <blockquote> on the way out, matching how they'd come back in via\n // domWalk's consumeBlockquote.\n let linesHTML = '';\n let j = i;\n while (j < blockIds.length) {\n const candidate = store.getBlock(blockIds[j]);\n if (candidate.type !== 'blockquote') break;\n linesHTML += registry.get('blockquote').toHTML(candidate, ctx);\n j += 1;\n }\n html += `<blockquote>${linesHTML}</blockquote>`;\n i = j;\n } else {\n html += registry.get(block.type).toHTML(block, ctx);\n i += 1;\n }\n }\n return html;\n}\n\n/**\n * Read-only capture of a block subtree (block + descendants + their runs)\n * — used for the app-specific clipboard JSON, and reused as-is by\n * `duplicateBlock` (see blocks/shared/blockActions.js) since \"clone this\n * subtree with fresh ids\" is exactly the same operation either way.\n */\nexport function captureSubtree(store, rootId) {\n const blocks = [];\n const runs = [];\n const walk = (id) => {\n const run = store.getRun(id);\n if (run) {\n runs.push(run);\n return;\n }\n const block = store.getBlock(id);\n if (!block) return;\n blocks.push(block);\n for (const childId of block.contentIds) walk(childId);\n for (const runId of block.props?.titleRunIds ?? []) walk(runId);\n };\n walk(rootId);\n return { rootId, blocks, runs };\n}\n\n/**\n * Regenerates ids for a captured subtree so pasting the same clipboard\n * contents twice never collides with ids already in the document (or with\n * the ids still referenced by the copy source, if it's the same doc).\n */\nexport function remapSubtreeIds({ rootId, blocks, runs }) {\n const idMap = new Map();\n for (const b of blocks) idMap.set(b.id, genId());\n for (const r of runs) idMap.set(r.id, genId());\n const remap = (id) => idMap.get(id) ?? id;\n\n const newBlocks = blocks.map((b) => ({\n ...b,\n id: remap(b.id),\n parentId: b.parentId ? remap(b.parentId) : b.parentId,\n contentIds: b.contentIds.map(remap),\n props: {\n ...b.props,\n ...(b.props?.titleRunIds ? { titleRunIds: b.props.titleRunIds.map(remap) } : {}),\n },\n }));\n const newRuns = runs.map((r) => ({ ...r, id: remap(r.id) }));\n const newRootId = remap(rootId);\n\n return {\n block: newBlocks.find((b) => b.id === newRootId),\n runs: newRuns,\n subtreeBlocks: newBlocks.filter((b) => b.id !== newRootId),\n };\n}\n"],"names":["serializeBlockRange","store","registry","blockIds","inlineRegistry","ctx","serializeHTML","id","block","captureSubtree","html","i","ordered","itemsHTML","j","candidate","tag","linesHTML","rootId","blocks","runs","walk","run","childId","runId","_a","remapSubtreeIds","idMap","b","genId","r","remap","newBlocks","newRuns","newRootId"],"mappings":"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"}
1
+ {"version":3,"file":"serialize-k0zXqwEM.cjs","sources":["../../src/clipboard/serialize.js"],"sourcesContent":["/**\n * Serializes an ordered list of top-level (sibling) block ids into the three\n * clipboard payloads. All per-type formatting is delegated to the registry\n * (toHTML/toPlainText) — this module only owns cross-block concerns: joining\n * blocks together and grouping consecutive `listItem` blocks into one\n * wrapping <ul>/<ol> (a single list item's toHTML only knows about itself,\n * not its siblings).\n */\nimport { genId } from '../utils/idGen.js';\n\nexport function serializeBlockRange(store, registry, blockIds, inlineRegistry) {\n const ctx = { store, registry, inlineRegistry };\n return {\n html: serializeHTML(store, registry, blockIds, ctx),\n text: blockIds\n .map((id) => {\n const block = store.getBlock(id);\n return registry.get(block.type).toPlainText(block, ctx);\n })\n .join('\\n'),\n json: JSON.stringify({ version: 1, blocks: blockIds.map((id) => captureSubtree(store, id)) }),\n };\n}\n\nfunction serializeHTML(store, registry, blockIds, ctx) {\n let html = '';\n let i = 0;\n while (i < blockIds.length) {\n const block = store.getBlock(blockIds[i]);\n if (block.type === 'listItem') {\n const ordered = Boolean(block.props.ordered);\n let itemsHTML = '';\n let j = i;\n while (j < blockIds.length) {\n const candidate = store.getBlock(blockIds[j]);\n if (candidate.type !== 'listItem' || Boolean(candidate.props.ordered) !== ordered) break;\n itemsHTML += registry.get('listItem').toHTML(candidate, ctx);\n j += 1;\n }\n const tag = ordered ? 'ol' : 'ul';\n html += `<${tag}>${itemsHTML}</${tag}>`;\n i = j;\n } else if (block.type === 'blockquote') {\n // Same grouping idea as listItem above: each blockquote block's own\n // toHTML only emits its own line (a <p>), since the model keeps\n // multi-line quotes as separate sibling blocks rather than one\n // container — consecutive quote siblings share one wrapping\n // <blockquote> on the way out, matching how they'd come back in via\n // domWalk's consumeBlockquote.\n let linesHTML = '';\n let j = i;\n while (j < blockIds.length) {\n const candidate = store.getBlock(blockIds[j]);\n if (candidate.type !== 'blockquote') break;\n linesHTML += registry.get('blockquote').toHTML(candidate, ctx);\n j += 1;\n }\n html += `<blockquote>${linesHTML}</blockquote>`;\n i = j;\n } else {\n html += registry.get(block.type).toHTML(block, ctx);\n i += 1;\n }\n }\n return html;\n}\n\n/**\n * Read-only capture of a block subtree (block + descendants + their runs)\n * — used for the app-specific clipboard JSON, and reused as-is by\n * `duplicateBlock` (see blocks/shared/blockActions.js) since \"clone this\n * subtree with fresh ids\" is exactly the same operation either way.\n */\nexport function captureSubtree(store, rootId) {\n const blocks = [];\n const runs = [];\n const walk = (id) => {\n const run = store.getRun(id);\n if (run) {\n runs.push(run);\n return;\n }\n const block = store.getBlock(id);\n if (!block) return;\n blocks.push(block);\n for (const childId of block.contentIds) walk(childId);\n for (const runId of block.props?.titleRunIds ?? []) walk(runId);\n };\n walk(rootId);\n return { rootId, blocks, runs };\n}\n\n/**\n * Regenerates ids for a captured subtree so pasting the same clipboard\n * contents twice never collides with ids already in the document (or with\n * the ids still referenced by the copy source, if it's the same doc).\n */\nexport function remapSubtreeIds({ rootId, blocks, runs }) {\n const idMap = new Map();\n for (const b of blocks) idMap.set(b.id, genId());\n for (const r of runs) idMap.set(r.id, genId());\n const remap = (id) => idMap.get(id) ?? id;\n\n const newBlocks = blocks.map((b) => ({\n ...b,\n id: remap(b.id),\n parentId: b.parentId ? remap(b.parentId) : b.parentId,\n contentIds: b.contentIds.map(remap),\n props: {\n ...b.props,\n ...(b.props?.titleRunIds ? { titleRunIds: b.props.titleRunIds.map(remap) } : {}),\n },\n }));\n const newRuns = runs.map((r) => ({ ...r, id: remap(r.id) }));\n const newRootId = remap(rootId);\n\n return {\n block: newBlocks.find((b) => b.id === newRootId),\n runs: newRuns,\n subtreeBlocks: newBlocks.filter((b) => b.id !== newRootId),\n };\n}\n"],"names":["serializeBlockRange","store","registry","blockIds","inlineRegistry","ctx","serializeHTML","id","block","captureSubtree","html","i","ordered","itemsHTML","j","candidate","tag","linesHTML","rootId","blocks","runs","walk","run","childId","runId","_a","remapSubtreeIds","idMap","b","genId","r","remap","newBlocks","newRuns","newRootId"],"mappings":"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"}