@rowsncolumns/ui 15.0.38

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 (358) hide show
  1. package/LICENSE.md +100 -0
  2. package/dist/cjs/arrow/index.d.ts +17 -0
  3. package/dist/cjs/arrow/index.d.ts.map +1 -0
  4. package/dist/cjs/arrow/index.js +46 -0
  5. package/dist/cjs/button/index.d.ts +14 -0
  6. package/dist/cjs/button/index.d.ts.map +1 -0
  7. package/dist/cjs/button/index.js +46 -0
  8. package/dist/cjs/calendar/index.d.ts +5 -0
  9. package/dist/cjs/calendar/index.d.ts.map +1 -0
  10. package/dist/cjs/calendar/index.js +13 -0
  11. package/dist/cjs/card/index.d.ts +10 -0
  12. package/dist/cjs/card/index.d.ts.map +1 -0
  13. package/dist/cjs/card/index.js +32 -0
  14. package/dist/cjs/cell-tooltip/index.d.ts +17 -0
  15. package/dist/cjs/cell-tooltip/index.d.ts.map +1 -0
  16. package/dist/cjs/cell-tooltip/index.js +38 -0
  17. package/dist/cjs/circular-loader/index.d.ts +9 -0
  18. package/dist/cjs/circular-loader/index.d.ts.map +1 -0
  19. package/dist/cjs/circular-loader/index.js +11 -0
  20. package/dist/cjs/color-picker/index.d.ts +12 -0
  21. package/dist/cjs/color-picker/index.d.ts.map +1 -0
  22. package/dist/cjs/color-picker/index.js +101 -0
  23. package/dist/cjs/color-picker/style.d.ts +5 -0
  24. package/dist/cjs/color-picker/style.d.ts.map +1 -0
  25. package/dist/cjs/color-picker/style.js +11 -0
  26. package/dist/cjs/command/index.d.ts +74 -0
  27. package/dist/cjs/command/index.d.ts.map +1 -0
  28. package/dist/cjs/command/index.js +37 -0
  29. package/dist/cjs/conditional-wrapper/index.d.ts +9 -0
  30. package/dist/cjs/conditional-wrapper/index.d.ts.map +1 -0
  31. package/dist/cjs/conditional-wrapper/index.js +4 -0
  32. package/dist/cjs/dialog/index.d.ts +17 -0
  33. package/dist/cjs/dialog/index.d.ts.map +1 -0
  34. package/dist/cjs/dialog/index.js +50 -0
  35. package/dist/cjs/dropdown/index.d.ts +34 -0
  36. package/dist/cjs/dropdown/index.d.ts.map +1 -0
  37. package/dist/cjs/dropdown/index.js +73 -0
  38. package/dist/cjs/editor/constants.d.ts +7 -0
  39. package/dist/cjs/editor/constants.d.ts.map +1 -0
  40. package/dist/cjs/editor/constants.js +50 -0
  41. package/dist/cjs/editor/editor-error-boundary.d.ts +3 -0
  42. package/dist/cjs/editor/editor-error-boundary.d.ts.map +1 -0
  43. package/dist/cjs/editor/editor-error-boundary.js +9 -0
  44. package/dist/cjs/editor/style.d.ts +12 -0
  45. package/dist/cjs/editor/style.d.ts.map +1 -0
  46. package/dist/cjs/editor/style.js +24 -0
  47. package/dist/cjs/editor/suggestions-dropdown.d.ts +25 -0
  48. package/dist/cjs/editor/suggestions-dropdown.d.ts.map +1 -0
  49. package/dist/cjs/editor/suggestions-dropdown.js +120 -0
  50. package/dist/cjs/editor-pm/constants.d.ts +2 -0
  51. package/dist/cjs/editor-pm/constants.d.ts.map +1 -0
  52. package/dist/cjs/editor-pm/constants.js +2 -0
  53. package/dist/cjs/editor-pm/decoration-plugin.d.ts +15 -0
  54. package/dist/cjs/editor-pm/decoration-plugin.d.ts.map +1 -0
  55. package/dist/cjs/editor-pm/decoration-plugin.js +38 -0
  56. package/dist/cjs/editor-pm/helpers.d.ts +197 -0
  57. package/dist/cjs/editor-pm/helpers.d.ts.map +1 -0
  58. package/dist/cjs/editor-pm/helpers.js +1170 -0
  59. package/dist/cjs/editor-pm/index.d.ts +10 -0
  60. package/dist/cjs/editor-pm/index.d.ts.map +1 -0
  61. package/dist/cjs/editor-pm/index.js +9 -0
  62. package/dist/cjs/editor-pm/mention-nodeview.d.ts +31 -0
  63. package/dist/cjs/editor-pm/mention-nodeview.d.ts.map +1 -0
  64. package/dist/cjs/editor-pm/mention-nodeview.js +105 -0
  65. package/dist/cjs/editor-pm/mentions-dropdown.d.ts +13 -0
  66. package/dist/cjs/editor-pm/mentions-dropdown.d.ts.map +1 -0
  67. package/dist/cjs/editor-pm/mentions-dropdown.js +19 -0
  68. package/dist/cjs/editor-pm/mentions-plugin.d.ts +18 -0
  69. package/dist/cjs/editor-pm/mentions-plugin.d.ts.map +1 -0
  70. package/dist/cjs/editor-pm/mentions-plugin.js +72 -0
  71. package/dist/cjs/editor-pm/placeholder-plugin.d.ts +4 -0
  72. package/dist/cjs/editor-pm/placeholder-plugin.d.ts.map +1 -0
  73. package/dist/cjs/editor-pm/placeholder-plugin.js +20 -0
  74. package/dist/cjs/editor-pm/prosemirror-editor.d.ts +493 -0
  75. package/dist/cjs/editor-pm/prosemirror-editor.d.ts.map +1 -0
  76. package/dist/cjs/editor-pm/prosemirror-editor.js +1145 -0
  77. package/dist/cjs/editor-pm/schema.d.ts +3 -0
  78. package/dist/cjs/editor-pm/schema.d.ts.map +1 -0
  79. package/dist/cjs/editor-pm/schema.js +183 -0
  80. package/dist/cjs/editor-pm/types.d.ts +8 -0
  81. package/dist/cjs/editor-pm/types.d.ts.map +1 -0
  82. package/dist/cjs/editor-pm/types.js +1 -0
  83. package/dist/cjs/editor-pm/unfocused-selection-plugin.d.ts +25 -0
  84. package/dist/cjs/editor-pm/unfocused-selection-plugin.d.ts.map +1 -0
  85. package/dist/cjs/editor-pm/unfocused-selection-plugin.js +61 -0
  86. package/dist/cjs/editor-pm/use-dropdown-change-pm.d.ts +24 -0
  87. package/dist/cjs/editor-pm/use-dropdown-change-pm.d.ts.map +1 -0
  88. package/dist/cjs/editor-pm/use-dropdown-change-pm.js +140 -0
  89. package/dist/cjs/editor-pm/use-editor-change-pm.d.ts +29 -0
  90. package/dist/cjs/editor-pm/use-editor-change-pm.d.ts.map +1 -0
  91. package/dist/cjs/editor-pm/use-editor-change-pm.js +154 -0
  92. package/dist/cjs/editor-pm/use-editor-decorator-pm.d.ts +17 -0
  93. package/dist/cjs/editor-pm/use-editor-decorator-pm.d.ts.map +1 -0
  94. package/dist/cjs/editor-pm/use-editor-decorator-pm.js +59 -0
  95. package/dist/cjs/editor-pm/use-editor-keydown-pm.d.ts +21 -0
  96. package/dist/cjs/editor-pm/use-editor-keydown-pm.d.ts.map +1 -0
  97. package/dist/cjs/editor-pm/use-editor-keydown-pm.js +81 -0
  98. package/dist/cjs/editor-pm/use-mention-keydown.d.ts +11 -0
  99. package/dist/cjs/editor-pm/use-mention-keydown.d.ts.map +1 -0
  100. package/dist/cjs/editor-pm/use-mention-keydown.js +59 -0
  101. package/dist/cjs/editor-pm/use-parameter-suggestions.d.ts +19 -0
  102. package/dist/cjs/editor-pm/use-parameter-suggestions.d.ts.map +1 -0
  103. package/dist/cjs/editor-pm/use-parameter-suggestions.js +79 -0
  104. package/dist/cjs/editor-pm/use-parameter-suggestions.test.d.ts +2 -0
  105. package/dist/cjs/editor-pm/use-parameter-suggestions.test.d.ts.map +1 -0
  106. package/dist/cjs/editor-pm/use-parameter-suggestions.test.js +122 -0
  107. package/dist/cjs/eye-dropper/index.d.ts +10 -0
  108. package/dist/cjs/eye-dropper/index.d.ts.map +1 -0
  109. package/dist/cjs/eye-dropper/index.js +24 -0
  110. package/dist/cjs/function-info/helpers.d.ts +10 -0
  111. package/dist/cjs/function-info/helpers.d.ts.map +1 -0
  112. package/dist/cjs/function-info/helpers.js +20 -0
  113. package/dist/cjs/function-info/index.d.ts +11 -0
  114. package/dist/cjs/function-info/index.d.ts.map +1 -0
  115. package/dist/cjs/function-info/index.js +71 -0
  116. package/dist/cjs/function-info/style.d.ts +7 -0
  117. package/dist/cjs/function-info/style.d.ts.map +1 -0
  118. package/dist/cjs/function-info/style.js +13 -0
  119. package/dist/cjs/hex-color-picker/index.d.ts +8 -0
  120. package/dist/cjs/hex-color-picker/index.d.ts.map +1 -0
  121. package/dist/cjs/hex-color-picker/index.js +47 -0
  122. package/dist/cjs/hooks/use-cycle-reference.d.ts +16 -0
  123. package/dist/cjs/hooks/use-cycle-reference.d.ts.map +1 -0
  124. package/dist/cjs/hooks/use-cycle-reference.js +72 -0
  125. package/dist/cjs/hooks/use-dropdown-categories.d.ts +9 -0
  126. package/dist/cjs/hooks/use-dropdown-categories.d.ts.map +1 -0
  127. package/dist/cjs/hooks/use-dropdown-categories.js +45 -0
  128. package/dist/cjs/hooks/use-dropdown.d.ts +38 -0
  129. package/dist/cjs/hooks/use-dropdown.d.ts.map +1 -0
  130. package/dist/cjs/hooks/use-dropdown.js +236 -0
  131. package/dist/cjs/hooks/use-isomorphic-layout-effect.ts.d.ts +6 -0
  132. package/dist/cjs/hooks/use-isomorphic-layout-effect.ts.d.ts.map +1 -0
  133. package/dist/cjs/hooks/use-isomorphic-layout-effect.ts.js +8 -0
  134. package/dist/cjs/hooks/use-modal.d.ts +28 -0
  135. package/dist/cjs/hooks/use-modal.d.ts.map +1 -0
  136. package/dist/cjs/hooks/use-modal.js +101 -0
  137. package/dist/cjs/hooks/use-visibility.d.ts +2 -0
  138. package/dist/cjs/hooks/use-visibility.d.ts.map +1 -0
  139. package/dist/cjs/hooks/use-visibility.js +12 -0
  140. package/dist/cjs/icon-button/index.d.ts +15 -0
  141. package/dist/cjs/icon-button/index.d.ts.map +1 -0
  142. package/dist/cjs/icon-button/index.js +34 -0
  143. package/dist/cjs/index.d.ts +34 -0
  144. package/dist/cjs/index.d.ts.map +1 -0
  145. package/dist/cjs/index.js +33 -0
  146. package/dist/cjs/input/index.d.ts +9 -0
  147. package/dist/cjs/input/index.d.ts.map +1 -0
  148. package/dist/cjs/input/index.js +9 -0
  149. package/dist/cjs/popover/index.d.ts +13 -0
  150. package/dist/cjs/popover/index.d.ts.map +1 -0
  151. package/dist/cjs/popover/index.js +29 -0
  152. package/dist/cjs/progress/index.d.ts +10 -0
  153. package/dist/cjs/progress/index.d.ts.map +1 -0
  154. package/dist/cjs/progress/index.js +15 -0
  155. package/dist/cjs/select/index.d.ts +14 -0
  156. package/dist/cjs/select/index.d.ts.map +1 -0
  157. package/dist/cjs/select/index.js +46 -0
  158. package/dist/cjs/separator/index.d.ts +5 -0
  159. package/dist/cjs/separator/index.d.ts.map +1 -0
  160. package/dist/cjs/separator/index.js +10 -0
  161. package/dist/cjs/skeleton/index.d.ts +7 -0
  162. package/dist/cjs/skeleton/index.d.ts.map +1 -0
  163. package/dist/cjs/skeleton/index.js +11 -0
  164. package/dist/cjs/stack/index.d.ts +11 -0
  165. package/dist/cjs/stack/index.d.ts.map +1 -0
  166. package/dist/cjs/stack/index.js +22 -0
  167. package/dist/cjs/tabs/index.d.ts +8 -0
  168. package/dist/cjs/tabs/index.d.ts.map +1 -0
  169. package/dist/cjs/tabs/index.js +21 -0
  170. package/dist/cjs/tooltip/index.d.ts +12 -0
  171. package/dist/cjs/tooltip/index.d.ts.map +1 -0
  172. package/dist/cjs/tooltip/index.js +20 -0
  173. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  174. package/dist/cjs/utils.d.ts +3 -0
  175. package/dist/cjs/utils.d.ts.map +1 -0
  176. package/dist/cjs/utils.js +9 -0
  177. package/dist/cjs/vitest.config.d.ts +3 -0
  178. package/dist/cjs/vitest.config.d.ts.map +1 -0
  179. package/dist/cjs/vitest.config.js +21 -0
  180. package/dist/esm/arrow/index.d.ts +17 -0
  181. package/dist/esm/arrow/index.d.ts.map +1 -0
  182. package/dist/esm/arrow/index.js +45 -0
  183. package/dist/esm/button/index.d.ts +14 -0
  184. package/dist/esm/button/index.d.ts.map +1 -0
  185. package/dist/esm/button/index.js +44 -0
  186. package/dist/esm/calendar/index.d.ts +5 -0
  187. package/dist/esm/calendar/index.d.ts.map +1 -0
  188. package/dist/esm/calendar/index.js +34 -0
  189. package/dist/esm/card/index.d.ts +10 -0
  190. package/dist/esm/card/index.d.ts.map +1 -0
  191. package/dist/esm/card/index.js +24 -0
  192. package/dist/esm/cell-tooltip/index.d.ts +17 -0
  193. package/dist/esm/cell-tooltip/index.d.ts.map +1 -0
  194. package/dist/esm/cell-tooltip/index.js +31 -0
  195. package/dist/esm/circular-loader/index.d.ts +9 -0
  196. package/dist/esm/circular-loader/index.d.ts.map +1 -0
  197. package/dist/esm/circular-loader/index.js +7 -0
  198. package/dist/esm/color-picker/index.d.ts +12 -0
  199. package/dist/esm/color-picker/index.d.ts.map +1 -0
  200. package/dist/esm/color-picker/index.js +99 -0
  201. package/dist/esm/color-picker/style.d.ts +5 -0
  202. package/dist/esm/color-picker/style.d.ts.map +1 -0
  203. package/dist/esm/color-picker/style.js +7 -0
  204. package/dist/esm/command/index.d.ts +74 -0
  205. package/dist/esm/command/index.d.ts.map +1 -0
  206. package/dist/esm/command/index.js +18 -0
  207. package/dist/esm/conditional-wrapper/index.d.ts +9 -0
  208. package/dist/esm/conditional-wrapper/index.d.ts.map +1 -0
  209. package/dist/esm/conditional-wrapper/index.js +1 -0
  210. package/dist/esm/dialog/index.d.ts +17 -0
  211. package/dist/esm/dialog/index.d.ts.map +1 -0
  212. package/dist/esm/dialog/index.js +30 -0
  213. package/dist/esm/dropdown/index.d.ts +34 -0
  214. package/dist/esm/dropdown/index.d.ts.map +1 -0
  215. package/dist/esm/dropdown/index.js +42 -0
  216. package/dist/esm/editor/constants.d.ts +7 -0
  217. package/dist/esm/editor/constants.d.ts.map +1 -0
  218. package/dist/esm/editor/constants.js +51 -0
  219. package/dist/esm/editor/editor-error-boundary.d.ts +3 -0
  220. package/dist/esm/editor/editor-error-boundary.d.ts.map +1 -0
  221. package/dist/esm/editor/editor-error-boundary.js +9 -0
  222. package/dist/esm/editor/style.d.ts +12 -0
  223. package/dist/esm/editor/style.d.ts.map +1 -0
  224. package/dist/esm/editor/style.js +17 -0
  225. package/dist/esm/editor/suggestions-dropdown.d.ts +25 -0
  226. package/dist/esm/editor/suggestions-dropdown.d.ts.map +1 -0
  227. package/dist/esm/editor/suggestions-dropdown.js +115 -0
  228. package/dist/esm/editor-pm/constants.d.ts +2 -0
  229. package/dist/esm/editor-pm/constants.d.ts.map +1 -0
  230. package/dist/esm/editor-pm/constants.js +2 -0
  231. package/dist/esm/editor-pm/decoration-plugin.d.ts +15 -0
  232. package/dist/esm/editor-pm/decoration-plugin.d.ts.map +1 -0
  233. package/dist/esm/editor-pm/decoration-plugin.js +38 -0
  234. package/dist/esm/editor-pm/helpers.d.ts +197 -0
  235. package/dist/esm/editor-pm/helpers.d.ts.map +1 -0
  236. package/dist/esm/editor-pm/helpers.js +1113 -0
  237. package/dist/esm/editor-pm/index.d.ts +10 -0
  238. package/dist/esm/editor-pm/index.d.ts.map +1 -0
  239. package/dist/esm/editor-pm/index.js +9 -0
  240. package/dist/esm/editor-pm/mention-nodeview.d.ts +31 -0
  241. package/dist/esm/editor-pm/mention-nodeview.d.ts.map +1 -0
  242. package/dist/esm/editor-pm/mention-nodeview.js +88 -0
  243. package/dist/esm/editor-pm/mentions-dropdown.d.ts +13 -0
  244. package/dist/esm/editor-pm/mentions-dropdown.d.ts.map +1 -0
  245. package/dist/esm/editor-pm/mentions-dropdown.js +17 -0
  246. package/dist/esm/editor-pm/mentions-plugin.d.ts +18 -0
  247. package/dist/esm/editor-pm/mentions-plugin.d.ts.map +1 -0
  248. package/dist/esm/editor-pm/mentions-plugin.js +92 -0
  249. package/dist/esm/editor-pm/placeholder-plugin.d.ts +4 -0
  250. package/dist/esm/editor-pm/placeholder-plugin.d.ts.map +1 -0
  251. package/dist/esm/editor-pm/placeholder-plugin.js +20 -0
  252. package/dist/esm/editor-pm/prosemirror-editor.d.ts +493 -0
  253. package/dist/esm/editor-pm/prosemirror-editor.d.ts.map +1 -0
  254. package/dist/esm/editor-pm/prosemirror-editor.js +1135 -0
  255. package/dist/esm/editor-pm/schema.d.ts +3 -0
  256. package/dist/esm/editor-pm/schema.d.ts.map +1 -0
  257. package/dist/esm/editor-pm/schema.js +179 -0
  258. package/dist/esm/editor-pm/types.d.ts +8 -0
  259. package/dist/esm/editor-pm/types.d.ts.map +1 -0
  260. package/dist/esm/editor-pm/types.js +1 -0
  261. package/dist/esm/editor-pm/unfocused-selection-plugin.d.ts +25 -0
  262. package/dist/esm/editor-pm/unfocused-selection-plugin.d.ts.map +1 -0
  263. package/dist/esm/editor-pm/unfocused-selection-plugin.js +61 -0
  264. package/dist/esm/editor-pm/use-dropdown-change-pm.d.ts +24 -0
  265. package/dist/esm/editor-pm/use-dropdown-change-pm.d.ts.map +1 -0
  266. package/dist/esm/editor-pm/use-dropdown-change-pm.js +137 -0
  267. package/dist/esm/editor-pm/use-editor-change-pm.d.ts +29 -0
  268. package/dist/esm/editor-pm/use-editor-change-pm.d.ts.map +1 -0
  269. package/dist/esm/editor-pm/use-editor-change-pm.js +152 -0
  270. package/dist/esm/editor-pm/use-editor-decorator-pm.d.ts +17 -0
  271. package/dist/esm/editor-pm/use-editor-decorator-pm.d.ts.map +1 -0
  272. package/dist/esm/editor-pm/use-editor-decorator-pm.js +57 -0
  273. package/dist/esm/editor-pm/use-editor-keydown-pm.d.ts +21 -0
  274. package/dist/esm/editor-pm/use-editor-keydown-pm.d.ts.map +1 -0
  275. package/dist/esm/editor-pm/use-editor-keydown-pm.js +79 -0
  276. package/dist/esm/editor-pm/use-mention-keydown.d.ts +11 -0
  277. package/dist/esm/editor-pm/use-mention-keydown.d.ts.map +1 -0
  278. package/dist/esm/editor-pm/use-mention-keydown.js +57 -0
  279. package/dist/esm/editor-pm/use-parameter-suggestions.d.ts +19 -0
  280. package/dist/esm/editor-pm/use-parameter-suggestions.d.ts.map +1 -0
  281. package/dist/esm/editor-pm/use-parameter-suggestions.js +66 -0
  282. package/dist/esm/editor-pm/use-parameter-suggestions.test.d.ts +2 -0
  283. package/dist/esm/editor-pm/use-parameter-suggestions.test.d.ts.map +1 -0
  284. package/dist/esm/editor-pm/use-parameter-suggestions.test.js +66 -0
  285. package/dist/esm/eye-dropper/index.d.ts +10 -0
  286. package/dist/esm/eye-dropper/index.d.ts.map +1 -0
  287. package/dist/esm/eye-dropper/index.js +23 -0
  288. package/dist/esm/function-info/helpers.d.ts +10 -0
  289. package/dist/esm/function-info/helpers.d.ts.map +1 -0
  290. package/dist/esm/function-info/helpers.js +20 -0
  291. package/dist/esm/function-info/index.d.ts +11 -0
  292. package/dist/esm/function-info/index.d.ts.map +1 -0
  293. package/dist/esm/function-info/index.js +68 -0
  294. package/dist/esm/function-info/style.d.ts +7 -0
  295. package/dist/esm/function-info/style.d.ts.map +1 -0
  296. package/dist/esm/function-info/style.js +10 -0
  297. package/dist/esm/hex-color-picker/index.d.ts +8 -0
  298. package/dist/esm/hex-color-picker/index.d.ts.map +1 -0
  299. package/dist/esm/hex-color-picker/index.js +44 -0
  300. package/dist/esm/hooks/use-cycle-reference.d.ts +16 -0
  301. package/dist/esm/hooks/use-cycle-reference.d.ts.map +1 -0
  302. package/dist/esm/hooks/use-cycle-reference.js +70 -0
  303. package/dist/esm/hooks/use-dropdown-categories.d.ts +9 -0
  304. package/dist/esm/hooks/use-dropdown-categories.d.ts.map +1 -0
  305. package/dist/esm/hooks/use-dropdown-categories.js +38 -0
  306. package/dist/esm/hooks/use-dropdown.d.ts +38 -0
  307. package/dist/esm/hooks/use-dropdown.d.ts.map +1 -0
  308. package/dist/esm/hooks/use-dropdown.js +236 -0
  309. package/dist/esm/hooks/use-isomorphic-layout-effect.ts.d.ts +6 -0
  310. package/dist/esm/hooks/use-isomorphic-layout-effect.ts.d.ts.map +1 -0
  311. package/dist/esm/hooks/use-isomorphic-layout-effect.ts.js +8 -0
  312. package/dist/esm/hooks/use-modal.d.ts +28 -0
  313. package/dist/esm/hooks/use-modal.d.ts.map +1 -0
  314. package/dist/esm/hooks/use-modal.js +93 -0
  315. package/dist/esm/hooks/use-visibility.d.ts +2 -0
  316. package/dist/esm/hooks/use-visibility.d.ts.map +1 -0
  317. package/dist/esm/hooks/use-visibility.js +12 -0
  318. package/dist/esm/icon-button/index.d.ts +15 -0
  319. package/dist/esm/icon-button/index.d.ts.map +1 -0
  320. package/dist/esm/icon-button/index.js +32 -0
  321. package/dist/esm/index.d.ts +34 -0
  322. package/dist/esm/index.d.ts.map +1 -0
  323. package/dist/esm/index.js +33 -0
  324. package/dist/esm/input/index.d.ts +9 -0
  325. package/dist/esm/input/index.d.ts.map +1 -0
  326. package/dist/esm/input/index.js +7 -0
  327. package/dist/esm/popover/index.d.ts +13 -0
  328. package/dist/esm/popover/index.d.ts.map +1 -0
  329. package/dist/esm/popover/index.js +22 -0
  330. package/dist/esm/progress/index.d.ts +10 -0
  331. package/dist/esm/progress/index.d.ts.map +1 -0
  332. package/dist/esm/progress/index.js +12 -0
  333. package/dist/esm/select/index.d.ts +14 -0
  334. package/dist/esm/select/index.d.ts.map +1 -0
  335. package/dist/esm/select/index.js +30 -0
  336. package/dist/esm/separator/index.d.ts +5 -0
  337. package/dist/esm/separator/index.d.ts.map +1 -0
  338. package/dist/esm/separator/index.js +6 -0
  339. package/dist/esm/skeleton/index.d.ts +7 -0
  340. package/dist/esm/skeleton/index.d.ts.map +1 -0
  341. package/dist/esm/skeleton/index.js +9 -0
  342. package/dist/esm/stack/index.d.ts +11 -0
  343. package/dist/esm/stack/index.d.ts.map +1 -0
  344. package/dist/esm/stack/index.js +20 -0
  345. package/dist/esm/tabs/index.d.ts +8 -0
  346. package/dist/esm/tabs/index.d.ts.map +1 -0
  347. package/dist/esm/tabs/index.js +11 -0
  348. package/dist/esm/tooltip/index.d.ts +12 -0
  349. package/dist/esm/tooltip/index.d.ts.map +1 -0
  350. package/dist/esm/tooltip/index.js +13 -0
  351. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  352. package/dist/esm/utils.d.ts +3 -0
  353. package/dist/esm/utils.d.ts.map +1 -0
  354. package/dist/esm/utils.js +5 -0
  355. package/dist/esm/vitest.config.d.ts +3 -0
  356. package/dist/esm/vitest.config.d.ts.map +1 -0
  357. package/dist/esm/vitest.config.js +21 -0
  358. package/package.json +78 -0
@@ -0,0 +1,1145 @@
1
+ import { __assign, __awaiter, __generator, __read, __rest, __spreadArray, __values } from "tslib";
2
+ import { LoadingIcon, QuestionMarkIcon } from "@rowsncolumns/icons";
3
+ import { addressToCell, isAFormula, isNil, log } from "@rowsncolumns/utils";
4
+ import React, { forwardRef, memo, useCallback, useImperativeHandle, useMemo, useRef, useState, } from "react";
5
+ import { history, undo, redo } from "prosemirror-history";
6
+ import { keymap } from "prosemirror-keymap";
7
+ import { baseKeymap, joinBackward, toggleMark } from "prosemirror-commands";
8
+ import { AllSelection, EditorState } from "prosemirror-state";
9
+ import { EditorView, DecorationSet } from "prosemirror-view";
10
+ import { TextSelection } from "prosemirror-state";
11
+ import { DOMSerializer } from "prosemirror-model";
12
+ import { useCycleFormulaReference } from "../hooks/use-cycle-reference";
13
+ import { useDropdown } from "../hooks/use-dropdown";
14
+ import { useDropdownChangePM } from "./use-dropdown-change-pm";
15
+ import { useEditorKeyDownPM } from "./use-editor-keydown-pm";
16
+ import { useEditorDecoratorPM } from "./use-editor-decorator-pm";
17
+ import { useEditorOnChangePM } from "./use-editor-change-pm";
18
+ import { createDecorationPlugin } from "./decoration-plugin";
19
+ import { createUnfocusedSelectionPlugin } from "./unfocused-selection-plugin";
20
+ import { createPlaceholderPlugin } from "./placeholder-plugin";
21
+ import { useIsomorphicLayoutEffect } from "../hooks/use-isomorphic-layout-effect.ts";
22
+ import { cn } from "../utils";
23
+ import { SPECIAL_ITEMS, THIS_ROW_ITEM } from "../editor/constants";
24
+ import { applyTextFormatRuns, applyTextFormatToSelection, getSelectionFontSize, deserializeString, getPropertyStartIndex, isCellToken, serializeEditorValue, } from "./helpers";
25
+ import { SuggestionsDropdown as DefaultSuggestionsDropdown, } from "../editor/suggestions-dropdown";
26
+ import { ErrorFallback } from "../editor/editor-error-boundary";
27
+ import { withErrorBoundary } from "react-error-boundary";
28
+ import * as Popper from "@radix-ui/react-popper";
29
+ import { Portal } from "@radix-ui/react-portal";
30
+ import { ConditionalWrapper } from "../conditional-wrapper";
31
+ import { schema } from "./schema";
32
+ import { StyledFormulaHelp } from "../editor/style";
33
+ import { tokenVocabulary } from "@rowsncolumns/fast-formula-parser";
34
+ import { createMentionsPlugin } from "./mentions-plugin";
35
+ import { MentionsDropdown } from "./mentions-dropdown";
36
+ import { useMentionKeyDown } from "./use-mention-keydown";
37
+ import { MentionNodeView } from "./mention-nodeview";
38
+ import { useCallbackRef } from "@rowsncolumns/grid";
39
+ import { useParameterSuggestions } from "./use-parameter-suggestions";
40
+ import { DEFAULT_ARRAY } from "@rowsncolumns/spreadsheet";
41
+ /**
42
+ * This fixes a IME bug in prosemirror
43
+ * Cmd+a and delete and then entering a character
44
+ * selects the entire character
45
+ * @param state
46
+ * @param dispatch
47
+ * @returns
48
+ */
49
+ export var deleteAll = function (state, dispatch) {
50
+ if (dispatch) {
51
+ var emptyDoc = schema.node("doc", null, [schema.node("line", null, [])]);
52
+ var tr = state.tr.replaceWith(0, state.doc.content.size, emptyDoc.content);
53
+ tr.setSelection(TextSelection.create(tr.doc, 1));
54
+ dispatch(tr);
55
+ }
56
+ return true;
57
+ };
58
+ /**
59
+ * ProseMirror editor component for rich text and formula editing.
60
+ * Supports syntax highlighting, autocomplete, and keyboard shortcuts.
61
+ */
62
+ export var ProseMirrorEditorThatMayError = memo(forwardRef(function (_a, forwardedRef) {
63
+ var _b;
64
+ var _c = _a.value, value = _c === void 0 ? "" : _c, isNewValue = _a.isNewValue, formulaMode = _a.formulaMode, onChange = _a.onChange, autoFocus = _a.autoFocus, className = _a.className, onKeyDown = _a.onKeyDown, disabled = _a.disabled, _d = _a.showDropdown, showDropdown = _d === void 0 ? true : _d, _e = _a.persistFocus, persistFocus = _e === void 0 ? true : _e, editorZeroOutline = _a.editorZeroOutline, showFormulaHelp = _a.showFormulaHelp, onHideFormulaHelp = _a.onHideFormulaHelp, onShowFormulaHelp = _a.onShowFormulaHelp, tokenizer = _a.tokenizer, onCancel = _a.onCancel, onSubmit = _a.onSubmit, onFormulaStateChange = _a.onFormulaStateChange, dropdownStyles = _a.dropdownStyles, options = _a.options, isOptionSelected = _a.isOptionSelected, functionDescriptions = _a.functionDescriptions, shouldFetchFunctionParameters = _a.shouldFetchFunctionParameters, getFunctionParameterSuggestions = _a.getFunctionParameterSuggestions, getMentions = _a.getMentions, getNamedRanges = _a.getNamedRanges, getTableNames = _a.getTableNames, getTableColumnNames = _a.getTableColumnNames, getStructuredProperties = _a.getStructuredProperties, onTeardown = _a.onTeardown, _f = _a.SuggestionsDropdown, SuggestionsDropdown = _f === void 0 ? DefaultSuggestionsDropdown : _f, MentionTagComponent = _a.MentionTagComponent, MentionDropdownItemComponent = _a.MentionDropdownItemComponent, isActive = _a.isActive, _g = _a.stickyEditor, stickyEditor = _g === void 0 ? true : _g, onFocus = _a.onFocus, onBlur = _a.onBlur, onCopy = _a.onCopy, onCut = _a.onCut, onPaste = _a.onPaste, placeholder = _a.placeholder, textFormatRuns = _a.textFormatRuns, resolveRunColor = _a.resolveRunColor, navigationMode = _a.navigationMode, enableContinuousSelection = _a.enableContinuousSelection, cellFontFamily = _a.cellFontFamily, props = __rest(_a, ["value", "isNewValue", "formulaMode", "onChange", "autoFocus", "className", "onKeyDown", "disabled", "showDropdown", "persistFocus", "editorZeroOutline", "showFormulaHelp", "onHideFormulaHelp", "onShowFormulaHelp", "tokenizer", "onCancel", "onSubmit", "onFormulaStateChange", "dropdownStyles", "options", "isOptionSelected", "functionDescriptions", "shouldFetchFunctionParameters", "getFunctionParameterSuggestions", "getMentions", "getNamedRanges", "getTableNames", "getTableColumnNames", "getStructuredProperties", "onTeardown", "SuggestionsDropdown", "MentionTagComponent", "MentionDropdownItemComponent", "isActive", "stickyEditor", "onFocus", "onBlur", "onCopy", "onCut", "onPaste", "placeholder", "textFormatRuns", "resolveRunColor", "navigationMode", "enableContinuousSelection", "cellFontFamily"]);
65
+ var editorRef = useRef(null);
66
+ var viewRef = useRef(null);
67
+ var cellFontFamilyRef = useRef(cellFontFamily);
68
+ var _h = __read(useState(), 2), cursorPosition = _h[0], setCursorPosition = _h[1];
69
+ var _j = __read(useState(), 2), tableToken = _j[0], setTableToken = _j[1];
70
+ var _k = __read(useState(), 2), functionToken = _k[0], setFunctionToken = _k[1];
71
+ var _l = __read(useState(0), 2), parameterIndex = _l[0], setParameterIndex = _l[1];
72
+ var _m = __read(useState(false), 2), isEdgeofCell = _m[0], setIsEdgeOfCell = _m[1];
73
+ var _o = __read(useState(DEFAULT_ARRAY), 2), parameterArguments = _o[0], setParameterArguments = _o[1];
74
+ var _p = __read(useState(DEFAULT_ARRAY), 2), parameterRanges = _p[0], setParameterRanges = _p[1];
75
+ var _q = __read(useState(), 2), cellPropertyToken = _q[0], setCellPropertyToken = _q[1];
76
+ var activeTokenRef = useRef(undefined);
77
+ var suggestionTokenRef = useRef(undefined);
78
+ var previousTokenRef = useRef(undefined);
79
+ var currentValueRef = useRef(undefined);
80
+ var onFocusRef = useRef(onFocus);
81
+ var onBlurRef = useRef(onBlur);
82
+ var onCopyRef = useRef(onCopy);
83
+ var onPasteRef = useRef(onPaste);
84
+ var onCutRef = useRef(onCut);
85
+ var navigationModeRef = useRef(navigationMode);
86
+ // Mentions
87
+ var _r = __read(useState({
88
+ active: false,
89
+ query: "",
90
+ range: null,
91
+ selectedIndex: 0,
92
+ }), 2), mentionState = _r[0], onChangeMentionState = _r[1];
93
+ var _s = __read(useState([]), 2), mentions = _s[0], setMentions = _s[1];
94
+ var _t = __read(useState(false), 2), isFetchingMentions = _t[0], setIsFetchingMentions = _t[1];
95
+ var mentionPositionLeft = useMemo(function () {
96
+ var _a, _b, _c, _d;
97
+ if (mentionState.range) {
98
+ var editorPositon = (_a = editorRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
99
+ return (((_c = (_b = viewRef.current) === null || _b === void 0 ? void 0 : _b.coordsAtPos(mentionState.range.from).left) !== null && _c !== void 0 ? _c : 0) -
100
+ ((_d = editorPositon === null || editorPositon === void 0 ? void 0 : editorPositon.left) !== null && _d !== void 0 ? _d : 0));
101
+ }
102
+ return 0;
103
+ }, [(_b = mentionState.range) === null || _b === void 0 ? void 0 : _b.from]);
104
+ // Show mention dropdown
105
+ var showMentionDropdown = (mentionState.active && mentions.length > 1) || isFetchingMentions;
106
+ var showMentionDropdownEffective = showMentionDropdown && !navigationMode;
107
+ var _u = useParameterSuggestions({
108
+ functionToken: !formulaMode || navigationMode || isEdgeofCell
109
+ ? undefined
110
+ : functionToken,
111
+ parameterIndex: parameterIndex,
112
+ parameterArguments: parameterArguments,
113
+ getFunctionParameterSuggestions: !navigationMode
114
+ ? getFunctionParameterSuggestions
115
+ : undefined,
116
+ shouldFetchFunctionParameters: !navigationMode
117
+ ? shouldFetchFunctionParameters
118
+ : undefined,
119
+ }), parameterSuggestions = _u.parameterSuggestions, isFetchingParameters = _u.isFetchingParameters;
120
+ useIsomorphicLayoutEffect(function () {
121
+ currentValueRef.current = value;
122
+ }, [value]);
123
+ useIsomorphicLayoutEffect(function () {
124
+ onFocusRef.current = onFocus;
125
+ }, [onFocus]);
126
+ useIsomorphicLayoutEffect(function () {
127
+ onBlurRef.current = onBlur;
128
+ }, [onBlur]);
129
+ useIsomorphicLayoutEffect(function () {
130
+ onCopyRef.current = onCopy;
131
+ }, [onCopy]);
132
+ useIsomorphicLayoutEffect(function () {
133
+ onPasteRef.current = onPaste;
134
+ }, [onPaste]);
135
+ useIsomorphicLayoutEffect(function () {
136
+ onCutRef.current = onCut;
137
+ }, [onCut]);
138
+ useIsomorphicLayoutEffect(function () {
139
+ cellFontFamilyRef.current = cellFontFamily;
140
+ }, [cellFontFamily]);
141
+ useIsomorphicLayoutEffect(function () {
142
+ var _a;
143
+ var previousMode = navigationModeRef.current;
144
+ navigationModeRef.current = navigationMode;
145
+ // Reset formula-related states when entering navigation mode (and mode has changed)
146
+ if (navigationMode && previousMode !== navigationMode) {
147
+ setCursorPosition(undefined);
148
+ setTableToken(undefined);
149
+ setFunctionToken(undefined);
150
+ setParameterIndex(0);
151
+ setIsEdgeOfCell(false);
152
+ setParameterArguments(DEFAULT_ARRAY);
153
+ setParameterRanges(DEFAULT_ARRAY);
154
+ setCellPropertyToken(undefined);
155
+ }
156
+ if ((_a = viewRef.current) === null || _a === void 0 ? void 0 : _a.dom) {
157
+ viewRef.current.dom.setAttribute("inputmode", navigationMode ? "none" : "text");
158
+ }
159
+ }, [navigationMode]);
160
+ // Store latest values in refs for the decorator plugin
161
+ var formulaModeRef = useRef(formulaMode);
162
+ // Update refs when values change
163
+ formulaModeRef.current = formulaMode;
164
+ // Helper function to create initial document
165
+ var createInitialDocument = useCallbackRef(useCallback(function () {
166
+ if (!isAFormula(value) && (textFormatRuns === null || textFormatRuns === void 0 ? void 0 : textFormatRuns.length)) {
167
+ // Use applyTextFormatRuns if format runs are provided
168
+ return applyTextFormatRuns(value, textFormatRuns, schema, resolveRunColor);
169
+ }
170
+ else {
171
+ // Use default deserialization
172
+ return deserializeString(value, schema);
173
+ }
174
+ }, [value, textFormatRuns]));
175
+ // Decorator for syntax highlighting - use ref to ensure latest values
176
+ var decoratorRef = useRef(undefined);
177
+ var getFormulaDecorations = useEditorDecoratorPM({
178
+ cursorPosition: cursorPosition,
179
+ formulaMode: formulaMode,
180
+ tokenizer: tokenizer,
181
+ isActive: isActive,
182
+ });
183
+ // Combined decorator that includes formula highlighting
184
+ var getCombinedDecorations = useCallback(function (state) {
185
+ if (navigationModeRef.current) {
186
+ return DecorationSet.create(state.doc, []);
187
+ }
188
+ var decorations = [];
189
+ // Add formula decorations
190
+ if (formulaMode) {
191
+ var formulaDecorations = getFormulaDecorations(state);
192
+ if (formulaDecorations && formulaDecorations.find) {
193
+ formulaDecorations
194
+ .find()
195
+ .forEach(function (deco) { return decorations.push(deco); });
196
+ }
197
+ }
198
+ return DecorationSet.create(state.doc, decorations);
199
+ }, [getFormulaDecorations, formulaMode]);
200
+ // React to mentions
201
+ useIsomorphicLayoutEffect(function () {
202
+ var _a;
203
+ if (navigationModeRef.current) {
204
+ if (mentions.length) {
205
+ setMentions([]);
206
+ }
207
+ setIsFetchingMentions(false);
208
+ return;
209
+ }
210
+ var fetchMentions = function (query) { return __awaiter(void 0, void 0, void 0, function () {
211
+ var mentions;
212
+ var _a;
213
+ return __generator(this, function (_b) {
214
+ switch (_b.label) {
215
+ case 0:
216
+ setIsFetchingMentions(true);
217
+ return [4 /*yield*/, (getMentions === null || getMentions === void 0 ? void 0 : getMentions(query))];
218
+ case 1:
219
+ mentions = (_a = (_b.sent())) !== null && _a !== void 0 ? _a : [];
220
+ setMentions(mentions);
221
+ setIsFetchingMentions(false);
222
+ return [2 /*return*/];
223
+ }
224
+ });
225
+ }); };
226
+ try {
227
+ if (mentionState.active) {
228
+ fetchMentions((_a = mentionState.query) !== null && _a !== void 0 ? _a : "");
229
+ }
230
+ else {
231
+ setMentions([]);
232
+ setIsFetchingMentions(false);
233
+ }
234
+ }
235
+ catch (err) {
236
+ console.log("Error fetching mentions", err);
237
+ }
238
+ }, [mentionState.active, mentionState.query]);
239
+ // Update ref with latest decorator
240
+ useIsomorphicLayoutEffect(function () {
241
+ decoratorRef.current = getCombinedDecorations;
242
+ }, [getCombinedDecorations]);
243
+ // Set active token ref
244
+ var setActiveToken = useCallback(function (token) {
245
+ activeTokenRef.current = token;
246
+ }, []);
247
+ var setPreviousToken = useCallback(function (token) {
248
+ previousTokenRef.current = token;
249
+ }, []);
250
+ // Callback when suggestion token changes
251
+ var handleSuggestionTokenChange = useCallback(function (token) {
252
+ var _a, _b;
253
+ suggestionTokenRef.current = token;
254
+ var newQuery = (_b = (_a = token === null || token === void 0 ? void 0 : token.property) !== null && _a !== void 0 ? _a : token === null || token === void 0 ? void 0 : token.image) !== null && _b !== void 0 ? _b : "";
255
+ setQuery(newQuery);
256
+ }, []);
257
+ // Get editor view
258
+ var getView = useCallback(function () {
259
+ return viewRef.current;
260
+ }, []);
261
+ // Handle change hook
262
+ var onEditorChange = useEditorOnChangePM({
263
+ onChange: !navigationMode ? onChange : function () { return undefined; },
264
+ getView: getView,
265
+ isActive: isActive,
266
+ onChangeCursor: setCursorPosition,
267
+ onChangeActiveToken: setActiveToken,
268
+ tokenizer: !navigationMode ? tokenizer : function () { return []; },
269
+ onFormulaStateChange: !navigationMode
270
+ ? onFormulaStateChange
271
+ : undefined,
272
+ onSuggestionTokenChange: handleSuggestionTokenChange,
273
+ onTableTokenChange: setTableToken,
274
+ onChangeFunctionToken: setFunctionToken,
275
+ onChangeIsEdgeOfCell: setIsEdgeOfCell,
276
+ onChangeParameterIndex: setParameterIndex,
277
+ onCellPropertyTokenChange: setCellPropertyToken,
278
+ onChangeFunctionParameters: function (params, ranges) {
279
+ setParameterArguments(params);
280
+ setParameterRanges(ranges);
281
+ },
282
+ onChangePreviousToken: setPreviousToken,
283
+ enableContinuousSelection: enableContinuousSelection !== null && enableContinuousSelection !== void 0 ? enableContinuousSelection : isNil(navigationMode),
284
+ });
285
+ // Initialize editor
286
+ useIsomorphicLayoutEffect(function () {
287
+ if (!editorRef.current)
288
+ return;
289
+ try {
290
+ var state = EditorState.create({
291
+ doc: createInitialDocument(),
292
+ plugins: __spreadArray(__spreadArray([
293
+ history(),
294
+ createUnfocusedSelectionPlugin()
295
+ ], __read((placeholder ? [createPlaceholderPlugin(placeholder)] : [])), false), [
296
+ createMentionsPlugin({
297
+ onChangeState: function (nextState) {
298
+ if (navigationModeRef.current)
299
+ return;
300
+ onChangeMentionState(nextState);
301
+ },
302
+ getFormulaMode: function () { var _a; return (_a = formulaModeRef.current) !== null && _a !== void 0 ? _a : false; },
303
+ }),
304
+ createDecorationPlugin({
305
+ formulaMode: formulaMode,
306
+ isActive: isActive,
307
+ tokenizer: tokenizer,
308
+ getDecorations: function (state) {
309
+ try {
310
+ if (navigationModeRef.current) {
311
+ return DecorationSet.create(state.doc, []);
312
+ }
313
+ // Use current ref values to get latest decorator
314
+ if (decoratorRef.current) {
315
+ return decoratorRef.current(state);
316
+ }
317
+ return DecorationSet.create(state.doc, []);
318
+ }
319
+ catch (decorationError) {
320
+ console.warn("Error creating decorations:", decorationError);
321
+ return DecorationSet.create(state.doc, []);
322
+ }
323
+ },
324
+ }),
325
+ keymap(__assign(__assign({}, baseKeymap), { Backspace: function (state, dispatch, view) {
326
+ if (view === null || view === void 0 ? void 0 : view.composing) {
327
+ return false;
328
+ }
329
+ // Check if all content is selected
330
+ var _a = state.selection, from = _a.from, to = _a.to;
331
+ var allSelected = state.selection instanceof AllSelection ||
332
+ (from === 0 && to === state.doc.content.size);
333
+ if (allSelected) {
334
+ return deleteAll(state, dispatch);
335
+ }
336
+ // Handle backspace at the beginning of a line - merge with previous line
337
+ if (from === to && from > 0) {
338
+ var $pos = state.doc.resolve(from);
339
+ // Check if we're at the beginning of a line (parentOffset === 0 means start of line content)
340
+ if ($pos.parent.type.name === "line" &&
341
+ $pos.parentOffset === 0) {
342
+ // Use joinBackward to properly merge the lines
343
+ return joinBackward(state, dispatch);
344
+ }
345
+ }
346
+ // Fall through to default backspace behavior
347
+ return false;
348
+ }, Delete: function (state, dispatch, view) {
349
+ if (view === null || view === void 0 ? void 0 : view.composing) {
350
+ return false;
351
+ }
352
+ var _a = state.selection, from = _a.from, to = _a.to;
353
+ var allSelected = state.selection instanceof AllSelection ||
354
+ (from === 0 && to === state.doc.content.size);
355
+ if (allSelected) {
356
+ return deleteAll(state, dispatch);
357
+ }
358
+ return false;
359
+ }, "Mod-z": undo, "Shift-Mod-z": redo, "Mod-y": redo,
360
+ // Rich-text marks: only toggle when not in formula mode —
361
+ // we don't want Cmd+B to corrupt a formula. The Mod-key
362
+ // chord also reaches the canvas-grid keyboard handler so
363
+ // cell-level bold still works there for non-edit mode.
364
+ "Mod-b": function (state, dispatch) {
365
+ if (formulaModeRef.current)
366
+ return false;
367
+ return toggleMark(schema.marks.bold)(state, dispatch);
368
+ }, "Mod-i": function (state, dispatch) {
369
+ if (formulaModeRef.current)
370
+ return false;
371
+ return toggleMark(schema.marks.italic)(state, dispatch);
372
+ }, "Mod-u": function (state, dispatch) {
373
+ if (formulaModeRef.current)
374
+ return false;
375
+ return toggleMark(schema.marks.underline)(state, dispatch);
376
+ }, "Shift-Mod-x": function (state, dispatch) {
377
+ if (formulaModeRef.current)
378
+ return false;
379
+ return toggleMark(schema.marks.strikethrough)(state, dispatch);
380
+ },
381
+ // Google Sheets/Docs chords. The schema marks
382
+ // mutually exclude each other, so toggling one on
383
+ // clears the other.
384
+ "Mod-.": function (state, dispatch) {
385
+ if (formulaModeRef.current)
386
+ return false;
387
+ return toggleMark(schema.marks.superscript)(state, dispatch);
388
+ }, "Mod-,": function (state, dispatch) {
389
+ if (formulaModeRef.current)
390
+ return false;
391
+ return toggleMark(schema.marks.subscript)(state, dispatch);
392
+ }, Enter: function () {
393
+ // Let React handle Enter through onKeyDownEditor
394
+ return false; // Don't consume the event, let it bubble up
395
+ }, ArrowUp: function () {
396
+ return false;
397
+ }, ArrowDown: function () {
398
+ return false;
399
+ }, Escape: function () {
400
+ // Handle escape key
401
+ return true;
402
+ }, F4: function () {
403
+ // Handle F4 for cycling references
404
+ if (activeTokenRef.current) {
405
+ onCycleReference(activeTokenRef.current);
406
+ }
407
+ return true;
408
+ } })),
409
+ ], false),
410
+ });
411
+ // Stamp the cell's font onto each line in clipboard HTML so a
412
+ // paste lands with the source font. Skips when no font is set —
413
+ // the destination cell then keeps its own.
414
+ var clipboardSerializer = new DOMSerializer(__assign(__assign({}, DOMSerializer.nodesFromSchema(schema)), { line: function () {
415
+ var font = cellFontFamilyRef.current;
416
+ return font
417
+ ? ["div", { style: "font-family: ".concat(font) }, 0]
418
+ : ["div", 0];
419
+ } }), DOMSerializer.marksFromSchema(schema));
420
+ var view_1 = new EditorView(editorRef.current, {
421
+ state: state,
422
+ clipboardSerializer: clipboardSerializer,
423
+ nodeViews: {
424
+ mention: function (node, view, getPos) {
425
+ return new MentionNodeView(node, view, getPos, MentionTagComponent);
426
+ },
427
+ },
428
+ dispatchTransaction: function (transaction) {
429
+ try {
430
+ var newState = view_1.state.apply(transaction);
431
+ view_1.updateState(newState);
432
+ // Call the onChange handler which will handle all token analysis and state updates
433
+ if (!navigationModeRef.current) {
434
+ onEditorChange(newState);
435
+ }
436
+ }
437
+ catch (error) {
438
+ log("Error dispatching transaction:", error);
439
+ // Try to recover by reverting to current state
440
+ try {
441
+ if (!navigationModeRef.current) {
442
+ onEditorChange(view_1.state);
443
+ }
444
+ }
445
+ catch (recoveryError) {
446
+ log("Error during transaction recovery:", recoveryError);
447
+ }
448
+ }
449
+ },
450
+ attributes: {
451
+ class: cn("h-full overflow-auto [&_div]:outline-none"),
452
+ spellcheck: formulaMode !== true ? "true" : "false",
453
+ contenteditable: !disabled ? "true" : "false",
454
+ inputmode: navigationModeRef.current ? "none" : "text",
455
+ tabindex: "0",
456
+ },
457
+ editable: function () { return !disabled; },
458
+ handleDOMEvents: {
459
+ focus: function (_, event) {
460
+ var _a;
461
+ (_a = onFocusRef.current) === null || _a === void 0 ? void 0 : _a.call(onFocusRef, event);
462
+ return false; // Let ProseMirror handle the focus as well
463
+ },
464
+ blur: function (_, event) {
465
+ var _a;
466
+ (_a = onBlurRef.current) === null || _a === void 0 ? void 0 : _a.call(onBlurRef, event);
467
+ return false; // Let ProseMirror handle the blur as well
468
+ },
469
+ copy: function (_, event) {
470
+ var _a;
471
+ (_a = onCopyRef.current) === null || _a === void 0 ? void 0 : _a.call(onCopyRef, event);
472
+ return false;
473
+ },
474
+ paste: function (_, event) {
475
+ var _a;
476
+ (_a = onPasteRef.current) === null || _a === void 0 ? void 0 : _a.call(onPasteRef, event);
477
+ return false;
478
+ },
479
+ cut: function (_, event) {
480
+ var _a;
481
+ (_a = onCutRef.current) === null || _a === void 0 ? void 0 : _a.call(onCutRef, event);
482
+ return false;
483
+ },
484
+ },
485
+ });
486
+ viewRef.current = view_1;
487
+ return function () {
488
+ try {
489
+ view_1.destroy();
490
+ }
491
+ catch (error) {
492
+ log("Error destroying editor view:", error);
493
+ }
494
+ viewRef.current = null;
495
+ };
496
+ }
497
+ catch (error) {
498
+ log("Error initializing ProseMirror editor:", error);
499
+ // Try to create a minimal fallback editor
500
+ try {
501
+ var fallbackState = EditorState.create({
502
+ doc: schema.node("doc", null, [schema.node("line", null, [])]),
503
+ plugins: [history()],
504
+ });
505
+ var fallbackView = new EditorView(editorRef.current, {
506
+ state: fallbackState,
507
+ });
508
+ viewRef.current = fallbackView;
509
+ }
510
+ catch (fallbackError) {
511
+ log("Error creating fallback editor:", fallbackError);
512
+ }
513
+ }
514
+ }, [createInitialDocument]); // Re-initialize if document creation logic changes
515
+ // Update editor content when value changes
516
+ useIsomorphicLayoutEffect(function () {
517
+ if (viewRef.current) {
518
+ try {
519
+ var currentContent = serializeEditorValue(viewRef.current.state.doc);
520
+ if (currentContent !== value) {
521
+ var newDoc = createInitialDocument();
522
+ var tr = viewRef.current.state.tr.replaceWith(0, viewRef.current.state.doc.content.size, newDoc.content);
523
+ viewRef.current.dispatch(tr);
524
+ }
525
+ }
526
+ catch (error) {
527
+ log("Error updating editor content:", error);
528
+ }
529
+ }
530
+ }, [value, createInitialDocument]);
531
+ // Update decorations when formula mode or active state changes
532
+ useIsomorphicLayoutEffect(function () {
533
+ if (navigationModeRef.current)
534
+ return;
535
+ if (viewRef.current) {
536
+ try {
537
+ // Force a decoration update by dispatching a metadata transaction
538
+ var tr = viewRef.current.state.tr.setMeta("updateDecorations", {
539
+ formulaMode: formulaMode,
540
+ isActive: isActive,
541
+ cursorPosition: cursorPosition,
542
+ });
543
+ viewRef.current.dispatch(tr);
544
+ }
545
+ catch (error) {
546
+ log("Error updating decorations:", error);
547
+ }
548
+ }
549
+ }, [formulaMode, isActive, cursorPosition]);
550
+ // Update editor disabled state when disabled prop changes
551
+ useIsomorphicLayoutEffect(function () {
552
+ if (viewRef.current) {
553
+ try {
554
+ // Update contenteditable attribute
555
+ var editorDom = viewRef.current.dom;
556
+ if (editorDom) {
557
+ editorDom.setAttribute("contenteditable", disabled ? "false" : "true");
558
+ }
559
+ // Update editable state in ProseMirror
560
+ // This forces ProseMirror to re-evaluate its editable state
561
+ viewRef.current.setProps(__assign(__assign({}, viewRef.current.props), { editable: function () { return !disabled; } }));
562
+ }
563
+ catch (error) {
564
+ log("Error updating disabled state:", error);
565
+ }
566
+ }
567
+ }, [disabled]);
568
+ // Focus editor
569
+ var focusEditor = useCallback(function () {
570
+ if (viewRef.current &&
571
+ viewRef.current.dom &&
572
+ !viewRef.current.hasFocus()) {
573
+ try {
574
+ viewRef.current.focus();
575
+ // Ensure the DOM element also gets focus
576
+ if (document.activeElement !== viewRef.current.dom) {
577
+ viewRef.current.dom.focus();
578
+ }
579
+ }
580
+ catch (error) {
581
+ console.warn("Failed to focus editor:", error);
582
+ }
583
+ }
584
+ }, []);
585
+ /**
586
+ * Teardown current editor
587
+ */
588
+ var handleTeardown = useCallback(function () {
589
+ if (viewRef.current) {
590
+ viewRef.current.destroy();
591
+ viewRef.current = null;
592
+ }
593
+ onTeardown === null || onTeardown === void 0 ? void 0 : onTeardown();
594
+ }, [onTeardown]);
595
+ // Get current value
596
+ var getCurrentValue = useCallback(function () {
597
+ var _a;
598
+ if (viewRef.current) {
599
+ return serializeEditorValue(viewRef.current.state.doc);
600
+ }
601
+ return (_a = currentValueRef.current) !== null && _a !== void 0 ? _a : "";
602
+ }, []);
603
+ // Is Cursor at end of input
604
+ var isCursorAtEnd = useCallback(function () {
605
+ var view = viewRef.current;
606
+ if (!view)
607
+ return false;
608
+ var state = view.state;
609
+ var selection = state.selection;
610
+ if (!selection.empty)
611
+ return false;
612
+ var $pos = state.doc.resolve(selection.from);
613
+ var endPos = $pos.end(); // End of the current block
614
+ return selection.from === endPos;
615
+ }, []);
616
+ // Item to stirng
617
+ var itemToString = useCallback(function (item) { var _a, _b; return (_b = (_a = item === null || item === void 0 ? void 0 : item.value) !== null && _a !== void 0 ? _a : item === null || item === void 0 ? void 0 : item.title) !== null && _b !== void 0 ? _b : ""; }, []);
618
+ // Final options
619
+ var finalOptions = useMemo(function () {
620
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
621
+ if (navigationMode) {
622
+ return [];
623
+ }
624
+ if (formulaMode) {
625
+ var isStructured = Boolean(tableToken);
626
+ var isCellProperty = Boolean(cellPropertyToken);
627
+ if (isCellProperty && cellPropertyToken) {
628
+ if (!cellPropertyToken.structured) {
629
+ var dotIndex = getPropertyStartIndex(cellPropertyToken);
630
+ if (dotIndex === -1) {
631
+ return [];
632
+ }
633
+ var address = cellPropertyToken.image.slice(0, dotIndex);
634
+ var cell = addressToCell(address);
635
+ if (!cell) {
636
+ return [];
637
+ }
638
+ var props_1 = (_a = getStructuredProperties === null || getStructuredProperties === void 0 ? void 0 : getStructuredProperties(cellPropertyToken.sheetName, cell.rowIndex, cell.columnIndex)) !== null && _a !== void 0 ? _a : [];
639
+ return props_1;
640
+ }
641
+ if (cellPropertyToken.resolvedRowIndex !== undefined &&
642
+ cellPropertyToken.resolvedColumnIndex !== undefined) {
643
+ return ((_c = getStructuredProperties === null || getStructuredProperties === void 0 ? void 0 : getStructuredProperties((_b = cellPropertyToken.resolvedSheetName) !== null && _b !== void 0 ? _b : cellPropertyToken.sheetName, cellPropertyToken.resolvedRowIndex, cellPropertyToken.resolvedColumnIndex)) !== null && _c !== void 0 ? _c : []);
644
+ }
645
+ return [];
646
+ }
647
+ if (isStructured) {
648
+ var canSelectThisRow = ((_d = activeTokenRef.current) === null || _d === void 0 ? void 0 : _d.image) !== "@";
649
+ var columns = (_e = getTableColumnNames === null || getTableColumnNames === void 0 ? void 0 : getTableColumnNames(tableToken === null || tableToken === void 0 ? void 0 : tableToken.tableName)) !== null && _e !== void 0 ? _e : [];
650
+ // If there are no columns, lets not display suggestions
651
+ if (!columns.length) {
652
+ return [];
653
+ }
654
+ return __spreadArray(__spreadArray(__spreadArray([], __read((canSelectThisRow ? [THIS_ROW_ITEM] : [])), false), __read(columns), false), __read(SPECIAL_ITEMS), false);
655
+ }
656
+ var tableNames = (_f = getTableNames === null || getTableNames === void 0 ? void 0 : getTableNames()) !== null && _f !== void 0 ? _f : [];
657
+ var parameterItems = isEdgeofCell
658
+ ? []
659
+ : (_g = parameterSuggestions === null || parameterSuggestions === void 0 ? void 0 : parameterSuggestions.map(function (item) {
660
+ var _a;
661
+ return (__assign(__assign({}, item), { category: (_a = item.category) !== null && _a !== void 0 ? _a : "parameter" }));
662
+ })) !== null && _g !== void 0 ? _g : [];
663
+ var baseOptions = __spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(tableNames), false), __read(((_h = getNamedRanges === null || getNamedRanges === void 0 ? void 0 : getNamedRanges()) !== null && _h !== void 0 ? _h : [])), false), __read((functionDescriptions !== null && functionDescriptions !== void 0 ? functionDescriptions : [])), false), __read((parameterItems !== null && parameterItems !== void 0 ? parameterItems : [])), false);
664
+ if (suggestionTokenRef.current &&
665
+ ((_j = suggestionTokenRef.current.tokenType) === null || _j === void 0 ? void 0 : _j.name) ===
666
+ tokenVocabulary.UnterminatedStringStart.name) {
667
+ return parameterItems;
668
+ }
669
+ return baseOptions;
670
+ }
671
+ return options !== null && options !== void 0 ? options : [];
672
+ }, [
673
+ navigationMode,
674
+ formulaMode,
675
+ getTableNames,
676
+ getTableColumnNames,
677
+ getStructuredProperties,
678
+ options,
679
+ functionDescriptions,
680
+ getNamedRanges,
681
+ tableToken,
682
+ cellPropertyToken,
683
+ functionToken,
684
+ parameterSuggestions,
685
+ isEdgeofCell,
686
+ showFormulaHelp,
687
+ ]);
688
+ var activeParameterRange = useMemo(function () {
689
+ var range = parameterRanges[parameterIndex];
690
+ if (!range)
691
+ return undefined;
692
+ return {
693
+ start: range.start + 1,
694
+ end: range.end + 1,
695
+ };
696
+ }, [parameterRanges, parameterIndex]);
697
+ var itemsWhenEmpty = useMemo(function () {
698
+ var _a;
699
+ if (navigationMode) {
700
+ return undefined;
701
+ }
702
+ if (!isEdgeofCell &&
703
+ functionToken &&
704
+ (shouldFetchFunctionParameters === null || shouldFetchFunctionParameters === void 0 ? void 0 : shouldFetchFunctionParameters((_a = functionToken.image) !== null && _a !== void 0 ? _a : "", parameterIndex, parameterArguments))) {
705
+ return parameterSuggestions !== null && parameterSuggestions !== void 0 ? parameterSuggestions : [];
706
+ }
707
+ return undefined;
708
+ }, [
709
+ navigationMode,
710
+ functionToken,
711
+ shouldFetchFunctionParameters,
712
+ parameterIndex,
713
+ parameterArguments,
714
+ parameterSuggestions,
715
+ isEdgeofCell,
716
+ ]);
717
+ // Callback when user selects an item from dropdown
718
+ var handleDropdownChange = useDropdownChangePM({
719
+ onSubmit: !navigationMode ? onSubmit : undefined,
720
+ formulaMode: formulaMode,
721
+ itemToString: itemToString,
722
+ suggestionToken: suggestionTokenRef.current,
723
+ previousToken: previousTokenRef.current,
724
+ propertyToken: cellPropertyToken,
725
+ getView: getView,
726
+ activeToken: activeTokenRef.current,
727
+ parameterRange: activeParameterRange,
728
+ });
729
+ // Inserts a mention in the dom
730
+ var handleInsertMention = useCallback(function (mention) {
731
+ if (viewRef.current && mentionState.range && mention) {
732
+ var state = viewRef.current.state;
733
+ var mentionNode = state.schema.nodes.mention.create({
734
+ label: mention.label,
735
+ value: mention.value,
736
+ });
737
+ var tr = state.tr
738
+ .delete(mentionState.range.from, mentionState.range.to)
739
+ .insert(mentionState.range.from, [
740
+ mentionNode,
741
+ state.schema.text(" "),
742
+ ]);
743
+ viewRef.current.dispatch(tr);
744
+ }
745
+ }, [mentionState, onChangeMentionState]);
746
+ // Mention keydown
747
+ var _v = useMentionKeyDown({
748
+ mentions: mentions,
749
+ mentionState: mentionState,
750
+ onSelect: handleInsertMention,
751
+ }), mentionHighlightedIndex = _v.highlightedIndex, onMentionKeydown = _v.onMentionKeydown;
752
+ // Dropdown integration
753
+ var _w = useDropdown({
754
+ initialOpen: navigationMode
755
+ ? false
756
+ : formulaMode
757
+ ? false
758
+ : Boolean(options === null || options === void 0 ? void 0 : options.length),
759
+ initialHighlightedIndex: -1,
760
+ initialQuery: navigationMode
761
+ ? undefined
762
+ : formulaMode
763
+ ? undefined
764
+ : value,
765
+ isNewValue: isNewValue,
766
+ items: finalOptions,
767
+ onChange: handleDropdownChange,
768
+ itemToString: itemToString,
769
+ itemsWhenEmpty: itemsWhenEmpty,
770
+ // Only meaningful for the plain (data-validation) dropdown — formula
771
+ // mode's function/reference suggestions have no "current entry".
772
+ isItemSelected: !navigationMode && !formulaMode ? isOptionSelected : undefined,
773
+ limit: formulaMode
774
+ ? tableToken
775
+ ? Number.MAX_SAFE_INTEGER
776
+ : cellPropertyToken
777
+ ? Number.MAX_SAFE_INTEGER
778
+ : 10
779
+ : Number.MAX_SAFE_INTEGER,
780
+ showAllIfEmpty: !formulaMode || !!tableToken || !!cellPropertyToken,
781
+ }), isOpen = _w.isOpen, highlightedIndex = _w.highlightedIndex, onSelect = _w.onSelect, onChangeHighlightedIndex = _w.onChangeHighlightedIndex, items = _w.items, onDropdownKeyDown = _w.onKeyDown, setQuery = _w.setQuery, query = _w.query;
782
+ // Update dropdown query when suggestion token changes
783
+ useIsomorphicLayoutEffect(function () {
784
+ var _a, _b, _c, _d;
785
+ if (navigationModeRef.current)
786
+ return;
787
+ var token = suggestionTokenRef.current;
788
+ if (token) {
789
+ if (((_a = token.tokenType) === null || _a === void 0 ? void 0 : _a.name) ===
790
+ tokenVocabulary.UnterminatedStringStart.name) {
791
+ var cleaned = (_c = (_b = token.image) === null || _b === void 0 ? void 0 : _b.replace(/"/g, "")) !== null && _c !== void 0 ? _c : "";
792
+ setQuery(cleaned);
793
+ }
794
+ else {
795
+ setQuery((_d = token.image) !== null && _d !== void 0 ? _d : "");
796
+ }
797
+ }
798
+ }, [setQuery]);
799
+ // Show dropdown if functiontoken is present
800
+ var isDropdownOpen = Boolean(isOpen ||
801
+ (formulaMode && !isEdgeofCell && (items.length > 1 || functionToken)));
802
+ var showDropdownEffective = showDropdown && !navigationMode;
803
+ // Handle update editor
804
+ var handleUpdate = useCallback(function (address, selectionMode) {
805
+ if (!viewRef.current) {
806
+ console.warn("handleUpdate: Editor view not available");
807
+ return;
808
+ }
809
+ try {
810
+ var state = viewRef.current.state;
811
+ var tr = state.tr;
812
+ var activeToken = activeTokenRef.current;
813
+ if (selectionMode === "modify" && activeToken) {
814
+ var from = Math.max(0, activeToken.startColumn);
815
+ var to = Math.min(state.doc.content.size, activeToken.endColumn + 1);
816
+ // Bounds checking
817
+ if (from >= 0 && to <= state.doc.content.size && from <= to) {
818
+ tr.delete(from, to);
819
+ }
820
+ else {
821
+ console.warn("Invalid delete range: ".concat(from, "-").concat(to, ", doc size: ").concat(state.doc.content.size));
822
+ }
823
+ }
824
+ if (selectionMode === "append" &&
825
+ activeToken &&
826
+ isCellToken(activeToken)) {
827
+ tr.insertText(",");
828
+ }
829
+ if (address && typeof address === "string") {
830
+ // Sanitize address string
831
+ var cleanAddress = address.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, "");
832
+ tr.insertText(cleanAddress);
833
+ }
834
+ viewRef.current.dispatch(tr);
835
+ }
836
+ catch (error) {
837
+ log("Error updating editor:", error);
838
+ }
839
+ }, []);
840
+ // Cycle between absolute and relative references
841
+ var onCycleReference = useCycleFormulaReference({
842
+ onUpdate: handleUpdate,
843
+ });
844
+ // KeyDown handler
845
+ var handleKeyDown = useCallback(function (e) {
846
+ if (!navigationMode && showDropdownEffective && isDropdownOpen) {
847
+ onDropdownKeyDown === null || onDropdownKeyDown === void 0 ? void 0 : onDropdownKeyDown(e);
848
+ }
849
+ if (!navigationMode && mentionState.active) {
850
+ onMentionKeydown(e);
851
+ }
852
+ onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(e);
853
+ }, [
854
+ onKeyDown,
855
+ onDropdownKeyDown,
856
+ showDropdownEffective,
857
+ isDropdownOpen,
858
+ mentionState,
859
+ onMentionKeydown,
860
+ navigationMode,
861
+ ]);
862
+ var handleKeyDownCapture = useCallback(function (e) {
863
+ if (!navigationMode) {
864
+ return;
865
+ }
866
+ var key = e.key.toLowerCase();
867
+ var isUndoRedoShortcut = (e.metaKey || e.ctrlKey) &&
868
+ !e.altKey &&
869
+ (key === "z" || key === "y");
870
+ if (isUndoRedoShortcut) {
871
+ e.preventDefault();
872
+ }
873
+ }, [navigationMode]);
874
+ // Insert break handler for ProseMirror
875
+ var handleInsertBreak = useCallback(function () {
876
+ if (viewRef.current) {
877
+ var state = viewRef.current.state;
878
+ var $from = state.selection.$from;
879
+ // Check if we can split at this position
880
+ var canSplit = $from.depth > 0;
881
+ if (canSplit) {
882
+ // Split the line at the cursor position
883
+ var tr = state.tr.split($from.pos);
884
+ // Move cursor to the start of the new line (right after the split)
885
+ var newPos = $from.pos + 2; // +2 to move into the new line node
886
+ if (newPos <= tr.doc.content.size) {
887
+ tr.setSelection(TextSelection.near(tr.doc.resolve(newPos)));
888
+ }
889
+ viewRef.current.dispatch(tr);
890
+ }
891
+ else {
892
+ // Fallback: just insert a new line node
893
+ var newLine = state.schema.nodes.line.create();
894
+ var tr = state.tr.replaceSelectionWith(newLine);
895
+ var newPos = tr.selection.from + 1;
896
+ if (newPos <= tr.doc.content.size) {
897
+ tr.setSelection(TextSelection.near(tr.doc.resolve(newPos)));
898
+ }
899
+ viewRef.current.dispatch(tr);
900
+ }
901
+ }
902
+ }, []);
903
+ var canSubmitInDropdown = function () {
904
+ var token = suggestionTokenRef.current;
905
+ var item = items[highlightedIndex];
906
+ if ((token === null || token === void 0 ? void 0 : token.property) && item) {
907
+ return (item === null || item === void 0 ? void 0 : item.title) === (token === null || token === void 0 ? void 0 : token.property);
908
+ }
909
+ if (item && item.category === "namedrange") {
910
+ return item.title === (token === null || token === void 0 ? void 0 : token.image);
911
+ }
912
+ return false;
913
+ };
914
+ // Editor keydown handler
915
+ var canSubmit = (highlightedIndex === -1 ||
916
+ items.length === 0 ||
917
+ canSubmitInDropdown()) &&
918
+ !showMentionDropdownEffective;
919
+ var onKeyDownEditor = useEditorKeyDownPM({
920
+ value: value,
921
+ formulaMode: formulaMode,
922
+ isNewValue: isNewValue,
923
+ isActive: isActive,
924
+ isCursorAtEnd: isCursorAtEnd,
925
+ onCancel: !navigationMode ? onCancel : undefined,
926
+ onSubmit: !navigationMode ? onSubmit : undefined,
927
+ onInsertBreak: handleInsertBreak,
928
+ onKeyDown: handleKeyDown,
929
+ canSubmit: canSubmit,
930
+ canCancel: !isOpen && !showMentionDropdownEffective,
931
+ isDropdownOpen: isDropdownOpen,
932
+ getView: getView,
933
+ });
934
+ // Move cursor to the end
935
+ var moveCursorToEnd = useCallback(function () {
936
+ if (!viewRef.current) {
937
+ console.warn("moveCursorToEnd: Editor view not available");
938
+ return;
939
+ }
940
+ try {
941
+ var state = viewRef.current.state;
942
+ var pos = Math.min(state.doc.content.size, Math.max(0, state.doc.content.size));
943
+ if (pos >= 0 && pos <= state.doc.content.size) {
944
+ var tr = state.tr.setSelection(TextSelection.near(state.doc.resolve(pos)));
945
+ viewRef.current.dispatch(tr);
946
+ }
947
+ else {
948
+ console.warn("Invalid cursor position for moveCursorToEnd: ".concat(pos));
949
+ }
950
+ }
951
+ catch (error) {
952
+ log("Error moving cursor to end:", error);
953
+ }
954
+ }, []);
955
+ // In Strict mode, memo refs are not changed afaik
956
+ var imperativeMethods = useMemo(function () { return ({
957
+ update: handleUpdate,
958
+ teardown: handleTeardown,
959
+ setValue: function (value, formatRuns) {
960
+ var _a, _b;
961
+ if (!viewRef.current) {
962
+ console.warn("setValue: Editor view not available");
963
+ return;
964
+ }
965
+ try {
966
+ (_b = (_a = viewRef.current).endComposition) === null || _b === void 0 ? void 0 : _b.call(_a);
967
+ var newDoc = !isAFormula(value) && formatRuns && formatRuns.length > 0
968
+ ? applyTextFormatRuns(value, formatRuns, schema, resolveRunColor)
969
+ : deserializeString(value, schema);
970
+ var state = viewRef.current.state;
971
+ var currentSelection = state.selection;
972
+ var tr = state.tr.replaceWith(0, state.doc.content.size, newDoc.content);
973
+ // Try to preserve cursor position if it's still valid
974
+ var newDocSize = tr.doc.content.size;
975
+ var preservedPos = Math.min(Math.max(0, currentSelection.from), newDocSize);
976
+ // Set selection to preserved position with bounds checking
977
+ if (preservedPos >= 0 && preservedPos <= newDocSize) {
978
+ tr.setSelection(TextSelection.near(tr.doc.resolve(preservedPos)));
979
+ }
980
+ viewRef.current.dispatch(tr);
981
+ }
982
+ catch (error) {
983
+ log("Error setting editor value:", error);
984
+ // Fallback: try to set empty content
985
+ try {
986
+ var emptyDoc = schema.node("doc", null, [
987
+ schema.node("line", null, []),
988
+ ]);
989
+ var tr = viewRef.current.state.tr.replaceWith(0, viewRef.current.state.doc.content.size, emptyDoc.content);
990
+ viewRef.current.dispatch(tr);
991
+ }
992
+ catch (fallbackError) {
993
+ log("Error in setValue fallback:", fallbackError);
994
+ }
995
+ }
996
+ },
997
+ getValue: function () {
998
+ return getCurrentValue();
999
+ },
1000
+ applyTextFormat: function (format) {
1001
+ var view = viewRef.current;
1002
+ if (!view) {
1003
+ return false;
1004
+ }
1005
+ var handled = applyTextFormatToSelection(view.state, view.dispatch, format, schema, resolveRunColor);
1006
+ // Focus is NOT managed here. The ProseMirror selection survives
1007
+ // without DOM focus, and the toolbar's existing machinery
1008
+ // (ToolbarIconButton -> focusSheet, dropdown onCloseAutoFocus)
1009
+ // already returns focus to the sheet after a control is used —
1010
+ // taking focus synchronously from inside a control's event
1011
+ // handler lets that event's default action land in the editor.
1012
+ return handled;
1013
+ },
1014
+ getSelectionFontSize: function () {
1015
+ var view = viewRef.current;
1016
+ if (!view) {
1017
+ return null;
1018
+ }
1019
+ return getSelectionFontSize(view.state);
1020
+ },
1021
+ moveCursorToEnd: moveCursorToEnd,
1022
+ moveCursorToTokenEnd: function (index) {
1023
+ var e_1, _a;
1024
+ if (index === undefined || index === null) {
1025
+ this.moveCursorToEnd();
1026
+ return;
1027
+ }
1028
+ var tokens = tokenizer(getCurrentValue());
1029
+ try {
1030
+ for (var tokens_1 = __values(tokens), tokens_1_1 = tokens_1.next(); !tokens_1_1.done; tokens_1_1 = tokens_1.next()) {
1031
+ var token = tokens_1_1.value;
1032
+ if ((token.selection || token.structured || token.isNamedRange) &&
1033
+ token.index === index &&
1034
+ token.endColumn !== undefined) {
1035
+ // Token columns are ProseMirror positions (see
1036
+ // `handleUpdate`); the caret slot after the token's
1037
+ // last character is endColumn + 1
1038
+ this.select(token.endColumn + 1);
1039
+ return;
1040
+ }
1041
+ }
1042
+ }
1043
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
1044
+ finally {
1045
+ try {
1046
+ if (tokens_1_1 && !tokens_1_1.done && (_a = tokens_1.return)) _a.call(tokens_1);
1047
+ }
1048
+ finally { if (e_1) throw e_1.error; }
1049
+ }
1050
+ this.moveCursorToEnd();
1051
+ },
1052
+ focus: function (shouldMoveSelectionToEnd) {
1053
+ if (!persistFocus) {
1054
+ console.debug("Focus persisting disabled");
1055
+ return;
1056
+ }
1057
+ focusEditor();
1058
+ if (shouldMoveSelectionToEnd) {
1059
+ this.moveCursorToEnd();
1060
+ }
1061
+ },
1062
+ isFocused: function () {
1063
+ if (!viewRef.current)
1064
+ return false;
1065
+ return (viewRef.current.hasFocus() ||
1066
+ document.activeElement === viewRef.current.dom);
1067
+ },
1068
+ get selection() {
1069
+ var _a, _b;
1070
+ return (_b = (_a = viewRef.current) === null || _a === void 0 ? void 0 : _a.state.selection.from) !== null && _b !== void 0 ? _b : null;
1071
+ },
1072
+ select: function (target) {
1073
+ if (!viewRef.current) {
1074
+ console.warn("select: Editor view not available");
1075
+ return;
1076
+ }
1077
+ try {
1078
+ var state = viewRef.current.state;
1079
+ // Validate target position
1080
+ if (typeof target !== "number" || !isFinite(target)) {
1081
+ console.warn("Invalid select target: ".concat(target));
1082
+ return;
1083
+ }
1084
+ var pos = Math.min(Math.max(0, target), state.doc.content.size);
1085
+ if (pos >= 0 && pos <= state.doc.content.size) {
1086
+ var tr = state.tr.setSelection(TextSelection.near(state.doc.resolve(pos)));
1087
+ viewRef.current.dispatch(tr);
1088
+ }
1089
+ else {
1090
+ console.warn("Invalid cursor position for select: ".concat(pos));
1091
+ }
1092
+ }
1093
+ catch (error) {
1094
+ log("Error selecting position:", error);
1095
+ }
1096
+ },
1097
+ el: function () {
1098
+ var _a;
1099
+ return (_a = viewRef.current) === null || _a === void 0 ? void 0 : _a.dom;
1100
+ },
1101
+ }); }, [
1102
+ focusEditor,
1103
+ handleUpdate,
1104
+ handleTeardown,
1105
+ persistFocus,
1106
+ getCurrentValue,
1107
+ moveCursorToEnd,
1108
+ tokenizer,
1109
+ resolveRunColor,
1110
+ ]);
1111
+ // Expose editor methods
1112
+ useImperativeHandle(forwardedRef, function () { return imperativeMethods; }, [
1113
+ imperativeMethods,
1114
+ ]);
1115
+ // Auto focus
1116
+ useIsomorphicLayoutEffect(function () {
1117
+ if (autoFocus && viewRef.current) {
1118
+ focusEditor();
1119
+ moveCursorToEnd();
1120
+ }
1121
+ }, [autoFocus, focusEditor, moveCursorToEnd]);
1122
+ return (React.createElement(Popper.Root, null,
1123
+ !showDropdownEffective ||
1124
+ showFormulaHelp ||
1125
+ !functionToken ? null : (React.createElement(StyledFormulaHelp, { onMouseDown: onShowFormulaHelp, title: "Show formula help", className: cn(editorZeroOutline ? "mr-px top-px" : undefined) },
1126
+ React.createElement(QuestionMarkIcon, { width: 12, height: 12 }))),
1127
+ !navigationMode && isFetchingParameters && (React.createElement("div", { className: "absolute top-1/2 right-[-18px] -translate-y-1/2 h-[14px]" },
1128
+ React.createElement(LoadingIcon, { className: "animate-spin" }))),
1129
+ React.createElement("div", { className: "h-full overflow-auto [&_div]:outline-none" },
1130
+ React.createElement("div", __assign({ ref: editorRef, className: cn(className, "whitespace-pre-wrap"), onKeyDownCapture: handleKeyDownCapture, onKeyDown: onKeyDownEditor }, props))),
1131
+ React.createElement(Popper.Anchor, { asChild: true },
1132
+ React.createElement("button", { tabIndex: -1, className: cn("absolute left-0 top-0 w-0 h-full overflow-hidden m-0 p-0 border-none bg-transparent shadow-none"), style: {
1133
+ left: showMentionDropdownEffective ? mentionPositionLeft : 0,
1134
+ } })),
1135
+ showDropdownEffective && isDropdownOpen && (React.createElement(ConditionalWrapper, { condition: stickyEditor, wrapper: function (children) { return React.createElement(Portal, { asChild: true }, children); } },
1136
+ React.createElement(Popper.Content, { side: "bottom", align: "start", className: "z-50", sideOffset: 2 },
1137
+ React.createElement(SuggestionsDropdown, { functionDescriptions: functionDescriptions, formulaMode: formulaMode, dropdownStyles: dropdownStyles, functionToken: functionToken, parameterIndex: parameterIndex, items: items, highlightedIndex: highlightedIndex, onSelect: onSelect, onChangeHighlightedIndex: onChangeHighlightedIndex, showFormulaHelp: showFormulaHelp, onHideFormulaHelp: onHideFormulaHelp })))),
1138
+ showDropdownEffective && showMentionDropdownEffective && (React.createElement(ConditionalWrapper, { condition: stickyEditor, wrapper: function (children) { return React.createElement(Portal, { asChild: true }, children); } },
1139
+ React.createElement(Popper.Content, { side: "bottom", align: "start", className: "z-50", sideOffset: 2 },
1140
+ React.createElement(MentionsDropdown, { mentions: mentions, onSelect: handleInsertMention, highlightedIndex: mentionHighlightedIndex, isFetchingMentions: isFetchingMentions, MentionDropdownItemComponent: MentionDropdownItemComponent }))))));
1141
+ }));
1142
+ export var ProseMirrorEditor = withErrorBoundary(ProseMirrorEditorThatMayError, {
1143
+ FallbackComponent: ErrorFallback,
1144
+ });
1145
+ ProseMirrorEditor.displayName = "ProseMirrorEditor";