oasis-editor 0.0.12 → 0.0.14

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 (31) hide show
  1. package/dist/{OasisEditorApp-DsSNl4Fj.js → OasisEditorApp-BtRbOf8l.js} +249 -19
  2. package/dist/app/controllers/useEditorLayout.d.ts +2 -1
  3. package/dist/assets/{importDocxWorker-CtcRQ7NG.js → importDocxWorker-cjz15bhS.js} +1 -1
  4. package/dist/core/commands/builtinCommands.d.ts +1 -1
  5. package/dist/core/commands/publicCommandTypes.d.ts +5 -0
  6. package/dist/core/editorState.d.ts +1 -0
  7. package/dist/core/model/index.d.ts +1 -0
  8. package/dist/core/model/types/document.d.ts +7 -0
  9. package/dist/core/model/types/documentComments.d.ts +50 -0
  10. package/dist/export/docx/commentsXml.d.ts +34 -0
  11. package/dist/export/docx/docxTypes.d.ts +7 -0
  12. package/dist/i18n/locales/en.d.ts +4 -0
  13. package/dist/i18n/locales/pt-BR.d.ts +4 -0
  14. package/dist/import/docx/comments.d.ts +12 -0
  15. package/dist/import/docx/commentsXml.d.ts +14 -0
  16. package/dist/import/docx/runs/types.d.ts +10 -0
  17. package/dist/import/docx/runs.d.ts +5 -1
  18. package/dist/{index-BUOuw27s.js → index-4CDpujGG.js} +541 -117
  19. package/dist/index.d.ts +1 -1
  20. package/dist/oasis-editor.css +1 -1
  21. package/dist/oasis-editor.js +1 -1
  22. package/dist/oasis-editor.umd.cjs +4 -4
  23. package/dist/plugins/internal/createEssentialsPlugin.d.ts +1 -0
  24. package/dist/ui/OasisEditorEditor.d.ts +2 -1
  25. package/dist/ui/app/buildEditorViewProps.d.ts +2 -1
  26. package/dist/ui/canvas/CanvasCommentGeometry.d.ts +13 -0
  27. package/dist/ui/components/CommentHighlightOverlay.d.ts +16 -0
  28. package/dist/ui/components/Toolbar/presets/builtinToolbarIds.d.ts +1 -0
  29. package/dist/ui/components/Toolbar/schema/items.d.ts +2 -0
  30. package/dist/ui/editorUiTypes.d.ts +8 -0
  31. package/package.json +1 -1
@@ -1458,6 +1458,10 @@ const en = {
1458
1458
  "toolbar.decreaseIndent": "Decrease indent (Shift+Tab)",
1459
1459
  "toolbar.listFormat": "Change list numbering format",
1460
1460
  "toolbar.listStartAt": "Start numbering at",
1461
+ "toolbar.specialIndent": "Special Indent",
1462
+ "toolbar.specialIndentNone": "None",
1463
+ "toolbar.specialIndentFirstLine": "First Line",
1464
+ "toolbar.specialIndentHanging": "Hanging",
1461
1465
  "toolbar.formatDecimal": "1, 2, 3",
1462
1466
  "toolbar.formatLowerLetter": "a, b, c",
1463
1467
  "toolbar.formatUpperLetter": "A, B, C",
@@ -1850,6 +1854,10 @@ const ptBR = {
1850
1854
  "toolbar.decreaseIndent": "Diminuir recuo (Shift+Tab)",
1851
1855
  "toolbar.listFormat": "Alterar formato de numeração",
1852
1856
  "toolbar.listStartAt": "Iniciar numeração em",
1857
+ "toolbar.specialIndent": "Recuo especial",
1858
+ "toolbar.specialIndentNone": "Nenhum",
1859
+ "toolbar.specialIndentFirstLine": "Primeira linha",
1860
+ "toolbar.specialIndentHanging": "Deslocamento",
1853
1861
  "toolbar.formatDecimal": "1, 2, 3",
1854
1862
  "toolbar.formatLowerLetter": "a, b, c",
1855
1863
  "toolbar.formatUpperLetter": "A, B, C",
@@ -2214,14 +2222,14 @@ function t(key, params = []) {
2214
2222
  return template2;
2215
2223
  }
2216
2224
  const oasisMarkBase64 = "UklGRmQXAABXRUJQVlA4IFgXAACwWwCdASrAAAABPjEWiUMiISESyL50IAMEswHYDxjW/947Oi5/a/7H+1P90/ar5n65/UvwH+Q/QZm27Sf5n9r/I/5m/2n/p+wv9E/9j3AP07/0X92/HLuKeYL+mf4r/zf3f3tf9x+rnvH/z/qAfzf/J/9/sM/QX/bv02P28+Fb9s/2s+B39h//51gH//6yfrV/QO1z/CdMx6vl0OAGqD8Z+4X6H+9/up8b/6vvP+IeoL+Lfyr/CflxwuoAPz7+0/7T1iPk/9p6R/zXqAflpxyVAX8y+hD/5/6f0W/UX7UfAl/Ov75/zOxr6SR2HAT+kJLsdULBbdVn3b+sl8uZdjuThjIe3NwBwjfGz5SniiBN2m7i7b0hA/wxE1PuC+4EcbOyjUkU3CDDghPY1Va4tpUped9TFa05Qb1z7O+Ye73ccvEl10Sgdj6Hhy71hb/XpA23GjXBN/obAlaswz9gKwvW9d9npbC69rQeTm6DEr/cjrNngjQaHgFGjh4uVY1bY9Q+/iG037f80w0bLlYIe7smzz4tG1kC8r/KyWvzd3IXXrR2bKmhoB3Md69ltbERYFBI/2f+w7Jcsw+aUOGSwP6v6jv3tvwprg/7n5tto40/iRIKwEHQ5H/G5c0tpJ2pwREanIK3qHinjvovnkmuTw0mV2bumYqdc7he7hG0hpvBna8vIRpKYe6K1v3F8trOEtYUwr7w8e6j3nviknKtsFMtPtxZzn0YnhgtOn9inBlwqyEGR+wk7X1KHxOekXCA1UVbmLwGx1NqbI6r2WBOwQdpmpTg85DMOjwzW/JHUmfxKTDfhoXLi9gBMP/+Et6inspdrW1CHkZVLkDll2JyiPvClnvGv9m00oYce3evtpMlDhY3kVYGwfkoCHHyEv9iiN45NFE7+dQ9TacuQ00bHMa8LEFkEgXlbIOOqb/luSgpqPeYJ0te0XOAoIimL6iiPpVwptKTVTYOwRlXsxXOf6TT46ZEkHgAAP7+0P2gKmTluueuNY+U4/vkDd2VmNHsmMNJl1HfoY2poF8/1uoa8CZHpva1s8naGtGSLZnoeinjMs+G3jkzDzxHqqcgkZTAfFgipQReV3vRrkjzfzIdcMA7B4tu1cAg89SYeju2MC8Y/CWafba+MGbhAEzmu3dW8//l1pJrMLCd2MlJ8YLX6EM772du7VOeyFBLhim1VpOzXrWZWlYFTm3pF38p3oH1j5l0JRFlx08AdxScjS2p+L43pSzH9irNn8ow+YlvoXypCXVyQ9DllXxuTiMV7Tw7WkiyBb4a0io2XARXIzAbjnigXygR4j0M4GnhxdRzombgaZd6jiUTORiHX8BIV0fE+8nOv/uleXINQ2JNHrP4IfqDiefxTYTJHXey6xszVKKbcgzzA9VjuS59jQjkZVktrpdXls0pskU+x3iAoGSQxoL3YUs8B9JbG69Vh5VQfRWkjpvjgA+VeqeUoRD1h/PctddTT2eA31zbvwS+0HxGGL7afgwAeSZIDnSqmHLVUc7cH9uA0qf6foiwypxLOe6BLv7FNIwMYXLlkOnCSsiYZmhjpZmUZykMqPtNOPR2teBpziedYDQV2aBZFMP+Guq5u2WRWvvGZ+KNDuQaa4vKl+YbRCwZAaLr6bcL+XjTayKSzz561sUKrzDSPUjEf0cVkTci8SXA+guLEDFEtHATgLEEQD/xiDXvconSzB8CqX0Pys7GniN2V5lI76qUO1knbcPftDFB9DRHcuv4NM/c+9zeyj3iLi2uJhkGEW8MtSZUygLogIc+c43IPKXQXAs9YgZ8Uumypd4xdsgzr5POVy0w0rzP8LhLPiqzL8Nc50JyRi8bvEZraXy3DSHQmuVX39HaRgREI7uqi1sUiL+b0qe/fR53FfE+uCPvVxaWqgr0UicQoWPAXArLgJ6RjGyIgbrq+cv0gBkp65ZH05itLicbTkIWprWJ1pLomPqQZkAYruygNlcmmGct1IJ0OzNjAJQFkVGbwLkeHB/TDbV0Tq/U7ge2Ciaj3HYIMmREQzhx1gk+i2Kwb3DmEaetvzetIiB0nhbRWIMtfOKNM25GU22XNDiHpZiFfMCR04TIoM/jq5qRJ8zukISn5EQJGUSLd1nraQHhAJTkrpt/x6kq5R9er3yXQiOw25imi3mzDte/kbW6ENgYqf3RC1zKdnGEieTDnu+Mfr1L5ORPGTyS4LO2eDcgcd7uKCXNyWLRHYNtj0swtWjA0ia7ezJCwTRrpoU7kY+lL02zDFu+teWU4dda1jD7f0khwFd6lu1ESotG4fSQX/+N6f2n3mwu/NRGflR35gBlCarCAqTnEvPSSAoGg5H65qwNYU4i/xtQET6QIf0wJ9SWoybdwZkdByMBLVM+zWXM09/ZywvcFSeDiQH1mB/LN9o/9kigWXMDCmJ40GdbJriO6LyFd3ZPHE9Mu3cpzAHodpgbNY2L5de3n7cWaFs31Ua4V7IZwif5EJ6RgL52zgWt5THlnmij4W/+o5sga3qHqbIr2R4+KthbXaFSBHLt/MP3sfxs7UyonNA/yO9VDpaR/87nlPJ+486zuaZ6QF6hVZMPFdPUSXrhJYcQn8MarTFxjYFzcGKE5JIdnqU8wrv95YUP2/Vq42hW+eYj3Olg9EpjiSMkrFiYBsyWSOqbJQbpV64E7yVXFNVHUnkvRhUHFSP+YLr+DAyGpc6IIx+dS13PDFTHLAPtK0K8U5nwtn07jExCX4zca4HtBYAPSyMs/rGL+kEh29/08ahsm/8lEASeDKao1fY2pqUMr/GXUf+wwieLDHhs4/785VR9Jg6ZYzV6W8gxpyHNPw/s6/V2XW/PRn+l8MCGPTSDU0H7S/engMTa3XFjmfN+HkF3VBNtsTRv5m/dvtiEW4KJnN3UT1BiuO19GYLvxC553JAMaKnwwtW3q4UUnQwjrRum4luWqFQbWSfFaM0C+nAHkShu+7jB74XTnWfZUljWJrxnV/xRqtBnlio9SHJn93hzCH3c7Z4NGiHUfRlNZeY0GTth7SIjPPNF8uq0Dlon7EpI0JQWPHjAajWRH6+z6HGdnkF6b6ZW5nwveXsbtGl77y181pnrXB8eKRZVF6mnjlOWfzt2DgyrR8KXcfQxdtJ14hmYNbWmVt6oo0syImVWF2VaCy4iac47Xle5VTGAzTK+y4ineIkhp2WUDrKBHpaXNu05EunDhMbGU4OSsDum31/gAk0cpuqbGJmD+AEf+PEyj7okPwWnzbx/Dc+TOUJIq0qPYVLHQs3x5763EiV05ZPV0giHExJHA4tpsZdLBBimjc4jbBcDloQWRyHMa5ZCOsLcAxxe/JUT31Gmy8EeIIJH8oybFtgVsxUB9bTxUCjQ5BTUwGzCI3zFYNmqhwcQx7IRJEaBHnQH0Reiqh7QJu3rZ+1xNRDeUPgc9c3VKwkZhaSS+wB/AQUgUVHzL0w86fefFqaqXbei8E6aCU4PPwLtpC/kphJCHMSQ1y6Z1kN1ztzIcN6EYF0diUBtS0ycH+8OT5Pu7SBn9paZxcr0abOrM0WedcPsmgRTng89PAD7unuoL+34FYNzXeVc2oxzRQ4ukk+O/zYyxVW2bfacfF176N/actMCjkMiZsIzUpK8q9a7xKWWoNNPFKd/zbyQaWPY9NhfWS2yDjBtmYh6SZRBJJRhZFY1ZCKIs4q8Z+hznOqVSPsm9sddQNfg5cn1gdtuZP/HZJqu6YN6Scn2f4RdBhb2iZGyNt/oDFIqQwJHMNiQUeemjv8t+p4Ijz0tCKNPLGmDeuhrplcBQ8LZgSPE3yyXmuIgd31d23LHj43kzNoMc0niaEAXRfvuA7sxLpbzV5x0bNTFYZ7XGX8CpL1m0/X2c9nFxxk1kALcLsOT9VadXCJ5jG+ANfI+RJ24AFfCTjK7mQuWDirqt9FD8ksAvzPM8677h/YcmEfwyrUBm8ZPOjhnMH7I85GVoQjN7zHFN3VXmaMRZMq5uBc5Z3Fhr6JbsBSl8W/hAQAriIBINIylKxSh7iRa2S2MlXJb/uIosUdKoreXYKD3A4xcf5DGnjxfCVm9L9WabGP5Wj/yoRo/h1hEaaHZVjrot+YELnMYMn/gLTHm1w/m5KMKXbqNdB1DZhPOx+vA7WCozWCfqDlJDczg6SQybB1KsP7lk/9gqHS58eVInTlny7MxP6jbCKE5KI1A9uu+rFuO+6iYHCP4xcdPNT6RsYjpSLhjyKHBcCldrMjQzo8IpwYkSyaPxonVxhSjxfBySfPIljfNy/1nL3KyMcXzzR2QnDRABDumnTqfDqAL0PMuLeZ3iBgVlN4j8tdBD+uPIvDjHpXAwFAY1R03QMWGtS84kEElzP0qPlpg1b0zw3KK1daqJC2rmaGE0r0y3Js8W0CVI+e6HMozZ2tAh17caaGjcnbK8WK+l9swvUSc6GaI1mrlnhAHU80EFIql72S66mllwDtIJhkpDfu1xVON+kiZAU8ao6sj+9oN38QZ0orGVOCnj7R9/Qg/VozV+Odtx1nres4cVUpgBpj8Fc+n52K+kkDCl80yVaPS7ZsvtS33mn3xeTn74mvTWcVftb8+e+vFLo6GS5kPRskekS0ViI/hAhQeCFZV7MBwI/jS+B68+YiWv/+9tG7qPNKLsjTR97ead+3YrvlBM3MyRlIpIMcYYgLiiZZ42RJGG2Ip3kPxsx8s3N+SkvM8qLTw3dWhActwY3Xz0O9Crxtfr93PHhfQI71MIUEmX2dnbKTxnqYbLB1kCdS4H9sz6wW02aXo9fzaQo090DuxABjsamN0leUN7a1L24Eev/B75RhLXYXy9SvKxvd0H+KlepkD4doBKROwuwFu7PMog7jmqvAGBHtSF7dE3jwhE60Rjtt95WkgqQDoRO7W57G3tJgdlPverdlAi0zSDFEkBxXTDZ3xheftVoAhRj365OpFIzFBNN+iYfp2eJwBwI7oc5KylPx5/H3NNMcBvx+EOdEu4pkFlpPnmglJKvsNeCyUWhTIvPi308dnqSoifrrilNHk3UeUXSoaVKxQPIBpbiVLPedkJBQjvuOnOriN/V80+Rk9AE7iRMl/Rvc33Lge1jnRC7AFnJbw9ufG8JgbB4RBnyB1xuIUiCfkvBPoNNfbfuc3mrI7pJYLknAXGSG1Nfuo5DtXqw1JfHGlIDRVbootSqBVrEHXnCvvXOPqpNXe5W4fPhMVYwyJoE1qWZVIYo549dcG50Bz6qQo/YwChUIKCG+vkwiJ+kZd1to35s+aGK1HBP60TOjMYwioPiB0J3/M3JbQ7KSXz1mVcAd73cGnyHgB9vEfSEVf3IjVdd3IYtAZ0/87Pzbeu0m9oZpOhzngr2neJbn+1l5AiNG6RK0dNNmmTQI1DnDmM3hW8Yw0TiGX3oNDtv0X6NXbNna7b0YLh3bAB72PiqadyVxVYPRoHY2vCjRrBQzTNTdRIQuw5d0XhFJ4uazuvp5RMF0d9LLckV+iqel5ldUdQ2m5ZxGNPxoABOhV5MznFqE9GLr4EYDl064VOcFjJBkFaei+XN+H1oaqG8qkntUti9NdXEphwxgKW16MEeWuQ/7T8DCeC8+5nyPVF3kG8ZDYZP0AJtv5/WFPn9DWTo7gQTAt0U3JZVcudQ7i7PfvqWa52Qrpy6zQFVTesAyrq995z6UGiHzqiHGDjelUG8bnN+m5+3MMELQAU+rvc4UFgNJ/Qa1DnWJdkMZSUMq+HBoj5ggFBwlL6yDEiRk34idtLXmIy8cMNrjXG0Lu7Reg/CY07ZYRp4eTLUIrFnr8aknQBWq0xHLQwYmjqO/TT6sz+lPCJRE4+FXSaZVynttWJv1H9gEFDgs5dOMCTkwh1ax9dpwLEsm8QPU2G2v6l5zxrcvc1FWtDlcIfQDWNecuvM7bX+STamlHfN4HA0tSPrgMy10RwE79X37FlpC3eESfEmUU5Sn2Lgz9uBA4NH7R9EMNz8KGVeA5rJ7RFnPlwx9M2vGnChVaxeoKI4N9YVr0sWj8Y/GiCB7I+8JW6gxzc0+15MDOLlvzNhS2ZMRENKhrvs2OGvvIyx6PWlYFTgAfxWyDonD1mngwHu6h40bGM3xDeOv7Fy818u6uTUWm/qnaGrSKdrU1BiGP2+T/qtxeK7EQpceSmVbFgnCFJX4knNvrYC+qhU6emMJiCuIjFxiK/W+tgtp++f9TRhfaX2Nn3oisrMYTXHKcxa6Im1QTRMZLyba1njRXKhNQzygEEkCTaQ8NrCaYQ+6QrvlnuYPzQn9OzFNrFgJg+Kuz73CQU6z3r/jsgZ+AkeDDESoMXDRetY1NclRIMGRy8NB9dur+YrXdNDM3vHq9YjXkOx8QgJCFTV06fUmxBrqgoIb5ZaoiWv8mhOuta+5AztMbzxtggvULoILvLB3E95cabrHIgIIxZOGf5bAP9ltq3Yg6Vo4PnZkOd9Ln2vP3vpB0P0ELJDRwUpey+k7bpQF7VfEqg4k28587tqFvrX2ZbQADLJGKhERGVFehFRuqfS8SaXmWVLB4HriwYl4r8k7NMZwbp/xZM7xBrCXt8bEC2wku5PDUb9PyPcQBnoKnstlLSSwJXS2RBFI87PYgEYHNzmYt8y6z1nNB6PBFxJo3NKrprYK77FMfyPAelQnBc4VstXvPnsZRp8NY97NvtRq6GTKOlwuAtFLIMxZ3pu1wxBNRxH9OfiymV6ahDsAF+F4EmS/fmuLxqRCborsgMUTSlcbZCycyfeLgL9FsLfIadOCee++KvLi4ST9ZHhj7tCBhgayemDhSzcFgeFnsyDkGS9qLs7rnySZzxzAwfjlpsYyjkYpuxXbbWuTIqD39mD6NQpuJDKt2Q9x/OKymV3BMjQ/0F4boL/NdfYS24AFVtW/OIFU+AGkN2d5wNbdGC5NrLUrp3q+mjXtg54TBgW2gp8fUOCTxdPzlDp2baT4Q6uAqCfDg3D4V/4VdxkVSlLbiWEpOTl4VtDlNMNSSXmFf/1tPGphwWKj0Agbbd5QjFulttla8pgAAA/Wf+9Td+Oo61eaZLa3tUfTeOXGCKwWJFXCMqaNfIyBue31jEIGX1TddpAj4QyCopCfwrKjKoRX5n4UwcfwADHiInAdeqVgyLiABR8P6u+q5XYOLFlS5rZ1Kpe7uqoHg6rIvAN/gVp/JR0jDVURc9CTdVvWQNne/upBb3VgGGhdLlbcfVEjHw5HwHeOjIx3HP/lXoWaUdTbiLB7DDLQD+VOaVqCh9An7btAcCd6RzgEW165Hqx2ZXLlq8OLCczkDlN8rCAtz8O+4AzSyPK8grVM8ObUU+qc6ZGcCgxaVvvbiTPP2kb765qIU5/Dj+q60L9YPOU6t+1FP6od8x4iXUpAtBsclYfJhOrwv66P13ocoB3LV1x09Eb5wq33vepBq3qYQJQyOHbj/jl4eLRUxXLQgLorpnB4HNs4v40tGGosw2Ka6eDt5K6P8DQK5ozy56BizczJenDjZ5DYx1Xu3YLmI/quRSR8ORIJqwhWFwM+Q8/gNfUL/YgQHlHmfhYi5vjU0TzsgnLyhP/kOFSnR9zjJkIMcYAFB/Ft1tfks1aQiBMtgP4sabdMsauWXINaIyR9ClOZLdIZQVGHUgLjxKW6YiFUs72zTJmKtf/RovsidqZlmEXrWGZ3UuGplChFUtjEkvwi2XxICgc0grD+9/tRt47usAAADGbVjPUInsKZHILQ8Tdvbj09q/9k2Mg7uynD2e+HudOmr+jOK+SyWmKsSZ4pH89FUSffyxPKUMVNp8o1m1apG/WDvwhmHllHVfELy0BgfyAIevaAuIOzl4NX3ayQnv+tsCnIGxjvF1IwPLyoflKFrL2OBFh3pJ57ChDdzSC9IDKqpaycKVMm2mWUPGBLK2cpD+b4VPleMoNCtKZz4AileaHHtk77gduJB8sihmMPR1lV1Vba4pOywdJgGueqt4IcTd2RJFxeSRNjuzHcR4tYGdli66ijJZC20ODhr8miT+cauMIflgiAAAAA=";
2217
- var _tmpl$$Q = /* @__PURE__ */ template(`<img alt aria-hidden=true>`);
2225
+ var _tmpl$$R = /* @__PURE__ */ template(`<img alt aria-hidden=true>`);
2218
2226
  const OASIS_MARK_DATA_URI = `data:image/webp;base64,${oasisMarkBase64}`;
2219
2227
  const MARK_ASPECT = 3 / 4;
2220
2228
  function OasisBrandMark(props) {
2221
2229
  const height = () => props.height ?? 64;
2222
2230
  const width = () => Math.round(height() * MARK_ASPECT);
2223
2231
  return (() => {
2224
- var _el$ = _tmpl$$Q();
2232
+ var _el$ = _tmpl$$R();
2225
2233
  setAttribute(_el$, "src", OASIS_MARK_DATA_URI);
2226
2234
  setAttribute(_el$, "draggable", false);
2227
2235
  createRenderEffect((_p$) => {
@@ -2238,7 +2246,7 @@ function OasisBrandMark(props) {
2238
2246
  return _el$;
2239
2247
  })();
2240
2248
  }
2241
- var _tmpl$$P = /* @__PURE__ */ template(`<div class=oasis-editor-import-progress-label>`), _tmpl$2$w = /* @__PURE__ */ template(`<div role=status aria-live=polite><div class=oasis-editor-import-card><div class=oasis-editor-import-title></div><div class=oasis-editor-import-progress-track><div>`), _tmpl$3$k = /* @__PURE__ */ template(`<span class=oasis-editor-import-done-icon>Done`);
2249
+ var _tmpl$$Q = /* @__PURE__ */ template(`<div class=oasis-editor-import-progress-label>`), _tmpl$2$x = /* @__PURE__ */ template(`<div role=status aria-live=polite><div class=oasis-editor-import-card><div class=oasis-editor-import-title></div><div class=oasis-editor-import-progress-track><div>`), _tmpl$3$l = /* @__PURE__ */ template(`<span class=oasis-editor-import-done-icon>Done`);
2242
2250
  function OasisEditorLoading(props) {
2243
2251
  const variant = () => props.variant ?? "overlay";
2244
2252
  const pct = () => {
@@ -2247,7 +2255,7 @@ function OasisEditorLoading(props) {
2247
2255
  };
2248
2256
  const isDone = () => (pct() ?? 0) >= 100;
2249
2257
  return (() => {
2250
- var _el$ = _tmpl$2$w(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.firstChild;
2258
+ var _el$ = _tmpl$2$x(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.firstChild;
2251
2259
  insert(_el$2, createComponent(OasisBrandMark, {
2252
2260
  height: 40,
2253
2261
  "class": "oasis-editor-loading-mark"
@@ -2258,10 +2266,10 @@ function OasisEditorLoading(props) {
2258
2266
  return pct() != null;
2259
2267
  },
2260
2268
  get children() {
2261
- var _el$6 = _tmpl$$P();
2269
+ var _el$6 = _tmpl$$Q();
2262
2270
  insert(_el$6, (() => {
2263
2271
  var _c$ = memo(() => !!isDone());
2264
- return () => _c$() ? _tmpl$3$k() : `${pct()}%`;
2272
+ return () => _c$() ? _tmpl$3$l() : `${pct()}%`;
2265
2273
  })());
2266
2274
  return _el$6;
2267
2275
  }
@@ -2310,7 +2318,7 @@ function OasisEditorAppLazy(props = {}) {
2310
2318
  onCleanup(() => {
2311
2319
  cancelled = true;
2312
2320
  });
2313
- import("./OasisEditorApp-DsSNl4Fj.js").then((m) => {
2321
+ import("./OasisEditorApp-BtRbOf8l.js").then((m) => {
2314
2322
  cancelled = true;
2315
2323
  setProgress(1);
2316
2324
  setTimeout(() => setApp(() => m.OasisEditorApp), 180);
@@ -3423,11 +3431,17 @@ let nextTableRowId = 1;
3423
3431
  let nextTableCellId = 1;
3424
3432
  let nextFootnoteId = 1;
3425
3433
  let nextBookmarkId = 1;
3434
+ let nextCommentId = 1;
3426
3435
  function createEditorBookmarkId() {
3427
3436
  const id = `bookmark:${nextBookmarkId}`;
3428
3437
  nextBookmarkId += 1;
3429
3438
  return id;
3430
3439
  }
3440
+ function createEditorCommentId() {
3441
+ const id = `comment:${nextCommentId}`;
3442
+ nextCommentId += 1;
3443
+ return id;
3444
+ }
3431
3445
  function createEditorRun(text = "") {
3432
3446
  const run = {
3433
3447
  id: `run:${nextRunId}`,
@@ -4271,6 +4285,7 @@ const OASIS_BUILTIN_COMMANDS = [
4271
4285
  "setIndentRight",
4272
4286
  "setIndentFirstLine",
4273
4287
  "setIndentHanging",
4288
+ "setSpecialIndent",
4274
4289
  "setParagraphShading",
4275
4290
  "applyParagraphBorders",
4276
4291
  "setLineHeight",
@@ -4341,10 +4356,12 @@ class MenuRegistry {
4341
4356
  }
4342
4357
  }
4343
4358
  const defaultMenuRegistry = new MenuRegistry();
4344
- var _tmpl$$O = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none aria-hidden=true><text x=2 y=18 font-family="'Segoe UI', Arial, sans-serif"font-size=14 font-weight=700 fill=currentColor>ab</text><text x=15.5 y=11 font-family="'Segoe UI', Arial, sans-serif"font-size=10 font-weight=700 fill=#c00000>1`), _tmpl$2$v = /* @__PURE__ */ template(`<i>`);
4345
- const FootnoteIcon = () => _tmpl$$O();
4359
+ var _tmpl$$P = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none aria-hidden=true><text x=2 y=18 font-family="'Segoe UI', Arial, sans-serif"font-size=14 font-weight=700 fill=currentColor>ab</text><text x=15.5 y=11 font-family="'Segoe UI', Arial, sans-serif"font-size=10 font-weight=700 fill=#c00000>1`), _tmpl$2$w = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"aria-hidden=true><g fill=currentColor><path d="M3.375 4.875 L7.125 8.625 L3.375 12.375 L2.25 11.25 L4.875 8.625 L2.25 6 Z"></path><rect x=10.125 y=6 width=9 height=1.6875 rx=0.25></rect><rect x=5.625 y=10.875 width=13.5 height=1.6875 rx=0.25></rect><rect x=5.625 y=15.75 width=13.5 height=1.6875 rx=0.25>`), _tmpl$3$k = /* @__PURE__ */ template(`<i>`);
4360
+ const FootnoteIcon = () => _tmpl$$P();
4361
+ const SpecialIndentFirstLineIcon = () => _tmpl$2$w();
4346
4362
  const CUSTOM_ICONS = {
4347
- footnote: FootnoteIcon
4363
+ footnote: FootnoteIcon,
4364
+ specialIndentFirstLine: SpecialIndentFirstLineIcon
4348
4365
  };
4349
4366
  function getCustomIcon(name) {
4350
4367
  return name ? CUSTOM_ICONS[name] : void 0;
@@ -4356,9 +4373,9 @@ function ToolIcon(props) {
4356
4373
  },
4357
4374
  get fallback() {
4358
4375
  return (() => {
4359
- var _el$2 = _tmpl$2$v();
4360
- createRenderEffect(() => setAttribute(_el$2, "data-lucide", props.name));
4361
- return _el$2;
4376
+ var _el$3 = _tmpl$3$k();
4377
+ createRenderEffect(() => setAttribute(_el$3, "data-lucide", props.name));
4378
+ return _el$3;
4362
4379
  })();
4363
4380
  },
4364
4381
  children: (render2) => render2()()
@@ -4685,7 +4702,7 @@ const defaultMenuItems = [
4685
4702
  }
4686
4703
  ];
4687
4704
  defaultMenuItems.forEach((item) => defaultMenuRegistry.register(item));
4688
- var _tmpl$$N = /* @__PURE__ */ template(`<div class=oasis-menubar role=menubar>`), _tmpl$2$u = /* @__PURE__ */ template(`<div class=oasis-menubar-dropdown role=menu>`), _tmpl$3$j = /* @__PURE__ */ template(`<div class=oasis-menubar-menu><div class=oasis-menubar-button role=menuitem aria-haspopup=true>`), _tmpl$4$d = /* @__PURE__ */ template(`<div class=oasis-menubar-separator role=separator>`), _tmpl$5$c = /* @__PURE__ */ template(`<span class=oasis-menubar-item-icon aria-hidden=true>`), _tmpl$6$6 = /* @__PURE__ */ template(`<span class=oasis-menubar-shortcut>`), _tmpl$7$3 = /* @__PURE__ */ template(`<i class=oasis-menubar-submenu-icon data-lucide=chevron-right>`), _tmpl$8$2 = /* @__PURE__ */ template(`<div class=oasis-menubar-submenu role=menu>`), _tmpl$9$1 = /* @__PURE__ */ template(`<div class=oasis-menubar-item role=menuitem><span class=oasis-menubar-item-main><span>`);
4705
+ var _tmpl$$O = /* @__PURE__ */ template(`<div class=oasis-menubar role=menubar>`), _tmpl$2$v = /* @__PURE__ */ template(`<div class=oasis-menubar-dropdown role=menu>`), _tmpl$3$j = /* @__PURE__ */ template(`<div class=oasis-menubar-menu><div class=oasis-menubar-button role=menuitem aria-haspopup=true>`), _tmpl$4$e = /* @__PURE__ */ template(`<div class=oasis-menubar-separator role=separator>`), _tmpl$5$d = /* @__PURE__ */ template(`<span class=oasis-menubar-item-icon aria-hidden=true>`), _tmpl$6$6 = /* @__PURE__ */ template(`<span class=oasis-menubar-shortcut>`), _tmpl$7$3 = /* @__PURE__ */ template(`<i class=oasis-menubar-submenu-icon data-lucide=chevron-right>`), _tmpl$8$2 = /* @__PURE__ */ template(`<div class=oasis-menubar-submenu role=menu>`), _tmpl$9$1 = /* @__PURE__ */ template(`<div class=oasis-menubar-item role=menuitem><span class=oasis-menubar-item-main><span>`);
4689
4706
  function Menubar(props) {
4690
4707
  const [activeMenu, setActiveMenu] = createSignal(null);
4691
4708
  const menuItems = () => (props.registry ?? defaultMenuRegistry).getItems();
@@ -4752,7 +4769,7 @@ function Menubar(props) {
4752
4769
  });
4753
4770
  const topLevelItems = () => pruneTree(menuTree());
4754
4771
  return (() => {
4755
- var _el$ = _tmpl$$N();
4772
+ var _el$ = _tmpl$$O();
4756
4773
  insert(_el$, createComponent(For, {
4757
4774
  get each() {
4758
4775
  return topLevelItems();
@@ -4778,7 +4795,7 @@ function Menubar(props) {
4778
4795
  return activeMenu() === topLevel.id;
4779
4796
  },
4780
4797
  get children() {
4781
- var _el$4 = _tmpl$2$u();
4798
+ var _el$4 = _tmpl$2$v();
4782
4799
  insert(_el$4, createComponent(For, {
4783
4800
  get each() {
4784
4801
  return topLevel.children;
@@ -4817,7 +4834,7 @@ function MenuNode(props) {
4817
4834
  } = props;
4818
4835
  const isSeparator = (_a = node.item) == null ? void 0 : _a.separator;
4819
4836
  if (isSeparator) {
4820
- return _tmpl$4$d();
4837
+ return _tmpl$4$e();
4821
4838
  }
4822
4839
  const hasChildren = node.children.length > 0;
4823
4840
  const [showSub, setShowSub] = createSignal(false);
@@ -4852,7 +4869,7 @@ function MenuNode(props) {
4852
4869
  return icon();
4853
4870
  },
4854
4871
  get children() {
4855
- var _el$8 = _tmpl$5$c();
4872
+ var _el$8 = _tmpl$5$d();
4856
4873
  insert(_el$8, createComponent(ToolIcon, {
4857
4874
  get name() {
4858
4875
  return icon();
@@ -4905,10 +4922,10 @@ function MenuNode(props) {
4905
4922
  })();
4906
4923
  }
4907
4924
  delegateEvents(["click"]);
4908
- var _tmpl$$M = /* @__PURE__ */ template(`<div class=oasis-titlebar><div class=oasis-titlebar-left><div class=oasis-titlebar-menubar-slot>`);
4925
+ var _tmpl$$N = /* @__PURE__ */ template(`<div class=oasis-titlebar><div class=oasis-titlebar-left><div class=oasis-titlebar-menubar-slot>`);
4909
4926
  function TitleBar(props) {
4910
4927
  return (() => {
4911
- var _el$ = _tmpl$$M(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild;
4928
+ var _el$ = _tmpl$$N(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild;
4912
4929
  insert(_el$3, () => props.children);
4913
4930
  return _el$;
4914
4931
  })();
@@ -16874,7 +16891,7 @@ function getCaretRectFromSnapshot(snapshot, position2, paragraphOffset) {
16874
16891
  );
16875
16892
  return rectFromBox(slot.left, slot.top, 1, slot.height || line.height);
16876
16893
  }
16877
- var _tmpl$$L = /* @__PURE__ */ template(`<span class=oasis-outline-title>`), _tmpl$2$t = /* @__PURE__ */ template(`<div class=oasis-outline-list>`), _tmpl$3$i = /* @__PURE__ */ template(`<div class=oasis-outline-panel><div class=oasis-outline-header><button class=oasis-outline-toggle><i>`), _tmpl$4$c = /* @__PURE__ */ template(`<div class=oasis-outline-empty>`), _tmpl$5$b = /* @__PURE__ */ template(`<div class=oasis-outline-item>`);
16894
+ var _tmpl$$M = /* @__PURE__ */ template(`<span class=oasis-outline-title>`), _tmpl$2$u = /* @__PURE__ */ template(`<div class=oasis-outline-list>`), _tmpl$3$i = /* @__PURE__ */ template(`<div class=oasis-outline-panel><div class=oasis-outline-header><button class=oasis-outline-toggle><i>`), _tmpl$4$d = /* @__PURE__ */ template(`<div class=oasis-outline-empty>`), _tmpl$5$c = /* @__PURE__ */ template(`<div class=oasis-outline-item>`);
16878
16895
  function OutlinePanel(props) {
16879
16896
  const [collapsed, setCollapsed] = createSignal(props.defaultCollapsed ?? false);
16880
16897
  const [items, setItems] = createSignal([]);
@@ -16948,7 +16965,7 @@ function OutlinePanel(props) {
16948
16965
  return !collapsed();
16949
16966
  },
16950
16967
  get children() {
16951
- var _el$3 = _tmpl$$L();
16968
+ var _el$3 = _tmpl$$M();
16952
16969
  insert(_el$3, () => t("menu.view.outline") || "Outline");
16953
16970
  return _el$3;
16954
16971
  }
@@ -16959,14 +16976,14 @@ function OutlinePanel(props) {
16959
16976
  return !collapsed();
16960
16977
  },
16961
16978
  get children() {
16962
- var _el$6 = _tmpl$2$t();
16979
+ var _el$6 = _tmpl$2$u();
16963
16980
  insert(_el$6, createComponent(Show, {
16964
16981
  get when() {
16965
16982
  return items().length > 0;
16966
16983
  },
16967
16984
  get fallback() {
16968
16985
  return (() => {
16969
- var _el$7 = _tmpl$4$c();
16986
+ var _el$7 = _tmpl$4$d();
16970
16987
  insert(_el$7, () => t("outline.empty"));
16971
16988
  return _el$7;
16972
16989
  })();
@@ -16977,7 +16994,7 @@ function OutlinePanel(props) {
16977
16994
  return items();
16978
16995
  },
16979
16996
  children: (item) => (() => {
16980
- var _el$8 = _tmpl$5$b();
16997
+ var _el$8 = _tmpl$5$c();
16981
16998
  _el$8.$$click = () => props.onNavigate(item.anchor);
16982
16999
  insert(_el$8, () => item.text);
16983
17000
  createRenderEffect((_p$) => {
@@ -17016,7 +17033,7 @@ function OutlinePanel(props) {
17016
17033
  })();
17017
17034
  }
17018
17035
  delegateEvents(["click"]);
17019
- var _tmpl$$K = /* @__PURE__ */ template(`<div class=oasis-editor-toolbar-overflow-manager style="display:flex;align-items:center;flex:1 1 0%;min-width:0;position:relative;margin-right:8px"><button type=button class="oasis-editor-tool-button oasis-editor-tool-button-dropdown oasis-editor-toolbar-more-measure"aria-hidden=true tabindex=-1 style=position:absolute;visibility:hidden;pointer-events:none;right:0><i data-lucide=ellipsis></i></button><div style="display:flex;align-items:center;gap:8px;flex:1 1 0;min-width:0;overflow:hidden"></div><div style=flex-shrink:0;padding-left:8px;padding-right:16px;align-items:center><button type=button class="oasis-editor-tool-button oasis-editor-tool-button-dropdown"data-testid=editor-toolbar-overflow-dropdown><i data-lucide=ellipsis></i></button></div><div class="oasis-editor-toolbar-overflow-dropdown-menu oasis-editor-toolbar-overflow-menu"style="flex-direction:row;flex-wrap:wrap;align-items:center;gap:4px;padding:8px;background:var(--oasis-paper);border:1px solid var(--oasis-toolbar-border);border-radius:var(--oasis-radius);box-shadow:0 4px 12px rgba(0, 0, 0, 0.15);max-width:calc(100vw - 16px);overflow-x:hidden;overflow-y:auto">`), _tmpl$2$s = /* @__PURE__ */ template(`<div class=oasis-editor-toolbar-item-wrapper style=display:flex;align-items:center;flex-shrink:0>`);
17036
+ var _tmpl$$L = /* @__PURE__ */ template(`<div class=oasis-editor-toolbar-overflow-manager style="display:flex;align-items:center;flex:1 1 0%;min-width:0;position:relative;margin-right:8px"><button type=button class="oasis-editor-tool-button oasis-editor-tool-button-dropdown oasis-editor-toolbar-more-measure"aria-hidden=true tabindex=-1 style=position:absolute;visibility:hidden;pointer-events:none;right:0><i data-lucide=ellipsis></i></button><div style="display:flex;align-items:center;gap:8px;flex:1 1 0;min-width:0;overflow:hidden"></div><div style=flex-shrink:0;padding-left:8px;padding-right:16px;align-items:center><button type=button class="oasis-editor-tool-button oasis-editor-tool-button-dropdown"data-testid=editor-toolbar-overflow-dropdown><i data-lucide=ellipsis></i></button></div><div class="oasis-editor-toolbar-overflow-dropdown-menu oasis-editor-toolbar-overflow-menu"style="flex-direction:row;flex-wrap:wrap;align-items:center;gap:4px;padding:8px;background:var(--oasis-paper);border:1px solid var(--oasis-toolbar-border);border-radius:var(--oasis-radius);box-shadow:0 4px 12px rgba(0, 0, 0, 0.15);max-width:calc(100vw - 16px);overflow-x:hidden;overflow-y:auto">`), _tmpl$2$t = /* @__PURE__ */ template(`<div class=oasis-editor-toolbar-item-wrapper style=display:flex;align-items:center;flex-shrink:0>`);
17020
17037
  function ToolbarOverflowManager(props) {
17021
17038
  const [overflowCount, setOverflowCount] = createSignal(0);
17022
17039
  const [menuOpen, setMenuOpen] = createSignal(false);
@@ -17159,7 +17176,7 @@ function ToolbarOverflowManager(props) {
17159
17176
  };
17160
17177
  };
17161
17178
  return (() => {
17162
- var _el$ = _tmpl$$K(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.nextSibling, _el$5 = _el$4.firstChild, _el$6 = _el$4.nextSibling;
17179
+ var _el$ = _tmpl$$L(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.nextSibling, _el$5 = _el$4.firstChild, _el$6 = _el$4.nextSibling;
17163
17180
  var _ref$ = containerRef;
17164
17181
  typeof _ref$ === "function" ? use(_ref$, _el$) : containerRef = _el$;
17165
17182
  var _ref$2 = moreMeasureRef;
@@ -17171,7 +17188,7 @@ function ToolbarOverflowManager(props) {
17171
17188
  return items();
17172
17189
  },
17173
17190
  children: (item) => (() => {
17174
- var _el$7 = _tmpl$2$s();
17191
+ var _el$7 = _tmpl$2$t();
17175
17192
  insert(_el$7, item);
17176
17193
  return _el$7;
17177
17194
  })()
@@ -17247,12 +17264,12 @@ function resolveLabel(item, api) {
17247
17264
  if (item.labelKey) return api.t(item.labelKey);
17248
17265
  return void 0;
17249
17266
  }
17250
- var _tmpl$$J = /* @__PURE__ */ template(`<span>`), _tmpl$2$r = /* @__PURE__ */ template(`<button type=button>`);
17267
+ var _tmpl$$K = /* @__PURE__ */ template(`<span>`), _tmpl$2$s = /* @__PURE__ */ template(`<button type=button>`);
17251
17268
  function Button$1(props) {
17252
17269
  const [local, others] = splitProps(props, ["icon", "label", "active", "tooltip", "wide", "aria-label", "class", "classList"]);
17253
17270
  const ariaLabel = () => local["aria-label"] || local.tooltip || local.label || "";
17254
17271
  return (() => {
17255
- var _el$ = _tmpl$2$r();
17272
+ var _el$ = _tmpl$2$s();
17256
17273
  spread(_el$, mergeProps({
17257
17274
  get ["class"]() {
17258
17275
  return `oasis-editor-tool-button ${local.class || ""}`;
@@ -17288,7 +17305,7 @@ function Button$1(props) {
17288
17305
  return local.label;
17289
17306
  },
17290
17307
  get children() {
17291
- var _el$2 = _tmpl$$J();
17308
+ var _el$2 = _tmpl$$K();
17292
17309
  insert(_el$2, () => local.label);
17293
17310
  return _el$2;
17294
17311
  }
@@ -17370,7 +17387,7 @@ function useDismiss(options) {
17370
17387
  });
17371
17388
  });
17372
17389
  }
17373
- var _tmpl$$I = /* @__PURE__ */ template(`<div>`);
17390
+ var _tmpl$$J = /* @__PURE__ */ template(`<div>`);
17374
17391
  function Popover(props) {
17375
17392
  let anchorRef;
17376
17393
  let panelRef;
@@ -17387,7 +17404,7 @@ function Popover(props) {
17387
17404
  closeOnEscape: props.closeOnEscape
17388
17405
  });
17389
17406
  const panel = (portalled) => (() => {
17390
- var _el$ = _tmpl$$I();
17407
+ var _el$ = _tmpl$$J();
17391
17408
  addEventListener(_el$, "mouseleave", props.onPanelMouseLeave);
17392
17409
  var _ref$ = panelRef;
17393
17410
  typeof _ref$ === "function" ? use(_ref$, _el$) : panelRef = _el$;
@@ -17439,12 +17456,12 @@ function Popover(props) {
17439
17456
  }
17440
17457
  })];
17441
17458
  }
17442
- var _tmpl$$H = /* @__PURE__ */ template(`<div>`), _tmpl$2$q = /* @__PURE__ */ template(`<div class=oasis-editor-toolbar-dropdown>`), _tmpl$3$h = /* @__PURE__ */ template(`<i>`), _tmpl$4$b = /* @__PURE__ */ template(`<span class=oasis-editor-tool-button-label>`), _tmpl$5$a = /* @__PURE__ */ template(`<i data-lucide=chevron-down class=oasis-editor-dropdown-chevron>`), _tmpl$6$5 = /* @__PURE__ */ template(`<button type=button class="oasis-editor-tool-button oasis-editor-tool-button-dropdown"aria-haspopup=menu>`);
17459
+ var _tmpl$$I = /* @__PURE__ */ template(`<div>`), _tmpl$2$r = /* @__PURE__ */ template(`<div class=oasis-editor-toolbar-dropdown>`), _tmpl$3$h = /* @__PURE__ */ template(`<i>`), _tmpl$4$c = /* @__PURE__ */ template(`<span class=oasis-editor-tool-button-label>`), _tmpl$5$b = /* @__PURE__ */ template(`<i data-lucide=chevron-down class=oasis-editor-dropdown-chevron>`), _tmpl$6$5 = /* @__PURE__ */ template(`<button type=button class="oasis-editor-tool-button oasis-editor-tool-button-dropdown"aria-haspopup=menu>`);
17443
17460
  function Menu(props) {
17444
17461
  const [open, setOpen] = createSignal(false);
17445
17462
  const ariaLabel = () => props.tooltip || props.label || "";
17446
17463
  return (() => {
17447
- var _el$ = _tmpl$2$q();
17464
+ var _el$ = _tmpl$2$r();
17448
17465
  insert(_el$, createComponent(Popover, {
17449
17466
  get open() {
17450
17467
  return open();
@@ -17477,7 +17494,7 @@ function Menu(props) {
17477
17494
  return props.label;
17478
17495
  },
17479
17496
  get children() {
17480
- var _el$5 = _tmpl$4$b();
17497
+ var _el$5 = _tmpl$4$c();
17481
17498
  insert(_el$5, () => props.label);
17482
17499
  return _el$5;
17483
17500
  }
@@ -17487,7 +17504,7 @@ function Menu(props) {
17487
17504
  return !props.hideChevron;
17488
17505
  },
17489
17506
  get children() {
17490
- return _tmpl$5$a();
17507
+ return _tmpl$5$b();
17491
17508
  }
17492
17509
  }), null);
17493
17510
  createRenderEffect((_p$) => {
@@ -17510,7 +17527,7 @@ function Menu(props) {
17510
17527
  return _el$3;
17511
17528
  })(),
17512
17529
  get children() {
17513
- var _el$2 = _tmpl$$H();
17530
+ var _el$2 = _tmpl$$I();
17514
17531
  _el$2.$$click = (event) => {
17515
17532
  const el = event.target;
17516
17533
  if (el.closest("button") && !el.closest(".oasis-editor-tool-button-dropdown") && !el.closest(".oasis-editor-toolbar-list-options")) {
@@ -17525,7 +17542,7 @@ function Menu(props) {
17525
17542
  })();
17526
17543
  }
17527
17544
  delegateEvents(["click"]);
17528
- var _tmpl$$G = /* @__PURE__ */ template(`<select>`);
17545
+ var _tmpl$$H = /* @__PURE__ */ template(`<select>`);
17529
17546
  function Select(props) {
17530
17547
  let selectRef;
17531
17548
  const [local, others] = splitProps(props, ["wide", "small", "class", "tooltip", "aria-label", "value"]);
@@ -17541,7 +17558,7 @@ function Select(props) {
17541
17558
  }
17542
17559
  });
17543
17560
  return (() => {
17544
- var _el$ = _tmpl$$G();
17561
+ var _el$ = _tmpl$$H();
17545
17562
  var _ref$ = selectRef;
17546
17563
  typeof _ref$ === "function" ? use(_ref$, _el$) : selectRef = _el$;
17547
17564
  spread(_el$, mergeProps({
@@ -17568,15 +17585,15 @@ function Select(props) {
17568
17585
  return _el$;
17569
17586
  })();
17570
17587
  }
17571
- var _tmpl$$F = /* @__PURE__ */ template(`<div class=oasis-editor-toolbar-separator>`);
17588
+ var _tmpl$$G = /* @__PURE__ */ template(`<div class=oasis-editor-toolbar-separator>`);
17572
17589
  function Separator(props) {
17573
17590
  return (() => {
17574
- var _el$ = _tmpl$$F();
17591
+ var _el$ = _tmpl$$G();
17575
17592
  createRenderEffect((_$p) => setStyleProperty(_el$, "display", props.hidden ? "none" : void 0));
17576
17593
  return _el$;
17577
17594
  })();
17578
17595
  }
17579
- var _tmpl$$E = /* @__PURE__ */ template(`<div><button type=button class=oasis-editor-color-split-main></button><button type=button class=oasis-editor-color-split-menu-button aria-haspopup=menu><i data-lucide=chevron-down>`);
17596
+ var _tmpl$$F = /* @__PURE__ */ template(`<div><button type=button class=oasis-editor-color-split-main></button><button type=button class=oasis-editor-color-split-menu-button aria-haspopup=menu><i data-lucide=chevron-down>`);
17580
17597
  function SplitButton(props) {
17581
17598
  return createComponent(Popover, {
17582
17599
  get open() {
@@ -17595,7 +17612,7 @@ function SplitButton(props) {
17595
17612
  return props.onPanelMouseLeave;
17596
17613
  },
17597
17614
  trigger: (api) => (() => {
17598
- var _el$ = _tmpl$$E(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
17615
+ var _el$ = _tmpl$$F(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
17599
17616
  use((el) => api.ref(el), _el$);
17600
17617
  _el$2.$$click = () => props.onMain();
17601
17618
  insert(_el$2, () => props.mainContent);
@@ -17633,7 +17650,7 @@ function SplitButton(props) {
17633
17650
  });
17634
17651
  }
17635
17652
  delegateEvents(["click"]);
17636
- var _tmpl$$D = /* @__PURE__ */ template(`<i data-lucide=type>`), _tmpl$2$p = /* @__PURE__ */ template(`<button type=button class=oasis-editor-color-menu-action role=menuitem><span class=oasis-editor-color-menu-action-swatch></span><span>`), _tmpl$3$g = /* @__PURE__ */ template(`<div class=oasis-editor-color-menu-section><div class=oasis-editor-color-menu-heading></div><div class=oasis-editor-color-theme-grid>`), _tmpl$4$a = /* @__PURE__ */ template(`<div class=oasis-editor-color-menu-section><div class=oasis-editor-color-menu-heading></div><div class=oasis-editor-color-standard-grid>`), _tmpl$5$9 = /* @__PURE__ */ template(`<button type=button class=oasis-editor-color-menu-action role=menuitem><span class="oasis-editor-color-menu-action-swatch oasis-editor-color-menu-more-swatch"></span><span>`), _tmpl$6$4 = /* @__PURE__ */ template(`<input type=color class=oasis-editor-color-custom-input>`), _tmpl$7$2 = /* @__PURE__ */ template(`<span class=oasis-editor-color-split-icon><i></i><span class=oasis-editor-color-split-indicator>`), _tmpl$8$1 = /* @__PURE__ */ template(`<i data-lucide=slash>`), _tmpl$9 = /* @__PURE__ */ template(`<div class=oasis-editor-color-theme-column>`), _tmpl$0 = /* @__PURE__ */ template(`<button type=button class=oasis-editor-color-swatch>`);
17653
+ var _tmpl$$E = /* @__PURE__ */ template(`<i data-lucide=type>`), _tmpl$2$q = /* @__PURE__ */ template(`<button type=button class=oasis-editor-color-menu-action role=menuitem><span class=oasis-editor-color-menu-action-swatch></span><span>`), _tmpl$3$g = /* @__PURE__ */ template(`<div class=oasis-editor-color-menu-section><div class=oasis-editor-color-menu-heading></div><div class=oasis-editor-color-theme-grid>`), _tmpl$4$b = /* @__PURE__ */ template(`<div class=oasis-editor-color-menu-section><div class=oasis-editor-color-menu-heading></div><div class=oasis-editor-color-standard-grid>`), _tmpl$5$a = /* @__PURE__ */ template(`<button type=button class=oasis-editor-color-menu-action role=menuitem><span class="oasis-editor-color-menu-action-swatch oasis-editor-color-menu-more-swatch"></span><span>`), _tmpl$6$4 = /* @__PURE__ */ template(`<input type=color class=oasis-editor-color-custom-input>`), _tmpl$7$2 = /* @__PURE__ */ template(`<span class=oasis-editor-color-split-icon><i></i><span class=oasis-editor-color-split-indicator>`), _tmpl$8$1 = /* @__PURE__ */ template(`<i data-lucide=slash>`), _tmpl$9 = /* @__PURE__ */ template(`<div class=oasis-editor-color-theme-column>`), _tmpl$0 = /* @__PURE__ */ template(`<button type=button class=oasis-editor-color-swatch>`);
17637
17654
  const normalizeColor = (value) => (value == null ? void 0 : value.trim().toLowerCase()) ?? "";
17638
17655
  function ColorPicker(props) {
17639
17656
  const [isOpen, setIsOpen] = createSignal(false);
@@ -17698,7 +17715,7 @@ function ColorPicker(props) {
17698
17715
  return clearLabel();
17699
17716
  },
17700
17717
  get children() {
17701
- var _el$ = _tmpl$2$p(), _el$2 = _el$.firstChild, _el$4 = _el$2.nextSibling;
17718
+ var _el$ = _tmpl$2$q(), _el$2 = _el$.firstChild, _el$4 = _el$2.nextSibling;
17702
17719
  _el$.$$click = () => applyColor(null);
17703
17720
  insert(_el$2, createComponent(Show, {
17704
17721
  get when() {
@@ -17708,7 +17725,7 @@ function ColorPicker(props) {
17708
17725
  return _tmpl$8$1();
17709
17726
  },
17710
17727
  get children() {
17711
- return _tmpl$$D();
17728
+ return _tmpl$$E();
17712
17729
  }
17713
17730
  }));
17714
17731
  insert(_el$4, clearLabel);
@@ -17756,7 +17773,7 @@ function ColorPicker(props) {
17756
17773
  }));
17757
17774
  return _el$5;
17758
17775
  })(), (() => {
17759
- var _el$8 = _tmpl$4$a(), _el$9 = _el$8.firstChild, _el$0 = _el$9.nextSibling;
17776
+ var _el$8 = _tmpl$4$b(), _el$9 = _el$8.firstChild, _el$0 = _el$9.nextSibling;
17760
17777
  insert(_el$9, () => props.standardColorsLabel);
17761
17778
  insert(_el$0, createComponent(For, {
17762
17779
  get each() {
@@ -17793,7 +17810,7 @@ function ColorPicker(props) {
17793
17810
  },
17794
17811
  get children() {
17795
17812
  return [(() => {
17796
- var _el$1 = _tmpl$5$9(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling;
17813
+ var _el$1 = _tmpl$5$a(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling;
17797
17814
  _el$1.$$click = () => customColorInputRef == null ? void 0 : customColorInputRef.click();
17798
17815
  insert(_el$11, () => props.moreColorsLabel);
17799
17816
  createRenderEffect(() => setAttribute(_el$1, "data-testid", `${props.testId}-more-colors`));
@@ -17821,7 +17838,7 @@ function ColorPicker(props) {
17821
17838
  });
17822
17839
  }
17823
17840
  delegateEvents(["click", "input"]);
17824
- var _tmpl$$C = /* @__PURE__ */ template(`<div class=oasis-editor-table-grid-picker-status>`), _tmpl$2$o = /* @__PURE__ */ template(`<div class=oasis-editor-table-grid-picker-grid>`), _tmpl$3$f = /* @__PURE__ */ template(`<div class=oasis-editor-toolbar-dropdown>`), _tmpl$4$9 = /* @__PURE__ */ template(`<button type=button class=oasis-editor-tool-button><i>`), _tmpl$5$8 = /* @__PURE__ */ template(`<button type=button class=oasis-editor-table-grid-picker-cell>`);
17841
+ var _tmpl$$D = /* @__PURE__ */ template(`<div class=oasis-editor-table-grid-picker-status>`), _tmpl$2$p = /* @__PURE__ */ template(`<div class=oasis-editor-table-grid-picker-grid>`), _tmpl$3$f = /* @__PURE__ */ template(`<div class=oasis-editor-toolbar-dropdown>`), _tmpl$4$a = /* @__PURE__ */ template(`<button type=button class=oasis-editor-tool-button><i>`), _tmpl$5$9 = /* @__PURE__ */ template(`<button type=button class=oasis-editor-table-grid-picker-cell>`);
17825
17842
  function GridPicker(props) {
17826
17843
  const [isOpen, setIsOpen] = createSignal(false);
17827
17844
  const [hover, setHover] = createSignal({
@@ -17907,7 +17924,7 @@ function GridPicker(props) {
17907
17924
  col: 0
17908
17925
  }),
17909
17926
  trigger: (api) => (() => {
17910
- var _el$4 = _tmpl$4$9(), _el$5 = _el$4.firstChild;
17927
+ var _el$4 = _tmpl$4$a(), _el$5 = _el$4.firstChild;
17911
17928
  _el$4.$$click = () => api.toggle();
17912
17929
  use((el) => api.ref(el), _el$4);
17913
17930
  createRenderEffect((_p$) => {
@@ -17929,11 +17946,11 @@ function GridPicker(props) {
17929
17946
  })(),
17930
17947
  get children() {
17931
17948
  return [(() => {
17932
- var _el$2 = _tmpl$$C();
17949
+ var _el$2 = _tmpl$$D();
17933
17950
  insert(_el$2, statusLabel);
17934
17951
  return _el$2;
17935
17952
  })(), (() => {
17936
- var _el$3 = _tmpl$2$o();
17953
+ var _el$3 = _tmpl$2$p();
17937
17954
  insert(_el$3, createComponent(For, {
17938
17955
  get each() {
17939
17956
  return rows();
@@ -17943,7 +17960,7 @@ function GridPicker(props) {
17943
17960
  return cols();
17944
17961
  },
17945
17962
  children: (c) => (() => {
17946
- var _el$6 = _tmpl$5$8();
17963
+ var _el$6 = _tmpl$5$9();
17947
17964
  _el$6.$$click = () => selectGridSize(r, c);
17948
17965
  _el$6.$$mousedown = (event) => event.preventDefault();
17949
17966
  _el$6.addEventListener("mouseenter", () => setHover({
@@ -18033,7 +18050,7 @@ const DEFAULT_PALETTE = {
18033
18050
  standardColors: STANDARD_COLORS,
18034
18051
  allowCustom: true
18035
18052
  };
18036
- var _tmpl$$B = /* @__PURE__ */ template(`<i>`), _tmpl$2$n = /* @__PURE__ */ template(`<option value>`), _tmpl$3$e = /* @__PURE__ */ template(`<option>`);
18053
+ var _tmpl$$C = /* @__PURE__ */ template(`<option value>`), _tmpl$2$o = /* @__PURE__ */ template(`<option>`);
18037
18054
  function renderMenuContent(content, api) {
18038
18055
  if (content.kind === "custom") {
18039
18056
  return content.render(api);
@@ -18161,14 +18178,16 @@ function RenderSplit(props) {
18161
18178
  get menuTestId() {
18162
18179
  return memo(() => !!props.item.testId)() ? `${props.item.testId}-dropdown` : void 0;
18163
18180
  },
18164
- panelClass: "oasis-editor-color-menu",
18181
+ get panelClass() {
18182
+ return props.item.panelClass ?? "oasis-editor-color-menu";
18183
+ },
18165
18184
  panelRole: "menu",
18166
18185
  get mainContent() {
18167
- return (() => {
18168
- var _el$ = _tmpl$$B();
18169
- createRenderEffect(() => setAttribute(_el$, "data-lucide", props.item.iconName));
18170
- return _el$;
18171
- })();
18186
+ return memo(() => !!props.item.iconName)() ? createComponent(ToolIcon, {
18187
+ get name() {
18188
+ return props.item.iconName;
18189
+ }
18190
+ }) : [];
18172
18191
  },
18173
18192
  get children() {
18174
18193
  return renderMenuContent(props.item.menu, props.api);
@@ -18204,19 +18223,19 @@ function RenderSelect(props) {
18204
18223
  return props.item.placeholder !== void 0;
18205
18224
  },
18206
18225
  get children() {
18207
- var _el$2 = _tmpl$2$n();
18208
- insert(_el$2, () => props.item.placeholder);
18209
- return _el$2;
18226
+ var _el$ = _tmpl$$C();
18227
+ insert(_el$, () => props.item.placeholder);
18228
+ return _el$;
18210
18229
  }
18211
18230
  }), createComponent(For, {
18212
18231
  get each() {
18213
18232
  return props.item.options(props.api);
18214
18233
  },
18215
18234
  children: (option) => (() => {
18216
- var _el$3 = _tmpl$3$e();
18217
- insert(_el$3, () => option.label);
18218
- createRenderEffect(() => _el$3.value = option.value);
18219
- return _el$3;
18235
+ var _el$2 = _tmpl$2$o();
18236
+ insert(_el$2, () => option.label);
18237
+ createRenderEffect(() => _el$2.value = option.value);
18238
+ return _el$2;
18220
18239
  })()
18221
18240
  })];
18222
18241
  }
@@ -18336,12 +18355,12 @@ function registerToolbarRenderer(type, component) {
18336
18355
  function resolveRenderer(type) {
18337
18356
  return TOOLBAR_RENDERERS[type] ?? customRenderers.get(type);
18338
18357
  }
18339
- var _tmpl$$A = /* @__PURE__ */ template(`<div class=oasis-editor-toolbar-item style=align-items:center>`);
18358
+ var _tmpl$$B = /* @__PURE__ */ template(`<div class=oasis-editor-toolbar-item style=align-items:center>`);
18340
18359
  function ToolbarItemRenderer(props) {
18341
18360
  const binding = bindItem(props.item, props.api);
18342
18361
  const component = () => resolveRenderer(props.item.type);
18343
18362
  return (() => {
18344
- var _el$ = _tmpl$$A();
18363
+ var _el$ = _tmpl$$B();
18345
18364
  insert(_el$, createComponent(Show, {
18346
18365
  get when() {
18347
18366
  return component();
@@ -18467,7 +18486,7 @@ function buildRibbonGroups(items, tab) {
18467
18486
  });
18468
18487
  return Array.from(groups.values()).sort((a, b) => a.order - b.order);
18469
18488
  }
18470
- var _tmpl$$z = /* @__PURE__ */ template(`<div class=oasis-editor-ribbon-tabs role=tablist>`), _tmpl$2$m = /* @__PURE__ */ template(`<button type=button class=oasis-editor-ribbon-tab role=tab>`);
18489
+ var _tmpl$$A = /* @__PURE__ */ template(`<div class=oasis-editor-ribbon-tabs role=tablist>`), _tmpl$2$n = /* @__PURE__ */ template(`<button type=button class=oasis-editor-ribbon-tab role=tab>`);
18471
18490
  function RibbonTabs(props) {
18472
18491
  const tabs = RIBBON_TAB_DEFINITIONS;
18473
18492
  const moveTab = (current, delta) => {
@@ -18476,11 +18495,11 @@ function RibbonTabs(props) {
18476
18495
  if (next) props.setActiveTab(next.id);
18477
18496
  };
18478
18497
  return (() => {
18479
- var _el$ = _tmpl$$z();
18498
+ var _el$ = _tmpl$$A();
18480
18499
  insert(_el$, createComponent(For, {
18481
18500
  each: tabs,
18482
18501
  children: (tab) => (() => {
18483
- var _el$2 = _tmpl$2$m();
18502
+ var _el$2 = _tmpl$2$n();
18484
18503
  _el$2.$$keydown = (event) => {
18485
18504
  if (event.key === "ArrowRight") {
18486
18505
  event.preventDefault();
@@ -18522,10 +18541,10 @@ function RibbonTabs(props) {
18522
18541
  })();
18523
18542
  }
18524
18543
  delegateEvents(["click", "keydown"]);
18525
- var _tmpl$$y = /* @__PURE__ */ template(`<div class=oasis-editor-ribbon-row>`);
18544
+ var _tmpl$$z = /* @__PURE__ */ template(`<div class=oasis-editor-ribbon-row>`);
18526
18545
  function RibbonRow(props) {
18527
18546
  return (() => {
18528
- var _el$ = _tmpl$$y();
18547
+ var _el$ = _tmpl$$z();
18529
18548
  insert(_el$, createComponent(For, {
18530
18549
  get each() {
18531
18550
  return props.items;
@@ -18540,10 +18559,10 @@ function RibbonRow(props) {
18540
18559
  return _el$;
18541
18560
  })();
18542
18561
  }
18543
- var _tmpl$$x = /* @__PURE__ */ template(`<section class=oasis-editor-ribbon-group><div class=oasis-editor-ribbon-group-rows></div><div class=oasis-editor-ribbon-group-label>`);
18562
+ var _tmpl$$y = /* @__PURE__ */ template(`<section class=oasis-editor-ribbon-group><div class=oasis-editor-ribbon-group-rows></div><div class=oasis-editor-ribbon-group-label>`);
18544
18563
  function RibbonGroup(props) {
18545
18564
  return (() => {
18546
- var _el$ = _tmpl$$x(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
18565
+ var _el$ = _tmpl$$y(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
18547
18566
  insert(_el$2, createComponent(RibbonRow, {
18548
18567
  get items() {
18549
18568
  return props.group.rows[1];
@@ -18573,11 +18592,11 @@ function RibbonGroup(props) {
18573
18592
  return _el$;
18574
18593
  })();
18575
18594
  }
18576
- var _tmpl$$w = /* @__PURE__ */ template(`<div class=oasis-editor-ribbon-panel role=tabpanel data-testid=editor-ribbon-panel>`);
18595
+ var _tmpl$$x = /* @__PURE__ */ template(`<div class=oasis-editor-ribbon-panel role=tabpanel data-testid=editor-ribbon-panel>`);
18577
18596
  function RibbonPanel(props) {
18578
18597
  const groups = () => buildRibbonGroups(props.items(), props.activeTab());
18579
18598
  return (() => {
18580
- var _el$ = _tmpl$$w();
18599
+ var _el$ = _tmpl$$x();
18581
18600
  insert(_el$, createComponent(For, {
18582
18601
  get each() {
18583
18602
  return groups();
@@ -18601,7 +18620,7 @@ function RibbonPanel(props) {
18601
18620
  return _el$;
18602
18621
  })();
18603
18622
  }
18604
- var _tmpl$$v = /* @__PURE__ */ template(`<section class=oasis-editor-toolbar>`), _tmpl$2$l = /* @__PURE__ */ template(`<div class=oasis-editor-toolbar-wrap-strip>`);
18623
+ var _tmpl$$w = /* @__PURE__ */ template(`<section class=oasis-editor-toolbar>`), _tmpl$2$m = /* @__PURE__ */ template(`<div class=oasis-editor-toolbar-wrap-strip>`);
18605
18624
  const shouldAllowNativeMouseDown = (target) => target instanceof Element && target.closest("select, input, textarea, label") !== null;
18606
18625
  function Toolbar(props) {
18607
18626
  const api = createToolbarApi(props.host);
@@ -18631,7 +18650,7 @@ function Toolbar(props) {
18631
18650
  })
18632
18651
  });
18633
18652
  return (() => {
18634
- var _el$ = _tmpl$$v();
18653
+ var _el$ = _tmpl$$w();
18635
18654
  _el$.$$mousedown = (event) => {
18636
18655
  if (shouldAllowNativeMouseDown(event.target)) {
18637
18656
  return;
@@ -18652,7 +18671,7 @@ function Toolbar(props) {
18652
18671
  return renderItems();
18653
18672
  }
18654
18673
  }) : (() => {
18655
- var _el$2 = _tmpl$2$l();
18674
+ var _el$2 = _tmpl$2$m();
18656
18675
  insert(_el$2, renderItems);
18657
18676
  return _el$2;
18658
18677
  })();
@@ -18981,10 +19000,10 @@ function createLayoutIdentityStabilizer() {
18981
19000
  return { pages };
18982
19001
  };
18983
19002
  }
18984
- var _tmpl$$u = /* @__PURE__ */ template(`<div class=oasis-editor-page-break style="display:flex;align-items:center;justify-content:center;margin:16px 0;position:relative;user-select:none"><div style="position:absolute;left:0;right:0;top:50%;border-top:1px dashed var(--oasis-toolbar-border, #e0e3e7)"></div><div style="background:var(--oasis-bg, #f6f8fb);padding:0 12px;color:var(--oasis-text-muted, #5f6368);font-size:12px;font-family:var(--oasis-font-ui, sans-serif);z-index:1">`);
19003
+ var _tmpl$$v = /* @__PURE__ */ template(`<div class=oasis-editor-page-break style="display:flex;align-items:center;justify-content:center;margin:16px 0;position:relative;user-select:none"><div style="position:absolute;left:0;right:0;top:50%;border-top:1px dashed var(--oasis-toolbar-border, #e0e3e7)"></div><div style="background:var(--oasis-bg, #f6f8fb);padding:0 12px;color:var(--oasis-text-muted, #5f6368);font-size:12px;font-family:var(--oasis-font-ui, sans-serif);z-index:1">`);
18985
19004
  function PageBreak(props) {
18986
19005
  return (() => {
18987
- var _el$ = _tmpl$$u(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
19006
+ var _el$ = _tmpl$$v(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
18988
19007
  insert(_el$3, () => t("metric.pageBreak") || "Page Break");
18989
19008
  return _el$;
18990
19009
  })();
@@ -19453,7 +19472,7 @@ function createCanvasPageRenderer(options) {
19453
19472
  }
19454
19473
  };
19455
19474
  }
19456
- var _tmpl$$t = /* @__PURE__ */ template(`<div class="oasis-editor-paper-stack oasis-editor-canvas-stack"style=position:relative>`), _tmpl$2$k = /* @__PURE__ */ template(`<div class=oasis-editor-canvas-page-slot style=position:relative>`), _tmpl$3$d = /* @__PURE__ */ template(`<div class=oasis-editor-paper data-renderer=canvas data-testid=editor-page style=position:relative;z-index:1><canvas>`);
19475
+ var _tmpl$$u = /* @__PURE__ */ template(`<div class="oasis-editor-paper-stack oasis-editor-canvas-stack"style=position:relative>`), _tmpl$2$l = /* @__PURE__ */ template(`<div class=oasis-editor-canvas-page-slot style=position:relative>`), _tmpl$3$e = /* @__PURE__ */ template(`<div class=oasis-editor-paper data-renderer=canvas data-testid=editor-page style=position:relative;z-index:1><canvas>`);
19457
19476
  const canvasTextMeasurer = {
19458
19477
  composeMeasuredParagraphLines: (options) => domTextMeasurer.composeMeasuredParagraphLines(options),
19459
19478
  resolveRenderedLineHeightPx: (styles, lineHeightMultiple) => domTextMeasurer.resolveRenderedLineHeightPx(styles, lineHeightMultiple)
@@ -19522,7 +19541,7 @@ function CanvasEditorSurface(props) {
19522
19541
  return layout;
19523
19542
  });
19524
19543
  return (() => {
19525
- var _el$ = _tmpl$$t();
19544
+ var _el$ = _tmpl$$u();
19526
19545
  insert(_el$, createComponent(Index, {
19527
19546
  get each() {
19528
19547
  return documentLayout().pages;
@@ -19534,7 +19553,7 @@ function CanvasEditorSurface(props) {
19534
19553
  // inserting an image that triggers re-pagination in a narrow viewport),
19535
19554
  // causing "Failed to execute 'insertBefore'" errors.
19536
19555
  (() => {
19537
- var _el$2 = _tmpl$2$k();
19556
+ var _el$2 = _tmpl$2$l();
19538
19557
  insert(_el$2, createComponent(Show, {
19539
19558
  when: index > 0,
19540
19559
  get children() {
@@ -19607,7 +19626,7 @@ function CanvasPage(props) {
19607
19626
  });
19608
19627
  onCleanup(() => renderer.dispose());
19609
19628
  return (() => {
19610
- var _el$3 = _tmpl$3$d(), _el$4 = _el$3.firstChild;
19629
+ var _el$3 = _tmpl$3$e(), _el$4 = _el$3.firstChild;
19611
19630
  addEventListener(_el$3, "dblclick", props.onSurfaceDblClick, true);
19612
19631
  addEventListener(_el$3, "mousemove", props.onSurfaceMouseMove, true);
19613
19632
  addEventListener(_el$3, "click", props.onSurfaceClick, true);
@@ -19944,7 +19963,7 @@ function computeRulerTicks(pageWidth, contentLeft, unit) {
19944
19963
  pushSide(-1);
19945
19964
  return ticks;
19946
19965
  }
19947
- var _tmpl$$s = /* @__PURE__ */ template(`<div class=oasis-editor-horizontal-ruler data-testid=editor-horizontal-ruler role=presentation><div class=oasis-editor-horizontal-ruler-track><div class=oasis-editor-horizontal-ruler-page><div class=oasis-editor-horizontal-ruler-margin style=left:0px></div><div class=oasis-editor-horizontal-ruler-margin></div><div class=oasis-editor-horizontal-ruler-content></div><button type=button class=oasis-editor-horizontal-ruler-margin-handle></button><button type=button class=oasis-editor-horizontal-ruler-margin-handle></button><button type=button class="oasis-editor-ruler-marker oasis-editor-ruler-marker-first-line"></button><button type=button class="oasis-editor-ruler-marker oasis-editor-ruler-marker-hanging"></button><button type=button class="oasis-editor-ruler-marker oasis-editor-ruler-marker-left-box"></button><button type=button class="oasis-editor-ruler-marker oasis-editor-ruler-marker-right-indent">`), _tmpl$2$j = /* @__PURE__ */ template(`<div>`), _tmpl$3$c = /* @__PURE__ */ template(`<div class=oasis-editor-horizontal-ruler-label>`);
19966
+ var _tmpl$$t = /* @__PURE__ */ template(`<div class=oasis-editor-horizontal-ruler data-testid=editor-horizontal-ruler role=presentation><div class=oasis-editor-horizontal-ruler-track><div class=oasis-editor-horizontal-ruler-page><div class=oasis-editor-horizontal-ruler-margin style=left:0px></div><div class=oasis-editor-horizontal-ruler-margin></div><div class=oasis-editor-horizontal-ruler-content></div><button type=button class=oasis-editor-horizontal-ruler-margin-handle></button><button type=button class=oasis-editor-horizontal-ruler-margin-handle></button><button type=button class="oasis-editor-ruler-marker oasis-editor-ruler-marker-first-line"></button><button type=button class="oasis-editor-ruler-marker oasis-editor-ruler-marker-hanging"></button><button type=button class="oasis-editor-ruler-marker oasis-editor-ruler-marker-left-box"></button><button type=button class="oasis-editor-ruler-marker oasis-editor-ruler-marker-right-indent">`), _tmpl$2$k = /* @__PURE__ */ template(`<div>`), _tmpl$3$d = /* @__PURE__ */ template(`<div class=oasis-editor-horizontal-ruler-label>`);
19948
19967
  function getActivePageSettings(state) {
19949
19968
  var _a;
19950
19969
  const idx = getActiveSectionIndex(state);
@@ -20147,7 +20166,7 @@ function HorizontalRuler(props) {
20147
20166
  }
20148
20167
  };
20149
20168
  return (() => {
20150
- var _el$ = _tmpl$$s(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$5.nextSibling, _el$7 = _el$6.nextSibling, _el$8 = _el$7.nextSibling, _el$9 = _el$8.nextSibling, _el$0 = _el$9.nextSibling, _el$1 = _el$0.nextSibling, _el$10 = _el$1.nextSibling;
20169
+ var _el$ = _tmpl$$t(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$5.nextSibling, _el$7 = _el$6.nextSibling, _el$8 = _el$7.nextSibling, _el$9 = _el$8.nextSibling, _el$0 = _el$9.nextSibling, _el$1 = _el$0.nextSibling, _el$10 = _el$1.nextSibling;
20151
20170
  var _ref$ = pageRef;
20152
20171
  typeof _ref$ === "function" ? use(_ref$, _el$3) : pageRef = _el$3;
20153
20172
  insert(_el$3, createComponent(For, {
@@ -20155,7 +20174,7 @@ function HorizontalRuler(props) {
20155
20174
  return ticks();
20156
20175
  },
20157
20176
  children: (tick) => [(() => {
20158
- var _el$11 = _tmpl$2$j();
20177
+ var _el$11 = _tmpl$2$k();
20159
20178
  createRenderEffect((_p$) => {
20160
20179
  var _v$27 = `oasis-editor-horizontal-ruler-tick oasis-editor-horizontal-ruler-tick-${tick.kind}`, _v$28 = `${tick.x}px`;
20161
20180
  _v$27 !== _p$.e && className(_el$11, _p$.e = _v$27);
@@ -20167,7 +20186,7 @@ function HorizontalRuler(props) {
20167
20186
  });
20168
20187
  return _el$11;
20169
20188
  })(), memo(() => memo(() => !!tick.label)() && (() => {
20170
- var _el$12 = _tmpl$3$c();
20189
+ var _el$12 = _tmpl$3$d();
20171
20190
  insert(_el$12, () => tick.label);
20172
20191
  createRenderEffect((_$p) => setStyleProperty(_el$12, "left", `${tick.x}px`));
20173
20192
  return _el$12;
@@ -20244,10 +20263,10 @@ function HorizontalRuler(props) {
20244
20263
  })();
20245
20264
  }
20246
20265
  delegateEvents(["pointerdown"]);
20247
- var _tmpl$$r = /* @__PURE__ */ template(`<span aria-hidden=true class=oasis-editor-caret>`);
20266
+ var _tmpl$$s = /* @__PURE__ */ template(`<span aria-hidden=true class=oasis-editor-caret>`);
20248
20267
  function CaretOverlay(props) {
20249
20268
  return (() => {
20250
- var _el$ = _tmpl$$r();
20269
+ var _el$ = _tmpl$$s();
20251
20270
  createRenderEffect((_p$) => {
20252
20271
  var _v$ = !!props.active, _v$2 = {
20253
20272
  left: `${props.left}px`,
@@ -20268,16 +20287,16 @@ function CaretOverlay(props) {
20268
20287
  return _el$;
20269
20288
  })();
20270
20289
  }
20271
- var _tmpl$$q = /* @__PURE__ */ template(`<div aria-hidden=true class=oasis-editor-selection-overlay-root>`), _tmpl$2$i = /* @__PURE__ */ template(`<span aria-hidden=true class=oasis-editor-selection-box data-testid=editor-selection-box>`);
20290
+ var _tmpl$$r = /* @__PURE__ */ template(`<div aria-hidden=true class=oasis-editor-selection-overlay-root>`), _tmpl$2$j = /* @__PURE__ */ template(`<span aria-hidden=true class=oasis-editor-selection-box data-testid=editor-selection-box>`);
20272
20291
  function SelectionOverlay(props) {
20273
20292
  return (() => {
20274
- var _el$ = _tmpl$$q();
20293
+ var _el$ = _tmpl$$r();
20275
20294
  insert(_el$, createComponent(Index, {
20276
20295
  get each() {
20277
20296
  return props.boxes;
20278
20297
  },
20279
20298
  children: (box) => (() => {
20280
- var _el$2 = _tmpl$2$i();
20299
+ var _el$2 = _tmpl$2$j();
20281
20300
  createRenderEffect((_p$) => {
20282
20301
  var _v$ = `${box().left}px`, _v$2 = `${box().top}px`, _v$3 = `${box().width}px`, _v$4 = `${box().height}px`;
20283
20302
  _v$ !== _p$.e && setStyleProperty(_el$2, "left", _p$.e = _v$);
@@ -20297,7 +20316,7 @@ function SelectionOverlay(props) {
20297
20316
  return _el$;
20298
20317
  })();
20299
20318
  }
20300
- var _tmpl$$p = /* @__PURE__ */ template(`<div class=oasis-editor-revision-overlay data-testid=editor-revision-overlay><div class=oasis-editor-revision-overlay-content><span class=oasis-editor-revision-overlay-author><strong>:</strong> </span><span class=oasis-editor-revision-overlay-date></span></div><div class=oasis-editor-revision-overlay-arrow>`);
20319
+ var _tmpl$$q = /* @__PURE__ */ template(`<div class=oasis-editor-revision-overlay data-testid=editor-revision-overlay><div class=oasis-editor-revision-overlay-content><span class=oasis-editor-revision-overlay-author><strong>:</strong> </span><span class=oasis-editor-revision-overlay-date></span></div><div class=oasis-editor-revision-overlay-arrow>`);
20301
20320
  function RevisionOverlay(props) {
20302
20321
  const formattedDate = () => {
20303
20322
  try {
@@ -20308,7 +20327,7 @@ function RevisionOverlay(props) {
20308
20327
  };
20309
20328
  const label = () => props.box.type === "insert" ? "Inserido por" : "Excluído por";
20310
20329
  return (() => {
20311
- var _el$ = _tmpl$$p(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
20330
+ var _el$ = _tmpl$$q(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
20312
20331
  _el$4.nextSibling;
20313
20332
  var _el$7 = _el$3.nextSibling;
20314
20333
  insert(_el$4, label, _el$5);
@@ -20326,6 +20345,111 @@ function RevisionOverlay(props) {
20326
20345
  return _el$;
20327
20346
  })();
20328
20347
  }
20348
+ var _tmpl$$p = /* @__PURE__ */ template(`<div aria-hidden=true class=oasis-editor-comment-overlay-root>`), _tmpl$2$i = /* @__PURE__ */ template(`<span class=oasis-editor-comment-highlight data-testid=editor-comment-highlight>`), _tmpl$3$c = /* @__PURE__ */ template(`<span class=oasis-editor-comment-popup-date>`), _tmpl$4$9 = /* @__PURE__ */ template(`<span class=oasis-editor-comment-popup-resolved>✓`), _tmpl$5$8 = /* @__PURE__ */ template(`<div class=oasis-editor-comment-popup data-testid=editor-comment-popup><div class=oasis-editor-comment-popup-header><span class=oasis-editor-comment-popup-author></span></div><div class=oasis-editor-comment-popup-body>`);
20349
+ function CommentHighlightOverlay(props) {
20350
+ const [activeCommentId, setActiveCommentId] = createSignal(null);
20351
+ const activeComment = createMemo(() => {
20352
+ const id = activeCommentId();
20353
+ if (!id) return null;
20354
+ return props.commentsById()[id] ?? null;
20355
+ });
20356
+ const popupAnchor = createMemo(() => {
20357
+ const id = activeCommentId();
20358
+ if (!id) return null;
20359
+ let best = null;
20360
+ for (const box of props.boxes()) {
20361
+ if (box.commentId !== id) continue;
20362
+ if (!best || box.top < best.top) best = box;
20363
+ }
20364
+ return best;
20365
+ });
20366
+ const formattedDate = (date) => {
20367
+ if (date === void 0) return "";
20368
+ try {
20369
+ return new Date(date).toLocaleString();
20370
+ } catch {
20371
+ return "";
20372
+ }
20373
+ };
20374
+ return (() => {
20375
+ var _el$ = _tmpl$$p();
20376
+ insert(_el$, createComponent(For, {
20377
+ get each() {
20378
+ return props.boxes();
20379
+ },
20380
+ children: (box) => (() => {
20381
+ var _el$2 = _tmpl$2$i();
20382
+ _el$2.$$click = () => setActiveCommentId(box.commentId);
20383
+ _el$2.addEventListener("mouseenter", () => setActiveCommentId(box.commentId));
20384
+ createRenderEffect((_p$) => {
20385
+ var _v$ = !!(activeCommentId() === box.commentId), _v$2 = box.commentId, _v$3 = `${box.left}px`, _v$4 = `${box.top}px`, _v$5 = `${box.width}px`, _v$6 = `${box.height}px`;
20386
+ _v$ !== _p$.e && _el$2.classList.toggle("oasis-editor-comment-highlight-active", _p$.e = _v$);
20387
+ _v$2 !== _p$.t && setAttribute(_el$2, "data-comment-id", _p$.t = _v$2);
20388
+ _v$3 !== _p$.a && setStyleProperty(_el$2, "left", _p$.a = _v$3);
20389
+ _v$4 !== _p$.o && setStyleProperty(_el$2, "top", _p$.o = _v$4);
20390
+ _v$5 !== _p$.i && setStyleProperty(_el$2, "width", _p$.i = _v$5);
20391
+ _v$6 !== _p$.n && setStyleProperty(_el$2, "height", _p$.n = _v$6);
20392
+ return _p$;
20393
+ }, {
20394
+ e: void 0,
20395
+ t: void 0,
20396
+ a: void 0,
20397
+ o: void 0,
20398
+ i: void 0,
20399
+ n: void 0
20400
+ });
20401
+ return _el$2;
20402
+ })()
20403
+ }), null);
20404
+ insert(_el$, createComponent(Show, {
20405
+ get when() {
20406
+ return memo(() => !!activeComment())() && popupAnchor();
20407
+ },
20408
+ get children() {
20409
+ return (() => {
20410
+ const comment = activeComment();
20411
+ const anchor = popupAnchor();
20412
+ return (() => {
20413
+ var _el$3 = _tmpl$5$8(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild, _el$8 = _el$4.nextSibling;
20414
+ _el$3.addEventListener("mouseleave", () => setActiveCommentId(null));
20415
+ insert(_el$5, () => comment.author || "—");
20416
+ insert(_el$4, createComponent(Show, {
20417
+ get when() {
20418
+ return comment.date !== void 0;
20419
+ },
20420
+ get children() {
20421
+ var _el$6 = _tmpl$3$c();
20422
+ insert(_el$6, () => formattedDate(comment.date));
20423
+ return _el$6;
20424
+ }
20425
+ }), null);
20426
+ insert(_el$4, createComponent(Show, {
20427
+ get when() {
20428
+ return comment.resolved;
20429
+ },
20430
+ get children() {
20431
+ return _tmpl$4$9();
20432
+ }
20433
+ }), null);
20434
+ insert(_el$8, () => comment.text);
20435
+ createRenderEffect((_p$) => {
20436
+ var _v$7 = `${anchor.left}px`, _v$8 = `${anchor.top + anchor.height + 6}px`;
20437
+ _v$7 !== _p$.e && setStyleProperty(_el$3, "left", _p$.e = _v$7);
20438
+ _v$8 !== _p$.t && setStyleProperty(_el$3, "top", _p$.t = _v$8);
20439
+ return _p$;
20440
+ }, {
20441
+ e: void 0,
20442
+ t: void 0
20443
+ });
20444
+ return _el$3;
20445
+ })();
20446
+ })();
20447
+ }
20448
+ }), null);
20449
+ return _el$;
20450
+ })();
20451
+ }
20452
+ delegateEvents(["click"]);
20329
20453
  var _tmpl$$o = /* @__PURE__ */ template(`<div class=oasis-editor-floating-toolbar data-testid=editor-floating-table-toolbar><div class=oasis-editor-toolbar-group></div><div class=oasis-editor-toolbar-group></div><div class=oasis-editor-toolbar-group></div><div class=oasis-editor-toolbar-group></div><div class=oasis-editor-toolbar-group>`);
20330
20454
  function FloatingTableToolbar(props) {
20331
20455
  const host = () => props.host();
@@ -31596,6 +31720,16 @@ function parseBookmarkMarker(element) {
31596
31720
  ...colLast !== void 0 && !Number.isNaN(colLast) ? { colLast } : {}
31597
31721
  };
31598
31722
  }
31723
+ function parseCommentMarker(element) {
31724
+ const docxId = getAttributeValue(element, "id");
31725
+ if (!docxId) {
31726
+ return void 0;
31727
+ }
31728
+ return {
31729
+ kind: element.localName === "commentRangeEnd" ? "end" : "start",
31730
+ docxId
31731
+ };
31732
+ }
31599
31733
  async function parseRunElement(runElement, zip, relsMap, assets, parseNestedBlocks) {
31600
31734
  const textParts = [];
31601
31735
  let image;
@@ -31603,6 +31737,7 @@ async function parseRunElement(runElement, zip, relsMap, assets, parseNestedBloc
31603
31737
  let sym;
31604
31738
  let textLength = 0;
31605
31739
  const innerBookmarks = [];
31740
+ const innerComments = [];
31606
31741
  const pushText = (value) => {
31607
31742
  textParts.push(value);
31608
31743
  textLength += value.length;
@@ -31635,7 +31770,13 @@ async function parseRunElement(runElement, zip, relsMap, assets, parseNestedBloc
31635
31770
  innerBookmarks.push({ offset: textLength, marker });
31636
31771
  }
31637
31772
  continue;
31638
- } else if (element.localName === "proofErr" || element.localName === "commentRangeStart" || element.localName === "commentRangeEnd" || element.localName === "commentReference" || element.localName === "permStart" || element.localName === "permEnd") {
31773
+ } else if (element.localName === "commentRangeStart" || element.localName === "commentRangeEnd") {
31774
+ const marker = parseCommentMarker(element);
31775
+ if (marker) {
31776
+ innerComments.push({ offset: textLength, marker });
31777
+ }
31778
+ continue;
31779
+ } else if (element.localName === "proofErr" || element.localName === "commentReference" || element.localName === "permStart" || element.localName === "permEnd") {
31639
31780
  continue;
31640
31781
  } else if (element.localName === "cr") {
31641
31782
  pushText("\n");
@@ -31686,6 +31827,7 @@ async function parseRunElement(runElement, zip, relsMap, assets, parseNestedBloc
31686
31827
  image,
31687
31828
  ...textBox ? { textBox } : {},
31688
31829
  ...innerBookmarks.length > 0 ? { innerBookmarks } : {},
31830
+ ...innerComments.length > 0 ? { innerComments } : {},
31689
31831
  ...sym ? { sym } : {}
31690
31832
  };
31691
31833
  }
@@ -31783,6 +31925,14 @@ async function parseRunsContainer(container, numberingMaps, zip, relsMap, assets
31783
31925
  runs.push({ text: "", bookmark: marker });
31784
31926
  continue;
31785
31927
  }
31928
+ if (element.localName === "commentRangeStart" || element.localName === "commentRangeEnd") {
31929
+ const marker = parseCommentMarker(element);
31930
+ if (!marker) {
31931
+ continue;
31932
+ }
31933
+ runs.push({ text: "", comment: marker });
31934
+ continue;
31935
+ }
31786
31936
  if (element.localName === "r") {
31787
31937
  const runStyles = parseRunStyle(
31788
31938
  getFirstChildByTagNameNS(element, WORD_NS, "rPr"),
@@ -31858,13 +32008,7 @@ async function parseRunsContainer(container, numberingMaps, zip, relsMap, assets
31858
32008
  });
31859
32009
  continue;
31860
32010
  }
31861
- const { text, image, textBox, innerBookmarks, sym } = await parseRunElement(
31862
- element,
31863
- zip,
31864
- relsMap,
31865
- assets,
31866
- parseNestedBlocks
31867
- );
32011
+ const { text, image, textBox, innerBookmarks, innerComments, sym } = await parseRunElement(element, zip, relsMap, assets, parseNestedBlocks);
31868
32012
  let styles = runStyles;
31869
32013
  if (sym && !(styles == null ? void 0 : styles.fontFamily)) {
31870
32014
  (styles ?? (styles = {})).fontFamily = sym.font;
@@ -31872,14 +32016,25 @@ async function parseRunsContainer(container, numberingMaps, zip, relsMap, assets
31872
32016
  if (inheritedLink) {
31873
32017
  (styles ?? (styles = {})).link = inheritedLink;
31874
32018
  }
31875
- if (innerBookmarks && innerBookmarks.length > 0 && !image && !textBox) {
32019
+ const innerMarkers = [
32020
+ ...(innerBookmarks ?? []).map((m) => ({
32021
+ offset: m.offset,
32022
+ run: { text: "", bookmark: m.marker }
32023
+ })),
32024
+ ...(innerComments ?? []).map((m) => ({
32025
+ offset: m.offset,
32026
+ run: { text: "", comment: m.marker }
32027
+ }))
32028
+ ];
32029
+ if (innerMarkers.length > 0 && !image && !textBox) {
32030
+ innerMarkers.sort((a, b) => a.offset - b.offset);
31876
32031
  let cursor = 0;
31877
- for (const inner of innerBookmarks) {
32032
+ for (const inner of innerMarkers) {
31878
32033
  const segment = text.slice(cursor, inner.offset);
31879
32034
  if (segment.length > 0) {
31880
32035
  runs.push({ text: segment, ...styles ? { styles } : {} });
31881
32036
  }
31882
- runs.push({ text: "", bookmark: inner.marker });
32037
+ runs.push(inner.run);
31883
32038
  cursor = inner.offset;
31884
32039
  }
31885
32040
  const tail = text.slice(cursor);
@@ -32796,6 +32951,9 @@ function createImportedParagraph(runs, paragraphStyle, list, markRunStyle) {
32796
32951
  if (run.bookmark) {
32797
32952
  paragraph.runs[index].__importedBookmark = { ...run.bookmark };
32798
32953
  }
32954
+ if (run.comment) {
32955
+ paragraph.runs[index].__importedComment = { ...run.comment };
32956
+ }
32799
32957
  if (run.sym) {
32800
32958
  paragraph.runs[index].sym = { ...run.sym };
32801
32959
  }
@@ -32814,7 +32972,7 @@ function splitRunsAtPageBreaks(runs) {
32814
32972
  const segments = [[]];
32815
32973
  let hasPageBreak = false;
32816
32974
  const appendRun = (run, text) => {
32817
- if (text.length === 0 && !run.image && !run.textBox && !run.field && !run.fieldChar && run.fieldInstruction === void 0 && !run.bookmark) {
32975
+ if (text.length === 0 && !run.image && !run.textBox && !run.field && !run.fieldChar && run.fieldInstruction === void 0 && !run.bookmark && !run.comment) {
32818
32976
  return;
32819
32977
  }
32820
32978
  segments[segments.length - 1].push({
@@ -32840,7 +32998,7 @@ function splitRunsAtPageBreaks(runs) {
32840
32998
  }
32841
32999
  function paragraphHasVisibleContent(runs) {
32842
33000
  return runs.some(
32843
- (run) => run.image || run.textBox || run.field || run.fieldChar || run.fieldInstruction !== void 0 || run.bookmark || run.text.replace(/\s/g, "").length > 0
33001
+ (run) => run.image || run.textBox || run.field || run.fieldChar || run.fieldInstruction !== void 0 || run.bookmark || run.comment || run.text.replace(/\s/g, "").length > 0
32844
33002
  );
32845
33003
  }
32846
33004
  async function parseParagraphNodes(paragraphNode, numberingMaps, zip, relsMap, assets, theme, inheritedStyle) {
@@ -33158,7 +33316,7 @@ async function parseEndnotesXml(xmlContent, numberingMaps, zip, relsMap, assets,
33158
33316
  };
33159
33317
  }
33160
33318
  const RESERVED_BOOKMARK_NAMES = /* @__PURE__ */ new Set(["_GoBack"]);
33161
- function collectFromBlock(block, out, seqRef) {
33319
+ function collectFromBlock$1(block, out, seqRef) {
33162
33320
  if (block.type === "paragraph") {
33163
33321
  let offset = 0;
33164
33322
  const kept = [];
@@ -33187,7 +33345,7 @@ function collectFromBlock(block, out, seqRef) {
33187
33345
  for (const row of block.rows) {
33188
33346
  for (const cell of row.cells) {
33189
33347
  for (const child of cell.blocks) {
33190
- collectFromBlock(child, out, seqRef);
33348
+ collectFromBlock$1(child, out, seqRef);
33191
33349
  }
33192
33350
  }
33193
33351
  }
@@ -33197,7 +33355,7 @@ function extractBookmarksFromSections(sections) {
33197
33355
  const boundaries = [];
33198
33356
  const seqRef = { value: 0 };
33199
33357
  const visit = (blocks) => {
33200
- blocks == null ? void 0 : blocks.forEach((block) => collectFromBlock(block, boundaries, seqRef));
33358
+ blocks == null ? void 0 : blocks.forEach((block) => collectFromBlock$1(block, boundaries, seqRef));
33201
33359
  };
33202
33360
  for (const section of sections) {
33203
33361
  visit(section.blocks);
@@ -33262,8 +33420,157 @@ function extractBookmarksFromSections(sections) {
33262
33420
  }
33263
33421
  return { items, order };
33264
33422
  }
33423
+ function collectFromBlock(block, out, seqRef) {
33424
+ if (block.type === "paragraph") {
33425
+ let offset = 0;
33426
+ const kept = [];
33427
+ for (const run of block.runs) {
33428
+ const marker = run.__importedComment;
33429
+ if (marker) {
33430
+ out.push({
33431
+ marker,
33432
+ anchor: {
33433
+ paragraphId: block.id,
33434
+ offset,
33435
+ seq: seqRef.value
33436
+ }
33437
+ });
33438
+ seqRef.value += 1;
33439
+ continue;
33440
+ }
33441
+ offset += run.text.length;
33442
+ kept.push(run);
33443
+ }
33444
+ if (kept.length !== block.runs.length) {
33445
+ block.runs = kept.length > 0 ? kept : [createEditorRun("")];
33446
+ }
33447
+ return;
33448
+ }
33449
+ for (const row of block.rows) {
33450
+ for (const cell of row.cells) {
33451
+ for (const child of cell.blocks) {
33452
+ collectFromBlock(child, out, seqRef);
33453
+ }
33454
+ }
33455
+ }
33456
+ }
33457
+ function extractCommentRangesFromSections(sections) {
33458
+ const boundaries = [];
33459
+ const seqRef = { value: 0 };
33460
+ const visit = (blocks) => {
33461
+ blocks == null ? void 0 : blocks.forEach((block) => collectFromBlock(block, boundaries, seqRef));
33462
+ };
33463
+ for (const section of sections) {
33464
+ visit(section.blocks);
33465
+ visit(section.header);
33466
+ visit(section.firstPageHeader);
33467
+ visit(section.evenPageHeader);
33468
+ visit(section.footer);
33469
+ visit(section.firstPageFooter);
33470
+ visit(section.evenPageFooter);
33471
+ }
33472
+ const ranges = /* @__PURE__ */ new Map();
33473
+ for (const { marker, anchor } of boundaries) {
33474
+ const range = ranges.get(marker.docxId) ?? {};
33475
+ if (marker.kind === "start") {
33476
+ range.start = anchor;
33477
+ } else {
33478
+ range.end = anchor;
33479
+ }
33480
+ ranges.set(marker.docxId, range);
33481
+ }
33482
+ return ranges;
33483
+ }
33484
+ const WORD15_NS = "http://schemas.microsoft.com/office/word/2012/wordml";
33485
+ function flattenCommentText(element) {
33486
+ let out = "";
33487
+ for (let index = 0; index < element.childNodes.length; index += 1) {
33488
+ const node = element.childNodes[index];
33489
+ if ((node == null ? void 0 : node.nodeType) !== node.ELEMENT_NODE) {
33490
+ continue;
33491
+ }
33492
+ const child = node;
33493
+ if (child.namespaceURI === WORD_NS) {
33494
+ if (child.localName === "t") {
33495
+ out += child.textContent ?? "";
33496
+ continue;
33497
+ }
33498
+ if (child.localName === "tab") {
33499
+ out += " ";
33500
+ continue;
33501
+ }
33502
+ if (child.localName === "br" || child.localName === "cr") {
33503
+ out += "\n";
33504
+ continue;
33505
+ }
33506
+ }
33507
+ out += flattenCommentText(child);
33508
+ }
33509
+ return out;
33510
+ }
33511
+ function parseDate(value) {
33512
+ if (!value) {
33513
+ return void 0;
33514
+ }
33515
+ const ms = Date.parse(value);
33516
+ return Number.isNaN(ms) ? void 0 : ms;
33517
+ }
33518
+ function parseCommentsExtended(xml) {
33519
+ const done = /* @__PURE__ */ new Map();
33520
+ if (!xml) {
33521
+ return done;
33522
+ }
33523
+ const doc = new DOMParser$1().parseFromString(xml, "application/xml");
33524
+ const root = doc.documentElement;
33525
+ if (!root) {
33526
+ return done;
33527
+ }
33528
+ for (const ex of getChildrenByTagNameNS(root, WORD15_NS, "commentEx")) {
33529
+ const paraId = ex.getAttributeNS(WORD15_NS, "paraId");
33530
+ if (!paraId) {
33531
+ continue;
33532
+ }
33533
+ const isDone = ex.getAttributeNS(WORD15_NS, "done");
33534
+ done.set(paraId, isDone === "1" || isDone === "true");
33535
+ }
33536
+ return done;
33537
+ }
33538
+ function parseCommentsXml(commentsXml, commentsExtendedXml) {
33539
+ const byDocxId = /* @__PURE__ */ new Map();
33540
+ if (!commentsXml) {
33541
+ return byDocxId;
33542
+ }
33543
+ const doc = new DOMParser$1().parseFromString(commentsXml, "application/xml");
33544
+ const root = doc.documentElement;
33545
+ if (!root) {
33546
+ return byDocxId;
33547
+ }
33548
+ const doneByParaId = parseCommentsExtended(commentsExtendedXml);
33549
+ for (const comment of getChildrenByTagNameNS(root, WORD_NS, "comment")) {
33550
+ const docxId = getAttributeValue(comment, "id");
33551
+ if (docxId === null) {
33552
+ continue;
33553
+ }
33554
+ const author = getAttributeValue(comment, "author") ?? "";
33555
+ const initials = getAttributeValue(comment, "initials") ?? void 0;
33556
+ const date = parseDate(getAttributeValue(comment, "date"));
33557
+ const paragraphs = getChildrenByTagNameNS(comment, WORD_NS, "p");
33558
+ const text = paragraphs.map((p) => flattenCommentText(p)).join("\n").trim();
33559
+ const paraId = paragraphs.length > 0 ? getAttributeValue(paragraphs[0], "paraId") ?? void 0 : void 0;
33560
+ const resolved = paraId !== void 0 ? doneByParaId.get(paraId) : void 0;
33561
+ byDocxId.set(docxId, {
33562
+ author,
33563
+ ...initials ? { initials } : {},
33564
+ ...date !== void 0 ? { date } : {},
33565
+ text,
33566
+ ...resolved ? { resolved } : {},
33567
+ ...paraId ? { paraId } : {}
33568
+ });
33569
+ }
33570
+ return byDocxId;
33571
+ }
33265
33572
  async function importDocxToEditorDocument(buffer, options = {}) {
33266
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
33573
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
33267
33574
  (_a = options.onProgress) == null ? void 0 : _a.call(options, "opening-docx");
33268
33575
  const zip = await JSZip.loadAsync(buffer);
33269
33576
  const documentXml = await ((_b = zip.file("word/document.xml")) == null ? void 0 : _b.async("string"));
@@ -33524,6 +33831,11 @@ async function importDocxToEditorDocument(buffer, options = {}) {
33524
33831
  const editorEndnotes = Object.keys(parsedEndnotes.endnotes.items).length > 0 || parsedEndnotes.endnotes.separator || parsedEndnotes.endnotes.continuationSeparator || parsedEndnotes.endnotes.settings ? parsedEndnotes.endnotes : void 0;
33525
33832
  remapImportedEndnoteRefsInSections(sections, parsedEndnotes.byDocxId);
33526
33833
  const editorBookmarks = extractBookmarksFromSections(sections);
33834
+ const commentRanges = extractCommentRangesFromSections(sections);
33835
+ const commentsXml = await ((_l = zip.file("word/comments.xml")) == null ? void 0 : _l.async("string")) ?? null;
33836
+ const commentsExtendedXml = await ((_m = zip.file("word/commentsExtended.xml")) == null ? void 0 : _m.async("string")) ?? null;
33837
+ const commentBodies = parseCommentsXml(commentsXml, commentsExtendedXml);
33838
+ const editorComments = buildEditorComments(commentRanges, commentBodies);
33527
33839
  const shouldPreserveSections = sections.length > 1 || sections.some(
33528
33840
  (section) => {
33529
33841
  var _a2, _b2, _c2, _d2, _e2, _f2;
@@ -33550,6 +33862,9 @@ async function importDocxToEditorDocument(buffer, options = {}) {
33550
33862
  if (editorBookmarks) {
33551
33863
  result.bookmarks = editorBookmarks;
33552
33864
  }
33865
+ if (editorComments) {
33866
+ result.comments = editorComments;
33867
+ }
33553
33868
  return result;
33554
33869
  };
33555
33870
  if (shouldPreserveSections) {
@@ -33579,6 +33894,44 @@ async function importDocxToEditorDocument(buffer, options = {}) {
33579
33894
  }
33580
33895
  return finalize(doc);
33581
33896
  }
33897
+ function buildEditorComments(ranges, bodies) {
33898
+ const docxIds = /* @__PURE__ */ new Set([...ranges.keys(), ...bodies.keys()]);
33899
+ if (docxIds.size === 0) {
33900
+ return void 0;
33901
+ }
33902
+ const sorted = [...docxIds].sort((a, b) => {
33903
+ const na = Number.parseInt(a, 10);
33904
+ const nb = Number.parseInt(b, 10);
33905
+ if (Number.isNaN(na) || Number.isNaN(nb)) {
33906
+ return a.localeCompare(b);
33907
+ }
33908
+ return na - nb;
33909
+ });
33910
+ const items = {};
33911
+ const order = [];
33912
+ for (const docxId of sorted) {
33913
+ const range = ranges.get(docxId);
33914
+ const body = bodies.get(docxId);
33915
+ if (!range && !body) {
33916
+ continue;
33917
+ }
33918
+ const id = createEditorCommentId();
33919
+ const docxIdNum = Number.parseInt(docxId, 10);
33920
+ items[id] = {
33921
+ id,
33922
+ author: (body == null ? void 0 : body.author) ?? "",
33923
+ ...(body == null ? void 0 : body.initials) ? { initials: body.initials } : {},
33924
+ ...(body == null ? void 0 : body.date) !== void 0 ? { date: body.date } : {},
33925
+ ...(body == null ? void 0 : body.resolved) ? { resolved: body.resolved } : {},
33926
+ text: (body == null ? void 0 : body.text) ?? "",
33927
+ ...(range == null ? void 0 : range.start) ? { start: range.start } : {},
33928
+ ...(range == null ? void 0 : range.end) ? { end: range.end } : {},
33929
+ ...Number.isNaN(docxIdNum) ? {} : { docxIdHint: docxIdNum }
33930
+ };
33931
+ order.push(id);
33932
+ }
33933
+ return order.length > 0 ? { items, order } : void 0;
33934
+ }
33582
33935
  function remapImportedFootnoteRefsInSections(sections, byDocxId) {
33583
33936
  var _a, _b, _c, _d, _e, _f;
33584
33937
  const remapBlock = (block) => {
@@ -33669,7 +34022,7 @@ function importDocxInWorker(buffer, options = {}) {
33669
34022
  const worker = new Worker(
33670
34023
  new URL(
33671
34024
  /* @vite-ignore */
33672
- "" + new URL("assets/importDocxWorker-CtcRQ7NG.js", import.meta.url).href,
34025
+ "" + new URL("assets/importDocxWorker-cjz15bhS.js", import.meta.url).href,
33673
34026
  import.meta.url
33674
34027
  ),
33675
34028
  {
@@ -34448,6 +34801,10 @@ function OasisEditorEditor(props) {
34448
34801
  };
34449
34802
  const selectedImage = createMemo(() => overlays().selectedImageBox());
34450
34803
  const selectedTextBox = createMemo(() => overlays().selectedTextBoxBox());
34804
+ const commentsById = createMemo(() => {
34805
+ var _a;
34806
+ return ((_a = props.state().document.comments) == null ? void 0 : _a.items) ?? {};
34807
+ });
34451
34808
  createEffect(() => {
34452
34809
  statusDocumentLayout();
34453
34810
  queueMicrotask(recomputeViewportPageIndex);
@@ -34563,6 +34920,19 @@ function OasisEditorEditor(props) {
34563
34920
  });
34564
34921
  }
34565
34922
  }), _el$4);
34923
+ insert(_el$3, createComponent(Show, {
34924
+ get when() {
34925
+ return overlays().commentHighlights().length > 0;
34926
+ },
34927
+ get children() {
34928
+ return createComponent(CommentHighlightOverlay, {
34929
+ get boxes() {
34930
+ return overlays().commentHighlights;
34931
+ },
34932
+ commentsById
34933
+ });
34934
+ }
34935
+ }), _el$4);
34566
34936
  insert(_el$3, createComponent(ResizeHandlesOverlay, {
34567
34937
  box: selectedImage,
34568
34938
  get readOnly() {
@@ -37010,6 +37380,11 @@ const RIBBON_PLACEMENTS = {
37010
37380
  "editor-toolbar-list-outdent": { tab: "home", group: "paragraph", row: 1 },
37011
37381
  "editor-toolbar-list-indent": { tab: "home", group: "paragraph", row: 1 },
37012
37382
  "editor-toolbar-list-options": { tab: "home", group: "paragraph", row: 1 },
37383
+ "editor-toolbar-special-indent": {
37384
+ tab: "home",
37385
+ group: "paragraph",
37386
+ row: 1
37387
+ },
37013
37388
  "editor-toolbar-line-spacing-control": {
37014
37389
  tab: "home",
37015
37390
  group: "paragraph",
@@ -37451,6 +37826,54 @@ function createDefaultToolbarPreset() {
37451
37826
  id: "editor-toolbar-list-options",
37452
37827
  render: (api) => ListOptionsControl({ api })
37453
37828
  });
37829
+ items.push({
37830
+ type: "split",
37831
+ id: "editor-toolbar-special-indent",
37832
+ testId: "editor-toolbar-special-indent",
37833
+ iconName: "specialIndentFirstLine",
37834
+ tooltipKey: "toolbar.specialIndent",
37835
+ command: { name: "setSpecialIndent", payload: { kind: "firstLine" } },
37836
+ isActive: () => false,
37837
+ panelClass: "oasis-editor-toolbar-dropdown-menu oasis-editor-special-indent-menu",
37838
+ menu: {
37839
+ kind: "items",
37840
+ items: [
37841
+ {
37842
+ type: "button",
37843
+ id: "editor-toolbar-special-indent-none",
37844
+ testId: "editor-toolbar-special-indent-none",
37845
+ iconName: "minus",
37846
+ labelKey: "toolbar.specialIndentNone",
37847
+ tooltipKey: "toolbar.specialIndentNone",
37848
+ command: { name: "setSpecialIndent", payload: { kind: "none" } },
37849
+ wide: true
37850
+ },
37851
+ {
37852
+ type: "button",
37853
+ id: "editor-toolbar-special-indent-first-line",
37854
+ testId: "editor-toolbar-special-indent-first-line",
37855
+ iconName: "list-collapse",
37856
+ labelKey: "toolbar.specialIndentFirstLine",
37857
+ tooltipKey: "toolbar.specialIndentFirstLine",
37858
+ command: {
37859
+ name: "setSpecialIndent",
37860
+ payload: { kind: "firstLine" }
37861
+ },
37862
+ wide: true
37863
+ },
37864
+ {
37865
+ type: "button",
37866
+ id: "editor-toolbar-special-indent-hanging",
37867
+ testId: "editor-toolbar-special-indent-hanging",
37868
+ iconName: "list-indent-increase",
37869
+ labelKey: "toolbar.specialIndentHanging",
37870
+ tooltipKey: "toolbar.specialIndentHanging",
37871
+ command: { name: "setSpecialIndent", payload: { kind: "hanging" } },
37872
+ wide: true
37873
+ }
37874
+ ]
37875
+ }
37876
+ });
37454
37877
  items.push({
37455
37878
  type: "custom",
37456
37879
  id: "editor-toolbar-line-spacing-control",
@@ -37516,6 +37939,7 @@ const OASIS_TOOLBAR_ITEMS = {
37516
37939
  outdent: "editor-toolbar-list-outdent",
37517
37940
  indent: "editor-toolbar-list-indent",
37518
37941
  listOptions: "editor-toolbar-list-options",
37942
+ specialIndent: "editor-toolbar-special-indent",
37519
37943
  lineSpacing: "editor-toolbar-line-spacing-control",
37520
37944
  metrics: "editor-toolbar-metrics",
37521
37945
  table: "editor-toolbar-table",