@plumile/ui 0.1.56 → 0.1.57

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 (322) hide show
  1. package/lib/esm/atomic/atoms/badge/Badge.js +17 -16
  2. package/lib/esm/atomic/atoms/badge/Badge.js.map +1 -1
  3. package/lib/esm/atomic/atoms/badge/badge.css.js +30 -8
  4. package/lib/esm/atomic/atoms/badge/badge.css.js.map +1 -1
  5. package/lib/esm/atomic/atoms/button/Button.js +46 -58
  6. package/lib/esm/atomic/atoms/button/Button.js.map +1 -1
  7. package/lib/esm/atomic/atoms/button/LinkButton.js +48 -62
  8. package/lib/esm/atomic/atoms/button/LinkButton.js.map +1 -1
  9. package/lib/esm/atomic/atoms/button/button.css.js +95 -16
  10. package/lib/esm/atomic/atoms/button/button.css.js.map +1 -1
  11. package/lib/esm/atomic/atoms/checkbox/Checkbox.js +37 -40
  12. package/lib/esm/atomic/atoms/checkbox/Checkbox.js.map +1 -1
  13. package/lib/esm/atomic/atoms/checkbox/checkbox.css.js +26 -11
  14. package/lib/esm/atomic/atoms/checkbox/checkbox.css.js.map +1 -1
  15. package/lib/esm/atomic/atoms/formatted-date/FormattedDate.js +32 -31
  16. package/lib/esm/atomic/atoms/formatted-date/FormattedDate.js.map +1 -1
  17. package/lib/esm/atomic/atoms/icon-button/IconMenuButton.js +18 -25
  18. package/lib/esm/atomic/atoms/icon-button/IconMenuButton.js.map +1 -1
  19. package/lib/esm/atomic/atoms/input/Input.js +46 -40
  20. package/lib/esm/atomic/atoms/input/Input.js.map +1 -1
  21. package/lib/esm/atomic/atoms/input/input.css.js +32 -14
  22. package/lib/esm/atomic/atoms/input/input.css.js.map +1 -1
  23. package/lib/esm/atomic/atoms/label/Label.js +23 -16
  24. package/lib/esm/atomic/atoms/label/Label.js.map +1 -1
  25. package/lib/esm/atomic/atoms/label/label.css.js +27 -9
  26. package/lib/esm/atomic/atoms/label/label.css.js.map +1 -1
  27. package/lib/esm/atomic/atoms/textarea/Textarea.js +19 -18
  28. package/lib/esm/atomic/atoms/textarea/Textarea.js.map +1 -1
  29. package/lib/esm/atomic/atoms/textarea/textarea.css.js +32 -8
  30. package/lib/esm/atomic/atoms/textarea/textarea.css.js.map +1 -1
  31. package/lib/esm/atomic/molecules/breadcrumb_navigation/BreadcrumbMenuDropdown.js +47 -54
  32. package/lib/esm/atomic/molecules/breadcrumb_navigation/BreadcrumbMenuDropdown.js.map +1 -1
  33. package/lib/esm/atomic/molecules/breadcrumb_navigation/BreadcrumbMenuPopover.js +53 -60
  34. package/lib/esm/atomic/molecules/breadcrumb_navigation/BreadcrumbMenuPopover.js.map +1 -1
  35. package/lib/esm/atomic/molecules/breadcrumb_navigation/BreadcrumbNavigation.js +62 -63
  36. package/lib/esm/atomic/molecules/breadcrumb_navigation/BreadcrumbNavigation.js.map +1 -1
  37. package/lib/esm/atomic/molecules/breadcrumb_navigation/breadcrumbNavigation.css.js +8 -30
  38. package/lib/esm/atomic/molecules/breadcrumb_navigation/breadcrumbNavigation.css.js.map +1 -1
  39. package/lib/esm/atomic/molecules/breadcrumb_navigation/types.js +0 -2
  40. package/lib/esm/atomic/molecules/card/Card.css.js +8 -10
  41. package/lib/esm/atomic/molecules/card/Card.css.js.map +1 -1
  42. package/lib/esm/atomic/molecules/card/Card.js +24 -17
  43. package/lib/esm/atomic/molecules/card/Card.js.map +1 -1
  44. package/lib/esm/atomic/molecules/dropdown/Dropdown.js +148 -177
  45. package/lib/esm/atomic/molecules/dropdown/Dropdown.js.map +1 -1
  46. package/lib/esm/atomic/molecules/dropdown/dropdown.css.js +8 -13
  47. package/lib/esm/atomic/molecules/dropdown/dropdown.css.js.map +1 -1
  48. package/lib/esm/atomic/molecules/form-actions/FormActions.js +31 -56
  49. package/lib/esm/atomic/molecules/form-actions/FormActions.js.map +1 -1
  50. package/lib/esm/atomic/molecules/tabs/Tabs.js +34 -33
  51. package/lib/esm/atomic/molecules/tabs/Tabs.js.map +1 -1
  52. package/lib/esm/atomic/molecules/tabs/tabs.css.js +18 -9
  53. package/lib/esm/atomic/molecules/tabs/tabs.css.js.map +1 -1
  54. package/lib/esm/atomic/molecules/toast/ToastProvider.js +82 -77
  55. package/lib/esm/atomic/molecules/toast/ToastProvider.js.map +1 -1
  56. package/lib/esm/atomic/molecules/toast/ToastViewport.js +75 -70
  57. package/lib/esm/atomic/molecules/toast/ToastViewport.js.map +1 -1
  58. package/lib/esm/atomic/molecules/toast/constants.js +6 -5
  59. package/lib/esm/atomic/molecules/toast/constants.js.map +1 -1
  60. package/lib/esm/atomic/molecules/toast/toast.css.js +18 -17
  61. package/lib/esm/atomic/molecules/toast/toast.css.js.map +1 -1
  62. package/lib/esm/components/charts/BillingUsageLineChart.js +140 -173
  63. package/lib/esm/components/charts/BillingUsageLineChart.js.map +1 -1
  64. package/lib/esm/components/charts/billingUsageLineChart.css.js +8 -12
  65. package/lib/esm/components/charts/billingUsageLineChart.css.js.map +1 -1
  66. package/lib/esm/components/data-table/DataTable.css.js +84 -24
  67. package/lib/esm/components/data-table/DataTable.css.js.map +1 -1
  68. package/lib/esm/components/data-table/DataTable.js +73 -140
  69. package/lib/esm/components/data-table/DataTable.js.map +1 -1
  70. package/lib/esm/components/data-table/TableCell.css.js +18 -15
  71. package/lib/esm/components/data-table/TableCell.css.js.map +1 -1
  72. package/lib/esm/components/data-table/TableCell.js +74 -73
  73. package/lib/esm/components/data-table/TableCell.js.map +1 -1
  74. package/lib/esm/components/data-table/TableCellBase.js +18 -15
  75. package/lib/esm/components/data-table/TableCellBase.js.map +1 -1
  76. package/lib/esm/components/data-table/VirtualizedConnectionTable.css.js +8 -10
  77. package/lib/esm/components/data-table/VirtualizedConnectionTable.css.js.map +1 -1
  78. package/lib/esm/components/data-table/VirtualizedConnectionTable.js +190 -248
  79. package/lib/esm/components/data-table/VirtualizedConnectionTable.js.map +1 -1
  80. package/lib/esm/components/data-table/tableBreakpoints.js +28 -34
  81. package/lib/esm/components/data-table/tableBreakpoints.js.map +1 -1
  82. package/lib/esm/components/layout/ContentLayout.css.js +8 -18
  83. package/lib/esm/components/layout/ContentLayout.css.js.map +1 -1
  84. package/lib/esm/components/layout/ContentLayout.js +68 -78
  85. package/lib/esm/components/layout/ContentLayout.js.map +1 -1
  86. package/lib/esm/components/layout/TabsContentLayout.css.js +8 -11
  87. package/lib/esm/components/layout/TabsContentLayout.css.js.map +1 -1
  88. package/lib/esm/components/layout/TabsContentLayout.js +30 -13
  89. package/lib/esm/components/layout/TabsContentLayout.js.map +1 -1
  90. package/lib/esm/components/select/SimpleSelect.css.js +17 -22
  91. package/lib/esm/components/select/SimpleSelect.css.js.map +1 -1
  92. package/lib/esm/components/select/SimpleSelect.js +184 -184
  93. package/lib/esm/components/select/SimpleSelect.js.map +1 -1
  94. package/lib/esm/components/subscriptions/RefetchNeededBanner.css.js +8 -10
  95. package/lib/esm/components/subscriptions/RefetchNeededBanner.css.js.map +1 -1
  96. package/lib/esm/components/subscriptions/RefetchNeededBanner.js +31 -23
  97. package/lib/esm/components/subscriptions/RefetchNeededBanner.js.map +1 -1
  98. package/lib/esm/components/tile/InfoTile.css.js +8 -18
  99. package/lib/esm/components/tile/InfoTile.css.js.map +1 -1
  100. package/lib/esm/components/tile/InfoTile.js +62 -67
  101. package/lib/esm/components/tile/InfoTile.js.map +1 -1
  102. package/lib/esm/i18n/useUiTranslation.js +8 -7
  103. package/lib/esm/i18n/useUiTranslation.js.map +1 -1
  104. package/lib/esm/icons/BanSvg.js +29 -44
  105. package/lib/esm/icons/BanSvg.js.map +1 -1
  106. package/lib/esm/icons/ButtonLoadingSpinnerSvg.js +26 -41
  107. package/lib/esm/icons/ButtonLoadingSpinnerSvg.js.map +1 -1
  108. package/lib/esm/icons/ChatCheckSvg.js +27 -42
  109. package/lib/esm/icons/ChatCheckSvg.js.map +1 -1
  110. package/lib/esm/icons/ChatSizeLargeSvg.js +49 -70
  111. package/lib/esm/icons/ChatSizeLargeSvg.js.map +1 -1
  112. package/lib/esm/icons/ChatSizeMediumSvg.js +43 -61
  113. package/lib/esm/icons/ChatSizeMediumSvg.js.map +1 -1
  114. package/lib/esm/icons/ChatSizeSmallSvg.js +37 -52
  115. package/lib/esm/icons/ChatSizeSmallSvg.js.map +1 -1
  116. package/lib/esm/icons/ChatXSvg.js +27 -42
  117. package/lib/esm/icons/ChatXSvg.js.map +1 -1
  118. package/lib/esm/icons/CheckSvg.js +21 -30
  119. package/lib/esm/icons/CheckSvg.js.map +1 -1
  120. package/lib/esm/icons/ChevronDownSvg.js +21 -30
  121. package/lib/esm/icons/ChevronDownSvg.js.map +1 -1
  122. package/lib/esm/icons/ChevronLeftSvg.js +21 -30
  123. package/lib/esm/icons/ChevronLeftSvg.js.map +1 -1
  124. package/lib/esm/icons/ChevronRightSvg.js +21 -30
  125. package/lib/esm/icons/ChevronRightSvg.js.map +1 -1
  126. package/lib/esm/icons/ClockSvg.js +29 -44
  127. package/lib/esm/icons/ClockSvg.js.map +1 -1
  128. package/lib/esm/icons/CoinOffSvg.js +47 -65
  129. package/lib/esm/icons/CoinOffSvg.js.map +1 -1
  130. package/lib/esm/icons/CoinSvg.js +40 -55
  131. package/lib/esm/icons/CoinSvg.js.map +1 -1
  132. package/lib/esm/icons/DatabaseCheckSvg.js +47 -65
  133. package/lib/esm/icons/DatabaseCheckSvg.js.map +1 -1
  134. package/lib/esm/icons/DatabaseXSvg.js +47 -65
  135. package/lib/esm/icons/DatabaseXSvg.js.map +1 -1
  136. package/lib/esm/icons/DevModeSvg.js +21 -30
  137. package/lib/esm/icons/DevModeSvg.js.map +1 -1
  138. package/lib/esm/icons/EyeSvg.js +27 -33
  139. package/lib/esm/icons/EyeSvg.js.map +1 -1
  140. package/lib/esm/icons/FormErrorAlertSvg.js +37 -29
  141. package/lib/esm/icons/FormErrorAlertSvg.js.map +1 -1
  142. package/lib/esm/icons/GlobeSvg.js +18 -27
  143. package/lib/esm/icons/GlobeSvg.js.map +1 -1
  144. package/lib/esm/icons/GripDotsSvg.js +52 -29
  145. package/lib/esm/icons/GripDotsSvg.js.map +1 -1
  146. package/lib/esm/icons/HomeActivityAssignUserSvg.js +44 -62
  147. package/lib/esm/icons/HomeActivityAssignUserSvg.js.map +1 -1
  148. package/lib/esm/icons/HomeStatsCheckBadgeSvg.js +27 -42
  149. package/lib/esm/icons/HomeStatsCheckBadgeSvg.js.map +1 -1
  150. package/lib/esm/icons/HomeStatsClipboardSvg.js +27 -42
  151. package/lib/esm/icons/HomeStatsClipboardSvg.js.map +1 -1
  152. package/lib/esm/icons/HomeStatsClockSvg.js +27 -42
  153. package/lib/esm/icons/HomeStatsClockSvg.js.map +1 -1
  154. package/lib/esm/icons/KeyOffSvg.js +39 -54
  155. package/lib/esm/icons/KeyOffSvg.js.map +1 -1
  156. package/lib/esm/icons/KeySvg.js +39 -54
  157. package/lib/esm/icons/KeySvg.js.map +1 -1
  158. package/lib/esm/icons/KronexSvg.js +28 -43
  159. package/lib/esm/icons/KronexSvg.js.map +1 -1
  160. package/lib/esm/icons/LinkCheckSvg.js +37 -52
  161. package/lib/esm/icons/LinkCheckSvg.js.map +1 -1
  162. package/lib/esm/icons/LinkSvg.js +27 -42
  163. package/lib/esm/icons/LinkSvg.js.map +1 -1
  164. package/lib/esm/icons/LinkXSvg.js +37 -52
  165. package/lib/esm/icons/LinkXSvg.js.map +1 -1
  166. package/lib/esm/icons/LockOpenSvg.js +31 -46
  167. package/lib/esm/icons/LockOpenSvg.js.map +1 -1
  168. package/lib/esm/icons/LockSvg.js +31 -46
  169. package/lib/esm/icons/LockSvg.js.map +1 -1
  170. package/lib/esm/icons/MailCheckSvg.js +41 -56
  171. package/lib/esm/icons/MailCheckSvg.js.map +1 -1
  172. package/lib/esm/icons/MailSvg.js +31 -46
  173. package/lib/esm/icons/MailSvg.js.map +1 -1
  174. package/lib/esm/icons/MailXSvg.js +41 -56
  175. package/lib/esm/icons/MailXSvg.js.map +1 -1
  176. package/lib/esm/icons/ModalCloseSvg.js +27 -42
  177. package/lib/esm/icons/ModalCloseSvg.js.map +1 -1
  178. package/lib/esm/icons/PencilSvg.js +14 -20
  179. package/lib/esm/icons/PencilSvg.js.map +1 -1
  180. package/lib/esm/icons/PinFilledSvg.js +24 -40
  181. package/lib/esm/icons/PinFilledSvg.js.map +1 -1
  182. package/lib/esm/icons/PinSvg.js +27 -43
  183. package/lib/esm/icons/PinSvg.js.map +1 -1
  184. package/lib/esm/icons/ProfileDropdownLogoutSvg.js +37 -52
  185. package/lib/esm/icons/ProfileDropdownLogoutSvg.js.map +1 -1
  186. package/lib/esm/icons/ProfileDropdownOrganizationSvg.js +27 -42
  187. package/lib/esm/icons/ProfileDropdownOrganizationSvg.js.map +1 -1
  188. package/lib/esm/icons/ProjectsFolderSvg.js +21 -30
  189. package/lib/esm/icons/ProjectsFolderSvg.js.map +1 -1
  190. package/lib/esm/icons/RobotCheckSvg.js +60 -68
  191. package/lib/esm/icons/RobotCheckSvg.js.map +1 -1
  192. package/lib/esm/icons/RobotSvg.js +53 -58
  193. package/lib/esm/icons/RobotSvg.js.map +1 -1
  194. package/lib/esm/icons/RobotXSvg.js +60 -68
  195. package/lib/esm/icons/RobotXSvg.js.map +1 -1
  196. package/lib/esm/icons/RocketOffSvg.js +58 -83
  197. package/lib/esm/icons/RocketOffSvg.js.map +1 -1
  198. package/lib/esm/icons/RocketSvg.js +51 -73
  199. package/lib/esm/icons/RocketSvg.js.map +1 -1
  200. package/lib/esm/icons/SendCheckSvg.js +40 -55
  201. package/lib/esm/icons/SendCheckSvg.js.map +1 -1
  202. package/lib/esm/icons/SendMessageSvg.js +30 -45
  203. package/lib/esm/icons/SendMessageSvg.js.map +1 -1
  204. package/lib/esm/icons/SendXSvg.js +40 -55
  205. package/lib/esm/icons/SendXSvg.js.map +1 -1
  206. package/lib/esm/icons/SettingsCheckSvg.js +37 -52
  207. package/lib/esm/icons/SettingsCheckSvg.js.map +1 -1
  208. package/lib/esm/icons/SettingsXSvg.js +37 -52
  209. package/lib/esm/icons/SettingsXSvg.js.map +1 -1
  210. package/lib/esm/icons/ShieldLockSvg.js +41 -56
  211. package/lib/esm/icons/ShieldLockSvg.js.map +1 -1
  212. package/lib/esm/icons/ShieldOffSvg.js +27 -42
  213. package/lib/esm/icons/ShieldOffSvg.js.map +1 -1
  214. package/lib/esm/icons/SidebarHomeSvg.js +27 -42
  215. package/lib/esm/icons/SidebarHomeSvg.js.map +1 -1
  216. package/lib/esm/icons/SidebarInitiativesSvg.js +37 -52
  217. package/lib/esm/icons/SidebarInitiativesSvg.js.map +1 -1
  218. package/lib/esm/icons/SidebarPlusSvg.js +27 -42
  219. package/lib/esm/icons/SidebarPlusSvg.js.map +1 -1
  220. package/lib/esm/icons/SidebarSearchSvg.js +27 -42
  221. package/lib/esm/icons/SidebarSearchSvg.js.map +1 -1
  222. package/lib/esm/icons/SidebarSettingsSvg.js +27 -42
  223. package/lib/esm/icons/SidebarSettingsSvg.js.map +1 -1
  224. package/lib/esm/icons/SidebarTasksSvg.js +27 -42
  225. package/lib/esm/icons/SidebarTasksSvg.js.map +1 -1
  226. package/lib/esm/icons/SidebarTeamSvg.js +44 -62
  227. package/lib/esm/icons/SidebarTeamSvg.js.map +1 -1
  228. package/lib/esm/icons/TaskAttachmentSvg.js +21 -30
  229. package/lib/esm/icons/TaskAttachmentSvg.js.map +1 -1
  230. package/lib/esm/icons/TaskCalendarSvg.js +44 -62
  231. package/lib/esm/icons/TaskCalendarSvg.js.map +1 -1
  232. package/lib/esm/icons/TaskCommentBubbleSvg.js +21 -30
  233. package/lib/esm/icons/TaskCommentBubbleSvg.js.map +1 -1
  234. package/lib/esm/icons/TaskDeleteSvg.js +27 -42
  235. package/lib/esm/icons/TaskDeleteSvg.js.map +1 -1
  236. package/lib/esm/icons/TaskDependencyBlockedSvg.js +27 -43
  237. package/lib/esm/icons/TaskDependencyBlockedSvg.js.map +1 -1
  238. package/lib/esm/icons/TaskDependencyReadySvg.js +27 -43
  239. package/lib/esm/icons/TaskDependencyReadySvg.js.map +1 -1
  240. package/lib/esm/icons/TaskMenuDotsSvg.js +37 -52
  241. package/lib/esm/icons/TaskMenuDotsSvg.js.map +1 -1
  242. package/lib/esm/icons/TaskTagSvg.js +27 -42
  243. package/lib/esm/icons/TaskTagSvg.js.map +1 -1
  244. package/lib/esm/icons/TeamMemberEmailSvg.js +27 -42
  245. package/lib/esm/icons/TeamMemberEmailSvg.js.map +1 -1
  246. package/lib/esm/icons/TeamMemberLocationSvg.js +27 -42
  247. package/lib/esm/icons/TeamMemberLocationSvg.js.map +1 -1
  248. package/lib/esm/icons/WrenchSvg.js +21 -30
  249. package/lib/esm/icons/WrenchSvg.js.map +1 -1
  250. package/lib/esm/icons/XBadgeSvg.js +27 -42
  251. package/lib/esm/icons/XBadgeSvg.js.map +1 -1
  252. package/lib/esm/icons/markdown/MarkdownCheckboxCheckedSvg.js +30 -42
  253. package/lib/esm/icons/markdown/MarkdownCheckboxCheckedSvg.js.map +1 -1
  254. package/lib/esm/icons/markdown/MarkdownCheckboxUncheckedSvg.js +22 -28
  255. package/lib/esm/icons/markdown/MarkdownCheckboxUncheckedSvg.js.map +1 -1
  256. package/lib/esm/icons/markdown/MarkdownCopySuccessSvg.js +41 -53
  257. package/lib/esm/icons/markdown/MarkdownCopySuccessSvg.js.map +1 -1
  258. package/lib/esm/icons/markdown/MarkdownCopySvg.js +30 -42
  259. package/lib/esm/icons/markdown/MarkdownCopySvg.js.map +1 -1
  260. package/lib/esm/icons/markdown/MarkdownExternalLinkSvg.js +39 -51
  261. package/lib/esm/icons/markdown/MarkdownExternalLinkSvg.js.map +1 -1
  262. package/lib/esm/index.js +34 -77
  263. package/lib/esm/style.css +2 -0
  264. package/lib/esm/style.js +4 -0
  265. package/lib/esm/styles/slots.js +0 -2
  266. package/lib/esm/svg/ChevronDownIcon.js +11 -10
  267. package/lib/esm/svg/ChevronDownIcon.js.map +1 -1
  268. package/lib/esm/svg/ChevronRightIcon.js +11 -9
  269. package/lib/esm/svg/ChevronRightIcon.js.map +1 -1
  270. package/lib/esm/svg/GlobeIcon.js +11 -6
  271. package/lib/esm/svg/GlobeIcon.js.map +1 -1
  272. package/lib/esm/theme/ThemeProvider.js +33 -37
  273. package/lib/esm/theme/ThemeProvider.js.map +1 -1
  274. package/lib/esm/theme/VisuallyHidden.js +12 -8
  275. package/lib/esm/theme/VisuallyHidden.js.map +1 -1
  276. package/lib/esm/theme/accessibility.css.js +7 -8
  277. package/lib/esm/theme/accessibility.css.js.map +1 -1
  278. package/lib/esm/theme/colors.js +101 -100
  279. package/lib/esm/theme/colors.js.map +1 -1
  280. package/lib/esm/theme/common.js +122 -123
  281. package/lib/esm/theme/common.js.map +1 -1
  282. package/lib/esm/theme/containerQueries.js +14 -13
  283. package/lib/esm/theme/containerQueries.js.map +1 -1
  284. package/lib/esm/theme/global.css.js +1 -2
  285. package/lib/esm/theme/index.js +9 -28
  286. package/lib/esm/theme/sprinkles.css.js +68484 -9
  287. package/lib/esm/theme/sprinkles.css.js.map +1 -1
  288. package/lib/esm/theme/theme.css.js +1 -2
  289. package/lib/esm/theme/themeContract.js +1025 -1035
  290. package/lib/esm/theme/themeContract.js.map +1 -1
  291. package/lib/esm/theme/tools.js +16 -19
  292. package/lib/esm/theme/tools.js.map +1 -1
  293. package/lib/style.d.ts +5 -0
  294. package/lib/style.d.ts.map +1 -0
  295. package/lib/style.js +5 -0
  296. package/lib/types/style.d.ts +5 -0
  297. package/lib/types/style.d.ts.map +1 -0
  298. package/package.json +4 -3
  299. package/lib/esm/atomic/atoms/badge/badge.css.ts.vanilla-BxMgYgcH.css +0 -1
  300. package/lib/esm/atomic/atoms/button/button.css.ts.vanilla-BYFxDZro.css +0 -1
  301. package/lib/esm/atomic/atoms/checkbox/checkbox.css.ts.vanilla-D6TvWxlo.css +0 -1
  302. package/lib/esm/atomic/atoms/input/input.css.ts.vanilla-D_X5_tcn.css +0 -1
  303. package/lib/esm/atomic/atoms/textarea/textarea.css.ts.vanilla-IrvNTQEt.css +0 -1
  304. package/lib/esm/atomic/molecules/breadcrumb_navigation/breadcrumbNavigation.css.ts.vanilla-Bhz61Foa.css +0 -1
  305. package/lib/esm/atomic/molecules/breadcrumb_navigation/types.js.map +0 -1
  306. package/lib/esm/atomic/molecules/tabs/tabs.css.ts.vanilla-DQm5wO0K.css +0 -1
  307. package/lib/esm/atomic/molecules/toast/toast.css.ts.vanilla-2GtcGJsi.css +0 -1
  308. package/lib/esm/components/charts/billingUsageLineChart.css.ts.vanilla-7e3dy1Dj.css +0 -1
  309. package/lib/esm/components/data-table/DataTable.css.ts.vanilla-BLE98fwj.css +0 -1
  310. package/lib/esm/components/data-table/TableCell.css.ts.vanilla-i5QJvdbl.css +0 -1
  311. package/lib/esm/components/layout/ContentLayout.css.ts.vanilla-tn0RQdqM.css +0 -0
  312. package/lib/esm/components/select/SimpleSelect.css.ts.vanilla-Bil1v8q6.css +0 -1
  313. package/lib/esm/components/tile/InfoTile.css.ts.vanilla-ByCg4UKz.css +0 -1
  314. package/lib/esm/index.js.map +0 -1
  315. package/lib/esm/styles/slots.js.map +0 -1
  316. package/lib/esm/theme/accessibility.css.ts.vanilla-D6gfeWvf.css +0 -1
  317. package/lib/esm/theme/global.css.js.map +0 -1
  318. package/lib/esm/theme/global.css.ts.vanilla-ClXnHnoy.css +0 -1
  319. package/lib/esm/theme/index.js.map +0 -1
  320. package/lib/esm/theme/sprinkles.css.ts.vanilla-DOI5FNoi.css +0 -1
  321. package/lib/esm/theme/theme.css.js.map +0 -1
  322. package/lib/esm/theme/theme.css.ts.vanilla-a3SsXff5.css +0 -1
@@ -1,178 +1,149 @@
1
- import { jsx as N, jsxs as st } from "react/jsx-runtime";
2
- import { createContext as ct, useContext as it, useState as V, useRef as v, useCallback as w, useLayoutEffect as lt, useEffect as h, isValidElement as ut, cloneElement as ft } from "react";
3
- import { createPortal as at } from "react-dom";
4
- import { contentPositioned as dt, content as pt, container as mt } from "./dropdown.css.js";
5
- import { cx as $ } from "../../../theme/tools.js";
6
- const q = ct(null), xt = () => {
7
- const c = it(q);
8
- if (c == null)
9
- throw new Error("useDropdown must be used within a <Dropdown />");
10
- return c;
11
- }, wt = (c) => c == null || typeof c != "object" ? !1 : c.$$typeof === Symbol.for("react.forward_ref"), kt = ({
12
- trigger: c,
13
- children: H,
14
- className: I,
15
- contentClassName: U,
16
- placement: x = "bottom-start",
17
- offset: l = 4,
18
- matchTriggerWidth: M = !0,
19
- open: T,
20
- defaultOpen: _ = !1,
21
- onOpenChange: W,
22
- closeOnItemClick: F = !1,
23
- portalContainer: G,
24
- ariaLabel: k
25
- }) => {
26
- const D = T != null, [J, Q] = V(_);
27
- let e = J;
28
- D && (e = !!T);
29
- const R = v(null), C = v(null), f = v(null), [g, X] = V(null), p = v([]), a = w(
30
- (t) => {
31
- D || Q(t), W?.(t);
32
- },
33
- [D, W]
34
- ), K = w(() => {
35
- a(!e);
36
- }, [e, a]), d = w(() => {
37
- a(!1);
38
- }, [a]), Y = w(() => {
39
- a(!0);
40
- }, [a]), b = w(() => {
41
- const t = C.current, r = f.current;
42
- if (t == null || r == null)
43
- return;
44
- const n = t.getBoundingClientRect();
45
- let o = 0, s = 0;
46
- switch (x) {
47
- case "bottom-start":
48
- o = n.bottom + l, s = n.left;
49
- break;
50
- case "bottom-end":
51
- o = n.bottom + l, s = n.right - r.offsetWidth;
52
- break;
53
- case "top-start":
54
- o = n.top - r.offsetHeight - l, s = n.left;
55
- break;
56
- case "top-end":
57
- o = n.top - r.offsetHeight - l, s = n.right - r.offsetWidth;
58
- break;
59
- default:
60
- o = n.bottom + l, s = n.left;
61
- }
62
- const O = window.innerWidth, L = window.innerHeight;
63
- let P;
64
- M && (P = n.width);
65
- const z = P ?? r.offsetWidth;
66
- s + z > O - 4 && (s = Math.max(4, O - z - 4)), s < 4 && (s = 4);
67
- const y = r.offsetHeight;
68
- if (o + y > L - 4)
69
- if (x.startsWith("bottom")) {
70
- const A = n.top - y - l;
71
- A >= 4 ? o = A : o = Math.max(4, L - y - 4);
72
- } else
73
- o = Math.max(4, L - y - 4);
74
- o < 4 && (o = 4), X({ top: o, left: s, width: P });
75
- }, [x, l, M]);
76
- lt(() => {
77
- e && b();
78
- }, [e, b, H]), h(() => {
79
- if (!e) return;
80
- const t = () => {
81
- b();
82
- };
83
- window.addEventListener("resize", t), window.addEventListener("scroll", t, !0);
84
- const r = () => {
85
- window.removeEventListener("resize", t), window.removeEventListener("scroll", t, !0);
86
- };
87
- p.current.push(r);
88
- }, [e, b]), h(() => {
89
- if (!e) return;
90
- const t = (o) => {
91
- const s = o.target;
92
- R.current != null && f.current != null && !R.current.contains(s) && !f.current.contains(s) && d();
93
- }, r = (o) => {
94
- o.key === "Escape" && (d(), C.current?.focus());
95
- };
96
- document.addEventListener("mousedown", t), document.addEventListener("keydown", r);
97
- const n = () => {
98
- document.removeEventListener("mousedown", t), document.removeEventListener("keydown", r);
99
- };
100
- p.current.push(n);
101
- }, [e, d]), h(() => {
102
- if (!e) return;
103
- f.current?.querySelector(
104
- 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
105
- )?.focus();
106
- }, [e]), h(() => {
107
- if (!e || !F) return;
108
- const t = (n) => {
109
- f.current?.contains(n.target) && d();
110
- };
111
- document.addEventListener("click", t, { capture: !0 });
112
- const r = () => {
113
- document.removeEventListener("click", t, { capture: !0 });
114
- };
115
- p.current.push(r);
116
- }, [e, F, d]), h(() => () => {
117
- p.current.forEach((t) => {
118
- t();
119
- }), p.current = [];
120
- }, []);
121
- let i = c;
122
- if (typeof c == "function" && (i = c(e)), !ut(i))
123
- throw new Error("Dropdown trigger must be a React element.");
124
- const S = typeof i.type == "string", Z = S && i.type === "button";
125
- if (!(S || typeof i.type == "function" || wt(i.type)))
126
- throw new Error(
127
- "Dropdown trigger must be a DOM element or component that accepts a ref."
128
- );
129
- const E = i.props.ref ?? i.ref, tt = (t) => {
130
- C.current = t, typeof E == "function" ? E(t) : E != null && (E.current = t);
131
- }, m = i.props, et = (t) => {
132
- m.onClick?.(t), !t.defaultPrevented && K();
133
- }, nt = (t) => {
134
- m.onKeyDown?.(t), !t.defaultPrevented && (t.key === "Enter" || t.key === " ") && (t.preventDefault(), K());
135
- }, u = {
136
- onClick: et,
137
- "aria-haspopup": "menu",
138
- "aria-expanded": e
139
- };
140
- k != null && k !== "" && (u["aria-label"] = k), Z ? m.type == null && (u.type = "button") : (u.onKeyDown = nt, m.role == null && (u.role = "button"), m.tabIndex == null && (u.tabIndex = 0)), u.ref = tt;
141
- let j = {};
142
- g != null && (j = {
143
- top: g.top,
144
- left: g.left,
145
- width: g.width
146
- });
147
- const ot = G ?? document.body, rt = {
148
- close: d,
149
- open: Y,
150
- isOpen: e
151
- };
152
- let B = null;
153
- return e && (B = at(
154
- /* @__PURE__ */ N(
155
- "div",
156
- {
157
- ref: f,
158
- role: "menu",
159
- className: $(
160
- pt,
161
- dt,
162
- U
163
- ),
164
- style: j,
165
- children: H
166
- }
167
- ),
168
- ot
169
- )), /* @__PURE__ */ st(q.Provider, { value: rt, children: [
170
- /* @__PURE__ */ N("div", { className: $(mt, I), ref: R, children: ft(i, u) }),
171
- B
172
- ] });
1
+ import { cx as e } from "../../../theme/tools.js";
2
+ import { container as t, content as n, contentPositioned as r } from "./dropdown.css.js";
3
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
4
+ import { cloneElement as o, createContext as s, isValidElement as c, useCallback as l, useContext as u, useEffect as d, useLayoutEffect as f, useRef as p, useState as m } from "react";
5
+ import { createPortal as h } from "react-dom";
6
+ //#region src/atomic/molecules/dropdown/Dropdown.tsx
7
+ var g = s(null), _ = () => {
8
+ let e = u(g);
9
+ if (e == null) throw Error("useDropdown must be used within a <Dropdown />");
10
+ return e;
11
+ }, v = (e) => typeof e != "object" || !e ? !1 : e.$$typeof === Symbol.for("react.forward_ref"), y = ({ trigger: s, children: u, className: _, contentClassName: y, placement: b = "bottom-start", offset: x = 4, matchTriggerWidth: S = !0, open: C, defaultOpen: w = !1, onOpenChange: T, closeOnItemClick: E = !1, portalContainer: D, ariaLabel: O }) => {
12
+ let k = C != null, [A, j] = m(w), M = A;
13
+ k && (M = !!C);
14
+ let N = p(null), P = p(null), F = p(null), [I, L] = m(null), R = p([]), z = l((e) => {
15
+ k || j(e), T?.(e);
16
+ }, [k, T]), B = l(() => {
17
+ z(!M);
18
+ }, [M, z]), V = l(() => {
19
+ z(!1);
20
+ }, [z]), ee = l(() => {
21
+ z(!0);
22
+ }, [z]), H = l(() => {
23
+ let e = P.current, t = F.current;
24
+ if (e == null || t == null) return;
25
+ let n = e.getBoundingClientRect(), r = 0, i = 0;
26
+ switch (b) {
27
+ case "bottom-start":
28
+ r = n.bottom + x, i = n.left;
29
+ break;
30
+ case "bottom-end":
31
+ r = n.bottom + x, i = n.right - t.offsetWidth;
32
+ break;
33
+ case "top-start":
34
+ r = n.top - t.offsetHeight - x, i = n.left;
35
+ break;
36
+ case "top-end":
37
+ r = n.top - t.offsetHeight - x, i = n.right - t.offsetWidth;
38
+ break;
39
+ default: r = n.bottom + x, i = n.left;
40
+ }
41
+ let a = window.innerWidth, o = window.innerHeight, s;
42
+ S && (s = n.width);
43
+ let c = s ?? t.offsetWidth;
44
+ i + c > a - 4 && (i = Math.max(4, a - c - 4)), i < 4 && (i = 4);
45
+ let l = t.offsetHeight;
46
+ if (r + l > o - 4) if (b.startsWith("bottom")) {
47
+ let e = n.top - l - x;
48
+ r = e >= 4 ? e : Math.max(4, o - l - 4);
49
+ } else r = Math.max(4, o - l - 4);
50
+ r < 4 && (r = 4), L({
51
+ top: r,
52
+ left: i,
53
+ width: s
54
+ });
55
+ }, [
56
+ b,
57
+ x,
58
+ S
59
+ ]);
60
+ f(() => {
61
+ M && H();
62
+ }, [
63
+ M,
64
+ H,
65
+ u
66
+ ]), d(() => {
67
+ if (!M) return;
68
+ let e = () => {
69
+ H();
70
+ };
71
+ window.addEventListener("resize", e), window.addEventListener("scroll", e, !0), R.current.push(() => {
72
+ window.removeEventListener("resize", e), window.removeEventListener("scroll", e, !0);
73
+ });
74
+ }, [M, H]), d(() => {
75
+ if (!M) return;
76
+ let e = (e) => {
77
+ let t = e.target;
78
+ N.current != null && F.current != null && !N.current.contains(t) && !F.current.contains(t) && V();
79
+ }, t = (e) => {
80
+ e.key === "Escape" && (V(), P.current?.focus());
81
+ };
82
+ document.addEventListener("mousedown", e), document.addEventListener("keydown", t), R.current.push(() => {
83
+ document.removeEventListener("mousedown", e), document.removeEventListener("keydown", t);
84
+ });
85
+ }, [M, V]), d(() => {
86
+ M && (F.current?.querySelector("button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])"))?.focus();
87
+ }, [M]), d(() => {
88
+ if (!M || !E) return;
89
+ let e = (e) => {
90
+ F.current?.contains(e.target) && V();
91
+ };
92
+ document.addEventListener("click", e, { capture: !0 }), R.current.push(() => {
93
+ document.removeEventListener("click", e, { capture: !0 });
94
+ });
95
+ }, [
96
+ M,
97
+ E,
98
+ V
99
+ ]), d(() => () => {
100
+ R.current.forEach((e) => {
101
+ e();
102
+ }), R.current = [];
103
+ }, []);
104
+ let U = s;
105
+ if (typeof s == "function" && (U = s(M)), !c(U)) throw Error("Dropdown trigger must be a React element.");
106
+ let W = typeof U.type == "string", G = W && U.type === "button";
107
+ if (!(W || typeof U.type == "function" || v(U.type))) throw Error("Dropdown trigger must be a DOM element or component that accepts a ref.");
108
+ let K = U.props.ref ?? U.ref, q = (e) => {
109
+ P.current = e, typeof K == "function" ? K(e) : K != null && (K.current = e);
110
+ }, J = U.props, Y = (e) => {
111
+ J.onClick?.(e), !e.defaultPrevented && B();
112
+ }, X = (e) => {
113
+ J.onKeyDown?.(e), !e.defaultPrevented && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), B());
114
+ }, Z = {
115
+ onClick: Y,
116
+ "aria-haspopup": "menu",
117
+ "aria-expanded": M
118
+ };
119
+ O != null && O !== "" && (Z["aria-label"] = O), G ? J.type ?? (Z.type = "button") : (Z.onKeyDown = X, J.role ?? (Z.role = "button"), J.tabIndex ?? (Z.tabIndex = 0)), Z.ref = q;
120
+ let Q = {};
121
+ I != null && (Q = {
122
+ top: I.top,
123
+ left: I.left,
124
+ width: I.width
125
+ });
126
+ let te = D ?? document.body, ne = {
127
+ close: V,
128
+ open: ee,
129
+ isOpen: M
130
+ }, $ = null;
131
+ return M && ($ = h(/* @__PURE__ */ i("div", {
132
+ ref: F,
133
+ role: "menu",
134
+ className: e(n, r, y),
135
+ style: Q,
136
+ children: u
137
+ }), te)), /* @__PURE__ */ a(g.Provider, {
138
+ value: ne,
139
+ children: [/* @__PURE__ */ i("div", {
140
+ className: e(t, _),
141
+ ref: N,
142
+ children: o(U, Z)
143
+ }), $]
144
+ });
173
145
  };
174
- export {
175
- kt as Dropdown,
176
- xt as useDropdown
177
- };
178
- //# sourceMappingURL=Dropdown.js.map
146
+ //#endregion
147
+ export { y as Dropdown, _ as useDropdown };
148
+
149
+ //# sourceMappingURL=Dropdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.js","sources":["../../../../../src/atomic/molecules/dropdown/Dropdown.tsx"],"sourcesContent":["import {\n useState,\n useRef,\n useEffect,\n useLayoutEffect,\n useCallback,\n type ReactNode,\n type ReactElement,\n type JSX,\n type Ref,\n type MutableRefObject,\n type HTMLAttributes,\n type MouseEvent as ReactMouseEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n createContext,\n useContext,\n isValidElement,\n cloneElement,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport * as classes from './dropdown.css.js';\nimport { cx } from '../../../theme/tools.js';\n\n// Types\nexport type DropdownPlacement =\n | 'bottom-start'\n | 'bottom-end'\n | 'top-start'\n | 'top-end';\n\ninterface DropdownContextValue {\n close: () => void;\n open: () => void;\n isOpen: boolean;\n}\n\nconst DropdownContext = createContext<DropdownContextValue | null>(null);\n/**\n * Access the nearest Dropdown context. Throws if used outside a <Dropdown />.\n */\nexport const useDropdown = (): DropdownContextValue => {\n const ctx = useContext(DropdownContext);\n if (ctx == null) {\n throw new Error('useDropdown must be used within a <Dropdown />');\n }\n return ctx;\n};\n\nexport interface DropdownProps {\n trigger: ReactElement | ((isOpen: boolean) => ReactElement);\n children: ReactNode;\n className?: string;\n contentClassName?: string;\n placement?: DropdownPlacement;\n offset?: number;\n matchTriggerWidth?: boolean;\n open?: boolean; // controlled\n defaultOpen?: boolean; // uncontrolled\n onOpenChange?: (open: boolean) => void;\n closeOnItemClick?: boolean;\n portalContainer?: HTMLElement | null;\n // Accessible label if trigger is an icon only\n ariaLabel?: string;\n}\n\ninterface PositionState {\n top: number;\n left: number;\n width?: number;\n}\n\nconst isForwardRefComponent = (type: unknown): boolean => {\n if (type == null || typeof type !== 'object') {\n return false;\n }\n return (\n (type as { $$typeof?: symbol }).$$typeof === Symbol.for('react.forward_ref')\n );\n};\n\n/**\n * A scalable, portal-based dropdown component with basic collision handling,\n * controlled/uncontrolled modes, accessibility attributes, and optional\n * trigger width matching. Content is rendered in a React portal (default: document.body).\n */\nexport const Dropdown = ({\n trigger,\n children,\n className,\n contentClassName,\n placement = 'bottom-start',\n offset = 4,\n matchTriggerWidth = true,\n open,\n defaultOpen = false,\n onOpenChange,\n closeOnItemClick = false,\n portalContainer,\n ariaLabel,\n}: DropdownProps): JSX.Element => {\n const isControlled = open != null;\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n let isOpen = uncontrolledOpen;\n if (isControlled) {\n isOpen = Boolean(open);\n }\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<PositionState | null>(null);\n // Accumulate manual cleanups for effects where returning a function violates lint rules.\n const cleanupRef = useRef<(() => void)[]>([]);\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const toggle = useCallback(() => {\n setOpen(!isOpen);\n }, [isOpen, setOpen]);\n const close = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n const openFn = useCallback(() => {\n setOpen(true);\n }, [setOpen]);\n\n // Positioning logic\n const computePosition = useCallback(() => {\n const triggerEl = triggerRef.current;\n const contentEl = contentRef.current;\n if (triggerEl == null) {\n return;\n }\n if (contentEl == null) {\n return;\n }\n\n const rect = triggerEl.getBoundingClientRect();\n let top = 0;\n let left = 0;\n\n switch (placement) {\n case 'bottom-start':\n top = rect.bottom + offset;\n left = rect.left;\n break;\n case 'bottom-end':\n top = rect.bottom + offset;\n left = rect.right - contentEl.offsetWidth;\n break;\n case 'top-start':\n top = rect.top - contentEl.offsetHeight - offset;\n left = rect.left;\n break;\n case 'top-end':\n top = rect.top - contentEl.offsetHeight - offset;\n left = rect.right - contentEl.offsetWidth;\n break;\n default:\n top = rect.bottom + offset;\n left = rect.left;\n }\n\n // Keep within viewport (basic collision handling)\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n let width: number | undefined;\n if (matchTriggerWidth) {\n width = rect.width;\n }\n const contentWidth = width ?? contentEl.offsetWidth;\n\n if (left + contentWidth > vw - 4) {\n left = Math.max(4, vw - contentWidth - 4);\n }\n if (left < 4) left = 4;\n const contentHeight = contentEl.offsetHeight;\n if (top + contentHeight > vh - 4) {\n // Try flip to top if bottom overflows and initial was bottom\n if (placement.startsWith('bottom')) {\n const flippedTop = rect.top - contentHeight - offset;\n if (flippedTop >= 4) {\n top = flippedTop;\n } else {\n top = Math.max(4, vh - contentHeight - 4);\n }\n } else {\n top = Math.max(4, vh - contentHeight - 4);\n }\n }\n if (top < 4) top = 4;\n\n setPosition({ top, left, width });\n }, [placement, offset, matchTriggerWidth]);\n\n useLayoutEffect(() => {\n if (isOpen) computePosition();\n }, [isOpen, computePosition, children]);\n\n useEffect(() => {\n if (!isOpen) return;\n const handle = () => {\n computePosition();\n };\n window.addEventListener('resize', handle);\n window.addEventListener('scroll', handle, true);\n const cleanup = () => {\n window.removeEventListener('resize', handle);\n window.removeEventListener('scroll', handle, true);\n };\n cleanupRef.current.push(cleanup);\n }, [isOpen, computePosition]);\n\n // Outside click & Escape\n useEffect(() => {\n if (!isOpen) return;\n const onDocMouseDown = (e: globalThis.MouseEvent) => {\n const target = e.target as Node;\n if (\n containerRef.current != null &&\n contentRef.current != null &&\n !containerRef.current.contains(target) &&\n !contentRef.current.contains(target)\n ) {\n close();\n }\n };\n const onKey = (e: globalThis.KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n triggerRef.current?.focus();\n }\n };\n document.addEventListener('mousedown', onDocMouseDown);\n document.addEventListener('keydown', onKey);\n const cleanup = () => {\n document.removeEventListener('mousedown', onDocMouseDown);\n document.removeEventListener('keydown', onKey);\n };\n cleanupRef.current.push(cleanup);\n }, [isOpen, close]);\n\n // Keyboard navigation basic (ArrowDown focuses first focusable)\n useEffect(() => {\n if (!isOpen) return;\n const firstFocusable = contentRef.current?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n firstFocusable?.focus();\n }, [isOpen]);\n\n // Close on item click if enabled\n useEffect(() => {\n if (!isOpen || !closeOnItemClick) return;\n const handler = (e: globalThis.MouseEvent) => {\n if (contentRef.current?.contains(e.target as Node)) {\n close();\n }\n };\n document.addEventListener('click', handler, { capture: true });\n // Explicit cleanup without returning (lint rule forbids returning arrow fn)\n const cleanup = () => {\n document.removeEventListener('click', handler, { capture: true });\n };\n // Store in ref to run on unmount / dependency change\n cleanupRef.current.push(cleanup);\n }, [isOpen, closeOnItemClick, close]);\n // Run accumulated cleanups on unmount\n useEffect(() => {\n return () => {\n cleanupRef.current.forEach((fn) => {\n fn();\n });\n cleanupRef.current = [];\n };\n }, []);\n\n let triggerElement = trigger;\n if (typeof trigger === 'function') {\n triggerElement = trigger(isOpen);\n }\n\n if (!isValidElement(triggerElement)) {\n throw new Error('Dropdown trigger must be a React element.');\n }\n\n const isHostElement = typeof triggerElement.type === 'string';\n const isButtonElement = isHostElement && triggerElement.type === 'button';\n const canAttachRef =\n isHostElement ||\n typeof triggerElement.type === 'function' ||\n isForwardRefComponent(triggerElement.type);\n\n if (!canAttachRef) {\n throw new Error(\n 'Dropdown trigger must be a DOM element or component that accepts a ref.',\n );\n }\n\n const triggerElementRef =\n (triggerElement.props as { ref?: Ref<HTMLElement> }).ref ??\n (triggerElement as ReactElement & { ref?: Ref<HTMLElement> }).ref;\n const setTriggerRef = (node: HTMLElement | null) => {\n triggerRef.current = node;\n if (typeof triggerElementRef === 'function') {\n triggerElementRef(node);\n } else if (triggerElementRef != null) {\n (triggerElementRef as MutableRefObject<HTMLElement | null>).current =\n node;\n }\n };\n\n const triggerProps = triggerElement.props as HTMLAttributes<HTMLElement> & {\n type?: string;\n };\n\n const handleTriggerClick = (event: ReactMouseEvent<HTMLElement>) => {\n triggerProps.onClick?.(event);\n if (event.defaultPrevented) {\n return;\n }\n toggle();\n };\n\n const handleTriggerKeyDown = (event: ReactKeyboardEvent<HTMLElement>) => {\n triggerProps.onKeyDown?.(event);\n if (event.defaultPrevented) {\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n toggle();\n }\n };\n\n const mergedTriggerProps: Record<string, unknown> = {\n onClick: handleTriggerClick,\n 'aria-haspopup': 'menu',\n 'aria-expanded': isOpen,\n };\n\n if (ariaLabel != null && ariaLabel !== '') {\n mergedTriggerProps['aria-label'] = ariaLabel;\n }\n\n if (isButtonElement) {\n if (triggerProps.type == null) {\n mergedTriggerProps.type = 'button';\n }\n } else {\n mergedTriggerProps.onKeyDown = handleTriggerKeyDown;\n if (triggerProps.role == null) {\n mergedTriggerProps.role = 'button';\n }\n if (triggerProps.tabIndex == null) {\n mergedTriggerProps.tabIndex = 0;\n }\n }\n\n mergedTriggerProps.ref = setTriggerRef;\n\n let contentStyles: React.CSSProperties = {};\n if (position != null) {\n contentStyles = {\n top: position.top,\n left: position.left,\n width: position.width,\n };\n }\n\n const portalTarget = portalContainer ?? document.body;\n\n const contextValue: DropdownContextValue = {\n close,\n open: openFn,\n isOpen,\n };\n\n let dropdownContent: JSX.Element | null = null;\n if (isOpen) {\n dropdownContent = createPortal(\n <div\n ref={contentRef}\n role=\"menu\"\n className={cx(\n classes.content,\n classes.contentPositioned,\n contentClassName,\n )}\n style={contentStyles}\n >\n {children}\n </div>,\n portalTarget,\n );\n }\n\n return (\n <DropdownContext.Provider value={contextValue}>\n <div className={cx(classes.container, className)} ref={containerRef}>\n {cloneElement(triggerElement, mergedTriggerProps)}\n </div>\n {dropdownContent}\n </DropdownContext.Provider>\n );\n};\n"],"names":["DropdownContext","createContext","useDropdown","ctx","useContext","isForwardRefComponent","type","Dropdown","trigger","children","className","contentClassName","placement","offset","matchTriggerWidth","open","defaultOpen","onOpenChange","closeOnItemClick","portalContainer","ariaLabel","isControlled","uncontrolledOpen","setUncontrolledOpen","useState","isOpen","containerRef","useRef","triggerRef","contentRef","position","setPosition","cleanupRef","setOpen","useCallback","next","toggle","close","openFn","computePosition","triggerEl","contentEl","rect","top","left","vw","vh","width","contentWidth","contentHeight","flippedTop","useLayoutEffect","useEffect","handle","cleanup","onDocMouseDown","e","target","onKey","handler","fn","triggerElement","isValidElement","isHostElement","isButtonElement","triggerElementRef","setTriggerRef","node","triggerProps","handleTriggerClick","event","handleTriggerKeyDown","mergedTriggerProps","contentStyles","portalTarget","contextValue","dropdownContent","createPortal","jsx","cx","classes.content","classes.contentPositioned","jsxs","classes.container","cloneElement"],"mappings":"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"}
1
+ {"version":3,"file":"Dropdown.js","names":[],"sources":["../../../../../src/atomic/molecules/dropdown/Dropdown.tsx"],"sourcesContent":["import {\n useState,\n useRef,\n useEffect,\n useLayoutEffect,\n useCallback,\n type ReactNode,\n type ReactElement,\n type JSX,\n type Ref,\n type MutableRefObject,\n type HTMLAttributes,\n type MouseEvent as ReactMouseEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n createContext,\n useContext,\n isValidElement,\n cloneElement,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport * as classes from './dropdown.css.js';\nimport { cx } from '../../../theme/tools.js';\n\n// Types\nexport type DropdownPlacement =\n | 'bottom-start'\n | 'bottom-end'\n | 'top-start'\n | 'top-end';\n\ninterface DropdownContextValue {\n close: () => void;\n open: () => void;\n isOpen: boolean;\n}\n\nconst DropdownContext = createContext<DropdownContextValue | null>(null);\n/**\n * Access the nearest Dropdown context. Throws if used outside a <Dropdown />.\n */\nexport const useDropdown = (): DropdownContextValue => {\n const ctx = useContext(DropdownContext);\n if (ctx == null) {\n throw new Error('useDropdown must be used within a <Dropdown />');\n }\n return ctx;\n};\n\nexport interface DropdownProps {\n trigger: ReactElement | ((isOpen: boolean) => ReactElement);\n children: ReactNode;\n className?: string;\n contentClassName?: string;\n placement?: DropdownPlacement;\n offset?: number;\n matchTriggerWidth?: boolean;\n open?: boolean; // controlled\n defaultOpen?: boolean; // uncontrolled\n onOpenChange?: (open: boolean) => void;\n closeOnItemClick?: boolean;\n portalContainer?: HTMLElement | null;\n // Accessible label if trigger is an icon only\n ariaLabel?: string;\n}\n\ninterface PositionState {\n top: number;\n left: number;\n width?: number;\n}\n\nconst isForwardRefComponent = (type: unknown): boolean => {\n if (type == null || typeof type !== 'object') {\n return false;\n }\n return (\n (type as { $$typeof?: symbol }).$$typeof === Symbol.for('react.forward_ref')\n );\n};\n\n/**\n * A scalable, portal-based dropdown component with basic collision handling,\n * controlled/uncontrolled modes, accessibility attributes, and optional\n * trigger width matching. Content is rendered in a React portal (default: document.body).\n */\nexport const Dropdown = ({\n trigger,\n children,\n className,\n contentClassName,\n placement = 'bottom-start',\n offset = 4,\n matchTriggerWidth = true,\n open,\n defaultOpen = false,\n onOpenChange,\n closeOnItemClick = false,\n portalContainer,\n ariaLabel,\n}: DropdownProps): JSX.Element => {\n const isControlled = open != null;\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n let isOpen = uncontrolledOpen;\n if (isControlled) {\n isOpen = Boolean(open);\n }\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<PositionState | null>(null);\n // Accumulate manual cleanups for effects where returning a function violates lint rules.\n const cleanupRef = useRef<(() => void)[]>([]);\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const toggle = useCallback(() => {\n setOpen(!isOpen);\n }, [isOpen, setOpen]);\n const close = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n const openFn = useCallback(() => {\n setOpen(true);\n }, [setOpen]);\n\n // Positioning logic\n const computePosition = useCallback(() => {\n const triggerEl = triggerRef.current;\n const contentEl = contentRef.current;\n if (triggerEl == null) {\n return;\n }\n if (contentEl == null) {\n return;\n }\n\n const rect = triggerEl.getBoundingClientRect();\n let top = 0;\n let left = 0;\n\n switch (placement) {\n case 'bottom-start':\n top = rect.bottom + offset;\n left = rect.left;\n break;\n case 'bottom-end':\n top = rect.bottom + offset;\n left = rect.right - contentEl.offsetWidth;\n break;\n case 'top-start':\n top = rect.top - contentEl.offsetHeight - offset;\n left = rect.left;\n break;\n case 'top-end':\n top = rect.top - contentEl.offsetHeight - offset;\n left = rect.right - contentEl.offsetWidth;\n break;\n default:\n top = rect.bottom + offset;\n left = rect.left;\n }\n\n // Keep within viewport (basic collision handling)\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n let width: number | undefined;\n if (matchTriggerWidth) {\n width = rect.width;\n }\n const contentWidth = width ?? contentEl.offsetWidth;\n\n if (left + contentWidth > vw - 4) {\n left = Math.max(4, vw - contentWidth - 4);\n }\n if (left < 4) left = 4;\n const contentHeight = contentEl.offsetHeight;\n if (top + contentHeight > vh - 4) {\n // Try flip to top if bottom overflows and initial was bottom\n if (placement.startsWith('bottom')) {\n const flippedTop = rect.top - contentHeight - offset;\n if (flippedTop >= 4) {\n top = flippedTop;\n } else {\n top = Math.max(4, vh - contentHeight - 4);\n }\n } else {\n top = Math.max(4, vh - contentHeight - 4);\n }\n }\n if (top < 4) top = 4;\n\n setPosition({ top, left, width });\n }, [placement, offset, matchTriggerWidth]);\n\n useLayoutEffect(() => {\n if (isOpen) computePosition();\n }, [isOpen, computePosition, children]);\n\n useEffect(() => {\n if (!isOpen) return;\n const handle = () => {\n computePosition();\n };\n window.addEventListener('resize', handle);\n window.addEventListener('scroll', handle, true);\n const cleanup = () => {\n window.removeEventListener('resize', handle);\n window.removeEventListener('scroll', handle, true);\n };\n cleanupRef.current.push(cleanup);\n }, [isOpen, computePosition]);\n\n // Outside click & Escape\n useEffect(() => {\n if (!isOpen) return;\n const onDocMouseDown = (e: globalThis.MouseEvent) => {\n const target = e.target as Node;\n if (\n containerRef.current != null &&\n contentRef.current != null &&\n !containerRef.current.contains(target) &&\n !contentRef.current.contains(target)\n ) {\n close();\n }\n };\n const onKey = (e: globalThis.KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n triggerRef.current?.focus();\n }\n };\n document.addEventListener('mousedown', onDocMouseDown);\n document.addEventListener('keydown', onKey);\n const cleanup = () => {\n document.removeEventListener('mousedown', onDocMouseDown);\n document.removeEventListener('keydown', onKey);\n };\n cleanupRef.current.push(cleanup);\n }, [isOpen, close]);\n\n // Keyboard navigation basic (ArrowDown focuses first focusable)\n useEffect(() => {\n if (!isOpen) return;\n const firstFocusable = contentRef.current?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n firstFocusable?.focus();\n }, [isOpen]);\n\n // Close on item click if enabled\n useEffect(() => {\n if (!isOpen || !closeOnItemClick) return;\n const handler = (e: globalThis.MouseEvent) => {\n if (contentRef.current?.contains(e.target as Node)) {\n close();\n }\n };\n document.addEventListener('click', handler, { capture: true });\n // Explicit cleanup without returning (lint rule forbids returning arrow fn)\n const cleanup = () => {\n document.removeEventListener('click', handler, { capture: true });\n };\n // Store in ref to run on unmount / dependency change\n cleanupRef.current.push(cleanup);\n }, [isOpen, closeOnItemClick, close]);\n // Run accumulated cleanups on unmount\n useEffect(() => {\n return () => {\n cleanupRef.current.forEach((fn) => {\n fn();\n });\n cleanupRef.current = [];\n };\n }, []);\n\n let triggerElement = trigger;\n if (typeof trigger === 'function') {\n triggerElement = trigger(isOpen);\n }\n\n if (!isValidElement(triggerElement)) {\n throw new Error('Dropdown trigger must be a React element.');\n }\n\n const isHostElement = typeof triggerElement.type === 'string';\n const isButtonElement = isHostElement && triggerElement.type === 'button';\n const canAttachRef =\n isHostElement ||\n typeof triggerElement.type === 'function' ||\n isForwardRefComponent(triggerElement.type);\n\n if (!canAttachRef) {\n throw new Error(\n 'Dropdown trigger must be a DOM element or component that accepts a ref.',\n );\n }\n\n const triggerElementRef =\n (triggerElement.props as { ref?: Ref<HTMLElement> }).ref ??\n (triggerElement as ReactElement & { ref?: Ref<HTMLElement> }).ref;\n const setTriggerRef = (node: HTMLElement | null) => {\n triggerRef.current = node;\n if (typeof triggerElementRef === 'function') {\n triggerElementRef(node);\n } else if (triggerElementRef != null) {\n (triggerElementRef as MutableRefObject<HTMLElement | null>).current =\n node;\n }\n };\n\n const triggerProps = triggerElement.props as HTMLAttributes<HTMLElement> & {\n type?: string;\n };\n\n const handleTriggerClick = (event: ReactMouseEvent<HTMLElement>) => {\n triggerProps.onClick?.(event);\n if (event.defaultPrevented) {\n return;\n }\n toggle();\n };\n\n const handleTriggerKeyDown = (event: ReactKeyboardEvent<HTMLElement>) => {\n triggerProps.onKeyDown?.(event);\n if (event.defaultPrevented) {\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n toggle();\n }\n };\n\n const mergedTriggerProps: Record<string, unknown> = {\n onClick: handleTriggerClick,\n 'aria-haspopup': 'menu',\n 'aria-expanded': isOpen,\n };\n\n if (ariaLabel != null && ariaLabel !== '') {\n mergedTriggerProps['aria-label'] = ariaLabel;\n }\n\n if (isButtonElement) {\n if (triggerProps.type == null) {\n mergedTriggerProps.type = 'button';\n }\n } else {\n mergedTriggerProps.onKeyDown = handleTriggerKeyDown;\n if (triggerProps.role == null) {\n mergedTriggerProps.role = 'button';\n }\n if (triggerProps.tabIndex == null) {\n mergedTriggerProps.tabIndex = 0;\n }\n }\n\n mergedTriggerProps.ref = setTriggerRef;\n\n let contentStyles: React.CSSProperties = {};\n if (position != null) {\n contentStyles = {\n top: position.top,\n left: position.left,\n width: position.width,\n };\n }\n\n const portalTarget = portalContainer ?? document.body;\n\n const contextValue: DropdownContextValue = {\n close,\n open: openFn,\n isOpen,\n };\n\n let dropdownContent: JSX.Element | null = null;\n if (isOpen) {\n dropdownContent = createPortal(\n <div\n ref={contentRef}\n role=\"menu\"\n className={cx(\n classes.content,\n classes.contentPositioned,\n contentClassName,\n )}\n style={contentStyles}\n >\n {children}\n </div>,\n portalTarget,\n );\n }\n\n return (\n <DropdownContext.Provider value={contextValue}>\n <div className={cx(classes.container, className)} ref={containerRef}>\n {cloneElement(triggerElement, mergedTriggerProps)}\n </div>\n {dropdownContent}\n </DropdownContext.Provider>\n );\n};\n"],"mappings":"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"}
@@ -1,13 +1,8 @@
1
- /* empty css */
2
- /* empty css */
3
- var r = "mr2gir0 txvbqbpsf", v = "mr2gir1 txvbqbuzn txvbqb1rx txvbqbuvx txvbqbl6f", x = "mr2gir2 txvbqbpso txvbqbt6x txvbqbdpf", i = "mr2gir3 txvbqb9hx", q = "mr2gir4 txvbqbl3f", e = "mr2gir5 txvbqbfax txvbqbfbo txvbqbl9f", m = "mr2gir6 txvbqbv";
4
- export {
5
- r as container,
6
- v as content,
7
- x as contentPositioned,
8
- q as focusOutlineReset,
9
- i as hidden,
10
- e as menu,
11
- m as menuItem
12
- };
13
- //# sourceMappingURL=dropdown.css.js.map
1
+ /* empty css */
2
+ /* empty css */
3
+ //#region src/atomic/molecules/dropdown/dropdown.css.ts
4
+ var e = "mr2gir0 txvbqbpsf", t = "mr2gir1 txvbqbuzn txvbqb1rx txvbqbuvx txvbqbl6f", n = "mr2gir2 txvbqbpso txvbqbt6x txvbqbdpf", r = "mr2gir3 txvbqb9hx", i = "mr2gir4 txvbqbl3f", a = "mr2gir5 txvbqbfax txvbqbfbo txvbqbl9f", o = "mr2gir6 txvbqbv";
5
+ //#endregion
6
+ export { e as container, t as content, n as contentPositioned, i as focusOutlineReset, r as hidden, a as menu, o as menuItem };
7
+
8
+ //# sourceMappingURL=dropdown.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
1
+ {"version":3,"file":"dropdown.css.js","names":[],"sources":["../../../../../src/atomic/molecules/dropdown/dropdown.css.ts"],"sourcesContent":["import { sprinkles } from '../../../theme/sprinkles.css.js';\n\n// Container only wraps the trigger now; menu content is portaled to body.\nexport const container = sprinkles({\n position: 'relative',\n});\n\n// Base visual styling for the dropdown content. Position (top/left) is applied inline.\nexport const content = sprinkles({\n backgroundColor: 'white',\n borderRadius: 'xl',\n zIndex: 'modal',\n overflow: 'hidden',\n});\n\nexport const contentPositioned = sprinkles({\n position: 'fixed',\n top: 0,\n left: 0,\n});\n\nexport const hidden = sprinkles({\n display: 'none',\n});\n\nexport const focusOutlineReset = sprinkles({\n outline: 'none',\n});\n\nexport const menu = sprinkles({\n listStyleType: 'none',\n margin: 0,\n padding: 0,\n});\n\nexport const menuItem = sprinkles({\n cursor: 'pointer',\n});\n"],"mappings":""}
@@ -1,57 +1,32 @@
1
- import { jsxs as k, jsx as t } from "react/jsx-runtime";
2
- import { Button as l } from "../../atoms/button/Button.js";
3
- import { useUiTranslation as A } from "../../../i18n/useUiTranslation.js";
4
- const T = ({
5
- onCancel: n,
6
- cancelLabel: c,
7
- submitLabel: i,
8
- submitLoadingLabel: r,
9
- isSubmitting: e = !1,
10
- submitDisabled: m = !1,
11
- className: d,
12
- renderSubmitContent: o,
13
- submitButtonProps: b,
14
- cancelButtonProps: u
15
- }) => {
16
- const { t: a } = A(), p = c ?? a("common.actions.cancel"), v = i ?? a("common.actions.save"), f = r ?? a("common.actions.saving"), C = u ?? {}, {
17
- className: N,
18
- disabled: B,
19
- ...x
20
- } = C, D = b ?? {}, {
21
- className: L,
22
- disabled: P,
23
- ...h
24
- } = D;
25
- let s;
26
- o != null ? s = o(e) : e ? s = f : s = v;
27
- const y = !!B, j = !!m || e || P === !0;
28
- return /* @__PURE__ */ k("div", { className: d, children: [
29
- /* @__PURE__ */ t(
30
- l,
31
- {
32
- type: "button",
33
- variant: "text",
34
- onClick: n,
35
- disabled: y,
36
- className: N,
37
- ...x,
38
- children: p
39
- }
40
- ),
41
- /* @__PURE__ */ t(
42
- l,
43
- {
44
- type: "submit",
45
- variant: "primary",
46
- disabled: j,
47
- className: L,
48
- ...h,
49
- children: s
50
- }
51
- )
52
- ] });
1
+ import { useUiTranslation as e } from "../../../i18n/useUiTranslation.js";
2
+ import { Button as t } from "../../atoms/button/Button.js";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ //#region src/atomic/molecules/form-actions/FormActions.tsx
5
+ var i = ({ onCancel: i, cancelLabel: a, submitLabel: o, submitLoadingLabel: s, isSubmitting: c = !1, submitDisabled: l = !1, className: u, renderSubmitContent: d, submitButtonProps: f, cancelButtonProps: p }) => {
6
+ let { t: m } = e(), h = a ?? m("common.actions.cancel"), g = o ?? m("common.actions.save"), _ = s ?? m("common.actions.saving"), { className: v, disabled: y, ...b } = p ?? {}, { className: x, disabled: S, ...C } = f ?? {}, w;
7
+ w = d == null ? c ? _ : g : d(c);
8
+ let T = !!y, E = !!l || c || S === !0;
9
+ return /* @__PURE__ */ r("div", {
10
+ className: u,
11
+ children: [/* @__PURE__ */ n(t, {
12
+ type: "button",
13
+ variant: "text",
14
+ onClick: i,
15
+ disabled: T,
16
+ className: v,
17
+ ...b,
18
+ children: h
19
+ }), /* @__PURE__ */ n(t, {
20
+ type: "submit",
21
+ variant: "primary",
22
+ disabled: E,
23
+ className: x,
24
+ ...C,
25
+ children: w
26
+ })]
27
+ });
53
28
  };
54
- export {
55
- T as FormActions
56
- };
57
- //# sourceMappingURL=FormActions.js.map
29
+ //#endregion
30
+ export { i as FormActions };
31
+
32
+ //# sourceMappingURL=FormActions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormActions.js","sources":["../../../../../src/atomic/molecules/form-actions/FormActions.tsx"],"sourcesContent":["import { type ComponentProps, type JSX, type ReactNode } from 'react';\n\nimport { Button } from '../../atoms/button/Button.js';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\nexport type FormActionsProps = {\n onCancel: () => void;\n cancelLabel?: string;\n submitLabel?: string;\n submitLoadingLabel?: string;\n isSubmitting?: boolean;\n submitDisabled?: boolean;\n className?: string;\n renderSubmitContent?: (isSubmitting: boolean) => ReactNode;\n submitButtonProps?: Omit<ComponentProps<typeof Button>, 'children' | 'type'>;\n cancelButtonProps?: Omit<\n ComponentProps<typeof Button>,\n 'children' | 'type' | 'variant'\n >;\n};\n\nexport const FormActions = ({\n onCancel,\n cancelLabel,\n submitLabel,\n submitLoadingLabel,\n isSubmitting = false,\n submitDisabled = false,\n className,\n renderSubmitContent,\n submitButtonProps,\n cancelButtonProps,\n}: FormActionsProps): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedCancelLabel = cancelLabel ?? t('common.actions.cancel');\n const resolvedSubmitLabel = submitLabel ?? t('common.actions.save');\n const resolvedSubmitLoadingLabel =\n submitLoadingLabel ?? t('common.actions.saving');\n const cancelProps = cancelButtonProps ?? {};\n const {\n className: cancelClassName,\n disabled: cancelDisabled,\n ...restCancelButtonProps\n } = cancelProps;\n\n const submitProps = submitButtonProps ?? {};\n const {\n className: submitClassName,\n disabled: submitDisabledOverride,\n ...restSubmitButtonProps\n } = submitProps;\n\n let submitContent: ReactNode;\n\n if (renderSubmitContent != null) {\n submitContent = renderSubmitContent(isSubmitting);\n } else if (isSubmitting) {\n submitContent = resolvedSubmitLoadingLabel;\n } else {\n submitContent = resolvedSubmitLabel;\n }\n\n const isCancelDisabled = Boolean(cancelDisabled);\n const isSubmitDisabled =\n Boolean(submitDisabled) || isSubmitting || submitDisabledOverride === true;\n\n return (\n <div className={className}>\n <Button\n type=\"button\"\n variant=\"text\"\n onClick={onCancel}\n disabled={isCancelDisabled}\n className={cancelClassName}\n {...restCancelButtonProps}\n >\n {resolvedCancelLabel}\n </Button>\n <Button\n type=\"submit\"\n variant=\"primary\"\n disabled={isSubmitDisabled}\n className={submitClassName}\n {...restSubmitButtonProps}\n >\n {submitContent}\n </Button>\n </div>\n );\n};\n"],"names":["FormActions","onCancel","cancelLabel","submitLabel","submitLoadingLabel","isSubmitting","submitDisabled","className","renderSubmitContent","submitButtonProps","cancelButtonProps","t","useUiTranslation","resolvedCancelLabel","resolvedSubmitLabel","resolvedSubmitLoadingLabel","cancelProps","cancelClassName","cancelDisabled","restCancelButtonProps","submitProps","submitClassName","submitDisabledOverride","restSubmitButtonProps","submitContent","isCancelDisabled","isSubmitDisabled","jsxs","jsx","Button"],"mappings":";;;AAqBO,MAAMA,IAAc,CAAC;AAAA,EAC1B,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,gBAAAC,IAAiB;AAAA,EACjB,WAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,mBAAAC;AACF,MAAqC;AACnC,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAsBX,KAAeS,EAAE,uBAAuB,GAC9DG,IAAsBX,KAAeQ,EAAE,qBAAqB,GAC5DI,IACJX,KAAsBO,EAAE,uBAAuB,GAC3CK,IAAcN,KAAqB,CAAA,GACnC;AAAA,IACJ,WAAWO;AAAA,IACX,UAAUC;AAAA,IACV,GAAGC;AAAA,EAAA,IACDH,GAEEI,IAAcX,KAAqB,CAAA,GACnC;AAAA,IACJ,WAAWY;AAAA,IACX,UAAUC;AAAA,IACV,GAAGC;AAAA,EAAA,IACDH;AAEJ,MAAII;AAEJ,EAAIhB,KAAuB,OACzBgB,IAAgBhB,EAAoBH,CAAY,IACvCA,IACTmB,IAAgBT,IAEhBS,IAAgBV;AAGlB,QAAMW,IAAmB,EAAQP,GAC3BQ,IACJ,EAAQpB,KAAmBD,KAAgBiB,MAA2B;AAExE,SACE,gBAAAK,EAAC,SAAI,WAAApB,GACH,UAAA;AAAA,IAAA,gBAAAqB;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAAS5B;AAAA,QACT,UAAUwB;AAAA,QACV,WAAWR;AAAA,QACV,GAAGE;AAAA,QAEH,UAAAN;AAAA,MAAA;AAAA,IAAA;AAAA,IAEH,gBAAAe;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,UAAUH;AAAA,QACV,WAAWL;AAAA,QACV,GAAGE;AAAA,QAEH,UAAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;"}
1
+ {"version":3,"file":"FormActions.js","names":[],"sources":["../../../../../src/atomic/molecules/form-actions/FormActions.tsx"],"sourcesContent":["import { type ComponentProps, type JSX, type ReactNode } from 'react';\n\nimport { Button } from '../../atoms/button/Button.js';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\nexport type FormActionsProps = {\n onCancel: () => void;\n cancelLabel?: string;\n submitLabel?: string;\n submitLoadingLabel?: string;\n isSubmitting?: boolean;\n submitDisabled?: boolean;\n className?: string;\n renderSubmitContent?: (isSubmitting: boolean) => ReactNode;\n submitButtonProps?: Omit<ComponentProps<typeof Button>, 'children' | 'type'>;\n cancelButtonProps?: Omit<\n ComponentProps<typeof Button>,\n 'children' | 'type' | 'variant'\n >;\n};\n\nexport const FormActions = ({\n onCancel,\n cancelLabel,\n submitLabel,\n submitLoadingLabel,\n isSubmitting = false,\n submitDisabled = false,\n className,\n renderSubmitContent,\n submitButtonProps,\n cancelButtonProps,\n}: FormActionsProps): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedCancelLabel = cancelLabel ?? t('common.actions.cancel');\n const resolvedSubmitLabel = submitLabel ?? t('common.actions.save');\n const resolvedSubmitLoadingLabel =\n submitLoadingLabel ?? t('common.actions.saving');\n const cancelProps = cancelButtonProps ?? {};\n const {\n className: cancelClassName,\n disabled: cancelDisabled,\n ...restCancelButtonProps\n } = cancelProps;\n\n const submitProps = submitButtonProps ?? {};\n const {\n className: submitClassName,\n disabled: submitDisabledOverride,\n ...restSubmitButtonProps\n } = submitProps;\n\n let submitContent: ReactNode;\n\n if (renderSubmitContent != null) {\n submitContent = renderSubmitContent(isSubmitting);\n } else if (isSubmitting) {\n submitContent = resolvedSubmitLoadingLabel;\n } else {\n submitContent = resolvedSubmitLabel;\n }\n\n const isCancelDisabled = Boolean(cancelDisabled);\n const isSubmitDisabled =\n Boolean(submitDisabled) || isSubmitting || submitDisabledOverride === true;\n\n return (\n <div className={className}>\n <Button\n type=\"button\"\n variant=\"text\"\n onClick={onCancel}\n disabled={isCancelDisabled}\n className={cancelClassName}\n {...restCancelButtonProps}\n >\n {resolvedCancelLabel}\n </Button>\n <Button\n type=\"submit\"\n variant=\"primary\"\n disabled={isSubmitDisabled}\n className={submitClassName}\n {...restSubmitButtonProps}\n >\n {submitContent}\n </Button>\n </div>\n );\n};\n"],"mappings":";;;;AAqBA,IAAa,KAAe,EAC1B,aACA,gBACA,gBACA,uBACA,kBAAe,IACf,oBAAiB,IACjB,cACA,wBACA,sBACA,2BACmC;CACnC,IAAM,EAAE,SAAM,GAAkB,EAC1B,IAAsB,KAAe,EAAE,wBAAwB,EAC/D,IAAsB,KAAe,EAAE,sBAAsB,EAC7D,IACJ,KAAsB,EAAE,wBAAwB,EAE5C,EACJ,WAAW,GACX,UAAU,GACV,GAAG,MAJe,KAAqB,EAAE,EAQrC,EACJ,WAAW,GACX,UAAU,GACV,GAAG,MAJe,KAAqB,EAAE,EAOvC;AAEJ,CACE,IADE,KAAuB,OAEhB,IACO,IAEA,IAJA,EAAoB,EAAa;CAOnD,IAAM,IAAmB,EAAQ,GAC3B,IACJ,EAAQ,KAAmB,KAAgB,MAA2B;AAExE,QACE,kBAAC,OAAD;EAAgB;YAAhB,CACE,kBAAC,GAAD;GACE,MAAK;GACL,SAAQ;GACR,SAAS;GACT,UAAU;GACV,WAAW;GACX,GAAI;aAEH;GACM,CAAA,EACT,kBAAC,GAAD;GACE,MAAK;GACL,SAAQ;GACR,UAAU;GACV,WAAW;GACX,GAAI;aAEH;GACM,CAAA,CACL"}