@plexui/ui 0.19.0 → 0.20.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 (401) hide show
  1. package/README.md +1 -3
  2. package/dist/es/components/Accordion/Accordion.js +2 -2
  3. package/dist/es/components/Accordion/Accordion.js.map +1 -1
  4. package/dist/es/components/Accordion/index.js +1 -1
  5. package/dist/es/components/Alert/Alert.js +6 -6
  6. package/dist/es/components/Alert/Alert.js.map +1 -1
  7. package/dist/es/components/Alert/index.js +1 -1
  8. package/dist/es/components/Avatar/Avatar.js +12 -5
  9. package/dist/es/components/Avatar/Avatar.js.map +1 -1
  10. package/dist/es/components/Avatar/AvatarGroup.js +2 -2
  11. package/dist/es/components/Avatar/AvatarGroup.js.map +1 -1
  12. package/dist/es/components/Avatar/index.js +2 -2
  13. package/dist/es/components/Badge/index.js +3 -3
  14. package/dist/es/components/Badge/index.js.map +1 -1
  15. package/dist/es/components/Breadcrumb/Breadcrumb.js +34 -0
  16. package/dist/es/components/Breadcrumb/Breadcrumb.js.map +1 -0
  17. package/dist/es/components/Breadcrumb/index.js +2 -0
  18. package/dist/es/components/Breadcrumb/index.js.map +1 -0
  19. package/dist/es/components/Button/Button.js +7 -7
  20. package/dist/es/components/Button/Button.js.map +1 -1
  21. package/dist/es/components/Button/CopyButton.js +25 -13
  22. package/dist/es/components/Button/CopyButton.js.map +1 -1
  23. package/dist/es/components/Button/index.js +2 -2
  24. package/dist/es/components/ButtonGroup/ButtonGroup.js +2 -2
  25. package/dist/es/components/ButtonGroup/ButtonGroup.js.map +1 -1
  26. package/dist/es/components/ButtonGroup/index.js +1 -1
  27. package/dist/es/components/Card/Card.js +4 -3
  28. package/dist/es/components/Card/Card.js.map +1 -1
  29. package/dist/es/components/Card/index.js +1 -1
  30. package/dist/es/components/Checkbox/Checkbox.js +12 -6
  31. package/dist/es/components/Checkbox/Checkbox.js.map +1 -1
  32. package/dist/es/components/Checkbox/index.js +1 -1
  33. package/dist/es/components/CodeBlock/CodeBlock.js +25 -25
  34. package/dist/es/components/CodeBlock/CodeBlock.js.map +1 -1
  35. package/dist/es/components/CodeBlock/CollapsibleCodeBlock.js +6 -4
  36. package/dist/es/components/CodeBlock/CollapsibleCodeBlock.js.map +1 -1
  37. package/dist/es/components/CodeBlock/index.js +2 -2
  38. package/dist/es/components/DataTable/DataTable.js +108 -27
  39. package/dist/es/components/DataTable/DataTable.js.map +1 -1
  40. package/dist/es/components/DataTable/DataTableColumnHeader.js +2 -2
  41. package/dist/es/components/DataTable/DataTableColumnHeader.js.map +1 -1
  42. package/dist/es/components/DataTable/DataTablePagination.js +8 -4
  43. package/dist/es/components/DataTable/DataTablePagination.js.map +1 -1
  44. package/dist/es/components/DataTable/columnHelpers.js +3 -3
  45. package/dist/es/components/DataTable/index.js +4 -4
  46. package/dist/es/components/DateInput/DateInput.js +21 -13
  47. package/dist/es/components/DateInput/DateInput.js.map +1 -1
  48. package/dist/es/components/DateInput/index.js +1 -1
  49. package/dist/es/components/DatePicker/Calendar.js +136 -32
  50. package/dist/es/components/DatePicker/Calendar.js.map +1 -1
  51. package/dist/es/components/DatePicker/DatePicker.js +15 -11
  52. package/dist/es/components/DatePicker/DatePicker.js.map +1 -1
  53. package/dist/es/components/DatePicker/index.js +1 -1
  54. package/dist/es/components/DateRangePicker/Calendar.js +125 -22
  55. package/dist/es/components/DateRangePicker/Calendar.js.map +1 -1
  56. package/dist/es/components/DateRangePicker/DateRangePicker.js +10 -9
  57. package/dist/es/components/DateRangePicker/DateRangePicker.js.map +1 -1
  58. package/dist/es/components/DateRangePicker/Trigger.js +12 -9
  59. package/dist/es/components/DateRangePicker/Trigger.js.map +1 -1
  60. package/dist/es/components/DateRangePicker/index.js +2 -2
  61. package/dist/es/components/Dialog/Dialog.js +11 -6
  62. package/dist/es/components/Dialog/Dialog.js.map +1 -1
  63. package/dist/es/components/Dialog/index.js +1 -1
  64. package/dist/es/components/Dialog/index.js.map +1 -1
  65. package/dist/es/components/EmptyMessage/EmptyMessage.js +4 -4
  66. package/dist/es/components/EmptyMessage/EmptyMessage.js.map +1 -1
  67. package/dist/es/components/EmptyMessage/index.js +1 -1
  68. package/dist/es/components/Field/Field.js +22 -7
  69. package/dist/es/components/Field/Field.js.map +1 -1
  70. package/dist/es/components/Field/index.js +1 -1
  71. package/dist/es/components/FieldError/FieldError.js +4 -4
  72. package/dist/es/components/FieldError/FieldError.js.map +1 -1
  73. package/dist/es/components/FieldError/index.js +1 -1
  74. package/dist/es/components/FileUpload/FileUpload.js +12 -9
  75. package/dist/es/components/FileUpload/FileUpload.js.map +1 -1
  76. package/dist/es/components/FileUpload/index.js +1 -1
  77. package/dist/es/components/FloatingLabelInput/FloatingLabelInput.js +31 -4
  78. package/dist/es/components/FloatingLabelInput/FloatingLabelInput.js.map +1 -1
  79. package/dist/es/components/FloatingLabelInput/index.js +1 -1
  80. package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.js +28 -8
  81. package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.js.map +1 -1
  82. package/dist/es/components/FloatingLabelSelect/index.js +1 -1
  83. package/dist/es/components/Icon/aliases.js +20 -20
  84. package/dist/es/components/Icon/index.js +653 -653
  85. package/dist/es/components/Image/Image.js +19 -7
  86. package/dist/es/components/Image/Image.js.map +1 -1
  87. package/dist/es/components/Image/index.js +1 -1
  88. package/dist/es/components/Indicator/CircularProgress.js +3 -3
  89. package/dist/es/components/Indicator/CircularProgress.js.map +1 -1
  90. package/dist/es/components/Indicator/LoadingDots.js +1 -1
  91. package/dist/es/components/Indicator/LoadingDots.js.map +1 -1
  92. package/dist/es/components/Indicator/LoadingIndicator.js +2 -2
  93. package/dist/es/components/Indicator/LoadingIndicator.js.map +1 -1
  94. package/dist/es/components/Indicator/index.js +3 -3
  95. package/dist/es/components/Input/Input.js +16 -5
  96. package/dist/es/components/Input/Input.js.map +1 -1
  97. package/dist/es/components/Input/index.js +1 -1
  98. package/dist/es/components/InputGroup/InputGroup.js +60 -0
  99. package/dist/es/components/InputGroup/InputGroup.js.map +1 -0
  100. package/dist/es/components/InputGroup/index.js +2 -0
  101. package/dist/es/components/InputGroup/index.js.map +1 -0
  102. package/dist/es/components/Kbd/Kbd.js +13 -0
  103. package/dist/es/components/Kbd/Kbd.js.map +1 -0
  104. package/dist/es/components/Kbd/index.js +2 -0
  105. package/dist/es/components/Kbd/index.js.map +1 -0
  106. package/dist/es/components/Label/Label.js +1 -1
  107. package/dist/es/components/Label/Label.js.map +1 -1
  108. package/dist/es/components/Label/index.js +1 -1
  109. package/dist/es/components/Markdown/Markdown.js +8 -8
  110. package/dist/es/components/Markdown/Markdown.js.map +1 -1
  111. package/dist/es/components/Markdown/directives.js +2 -2
  112. package/dist/es/components/Markdown/index.js +4 -5
  113. package/dist/es/components/Markdown/index.js.map +1 -1
  114. package/dist/es/components/MarkdownEditor/MarkdownEditor.js +35 -11
  115. package/dist/es/components/MarkdownEditor/MarkdownEditor.js.map +1 -1
  116. package/dist/es/components/MarkdownEditor/index.js +1 -1
  117. package/dist/es/components/Menu/Menu.js +26 -18
  118. package/dist/es/components/Menu/Menu.js.map +1 -1
  119. package/dist/es/components/Menu/index.js +1 -1
  120. package/dist/es/components/OTPInput/OTPInput.js +51 -34
  121. package/dist/es/components/OTPInput/OTPInput.js.map +1 -1
  122. package/dist/es/components/OTPInput/index.js +1 -1
  123. package/dist/es/components/PlexUIProvider/PlexUIProvider.js +3 -1
  124. package/dist/es/components/PlexUIProvider/PlexUIProvider.js.map +1 -1
  125. package/dist/es/components/PlexUIProvider/index.js +1 -1
  126. package/dist/es/components/PlexUIProvider/internal.js +1 -1
  127. package/dist/es/components/Popover/Popover.js +7 -7
  128. package/dist/es/components/Popover/Popover.js.map +1 -1
  129. package/dist/es/components/Popover/index.js +2 -3
  130. package/dist/es/components/Popover/index.js.map +1 -1
  131. package/dist/es/components/Popover/usePopoverController.js +2 -2
  132. package/dist/es/components/Progress/Progress.js +1 -1
  133. package/dist/es/components/Progress/Progress.js.map +1 -1
  134. package/dist/es/components/Progress/index.js +1 -1
  135. package/dist/es/components/ProgressSteps/ProgressSteps.js +6 -4
  136. package/dist/es/components/ProgressSteps/ProgressSteps.js.map +1 -1
  137. package/dist/es/components/ProgressSteps/index.js +1 -1
  138. package/dist/es/components/RadioGroup/RadioGroup.js +10 -6
  139. package/dist/es/components/RadioGroup/RadioGroup.js.map +1 -1
  140. package/dist/es/components/RadioGroup/index.js +1 -1
  141. package/dist/es/components/SegmentedControl/index.js +1 -1
  142. package/dist/es/components/Select/Select.js +104 -67
  143. package/dist/es/components/Select/Select.js.map +1 -1
  144. package/dist/es/components/Select/index.js +1 -1
  145. package/dist/es/components/SelectControl/SelectControl.js +10 -5
  146. package/dist/es/components/SelectControl/SelectControl.js.map +1 -1
  147. package/dist/es/components/SelectControl/index.js +1 -1
  148. package/dist/es/components/Separator/Separator.js +1 -1
  149. package/dist/es/components/Separator/Separator.js.map +1 -1
  150. package/dist/es/components/Separator/index.js +1 -1
  151. package/dist/es/components/ShimmerText/ShimmerText.js +1 -1
  152. package/dist/es/components/ShimmerText/ShimmerText.js.map +1 -1
  153. package/dist/es/components/ShimmerText/index.js +1 -1
  154. package/dist/es/components/Sidebar/Sidebar.js +37 -29
  155. package/dist/es/components/Sidebar/Sidebar.js.map +1 -1
  156. package/dist/es/components/Sidebar/index.js +2 -2
  157. package/dist/es/components/Sidebar/useSidebarContext.js +17 -19
  158. package/dist/es/components/Sidebar/useSidebarContext.js.map +1 -1
  159. package/dist/es/components/Skeleton/index.js +1 -1
  160. package/dist/es/components/Skeleton/index.js.map +1 -1
  161. package/dist/es/components/Slider/Slider.js +48 -19
  162. package/dist/es/components/Slider/Slider.js.map +1 -1
  163. package/dist/es/components/Slider/index.js +1 -1
  164. package/dist/es/components/StatCard/StatCard.js +5 -5
  165. package/dist/es/components/StatCard/StatCard.js.map +1 -1
  166. package/dist/es/components/StatCard/index.js +1 -1
  167. package/dist/es/components/Switch/Switch.js +7 -3
  168. package/dist/es/components/Switch/Switch.js.map +1 -1
  169. package/dist/es/components/Switch/index.js +1 -1
  170. package/dist/es/components/Table/Table.js +1 -1
  171. package/dist/es/components/Table/Table.js.map +1 -1
  172. package/dist/es/components/Table/index.js +1 -1
  173. package/dist/es/components/Tabs/Tabs.js +154 -6
  174. package/dist/es/components/Tabs/Tabs.js.map +1 -1
  175. package/dist/es/components/Tabs/index.js +1 -1
  176. package/dist/es/components/Tabs/overflow.js +44 -0
  177. package/dist/es/components/Tabs/overflow.js.map +1 -0
  178. package/dist/es/components/TagInput/TagInput.js +47 -23
  179. package/dist/es/components/TagInput/TagInput.js.map +1 -1
  180. package/dist/es/components/TagInput/index.js +1 -1
  181. package/dist/es/components/TextLink/TextLink.js +16 -5
  182. package/dist/es/components/TextLink/TextLink.js.map +1 -1
  183. package/dist/es/components/TextLink/index.js +1 -1
  184. package/dist/es/components/Textarea/Textarea.js +4 -4
  185. package/dist/es/components/Textarea/Textarea.js.map +1 -1
  186. package/dist/es/components/Textarea/index.js +1 -1
  187. package/dist/es/components/Toast/Toaster.js +2 -2
  188. package/dist/es/components/Toast/Toaster.js.map +1 -1
  189. package/dist/es/components/Toast/index.js +1 -1
  190. package/dist/es/components/Tooltip/CopyTooltip.js +30 -9
  191. package/dist/es/components/Tooltip/CopyTooltip.js.map +1 -1
  192. package/dist/es/components/Tooltip/Tooltip.js +3 -3
  193. package/dist/es/components/Tooltip/Tooltip.js.map +1 -1
  194. package/dist/es/components/Tooltip/index.js +2 -2
  195. package/dist/es/components/Transition/Animate.js +4 -4
  196. package/dist/es/components/Transition/Animate.js.map +1 -1
  197. package/dist/es/components/Transition/AnimateLayout.js +4 -4
  198. package/dist/es/components/Transition/AnimateLayout.js.map +1 -1
  199. package/dist/es/components/Transition/AnimateLayoutGroup.js +12 -8
  200. package/dist/es/components/Transition/AnimateLayoutGroup.js.map +1 -1
  201. package/dist/es/components/Transition/SlotTransitionGroup.js +4 -4
  202. package/dist/es/components/Transition/TransitionGroup.js +5 -5
  203. package/dist/es/components/Transition/TransitionGroup.js.map +1 -1
  204. package/dist/es/components/Transition/getDisableAnimations.js +1 -1
  205. package/dist/es/components/Transition/index.js +5 -5
  206. package/dist/es/components/Transition/shared.js +7 -5
  207. package/dist/es/components/Transition/shared.js.map +1 -1
  208. package/dist/es/components/UIProvider/UIProvider.js +1 -1
  209. package/dist/es/components/UIProvider/index.js +1 -1
  210. package/dist/es/components/UIProvider/internal.js +1 -1
  211. package/dist/es/hooks/useAnimatedScrollTo.js +1 -1
  212. package/dist/es/hooks/useBreakpoints.js +8 -2
  213. package/dist/es/hooks/useBreakpoints.js.map +1 -1
  214. package/dist/es/hooks/useEscCloseStack.js +1 -1
  215. package/dist/es/hooks/usePrevious.js +7 -5
  216. package/dist/es/hooks/usePrevious.js.map +1 -1
  217. package/dist/es/hooks/useTextSelection.js +2 -2
  218. package/dist/es/hooks/useTrailingValue.js +1 -1
  219. package/dist/es/lib/constants.js +1 -1
  220. package/dist/es/lib/helpers.js +1 -1
  221. package/dist/es/lib/helpers.js.map +1 -1
  222. package/dist/es/lib/renderHelpers.js +15 -6
  223. package/dist/es/lib/renderHelpers.js.map +1 -1
  224. package/dist/es/lib/theme.js +16 -16
  225. package/dist/es/lib/theme.js.map +1 -1
  226. package/dist/es/lib/userAgent.js +3 -2
  227. package/dist/es/lib/userAgent.js.map +1 -1
  228. package/dist/es/styles/base.css +1 -102
  229. package/dist/es/styles/globals.css +1 -50
  230. package/dist/es/styles/index.css +1 -25
  231. package/dist/es/styles/katex.min.css +1 -1296
  232. package/dist/es/styles/tailwind-utilities.css +1 -1316
  233. package/dist/es/styles/variables-components.css +1 -626
  234. package/dist/es/styles/variables-primitive.css +1 -327
  235. package/dist/es/styles/variables-semantic.css +1 -609
  236. package/dist/es/styles/variables-tailwind-theme.css +1 -34
  237. package/dist/es/styles/variables-tokens-root.css +1 -41
  238. package/dist/es/types.js +1 -1
  239. package/dist/es/types.js.map +1 -1
  240. package/dist/es/vite/index.js +3 -53
  241. package/dist/es/vite/index.js.map +1 -1
  242. package/dist/types/components/Accordion/index.d.ts +1 -1
  243. package/dist/types/components/Alert/Alert.d.ts +8 -2
  244. package/dist/types/components/Alert/index.d.ts +1 -1
  245. package/dist/types/components/Avatar/Avatar.d.ts +1 -1
  246. package/dist/types/components/Avatar/index.d.ts +2 -2
  247. package/dist/types/components/Badge/index.d.ts +1 -1
  248. package/dist/types/components/Breadcrumb/Breadcrumb.d.ts +34 -0
  249. package/dist/types/components/Breadcrumb/index.d.ts +1 -0
  250. package/dist/types/components/Button/Button.d.ts +3 -3
  251. package/dist/types/components/Button/CopyButton.d.ts +9 -4
  252. package/dist/types/components/Button/index.d.ts +2 -2
  253. package/dist/types/components/ButtonGroup/ButtonGroup.d.ts +4 -3
  254. package/dist/types/components/ButtonGroup/index.d.ts +1 -1
  255. package/dist/types/components/Card/index.d.ts +1 -1
  256. package/dist/types/components/Checkbox/Checkbox.d.ts +3 -1
  257. package/dist/types/components/Checkbox/index.d.ts +1 -1
  258. package/dist/types/components/CodeBlock/index.d.ts +2 -2
  259. package/dist/types/components/DataTable/DataTable.d.ts +3 -2
  260. package/dist/types/components/DataTable/index.d.ts +4 -4
  261. package/dist/types/components/DateInput/DateInput.d.ts +1 -1
  262. package/dist/types/components/DateInput/index.d.ts +1 -1
  263. package/dist/types/components/DatePicker/DatePicker.d.ts +7 -6
  264. package/dist/types/components/DatePicker/context.d.ts +1 -1
  265. package/dist/types/components/DatePicker/index.d.ts +2 -2
  266. package/dist/types/components/DateRangePicker/Calendar.d.ts +1 -1
  267. package/dist/types/components/DateRangePicker/DateRangePicker.d.ts +5 -5
  268. package/dist/types/components/DateRangePicker/context.d.ts +2 -2
  269. package/dist/types/components/DateRangePicker/index.d.ts +2 -2
  270. package/dist/types/components/Dialog/Dialog.d.ts +19 -1
  271. package/dist/types/components/Dialog/index.d.ts +1 -1
  272. package/dist/types/components/EmptyMessage/EmptyMessage.d.ts +15 -3
  273. package/dist/types/components/EmptyMessage/index.d.ts +1 -1
  274. package/dist/types/components/Field/Field.d.ts +14 -4
  275. package/dist/types/components/Field/index.d.ts +1 -1
  276. package/dist/types/components/FieldError/FieldError.d.ts +7 -1
  277. package/dist/types/components/FieldError/index.d.ts +1 -1
  278. package/dist/types/components/FileUpload/index.d.ts +1 -1
  279. package/dist/types/components/FloatingLabelInput/index.d.ts +1 -1
  280. package/dist/types/components/FloatingLabelSelect/index.d.ts +1 -1
  281. package/dist/types/components/Icon/aliases.d.ts +20 -20
  282. package/dist/types/components/Icon/index.d.ts +653 -653
  283. package/dist/types/components/Image/Image.d.ts +1 -1
  284. package/dist/types/components/Image/index.d.ts +1 -1
  285. package/dist/types/components/Indicator/index.d.ts +3 -3
  286. package/dist/types/components/Input/Input.d.ts +2 -2
  287. package/dist/types/components/Input/index.d.ts +1 -1
  288. package/dist/types/components/InputGroup/InputGroup.d.ts +78 -0
  289. package/dist/types/components/InputGroup/index.d.ts +1 -0
  290. package/dist/types/components/Kbd/Kbd.d.ts +20 -0
  291. package/dist/types/components/Kbd/index.d.ts +1 -0
  292. package/dist/types/components/Label/index.d.ts +1 -1
  293. package/dist/types/components/Markdown/Markdown.d.ts +1 -1
  294. package/dist/types/components/Markdown/index.d.ts +4 -4
  295. package/dist/types/components/MarkdownEditor/MarkdownEditor.d.ts +6 -2
  296. package/dist/types/components/MarkdownEditor/index.d.ts +1 -1
  297. package/dist/types/components/Menu/Menu.d.ts +11 -3
  298. package/dist/types/components/Menu/index.d.ts +1 -1
  299. package/dist/types/components/OTPInput/index.d.ts +1 -1
  300. package/dist/types/components/PlexUIProvider/PlexUIProvider.d.ts +0 -11
  301. package/dist/types/components/PlexUIProvider/index.d.ts +1 -1
  302. package/dist/types/components/Popover/index.d.ts +2 -2
  303. package/dist/types/components/Progress/index.d.ts +1 -1
  304. package/dist/types/components/ProgressSteps/ProgressSteps.d.ts +1 -1
  305. package/dist/types/components/ProgressSteps/index.d.ts +1 -1
  306. package/dist/types/components/RadioGroup/RadioGroup.d.ts +3 -1
  307. package/dist/types/components/RadioGroup/index.d.ts +1 -1
  308. package/dist/types/components/SegmentedControl/index.d.ts +2 -2
  309. package/dist/types/components/Select/Select.d.ts +8 -1
  310. package/dist/types/components/Select/index.d.ts +1 -1
  311. package/dist/types/components/SelectControl/SelectControl.d.ts +1 -1
  312. package/dist/types/components/SelectControl/index.d.ts +1 -1
  313. package/dist/types/components/Separator/index.d.ts +1 -1
  314. package/dist/types/components/ShimmerText/index.d.ts +1 -1
  315. package/dist/types/components/Sidebar/Sidebar.d.ts +4 -8
  316. package/dist/types/components/Sidebar/index.d.ts +4 -4
  317. package/dist/types/components/Slider/Slider.d.ts +8 -0
  318. package/dist/types/components/Slider/index.d.ts +2 -2
  319. package/dist/types/components/StatCard/index.d.ts +1 -1
  320. package/dist/types/components/Switch/index.d.ts +1 -1
  321. package/dist/types/components/Table/index.d.ts +1 -1
  322. package/dist/types/components/Tabs/Tabs.d.ts +15 -2
  323. package/dist/types/components/Tabs/index.d.ts +2 -2
  324. package/dist/types/components/Tabs/overflow.d.ts +17 -0
  325. package/dist/types/components/TagInput/TagInput.d.ts +1 -1
  326. package/dist/types/components/TagInput/index.d.ts +1 -1
  327. package/dist/types/components/TextLink/index.d.ts +1 -1
  328. package/dist/types/components/Textarea/Textarea.d.ts +1 -1
  329. package/dist/types/components/Textarea/index.d.ts +1 -1
  330. package/dist/types/components/Toast/index.d.ts +1 -1
  331. package/dist/types/components/Tooltip/CopyTooltip.d.ts +6 -1
  332. package/dist/types/components/Tooltip/index.d.ts +2 -2
  333. package/dist/types/components/Transition/Animate.d.ts +2 -2
  334. package/dist/types/components/Transition/AnimateLayout.d.ts +2 -2
  335. package/dist/types/components/Transition/AnimateLayoutGroup.d.ts +2 -2
  336. package/dist/types/components/Transition/SlotTransitionGroup.d.ts +1 -1
  337. package/dist/types/components/Transition/TransitionGroup.d.ts +1 -1
  338. package/dist/types/components/Transition/index.d.ts +5 -5
  339. package/dist/types/components/UIProvider/index.d.ts +1 -1
  340. package/dist/types/global.d.ts +5 -1
  341. package/dist/types/lib/constants.d.ts +1 -1
  342. package/dist/types/lib/helpers.d.ts +4 -4
  343. package/dist/types/lib/theme.d.ts +1 -1
  344. package/dist/types/types.d.ts +2 -15
  345. package/dist/types/vite/index.d.ts +2 -55
  346. package/package.json +10 -18
  347. package/dist/es/components/Accordion/Accordion.module.css +0 -89
  348. package/dist/es/components/Alert/Alert.module.css +0 -187
  349. package/dist/es/components/Avatar/Avatar.module.css +0 -168
  350. package/dist/es/components/Avatar/AvatarGroup.module.css +0 -26
  351. package/dist/es/components/Badge/Badge.module.css +0 -196
  352. package/dist/es/components/Button/Button.module.css +0 -859
  353. package/dist/es/components/ButtonGroup/ButtonGroup.module.css +0 -159
  354. package/dist/es/components/Card/Card.module.css +0 -125
  355. package/dist/es/components/Checkbox/Checkbox.module.css +0 -198
  356. package/dist/es/components/CodeBlock/CodeBlock.module.css +0 -137
  357. package/dist/es/components/DataTable/DataTable.module.css +0 -108
  358. package/dist/es/components/DatePicker/Calendar.module.css +0 -271
  359. package/dist/es/components/DateRangePicker/Calendar.module.css +0 -295
  360. package/dist/es/components/DateRangePicker/Trigger.module.css +0 -25
  361. package/dist/es/components/Dialog/Dialog.module.css +0 -133
  362. package/dist/es/components/EmptyMessage/EmptyMessage.module.css +0 -82
  363. package/dist/es/components/Field/Field.module.css +0 -137
  364. package/dist/es/components/FieldError/FieldError.module.css +0 -22
  365. package/dist/es/components/FileUpload/FileUpload.module.css +0 -133
  366. package/dist/es/components/FloatingLabelInput/FloatingLabelInput.module.css +0 -220
  367. package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.module.css +0 -146
  368. package/dist/es/components/Image/Image.module.css +0 -9
  369. package/dist/es/components/Indicator/CircularProgress.module.css +0 -28
  370. package/dist/es/components/Indicator/LoadingDots.module.css +0 -35
  371. package/dist/es/components/Indicator/LoadingIndicator.module.css +0 -41
  372. package/dist/es/components/Input/Input.module.css +0 -507
  373. package/dist/es/components/Label/Label.module.css +0 -16
  374. package/dist/es/components/Markdown/Markdown.module.css +0 -233
  375. package/dist/es/components/MarkdownEditor/MarkdownEditor.module.css +0 -297
  376. package/dist/es/components/Menu/Menu.module.css +0 -377
  377. package/dist/es/components/OTPInput/OTPInput.module.css +0 -66
  378. package/dist/es/components/Popover/Popover.module.css +0 -82
  379. package/dist/es/components/Progress/Progress.module.css +0 -34
  380. package/dist/es/components/ProgressSteps/ProgressSteps.module.css +0 -246
  381. package/dist/es/components/RadioGroup/RadioGroup.module.css +0 -137
  382. package/dist/es/components/Select/Select.module.css +0 -310
  383. package/dist/es/components/SelectControl/SelectControl.module.css +0 -558
  384. package/dist/es/components/Separator/Separator.module.css +0 -16
  385. package/dist/es/components/ShimmerText/ShimmerText.module.css +0 -43
  386. package/dist/es/components/Sidebar/Sidebar.module.css +0 -909
  387. package/dist/es/components/Skeleton/Skeleton.module.css +0 -17
  388. package/dist/es/components/Slider/Slider.module.css +0 -203
  389. package/dist/es/components/StatCard/StatCard.module.css +0 -234
  390. package/dist/es/components/Switch/Switch.module.css +0 -121
  391. package/dist/es/components/Table/Table.module.css +0 -56
  392. package/dist/es/components/Tabs/Tabs.module.css +0 -672
  393. package/dist/es/components/TagInput/TagInput.module.css +0 -320
  394. package/dist/es/components/TextLink/TextLink.module.css +0 -50
  395. package/dist/es/components/Textarea/Textarea.module.css +0 -272
  396. package/dist/es/components/Toast/Toast.module.css +0 -84
  397. package/dist/es/components/Tooltip/Tooltip.module.css +0 -91
  398. package/dist/es/components/Transition/Animate.module.css +0 -54
  399. package/dist/es/components/Transition/AnimateLayout.module.css +0 -101
  400. package/dist/es/components/Transition/AnimateLayoutGroup.module.css +0 -72
  401. package/dist/es/components/Transition/TransitionGroup.module.css +0 -4
@@ -3,9 +3,9 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  import clsx from "clsx";
4
4
  import { useCallback, useEffect, useRef, useState } from "react";
5
5
  import { createPortal } from "react-dom";
6
- import {} from "../../types";
7
- import { Bold as BoldIcon, Italic as ItalicIcon, Link as LinkIcon, List as ListIcon, ListNumbers as ListNumbersIcon } from "../Icon";
8
- import { Tooltip } from "../Tooltip";
6
+ import {} from "../../types.js";
7
+ import { Bold as BoldIcon, Italic as ItalicIcon, Link as LinkIcon, List as ListIcon, ListNumbers as ListNumbersIcon } from "../Icon/index.js";
8
+ import { Tooltip } from "../Tooltip/index.js";
9
9
  import { useEditor, EditorContent } from "@tiptap/react";
10
10
  import Document from "@tiptap/extension-document";
11
11
  import Paragraph from "@tiptap/extension-paragraph";
@@ -20,10 +20,17 @@ import History from "@tiptap/extension-history";
20
20
  import Placeholder from "@tiptap/extension-placeholder";
21
21
  import HardBreak from "@tiptap/extension-hard-break";
22
22
  import { Markdown as MarkdownExtension } from "tiptap-markdown";
23
- import s from "./MarkdownEditor.module.css";
23
+ import s from "@plexui/styles/components/MarkdownEditor/MarkdownEditor.module.css";
24
24
  export const markdownEditorStyles = {
25
25
  toolbarButton: s.ToolbarButton,
26
26
  };
27
+ // A link inserted as a text node, not as `<a>` HTML: the markdown parser runs
28
+ // with `html: false`, so HTML would land in the text as written
29
+ const linkText = (text, href) => ({
30
+ type: "text",
31
+ text,
32
+ marks: [{ type: "link", attrs: { href } }],
33
+ });
27
34
  function LinkDialog({ open, initialUrl, initialTitle, isEditing, onSave, onRemove, onCancel, }) {
28
35
  const [url, setUrl] = useState(initialUrl);
29
36
  const [title, setTitle] = useState(initialTitle);
@@ -36,7 +43,8 @@ function LinkDialog({ open, initialUrl, initialTitle, isEditing, onSave, onRemov
36
43
  }
37
44
  }, [open, initialUrl, initialTitle]);
38
45
  const handleKeyDown = (evt) => {
39
- if (evt.key === "Enter") {
46
+ // Enter in a field saves; on a button it is that button's own click
47
+ if (evt.key === "Enter" && evt.target instanceof HTMLInputElement) {
40
48
  evt.preventDefault();
41
49
  onSave(url, title);
42
50
  }
@@ -44,15 +52,26 @@ function LinkDialog({ open, initialUrl, initialTitle, isEditing, onSave, onRemov
44
52
  evt.preventDefault();
45
53
  onCancel();
46
54
  }
55
+ // The dialog is modal: Tab from the last control wraps to the first, and
56
+ // Shift+Tab from the first to the last
57
+ if (evt.key === "Tab") {
58
+ const controls = Array.from(evt.currentTarget.querySelectorAll("input, button"));
59
+ const first = controls[0];
60
+ const last = controls[controls.length - 1];
61
+ if (evt.target === (evt.shiftKey ? first : last)) {
62
+ evt.preventDefault();
63
+ (evt.shiftKey ? last : first)?.focus();
64
+ }
65
+ }
47
66
  };
48
67
  if (!open || typeof document === "undefined")
49
68
  return null;
50
- return createPortal(_jsxs(_Fragment, { children: [_jsx("div", { className: s.LinkDialogOverlay, onClick: onCancel }), _jsxs("div", { className: s.LinkDialogContent, role: "dialog", "aria-label": "Link", onKeyDown: handleKeyDown, children: [_jsxs("div", { className: s.LinkDialogBody, children: [_jsx("h3", { className: s.LinkDialogTitle, children: "Link" }), _jsxs("div", { className: s.LinkDialogFields, children: [_jsxs("div", { className: s.LinkDialogField, children: [_jsx("label", { className: s.LinkDialogLabel, htmlFor: "md-editor-link-url", children: "URL" }), _jsx("input", { ref: urlRef, id: "md-editor-link-url", className: s.LinkDialogInput, type: "url", placeholder: "Enter URL", value: url, onChange: (e) => setUrl(e.target.value) })] }), _jsxs("div", { className: s.LinkDialogField, children: [_jsx("label", { className: s.LinkDialogLabel, htmlFor: "md-editor-link-title", children: "Link title" }), _jsx("input", { id: "md-editor-link-title", className: s.LinkDialogInput, type: "text", placeholder: "Enter link title", value: title, onChange: (e) => setTitle(e.target.value) })] })] })] }), _jsxs("div", { className: s.LinkDialogFooter, children: [isEditing && (_jsx("button", { type: "button", className: s.LinkDialogButtonRemove, onClick: onRemove, children: "Remove" })), _jsxs("div", { className: s.LinkDialogFooterTrailing, children: [_jsx("button", { type: "button", className: s.LinkDialogButtonCancel, onClick: onCancel, children: "Cancel" }), _jsx("button", { type: "button", className: s.LinkDialogButtonSave, onClick: () => onSave(url, title), children: "Save" })] })] })] })] }), document.body);
69
+ return createPortal(_jsxs(_Fragment, { children: [_jsx("div", { className: s.LinkDialogOverlay, onClick: onCancel }), _jsxs("div", { className: s.LinkDialogContent, role: "dialog", "aria-modal": "true", "aria-label": "Link", onKeyDown: handleKeyDown, children: [_jsxs("div", { className: s.LinkDialogBody, children: [_jsx("h3", { className: s.LinkDialogTitle, children: "Link" }), _jsxs("div", { className: s.LinkDialogFields, children: [_jsxs("div", { className: s.LinkDialogField, children: [_jsx("label", { className: s.LinkDialogLabel, htmlFor: "md-editor-link-url", children: "URL" }), _jsx("input", { ref: urlRef, id: "md-editor-link-url", className: s.LinkDialogInput, type: "url", placeholder: "Enter URL", value: url, onChange: (e) => setUrl(e.target.value) })] }), _jsxs("div", { className: s.LinkDialogField, children: [_jsx("label", { className: s.LinkDialogLabel, htmlFor: "md-editor-link-title", children: "Link title" }), _jsx("input", { id: "md-editor-link-title", className: s.LinkDialogInput, type: "text", placeholder: "Enter link title", value: title, onChange: (e) => setTitle(e.target.value) })] })] })] }), _jsxs("div", { className: s.LinkDialogFooter, children: [isEditing && (_jsx("button", { type: "button", className: s.LinkDialogButtonRemove, onClick: onRemove, children: "Remove" })), _jsxs("div", { className: s.LinkDialogFooterTrailing, children: [_jsx("button", { type: "button", className: s.LinkDialogButtonCancel, onClick: onCancel, children: "Cancel" }), _jsx("button", { type: "button", className: s.LinkDialogButtonSave, onClick: () => onSave(url, title), children: "Save" })] })] })] })] }), document.body);
51
70
  }
52
71
  function ToolbarButton({ tooltip, active, disabled, onClick, children, }) {
53
- return (_jsx(Tooltip, { content: tooltip, compact: true, children: _jsx("button", { type: "button", className: s.ToolbarButton, "data-active": active || undefined, onClick: onClick, disabled: disabled, "aria-label": tooltip, children: children }) }));
72
+ return (_jsx(Tooltip, { content: tooltip, compact: true, children: _jsx("button", { type: "button", className: s.ToolbarButton, "data-active": active || undefined, "aria-pressed": active, onClick: onClick, disabled: disabled, "aria-label": tooltip, children: children }) }));
54
73
  }
55
- export function MarkdownEditor({ variant = "outline", disabled = false, invalid = false, placeholder, value, defaultValue, onChange, toolbarEnd, rows = 1, className, id, "aria-describedby": ariaDescribedby, "aria-invalid": ariaInvalid, }) {
74
+ export function MarkdownEditor({ variant = "outline", disabled = false, invalid = false, placeholder, value, defaultValue, onChange, toolbarEnd, rows = 1, className, id, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, "aria-describedby": ariaDescribedby, "aria-invalid": ariaInvalid, }) {
56
75
  const [focused, setFocused] = useState(false);
57
76
  const [linkDialogOpen, setLinkDialogOpen] = useState(false);
58
77
  const [linkDialogInitial, setLinkDialogInitial] = useState({ url: "", title: "" });
@@ -104,6 +123,8 @@ export function MarkdownEditor({ variant = "outline", disabled = false, invalid
104
123
  role: "textbox",
105
124
  "aria-multiline": "true",
106
125
  ...(id && { id }),
126
+ ...(ariaLabel && { "aria-label": ariaLabel }),
127
+ ...(ariaLabelledby && { "aria-labelledby": ariaLabelledby }),
107
128
  ...(ariaDescribedby && { "aria-describedby": ariaDescribedby }),
108
129
  ...(ariaInvalid && { "aria-invalid": "true" }),
109
130
  },
@@ -139,6 +160,9 @@ export function MarkdownEditor({ variant = "outline", disabled = false, invalid
139
160
  const target = evt.target;
140
161
  if (target.closest("button, [type='button'], [role='button'], a, input, label"))
141
162
  return;
163
+ // A press in the text places the caret there itself
164
+ if (editor.view.dom.contains(target))
165
+ return;
142
166
  if (editor.isFocused)
143
167
  return;
144
168
  evt.preventDefault();
@@ -182,20 +206,20 @@ export function MarkdownEditor({ variant = "outline", disabled = false, invalid
182
206
  const selectedText = empty ? "" : editor.state.doc.textBetween(from, to, "");
183
207
  const isOnExistingLink = editor.isActive("link");
184
208
  if (empty && !isOnExistingLink) {
185
- editor.chain().focus().insertContent(`<a href="${url}">${title || url}</a>`).run();
209
+ editor.chain().focus().insertContent(linkText(title || url, url)).run();
186
210
  }
187
211
  else if (isOnExistingLink) {
188
212
  editor.chain().focus().extendMarkRange("link").run();
189
213
  const linkRange = editor.state.selection;
190
214
  if (title && title !== editor.state.doc.textBetween(linkRange.from, linkRange.to, "")) {
191
- editor.chain().focus().insertContentAt({ from: linkRange.from, to: linkRange.to }, `<a href="${url}">${title}</a>`).run();
215
+ editor.chain().focus().insertContentAt({ from: linkRange.from, to: linkRange.to }, linkText(title, url)).run();
192
216
  }
193
217
  else {
194
218
  editor.chain().focus().extendMarkRange("link").setLink({ href: url }).run();
195
219
  }
196
220
  }
197
221
  else if (title && title !== selectedText) {
198
- editor.chain().focus().deleteSelection().insertContent(`<a href="${url}">${title}</a>`).run();
222
+ editor.chain().focus().deleteSelection().insertContent(linkText(title, url)).run();
199
223
  }
200
224
  else {
201
225
  editor.chain().focus().setLink({ href: url }).run();
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownEditor.js","sourceRoot":"","sources":["../../../../src/components/MarkdownEditor/MarkdownEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport clsx from \"clsx\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { type Variants } from \"../../types\"\nimport { Bold as BoldIcon, Italic as ItalicIcon, Link as LinkIcon, List as ListIcon, ListNumbers as ListNumbersIcon } from \"../Icon\"\nimport { Tooltip } from \"../Tooltip\"\n\nimport { useEditor, EditorContent } from \"@tiptap/react\"\nimport Document from \"@tiptap/extension-document\"\nimport Paragraph from \"@tiptap/extension-paragraph\"\nimport Text from \"@tiptap/extension-text\"\nimport BoldExtension from \"@tiptap/extension-bold\"\nimport ItalicExtension from \"@tiptap/extension-italic\"\nimport LinkExtension from \"@tiptap/extension-link\"\nimport BulletList from \"@tiptap/extension-bullet-list\"\nimport OrderedList from \"@tiptap/extension-ordered-list\"\nimport ListItem from \"@tiptap/extension-list-item\"\nimport History from \"@tiptap/extension-history\"\nimport Placeholder from \"@tiptap/extension-placeholder\"\nimport HardBreak from \"@tiptap/extension-hard-break\"\nimport { Markdown as MarkdownExtension } from \"tiptap-markdown\"\n\nimport s from \"./MarkdownEditor.module.css\"\n\nexport const markdownEditorStyles = {\n toolbarButton: s.ToolbarButton,\n}\n\nexport type MarkdownEditorProps = {\n /**\n * @default outline\n */\n variant?: Variants<\"outline\" | \"soft\">\n /**\n * @default false\n */\n disabled?: boolean\n /**\n * @default false\n */\n invalid?: boolean\n placeholder?: string\n /**\n * Controlled value as markdown string\n */\n value?: string\n /**\n * Default value as markdown string for uncontrolled mode\n */\n defaultValue?: string\n onChange?: (markdown: string) => void\n toolbarEnd?: React.ReactNode\n /**\n * @default 1\n */\n rows?: number\n className?: string\n id?: string\n \"aria-describedby\"?: string\n \"aria-invalid\"?: boolean\n}\n\nfunction LinkDialog({\n open,\n initialUrl,\n initialTitle,\n isEditing,\n onSave,\n onRemove,\n onCancel,\n}: {\n open: boolean\n initialUrl: string\n initialTitle: string\n isEditing: boolean\n onSave: (url: string, title: string) => void\n onRemove: () => void\n onCancel: () => void\n}) {\n const [url, setUrl] = useState(initialUrl)\n const [title, setTitle] = useState(initialTitle)\n const urlRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (open) {\n setUrl(initialUrl)\n setTitle(initialTitle)\n requestAnimationFrame(() => urlRef.current?.focus())\n }\n }, [open, initialUrl, initialTitle])\n\n const handleKeyDown = (evt: React.KeyboardEvent) => {\n if (evt.key === \"Enter\") {\n evt.preventDefault()\n onSave(url, title)\n }\n if (evt.key === \"Escape\") {\n evt.preventDefault()\n onCancel()\n }\n }\n\n if (!open || typeof document === \"undefined\") return null\n\n return createPortal(\n <>\n <div className={s.LinkDialogOverlay} onClick={onCancel} />\n <div className={s.LinkDialogContent} role=\"dialog\" aria-label=\"Link\" onKeyDown={handleKeyDown}>\n <div className={s.LinkDialogBody}>\n <h3 className={s.LinkDialogTitle}>Link</h3>\n <div className={s.LinkDialogFields}>\n <div className={s.LinkDialogField}>\n <label className={s.LinkDialogLabel} htmlFor=\"md-editor-link-url\">URL</label>\n <input\n ref={urlRef}\n id=\"md-editor-link-url\"\n className={s.LinkDialogInput}\n type=\"url\"\n placeholder=\"Enter URL\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n />\n </div>\n <div className={s.LinkDialogField}>\n <label className={s.LinkDialogLabel} htmlFor=\"md-editor-link-title\">Link title</label>\n <input\n id=\"md-editor-link-title\"\n className={s.LinkDialogInput}\n type=\"text\"\n placeholder=\"Enter link title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n />\n </div>\n </div>\n </div>\n <div className={s.LinkDialogFooter}>\n {isEditing && (\n <button type=\"button\" className={s.LinkDialogButtonRemove} onClick={onRemove}>\n Remove\n </button>\n )}\n <div className={s.LinkDialogFooterTrailing}>\n <button type=\"button\" className={s.LinkDialogButtonCancel} onClick={onCancel}>\n Cancel\n </button>\n <button type=\"button\" className={s.LinkDialogButtonSave} onClick={() => onSave(url, title)}>\n Save\n </button>\n </div>\n </div>\n </div>\n </>,\n document.body,\n )\n}\n\nfunction ToolbarButton({\n tooltip,\n active,\n disabled,\n onClick,\n children,\n}: {\n tooltip: string\n active?: boolean\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <Tooltip content={tooltip} compact>\n <button\n type=\"button\"\n className={s.ToolbarButton}\n data-active={active || undefined}\n onClick={onClick}\n disabled={disabled}\n aria-label={tooltip}\n >\n {children}\n </button>\n </Tooltip>\n )\n}\n\nexport function MarkdownEditor({\n variant = \"outline\",\n disabled = false,\n invalid = false,\n placeholder,\n value,\n defaultValue,\n onChange,\n toolbarEnd,\n rows = 1,\n className,\n id,\n \"aria-describedby\": ariaDescribedby,\n \"aria-invalid\": ariaInvalid,\n}: MarkdownEditorProps) {\n const [focused, setFocused] = useState(false)\n const [linkDialogOpen, setLinkDialogOpen] = useState(false)\n const [linkDialogInitial, setLinkDialogInitial] = useState({ url: \"\", title: \"\" })\n const [activeMarks, setActiveMarks] = useState({\n bold: false, italic: false, link: false, orderedList: false, bulletList: false,\n })\n const [linkCanEnable, setLinkCanEnable] = useState(false)\n const isControlled = value !== undefined\n const suppressChangeRef = useRef(false)\n\n const syncToolbar = useCallback((e: { isActive: (name: string) => boolean; state: { selection: { empty: boolean } } }) => {\n setActiveMarks({\n bold: e.isActive(\"bold\"),\n italic: e.isActive(\"italic\"),\n link: e.isActive(\"link\"),\n orderedList: e.isActive(\"orderedList\"),\n bulletList: e.isActive(\"bulletList\"),\n })\n setLinkCanEnable(!e.state.selection.empty || e.isActive(\"link\"))\n }, [])\n\n const editor = useEditor({\n immediatelyRender: false,\n extensions: [\n Document,\n Paragraph,\n Text,\n HardBreak,\n BoldExtension,\n ItalicExtension,\n LinkExtension.configure({\n openOnClick: false,\n HTMLAttributes: { rel: \"noopener noreferrer nofollow\" },\n }),\n BulletList,\n OrderedList,\n ListItem,\n History,\n MarkdownExtension.configure({\n html: false,\n transformPastedText: true,\n transformCopiedText: true,\n }),\n ...(placeholder ? [Placeholder.configure({ placeholder })] : []),\n ],\n content: value ?? defaultValue ?? \"\",\n editable: !disabled,\n editorProps: {\n attributes: {\n class: s.EditorContent,\n role: \"textbox\",\n \"aria-multiline\": \"true\",\n ...(id && { id }),\n ...(ariaDescribedby && { \"aria-describedby\": ariaDescribedby }),\n ...(ariaInvalid && { \"aria-invalid\": \"true\" }),\n },\n },\n onFocus: () => setFocused(true),\n onBlur: () => setFocused(false),\n onUpdate: ({ editor: e }) => {\n if (suppressChangeRef.current) return\n const md = (e.storage as unknown as Record<string, { getMarkdown?: () => string }>).markdown?.getMarkdown?.() ?? \"\"\n onChange?.(md)\n },\n onSelectionUpdate: ({ editor: e }) => syncToolbar(e),\n onTransaction: ({ editor: e }) => syncToolbar(e),\n })\n\n useEffect(() => {\n if (!editor || !isControlled) return\n const currentMd = (editor.storage as unknown as Record<string, { getMarkdown?: () => string }>).markdown?.getMarkdown?.() ?? \"\"\n if (value !== currentMd) {\n suppressChangeRef.current = true\n editor.commands.setContent(value || \"\", { emitUpdate: false })\n suppressChangeRef.current = false\n }\n }, [editor, value, isControlled])\n\n useEffect(() => {\n if (editor) editor.setEditable(!disabled)\n }, [editor, disabled])\n\n const handleContainerMouseDown = useCallback((evt: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || !editor) return\n const target = evt.target as Element\n if (target.closest(\"button, [type='button'], [role='button'], a, input, label\")) return\n if (editor.isFocused) return\n evt.preventDefault()\n editor.commands.focus(\"end\")\n }, [editor, disabled])\n\n const openLinkDialog = useCallback(() => {\n if (!editor) return\n const url = editor.getAttributes(\"link\").href ?? \"\"\n let title = \"\"\n if (!editor.state.selection.empty) {\n title = editor.state.doc.textBetween(editor.state.selection.from, editor.state.selection.to, \"\")\n } else if (editor.isActive(\"link\")) {\n const { $from } = editor.state.selection\n const linkMark = $from.marks().find(m => m.type === editor.schema.marks.link)\n if (linkMark) {\n let start = $from.pos\n let end = $from.pos\n editor.state.doc.nodesBetween($from.start(), $from.end(), (node, pos) => {\n if (node.isText && node.marks.some(m => m.eq(linkMark))) {\n start = Math.min(start, pos)\n end = Math.max(end, pos + node.nodeSize)\n }\n })\n title = editor.state.doc.textBetween(start, end, \"\")\n }\n }\n setLinkDialogInitial({ url, title })\n setLinkDialogOpen(true)\n }, [editor])\n\n const handleLinkSave = useCallback((url: string, title: string) => {\n if (!editor) return\n setLinkDialogOpen(false)\n\n if (!url) {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run()\n return\n }\n\n const { from, to, empty } = editor.state.selection\n const selectedText = empty ? \"\" : editor.state.doc.textBetween(from, to, \"\")\n const isOnExistingLink = editor.isActive(\"link\")\n\n if (empty && !isOnExistingLink) {\n editor.chain().focus().insertContent(`<a href=\"${url}\">${title || url}</a>`).run()\n } else if (isOnExistingLink) {\n editor.chain().focus().extendMarkRange(\"link\").run()\n const linkRange = editor.state.selection\n if (title && title !== editor.state.doc.textBetween(linkRange.from, linkRange.to, \"\")) {\n editor.chain().focus().insertContentAt({ from: linkRange.from, to: linkRange.to }, `<a href=\"${url}\">${title}</a>`).run()\n } else {\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href: url }).run()\n }\n } else if (title && title !== selectedText) {\n editor.chain().focus().deleteSelection().insertContent(`<a href=\"${url}\">${title}</a>`).run()\n } else {\n editor.chain().focus().setLink({ href: url }).run()\n }\n }, [editor])\n\n const handleLinkRemove = useCallback(() => {\n if (!editor) return\n setLinkDialogOpen(false)\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run()\n }, [editor])\n\n const handleLinkCancel = useCallback(() => {\n setLinkDialogOpen(false)\n editor?.commands.focus()\n }, [editor])\n\n const isInvalid = invalid || ariaInvalid\n const minHeight = 20 * rows + 16\n\n return (\n <div\n className={clsx(s.Container, className)}\n data-variant={variant}\n data-focused={focused}\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={isInvalid ? \"\" : undefined}\n onMouseDown={handleContainerMouseDown}\n >\n <div className={s.Toolbar} onMouseDown={(e) => e.preventDefault()}>\n <div className={s.ToolbarGroup}>\n <ToolbarButton tooltip=\"Bold\" active={activeMarks.bold} disabled={disabled} onClick={() => editor?.chain().focus().toggleBold().run()}>\n <BoldIcon />\n </ToolbarButton>\n <ToolbarButton tooltip=\"Italic\" active={activeMarks.italic} disabled={disabled} onClick={() => editor?.chain().focus().toggleItalic().run()}>\n <ItalicIcon />\n </ToolbarButton>\n\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n\n <ToolbarButton tooltip=\"Numbered list\" active={activeMarks.orderedList} disabled={disabled} onClick={() => editor?.chain().focus().toggleOrderedList().run()}>\n <ListNumbersIcon />\n </ToolbarButton>\n <ToolbarButton tooltip=\"Bullet list\" active={activeMarks.bulletList} disabled={disabled} onClick={() => editor?.chain().focus().toggleBulletList().run()}>\n <ListIcon />\n </ToolbarButton>\n\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n\n <ToolbarButton tooltip=\"Link\" active={activeMarks.link} disabled={disabled || !linkCanEnable} onClick={openLinkDialog}>\n <LinkIcon />\n </ToolbarButton>\n\n {toolbarEnd && (\n <>\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n <div className={s.ToolbarEnd}>{toolbarEnd}</div>\n </>\n )}\n </div>\n </div>\n\n <div className={s.Editor} style={{ minHeight }}>\n <EditorContent editor={editor} />\n </div>\n\n <LinkDialog\n open={linkDialogOpen}\n initialUrl={linkDialogInitial.url}\n initialTitle={linkDialogInitial.title}\n isEditing={!!linkDialogInitial.url}\n onSave={handleLinkSave}\n onRemove={handleLinkRemove}\n onCancel={handleLinkCancel}\n />\n </div>\n )\n}\n"]}
1
+ {"version":3,"file":"MarkdownEditor.js","sourceRoot":"","sources":["../../../../src/components/MarkdownEditor/MarkdownEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport clsx from \"clsx\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { type Variants } from \"../../types\"\nimport { Bold as BoldIcon, Italic as ItalicIcon, Link as LinkIcon, List as ListIcon, ListNumbers as ListNumbersIcon } from \"../Icon\"\nimport { Tooltip } from \"../Tooltip\"\n\nimport { useEditor, EditorContent } from \"@tiptap/react\"\nimport Document from \"@tiptap/extension-document\"\nimport Paragraph from \"@tiptap/extension-paragraph\"\nimport Text from \"@tiptap/extension-text\"\nimport BoldExtension from \"@tiptap/extension-bold\"\nimport ItalicExtension from \"@tiptap/extension-italic\"\nimport LinkExtension from \"@tiptap/extension-link\"\nimport BulletList from \"@tiptap/extension-bullet-list\"\nimport OrderedList from \"@tiptap/extension-ordered-list\"\nimport ListItem from \"@tiptap/extension-list-item\"\nimport History from \"@tiptap/extension-history\"\nimport Placeholder from \"@tiptap/extension-placeholder\"\nimport HardBreak from \"@tiptap/extension-hard-break\"\nimport { Markdown as MarkdownExtension } from \"tiptap-markdown\"\n\nimport s from \"@plexui/styles/components/MarkdownEditor/MarkdownEditor.module.css\"\n\nexport const markdownEditorStyles = {\n toolbarButton: s.ToolbarButton,\n}\n\nexport type MarkdownEditorProps = {\n /**\n * @default outline\n */\n variant?: Variants<\"outline\" | \"soft\">\n /**\n * @default false\n */\n disabled?: boolean\n /**\n * @default false\n */\n invalid?: boolean\n placeholder?: string\n /**\n * Controlled value as markdown string\n */\n value?: string\n /**\n * Default value as markdown string for uncontrolled mode\n */\n defaultValue?: string\n onChange?: (markdown: string) => void\n toolbarEnd?: React.ReactNode\n /**\n * @default 1\n */\n rows?: number\n className?: string\n id?: string\n /** Accessible name for the editor; a `<label for>` cannot name a contenteditable region */\n \"aria-label\"?: string\n /** Id of the element that names the editor, such as a Field label */\n \"aria-labelledby\"?: string\n \"aria-describedby\"?: string\n \"aria-invalid\"?: boolean\n}\n\n// A link inserted as a text node, not as `<a>` HTML: the markdown parser runs\n// with `html: false`, so HTML would land in the text as written\nconst linkText = (text: string, href: string) => ({\n type: \"text\",\n text,\n marks: [{ type: \"link\", attrs: { href } }],\n})\n\nfunction LinkDialog({\n open,\n initialUrl,\n initialTitle,\n isEditing,\n onSave,\n onRemove,\n onCancel,\n}: {\n open: boolean\n initialUrl: string\n initialTitle: string\n isEditing: boolean\n onSave: (url: string, title: string) => void\n onRemove: () => void\n onCancel: () => void\n}) {\n const [url, setUrl] = useState(initialUrl)\n const [title, setTitle] = useState(initialTitle)\n const urlRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (open) {\n setUrl(initialUrl)\n setTitle(initialTitle)\n requestAnimationFrame(() => urlRef.current?.focus())\n }\n }, [open, initialUrl, initialTitle])\n\n const handleKeyDown = (evt: React.KeyboardEvent<HTMLDivElement>) => {\n // Enter in a field saves; on a button it is that button's own click\n if (evt.key === \"Enter\" && evt.target instanceof HTMLInputElement) {\n evt.preventDefault()\n onSave(url, title)\n }\n if (evt.key === \"Escape\") {\n evt.preventDefault()\n onCancel()\n }\n // The dialog is modal: Tab from the last control wraps to the first, and\n // Shift+Tab from the first to the last\n if (evt.key === \"Tab\") {\n const controls = Array.from(evt.currentTarget.querySelectorAll<HTMLElement>(\"input, button\"))\n const first = controls[0]\n const last = controls[controls.length - 1]\n if (evt.target === (evt.shiftKey ? first : last)) {\n evt.preventDefault()\n ;(evt.shiftKey ? last : first)?.focus()\n }\n }\n }\n\n if (!open || typeof document === \"undefined\") return null\n\n return createPortal(\n <>\n <div className={s.LinkDialogOverlay} onClick={onCancel} />\n <div\n className={s.LinkDialogContent}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Link\"\n onKeyDown={handleKeyDown}\n >\n <div className={s.LinkDialogBody}>\n <h3 className={s.LinkDialogTitle}>Link</h3>\n <div className={s.LinkDialogFields}>\n <div className={s.LinkDialogField}>\n <label className={s.LinkDialogLabel} htmlFor=\"md-editor-link-url\">URL</label>\n <input\n ref={urlRef}\n id=\"md-editor-link-url\"\n className={s.LinkDialogInput}\n type=\"url\"\n placeholder=\"Enter URL\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n />\n </div>\n <div className={s.LinkDialogField}>\n <label className={s.LinkDialogLabel} htmlFor=\"md-editor-link-title\">Link title</label>\n <input\n id=\"md-editor-link-title\"\n className={s.LinkDialogInput}\n type=\"text\"\n placeholder=\"Enter link title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n />\n </div>\n </div>\n </div>\n <div className={s.LinkDialogFooter}>\n {isEditing && (\n <button type=\"button\" className={s.LinkDialogButtonRemove} onClick={onRemove}>\n Remove\n </button>\n )}\n <div className={s.LinkDialogFooterTrailing}>\n <button type=\"button\" className={s.LinkDialogButtonCancel} onClick={onCancel}>\n Cancel\n </button>\n <button type=\"button\" className={s.LinkDialogButtonSave} onClick={() => onSave(url, title)}>\n Save\n </button>\n </div>\n </div>\n </div>\n </>,\n document.body,\n )\n}\n\nfunction ToolbarButton({\n tooltip,\n active,\n disabled,\n onClick,\n children,\n}: {\n tooltip: string\n active?: boolean\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <Tooltip content={tooltip} compact>\n <button\n type=\"button\"\n className={s.ToolbarButton}\n data-active={active || undefined}\n // Formatting buttons are toggles: announce their on/off state\n aria-pressed={active}\n onClick={onClick}\n disabled={disabled}\n aria-label={tooltip}\n >\n {children}\n </button>\n </Tooltip>\n )\n}\n\nexport function MarkdownEditor({\n variant = \"outline\",\n disabled = false,\n invalid = false,\n placeholder,\n value,\n defaultValue,\n onChange,\n toolbarEnd,\n rows = 1,\n className,\n id,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n \"aria-describedby\": ariaDescribedby,\n \"aria-invalid\": ariaInvalid,\n}: MarkdownEditorProps) {\n const [focused, setFocused] = useState(false)\n const [linkDialogOpen, setLinkDialogOpen] = useState(false)\n const [linkDialogInitial, setLinkDialogInitial] = useState({ url: \"\", title: \"\" })\n const [activeMarks, setActiveMarks] = useState({\n bold: false, italic: false, link: false, orderedList: false, bulletList: false,\n })\n const [linkCanEnable, setLinkCanEnable] = useState(false)\n const isControlled = value !== undefined\n const suppressChangeRef = useRef(false)\n\n const syncToolbar = useCallback((e: { isActive: (name: string) => boolean; state: { selection: { empty: boolean } } }) => {\n setActiveMarks({\n bold: e.isActive(\"bold\"),\n italic: e.isActive(\"italic\"),\n link: e.isActive(\"link\"),\n orderedList: e.isActive(\"orderedList\"),\n bulletList: e.isActive(\"bulletList\"),\n })\n setLinkCanEnable(!e.state.selection.empty || e.isActive(\"link\"))\n }, [])\n\n const editor = useEditor({\n immediatelyRender: false,\n extensions: [\n Document,\n Paragraph,\n Text,\n HardBreak,\n BoldExtension,\n ItalicExtension,\n LinkExtension.configure({\n openOnClick: false,\n HTMLAttributes: { rel: \"noopener noreferrer nofollow\" },\n }),\n BulletList,\n OrderedList,\n ListItem,\n History,\n MarkdownExtension.configure({\n html: false,\n transformPastedText: true,\n transformCopiedText: true,\n }),\n ...(placeholder ? [Placeholder.configure({ placeholder })] : []),\n ],\n content: value ?? defaultValue ?? \"\",\n editable: !disabled,\n editorProps: {\n attributes: {\n class: s.EditorContent,\n role: \"textbox\",\n \"aria-multiline\": \"true\",\n ...(id && { id }),\n ...(ariaLabel && { \"aria-label\": ariaLabel }),\n ...(ariaLabelledby && { \"aria-labelledby\": ariaLabelledby }),\n ...(ariaDescribedby && { \"aria-describedby\": ariaDescribedby }),\n ...(ariaInvalid && { \"aria-invalid\": \"true\" }),\n },\n },\n onFocus: () => setFocused(true),\n onBlur: () => setFocused(false),\n onUpdate: ({ editor: e }) => {\n if (suppressChangeRef.current) return\n const md = (e.storage as unknown as Record<string, { getMarkdown?: () => string }>).markdown?.getMarkdown?.() ?? \"\"\n onChange?.(md)\n },\n onSelectionUpdate: ({ editor: e }) => syncToolbar(e),\n onTransaction: ({ editor: e }) => syncToolbar(e),\n })\n\n useEffect(() => {\n if (!editor || !isControlled) return\n const currentMd = (editor.storage as unknown as Record<string, { getMarkdown?: () => string }>).markdown?.getMarkdown?.() ?? \"\"\n if (value !== currentMd) {\n suppressChangeRef.current = true\n editor.commands.setContent(value || \"\", { emitUpdate: false })\n suppressChangeRef.current = false\n }\n }, [editor, value, isControlled])\n\n useEffect(() => {\n if (editor) editor.setEditable(!disabled)\n }, [editor, disabled])\n\n const handleContainerMouseDown = useCallback((evt: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || !editor) return\n const target = evt.target as Element\n if (target.closest(\"button, [type='button'], [role='button'], a, input, label\")) return\n // A press in the text places the caret there itself\n if (editor.view.dom.contains(target)) return\n if (editor.isFocused) return\n evt.preventDefault()\n editor.commands.focus(\"end\")\n }, [editor, disabled])\n\n const openLinkDialog = useCallback(() => {\n if (!editor) return\n const url = editor.getAttributes(\"link\").href ?? \"\"\n let title = \"\"\n if (!editor.state.selection.empty) {\n title = editor.state.doc.textBetween(editor.state.selection.from, editor.state.selection.to, \"\")\n } else if (editor.isActive(\"link\")) {\n const { $from } = editor.state.selection\n const linkMark = $from.marks().find(m => m.type === editor.schema.marks.link)\n if (linkMark) {\n let start = $from.pos\n let end = $from.pos\n editor.state.doc.nodesBetween($from.start(), $from.end(), (node, pos) => {\n if (node.isText && node.marks.some(m => m.eq(linkMark))) {\n start = Math.min(start, pos)\n end = Math.max(end, pos + node.nodeSize)\n }\n })\n title = editor.state.doc.textBetween(start, end, \"\")\n }\n }\n setLinkDialogInitial({ url, title })\n setLinkDialogOpen(true)\n }, [editor])\n\n const handleLinkSave = useCallback((url: string, title: string) => {\n if (!editor) return\n setLinkDialogOpen(false)\n\n if (!url) {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run()\n return\n }\n\n const { from, to, empty } = editor.state.selection\n const selectedText = empty ? \"\" : editor.state.doc.textBetween(from, to, \"\")\n const isOnExistingLink = editor.isActive(\"link\")\n\n if (empty && !isOnExistingLink) {\n editor.chain().focus().insertContent(linkText(title || url, url)).run()\n } else if (isOnExistingLink) {\n editor.chain().focus().extendMarkRange(\"link\").run()\n const linkRange = editor.state.selection\n if (title && title !== editor.state.doc.textBetween(linkRange.from, linkRange.to, \"\")) {\n editor.chain().focus().insertContentAt({ from: linkRange.from, to: linkRange.to }, linkText(title, url)).run()\n } else {\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href: url }).run()\n }\n } else if (title && title !== selectedText) {\n editor.chain().focus().deleteSelection().insertContent(linkText(title, url)).run()\n } else {\n editor.chain().focus().setLink({ href: url }).run()\n }\n }, [editor])\n\n const handleLinkRemove = useCallback(() => {\n if (!editor) return\n setLinkDialogOpen(false)\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run()\n }, [editor])\n\n const handleLinkCancel = useCallback(() => {\n setLinkDialogOpen(false)\n editor?.commands.focus()\n }, [editor])\n\n const isInvalid = invalid || ariaInvalid\n const minHeight = 20 * rows + 16\n\n return (\n <div\n className={clsx(s.Container, className)}\n data-variant={variant}\n data-focused={focused}\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={isInvalid ? \"\" : undefined}\n onMouseDown={handleContainerMouseDown}\n >\n <div className={s.Toolbar} onMouseDown={(e) => e.preventDefault()}>\n <div className={s.ToolbarGroup}>\n <ToolbarButton tooltip=\"Bold\" active={activeMarks.bold} disabled={disabled} onClick={() => editor?.chain().focus().toggleBold().run()}>\n <BoldIcon />\n </ToolbarButton>\n <ToolbarButton tooltip=\"Italic\" active={activeMarks.italic} disabled={disabled} onClick={() => editor?.chain().focus().toggleItalic().run()}>\n <ItalicIcon />\n </ToolbarButton>\n\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n\n <ToolbarButton tooltip=\"Numbered list\" active={activeMarks.orderedList} disabled={disabled} onClick={() => editor?.chain().focus().toggleOrderedList().run()}>\n <ListNumbersIcon />\n </ToolbarButton>\n <ToolbarButton tooltip=\"Bullet list\" active={activeMarks.bulletList} disabled={disabled} onClick={() => editor?.chain().focus().toggleBulletList().run()}>\n <ListIcon />\n </ToolbarButton>\n\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n\n <ToolbarButton tooltip=\"Link\" active={activeMarks.link} disabled={disabled || !linkCanEnable} onClick={openLinkDialog}>\n <LinkIcon />\n </ToolbarButton>\n\n {toolbarEnd && (\n <>\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n <div className={s.ToolbarEnd}>{toolbarEnd}</div>\n </>\n )}\n </div>\n </div>\n\n <div className={s.Editor} style={{ minHeight }}>\n <EditorContent editor={editor} />\n </div>\n\n <LinkDialog\n open={linkDialogOpen}\n initialUrl={linkDialogInitial.url}\n initialTitle={linkDialogInitial.title}\n isEditing={!!linkDialogInitial.url}\n onSave={handleLinkSave}\n onRemove={handleLinkRemove}\n onCancel={handleLinkCancel}\n />\n </div>\n )\n}\n"]}
@@ -1,2 +1,2 @@
1
- export { MarkdownEditor, markdownEditorStyles } from "./MarkdownEditor";
1
+ export { MarkdownEditor, markdownEditorStyles } from "./MarkdownEditor.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -3,14 +3,14 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { DropdownMenu } from "radix-ui";
4
4
  import React, { createContext, useCallback, useContext, useMemo, useRef, useState, } from "react";
5
5
  import clsx from "clsx";
6
- import { useEscCloseStack } from "../../hooks/useEscCloseStack";
7
- import { useLatestValue } from "../../hooks/useLatestValue";
8
- import { preventDefaultHandler, toCssVariables } from "../../lib/helpers";
9
- import { Button } from "../Button";
10
- import { Check, ChevronRight } from "../Icon";
11
- import { useLinkComponent } from "../PlexUIProvider/internal";
12
- import { TransitionGroup } from "../Transition";
13
- import s from "./Menu.module.css";
6
+ import { useEscCloseStack } from "../../hooks/useEscCloseStack.js";
7
+ import { useLatestValue } from "../../hooks/useLatestValue.js";
8
+ import { preventDefaultHandler, toCssVariables } from "../../lib/helpers.js";
9
+ import { Button } from "../Button/index.js";
10
+ import { Check, ChevronRight } from "../Icon/index.js";
11
+ import { useLinkComponent } from "../PlexUIProvider/internal.js";
12
+ import { TransitionGroup } from "../Transition/index.js";
13
+ import s from "@plexui/styles/components/Menu/Menu.module.css";
14
14
  const MenuContext = createContext(null);
15
15
  const useMenuContext = () => {
16
16
  const context = useContext(MenuContext);
@@ -42,7 +42,7 @@ export const Menu = ({ children, forceOpen, onOpen, onClose, modal = false }) =>
42
42
  }), [isOpen, handleOpenChange]);
43
43
  return (_jsx(MenuContext.Provider, { value: store, children: _jsx(DropdownMenu.Root, { open: isOpen, onOpenChange: handleOpenChange, modal: modal, children: children }) }));
44
44
  };
45
- const Item = ({ className, children, description, disabled, onSelect, onClick }) => {
45
+ const Item = ({ className, children, description, disabled, danger, onSelect, onClick }) => {
46
46
  const { open } = useMenuContext();
47
47
  // This handler patches over focus races with core Radix primitives
48
48
  // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734
@@ -55,9 +55,9 @@ const Item = ({ className, children, description, disabled, onSelect, onClick })
55
55
  // A described item stacks its two lines; without a description the item
56
56
  // keeps the plain flex row that icons and ItemActions rely on.
57
57
  const content = description === undefined ? (children) : (_jsxs("div", { className: s.ItemLeading, children: [_jsx("div", { children: children }), _jsx("div", { className: s.ItemDescription, children: description })] }));
58
- // Custom click handlers
59
- if (onSelect) {
60
- return (_jsx(DropdownMenu.Item, { className: clsx(s.MenuItem, className), onSelect: onSelect, onClick: onClick, disabled: disabled, onPointerMove: handlePreventAfterClose, onPointerLeave: handlePreventAfterClose, children: _jsx("div", { className: s.PressableInner, children: content }) }));
58
+ // Custom click handlers: either callback makes the item interactive
59
+ if (onSelect || onClick) {
60
+ return (_jsx(DropdownMenu.Item, { className: clsx(s.MenuItem, className), onSelect: onSelect, onClick: onClick, disabled: disabled, "data-danger": danger ? "" : undefined, onPointerMove: handlePreventAfterClose, onPointerLeave: handlePreventAfterClose, children: _jsx("div", { className: s.PressableInner, children: content }) }));
61
61
  }
62
62
  // Read-only content - will not appear interactive.
63
63
  return _jsx("div", { className: clsx(s.MenuItemContent, className), children: content });
@@ -65,16 +65,16 @@ const Item = ({ className, children, description, disabled, onSelect, onClick })
65
65
  const ItemActions = ({ className, children }) => {
66
66
  return _jsx("div", { className: clsx(s.ItemActions, className), children: children });
67
67
  };
68
- const ItemAction = ({ children, onClick, }) => {
68
+ const ItemAction = ({ children, onClick, "aria-label": ariaLabel, }) => {
69
69
  const { setOpen } = useMenuContext();
70
- return (_jsx(Button, { className: "rounded-sm", color: "secondary", size: "xs", uniform: true, iconSize: "sm", variant: "ghost", onClick: (evt) => {
70
+ return (_jsx(Button, { className: "rounded-sm", color: "secondary", size: "xs", uniform: true, iconSize: "sm", variant: "ghost", "aria-label": ariaLabel, onClick: (evt) => {
71
71
  evt.stopPropagation();
72
72
  setOpen(false);
73
73
  onClick(evt);
74
74
  }, children: children }));
75
75
  };
76
76
  const Link = ((props) => {
77
- const { className, children, href, to, disabled, as: OverrideComponent, ...restProps } = props;
77
+ const { className, children, href, to, disabled, danger, as: OverrideComponent, ...restProps } = props;
78
78
  const { open } = useMenuContext();
79
79
  const propPath = href || to;
80
80
  // When a path is not provided, default to an anchor
@@ -92,7 +92,12 @@ const Link = ((props) => {
92
92
  const linkProps = isExternal
93
93
  ? { target: "_blank", rel: "noopener noreferrer", href: href ?? to }
94
94
  : { href, to };
95
- return (_jsx(DropdownMenu.Item, { asChild: true, className: clsx(s.MenuItem, className), disabled: disabled, onPointerMove: isExternal ? undefined : handlePreventAfterClose, onPointerLeave: isExternal ? undefined : handlePreventAfterClose, children: _jsx(Component, { ...linkProps, ...restProps, children: _jsx("span", { className: s.PressableInner, children: children }) }) }));
95
+ return (_jsx(DropdownMenu.Item, { asChild: true, className: clsx(s.MenuItem, className), disabled: disabled, "data-danger": danger ? "" : undefined, onPointerMove: isExternal ? undefined : handlePreventAfterClose, onPointerLeave: isExternal ? undefined : handlePreventAfterClose, children: _jsx(Component, { ...linkProps, ...restProps, onClick: (event) => {
96
+ restProps.onClick?.(event);
97
+ // Radix skips selecting a disabled item, not the link's navigation
98
+ if (disabled)
99
+ event.preventDefault();
100
+ }, children: _jsx("span", { className: s.PressableInner, children: children }) }) }));
96
101
  });
97
102
  const Separator = ({ className }) => {
98
103
  return _jsx(DropdownMenu.Separator, { className: clsx(s.Separator, className), role: "separator" });
@@ -112,8 +117,11 @@ const Content = ({ children, side, sideOffset = 5, align, alignOffset, width, mi
112
117
  "menu-max-height": maxHeight,
113
118
  }), children: children }, "dropdown")) }) }));
114
119
  };
115
- const Trigger = ({ children, disabled }) => {
116
- return (_jsx(DropdownMenu.Trigger, { asChild: true, disabled: disabled, children: children }));
120
+ const Trigger = ({ children, disabled, ...restProps }) => {
121
+ // Always composes onto the child (asChild after the spread wins over a
122
+ // caller's asChild); other props (aria-*, handlers, ref) reach it through
123
+ // the Slot instead of being dropped
124
+ return (_jsx(DropdownMenu.Trigger, { ...restProps, asChild: true, disabled: disabled, children: children }));
117
125
  };
118
126
  const SubmenuContext = createContext(null);
119
127
  const useSubmenuContext = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"Menu.js","sourceRoot":"","sources":["../../../../src/components/Menu/Menu.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport { DropdownMenu } from \"radix-ui\"\nimport React, {\n type ComponentProps,\n type ComponentType,\n createContext,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\"\n\nimport clsx from \"clsx\"\nimport { useEscCloseStack } from \"../../hooks/useEscCloseStack\"\nimport { useLatestValue } from \"../../hooks/useLatestValue\"\nimport { preventDefaultHandler, toCssVariables } from \"../../lib/helpers\"\nimport { Button } from \"../Button\"\nimport { Check, ChevronRight } from \"../Icon\"\nimport { useLinkComponent } from \"../PlexUIProvider/internal\"\nimport { TransitionGroup } from \"../Transition\"\nimport s from \"./Menu.module.css\"\n\ntype MenuContextValue = {\n open: boolean\n setOpen: (next: boolean) => void\n}\n\nconst MenuContext = createContext<MenuContextValue | null>(null)\n\nconst useMenuContext = () => {\n const context = useContext(MenuContext)\n\n if (!context) {\n throw new Error(\"Menu components must be wrapped in <Menu />\")\n }\n\n return context\n}\n\nexport type MenuProps = {\n children: React.ReactNode\n /** Force the menu to remain open or closed */\n forceOpen?: boolean\n /** Callback triggered when the modal is opened */\n onOpen?: () => void\n /** Callback triggered when the modal is closed */\n onClose?: () => void\n /**\n * When set to `true`, interaction with outside elements will be disabled and only menu content will be visible to screen readers.\n * @default false\n */\n modal?: boolean\n}\n\nexport const Menu = ({ children, forceOpen, onOpen, onClose, modal = false }: MenuProps) => {\n const [open, setOpen] = useState<boolean>(false)\n const isOpen = forceOpen ?? open\n\n const latestOnOpen = useLatestValue(onOpen)\n const latestOnClose = useLatestValue(onClose)\n\n const handleOpenChange = useCallback(\n (nextState: boolean) => {\n setOpen(nextState)\n if (nextState) {\n latestOnOpen.current?.()\n } else {\n latestOnClose.current?.()\n }\n },\n [latestOnOpen, latestOnClose],\n )\n\n useEscCloseStack(open, () => {\n handleOpenChange(false)\n })\n\n const store = useMemo<MenuContextValue>(\n () => ({\n open: isOpen,\n setOpen: handleOpenChange,\n }),\n [isOpen, handleOpenChange],\n )\n\n return (\n <MenuContext.Provider value={store}>\n <DropdownMenu.Root open={isOpen} onOpenChange={handleOpenChange} modal={modal}>\n {children}\n </DropdownMenu.Root>\n </MenuContext.Provider>\n )\n}\n\nexport type MenuItemProps = {\n className?: string\n children: React.ReactNode\n /**\n * Second line under the item's label: what this action does, or which\n * value it carries. The label goes semibold on its own, the same way a\n * Select option with a description does — same pattern, same anatomy.\n */\n description?: ReactNode\n /** Callback triggered when the item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Callback triggered when the item is clicked */\n onClick?: DropdownMenu.DropdownMenuItemProps[\"onClick\"]\n /** Disables the menu item */\n disabled?: boolean\n}\n\nconst Item = ({ className, children, description, disabled, onSelect, onClick }: MenuItemProps) => {\n const { open } = useMenuContext()\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we're always known to be closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n // A described item stacks its two lines; without a description the item\n // keeps the plain flex row that icons and ItemActions rely on.\n const content =\n description === undefined ? (\n children\n ) : (\n <div className={s.ItemLeading}>\n <div>{children}</div>\n <div className={s.ItemDescription}>{description}</div>\n </div>\n )\n\n // Custom click handlers\n if (onSelect) {\n return (\n <DropdownMenu.Item\n className={clsx(s.MenuItem, className)}\n onSelect={onSelect}\n onClick={onClick}\n disabled={disabled}\n onPointerMove={handlePreventAfterClose}\n onPointerLeave={handlePreventAfterClose}\n >\n <div className={s.PressableInner}>{content}</div>\n </DropdownMenu.Item>\n )\n }\n\n // Read-only content - will not appear interactive.\n return <div className={clsx(s.MenuItemContent, className)}>{content}</div>\n}\n\nconst ItemActions = ({ className, children }: { className?: string; children: ReactNode }) => {\n return <div className={clsx(s.ItemActions, className)}>{children}</div>\n}\n\nconst ItemAction = ({\n children,\n onClick,\n}: {\n children: ReactNode\n onClick: (evt: MouseEvent) => void\n}) => {\n const { setOpen } = useMenuContext()\n\n return (\n <Button\n className=\"rounded-sm\"\n color=\"secondary\"\n size=\"xs\"\n uniform\n iconSize=\"sm\"\n variant=\"ghost\"\n onClick={(evt) => {\n evt.stopPropagation()\n setOpen(false)\n onClick(evt)\n }}\n >\n {children}\n </Button>\n )\n}\n\ntype MenuLinkProps = Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\" | \"children\"> & {\n /** Content rendered inside the Link */\n children: React.ReactNode\n /** Disables the menu item */\n disabled?: boolean\n}\n\ntype MenuLink = <\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends ComponentType<any> | \"a\" = PlexUI.LinkComponent,\n>(\n props: Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\"> &\n MenuLinkProps & {\n /**\n * Override the default component used for the link. This is useful for\n * using a routing library, or SSR rendering.\n * purposes.\n *\n * @default 'a'\n */\n as?: T\n } & ComponentProps<T>,\n) => ReactNode\n\nconst Link = ((\n props: MenuLinkProps & { href?: string; to?: string; as?: PlexUI.LinkComponent },\n) => {\n const { className, children, href, to, disabled, as: OverrideComponent, ...restProps } = props\n const { open } = useMenuContext()\n\n const propPath = href || to\n // When a path is not provided, default to an anchor\n const isExternal = propPath ? /^https?:\\/\\//.test(propPath) : true\n const DefaultComponent = useLinkComponent()\n const Component = OverrideComponent || (isExternal ? \"a\" : DefaultComponent)\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we're always known to be closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n const linkProps = isExternal\n ? { target: \"_blank\", rel: \"noopener noreferrer\", href: href ?? to }\n : { href, to }\n\n return (\n <DropdownMenu.Item\n asChild\n className={clsx(s.MenuItem, className)}\n disabled={disabled}\n onPointerMove={isExternal ? undefined : handlePreventAfterClose}\n onPointerLeave={isExternal ? undefined : handlePreventAfterClose}\n >\n <Component {...linkProps} {...restProps}>\n <span className={s.PressableInner}>{children}</span>\n </Component>\n </DropdownMenu.Item>\n )\n}) as MenuLink\n\nconst Separator = ({ className }: { className?: string }) => {\n return <DropdownMenu.Separator className={clsx(s.Separator, className)} role=\"separator\" />\n}\n\n\nconst Label = ({ className, children }: { className?: string; children: ReactNode }) => {\n return (\n <DropdownMenu.Label className={clsx(s.MenuLabel, className)}>\n {children}\n </DropdownMenu.Label>\n )\n}\n\nconst Group = ({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) => {\n return <DropdownMenu.Group className={className}>{children}</DropdownMenu.Group>\n}\n\nexport type MenuContentProps = {\n children: React.ReactNode\n /**\n * The preferred side of the trigger to render against when open. Will be reversed when collisions occur.\n * @default bottom\n */\n side?: DropdownMenu.DropdownMenuContentProps[\"side\"]\n /**\n * The distance in pixels from the trigger.\n * @default 5\n */\n sideOffset?: DropdownMenu.DropdownMenuContentProps[\"sideOffset\"]\n /**\n * The preferred alignment against the trigger. May change when collisions occur.\n * @default center\n */\n align?: DropdownMenu.DropdownMenuContentProps[\"align\"]\n /**\n * An offset in pixels from the \"start\" or \"end\" alignment options.\n * @default 0\n */\n alignOffset?: DropdownMenu.DropdownMenuContentProps[\"alignOffset\"]\n /**\n * Defines the `width` property of the content\n * @default auto\n */\n width?: number | \"auto\"\n /**\n * Defines the `min-width` property of the content, in pixels.\n * @default 300\n */\n minWidth?: number | \"auto\"\n /**\n * Defines the `max-width` property of the content, in pixels.\n */\n maxHeight?: number\n /**\n * Layout direction of menu items.\n * Use `\"horizontal\"` for icon-based toolbars (iOS-style).\n * @default \"vertical\"\n */\n layout?: \"vertical\" | \"horizontal\"\n /**\n * Size of horizontal menu items. Controls icon size and padding.\n * Only applies when `layout=\"horizontal\"`.\n * @default \"md\"\n */\n size?: \"sm\" | \"md\" | \"lg\"\n /**\n * Event handler called when auto-focus tries to return to the trigger\n * after the menu closes. Call `event.preventDefault()` to prevent the\n * trigger from regaining focus (and its focus-visible ring).\n */\n onCloseAutoFocus?: DropdownMenu.DropdownMenuContentProps[\"onCloseAutoFocus\"]\n}\n\nconst Content = ({\n children,\n side,\n sideOffset = 5,\n align,\n alignOffset,\n width,\n minWidth,\n maxHeight,\n layout = \"vertical\",\n size,\n onCloseAutoFocus,\n}: MenuContentProps) => {\n const { open } = useMenuContext()\n const isHorizontal = layout === \"horizontal\"\n\n return (\n <DropdownMenu.Portal forceMount>\n <TransitionGroup className={s.Menu} enterDuration={350} exitDuration={200} disableAnimations>\n {open && (\n <DropdownMenu.Content\n key=\"dropdown\"\n forceMount\n className={s.MenuList}\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset ?? (align === \"center\" ? 0 : -5)}\n avoidCollisions\n collisionPadding={{ bottom: 30, top: 30, left: 12, right: 12 }}\n onEscapeKeyDown={preventDefaultHandler}\n onCloseAutoFocus={onCloseAutoFocus}\n data-layout={isHorizontal ? \"horizontal\" : undefined}\n data-size={isHorizontal && size ? size : undefined}\n style={toCssVariables({\n \"menu-width\": width,\n \"menu-min-width\": isHorizontal ? \"auto\" : minWidth,\n \"menu-max-height\": maxHeight,\n })}\n >\n {children}\n </DropdownMenu.Content>\n )}\n </TransitionGroup>\n </DropdownMenu.Portal>\n )\n}\n\nconst Trigger = ({ children, disabled }: DropdownMenu.DropdownMenuTriggerProps) => {\n return (\n <DropdownMenu.Trigger asChild disabled={disabled}>\n {children}\n </DropdownMenu.Trigger>\n )\n}\n\ntype SubmenuContextValue = {\n open: boolean\n setOpen: (next: boolean) => void\n triggerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst SubmenuContext = createContext<SubmenuContextValue | null>(null)\n\nconst useSubmenuContext = () => {\n const context = useContext(SubmenuContext)\n\n if (!context) {\n throw new Error(\"Submenu components must be wrapped in <Sub />\")\n }\n\n return context\n}\n\nexport type SubmenuProps = {\n children: React.ReactNode\n /** Force the menu to remain open or closed */\n forceOpen?: boolean\n /** Callback triggered when the modal is opened */\n onOpen?: () => void\n /** Callback triggered when the modal is closed */\n onClose?: () => void\n}\n\nconst Sub = ({ children, forceOpen, onOpen, onClose }: SubmenuProps) => {\n const [open, setOpen] = useState<boolean>(false)\n const triggerRef = useRef<HTMLDivElement>(null)\n const isOpen = forceOpen ?? open\n\n const latestOnOpen = useLatestValue(onOpen)\n const latestOnClose = useLatestValue(onClose)\n\n const handleOpenChange = useCallback(\n (nextState: boolean) => {\n setOpen(nextState)\n if (nextState) {\n latestOnOpen.current?.()\n } else {\n latestOnClose.current?.()\n }\n },\n [latestOnOpen, latestOnClose],\n )\n\n useEscCloseStack(open, () => {\n handleOpenChange(false)\n // Ensure trigger is focused\n triggerRef.current?.focus()\n })\n\n const store = useMemo<SubmenuContextValue>(\n () => ({\n open: isOpen,\n setOpen: handleOpenChange,\n triggerRef,\n }),\n [isOpen, handleOpenChange],\n )\n\n return (\n <SubmenuContext.Provider value={store}>\n <DropdownMenu.Sub open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </DropdownMenu.Sub>\n </SubmenuContext.Provider>\n )\n}\n\nconst SubTrigger = ({\n className,\n children,\n disabled,\n}: {\n className?: string\n children: ReactNode\n disabled?: boolean\n}) => {\n const { open } = useMenuContext()\n const { triggerRef } = useSubmenuContext()\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we know the outer menu is closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n return (\n <DropdownMenu.SubTrigger\n ref={triggerRef}\n className={clsx(s.MenuItem, s.SubMenuItem, className)}\n disabled={disabled}\n onPointerMove={handlePreventAfterClose}\n onPointerLeave={handlePreventAfterClose}\n >\n <div className={s.PressableInner}>\n {children}\n <ChevronRight width=\"16\" height=\"16\" className={s.SubTriggerIcon} />\n </div>\n </DropdownMenu.SubTrigger>\n )\n}\n\ntype SubContentProps = {\n children: ReactNode\n sideOffset?: DropdownMenu.DropdownMenuSubContentProps[\"sideOffset\"]\n alignOffset?: DropdownMenu.DropdownMenuSubContentProps[\"alignOffset\"]\n width?: number | \"auto\"\n minWidth?: number | \"auto\"\n maxHeight?: number\n}\n\nconst SubContent = ({\n children,\n sideOffset = 4,\n alignOffset = -6,\n width = \"auto\",\n minWidth = \"auto\",\n maxHeight,\n}: SubContentProps) => {\n const { open } = useSubmenuContext()\n\n return (\n <DropdownMenu.Portal forceMount>\n <TransitionGroup className={s.Menu} enterDuration={350} exitDuration={200} disableAnimations>\n {open && (\n <DropdownMenu.SubContent\n key=\"submenu\"\n className={s.MenuList}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n avoidCollisions\n collisionPadding={{ bottom: 30, top: 30, left: 12, right: 12 }}\n onEscapeKeyDown={preventDefaultHandler}\n style={toCssVariables({\n \"menu-width\": width,\n \"menu-min-width\": minWidth,\n \"menu-max-height\": maxHeight,\n })}\n >\n {children}\n </DropdownMenu.SubContent>\n )}\n </TransitionGroup>\n </DropdownMenu.Portal>\n )\n}\n\nexport type MenuRadioGroupProps<T extends string> = {\n /** Controlled value */\n value: T\n /** Fired when selection changes */\n onChange: (value: T) => void\n children: ReactNode\n /**\n * The orientation of the indicator within the radio item.\n * @default end\n */\n indicatorPosition?: \"start\" | \"end\"\n}\n\nconst RadioGroup = <T extends string>({\n children,\n value,\n onChange,\n indicatorPosition = \"end\",\n ...props\n}: MenuRadioGroupProps<T>) => (\n <DropdownMenu.RadioGroup\n {...props}\n value={value}\n onValueChange={(v: string) => onChange(v as T)}\n data-indicator-position={indicatorPosition}\n >\n {children}\n </DropdownMenu.RadioGroup>\n)\n\nexport type MenuRadioItemProps<T extends string> = {\n value: T\n /** Class applied to the radio item */\n className?: string\n children: ReactNode\n /** Callback triggered when the radio item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Disables the radio item */\n disabled?: boolean\n}\n\nconst RadioItem = <T extends string>({ className, children, ...props }: MenuRadioItemProps<T>) => (\n <DropdownMenu.RadioItem className={clsx(s.MenuItem, s.RadioItem, className)} {...props}>\n <div className={s.PressableInner}>\n <div className={s.RadioIndicator}>\n <DropdownMenu.ItemIndicator className={s.RadioIndicatorActive} />\n </div>\n {children}\n </div>\n </DropdownMenu.RadioItem>\n)\n\nexport type MenuCheckboxItemProps = {\n /** Controlled checked state of the checkbox item */\n checked?: DropdownMenu.DropdownMenuCheckboxItemProps[\"checked\"]\n /** Event handler called when the checked state changes */\n onCheckedChange?: DropdownMenu.DropdownMenuCheckboxItemProps[\"onCheckedChange\"]\n /** Class applied to the checkbox item */\n className?: string\n children: ReactNode\n /** Callback triggered when the checkbox item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Disables the checkbox item */\n disabled?: boolean\n /**\n * The orientation of the indicator within the checkbox item.\n * @default end\n */\n indicatorPosition?: \"start\" | \"end\"\n /**\n * Visual treatment for the checkbox indicator.\n * @default solid\n */\n indicatorVariant?: \"solid\" | \"ghost\"\n}\nconst CheckboxItem = ({\n className,\n children,\n indicatorPosition = \"end\",\n indicatorVariant = \"solid\",\n ...props\n}: MenuCheckboxItemProps) => (\n <DropdownMenu.CheckboxItem\n className={clsx(s.MenuItem, s.CheckboxItem, className)}\n {...props}\n data-indicator-position={indicatorPosition}\n data-indicator-variant={indicatorVariant}\n >\n <div className={s.PressableInner}>\n <div className={s.CheckboxIndicator}>\n <DropdownMenu.ItemIndicator>\n {indicatorVariant === \"ghost\" ? (\n <Check className=\"size-4\" />\n ) : (\n <div className={s.CheckboxCircle}>\n <Check className=\"size-4\" />\n </div>\n )}\n </DropdownMenu.ItemIndicator>\n </div>\n {children}\n </div>\n </DropdownMenu.CheckboxItem>\n)\n\nMenu.Content = Content\nMenu.Item = Item\nMenu.ItemActions = ItemActions\nMenu.ItemAction = ItemAction\nMenu.Link = Link\nMenu.Separator = Separator\nMenu.Trigger = Trigger\nMenu.Sub = Sub\nMenu.SubTrigger = SubTrigger\nMenu.SubContent = SubContent\nMenu.CheckboxItem = CheckboxItem\nMenu.RadioGroup = RadioGroup\nMenu.RadioItem = RadioItem\nMenu.Label = Label\nMenu.Group = Group\n"]}
1
+ {"version":3,"file":"Menu.js","sourceRoot":"","sources":["../../../../src/components/Menu/Menu.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport { DropdownMenu } from \"radix-ui\"\nimport React, {\n type ComponentProps,\n type ComponentType,\n createContext,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\"\n\nimport clsx from \"clsx\"\nimport { useEscCloseStack } from \"../../hooks/useEscCloseStack\"\nimport { useLatestValue } from \"../../hooks/useLatestValue\"\nimport { preventDefaultHandler, toCssVariables } from \"../../lib/helpers\"\nimport { Button } from \"../Button\"\nimport { Check, ChevronRight } from \"../Icon\"\nimport { useLinkComponent } from \"../PlexUIProvider/internal\"\nimport { TransitionGroup } from \"../Transition\"\nimport s from \"@plexui/styles/components/Menu/Menu.module.css\"\n\ntype MenuContextValue = {\n open: boolean\n setOpen: (next: boolean) => void\n}\n\nconst MenuContext = createContext<MenuContextValue | null>(null)\n\nconst useMenuContext = () => {\n const context = useContext(MenuContext)\n\n if (!context) {\n throw new Error(\"Menu components must be wrapped in <Menu />\")\n }\n\n return context\n}\n\nexport type MenuProps = {\n children: React.ReactNode\n /** Force the menu to remain open or closed */\n forceOpen?: boolean\n /** Callback triggered when the modal is opened */\n onOpen?: () => void\n /** Callback triggered when the modal is closed */\n onClose?: () => void\n /**\n * When set to `true`, interaction with outside elements will be disabled and only menu content will be visible to screen readers.\n * @default false\n */\n modal?: boolean\n}\n\nexport const Menu = ({ children, forceOpen, onOpen, onClose, modal = false }: MenuProps) => {\n const [open, setOpen] = useState<boolean>(false)\n const isOpen = forceOpen ?? open\n\n const latestOnOpen = useLatestValue(onOpen)\n const latestOnClose = useLatestValue(onClose)\n\n const handleOpenChange = useCallback(\n (nextState: boolean) => {\n setOpen(nextState)\n if (nextState) {\n latestOnOpen.current?.()\n } else {\n latestOnClose.current?.()\n }\n },\n [latestOnOpen, latestOnClose],\n )\n\n useEscCloseStack(open, () => {\n handleOpenChange(false)\n })\n\n const store = useMemo<MenuContextValue>(\n () => ({\n open: isOpen,\n setOpen: handleOpenChange,\n }),\n [isOpen, handleOpenChange],\n )\n\n return (\n <MenuContext.Provider value={store}>\n <DropdownMenu.Root open={isOpen} onOpenChange={handleOpenChange} modal={modal}>\n {children}\n </DropdownMenu.Root>\n </MenuContext.Provider>\n )\n}\n\nexport type MenuItemProps = {\n className?: string\n children: React.ReactNode\n /**\n * Second line under the item's label: what this action does, or which\n * value it carries. The label goes semibold on its own, the same way a\n * Select option with a description does — same pattern, same anatomy.\n */\n description?: ReactNode\n /** Callback triggered when the item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Callback triggered when the item is clicked */\n onClick?: DropdownMenu.DropdownMenuItemProps[\"onClick\"]\n /** Disables the menu item */\n disabled?: boolean\n /** Marks a destructive action (delete, remove, leave): the item is drawn in the danger color */\n danger?: boolean\n}\n\nconst Item = ({ className, children, description, disabled, danger, onSelect, onClick }: MenuItemProps) => {\n const { open } = useMenuContext()\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we're always known to be closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n // A described item stacks its two lines; without a description the item\n // keeps the plain flex row that icons and ItemActions rely on.\n const content =\n description === undefined ? (\n children\n ) : (\n <div className={s.ItemLeading}>\n <div>{children}</div>\n <div className={s.ItemDescription}>{description}</div>\n </div>\n )\n\n // Custom click handlers: either callback makes the item interactive\n if (onSelect || onClick) {\n return (\n <DropdownMenu.Item\n className={clsx(s.MenuItem, className)}\n onSelect={onSelect}\n onClick={onClick}\n disabled={disabled}\n data-danger={danger ? \"\" : undefined}\n onPointerMove={handlePreventAfterClose}\n onPointerLeave={handlePreventAfterClose}\n >\n <div className={s.PressableInner}>{content}</div>\n </DropdownMenu.Item>\n )\n }\n\n // Read-only content - will not appear interactive.\n return <div className={clsx(s.MenuItemContent, className)}>{content}</div>\n}\n\nconst ItemActions = ({ className, children }: { className?: string; children: ReactNode }) => {\n return <div className={clsx(s.ItemActions, className)}>{children}</div>\n}\n\nconst ItemAction = ({\n children,\n onClick,\n \"aria-label\": ariaLabel,\n}: {\n children: ReactNode\n onClick: (evt: MouseEvent) => void\n /** Accessible name; the action is an icon-only button */\n \"aria-label\"?: string\n}) => {\n const { setOpen } = useMenuContext()\n\n return (\n <Button\n className=\"rounded-sm\"\n color=\"secondary\"\n size=\"xs\"\n uniform\n iconSize=\"sm\"\n variant=\"ghost\"\n aria-label={ariaLabel}\n onClick={(evt) => {\n evt.stopPropagation()\n setOpen(false)\n onClick(evt)\n }}\n >\n {children}\n </Button>\n )\n}\n\ntype MenuLinkProps = Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\" | \"children\"> & {\n /** Content rendered inside the Link */\n children: React.ReactNode\n /** Disables the menu item */\n disabled?: boolean\n /** Marks a destructive destination: the item is drawn in the danger color */\n danger?: boolean\n}\n\ntype MenuLink = <\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends ComponentType<any> | \"a\" = PlexUI.LinkComponent,\n>(\n props: Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\"> &\n MenuLinkProps & {\n /**\n * Override the default component used for the link. This is useful for\n * using a routing library, or SSR rendering.\n * purposes.\n *\n * @default 'a'\n */\n as?: T\n } & ComponentProps<T>,\n) => ReactNode\n\nconst Link = ((\n props: MenuLinkProps & { href?: string; to?: string; as?: PlexUI.LinkComponent },\n) => {\n const { className, children, href, to, disabled, danger, as: OverrideComponent, ...restProps } = props\n const { open } = useMenuContext()\n\n const propPath = href || to\n // When a path is not provided, default to an anchor\n const isExternal = propPath ? /^https?:\\/\\//.test(propPath) : true\n const DefaultComponent = useLinkComponent()\n const Component = OverrideComponent || (isExternal ? \"a\" : DefaultComponent)\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we're always known to be closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n const linkProps = isExternal\n ? { target: \"_blank\", rel: \"noopener noreferrer\", href: href ?? to }\n : { href, to }\n\n return (\n <DropdownMenu.Item\n asChild\n className={clsx(s.MenuItem, className)}\n disabled={disabled}\n data-danger={danger ? \"\" : undefined}\n onPointerMove={isExternal ? undefined : handlePreventAfterClose}\n onPointerLeave={isExternal ? undefined : handlePreventAfterClose}\n >\n <Component\n {...linkProps}\n {...restProps}\n onClick={(event: React.MouseEvent<HTMLAnchorElement>) => {\n restProps.onClick?.(event)\n // Radix skips selecting a disabled item, not the link's navigation\n if (disabled) event.preventDefault()\n }}\n >\n <span className={s.PressableInner}>{children}</span>\n </Component>\n </DropdownMenu.Item>\n )\n}) as MenuLink\n\nconst Separator = ({ className }: { className?: string }) => {\n return <DropdownMenu.Separator className={clsx(s.Separator, className)} role=\"separator\" />\n}\n\n\nconst Label = ({ className, children }: { className?: string; children: ReactNode }) => {\n return (\n <DropdownMenu.Label className={clsx(s.MenuLabel, className)}>\n {children}\n </DropdownMenu.Label>\n )\n}\n\nconst Group = ({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) => {\n return <DropdownMenu.Group className={className}>{children}</DropdownMenu.Group>\n}\n\nexport type MenuContentProps = {\n children: React.ReactNode\n /**\n * The preferred side of the trigger to render against when open. Will be reversed when collisions occur.\n * @default bottom\n */\n side?: DropdownMenu.DropdownMenuContentProps[\"side\"]\n /**\n * The distance in pixels from the trigger.\n * @default 5\n */\n sideOffset?: DropdownMenu.DropdownMenuContentProps[\"sideOffset\"]\n /**\n * The preferred alignment against the trigger. May change when collisions occur.\n * @default center\n */\n align?: DropdownMenu.DropdownMenuContentProps[\"align\"]\n /**\n * An offset in pixels from the \"start\" or \"end\" alignment options.\n * @default 0\n */\n alignOffset?: DropdownMenu.DropdownMenuContentProps[\"alignOffset\"]\n /**\n * Defines the `width` property of the content\n * @default auto\n */\n width?: number | \"auto\"\n /**\n * Defines the `min-width` property of the content, in pixels.\n * @default 300\n */\n minWidth?: number | \"auto\"\n /**\n * Defines the `max-width` property of the content, in pixels.\n */\n maxHeight?: number\n /**\n * Layout direction of menu items.\n * Use `\"horizontal\"` for icon-based toolbars (iOS-style).\n * @default \"vertical\"\n */\n layout?: \"vertical\" | \"horizontal\"\n /**\n * Size of horizontal menu items. Controls icon size and padding.\n * Only applies when `layout=\"horizontal\"`.\n * @default \"md\"\n */\n size?: \"sm\" | \"md\" | \"lg\"\n /**\n * Event handler called when auto-focus tries to return to the trigger\n * after the menu closes. Call `event.preventDefault()` to prevent the\n * trigger from regaining focus (and its focus-visible ring).\n */\n onCloseAutoFocus?: DropdownMenu.DropdownMenuContentProps[\"onCloseAutoFocus\"]\n}\n\nconst Content = ({\n children,\n side,\n sideOffset = 5,\n align,\n alignOffset,\n width,\n minWidth,\n maxHeight,\n layout = \"vertical\",\n size,\n onCloseAutoFocus,\n}: MenuContentProps) => {\n const { open } = useMenuContext()\n const isHorizontal = layout === \"horizontal\"\n\n return (\n <DropdownMenu.Portal forceMount>\n <TransitionGroup className={s.Menu} enterDuration={350} exitDuration={200} disableAnimations>\n {open && (\n <DropdownMenu.Content\n key=\"dropdown\"\n forceMount\n className={s.MenuList}\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset ?? (align === \"center\" ? 0 : -5)}\n avoidCollisions\n collisionPadding={{ bottom: 30, top: 30, left: 12, right: 12 }}\n onEscapeKeyDown={preventDefaultHandler}\n onCloseAutoFocus={onCloseAutoFocus}\n data-layout={isHorizontal ? \"horizontal\" : undefined}\n data-size={isHorizontal && size ? size : undefined}\n style={toCssVariables({\n \"menu-width\": width,\n \"menu-min-width\": isHorizontal ? \"auto\" : minWidth,\n \"menu-max-height\": maxHeight,\n })}\n >\n {children}\n </DropdownMenu.Content>\n )}\n </TransitionGroup>\n </DropdownMenu.Portal>\n )\n}\n\nconst Trigger = ({\n children,\n disabled,\n ...restProps\n}: DropdownMenu.DropdownMenuTriggerProps & { ref?: React.Ref<HTMLButtonElement> }) => {\n // Always composes onto the child (asChild after the spread wins over a\n // caller's asChild); other props (aria-*, handlers, ref) reach it through\n // the Slot instead of being dropped\n return (\n <DropdownMenu.Trigger {...restProps} asChild disabled={disabled}>\n {children}\n </DropdownMenu.Trigger>\n )\n}\n\ntype SubmenuContextValue = {\n open: boolean\n setOpen: (next: boolean) => void\n triggerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst SubmenuContext = createContext<SubmenuContextValue | null>(null)\n\nconst useSubmenuContext = () => {\n const context = useContext(SubmenuContext)\n\n if (!context) {\n throw new Error(\"Submenu components must be wrapped in <Sub />\")\n }\n\n return context\n}\n\nexport type SubmenuProps = {\n children: React.ReactNode\n /** Force the menu to remain open or closed */\n forceOpen?: boolean\n /** Callback triggered when the modal is opened */\n onOpen?: () => void\n /** Callback triggered when the modal is closed */\n onClose?: () => void\n}\n\nconst Sub = ({ children, forceOpen, onOpen, onClose }: SubmenuProps) => {\n const [open, setOpen] = useState<boolean>(false)\n const triggerRef = useRef<HTMLDivElement>(null)\n const isOpen = forceOpen ?? open\n\n const latestOnOpen = useLatestValue(onOpen)\n const latestOnClose = useLatestValue(onClose)\n\n const handleOpenChange = useCallback(\n (nextState: boolean) => {\n setOpen(nextState)\n if (nextState) {\n latestOnOpen.current?.()\n } else {\n latestOnClose.current?.()\n }\n },\n [latestOnOpen, latestOnClose],\n )\n\n useEscCloseStack(open, () => {\n handleOpenChange(false)\n // Ensure trigger is focused\n triggerRef.current?.focus()\n })\n\n const store = useMemo<SubmenuContextValue>(\n () => ({\n open: isOpen,\n setOpen: handleOpenChange,\n triggerRef,\n }),\n [isOpen, handleOpenChange],\n )\n\n return (\n <SubmenuContext.Provider value={store}>\n <DropdownMenu.Sub open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </DropdownMenu.Sub>\n </SubmenuContext.Provider>\n )\n}\n\nconst SubTrigger = ({\n className,\n children,\n disabled,\n}: {\n className?: string\n children: ReactNode\n disabled?: boolean\n}) => {\n const { open } = useMenuContext()\n const { triggerRef } = useSubmenuContext()\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we know the outer menu is closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n return (\n <DropdownMenu.SubTrigger\n ref={triggerRef}\n className={clsx(s.MenuItem, s.SubMenuItem, className)}\n disabled={disabled}\n onPointerMove={handlePreventAfterClose}\n onPointerLeave={handlePreventAfterClose}\n >\n <div className={s.PressableInner}>\n {children}\n <ChevronRight width=\"16\" height=\"16\" className={s.SubTriggerIcon} />\n </div>\n </DropdownMenu.SubTrigger>\n )\n}\n\ntype SubContentProps = {\n children: ReactNode\n sideOffset?: DropdownMenu.DropdownMenuSubContentProps[\"sideOffset\"]\n alignOffset?: DropdownMenu.DropdownMenuSubContentProps[\"alignOffset\"]\n width?: number | \"auto\"\n minWidth?: number | \"auto\"\n maxHeight?: number\n}\n\nconst SubContent = ({\n children,\n sideOffset = 4,\n alignOffset = -6,\n width = \"auto\",\n minWidth = \"auto\",\n maxHeight,\n}: SubContentProps) => {\n const { open } = useSubmenuContext()\n\n return (\n <DropdownMenu.Portal forceMount>\n <TransitionGroup className={s.Menu} enterDuration={350} exitDuration={200} disableAnimations>\n {open && (\n <DropdownMenu.SubContent\n key=\"submenu\"\n className={s.MenuList}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n avoidCollisions\n collisionPadding={{ bottom: 30, top: 30, left: 12, right: 12 }}\n onEscapeKeyDown={preventDefaultHandler}\n style={toCssVariables({\n \"menu-width\": width,\n \"menu-min-width\": minWidth,\n \"menu-max-height\": maxHeight,\n })}\n >\n {children}\n </DropdownMenu.SubContent>\n )}\n </TransitionGroup>\n </DropdownMenu.Portal>\n )\n}\n\nexport type MenuRadioGroupProps<T extends string> = {\n /** Controlled value */\n value: T\n /** Fired when selection changes */\n onChange: (value: T) => void\n children: ReactNode\n /**\n * The orientation of the indicator within the radio item.\n * @default end\n */\n indicatorPosition?: \"start\" | \"end\"\n}\n\nconst RadioGroup = <T extends string>({\n children,\n value,\n onChange,\n indicatorPosition = \"end\",\n ...props\n}: MenuRadioGroupProps<T>) => (\n <DropdownMenu.RadioGroup\n {...props}\n value={value}\n onValueChange={(v: string) => onChange(v as T)}\n data-indicator-position={indicatorPosition}\n >\n {children}\n </DropdownMenu.RadioGroup>\n)\n\nexport type MenuRadioItemProps<T extends string> = {\n value: T\n /** Class applied to the radio item */\n className?: string\n children: ReactNode\n /** Callback triggered when the radio item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Disables the radio item */\n disabled?: boolean\n}\n\nconst RadioItem = <T extends string>({ className, children, ...props }: MenuRadioItemProps<T>) => (\n <DropdownMenu.RadioItem className={clsx(s.MenuItem, s.RadioItem, className)} {...props}>\n <div className={s.PressableInner}>\n <div className={s.RadioIndicator}>\n <DropdownMenu.ItemIndicator className={s.RadioIndicatorActive} />\n </div>\n {children}\n </div>\n </DropdownMenu.RadioItem>\n)\n\nexport type MenuCheckboxItemProps = {\n /** Controlled checked state of the checkbox item */\n checked?: DropdownMenu.DropdownMenuCheckboxItemProps[\"checked\"]\n /** Event handler called when the checked state changes */\n onCheckedChange?: DropdownMenu.DropdownMenuCheckboxItemProps[\"onCheckedChange\"]\n /** Class applied to the checkbox item */\n className?: string\n children: ReactNode\n /** Callback triggered when the checkbox item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Disables the checkbox item */\n disabled?: boolean\n /**\n * The orientation of the indicator within the checkbox item.\n * @default end\n */\n indicatorPosition?: \"start\" | \"end\"\n /**\n * Visual treatment for the checkbox indicator.\n * @default solid\n */\n indicatorVariant?: \"solid\" | \"ghost\"\n}\nconst CheckboxItem = ({\n className,\n children,\n indicatorPosition = \"end\",\n indicatorVariant = \"solid\",\n ...props\n}: MenuCheckboxItemProps) => (\n <DropdownMenu.CheckboxItem\n className={clsx(s.MenuItem, s.CheckboxItem, className)}\n {...props}\n data-indicator-position={indicatorPosition}\n data-indicator-variant={indicatorVariant}\n >\n <div className={s.PressableInner}>\n <div className={s.CheckboxIndicator}>\n <DropdownMenu.ItemIndicator>\n {indicatorVariant === \"ghost\" ? (\n <Check className=\"size-4\" />\n ) : (\n <div className={s.CheckboxCircle}>\n <Check className=\"size-4\" />\n </div>\n )}\n </DropdownMenu.ItemIndicator>\n </div>\n {children}\n </div>\n </DropdownMenu.CheckboxItem>\n)\n\nMenu.Content = Content\nMenu.Item = Item\nMenu.ItemActions = ItemActions\nMenu.ItemAction = ItemAction\nMenu.Link = Link\nMenu.Separator = Separator\nMenu.Trigger = Trigger\nMenu.Sub = Sub\nMenu.SubTrigger = SubTrigger\nMenu.SubContent = SubContent\nMenu.CheckboxItem = CheckboxItem\nMenu.RadioGroup = RadioGroup\nMenu.RadioItem = RadioItem\nMenu.Label = Label\nMenu.Group = Group\n"]}
@@ -1,2 +1,2 @@
1
- export { Menu } from "./Menu";
1
+ export { Menu } from "./Menu.js";
2
2
  //# sourceMappingURL=index.js.map