@fragments-sdk/ui 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (656) hide show
  1. package/dist/assets/ui.css +1642 -1679
  2. package/dist/chart.cjs.map +1 -1
  3. package/dist/chart.js.map +1 -1
  4. package/dist/codeblock.cjs +26 -18
  5. package/dist/codeblock.cjs.map +1 -1
  6. package/dist/codeblock.js +26 -18
  7. package/dist/codeblock.js.map +1 -1
  8. package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
  9. package/dist/components/Accordion/Accordion.module.scss.js +8 -8
  10. package/dist/components/Accordion/index.cjs +7 -3
  11. package/dist/components/Accordion/index.cjs.map +1 -1
  12. package/dist/components/Accordion/index.d.ts +24 -11
  13. package/dist/components/Accordion/index.d.ts.map +1 -1
  14. package/dist/components/Accordion/index.js +7 -3
  15. package/dist/components/Accordion/index.js.map +1 -1
  16. package/dist/components/Alert/Alert.module.scss.cjs +12 -12
  17. package/dist/components/Alert/Alert.module.scss.js +12 -12
  18. package/dist/components/Alert/index.cjs +37 -15
  19. package/dist/components/Alert/index.cjs.map +1 -1
  20. package/dist/components/Alert/index.d.ts +15 -22
  21. package/dist/components/Alert/index.d.ts.map +1 -1
  22. package/dist/components/Alert/index.js +37 -15
  23. package/dist/components/Alert/index.js.map +1 -1
  24. package/dist/components/AppShell/AppShell.module.scss.cjs +14 -14
  25. package/dist/components/AppShell/AppShell.module.scss.js +14 -14
  26. package/dist/components/AppShell/index.cjs +3 -1
  27. package/dist/components/AppShell/index.cjs.map +1 -1
  28. package/dist/components/AppShell/index.d.ts.map +1 -1
  29. package/dist/components/AppShell/index.js +3 -1
  30. package/dist/components/AppShell/index.js.map +1 -1
  31. package/dist/components/Avatar/index.cjs +9 -1
  32. package/dist/components/Avatar/index.cjs.map +1 -1
  33. package/dist/components/Avatar/index.d.ts +2 -0
  34. package/dist/components/Avatar/index.d.ts.map +1 -1
  35. package/dist/components/Avatar/index.js +9 -1
  36. package/dist/components/Avatar/index.js.map +1 -1
  37. package/dist/components/Badge/index.cjs +4 -2
  38. package/dist/components/Badge/index.cjs.map +1 -1
  39. package/dist/components/Badge/index.d.ts +3 -0
  40. package/dist/components/Badge/index.d.ts.map +1 -1
  41. package/dist/components/Badge/index.js +4 -2
  42. package/dist/components/Badge/index.js.map +1 -1
  43. package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +11 -11
  44. package/dist/components/BentoGrid/BentoGrid.module.scss.js +11 -11
  45. package/dist/components/BentoGrid/index.cjs +8 -5
  46. package/dist/components/BentoGrid/index.cjs.map +1 -1
  47. package/dist/components/BentoGrid/index.d.ts +2 -8
  48. package/dist/components/BentoGrid/index.d.ts.map +1 -1
  49. package/dist/components/BentoGrid/index.js +8 -5
  50. package/dist/components/BentoGrid/index.js.map +1 -1
  51. package/dist/components/Box/index.cjs +12 -2
  52. package/dist/components/Box/index.cjs.map +1 -1
  53. package/dist/components/Box/index.d.ts +1 -1
  54. package/dist/components/Box/index.d.ts.map +1 -1
  55. package/dist/components/Box/index.js +12 -2
  56. package/dist/components/Box/index.js.map +1 -1
  57. package/dist/components/Breadcrumbs/index.cjs +3 -1
  58. package/dist/components/Breadcrumbs/index.cjs.map +1 -1
  59. package/dist/components/Breadcrumbs/index.d.ts +3 -1
  60. package/dist/components/Breadcrumbs/index.d.ts.map +1 -1
  61. package/dist/components/Breadcrumbs/index.js +3 -1
  62. package/dist/components/Breadcrumbs/index.js.map +1 -1
  63. package/dist/components/Button/Button.module.scss.cjs +11 -11
  64. package/dist/components/Button/Button.module.scss.js +11 -11
  65. package/dist/components/Button/index.cjs +5 -2
  66. package/dist/components/Button/index.cjs.map +1 -1
  67. package/dist/components/Button/index.d.ts +3 -3
  68. package/dist/components/Button/index.d.ts.map +1 -1
  69. package/dist/components/Button/index.js +5 -2
  70. package/dist/components/Button/index.js.map +1 -1
  71. package/dist/components/ButtonGroup/index.cjs +3 -2
  72. package/dist/components/ButtonGroup/index.cjs.map +1 -1
  73. package/dist/components/ButtonGroup/index.d.ts +1 -2
  74. package/dist/components/ButtonGroup/index.d.ts.map +1 -1
  75. package/dist/components/ButtonGroup/index.js +3 -2
  76. package/dist/components/ButtonGroup/index.js.map +1 -1
  77. package/dist/components/Card/Card.module.scss.cjs +14 -14
  78. package/dist/components/Card/Card.module.scss.js +14 -14
  79. package/dist/components/Card/index.cjs +3 -22
  80. package/dist/components/Card/index.cjs.map +1 -1
  81. package/dist/components/Card/index.d.ts +6 -11
  82. package/dist/components/Card/index.d.ts.map +1 -1
  83. package/dist/components/Card/index.js +3 -22
  84. package/dist/components/Card/index.js.map +1 -1
  85. package/dist/components/Chart/Chart.module.scss.cjs +15 -15
  86. package/dist/components/Chart/Chart.module.scss.js +15 -15
  87. package/dist/components/Chart/index.d.ts +3 -3
  88. package/dist/components/Chart/index.d.ts.map +1 -1
  89. package/dist/components/Checkbox/Checkbox.module.scss.cjs +10 -10
  90. package/dist/components/Checkbox/Checkbox.module.scss.js +10 -10
  91. package/dist/components/Checkbox/index.cjs +11 -4
  92. package/dist/components/Checkbox/index.cjs.map +1 -1
  93. package/dist/components/Checkbox/index.d.ts +6 -0
  94. package/dist/components/Checkbox/index.d.ts.map +1 -1
  95. package/dist/components/Checkbox/index.js +11 -4
  96. package/dist/components/Checkbox/index.js.map +1 -1
  97. package/dist/components/Chip/index.cjs +11 -3
  98. package/dist/components/Chip/index.cjs.map +1 -1
  99. package/dist/components/Chip/index.d.ts +1 -2
  100. package/dist/components/Chip/index.d.ts.map +1 -1
  101. package/dist/components/Chip/index.js +11 -3
  102. package/dist/components/Chip/index.js.map +1 -1
  103. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +20 -20
  104. package/dist/components/CodeBlock/CodeBlock.module.scss.js +20 -20
  105. package/dist/components/CodeBlock/index.d.ts +8 -2
  106. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  107. package/dist/components/Collapsible/Collapsible.module.scss.cjs +10 -10
  108. package/dist/components/Collapsible/Collapsible.module.scss.js +10 -10
  109. package/dist/components/Combobox/Combobox.module.scss.cjs +15 -15
  110. package/dist/components/Combobox/Combobox.module.scss.js +15 -15
  111. package/dist/components/Combobox/index.cjs +68 -18
  112. package/dist/components/Combobox/index.cjs.map +1 -1
  113. package/dist/components/Combobox/index.d.ts +32 -11
  114. package/dist/components/Combobox/index.d.ts.map +1 -1
  115. package/dist/components/Combobox/index.js +68 -18
  116. package/dist/components/Combobox/index.js.map +1 -1
  117. package/dist/components/Command/Command.module.scss.cjs +11 -11
  118. package/dist/components/Command/Command.module.scss.js +11 -11
  119. package/dist/components/Command/index.cjs +4 -4
  120. package/dist/components/Command/index.cjs.map +1 -1
  121. package/dist/components/Command/index.d.ts +1 -1
  122. package/dist/components/Command/index.d.ts.map +1 -1
  123. package/dist/components/Command/index.js +4 -4
  124. package/dist/components/Command/index.js.map +1 -1
  125. package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
  126. package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
  127. package/dist/components/ConversationList/index.cjs +6 -3
  128. package/dist/components/ConversationList/index.cjs.map +1 -1
  129. package/dist/components/ConversationList/index.d.ts +1 -1
  130. package/dist/components/ConversationList/index.d.ts.map +1 -1
  131. package/dist/components/ConversationList/index.js +6 -3
  132. package/dist/components/ConversationList/index.js.map +1 -1
  133. package/dist/components/DataTable/DataTable.module.scss.cjs +26 -26
  134. package/dist/components/DataTable/DataTable.module.scss.js +26 -26
  135. package/dist/components/DataTable/index.cjs +13 -4
  136. package/dist/components/DataTable/index.cjs.map +1 -1
  137. package/dist/components/DataTable/index.d.ts +7 -2
  138. package/dist/components/DataTable/index.d.ts.map +1 -1
  139. package/dist/components/DataTable/index.js +13 -4
  140. package/dist/components/DataTable/index.js.map +1 -1
  141. package/dist/components/DatePicker/DatePicker.module.scss.cjs +26 -26
  142. package/dist/components/DatePicker/DatePicker.module.scss.js +26 -26
  143. package/dist/components/DatePicker/index.d.ts +2 -2
  144. package/dist/components/DatePicker/index.d.ts.map +1 -1
  145. package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
  146. package/dist/components/Dialog/Dialog.module.scss.js +14 -14
  147. package/dist/components/Dialog/index.cjs +2 -1
  148. package/dist/components/Dialog/index.cjs.map +1 -1
  149. package/dist/components/Dialog/index.d.ts +20 -7
  150. package/dist/components/Dialog/index.d.ts.map +1 -1
  151. package/dist/components/Dialog/index.js +2 -1
  152. package/dist/components/Dialog/index.js.map +1 -1
  153. package/dist/components/Drawer/Drawer.module.scss.cjs +26 -26
  154. package/dist/components/Drawer/Drawer.module.scss.js +26 -26
  155. package/dist/components/Drawer/index.cjs +30 -3
  156. package/dist/components/Drawer/index.cjs.map +1 -1
  157. package/dist/components/Drawer/index.d.ts +3 -1
  158. package/dist/components/Drawer/index.d.ts.map +1 -1
  159. package/dist/components/Drawer/index.js +13 -3
  160. package/dist/components/Drawer/index.js.map +1 -1
  161. package/dist/components/Editor/Editor.module.scss.cjs +17 -17
  162. package/dist/components/Editor/Editor.module.scss.js +17 -17
  163. package/dist/components/Editor/index.cjs +32 -7
  164. package/dist/components/Editor/index.cjs.map +1 -1
  165. package/dist/components/Editor/index.d.ts +16 -3
  166. package/dist/components/Editor/index.d.ts.map +1 -1
  167. package/dist/components/Editor/index.js +32 -7
  168. package/dist/components/Editor/index.js.map +1 -1
  169. package/dist/components/EmptyState/EmptyState.module.scss.cjs +8 -8
  170. package/dist/components/EmptyState/EmptyState.module.scss.js +8 -8
  171. package/dist/components/EmptyState/index.cjs +12 -8
  172. package/dist/components/EmptyState/index.cjs.map +1 -1
  173. package/dist/components/EmptyState/index.d.ts +8 -12
  174. package/dist/components/EmptyState/index.d.ts.map +1 -1
  175. package/dist/components/EmptyState/index.js +12 -8
  176. package/dist/components/EmptyState/index.js.map +1 -1
  177. package/dist/components/Fieldset/index.cjs +2 -2
  178. package/dist/components/Fieldset/index.cjs.map +1 -1
  179. package/dist/components/Fieldset/index.d.ts +2 -3
  180. package/dist/components/Fieldset/index.d.ts.map +1 -1
  181. package/dist/components/Fieldset/index.js +2 -2
  182. package/dist/components/Fieldset/index.js.map +1 -1
  183. package/dist/components/Form/index.cjs +13 -13
  184. package/dist/components/Form/index.cjs.map +1 -1
  185. package/dist/components/Form/index.d.ts +5 -2
  186. package/dist/components/Form/index.d.ts.map +1 -1
  187. package/dist/components/Form/index.js +13 -13
  188. package/dist/components/Form/index.js.map +1 -1
  189. package/dist/components/Grid/Grid.module.scss.cjs +57 -57
  190. package/dist/components/Grid/Grid.module.scss.js +57 -57
  191. package/dist/components/Grid/index.cjs +7 -4
  192. package/dist/components/Grid/index.cjs.map +1 -1
  193. package/dist/components/Grid/index.d.ts +5 -3
  194. package/dist/components/Grid/index.d.ts.map +1 -1
  195. package/dist/components/Grid/index.js +7 -4
  196. package/dist/components/Grid/index.js.map +1 -1
  197. package/dist/components/Header/Header.module.scss.cjs +21 -21
  198. package/dist/components/Header/Header.module.scss.js +21 -21
  199. package/dist/components/Header/index.cjs +61 -23
  200. package/dist/components/Header/index.cjs.map +1 -1
  201. package/dist/components/Header/index.d.ts +27 -34
  202. package/dist/components/Header/index.d.ts.map +1 -1
  203. package/dist/components/Header/index.js +61 -23
  204. package/dist/components/Header/index.js.map +1 -1
  205. package/dist/components/Icon/index.cjs +11 -1
  206. package/dist/components/Icon/index.cjs.map +1 -1
  207. package/dist/components/Icon/index.d.ts +28 -9
  208. package/dist/components/Icon/index.d.ts.map +1 -1
  209. package/dist/components/Icon/index.js +11 -1
  210. package/dist/components/Icon/index.js.map +1 -1
  211. package/dist/components/Image/index.cjs +15 -4
  212. package/dist/components/Image/index.cjs.map +1 -1
  213. package/dist/components/Image/index.d.ts +7 -1
  214. package/dist/components/Image/index.d.ts.map +1 -1
  215. package/dist/components/Image/index.js +15 -4
  216. package/dist/components/Image/index.js.map +1 -1
  217. package/dist/components/Input/Input.module.scss.cjs +13 -13
  218. package/dist/components/Input/Input.module.scss.js +13 -13
  219. package/dist/components/Input/index.cjs +79 -31
  220. package/dist/components/Input/index.cjs.map +1 -1
  221. package/dist/components/Input/index.d.ts +17 -3
  222. package/dist/components/Input/index.d.ts.map +1 -1
  223. package/dist/components/Input/index.js +79 -31
  224. package/dist/components/Input/index.js.map +1 -1
  225. package/dist/components/Link/index.cjs +17 -0
  226. package/dist/components/Link/index.cjs.map +1 -1
  227. package/dist/components/Link/index.d.ts.map +1 -1
  228. package/dist/components/Link/index.js +17 -0
  229. package/dist/components/Link/index.js.map +1 -1
  230. package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
  231. package/dist/components/Listbox/Listbox.module.scss.js +8 -8
  232. package/dist/components/Listbox/index.cjs +10 -6
  233. package/dist/components/Listbox/index.cjs.map +1 -1
  234. package/dist/components/Listbox/index.d.ts +2 -2
  235. package/dist/components/Listbox/index.d.ts.map +1 -1
  236. package/dist/components/Listbox/index.js +10 -6
  237. package/dist/components/Listbox/index.js.map +1 -1
  238. package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
  239. package/dist/components/Markdown/Markdown.module.scss.js +1 -1
  240. package/dist/components/Markdown/index.d.ts +4 -2
  241. package/dist/components/Markdown/index.d.ts.map +1 -1
  242. package/dist/components/Menu/Menu.module.scss.cjs +13 -13
  243. package/dist/components/Menu/Menu.module.scss.js +13 -13
  244. package/dist/components/Menu/index.cjs +12 -1
  245. package/dist/components/Menu/index.cjs.map +1 -1
  246. package/dist/components/Menu/index.d.ts +9 -4
  247. package/dist/components/Menu/index.d.ts.map +1 -1
  248. package/dist/components/Menu/index.js +12 -1
  249. package/dist/components/Menu/index.js.map +1 -1
  250. package/dist/components/Message/Message.module.scss.cjs +18 -18
  251. package/dist/components/Message/Message.module.scss.js +18 -18
  252. package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +28 -28
  253. package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +28 -28
  254. package/dist/components/NavigationMenu/NavigationMenuContext.cjs.map +1 -1
  255. package/dist/components/NavigationMenu/NavigationMenuContext.d.ts +8 -0
  256. package/dist/components/NavigationMenu/NavigationMenuContext.d.ts.map +1 -1
  257. package/dist/components/NavigationMenu/NavigationMenuContext.js.map +1 -1
  258. package/dist/components/NavigationMenu/index.cjs +49 -10
  259. package/dist/components/NavigationMenu/index.cjs.map +1 -1
  260. package/dist/components/NavigationMenu/index.d.ts +5 -1
  261. package/dist/components/NavigationMenu/index.d.ts.map +1 -1
  262. package/dist/components/NavigationMenu/index.js +49 -10
  263. package/dist/components/NavigationMenu/index.js.map +1 -1
  264. package/dist/components/Pagination/index.cjs +37 -9
  265. package/dist/components/Pagination/index.cjs.map +1 -1
  266. package/dist/components/Pagination/index.d.ts +2 -3
  267. package/dist/components/Pagination/index.d.ts.map +1 -1
  268. package/dist/components/Pagination/index.js +37 -9
  269. package/dist/components/Pagination/index.js.map +1 -1
  270. package/dist/components/Popover/Popover.module.scss.cjs +10 -10
  271. package/dist/components/Popover/Popover.module.scss.js +10 -10
  272. package/dist/components/Popover/index.cjs +43 -2
  273. package/dist/components/Popover/index.cjs.map +1 -1
  274. package/dist/components/Popover/index.d.ts +16 -6
  275. package/dist/components/Popover/index.d.ts.map +1 -1
  276. package/dist/components/Popover/index.js +26 -2
  277. package/dist/components/Popover/index.js.map +1 -1
  278. package/dist/components/Progress/index.cjs +3 -1
  279. package/dist/components/Progress/index.cjs.map +1 -1
  280. package/dist/components/Progress/index.d.ts.map +1 -1
  281. package/dist/components/Progress/index.js +3 -1
  282. package/dist/components/Progress/index.js.map +1 -1
  283. package/dist/components/Prompt/Prompt.module.scss.cjs +14 -14
  284. package/dist/components/Prompt/Prompt.module.scss.js +14 -14
  285. package/dist/components/Prompt/index.cjs +14 -2
  286. package/dist/components/Prompt/index.cjs.map +1 -1
  287. package/dist/components/Prompt/index.d.ts +8 -5
  288. package/dist/components/Prompt/index.d.ts.map +1 -1
  289. package/dist/components/Prompt/index.js +14 -2
  290. package/dist/components/Prompt/index.js.map +1 -1
  291. package/dist/components/RadioGroup/index.cjs +14 -6
  292. package/dist/components/RadioGroup/index.cjs.map +1 -1
  293. package/dist/components/RadioGroup/index.d.ts +12 -2
  294. package/dist/components/RadioGroup/index.d.ts.map +1 -1
  295. package/dist/components/RadioGroup/index.js +14 -6
  296. package/dist/components/RadioGroup/index.js.map +1 -1
  297. package/dist/components/Select/Select.module.scss.cjs +10 -10
  298. package/dist/components/Select/Select.module.scss.js +10 -10
  299. package/dist/components/Select/index.cjs +37 -24
  300. package/dist/components/Select/index.cjs.map +1 -1
  301. package/dist/components/Select/index.d.ts +6 -2
  302. package/dist/components/Select/index.d.ts.map +1 -1
  303. package/dist/components/Select/index.js +37 -24
  304. package/dist/components/Select/index.js.map +1 -1
  305. package/dist/components/Sidebar/Sidebar.module.scss.cjs +42 -42
  306. package/dist/components/Sidebar/Sidebar.module.scss.js +42 -42
  307. package/dist/components/Sidebar/index.cjs +2 -2
  308. package/dist/components/Sidebar/index.cjs.map +1 -1
  309. package/dist/components/Sidebar/index.d.ts +3 -3
  310. package/dist/components/Sidebar/index.d.ts.map +1 -1
  311. package/dist/components/Sidebar/index.js +2 -2
  312. package/dist/components/Sidebar/index.js.map +1 -1
  313. package/dist/components/Skeleton/index.cjs +6 -3
  314. package/dist/components/Skeleton/index.cjs.map +1 -1
  315. package/dist/components/Skeleton/index.d.ts +3 -7
  316. package/dist/components/Skeleton/index.d.ts.map +1 -1
  317. package/dist/components/Skeleton/index.js +6 -3
  318. package/dist/components/Skeleton/index.js.map +1 -1
  319. package/dist/components/Slider/Slider.module.scss.cjs +13 -10
  320. package/dist/components/Slider/Slider.module.scss.cjs.map +1 -1
  321. package/dist/components/Slider/Slider.module.scss.js +13 -10
  322. package/dist/components/Slider/Slider.module.scss.js.map +1 -1
  323. package/dist/components/Slider/index.cjs +33 -1
  324. package/dist/components/Slider/index.cjs.map +1 -1
  325. package/dist/components/Slider/index.d.ts +2 -0
  326. package/dist/components/Slider/index.d.ts.map +1 -1
  327. package/dist/components/Slider/index.js +33 -1
  328. package/dist/components/Slider/index.js.map +1 -1
  329. package/dist/components/Stack/index.cjs +12 -2
  330. package/dist/components/Stack/index.cjs.map +1 -1
  331. package/dist/components/Stack/index.d.ts +3 -2
  332. package/dist/components/Stack/index.d.ts.map +1 -1
  333. package/dist/components/Stack/index.js +12 -2
  334. package/dist/components/Stack/index.js.map +1 -1
  335. package/dist/components/Table/Table.module.scss.cjs +16 -16
  336. package/dist/components/Table/Table.module.scss.js +16 -16
  337. package/dist/components/Table/index.d.ts +10 -4
  338. package/dist/components/Table/index.d.ts.map +1 -1
  339. package/dist/components/TableOfContents/index.cjs +8 -5
  340. package/dist/components/TableOfContents/index.cjs.map +1 -1
  341. package/dist/components/TableOfContents/index.d.ts +2 -2
  342. package/dist/components/TableOfContents/index.d.ts.map +1 -1
  343. package/dist/components/TableOfContents/index.js +8 -5
  344. package/dist/components/TableOfContents/index.js.map +1 -1
  345. package/dist/components/Tabs/Tabs.module.scss.cjs +9 -9
  346. package/dist/components/Tabs/Tabs.module.scss.js +9 -9
  347. package/dist/components/Tabs/index.cjs +9 -6
  348. package/dist/components/Tabs/index.cjs.map +1 -1
  349. package/dist/components/Tabs/index.d.ts +4 -1
  350. package/dist/components/Tabs/index.d.ts.map +1 -1
  351. package/dist/components/Tabs/index.js +9 -6
  352. package/dist/components/Tabs/index.js.map +1 -1
  353. package/dist/components/Textarea/index.cjs +61 -43
  354. package/dist/components/Textarea/index.cjs.map +1 -1
  355. package/dist/components/Textarea/index.d.ts +9 -1
  356. package/dist/components/Textarea/index.d.ts.map +1 -1
  357. package/dist/components/Textarea/index.js +61 -43
  358. package/dist/components/Textarea/index.js.map +1 -1
  359. package/dist/components/Theme/index.cjs +3 -1
  360. package/dist/components/Theme/index.cjs.map +1 -1
  361. package/dist/components/Theme/index.d.ts +2 -4
  362. package/dist/components/Theme/index.d.ts.map +1 -1
  363. package/dist/components/Theme/index.js +3 -1
  364. package/dist/components/Theme/index.js.map +1 -1
  365. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +22 -22
  366. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +22 -22
  367. package/dist/components/Toast/Toast.module.scss.cjs +20 -20
  368. package/dist/components/Toast/Toast.module.scss.js +20 -20
  369. package/dist/components/Toast/index.cjs +15 -14
  370. package/dist/components/Toast/index.cjs.map +1 -1
  371. package/dist/components/Toast/index.d.ts +9 -5
  372. package/dist/components/Toast/index.d.ts.map +1 -1
  373. package/dist/components/Toast/index.js +15 -14
  374. package/dist/components/Toast/index.js.map +1 -1
  375. package/dist/components/Toggle/Toggle.module.scss.cjs +11 -11
  376. package/dist/components/Toggle/Toggle.module.scss.js +11 -11
  377. package/dist/components/Toggle/index.cjs +1 -1
  378. package/dist/components/Toggle/index.cjs.map +1 -1
  379. package/dist/components/Toggle/index.js +1 -1
  380. package/dist/components/Toggle/index.js.map +1 -1
  381. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +17 -17
  382. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +17 -17
  383. package/dist/components/ToggleGroup/index.cjs +27 -8
  384. package/dist/components/ToggleGroup/index.cjs.map +1 -1
  385. package/dist/components/ToggleGroup/index.d.ts +8 -3
  386. package/dist/components/ToggleGroup/index.d.ts.map +1 -1
  387. package/dist/components/ToggleGroup/index.js +27 -8
  388. package/dist/components/ToggleGroup/index.js.map +1 -1
  389. package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
  390. package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
  391. package/dist/components/Tooltip/index.cjs +20 -4
  392. package/dist/components/Tooltip/index.cjs.map +1 -1
  393. package/dist/components/Tooltip/index.d.ts +3 -1
  394. package/dist/components/Tooltip/index.d.ts.map +1 -1
  395. package/dist/components/Tooltip/index.js +20 -4
  396. package/dist/components/Tooltip/index.js.map +1 -1
  397. package/dist/components/VisuallyHidden/index.cjs +10 -2
  398. package/dist/components/VisuallyHidden/index.cjs.map +1 -1
  399. package/dist/components/VisuallyHidden/index.d.ts +1 -1
  400. package/dist/components/VisuallyHidden/index.d.ts.map +1 -1
  401. package/dist/components/VisuallyHidden/index.js +10 -2
  402. package/dist/components/VisuallyHidden/index.js.map +1 -1
  403. package/dist/datepicker.cjs +8 -1
  404. package/dist/datepicker.cjs.map +1 -1
  405. package/dist/datepicker.js +8 -1
  406. package/dist/datepicker.js.map +1 -1
  407. package/dist/index.cjs.map +1 -1
  408. package/dist/index.d.ts +2 -1
  409. package/dist/index.d.ts.map +1 -1
  410. package/dist/index.js.map +1 -1
  411. package/dist/markdown.cjs +5 -5
  412. package/dist/markdown.cjs.map +1 -1
  413. package/dist/markdown.js +5 -5
  414. package/dist/markdown.js.map +1 -1
  415. package/dist/table.cjs +19 -3
  416. package/dist/table.cjs.map +1 -1
  417. package/dist/table.js +19 -3
  418. package/dist/table.js.map +1 -1
  419. package/fragments.json +1 -1
  420. package/package.json +2 -2
  421. package/src/blocks/AccountSettings.block.ts +1 -1
  422. package/src/blocks/ActivityFeed.block.ts +1 -1
  423. package/src/blocks/ActivityFeedSkeleton.block.ts +1 -1
  424. package/src/blocks/BlogEditor.block.ts +1 -1
  425. package/src/blocks/ChatInterface.block.ts +1 -1
  426. package/src/blocks/ChatMessages.block.ts +1 -1
  427. package/src/blocks/CheckoutForm.block.ts +1 -1
  428. package/src/blocks/CommandPalette.block.ts +1 -1
  429. package/src/blocks/ContactForm.block.ts +1 -1
  430. package/src/blocks/DashboardLayout.block.ts +1 -1
  431. package/src/blocks/DashboardPage.block.ts +1 -1
  432. package/src/blocks/DashboardSkeleton.block.ts +1 -1
  433. package/src/blocks/DataTable.block.ts +1 -1
  434. package/src/blocks/EmptyState.block.ts +1 -1
  435. package/src/blocks/FAQSection.block.ts +1 -1
  436. package/src/blocks/FeatureGrid.block.ts +1 -1
  437. package/src/blocks/HeroSection.block.ts +1 -1
  438. package/src/blocks/LoginForm.block.ts +1 -1
  439. package/src/blocks/NavigationHeader.block.ts +1 -1
  440. package/src/blocks/PaginatedTable.block.ts +1 -1
  441. package/src/blocks/PricingComparison.block.ts +1 -1
  442. package/src/blocks/ProductCard.block.ts +1 -1
  443. package/src/blocks/RegistrationForm.block.ts +1 -1
  444. package/src/blocks/SettingsDrawer.block.ts +1 -1
  445. package/src/blocks/SettingsPanel.block.ts +1 -1
  446. package/src/blocks/ShoppingCart.block.ts +1 -1
  447. package/src/blocks/StatsCard.block.ts +1 -1
  448. package/src/blocks/StatsCardSkeleton.block.ts +1 -1
  449. package/src/blocks/TableSkeleton.block.ts +1 -1
  450. package/src/blocks/ThinkingStates.block.ts +1 -1
  451. package/src/components/Accordion/Accordion.fragment.tsx +7 -7
  452. package/src/components/Accordion/Accordion.module.scss +2 -2
  453. package/src/components/Accordion/Accordion.test.tsx +8 -5
  454. package/src/components/Accordion/index.tsx +33 -13
  455. package/src/components/Alert/Alert.fragment.tsx +5 -1
  456. package/src/components/Alert/Alert.module.scss +1 -1
  457. package/src/components/Alert/Alert.test.tsx +25 -0
  458. package/src/components/Alert/index.tsx +49 -30
  459. package/src/components/AppShell/AppShell.fragment.tsx +1 -1
  460. package/src/components/AppShell/AppShell.module.scss +5 -5
  461. package/src/components/AppShell/AppShell.test.tsx +12 -0
  462. package/src/components/AppShell/index.tsx +2 -0
  463. package/src/components/Avatar/Avatar.fragment.tsx +7 -1
  464. package/src/components/Avatar/Avatar.test.tsx +24 -2
  465. package/src/components/Avatar/index.tsx +13 -1
  466. package/src/components/Badge/Badge.fragment.tsx +16 -1
  467. package/src/components/Badge/Badge.test.tsx +8 -1
  468. package/src/components/Badge/index.tsx +7 -2
  469. package/src/components/BentoGrid/BentoGrid.fragment.tsx +3 -1
  470. package/src/components/BentoGrid/BentoGrid.module.scss +52 -16
  471. package/src/components/BentoGrid/BentoGrid.test.tsx +20 -0
  472. package/src/components/BentoGrid/index.tsx +9 -12
  473. package/src/components/Box/Box.fragment.tsx +3 -1
  474. package/src/components/Box/Box.test.tsx +14 -0
  475. package/src/components/Box/index.tsx +8 -2
  476. package/src/components/Breadcrumbs/Breadcrumbs.fragment.tsx +19 -1
  477. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +13 -0
  478. package/src/components/Breadcrumbs/index.tsx +5 -1
  479. package/src/components/Button/Button.fragment.tsx +28 -6
  480. package/src/components/Button/Button.module.scss +3 -3
  481. package/src/components/Button/Button.test.tsx +11 -0
  482. package/src/components/Button/index.tsx +16 -6
  483. package/src/components/ButtonGroup/ButtonGroup.fragment.tsx +4 -2
  484. package/src/components/ButtonGroup/ButtonGroup.test.tsx +10 -0
  485. package/src/components/ButtonGroup/index.tsx +3 -3
  486. package/src/components/Card/Card.fragment.tsx +24 -9
  487. package/src/components/Card/Card.module.scss +8 -8
  488. package/src/components/Card/Card.test.tsx +4 -5
  489. package/src/components/Card/index.tsx +8 -38
  490. package/src/components/Chart/Chart.fragment.tsx +5 -3
  491. package/src/components/Chart/Chart.module.scss +1 -1
  492. package/src/components/Chart/index.tsx +12 -10
  493. package/src/components/Checkbox/Checkbox.fragment.tsx +27 -1
  494. package/src/components/Checkbox/Checkbox.module.scss +3 -3
  495. package/src/components/Checkbox/index.tsx +16 -3
  496. package/src/components/Chip/Chip.fragment.tsx +20 -3
  497. package/src/components/Chip/Chip.test.tsx +28 -0
  498. package/src/components/Chip/index.tsx +14 -6
  499. package/src/components/CodeBlock/CodeBlock.fragment.tsx +3 -1
  500. package/src/components/CodeBlock/CodeBlock.module.scss +9 -9
  501. package/src/components/CodeBlock/CodeBlock.test.tsx +21 -0
  502. package/src/components/CodeBlock/index.tsx +23 -9
  503. package/src/components/Collapsible/Collapsible.fragment.tsx +1 -1
  504. package/src/components/Collapsible/Collapsible.module.scss +1 -1
  505. package/src/components/ColorPicker/ColorPicker.fragment.tsx +1 -1
  506. package/src/components/Combobox/Combobox.fragment.tsx +63 -9
  507. package/src/components/Combobox/Combobox.module.scss +4 -7
  508. package/src/components/Combobox/Combobox.test.tsx +24 -3
  509. package/src/components/Combobox/index.tsx +117 -34
  510. package/src/components/Command/Command.fragment.tsx +3 -3
  511. package/src/components/Command/Command.module.scss +5 -5
  512. package/src/components/Command/Command.test.tsx +17 -0
  513. package/src/components/Command/index.tsx +8 -5
  514. package/src/components/ConversationList/ConversationList.fragment.tsx +4 -3
  515. package/src/components/ConversationList/ConversationList.module.scss +5 -5
  516. package/src/components/ConversationList/ConversationList.test.tsx +21 -0
  517. package/src/components/ConversationList/index.tsx +8 -4
  518. package/src/components/DataTable/DataTable.fragment.tsx +12 -2
  519. package/src/components/DataTable/DataTable.module.scss +3 -3
  520. package/src/components/DataTable/DataTable.test.tsx +23 -2
  521. package/src/components/DataTable/index.tsx +23 -5
  522. package/src/components/DatePicker/DatePicker.fragment.tsx +3 -1
  523. package/src/components/DatePicker/DatePicker.module.scss +1 -1
  524. package/src/components/DatePicker/DatePicker.test.tsx +17 -0
  525. package/src/components/DatePicker/index.tsx +9 -2
  526. package/src/components/Dialog/Dialog.fragment.tsx +28 -1
  527. package/src/components/Dialog/Dialog.module.scss +6 -6
  528. package/src/components/Dialog/index.tsx +25 -7
  529. package/src/components/Drawer/Drawer.fragment.tsx +4 -1
  530. package/src/components/Drawer/Drawer.module.scss +3 -3
  531. package/src/components/Drawer/Drawer.test.tsx +8 -0
  532. package/src/components/Drawer/index.tsx +15 -3
  533. package/src/components/Editor/Editor.fragment.tsx +10 -3
  534. package/src/components/Editor/Editor.module.scss +4 -4
  535. package/src/components/Editor/Editor.test.tsx +68 -1
  536. package/src/components/Editor/index.tsx +60 -9
  537. package/src/components/EmptyState/EmptyState.fragment.tsx +3 -1
  538. package/src/components/EmptyState/EmptyState.module.scss +3 -3
  539. package/src/components/EmptyState/EmptyState.test.tsx +18 -0
  540. package/src/components/EmptyState/index.tsx +16 -16
  541. package/src/components/Field/Field.fragment.tsx +1 -1
  542. package/src/components/Fieldset/Fieldset.fragment.tsx +3 -1
  543. package/src/components/Fieldset/Fieldset.test.tsx +14 -0
  544. package/src/components/Fieldset/index.tsx +3 -4
  545. package/src/components/Form/Form.fragment.tsx +12 -7
  546. package/src/components/Form/index.tsx +13 -17
  547. package/src/components/Grid/Grid.fragment.tsx +4 -3
  548. package/src/components/Grid/Grid.module.scss +3 -3
  549. package/src/components/Grid/index.tsx +11 -6
  550. package/src/components/Header/Header.fragment.tsx +31 -1
  551. package/src/components/Header/Header.module.scss +6 -6
  552. package/src/components/Header/Header.test.tsx +95 -1
  553. package/src/components/Header/index.tsx +95 -46
  554. package/src/components/Icon/Icon.fragment.tsx +21 -8
  555. package/src/components/Icon/Icon.test.tsx +27 -3
  556. package/src/components/Icon/index.tsx +39 -15
  557. package/src/components/Image/Image.fragment.tsx +15 -1
  558. package/src/components/Image/Image.test.tsx +32 -1
  559. package/src/components/Image/index.tsx +24 -4
  560. package/src/components/Input/Input.fragment.tsx +49 -1
  561. package/src/components/Input/Input.module.scss +4 -2
  562. package/src/components/Input/Input.test.tsx +3 -3
  563. package/src/components/Input/index.tsx +103 -37
  564. package/src/components/Link/Link.fragment.tsx +7 -6
  565. package/src/components/Link/Link.test.tsx +17 -1
  566. package/src/components/Link/index.tsx +22 -0
  567. package/src/components/List/List.fragment.tsx +1 -1
  568. package/src/components/Listbox/Listbox.fragment.tsx +3 -3
  569. package/src/components/Listbox/Listbox.module.scss +4 -4
  570. package/src/components/Listbox/Listbox.test.tsx +14 -0
  571. package/src/components/Listbox/index.tsx +12 -2
  572. package/src/components/Loading/Loading.fragment.tsx +1 -1
  573. package/src/components/Markdown/Markdown.fragment.tsx +5 -3
  574. package/src/components/Markdown/Markdown.module.scss +5 -5
  575. package/src/components/Markdown/Markdown.test.tsx +6 -0
  576. package/src/components/Markdown/index.tsx +12 -9
  577. package/src/components/Menu/Menu.fragment.tsx +19 -1
  578. package/src/components/Menu/Menu.module.scss +11 -11
  579. package/src/components/Menu/index.tsx +19 -7
  580. package/src/components/Message/Message.fragment.tsx +1 -1
  581. package/src/components/Message/Message.module.scss +3 -3
  582. package/src/components/NavigationMenu/NavigationMenu.fragment.tsx +9 -1
  583. package/src/components/NavigationMenu/NavigationMenu.module.scss +7 -7
  584. package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -0
  585. package/src/components/NavigationMenu/NavigationMenuContext.ts +14 -0
  586. package/src/components/NavigationMenu/index.tsx +70 -7
  587. package/src/components/Pagination/Pagination.fragment.tsx +4 -1
  588. package/src/components/Pagination/Pagination.test.tsx +39 -0
  589. package/src/components/Pagination/index.tsx +36 -10
  590. package/src/components/Popover/Popover.fragment.tsx +18 -1
  591. package/src/components/Popover/Popover.module.scss +13 -13
  592. package/src/components/Popover/index.tsx +33 -8
  593. package/src/components/Progress/Progress.fragment.tsx +3 -1
  594. package/src/components/Progress/Progress.test.tsx +8 -0
  595. package/src/components/Progress/index.tsx +9 -1
  596. package/src/components/Prompt/Prompt.fragment.tsx +4 -1
  597. package/src/components/Prompt/Prompt.module.scss +3 -3
  598. package/src/components/Prompt/Prompt.test.tsx +19 -0
  599. package/src/components/Prompt/index.tsx +24 -6
  600. package/src/components/RadioGroup/RadioGroup.fragment.tsx +31 -1
  601. package/src/components/RadioGroup/index.tsx +22 -3
  602. package/src/components/ScrollArea/ScrollArea.fragment.tsx +1 -1
  603. package/src/components/Select/Select.fragment.tsx +30 -3
  604. package/src/components/Select/Select.module.scss +3 -3
  605. package/src/components/Select/index.tsx +46 -33
  606. package/src/components/Separator/Separator.fragment.tsx +1 -1
  607. package/src/components/Sidebar/Sidebar.fragment.tsx +3 -1
  608. package/src/components/Sidebar/Sidebar.module.scss +20 -20
  609. package/src/components/Sidebar/Sidebar.test.tsx +25 -0
  610. package/src/components/Sidebar/index.tsx +7 -7
  611. package/src/components/Skeleton/Skeleton.fragment.tsx +3 -1
  612. package/src/components/Skeleton/Skeleton.test.tsx +12 -0
  613. package/src/components/Skeleton/index.tsx +6 -7
  614. package/src/components/Slider/Slider.fragment.tsx +21 -1
  615. package/src/components/Slider/Slider.module.scss +31 -0
  616. package/src/components/Slider/Slider.test.tsx +16 -0
  617. package/src/components/Slider/index.tsx +40 -1
  618. package/src/components/Stack/Stack.fragment.tsx +3 -1
  619. package/src/components/Stack/index.tsx +13 -6
  620. package/src/components/Table/Table.fragment.tsx +43 -2
  621. package/src/components/Table/Table.module.scss +2 -2
  622. package/src/components/Table/index.tsx +23 -5
  623. package/src/components/TableOfContents/TableOfContents.fragment.tsx +4 -2
  624. package/src/components/TableOfContents/TableOfContents.test.tsx +34 -9
  625. package/src/components/TableOfContents/index.tsx +9 -5
  626. package/src/components/Tabs/Tabs.fragment.tsx +33 -8
  627. package/src/components/Tabs/Tabs.module.scss +8 -8
  628. package/src/components/Tabs/index.tsx +22 -14
  629. package/src/components/Text/Text.fragment.tsx +1 -1
  630. package/src/components/Textarea/Textarea.fragment.tsx +27 -1
  631. package/src/components/Textarea/index.tsx +39 -14
  632. package/src/components/Theme/Theme.fragment.tsx +3 -1
  633. package/src/components/Theme/Theme.test.tsx +11 -0
  634. package/src/components/Theme/index.tsx +3 -3
  635. package/src/components/ThinkingIndicator/ThinkingIndicator.fragment.tsx +1 -1
  636. package/src/components/ThinkingIndicator/ThinkingIndicator.module.scss +1 -1
  637. package/src/components/Toast/Toast.fragment.tsx +6 -3
  638. package/src/components/Toast/Toast.module.scss +8 -6
  639. package/src/components/Toast/index.tsx +24 -20
  640. package/src/components/Toggle/Toggle.fragment.tsx +1 -1
  641. package/src/components/Toggle/Toggle.module.scss +61 -21
  642. package/src/components/Toggle/index.tsx +3 -3
  643. package/src/components/ToggleGroup/ToggleGroup.fragment.tsx +33 -8
  644. package/src/components/ToggleGroup/ToggleGroup.module.scss +3 -3
  645. package/src/components/ToggleGroup/index.tsx +29 -9
  646. package/src/components/Tooltip/Tooltip.fragment.tsx +16 -1
  647. package/src/components/Tooltip/Tooltip.module.scss +1 -1
  648. package/src/components/Tooltip/index.tsx +16 -1
  649. package/src/components/VisuallyHidden/VisuallyHidden.fragment.tsx +3 -1
  650. package/src/components/VisuallyHidden/VisuallyHidden.test.tsx +12 -0
  651. package/src/components/VisuallyHidden/index.tsx +7 -3
  652. package/src/index.ts +3 -2
  653. package/src/tokens/_computed.scss +1 -19
  654. package/src/tokens/_density.scss +0 -42
  655. package/src/tokens/_mixins.scss +4 -0
  656. package/src/tokens/_variables.scss +12 -114
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/Editor/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Editor.module.scss';\nimport {\n TextB,\n TextItalic,\n TextStrikethrough,\n LinkSimple,\n Code,\n ListBullets,\n ListNumbers,\n TextHOne,\n TextHTwo,\n TextHThree,\n Quotes,\n ArrowCounterClockwise,\n ArrowClockwise,\n} from '@phosphor-icons/react';\nimport { KEYBOARD_SHORTCUTS } from '../../utils/keyboard-shortcuts';\n\n// ============================================\n// Lazy-loaded dependency (TipTap)\n// ============================================\n\nlet _useEditor: ((config: Record<string, unknown>) => unknown) | null = null;\nlet _EditorContent: React.ComponentType<Record<string, unknown>> | null = null;\nlet _StarterKit: unknown = null;\nlet _LinkExtension: unknown = null;\nlet _tiptapLoaded = false;\nlet _tiptapFailed = false;\n\nfunction loadTipTapDeps() {\n if (_tiptapLoaded) return;\n _tiptapLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const tiptapReact = require('@tiptap/react');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const starterKit = require('@tiptap/starter-kit');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const linkExt = require('@tiptap/extension-link');\n\n _useEditor = tiptapReact.useEditor;\n _EditorContent = tiptapReact.EditorContent;\n _StarterKit = starterKit.default ?? starterKit.StarterKit ?? starterKit;\n _LinkExtension = linkExt.default ?? linkExt.Link ?? linkExt;\n } catch {\n _tiptapFailed = true;\n }\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport type EditorFormat =\n | 'bold' | 'italic' | 'strikethrough' | 'link' | 'code'\n | 'bulletList' | 'orderedList'\n | 'heading1' | 'heading2' | 'heading3'\n | 'blockquote'\n | 'undo' | 'redo';\n\nexport type EditorSaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nexport type EditorMode = 'rich' | 'markdown';\n\nexport type EditorSize = 'sm' | 'md' | 'lg';\n\nexport interface EditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n children?: React.ReactNode;\n /** Controlled value */\n value?: string;\n /** Default value for uncontrolled usage */\n defaultValue?: string;\n /** Called when content changes */\n onValueChange?: (value: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Disable the editor */\n disabled?: boolean;\n /** Read-only mode */\n readOnly?: boolean;\n /** Which format buttons to show */\n formats?: EditorFormat[];\n /** Show default toolbar */\n toolbar?: boolean;\n /** Show default status bar */\n statusBar?: boolean;\n /** Auto-save callback */\n onAutoSave?: (value: string) => void;\n /** Auto-save interval in ms */\n autoSaveInterval?: number;\n /** Editor size preset */\n size?: EditorSize;\n /** Maximum character count (shows indicator in status bar) */\n maxLength?: number;\n}\n\nexport interface EditorToolbarProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface EditorToolbarGroupProps {\n children: React.ReactNode;\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface EditorToolbarButtonProps {\n /** Which format this button toggles */\n format: EditorFormat;\n className?: string;\n}\n\nexport interface EditorSeparatorProps {\n className?: string;\n}\n\nexport interface EditorStatusIndicatorProps {\n /** Override the save status from context */\n status?: EditorSaveStatus;\n /** Custom labels per status */\n labels?: Partial<Record<EditorSaveStatus, string>>;\n className?: string;\n}\n\nexport interface EditorContentProps {\n className?: string;\n}\n\nexport interface EditorStatusBarProps {\n /** Show word count */\n showWordCount?: boolean;\n /** Show character count */\n showCharCount?: boolean;\n className?: string;\n}\n\n// ============================================\n// Format metadata\n// ============================================\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FORMAT_META: Record<EditorFormat, { icon: React.ComponentType<any>; label: string; shortcut: string }> = {\n bold: { icon: TextB, label: 'Bold', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BOLD.label },\n italic: { icon: TextItalic, label: 'Italic', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ITALIC.label },\n strikethrough: { icon: TextStrikethrough, label: 'Strikethrough', shortcut: KEYBOARD_SHORTCUTS.EDITOR_STRIKETHROUGH.label },\n link: { icon: LinkSimple, label: 'Link', shortcut: KEYBOARD_SHORTCUTS.EDITOR_LINK.label },\n code: { icon: Code, label: 'Code', shortcut: KEYBOARD_SHORTCUTS.EDITOR_CODE.label },\n bulletList: { icon: ListBullets, label: 'Bullet list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BULLET_LIST.label },\n orderedList: { icon: ListNumbers, label: 'Ordered list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ORDERED_LIST.label },\n heading1: { icon: TextHOne, label: 'Heading 1', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING1.label },\n heading2: { icon: TextHTwo, label: 'Heading 2', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING2.label },\n heading3: { icon: TextHThree, label: 'Heading 3', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING3.label },\n blockquote: { icon: Quotes, label: 'Blockquote', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BLOCKQUOTE.label },\n undo: { icon: ArrowCounterClockwise, label: 'Undo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_UNDO.label },\n redo: { icon: ArrowClockwise, label: 'Redo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_REDO.label },\n};\n\nconst DEFAULT_FORMATS: EditorFormat[] = ['bold', 'italic', 'strikethrough', 'link', 'code', 'bulletList'];\n\n/** Formats that are actions (not toggles) — no aria-pressed, different disable logic */\nconst ACTION_FORMATS = new Set<EditorFormat>(['undo', 'redo']);\n\nconst DEFAULT_STATUS_LABELS: Record<EditorSaveStatus, string> = {\n idle: '',\n saving: 'SAVING...',\n saved: 'AUTO-SAVED',\n error: 'SAVE FAILED',\n};\n\n// ============================================\n// Markdown formatting helpers (textarea fallback)\n// ============================================\n\ninterface TextareaSelection {\n start: number;\n end: number;\n text: string;\n}\n\nfunction getSelection(textarea: HTMLTextAreaElement): TextareaSelection {\n return {\n start: textarea.selectionStart,\n end: textarea.selectionEnd,\n text: textarea.value.substring(textarea.selectionStart, textarea.selectionEnd),\n };\n}\n\nfunction wrapSelection(\n textarea: HTMLTextAreaElement,\n prefix: string,\n suffix: string,\n setValue: (v: string) => void,\n) {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const wrapped = `${prefix}${sel.text || 'text'}${suffix}`;\n const newValue = `${before}${wrapped}${after}`;\n setValue(newValue);\n\n requestAnimationFrame(() => {\n textarea.focus();\n const newStart = sel.start + prefix.length;\n const newEnd = newStart + (sel.text || 'text').length;\n textarea.setSelectionRange(newStart, newEnd);\n });\n}\n\nfunction applyMarkdownFormat(\n format: EditorFormat,\n textarea: HTMLTextAreaElement,\n setValue: (v: string) => void,\n) {\n switch (format) {\n case 'bold':\n wrapSelection(textarea, '**', '**', setValue);\n break;\n case 'italic':\n wrapSelection(textarea, '*', '*', setValue);\n break;\n case 'strikethrough':\n wrapSelection(textarea, '~~', '~~', setValue);\n break;\n case 'code':\n wrapSelection(textarea, '`', '`', setValue);\n break;\n case 'link': {\n const sel = getSelection(textarea);\n const linkText = sel.text || 'link text';\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const newValue = `${before}[${linkText}](url)${after}`;\n setValue(newValue);\n requestAnimationFrame(() => {\n textarea.focus();\n const urlStart = sel.start + linkText.length + 3;\n textarea.setSelectionRange(urlStart, urlStart + 3);\n });\n break;\n }\n case 'bulletList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const bulleted = lines.map((l) => `- ${l}`).join('\\n');\n const newValue = `${before}${bulleted}${after}`;\n setValue(newValue);\n break;\n }\n case 'orderedList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const numbered = lines.map((l, i) => `${i + 1}. ${l}`).join('\\n');\n const newValue = `${before}${numbered}${after}`;\n setValue(newValue);\n break;\n }\n case 'heading1':\n wrapSelection(textarea, '# ', '', setValue);\n break;\n case 'heading2':\n wrapSelection(textarea, '## ', '', setValue);\n break;\n case 'heading3':\n wrapSelection(textarea, '### ', '', setValue);\n break;\n case 'blockquote': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'quote').split('\\n');\n const quoted = lines.map((l) => `> ${l}`).join('\\n');\n const newValue = `${before}${quoted}${after}`;\n setValue(newValue);\n break;\n }\n case 'undo':\n case 'redo':\n // Undo/redo in textarea mode is handled natively by the browser\n break;\n }\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface EditorContextValue {\n value: string;\n setValue: (v: string) => void;\n placeholder: string;\n disabled: boolean;\n readOnly: boolean;\n formats: EditorFormat[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editor: any | null;\n mode: EditorMode;\n size: EditorSize;\n maxLength?: number;\n wordCount: number;\n charCount: number;\n toggleFormat: (f: EditorFormat) => void;\n isFormatActive: (f: EditorFormat) => boolean;\n saveStatus: EditorSaveStatus;\n contentRef: React.RefObject<HTMLTextAreaElement | null>;\n}\n\nconst EditorContext = React.createContext<EditorContextValue | null>(null);\n\nfunction useEditorContext() {\n const context = React.useContext(EditorContext);\n if (!context) {\n throw new Error('Editor compound components must be used within an Editor');\n }\n return context;\n}\n\n// ============================================\n// Hooks\n// ============================================\n\nfunction useControllableState<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void,\n): [T, (value: T) => void] {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange],\n );\n\n return [value, setValue];\n}\n\nfunction countWords(text: string): number {\n const trimmed = text.trim();\n if (!trimmed) return 0;\n return trimmed.split(/\\s+/).length;\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction EditorRoot({\n children,\n value: controlledValue,\n defaultValue = '',\n onValueChange,\n placeholder = 'Start typing...',\n disabled = false,\n readOnly = false,\n formats = DEFAULT_FORMATS,\n toolbar = true,\n statusBar = true,\n onAutoSave,\n autoSaveInterval = 30000,\n size = 'md',\n maxLength,\n className,\n ...htmlProps\n}: EditorProps) {\n const contentRef = React.useRef<HTMLTextAreaElement>(null);\n\n const [value, setValue] = useControllableState(\n controlledValue,\n defaultValue,\n onValueChange,\n );\n\n const [saveStatus, setSaveStatus] = React.useState<EditorSaveStatus>('idle');\n\n // Try loading TipTap\n loadTipTapDeps();\n const hasTipTap = !_tiptapFailed && _useEditor && _EditorContent && _StarterKit;\n const mode: EditorMode = hasTipTap ? 'rich' : 'markdown';\n\n // TipTap editor instance (only when available)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tiptapEditor: any = hasTipTap\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_useEditor as any)({\n extensions: [\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_StarterKit as any).configure({\n heading: { levels: [1, 2, 3] },\n blockquote: {},\n codeBlock: false,\n horizontalRule: false,\n hardBreak: false,\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_LinkExtension as any).configure({\n openOnClick: false,\n HTMLAttributes: { rel: 'noopener noreferrer', target: '_blank' },\n }),\n ],\n editorProps: {\n attributes: {\n role: 'textbox',\n 'aria-label': placeholder,\n 'aria-multiline': 'true',\n },\n },\n content: defaultValue || controlledValue || '',\n editable: !disabled && !readOnly,\n onUpdate: ({ editor: e }: { editor: { getHTML: () => string } }) => {\n const html = e.getHTML();\n setValue(html);\n },\n })\n : null;\n\n // Sync controlled value to TipTap\n React.useEffect(() => {\n if (tiptapEditor && controlledValue !== undefined) {\n const currentContent = tiptapEditor.getHTML();\n if (currentContent !== controlledValue) {\n tiptapEditor.commands.setContent(controlledValue, false);\n }\n }\n }, [controlledValue, tiptapEditor]);\n\n // Update editable state\n React.useEffect(() => {\n if (tiptapEditor) {\n tiptapEditor.setEditable(!disabled && !readOnly);\n }\n }, [tiptapEditor, disabled, readOnly]);\n\n // Auto-save\n React.useEffect(() => {\n if (!onAutoSave || !value) return;\n\n const timer = setTimeout(() => {\n setSaveStatus('saving');\n try {\n onAutoSave(value);\n setSaveStatus('saved');\n } catch {\n setSaveStatus('error');\n }\n }, autoSaveInterval);\n\n return () => clearTimeout(timer);\n }, [value, onAutoSave, autoSaveInterval]);\n\n const toggleFormat = React.useCallback(\n (format: EditorFormat) => {\n if (disabled || readOnly) return;\n\n if (tiptapEditor) {\n switch (format) {\n case 'bold':\n tiptapEditor.chain().focus().toggleBold().run();\n break;\n case 'italic':\n tiptapEditor.chain().focus().toggleItalic().run();\n break;\n case 'strikethrough':\n tiptapEditor.chain().focus().toggleStrike().run();\n break;\n case 'code':\n tiptapEditor.chain().focus().toggleCode().run();\n break;\n case 'bulletList':\n tiptapEditor.chain().focus().toggleBulletList().run();\n break;\n case 'orderedList':\n tiptapEditor.chain().focus().toggleOrderedList().run();\n break;\n case 'heading1':\n tiptapEditor.chain().focus().toggleHeading({ level: 1 }).run();\n break;\n case 'heading2':\n tiptapEditor.chain().focus().toggleHeading({ level: 2 }).run();\n break;\n case 'heading3':\n tiptapEditor.chain().focus().toggleHeading({ level: 3 }).run();\n break;\n case 'blockquote':\n tiptapEditor.chain().focus().toggleBlockquote().run();\n break;\n case 'undo':\n tiptapEditor.chain().focus().undo().run();\n break;\n case 'redo':\n tiptapEditor.chain().focus().redo().run();\n break;\n case 'link': {\n const previousUrl = tiptapEditor.getAttributes('link').href;\n if (previousUrl) {\n tiptapEditor.chain().focus().unsetLink().run();\n } else {\n const url = window.prompt('Enter URL');\n if (url) {\n tiptapEditor.chain().focus().setLink({ href: url }).run();\n }\n }\n break;\n }\n }\n } else if (contentRef.current) {\n applyMarkdownFormat(format, contentRef.current, setValue);\n }\n },\n [disabled, readOnly, tiptapEditor, setValue],\n );\n\n const isFormatActive = React.useCallback(\n (format: EditorFormat): boolean => {\n if (!tiptapEditor) return false;\n switch (format) {\n case 'bold':\n return tiptapEditor.isActive('bold');\n case 'italic':\n return tiptapEditor.isActive('italic');\n case 'strikethrough':\n return tiptapEditor.isActive('strike');\n case 'code':\n return tiptapEditor.isActive('code');\n case 'bulletList':\n return tiptapEditor.isActive('bulletList');\n case 'orderedList':\n return tiptapEditor.isActive('orderedList');\n case 'heading1':\n return tiptapEditor.isActive('heading', { level: 1 });\n case 'heading2':\n return tiptapEditor.isActive('heading', { level: 2 });\n case 'heading3':\n return tiptapEditor.isActive('heading', { level: 3 });\n case 'blockquote':\n return tiptapEditor.isActive('blockquote');\n case 'link':\n return tiptapEditor.isActive('link');\n case 'undo':\n case 'redo':\n return false; // Actions don't have active state\n default:\n return false;\n }\n },\n [tiptapEditor],\n );\n\n const wordCount = React.useMemo(() => {\n if (tiptapEditor) {\n const text = tiptapEditor.getText?.() ?? '';\n return countWords(text);\n }\n return countWords(value);\n }, [value, tiptapEditor]);\n\n const charCount = React.useMemo(() => {\n if (tiptapEditor) {\n return (tiptapEditor.getText?.() ?? '').length;\n }\n return value.length;\n }, [value, tiptapEditor]);\n\n const contextValue: EditorContextValue = {\n value,\n setValue,\n placeholder,\n disabled,\n readOnly,\n formats,\n editor: tiptapEditor,\n mode,\n size,\n maxLength,\n wordCount,\n charCount,\n toggleFormat,\n isFormatActive,\n saveStatus,\n contentRef,\n };\n\n const classes = [\n styles.editor,\n disabled && styles.disabled,\n readOnly && styles.readOnly,\n className,\n ].filter(Boolean).join(' ');\n\n const hasCustomChildren = children !== undefined;\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={classes}\n data-disabled={disabled || undefined}\n data-readonly={readOnly || undefined}\n data-size={size}\n >\n {hasCustomChildren ? (\n children\n ) : (\n <>\n {toolbar && (\n <EditorToolbar>\n <EditorToolbarGroup aria-label=\"Text formatting\">\n {formats.map((f) => (\n <EditorToolbarButton key={f} format={f} />\n ))}\n </EditorToolbarGroup>\n </EditorToolbar>\n )}\n <EditorContentArea />\n {statusBar && <EditorStatusBar showWordCount showCharCount />}\n </>\n )}\n </div>\n </EditorContext.Provider>\n );\n}\n\nfunction EditorToolbar({ children, className }: EditorToolbarProps) {\n const classes = [styles.toolbar, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"toolbar\" aria-label=\"Editor formatting\">\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarGroup({ children, 'aria-label': ariaLabel, className }: EditorToolbarGroupProps) {\n const classes = [styles.toolbarGroup, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"group\" aria-label={ariaLabel}>\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarButton({ format, className }: EditorToolbarButtonProps) {\n const { toggleFormat, isFormatActive, disabled, readOnly, editor, mode } = useEditorContext();\n const meta = FORMAT_META[format];\n const isAction = ACTION_FORMATS.has(format);\n const active = isAction ? false : isFormatActive(format);\n const IconComponent = meta.icon;\n\n // Action buttons (undo/redo) have special disable logic\n let isDisabled = disabled || readOnly;\n if (isAction && !isDisabled) {\n if (mode === 'markdown') {\n // Undo/redo in textarea mode is handled natively by the browser\n isDisabled = true;\n } else if (editor) {\n isDisabled = format === 'undo' ? !editor.can().undo() : !editor.can().redo();\n }\n }\n\n const classes = [\n styles.toolbarButton,\n active && styles.toolbarButtonActive,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => toggleFormat(format)}\n disabled={isDisabled}\n aria-label={meta.label}\n title={`${meta.label} (${meta.shortcut})`}\n {...(isAction ? {} : { 'aria-pressed': active })}\n >\n <IconComponent size={16} weight={active ? 'bold' : 'regular'} />\n </button>\n );\n}\n\nfunction EditorSeparator({ className }: EditorSeparatorProps) {\n const classes = [styles.separator, className].filter(Boolean).join(' ');\n return <div className={classes} role=\"separator\" aria-orientation=\"vertical\" />;\n}\n\nfunction EditorStatusIndicator({ status: statusOverride, labels, className }: EditorStatusIndicatorProps) {\n const { saveStatus } = useEditorContext();\n const status = statusOverride ?? saveStatus;\n const mergedLabels = { ...DEFAULT_STATUS_LABELS, ...labels };\n const label = mergedLabels[status];\n\n if (!label) return null;\n\n const classes = [\n styles.statusIndicator,\n status === 'error' && styles.statusError,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <span className={classes} aria-live=\"polite\" role=\"status\">\n {label}\n </span>\n );\n}\n\nfunction EditorContentArea({ className }: EditorContentProps) {\n const { value, setValue, placeholder, disabled, readOnly, editor, mode, contentRef } =\n useEditorContext();\n\n if (mode === 'rich' && editor && _EditorContent) {\n const TipTapContent = _EditorContent;\n const classes = [styles.content, styles.contentRich, className].filter(Boolean).join(' ');\n return (\n <div className={classes} data-placeholder={placeholder}>\n <TipTapContent editor={editor} />\n </div>\n );\n }\n\n // Textarea fallback for markdown mode\n const classes = [styles.content, className].filter(Boolean).join(' ');\n return (\n <div className={classes}>\n <textarea\n ref={contentRef}\n className={styles.contentTextarea}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={placeholder}\n />\n </div>\n );\n}\n\nfunction EditorStatusBar({ showWordCount = true, showCharCount = true, className }: EditorStatusBarProps) {\n const { wordCount, charCount, maxLength } = useEditorContext();\n\n const classes = [styles.statusBar, className].filter(Boolean).join(' ');\n\n const isOverLimit = maxLength !== undefined && charCount > maxLength;\n const isNearLimit = maxLength !== undefined && !isOverLimit && charCount >= maxLength * 0.9;\n\n const charLimitClasses = [\n styles.statusBarItem,\n isNearLimit && styles.statusBarItemWarning,\n isOverLimit && styles.statusBarItemError,\n ].filter(Boolean).join(' ');\n\n return (\n <div className={classes} aria-label=\"Editor statistics\">\n <div className={styles.statusBarLeft} />\n <div className={styles.statusBarRight}>\n {showWordCount && (\n <span className={styles.statusBarItem}>\n {wordCount} {wordCount === 1 ? 'Word' : 'Words'}\n </span>\n )}\n {showWordCount && showCharCount && (\n <EditorSeparator />\n )}\n {showCharCount && (\n <span className={charLimitClasses}>\n {maxLength !== undefined\n ? `${charCount} / ${maxLength}`\n : `${charCount} ${charCount === 1 ? 'Character' : 'Characters'}`\n }\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Editor = Object.assign(EditorRoot, {\n Toolbar: EditorToolbar,\n ToolbarGroup: EditorToolbarGroup,\n ToolbarButton: EditorToolbarButton,\n Separator: EditorSeparator,\n StatusIndicator: EditorStatusIndicator,\n Content: EditorContentArea,\n StatusBar: EditorStatusBar,\n});\n\nexport {\n EditorRoot,\n EditorToolbar,\n EditorToolbarGroup,\n EditorToolbarButton,\n EditorSeparator,\n EditorStatusIndicator,\n EditorContentArea,\n EditorStatusBar,\n};\n\nexport { useEditorContext };\n"],"names":["TextB","KEYBOARD_SHORTCUTS","TextItalic","TextStrikethrough","LinkSimple","Code","ListBullets","ListNumbers","TextHOne","TextHTwo","TextHThree","Quotes","ArrowCounterClockwise","ArrowClockwise","React","styles","jsx","jsxs","Fragment","classes"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAyBA,IAAI,aAAoE;AACxE,IAAI,iBAAsE;AAC1E,IAAI,cAAuB;AAC3B,IAAI,iBAA0B;AAC9B,IAAI,gBAAgB;AACpB,IAAI,gBAAgB;AAEpB,SAAS,iBAAiB;AACxB,MAAI,cAAe;AACnB,kBAAgB;AAChB,MAAI;AAEF,UAAM,cAAc,QAAQ,eAAe;AAE3C,UAAM,aAAa,QAAQ,qBAAqB;AAEhD,UAAM,UAAU,QAAQ,wBAAwB;AAEhD,iBAAa,YAAY;AACzB,qBAAiB,YAAY;AAC7B,kBAAc,WAAW,WAAW,WAAW,cAAc;AAC7D,qBAAiB,QAAQ,WAAW,QAAQ,QAAQ;AAAA,EACtD,QAAQ;AACN,oBAAgB;AAAA,EAClB;AACF;AA+FA,MAAM,cAAyG;AAAA,EAC7G,MAAM,EAAE,MAAMA,MAAAA,OAAO,OAAO,QAAQ,UAAUC,kBAAAA,mBAAmB,YAAY,MAAA;AAAA,EAC7E,QAAQ,EAAE,MAAMC,MAAAA,YAAY,OAAO,UAAU,UAAUD,kBAAAA,mBAAmB,cAAc,MAAA;AAAA,EACxF,eAAe,EAAE,MAAME,MAAAA,mBAAmB,OAAO,iBAAiB,UAAUF,kBAAAA,mBAAmB,qBAAqB,MAAA;AAAA,EACpH,MAAM,EAAE,MAAMG,MAAAA,YAAY,OAAO,QAAQ,UAAUH,kBAAAA,mBAAmB,YAAY,MAAA;AAAA,EAClF,MAAM,EAAE,MAAMI,MAAAA,MAAM,OAAO,QAAQ,UAAUJ,kBAAAA,mBAAmB,YAAY,MAAA;AAAA,EAC5E,YAAY,EAAE,MAAMK,MAAAA,aAAa,OAAO,eAAe,UAAUL,kBAAAA,mBAAmB,mBAAmB,MAAA;AAAA,EACvG,aAAa,EAAE,MAAMM,MAAAA,aAAa,OAAO,gBAAgB,UAAUN,kBAAAA,mBAAmB,oBAAoB,MAAA;AAAA,EAC1G,UAAU,EAAE,MAAMO,MAAAA,UAAU,OAAO,aAAa,UAAUP,kBAAAA,mBAAmB,gBAAgB,MAAA;AAAA,EAC7F,UAAU,EAAE,MAAMQ,MAAAA,UAAU,OAAO,aAAa,UAAUR,kBAAAA,mBAAmB,gBAAgB,MAAA;AAAA,EAC7F,UAAU,EAAE,MAAMS,MAAAA,YAAY,OAAO,aAAa,UAAUT,kBAAAA,mBAAmB,gBAAgB,MAAA;AAAA,EAC/F,YAAY,EAAE,MAAMU,MAAAA,QAAQ,OAAO,cAAc,UAAUV,kBAAAA,mBAAmB,kBAAkB,MAAA;AAAA,EAChG,MAAM,EAAE,MAAMW,MAAAA,uBAAuB,OAAO,QAAQ,UAAUX,kBAAAA,mBAAmB,YAAY,MAAA;AAAA,EAC7F,MAAM,EAAE,MAAMY,sBAAgB,OAAO,QAAQ,UAAUZ,qCAAmB,YAAY,MAAA;AACxF;AAEA,MAAM,kBAAkC,CAAC,QAAQ,UAAU,iBAAiB,QAAQ,QAAQ,YAAY;AAGxG,MAAM,iBAAiB,oBAAI,IAAkB,CAAC,QAAQ,MAAM,CAAC;AAE7D,MAAM,wBAA0D;AAAA,EAC9D,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AACT;AAYA,SAAS,aAAa,UAAkD;AACtE,SAAO;AAAA,IACL,OAAO,SAAS;AAAA,IAChB,KAAK,SAAS;AAAA,IACd,MAAM,SAAS,MAAM,UAAU,SAAS,gBAAgB,SAAS,YAAY;AAAA,EAAA;AAEjF;AAEA,SAAS,cACP,UACA,QACA,QACA,UACA;AACA,QAAM,MAAM,aAAa,QAAQ;AACjC,QAAM,SAAS,SAAS,MAAM,UAAU,GAAG,IAAI,KAAK;AACpD,QAAM,QAAQ,SAAS,MAAM,UAAU,IAAI,GAAG;AAC9C,QAAM,UAAU,GAAG,MAAM,GAAG,IAAI,QAAQ,MAAM,GAAG,MAAM;AACvD,QAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK;AAC5C,WAAS,QAAQ;AAEjB,wBAAsB,MAAM;AAC1B,aAAS,MAAA;AACT,UAAM,WAAW,IAAI,QAAQ,OAAO;AACpC,UAAM,SAAS,YAAY,IAAI,QAAQ,QAAQ;AAC/C,aAAS,kBAAkB,UAAU,MAAM;AAAA,EAC7C,CAAC;AACH;AAEA,SAAS,oBACP,QACA,UACA,UACA;AACA,UAAQ,QAAA;AAAA,IACN,KAAK;AACH,oBAAc,UAAU,MAAM,MAAM,QAAQ;AAC5C;AAAA,IACF,KAAK;AACH,oBAAc,UAAU,KAAK,KAAK,QAAQ;AAC1C;AAAA,IACF,KAAK;AACH,oBAAc,UAAU,MAAM,MAAM,QAAQ;AAC5C;AAAA,IACF,KAAK;AACH,oBAAc,UAAU,KAAK,KAAK,QAAQ;AAC1C;AAAA,IACF,KAAK,QAAQ;AACX,YAAM,MAAM,aAAa,QAAQ;AACjC,YAAM,WAAW,IAAI,QAAQ;AAC7B,YAAM,SAAS,SAAS,MAAM,UAAU,GAAG,IAAI,KAAK;AACpD,YAAM,QAAQ,SAAS,MAAM,UAAU,IAAI,GAAG;AAC9C,YAAM,WAAW,GAAG,MAAM,IAAI,QAAQ,SAAS,KAAK;AACpD,eAAS,QAAQ;AACjB,4BAAsB,MAAM;AAC1B,iBAAS,MAAA;AACT,cAAM,WAAW,IAAI,QAAQ,SAAS,SAAS;AAC/C,iBAAS,kBAAkB,UAAU,WAAW,CAAC;AAAA,MACnD,CAAC;AACD;AAAA,IACF;AAAA,IACA,KAAK,cAAc;AACjB,YAAM,MAAM,aAAa,QAAQ;AACjC,YAAM,SAAS,SAAS,MAAM,UAAU,GAAG,IAAI,KAAK;AACpD,YAAM,QAAQ,SAAS,MAAM,UAAU,IAAI,GAAG;AAC9C,YAAM,SAAS,IAAI,QAAQ,QAAQ,MAAM,IAAI;AAC7C,YAAM,WAAW,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AACrD,YAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK;AAC7C,eAAS,QAAQ;AACjB;AAAA,IACF;AAAA,IACA,KAAK,eAAe;AAClB,YAAM,MAAM,aAAa,QAAQ;AACjC,YAAM,SAAS,SAAS,MAAM,UAAU,GAAG,IAAI,KAAK;AACpD,YAAM,QAAQ,SAAS,MAAM,UAAU,IAAI,GAAG;AAC9C,YAAM,SAAS,IAAI,QAAQ,QAAQ,MAAM,IAAI;AAC7C,YAAM,WAAW,MAAM,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AAChE,YAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK;AAC7C,eAAS,QAAQ;AACjB;AAAA,IACF;AAAA,IACA,KAAK;AACH,oBAAc,UAAU,MAAM,IAAI,QAAQ;AAC1C;AAAA,IACF,KAAK;AACH,oBAAc,UAAU,OAAO,IAAI,QAAQ;AAC3C;AAAA,IACF,KAAK;AACH,oBAAc,UAAU,QAAQ,IAAI,QAAQ;AAC5C;AAAA,IACF,KAAK,cAAc;AACjB,YAAM,MAAM,aAAa,QAAQ;AACjC,YAAM,SAAS,SAAS,MAAM,UAAU,GAAG,IAAI,KAAK;AACpD,YAAM,QAAQ,SAAS,MAAM,UAAU,IAAI,GAAG;AAC9C,YAAM,SAAS,IAAI,QAAQ,SAAS,MAAM,IAAI;AAC9C,YAAM,SAAS,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AACnD,YAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK;AAC3C,eAAS,QAAQ;AACjB;AAAA,IACF;AAAA,EAIE;AAEN;AA0BA,MAAM,gBAAgBa,iBAAM,cAAyC,IAAI;AAEzE,SAAS,mBAAmB;AAC1B,QAAM,UAAUA,iBAAM,WAAW,aAAa;AAC9C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO;AACT;AAMA,SAAS,qBACP,iBACA,cACA,UACyB;AACzB,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,iBAAM,SAAS,YAAY;AAC7E,QAAM,eAAe,oBAAoB;AACzC,QAAM,QAAQ,eAAe,kBAAkB;AAE/C,QAAM,WAAWA,iBAAM;AAAA,IACrB,CAAC,aAAgB;AACf,UAAI,CAAC,cAAc;AACjB,6BAAqB,QAAQ;AAAA,MAC/B;AACA,2CAAW;AAAA,IACb;AAAA,IACA,CAAC,cAAc,QAAQ;AAAA,EAAA;AAGzB,SAAO,CAAC,OAAO,QAAQ;AACzB;AAEA,SAAS,WAAW,MAAsB;AACxC,QAAM,UAAU,KAAK,KAAA;AACrB,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,QAAQ,MAAM,KAAK,EAAE;AAC9B;AAMA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,EACP,eAAe;AAAA,EACf;AAAA,EACA,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ;AAAA,EACA,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgB;AACd,QAAM,aAAaA,iBAAM,OAA4B,IAAI;AAEzD,QAAM,CAAC,OAAO,QAAQ,IAAI;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,QAAM,CAAC,YAAY,aAAa,IAAIA,iBAAM,SAA2B,MAAM;AAG3E,iBAAA;AACA,QAAM,YAAY,CAAC,iBAAiB,cAAc,kBAAkB;AACpE,QAAM,OAAmB,YAAY,SAAS;AAI9C,QAAM,eAAoB;AAAA;AAAA,IAErB,WAAmB;AAAA,MAClB,YAAY;AAAA;AAAA,QAET,YAAoB,UAAU;AAAA,UAC7B,SAAS,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAA;AAAA,UAC3B,YAAY,CAAA;AAAA,UACZ,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,WAAW;AAAA,QAAA,CACZ;AAAA;AAAA,QAEA,eAAuB,UAAU;AAAA,UAChC,aAAa;AAAA,UACb,gBAAgB,EAAE,KAAK,uBAAuB,QAAQ,SAAA;AAAA,QAAS,CAChE;AAAA,MAAA;AAAA,MAEH,aAAa;AAAA,QACX,YAAY;AAAA,UACV,MAAM;AAAA,UACN,cAAc;AAAA,UACd,kBAAkB;AAAA,QAAA;AAAA,MACpB;AAAA,MAEF,SAAS,gBAAgB,mBAAmB;AAAA,MAC5C,UAAU,CAAC,YAAY,CAAC;AAAA,MACxB,UAAU,CAAC,EAAE,QAAQ,QAA+C;AAClE,cAAM,OAAO,EAAE,QAAA;AACf,iBAAS,IAAI;AAAA,MACf;AAAA,IAAA,CACD;AAAA,MACD;AAGJA,mBAAM,UAAU,MAAM;AACpB,QAAI,gBAAgB,oBAAoB,QAAW;AACjD,YAAM,iBAAiB,aAAa,QAAA;AACpC,UAAI,mBAAmB,iBAAiB;AACtC,qBAAa,SAAS,WAAW,iBAAiB,KAAK;AAAA,MACzD;AAAA,IACF;AAAA,EACF,GAAG,CAAC,iBAAiB,YAAY,CAAC;AAGlCA,mBAAM,UAAU,MAAM;AACpB,QAAI,cAAc;AAChB,mBAAa,YAAY,CAAC,YAAY,CAAC,QAAQ;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,cAAc,UAAU,QAAQ,CAAC;AAGrCA,mBAAM,UAAU,MAAM;AACpB,QAAI,CAAC,cAAc,CAAC,MAAO;AAE3B,UAAM,QAAQ,WAAW,MAAM;AAC7B,oBAAc,QAAQ;AACtB,UAAI;AACF,mBAAW,KAAK;AAChB,sBAAc,OAAO;AAAA,MACvB,QAAQ;AACN,sBAAc,OAAO;AAAA,MACvB;AAAA,IACF,GAAG,gBAAgB;AAEnB,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,OAAO,YAAY,gBAAgB,CAAC;AAExC,QAAM,eAAeA,iBAAM;AAAA,IACzB,CAAC,WAAyB;AACxB,UAAI,YAAY,SAAU;AAE1B,UAAI,cAAc;AAChB,gBAAQ,QAAA;AAAA,UACN,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,WAAA,EAAa,IAAA;AAC1C;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,aAAA,EAAe,IAAA;AAC5C;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,aAAA,EAAe,IAAA;AAC5C;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,WAAA,EAAa,IAAA;AAC1C;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,iBAAA,EAAmB,IAAA;AAChD;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,kBAAA,EAAoB,IAAA;AACjD;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,QAAQ,cAAc,EAAE,OAAO,GAAG,EAAE,IAAA;AACzD;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,QAAQ,cAAc,EAAE,OAAO,GAAG,EAAE,IAAA;AACzD;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,QAAQ,cAAc,EAAE,OAAO,GAAG,EAAE,IAAA;AACzD;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,iBAAA,EAAmB,IAAA;AAChD;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,KAAA,EAAO,IAAA;AACpC;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,KAAA,EAAO,IAAA;AACpC;AAAA,UACF,KAAK,QAAQ;AACX,kBAAM,cAAc,aAAa,cAAc,MAAM,EAAE;AACvD,gBAAI,aAAa;AACf,2BAAa,QAAQ,MAAA,EAAQ,UAAA,EAAY,IAAA;AAAA,YAC3C,OAAO;AACL,oBAAM,MAAM,OAAO,OAAO,WAAW;AACrC,kBAAI,KAAK;AACP,6BAAa,QAAQ,QAAQ,QAAQ,EAAE,MAAM,KAAK,EAAE,IAAA;AAAA,cACtD;AAAA,YACF;AACA;AAAA,UACF;AAAA,QAAA;AAAA,MAEJ,WAAW,WAAW,SAAS;AAC7B,4BAAoB,QAAQ,WAAW,SAAS,QAAQ;AAAA,MAC1D;AAAA,IACF;AAAA,IACA,CAAC,UAAU,UAAU,cAAc,QAAQ;AAAA,EAAA;AAG7C,QAAM,iBAAiBA,iBAAM;AAAA,IAC3B,CAAC,WAAkC;AACjC,UAAI,CAAC,aAAc,QAAO;AAC1B,cAAQ,QAAA;AAAA,QACN,KAAK;AACH,iBAAO,aAAa,SAAS,MAAM;AAAA,QACrC,KAAK;AACH,iBAAO,aAAa,SAAS,QAAQ;AAAA,QACvC,KAAK;AACH,iBAAO,aAAa,SAAS,QAAQ;AAAA,QACvC,KAAK;AACH,iBAAO,aAAa,SAAS,MAAM;AAAA,QACrC,KAAK;AACH,iBAAO,aAAa,SAAS,YAAY;AAAA,QAC3C,KAAK;AACH,iBAAO,aAAa,SAAS,aAAa;AAAA,QAC5C,KAAK;AACH,iBAAO,aAAa,SAAS,WAAW,EAAE,OAAO,GAAG;AAAA,QACtD,KAAK;AACH,iBAAO,aAAa,SAAS,WAAW,EAAE,OAAO,GAAG;AAAA,QACtD,KAAK;AACH,iBAAO,aAAa,SAAS,WAAW,EAAE,OAAO,GAAG;AAAA,QACtD,KAAK;AACH,iBAAO,aAAa,SAAS,YAAY;AAAA,QAC3C,KAAK;AACH,iBAAO,aAAa,SAAS,MAAM;AAAA,QACrC,KAAK;AAAA,QACL,KAAK;AACH,iBAAO;AAAA;AAAA,QACT;AACE,iBAAO;AAAA,MAAA;AAAA,IAEb;AAAA,IACA,CAAC,YAAY;AAAA,EAAA;AAGf,QAAM,YAAYA,iBAAM,QAAQ,MAAM;;AACpC,QAAI,cAAc;AAChB,YAAM,SAAO,kBAAa,YAAb,0CAA4B;AACzC,aAAO,WAAW,IAAI;AAAA,IACxB;AACA,WAAO,WAAW,KAAK;AAAA,EACzB,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,QAAM,YAAYA,iBAAM,QAAQ,MAAM;;AACpC,QAAI,cAAc;AAChB,gBAAQ,kBAAa,YAAb,0CAA4B,IAAI;AAAA,IAC1C;AACA,WAAO,MAAM;AAAA,EACf,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,QAAM,eAAmC;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,QAAM,UAAU;AAAA,IACdC,cAAAA,QAAO;AAAA,IACP,YAAYA,cAAAA,QAAO;AAAA,IACnB,YAAYA,cAAAA,QAAO;AAAA,IACnB;AAAA,EAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,QAAM,oBAAoB,aAAa;AAEvC,SACEC,2BAAAA,IAAC,cAAc,UAAd,EAAuB,OAAO,cAC7B,UAAAA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW;AAAA,MACX,iBAAe,YAAY;AAAA,MAC3B,iBAAe,YAAY;AAAA,MAC3B,aAAW;AAAA,MAEV,UAAA,oBACC,WAEAC,2BAAAA,KAAAC,WAAAA,UAAA,EACG,UAAA;AAAA,QAAA,0CACE,eAAA,EACC,UAAAF,+BAAC,oBAAA,EAAmB,cAAW,mBAC5B,UAAA,QAAQ,IAAI,CAAC,qCACX,qBAAA,EAA4B,QAAQ,KAAX,CAAc,CACzC,GACH,GACF;AAAA,uCAED,mBAAA,EAAkB;AAAA,QAClB,aAAaA,2BAAAA,IAAC,iBAAA,EAAgB,eAAa,MAAC,eAAa,KAAA,CAAC;AAAA,MAAA,EAAA,CAC7D;AAAA,IAAA;AAAA,EAAA,GAGN;AAEJ;AAEA,SAAS,cAAc,EAAE,UAAU,aAAiC;AAClE,QAAM,UAAU,CAACD,cAAAA,QAAO,SAAS,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACpE,SACEC,+BAAC,SAAI,WAAW,SAAS,MAAK,WAAU,cAAW,qBAChD,UACH;AAEJ;AAEA,SAAS,mBAAmB,EAAE,UAAU,cAAc,WAAW,aAAsC;AACrG,QAAM,UAAU,CAACD,cAAAA,QAAO,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACzE,SACEC,+BAAC,SAAI,WAAW,SAAS,MAAK,SAAQ,cAAY,WAC/C,UACH;AAEJ;AAEA,SAAS,oBAAoB,EAAE,QAAQ,aAAuC;AAC5E,QAAM,EAAE,cAAc,gBAAgB,UAAU,UAAU,QAAQ,KAAA,IAAS,iBAAA;AAC3E,QAAM,OAAO,YAAY,MAAM;AAC/B,QAAM,WAAW,eAAe,IAAI,MAAM;AAC1C,QAAM,SAAS,WAAW,QAAQ,eAAe,MAAM;AACvD,QAAM,gBAAgB,KAAK;AAG3B,MAAI,aAAa,YAAY;AAC7B,MAAI,YAAY,CAAC,YAAY;AAC3B,QAAI,SAAS,YAAY;AAEvB,mBAAa;AAAA,IACf,WAAW,QAAQ;AACjB,mBAAa,WAAW,SAAS,CAAC,OAAO,IAAA,EAAM,KAAA,IAAS,CAAC,OAAO,IAAA,EAAM,KAAA;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,UAAU;AAAA,IACdD,cAAAA,QAAO;AAAA,IACP,UAAUA,cAAAA,QAAO;AAAA,IACjB;AAAA,EAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW;AAAA,MACX,SAAS,MAAM,aAAa,MAAM;AAAA,MAClC,UAAU;AAAA,MACV,cAAY,KAAK;AAAA,MACjB,OAAO,GAAG,KAAK,KAAK,KAAK,KAAK,QAAQ;AAAA,MACrC,GAAI,WAAW,CAAA,IAAK,EAAE,gBAAgB,OAAA;AAAA,MAEvC,yCAAC,eAAA,EAAc,MAAM,IAAI,QAAQ,SAAS,SAAS,UAAA,CAAW;AAAA,IAAA;AAAA,EAAA;AAGpE;AAEA,SAAS,gBAAgB,EAAE,aAAmC;AAC5D,QAAM,UAAU,CAACD,cAAAA,QAAO,WAAW,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACtE,wCAAQ,OAAA,EAAI,WAAW,SAAS,MAAK,aAAY,oBAAiB,YAAW;AAC/E;AAEA,SAAS,sBAAsB,EAAE,QAAQ,gBAAgB,QAAQ,aAAyC;AACxG,QAAM,EAAE,WAAA,IAAe,iBAAA;AACvB,QAAM,SAAS,kBAAkB;AACjC,QAAM,eAAe,EAAE,GAAG,uBAAuB,GAAG,OAAA;AACpD,QAAM,QAAQ,aAAa,MAAM;AAEjC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,UAAU;AAAA,IACdA,cAAAA,QAAO;AAAA,IACP,WAAW,WAAWA,cAAAA,QAAO;AAAA,IAC7B;AAAA,EAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACEC,+BAAC,UAAK,WAAW,SAAS,aAAU,UAAS,MAAK,UAC/C,UAAA,MAAA,CACH;AAEJ;AAEA,SAAS,kBAAkB,EAAE,aAAiC;AAC5D,QAAM,EAAE,OAAO,UAAU,aAAa,UAAU,UAAU,QAAQ,MAAM,WAAA,IACtE,iBAAA;AAEF,MAAI,SAAS,UAAU,UAAU,gBAAgB;AAC/C,UAAM,gBAAgB;AACtB,UAAMG,WAAU,CAACJ,sBAAO,SAASA,cAAAA,QAAO,aAAa,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACxF,WACEC,2BAAAA,IAAC,SAAI,WAAWG,UAAS,oBAAkB,aACzC,UAAAH,2BAAAA,IAAC,eAAA,EAAc,OAAA,CAAgB,EAAA,CACjC;AAAA,EAEJ;AAGA,QAAM,UAAU,CAACD,cAAAA,QAAO,SAAS,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACpE,SACEC,2BAAAA,IAAC,OAAA,EAAI,WAAW,SACd,UAAAA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAWD,cAAAA,QAAO;AAAA,MAClB;AAAA,MACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAY;AAAA,IAAA;AAAA,EAAA,GAEhB;AAEJ;AAEA,SAAS,gBAAgB,EAAE,gBAAgB,MAAM,gBAAgB,MAAM,aAAmC;AACxG,QAAM,EAAE,WAAW,WAAW,UAAA,IAAc,iBAAA;AAE5C,QAAM,UAAU,CAACA,cAAAA,QAAO,WAAW,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEtE,QAAM,cAAc,cAAc,UAAa,YAAY;AAC3D,QAAM,cAAc,cAAc,UAAa,CAAC,eAAe,aAAa,YAAY;AAExF,QAAM,mBAAmB;AAAA,IACvBA,cAAAA,QAAO;AAAA,IACP,eAAeA,cAAAA,QAAO;AAAA,IACtB,eAAeA,cAAAA,QAAO;AAAA,EAAA,EACtB,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACEE,2BAAAA,KAAC,OAAA,EAAI,WAAW,SAAS,cAAW,qBAClC,UAAA;AAAA,IAAAD,2BAAAA,IAAC,OAAA,EAAI,WAAWD,cAAAA,QAAO,cAAA,CAAe;AAAA,IACtCE,2BAAAA,KAAC,OAAA,EAAI,WAAWF,cAAAA,QAAO,gBACpB,UAAA;AAAA,MAAA,iBACCE,2BAAAA,KAAC,QAAA,EAAK,WAAWF,cAAAA,QAAO,eACrB,UAAA;AAAA,QAAA;AAAA,QAAU;AAAA,QAAE,cAAc,IAAI,SAAS;AAAA,MAAA,GAC1C;AAAA,MAED,iBAAiB,iBAChBC,+BAAC,iBAAA,CAAA,CAAgB;AAAA,MAElB,iBACCA,2BAAAA,IAAC,QAAA,EAAK,WAAW,kBACd,UAAA,cAAc,SACX,GAAG,SAAS,MAAM,SAAS,KAC3B,GAAG,SAAS,IAAI,cAAc,IAAI,cAAc,YAAY,GAAA,CAElE;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;AAMO,MAAM,SAAS,OAAO,OAAO,YAAY;AAAA,EAC9C,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,WAAW;AACb,CAAC;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/Editor/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Editor.module.scss';\nimport {\n TextB,\n TextItalic,\n TextStrikethrough,\n LinkSimple,\n Code,\n ListBullets,\n ListNumbers,\n TextHOne,\n TextHTwo,\n TextHThree,\n Quotes,\n ArrowCounterClockwise,\n ArrowClockwise,\n} from '@phosphor-icons/react';\nimport { KEYBOARD_SHORTCUTS } from '../../utils/keyboard-shortcuts';\n\n// ============================================\n// Lazy-loaded dependency (TipTap)\n// ============================================\n\nlet _useEditor: ((config: Record<string, unknown>) => unknown) | null = null;\nlet _EditorContent: React.ComponentType<Record<string, unknown>> | null = null;\nlet _StarterKit: unknown = null;\nlet _LinkExtension: unknown = null;\nlet _tiptapLoaded = false;\nlet _tiptapFailed = false;\n\nfunction loadTipTapDeps() {\n if (_tiptapLoaded) return;\n _tiptapLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const tiptapReact = require('@tiptap/react');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const starterKit = require('@tiptap/starter-kit');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const linkExt = require('@tiptap/extension-link');\n\n _useEditor = tiptapReact.useEditor;\n _EditorContent = tiptapReact.EditorContent;\n _StarterKit = starterKit.default ?? starterKit.StarterKit ?? starterKit;\n _LinkExtension = linkExt.default ?? linkExt.Link ?? linkExt;\n } catch {\n _tiptapFailed = true;\n }\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport type EditorFormat =\n | 'bold' | 'italic' | 'strikethrough' | 'link' | 'code'\n | 'bulletList' | 'orderedList'\n | 'heading1' | 'heading2' | 'heading3'\n | 'blockquote'\n | 'undo' | 'redo';\n\nexport type EditorSaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nexport type EditorMode = 'rich' | 'markdown';\n\nexport type EditorSize = 'sm' | 'md' | 'lg';\n\nexport interface EditorToolbarIconRenderState {\n format: EditorFormat;\n active: boolean;\n disabled: boolean;\n readOnly: boolean;\n isDisabled: boolean;\n mode: EditorMode;\n}\n\nexport type EditorToolbarIconSlot =\n | React.ReactNode\n | ((state: EditorToolbarIconRenderState) => React.ReactNode);\n\nexport type EditorToolbarIcons = Partial<Record<EditorFormat, EditorToolbarIconSlot>>;\n\nexport interface EditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n children?: React.ReactNode;\n /** Controlled value */\n value?: string;\n /** Default value for uncontrolled usage */\n defaultValue?: string;\n /** Called when content changes */\n onValueChange?: (value: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Disable the editor */\n disabled?: boolean;\n /** Read-only mode */\n readOnly?: boolean;\n /** Which format buttons to show */\n formats?: EditorFormat[];\n /** Show default toolbar */\n toolbar?: boolean;\n /** Show default status bar */\n statusBar?: boolean;\n /** Auto-save callback (sync or async) */\n onAutoSave?: (value: string) => void | Promise<void>;\n /** Auto-save interval in ms */\n autoSaveInterval?: number;\n /** Editor size preset */\n size?: EditorSize;\n /** Maximum character count (shows indicator in status bar) */\n maxLength?: number;\n /** Custom toolbar icons keyed by format/action, for any icon package */\n toolbarIcons?: EditorToolbarIcons;\n}\n\nexport interface EditorToolbarProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface EditorToolbarGroupProps {\n children: React.ReactNode;\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface EditorToolbarButtonProps {\n /** Which format this button toggles */\n format: EditorFormat;\n className?: string;\n}\n\nexport interface EditorSeparatorProps {\n className?: string;\n}\n\nexport interface EditorStatusIndicatorProps {\n /** Override the save status from context */\n status?: EditorSaveStatus;\n /** Custom labels per status */\n labels?: Partial<Record<EditorSaveStatus, string>>;\n className?: string;\n}\n\nexport interface EditorContentProps {\n className?: string;\n}\n\nexport interface EditorStatusBarProps {\n /** Show word count */\n showWordCount?: boolean;\n /** Show character count */\n showCharCount?: boolean;\n className?: string;\n}\n\n// ============================================\n// Format metadata\n// ============================================\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FORMAT_META: Record<EditorFormat, { icon: React.ComponentType<any>; label: string; shortcut: string }> = {\n bold: { icon: TextB, label: 'Bold', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BOLD.label },\n italic: { icon: TextItalic, label: 'Italic', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ITALIC.label },\n strikethrough: { icon: TextStrikethrough, label: 'Strikethrough', shortcut: KEYBOARD_SHORTCUTS.EDITOR_STRIKETHROUGH.label },\n link: { icon: LinkSimple, label: 'Link', shortcut: KEYBOARD_SHORTCUTS.EDITOR_LINK.label },\n code: { icon: Code, label: 'Code', shortcut: KEYBOARD_SHORTCUTS.EDITOR_CODE.label },\n bulletList: { icon: ListBullets, label: 'Bullet list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BULLET_LIST.label },\n orderedList: { icon: ListNumbers, label: 'Ordered list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ORDERED_LIST.label },\n heading1: { icon: TextHOne, label: 'Heading 1', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING1.label },\n heading2: { icon: TextHTwo, label: 'Heading 2', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING2.label },\n heading3: { icon: TextHThree, label: 'Heading 3', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING3.label },\n blockquote: { icon: Quotes, label: 'Blockquote', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BLOCKQUOTE.label },\n undo: { icon: ArrowCounterClockwise, label: 'Undo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_UNDO.label },\n redo: { icon: ArrowClockwise, label: 'Redo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_REDO.label },\n};\n\nconst DEFAULT_FORMATS: EditorFormat[] = ['bold', 'italic', 'strikethrough', 'link', 'code', 'bulletList'];\n\n/** Formats that are actions (not toggles) — no aria-pressed, different disable logic */\nconst ACTION_FORMATS = new Set<EditorFormat>(['undo', 'redo']);\n\nconst DEFAULT_STATUS_LABELS: Record<EditorSaveStatus, string> = {\n idle: '',\n saving: 'SAVING...',\n saved: 'AUTO-SAVED',\n error: 'SAVE FAILED',\n};\n\n// ============================================\n// Markdown formatting helpers (textarea fallback)\n// ============================================\n\ninterface TextareaSelection {\n start: number;\n end: number;\n text: string;\n}\n\nfunction getSelection(textarea: HTMLTextAreaElement): TextareaSelection {\n return {\n start: textarea.selectionStart,\n end: textarea.selectionEnd,\n text: textarea.value.substring(textarea.selectionStart, textarea.selectionEnd),\n };\n}\n\nfunction wrapSelection(\n textarea: HTMLTextAreaElement,\n prefix: string,\n suffix: string,\n setValue: (v: string) => void,\n) {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const wrapped = `${prefix}${sel.text || 'text'}${suffix}`;\n const newValue = `${before}${wrapped}${after}`;\n setValue(newValue);\n\n requestAnimationFrame(() => {\n textarea.focus();\n const newStart = sel.start + prefix.length;\n const newEnd = newStart + (sel.text || 'text').length;\n textarea.setSelectionRange(newStart, newEnd);\n });\n}\n\nfunction applyMarkdownFormat(\n format: EditorFormat,\n textarea: HTMLTextAreaElement,\n setValue: (v: string) => void,\n) {\n switch (format) {\n case 'bold':\n wrapSelection(textarea, '**', '**', setValue);\n break;\n case 'italic':\n wrapSelection(textarea, '*', '*', setValue);\n break;\n case 'strikethrough':\n wrapSelection(textarea, '~~', '~~', setValue);\n break;\n case 'code':\n wrapSelection(textarea, '`', '`', setValue);\n break;\n case 'link': {\n const sel = getSelection(textarea);\n const linkText = sel.text || 'link text';\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const newValue = `${before}[${linkText}](url)${after}`;\n setValue(newValue);\n requestAnimationFrame(() => {\n textarea.focus();\n const urlStart = sel.start + linkText.length + 3;\n textarea.setSelectionRange(urlStart, urlStart + 3);\n });\n break;\n }\n case 'bulletList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const bulleted = lines.map((l) => `- ${l}`).join('\\n');\n const newValue = `${before}${bulleted}${after}`;\n setValue(newValue);\n break;\n }\n case 'orderedList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const numbered = lines.map((l, i) => `${i + 1}. ${l}`).join('\\n');\n const newValue = `${before}${numbered}${after}`;\n setValue(newValue);\n break;\n }\n case 'heading1':\n wrapSelection(textarea, '# ', '', setValue);\n break;\n case 'heading2':\n wrapSelection(textarea, '## ', '', setValue);\n break;\n case 'heading3':\n wrapSelection(textarea, '### ', '', setValue);\n break;\n case 'blockquote': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'quote').split('\\n');\n const quoted = lines.map((l) => `> ${l}`).join('\\n');\n const newValue = `${before}${quoted}${after}`;\n setValue(newValue);\n break;\n }\n case 'undo':\n case 'redo':\n // Undo/redo in textarea mode is handled natively by the browser\n break;\n }\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface EditorContextValue {\n value: string;\n setValue: (v: string) => void;\n placeholder: string;\n disabled: boolean;\n readOnly: boolean;\n formats: EditorFormat[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editor: any | null;\n mode: EditorMode;\n size: EditorSize;\n maxLength?: number;\n toolbarIcons?: EditorToolbarIcons;\n wordCount: number;\n charCount: number;\n toggleFormat: (f: EditorFormat) => void;\n isFormatActive: (f: EditorFormat) => boolean;\n saveStatus: EditorSaveStatus;\n contentRef: React.RefObject<HTMLTextAreaElement | null>;\n}\n\nconst EditorContext = React.createContext<EditorContextValue | null>(null);\n\nfunction useEditorContext() {\n const context = React.useContext(EditorContext);\n if (!context) {\n throw new Error('Editor compound components must be used within an Editor');\n }\n return context;\n}\n\n// ============================================\n// Hooks\n// ============================================\n\nfunction useControllableState<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void,\n): [T, (value: T) => void] {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange],\n );\n\n return [value, setValue];\n}\n\nfunction countWords(text: string): number {\n const trimmed = text.trim();\n if (!trimmed) return 0;\n return trimmed.split(/\\s+/).length;\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction EditorRoot({\n children,\n value: controlledValue,\n defaultValue = '',\n onValueChange,\n placeholder = 'Start typing...',\n disabled = false,\n readOnly = false,\n formats = DEFAULT_FORMATS,\n toolbar = true,\n statusBar = true,\n onAutoSave,\n autoSaveInterval = 30000,\n size = 'md',\n maxLength,\n toolbarIcons,\n className,\n ...htmlProps\n}: EditorProps) {\n const contentRef = React.useRef<HTMLTextAreaElement>(null);\n\n const [value, setValue] = useControllableState(\n controlledValue,\n defaultValue,\n onValueChange,\n );\n\n const [saveStatus, setSaveStatus] = React.useState<EditorSaveStatus>('idle');\n\n // Try loading TipTap\n loadTipTapDeps();\n const hasTipTap = !_tiptapFailed && _useEditor && _EditorContent && _StarterKit;\n const mode: EditorMode = hasTipTap ? 'rich' : 'markdown';\n\n // TipTap editor instance (only when available)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tiptapEditor: any = hasTipTap\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_useEditor as any)({\n extensions: [\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_StarterKit as any).configure({\n heading: { levels: [1, 2, 3] },\n blockquote: {},\n codeBlock: false,\n horizontalRule: false,\n hardBreak: false,\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_LinkExtension as any).configure({\n openOnClick: false,\n HTMLAttributes: { rel: 'noopener noreferrer', target: '_blank' },\n }),\n ],\n editorProps: {\n attributes: {\n role: 'textbox',\n 'aria-label': placeholder,\n 'aria-multiline': 'true',\n },\n },\n content: controlledValue !== undefined ? controlledValue : defaultValue,\n editable: !disabled && !readOnly,\n onUpdate: ({ editor: e }: { editor: { getHTML: () => string } }) => {\n const html = e.getHTML();\n setValue(html);\n },\n })\n : null;\n\n // Sync controlled value to TipTap\n React.useEffect(() => {\n if (tiptapEditor && controlledValue !== undefined) {\n const currentContent = tiptapEditor.getHTML();\n if (currentContent !== controlledValue) {\n tiptapEditor.commands.setContent(controlledValue, false);\n }\n }\n }, [controlledValue, tiptapEditor]);\n\n // Update editable state\n React.useEffect(() => {\n if (tiptapEditor) {\n tiptapEditor.setEditable(!disabled && !readOnly);\n }\n }, [tiptapEditor, disabled, readOnly]);\n\n // Auto-save\n React.useEffect(() => {\n if (!onAutoSave || !value) return;\n\n let cancelled = false;\n const timer = setTimeout(() => {\n setSaveStatus('saving');\n try {\n Promise.resolve(onAutoSave(value))\n .then(() => {\n if (!cancelled) {\n setSaveStatus('saved');\n }\n })\n .catch(() => {\n if (!cancelled) {\n setSaveStatus('error');\n }\n });\n } catch {\n if (!cancelled) {\n setSaveStatus('error');\n }\n }\n }, autoSaveInterval);\n\n return () => {\n cancelled = true;\n clearTimeout(timer);\n };\n }, [value, onAutoSave, autoSaveInterval]);\n\n const toggleFormat = React.useCallback(\n (format: EditorFormat) => {\n if (disabled || readOnly) return;\n\n if (tiptapEditor) {\n switch (format) {\n case 'bold':\n tiptapEditor.chain().focus().toggleBold().run();\n break;\n case 'italic':\n tiptapEditor.chain().focus().toggleItalic().run();\n break;\n case 'strikethrough':\n tiptapEditor.chain().focus().toggleStrike().run();\n break;\n case 'code':\n tiptapEditor.chain().focus().toggleCode().run();\n break;\n case 'bulletList':\n tiptapEditor.chain().focus().toggleBulletList().run();\n break;\n case 'orderedList':\n tiptapEditor.chain().focus().toggleOrderedList().run();\n break;\n case 'heading1':\n tiptapEditor.chain().focus().toggleHeading({ level: 1 }).run();\n break;\n case 'heading2':\n tiptapEditor.chain().focus().toggleHeading({ level: 2 }).run();\n break;\n case 'heading3':\n tiptapEditor.chain().focus().toggleHeading({ level: 3 }).run();\n break;\n case 'blockquote':\n tiptapEditor.chain().focus().toggleBlockquote().run();\n break;\n case 'undo':\n tiptapEditor.chain().focus().undo().run();\n break;\n case 'redo':\n tiptapEditor.chain().focus().redo().run();\n break;\n case 'link': {\n const previousUrl = tiptapEditor.getAttributes('link').href;\n if (previousUrl) {\n tiptapEditor.chain().focus().unsetLink().run();\n } else {\n const url = window.prompt('Enter URL');\n if (url) {\n tiptapEditor.chain().focus().setLink({ href: url }).run();\n }\n }\n break;\n }\n }\n } else if (contentRef.current) {\n applyMarkdownFormat(format, contentRef.current, setValue);\n }\n },\n [disabled, readOnly, tiptapEditor, setValue],\n );\n\n const isFormatActive = React.useCallback(\n (format: EditorFormat): boolean => {\n if (!tiptapEditor) return false;\n switch (format) {\n case 'bold':\n return tiptapEditor.isActive('bold');\n case 'italic':\n return tiptapEditor.isActive('italic');\n case 'strikethrough':\n return tiptapEditor.isActive('strike');\n case 'code':\n return tiptapEditor.isActive('code');\n case 'bulletList':\n return tiptapEditor.isActive('bulletList');\n case 'orderedList':\n return tiptapEditor.isActive('orderedList');\n case 'heading1':\n return tiptapEditor.isActive('heading', { level: 1 });\n case 'heading2':\n return tiptapEditor.isActive('heading', { level: 2 });\n case 'heading3':\n return tiptapEditor.isActive('heading', { level: 3 });\n case 'blockquote':\n return tiptapEditor.isActive('blockquote');\n case 'link':\n return tiptapEditor.isActive('link');\n case 'undo':\n case 'redo':\n return false; // Actions don't have active state\n default:\n return false;\n }\n },\n [tiptapEditor],\n );\n\n const wordCount = React.useMemo(() => {\n if (tiptapEditor) {\n const text = tiptapEditor.getText?.() ?? '';\n return countWords(text);\n }\n return countWords(value);\n }, [value, tiptapEditor]);\n\n const charCount = React.useMemo(() => {\n if (tiptapEditor) {\n return (tiptapEditor.getText?.() ?? '').length;\n }\n return value.length;\n }, [value, tiptapEditor]);\n\n const contextValue: EditorContextValue = {\n value,\n setValue,\n placeholder,\n disabled,\n readOnly,\n formats,\n editor: tiptapEditor,\n mode,\n size,\n maxLength,\n toolbarIcons,\n wordCount,\n charCount,\n toggleFormat,\n isFormatActive,\n saveStatus,\n contentRef,\n };\n\n const classes = [\n styles.editor,\n disabled && styles.disabled,\n readOnly && styles.readOnly,\n className,\n ].filter(Boolean).join(' ');\n\n const hasCustomChildren = children !== undefined;\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={classes}\n data-disabled={disabled || undefined}\n data-readonly={readOnly || undefined}\n data-size={size}\n >\n {hasCustomChildren ? (\n children\n ) : (\n <>\n {toolbar && (\n <EditorToolbar>\n <EditorToolbarGroup aria-label=\"Text formatting\">\n {formats.map((f) => (\n <EditorToolbarButton key={f} format={f} />\n ))}\n </EditorToolbarGroup>\n </EditorToolbar>\n )}\n <EditorContentArea />\n {statusBar && <EditorStatusBar showWordCount showCharCount />}\n </>\n )}\n </div>\n </EditorContext.Provider>\n );\n}\n\nfunction EditorToolbar({ children, className }: EditorToolbarProps) {\n const classes = [styles.toolbar, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"toolbar\" aria-label=\"Editor formatting\">\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarGroup({ children, 'aria-label': ariaLabel, className }: EditorToolbarGroupProps) {\n const classes = [styles.toolbarGroup, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"group\" aria-label={ariaLabel}>\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarButton({ format, className }: EditorToolbarButtonProps) {\n const { toggleFormat, isFormatActive, disabled, readOnly, editor, mode, toolbarIcons } = useEditorContext();\n const meta = FORMAT_META[format];\n const isAction = ACTION_FORMATS.has(format);\n const active = isAction ? false : isFormatActive(format);\n const IconComponent = meta.icon;\n\n // Action buttons (undo/redo) have special disable logic\n let isDisabled = disabled || readOnly;\n if (isAction && !isDisabled) {\n if (mode === 'markdown') {\n // Undo/redo in textarea mode is handled natively by the browser\n isDisabled = true;\n } else if (editor) {\n isDisabled = format === 'undo' ? !editor.can().undo() : !editor.can().redo();\n }\n }\n\n const iconState: EditorToolbarIconRenderState = {\n format,\n active,\n disabled,\n readOnly,\n isDisabled,\n mode,\n };\n\n const iconOverride = toolbarIcons?.[format];\n const renderedOverride = typeof iconOverride === 'function'\n ? iconOverride(iconState)\n : iconOverride;\n\n const classes = [\n styles.toolbarButton,\n active && styles.toolbarButtonActive,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => toggleFormat(format)}\n disabled={isDisabled}\n aria-label={meta.label}\n title={`${meta.label} (${meta.shortcut})`}\n {...(isAction ? {} : { 'aria-pressed': active })}\n >\n {iconOverride !== undefined\n ? renderedOverride\n : <IconComponent size={16} weight={active ? 'bold' : 'regular'} />}\n </button>\n );\n}\n\nfunction EditorSeparator({ className }: EditorSeparatorProps) {\n const classes = [styles.separator, className].filter(Boolean).join(' ');\n return <div className={classes} role=\"separator\" aria-orientation=\"vertical\" />;\n}\n\nfunction EditorStatusIndicator({ status: statusOverride, labels, className }: EditorStatusIndicatorProps) {\n const { saveStatus } = useEditorContext();\n const status = statusOverride ?? saveStatus;\n const mergedLabels = { ...DEFAULT_STATUS_LABELS, ...labels };\n const label = mergedLabels[status];\n\n if (!label) return null;\n\n const classes = [\n styles.statusIndicator,\n status === 'error' && styles.statusError,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <span className={classes} aria-live=\"polite\" role=\"status\">\n {label}\n </span>\n );\n}\n\nfunction EditorContentArea({ className }: EditorContentProps) {\n const { value, setValue, placeholder, disabled, readOnly, editor, mode, contentRef } =\n useEditorContext();\n\n if (mode === 'rich' && editor && _EditorContent) {\n const TipTapContent = _EditorContent;\n const classes = [styles.content, styles.contentRich, className].filter(Boolean).join(' ');\n return (\n <div className={classes} data-placeholder={placeholder}>\n <TipTapContent editor={editor} />\n </div>\n );\n }\n\n // Textarea fallback for markdown mode\n const classes = [styles.content, className].filter(Boolean).join(' ');\n return (\n <div className={classes}>\n <textarea\n ref={contentRef}\n className={styles.contentTextarea}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={placeholder}\n />\n </div>\n );\n}\n\nfunction EditorStatusBar({ showWordCount = true, showCharCount = true, className }: EditorStatusBarProps) {\n const { wordCount, charCount, maxLength } = useEditorContext();\n\n const classes = [styles.statusBar, className].filter(Boolean).join(' ');\n\n const isOverLimit = maxLength !== undefined && charCount > maxLength;\n const isNearLimit = maxLength !== undefined && !isOverLimit && charCount >= maxLength * 0.9;\n\n const charLimitClasses = [\n styles.statusBarItem,\n isNearLimit && styles.statusBarItemWarning,\n isOverLimit && styles.statusBarItemError,\n ].filter(Boolean).join(' ');\n\n return (\n <div className={classes} aria-label=\"Editor statistics\">\n <div className={styles.statusBarLeft} />\n <div className={styles.statusBarRight}>\n {showWordCount && (\n <span className={styles.statusBarItem}>\n {wordCount} {wordCount === 1 ? 'Word' : 'Words'}\n </span>\n )}\n {showWordCount && showCharCount && (\n <EditorSeparator />\n )}\n {showCharCount && (\n <span className={charLimitClasses}>\n {maxLength !== undefined\n ? `${charCount} / ${maxLength}`\n : `${charCount} ${charCount === 1 ? 'Character' : 'Characters'}`\n }\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Editor = Object.assign(EditorRoot, {\n Toolbar: EditorToolbar,\n ToolbarGroup: EditorToolbarGroup,\n ToolbarButton: EditorToolbarButton,\n Separator: EditorSeparator,\n StatusIndicator: EditorStatusIndicator,\n Content: EditorContentArea,\n StatusBar: EditorStatusBar,\n});\n\nexport {\n EditorRoot,\n EditorToolbar,\n EditorToolbarGroup,\n EditorToolbarButton,\n EditorSeparator,\n EditorStatusIndicator,\n EditorContentArea,\n EditorStatusBar,\n};\n\nexport { useEditorContext };\n"],"names":["TextB","KEYBOARD_SHORTCUTS","TextItalic","TextStrikethrough","LinkSimple","Code","ListBullets","ListNumbers","TextHOne","TextHTwo","TextHThree","Quotes","ArrowCounterClockwise","ArrowClockwise","React","styles","jsx","jsxs","Fragment","classes"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAyBA,IAAI,aAAoE;AACxE,IAAI,iBAAsE;AAC1E,IAAI,cAAuB;AAC3B,IAAI,iBAA0B;AAC9B,IAAI,gBAAgB;AACpB,IAAI,gBAAgB;AAEpB,SAAS,iBAAiB;AACxB,MAAI,cAAe;AACnB,kBAAgB;AAChB,MAAI;AAEF,UAAM,cAAc,QAAQ,eAAe;AAE3C,UAAM,aAAa,QAAQ,qBAAqB;AAEhD,UAAM,UAAU,QAAQ,wBAAwB;AAEhD,iBAAa,YAAY;AACzB,qBAAiB,YAAY;AAC7B,kBAAc,WAAW,WAAW,WAAW,cAAc;AAC7D,qBAAiB,QAAQ,WAAW,QAAQ,QAAQ;AAAA,EACtD,QAAQ;AACN,oBAAgB;AAAA,EAClB;AACF;AAgHA,MAAM,cAAyG;AAAA,EAC7G,MAAM,EAAE,MAAMA,MAAAA,OAAO,OAAO,QAAQ,UAAUC,kBAAAA,mBAAmB,YAAY,MAAA;AAAA,EAC7E,QAAQ,EAAE,MAAMC,MAAAA,YAAY,OAAO,UAAU,UAAUD,kBAAAA,mBAAmB,cAAc,MAAA;AAAA,EACxF,eAAe,EAAE,MAAME,MAAAA,mBAAmB,OAAO,iBAAiB,UAAUF,kBAAAA,mBAAmB,qBAAqB,MAAA;AAAA,EACpH,MAAM,EAAE,MAAMG,MAAAA,YAAY,OAAO,QAAQ,UAAUH,kBAAAA,mBAAmB,YAAY,MAAA;AAAA,EAClF,MAAM,EAAE,MAAMI,MAAAA,MAAM,OAAO,QAAQ,UAAUJ,kBAAAA,mBAAmB,YAAY,MAAA;AAAA,EAC5E,YAAY,EAAE,MAAMK,MAAAA,aAAa,OAAO,eAAe,UAAUL,kBAAAA,mBAAmB,mBAAmB,MAAA;AAAA,EACvG,aAAa,EAAE,MAAMM,MAAAA,aAAa,OAAO,gBAAgB,UAAUN,kBAAAA,mBAAmB,oBAAoB,MAAA;AAAA,EAC1G,UAAU,EAAE,MAAMO,MAAAA,UAAU,OAAO,aAAa,UAAUP,kBAAAA,mBAAmB,gBAAgB,MAAA;AAAA,EAC7F,UAAU,EAAE,MAAMQ,MAAAA,UAAU,OAAO,aAAa,UAAUR,kBAAAA,mBAAmB,gBAAgB,MAAA;AAAA,EAC7F,UAAU,EAAE,MAAMS,MAAAA,YAAY,OAAO,aAAa,UAAUT,kBAAAA,mBAAmB,gBAAgB,MAAA;AAAA,EAC/F,YAAY,EAAE,MAAMU,MAAAA,QAAQ,OAAO,cAAc,UAAUV,kBAAAA,mBAAmB,kBAAkB,MAAA;AAAA,EAChG,MAAM,EAAE,MAAMW,MAAAA,uBAAuB,OAAO,QAAQ,UAAUX,kBAAAA,mBAAmB,YAAY,MAAA;AAAA,EAC7F,MAAM,EAAE,MAAMY,sBAAgB,OAAO,QAAQ,UAAUZ,qCAAmB,YAAY,MAAA;AACxF;AAEA,MAAM,kBAAkC,CAAC,QAAQ,UAAU,iBAAiB,QAAQ,QAAQ,YAAY;AAGxG,MAAM,iBAAiB,oBAAI,IAAkB,CAAC,QAAQ,MAAM,CAAC;AAE7D,MAAM,wBAA0D;AAAA,EAC9D,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AACT;AAYA,SAAS,aAAa,UAAkD;AACtE,SAAO;AAAA,IACL,OAAO,SAAS;AAAA,IAChB,KAAK,SAAS;AAAA,IACd,MAAM,SAAS,MAAM,UAAU,SAAS,gBAAgB,SAAS,YAAY;AAAA,EAAA;AAEjF;AAEA,SAAS,cACP,UACA,QACA,QACA,UACA;AACA,QAAM,MAAM,aAAa,QAAQ;AACjC,QAAM,SAAS,SAAS,MAAM,UAAU,GAAG,IAAI,KAAK;AACpD,QAAM,QAAQ,SAAS,MAAM,UAAU,IAAI,GAAG;AAC9C,QAAM,UAAU,GAAG,MAAM,GAAG,IAAI,QAAQ,MAAM,GAAG,MAAM;AACvD,QAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK;AAC5C,WAAS,QAAQ;AAEjB,wBAAsB,MAAM;AAC1B,aAAS,MAAA;AACT,UAAM,WAAW,IAAI,QAAQ,OAAO;AACpC,UAAM,SAAS,YAAY,IAAI,QAAQ,QAAQ;AAC/C,aAAS,kBAAkB,UAAU,MAAM;AAAA,EAC7C,CAAC;AACH;AAEA,SAAS,oBACP,QACA,UACA,UACA;AACA,UAAQ,QAAA;AAAA,IACN,KAAK;AACH,oBAAc,UAAU,MAAM,MAAM,QAAQ;AAC5C;AAAA,IACF,KAAK;AACH,oBAAc,UAAU,KAAK,KAAK,QAAQ;AAC1C;AAAA,IACF,KAAK;AACH,oBAAc,UAAU,MAAM,MAAM,QAAQ;AAC5C;AAAA,IACF,KAAK;AACH,oBAAc,UAAU,KAAK,KAAK,QAAQ;AAC1C;AAAA,IACF,KAAK,QAAQ;AACX,YAAM,MAAM,aAAa,QAAQ;AACjC,YAAM,WAAW,IAAI,QAAQ;AAC7B,YAAM,SAAS,SAAS,MAAM,UAAU,GAAG,IAAI,KAAK;AACpD,YAAM,QAAQ,SAAS,MAAM,UAAU,IAAI,GAAG;AAC9C,YAAM,WAAW,GAAG,MAAM,IAAI,QAAQ,SAAS,KAAK;AACpD,eAAS,QAAQ;AACjB,4BAAsB,MAAM;AAC1B,iBAAS,MAAA;AACT,cAAM,WAAW,IAAI,QAAQ,SAAS,SAAS;AAC/C,iBAAS,kBAAkB,UAAU,WAAW,CAAC;AAAA,MACnD,CAAC;AACD;AAAA,IACF;AAAA,IACA,KAAK,cAAc;AACjB,YAAM,MAAM,aAAa,QAAQ;AACjC,YAAM,SAAS,SAAS,MAAM,UAAU,GAAG,IAAI,KAAK;AACpD,YAAM,QAAQ,SAAS,MAAM,UAAU,IAAI,GAAG;AAC9C,YAAM,SAAS,IAAI,QAAQ,QAAQ,MAAM,IAAI;AAC7C,YAAM,WAAW,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AACrD,YAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK;AAC7C,eAAS,QAAQ;AACjB;AAAA,IACF;AAAA,IACA,KAAK,eAAe;AAClB,YAAM,MAAM,aAAa,QAAQ;AACjC,YAAM,SAAS,SAAS,MAAM,UAAU,GAAG,IAAI,KAAK;AACpD,YAAM,QAAQ,SAAS,MAAM,UAAU,IAAI,GAAG;AAC9C,YAAM,SAAS,IAAI,QAAQ,QAAQ,MAAM,IAAI;AAC7C,YAAM,WAAW,MAAM,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AAChE,YAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK;AAC7C,eAAS,QAAQ;AACjB;AAAA,IACF;AAAA,IACA,KAAK;AACH,oBAAc,UAAU,MAAM,IAAI,QAAQ;AAC1C;AAAA,IACF,KAAK;AACH,oBAAc,UAAU,OAAO,IAAI,QAAQ;AAC3C;AAAA,IACF,KAAK;AACH,oBAAc,UAAU,QAAQ,IAAI,QAAQ;AAC5C;AAAA,IACF,KAAK,cAAc;AACjB,YAAM,MAAM,aAAa,QAAQ;AACjC,YAAM,SAAS,SAAS,MAAM,UAAU,GAAG,IAAI,KAAK;AACpD,YAAM,QAAQ,SAAS,MAAM,UAAU,IAAI,GAAG;AAC9C,YAAM,SAAS,IAAI,QAAQ,SAAS,MAAM,IAAI;AAC9C,YAAM,SAAS,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AACnD,YAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK;AAC3C,eAAS,QAAQ;AACjB;AAAA,IACF;AAAA,EAIE;AAEN;AA2BA,MAAM,gBAAgBa,iBAAM,cAAyC,IAAI;AAEzE,SAAS,mBAAmB;AAC1B,QAAM,UAAUA,iBAAM,WAAW,aAAa;AAC9C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO;AACT;AAMA,SAAS,qBACP,iBACA,cACA,UACyB;AACzB,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,iBAAM,SAAS,YAAY;AAC7E,QAAM,eAAe,oBAAoB;AACzC,QAAM,QAAQ,eAAe,kBAAkB;AAE/C,QAAM,WAAWA,iBAAM;AAAA,IACrB,CAAC,aAAgB;AACf,UAAI,CAAC,cAAc;AACjB,6BAAqB,QAAQ;AAAA,MAC/B;AACA,2CAAW;AAAA,IACb;AAAA,IACA,CAAC,cAAc,QAAQ;AAAA,EAAA;AAGzB,SAAO,CAAC,OAAO,QAAQ;AACzB;AAEA,SAAS,WAAW,MAAsB;AACxC,QAAM,UAAU,KAAK,KAAA;AACrB,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,QAAQ,MAAM,KAAK,EAAE;AAC9B;AAMA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,EACP,eAAe;AAAA,EACf;AAAA,EACA,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ;AAAA,EACA,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgB;AACd,QAAM,aAAaA,iBAAM,OAA4B,IAAI;AAEzD,QAAM,CAAC,OAAO,QAAQ,IAAI;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,QAAM,CAAC,YAAY,aAAa,IAAIA,iBAAM,SAA2B,MAAM;AAG3E,iBAAA;AACA,QAAM,YAAY,CAAC,iBAAiB,cAAc,kBAAkB;AACpE,QAAM,OAAmB,YAAY,SAAS;AAI9C,QAAM,eAAoB;AAAA;AAAA,IAErB,WAAmB;AAAA,MAClB,YAAY;AAAA;AAAA,QAET,YAAoB,UAAU;AAAA,UAC7B,SAAS,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAA;AAAA,UAC3B,YAAY,CAAA;AAAA,UACZ,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,WAAW;AAAA,QAAA,CACZ;AAAA;AAAA,QAEA,eAAuB,UAAU;AAAA,UAChC,aAAa;AAAA,UACb,gBAAgB,EAAE,KAAK,uBAAuB,QAAQ,SAAA;AAAA,QAAS,CAChE;AAAA,MAAA;AAAA,MAEH,aAAa;AAAA,QACX,YAAY;AAAA,UACV,MAAM;AAAA,UACN,cAAc;AAAA,UACd,kBAAkB;AAAA,QAAA;AAAA,MACpB;AAAA,MAEF,SAAS,oBAAoB,SAAY,kBAAkB;AAAA,MAC3D,UAAU,CAAC,YAAY,CAAC;AAAA,MACxB,UAAU,CAAC,EAAE,QAAQ,QAA+C;AAClE,cAAM,OAAO,EAAE,QAAA;AACf,iBAAS,IAAI;AAAA,MACf;AAAA,IAAA,CACD;AAAA,MACD;AAGJA,mBAAM,UAAU,MAAM;AACpB,QAAI,gBAAgB,oBAAoB,QAAW;AACjD,YAAM,iBAAiB,aAAa,QAAA;AACpC,UAAI,mBAAmB,iBAAiB;AACtC,qBAAa,SAAS,WAAW,iBAAiB,KAAK;AAAA,MACzD;AAAA,IACF;AAAA,EACF,GAAG,CAAC,iBAAiB,YAAY,CAAC;AAGlCA,mBAAM,UAAU,MAAM;AACpB,QAAI,cAAc;AAChB,mBAAa,YAAY,CAAC,YAAY,CAAC,QAAQ;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,cAAc,UAAU,QAAQ,CAAC;AAGrCA,mBAAM,UAAU,MAAM;AACpB,QAAI,CAAC,cAAc,CAAC,MAAO;AAE3B,QAAI,YAAY;AAChB,UAAM,QAAQ,WAAW,MAAM;AAC7B,oBAAc,QAAQ;AACtB,UAAI;AACF,gBAAQ,QAAQ,WAAW,KAAK,CAAC,EAC9B,KAAK,MAAM;AACV,cAAI,CAAC,WAAW;AACd,0BAAc,OAAO;AAAA,UACvB;AAAA,QACF,CAAC,EACA,MAAM,MAAM;AACX,cAAI,CAAC,WAAW;AACd,0BAAc,OAAO;AAAA,UACvB;AAAA,QACF,CAAC;AAAA,MACL,QAAQ;AACN,YAAI,CAAC,WAAW;AACd,wBAAc,OAAO;AAAA,QACvB;AAAA,MACF;AAAA,IACF,GAAG,gBAAgB;AAEnB,WAAO,MAAM;AACX,kBAAY;AACZ,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,OAAO,YAAY,gBAAgB,CAAC;AAExC,QAAM,eAAeA,iBAAM;AAAA,IACzB,CAAC,WAAyB;AACxB,UAAI,YAAY,SAAU;AAE1B,UAAI,cAAc;AAChB,gBAAQ,QAAA;AAAA,UACN,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,WAAA,EAAa,IAAA;AAC1C;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,aAAA,EAAe,IAAA;AAC5C;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,aAAA,EAAe,IAAA;AAC5C;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,WAAA,EAAa,IAAA;AAC1C;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,iBAAA,EAAmB,IAAA;AAChD;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,kBAAA,EAAoB,IAAA;AACjD;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,QAAQ,cAAc,EAAE,OAAO,GAAG,EAAE,IAAA;AACzD;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,QAAQ,cAAc,EAAE,OAAO,GAAG,EAAE,IAAA;AACzD;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,QAAQ,cAAc,EAAE,OAAO,GAAG,EAAE,IAAA;AACzD;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,iBAAA,EAAmB,IAAA;AAChD;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,KAAA,EAAO,IAAA;AACpC;AAAA,UACF,KAAK;AACH,yBAAa,QAAQ,MAAA,EAAQ,KAAA,EAAO,IAAA;AACpC;AAAA,UACF,KAAK,QAAQ;AACX,kBAAM,cAAc,aAAa,cAAc,MAAM,EAAE;AACvD,gBAAI,aAAa;AACf,2BAAa,QAAQ,MAAA,EAAQ,UAAA,EAAY,IAAA;AAAA,YAC3C,OAAO;AACL,oBAAM,MAAM,OAAO,OAAO,WAAW;AACrC,kBAAI,KAAK;AACP,6BAAa,QAAQ,QAAQ,QAAQ,EAAE,MAAM,KAAK,EAAE,IAAA;AAAA,cACtD;AAAA,YACF;AACA;AAAA,UACF;AAAA,QAAA;AAAA,MAEJ,WAAW,WAAW,SAAS;AAC7B,4BAAoB,QAAQ,WAAW,SAAS,QAAQ;AAAA,MAC1D;AAAA,IACF;AAAA,IACA,CAAC,UAAU,UAAU,cAAc,QAAQ;AAAA,EAAA;AAG7C,QAAM,iBAAiBA,iBAAM;AAAA,IAC3B,CAAC,WAAkC;AACjC,UAAI,CAAC,aAAc,QAAO;AAC1B,cAAQ,QAAA;AAAA,QACN,KAAK;AACH,iBAAO,aAAa,SAAS,MAAM;AAAA,QACrC,KAAK;AACH,iBAAO,aAAa,SAAS,QAAQ;AAAA,QACvC,KAAK;AACH,iBAAO,aAAa,SAAS,QAAQ;AAAA,QACvC,KAAK;AACH,iBAAO,aAAa,SAAS,MAAM;AAAA,QACrC,KAAK;AACH,iBAAO,aAAa,SAAS,YAAY;AAAA,QAC3C,KAAK;AACH,iBAAO,aAAa,SAAS,aAAa;AAAA,QAC5C,KAAK;AACH,iBAAO,aAAa,SAAS,WAAW,EAAE,OAAO,GAAG;AAAA,QACtD,KAAK;AACH,iBAAO,aAAa,SAAS,WAAW,EAAE,OAAO,GAAG;AAAA,QACtD,KAAK;AACH,iBAAO,aAAa,SAAS,WAAW,EAAE,OAAO,GAAG;AAAA,QACtD,KAAK;AACH,iBAAO,aAAa,SAAS,YAAY;AAAA,QAC3C,KAAK;AACH,iBAAO,aAAa,SAAS,MAAM;AAAA,QACrC,KAAK;AAAA,QACL,KAAK;AACH,iBAAO;AAAA;AAAA,QACT;AACE,iBAAO;AAAA,MAAA;AAAA,IAEb;AAAA,IACA,CAAC,YAAY;AAAA,EAAA;AAGf,QAAM,YAAYA,iBAAM,QAAQ,MAAM;;AACpC,QAAI,cAAc;AAChB,YAAM,SAAO,kBAAa,YAAb,0CAA4B;AACzC,aAAO,WAAW,IAAI;AAAA,IACxB;AACA,WAAO,WAAW,KAAK;AAAA,EACzB,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,QAAM,YAAYA,iBAAM,QAAQ,MAAM;;AACpC,QAAI,cAAc;AAChB,gBAAQ,kBAAa,YAAb,0CAA4B,IAAI;AAAA,IAC1C;AACA,WAAO,MAAM;AAAA,EACf,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,QAAM,eAAmC;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,QAAM,UAAU;AAAA,IACdC,cAAAA,QAAO;AAAA,IACP,YAAYA,cAAAA,QAAO;AAAA,IACnB,YAAYA,cAAAA,QAAO;AAAA,IACnB;AAAA,EAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,QAAM,oBAAoB,aAAa;AAEvC,SACEC,2BAAAA,IAAC,cAAc,UAAd,EAAuB,OAAO,cAC7B,UAAAA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW;AAAA,MACX,iBAAe,YAAY;AAAA,MAC3B,iBAAe,YAAY;AAAA,MAC3B,aAAW;AAAA,MAEV,UAAA,oBACC,WAEAC,2BAAAA,KAAAC,WAAAA,UAAA,EACG,UAAA;AAAA,QAAA,0CACE,eAAA,EACC,UAAAF,+BAAC,oBAAA,EAAmB,cAAW,mBAC5B,UAAA,QAAQ,IAAI,CAAC,qCACX,qBAAA,EAA4B,QAAQ,KAAX,CAAc,CACzC,GACH,GACF;AAAA,uCAED,mBAAA,EAAkB;AAAA,QAClB,aAAaA,2BAAAA,IAAC,iBAAA,EAAgB,eAAa,MAAC,eAAa,KAAA,CAAC;AAAA,MAAA,EAAA,CAC7D;AAAA,IAAA;AAAA,EAAA,GAGN;AAEJ;AAEA,SAAS,cAAc,EAAE,UAAU,aAAiC;AAClE,QAAM,UAAU,CAACD,cAAAA,QAAO,SAAS,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACpE,SACEC,+BAAC,SAAI,WAAW,SAAS,MAAK,WAAU,cAAW,qBAChD,UACH;AAEJ;AAEA,SAAS,mBAAmB,EAAE,UAAU,cAAc,WAAW,aAAsC;AACrG,QAAM,UAAU,CAACD,cAAAA,QAAO,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACzE,SACEC,+BAAC,SAAI,WAAW,SAAS,MAAK,SAAQ,cAAY,WAC/C,UACH;AAEJ;AAEA,SAAS,oBAAoB,EAAE,QAAQ,aAAuC;AAC5E,QAAM,EAAE,cAAc,gBAAgB,UAAU,UAAU,QAAQ,MAAM,aAAA,IAAiB,iBAAA;AACzF,QAAM,OAAO,YAAY,MAAM;AAC/B,QAAM,WAAW,eAAe,IAAI,MAAM;AAC1C,QAAM,SAAS,WAAW,QAAQ,eAAe,MAAM;AACvD,QAAM,gBAAgB,KAAK;AAG3B,MAAI,aAAa,YAAY;AAC7B,MAAI,YAAY,CAAC,YAAY;AAC3B,QAAI,SAAS,YAAY;AAEvB,mBAAa;AAAA,IACf,WAAW,QAAQ;AACjB,mBAAa,WAAW,SAAS,CAAC,OAAO,IAAA,EAAM,KAAA,IAAS,CAAC,OAAO,IAAA,EAAM,KAAA;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,YAA0C;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,QAAM,eAAe,6CAAe;AACpC,QAAM,mBAAmB,OAAO,iBAAiB,aAC7C,aAAa,SAAS,IACtB;AAEJ,QAAM,UAAU;AAAA,IACdD,cAAAA,QAAO;AAAA,IACP,UAAUA,cAAAA,QAAO;AAAA,IACjB;AAAA,EAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW;AAAA,MACX,SAAS,MAAM,aAAa,MAAM;AAAA,MAClC,UAAU;AAAA,MACV,cAAY,KAAK;AAAA,MACjB,OAAO,GAAG,KAAK,KAAK,KAAK,KAAK,QAAQ;AAAA,MACrC,GAAI,WAAW,CAAA,IAAK,EAAE,gBAAgB,OAAA;AAAA,MAEtC,UAAA,iBAAiB,SACd,mBACAA,2BAAAA,IAAC,eAAA,EAAc,MAAM,IAAI,QAAQ,SAAS,SAAS,UAAA,CAAW;AAAA,IAAA;AAAA,EAAA;AAGxE;AAEA,SAAS,gBAAgB,EAAE,aAAmC;AAC5D,QAAM,UAAU,CAACD,cAAAA,QAAO,WAAW,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACtE,wCAAQ,OAAA,EAAI,WAAW,SAAS,MAAK,aAAY,oBAAiB,YAAW;AAC/E;AAEA,SAAS,sBAAsB,EAAE,QAAQ,gBAAgB,QAAQ,aAAyC;AACxG,QAAM,EAAE,WAAA,IAAe,iBAAA;AACvB,QAAM,SAAS,kBAAkB;AACjC,QAAM,eAAe,EAAE,GAAG,uBAAuB,GAAG,OAAA;AACpD,QAAM,QAAQ,aAAa,MAAM;AAEjC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,UAAU;AAAA,IACdA,cAAAA,QAAO;AAAA,IACP,WAAW,WAAWA,cAAAA,QAAO;AAAA,IAC7B;AAAA,EAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACEC,+BAAC,UAAK,WAAW,SAAS,aAAU,UAAS,MAAK,UAC/C,UAAA,MAAA,CACH;AAEJ;AAEA,SAAS,kBAAkB,EAAE,aAAiC;AAC5D,QAAM,EAAE,OAAO,UAAU,aAAa,UAAU,UAAU,QAAQ,MAAM,WAAA,IACtE,iBAAA;AAEF,MAAI,SAAS,UAAU,UAAU,gBAAgB;AAC/C,UAAM,gBAAgB;AACtB,UAAMG,WAAU,CAACJ,sBAAO,SAASA,cAAAA,QAAO,aAAa,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACxF,WACEC,2BAAAA,IAAC,SAAI,WAAWG,UAAS,oBAAkB,aACzC,UAAAH,2BAAAA,IAAC,eAAA,EAAc,OAAA,CAAgB,EAAA,CACjC;AAAA,EAEJ;AAGA,QAAM,UAAU,CAACD,cAAAA,QAAO,SAAS,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACpE,SACEC,2BAAAA,IAAC,OAAA,EAAI,WAAW,SACd,UAAAA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAWD,cAAAA,QAAO;AAAA,MAClB;AAAA,MACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAY;AAAA,IAAA;AAAA,EAAA,GAEhB;AAEJ;AAEA,SAAS,gBAAgB,EAAE,gBAAgB,MAAM,gBAAgB,MAAM,aAAmC;AACxG,QAAM,EAAE,WAAW,WAAW,UAAA,IAAc,iBAAA;AAE5C,QAAM,UAAU,CAACA,cAAAA,QAAO,WAAW,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEtE,QAAM,cAAc,cAAc,UAAa,YAAY;AAC3D,QAAM,cAAc,cAAc,UAAa,CAAC,eAAe,aAAa,YAAY;AAExF,QAAM,mBAAmB;AAAA,IACvBA,cAAAA,QAAO;AAAA,IACP,eAAeA,cAAAA,QAAO;AAAA,IACtB,eAAeA,cAAAA,QAAO;AAAA,EAAA,EACtB,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACEE,2BAAAA,KAAC,OAAA,EAAI,WAAW,SAAS,cAAW,qBAClC,UAAA;AAAA,IAAAD,2BAAAA,IAAC,OAAA,EAAI,WAAWD,cAAAA,QAAO,cAAA,CAAe;AAAA,IACtCE,2BAAAA,KAAC,OAAA,EAAI,WAAWF,cAAAA,QAAO,gBACpB,UAAA;AAAA,MAAA,iBACCE,2BAAAA,KAAC,QAAA,EAAK,WAAWF,cAAAA,QAAO,eACrB,UAAA;AAAA,QAAA;AAAA,QAAU;AAAA,QAAE,cAAc,IAAI,SAAS;AAAA,MAAA,GAC1C;AAAA,MAED,iBAAiB,iBAChBC,+BAAC,iBAAA,CAAA,CAAgB;AAAA,MAElB,iBACCA,2BAAAA,IAAC,QAAA,EAAK,WAAW,kBACd,UAAA,cAAc,SACX,GAAG,SAAS,MAAM,SAAS,KAC3B,GAAG,SAAS,IAAI,cAAc,IAAI,cAAc,YAAY,GAAA,CAElE;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;AAMO,MAAM,SAAS,OAAO,OAAO,YAAY;AAAA,EAC9C,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,WAAW;AACb,CAAC;;;;;;;;;;;"}
@@ -3,6 +3,16 @@ export type EditorFormat = 'bold' | 'italic' | 'strikethrough' | 'link' | 'code'
3
3
  export type EditorSaveStatus = 'idle' | 'saving' | 'saved' | 'error';
4
4
  export type EditorMode = 'rich' | 'markdown';
5
5
  export type EditorSize = 'sm' | 'md' | 'lg';
6
+ export interface EditorToolbarIconRenderState {
7
+ format: EditorFormat;
8
+ active: boolean;
9
+ disabled: boolean;
10
+ readOnly: boolean;
11
+ isDisabled: boolean;
12
+ mode: EditorMode;
13
+ }
14
+ export type EditorToolbarIconSlot = React.ReactNode | ((state: EditorToolbarIconRenderState) => React.ReactNode);
15
+ export type EditorToolbarIcons = Partial<Record<EditorFormat, EditorToolbarIconSlot>>;
6
16
  export interface EditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {
7
17
  children?: React.ReactNode;
8
18
  /** Controlled value */
@@ -23,14 +33,16 @@ export interface EditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
23
33
  toolbar?: boolean;
24
34
  /** Show default status bar */
25
35
  statusBar?: boolean;
26
- /** Auto-save callback */
27
- onAutoSave?: (value: string) => void;
36
+ /** Auto-save callback (sync or async) */
37
+ onAutoSave?: (value: string) => void | Promise<void>;
28
38
  /** Auto-save interval in ms */
29
39
  autoSaveInterval?: number;
30
40
  /** Editor size preset */
31
41
  size?: EditorSize;
32
42
  /** Maximum character count (shows indicator in status bar) */
33
43
  maxLength?: number;
44
+ /** Custom toolbar icons keyed by format/action, for any icon package */
45
+ toolbarIcons?: EditorToolbarIcons;
34
46
  }
35
47
  export interface EditorToolbarProps {
36
48
  children: React.ReactNode;
@@ -77,6 +89,7 @@ interface EditorContextValue {
77
89
  mode: EditorMode;
78
90
  size: EditorSize;
79
91
  maxLength?: number;
92
+ toolbarIcons?: EditorToolbarIcons;
80
93
  wordCount: number;
81
94
  charCount: number;
82
95
  toggleFormat: (f: EditorFormat) => void;
@@ -85,7 +98,7 @@ interface EditorContextValue {
85
98
  contentRef: React.RefObject<HTMLTextAreaElement | null>;
86
99
  }
87
100
  declare function useEditorContext(): EditorContextValue;
88
- declare function EditorRoot({ children, value: controlledValue, defaultValue, onValueChange, placeholder, disabled, readOnly, formats, toolbar, statusBar, onAutoSave, autoSaveInterval, size, maxLength, className, ...htmlProps }: EditorProps): import("react/jsx-runtime").JSX.Element;
101
+ declare function EditorRoot({ children, value: controlledValue, defaultValue, onValueChange, placeholder, disabled, readOnly, formats, toolbar, statusBar, onAutoSave, autoSaveInterval, size, maxLength, toolbarIcons, className, ...htmlProps }: EditorProps): import("react/jsx-runtime").JSX.Element;
89
102
  declare function EditorToolbar({ children, className }: EditorToolbarProps): import("react/jsx-runtime").JSX.Element;
90
103
  declare function EditorToolbarGroup({ children, 'aria-label': ariaLabel, className }: EditorToolbarGroupProps): import("react/jsx-runtime").JSX.Element;
91
104
  declare function EditorToolbarButton({ format, className }: EditorToolbarButtonProps): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsD/B,MAAM,MAAM,YAAY,GACpB,MAAM,GAAG,QAAQ,GAAG,eAAe,GAAG,MAAM,GAAG,MAAM,GACrD,YAAY,GAAG,aAAa,GAC5B,UAAU,GAAG,UAAU,GAAG,UAAU,GACpC,YAAY,GACZ,MAAM,GAAG,MAAM,CAAC;AAEpB,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAErE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;AAE7C,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC;IAC1G,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mCAAmC;IACnC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,+BAA+B;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,uCAAuC;IACvC,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,4CAA4C;IAC5C,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,+BAA+B;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,sBAAsB;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4JD,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,YAAY,EAAE,CAAC;IAExB,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC,cAAc,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC;IAC7C,UAAU,EAAE,gBAAgB,CAAC;IAC7B,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;CACzD;AAID,iBAAS,gBAAgB,uBAMxB;AAsCD,iBAAS,UAAU,CAAC,EAClB,QAAQ,EACR,KAAK,EAAE,eAAe,EACtB,YAAiB,EACjB,aAAa,EACb,WAA+B,EAC/B,QAAgB,EAChB,QAAgB,EAChB,OAAyB,EACzB,OAAc,EACd,SAAgB,EAChB,UAAU,EACV,gBAAwB,EACxB,IAAW,EACX,SAAS,EACT,SAAS,EACT,GAAG,SAAS,EACb,EAAE,WAAW,2CAgQb;AAED,iBAAS,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,kBAAkB,2CAOjE;AAED,iBAAS,kBAAkB,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,uBAAuB,2CAOpG;AAED,iBAAS,mBAAmB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,wBAAwB,2CAqC3E;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CAG3D;AAED,iBAAS,qBAAqB,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,0BAA0B,kDAmBvG;AAED,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE,kBAAkB,2CA8B3D;AAED,iBAAS,eAAe,CAAC,EAAE,aAAoB,EAAE,aAAoB,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CAqCvG;AAMD,eAAO,MAAM,MAAM;;;;;;;;CAQjB,CAAC;AAEH,OAAO,EACL,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,GAChB,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/index.tsx"],"names":[],"mappings":"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"}
@@ -180,6 +180,7 @@ function EditorRoot({
180
180
  autoSaveInterval = 3e4,
181
181
  size = "md",
182
182
  maxLength,
183
+ toolbarIcons,
183
184
  className,
184
185
  ...htmlProps
185
186
  }) {
@@ -218,7 +219,7 @@ function EditorRoot({
218
219
  "aria-multiline": "true"
219
220
  }
220
221
  },
221
- content: defaultValue || controlledValue || "",
222
+ content: controlledValue !== void 0 ? controlledValue : defaultValue,
222
223
  editable: !disabled && !readOnly,
223
224
  onUpdate: ({ editor: e }) => {
224
225
  const html = e.getHTML();
@@ -241,16 +242,29 @@ function EditorRoot({
241
242
  }, [tiptapEditor, disabled, readOnly]);
242
243
  React.useEffect(() => {
243
244
  if (!onAutoSave || !value) return;
245
+ let cancelled = false;
244
246
  const timer = setTimeout(() => {
245
247
  setSaveStatus("saving");
246
248
  try {
247
- onAutoSave(value);
248
- setSaveStatus("saved");
249
+ Promise.resolve(onAutoSave(value)).then(() => {
250
+ if (!cancelled) {
251
+ setSaveStatus("saved");
252
+ }
253
+ }).catch(() => {
254
+ if (!cancelled) {
255
+ setSaveStatus("error");
256
+ }
257
+ });
249
258
  } catch {
250
- setSaveStatus("error");
259
+ if (!cancelled) {
260
+ setSaveStatus("error");
261
+ }
251
262
  }
252
263
  }, autoSaveInterval);
253
- return () => clearTimeout(timer);
264
+ return () => {
265
+ cancelled = true;
266
+ clearTimeout(timer);
267
+ };
254
268
  }, [value, onAutoSave, autoSaveInterval]);
255
269
  const toggleFormat = React.useCallback(
256
270
  (format) => {
@@ -374,6 +388,7 @@ function EditorRoot({
374
388
  mode,
375
389
  size,
376
390
  maxLength,
391
+ toolbarIcons,
377
392
  wordCount,
378
393
  charCount,
379
394
  toggleFormat,
@@ -413,7 +428,7 @@ function EditorToolbarGroup({ children, "aria-label": ariaLabel, className }) {
413
428
  return /* @__PURE__ */ jsx("div", { className: classes, role: "group", "aria-label": ariaLabel, children });
414
429
  }
415
430
  function EditorToolbarButton({ format, className }) {
416
- const { toggleFormat, isFormatActive, disabled, readOnly, editor, mode } = useEditorContext();
431
+ const { toggleFormat, isFormatActive, disabled, readOnly, editor, mode, toolbarIcons } = useEditorContext();
417
432
  const meta = FORMAT_META[format];
418
433
  const isAction = ACTION_FORMATS.has(format);
419
434
  const active = isAction ? false : isFormatActive(format);
@@ -426,6 +441,16 @@ function EditorToolbarButton({ format, className }) {
426
441
  isDisabled = format === "undo" ? !editor.can().undo() : !editor.can().redo();
427
442
  }
428
443
  }
444
+ const iconState = {
445
+ format,
446
+ active,
447
+ disabled,
448
+ readOnly,
449
+ isDisabled,
450
+ mode
451
+ };
452
+ const iconOverride = toolbarIcons == null ? void 0 : toolbarIcons[format];
453
+ const renderedOverride = typeof iconOverride === "function" ? iconOverride(iconState) : iconOverride;
429
454
  const classes = [
430
455
  styles.toolbarButton,
431
456
  active && styles.toolbarButtonActive,
@@ -441,7 +466,7 @@ function EditorToolbarButton({ format, className }) {
441
466
  "aria-label": meta.label,
442
467
  title: `${meta.label} (${meta.shortcut})`,
443
468
  ...isAction ? {} : { "aria-pressed": active },
444
- children: /* @__PURE__ */ jsx(IconComponent, { size: 16, weight: active ? "bold" : "regular" })
469
+ children: iconOverride !== void 0 ? renderedOverride : /* @__PURE__ */ jsx(IconComponent, { size: 16, weight: active ? "bold" : "regular" })
445
470
  }
446
471
  );
447
472
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/Editor/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Editor.module.scss';\nimport {\n TextB,\n TextItalic,\n TextStrikethrough,\n LinkSimple,\n Code,\n ListBullets,\n ListNumbers,\n TextHOne,\n TextHTwo,\n TextHThree,\n Quotes,\n ArrowCounterClockwise,\n ArrowClockwise,\n} from '@phosphor-icons/react';\nimport { KEYBOARD_SHORTCUTS } from '../../utils/keyboard-shortcuts';\n\n// ============================================\n// Lazy-loaded dependency (TipTap)\n// ============================================\n\nlet _useEditor: ((config: Record<string, unknown>) => unknown) | null = null;\nlet _EditorContent: React.ComponentType<Record<string, unknown>> | null = null;\nlet _StarterKit: unknown = null;\nlet _LinkExtension: unknown = null;\nlet _tiptapLoaded = false;\nlet _tiptapFailed = false;\n\nfunction loadTipTapDeps() {\n if (_tiptapLoaded) return;\n _tiptapLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const tiptapReact = require('@tiptap/react');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const starterKit = require('@tiptap/starter-kit');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const linkExt = require('@tiptap/extension-link');\n\n _useEditor = tiptapReact.useEditor;\n _EditorContent = tiptapReact.EditorContent;\n _StarterKit = starterKit.default ?? starterKit.StarterKit ?? starterKit;\n _LinkExtension = linkExt.default ?? linkExt.Link ?? linkExt;\n } catch {\n _tiptapFailed = true;\n }\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport type EditorFormat =\n | 'bold' | 'italic' | 'strikethrough' | 'link' | 'code'\n | 'bulletList' | 'orderedList'\n | 'heading1' | 'heading2' | 'heading3'\n | 'blockquote'\n | 'undo' | 'redo';\n\nexport type EditorSaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nexport type EditorMode = 'rich' | 'markdown';\n\nexport type EditorSize = 'sm' | 'md' | 'lg';\n\nexport interface EditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n children?: React.ReactNode;\n /** Controlled value */\n value?: string;\n /** Default value for uncontrolled usage */\n defaultValue?: string;\n /** Called when content changes */\n onValueChange?: (value: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Disable the editor */\n disabled?: boolean;\n /** Read-only mode */\n readOnly?: boolean;\n /** Which format buttons to show */\n formats?: EditorFormat[];\n /** Show default toolbar */\n toolbar?: boolean;\n /** Show default status bar */\n statusBar?: boolean;\n /** Auto-save callback */\n onAutoSave?: (value: string) => void;\n /** Auto-save interval in ms */\n autoSaveInterval?: number;\n /** Editor size preset */\n size?: EditorSize;\n /** Maximum character count (shows indicator in status bar) */\n maxLength?: number;\n}\n\nexport interface EditorToolbarProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface EditorToolbarGroupProps {\n children: React.ReactNode;\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface EditorToolbarButtonProps {\n /** Which format this button toggles */\n format: EditorFormat;\n className?: string;\n}\n\nexport interface EditorSeparatorProps {\n className?: string;\n}\n\nexport interface EditorStatusIndicatorProps {\n /** Override the save status from context */\n status?: EditorSaveStatus;\n /** Custom labels per status */\n labels?: Partial<Record<EditorSaveStatus, string>>;\n className?: string;\n}\n\nexport interface EditorContentProps {\n className?: string;\n}\n\nexport interface EditorStatusBarProps {\n /** Show word count */\n showWordCount?: boolean;\n /** Show character count */\n showCharCount?: boolean;\n className?: string;\n}\n\n// ============================================\n// Format metadata\n// ============================================\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FORMAT_META: Record<EditorFormat, { icon: React.ComponentType<any>; label: string; shortcut: string }> = {\n bold: { icon: TextB, label: 'Bold', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BOLD.label },\n italic: { icon: TextItalic, label: 'Italic', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ITALIC.label },\n strikethrough: { icon: TextStrikethrough, label: 'Strikethrough', shortcut: KEYBOARD_SHORTCUTS.EDITOR_STRIKETHROUGH.label },\n link: { icon: LinkSimple, label: 'Link', shortcut: KEYBOARD_SHORTCUTS.EDITOR_LINK.label },\n code: { icon: Code, label: 'Code', shortcut: KEYBOARD_SHORTCUTS.EDITOR_CODE.label },\n bulletList: { icon: ListBullets, label: 'Bullet list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BULLET_LIST.label },\n orderedList: { icon: ListNumbers, label: 'Ordered list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ORDERED_LIST.label },\n heading1: { icon: TextHOne, label: 'Heading 1', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING1.label },\n heading2: { icon: TextHTwo, label: 'Heading 2', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING2.label },\n heading3: { icon: TextHThree, label: 'Heading 3', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING3.label },\n blockquote: { icon: Quotes, label: 'Blockquote', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BLOCKQUOTE.label },\n undo: { icon: ArrowCounterClockwise, label: 'Undo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_UNDO.label },\n redo: { icon: ArrowClockwise, label: 'Redo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_REDO.label },\n};\n\nconst DEFAULT_FORMATS: EditorFormat[] = ['bold', 'italic', 'strikethrough', 'link', 'code', 'bulletList'];\n\n/** Formats that are actions (not toggles) — no aria-pressed, different disable logic */\nconst ACTION_FORMATS = new Set<EditorFormat>(['undo', 'redo']);\n\nconst DEFAULT_STATUS_LABELS: Record<EditorSaveStatus, string> = {\n idle: '',\n saving: 'SAVING...',\n saved: 'AUTO-SAVED',\n error: 'SAVE FAILED',\n};\n\n// ============================================\n// Markdown formatting helpers (textarea fallback)\n// ============================================\n\ninterface TextareaSelection {\n start: number;\n end: number;\n text: string;\n}\n\nfunction getSelection(textarea: HTMLTextAreaElement): TextareaSelection {\n return {\n start: textarea.selectionStart,\n end: textarea.selectionEnd,\n text: textarea.value.substring(textarea.selectionStart, textarea.selectionEnd),\n };\n}\n\nfunction wrapSelection(\n textarea: HTMLTextAreaElement,\n prefix: string,\n suffix: string,\n setValue: (v: string) => void,\n) {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const wrapped = `${prefix}${sel.text || 'text'}${suffix}`;\n const newValue = `${before}${wrapped}${after}`;\n setValue(newValue);\n\n requestAnimationFrame(() => {\n textarea.focus();\n const newStart = sel.start + prefix.length;\n const newEnd = newStart + (sel.text || 'text').length;\n textarea.setSelectionRange(newStart, newEnd);\n });\n}\n\nfunction applyMarkdownFormat(\n format: EditorFormat,\n textarea: HTMLTextAreaElement,\n setValue: (v: string) => void,\n) {\n switch (format) {\n case 'bold':\n wrapSelection(textarea, '**', '**', setValue);\n break;\n case 'italic':\n wrapSelection(textarea, '*', '*', setValue);\n break;\n case 'strikethrough':\n wrapSelection(textarea, '~~', '~~', setValue);\n break;\n case 'code':\n wrapSelection(textarea, '`', '`', setValue);\n break;\n case 'link': {\n const sel = getSelection(textarea);\n const linkText = sel.text || 'link text';\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const newValue = `${before}[${linkText}](url)${after}`;\n setValue(newValue);\n requestAnimationFrame(() => {\n textarea.focus();\n const urlStart = sel.start + linkText.length + 3;\n textarea.setSelectionRange(urlStart, urlStart + 3);\n });\n break;\n }\n case 'bulletList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const bulleted = lines.map((l) => `- ${l}`).join('\\n');\n const newValue = `${before}${bulleted}${after}`;\n setValue(newValue);\n break;\n }\n case 'orderedList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const numbered = lines.map((l, i) => `${i + 1}. ${l}`).join('\\n');\n const newValue = `${before}${numbered}${after}`;\n setValue(newValue);\n break;\n }\n case 'heading1':\n wrapSelection(textarea, '# ', '', setValue);\n break;\n case 'heading2':\n wrapSelection(textarea, '## ', '', setValue);\n break;\n case 'heading3':\n wrapSelection(textarea, '### ', '', setValue);\n break;\n case 'blockquote': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'quote').split('\\n');\n const quoted = lines.map((l) => `> ${l}`).join('\\n');\n const newValue = `${before}${quoted}${after}`;\n setValue(newValue);\n break;\n }\n case 'undo':\n case 'redo':\n // Undo/redo in textarea mode is handled natively by the browser\n break;\n }\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface EditorContextValue {\n value: string;\n setValue: (v: string) => void;\n placeholder: string;\n disabled: boolean;\n readOnly: boolean;\n formats: EditorFormat[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editor: any | null;\n mode: EditorMode;\n size: EditorSize;\n maxLength?: number;\n wordCount: number;\n charCount: number;\n toggleFormat: (f: EditorFormat) => void;\n isFormatActive: (f: EditorFormat) => boolean;\n saveStatus: EditorSaveStatus;\n contentRef: React.RefObject<HTMLTextAreaElement | null>;\n}\n\nconst EditorContext = React.createContext<EditorContextValue | null>(null);\n\nfunction useEditorContext() {\n const context = React.useContext(EditorContext);\n if (!context) {\n throw new Error('Editor compound components must be used within an Editor');\n }\n return context;\n}\n\n// ============================================\n// Hooks\n// ============================================\n\nfunction useControllableState<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void,\n): [T, (value: T) => void] {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange],\n );\n\n return [value, setValue];\n}\n\nfunction countWords(text: string): number {\n const trimmed = text.trim();\n if (!trimmed) return 0;\n return trimmed.split(/\\s+/).length;\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction EditorRoot({\n children,\n value: controlledValue,\n defaultValue = '',\n onValueChange,\n placeholder = 'Start typing...',\n disabled = false,\n readOnly = false,\n formats = DEFAULT_FORMATS,\n toolbar = true,\n statusBar = true,\n onAutoSave,\n autoSaveInterval = 30000,\n size = 'md',\n maxLength,\n className,\n ...htmlProps\n}: EditorProps) {\n const contentRef = React.useRef<HTMLTextAreaElement>(null);\n\n const [value, setValue] = useControllableState(\n controlledValue,\n defaultValue,\n onValueChange,\n );\n\n const [saveStatus, setSaveStatus] = React.useState<EditorSaveStatus>('idle');\n\n // Try loading TipTap\n loadTipTapDeps();\n const hasTipTap = !_tiptapFailed && _useEditor && _EditorContent && _StarterKit;\n const mode: EditorMode = hasTipTap ? 'rich' : 'markdown';\n\n // TipTap editor instance (only when available)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tiptapEditor: any = hasTipTap\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_useEditor as any)({\n extensions: [\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_StarterKit as any).configure({\n heading: { levels: [1, 2, 3] },\n blockquote: {},\n codeBlock: false,\n horizontalRule: false,\n hardBreak: false,\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_LinkExtension as any).configure({\n openOnClick: false,\n HTMLAttributes: { rel: 'noopener noreferrer', target: '_blank' },\n }),\n ],\n editorProps: {\n attributes: {\n role: 'textbox',\n 'aria-label': placeholder,\n 'aria-multiline': 'true',\n },\n },\n content: defaultValue || controlledValue || '',\n editable: !disabled && !readOnly,\n onUpdate: ({ editor: e }: { editor: { getHTML: () => string } }) => {\n const html = e.getHTML();\n setValue(html);\n },\n })\n : null;\n\n // Sync controlled value to TipTap\n React.useEffect(() => {\n if (tiptapEditor && controlledValue !== undefined) {\n const currentContent = tiptapEditor.getHTML();\n if (currentContent !== controlledValue) {\n tiptapEditor.commands.setContent(controlledValue, false);\n }\n }\n }, [controlledValue, tiptapEditor]);\n\n // Update editable state\n React.useEffect(() => {\n if (tiptapEditor) {\n tiptapEditor.setEditable(!disabled && !readOnly);\n }\n }, [tiptapEditor, disabled, readOnly]);\n\n // Auto-save\n React.useEffect(() => {\n if (!onAutoSave || !value) return;\n\n const timer = setTimeout(() => {\n setSaveStatus('saving');\n try {\n onAutoSave(value);\n setSaveStatus('saved');\n } catch {\n setSaveStatus('error');\n }\n }, autoSaveInterval);\n\n return () => clearTimeout(timer);\n }, [value, onAutoSave, autoSaveInterval]);\n\n const toggleFormat = React.useCallback(\n (format: EditorFormat) => {\n if (disabled || readOnly) return;\n\n if (tiptapEditor) {\n switch (format) {\n case 'bold':\n tiptapEditor.chain().focus().toggleBold().run();\n break;\n case 'italic':\n tiptapEditor.chain().focus().toggleItalic().run();\n break;\n case 'strikethrough':\n tiptapEditor.chain().focus().toggleStrike().run();\n break;\n case 'code':\n tiptapEditor.chain().focus().toggleCode().run();\n break;\n case 'bulletList':\n tiptapEditor.chain().focus().toggleBulletList().run();\n break;\n case 'orderedList':\n tiptapEditor.chain().focus().toggleOrderedList().run();\n break;\n case 'heading1':\n tiptapEditor.chain().focus().toggleHeading({ level: 1 }).run();\n break;\n case 'heading2':\n tiptapEditor.chain().focus().toggleHeading({ level: 2 }).run();\n break;\n case 'heading3':\n tiptapEditor.chain().focus().toggleHeading({ level: 3 }).run();\n break;\n case 'blockquote':\n tiptapEditor.chain().focus().toggleBlockquote().run();\n break;\n case 'undo':\n tiptapEditor.chain().focus().undo().run();\n break;\n case 'redo':\n tiptapEditor.chain().focus().redo().run();\n break;\n case 'link': {\n const previousUrl = tiptapEditor.getAttributes('link').href;\n if (previousUrl) {\n tiptapEditor.chain().focus().unsetLink().run();\n } else {\n const url = window.prompt('Enter URL');\n if (url) {\n tiptapEditor.chain().focus().setLink({ href: url }).run();\n }\n }\n break;\n }\n }\n } else if (contentRef.current) {\n applyMarkdownFormat(format, contentRef.current, setValue);\n }\n },\n [disabled, readOnly, tiptapEditor, setValue],\n );\n\n const isFormatActive = React.useCallback(\n (format: EditorFormat): boolean => {\n if (!tiptapEditor) return false;\n switch (format) {\n case 'bold':\n return tiptapEditor.isActive('bold');\n case 'italic':\n return tiptapEditor.isActive('italic');\n case 'strikethrough':\n return tiptapEditor.isActive('strike');\n case 'code':\n return tiptapEditor.isActive('code');\n case 'bulletList':\n return tiptapEditor.isActive('bulletList');\n case 'orderedList':\n return tiptapEditor.isActive('orderedList');\n case 'heading1':\n return tiptapEditor.isActive('heading', { level: 1 });\n case 'heading2':\n return tiptapEditor.isActive('heading', { level: 2 });\n case 'heading3':\n return tiptapEditor.isActive('heading', { level: 3 });\n case 'blockquote':\n return tiptapEditor.isActive('blockquote');\n case 'link':\n return tiptapEditor.isActive('link');\n case 'undo':\n case 'redo':\n return false; // Actions don't have active state\n default:\n return false;\n }\n },\n [tiptapEditor],\n );\n\n const wordCount = React.useMemo(() => {\n if (tiptapEditor) {\n const text = tiptapEditor.getText?.() ?? '';\n return countWords(text);\n }\n return countWords(value);\n }, [value, tiptapEditor]);\n\n const charCount = React.useMemo(() => {\n if (tiptapEditor) {\n return (tiptapEditor.getText?.() ?? '').length;\n }\n return value.length;\n }, [value, tiptapEditor]);\n\n const contextValue: EditorContextValue = {\n value,\n setValue,\n placeholder,\n disabled,\n readOnly,\n formats,\n editor: tiptapEditor,\n mode,\n size,\n maxLength,\n wordCount,\n charCount,\n toggleFormat,\n isFormatActive,\n saveStatus,\n contentRef,\n };\n\n const classes = [\n styles.editor,\n disabled && styles.disabled,\n readOnly && styles.readOnly,\n className,\n ].filter(Boolean).join(' ');\n\n const hasCustomChildren = children !== undefined;\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={classes}\n data-disabled={disabled || undefined}\n data-readonly={readOnly || undefined}\n data-size={size}\n >\n {hasCustomChildren ? (\n children\n ) : (\n <>\n {toolbar && (\n <EditorToolbar>\n <EditorToolbarGroup aria-label=\"Text formatting\">\n {formats.map((f) => (\n <EditorToolbarButton key={f} format={f} />\n ))}\n </EditorToolbarGroup>\n </EditorToolbar>\n )}\n <EditorContentArea />\n {statusBar && <EditorStatusBar showWordCount showCharCount />}\n </>\n )}\n </div>\n </EditorContext.Provider>\n );\n}\n\nfunction EditorToolbar({ children, className }: EditorToolbarProps) {\n const classes = [styles.toolbar, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"toolbar\" aria-label=\"Editor formatting\">\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarGroup({ children, 'aria-label': ariaLabel, className }: EditorToolbarGroupProps) {\n const classes = [styles.toolbarGroup, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"group\" aria-label={ariaLabel}>\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarButton({ format, className }: EditorToolbarButtonProps) {\n const { toggleFormat, isFormatActive, disabled, readOnly, editor, mode } = useEditorContext();\n const meta = FORMAT_META[format];\n const isAction = ACTION_FORMATS.has(format);\n const active = isAction ? false : isFormatActive(format);\n const IconComponent = meta.icon;\n\n // Action buttons (undo/redo) have special disable logic\n let isDisabled = disabled || readOnly;\n if (isAction && !isDisabled) {\n if (mode === 'markdown') {\n // Undo/redo in textarea mode is handled natively by the browser\n isDisabled = true;\n } else if (editor) {\n isDisabled = format === 'undo' ? !editor.can().undo() : !editor.can().redo();\n }\n }\n\n const classes = [\n styles.toolbarButton,\n active && styles.toolbarButtonActive,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => toggleFormat(format)}\n disabled={isDisabled}\n aria-label={meta.label}\n title={`${meta.label} (${meta.shortcut})`}\n {...(isAction ? {} : { 'aria-pressed': active })}\n >\n <IconComponent size={16} weight={active ? 'bold' : 'regular'} />\n </button>\n );\n}\n\nfunction EditorSeparator({ className }: EditorSeparatorProps) {\n const classes = [styles.separator, className].filter(Boolean).join(' ');\n return <div className={classes} role=\"separator\" aria-orientation=\"vertical\" />;\n}\n\nfunction EditorStatusIndicator({ status: statusOverride, labels, className }: EditorStatusIndicatorProps) {\n const { saveStatus } = useEditorContext();\n const status = statusOverride ?? saveStatus;\n const mergedLabels = { ...DEFAULT_STATUS_LABELS, ...labels };\n const label = mergedLabels[status];\n\n if (!label) return null;\n\n const classes = [\n styles.statusIndicator,\n status === 'error' && styles.statusError,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <span className={classes} aria-live=\"polite\" role=\"status\">\n {label}\n </span>\n );\n}\n\nfunction EditorContentArea({ className }: EditorContentProps) {\n const { value, setValue, placeholder, disabled, readOnly, editor, mode, contentRef } =\n useEditorContext();\n\n if (mode === 'rich' && editor && _EditorContent) {\n const TipTapContent = _EditorContent;\n const classes = [styles.content, styles.contentRich, className].filter(Boolean).join(' ');\n return (\n <div className={classes} data-placeholder={placeholder}>\n <TipTapContent editor={editor} />\n </div>\n );\n }\n\n // Textarea fallback for markdown mode\n const classes = [styles.content, className].filter(Boolean).join(' ');\n return (\n <div className={classes}>\n <textarea\n ref={contentRef}\n className={styles.contentTextarea}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={placeholder}\n />\n </div>\n );\n}\n\nfunction EditorStatusBar({ showWordCount = true, showCharCount = true, className }: EditorStatusBarProps) {\n const { wordCount, charCount, maxLength } = useEditorContext();\n\n const classes = [styles.statusBar, className].filter(Boolean).join(' ');\n\n const isOverLimit = maxLength !== undefined && charCount > maxLength;\n const isNearLimit = maxLength !== undefined && !isOverLimit && charCount >= maxLength * 0.9;\n\n const charLimitClasses = [\n styles.statusBarItem,\n isNearLimit && styles.statusBarItemWarning,\n isOverLimit && styles.statusBarItemError,\n ].filter(Boolean).join(' ');\n\n return (\n <div className={classes} aria-label=\"Editor statistics\">\n <div className={styles.statusBarLeft} />\n <div className={styles.statusBarRight}>\n {showWordCount && (\n <span className={styles.statusBarItem}>\n {wordCount} {wordCount === 1 ? 'Word' : 'Words'}\n </span>\n )}\n {showWordCount && showCharCount && (\n <EditorSeparator />\n )}\n {showCharCount && (\n <span className={charLimitClasses}>\n {maxLength !== undefined\n ? `${charCount} / ${maxLength}`\n : `${charCount} ${charCount === 1 ? 'Character' : 'Characters'}`\n }\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Editor = Object.assign(EditorRoot, {\n Toolbar: EditorToolbar,\n ToolbarGroup: EditorToolbarGroup,\n ToolbarButton: EditorToolbarButton,\n Separator: EditorSeparator,\n StatusIndicator: EditorStatusIndicator,\n Content: EditorContentArea,\n StatusBar: EditorStatusBar,\n});\n\nexport {\n EditorRoot,\n EditorToolbar,\n EditorToolbarGroup,\n EditorToolbarButton,\n EditorSeparator,\n EditorStatusIndicator,\n EditorContentArea,\n EditorStatusBar,\n};\n\nexport { useEditorContext };\n"],"names":["classes"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/Editor/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Editor.module.scss';\nimport {\n TextB,\n TextItalic,\n TextStrikethrough,\n LinkSimple,\n Code,\n ListBullets,\n ListNumbers,\n TextHOne,\n TextHTwo,\n TextHThree,\n Quotes,\n ArrowCounterClockwise,\n ArrowClockwise,\n} from '@phosphor-icons/react';\nimport { KEYBOARD_SHORTCUTS } from '../../utils/keyboard-shortcuts';\n\n// ============================================\n// Lazy-loaded dependency (TipTap)\n// ============================================\n\nlet _useEditor: ((config: Record<string, unknown>) => unknown) | null = null;\nlet _EditorContent: React.ComponentType<Record<string, unknown>> | null = null;\nlet _StarterKit: unknown = null;\nlet _LinkExtension: unknown = null;\nlet _tiptapLoaded = false;\nlet _tiptapFailed = false;\n\nfunction loadTipTapDeps() {\n if (_tiptapLoaded) return;\n _tiptapLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const tiptapReact = require('@tiptap/react');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const starterKit = require('@tiptap/starter-kit');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const linkExt = require('@tiptap/extension-link');\n\n _useEditor = tiptapReact.useEditor;\n _EditorContent = tiptapReact.EditorContent;\n _StarterKit = starterKit.default ?? starterKit.StarterKit ?? starterKit;\n _LinkExtension = linkExt.default ?? linkExt.Link ?? linkExt;\n } catch {\n _tiptapFailed = true;\n }\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport type EditorFormat =\n | 'bold' | 'italic' | 'strikethrough' | 'link' | 'code'\n | 'bulletList' | 'orderedList'\n | 'heading1' | 'heading2' | 'heading3'\n | 'blockquote'\n | 'undo' | 'redo';\n\nexport type EditorSaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nexport type EditorMode = 'rich' | 'markdown';\n\nexport type EditorSize = 'sm' | 'md' | 'lg';\n\nexport interface EditorToolbarIconRenderState {\n format: EditorFormat;\n active: boolean;\n disabled: boolean;\n readOnly: boolean;\n isDisabled: boolean;\n mode: EditorMode;\n}\n\nexport type EditorToolbarIconSlot =\n | React.ReactNode\n | ((state: EditorToolbarIconRenderState) => React.ReactNode);\n\nexport type EditorToolbarIcons = Partial<Record<EditorFormat, EditorToolbarIconSlot>>;\n\nexport interface EditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n children?: React.ReactNode;\n /** Controlled value */\n value?: string;\n /** Default value for uncontrolled usage */\n defaultValue?: string;\n /** Called when content changes */\n onValueChange?: (value: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Disable the editor */\n disabled?: boolean;\n /** Read-only mode */\n readOnly?: boolean;\n /** Which format buttons to show */\n formats?: EditorFormat[];\n /** Show default toolbar */\n toolbar?: boolean;\n /** Show default status bar */\n statusBar?: boolean;\n /** Auto-save callback (sync or async) */\n onAutoSave?: (value: string) => void | Promise<void>;\n /** Auto-save interval in ms */\n autoSaveInterval?: number;\n /** Editor size preset */\n size?: EditorSize;\n /** Maximum character count (shows indicator in status bar) */\n maxLength?: number;\n /** Custom toolbar icons keyed by format/action, for any icon package */\n toolbarIcons?: EditorToolbarIcons;\n}\n\nexport interface EditorToolbarProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface EditorToolbarGroupProps {\n children: React.ReactNode;\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface EditorToolbarButtonProps {\n /** Which format this button toggles */\n format: EditorFormat;\n className?: string;\n}\n\nexport interface EditorSeparatorProps {\n className?: string;\n}\n\nexport interface EditorStatusIndicatorProps {\n /** Override the save status from context */\n status?: EditorSaveStatus;\n /** Custom labels per status */\n labels?: Partial<Record<EditorSaveStatus, string>>;\n className?: string;\n}\n\nexport interface EditorContentProps {\n className?: string;\n}\n\nexport interface EditorStatusBarProps {\n /** Show word count */\n showWordCount?: boolean;\n /** Show character count */\n showCharCount?: boolean;\n className?: string;\n}\n\n// ============================================\n// Format metadata\n// ============================================\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FORMAT_META: Record<EditorFormat, { icon: React.ComponentType<any>; label: string; shortcut: string }> = {\n bold: { icon: TextB, label: 'Bold', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BOLD.label },\n italic: { icon: TextItalic, label: 'Italic', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ITALIC.label },\n strikethrough: { icon: TextStrikethrough, label: 'Strikethrough', shortcut: KEYBOARD_SHORTCUTS.EDITOR_STRIKETHROUGH.label },\n link: { icon: LinkSimple, label: 'Link', shortcut: KEYBOARD_SHORTCUTS.EDITOR_LINK.label },\n code: { icon: Code, label: 'Code', shortcut: KEYBOARD_SHORTCUTS.EDITOR_CODE.label },\n bulletList: { icon: ListBullets, label: 'Bullet list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BULLET_LIST.label },\n orderedList: { icon: ListNumbers, label: 'Ordered list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ORDERED_LIST.label },\n heading1: { icon: TextHOne, label: 'Heading 1', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING1.label },\n heading2: { icon: TextHTwo, label: 'Heading 2', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING2.label },\n heading3: { icon: TextHThree, label: 'Heading 3', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING3.label },\n blockquote: { icon: Quotes, label: 'Blockquote', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BLOCKQUOTE.label },\n undo: { icon: ArrowCounterClockwise, label: 'Undo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_UNDO.label },\n redo: { icon: ArrowClockwise, label: 'Redo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_REDO.label },\n};\n\nconst DEFAULT_FORMATS: EditorFormat[] = ['bold', 'italic', 'strikethrough', 'link', 'code', 'bulletList'];\n\n/** Formats that are actions (not toggles) — no aria-pressed, different disable logic */\nconst ACTION_FORMATS = new Set<EditorFormat>(['undo', 'redo']);\n\nconst DEFAULT_STATUS_LABELS: Record<EditorSaveStatus, string> = {\n idle: '',\n saving: 'SAVING...',\n saved: 'AUTO-SAVED',\n error: 'SAVE FAILED',\n};\n\n// ============================================\n// Markdown formatting helpers (textarea fallback)\n// ============================================\n\ninterface TextareaSelection {\n start: number;\n end: number;\n text: string;\n}\n\nfunction getSelection(textarea: HTMLTextAreaElement): TextareaSelection {\n return {\n start: textarea.selectionStart,\n end: textarea.selectionEnd,\n text: textarea.value.substring(textarea.selectionStart, textarea.selectionEnd),\n };\n}\n\nfunction wrapSelection(\n textarea: HTMLTextAreaElement,\n prefix: string,\n suffix: string,\n setValue: (v: string) => void,\n) {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const wrapped = `${prefix}${sel.text || 'text'}${suffix}`;\n const newValue = `${before}${wrapped}${after}`;\n setValue(newValue);\n\n requestAnimationFrame(() => {\n textarea.focus();\n const newStart = sel.start + prefix.length;\n const newEnd = newStart + (sel.text || 'text').length;\n textarea.setSelectionRange(newStart, newEnd);\n });\n}\n\nfunction applyMarkdownFormat(\n format: EditorFormat,\n textarea: HTMLTextAreaElement,\n setValue: (v: string) => void,\n) {\n switch (format) {\n case 'bold':\n wrapSelection(textarea, '**', '**', setValue);\n break;\n case 'italic':\n wrapSelection(textarea, '*', '*', setValue);\n break;\n case 'strikethrough':\n wrapSelection(textarea, '~~', '~~', setValue);\n break;\n case 'code':\n wrapSelection(textarea, '`', '`', setValue);\n break;\n case 'link': {\n const sel = getSelection(textarea);\n const linkText = sel.text || 'link text';\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const newValue = `${before}[${linkText}](url)${after}`;\n setValue(newValue);\n requestAnimationFrame(() => {\n textarea.focus();\n const urlStart = sel.start + linkText.length + 3;\n textarea.setSelectionRange(urlStart, urlStart + 3);\n });\n break;\n }\n case 'bulletList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const bulleted = lines.map((l) => `- ${l}`).join('\\n');\n const newValue = `${before}${bulleted}${after}`;\n setValue(newValue);\n break;\n }\n case 'orderedList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const numbered = lines.map((l, i) => `${i + 1}. ${l}`).join('\\n');\n const newValue = `${before}${numbered}${after}`;\n setValue(newValue);\n break;\n }\n case 'heading1':\n wrapSelection(textarea, '# ', '', setValue);\n break;\n case 'heading2':\n wrapSelection(textarea, '## ', '', setValue);\n break;\n case 'heading3':\n wrapSelection(textarea, '### ', '', setValue);\n break;\n case 'blockquote': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'quote').split('\\n');\n const quoted = lines.map((l) => `> ${l}`).join('\\n');\n const newValue = `${before}${quoted}${after}`;\n setValue(newValue);\n break;\n }\n case 'undo':\n case 'redo':\n // Undo/redo in textarea mode is handled natively by the browser\n break;\n }\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface EditorContextValue {\n value: string;\n setValue: (v: string) => void;\n placeholder: string;\n disabled: boolean;\n readOnly: boolean;\n formats: EditorFormat[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editor: any | null;\n mode: EditorMode;\n size: EditorSize;\n maxLength?: number;\n toolbarIcons?: EditorToolbarIcons;\n wordCount: number;\n charCount: number;\n toggleFormat: (f: EditorFormat) => void;\n isFormatActive: (f: EditorFormat) => boolean;\n saveStatus: EditorSaveStatus;\n contentRef: React.RefObject<HTMLTextAreaElement | null>;\n}\n\nconst EditorContext = React.createContext<EditorContextValue | null>(null);\n\nfunction useEditorContext() {\n const context = React.useContext(EditorContext);\n if (!context) {\n throw new Error('Editor compound components must be used within an Editor');\n }\n return context;\n}\n\n// ============================================\n// Hooks\n// ============================================\n\nfunction useControllableState<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void,\n): [T, (value: T) => void] {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange],\n );\n\n return [value, setValue];\n}\n\nfunction countWords(text: string): number {\n const trimmed = text.trim();\n if (!trimmed) return 0;\n return trimmed.split(/\\s+/).length;\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction EditorRoot({\n children,\n value: controlledValue,\n defaultValue = '',\n onValueChange,\n placeholder = 'Start typing...',\n disabled = false,\n readOnly = false,\n formats = DEFAULT_FORMATS,\n toolbar = true,\n statusBar = true,\n onAutoSave,\n autoSaveInterval = 30000,\n size = 'md',\n maxLength,\n toolbarIcons,\n className,\n ...htmlProps\n}: EditorProps) {\n const contentRef = React.useRef<HTMLTextAreaElement>(null);\n\n const [value, setValue] = useControllableState(\n controlledValue,\n defaultValue,\n onValueChange,\n );\n\n const [saveStatus, setSaveStatus] = React.useState<EditorSaveStatus>('idle');\n\n // Try loading TipTap\n loadTipTapDeps();\n const hasTipTap = !_tiptapFailed && _useEditor && _EditorContent && _StarterKit;\n const mode: EditorMode = hasTipTap ? 'rich' : 'markdown';\n\n // TipTap editor instance (only when available)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tiptapEditor: any = hasTipTap\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_useEditor as any)({\n extensions: [\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_StarterKit as any).configure({\n heading: { levels: [1, 2, 3] },\n blockquote: {},\n codeBlock: false,\n horizontalRule: false,\n hardBreak: false,\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_LinkExtension as any).configure({\n openOnClick: false,\n HTMLAttributes: { rel: 'noopener noreferrer', target: '_blank' },\n }),\n ],\n editorProps: {\n attributes: {\n role: 'textbox',\n 'aria-label': placeholder,\n 'aria-multiline': 'true',\n },\n },\n content: controlledValue !== undefined ? controlledValue : defaultValue,\n editable: !disabled && !readOnly,\n onUpdate: ({ editor: e }: { editor: { getHTML: () => string } }) => {\n const html = e.getHTML();\n setValue(html);\n },\n })\n : null;\n\n // Sync controlled value to TipTap\n React.useEffect(() => {\n if (tiptapEditor && controlledValue !== undefined) {\n const currentContent = tiptapEditor.getHTML();\n if (currentContent !== controlledValue) {\n tiptapEditor.commands.setContent(controlledValue, false);\n }\n }\n }, [controlledValue, tiptapEditor]);\n\n // Update editable state\n React.useEffect(() => {\n if (tiptapEditor) {\n tiptapEditor.setEditable(!disabled && !readOnly);\n }\n }, [tiptapEditor, disabled, readOnly]);\n\n // Auto-save\n React.useEffect(() => {\n if (!onAutoSave || !value) return;\n\n let cancelled = false;\n const timer = setTimeout(() => {\n setSaveStatus('saving');\n try {\n Promise.resolve(onAutoSave(value))\n .then(() => {\n if (!cancelled) {\n setSaveStatus('saved');\n }\n })\n .catch(() => {\n if (!cancelled) {\n setSaveStatus('error');\n }\n });\n } catch {\n if (!cancelled) {\n setSaveStatus('error');\n }\n }\n }, autoSaveInterval);\n\n return () => {\n cancelled = true;\n clearTimeout(timer);\n };\n }, [value, onAutoSave, autoSaveInterval]);\n\n const toggleFormat = React.useCallback(\n (format: EditorFormat) => {\n if (disabled || readOnly) return;\n\n if (tiptapEditor) {\n switch (format) {\n case 'bold':\n tiptapEditor.chain().focus().toggleBold().run();\n break;\n case 'italic':\n tiptapEditor.chain().focus().toggleItalic().run();\n break;\n case 'strikethrough':\n tiptapEditor.chain().focus().toggleStrike().run();\n break;\n case 'code':\n tiptapEditor.chain().focus().toggleCode().run();\n break;\n case 'bulletList':\n tiptapEditor.chain().focus().toggleBulletList().run();\n break;\n case 'orderedList':\n tiptapEditor.chain().focus().toggleOrderedList().run();\n break;\n case 'heading1':\n tiptapEditor.chain().focus().toggleHeading({ level: 1 }).run();\n break;\n case 'heading2':\n tiptapEditor.chain().focus().toggleHeading({ level: 2 }).run();\n break;\n case 'heading3':\n tiptapEditor.chain().focus().toggleHeading({ level: 3 }).run();\n break;\n case 'blockquote':\n tiptapEditor.chain().focus().toggleBlockquote().run();\n break;\n case 'undo':\n tiptapEditor.chain().focus().undo().run();\n break;\n case 'redo':\n tiptapEditor.chain().focus().redo().run();\n break;\n case 'link': {\n const previousUrl = tiptapEditor.getAttributes('link').href;\n if (previousUrl) {\n tiptapEditor.chain().focus().unsetLink().run();\n } else {\n const url = window.prompt('Enter URL');\n if (url) {\n tiptapEditor.chain().focus().setLink({ href: url }).run();\n }\n }\n break;\n }\n }\n } else if (contentRef.current) {\n applyMarkdownFormat(format, contentRef.current, setValue);\n }\n },\n [disabled, readOnly, tiptapEditor, setValue],\n );\n\n const isFormatActive = React.useCallback(\n (format: EditorFormat): boolean => {\n if (!tiptapEditor) return false;\n switch (format) {\n case 'bold':\n return tiptapEditor.isActive('bold');\n case 'italic':\n return tiptapEditor.isActive('italic');\n case 'strikethrough':\n return tiptapEditor.isActive('strike');\n case 'code':\n return tiptapEditor.isActive('code');\n case 'bulletList':\n return tiptapEditor.isActive('bulletList');\n case 'orderedList':\n return tiptapEditor.isActive('orderedList');\n case 'heading1':\n return tiptapEditor.isActive('heading', { level: 1 });\n case 'heading2':\n return tiptapEditor.isActive('heading', { level: 2 });\n case 'heading3':\n return tiptapEditor.isActive('heading', { level: 3 });\n case 'blockquote':\n return tiptapEditor.isActive('blockquote');\n case 'link':\n return tiptapEditor.isActive('link');\n case 'undo':\n case 'redo':\n return false; // Actions don't have active state\n default:\n return false;\n }\n },\n [tiptapEditor],\n );\n\n const wordCount = React.useMemo(() => {\n if (tiptapEditor) {\n const text = tiptapEditor.getText?.() ?? '';\n return countWords(text);\n }\n return countWords(value);\n }, [value, tiptapEditor]);\n\n const charCount = React.useMemo(() => {\n if (tiptapEditor) {\n return (tiptapEditor.getText?.() ?? '').length;\n }\n return value.length;\n }, [value, tiptapEditor]);\n\n const contextValue: EditorContextValue = {\n value,\n setValue,\n placeholder,\n disabled,\n readOnly,\n formats,\n editor: tiptapEditor,\n mode,\n size,\n maxLength,\n toolbarIcons,\n wordCount,\n charCount,\n toggleFormat,\n isFormatActive,\n saveStatus,\n contentRef,\n };\n\n const classes = [\n styles.editor,\n disabled && styles.disabled,\n readOnly && styles.readOnly,\n className,\n ].filter(Boolean).join(' ');\n\n const hasCustomChildren = children !== undefined;\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={classes}\n data-disabled={disabled || undefined}\n data-readonly={readOnly || undefined}\n data-size={size}\n >\n {hasCustomChildren ? (\n children\n ) : (\n <>\n {toolbar && (\n <EditorToolbar>\n <EditorToolbarGroup aria-label=\"Text formatting\">\n {formats.map((f) => (\n <EditorToolbarButton key={f} format={f} />\n ))}\n </EditorToolbarGroup>\n </EditorToolbar>\n )}\n <EditorContentArea />\n {statusBar && <EditorStatusBar showWordCount showCharCount />}\n </>\n )}\n </div>\n </EditorContext.Provider>\n );\n}\n\nfunction EditorToolbar({ children, className }: EditorToolbarProps) {\n const classes = [styles.toolbar, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"toolbar\" aria-label=\"Editor formatting\">\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarGroup({ children, 'aria-label': ariaLabel, className }: EditorToolbarGroupProps) {\n const classes = [styles.toolbarGroup, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"group\" aria-label={ariaLabel}>\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarButton({ format, className }: EditorToolbarButtonProps) {\n const { toggleFormat, isFormatActive, disabled, readOnly, editor, mode, toolbarIcons } = useEditorContext();\n const meta = FORMAT_META[format];\n const isAction = ACTION_FORMATS.has(format);\n const active = isAction ? false : isFormatActive(format);\n const IconComponent = meta.icon;\n\n // Action buttons (undo/redo) have special disable logic\n let isDisabled = disabled || readOnly;\n if (isAction && !isDisabled) {\n if (mode === 'markdown') {\n // Undo/redo in textarea mode is handled natively by the browser\n isDisabled = true;\n } else if (editor) {\n isDisabled = format === 'undo' ? !editor.can().undo() : !editor.can().redo();\n }\n }\n\n const iconState: EditorToolbarIconRenderState = {\n format,\n active,\n disabled,\n readOnly,\n isDisabled,\n mode,\n };\n\n const iconOverride = toolbarIcons?.[format];\n const renderedOverride = typeof iconOverride === 'function'\n ? iconOverride(iconState)\n : iconOverride;\n\n const classes = [\n styles.toolbarButton,\n active && styles.toolbarButtonActive,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => toggleFormat(format)}\n disabled={isDisabled}\n aria-label={meta.label}\n title={`${meta.label} (${meta.shortcut})`}\n {...(isAction ? {} : { 'aria-pressed': active })}\n >\n {iconOverride !== undefined\n ? renderedOverride\n : <IconComponent size={16} weight={active ? 'bold' : 'regular'} />}\n </button>\n );\n}\n\nfunction EditorSeparator({ className }: EditorSeparatorProps) {\n const classes = [styles.separator, className].filter(Boolean).join(' ');\n return <div className={classes} role=\"separator\" aria-orientation=\"vertical\" />;\n}\n\nfunction EditorStatusIndicator({ status: statusOverride, labels, className }: EditorStatusIndicatorProps) {\n const { saveStatus } = useEditorContext();\n const status = statusOverride ?? saveStatus;\n const mergedLabels = { ...DEFAULT_STATUS_LABELS, ...labels };\n const label = mergedLabels[status];\n\n if (!label) return null;\n\n const classes = [\n styles.statusIndicator,\n status === 'error' && styles.statusError,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <span className={classes} aria-live=\"polite\" role=\"status\">\n {label}\n </span>\n );\n}\n\nfunction EditorContentArea({ className }: EditorContentProps) {\n const { value, setValue, placeholder, disabled, readOnly, editor, mode, contentRef } =\n useEditorContext();\n\n if (mode === 'rich' && editor && _EditorContent) {\n const TipTapContent = _EditorContent;\n const classes = [styles.content, styles.contentRich, className].filter(Boolean).join(' ');\n return (\n <div className={classes} data-placeholder={placeholder}>\n <TipTapContent editor={editor} />\n </div>\n );\n }\n\n // Textarea fallback for markdown mode\n const classes = [styles.content, className].filter(Boolean).join(' ');\n return (\n <div className={classes}>\n <textarea\n ref={contentRef}\n className={styles.contentTextarea}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={placeholder}\n />\n </div>\n );\n}\n\nfunction EditorStatusBar({ showWordCount = true, showCharCount = true, className }: EditorStatusBarProps) {\n const { wordCount, charCount, maxLength } = useEditorContext();\n\n const classes = [styles.statusBar, className].filter(Boolean).join(' ');\n\n const isOverLimit = maxLength !== undefined && charCount > maxLength;\n const isNearLimit = maxLength !== undefined && !isOverLimit && charCount >= maxLength * 0.9;\n\n const charLimitClasses = [\n styles.statusBarItem,\n isNearLimit && styles.statusBarItemWarning,\n isOverLimit && styles.statusBarItemError,\n ].filter(Boolean).join(' ');\n\n return (\n <div className={classes} aria-label=\"Editor statistics\">\n <div className={styles.statusBarLeft} />\n <div className={styles.statusBarRight}>\n {showWordCount && (\n <span className={styles.statusBarItem}>\n {wordCount} {wordCount === 1 ? 'Word' : 'Words'}\n </span>\n )}\n {showWordCount && showCharCount && (\n <EditorSeparator />\n )}\n {showCharCount && (\n <span className={charLimitClasses}>\n {maxLength !== undefined\n ? `${charCount} / ${maxLength}`\n : `${charCount} ${charCount === 1 ? 'Character' : 'Characters'}`\n }\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Editor = Object.assign(EditorRoot, {\n Toolbar: EditorToolbar,\n ToolbarGroup: EditorToolbarGroup,\n ToolbarButton: EditorToolbarButton,\n Separator: EditorSeparator,\n StatusIndicator: EditorStatusIndicator,\n Content: EditorContentArea,\n StatusBar: EditorStatusBar,\n});\n\nexport {\n EditorRoot,\n EditorToolbar,\n EditorToolbarGroup,\n EditorToolbarButton,\n EditorSeparator,\n EditorStatusIndicator,\n EditorContentArea,\n EditorStatusBar,\n};\n\nexport { useEditorContext };\n"],"names":["classes"],"mappings":"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"}
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const emptyState = "_emptyState_1m2hy_1";
4
- const sm = "_sm_1m2hy_11";
5
- const title = "_title_1m2hy_14";
6
- const description = "_description_1m2hy_17";
7
- const icon = "_icon_1m2hy_21";
8
- const actions = "_actions_1m2hy_24";
9
- const md = "_md_1m2hy_28";
10
- const lg = "_lg_1m2hy_45";
3
+ const emptyState = "_emptyState_1rpj8_1";
4
+ const sm = "_sm_1rpj8_11";
5
+ const title = "_title_1rpj8_14";
6
+ const description = "_description_1rpj8_17";
7
+ const icon = "_icon_1rpj8_21";
8
+ const actions = "_actions_1rpj8_24";
9
+ const md = "_md_1rpj8_28";
10
+ const lg = "_lg_1rpj8_45";
11
11
  const styles = {
12
12
  emptyState,
13
13
  sm,
@@ -1,11 +1,11 @@
1
- const emptyState = "_emptyState_1m2hy_1";
2
- const sm = "_sm_1m2hy_11";
3
- const title = "_title_1m2hy_14";
4
- const description = "_description_1m2hy_17";
5
- const icon = "_icon_1m2hy_21";
6
- const actions = "_actions_1m2hy_24";
7
- const md = "_md_1m2hy_28";
8
- const lg = "_lg_1m2hy_45";
1
+ const emptyState = "_emptyState_1rpj8_1";
2
+ const sm = "_sm_1rpj8_11";
3
+ const title = "_title_1rpj8_14";
4
+ const description = "_description_1rpj8_17";
5
+ const icon = "_icon_1rpj8_21";
6
+ const actions = "_actions_1rpj8_24";
7
+ const md = "_md_1rpj8_28";
8
+ const lg = "_lg_1rpj8_45";
9
9
  const styles = {
10
10
  emptyState,
11
11
  sm,