@liveblocks/react-ui 3.9.1-tiptap1 → 3.9.2-tiptap1

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 (449) hide show
  1. package/dist/components/AiChat.cjs +133 -113
  2. package/dist/components/AiChat.cjs.map +1 -1
  3. package/dist/components/AiChat.js +133 -113
  4. package/dist/components/AiChat.js.map +1 -1
  5. package/dist/components/AiTool.cjs +120 -93
  6. package/dist/components/AiTool.cjs.map +1 -1
  7. package/dist/components/AiTool.js +120 -93
  8. package/dist/components/AiTool.js.map +1 -1
  9. package/dist/components/Comment.cjs +374 -374
  10. package/dist/components/Comment.cjs.map +1 -1
  11. package/dist/components/Comment.js +374 -374
  12. package/dist/components/Comment.js.map +1 -1
  13. package/dist/components/Composer.cjs +208 -259
  14. package/dist/components/Composer.cjs.map +1 -1
  15. package/dist/components/Composer.js +208 -259
  16. package/dist/components/Composer.js.map +1 -1
  17. package/dist/components/HistoryVersionSummary.cjs +28 -25
  18. package/dist/components/HistoryVersionSummary.cjs.map +1 -1
  19. package/dist/components/HistoryVersionSummary.js +28 -25
  20. package/dist/components/HistoryVersionSummary.js.map +1 -1
  21. package/dist/components/HistoryVersionSummaryList.cjs +9 -9
  22. package/dist/components/HistoryVersionSummaryList.cjs.map +1 -1
  23. package/dist/components/HistoryVersionSummaryList.js +9 -9
  24. package/dist/components/HistoryVersionSummaryList.js.map +1 -1
  25. package/dist/components/InboxNotification.cjs +264 -239
  26. package/dist/components/InboxNotification.cjs.map +1 -1
  27. package/dist/components/InboxNotification.js +264 -239
  28. package/dist/components/InboxNotification.js.map +1 -1
  29. package/dist/components/InboxNotificationList.cjs +19 -19
  30. package/dist/components/InboxNotificationList.cjs.map +1 -1
  31. package/dist/components/InboxNotificationList.js +19 -19
  32. package/dist/components/InboxNotificationList.js.map +1 -1
  33. package/dist/components/Thread.cjs +102 -82
  34. package/dist/components/Thread.cjs.map +1 -1
  35. package/dist/components/Thread.js +102 -82
  36. package/dist/components/Thread.js.map +1 -1
  37. package/dist/components/internal/AiChatAssistantMessage.cjs +164 -210
  38. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  39. package/dist/components/internal/AiChatAssistantMessage.js +164 -210
  40. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  41. package/dist/components/internal/AiChatUserMessage.cjs +29 -26
  42. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  43. package/dist/components/internal/AiChatUserMessage.js +29 -26
  44. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  45. package/dist/components/internal/AiComposer.cjs +37 -53
  46. package/dist/components/internal/AiComposer.cjs.map +1 -1
  47. package/dist/components/internal/AiComposer.js +37 -53
  48. package/dist/components/internal/AiComposer.js.map +1 -1
  49. package/dist/components/internal/Attachment.cjs +170 -181
  50. package/dist/components/internal/Attachment.cjs.map +1 -1
  51. package/dist/components/internal/Attachment.js +170 -181
  52. package/dist/components/internal/Attachment.js.map +1 -1
  53. package/dist/components/internal/Attribution.cjs +27 -18
  54. package/dist/components/internal/Attribution.cjs.map +1 -1
  55. package/dist/components/internal/Attribution.js +27 -18
  56. package/dist/components/internal/Attribution.js.map +1 -1
  57. package/dist/components/internal/Avatar.cjs +30 -32
  58. package/dist/components/internal/Avatar.cjs.map +1 -1
  59. package/dist/components/internal/Avatar.js +30 -32
  60. package/dist/components/internal/Avatar.js.map +1 -1
  61. package/dist/components/internal/Button.cjs +34 -47
  62. package/dist/components/internal/Button.cjs.map +1 -1
  63. package/dist/components/internal/Button.js +34 -47
  64. package/dist/components/internal/Button.js.map +1 -1
  65. package/dist/components/internal/CodeBlock.cjs +15 -34
  66. package/dist/components/internal/CodeBlock.cjs.map +1 -1
  67. package/dist/components/internal/CodeBlock.js +15 -34
  68. package/dist/components/internal/CodeBlock.js.map +1 -1
  69. package/dist/components/internal/Dropdown.cjs +37 -37
  70. package/dist/components/internal/Dropdown.cjs.map +1 -1
  71. package/dist/components/internal/Dropdown.js +37 -37
  72. package/dist/components/internal/Dropdown.js.map +1 -1
  73. package/dist/components/internal/Emoji.cjs +16 -13
  74. package/dist/components/internal/Emoji.cjs.map +1 -1
  75. package/dist/components/internal/Emoji.js +16 -13
  76. package/dist/components/internal/Emoji.js.map +1 -1
  77. package/dist/components/internal/EmojiPicker.cjs +61 -102
  78. package/dist/components/internal/EmojiPicker.cjs.map +1 -1
  79. package/dist/components/internal/EmojiPicker.js +61 -102
  80. package/dist/components/internal/EmojiPicker.js.map +1 -1
  81. package/dist/components/internal/Favicon.cjs +1 -10
  82. package/dist/components/internal/Favicon.cjs.map +1 -1
  83. package/dist/components/internal/Favicon.js +1 -10
  84. package/dist/components/internal/Favicon.js.map +1 -1
  85. package/dist/components/internal/Group.cjs +12 -9
  86. package/dist/components/internal/Group.cjs.map +1 -1
  87. package/dist/components/internal/Group.js +12 -9
  88. package/dist/components/internal/Group.js.map +1 -1
  89. package/dist/components/internal/GroupDescription.cjs +1 -5
  90. package/dist/components/internal/GroupDescription.cjs.map +1 -1
  91. package/dist/components/internal/GroupDescription.js +1 -5
  92. package/dist/components/internal/GroupDescription.js.map +1 -1
  93. package/dist/components/internal/Icon.cjs +18 -15
  94. package/dist/components/internal/Icon.cjs.map +1 -1
  95. package/dist/components/internal/Icon.js +18 -15
  96. package/dist/components/internal/Icon.js.map +1 -1
  97. package/dist/components/internal/InboxNotificationThread.cjs +38 -50
  98. package/dist/components/internal/InboxNotificationThread.cjs.map +1 -1
  99. package/dist/components/internal/InboxNotificationThread.js +38 -50
  100. package/dist/components/internal/InboxNotificationThread.js.map +1 -1
  101. package/dist/components/internal/List.cjs +9 -6
  102. package/dist/components/internal/List.cjs.map +1 -1
  103. package/dist/components/internal/List.js +9 -6
  104. package/dist/components/internal/List.js.map +1 -1
  105. package/dist/components/internal/Prose.cjs +7 -14
  106. package/dist/components/internal/Prose.cjs.map +1 -1
  107. package/dist/components/internal/Prose.js +7 -14
  108. package/dist/components/internal/Prose.js.map +1 -1
  109. package/dist/components/internal/Room.cjs +9 -6
  110. package/dist/components/internal/Room.cjs.map +1 -1
  111. package/dist/components/internal/Room.js +9 -6
  112. package/dist/components/internal/Room.js.map +1 -1
  113. package/dist/components/internal/Tooltip.cjs +43 -56
  114. package/dist/components/internal/Tooltip.cjs.map +1 -1
  115. package/dist/components/internal/Tooltip.js +43 -56
  116. package/dist/components/internal/Tooltip.js.map +1 -1
  117. package/dist/components/internal/User.cjs +12 -9
  118. package/dist/components/internal/User.cjs.map +1 -1
  119. package/dist/components/internal/User.js +12 -9
  120. package/dist/components/internal/User.js.map +1 -1
  121. package/dist/components.cjs +1 -4
  122. package/dist/components.cjs.map +1 -1
  123. package/dist/components.js +1 -4
  124. package/dist/components.js.map +1 -1
  125. package/dist/config.cjs +1 -10
  126. package/dist/config.cjs.map +1 -1
  127. package/dist/config.js +1 -10
  128. package/dist/config.js.map +1 -1
  129. package/dist/icons/ArrowCornerDownRight.cjs +1 -6
  130. package/dist/icons/ArrowCornerDownRight.cjs.map +1 -1
  131. package/dist/icons/ArrowCornerDownRight.js +1 -6
  132. package/dist/icons/ArrowCornerDownRight.js.map +1 -1
  133. package/dist/icons/ArrowCornerUpRight.cjs +1 -6
  134. package/dist/icons/ArrowCornerUpRight.cjs.map +1 -1
  135. package/dist/icons/ArrowCornerUpRight.js +1 -6
  136. package/dist/icons/ArrowCornerUpRight.js.map +1 -1
  137. package/dist/icons/ArrowDown.cjs +1 -6
  138. package/dist/icons/ArrowDown.cjs.map +1 -1
  139. package/dist/icons/ArrowDown.js +1 -6
  140. package/dist/icons/ArrowDown.js.map +1 -1
  141. package/dist/icons/ArrowUp.cjs +1 -6
  142. package/dist/icons/ArrowUp.cjs.map +1 -1
  143. package/dist/icons/ArrowUp.js +1 -6
  144. package/dist/icons/ArrowUp.js.map +1 -1
  145. package/dist/icons/Attachment.cjs +1 -6
  146. package/dist/icons/Attachment.cjs.map +1 -1
  147. package/dist/icons/Attachment.js +1 -6
  148. package/dist/icons/Attachment.js.map +1 -1
  149. package/dist/icons/Bell.cjs +1 -6
  150. package/dist/icons/Bell.cjs.map +1 -1
  151. package/dist/icons/Bell.js +1 -6
  152. package/dist/icons/Bell.js.map +1 -1
  153. package/dist/icons/BellCrossed.cjs +1 -6
  154. package/dist/icons/BellCrossed.cjs.map +1 -1
  155. package/dist/icons/BellCrossed.js +1 -6
  156. package/dist/icons/BellCrossed.js.map +1 -1
  157. package/dist/icons/Blockquote.cjs +1 -6
  158. package/dist/icons/Blockquote.cjs.map +1 -1
  159. package/dist/icons/Blockquote.js +1 -6
  160. package/dist/icons/Blockquote.js.map +1 -1
  161. package/dist/icons/Bold.cjs +1 -6
  162. package/dist/icons/Bold.cjs.map +1 -1
  163. package/dist/icons/Bold.js +1 -6
  164. package/dist/icons/Bold.js.map +1 -1
  165. package/dist/icons/Check.cjs +1 -6
  166. package/dist/icons/Check.cjs.map +1 -1
  167. package/dist/icons/Check.js +1 -6
  168. package/dist/icons/Check.js.map +1 -1
  169. package/dist/icons/CheckCircle.cjs +4 -13
  170. package/dist/icons/CheckCircle.cjs.map +1 -1
  171. package/dist/icons/CheckCircle.js +4 -13
  172. package/dist/icons/CheckCircle.js.map +1 -1
  173. package/dist/icons/CheckCircleFill.cjs +4 -15
  174. package/dist/icons/CheckCircleFill.cjs.map +1 -1
  175. package/dist/icons/CheckCircleFill.js +4 -15
  176. package/dist/icons/CheckCircleFill.js.map +1 -1
  177. package/dist/icons/ChevronDown.cjs +1 -6
  178. package/dist/icons/ChevronDown.cjs.map +1 -1
  179. package/dist/icons/ChevronDown.js +1 -6
  180. package/dist/icons/ChevronDown.js.map +1 -1
  181. package/dist/icons/ChevronLeft.cjs +1 -6
  182. package/dist/icons/ChevronLeft.cjs.map +1 -1
  183. package/dist/icons/ChevronLeft.js +1 -6
  184. package/dist/icons/ChevronLeft.js.map +1 -1
  185. package/dist/icons/ChevronRight.cjs +1 -6
  186. package/dist/icons/ChevronRight.cjs.map +1 -1
  187. package/dist/icons/ChevronRight.js +1 -6
  188. package/dist/icons/ChevronRight.js.map +1 -1
  189. package/dist/icons/ChevronUp.cjs +1 -6
  190. package/dist/icons/ChevronUp.cjs.map +1 -1
  191. package/dist/icons/ChevronUp.js +1 -6
  192. package/dist/icons/ChevronUp.js.map +1 -1
  193. package/dist/icons/Code.cjs +1 -6
  194. package/dist/icons/Code.cjs.map +1 -1
  195. package/dist/icons/Code.js +1 -6
  196. package/dist/icons/Code.js.map +1 -1
  197. package/dist/icons/Comment.cjs +1 -6
  198. package/dist/icons/Comment.cjs.map +1 -1
  199. package/dist/icons/Comment.js +1 -6
  200. package/dist/icons/Comment.js.map +1 -1
  201. package/dist/icons/Copy.cjs +4 -15
  202. package/dist/icons/Copy.cjs.map +1 -1
  203. package/dist/icons/Copy.js +4 -15
  204. package/dist/icons/Copy.js.map +1 -1
  205. package/dist/icons/Cross.cjs +4 -11
  206. package/dist/icons/Cross.cjs.map +1 -1
  207. package/dist/icons/Cross.js +4 -11
  208. package/dist/icons/Cross.js.map +1 -1
  209. package/dist/icons/CrossCircleFill.cjs +4 -15
  210. package/dist/icons/CrossCircleFill.cjs.map +1 -1
  211. package/dist/icons/CrossCircleFill.js +4 -15
  212. package/dist/icons/CrossCircleFill.js.map +1 -1
  213. package/dist/icons/Delete.cjs +1 -6
  214. package/dist/icons/Delete.cjs.map +1 -1
  215. package/dist/icons/Delete.js +1 -6
  216. package/dist/icons/Delete.js.map +1 -1
  217. package/dist/icons/Edit.cjs +1 -6
  218. package/dist/icons/Edit.cjs.map +1 -1
  219. package/dist/icons/Edit.js +1 -6
  220. package/dist/icons/Edit.js.map +1 -1
  221. package/dist/icons/Ellipsis.cjs +5 -21
  222. package/dist/icons/Ellipsis.cjs.map +1 -1
  223. package/dist/icons/Ellipsis.js +5 -21
  224. package/dist/icons/Ellipsis.js.map +1 -1
  225. package/dist/icons/Emoji.cjs +7 -24
  226. package/dist/icons/Emoji.cjs.map +1 -1
  227. package/dist/icons/Emoji.js +7 -24
  228. package/dist/icons/Emoji.js.map +1 -1
  229. package/dist/icons/EmojiPlus.cjs +8 -27
  230. package/dist/icons/EmojiPlus.cjs.map +1 -1
  231. package/dist/icons/EmojiPlus.js +8 -27
  232. package/dist/icons/EmojiPlus.js.map +1 -1
  233. package/dist/icons/Globe.cjs +4 -13
  234. package/dist/icons/Globe.cjs.map +1 -1
  235. package/dist/icons/Globe.js +4 -13
  236. package/dist/icons/Globe.js.map +1 -1
  237. package/dist/icons/H1.cjs +1 -6
  238. package/dist/icons/H1.cjs.map +1 -1
  239. package/dist/icons/H1.js +1 -6
  240. package/dist/icons/H1.js.map +1 -1
  241. package/dist/icons/H2.cjs +1 -6
  242. package/dist/icons/H2.cjs.map +1 -1
  243. package/dist/icons/H2.js +1 -6
  244. package/dist/icons/H2.js.map +1 -1
  245. package/dist/icons/H3.cjs +1 -6
  246. package/dist/icons/H3.cjs.map +1 -1
  247. package/dist/icons/H3.js +1 -6
  248. package/dist/icons/H3.js.map +1 -1
  249. package/dist/icons/Italic.cjs +1 -6
  250. package/dist/icons/Italic.cjs.map +1 -1
  251. package/dist/icons/Italic.js +1 -6
  252. package/dist/icons/Italic.js.map +1 -1
  253. package/dist/icons/Lengthen.cjs +1 -6
  254. package/dist/icons/Lengthen.cjs.map +1 -1
  255. package/dist/icons/Lengthen.js +1 -6
  256. package/dist/icons/Lengthen.js.map +1 -1
  257. package/dist/icons/ListOrdered.cjs +1 -6
  258. package/dist/icons/ListOrdered.cjs.map +1 -1
  259. package/dist/icons/ListOrdered.js +1 -6
  260. package/dist/icons/ListOrdered.js.map +1 -1
  261. package/dist/icons/ListUnordered.cjs +8 -29
  262. package/dist/icons/ListUnordered.cjs.map +1 -1
  263. package/dist/icons/ListUnordered.js +8 -29
  264. package/dist/icons/ListUnordered.js.map +1 -1
  265. package/dist/icons/Mention.cjs +4 -11
  266. package/dist/icons/Mention.cjs.map +1 -1
  267. package/dist/icons/Mention.js +4 -11
  268. package/dist/icons/Mention.js.map +1 -1
  269. package/dist/icons/MinusCircle.cjs +4 -13
  270. package/dist/icons/MinusCircle.cjs.map +1 -1
  271. package/dist/icons/MinusCircle.js +4 -13
  272. package/dist/icons/MinusCircle.js.map +1 -1
  273. package/dist/icons/QuestionMark.cjs +5 -16
  274. package/dist/icons/QuestionMark.cjs.map +1 -1
  275. package/dist/icons/QuestionMark.js +5 -16
  276. package/dist/icons/QuestionMark.js.map +1 -1
  277. package/dist/icons/Redo.cjs +4 -11
  278. package/dist/icons/Redo.cjs.map +1 -1
  279. package/dist/icons/Redo.js +4 -11
  280. package/dist/icons/Redo.js.map +1 -1
  281. package/dist/icons/Restore.cjs +4 -11
  282. package/dist/icons/Restore.cjs.map +1 -1
  283. package/dist/icons/Restore.js +4 -11
  284. package/dist/icons/Restore.js.map +1 -1
  285. package/dist/icons/Retry.cjs +4 -11
  286. package/dist/icons/Retry.cjs.map +1 -1
  287. package/dist/icons/Retry.js +4 -11
  288. package/dist/icons/Retry.js.map +1 -1
  289. package/dist/icons/Search.cjs +1 -6
  290. package/dist/icons/Search.cjs.map +1 -1
  291. package/dist/icons/Search.js +1 -6
  292. package/dist/icons/Search.js.map +1 -1
  293. package/dist/icons/Send.cjs +1 -6
  294. package/dist/icons/Send.cjs.map +1 -1
  295. package/dist/icons/Send.js +1 -6
  296. package/dist/icons/Send.js.map +1 -1
  297. package/dist/icons/Shorten.cjs +1 -6
  298. package/dist/icons/Shorten.cjs.map +1 -1
  299. package/dist/icons/Shorten.js +1 -6
  300. package/dist/icons/Shorten.js.map +1 -1
  301. package/dist/icons/Sparkles.cjs +1 -6
  302. package/dist/icons/Sparkles.cjs.map +1 -1
  303. package/dist/icons/Sparkles.js +1 -6
  304. package/dist/icons/Sparkles.js.map +1 -1
  305. package/dist/icons/SparklesText.cjs +4 -11
  306. package/dist/icons/SparklesText.cjs.map +1 -1
  307. package/dist/icons/SparklesText.js +4 -11
  308. package/dist/icons/SparklesText.js.map +1 -1
  309. package/dist/icons/Spinner.cjs +1 -7
  310. package/dist/icons/Spinner.cjs.map +1 -1
  311. package/dist/icons/Spinner.js +1 -7
  312. package/dist/icons/Spinner.js.map +1 -1
  313. package/dist/icons/Stop.cjs +1 -11
  314. package/dist/icons/Stop.cjs.map +1 -1
  315. package/dist/icons/Stop.js +1 -11
  316. package/dist/icons/Stop.js.map +1 -1
  317. package/dist/icons/Strikethrough.cjs +1 -6
  318. package/dist/icons/Strikethrough.cjs.map +1 -1
  319. package/dist/icons/Strikethrough.js +1 -6
  320. package/dist/icons/Strikethrough.js.map +1 -1
  321. package/dist/icons/Text.cjs +1 -6
  322. package/dist/icons/Text.cjs.map +1 -1
  323. package/dist/icons/Text.js +1 -6
  324. package/dist/icons/Text.js.map +1 -1
  325. package/dist/icons/Translate.cjs +4 -11
  326. package/dist/icons/Translate.cjs.map +1 -1
  327. package/dist/icons/Translate.js +4 -11
  328. package/dist/icons/Translate.js.map +1 -1
  329. package/dist/icons/Underline.cjs +1 -6
  330. package/dist/icons/Underline.cjs.map +1 -1
  331. package/dist/icons/Underline.js +1 -6
  332. package/dist/icons/Underline.js.map +1 -1
  333. package/dist/icons/Undo.cjs +4 -11
  334. package/dist/icons/Undo.cjs.map +1 -1
  335. package/dist/icons/Undo.js +4 -11
  336. package/dist/icons/Undo.js.map +1 -1
  337. package/dist/icons/User.cjs +1 -6
  338. package/dist/icons/User.cjs.map +1 -1
  339. package/dist/icons/User.js +1 -6
  340. package/dist/icons/User.js.map +1 -1
  341. package/dist/icons/Users.cjs +1 -6
  342. package/dist/icons/Users.cjs.map +1 -1
  343. package/dist/icons/Users.js +1 -6
  344. package/dist/icons/Users.js.map +1 -1
  345. package/dist/icons/Warning.cjs +4 -13
  346. package/dist/icons/Warning.cjs.map +1 -1
  347. package/dist/icons/Warning.js +4 -13
  348. package/dist/icons/Warning.js.map +1 -1
  349. package/dist/overrides.cjs +102 -150
  350. package/dist/overrides.cjs.map +1 -1
  351. package/dist/overrides.js +102 -150
  352. package/dist/overrides.js.map +1 -1
  353. package/dist/primitives/AiComposer/index.cjs +77 -65
  354. package/dist/primitives/AiComposer/index.cjs.map +1 -1
  355. package/dist/primitives/AiComposer/index.js +77 -65
  356. package/dist/primitives/AiComposer/index.js.map +1 -1
  357. package/dist/primitives/AiMessage/index.cjs +28 -49
  358. package/dist/primitives/AiMessage/index.cjs.map +1 -1
  359. package/dist/primitives/AiMessage/index.js +28 -49
  360. package/dist/primitives/AiMessage/index.js.map +1 -1
  361. package/dist/primitives/AiMessage/tool-invocation.cjs +5 -5
  362. package/dist/primitives/AiMessage/tool-invocation.cjs.map +1 -1
  363. package/dist/primitives/AiMessage/tool-invocation.js +5 -5
  364. package/dist/primitives/AiMessage/tool-invocation.js.map +1 -1
  365. package/dist/primitives/Collapsible/index.cjs +46 -34
  366. package/dist/primitives/Collapsible/index.cjs.map +1 -1
  367. package/dist/primitives/Collapsible/index.js +46 -34
  368. package/dist/primitives/Collapsible/index.js.map +1 -1
  369. package/dist/primitives/Comment/index.cjs +41 -64
  370. package/dist/primitives/Comment/index.cjs.map +1 -1
  371. package/dist/primitives/Comment/index.js +41 -64
  372. package/dist/primitives/Comment/index.js.map +1 -1
  373. package/dist/primitives/Composer/contexts.cjs.map +1 -1
  374. package/dist/primitives/Composer/contexts.js.map +1 -1
  375. package/dist/primitives/Composer/index.cjs +324 -312
  376. package/dist/primitives/Composer/index.cjs.map +1 -1
  377. package/dist/primitives/Composer/index.js +324 -312
  378. package/dist/primitives/Composer/index.js.map +1 -1
  379. package/dist/primitives/Composer/slate/plugins/auto-links.cjs.map +1 -1
  380. package/dist/primitives/Composer/slate/plugins/auto-links.js.map +1 -1
  381. package/dist/primitives/Composer/slate/plugins/custom-links.cjs.map +1 -1
  382. package/dist/primitives/Composer/slate/plugins/custom-links.js.map +1 -1
  383. package/dist/primitives/Composer/slate/plugins/mentions.cjs +1 -0
  384. package/dist/primitives/Composer/slate/plugins/mentions.cjs.map +1 -1
  385. package/dist/primitives/Composer/slate/plugins/mentions.js +1 -0
  386. package/dist/primitives/Composer/slate/plugins/mentions.js.map +1 -1
  387. package/dist/primitives/Composer/slate/plugins/paste.cjs +1 -0
  388. package/dist/primitives/Composer/slate/plugins/paste.cjs.map +1 -1
  389. package/dist/primitives/Composer/slate/plugins/paste.js +1 -0
  390. package/dist/primitives/Composer/slate/plugins/paste.js.map +1 -1
  391. package/dist/primitives/Composer/utils.cjs +3 -0
  392. package/dist/primitives/Composer/utils.cjs.map +1 -1
  393. package/dist/primitives/Composer/utils.js +3 -0
  394. package/dist/primitives/Composer/utils.js.map +1 -1
  395. package/dist/primitives/Duration.cjs +11 -7
  396. package/dist/primitives/Duration.cjs.map +1 -1
  397. package/dist/primitives/Duration.js +11 -7
  398. package/dist/primitives/Duration.js.map +1 -1
  399. package/dist/primitives/FileSize.cjs +2 -5
  400. package/dist/primitives/FileSize.cjs.map +1 -1
  401. package/dist/primitives/FileSize.js +2 -5
  402. package/dist/primitives/FileSize.js.map +1 -1
  403. package/dist/primitives/Markdown.cjs +80 -188
  404. package/dist/primitives/Markdown.cjs.map +1 -1
  405. package/dist/primitives/Markdown.js +80 -188
  406. package/dist/primitives/Markdown.js.map +1 -1
  407. package/dist/primitives/Timestamp.cjs +12 -7
  408. package/dist/primitives/Timestamp.cjs.map +1 -1
  409. package/dist/primitives/Timestamp.js +12 -7
  410. package/dist/primitives/Timestamp.js.map +1 -1
  411. package/dist/primitives/slate/utils/get-dom-range.cjs.map +1 -1
  412. package/dist/primitives/slate/utils/get-dom-range.js.map +1 -1
  413. package/dist/primitives/slate/utils/get-match-range.cjs.map +1 -1
  414. package/dist/primitives/slate/utils/get-match-range.js.map +1 -1
  415. package/dist/primitives/slate/utils/is-empty.cjs.map +1 -1
  416. package/dist/primitives/slate/utils/is-empty.js.map +1 -1
  417. package/dist/primitives/slate/utils/marks.cjs.map +1 -1
  418. package/dist/primitives/slate/utils/marks.js.map +1 -1
  419. package/dist/shared.cjs.map +1 -1
  420. package/dist/shared.js.map +1 -1
  421. package/dist/utils/ErrorBoundary.cjs +1 -6
  422. package/dist/utils/ErrorBoundary.cjs.map +1 -1
  423. package/dist/utils/ErrorBoundary.js +1 -6
  424. package/dist/utils/ErrorBoundary.js.map +1 -1
  425. package/dist/utils/Persist.cjs +1 -4
  426. package/dist/utils/Persist.cjs.map +1 -1
  427. package/dist/utils/Persist.js +1 -4
  428. package/dist/utils/Persist.js.map +1 -1
  429. package/dist/utils/Portal.cjs +1 -5
  430. package/dist/utils/Portal.cjs.map +1 -1
  431. package/dist/utils/Portal.js +1 -5
  432. package/dist/utils/Portal.js.map +1 -1
  433. package/dist/utils/format-file-size.cjs.map +1 -1
  434. package/dist/utils/format-file-size.js.map +1 -1
  435. package/dist/utils/is-key.cjs.map +1 -1
  436. package/dist/utils/is-key.js.map +1 -1
  437. package/dist/utils/pluralize.cjs.map +1 -1
  438. package/dist/utils/pluralize.js.map +1 -1
  439. package/dist/utils/use-controllable-state.cjs.map +1 -1
  440. package/dist/utils/use-controllable-state.js.map +1 -1
  441. package/dist/utils/use-rerender.cjs +3 -0
  442. package/dist/utils/use-rerender.cjs.map +1 -1
  443. package/dist/utils/use-rerender.js +3 -0
  444. package/dist/utils/use-rerender.js.map +1 -1
  445. package/dist/utils/use-visible.cjs.map +1 -1
  446. package/dist/utils/use-visible.js.map +1 -1
  447. package/dist/version.cjs +1 -1
  448. package/dist/version.js +1 -1
  449. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"marks.js","sources":["../../../../src/primitives/slate/utils/marks.ts"],"sourcesContent":["import type { Text } from \"slate\";\nimport { Editor as SlateEditor, Range as SlateRange } from \"slate\";\n\nimport type { ComposerBodyMarks } from \"../../../types\";\nimport { getCharacterAfter, getCharacterBefore } from \"./get-character\";\n\nconst defaultComposerBodyMarks: Required<ComposerBodyMarks> = {\n bold: false,\n italic: false,\n strikethrough: false,\n code: false,\n};\n\nexport function getComposerBodyMarks(editor?: SlateEditor) {\n if (!editor) {\n return { ...defaultComposerBodyMarks };\n }\n\n const marks = SlateEditor.marks(editor);\n\n return { ...defaultComposerBodyMarks, ...marks };\n}\n\nexport function isMarkActive<M = ComposerBodyMarks>(\n editor: SlateEditor,\n mark: keyof M\n) {\n const marks = SlateEditor.marks(editor) as M | null;\n\n return marks ? marks[mark] === true : false;\n}\n\nexport function filterActiveMarks(\n value: Text | ComposerBodyMarks | null | undefined\n) {\n return Object.keys(value ?? {}).filter(\n (key) => key !== \"text\"\n ) as (keyof ComposerBodyMarks)[];\n}\n\nexport function toggleMark(editor: SlateEditor, mark: keyof ComposerBodyMarks) {\n const isActive = isMarkActive(editor, mark);\n\n if (isActive) {\n SlateEditor.removeMark(editor, mark);\n } else {\n SlateEditor.addMark(editor, mark, true);\n }\n}\n\nexport function removeMarks(editor: SlateEditor) {\n const marks = SlateEditor.marks(editor);\n\n if (marks) {\n for (const mark in marks) {\n SlateEditor.removeMark(editor, mark);\n }\n }\n}\n\nexport function leaveMarkEdge(editor: SlateEditor, edge: \"start\" | \"end\") {\n if (editor.selection && SlateRange.isCollapsed(editor.selection)) {\n const marks = Object.keys(SlateEditor.marks(editor) ?? {});\n\n if (marks.length > 0) {\n const sibling =\n edge === \"start\"\n ? getCharacterBefore(editor, editor.selection)\n : getCharacterAfter(editor, editor.selection);\n\n if (!sibling) {\n removeMarks(editor);\n }\n }\n }\n}\n"],"names":["SlateEditor","SlateRange"],"mappings":";;;AAMA,MAAM,wBAAwD,GAAA;AAAA,EAC5D,IAAM,EAAA,KAAA;AAAA,EACN,MAAQ,EAAA,KAAA;AAAA,EACR,aAAe,EAAA,KAAA;AAAA,EACf,IAAM,EAAA,KAAA;AACR,CAAA,CAAA;AAEO,SAAS,qBAAqB,MAAsB,EAAA;AACzD,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,EAAE,GAAG,wBAAyB,EAAA,CAAA;AAAA,GACvC;AAEA,EAAM,MAAA,KAAA,GAAQA,MAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAA,OAAO,EAAE,GAAG,wBAA0B,EAAA,GAAG,KAAM,EAAA,CAAA;AACjD,CAAA;AAEgB,SAAA,YAAA,CACd,QACA,IACA,EAAA;AACA,EAAM,MAAA,KAAA,GAAQA,MAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAO,OAAA,KAAA,GAAQ,KAAM,CAAA,IAAA,CAAA,KAAU,IAAO,GAAA,KAAA,CAAA;AACxC,CAAA;AAEO,SAAS,kBACd,KACA,EAAA;AACA,EAAA,OAAO,MAAO,CAAA,IAAA,CAAK,KAAS,IAAA,EAAE,CAAE,CAAA,MAAA;AAAA,IAC9B,CAAC,QAAQ,GAAQ,KAAA,MAAA;AAAA,GACnB,CAAA;AACF,CAAA;AAEgB,SAAA,UAAA,CAAW,QAAqB,IAA+B,EAAA;AAC7E,EAAM,MAAA,QAAA,GAAW,YAAa,CAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AAE1C,EAAA,IAAI,QAAU,EAAA;AACZ,IAAYA,MAAA,CAAA,UAAA,CAAW,QAAQ,IAAI,CAAA,CAAA;AAAA,GAC9B,MAAA;AACL,IAAYA,MAAA,CAAA,OAAA,CAAQ,MAAQ,EAAA,IAAA,EAAM,IAAI,CAAA,CAAA;AAAA,GACxC;AACF,CAAA;AAEO,SAAS,YAAY,MAAqB,EAAA;AAC/C,EAAM,MAAA,KAAA,GAAQA,MAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,MAAYA,MAAA,CAAA,UAAA,CAAW,QAAQ,IAAI,CAAA,CAAA;AAAA,KACrC;AAAA,GACF;AACF,CAAA;AAEgB,SAAA,aAAA,CAAc,QAAqB,IAAuB,EAAA;AACxE,EAAA,IAAI,OAAO,SAAa,IAAAC,KAAA,CAAW,WAAY,CAAA,MAAA,CAAO,SAAS,CAAG,EAAA;AAChE,IAAM,MAAA,KAAA,GAAQ,OAAO,IAAK,CAAAD,MAAA,CAAY,MAAM,MAAM,CAAA,IAAK,EAAE,CAAA,CAAA;AAEzD,IAAI,IAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACpB,MAAM,MAAA,OAAA,GACJ,IAAS,KAAA,OAAA,GACL,kBAAmB,CAAA,MAAA,EAAQ,MAAO,CAAA,SAAS,CAC3C,GAAA,iBAAA,CAAkB,MAAQ,EAAA,MAAA,CAAO,SAAS,CAAA,CAAA;AAEhD,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAA,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,OACpB;AAAA,KACF;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"marks.js","sources":["../../../../src/primitives/slate/utils/marks.ts"],"sourcesContent":["import type { Text } from \"slate\";\nimport { Editor as SlateEditor, Range as SlateRange } from \"slate\";\n\nimport type { ComposerBodyMarks } from \"../../../types\";\nimport { getCharacterAfter, getCharacterBefore } from \"./get-character\";\n\nconst defaultComposerBodyMarks: Required<ComposerBodyMarks> = {\n bold: false,\n italic: false,\n strikethrough: false,\n code: false,\n};\n\nexport function getComposerBodyMarks(editor?: SlateEditor) {\n if (!editor) {\n return { ...defaultComposerBodyMarks };\n }\n\n const marks = SlateEditor.marks(editor);\n\n return { ...defaultComposerBodyMarks, ...marks };\n}\n\nexport function isMarkActive<M = ComposerBodyMarks>(\n editor: SlateEditor,\n mark: keyof M\n) {\n const marks = SlateEditor.marks(editor) as M | null;\n\n return marks ? marks[mark] === true : false;\n}\n\nexport function filterActiveMarks(\n value: Text | ComposerBodyMarks | null | undefined\n) {\n return Object.keys(value ?? {}).filter(\n (key) => key !== \"text\"\n ) as (keyof ComposerBodyMarks)[];\n}\n\nexport function toggleMark(editor: SlateEditor, mark: keyof ComposerBodyMarks) {\n const isActive = isMarkActive(editor, mark);\n\n if (isActive) {\n SlateEditor.removeMark(editor, mark);\n } else {\n SlateEditor.addMark(editor, mark, true);\n }\n}\n\nexport function removeMarks(editor: SlateEditor) {\n const marks = SlateEditor.marks(editor);\n\n if (marks) {\n for (const mark in marks) {\n SlateEditor.removeMark(editor, mark);\n }\n }\n}\n\nexport function leaveMarkEdge(editor: SlateEditor, edge: \"start\" | \"end\") {\n if (editor.selection && SlateRange.isCollapsed(editor.selection)) {\n const marks = Object.keys(SlateEditor.marks(editor) ?? {});\n\n if (marks.length > 0) {\n const sibling =\n edge === \"start\"\n ? getCharacterBefore(editor, editor.selection)\n : getCharacterAfter(editor, editor.selection);\n\n if (!sibling) {\n removeMarks(editor);\n }\n }\n }\n}\n"],"names":["SlateEditor","SlateRange"],"mappings":";;;AAMA,MAAM,wBAAwD,GAAA;AAAA,EAC5D,IAAM,EAAA,KAAA;AAAA,EACN,MAAQ,EAAA,KAAA;AAAA,EACR,aAAe,EAAA,KAAA;AAAA,EACf,IAAM,EAAA,KAAA;AACR,CAAA,CAAA;AAEO,SAAS,qBAAqB,MAAsB,EAAA;AACzD,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,EAAE,GAAG,wBAAyB,EAAA,CAAA;AAAA,GACvC;AAEA,EAAM,MAAA,KAAA,GAAQA,MAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAA,OAAO,EAAE,GAAG,wBAA0B,EAAA,GAAG,KAAM,EAAA,CAAA;AACjD,CAAA;AAEgB,SAAA,YAAA,CACd,QACA,IACA,EAAA;AACA,EAAM,MAAA,KAAA,GAAQA,MAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAA,OAAO,KAAQ,GAAA,KAAA,CAAM,IAAI,CAAA,KAAM,IAAO,GAAA,KAAA,CAAA;AACxC,CAAA;AAEO,SAAS,kBACd,KACA,EAAA;AACA,EAAA,OAAO,MAAO,CAAA,IAAA,CAAK,KAAS,IAAA,EAAE,CAAE,CAAA,MAAA;AAAA,IAC9B,CAAC,QAAQ,GAAQ,KAAA,MAAA;AAAA,GACnB,CAAA;AACF,CAAA;AAEgB,SAAA,UAAA,CAAW,QAAqB,IAA+B,EAAA;AAC7E,EAAM,MAAA,QAAA,GAAW,YAAa,CAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AAE1C,EAAA,IAAI,QAAU,EAAA;AACZ,IAAYA,MAAA,CAAA,UAAA,CAAW,QAAQ,IAAI,CAAA,CAAA;AAAA,GAC9B,MAAA;AACL,IAAYA,MAAA,CAAA,OAAA,CAAQ,MAAQ,EAAA,IAAA,EAAM,IAAI,CAAA,CAAA;AAAA,GACxC;AACF,CAAA;AAEO,SAAS,YAAY,MAAqB,EAAA;AAC/C,EAAM,MAAA,KAAA,GAAQA,MAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,MAAYA,MAAA,CAAA,UAAA,CAAW,QAAQ,IAAI,CAAA,CAAA;AAAA,KACrC;AAAA,GACF;AACF,CAAA;AAEgB,SAAA,aAAA,CAAc,QAAqB,IAAuB,EAAA;AACxE,EAAA,IAAI,OAAO,SAAa,IAAAC,KAAA,CAAW,WAAY,CAAA,MAAA,CAAO,SAAS,CAAG,EAAA;AAChE,IAAM,MAAA,KAAA,GAAQ,OAAO,IAAK,CAAAD,MAAA,CAAY,MAAM,MAAM,CAAA,IAAK,EAAE,CAAA,CAAA;AAEzD,IAAI,IAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACpB,MAAM,MAAA,OAAA,GACJ,IAAS,KAAA,OAAA,GACL,kBAAmB,CAAA,MAAA,EAAQ,MAAO,CAAA,SAAS,CAC3C,GAAA,iBAAA,CAAkB,MAAQ,EAAA,MAAA,CAAO,SAAS,CAAA,CAAA;AAEhD,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAA,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,OACpB;AAAA,KACF;AAAA,GACF;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"shared.cjs","sources":["../src/shared.ts"],"sourcesContent":["import { kInternal } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useSignal } from \"@liveblocks/react/_private\";\n\nexport function useCurrentUserId(): string | null {\n const client = useClient();\n return useSignal(client[kInternal].currentUserId) ?? null;\n}\n"],"names":["useClient","useSignal","kInternal"],"mappings":";;;;;;AAIO,SAAS,gBAAkC,GAAA;AAChD,EAAA,MAAM,SAASA,eAAU,EAAA,CAAA;AACzB,EAAA,OAAOC,kBAAU,CAAA,MAAA,CAAOC,cAAW,CAAA,CAAA,aAAa,CAAK,IAAA,IAAA,CAAA;AACvD;;;;"}
1
+ {"version":3,"file":"shared.cjs","sources":["../src/shared.ts"],"sourcesContent":["import { kInternal } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useSignal } from \"@liveblocks/react/_private\";\n\nexport function useCurrentUserId(): string | null {\n const client = useClient();\n return useSignal(client[kInternal].currentUserId) ?? null;\n}\n"],"names":["useClient","useSignal","kInternal"],"mappings":";;;;;;AAIO,SAAS,gBAAkC,GAAA;AAChD,EAAA,MAAM,SAASA,eAAU,EAAA,CAAA;AACzB,EAAA,OAAOC,kBAAU,CAAA,MAAA,CAAOC,cAAS,CAAA,CAAE,aAAa,CAAK,IAAA,IAAA,CAAA;AACvD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sources":["../src/shared.ts"],"sourcesContent":["import { kInternal } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useSignal } from \"@liveblocks/react/_private\";\n\nexport function useCurrentUserId(): string | null {\n const client = useClient();\n return useSignal(client[kInternal].currentUserId) ?? null;\n}\n"],"names":[],"mappings":";;;;AAIO,SAAS,gBAAkC,GAAA;AAChD,EAAA,MAAM,SAAS,SAAU,EAAA,CAAA;AACzB,EAAA,OAAO,SAAU,CAAA,MAAA,CAAO,SAAW,CAAA,CAAA,aAAa,CAAK,IAAA,IAAA,CAAA;AACvD;;;;"}
1
+ {"version":3,"file":"shared.js","sources":["../src/shared.ts"],"sourcesContent":["import { kInternal } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useSignal } from \"@liveblocks/react/_private\";\n\nexport function useCurrentUserId(): string | null {\n const client = useClient();\n return useSignal(client[kInternal].currentUserId) ?? null;\n}\n"],"names":[],"mappings":";;;;AAIO,SAAS,gBAAkC,GAAA;AAChD,EAAA,MAAM,SAAS,SAAU,EAAA,CAAA;AACzB,EAAA,OAAO,SAAU,CAAA,MAAA,CAAO,SAAS,CAAA,CAAE,aAAa,CAAK,IAAA,IAAA,CAAA;AACvD;;;;"}
@@ -25,12 +25,7 @@ class ErrorBoundary extends react.Component {
25
25
  const reset = this.reset.bind(this);
26
26
  const fallback = this.props.fallback;
27
27
  const Fallback = typeof fallback === "function" ? fallback : () => fallback ?? null;
28
- return /* @__PURE__ */ jsxRuntime.jsx(ErrorBoundaryContext.Provider, {
29
- value: { error, reset },
30
- children: /* @__PURE__ */ jsxRuntime.jsx(Fallback, {
31
- error: this.state.error
32
- })
33
- });
28
+ return /* @__PURE__ */ jsxRuntime.jsx(ErrorBoundaryContext.Provider, { value: { error, reset }, children: /* @__PURE__ */ jsxRuntime.jsx(Fallback, { error: this.state.error }) });
34
29
  }
35
30
  }
36
31
  function useErrorBoundary() {
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.cjs","sources":["../../src/utils/ErrorBoundary.tsx"],"sourcesContent":["import type { ComponentType, ErrorInfo, ReactNode } from \"react\";\nimport { Component, createContext, useContext } from \"react\";\n\nconst ErrorBoundaryContext = createContext<{\n error: Error;\n reset: () => void;\n} | null>(null);\n\nexport interface ErrorBoundaryProps {\n children?: ReactNode;\n fallback?: ReactNode | ComponentType<{ error: Error }>;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error(error, errorInfo);\n }\n\n reset() {\n this.setState({ error: null });\n }\n\n render(): React.ReactNode {\n if (this.state.error === null) return this.props.children;\n\n const error = this.state.error;\n const reset = this.reset.bind(this);\n const fallback = this.props.fallback;\n const Fallback =\n typeof fallback === \"function\" ? fallback : () => fallback ?? null;\n return (\n <ErrorBoundaryContext.Provider value={{ error, reset }}>\n <Fallback error={this.state.error} />\n </ErrorBoundaryContext.Provider>\n );\n }\n}\n\nexport function useErrorBoundary(): {\n error: Error;\n reset: () => void;\n} {\n const context = useContext(ErrorBoundaryContext);\n\n if (context === null) {\n throw new Error(\n \"useErrorBoundary must be used within an ErrorBoundary component\"\n );\n }\n\n return context;\n}\n"],"names":["createContext","Component","jsx","useContext"],"mappings":";;;;;AAGA,MAAM,oBAAA,GAAuBA,oBAGnB,IAAI,CAAA,CAAA;AAWP,MAAM,sBAAsBC,eAGjC,CAAA;AAAA,EACA,YAAY,KAA2B,EAAA;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACX,IAAK,IAAA,CAAA,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAK,EAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,OAAO,yBAAyB,KAAc,EAAA;AAC5C,IAAA,OAAO,EAAE,KAAM,EAAA,CAAA;AAAA,GACjB;AAAA,EAEA,iBAAA,CAAkB,OAAc,SAA4B,EAAA;AAC1D,IAAQ,OAAA,CAAA,KAAA,CAAM,OAAO,SAAS,CAAA,CAAA;AAAA,GAChC;AAAA,EAEA,KAAQ,GAAA;AACN,IAAA,IAAA,CAAK,QAAS,CAAA,EAAE,KAAO,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,GAC/B;AAAA,EAEA,MAA0B,GAAA;AACxB,IAAI,IAAA,IAAA,CAAK,MAAM,KAAU,KAAA,IAAA;AAAM,MAAA,OAAO,KAAK,KAAM,CAAA,QAAA,CAAA;AAEjD,IAAM,MAAA,KAAA,GAAQ,KAAK,KAAM,CAAA,KAAA,CAAA;AACzB,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAClC,IAAM,MAAA,QAAA,GAAW,KAAK,KAAM,CAAA,QAAA,CAAA;AAC5B,IAAA,MAAM,WACJ,OAAO,QAAA,KAAa,UAAa,GAAA,QAAA,GAAW,MAAM,QAAY,IAAA,IAAA,CAAA;AAChE,IACE,uBAAAC,cAAA,CAAC,qBAAqB,QAArB,EAAA;AAAA,MAA8B,KAAA,EAAO,EAAE,KAAA,EAAO,KAAM,EAAA;AAAA,MACnD,QAAC,kBAAAA,cAAA,CAAA,QAAA,EAAA;AAAA,QAAS,KAAA,EAAO,KAAK,KAAM,CAAA,KAAA;AAAA,OAAO,CAAA;AAAA,KACrC,CAAA,CAAA;AAAA,GAEJ;AACF,CAAA;AAEO,SAAS,gBAGd,GAAA;AACA,EAAM,MAAA,OAAA,GAAUC,iBAAW,oBAAoB,CAAA,CAAA;AAE/C,EAAA,IAAI,YAAY,IAAM,EAAA;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,iEAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAO,OAAA,OAAA,CAAA;AACT;;;;;"}
1
+ {"version":3,"file":"ErrorBoundary.cjs","sources":["../../src/utils/ErrorBoundary.tsx"],"sourcesContent":["import type { ComponentType, ErrorInfo, ReactNode } from \"react\";\nimport { Component, createContext, useContext } from \"react\";\n\nconst ErrorBoundaryContext = createContext<{\n error: Error;\n reset: () => void;\n} | null>(null);\n\nexport interface ErrorBoundaryProps {\n children?: ReactNode;\n fallback?: ReactNode | ComponentType<{ error: Error }>;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error(error, errorInfo);\n }\n\n reset() {\n this.setState({ error: null });\n }\n\n render(): React.ReactNode {\n if (this.state.error === null) return this.props.children;\n\n const error = this.state.error;\n const reset = this.reset.bind(this);\n const fallback = this.props.fallback;\n const Fallback =\n typeof fallback === \"function\" ? fallback : () => fallback ?? null;\n return (\n <ErrorBoundaryContext.Provider value={{ error, reset }}>\n <Fallback error={this.state.error} />\n </ErrorBoundaryContext.Provider>\n );\n }\n}\n\nexport function useErrorBoundary(): {\n error: Error;\n reset: () => void;\n} {\n const context = useContext(ErrorBoundaryContext);\n\n if (context === null) {\n throw new Error(\n \"useErrorBoundary must be used within an ErrorBoundary component\"\n );\n }\n\n return context;\n}\n"],"names":["createContext","Component","jsx","useContext"],"mappings":";;;;;AAGA,MAAM,oBAAA,GAAuBA,oBAGnB,IAAI,CAAA,CAAA;AAWP,MAAM,sBAAsBC,eAGjC,CAAA;AAAA,EACA,YAAY,KAA2B,EAAA;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACX,IAAK,IAAA,CAAA,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAK,EAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,OAAO,yBAAyB,KAAc,EAAA;AAC5C,IAAA,OAAO,EAAE,KAAM,EAAA,CAAA;AAAA,GACjB;AAAA,EAEA,iBAAA,CAAkB,OAAc,SAA4B,EAAA;AAC1D,IAAQ,OAAA,CAAA,KAAA,CAAM,OAAO,SAAS,CAAA,CAAA;AAAA,GAChC;AAAA,EAEA,KAAQ,GAAA;AACN,IAAA,IAAA,CAAK,QAAS,CAAA,EAAE,KAAO,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,GAC/B;AAAA,EAEA,MAA0B,GAAA;AACxB,IAAI,IAAA,IAAA,CAAK,MAAM,KAAU,KAAA,IAAA;AAAM,MAAA,OAAO,KAAK,KAAM,CAAA,QAAA,CAAA;AAEjD,IAAM,MAAA,KAAA,GAAQ,KAAK,KAAM,CAAA,KAAA,CAAA;AACzB,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAClC,IAAM,MAAA,QAAA,GAAW,KAAK,KAAM,CAAA,QAAA,CAAA;AAC5B,IAAA,MAAM,WACJ,OAAO,QAAA,KAAa,UAAa,GAAA,QAAA,GAAW,MAAM,QAAY,IAAA,IAAA,CAAA;AAChE,IAAA,uBACGC,cAAA,CAAA,oBAAA,CAAqB,QAArB,EAAA,EAA8B,OAAO,EAAE,KAAA,EAAO,KAAM,EAAA,EACnD,yCAAC,QAAS,EAAA,EAAA,KAAA,EAAO,IAAK,CAAA,KAAA,CAAM,OAAO,CACrC,EAAA,CAAA,CAAA;AAAA,GAEJ;AACF,CAAA;AAEO,SAAS,gBAGd,GAAA;AACA,EAAM,MAAA,OAAA,GAAUC,iBAAW,oBAAoB,CAAA,CAAA;AAE/C,EAAA,IAAI,YAAY,IAAM,EAAA;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,iEAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAO,OAAA,OAAA,CAAA;AACT;;;;;"}
@@ -23,12 +23,7 @@ class ErrorBoundary extends Component {
23
23
  const reset = this.reset.bind(this);
24
24
  const fallback = this.props.fallback;
25
25
  const Fallback = typeof fallback === "function" ? fallback : () => fallback ?? null;
26
- return /* @__PURE__ */ jsx(ErrorBoundaryContext.Provider, {
27
- value: { error, reset },
28
- children: /* @__PURE__ */ jsx(Fallback, {
29
- error: this.state.error
30
- })
31
- });
26
+ return /* @__PURE__ */ jsx(ErrorBoundaryContext.Provider, { value: { error, reset }, children: /* @__PURE__ */ jsx(Fallback, { error: this.state.error }) });
32
27
  }
33
28
  }
34
29
  function useErrorBoundary() {
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.js","sources":["../../src/utils/ErrorBoundary.tsx"],"sourcesContent":["import type { ComponentType, ErrorInfo, ReactNode } from \"react\";\nimport { Component, createContext, useContext } from \"react\";\n\nconst ErrorBoundaryContext = createContext<{\n error: Error;\n reset: () => void;\n} | null>(null);\n\nexport interface ErrorBoundaryProps {\n children?: ReactNode;\n fallback?: ReactNode | ComponentType<{ error: Error }>;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error(error, errorInfo);\n }\n\n reset() {\n this.setState({ error: null });\n }\n\n render(): React.ReactNode {\n if (this.state.error === null) return this.props.children;\n\n const error = this.state.error;\n const reset = this.reset.bind(this);\n const fallback = this.props.fallback;\n const Fallback =\n typeof fallback === \"function\" ? fallback : () => fallback ?? null;\n return (\n <ErrorBoundaryContext.Provider value={{ error, reset }}>\n <Fallback error={this.state.error} />\n </ErrorBoundaryContext.Provider>\n );\n }\n}\n\nexport function useErrorBoundary(): {\n error: Error;\n reset: () => void;\n} {\n const context = useContext(ErrorBoundaryContext);\n\n if (context === null) {\n throw new Error(\n \"useErrorBoundary must be used within an ErrorBoundary component\"\n );\n }\n\n return context;\n}\n"],"names":[],"mappings":";;;AAGA,MAAM,oBAAA,GAAuB,cAGnB,IAAI,CAAA,CAAA;AAWP,MAAM,sBAAsB,SAGjC,CAAA;AAAA,EACA,YAAY,KAA2B,EAAA;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACX,IAAK,IAAA,CAAA,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAK,EAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,OAAO,yBAAyB,KAAc,EAAA;AAC5C,IAAA,OAAO,EAAE,KAAM,EAAA,CAAA;AAAA,GACjB;AAAA,EAEA,iBAAA,CAAkB,OAAc,SAA4B,EAAA;AAC1D,IAAQ,OAAA,CAAA,KAAA,CAAM,OAAO,SAAS,CAAA,CAAA;AAAA,GAChC;AAAA,EAEA,KAAQ,GAAA;AACN,IAAA,IAAA,CAAK,QAAS,CAAA,EAAE,KAAO,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,GAC/B;AAAA,EAEA,MAA0B,GAAA;AACxB,IAAI,IAAA,IAAA,CAAK,MAAM,KAAU,KAAA,IAAA;AAAM,MAAA,OAAO,KAAK,KAAM,CAAA,QAAA,CAAA;AAEjD,IAAM,MAAA,KAAA,GAAQ,KAAK,KAAM,CAAA,KAAA,CAAA;AACzB,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAClC,IAAM,MAAA,QAAA,GAAW,KAAK,KAAM,CAAA,QAAA,CAAA;AAC5B,IAAA,MAAM,WACJ,OAAO,QAAA,KAAa,UAAa,GAAA,QAAA,GAAW,MAAM,QAAY,IAAA,IAAA,CAAA;AAChE,IACE,uBAAA,GAAA,CAAC,qBAAqB,QAArB,EAAA;AAAA,MAA8B,KAAA,EAAO,EAAE,KAAA,EAAO,KAAM,EAAA;AAAA,MACnD,QAAC,kBAAA,GAAA,CAAA,QAAA,EAAA;AAAA,QAAS,KAAA,EAAO,KAAK,KAAM,CAAA,KAAA;AAAA,OAAO,CAAA;AAAA,KACrC,CAAA,CAAA;AAAA,GAEJ;AACF,CAAA;AAEO,SAAS,gBAGd,GAAA;AACA,EAAM,MAAA,OAAA,GAAU,WAAW,oBAAoB,CAAA,CAAA;AAE/C,EAAA,IAAI,YAAY,IAAM,EAAA;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,iEAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAO,OAAA,OAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"ErrorBoundary.js","sources":["../../src/utils/ErrorBoundary.tsx"],"sourcesContent":["import type { ComponentType, ErrorInfo, ReactNode } from \"react\";\nimport { Component, createContext, useContext } from \"react\";\n\nconst ErrorBoundaryContext = createContext<{\n error: Error;\n reset: () => void;\n} | null>(null);\n\nexport interface ErrorBoundaryProps {\n children?: ReactNode;\n fallback?: ReactNode | ComponentType<{ error: Error }>;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error(error, errorInfo);\n }\n\n reset() {\n this.setState({ error: null });\n }\n\n render(): React.ReactNode {\n if (this.state.error === null) return this.props.children;\n\n const error = this.state.error;\n const reset = this.reset.bind(this);\n const fallback = this.props.fallback;\n const Fallback =\n typeof fallback === \"function\" ? fallback : () => fallback ?? null;\n return (\n <ErrorBoundaryContext.Provider value={{ error, reset }}>\n <Fallback error={this.state.error} />\n </ErrorBoundaryContext.Provider>\n );\n }\n}\n\nexport function useErrorBoundary(): {\n error: Error;\n reset: () => void;\n} {\n const context = useContext(ErrorBoundaryContext);\n\n if (context === null) {\n throw new Error(\n \"useErrorBoundary must be used within an ErrorBoundary component\"\n );\n }\n\n return context;\n}\n"],"names":[],"mappings":";;;AAGA,MAAM,oBAAA,GAAuB,cAGnB,IAAI,CAAA,CAAA;AAWP,MAAM,sBAAsB,SAGjC,CAAA;AAAA,EACA,YAAY,KAA2B,EAAA;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACX,IAAK,IAAA,CAAA,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAK,EAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,OAAO,yBAAyB,KAAc,EAAA;AAC5C,IAAA,OAAO,EAAE,KAAM,EAAA,CAAA;AAAA,GACjB;AAAA,EAEA,iBAAA,CAAkB,OAAc,SAA4B,EAAA;AAC1D,IAAQ,OAAA,CAAA,KAAA,CAAM,OAAO,SAAS,CAAA,CAAA;AAAA,GAChC;AAAA,EAEA,KAAQ,GAAA;AACN,IAAA,IAAA,CAAK,QAAS,CAAA,EAAE,KAAO,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,GAC/B;AAAA,EAEA,MAA0B,GAAA;AACxB,IAAI,IAAA,IAAA,CAAK,MAAM,KAAU,KAAA,IAAA;AAAM,MAAA,OAAO,KAAK,KAAM,CAAA,QAAA,CAAA;AAEjD,IAAM,MAAA,KAAA,GAAQ,KAAK,KAAM,CAAA,KAAA,CAAA;AACzB,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAClC,IAAM,MAAA,QAAA,GAAW,KAAK,KAAM,CAAA,QAAA,CAAA;AAC5B,IAAA,MAAM,WACJ,OAAO,QAAA,KAAa,UAAa,GAAA,QAAA,GAAW,MAAM,QAAY,IAAA,IAAA,CAAA;AAChE,IAAA,uBACG,GAAA,CAAA,oBAAA,CAAqB,QAArB,EAAA,EAA8B,OAAO,EAAE,KAAA,EAAO,KAAM,EAAA,EACnD,8BAAC,QAAS,EAAA,EAAA,KAAA,EAAO,IAAK,CAAA,KAAA,CAAM,OAAO,CACrC,EAAA,CAAA,CAAA;AAAA,GAEJ;AACF,CAAA;AAEO,SAAS,gBAGd,GAAA;AACA,EAAM,MAAA,OAAA,GAAU,WAAW,oBAAoB,CAAA,CAAA;AAE/C,EAAA,IAAI,YAAY,IAAM,EAAA;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,iEAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAO,OAAA,OAAA,CAAA;AACT;;;;"}
@@ -73,10 +73,7 @@ function Persist({ children }) {
73
73
  lastPresentChild.current = child;
74
74
  }
75
75
  }, [child]);
76
- return /* @__PURE__ */ jsxRuntime.jsx(PersistContext.Provider, {
77
- value: [Boolean(child), unmount],
78
- children: child ?? (isPersisting ? lastPresentChild.current : null)
79
- });
76
+ return /* @__PURE__ */ jsxRuntime.jsx(PersistContext.Provider, { value: [Boolean(child), unmount], children: child ?? (isPersisting ? lastPresentChild.current : null) });
80
77
  }
81
78
  if (process.env.NODE_ENV !== "production") {
82
79
  Persist.displayName = PERSIST_NAME;
@@ -1 +1 @@
1
- {"version":3,"file":"Persist.cjs","sources":["../../src/utils/Persist.tsx"],"sourcesContent":["\"use client\";\n\nimport { nn } from \"@liveblocks/core\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport type { ReactNode, RefObject } from \"react\";\nimport {\n Children,\n createContext,\n isValidElement,\n useCallback,\n useContext,\n useRef,\n useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\n\n// Persist is an overly simplified version of Framer Motion's AnimatePresence,\n// mostly mimicking its usePresence API: https://github.com/framer/motion/blob/main/packages/framer-motion/src/components/AnimatePresence/use-presence.ts\n\nconst PERSIST_NAME = \"Persist\";\n\ninterface PersistProps {\n children: Exclude<ReactNode, Iterable<ReactNode>>;\n}\n\ntype PersistContext = [boolean, () => void];\n\nconst PersistContext = createContext<PersistContext | null>(null);\n\nexport function usePersist() {\n const persistContext = useContext(PersistContext);\n\n return nn(persistContext, \"Persist is missing from the React tree.\");\n}\n\nfunction getChild(children: ReactNode) {\n const child: ReactNode = Array.isArray(children)\n ? Children.only(children)\n : children;\n\n return isValidElement(child) ? child : undefined;\n}\n\nexport function useAnimationPersist(ref: RefObject<HTMLElement>) {\n const [isPresent, unmount] = usePersist();\n const previousAnimationName = useRef<string | null>(null);\n const unmountAnimationName = useRef<string | null>(null);\n\n useLayoutEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n /**\n * Stop persisting at the end of the last animation.\n *\n * We keep track of all ending animations because animations stay\n * on getComputedStyle(element).animationName even if they're over,\n * so we need to keep track of previous animations to truly know if\n * an animation should be waited on.\n */\n const handleAnimationEnd = (event: AnimationEvent) => {\n if (event.animationName === unmountAnimationName.current) {\n unmount();\n }\n\n previousAnimationName.current = event.animationName;\n };\n\n element.addEventListener(\"animationcancel\", handleAnimationEnd);\n element.addEventListener(\"animationend\", handleAnimationEnd);\n\n return () => {\n element.removeEventListener(\"animationcancel\", handleAnimationEnd);\n element.removeEventListener(\"animationend\", handleAnimationEnd);\n };\n }, [ref, unmount]);\n\n useLayoutEffect(() => {\n const element = ref.current;\n let animationFrameId: number;\n\n if (!element) {\n return;\n }\n\n if (!isPresent) {\n // If the element should be unmounting, wait for a repaint and check\n // if it is visible and has an animation. If not, unmount immediately.\n animationFrameId = requestAnimationFrame(() => {\n const styles = getComputedStyle(element);\n unmountAnimationName.current = styles.animationName;\n\n if (\n styles.animationName === \"none\" ||\n styles.animationName === previousAnimationName.current ||\n styles.display === \"none\"\n ) {\n unmount();\n }\n });\n }\n\n return () => {\n cancelAnimationFrame(animationFrameId);\n };\n }, [isPresent, ref, unmount]);\n}\n\n/**\n * Persist a component until it decides to unmount by\n * itself (instead of orchestrating the unmount from the parent).\n */\nexport function Persist({ children }: PersistProps) {\n const [isPersisting, setPersisting] = useState(true);\n const lastPresentChild = useRef<ReactNode>(null);\n const child = getChild(children);\n\n const unmount = useCallback(() => {\n flushSync(() => setPersisting(false));\n }, []);\n\n useLayoutEffect(() => {\n if (child) {\n setPersisting(true);\n lastPresentChild.current = child;\n }\n }, [child]);\n\n return (\n <PersistContext.Provider value={[Boolean(child), unmount]}>\n {child ?? (isPersisting ? lastPresentChild.current : null)}\n </PersistContext.Provider>\n );\n}\n\nif (process.env.NODE_ENV !== \"production\") {\n Persist.displayName = PERSIST_NAME;\n}\n"],"names":[],"mappings":";;;;;;;;;;AAmBA;AAQA;AAEO;AACL;AAEA;AACF;AAEA;AACE;AAIA;AACF;AAEO;AACL;AACA;AACA;AAEA;AACE;AAEA;AACE;AAAA;AAWF;AACE;AACE;AAAQ;AAGV;AAAsC;AAGxC;AACA;AAEA;AACE;AACA;AAA8D;AAChE;AAGF;AACE;AACA;AAEA;AACE;AAAA;AAGF;AAGE;AACE;AACA;AAEA;AAKE;AAAQ;AACV;AACD;AAGH;AACE;AAAqC;AACvC;AAEJ;AAMgB;AACd;AACA;AACA;AAEA;AACE;AAAoC;AAGtC;AACE;AACE;AACA;AAA2B;AAC7B;AAGF;AACG;AAAuD;AACD;AAG3D;AAEA;AACE;AACF;;;;"}
1
+ {"version":3,"file":"Persist.cjs","sources":["../../src/utils/Persist.tsx"],"sourcesContent":["\"use client\";\n\nimport { nn } from \"@liveblocks/core\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport type { ReactNode, RefObject } from \"react\";\nimport {\n Children,\n createContext,\n isValidElement,\n useCallback,\n useContext,\n useRef,\n useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\n\n// Persist is an overly simplified version of Framer Motion's AnimatePresence,\n// mostly mimicking its usePresence API: https://github.com/framer/motion/blob/main/packages/framer-motion/src/components/AnimatePresence/use-presence.ts\n\nconst PERSIST_NAME = \"Persist\";\n\ninterface PersistProps {\n children: Exclude<ReactNode, Iterable<ReactNode>>;\n}\n\ntype PersistContext = [boolean, () => void];\n\nconst PersistContext = createContext<PersistContext | null>(null);\n\nexport function usePersist() {\n const persistContext = useContext(PersistContext);\n\n return nn(persistContext, \"Persist is missing from the React tree.\");\n}\n\nfunction getChild(children: ReactNode) {\n const child: ReactNode = Array.isArray(children)\n ? Children.only(children)\n : children;\n\n return isValidElement(child) ? child : undefined;\n}\n\nexport function useAnimationPersist(ref: RefObject<HTMLElement>) {\n const [isPresent, unmount] = usePersist();\n const previousAnimationName = useRef<string | null>(null);\n const unmountAnimationName = useRef<string | null>(null);\n\n useLayoutEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n /**\n * Stop persisting at the end of the last animation.\n *\n * We keep track of all ending animations because animations stay\n * on getComputedStyle(element).animationName even if they're over,\n * so we need to keep track of previous animations to truly know if\n * an animation should be waited on.\n */\n const handleAnimationEnd = (event: AnimationEvent) => {\n if (event.animationName === unmountAnimationName.current) {\n unmount();\n }\n\n previousAnimationName.current = event.animationName;\n };\n\n element.addEventListener(\"animationcancel\", handleAnimationEnd);\n element.addEventListener(\"animationend\", handleAnimationEnd);\n\n return () => {\n element.removeEventListener(\"animationcancel\", handleAnimationEnd);\n element.removeEventListener(\"animationend\", handleAnimationEnd);\n };\n }, [ref, unmount]);\n\n useLayoutEffect(() => {\n const element = ref.current;\n let animationFrameId: number;\n\n if (!element) {\n return;\n }\n\n if (!isPresent) {\n // If the element should be unmounting, wait for a repaint and check\n // if it is visible and has an animation. If not, unmount immediately.\n animationFrameId = requestAnimationFrame(() => {\n const styles = getComputedStyle(element);\n unmountAnimationName.current = styles.animationName;\n\n if (\n styles.animationName === \"none\" ||\n styles.animationName === previousAnimationName.current ||\n styles.display === \"none\"\n ) {\n unmount();\n }\n });\n }\n\n return () => {\n cancelAnimationFrame(animationFrameId);\n };\n }, [isPresent, ref, unmount]);\n}\n\n/**\n * Persist a component until it decides to unmount by\n * itself (instead of orchestrating the unmount from the parent).\n */\nexport function Persist({ children }: PersistProps) {\n const [isPersisting, setPersisting] = useState(true);\n const lastPresentChild = useRef<ReactNode>(null);\n const child = getChild(children);\n\n const unmount = useCallback(() => {\n flushSync(() => setPersisting(false));\n }, []);\n\n useLayoutEffect(() => {\n if (child) {\n setPersisting(true);\n lastPresentChild.current = child;\n }\n }, [child]);\n\n return (\n <PersistContext.Provider value={[Boolean(child), unmount]}>\n {child ?? (isPersisting ? lastPresentChild.current : null)}\n </PersistContext.Provider>\n );\n}\n\nif (process.env.NODE_ENV !== \"production\") {\n Persist.displayName = PERSIST_NAME;\n}\n"],"names":[],"mappings":";;;;;;;;;;AAmBA;AAQA;AAEO;AACL;AAEA;AACF;AAEA;AACE;AAIA;AACF;AAEO;AACL;AACA;AACA;AAEA;AACE;AAEA;AACE;AAAA;AAWF;AACE;AACE;AAAQ;AAGV;AAAsC;AAGxC;AACA;AAEA;AACE;AACA;AAA8D;AAChE;AAGF;AACE;AACA;AAEA;AACE;AAAA;AAGF;AAGE;AACE;AACA;AAEA;AAKE;AAAQ;AACV;AACD;AAGH;AACE;AAAqC;AACvC;AAEJ;AAMgB;AACd;AACA;AACA;AAEA;AACE;AAAoC;AAGtC;AACE;AACE;AACA;AAA2B;AAC7B;AAGF;AAKF;AAEA;AACE;AACF;;;;"}
@@ -71,10 +71,7 @@ function Persist({ children }) {
71
71
  lastPresentChild.current = child;
72
72
  }
73
73
  }, [child]);
74
- return /* @__PURE__ */ jsx(PersistContext.Provider, {
75
- value: [Boolean(child), unmount],
76
- children: child ?? (isPersisting ? lastPresentChild.current : null)
77
- });
74
+ return /* @__PURE__ */ jsx(PersistContext.Provider, { value: [Boolean(child), unmount], children: child ?? (isPersisting ? lastPresentChild.current : null) });
78
75
  }
79
76
  if (process.env.NODE_ENV !== "production") {
80
77
  Persist.displayName = PERSIST_NAME;
@@ -1 +1 @@
1
- {"version":3,"file":"Persist.js","sources":["../../src/utils/Persist.tsx"],"sourcesContent":["\"use client\";\n\nimport { nn } from \"@liveblocks/core\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport type { ReactNode, RefObject } from \"react\";\nimport {\n Children,\n createContext,\n isValidElement,\n useCallback,\n useContext,\n useRef,\n useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\n\n// Persist is an overly simplified version of Framer Motion's AnimatePresence,\n// mostly mimicking its usePresence API: https://github.com/framer/motion/blob/main/packages/framer-motion/src/components/AnimatePresence/use-presence.ts\n\nconst PERSIST_NAME = \"Persist\";\n\ninterface PersistProps {\n children: Exclude<ReactNode, Iterable<ReactNode>>;\n}\n\ntype PersistContext = [boolean, () => void];\n\nconst PersistContext = createContext<PersistContext | null>(null);\n\nexport function usePersist() {\n const persistContext = useContext(PersistContext);\n\n return nn(persistContext, \"Persist is missing from the React tree.\");\n}\n\nfunction getChild(children: ReactNode) {\n const child: ReactNode = Array.isArray(children)\n ? Children.only(children)\n : children;\n\n return isValidElement(child) ? child : undefined;\n}\n\nexport function useAnimationPersist(ref: RefObject<HTMLElement>) {\n const [isPresent, unmount] = usePersist();\n const previousAnimationName = useRef<string | null>(null);\n const unmountAnimationName = useRef<string | null>(null);\n\n useLayoutEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n /**\n * Stop persisting at the end of the last animation.\n *\n * We keep track of all ending animations because animations stay\n * on getComputedStyle(element).animationName even if they're over,\n * so we need to keep track of previous animations to truly know if\n * an animation should be waited on.\n */\n const handleAnimationEnd = (event: AnimationEvent) => {\n if (event.animationName === unmountAnimationName.current) {\n unmount();\n }\n\n previousAnimationName.current = event.animationName;\n };\n\n element.addEventListener(\"animationcancel\", handleAnimationEnd);\n element.addEventListener(\"animationend\", handleAnimationEnd);\n\n return () => {\n element.removeEventListener(\"animationcancel\", handleAnimationEnd);\n element.removeEventListener(\"animationend\", handleAnimationEnd);\n };\n }, [ref, unmount]);\n\n useLayoutEffect(() => {\n const element = ref.current;\n let animationFrameId: number;\n\n if (!element) {\n return;\n }\n\n if (!isPresent) {\n // If the element should be unmounting, wait for a repaint and check\n // if it is visible and has an animation. If not, unmount immediately.\n animationFrameId = requestAnimationFrame(() => {\n const styles = getComputedStyle(element);\n unmountAnimationName.current = styles.animationName;\n\n if (\n styles.animationName === \"none\" ||\n styles.animationName === previousAnimationName.current ||\n styles.display === \"none\"\n ) {\n unmount();\n }\n });\n }\n\n return () => {\n cancelAnimationFrame(animationFrameId);\n };\n }, [isPresent, ref, unmount]);\n}\n\n/**\n * Persist a component until it decides to unmount by\n * itself (instead of orchestrating the unmount from the parent).\n */\nexport function Persist({ children }: PersistProps) {\n const [isPersisting, setPersisting] = useState(true);\n const lastPresentChild = useRef<ReactNode>(null);\n const child = getChild(children);\n\n const unmount = useCallback(() => {\n flushSync(() => setPersisting(false));\n }, []);\n\n useLayoutEffect(() => {\n if (child) {\n setPersisting(true);\n lastPresentChild.current = child;\n }\n }, [child]);\n\n return (\n <PersistContext.Provider value={[Boolean(child), unmount]}>\n {child ?? (isPersisting ? lastPresentChild.current : null)}\n </PersistContext.Provider>\n );\n}\n\nif (process.env.NODE_ENV !== \"production\") {\n Persist.displayName = PERSIST_NAME;\n}\n"],"names":[],"mappings":";;;;;;;;AAmBA;AAQA;AAEO;AACL;AAEA;AACF;AAEA;AACE;AAIA;AACF;AAEO;AACL;AACA;AACA;AAEA;AACE;AAEA;AACE;AAAA;AAWF;AACE;AACE;AAAQ;AAGV;AAAsC;AAGxC;AACA;AAEA;AACE;AACA;AAA8D;AAChE;AAGF;AACE;AACA;AAEA;AACE;AAAA;AAGF;AAGE;AACE;AACA;AAEA;AAKE;AAAQ;AACV;AACD;AAGH;AACE;AAAqC;AACvC;AAEJ;AAMgB;AACd;AACA;AACA;AAEA;AACE;AAAoC;AAGtC;AACE;AACE;AACA;AAA2B;AAC7B;AAGF;AACG;AAAuD;AACD;AAG3D;AAEA;AACE;AACF;;"}
1
+ {"version":3,"file":"Persist.js","sources":["../../src/utils/Persist.tsx"],"sourcesContent":["\"use client\";\n\nimport { nn } from \"@liveblocks/core\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport type { ReactNode, RefObject } from \"react\";\nimport {\n Children,\n createContext,\n isValidElement,\n useCallback,\n useContext,\n useRef,\n useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\n\n// Persist is an overly simplified version of Framer Motion's AnimatePresence,\n// mostly mimicking its usePresence API: https://github.com/framer/motion/blob/main/packages/framer-motion/src/components/AnimatePresence/use-presence.ts\n\nconst PERSIST_NAME = \"Persist\";\n\ninterface PersistProps {\n children: Exclude<ReactNode, Iterable<ReactNode>>;\n}\n\ntype PersistContext = [boolean, () => void];\n\nconst PersistContext = createContext<PersistContext | null>(null);\n\nexport function usePersist() {\n const persistContext = useContext(PersistContext);\n\n return nn(persistContext, \"Persist is missing from the React tree.\");\n}\n\nfunction getChild(children: ReactNode) {\n const child: ReactNode = Array.isArray(children)\n ? Children.only(children)\n : children;\n\n return isValidElement(child) ? child : undefined;\n}\n\nexport function useAnimationPersist(ref: RefObject<HTMLElement>) {\n const [isPresent, unmount] = usePersist();\n const previousAnimationName = useRef<string | null>(null);\n const unmountAnimationName = useRef<string | null>(null);\n\n useLayoutEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n /**\n * Stop persisting at the end of the last animation.\n *\n * We keep track of all ending animations because animations stay\n * on getComputedStyle(element).animationName even if they're over,\n * so we need to keep track of previous animations to truly know if\n * an animation should be waited on.\n */\n const handleAnimationEnd = (event: AnimationEvent) => {\n if (event.animationName === unmountAnimationName.current) {\n unmount();\n }\n\n previousAnimationName.current = event.animationName;\n };\n\n element.addEventListener(\"animationcancel\", handleAnimationEnd);\n element.addEventListener(\"animationend\", handleAnimationEnd);\n\n return () => {\n element.removeEventListener(\"animationcancel\", handleAnimationEnd);\n element.removeEventListener(\"animationend\", handleAnimationEnd);\n };\n }, [ref, unmount]);\n\n useLayoutEffect(() => {\n const element = ref.current;\n let animationFrameId: number;\n\n if (!element) {\n return;\n }\n\n if (!isPresent) {\n // If the element should be unmounting, wait for a repaint and check\n // if it is visible and has an animation. If not, unmount immediately.\n animationFrameId = requestAnimationFrame(() => {\n const styles = getComputedStyle(element);\n unmountAnimationName.current = styles.animationName;\n\n if (\n styles.animationName === \"none\" ||\n styles.animationName === previousAnimationName.current ||\n styles.display === \"none\"\n ) {\n unmount();\n }\n });\n }\n\n return () => {\n cancelAnimationFrame(animationFrameId);\n };\n }, [isPresent, ref, unmount]);\n}\n\n/**\n * Persist a component until it decides to unmount by\n * itself (instead of orchestrating the unmount from the parent).\n */\nexport function Persist({ children }: PersistProps) {\n const [isPersisting, setPersisting] = useState(true);\n const lastPresentChild = useRef<ReactNode>(null);\n const child = getChild(children);\n\n const unmount = useCallback(() => {\n flushSync(() => setPersisting(false));\n }, []);\n\n useLayoutEffect(() => {\n if (child) {\n setPersisting(true);\n lastPresentChild.current = child;\n }\n }, [child]);\n\n return (\n <PersistContext.Provider value={[Boolean(child), unmount]}>\n {child ?? (isPersisting ? lastPresentChild.current : null)}\n </PersistContext.Provider>\n );\n}\n\nif (process.env.NODE_ENV !== \"production\") {\n Persist.displayName = PERSIST_NAME;\n}\n"],"names":[],"mappings":";;;;;;;;AAmBA;AAQA;AAEO;AACL;AAEA;AACF;AAEA;AACE;AAIA;AACF;AAEO;AACL;AACA;AACA;AAEA;AACE;AAEA;AACE;AAAA;AAWF;AACE;AACE;AAAQ;AAGV;AAAsC;AAGxC;AACA;AAEA;AACE;AACA;AAA8D;AAChE;AAGF;AACE;AACA;AAEA;AACE;AAAA;AAGF;AAGE;AACE;AACA;AAEA;AAKE;AAAQ;AACV;AACD;AAGH;AACE;AAAqC;AACvC;AAEJ;AAMgB;AACd;AACA;AACA;AAEA;AACE;AAAoC;AAGtC;AACE;AACE;AACA;AAA2B;AAC7B;AAGF;AAKF;AAEA;AACE;AACF;;"}
@@ -12,11 +12,7 @@ const Portal = react.forwardRef(
12
12
  ({ container = document?.body, asChild, ...props }, forwardedRef) => {
13
13
  const Component = asChild ? reactSlot.Slot : "div";
14
14
  return container ? reactDom.createPortal(
15
- /* @__PURE__ */ jsxRuntime.jsx(Component, {
16
- "data-liveblocks-portal": "",
17
- ...props,
18
- ref: forwardedRef
19
- }),
15
+ /* @__PURE__ */ jsxRuntime.jsx(Component, { "data-liveblocks-portal": "", ...props, ref: forwardedRef }),
20
16
  container
21
17
  ) : null;
22
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Portal.cjs","sources":["../../src/utils/Portal.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { forwardRef } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\n\nconst PORTAL_NAME = \"Portal\";\n\ninterface PortalProps extends ComponentPropsWithSlot<\"div\"> {\n /**\n * The container to render the portal into.\n */\n container?: HTMLElement | null;\n}\n\nconst Portal = forwardRef<HTMLDivElement, PortalProps>(\n ({ container = document?.body, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"div\";\n\n return container\n ? createPortal(\n <Component data-liveblocks-portal=\"\" {...props} ref={forwardedRef} />,\n container\n )\n : null;\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n Portal.displayName = PORTAL_NAME;\n}\n\nexport { Portal };\n"],"names":[],"mappings":";;;;;;;;;AAQA;AASA;AAAe;AAEX;AAEA;AACI;AACG;AAAiC;AAAO;AAAY;AAAc;AACnE;AAEF;AAER;AAEA;AACE;AACF;;"}
1
+ {"version":3,"file":"Portal.cjs","sources":["../../src/utils/Portal.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { forwardRef } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\n\nconst PORTAL_NAME = \"Portal\";\n\ninterface PortalProps extends ComponentPropsWithSlot<\"div\"> {\n /**\n * The container to render the portal into.\n */\n container?: HTMLElement | null;\n}\n\nconst Portal = forwardRef<HTMLDivElement, PortalProps>(\n ({ container = document?.body, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"div\";\n\n return container\n ? createPortal(\n <Component data-liveblocks-portal=\"\" {...props} ref={forwardedRef} />,\n container\n )\n : null;\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n Portal.displayName = PORTAL_NAME;\n}\n\nexport { Portal };\n"],"names":[],"mappings":";;;;;;;;;AAQA;AASA;AAAe;AAEX;AAEA;AACI;AACqE;AACnE;AAEF;AAER;AAEA;AACE;AACF;;"}
@@ -10,11 +10,7 @@ const Portal = forwardRef(
10
10
  ({ container = document?.body, asChild, ...props }, forwardedRef) => {
11
11
  const Component = asChild ? Slot : "div";
12
12
  return container ? createPortal(
13
- /* @__PURE__ */ jsx(Component, {
14
- "data-liveblocks-portal": "",
15
- ...props,
16
- ref: forwardedRef
17
- }),
13
+ /* @__PURE__ */ jsx(Component, { "data-liveblocks-portal": "", ...props, ref: forwardedRef }),
18
14
  container
19
15
  ) : null;
20
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Portal.js","sources":["../../src/utils/Portal.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { forwardRef } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\n\nconst PORTAL_NAME = \"Portal\";\n\ninterface PortalProps extends ComponentPropsWithSlot<\"div\"> {\n /**\n * The container to render the portal into.\n */\n container?: HTMLElement | null;\n}\n\nconst Portal = forwardRef<HTMLDivElement, PortalProps>(\n ({ container = document?.body, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"div\";\n\n return container\n ? createPortal(\n <Component data-liveblocks-portal=\"\" {...props} ref={forwardedRef} />,\n container\n )\n : null;\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n Portal.displayName = PORTAL_NAME;\n}\n\nexport { Portal };\n"],"names":[],"mappings":";;;;;;;AAQA;AASA;AAAe;AAEX;AAEA;AACI;AACG;AAAiC;AAAO;AAAY;AAAc;AACnE;AAEF;AAER;AAEA;AACE;AACF;;"}
1
+ {"version":3,"file":"Portal.js","sources":["../../src/utils/Portal.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { forwardRef } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\n\nconst PORTAL_NAME = \"Portal\";\n\ninterface PortalProps extends ComponentPropsWithSlot<\"div\"> {\n /**\n * The container to render the portal into.\n */\n container?: HTMLElement | null;\n}\n\nconst Portal = forwardRef<HTMLDivElement, PortalProps>(\n ({ container = document?.body, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"div\";\n\n return container\n ? createPortal(\n <Component data-liveblocks-portal=\"\" {...props} ref={forwardedRef} />,\n container\n )\n : null;\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n Portal.displayName = PORTAL_NAME;\n}\n\nexport { Portal };\n"],"names":[],"mappings":";;;;;;;AAQA;AASA;AAAe;AAEX;AAEA;AACI;AACqE;AACnE;AAEF;AAER;AAEA;AACE;AACF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"format-file-size.cjs","sources":["../../src/utils/format-file-size.ts"],"sourcesContent":["import { numberFormat } from \"./intl\";\n\nconst BASE = 1000;\nconst UNITS = [\"B\", \"KB\", \"MB\", \"GB\"] as const;\n\nexport function formatFileSize(bytes: number, locale?: string) {\n if (bytes === 0) {\n return `0 ${UNITS[1]}`;\n }\n\n let unit: number;\n\n if (bytes === 0) {\n unit = 1;\n } else {\n unit = Math.max(\n 1,\n Math.min(\n Math.floor(Math.log(Math.abs(bytes)) / Math.log(BASE)),\n UNITS.length - 1\n )\n );\n }\n\n let value = bytes / BASE ** unit;\n let maximumDecimals = 1;\n\n if (unit === 1) {\n // Hide decimals for KB values above 10\n if (value >= 10) {\n maximumDecimals = 0;\n }\n\n // Allow 2 decimals instead of 1 for KB values below 0.1\n if (value < 0.1 && value > 0) {\n maximumDecimals = 2;\n }\n\n // Display tiny KB values as 0.01 KB instead of 0 KB\n if (value < 0.01) {\n value = 0.01;\n }\n }\n\n const formattedUnit = UNITS[unit];\n const formattedValue = numberFormat(locale, {\n minimumFractionDigits: 0,\n maximumFractionDigits: maximumDecimals,\n }).format(value);\n\n return `${formattedValue} ${formattedUnit}`;\n}\n"],"names":["numberFormat"],"mappings":";;;;AAEA,MAAM,IAAO,GAAA,GAAA,CAAA;AACb,MAAM,KAAQ,GAAA,CAAC,GAAK,EAAA,IAAA,EAAM,MAAM,IAAI,CAAA,CAAA;AAEpB,SAAA,cAAA,CAAe,OAAe,MAAiB,EAAA;AAC7D,EAAA,IAAI,UAAU,CAAG,EAAA;AACf,IAAA,OAAO,KAAK,KAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GACpB;AAEA,EAAI,IAAA,IAAA,CAAA;AAEJ,EAAA,IAAI,UAAU,CAAG,EAAA;AACf,IAAO,IAAA,GAAA,CAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,IAAA,GAAO,IAAK,CAAA,GAAA;AAAA,MACV,CAAA;AAAA,MACA,IAAK,CAAA,GAAA;AAAA,QACH,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,KAAK,CAAC,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,IAAI,CAAC,CAAA;AAAA,QACrD,MAAM,MAAS,GAAA,CAAA;AAAA,OACjB;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAI,IAAA,KAAA,GAAQ,QAAQ,IAAQ,IAAA,IAAA,CAAA;AAC5B,EAAA,IAAI,eAAkB,GAAA,CAAA,CAAA;AAEtB,EAAA,IAAI,SAAS,CAAG,EAAA;AAEd,IAAA,IAAI,SAAS,EAAI,EAAA;AACf,MAAkB,eAAA,GAAA,CAAA,CAAA;AAAA,KACpB;AAGA,IAAI,IAAA,KAAA,GAAQ,GAAO,IAAA,KAAA,GAAQ,CAAG,EAAA;AAC5B,MAAkB,eAAA,GAAA,CAAA,CAAA;AAAA,KACpB;AAGA,IAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,MAAQ,KAAA,GAAA,IAAA,CAAA;AAAA,KACV;AAAA,GACF;AAEA,EAAA,MAAM,gBAAgB,KAAM,CAAA,IAAA,CAAA,CAAA;AAC5B,EAAM,MAAA,cAAA,GAAiBA,kBAAa,MAAQ,EAAA;AAAA,IAC1C,qBAAuB,EAAA,CAAA;AAAA,IACvB,qBAAuB,EAAA,eAAA;AAAA,GACxB,CAAE,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAEf,EAAA,OAAO,GAAG,cAAkB,CAAA,CAAA,EAAA,aAAA,CAAA,CAAA,CAAA;AAC9B;;;;"}
1
+ {"version":3,"file":"format-file-size.cjs","sources":["../../src/utils/format-file-size.ts"],"sourcesContent":["import { numberFormat } from \"./intl\";\n\nconst BASE = 1000;\nconst UNITS = [\"B\", \"KB\", \"MB\", \"GB\"] as const;\n\nexport function formatFileSize(bytes: number, locale?: string) {\n if (bytes === 0) {\n return `0 ${UNITS[1]}`;\n }\n\n let unit: number;\n\n if (bytes === 0) {\n unit = 1;\n } else {\n unit = Math.max(\n 1,\n Math.min(\n Math.floor(Math.log(Math.abs(bytes)) / Math.log(BASE)),\n UNITS.length - 1\n )\n );\n }\n\n let value = bytes / BASE ** unit;\n let maximumDecimals = 1;\n\n if (unit === 1) {\n // Hide decimals for KB values above 10\n if (value >= 10) {\n maximumDecimals = 0;\n }\n\n // Allow 2 decimals instead of 1 for KB values below 0.1\n if (value < 0.1 && value > 0) {\n maximumDecimals = 2;\n }\n\n // Display tiny KB values as 0.01 KB instead of 0 KB\n if (value < 0.01) {\n value = 0.01;\n }\n }\n\n const formattedUnit = UNITS[unit];\n const formattedValue = numberFormat(locale, {\n minimumFractionDigits: 0,\n maximumFractionDigits: maximumDecimals,\n }).format(value);\n\n return `${formattedValue} ${formattedUnit}`;\n}\n"],"names":["numberFormat"],"mappings":";;;;AAEA,MAAM,IAAO,GAAA,GAAA,CAAA;AACb,MAAM,KAAQ,GAAA,CAAC,GAAK,EAAA,IAAA,EAAM,MAAM,IAAI,CAAA,CAAA;AAEpB,SAAA,cAAA,CAAe,OAAe,MAAiB,EAAA;AAC7D,EAAA,IAAI,UAAU,CAAG,EAAA;AACf,IAAO,OAAA,CAAA,EAAA,EAAK,KAAM,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,GACtB;AAEA,EAAI,IAAA,IAAA,CAAA;AAEJ,EAAA,IAAI,UAAU,CAAG,EAAA;AACf,IAAO,IAAA,GAAA,CAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,IAAA,GAAO,IAAK,CAAA,GAAA;AAAA,MACV,CAAA;AAAA,MACA,IAAK,CAAA,GAAA;AAAA,QACH,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,KAAK,CAAC,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,IAAI,CAAC,CAAA;AAAA,QACrD,MAAM,MAAS,GAAA,CAAA;AAAA,OACjB;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAI,IAAA,KAAA,GAAQ,QAAQ,IAAQ,IAAA,IAAA,CAAA;AAC5B,EAAA,IAAI,eAAkB,GAAA,CAAA,CAAA;AAEtB,EAAA,IAAI,SAAS,CAAG,EAAA;AAEd,IAAA,IAAI,SAAS,EAAI,EAAA;AACf,MAAkB,eAAA,GAAA,CAAA,CAAA;AAAA,KACpB;AAGA,IAAI,IAAA,KAAA,GAAQ,GAAO,IAAA,KAAA,GAAQ,CAAG,EAAA;AAC5B,MAAkB,eAAA,GAAA,CAAA,CAAA;AAAA,KACpB;AAGA,IAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,MAAQ,KAAA,GAAA,IAAA,CAAA;AAAA,KACV;AAAA,GACF;AAEA,EAAM,MAAA,aAAA,GAAgB,MAAM,IAAI,CAAA,CAAA;AAChC,EAAM,MAAA,cAAA,GAAiBA,kBAAa,MAAQ,EAAA;AAAA,IAC1C,qBAAuB,EAAA,CAAA;AAAA,IACvB,qBAAuB,EAAA,eAAA;AAAA,GACxB,CAAE,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAEf,EAAO,OAAA,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,CAAA;AAC3C;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"format-file-size.js","sources":["../../src/utils/format-file-size.ts"],"sourcesContent":["import { numberFormat } from \"./intl\";\n\nconst BASE = 1000;\nconst UNITS = [\"B\", \"KB\", \"MB\", \"GB\"] as const;\n\nexport function formatFileSize(bytes: number, locale?: string) {\n if (bytes === 0) {\n return `0 ${UNITS[1]}`;\n }\n\n let unit: number;\n\n if (bytes === 0) {\n unit = 1;\n } else {\n unit = Math.max(\n 1,\n Math.min(\n Math.floor(Math.log(Math.abs(bytes)) / Math.log(BASE)),\n UNITS.length - 1\n )\n );\n }\n\n let value = bytes / BASE ** unit;\n let maximumDecimals = 1;\n\n if (unit === 1) {\n // Hide decimals for KB values above 10\n if (value >= 10) {\n maximumDecimals = 0;\n }\n\n // Allow 2 decimals instead of 1 for KB values below 0.1\n if (value < 0.1 && value > 0) {\n maximumDecimals = 2;\n }\n\n // Display tiny KB values as 0.01 KB instead of 0 KB\n if (value < 0.01) {\n value = 0.01;\n }\n }\n\n const formattedUnit = UNITS[unit];\n const formattedValue = numberFormat(locale, {\n minimumFractionDigits: 0,\n maximumFractionDigits: maximumDecimals,\n }).format(value);\n\n return `${formattedValue} ${formattedUnit}`;\n}\n"],"names":[],"mappings":";;AAEA,MAAM,IAAO,GAAA,GAAA,CAAA;AACb,MAAM,KAAQ,GAAA,CAAC,GAAK,EAAA,IAAA,EAAM,MAAM,IAAI,CAAA,CAAA;AAEpB,SAAA,cAAA,CAAe,OAAe,MAAiB,EAAA;AAC7D,EAAA,IAAI,UAAU,CAAG,EAAA;AACf,IAAA,OAAO,KAAK,KAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GACpB;AAEA,EAAI,IAAA,IAAA,CAAA;AAEJ,EAAA,IAAI,UAAU,CAAG,EAAA;AACf,IAAO,IAAA,GAAA,CAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,IAAA,GAAO,IAAK,CAAA,GAAA;AAAA,MACV,CAAA;AAAA,MACA,IAAK,CAAA,GAAA;AAAA,QACH,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,KAAK,CAAC,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,IAAI,CAAC,CAAA;AAAA,QACrD,MAAM,MAAS,GAAA,CAAA;AAAA,OACjB;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAI,IAAA,KAAA,GAAQ,QAAQ,IAAQ,IAAA,IAAA,CAAA;AAC5B,EAAA,IAAI,eAAkB,GAAA,CAAA,CAAA;AAEtB,EAAA,IAAI,SAAS,CAAG,EAAA;AAEd,IAAA,IAAI,SAAS,EAAI,EAAA;AACf,MAAkB,eAAA,GAAA,CAAA,CAAA;AAAA,KACpB;AAGA,IAAI,IAAA,KAAA,GAAQ,GAAO,IAAA,KAAA,GAAQ,CAAG,EAAA;AAC5B,MAAkB,eAAA,GAAA,CAAA,CAAA;AAAA,KACpB;AAGA,IAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,MAAQ,KAAA,GAAA,IAAA,CAAA;AAAA,KACV;AAAA,GACF;AAEA,EAAA,MAAM,gBAAgB,KAAM,CAAA,IAAA,CAAA,CAAA;AAC5B,EAAM,MAAA,cAAA,GAAiB,aAAa,MAAQ,EAAA;AAAA,IAC1C,qBAAuB,EAAA,CAAA;AAAA,IACvB,qBAAuB,EAAA,eAAA;AAAA,GACxB,CAAE,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAEf,EAAA,OAAO,GAAG,cAAkB,CAAA,CAAA,EAAA,aAAA,CAAA,CAAA,CAAA;AAC9B;;;;"}
1
+ {"version":3,"file":"format-file-size.js","sources":["../../src/utils/format-file-size.ts"],"sourcesContent":["import { numberFormat } from \"./intl\";\n\nconst BASE = 1000;\nconst UNITS = [\"B\", \"KB\", \"MB\", \"GB\"] as const;\n\nexport function formatFileSize(bytes: number, locale?: string) {\n if (bytes === 0) {\n return `0 ${UNITS[1]}`;\n }\n\n let unit: number;\n\n if (bytes === 0) {\n unit = 1;\n } else {\n unit = Math.max(\n 1,\n Math.min(\n Math.floor(Math.log(Math.abs(bytes)) / Math.log(BASE)),\n UNITS.length - 1\n )\n );\n }\n\n let value = bytes / BASE ** unit;\n let maximumDecimals = 1;\n\n if (unit === 1) {\n // Hide decimals for KB values above 10\n if (value >= 10) {\n maximumDecimals = 0;\n }\n\n // Allow 2 decimals instead of 1 for KB values below 0.1\n if (value < 0.1 && value > 0) {\n maximumDecimals = 2;\n }\n\n // Display tiny KB values as 0.01 KB instead of 0 KB\n if (value < 0.01) {\n value = 0.01;\n }\n }\n\n const formattedUnit = UNITS[unit];\n const formattedValue = numberFormat(locale, {\n minimumFractionDigits: 0,\n maximumFractionDigits: maximumDecimals,\n }).format(value);\n\n return `${formattedValue} ${formattedUnit}`;\n}\n"],"names":[],"mappings":";;AAEA,MAAM,IAAO,GAAA,GAAA,CAAA;AACb,MAAM,KAAQ,GAAA,CAAC,GAAK,EAAA,IAAA,EAAM,MAAM,IAAI,CAAA,CAAA;AAEpB,SAAA,cAAA,CAAe,OAAe,MAAiB,EAAA;AAC7D,EAAA,IAAI,UAAU,CAAG,EAAA;AACf,IAAO,OAAA,CAAA,EAAA,EAAK,KAAM,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,GACtB;AAEA,EAAI,IAAA,IAAA,CAAA;AAEJ,EAAA,IAAI,UAAU,CAAG,EAAA;AACf,IAAO,IAAA,GAAA,CAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,IAAA,GAAO,IAAK,CAAA,GAAA;AAAA,MACV,CAAA;AAAA,MACA,IAAK,CAAA,GAAA;AAAA,QACH,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,KAAK,CAAC,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,IAAI,CAAC,CAAA;AAAA,QACrD,MAAM,MAAS,GAAA,CAAA;AAAA,OACjB;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAI,IAAA,KAAA,GAAQ,QAAQ,IAAQ,IAAA,IAAA,CAAA;AAC5B,EAAA,IAAI,eAAkB,GAAA,CAAA,CAAA;AAEtB,EAAA,IAAI,SAAS,CAAG,EAAA;AAEd,IAAA,IAAI,SAAS,EAAI,EAAA;AACf,MAAkB,eAAA,GAAA,CAAA,CAAA;AAAA,KACpB;AAGA,IAAI,IAAA,KAAA,GAAQ,GAAO,IAAA,KAAA,GAAQ,CAAG,EAAA;AAC5B,MAAkB,eAAA,GAAA,CAAA,CAAA;AAAA,KACpB;AAGA,IAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,MAAQ,KAAA,GAAA,IAAA,CAAA;AAAA,KACV;AAAA,GACF;AAEA,EAAM,MAAA,aAAA,GAAgB,MAAM,IAAI,CAAA,CAAA;AAChC,EAAM,MAAA,cAAA,GAAiB,aAAa,MAAQ,EAAA;AAAA,IAC1C,qBAAuB,EAAA,CAAA;AAAA,IACvB,qBAAuB,EAAA,eAAA;AAAA,GACxB,CAAE,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAEf,EAAO,OAAA,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,CAAA;AAC3C;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"is-key.cjs","sources":["../../src/utils/is-key.ts"],"sourcesContent":["import type { KeyboardEvent as ReactKeyboardEvent } from \"react\";\n\nimport { isApple } from \"./is-apple\";\n\nconst MODIFIERS = {\n alt: () => \"altKey\" as const,\n ctrl: () => \"ctrlKey\" as const,\n meta: () => \"metaKey\" as const,\n mod: () => (isApple() ? (\"metaKey\" as const) : (\"ctrlKey\" as const)),\n shift: () => \"shiftKey\" as const,\n} as const;\n\nexport function isKey(\n event: KeyboardEvent | ReactKeyboardEvent,\n key: string,\n modifiers: Partial<Record<keyof typeof MODIFIERS, boolean>> = {}\n) {\n if (event.key !== key) {\n return false;\n }\n\n const explicitModifiers = Object.entries(modifiers).filter(\n ([, value]) => typeof value === \"boolean\"\n ) as [keyof typeof MODIFIERS, boolean][];\n\n return explicitModifiers.every(([modifier, value]) => {\n const property = MODIFIERS[modifier]();\n\n return event[property] === value;\n });\n}\n"],"names":["isApple"],"mappings":";;;;AAIA,MAAM,SAAY,GAAA;AAAA,EAChB,KAAK,MAAM,QAAA;AAAA,EACX,MAAM,MAAM,SAAA;AAAA,EACZ,MAAM,MAAM,SAAA;AAAA,EACZ,GAAK,EAAA,MAAOA,eAAQ,EAAA,GAAK,SAAuB,GAAA,SAAA;AAAA,EAChD,OAAO,MAAM,UAAA;AACf,CAAA,CAAA;AAEO,SAAS,KACd,CAAA,KAAA,EACA,GACA,EAAA,SAAA,GAA8D,EAC9D,EAAA;AACA,EAAI,IAAA,KAAA,CAAM,QAAQ,GAAK,EAAA;AACrB,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,iBAAoB,GAAA,MAAA,CAAO,OAAQ,CAAA,SAAS,CAAE,CAAA,MAAA;AAAA,IAClD,CAAC,GAAG,KAAK,CAAA,KAAM,OAAO,KAAU,KAAA,SAAA;AAAA,GAClC,CAAA;AAEA,EAAA,OAAO,kBAAkB,KAAM,CAAA,CAAC,CAAC,QAAA,EAAU,KAAK,CAAM,KAAA;AACpD,IAAM,MAAA,QAAA,GAAW,UAAU,QAAU,CAAA,EAAA,CAAA;AAErC,IAAA,OAAO,MAAM,QAAc,CAAA,KAAA,KAAA,CAAA;AAAA,GAC5B,CAAA,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"is-key.cjs","sources":["../../src/utils/is-key.ts"],"sourcesContent":["import type { KeyboardEvent as ReactKeyboardEvent } from \"react\";\n\nimport { isApple } from \"./is-apple\";\n\nconst MODIFIERS = {\n alt: () => \"altKey\" as const,\n ctrl: () => \"ctrlKey\" as const,\n meta: () => \"metaKey\" as const,\n mod: () => (isApple() ? (\"metaKey\" as const) : (\"ctrlKey\" as const)),\n shift: () => \"shiftKey\" as const,\n} as const;\n\nexport function isKey(\n event: KeyboardEvent | ReactKeyboardEvent,\n key: string,\n modifiers: Partial<Record<keyof typeof MODIFIERS, boolean>> = {}\n) {\n if (event.key !== key) {\n return false;\n }\n\n const explicitModifiers = Object.entries(modifiers).filter(\n ([, value]) => typeof value === \"boolean\"\n ) as [keyof typeof MODIFIERS, boolean][];\n\n return explicitModifiers.every(([modifier, value]) => {\n const property = MODIFIERS[modifier]();\n\n return event[property] === value;\n });\n}\n"],"names":["isApple"],"mappings":";;;;AAIA,MAAM,SAAY,GAAA;AAAA,EAChB,KAAK,MAAM,QAAA;AAAA,EACX,MAAM,MAAM,SAAA;AAAA,EACZ,MAAM,MAAM,SAAA;AAAA,EACZ,GAAK,EAAA,MAAOA,eAAQ,EAAA,GAAK,SAAuB,GAAA,SAAA;AAAA,EAChD,OAAO,MAAM,UAAA;AACf,CAAA,CAAA;AAEO,SAAS,KACd,CAAA,KAAA,EACA,GACA,EAAA,SAAA,GAA8D,EAC9D,EAAA;AACA,EAAI,IAAA,KAAA,CAAM,QAAQ,GAAK,EAAA;AACrB,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,iBAAoB,GAAA,MAAA,CAAO,OAAQ,CAAA,SAAS,CAAE,CAAA,MAAA;AAAA,IAClD,CAAC,GAAG,KAAK,CAAA,KAAM,OAAO,KAAU,KAAA,SAAA;AAAA,GAClC,CAAA;AAEA,EAAA,OAAO,kBAAkB,KAAM,CAAA,CAAC,CAAC,QAAA,EAAU,KAAK,CAAM,KAAA;AACpD,IAAM,MAAA,QAAA,GAAW,SAAU,CAAA,QAAQ,CAAE,EAAA,CAAA;AAErC,IAAO,OAAA,KAAA,CAAM,QAAQ,CAAM,KAAA,KAAA,CAAA;AAAA,GAC5B,CAAA,CAAA;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"is-key.js","sources":["../../src/utils/is-key.ts"],"sourcesContent":["import type { KeyboardEvent as ReactKeyboardEvent } from \"react\";\n\nimport { isApple } from \"./is-apple\";\n\nconst MODIFIERS = {\n alt: () => \"altKey\" as const,\n ctrl: () => \"ctrlKey\" as const,\n meta: () => \"metaKey\" as const,\n mod: () => (isApple() ? (\"metaKey\" as const) : (\"ctrlKey\" as const)),\n shift: () => \"shiftKey\" as const,\n} as const;\n\nexport function isKey(\n event: KeyboardEvent | ReactKeyboardEvent,\n key: string,\n modifiers: Partial<Record<keyof typeof MODIFIERS, boolean>> = {}\n) {\n if (event.key !== key) {\n return false;\n }\n\n const explicitModifiers = Object.entries(modifiers).filter(\n ([, value]) => typeof value === \"boolean\"\n ) as [keyof typeof MODIFIERS, boolean][];\n\n return explicitModifiers.every(([modifier, value]) => {\n const property = MODIFIERS[modifier]();\n\n return event[property] === value;\n });\n}\n"],"names":[],"mappings":";;AAIA,MAAM,SAAY,GAAA;AAAA,EAChB,KAAK,MAAM,QAAA;AAAA,EACX,MAAM,MAAM,SAAA;AAAA,EACZ,MAAM,MAAM,SAAA;AAAA,EACZ,GAAK,EAAA,MAAO,OAAQ,EAAA,GAAK,SAAuB,GAAA,SAAA;AAAA,EAChD,OAAO,MAAM,UAAA;AACf,CAAA,CAAA;AAEO,SAAS,KACd,CAAA,KAAA,EACA,GACA,EAAA,SAAA,GAA8D,EAC9D,EAAA;AACA,EAAI,IAAA,KAAA,CAAM,QAAQ,GAAK,EAAA;AACrB,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,iBAAoB,GAAA,MAAA,CAAO,OAAQ,CAAA,SAAS,CAAE,CAAA,MAAA;AAAA,IAClD,CAAC,GAAG,KAAK,CAAA,KAAM,OAAO,KAAU,KAAA,SAAA;AAAA,GAClC,CAAA;AAEA,EAAA,OAAO,kBAAkB,KAAM,CAAA,CAAC,CAAC,QAAA,EAAU,KAAK,CAAM,KAAA;AACpD,IAAM,MAAA,QAAA,GAAW,UAAU,QAAU,CAAA,EAAA,CAAA;AAErC,IAAA,OAAO,MAAM,QAAc,CAAA,KAAA,KAAA,CAAA;AAAA,GAC5B,CAAA,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"is-key.js","sources":["../../src/utils/is-key.ts"],"sourcesContent":["import type { KeyboardEvent as ReactKeyboardEvent } from \"react\";\n\nimport { isApple } from \"./is-apple\";\n\nconst MODIFIERS = {\n alt: () => \"altKey\" as const,\n ctrl: () => \"ctrlKey\" as const,\n meta: () => \"metaKey\" as const,\n mod: () => (isApple() ? (\"metaKey\" as const) : (\"ctrlKey\" as const)),\n shift: () => \"shiftKey\" as const,\n} as const;\n\nexport function isKey(\n event: KeyboardEvent | ReactKeyboardEvent,\n key: string,\n modifiers: Partial<Record<keyof typeof MODIFIERS, boolean>> = {}\n) {\n if (event.key !== key) {\n return false;\n }\n\n const explicitModifiers = Object.entries(modifiers).filter(\n ([, value]) => typeof value === \"boolean\"\n ) as [keyof typeof MODIFIERS, boolean][];\n\n return explicitModifiers.every(([modifier, value]) => {\n const property = MODIFIERS[modifier]();\n\n return event[property] === value;\n });\n}\n"],"names":[],"mappings":";;AAIA,MAAM,SAAY,GAAA;AAAA,EAChB,KAAK,MAAM,QAAA;AAAA,EACX,MAAM,MAAM,SAAA;AAAA,EACZ,MAAM,MAAM,SAAA;AAAA,EACZ,GAAK,EAAA,MAAO,OAAQ,EAAA,GAAK,SAAuB,GAAA,SAAA;AAAA,EAChD,OAAO,MAAM,UAAA;AACf,CAAA,CAAA;AAEO,SAAS,KACd,CAAA,KAAA,EACA,GACA,EAAA,SAAA,GAA8D,EAC9D,EAAA;AACA,EAAI,IAAA,KAAA,CAAM,QAAQ,GAAK,EAAA;AACrB,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,iBAAoB,GAAA,MAAA,CAAO,OAAQ,CAAA,SAAS,CAAE,CAAA,MAAA;AAAA,IAClD,CAAC,GAAG,KAAK,CAAA,KAAM,OAAO,KAAU,KAAA,SAAA;AAAA,GAClC,CAAA;AAEA,EAAA,OAAO,kBAAkB,KAAM,CAAA,CAAC,CAAC,QAAA,EAAU,KAAK,CAAM,KAAA;AACpD,IAAM,MAAA,QAAA,GAAW,SAAU,CAAA,QAAQ,CAAE,EAAA,CAAA;AAErC,IAAO,OAAA,KAAA,CAAM,QAAQ,CAAM,KAAA,KAAA,CAAA;AAAA,GAC5B,CAAA,CAAA;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"pluralize.cjs","sources":["../../src/utils/pluralize.ts"],"sourcesContent":["export function pluralize<\n C extends number,\n S extends string,\n P extends string = `${S}s`,\n>(count: C, singular: S, plural?: P): C extends 1 ? S : P {\n return (count === 1 ? singular : (plural ?? `${singular}s`)) as C extends 1\n ? S\n : P;\n}\n"],"names":[],"mappings":";;AAAgB,SAAA,SAAA,CAId,KAAU,EAAA,QAAA,EAAa,MAAiC,EAAA;AACxD,EAAA,OAAQ,KAAU,KAAA,CAAA,GAAI,QAAY,GAAA,MAAA,IAAU,CAAG,EAAA,QAAA,CAAA,CAAA,CAAA,CAAA;AAGjD;;;;"}
1
+ {"version":3,"file":"pluralize.cjs","sources":["../../src/utils/pluralize.ts"],"sourcesContent":["export function pluralize<\n C extends number,\n S extends string,\n P extends string = `${S}s`,\n>(count: C, singular: S, plural?: P): C extends 1 ? S : P {\n return (count === 1 ? singular : (plural ?? `${singular}s`)) as C extends 1\n ? S\n : P;\n}\n"],"names":[],"mappings":";;AAAgB,SAAA,SAAA,CAId,KAAU,EAAA,QAAA,EAAa,MAAiC,EAAA;AACxD,EAAA,OAAQ,KAAU,KAAA,CAAA,GAAI,QAAY,GAAA,MAAA,IAAU,GAAG,QAAQ,CAAA,CAAA,CAAA,CAAA;AAGzD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"pluralize.js","sources":["../../src/utils/pluralize.ts"],"sourcesContent":["export function pluralize<\n C extends number,\n S extends string,\n P extends string = `${S}s`,\n>(count: C, singular: S, plural?: P): C extends 1 ? S : P {\n return (count === 1 ? singular : (plural ?? `${singular}s`)) as C extends 1\n ? S\n : P;\n}\n"],"names":[],"mappings":"AAAgB,SAAA,SAAA,CAId,KAAU,EAAA,QAAA,EAAa,MAAiC,EAAA;AACxD,EAAA,OAAQ,KAAU,KAAA,CAAA,GAAI,QAAY,GAAA,MAAA,IAAU,CAAG,EAAA,QAAA,CAAA,CAAA,CAAA,CAAA;AAGjD;;;;"}
1
+ {"version":3,"file":"pluralize.js","sources":["../../src/utils/pluralize.ts"],"sourcesContent":["export function pluralize<\n C extends number,\n S extends string,\n P extends string = `${S}s`,\n>(count: C, singular: S, plural?: P): C extends 1 ? S : P {\n return (count === 1 ? singular : (plural ?? `${singular}s`)) as C extends 1\n ? S\n : P;\n}\n"],"names":[],"mappings":"AAAgB,SAAA,SAAA,CAId,KAAU,EAAA,QAAA,EAAa,MAAiC,EAAA;AACxD,EAAA,OAAQ,KAAU,KAAA,CAAA,GAAI,QAAY,GAAA,MAAA,IAAU,GAAG,QAAQ,CAAA,CAAA,CAAA,CAAA;AAGzD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-controllable-state.cjs","sources":["../../src/utils/use-controllable-state.ts"],"sourcesContent":["import { console } from \"@liveblocks/core\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useRerender } from \"./use-rerender\";\n\n/**\n * Hold a state in a \"controlled\" or \"uncontrolled\" way.\n */\nexport function useControllableState<T>(\n /**\n * The default uncontrolled value.\n */\n defaultValue: T,\n\n /**\n * The controlled value.\n *\n * If `undefined`, the returned value is uncontrolled.\n * If set, this controlled value is used and returned as is.\n */\n value: T | undefined,\n\n /**\n * The event handler called when the value changes.\n */\n onChange: ((value: T) => void) | undefined\n) {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const isControlled = value !== undefined;\n const wasControlled = useRef(isControlled);\n\n useEffect(() => {\n if (\n process.env.NODE_ENV !== \"production\" &&\n wasControlled.current !== isControlled\n ) {\n console.warn(\n `A component is changing from ${\n wasControlled.current ? \"controlled\" : \"uncontrolled\"\n } to ${isControlled ? \"controlled\" : \"uncontrolled\"}.`\n );\n }\n\n wasControlled.current = isControlled;\n }, [isControlled]);\n\n const currentValue = isControlled ? value : uncontrolledValue;\n\n const setValue = useCallback(\n (value: T) => {\n if (isControlled) {\n return onChange?.(value);\n } else {\n setUncontrolledValue(value);\n\n return onChange?.(value);\n }\n },\n [isControlled, onChange]\n );\n\n return [currentValue, setValue] as const;\n}\n\n/**\n * @experimental\n *\n * Hold a value in a \"semi-controlled\" way: a controlled value that can be\n * overridden by uncontrolled changes in a \"most recent wins\" way.\n *\n * @example\n *\n * A `Collapsible` component uses `useSemiControllableState` to control\n * its \"open\" state, it accepts two optional props: `open` and `onOpenChange`.\n *\n * Internally, it passes them to `useSemiControllableState`:\n *\n * ```tsx\n * const [isOpen, setIsOpen] = useSemiControllableState(\n * open ?? true, // Defaults to `true` if `open` is not provided\n * onOpenChange\n * );\n *\n * // ... `isOpen` and `setIsOpen` are used in the component's implementation ...\n * ```\n *\n * And finally here's how it could be used in a \"semi-controlled\" way:\n *\n * ```tsx\n * const status: `\"loading\" | \"success\" | \"error\"`;\n *\n * <Collapsible open={status === \"success\"} />\n * ```\n *\n * Like with a traditional controlled value, the collapsible will start closed\n * and will automatically open when `status` becomes `\"success\"`.\n *\n * But unlike with a traditional controlled value, the collapsible can still\n * open/close when it's clicked on by the user, overriding `open={status === \"success\"}`.\n *\n * It's possible to use it as a traditional uncontrolled value:\n *\n * ```tsx\n * const defaultOpen = false;\n *\n * <Collapsible open={defaultOpen} />\n * ```\n *\n * Or to sync the uncontrolled value like with a traditional uncontrolled value:\n *\n * ```tsx\n * const [isOpen, setIsOpen] = useState(false);\n *\n * // `isOpen` is synced with the uncontrolled value when the user clicks\n * <Collapsible open={isOpen} onOpenChange={setIsOpen} />\n * ```\n *\n * But with the caveat that it will still be possible to change the\n * uncontrolled value:\n *\n * ```tsx\n * const open = false;\n *\n * // Clicking on the collapsible will still open/close it, unlike with a\n * // traditional controlled value.\n * <Collapsible open={open} />\n * ```\n */\nexport function useSemiControllableState<T>(\n /**\n * The controlled value.\n *\n * When this value changes, it becomes the current value.\n * But unlike a traditional controlled value, it can be overridden by\n * uncontrolled changes.\n */\n value: T,\n\n /**\n * The event handler called when the uncontrolled value changes.\n */\n onChange: ((value: T) => void) | undefined\n) {\n const [uncontrolledValue, setUncontrolledValue] = useState(value);\n const lastChange = useRef<\"uncontrolled\" | \"controlled\">(\"controlled\");\n const lastValue = useRef(value);\n const [rerender] = useRerender();\n\n // Listen to `value` changes during the render phase to avoid\n // having to always sync `uncontrolledValue` on every change.\n if (!Object.is(lastValue.current, value)) {\n lastValue.current = value;\n lastChange.current = \"controlled\";\n }\n\n const setValue = useCallback(\n (value: T) => {\n lastChange.current = \"uncontrolled\";\n setUncontrolledValue(value);\n\n // If the new `uncontrolledValue` is the same as last time it was the \"last change\",\n // `setUncontrolledValue` won't trigger a re-render, but the fact that it's becoming\n // uncontrolled again is a change that needs a re-render.\n rerender();\n\n onChange?.(value);\n },\n [onChange, rerender]\n );\n\n const currentValue =\n lastChange.current === \"uncontrolled\" ? uncontrolledValue : value;\n\n return [currentValue, setValue] as const;\n}\n"],"names":["useState","useRef","useEffect","console","useCallback","value","useRerender"],"mappings":";;;;;;AAQgB,SAAA,oBAAA,CAId,YAQA,EAAA,KAAA,EAKA,QACA,EAAA;AACA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,eAAS,YAAY,CAAA,CAAA;AACvE,EAAA,MAAM,eAAe,KAAU,KAAA,KAAA,CAAA,CAAA;AAC/B,EAAM,MAAA,aAAA,GAAgBC,aAAO,YAAY,CAAA,CAAA;AAEzC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IACE,QAAQ,GAAI,CAAA,QAAA,KAAa,YACzB,IAAA,aAAA,CAAc,YAAY,YAC1B,EAAA;AACA,MAAQC,YAAA,CAAA,IAAA;AAAA,QACN,gCACE,aAAc,CAAA,OAAA,GAAU,YAAe,GAAA,cAAA,CAAA,IAAA,EAClC,eAAe,YAAe,GAAA,cAAA,CAAA,CAAA,CAAA;AAAA,OACvC,CAAA;AAAA,KACF;AAEA,IAAA,aAAA,CAAc,OAAU,GAAA,YAAA,CAAA;AAAA,GAC1B,EAAG,CAAC,YAAY,CAAC,CAAA,CAAA;AAEjB,EAAM,MAAA,YAAA,GAAe,eAAe,KAAQ,GAAA,iBAAA,CAAA;AAE5C,EAAA,MAAM,QAAW,GAAAC,iBAAA;AAAA,IACf,CAACC,MAAa,KAAA;AACZ,MAAA,IAAI,YAAc,EAAA;AAChB,QAAA,OAAO,WAAWA,MAAK,CAAA,CAAA;AAAA,OAClB,MAAA;AACL,QAAA,oBAAA,CAAqBA,MAAK,CAAA,CAAA;AAE1B,QAAA,OAAO,WAAWA,MAAK,CAAA,CAAA;AAAA,OACzB;AAAA,KACF;AAAA,IACA,CAAC,cAAc,QAAQ,CAAA;AAAA,GACzB,CAAA;AAEA,EAAO,OAAA,CAAC,cAAc,QAAQ,CAAA,CAAA;AAChC,CAAA;AAkEgB,SAAA,wBAAA,CAQd,OAKA,QACA,EAAA;AACA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIL,eAAS,KAAK,CAAA,CAAA;AAChE,EAAM,MAAA,UAAA,GAAaC,aAAsC,YAAY,CAAA,CAAA;AACrE,EAAM,MAAA,SAAA,GAAYA,aAAO,KAAK,CAAA,CAAA;AAC9B,EAAM,MAAA,CAAC,QAAQ,CAAA,GAAIK,uBAAY,EAAA,CAAA;AAI/B,EAAA,IAAI,CAAC,MAAO,CAAA,EAAA,CAAG,SAAU,CAAA,OAAA,EAAS,KAAK,CAAG,EAAA;AACxC,IAAA,SAAA,CAAU,OAAU,GAAA,KAAA,CAAA;AACpB,IAAA,UAAA,CAAW,OAAU,GAAA,YAAA,CAAA;AAAA,GACvB;AAEA,EAAA,MAAM,QAAW,GAAAF,iBAAA;AAAA,IACf,CAACC,MAAa,KAAA;AACZ,MAAA,UAAA,CAAW,OAAU,GAAA,cAAA,CAAA;AACrB,MAAA,oBAAA,CAAqBA,MAAK,CAAA,CAAA;AAK1B,MAAS,QAAA,EAAA,CAAA;AAET,MAAA,QAAA,GAAWA,MAAK,CAAA,CAAA;AAAA,KAClB;AAAA,IACA,CAAC,UAAU,QAAQ,CAAA;AAAA,GACrB,CAAA;AAEA,EAAA,MAAM,YACJ,GAAA,UAAA,CAAW,OAAY,KAAA,cAAA,GAAiB,iBAAoB,GAAA,KAAA,CAAA;AAE9D,EAAO,OAAA,CAAC,cAAc,QAAQ,CAAA,CAAA;AAChC;;;;;"}
1
+ {"version":3,"file":"use-controllable-state.cjs","sources":["../../src/utils/use-controllable-state.ts"],"sourcesContent":["import { console } from \"@liveblocks/core\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useRerender } from \"./use-rerender\";\n\n/**\n * Hold a state in a \"controlled\" or \"uncontrolled\" way.\n */\nexport function useControllableState<T>(\n /**\n * The default uncontrolled value.\n */\n defaultValue: T,\n\n /**\n * The controlled value.\n *\n * If `undefined`, the returned value is uncontrolled.\n * If set, this controlled value is used and returned as is.\n */\n value: T | undefined,\n\n /**\n * The event handler called when the value changes.\n */\n onChange: ((value: T) => void) | undefined\n) {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const isControlled = value !== undefined;\n const wasControlled = useRef(isControlled);\n\n useEffect(() => {\n if (\n process.env.NODE_ENV !== \"production\" &&\n wasControlled.current !== isControlled\n ) {\n console.warn(\n `A component is changing from ${\n wasControlled.current ? \"controlled\" : \"uncontrolled\"\n } to ${isControlled ? \"controlled\" : \"uncontrolled\"}.`\n );\n }\n\n wasControlled.current = isControlled;\n }, [isControlled]);\n\n const currentValue = isControlled ? value : uncontrolledValue;\n\n const setValue = useCallback(\n (value: T) => {\n if (isControlled) {\n return onChange?.(value);\n } else {\n setUncontrolledValue(value);\n\n return onChange?.(value);\n }\n },\n [isControlled, onChange]\n );\n\n return [currentValue, setValue] as const;\n}\n\n/**\n * @experimental\n *\n * Hold a value in a \"semi-controlled\" way: a controlled value that can be\n * overridden by uncontrolled changes in a \"most recent wins\" way.\n *\n * @example\n *\n * A `Collapsible` component uses `useSemiControllableState` to control\n * its \"open\" state, it accepts two optional props: `open` and `onOpenChange`.\n *\n * Internally, it passes them to `useSemiControllableState`:\n *\n * ```tsx\n * const [isOpen, setIsOpen] = useSemiControllableState(\n * open ?? true, // Defaults to `true` if `open` is not provided\n * onOpenChange\n * );\n *\n * // ... `isOpen` and `setIsOpen` are used in the component's implementation ...\n * ```\n *\n * And finally here's how it could be used in a \"semi-controlled\" way:\n *\n * ```tsx\n * const status: `\"loading\" | \"success\" | \"error\"`;\n *\n * <Collapsible open={status === \"success\"} />\n * ```\n *\n * Like with a traditional controlled value, the collapsible will start closed\n * and will automatically open when `status` becomes `\"success\"`.\n *\n * But unlike with a traditional controlled value, the collapsible can still\n * open/close when it's clicked on by the user, overriding `open={status === \"success\"}`.\n *\n * It's possible to use it as a traditional uncontrolled value:\n *\n * ```tsx\n * const defaultOpen = false;\n *\n * <Collapsible open={defaultOpen} />\n * ```\n *\n * Or to sync the uncontrolled value like with a traditional uncontrolled value:\n *\n * ```tsx\n * const [isOpen, setIsOpen] = useState(false);\n *\n * // `isOpen` is synced with the uncontrolled value when the user clicks\n * <Collapsible open={isOpen} onOpenChange={setIsOpen} />\n * ```\n *\n * But with the caveat that it will still be possible to change the\n * uncontrolled value:\n *\n * ```tsx\n * const open = false;\n *\n * // Clicking on the collapsible will still open/close it, unlike with a\n * // traditional controlled value.\n * <Collapsible open={open} />\n * ```\n */\nexport function useSemiControllableState<T>(\n /**\n * The controlled value.\n *\n * When this value changes, it becomes the current value.\n * But unlike a traditional controlled value, it can be overridden by\n * uncontrolled changes.\n */\n value: T,\n\n /**\n * The event handler called when the uncontrolled value changes.\n */\n onChange: ((value: T) => void) | undefined\n) {\n const [uncontrolledValue, setUncontrolledValue] = useState(value);\n const lastChange = useRef<\"uncontrolled\" | \"controlled\">(\"controlled\");\n const lastValue = useRef(value);\n const [rerender] = useRerender();\n\n // Listen to `value` changes during the render phase to avoid\n // having to always sync `uncontrolledValue` on every change.\n if (!Object.is(lastValue.current, value)) {\n lastValue.current = value;\n lastChange.current = \"controlled\";\n }\n\n const setValue = useCallback(\n (value: T) => {\n lastChange.current = \"uncontrolled\";\n setUncontrolledValue(value);\n\n // If the new `uncontrolledValue` is the same as last time it was the \"last change\",\n // `setUncontrolledValue` won't trigger a re-render, but the fact that it's becoming\n // uncontrolled again is a change that needs a re-render.\n rerender();\n\n onChange?.(value);\n },\n [onChange, rerender]\n );\n\n const currentValue =\n lastChange.current === \"uncontrolled\" ? uncontrolledValue : value;\n\n return [currentValue, setValue] as const;\n}\n"],"names":["useState","useRef","useEffect","console","useCallback","value","useRerender"],"mappings":";;;;;;AAQgB,SAAA,oBAAA,CAId,YAQA,EAAA,KAAA,EAKA,QACA,EAAA;AACA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,eAAS,YAAY,CAAA,CAAA;AACvE,EAAA,MAAM,eAAe,KAAU,KAAA,KAAA,CAAA,CAAA;AAC/B,EAAM,MAAA,aAAA,GAAgBC,aAAO,YAAY,CAAA,CAAA;AAEzC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IACE,QAAQ,GAAI,CAAA,QAAA,KAAa,YACzB,IAAA,aAAA,CAAc,YAAY,YAC1B,EAAA;AACA,MAAQC,YAAA,CAAA,IAAA;AAAA,QACN,CAAA,6BAAA,EACE,cAAc,OAAU,GAAA,YAAA,GAAe,cACzC,CAAO,IAAA,EAAA,YAAA,GAAe,eAAe,cAAc,CAAA,CAAA,CAAA;AAAA,OACrD,CAAA;AAAA,KACF;AAEA,IAAA,aAAA,CAAc,OAAU,GAAA,YAAA,CAAA;AAAA,GAC1B,EAAG,CAAC,YAAY,CAAC,CAAA,CAAA;AAEjB,EAAM,MAAA,YAAA,GAAe,eAAe,KAAQ,GAAA,iBAAA,CAAA;AAE5C,EAAA,MAAM,QAAW,GAAAC,iBAAA;AAAA,IACf,CAACC,MAAa,KAAA;AACZ,MAAA,IAAI,YAAc,EAAA;AAChB,QAAA,OAAO,WAAWA,MAAK,CAAA,CAAA;AAAA,OAClB,MAAA;AACL,QAAA,oBAAA,CAAqBA,MAAK,CAAA,CAAA;AAE1B,QAAA,OAAO,WAAWA,MAAK,CAAA,CAAA;AAAA,OACzB;AAAA,KACF;AAAA,IACA,CAAC,cAAc,QAAQ,CAAA;AAAA,GACzB,CAAA;AAEA,EAAO,OAAA,CAAC,cAAc,QAAQ,CAAA,CAAA;AAChC,CAAA;AAkEgB,SAAA,wBAAA,CAQd,OAKA,QACA,EAAA;AACA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIL,eAAS,KAAK,CAAA,CAAA;AAChE,EAAM,MAAA,UAAA,GAAaC,aAAsC,YAAY,CAAA,CAAA;AACrE,EAAM,MAAA,SAAA,GAAYA,aAAO,KAAK,CAAA,CAAA;AAC9B,EAAM,MAAA,CAAC,QAAQ,CAAA,GAAIK,uBAAY,EAAA,CAAA;AAI/B,EAAA,IAAI,CAAC,MAAO,CAAA,EAAA,CAAG,SAAU,CAAA,OAAA,EAAS,KAAK,CAAG,EAAA;AACxC,IAAA,SAAA,CAAU,OAAU,GAAA,KAAA,CAAA;AACpB,IAAA,UAAA,CAAW,OAAU,GAAA,YAAA,CAAA;AAAA,GACvB;AAEA,EAAA,MAAM,QAAW,GAAAF,iBAAA;AAAA,IACf,CAACC,MAAa,KAAA;AACZ,MAAA,UAAA,CAAW,OAAU,GAAA,cAAA,CAAA;AACrB,MAAA,oBAAA,CAAqBA,MAAK,CAAA,CAAA;AAK1B,MAAS,QAAA,EAAA,CAAA;AAET,MAAA,QAAA,GAAWA,MAAK,CAAA,CAAA;AAAA,KAClB;AAAA,IACA,CAAC,UAAU,QAAQ,CAAA;AAAA,GACrB,CAAA;AAEA,EAAA,MAAM,YACJ,GAAA,UAAA,CAAW,OAAY,KAAA,cAAA,GAAiB,iBAAoB,GAAA,KAAA,CAAA;AAE9D,EAAO,OAAA,CAAC,cAAc,QAAQ,CAAA,CAAA;AAChC;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-controllable-state.js","sources":["../../src/utils/use-controllable-state.ts"],"sourcesContent":["import { console } from \"@liveblocks/core\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useRerender } from \"./use-rerender\";\n\n/**\n * Hold a state in a \"controlled\" or \"uncontrolled\" way.\n */\nexport function useControllableState<T>(\n /**\n * The default uncontrolled value.\n */\n defaultValue: T,\n\n /**\n * The controlled value.\n *\n * If `undefined`, the returned value is uncontrolled.\n * If set, this controlled value is used and returned as is.\n */\n value: T | undefined,\n\n /**\n * The event handler called when the value changes.\n */\n onChange: ((value: T) => void) | undefined\n) {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const isControlled = value !== undefined;\n const wasControlled = useRef(isControlled);\n\n useEffect(() => {\n if (\n process.env.NODE_ENV !== \"production\" &&\n wasControlled.current !== isControlled\n ) {\n console.warn(\n `A component is changing from ${\n wasControlled.current ? \"controlled\" : \"uncontrolled\"\n } to ${isControlled ? \"controlled\" : \"uncontrolled\"}.`\n );\n }\n\n wasControlled.current = isControlled;\n }, [isControlled]);\n\n const currentValue = isControlled ? value : uncontrolledValue;\n\n const setValue = useCallback(\n (value: T) => {\n if (isControlled) {\n return onChange?.(value);\n } else {\n setUncontrolledValue(value);\n\n return onChange?.(value);\n }\n },\n [isControlled, onChange]\n );\n\n return [currentValue, setValue] as const;\n}\n\n/**\n * @experimental\n *\n * Hold a value in a \"semi-controlled\" way: a controlled value that can be\n * overridden by uncontrolled changes in a \"most recent wins\" way.\n *\n * @example\n *\n * A `Collapsible` component uses `useSemiControllableState` to control\n * its \"open\" state, it accepts two optional props: `open` and `onOpenChange`.\n *\n * Internally, it passes them to `useSemiControllableState`:\n *\n * ```tsx\n * const [isOpen, setIsOpen] = useSemiControllableState(\n * open ?? true, // Defaults to `true` if `open` is not provided\n * onOpenChange\n * );\n *\n * // ... `isOpen` and `setIsOpen` are used in the component's implementation ...\n * ```\n *\n * And finally here's how it could be used in a \"semi-controlled\" way:\n *\n * ```tsx\n * const status: `\"loading\" | \"success\" | \"error\"`;\n *\n * <Collapsible open={status === \"success\"} />\n * ```\n *\n * Like with a traditional controlled value, the collapsible will start closed\n * and will automatically open when `status` becomes `\"success\"`.\n *\n * But unlike with a traditional controlled value, the collapsible can still\n * open/close when it's clicked on by the user, overriding `open={status === \"success\"}`.\n *\n * It's possible to use it as a traditional uncontrolled value:\n *\n * ```tsx\n * const defaultOpen = false;\n *\n * <Collapsible open={defaultOpen} />\n * ```\n *\n * Or to sync the uncontrolled value like with a traditional uncontrolled value:\n *\n * ```tsx\n * const [isOpen, setIsOpen] = useState(false);\n *\n * // `isOpen` is synced with the uncontrolled value when the user clicks\n * <Collapsible open={isOpen} onOpenChange={setIsOpen} />\n * ```\n *\n * But with the caveat that it will still be possible to change the\n * uncontrolled value:\n *\n * ```tsx\n * const open = false;\n *\n * // Clicking on the collapsible will still open/close it, unlike with a\n * // traditional controlled value.\n * <Collapsible open={open} />\n * ```\n */\nexport function useSemiControllableState<T>(\n /**\n * The controlled value.\n *\n * When this value changes, it becomes the current value.\n * But unlike a traditional controlled value, it can be overridden by\n * uncontrolled changes.\n */\n value: T,\n\n /**\n * The event handler called when the uncontrolled value changes.\n */\n onChange: ((value: T) => void) | undefined\n) {\n const [uncontrolledValue, setUncontrolledValue] = useState(value);\n const lastChange = useRef<\"uncontrolled\" | \"controlled\">(\"controlled\");\n const lastValue = useRef(value);\n const [rerender] = useRerender();\n\n // Listen to `value` changes during the render phase to avoid\n // having to always sync `uncontrolledValue` on every change.\n if (!Object.is(lastValue.current, value)) {\n lastValue.current = value;\n lastChange.current = \"controlled\";\n }\n\n const setValue = useCallback(\n (value: T) => {\n lastChange.current = \"uncontrolled\";\n setUncontrolledValue(value);\n\n // If the new `uncontrolledValue` is the same as last time it was the \"last change\",\n // `setUncontrolledValue` won't trigger a re-render, but the fact that it's becoming\n // uncontrolled again is a change that needs a re-render.\n rerender();\n\n onChange?.(value);\n },\n [onChange, rerender]\n );\n\n const currentValue =\n lastChange.current === \"uncontrolled\" ? uncontrolledValue : value;\n\n return [currentValue, setValue] as const;\n}\n"],"names":["value"],"mappings":";;;;AAQgB,SAAA,oBAAA,CAId,YAQA,EAAA,KAAA,EAKA,QACA,EAAA;AACA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,YAAY,CAAA,CAAA;AACvE,EAAA,MAAM,eAAe,KAAU,KAAA,KAAA,CAAA,CAAA;AAC/B,EAAM,MAAA,aAAA,GAAgB,OAAO,YAAY,CAAA,CAAA;AAEzC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IACE,QAAQ,GAAI,CAAA,QAAA,KAAa,YACzB,IAAA,aAAA,CAAc,YAAY,YAC1B,EAAA;AACA,MAAQ,OAAA,CAAA,IAAA;AAAA,QACN,gCACE,aAAc,CAAA,OAAA,GAAU,YAAe,GAAA,cAAA,CAAA,IAAA,EAClC,eAAe,YAAe,GAAA,cAAA,CAAA,CAAA,CAAA;AAAA,OACvC,CAAA;AAAA,KACF;AAEA,IAAA,aAAA,CAAc,OAAU,GAAA,YAAA,CAAA;AAAA,GAC1B,EAAG,CAAC,YAAY,CAAC,CAAA,CAAA;AAEjB,EAAM,MAAA,YAAA,GAAe,eAAe,KAAQ,GAAA,iBAAA,CAAA;AAE5C,EAAA,MAAM,QAAW,GAAA,WAAA;AAAA,IACf,CAACA,MAAa,KAAA;AACZ,MAAA,IAAI,YAAc,EAAA;AAChB,QAAA,OAAO,WAAWA,MAAK,CAAA,CAAA;AAAA,OAClB,MAAA;AACL,QAAA,oBAAA,CAAqBA,MAAK,CAAA,CAAA;AAE1B,QAAA,OAAO,WAAWA,MAAK,CAAA,CAAA;AAAA,OACzB;AAAA,KACF;AAAA,IACA,CAAC,cAAc,QAAQ,CAAA;AAAA,GACzB,CAAA;AAEA,EAAO,OAAA,CAAC,cAAc,QAAQ,CAAA,CAAA;AAChC,CAAA;AAkEgB,SAAA,wBAAA,CAQd,OAKA,QACA,EAAA;AACA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAChE,EAAM,MAAA,UAAA,GAAa,OAAsC,YAAY,CAAA,CAAA;AACrE,EAAM,MAAA,SAAA,GAAY,OAAO,KAAK,CAAA,CAAA;AAC9B,EAAM,MAAA,CAAC,QAAQ,CAAA,GAAI,WAAY,EAAA,CAAA;AAI/B,EAAA,IAAI,CAAC,MAAO,CAAA,EAAA,CAAG,SAAU,CAAA,OAAA,EAAS,KAAK,CAAG,EAAA;AACxC,IAAA,SAAA,CAAU,OAAU,GAAA,KAAA,CAAA;AACpB,IAAA,UAAA,CAAW,OAAU,GAAA,YAAA,CAAA;AAAA,GACvB;AAEA,EAAA,MAAM,QAAW,GAAA,WAAA;AAAA,IACf,CAACA,MAAa,KAAA;AACZ,MAAA,UAAA,CAAW,OAAU,GAAA,cAAA,CAAA;AACrB,MAAA,oBAAA,CAAqBA,MAAK,CAAA,CAAA;AAK1B,MAAS,QAAA,EAAA,CAAA;AAET,MAAA,QAAA,GAAWA,MAAK,CAAA,CAAA;AAAA,KAClB;AAAA,IACA,CAAC,UAAU,QAAQ,CAAA;AAAA,GACrB,CAAA;AAEA,EAAA,MAAM,YACJ,GAAA,UAAA,CAAW,OAAY,KAAA,cAAA,GAAiB,iBAAoB,GAAA,KAAA,CAAA;AAE9D,EAAO,OAAA,CAAC,cAAc,QAAQ,CAAA,CAAA;AAChC;;;;"}
1
+ {"version":3,"file":"use-controllable-state.js","sources":["../../src/utils/use-controllable-state.ts"],"sourcesContent":["import { console } from \"@liveblocks/core\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useRerender } from \"./use-rerender\";\n\n/**\n * Hold a state in a \"controlled\" or \"uncontrolled\" way.\n */\nexport function useControllableState<T>(\n /**\n * The default uncontrolled value.\n */\n defaultValue: T,\n\n /**\n * The controlled value.\n *\n * If `undefined`, the returned value is uncontrolled.\n * If set, this controlled value is used and returned as is.\n */\n value: T | undefined,\n\n /**\n * The event handler called when the value changes.\n */\n onChange: ((value: T) => void) | undefined\n) {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const isControlled = value !== undefined;\n const wasControlled = useRef(isControlled);\n\n useEffect(() => {\n if (\n process.env.NODE_ENV !== \"production\" &&\n wasControlled.current !== isControlled\n ) {\n console.warn(\n `A component is changing from ${\n wasControlled.current ? \"controlled\" : \"uncontrolled\"\n } to ${isControlled ? \"controlled\" : \"uncontrolled\"}.`\n );\n }\n\n wasControlled.current = isControlled;\n }, [isControlled]);\n\n const currentValue = isControlled ? value : uncontrolledValue;\n\n const setValue = useCallback(\n (value: T) => {\n if (isControlled) {\n return onChange?.(value);\n } else {\n setUncontrolledValue(value);\n\n return onChange?.(value);\n }\n },\n [isControlled, onChange]\n );\n\n return [currentValue, setValue] as const;\n}\n\n/**\n * @experimental\n *\n * Hold a value in a \"semi-controlled\" way: a controlled value that can be\n * overridden by uncontrolled changes in a \"most recent wins\" way.\n *\n * @example\n *\n * A `Collapsible` component uses `useSemiControllableState` to control\n * its \"open\" state, it accepts two optional props: `open` and `onOpenChange`.\n *\n * Internally, it passes them to `useSemiControllableState`:\n *\n * ```tsx\n * const [isOpen, setIsOpen] = useSemiControllableState(\n * open ?? true, // Defaults to `true` if `open` is not provided\n * onOpenChange\n * );\n *\n * // ... `isOpen` and `setIsOpen` are used in the component's implementation ...\n * ```\n *\n * And finally here's how it could be used in a \"semi-controlled\" way:\n *\n * ```tsx\n * const status: `\"loading\" | \"success\" | \"error\"`;\n *\n * <Collapsible open={status === \"success\"} />\n * ```\n *\n * Like with a traditional controlled value, the collapsible will start closed\n * and will automatically open when `status` becomes `\"success\"`.\n *\n * But unlike with a traditional controlled value, the collapsible can still\n * open/close when it's clicked on by the user, overriding `open={status === \"success\"}`.\n *\n * It's possible to use it as a traditional uncontrolled value:\n *\n * ```tsx\n * const defaultOpen = false;\n *\n * <Collapsible open={defaultOpen} />\n * ```\n *\n * Or to sync the uncontrolled value like with a traditional uncontrolled value:\n *\n * ```tsx\n * const [isOpen, setIsOpen] = useState(false);\n *\n * // `isOpen` is synced with the uncontrolled value when the user clicks\n * <Collapsible open={isOpen} onOpenChange={setIsOpen} />\n * ```\n *\n * But with the caveat that it will still be possible to change the\n * uncontrolled value:\n *\n * ```tsx\n * const open = false;\n *\n * // Clicking on the collapsible will still open/close it, unlike with a\n * // traditional controlled value.\n * <Collapsible open={open} />\n * ```\n */\nexport function useSemiControllableState<T>(\n /**\n * The controlled value.\n *\n * When this value changes, it becomes the current value.\n * But unlike a traditional controlled value, it can be overridden by\n * uncontrolled changes.\n */\n value: T,\n\n /**\n * The event handler called when the uncontrolled value changes.\n */\n onChange: ((value: T) => void) | undefined\n) {\n const [uncontrolledValue, setUncontrolledValue] = useState(value);\n const lastChange = useRef<\"uncontrolled\" | \"controlled\">(\"controlled\");\n const lastValue = useRef(value);\n const [rerender] = useRerender();\n\n // Listen to `value` changes during the render phase to avoid\n // having to always sync `uncontrolledValue` on every change.\n if (!Object.is(lastValue.current, value)) {\n lastValue.current = value;\n lastChange.current = \"controlled\";\n }\n\n const setValue = useCallback(\n (value: T) => {\n lastChange.current = \"uncontrolled\";\n setUncontrolledValue(value);\n\n // If the new `uncontrolledValue` is the same as last time it was the \"last change\",\n // `setUncontrolledValue` won't trigger a re-render, but the fact that it's becoming\n // uncontrolled again is a change that needs a re-render.\n rerender();\n\n onChange?.(value);\n },\n [onChange, rerender]\n );\n\n const currentValue =\n lastChange.current === \"uncontrolled\" ? uncontrolledValue : value;\n\n return [currentValue, setValue] as const;\n}\n"],"names":["value"],"mappings":";;;;AAQgB,SAAA,oBAAA,CAId,YAQA,EAAA,KAAA,EAKA,QACA,EAAA;AACA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,YAAY,CAAA,CAAA;AACvE,EAAA,MAAM,eAAe,KAAU,KAAA,KAAA,CAAA,CAAA;AAC/B,EAAM,MAAA,aAAA,GAAgB,OAAO,YAAY,CAAA,CAAA;AAEzC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IACE,QAAQ,GAAI,CAAA,QAAA,KAAa,YACzB,IAAA,aAAA,CAAc,YAAY,YAC1B,EAAA;AACA,MAAQ,OAAA,CAAA,IAAA;AAAA,QACN,CAAA,6BAAA,EACE,cAAc,OAAU,GAAA,YAAA,GAAe,cACzC,CAAO,IAAA,EAAA,YAAA,GAAe,eAAe,cAAc,CAAA,CAAA,CAAA;AAAA,OACrD,CAAA;AAAA,KACF;AAEA,IAAA,aAAA,CAAc,OAAU,GAAA,YAAA,CAAA;AAAA,GAC1B,EAAG,CAAC,YAAY,CAAC,CAAA,CAAA;AAEjB,EAAM,MAAA,YAAA,GAAe,eAAe,KAAQ,GAAA,iBAAA,CAAA;AAE5C,EAAA,MAAM,QAAW,GAAA,WAAA;AAAA,IACf,CAACA,MAAa,KAAA;AACZ,MAAA,IAAI,YAAc,EAAA;AAChB,QAAA,OAAO,WAAWA,MAAK,CAAA,CAAA;AAAA,OAClB,MAAA;AACL,QAAA,oBAAA,CAAqBA,MAAK,CAAA,CAAA;AAE1B,QAAA,OAAO,WAAWA,MAAK,CAAA,CAAA;AAAA,OACzB;AAAA,KACF;AAAA,IACA,CAAC,cAAc,QAAQ,CAAA;AAAA,GACzB,CAAA;AAEA,EAAO,OAAA,CAAC,cAAc,QAAQ,CAAA,CAAA;AAChC,CAAA;AAkEgB,SAAA,wBAAA,CAQd,OAKA,QACA,EAAA;AACA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAChE,EAAM,MAAA,UAAA,GAAa,OAAsC,YAAY,CAAA,CAAA;AACrE,EAAM,MAAA,SAAA,GAAY,OAAO,KAAK,CAAA,CAAA;AAC9B,EAAM,MAAA,CAAC,QAAQ,CAAA,GAAI,WAAY,EAAA,CAAA;AAI/B,EAAA,IAAI,CAAC,MAAO,CAAA,EAAA,CAAG,SAAU,CAAA,OAAA,EAAS,KAAK,CAAG,EAAA;AACxC,IAAA,SAAA,CAAU,OAAU,GAAA,KAAA,CAAA;AACpB,IAAA,UAAA,CAAW,OAAU,GAAA,YAAA,CAAA;AAAA,GACvB;AAEA,EAAA,MAAM,QAAW,GAAA,WAAA;AAAA,IACf,CAACA,MAAa,KAAA;AACZ,MAAA,UAAA,CAAW,OAAU,GAAA,cAAA,CAAA;AACrB,MAAA,oBAAA,CAAqBA,MAAK,CAAA,CAAA;AAK1B,MAAS,QAAA,EAAA,CAAA;AAET,MAAA,QAAA,GAAWA,MAAK,CAAA,CAAA;AAAA,KAClB;AAAA,IACA,CAAC,UAAU,QAAQ,CAAA;AAAA,GACrB,CAAA;AAEA,EAAA,MAAM,YACJ,GAAA,UAAA,CAAW,OAAY,KAAA,cAAA,GAAiB,iBAAoB,GAAA,KAAA,CAAA;AAE9D,EAAO,OAAA,CAAC,cAAc,QAAQ,CAAA,CAAA;AAChC;;;;"}
@@ -4,6 +4,9 @@ var react = require('react');
4
4
 
5
5
  function useRerender() {
6
6
  const [key, update] = react.useReducer(
7
+ // This implementation works by incrementing a hidden counter value that is
8
+ // never consumed. Simply incrementing the counter changes the component's
9
+ // state and, thus, trigger a re-render.
7
10
  (key2) => key2 + 1,
8
11
  0
9
12
  );
@@ -1 +1 @@
1
- {"version":3,"file":"use-rerender.cjs","sources":["../../src/utils/use-rerender.ts"],"sourcesContent":["import { useReducer } from \"react\";\n\n/**\n * Trigger a re-render programmatically, without changing the component's\n * state.\n *\n * @example\n * const rerender = useRerender();\n *\n * return (\n * <button onClick={rerender}>\n * {Math.random()}\n * </button>\n * )\n */\nexport function useRerender(): [() => void, number] {\n const [key, update] = useReducer(\n // This implementation works by incrementing a hidden counter value that is\n // never consumed. Simply incrementing the counter changes the component's\n // state and, thus, trigger a re-render.\n (key: number): number => key + 1,\n 0\n );\n return [update, key];\n}\n"],"names":["useReducer","key"],"mappings":";;;;AAeO,SAAS,WAAoC,GAAA;AAClD,EAAM,MAAA,CAAC,GAAK,EAAA,MAAM,CAAI,GAAAA,gBAAA;AAAA,IAIpB,CAACC,SAAwBA,IAAM,GAAA,CAAA;AAAA,IAC/B,CAAA;AAAA,GACF,CAAA;AACA,EAAO,OAAA,CAAC,QAAQ,GAAG,CAAA,CAAA;AACrB;;;;"}
1
+ {"version":3,"file":"use-rerender.cjs","sources":["../../src/utils/use-rerender.ts"],"sourcesContent":["import { useReducer } from \"react\";\n\n/**\n * Trigger a re-render programmatically, without changing the component's\n * state.\n *\n * @example\n * const rerender = useRerender();\n *\n * return (\n * <button onClick={rerender}>\n * {Math.random()}\n * </button>\n * )\n */\nexport function useRerender(): [() => void, number] {\n const [key, update] = useReducer(\n // This implementation works by incrementing a hidden counter value that is\n // never consumed. Simply incrementing the counter changes the component's\n // state and, thus, trigger a re-render.\n (key: number): number => key + 1,\n 0\n );\n return [update, key];\n}\n"],"names":["useReducer","key"],"mappings":";;;;AAeO,SAAS,WAAoC,GAAA;AAClD,EAAM,MAAA,CAAC,GAAK,EAAA,MAAM,CAAI,GAAAA,gBAAA;AAAA;AAAA;AAAA;AAAA,IAIpB,CAACC,SAAwBA,IAAM,GAAA,CAAA;AAAA,IAC/B,CAAA;AAAA,GACF,CAAA;AACA,EAAO,OAAA,CAAC,QAAQ,GAAG,CAAA,CAAA;AACrB;;;;"}
@@ -2,6 +2,9 @@ import { useReducer } from 'react';
2
2
 
3
3
  function useRerender() {
4
4
  const [key, update] = useReducer(
5
+ // This implementation works by incrementing a hidden counter value that is
6
+ // never consumed. Simply incrementing the counter changes the component's
7
+ // state and, thus, trigger a re-render.
5
8
  (key2) => key2 + 1,
6
9
  0
7
10
  );
@@ -1 +1 @@
1
- {"version":3,"file":"use-rerender.js","sources":["../../src/utils/use-rerender.ts"],"sourcesContent":["import { useReducer } from \"react\";\n\n/**\n * Trigger a re-render programmatically, without changing the component's\n * state.\n *\n * @example\n * const rerender = useRerender();\n *\n * return (\n * <button onClick={rerender}>\n * {Math.random()}\n * </button>\n * )\n */\nexport function useRerender(): [() => void, number] {\n const [key, update] = useReducer(\n // This implementation works by incrementing a hidden counter value that is\n // never consumed. Simply incrementing the counter changes the component's\n // state and, thus, trigger a re-render.\n (key: number): number => key + 1,\n 0\n );\n return [update, key];\n}\n"],"names":["key"],"mappings":";;AAeO,SAAS,WAAoC,GAAA;AAClD,EAAM,MAAA,CAAC,GAAK,EAAA,MAAM,CAAI,GAAA,UAAA;AAAA,IAIpB,CAACA,SAAwBA,IAAM,GAAA,CAAA;AAAA,IAC/B,CAAA;AAAA,GACF,CAAA;AACA,EAAO,OAAA,CAAC,QAAQ,GAAG,CAAA,CAAA;AACrB;;;;"}
1
+ {"version":3,"file":"use-rerender.js","sources":["../../src/utils/use-rerender.ts"],"sourcesContent":["import { useReducer } from \"react\";\n\n/**\n * Trigger a re-render programmatically, without changing the component's\n * state.\n *\n * @example\n * const rerender = useRerender();\n *\n * return (\n * <button onClick={rerender}>\n * {Math.random()}\n * </button>\n * )\n */\nexport function useRerender(): [() => void, number] {\n const [key, update] = useReducer(\n // This implementation works by incrementing a hidden counter value that is\n // never consumed. Simply incrementing the counter changes the component's\n // state and, thus, trigger a re-render.\n (key: number): number => key + 1,\n 0\n );\n return [update, key];\n}\n"],"names":["key"],"mappings":";;AAeO,SAAS,WAAoC,GAAA;AAClD,EAAM,MAAA,CAAC,GAAK,EAAA,MAAM,CAAI,GAAA,UAAA;AAAA;AAAA;AAAA;AAAA,IAIpB,CAACA,SAAwBA,IAAM,GAAA,CAAA;AAAA,IAC/B,CAAA;AAAA,GACF,CAAA;AACA,EAAO,OAAA,CAAC,QAAQ,GAAG,CAAA,CAAA;AACrB;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-visible.cjs","sources":["../../src/utils/use-visible.ts"],"sourcesContent":["import { useLatest } from \"@liveblocks/react/_private\";\nimport { type RefObject, useEffect, useState } from \"react\";\n\ninterface ObserveOptions {\n rootMargin?: string | number;\n root?: RefObject<Element>;\n threshold?: number | number[];\n}\n\ninterface Options extends ObserveOptions {\n enabled?: boolean;\n}\n\ninterface VisibleOptions<T = boolean> extends Options {\n initialValue?: T;\n}\n\ntype IntersectionObserverSingleCallback = (\n entry: IntersectionObserverEntry\n) => void;\n\nlet optionlessIntersectionObserver: IntersectionObserver | undefined;\nconst optionlessIntersectionCallbacks = new WeakMap<\n Element,\n IntersectionObserverSingleCallback\n>();\n\nconst individualIntersectionObservers = new WeakMap<\n Element,\n IntersectionObserver\n>();\n\nfunction observe(\n element: Element,\n callback: IntersectionObserverSingleCallback,\n options?: ObserveOptions\n) {\n // Observers without options share a common IntersectionObserver instance, ones with options have their own\n if (!options) {\n if (!optionlessIntersectionObserver) {\n optionlessIntersectionObserver = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const callback = optionlessIntersectionCallbacks.get(entry.target);\n\n callback?.(entry);\n }\n });\n }\n\n optionlessIntersectionCallbacks.set(element, callback);\n optionlessIntersectionObserver.observe(element);\n } else {\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n callback?.(entry);\n }\n },\n {\n root: options.root?.current,\n rootMargin:\n typeof options.rootMargin === \"number\"\n ? `${options.rootMargin}px`\n : options.rootMargin,\n threshold: options.threshold,\n }\n );\n\n individualIntersectionObservers.set(element, observer);\n observer.observe(element);\n }\n}\n\nfunction unobserve(element: Element, options?: ObserveOptions) {\n if (!options) {\n optionlessIntersectionCallbacks.delete(element);\n optionlessIntersectionObserver?.unobserve(element);\n } else {\n const observer = individualIntersectionObservers.get(element);\n\n observer?.unobserve(element);\n individualIntersectionObservers.delete(element);\n }\n}\n\n/**\n * Observe when an element enters or exits the viewport.\n *\n * If you only need to get a stateful visibility value, use the higher level hook `useVisible` instead.\n */\nexport function useIntersectionCallback(\n ref: RefObject<Element>,\n callback: (isIntersecting: boolean, entry: IntersectionObserverEntry) => void,\n options?: Options\n) {\n const enabled = options?.enabled ?? true;\n const latestCallback = useLatest(callback);\n const { root, rootMargin, threshold } = options ?? {};\n\n useEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n const observeOptions: ObserveOptions = {\n root,\n rootMargin,\n threshold,\n };\n\n if (enabled) {\n observe(\n element,\n (entry) => {\n // The intersection observer entry might be useful in some cases but the main information\n // is whether the element is intersecting or not so we pass that as the first argument.\n latestCallback.current(entry.isIntersecting, entry);\n },\n observeOptions\n );\n } else {\n unobserve(element, observeOptions);\n }\n\n return () => {\n unobserve(element, observeOptions);\n };\n }, [ref, enabled, latestCallback, root, rootMargin, threshold]);\n}\n\n/**\n * Observe whether an element is currently visible or not.\n */\nexport function useVisible<T extends boolean | null = boolean>(\n ref: RefObject<Element>,\n options?: VisibleOptions<T>\n) {\n const [isVisible, setVisible] = useState(\n options?.initialValue !== undefined ? options.initialValue : false\n );\n\n useIntersectionCallback(\n ref,\n (isIntersecting) => setVisible(isIntersecting),\n options\n );\n\n return isVisible;\n}\n"],"names":["callback","useLatest","useEffect","useState"],"mappings":"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"}
1
+ {"version":3,"file":"use-visible.cjs","sources":["../../src/utils/use-visible.ts"],"sourcesContent":["import { useLatest } from \"@liveblocks/react/_private\";\nimport { type RefObject, useEffect, useState } from \"react\";\n\ninterface ObserveOptions {\n rootMargin?: string | number;\n root?: RefObject<Element>;\n threshold?: number | number[];\n}\n\ninterface Options extends ObserveOptions {\n enabled?: boolean;\n}\n\ninterface VisibleOptions<T = boolean> extends Options {\n initialValue?: T;\n}\n\ntype IntersectionObserverSingleCallback = (\n entry: IntersectionObserverEntry\n) => void;\n\nlet optionlessIntersectionObserver: IntersectionObserver | undefined;\nconst optionlessIntersectionCallbacks = new WeakMap<\n Element,\n IntersectionObserverSingleCallback\n>();\n\nconst individualIntersectionObservers = new WeakMap<\n Element,\n IntersectionObserver\n>();\n\nfunction observe(\n element: Element,\n callback: IntersectionObserverSingleCallback,\n options?: ObserveOptions\n) {\n // Observers without options share a common IntersectionObserver instance, ones with options have their own\n if (!options) {\n if (!optionlessIntersectionObserver) {\n optionlessIntersectionObserver = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const callback = optionlessIntersectionCallbacks.get(entry.target);\n\n callback?.(entry);\n }\n });\n }\n\n optionlessIntersectionCallbacks.set(element, callback);\n optionlessIntersectionObserver.observe(element);\n } else {\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n callback?.(entry);\n }\n },\n {\n root: options.root?.current,\n rootMargin:\n typeof options.rootMargin === \"number\"\n ? `${options.rootMargin}px`\n : options.rootMargin,\n threshold: options.threshold,\n }\n );\n\n individualIntersectionObservers.set(element, observer);\n observer.observe(element);\n }\n}\n\nfunction unobserve(element: Element, options?: ObserveOptions) {\n if (!options) {\n optionlessIntersectionCallbacks.delete(element);\n optionlessIntersectionObserver?.unobserve(element);\n } else {\n const observer = individualIntersectionObservers.get(element);\n\n observer?.unobserve(element);\n individualIntersectionObservers.delete(element);\n }\n}\n\n/**\n * Observe when an element enters or exits the viewport.\n *\n * If you only need to get a stateful visibility value, use the higher level hook `useVisible` instead.\n */\nexport function useIntersectionCallback(\n ref: RefObject<Element>,\n callback: (isIntersecting: boolean, entry: IntersectionObserverEntry) => void,\n options?: Options\n) {\n const enabled = options?.enabled ?? true;\n const latestCallback = useLatest(callback);\n const { root, rootMargin, threshold } = options ?? {};\n\n useEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n const observeOptions: ObserveOptions = {\n root,\n rootMargin,\n threshold,\n };\n\n if (enabled) {\n observe(\n element,\n (entry) => {\n // The intersection observer entry might be useful in some cases but the main information\n // is whether the element is intersecting or not so we pass that as the first argument.\n latestCallback.current(entry.isIntersecting, entry);\n },\n observeOptions\n );\n } else {\n unobserve(element, observeOptions);\n }\n\n return () => {\n unobserve(element, observeOptions);\n };\n }, [ref, enabled, latestCallback, root, rootMargin, threshold]);\n}\n\n/**\n * Observe whether an element is currently visible or not.\n */\nexport function useVisible<T extends boolean | null = boolean>(\n ref: RefObject<Element>,\n options?: VisibleOptions<T>\n) {\n const [isVisible, setVisible] = useState(\n options?.initialValue !== undefined ? options.initialValue : false\n );\n\n useIntersectionCallback(\n ref,\n (isIntersecting) => setVisible(isIntersecting),\n options\n );\n\n return isVisible;\n}\n"],"names":["callback","useLatest","useEffect","useState"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-visible.js","sources":["../../src/utils/use-visible.ts"],"sourcesContent":["import { useLatest } from \"@liveblocks/react/_private\";\nimport { type RefObject, useEffect, useState } from \"react\";\n\ninterface ObserveOptions {\n rootMargin?: string | number;\n root?: RefObject<Element>;\n threshold?: number | number[];\n}\n\ninterface Options extends ObserveOptions {\n enabled?: boolean;\n}\n\ninterface VisibleOptions<T = boolean> extends Options {\n initialValue?: T;\n}\n\ntype IntersectionObserverSingleCallback = (\n entry: IntersectionObserverEntry\n) => void;\n\nlet optionlessIntersectionObserver: IntersectionObserver | undefined;\nconst optionlessIntersectionCallbacks = new WeakMap<\n Element,\n IntersectionObserverSingleCallback\n>();\n\nconst individualIntersectionObservers = new WeakMap<\n Element,\n IntersectionObserver\n>();\n\nfunction observe(\n element: Element,\n callback: IntersectionObserverSingleCallback,\n options?: ObserveOptions\n) {\n // Observers without options share a common IntersectionObserver instance, ones with options have their own\n if (!options) {\n if (!optionlessIntersectionObserver) {\n optionlessIntersectionObserver = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const callback = optionlessIntersectionCallbacks.get(entry.target);\n\n callback?.(entry);\n }\n });\n }\n\n optionlessIntersectionCallbacks.set(element, callback);\n optionlessIntersectionObserver.observe(element);\n } else {\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n callback?.(entry);\n }\n },\n {\n root: options.root?.current,\n rootMargin:\n typeof options.rootMargin === \"number\"\n ? `${options.rootMargin}px`\n : options.rootMargin,\n threshold: options.threshold,\n }\n );\n\n individualIntersectionObservers.set(element, observer);\n observer.observe(element);\n }\n}\n\nfunction unobserve(element: Element, options?: ObserveOptions) {\n if (!options) {\n optionlessIntersectionCallbacks.delete(element);\n optionlessIntersectionObserver?.unobserve(element);\n } else {\n const observer = individualIntersectionObservers.get(element);\n\n observer?.unobserve(element);\n individualIntersectionObservers.delete(element);\n }\n}\n\n/**\n * Observe when an element enters or exits the viewport.\n *\n * If you only need to get a stateful visibility value, use the higher level hook `useVisible` instead.\n */\nexport function useIntersectionCallback(\n ref: RefObject<Element>,\n callback: (isIntersecting: boolean, entry: IntersectionObserverEntry) => void,\n options?: Options\n) {\n const enabled = options?.enabled ?? true;\n const latestCallback = useLatest(callback);\n const { root, rootMargin, threshold } = options ?? {};\n\n useEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n const observeOptions: ObserveOptions = {\n root,\n rootMargin,\n threshold,\n };\n\n if (enabled) {\n observe(\n element,\n (entry) => {\n // The intersection observer entry might be useful in some cases but the main information\n // is whether the element is intersecting or not so we pass that as the first argument.\n latestCallback.current(entry.isIntersecting, entry);\n },\n observeOptions\n );\n } else {\n unobserve(element, observeOptions);\n }\n\n return () => {\n unobserve(element, observeOptions);\n };\n }, [ref, enabled, latestCallback, root, rootMargin, threshold]);\n}\n\n/**\n * Observe whether an element is currently visible or not.\n */\nexport function useVisible<T extends boolean | null = boolean>(\n ref: RefObject<Element>,\n options?: VisibleOptions<T>\n) {\n const [isVisible, setVisible] = useState(\n options?.initialValue !== undefined ? options.initialValue : false\n );\n\n useIntersectionCallback(\n ref,\n (isIntersecting) => setVisible(isIntersecting),\n options\n );\n\n return isVisible;\n}\n"],"names":["callback"],"mappings":"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"}
1
+ {"version":3,"file":"use-visible.js","sources":["../../src/utils/use-visible.ts"],"sourcesContent":["import { useLatest } from \"@liveblocks/react/_private\";\nimport { type RefObject, useEffect, useState } from \"react\";\n\ninterface ObserveOptions {\n rootMargin?: string | number;\n root?: RefObject<Element>;\n threshold?: number | number[];\n}\n\ninterface Options extends ObserveOptions {\n enabled?: boolean;\n}\n\ninterface VisibleOptions<T = boolean> extends Options {\n initialValue?: T;\n}\n\ntype IntersectionObserverSingleCallback = (\n entry: IntersectionObserverEntry\n) => void;\n\nlet optionlessIntersectionObserver: IntersectionObserver | undefined;\nconst optionlessIntersectionCallbacks = new WeakMap<\n Element,\n IntersectionObserverSingleCallback\n>();\n\nconst individualIntersectionObservers = new WeakMap<\n Element,\n IntersectionObserver\n>();\n\nfunction observe(\n element: Element,\n callback: IntersectionObserverSingleCallback,\n options?: ObserveOptions\n) {\n // Observers without options share a common IntersectionObserver instance, ones with options have their own\n if (!options) {\n if (!optionlessIntersectionObserver) {\n optionlessIntersectionObserver = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const callback = optionlessIntersectionCallbacks.get(entry.target);\n\n callback?.(entry);\n }\n });\n }\n\n optionlessIntersectionCallbacks.set(element, callback);\n optionlessIntersectionObserver.observe(element);\n } else {\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n callback?.(entry);\n }\n },\n {\n root: options.root?.current,\n rootMargin:\n typeof options.rootMargin === \"number\"\n ? `${options.rootMargin}px`\n : options.rootMargin,\n threshold: options.threshold,\n }\n );\n\n individualIntersectionObservers.set(element, observer);\n observer.observe(element);\n }\n}\n\nfunction unobserve(element: Element, options?: ObserveOptions) {\n if (!options) {\n optionlessIntersectionCallbacks.delete(element);\n optionlessIntersectionObserver?.unobserve(element);\n } else {\n const observer = individualIntersectionObservers.get(element);\n\n observer?.unobserve(element);\n individualIntersectionObservers.delete(element);\n }\n}\n\n/**\n * Observe when an element enters or exits the viewport.\n *\n * If you only need to get a stateful visibility value, use the higher level hook `useVisible` instead.\n */\nexport function useIntersectionCallback(\n ref: RefObject<Element>,\n callback: (isIntersecting: boolean, entry: IntersectionObserverEntry) => void,\n options?: Options\n) {\n const enabled = options?.enabled ?? true;\n const latestCallback = useLatest(callback);\n const { root, rootMargin, threshold } = options ?? {};\n\n useEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n const observeOptions: ObserveOptions = {\n root,\n rootMargin,\n threshold,\n };\n\n if (enabled) {\n observe(\n element,\n (entry) => {\n // The intersection observer entry might be useful in some cases but the main information\n // is whether the element is intersecting or not so we pass that as the first argument.\n latestCallback.current(entry.isIntersecting, entry);\n },\n observeOptions\n );\n } else {\n unobserve(element, observeOptions);\n }\n\n return () => {\n unobserve(element, observeOptions);\n };\n }, [ref, enabled, latestCallback, root, rootMargin, threshold]);\n}\n\n/**\n * Observe whether an element is currently visible or not.\n */\nexport function useVisible<T extends boolean | null = boolean>(\n ref: RefObject<Element>,\n options?: VisibleOptions<T>\n) {\n const [isVisible, setVisible] = useState(\n options?.initialValue !== undefined ? options.initialValue : false\n );\n\n useIntersectionCallback(\n ref,\n (isIntersecting) => setVisible(isIntersecting),\n options\n );\n\n return isVisible;\n}\n"],"names":["callback"],"mappings":"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"}
package/dist/version.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const PKG_NAME = "@liveblocks/react-ui";
4
- const PKG_VERSION = typeof "3.9.1-tiptap1" === "string" && "3.9.1-tiptap1";
4
+ const PKG_VERSION = typeof "3.9.2-tiptap1" === "string" && "3.9.2-tiptap1";
5
5
  const PKG_FORMAT = typeof "cjs" === "string" && "cjs";
6
6
 
7
7
  exports.PKG_FORMAT = PKG_FORMAT;
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const PKG_NAME = "@liveblocks/react-ui";
2
- const PKG_VERSION = typeof "3.9.1-tiptap1" === "string" && "3.9.1-tiptap1";
2
+ const PKG_VERSION = typeof "3.9.2-tiptap1" === "string" && "3.9.2-tiptap1";
3
3
  const PKG_FORMAT = typeof "esm" === "string" && "esm";
4
4
 
5
5
  export { PKG_FORMAT, PKG_NAME, PKG_VERSION };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liveblocks/react-ui",
3
- "version": "3.9.1-tiptap1",
3
+ "version": "3.9.2-tiptap1",
4
4
  "description": "A set of React pre-built components for the Liveblocks products. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -76,9 +76,9 @@
76
76
  },
77
77
  "dependencies": {
78
78
  "@floating-ui/react-dom": "^2.1.2",
79
- "@liveblocks/client": "3.9.1-tiptap1",
80
- "@liveblocks/core": "3.9.1-tiptap1",
81
- "@liveblocks/react": "3.9.1-tiptap1",
79
+ "@liveblocks/client": "3.9.2-tiptap1",
80
+ "@liveblocks/core": "3.9.2-tiptap1",
81
+ "@liveblocks/react": "3.9.2-tiptap1",
82
82
  "@radix-ui/react-dropdown-menu": "^2.1.2",
83
83
  "@radix-ui/react-popover": "^1.1.2",
84
84
  "@radix-ui/react-slot": "^1.1.0",