@protonradio/proton-ui 0.11.15 → 0.11.16

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 (243) hide show
  1. package/README.md +148 -148
  2. package/dist/assets/svg/icons.svg.cjs.js.map +1 -1
  3. package/dist/assets/svg/icons.svg.es.js.map +1 -1
  4. package/dist/components/ActionMenu/ActionMenu.cjs.js.map +1 -1
  5. package/dist/components/ActionMenu/ActionMenu.es.js.map +1 -1
  6. package/dist/components/Badge/Badge.cjs.js.map +1 -1
  7. package/dist/components/Badge/Badge.es.js.map +1 -1
  8. package/dist/components/Banner/Banner.cjs.js.map +1 -1
  9. package/dist/components/Banner/Banner.es.js.map +1 -1
  10. package/dist/components/Button/Button.cjs.js.map +1 -1
  11. package/dist/components/Button/Button.es.js.map +1 -1
  12. package/dist/components/ButtonGroup/ButtonGroup.cjs.js.map +1 -1
  13. package/dist/components/ButtonGroup/ButtonGroup.es.js.map +1 -1
  14. package/dist/components/ButtonWithSelect/ButtonWithSelect.cjs.js +1 -1
  15. package/dist/components/ButtonWithSelect/ButtonWithSelect.cjs.js.map +1 -1
  16. package/dist/components/ButtonWithSelect/ButtonWithSelect.es.js +29 -27
  17. package/dist/components/ButtonWithSelect/ButtonWithSelect.es.js.map +1 -1
  18. package/dist/components/DataTable/DataTable.cjs.js.map +1 -1
  19. package/dist/components/DataTable/DataTable.es.js.map +1 -1
  20. package/dist/components/Dialog/Dialog.cjs.js.map +1 -1
  21. package/dist/components/Dialog/Dialog.es.js.map +1 -1
  22. package/dist/components/Elevation/Elevation.cjs.js.map +1 -1
  23. package/dist/components/Elevation/Elevation.es.js.map +1 -1
  24. package/dist/components/Icon/Icon.cjs.js.map +1 -1
  25. package/dist/components/Icon/Icon.es.js.map +1 -1
  26. package/dist/components/ImageBackground/ImageBackground.cjs.js.map +1 -1
  27. package/dist/components/ImageBackground/ImageBackground.es.js.map +1 -1
  28. package/dist/components/Input/BaseInput/Input.cjs.js.map +1 -1
  29. package/dist/components/Input/BaseInput/Input.es.js.map +1 -1
  30. package/dist/components/Input/CopyInput/CopyInput.cjs.js.map +1 -1
  31. package/dist/components/Input/CopyInput/CopyInput.es.js.map +1 -1
  32. package/dist/components/Input/SearchInput/SearchInput.cjs.js.map +1 -1
  33. package/dist/components/Input/SearchInput/SearchInput.es.js.map +1 -1
  34. package/dist/components/Menu/MenuTrigger.cjs.js.map +1 -1
  35. package/dist/components/Menu/MenuTrigger.es.js.map +1 -1
  36. package/dist/components/Menu/PopoverMenu.cjs.js +1 -1
  37. package/dist/components/Menu/PopoverMenu.cjs.js.map +1 -1
  38. package/dist/components/Menu/PopoverMenu.es.js +28 -32
  39. package/dist/components/Menu/PopoverMenu.es.js.map +1 -1
  40. package/dist/components/Modal/Modal.cjs.js.map +1 -1
  41. package/dist/components/Modal/Modal.es.js.map +1 -1
  42. package/dist/components/Popover/Popover.cjs.js.map +1 -1
  43. package/dist/components/Popover/Popover.es.js.map +1 -1
  44. package/dist/components/ScreenOverlay/ScreenOverlay.cjs.js.map +1 -1
  45. package/dist/components/ScreenOverlay/ScreenOverlay.es.js.map +1 -1
  46. package/dist/components/Select/Select.cjs.js.map +1 -1
  47. package/dist/components/Select/Select.es.js +3 -3
  48. package/dist/components/Select/Select.es.js.map +1 -1
  49. package/dist/components/Switch/Switch.cjs.js.map +1 -1
  50. package/dist/components/Switch/Switch.es.js.map +1 -1
  51. package/dist/components/Table/Collection/CompoundComponents.cjs.js.map +1 -1
  52. package/dist/components/Table/Collection/CompoundComponents.es.js.map +1 -1
  53. package/dist/components/Table/Collection/collectionParser.cjs.js.map +1 -1
  54. package/dist/components/Table/Collection/collectionParser.es.js.map +1 -1
  55. package/dist/components/Table/Collection/useTableCollection.cjs.js.map +1 -1
  56. package/dist/components/Table/Collection/useTableCollection.es.js.map +1 -1
  57. package/dist/components/Table/Table.cjs.js.map +1 -1
  58. package/dist/components/Table/Table.es.js +5 -5
  59. package/dist/components/Table/Table.es.js.map +1 -1
  60. package/dist/components/Text/TextEllipsis/TextEllipsis.cjs.js.map +1 -1
  61. package/dist/components/Text/TextEllipsis/TextEllipsis.es.js.map +1 -1
  62. package/dist/components/Text/TextEmphasis/TextEmphasis.cjs.js.map +1 -1
  63. package/dist/components/Text/TextEmphasis/TextEmphasis.es.js.map +1 -1
  64. package/dist/components/ThemeProvider.cjs.js.map +1 -1
  65. package/dist/components/ThemeProvider.es.js +4 -4
  66. package/dist/components/ThemeProvider.es.js.map +1 -1
  67. package/dist/components/Tombstone/Tombstone.cjs.js.map +1 -1
  68. package/dist/components/Tombstone/Tombstone.es.js.map +1 -1
  69. package/dist/components/Tooltip/Tooltip.cjs.js.map +1 -1
  70. package/dist/components/Tooltip/Tooltip.es.js.map +1 -1
  71. package/dist/components/Waveform/Waveform.cjs.js.map +1 -1
  72. package/dist/components/Waveform/Waveform.es.js.map +1 -1
  73. package/dist/components/Waveform/WaveformBar.cjs.js.map +1 -1
  74. package/dist/components/Waveform/WaveformBar.es.js.map +1 -1
  75. package/dist/constants/breakpoint.cjs.js.map +1 -1
  76. package/dist/constants/breakpoint.es.js.map +1 -1
  77. package/dist/constants/placement.cjs.js.map +1 -1
  78. package/dist/constants/placement.es.js.map +1 -1
  79. package/dist/design/colors.cjs.js.map +1 -1
  80. package/dist/design/colors.es.js.map +1 -1
  81. package/dist/design/darkTheme/colors.cjs.js.map +1 -1
  82. package/dist/design/darkTheme/colors.es.js +3 -3
  83. package/dist/design/darkTheme/colors.es.js.map +1 -1
  84. package/dist/design/darkTheme/stylesheet.cjs.js.map +1 -1
  85. package/dist/design/darkTheme/stylesheet.es.js +12 -12
  86. package/dist/design/darkTheme/stylesheet.es.js.map +1 -1
  87. package/dist/design/generateStylesheet.cjs.js.map +1 -1
  88. package/dist/design/generateStylesheet.es.js.map +1 -1
  89. package/dist/design/lightTheme/colors.cjs.js.map +1 -1
  90. package/dist/design/lightTheme/colors.es.js +3 -3
  91. package/dist/design/lightTheme/colors.es.js.map +1 -1
  92. package/dist/design/lightTheme/stylesheet.cjs.js.map +1 -1
  93. package/dist/design/lightTheme/stylesheet.es.js +12 -12
  94. package/dist/design/lightTheme/stylesheet.es.js.map +1 -1
  95. package/dist/design/theme.cjs.js.map +1 -1
  96. package/dist/design/theme.es.js.map +1 -1
  97. package/dist/hooks/useBreakpoint.cjs.js.map +1 -1
  98. package/dist/hooks/useBreakpoint.es.js.map +1 -1
  99. package/dist/hooks/useIsClosing.cjs.js.map +1 -1
  100. package/dist/hooks/useIsClosing.es.js.map +1 -1
  101. package/dist/hooks/useLockBodyScroll.cjs.js.map +1 -1
  102. package/dist/hooks/useLockBodyScroll.es.js.map +1 -1
  103. package/dist/hooks/usePalette.cjs.js.map +1 -1
  104. package/dist/hooks/usePalette.es.js.map +1 -1
  105. package/dist/icons.svg +10 -10
  106. package/dist/index.d.ts +38 -38
  107. package/dist/node_modules/@react-aria/button/dist/useButton.cjs.js +1 -1
  108. package/dist/node_modules/@react-aria/button/dist/useButton.cjs.js.map +1 -1
  109. package/dist/node_modules/@react-aria/button/dist/useButton.es.js +13 -12
  110. package/dist/node_modules/@react-aria/button/dist/useButton.es.js.map +1 -1
  111. package/dist/node_modules/@react-aria/dialog/dist/useDialog.cjs.js.map +1 -1
  112. package/dist/node_modules/@react-aria/dialog/dist/useDialog.es.js.map +1 -1
  113. package/dist/node_modules/@react-aria/focus/dist/FocusScope.cjs.js.map +1 -1
  114. package/dist/node_modules/@react-aria/focus/dist/FocusScope.es.js +3 -3
  115. package/dist/node_modules/@react-aria/focus/dist/FocusScope.es.js.map +1 -1
  116. package/dist/node_modules/@react-aria/form/dist/useFormValidation.cjs.js.map +1 -1
  117. package/dist/node_modules/@react-aria/form/dist/useFormValidation.es.js.map +1 -1
  118. package/dist/node_modules/@react-aria/i18n/dist/context.cjs.js.map +1 -1
  119. package/dist/node_modules/@react-aria/i18n/dist/context.es.js.map +1 -1
  120. package/dist/node_modules/@react-aria/i18n/dist/useDefaultLocale.cjs.js.map +1 -1
  121. package/dist/node_modules/@react-aria/i18n/dist/useDefaultLocale.es.js.map +1 -1
  122. package/dist/node_modules/@react-aria/i18n/dist/utils.cjs.js.map +1 -1
  123. package/dist/node_modules/@react-aria/i18n/dist/utils.es.js.map +1 -1
  124. package/dist/node_modules/@react-aria/interactions/dist/context.cjs.js.map +1 -1
  125. package/dist/node_modules/@react-aria/interactions/dist/context.es.js.map +1 -1
  126. package/dist/node_modules/@react-aria/interactions/dist/createEventHandler.cjs.js.map +1 -1
  127. package/dist/node_modules/@react-aria/interactions/dist/createEventHandler.es.js.map +1 -1
  128. package/dist/node_modules/@react-aria/interactions/dist/focusSafely.cjs.js.map +1 -1
  129. package/dist/node_modules/@react-aria/interactions/dist/focusSafely.es.js.map +1 -1
  130. package/dist/node_modules/@react-aria/interactions/dist/textSelection.cjs.js.map +1 -1
  131. package/dist/node_modules/@react-aria/interactions/dist/textSelection.es.js.map +1 -1
  132. package/dist/node_modules/@react-aria/interactions/dist/useFocus.cjs.js.map +1 -1
  133. package/dist/node_modules/@react-aria/interactions/dist/useFocus.es.js.map +1 -1
  134. package/dist/node_modules/@react-aria/interactions/dist/useFocusVisible.cjs.js.map +1 -1
  135. package/dist/node_modules/@react-aria/interactions/dist/useFocusVisible.es.js.map +1 -1
  136. package/dist/node_modules/@react-aria/interactions/dist/useFocusWithin.cjs.js.map +1 -1
  137. package/dist/node_modules/@react-aria/interactions/dist/useFocusWithin.es.js.map +1 -1
  138. package/dist/node_modules/@react-aria/interactions/dist/useFocusable.cjs.js.map +1 -1
  139. package/dist/node_modules/@react-aria/interactions/dist/useFocusable.es.js.map +1 -1
  140. package/dist/node_modules/@react-aria/interactions/dist/useInteractOutside.cjs.js.map +1 -1
  141. package/dist/node_modules/@react-aria/interactions/dist/useInteractOutside.es.js.map +1 -1
  142. package/dist/node_modules/@react-aria/interactions/dist/useKeyboard.cjs.js.map +1 -1
  143. package/dist/node_modules/@react-aria/interactions/dist/useKeyboard.es.js.map +1 -1
  144. package/dist/node_modules/@react-aria/interactions/dist/usePress.cjs.js +2 -2
  145. package/dist/node_modules/@react-aria/interactions/dist/usePress.cjs.js.map +1 -1
  146. package/dist/node_modules/@react-aria/interactions/dist/usePress.es.js +23 -23
  147. package/dist/node_modules/@react-aria/interactions/dist/usePress.es.js.map +1 -1
  148. package/dist/node_modules/@react-aria/interactions/dist/utils.cjs.js.map +1 -1
  149. package/dist/node_modules/@react-aria/interactions/dist/utils.es.js.map +1 -1
  150. package/dist/node_modules/@react-aria/label/dist/useField.cjs.js.map +1 -1
  151. package/dist/node_modules/@react-aria/label/dist/useField.es.js.map +1 -1
  152. package/dist/node_modules/@react-aria/label/dist/useLabel.cjs.js.map +1 -1
  153. package/dist/node_modules/@react-aria/label/dist/useLabel.es.js.map +1 -1
  154. package/dist/node_modules/@react-aria/overlays/dist/Overlay.cjs.js.map +1 -1
  155. package/dist/node_modules/@react-aria/overlays/dist/Overlay.es.js.map +1 -1
  156. package/dist/node_modules/@react-aria/overlays/dist/ariaHideOutside.cjs.js +1 -1
  157. package/dist/node_modules/@react-aria/overlays/dist/ariaHideOutside.cjs.js.map +1 -1
  158. package/dist/node_modules/@react-aria/overlays/dist/ariaHideOutside.es.js +18 -18
  159. package/dist/node_modules/@react-aria/overlays/dist/ariaHideOutside.es.js.map +1 -1
  160. package/dist/node_modules/@react-aria/overlays/dist/useModalOverlay.cjs.js.map +1 -1
  161. package/dist/node_modules/@react-aria/overlays/dist/useModalOverlay.es.js.map +1 -1
  162. package/dist/node_modules/@react-aria/overlays/dist/useOverlay.cjs.js.map +1 -1
  163. package/dist/node_modules/@react-aria/overlays/dist/useOverlay.es.js.map +1 -1
  164. package/dist/node_modules/@react-aria/overlays/dist/usePreventScroll.cjs.js.map +1 -1
  165. package/dist/node_modules/@react-aria/overlays/dist/usePreventScroll.es.js.map +1 -1
  166. package/dist/node_modules/@react-aria/radio/dist/useRadio.cjs.js.map +1 -1
  167. package/dist/node_modules/@react-aria/radio/dist/useRadio.es.js.map +1 -1
  168. package/dist/node_modules/@react-aria/radio/dist/useRadioGroup.cjs.js.map +1 -1
  169. package/dist/node_modules/@react-aria/radio/dist/useRadioGroup.es.js.map +1 -1
  170. package/dist/node_modules/@react-aria/ssr/dist/SSRProvider.cjs.js.map +1 -1
  171. package/dist/node_modules/@react-aria/ssr/dist/SSRProvider.es.js.map +1 -1
  172. package/dist/node_modules/@react-aria/switch/dist/useSwitch.cjs.js.map +1 -1
  173. package/dist/node_modules/@react-aria/switch/dist/useSwitch.es.js.map +1 -1
  174. package/dist/node_modules/@react-aria/toggle/dist/useToggle.cjs.js.map +1 -1
  175. package/dist/node_modules/@react-aria/toggle/dist/useToggle.es.js.map +1 -1
  176. package/dist/node_modules/@react-aria/visually-hidden/dist/VisuallyHidden.cjs.js.map +1 -1
  177. package/dist/node_modules/@react-aria/visually-hidden/dist/VisuallyHidden.es.js.map +1 -1
  178. package/dist/node_modules/@react-stately/form/dist/useFormValidationState.cjs.js.map +1 -1
  179. package/dist/node_modules/@react-stately/form/dist/useFormValidationState.es.js +3 -3
  180. package/dist/node_modules/@react-stately/form/dist/useFormValidationState.es.js.map +1 -1
  181. package/dist/node_modules/@react-stately/overlays/dist/useOverlayTriggerState.cjs.js.map +1 -1
  182. package/dist/node_modules/@react-stately/overlays/dist/useOverlayTriggerState.es.js.map +1 -1
  183. package/dist/node_modules/@react-stately/radio/dist/useRadioGroupState.cjs.js.map +1 -1
  184. package/dist/node_modules/@react-stately/radio/dist/useRadioGroupState.es.js.map +1 -1
  185. package/dist/node_modules/@react-stately/toggle/dist/useToggleState.cjs.js.map +1 -1
  186. package/dist/node_modules/@react-stately/toggle/dist/useToggleState.es.js.map +1 -1
  187. package/dist/node_modules/@react-stately/utils/dist/useControlledState.cjs.js.map +1 -1
  188. package/dist/node_modules/@react-stately/utils/dist/useControlledState.es.js.map +1 -1
  189. package/dist/node_modules/@swc/helpers/esm/_check_private_redeclaration.cjs.js +1 -1
  190. package/dist/node_modules/@swc/helpers/esm/_check_private_redeclaration.cjs.js.map +1 -1
  191. package/dist/node_modules/@swc/helpers/esm/_check_private_redeclaration.es.js +1 -2
  192. package/dist/node_modules/@swc/helpers/esm/_check_private_redeclaration.es.js.map +1 -1
  193. package/dist/node_modules/@swc/helpers/esm/_class_apply_descriptor_get.cjs.js +1 -1
  194. package/dist/node_modules/@swc/helpers/esm/_class_apply_descriptor_get.cjs.js.map +1 -1
  195. package/dist/node_modules/@swc/helpers/esm/_class_apply_descriptor_get.es.js +1 -2
  196. package/dist/node_modules/@swc/helpers/esm/_class_apply_descriptor_get.es.js.map +1 -1
  197. package/dist/node_modules/@swc/helpers/esm/_class_apply_descriptor_set.cjs.js +1 -1
  198. package/dist/node_modules/@swc/helpers/esm/_class_apply_descriptor_set.cjs.js.map +1 -1
  199. package/dist/node_modules/@swc/helpers/esm/_class_apply_descriptor_set.es.js +1 -2
  200. package/dist/node_modules/@swc/helpers/esm/_class_apply_descriptor_set.es.js.map +1 -1
  201. package/dist/node_modules/@swc/helpers/esm/_class_extract_field_descriptor.cjs.js +1 -1
  202. package/dist/node_modules/@swc/helpers/esm/_class_extract_field_descriptor.cjs.js.map +1 -1
  203. package/dist/node_modules/@swc/helpers/esm/_class_extract_field_descriptor.es.js +1 -2
  204. package/dist/node_modules/@swc/helpers/esm/_class_extract_field_descriptor.es.js.map +1 -1
  205. package/dist/node_modules/@swc/helpers/esm/_class_private_field_get.cjs.js +1 -1
  206. package/dist/node_modules/@swc/helpers/esm/_class_private_field_get.cjs.js.map +1 -1
  207. package/dist/node_modules/@swc/helpers/esm/_class_private_field_get.es.js +6 -7
  208. package/dist/node_modules/@swc/helpers/esm/_class_private_field_get.es.js.map +1 -1
  209. package/dist/node_modules/@swc/helpers/esm/_class_private_field_init.cjs.js +1 -1
  210. package/dist/node_modules/@swc/helpers/esm/_class_private_field_init.cjs.js.map +1 -1
  211. package/dist/node_modules/@swc/helpers/esm/_class_private_field_init.es.js +3 -4
  212. package/dist/node_modules/@swc/helpers/esm/_class_private_field_init.es.js.map +1 -1
  213. package/dist/node_modules/@swc/helpers/esm/_class_private_field_set.cjs.js +1 -1
  214. package/dist/node_modules/@swc/helpers/esm/_class_private_field_set.cjs.js.map +1 -1
  215. package/dist/node_modules/@swc/helpers/esm/_class_private_field_set.es.js +6 -7
  216. package/dist/node_modules/@swc/helpers/esm/_class_private_field_set.es.js.map +1 -1
  217. package/dist/node_modules/color2k/dist/index.exports.import.es.cjs.js.map +1 -1
  218. package/dist/node_modules/color2k/dist/index.exports.import.es.es.js.map +1 -1
  219. package/dist/node_modules/react/cjs/react-jsx-runtime.development.cjs.js +7 -7
  220. package/dist/node_modules/react/cjs/react-jsx-runtime.development.cjs.js.map +1 -1
  221. package/dist/node_modules/react/cjs/react-jsx-runtime.development.es.js +167 -174
  222. package/dist/node_modules/react/cjs/react-jsx-runtime.development.es.js.map +1 -1
  223. package/dist/node_modules/react/cjs/react-jsx-runtime.production.min.cjs.js +1 -1
  224. package/dist/node_modules/react/cjs/react-jsx-runtime.production.min.cjs.js.map +1 -1
  225. package/dist/node_modules/react/cjs/react-jsx-runtime.production.min.es.js +3 -3
  226. package/dist/node_modules/react/cjs/react-jsx-runtime.production.min.es.js.map +1 -1
  227. package/dist/node_modules/react/jsx-runtime.cjs.js.map +1 -1
  228. package/dist/node_modules/react/jsx-runtime.es.js.map +1 -1
  229. package/dist/style.css +1 -1
  230. package/dist/utils/color2k.cjs.js.map +1 -1
  231. package/dist/utils/color2k.es.js.map +1 -1
  232. package/dist/utils/copy.cjs.js.map +1 -1
  233. package/dist/utils/copy.es.js.map +1 -1
  234. package/dist/utils/image.cjs.js.map +1 -1
  235. package/dist/utils/image.es.js.map +1 -1
  236. package/dist/utils/navigation.cjs.js.map +1 -1
  237. package/dist/utils/navigation.es.js.map +1 -1
  238. package/dist/utils/palette.cjs.js.map +1 -1
  239. package/dist/utils/palette.es.js +1 -1
  240. package/dist/utils/palette.es.js.map +1 -1
  241. package/dist/utils/string.cjs.js.map +1 -1
  242. package/dist/utils/string.es.js.map +1 -1
  243. package/package.json +140 -140
@@ -1 +1 @@
1
- {"version":3,"file":"MenuTrigger.cjs.js","sources":["../../../src/components/Menu/MenuTrigger.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { ReactNode, useMemo, useRef, useState } from \"react\";\r\n\r\nimport { BREAKPOINTS } from \"../../constants\";\r\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\r\nimport { ActionMenu, ActionMenuAction } from \"../ActionMenu/ActionMenu\";\r\nimport { PopoverMenu } from \"./PopoverMenu\";\r\n\r\nimport \"./MenuTrigger.css\";\r\nimport \"./Menu.css\";\r\n\r\nexport interface MenuTriggerProps {\r\n disabled?: boolean;\r\n isOpen?: boolean;\r\n setIsOpen: (isOpen: boolean) => void;\r\n}\r\n\r\nexport interface MenuProps {\r\n /** Custom trigger component. If not provided, defaults to ellipsis icon.\r\n * - @prop triggerProps {@link TriggerProps}\r\n */\r\n renderTrigger?: (triggerProps: MenuTriggerProps) => ReactNode;\r\n\r\n /** Size of the trigger icon\r\n * @default 24\r\n */\r\n size?: number;\r\n\r\n /** Title of the parent menu */\r\n title?: string;\r\n\r\n /** Array of menu actions/items to display\r\n * - type {@link ActionMenuAction}[]\r\n */\r\n items: ActionMenuAction[];\r\n\r\n /** Whether the menu is disabled\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n\r\n /** Callback when the menu closes */\r\n onClose?: () => void;\r\n\r\n /** Test ID for the trigger button */\r\n triggerTestId?: string;\r\n\r\n /** Test ID for the menu */\r\n menuTestId?: string;\r\n\r\n /** Callback when the selection changes */\r\n onSelectionChange?: (key: string) => void;\r\n\r\n /** The key of the selected item */\r\n selectedKey?: string;\r\n\r\n /** The keys of the disabled items */\r\n disabledKeys?: string[];\r\n}\r\n\r\n/**\r\n * An uncontrolled component that displays either a popover menu or an action menu\r\n * depending on the screen size when the menu trigger is pressed.\r\n *\r\n * API:\r\n * - {@link MenuProps}\r\n */\r\nexport function MenuTrigger({\r\n renderTrigger,\r\n size = 24,\r\n title,\r\n items,\r\n disabled,\r\n onClose,\r\n triggerTestId = \"MenuTrigger-Trigger\",\r\n menuTestId,\r\n onSelectionChange,\r\n selectedKey,\r\n disabledKeys,\r\n}: MenuProps) {\r\n const isMobile = useBreakpoint(BREAKPOINTS.SMALL);\r\n const [isOpen, setIsOpen] = useState(false);\r\n const triggerRef = useRef<HTMLButtonElement>(null);\r\n\r\n const menuItems = useMemo(\r\n () => items.map((item) => ({ ...item, id: item.key })),\r\n [items]\r\n );\r\n\r\n const handleSelectionChange = (key: string) => {\r\n onSelectionChange?.(key);\r\n setIsOpen(false);\r\n };\r\n\r\n const triggerButton = renderTrigger ? (\r\n renderTrigger({\r\n isOpen,\r\n disabled,\r\n setIsOpen,\r\n })\r\n ) : (\r\n <button\r\n data-testid={triggerTestId}\r\n disabled={disabled}\r\n className=\"proton-MenuTrigger__button\"\r\n ref={triggerRef}\r\n onClick={() => setIsOpen(!isOpen)}\r\n type=\"button\"\r\n >\r\n <EllipsisIcon size={size} />\r\n </button>\r\n );\r\n\r\n if (isMobile) {\r\n return (\r\n <>\r\n {triggerButton}\r\n {isOpen && (\r\n <ActionMenu\r\n actions={menuItems}\r\n title={title}\r\n isOpen={isOpen}\r\n onClose={() => {\r\n setIsOpen(false);\r\n onClose?.();\r\n }}\r\n showCancel\r\n data-testid={menuTestId}\r\n selectionMode=\"single\"\r\n onSelectionChange={(keys) => {\r\n const nextKey = Array.from(keys)[0];\r\n if (nextKey) handleSelectionChange(nextKey as string);\r\n }}\r\n selectedKeys={selectedKey ? [selectedKey] : undefined}\r\n disabledKeys={disabledKeys}\r\n />\r\n )}\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <PopoverMenu\r\n trigger={triggerButton}\r\n items={menuItems}\r\n isOpen={isOpen}\r\n onOpenChange={setIsOpen}\r\n selectedKey={selectedKey}\r\n onSelectionChange={handleSelectionChange}\r\n disabledKeys={disabledKeys}\r\n title={title}\r\n />\r\n );\r\n}\r\n\r\nconst EllipsisIcon = ({ size }: { size: number }) => (\r\n <svg viewBox=\"0 0 24 24\" width={size} height={size}>\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M4 14c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm8 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm8 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"\r\n />\r\n </svg>\r\n);\r\n"],"names":["MenuTrigger","renderTrigger","size","title","items","disabled","onClose","triggerTestId","menuTestId","onSelectionChange","selectedKey","disabledKeys","isMobile","useBreakpoint","BREAKPOINTS","isOpen","setIsOpen","useState","triggerRef","useRef","menuItems","useMemo","item","handleSelectionChange","key","triggerButton","jsx","EllipsisIcon","jsxs","Fragment","ActionMenu","keys","nextKey","PopoverMenu"],"mappings":"qZAoEO,SAASA,EAAY,CAC1B,cAAAC,EACA,KAAAC,EAAO,GACP,MAAAC,EACA,MAAAC,EACA,SAAAC,EACA,QAAAC,EACA,cAAAC,EAAgB,sBAChB,WAAAC,EACA,kBAAAC,EACA,YAAAC,EACA,aAAAC,CACF,EAAc,CACN,MAAAC,EAAWC,EAAAA,cAAcC,EAAA,YAAY,KAAK,EAC1C,CAACC,EAAQC,CAAS,EAAIC,WAAS,EAAK,EACpCC,EAAaC,SAA0B,IAAI,EAE3CC,EAAYC,EAAA,QAChB,IAAMjB,EAAM,IAAKkB,IAAU,CAAE,GAAGA,EAAM,GAAIA,EAAK,GAAA,EAAM,EACrD,CAAClB,CAAK,CAAA,EAGFmB,EAAyBC,GAAgB,CAC7Cf,GAAA,MAAAA,EAAoBe,GACpBR,EAAU,EAAK,CAAA,EAGXS,EAAgBxB,EACpBA,EAAc,CACZ,OAAAc,EACA,SAAAV,EACA,UAAAW,CACD,CAAA,EAEDU,EAAA,kBAAA,IAAC,SAAA,CACC,cAAanB,EACb,SAAAF,EACA,UAAU,6BACV,IAAKa,EACL,QAAS,IAAMF,EAAU,CAACD,CAAM,EAChC,KAAK,SAEL,SAAAW,EAAA,kBAAA,IAACC,GAAa,KAAAzB,CAAY,CAAA,CAAA,CAAA,EAI9B,OAAIU,EAGGgB,EAAA,kBAAA,KAAAC,6BAAA,CAAA,SAAA,CAAAJ,EACAV,GACCW,EAAA,kBAAA,IAACI,EAAA,WAAA,CACC,QAASV,EACT,MAAAjB,EACA,OAAAY,EACA,QAAS,IAAM,CACbC,EAAU,EAAK,EACLV,GAAA,MAAAA,GACZ,EACA,WAAU,GACV,cAAaE,EACb,cAAc,SACd,kBAAoBuB,GAAS,CAC3B,MAAMC,EAAU,MAAM,KAAKD,CAAI,EAAE,CAAC,EAC9BC,KAA+BA,CAAiB,CACtD,EACA,aAActB,EAAc,CAACA,CAAW,EAAI,OAC5C,aAAAC,CAAA,CACF,CAEJ,CAAA,CAAA,EAKFe,EAAA,kBAAA,IAACO,EAAA,YAAA,CACC,QAASR,EACT,MAAOL,EACP,OAAAL,EACA,aAAcC,EACd,YAAAN,EACA,kBAAmBa,EACnB,aAAAZ,EACA,MAAAR,CAAA,CAAA,CAGN,CAEA,MAAMwB,EAAe,CAAC,CAAE,KAAAzB,CACtB,IAAAwB,EAAA,kBAAA,IAAC,MAAI,CAAA,QAAQ,YAAY,MAAOxB,EAAM,OAAQA,EAC5C,SAAAwB,EAAA,kBAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,mJAAA,CACJ,EACF"}
1
+ {"version":3,"file":"MenuTrigger.cjs.js","sources":["../../../src/components/Menu/MenuTrigger.tsx"],"sourcesContent":["\"use client\";\n\nimport { ReactNode, useMemo, useRef, useState } from \"react\";\n\nimport { BREAKPOINTS } from \"../../constants\";\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\nimport { ActionMenu, ActionMenuAction } from \"../ActionMenu/ActionMenu\";\nimport { PopoverMenu } from \"./PopoverMenu\";\n\nimport \"./MenuTrigger.css\";\nimport \"./Menu.css\";\n\nexport interface MenuTriggerProps {\n disabled?: boolean;\n isOpen?: boolean;\n setIsOpen: (isOpen: boolean) => void;\n}\n\nexport interface MenuProps {\n /** Custom trigger component. If not provided, defaults to ellipsis icon.\n * - @prop triggerProps {@link TriggerProps}\n */\n renderTrigger?: (triggerProps: MenuTriggerProps) => ReactNode;\n\n /** Size of the trigger icon\n * @default 24\n */\n size?: number;\n\n /** Title of the parent menu */\n title?: string;\n\n /** Array of menu actions/items to display\n * - type {@link ActionMenuAction}[]\n */\n items: ActionMenuAction[];\n\n /** Whether the menu is disabled\n * @default false\n */\n disabled?: boolean;\n\n /** Callback when the menu closes */\n onClose?: () => void;\n\n /** Test ID for the trigger button */\n triggerTestId?: string;\n\n /** Test ID for the menu */\n menuTestId?: string;\n\n /** Callback when the selection changes */\n onSelectionChange?: (key: string) => void;\n\n /** The key of the selected item */\n selectedKey?: string;\n\n /** The keys of the disabled items */\n disabledKeys?: string[];\n}\n\n/**\n * An uncontrolled component that displays either a popover menu or an action menu\n * depending on the screen size when the menu trigger is pressed.\n *\n * API:\n * - {@link MenuProps}\n */\nexport function MenuTrigger({\n renderTrigger,\n size = 24,\n title,\n items,\n disabled,\n onClose,\n triggerTestId = \"MenuTrigger-Trigger\",\n menuTestId,\n onSelectionChange,\n selectedKey,\n disabledKeys,\n}: MenuProps) {\n const isMobile = useBreakpoint(BREAKPOINTS.SMALL);\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const menuItems = useMemo(\n () => items.map((item) => ({ ...item, id: item.key })),\n [items]\n );\n\n const handleSelectionChange = (key: string) => {\n onSelectionChange?.(key);\n setIsOpen(false);\n };\n\n const triggerButton = renderTrigger ? (\n renderTrigger({\n isOpen,\n disabled,\n setIsOpen,\n })\n ) : (\n <button\n data-testid={triggerTestId}\n disabled={disabled}\n className=\"proton-MenuTrigger__button\"\n ref={triggerRef}\n onClick={() => setIsOpen(!isOpen)}\n type=\"button\"\n >\n <EllipsisIcon size={size} />\n </button>\n );\n\n if (isMobile) {\n return (\n <>\n {triggerButton}\n {isOpen && (\n <ActionMenu\n actions={menuItems}\n title={title}\n isOpen={isOpen}\n onClose={() => {\n setIsOpen(false);\n onClose?.();\n }}\n showCancel\n data-testid={menuTestId}\n selectionMode=\"single\"\n onSelectionChange={(keys) => {\n const nextKey = Array.from(keys)[0];\n if (nextKey) handleSelectionChange(nextKey as string);\n }}\n selectedKeys={selectedKey ? [selectedKey] : undefined}\n disabledKeys={disabledKeys}\n />\n )}\n </>\n );\n }\n\n return (\n <PopoverMenu\n trigger={triggerButton}\n items={menuItems}\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n selectedKey={selectedKey}\n onSelectionChange={handleSelectionChange}\n disabledKeys={disabledKeys}\n title={title}\n />\n );\n}\n\nconst EllipsisIcon = ({ size }: { size: number }) => (\n <svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <path\n fill=\"currentColor\"\n d=\"M4 14c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm8 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm8 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"\n />\n </svg>\n);\n"],"names":["MenuTrigger","renderTrigger","size","title","items","disabled","onClose","triggerTestId","menuTestId","onSelectionChange","selectedKey","disabledKeys","isMobile","useBreakpoint","BREAKPOINTS","isOpen","setIsOpen","useState","triggerRef","useRef","menuItems","useMemo","item","handleSelectionChange","key","triggerButton","jsx","EllipsisIcon","jsxs","Fragment","ActionMenu","keys","nextKey","PopoverMenu"],"mappings":"qZAoEO,SAASA,EAAY,CAC1B,cAAAC,EACA,KAAAC,EAAO,GACP,MAAAC,EACA,MAAAC,EACA,SAAAC,EACA,QAAAC,EACA,cAAAC,EAAgB,sBAChB,WAAAC,EACA,kBAAAC,EACA,YAAAC,EACA,aAAAC,CACF,EAAc,CACZ,MAAMC,EAAWC,EAAAA,cAAcC,EAAAA,YAAY,KAAK,EAC1C,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAK,EACpCC,EAAaC,EAAAA,OAA0B,IAAI,EAE3CC,EAAYC,EAAAA,QAChB,IAAMjB,EAAM,IAAKkB,IAAU,CAAE,GAAGA,EAAM,GAAIA,EAAK,GAAA,EAAM,EACrD,CAAClB,CAAK,CAAA,EAGFmB,EAAyBC,GAAgB,CAC7Cf,GAAA,MAAAA,EAAoBe,GACpBR,EAAU,EAAK,CACjB,EAEMS,EAAgBxB,EACpBA,EAAc,CACZ,OAAAc,EACA,SAAAV,EACA,UAAAW,CAAA,CACD,EAEDU,EAAAA,kBAAAA,IAAC,SAAA,CACC,cAAanB,EACb,SAAAF,EACA,UAAU,6BACV,IAAKa,EACL,QAAS,IAAMF,EAAU,CAACD,CAAM,EAChC,KAAK,SAEL,SAAAW,EAAAA,kBAAAA,IAACC,GAAa,KAAAzB,CAAA,CAAY,CAAA,CAAA,EAI9B,OAAIU,EAEAgB,EAAAA,kBAAAA,KAAAC,6BAAA,CACG,SAAA,CAAAJ,EACAV,GACCW,EAAAA,kBAAAA,IAACI,EAAAA,WAAA,CACC,QAASV,EACT,MAAAjB,EACA,OAAAY,EACA,QAAS,IAAM,CACbC,EAAU,EAAK,EACfV,GAAA,MAAAA,GACF,EACA,WAAU,GACV,cAAaE,EACb,cAAc,SACd,kBAAoBuB,GAAS,CAC3B,MAAMC,EAAU,MAAM,KAAKD,CAAI,EAAE,CAAC,EAC9BC,KAA+BA,CAAiB,CACtD,EACA,aAActB,EAAc,CAACA,CAAW,EAAI,OAC5C,aAAAC,CAAA,CAAA,CACF,EAEJ,EAKFe,EAAAA,kBAAAA,IAACO,EAAAA,YAAA,CACC,QAASR,EACT,MAAOL,EACP,OAAAL,EACA,aAAcC,EACd,YAAAN,EACA,kBAAmBa,EACnB,aAAAZ,EACA,MAAAR,CAAA,CAAA,CAGN,CAEA,MAAMwB,EAAe,CAAC,CAAE,KAAAzB,CAAA,IACtBwB,EAAAA,kBAAAA,IAAC,MAAA,CAAI,QAAQ,YAAY,MAAOxB,EAAM,OAAQA,EAC5C,SAAAwB,EAAAA,kBAAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,mJAAA,CACJ,EACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuTrigger.es.js","sources":["../../../src/components/Menu/MenuTrigger.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { ReactNode, useMemo, useRef, useState } from \"react\";\r\n\r\nimport { BREAKPOINTS } from \"../../constants\";\r\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\r\nimport { ActionMenu, ActionMenuAction } from \"../ActionMenu/ActionMenu\";\r\nimport { PopoverMenu } from \"./PopoverMenu\";\r\n\r\nimport \"./MenuTrigger.css\";\r\nimport \"./Menu.css\";\r\n\r\nexport interface MenuTriggerProps {\r\n disabled?: boolean;\r\n isOpen?: boolean;\r\n setIsOpen: (isOpen: boolean) => void;\r\n}\r\n\r\nexport interface MenuProps {\r\n /** Custom trigger component. If not provided, defaults to ellipsis icon.\r\n * - @prop triggerProps {@link TriggerProps}\r\n */\r\n renderTrigger?: (triggerProps: MenuTriggerProps) => ReactNode;\r\n\r\n /** Size of the trigger icon\r\n * @default 24\r\n */\r\n size?: number;\r\n\r\n /** Title of the parent menu */\r\n title?: string;\r\n\r\n /** Array of menu actions/items to display\r\n * - type {@link ActionMenuAction}[]\r\n */\r\n items: ActionMenuAction[];\r\n\r\n /** Whether the menu is disabled\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n\r\n /** Callback when the menu closes */\r\n onClose?: () => void;\r\n\r\n /** Test ID for the trigger button */\r\n triggerTestId?: string;\r\n\r\n /** Test ID for the menu */\r\n menuTestId?: string;\r\n\r\n /** Callback when the selection changes */\r\n onSelectionChange?: (key: string) => void;\r\n\r\n /** The key of the selected item */\r\n selectedKey?: string;\r\n\r\n /** The keys of the disabled items */\r\n disabledKeys?: string[];\r\n}\r\n\r\n/**\r\n * An uncontrolled component that displays either a popover menu or an action menu\r\n * depending on the screen size when the menu trigger is pressed.\r\n *\r\n * API:\r\n * - {@link MenuProps}\r\n */\r\nexport function MenuTrigger({\r\n renderTrigger,\r\n size = 24,\r\n title,\r\n items,\r\n disabled,\r\n onClose,\r\n triggerTestId = \"MenuTrigger-Trigger\",\r\n menuTestId,\r\n onSelectionChange,\r\n selectedKey,\r\n disabledKeys,\r\n}: MenuProps) {\r\n const isMobile = useBreakpoint(BREAKPOINTS.SMALL);\r\n const [isOpen, setIsOpen] = useState(false);\r\n const triggerRef = useRef<HTMLButtonElement>(null);\r\n\r\n const menuItems = useMemo(\r\n () => items.map((item) => ({ ...item, id: item.key })),\r\n [items]\r\n );\r\n\r\n const handleSelectionChange = (key: string) => {\r\n onSelectionChange?.(key);\r\n setIsOpen(false);\r\n };\r\n\r\n const triggerButton = renderTrigger ? (\r\n renderTrigger({\r\n isOpen,\r\n disabled,\r\n setIsOpen,\r\n })\r\n ) : (\r\n <button\r\n data-testid={triggerTestId}\r\n disabled={disabled}\r\n className=\"proton-MenuTrigger__button\"\r\n ref={triggerRef}\r\n onClick={() => setIsOpen(!isOpen)}\r\n type=\"button\"\r\n >\r\n <EllipsisIcon size={size} />\r\n </button>\r\n );\r\n\r\n if (isMobile) {\r\n return (\r\n <>\r\n {triggerButton}\r\n {isOpen && (\r\n <ActionMenu\r\n actions={menuItems}\r\n title={title}\r\n isOpen={isOpen}\r\n onClose={() => {\r\n setIsOpen(false);\r\n onClose?.();\r\n }}\r\n showCancel\r\n data-testid={menuTestId}\r\n selectionMode=\"single\"\r\n onSelectionChange={(keys) => {\r\n const nextKey = Array.from(keys)[0];\r\n if (nextKey) handleSelectionChange(nextKey as string);\r\n }}\r\n selectedKeys={selectedKey ? [selectedKey] : undefined}\r\n disabledKeys={disabledKeys}\r\n />\r\n )}\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <PopoverMenu\r\n trigger={triggerButton}\r\n items={menuItems}\r\n isOpen={isOpen}\r\n onOpenChange={setIsOpen}\r\n selectedKey={selectedKey}\r\n onSelectionChange={handleSelectionChange}\r\n disabledKeys={disabledKeys}\r\n title={title}\r\n />\r\n );\r\n}\r\n\r\nconst EllipsisIcon = ({ size }: { size: number }) => (\r\n <svg viewBox=\"0 0 24 24\" width={size} height={size}>\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M4 14c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm8 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm8 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"\r\n />\r\n </svg>\r\n);\r\n"],"names":["MenuTrigger","renderTrigger","size","title","items","disabled","onClose","triggerTestId","menuTestId","onSelectionChange","selectedKey","disabledKeys","isMobile","useBreakpoint","BREAKPOINTS","isOpen","setIsOpen","useState","triggerRef","useRef","menuItems","useMemo","item","handleSelectionChange","key","triggerButton","jsx","EllipsisIcon","jsxs","Fragment","ActionMenu","keys","nextKey","PopoverMenu"],"mappings":";;;;;;;;AAoEO,SAASA,EAAY;AAAA,EAC1B,eAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,eAAAC,IAAgB;AAAA,EAChB,YAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC;AACF,GAAc;AACN,QAAAC,IAAWC,EAAcC,EAAY,KAAK,GAC1C,CAACC,GAAQC,CAAS,IAAIC,EAAS,EAAK,GACpCC,IAAaC,EAA0B,IAAI,GAE3CC,IAAYC;AAAA,IAChB,MAAMjB,EAAM,IAAI,CAACkB,OAAU,EAAE,GAAGA,GAAM,IAAIA,EAAK,IAAA,EAAM;AAAA,IACrD,CAAClB,CAAK;AAAA,EAAA,GAGFmB,IAAwB,CAACC,MAAgB;AAC7C,IAAAf,KAAA,QAAAA,EAAoBe,IACpBR,EAAU,EAAK;AAAA,EAAA,GAGXS,IAAgBxB,IACpBA,EAAc;AAAA,IACZ,QAAAc;AAAA,IACA,UAAAV;AAAA,IACA,WAAAW;AAAA,EACD,CAAA,IAEDU,gBAAAA,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAanB;AAAA,MACb,UAAAF;AAAA,MACA,WAAU;AAAA,MACV,KAAKa;AAAA,MACL,SAAS,MAAMF,EAAU,CAACD,CAAM;AAAA,MAChC,MAAK;AAAA,MAEL,UAAAW,gBAAAA,EAAA,IAACC,KAAa,MAAAzB,EAAY,CAAA;AAAA,IAAA;AAAA,EAAA;AAI9B,SAAIU,IAGGgB,gBAAAA,EAAA,KAAAC,YAAA,EAAA,UAAA;AAAA,IAAAJ;AAAA,IACAV,KACCW,gBAAAA,EAAA;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,SAASV;AAAA,QACT,OAAAjB;AAAA,QACA,QAAAY;AAAA,QACA,SAAS,MAAM;AACb,UAAAC,EAAU,EAAK,GACLV,KAAA,QAAAA;AAAA,QACZ;AAAA,QACA,YAAU;AAAA,QACV,eAAaE;AAAA,QACb,eAAc;AAAA,QACd,mBAAmB,CAACuB,MAAS;AAC3B,gBAAMC,IAAU,MAAM,KAAKD,CAAI,EAAE,CAAC;AAC9B,UAAAC,OAA+BA,CAAiB;AAAA,QACtD;AAAA,QACA,cAActB,IAAc,CAACA,CAAW,IAAI;AAAA,QAC5C,cAAAC;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ,EAAA,CAAA,IAKFe,gBAAAA,EAAA;AAAA,IAACO;AAAA,IAAA;AAAA,MACC,SAASR;AAAA,MACT,OAAOL;AAAA,MACP,QAAAL;AAAA,MACA,cAAcC;AAAA,MACd,aAAAN;AAAA,MACA,mBAAmBa;AAAA,MACnB,cAAAZ;AAAA,MACA,OAAAR;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,MAAMwB,IAAe,CAAC,EAAE,MAAAzB,EACtB,MAAAwB,gBAAAA,EAAA,IAAC,OAAI,EAAA,SAAQ,aAAY,OAAOxB,GAAM,QAAQA,GAC5C,UAAAwB,gBAAAA,EAAA;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,GAAE;AAAA,EAAA;AACJ,GACF;"}
1
+ {"version":3,"file":"MenuTrigger.es.js","sources":["../../../src/components/Menu/MenuTrigger.tsx"],"sourcesContent":["\"use client\";\n\nimport { ReactNode, useMemo, useRef, useState } from \"react\";\n\nimport { BREAKPOINTS } from \"../../constants\";\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\nimport { ActionMenu, ActionMenuAction } from \"../ActionMenu/ActionMenu\";\nimport { PopoverMenu } from \"./PopoverMenu\";\n\nimport \"./MenuTrigger.css\";\nimport \"./Menu.css\";\n\nexport interface MenuTriggerProps {\n disabled?: boolean;\n isOpen?: boolean;\n setIsOpen: (isOpen: boolean) => void;\n}\n\nexport interface MenuProps {\n /** Custom trigger component. If not provided, defaults to ellipsis icon.\n * - @prop triggerProps {@link TriggerProps}\n */\n renderTrigger?: (triggerProps: MenuTriggerProps) => ReactNode;\n\n /** Size of the trigger icon\n * @default 24\n */\n size?: number;\n\n /** Title of the parent menu */\n title?: string;\n\n /** Array of menu actions/items to display\n * - type {@link ActionMenuAction}[]\n */\n items: ActionMenuAction[];\n\n /** Whether the menu is disabled\n * @default false\n */\n disabled?: boolean;\n\n /** Callback when the menu closes */\n onClose?: () => void;\n\n /** Test ID for the trigger button */\n triggerTestId?: string;\n\n /** Test ID for the menu */\n menuTestId?: string;\n\n /** Callback when the selection changes */\n onSelectionChange?: (key: string) => void;\n\n /** The key of the selected item */\n selectedKey?: string;\n\n /** The keys of the disabled items */\n disabledKeys?: string[];\n}\n\n/**\n * An uncontrolled component that displays either a popover menu or an action menu\n * depending on the screen size when the menu trigger is pressed.\n *\n * API:\n * - {@link MenuProps}\n */\nexport function MenuTrigger({\n renderTrigger,\n size = 24,\n title,\n items,\n disabled,\n onClose,\n triggerTestId = \"MenuTrigger-Trigger\",\n menuTestId,\n onSelectionChange,\n selectedKey,\n disabledKeys,\n}: MenuProps) {\n const isMobile = useBreakpoint(BREAKPOINTS.SMALL);\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const menuItems = useMemo(\n () => items.map((item) => ({ ...item, id: item.key })),\n [items]\n );\n\n const handleSelectionChange = (key: string) => {\n onSelectionChange?.(key);\n setIsOpen(false);\n };\n\n const triggerButton = renderTrigger ? (\n renderTrigger({\n isOpen,\n disabled,\n setIsOpen,\n })\n ) : (\n <button\n data-testid={triggerTestId}\n disabled={disabled}\n className=\"proton-MenuTrigger__button\"\n ref={triggerRef}\n onClick={() => setIsOpen(!isOpen)}\n type=\"button\"\n >\n <EllipsisIcon size={size} />\n </button>\n );\n\n if (isMobile) {\n return (\n <>\n {triggerButton}\n {isOpen && (\n <ActionMenu\n actions={menuItems}\n title={title}\n isOpen={isOpen}\n onClose={() => {\n setIsOpen(false);\n onClose?.();\n }}\n showCancel\n data-testid={menuTestId}\n selectionMode=\"single\"\n onSelectionChange={(keys) => {\n const nextKey = Array.from(keys)[0];\n if (nextKey) handleSelectionChange(nextKey as string);\n }}\n selectedKeys={selectedKey ? [selectedKey] : undefined}\n disabledKeys={disabledKeys}\n />\n )}\n </>\n );\n }\n\n return (\n <PopoverMenu\n trigger={triggerButton}\n items={menuItems}\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n selectedKey={selectedKey}\n onSelectionChange={handleSelectionChange}\n disabledKeys={disabledKeys}\n title={title}\n />\n );\n}\n\nconst EllipsisIcon = ({ size }: { size: number }) => (\n <svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <path\n fill=\"currentColor\"\n d=\"M4 14c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm8 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm8 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"\n />\n </svg>\n);\n"],"names":["MenuTrigger","renderTrigger","size","title","items","disabled","onClose","triggerTestId","menuTestId","onSelectionChange","selectedKey","disabledKeys","isMobile","useBreakpoint","BREAKPOINTS","isOpen","setIsOpen","useState","triggerRef","useRef","menuItems","useMemo","item","handleSelectionChange","key","triggerButton","jsx","EllipsisIcon","jsxs","Fragment","ActionMenu","keys","nextKey","PopoverMenu"],"mappings":";;;;;;;;AAoEO,SAASA,EAAY;AAAA,EAC1B,eAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,eAAAC,IAAgB;AAAA,EAChB,YAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC;AACF,GAAc;AACZ,QAAMC,IAAWC,EAAcC,EAAY,KAAK,GAC1C,CAACC,GAAQC,CAAS,IAAIC,EAAS,EAAK,GACpCC,IAAaC,EAA0B,IAAI,GAE3CC,IAAYC;AAAA,IAChB,MAAMjB,EAAM,IAAI,CAACkB,OAAU,EAAE,GAAGA,GAAM,IAAIA,EAAK,IAAA,EAAM;AAAA,IACrD,CAAClB,CAAK;AAAA,EAAA,GAGFmB,IAAwB,CAACC,MAAgB;AAC7C,IAAAf,KAAA,QAAAA,EAAoBe,IACpBR,EAAU,EAAK;AAAA,EACjB,GAEMS,IAAgBxB,IACpBA,EAAc;AAAA,IACZ,QAAAc;AAAA,IACA,UAAAV;AAAA,IACA,WAAAW;AAAA,EAAA,CACD,IAEDU,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAanB;AAAA,MACb,UAAAF;AAAA,MACA,WAAU;AAAA,MACV,KAAKa;AAAA,MACL,SAAS,MAAMF,EAAU,CAACD,CAAM;AAAA,MAChC,MAAK;AAAA,MAEL,UAAAW,gBAAAA,EAAAA,IAACC,KAAa,MAAAzB,EAAA,CAAY;AAAA,IAAA;AAAA,EAAA;AAI9B,SAAIU,IAEAgB,gBAAAA,EAAAA,KAAAC,YAAA,EACG,UAAA;AAAA,IAAAJ;AAAA,IACAV,KACCW,gBAAAA,EAAAA;AAAAA,MAACI;AAAA,MAAA;AAAA,QACC,SAASV;AAAA,QACT,OAAAjB;AAAA,QACA,QAAAY;AAAA,QACA,SAAS,MAAM;AACb,UAAAC,EAAU,EAAK,GACfV,KAAA,QAAAA;AAAA,QACF;AAAA,QACA,YAAU;AAAA,QACV,eAAaE;AAAA,QACb,eAAc;AAAA,QACd,mBAAmB,CAACuB,MAAS;AAC3B,gBAAMC,IAAU,MAAM,KAAKD,CAAI,EAAE,CAAC;AAClC,UAAIC,OAA+BA,CAAiB;AAAA,QACtD;AAAA,QACA,cAActB,IAAc,CAACA,CAAW,IAAI;AAAA,QAC5C,cAAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GAEJ,IAKFe,gBAAAA,EAAAA;AAAAA,IAACO;AAAA,IAAA;AAAA,MACC,SAASR;AAAA,MACT,OAAOL;AAAA,MACP,QAAAL;AAAA,MACA,cAAcC;AAAA,MACd,aAAAN;AAAA,MACA,mBAAmBa;AAAA,MACnB,cAAAZ;AAAA,MACA,OAAAR;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,MAAMwB,IAAe,CAAC,EAAE,MAAAzB,EAAA,MACtBwB,gBAAAA,EAAAA,IAAC,OAAA,EAAI,SAAQ,aAAY,OAAOxB,GAAM,QAAQA,GAC5C,UAAAwB,gBAAAA,EAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,GAAE;AAAA,EAAA;AACJ,GACF;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("../../node_modules/react/jsx-runtime.cjs.js"),s=require("radix-ui"),R=require("../ThemeProvider.cjs.js"),u=require("../../utils/string.cjs.js");function b({trigger:p,items:j,isOpen:M,onOpenChange:n,selectedKey:_,onSelectionChange:l,disabledKeys:g,title:c}){const{className:x,style:m}=R.useTheme();function a(d){const{item:e,className:h,style:y,disabledKeys:t,onClose:o}=d;return e.children&&e.children.length>0?r.jsxRuntimeExports.jsxs(s.DropdownMenu.Sub,{children:[r.jsxRuntimeExports.jsxs(s.DropdownMenu.SubTrigger,{className:u.csx("proton-Menu__item","proton-MenuTrigger__menu-item"),children:[e.label,r.jsxRuntimeExports.jsx("svg",{className:"proton-MenuTrigger__chevron",viewBox:"0 0 256 256",width:16,height:12,children:r.jsxRuntimeExports.jsx("path",{fill:"currentColor",d:"m184.49 136.49l-80 80a12 12 0 0 1-17-17L159 128L87.51 56.49a12 12 0 1 1 17-17l80 80a12 12 0 0 1-.02 17"})})]}),r.jsxRuntimeExports.jsx(s.DropdownMenu.SubContent,{sideOffset:8,"data-has-submenu":"true",className:u.csx("proton-Menu","proton-MenuTrigger__menu"),children:e.children.map(i=>a({item:i,className:h,style:y,disabledKeys:t,onClose:o}))})]},e.key):r.jsxRuntimeExports.jsxs(s.DropdownMenu.Item,{className:u.csx("proton-Menu__item","proton-MenuTrigger__menu-item"),"aria-selected":_===e.key,disabled:t==null?void 0:t.includes(e.key),onSelect:()=>{var i;(i=e.onAction)==null||i.call(e,e.key),l==null||l(e.key),o==null||o()},children:[r.jsxRuntimeExports.jsx("span",{className:"proton-MenuTrigger__label",style:{gridArea:"label"},children:e.label}),e.description&&r.jsxRuntimeExports.jsx("span",{className:"proton-MenuTrigger__description",style:{gridArea:"desc"},children:e.description})]},e.key)}return r.jsxRuntimeExports.jsxs(s.DropdownMenu.Root,{open:M,onOpenChange:n,children:[r.jsxRuntimeExports.jsx(s.DropdownMenu.Trigger,{asChild:!0,children:p}),r.jsxRuntimeExports.jsx(s.DropdownMenu.Portal,{children:r.jsxRuntimeExports.jsxs(s.DropdownMenu.Content,{className:u.csx("proton-Menu","proton-MenuTrigger__menu",x),style:m,children:[c&&r.jsxRuntimeExports.jsx(s.DropdownMenu.Label,{className:"proton-MenuTrigger__menu-header",children:c}),j.map(d=>a({item:d,className:x,style:m,disabledKeys:g,onClose:()=>n==null?void 0:n(!1)}))]})})]})}exports.PopoverMenu=b;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("../../node_modules/react/jsx-runtime.cjs.js"),s=require("radix-ui"),h=require("../ThemeProvider.cjs.js"),u=require("../../utils/string.cjs.js");function R({trigger:m,items:p,isOpen:a,onOpenChange:n,selectedKey:j,onSelectionChange:l,disabledKeys:M,title:x}){const{className:_,style:g}=h.useTheme();function c(d){const{item:e,disabledKeys:t,onClose:o}=d;return e.children&&e.children.length>0?r.jsxRuntimeExports.jsxs(s.DropdownMenu.Sub,{children:[r.jsxRuntimeExports.jsxs(s.DropdownMenu.SubTrigger,{className:u.csx("proton-Menu__item","proton-MenuTrigger__menu-item"),children:[e.label,r.jsxRuntimeExports.jsx("svg",{className:"proton-MenuTrigger__chevron",viewBox:"0 0 256 256",width:16,height:12,children:r.jsxRuntimeExports.jsx("path",{fill:"currentColor",d:"m184.49 136.49l-80 80a12 12 0 0 1-17-17L159 128L87.51 56.49a12 12 0 1 1 17-17l80 80a12 12 0 0 1-.02 17"})})]}),r.jsxRuntimeExports.jsx(s.DropdownMenu.SubContent,{sideOffset:8,"data-has-submenu":"true",className:u.csx("proton-Menu","proton-MenuTrigger__menu"),children:e.children.map(i=>c({item:i,disabledKeys:t,onClose:o}))})]},e.key):r.jsxRuntimeExports.jsxs(s.DropdownMenu.Item,{className:u.csx("proton-Menu__item","proton-MenuTrigger__menu-item"),"aria-selected":j===e.key,disabled:t==null?void 0:t.includes(e.key),onSelect:()=>{var i;(i=e.onAction)==null||i.call(e,e.key),l==null||l(e.key),o==null||o()},children:[r.jsxRuntimeExports.jsx("span",{className:"proton-MenuTrigger__label",style:{gridArea:"label"},children:e.label}),e.description&&r.jsxRuntimeExports.jsx("span",{className:"proton-MenuTrigger__description",style:{gridArea:"desc"},children:e.description})]},e.key)}return r.jsxRuntimeExports.jsxs(s.DropdownMenu.Root,{open:a,onOpenChange:n,children:[r.jsxRuntimeExports.jsx(s.DropdownMenu.Trigger,{asChild:!0,children:m}),r.jsxRuntimeExports.jsx(s.DropdownMenu.Portal,{children:r.jsxRuntimeExports.jsxs(s.DropdownMenu.Content,{className:u.csx("proton-Menu","proton-MenuTrigger__menu",_),style:g,children:[x&&r.jsxRuntimeExports.jsx(s.DropdownMenu.Label,{className:"proton-MenuTrigger__menu-header",children:x}),p.map(d=>c({item:d,disabledKeys:M,onClose:()=>n==null?void 0:n(!1)}))]})})]})}exports.PopoverMenu=R;
2
2
  //# sourceMappingURL=PopoverMenu.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PopoverMenu.cjs.js","sources":["../../../src/components/Menu/PopoverMenu.tsx"],"sourcesContent":["import { DropdownMenu as RadixDropdownMenu } from \"radix-ui\";\r\nimport { useTheme } from \"../ThemeProvider\";\r\nimport { csx } from \"../../utils/string\";\r\nimport { ActionMenuAction } from \"../ActionMenu/ActionMenu\";\r\n\r\nexport interface PopoverMenuProps {\r\n /** The trigger component */\r\n trigger: React.ReactNode;\r\n\r\n /** Array of menu actions/items to display\r\n * - type {@link ActionMenuAction}[]\r\n */\r\n items: ActionMenuAction[];\r\n\r\n /** Whether the menu is open */\r\n isOpen: boolean;\r\n\r\n /** Callback when the menu is opened or closed */\r\n onOpenChange: (open: boolean) => void;\r\n\r\n /** The key of the selected item */\r\n selectedKey: string;\r\n\r\n /** Callback when the selection changes */\r\n onSelectionChange: (key: string) => void;\r\n\r\n /** The keys of the disabled items */\r\n disabledKeys: string[];\r\n\r\n /** The title of the menu */\r\n title: string;\r\n}\r\n\r\n/**\r\n * A component that displays a popover menu.\r\n *\r\n * API:\r\n * - {@link PopoverMenuProps}\r\n */\r\nexport function PopoverMenu({\r\n trigger,\r\n items,\r\n isOpen,\r\n onOpenChange,\r\n selectedKey,\r\n onSelectionChange,\r\n disabledKeys,\r\n title,\r\n}: PopoverMenuProps) {\r\n const { className: themeClass, style: themeStyle } = useTheme();\r\n\r\n function renderMenuItem(props) {\r\n const { item, className, style, disabledKeys, onClose } = props;\r\n\r\n if (item.children && item.children.length > 0) {\r\n return (\r\n <RadixDropdownMenu.Sub key={item.key}>\r\n <RadixDropdownMenu.SubTrigger\r\n className={csx(\r\n \"proton-Menu__item\",\r\n \"proton-MenuTrigger__menu-item\"\r\n )}\r\n >\r\n {item.label}\r\n <svg\r\n className=\"proton-MenuTrigger__chevron\"\r\n viewBox=\"0 0 256 256\"\r\n width={16}\r\n height={12}\r\n >\r\n <path\r\n fill=\"currentColor\"\r\n d=\"m184.49 136.49l-80 80a12 12 0 0 1-17-17L159 128L87.51 56.49a12 12 0 1 1 17-17l80 80a12 12 0 0 1-.02 17\"\r\n />\r\n </svg>\r\n </RadixDropdownMenu.SubTrigger>\r\n\r\n <RadixDropdownMenu.SubContent\r\n sideOffset={8}\r\n data-has-submenu=\"true\"\r\n className={csx(\"proton-Menu\", \"proton-MenuTrigger__menu\")}\r\n >\r\n {item.children.map((child) =>\r\n renderMenuItem({\r\n item: child,\r\n className,\r\n style,\r\n disabledKeys,\r\n onClose,\r\n })\r\n )}\r\n </RadixDropdownMenu.SubContent>\r\n </RadixDropdownMenu.Sub>\r\n );\r\n } else {\r\n return (\r\n <RadixDropdownMenu.Item\r\n className={csx(\"proton-Menu__item\", \"proton-MenuTrigger__menu-item\")}\r\n key={item.key}\r\n aria-selected={selectedKey === item.key}\r\n disabled={disabledKeys?.includes(item.key)}\r\n onSelect={() => {\r\n item.onAction?.(item.key);\r\n onSelectionChange?.(item.key);\r\n onClose?.();\r\n }}\r\n >\r\n <span\r\n className=\"proton-MenuTrigger__label\"\r\n style={{ gridArea: \"label\" }}\r\n >\r\n {item.label}\r\n </span>\r\n {item.description && (\r\n <span\r\n className=\"proton-MenuTrigger__description\"\r\n style={{ gridArea: \"desc\" }}\r\n >\r\n {item.description}\r\n </span>\r\n )}\r\n </RadixDropdownMenu.Item>\r\n );\r\n }\r\n }\r\n\r\n return (\r\n <RadixDropdownMenu.Root open={isOpen} onOpenChange={onOpenChange}>\r\n <RadixDropdownMenu.Trigger asChild>{trigger}</RadixDropdownMenu.Trigger>\r\n <RadixDropdownMenu.Portal>\r\n <RadixDropdownMenu.Content\r\n className={csx(\"proton-Menu\", \"proton-MenuTrigger__menu\", themeClass)}\r\n style={themeStyle as React.CSSProperties}\r\n >\r\n {title && (\r\n <RadixDropdownMenu.Label className=\"proton-MenuTrigger__menu-header\">\r\n {title}\r\n </RadixDropdownMenu.Label>\r\n )}\r\n {items.map((item) =>\r\n renderMenuItem({\r\n item,\r\n className: themeClass,\r\n style: themeStyle as React.CSSProperties,\r\n disabledKeys,\r\n onClose: () => onOpenChange?.(false),\r\n })\r\n )}\r\n </RadixDropdownMenu.Content>\r\n </RadixDropdownMenu.Portal>\r\n </RadixDropdownMenu.Root>\r\n );\r\n}\r\n"],"names":["PopoverMenu","trigger","items","isOpen","onOpenChange","selectedKey","onSelectionChange","disabledKeys","title","themeClass","themeStyle","useTheme","renderMenuItem","props","item","className","style","onClose","jsxs","RadixDropdownMenu","csx","jsx","child","_a"],"mappings":"iPAuCO,SAASA,EAAY,CAC1B,QAAAC,EACA,MAAAC,EACA,OAAAC,EACA,aAAAC,EACA,YAAAC,EACA,kBAAAC,EACA,aAAAC,EACA,MAAAC,CACF,EAAqB,CACnB,KAAM,CAAE,UAAWC,EAAY,MAAOC,CAAA,EAAeC,EAAAA,WAErD,SAASC,EAAeC,EAAO,CAC7B,KAAM,CAAE,KAAAC,EAAM,UAAAC,EAAW,MAAAC,EAAO,aAAAT,EAAc,QAAAU,CAAY,EAAAJ,EAE1D,OAAIC,EAAK,UAAYA,EAAK,SAAS,OAAS,EAExCI,yBAACC,EAAAA,aAAkB,IAAlB,CACC,SAAA,CAAAD,EAAA,kBAAA,KAACC,EAAAA,aAAkB,WAAlB,CACC,UAAWC,EAAA,IACT,oBACA,+BACF,EAEC,SAAA,CAAKN,EAAA,MACNO,EAAA,kBAAA,IAAC,MAAA,CACC,UAAU,8BACV,QAAQ,cACR,MAAO,GACP,OAAQ,GAER,SAAAA,EAAA,kBAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,wGAAA,CACJ,CAAA,CACF,CAAA,CAAA,CACF,EAEAA,EAAA,kBAAA,IAACF,EAAAA,aAAkB,WAAlB,CACC,WAAY,EACZ,mBAAiB,OACjB,UAAWC,EAAAA,IAAI,cAAe,0BAA0B,EAEvD,WAAK,SAAS,IAAKE,GAClBV,EAAe,CACb,KAAMU,EACN,UAAAP,EACA,MAAAC,EACA,aAAAT,EACA,QAAAU,CAAA,CACD,CACH,CAAA,CACF,CAAA,GAnC0BH,EAAK,GAoCjC,EAIAI,EAAA,kBAAA,KAACC,EAAAA,aAAkB,KAAlB,CACC,UAAWC,EAAAA,IAAI,oBAAqB,+BAA+B,EAEnE,gBAAef,IAAgBS,EAAK,IACpC,SAAUP,GAAAA,YAAAA,EAAc,SAASO,EAAK,KACtC,SAAU,IAAM,QACTS,EAAAT,EAAA,WAAA,MAAAS,EAAA,KAAAT,EAAWA,EAAK,KACrBR,GAAA,MAAAA,EAAoBQ,EAAK,KACfG,GAAA,MAAAA,GACZ,EAEA,SAAA,CAAAI,EAAA,kBAAA,IAAC,OAAA,CACC,UAAU,4BACV,MAAO,CAAE,SAAU,OAAQ,EAE1B,SAAKP,EAAA,KAAA,CACR,EACCA,EAAK,aACJO,EAAA,kBAAA,IAAC,OAAA,CACC,UAAU,kCACV,MAAO,CAAE,SAAU,MAAO,EAEzB,SAAKP,EAAA,WAAA,CACR,CAAA,CAAA,EArBGA,EAAK,GAAA,CA0BlB,CAEA,gCACGK,EAAAA,aAAkB,KAAlB,CAAuB,KAAMhB,EAAQ,aAAAC,EACpC,SAAA,CAAAiB,EAAA,kBAAA,IAACF,EAAkB,aAAA,QAAlB,CAA0B,QAAO,GAAE,SAAQlB,EAAA,EAC5CoB,EAAAA,kBAAAA,IAACF,EAAkB,aAAA,OAAlB,CACC,SAAAD,EAAA,kBAAA,KAACC,EAAAA,aAAkB,QAAlB,CACC,UAAWC,EAAA,IAAI,cAAe,2BAA4BX,CAAU,EACpE,MAAOC,EAEN,SAAA,CAAAF,2BACEW,EAAAA,aAAkB,MAAlB,CAAwB,UAAU,kCAChC,SACHX,EAAA,EAEDN,EAAM,IAAKY,GACVF,EAAe,CACb,KAAAE,EACA,UAAWL,EACX,MAAOC,EACP,aAAAH,EACA,QAAS,IAAMH,GAAA,YAAAA,EAAe,GAAK,CACpC,CACH,CAAA,CAAA,CAAA,EAEJ,CACF,CAAA,CAAA,CAEJ"}
1
+ {"version":3,"file":"PopoverMenu.cjs.js","sources":["../../../src/components/Menu/PopoverMenu.tsx"],"sourcesContent":["import { DropdownMenu as RadixDropdownMenu } from \"radix-ui\";\nimport { useTheme } from \"../ThemeProvider\";\nimport { csx } from \"../../utils/string\";\nimport { ActionMenuAction } from \"../ActionMenu/ActionMenu\";\n\nexport interface PopoverMenuProps {\n /** The trigger component */\n trigger: React.ReactNode;\n\n /** Array of menu actions/items to display\n * - type {@link ActionMenuAction}[]\n */\n items: ActionMenuAction[];\n\n /** Whether the menu is open */\n isOpen: boolean;\n\n /** Callback when the menu is opened or closed */\n onOpenChange: (open: boolean) => void;\n\n /** The key of the selected item */\n selectedKey: string;\n\n /** Callback when the selection changes */\n onSelectionChange: (key: string) => void;\n\n /** The keys of the disabled items */\n disabledKeys: string[];\n\n /** The title of the menu */\n title: string;\n}\n\n/**\n * A component that displays a popover menu.\n *\n * API:\n * - {@link PopoverMenuProps}\n */\nexport function PopoverMenu({\n trigger,\n items,\n isOpen,\n onOpenChange,\n selectedKey,\n onSelectionChange,\n disabledKeys,\n title,\n}: PopoverMenuProps) {\n const { className: themeClass, style: themeStyle } = useTheme();\n\n function renderMenuItem(props) {\n const { item, className, style, disabledKeys, onClose } = props;\n\n if (item.children && item.children.length > 0) {\n return (\n <RadixDropdownMenu.Sub key={item.key}>\n <RadixDropdownMenu.SubTrigger\n className={csx(\n \"proton-Menu__item\",\n \"proton-MenuTrigger__menu-item\"\n )}\n >\n {item.label}\n <svg\n className=\"proton-MenuTrigger__chevron\"\n viewBox=\"0 0 256 256\"\n width={16}\n height={12}\n >\n <path\n fill=\"currentColor\"\n d=\"m184.49 136.49l-80 80a12 12 0 0 1-17-17L159 128L87.51 56.49a12 12 0 1 1 17-17l80 80a12 12 0 0 1-.02 17\"\n />\n </svg>\n </RadixDropdownMenu.SubTrigger>\n\n <RadixDropdownMenu.SubContent\n sideOffset={8}\n data-has-submenu=\"true\"\n className={csx(\"proton-Menu\", \"proton-MenuTrigger__menu\")}\n >\n {item.children.map((child) =>\n renderMenuItem({\n item: child,\n className,\n style,\n disabledKeys,\n onClose,\n })\n )}\n </RadixDropdownMenu.SubContent>\n </RadixDropdownMenu.Sub>\n );\n } else {\n return (\n <RadixDropdownMenu.Item\n className={csx(\"proton-Menu__item\", \"proton-MenuTrigger__menu-item\")}\n key={item.key}\n aria-selected={selectedKey === item.key}\n disabled={disabledKeys?.includes(item.key)}\n onSelect={() => {\n item.onAction?.(item.key);\n onSelectionChange?.(item.key);\n onClose?.();\n }}\n >\n <span\n className=\"proton-MenuTrigger__label\"\n style={{ gridArea: \"label\" }}\n >\n {item.label}\n </span>\n {item.description && (\n <span\n className=\"proton-MenuTrigger__description\"\n style={{ gridArea: \"desc\" }}\n >\n {item.description}\n </span>\n )}\n </RadixDropdownMenu.Item>\n );\n }\n }\n\n return (\n <RadixDropdownMenu.Root open={isOpen} onOpenChange={onOpenChange}>\n <RadixDropdownMenu.Trigger asChild>{trigger}</RadixDropdownMenu.Trigger>\n <RadixDropdownMenu.Portal>\n <RadixDropdownMenu.Content\n className={csx(\"proton-Menu\", \"proton-MenuTrigger__menu\", themeClass)}\n style={themeStyle as React.CSSProperties}\n >\n {title && (\n <RadixDropdownMenu.Label className=\"proton-MenuTrigger__menu-header\">\n {title}\n </RadixDropdownMenu.Label>\n )}\n {items.map((item) =>\n renderMenuItem({\n item,\n className: themeClass,\n style: themeStyle as React.CSSProperties,\n disabledKeys,\n onClose: () => onOpenChange?.(false),\n })\n )}\n </RadixDropdownMenu.Content>\n </RadixDropdownMenu.Portal>\n </RadixDropdownMenu.Root>\n );\n}\n"],"names":["PopoverMenu","trigger","items","isOpen","onOpenChange","selectedKey","onSelectionChange","disabledKeys","title","themeClass","themeStyle","useTheme","renderMenuItem","props","item","onClose","jsxs","RadixDropdownMenu","csx","jsx","child","_a"],"mappings":"iPAuCO,SAASA,EAAY,CAC1B,QAAAC,EACA,MAAAC,EACA,OAAAC,EACA,aAAAC,EACA,YAAAC,EACA,kBAAAC,EACA,aAAAC,EACA,MAAAC,CACF,EAAqB,CACnB,KAAM,CAAE,UAAWC,EAAY,MAAOC,CAAA,EAAeC,EAAAA,SAAA,EAErD,SAASC,EAAeC,EAAO,CAC7B,KAAM,CAAE,KAAAC,EAAwB,aAAAP,EAAc,QAAAQ,GAAYF,EAE1D,OAAIC,EAAK,UAAYA,EAAK,SAAS,OAAS,EAExCE,yBAACC,EAAAA,aAAkB,IAAlB,CACC,SAAA,CAAAD,EAAAA,kBAAAA,KAACC,EAAAA,aAAkB,WAAlB,CACC,UAAWC,EAAAA,IACT,oBACA,+BAAA,EAGD,SAAA,CAAAJ,EAAK,MACNK,EAAAA,kBAAAA,IAAC,MAAA,CACC,UAAU,8BACV,QAAQ,cACR,MAAO,GACP,OAAQ,GAER,SAAAA,EAAAA,kBAAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,wGAAA,CAAA,CACJ,CAAA,CACF,CAAA,CAAA,EAGFA,EAAAA,kBAAAA,IAACF,EAAAA,aAAkB,WAAlB,CACC,WAAY,EACZ,mBAAiB,OACjB,UAAWC,EAAAA,IAAI,cAAe,0BAA0B,EAEvD,WAAK,SAAS,IAAKE,GAClBR,EAAe,CACb,KAAMQ,EAGN,aAAAb,EACA,QAAAQ,CAAA,CACD,CAAA,CACH,CAAA,CACF,CAAA,EAnC0BD,EAAK,GAoCjC,EAIAE,EAAAA,kBAAAA,KAACC,EAAAA,aAAkB,KAAlB,CACC,UAAWC,EAAAA,IAAI,oBAAqB,+BAA+B,EAEnE,gBAAeb,IAAgBS,EAAK,IACpC,SAAUP,GAAAA,YAAAA,EAAc,SAASO,EAAK,KACtC,SAAU,IAAM,QACdO,EAAAP,EAAK,WAAL,MAAAO,EAAA,KAAAP,EAAgBA,EAAK,KACrBR,GAAA,MAAAA,EAAoBQ,EAAK,KACzBC,GAAA,MAAAA,GACF,EAEA,SAAA,CAAAI,EAAAA,kBAAAA,IAAC,OAAA,CACC,UAAU,4BACV,MAAO,CAAE,SAAU,OAAA,EAElB,SAAAL,EAAK,KAAA,CAAA,EAEPA,EAAK,aACJK,EAAAA,kBAAAA,IAAC,OAAA,CACC,UAAU,kCACV,MAAO,CAAE,SAAU,MAAA,EAElB,SAAAL,EAAK,WAAA,CAAA,CACR,CAAA,EArBGA,EAAK,GAAA,CA0BlB,CAEA,gCACGG,EAAAA,aAAkB,KAAlB,CAAuB,KAAMd,EAAQ,aAAAC,EACpC,SAAA,CAAAe,EAAAA,kBAAAA,IAACF,EAAAA,aAAkB,QAAlB,CAA0B,QAAO,GAAE,SAAAhB,EAAQ,EAC5CkB,EAAAA,kBAAAA,IAACF,EAAAA,aAAkB,OAAlB,CACC,SAAAD,EAAAA,kBAAAA,KAACC,EAAAA,aAAkB,QAAlB,CACC,UAAWC,EAAAA,IAAI,cAAe,2BAA4BT,CAAU,EACpE,MAAOC,EAEN,SAAA,CAAAF,2BACES,EAAAA,aAAkB,MAAlB,CAAwB,UAAU,kCAChC,SAAAT,EACH,EAEDN,EAAM,IAAKY,GACVF,EAAe,CACb,KAAAE,EAGA,aAAAP,EACA,QAAS,IAAMH,GAAA,YAAAA,EAAe,GAAK,CACpC,CAAA,CACH,CAAA,CAAA,CACF,CACF,CAAA,EACF,CAEJ"}
@@ -1,20 +1,20 @@
1
1
  import { j as r } from "../../node_modules/react/jsx-runtime.es.js";
2
2
  import { DropdownMenu as s } from "radix-ui";
3
- import { useTheme as b } from "../ThemeProvider.es.js";
3
+ import { useTheme as M } from "../ThemeProvider.es.js";
4
4
  import { csx as o } from "../../utils/string.es.js";
5
- function v({
6
- trigger: _,
7
- items: h,
8
- isOpen: x,
5
+ function N({
6
+ trigger: d,
7
+ items: p,
8
+ isOpen: _,
9
9
  onOpenChange: t,
10
- selectedKey: g,
10
+ selectedKey: h,
11
11
  onSelectionChange: a,
12
- disabledKeys: j,
13
- title: c
12
+ disabledKeys: x,
13
+ title: u
14
14
  }) {
15
- const { className: u, style: d } = b();
16
- function p(m) {
17
- const { item: e, className: M, style: y, disabledKeys: l, onClose: i } = m;
15
+ const { className: g, style: j } = M();
16
+ function c(m) {
17
+ const { item: e, disabledKeys: i, onClose: n } = m;
18
18
  return e.children && e.children.length > 0 ? /* @__PURE__ */ r.jsxs(s.Sub, { children: [
19
19
  /* @__PURE__ */ r.jsxs(
20
20
  s.SubTrigger,
@@ -51,12 +51,10 @@ function v({
51
51
  "data-has-submenu": "true",
52
52
  className: o("proton-Menu", "proton-MenuTrigger__menu"),
53
53
  children: e.children.map(
54
- (n) => p({
55
- item: n,
56
- className: M,
57
- style: y,
58
- disabledKeys: l,
59
- onClose: i
54
+ (l) => c({
55
+ item: l,
56
+ disabledKeys: i,
57
+ onClose: n
60
58
  })
61
59
  )
62
60
  }
@@ -65,11 +63,11 @@ function v({
65
63
  s.Item,
66
64
  {
67
65
  className: o("proton-Menu__item", "proton-MenuTrigger__menu-item"),
68
- "aria-selected": g === e.key,
69
- disabled: l == null ? void 0 : l.includes(e.key),
66
+ "aria-selected": h === e.key,
67
+ disabled: i == null ? void 0 : i.includes(e.key),
70
68
  onSelect: () => {
71
- var n;
72
- (n = e.onAction) == null || n.call(e, e.key), a == null || a(e.key), i == null || i();
69
+ var l;
70
+ (l = e.onAction) == null || l.call(e, e.key), a == null || a(e.key), n == null || n();
73
71
  },
74
72
  children: [
75
73
  /* @__PURE__ */ r.jsx(
@@ -93,21 +91,19 @@ function v({
93
91
  e.key
94
92
  );
95
93
  }
96
- return /* @__PURE__ */ r.jsxs(s.Root, { open: x, onOpenChange: t, children: [
97
- /* @__PURE__ */ r.jsx(s.Trigger, { asChild: !0, children: _ }),
94
+ return /* @__PURE__ */ r.jsxs(s.Root, { open: _, onOpenChange: t, children: [
95
+ /* @__PURE__ */ r.jsx(s.Trigger, { asChild: !0, children: d }),
98
96
  /* @__PURE__ */ r.jsx(s.Portal, { children: /* @__PURE__ */ r.jsxs(
99
97
  s.Content,
100
98
  {
101
- className: o("proton-Menu", "proton-MenuTrigger__menu", u),
102
- style: d,
99
+ className: o("proton-Menu", "proton-MenuTrigger__menu", g),
100
+ style: j,
103
101
  children: [
104
- c && /* @__PURE__ */ r.jsx(s.Label, { className: "proton-MenuTrigger__menu-header", children: c }),
105
- h.map(
106
- (m) => p({
102
+ u && /* @__PURE__ */ r.jsx(s.Label, { className: "proton-MenuTrigger__menu-header", children: u }),
103
+ p.map(
104
+ (m) => c({
107
105
  item: m,
108
- className: u,
109
- style: d,
110
- disabledKeys: j,
106
+ disabledKeys: x,
111
107
  onClose: () => t == null ? void 0 : t(!1)
112
108
  })
113
109
  )
@@ -117,6 +113,6 @@ function v({
117
113
  ] });
118
114
  }
119
115
  export {
120
- v as PopoverMenu
116
+ N as PopoverMenu
121
117
  };
122
118
  //# sourceMappingURL=PopoverMenu.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PopoverMenu.es.js","sources":["../../../src/components/Menu/PopoverMenu.tsx"],"sourcesContent":["import { DropdownMenu as RadixDropdownMenu } from \"radix-ui\";\r\nimport { useTheme } from \"../ThemeProvider\";\r\nimport { csx } from \"../../utils/string\";\r\nimport { ActionMenuAction } from \"../ActionMenu/ActionMenu\";\r\n\r\nexport interface PopoverMenuProps {\r\n /** The trigger component */\r\n trigger: React.ReactNode;\r\n\r\n /** Array of menu actions/items to display\r\n * - type {@link ActionMenuAction}[]\r\n */\r\n items: ActionMenuAction[];\r\n\r\n /** Whether the menu is open */\r\n isOpen: boolean;\r\n\r\n /** Callback when the menu is opened or closed */\r\n onOpenChange: (open: boolean) => void;\r\n\r\n /** The key of the selected item */\r\n selectedKey: string;\r\n\r\n /** Callback when the selection changes */\r\n onSelectionChange: (key: string) => void;\r\n\r\n /** The keys of the disabled items */\r\n disabledKeys: string[];\r\n\r\n /** The title of the menu */\r\n title: string;\r\n}\r\n\r\n/**\r\n * A component that displays a popover menu.\r\n *\r\n * API:\r\n * - {@link PopoverMenuProps}\r\n */\r\nexport function PopoverMenu({\r\n trigger,\r\n items,\r\n isOpen,\r\n onOpenChange,\r\n selectedKey,\r\n onSelectionChange,\r\n disabledKeys,\r\n title,\r\n}: PopoverMenuProps) {\r\n const { className: themeClass, style: themeStyle } = useTheme();\r\n\r\n function renderMenuItem(props) {\r\n const { item, className, style, disabledKeys, onClose } = props;\r\n\r\n if (item.children && item.children.length > 0) {\r\n return (\r\n <RadixDropdownMenu.Sub key={item.key}>\r\n <RadixDropdownMenu.SubTrigger\r\n className={csx(\r\n \"proton-Menu__item\",\r\n \"proton-MenuTrigger__menu-item\"\r\n )}\r\n >\r\n {item.label}\r\n <svg\r\n className=\"proton-MenuTrigger__chevron\"\r\n viewBox=\"0 0 256 256\"\r\n width={16}\r\n height={12}\r\n >\r\n <path\r\n fill=\"currentColor\"\r\n d=\"m184.49 136.49l-80 80a12 12 0 0 1-17-17L159 128L87.51 56.49a12 12 0 1 1 17-17l80 80a12 12 0 0 1-.02 17\"\r\n />\r\n </svg>\r\n </RadixDropdownMenu.SubTrigger>\r\n\r\n <RadixDropdownMenu.SubContent\r\n sideOffset={8}\r\n data-has-submenu=\"true\"\r\n className={csx(\"proton-Menu\", \"proton-MenuTrigger__menu\")}\r\n >\r\n {item.children.map((child) =>\r\n renderMenuItem({\r\n item: child,\r\n className,\r\n style,\r\n disabledKeys,\r\n onClose,\r\n })\r\n )}\r\n </RadixDropdownMenu.SubContent>\r\n </RadixDropdownMenu.Sub>\r\n );\r\n } else {\r\n return (\r\n <RadixDropdownMenu.Item\r\n className={csx(\"proton-Menu__item\", \"proton-MenuTrigger__menu-item\")}\r\n key={item.key}\r\n aria-selected={selectedKey === item.key}\r\n disabled={disabledKeys?.includes(item.key)}\r\n onSelect={() => {\r\n item.onAction?.(item.key);\r\n onSelectionChange?.(item.key);\r\n onClose?.();\r\n }}\r\n >\r\n <span\r\n className=\"proton-MenuTrigger__label\"\r\n style={{ gridArea: \"label\" }}\r\n >\r\n {item.label}\r\n </span>\r\n {item.description && (\r\n <span\r\n className=\"proton-MenuTrigger__description\"\r\n style={{ gridArea: \"desc\" }}\r\n >\r\n {item.description}\r\n </span>\r\n )}\r\n </RadixDropdownMenu.Item>\r\n );\r\n }\r\n }\r\n\r\n return (\r\n <RadixDropdownMenu.Root open={isOpen} onOpenChange={onOpenChange}>\r\n <RadixDropdownMenu.Trigger asChild>{trigger}</RadixDropdownMenu.Trigger>\r\n <RadixDropdownMenu.Portal>\r\n <RadixDropdownMenu.Content\r\n className={csx(\"proton-Menu\", \"proton-MenuTrigger__menu\", themeClass)}\r\n style={themeStyle as React.CSSProperties}\r\n >\r\n {title && (\r\n <RadixDropdownMenu.Label className=\"proton-MenuTrigger__menu-header\">\r\n {title}\r\n </RadixDropdownMenu.Label>\r\n )}\r\n {items.map((item) =>\r\n renderMenuItem({\r\n item,\r\n className: themeClass,\r\n style: themeStyle as React.CSSProperties,\r\n disabledKeys,\r\n onClose: () => onOpenChange?.(false),\r\n })\r\n )}\r\n </RadixDropdownMenu.Content>\r\n </RadixDropdownMenu.Portal>\r\n </RadixDropdownMenu.Root>\r\n );\r\n}\r\n"],"names":["PopoverMenu","trigger","items","isOpen","onOpenChange","selectedKey","onSelectionChange","disabledKeys","title","themeClass","themeStyle","useTheme","renderMenuItem","props","item","className","style","onClose","jsxs","RadixDropdownMenu","csx","jsx","child","_a"],"mappings":"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"}
1
+ {"version":3,"file":"PopoverMenu.es.js","sources":["../../../src/components/Menu/PopoverMenu.tsx"],"sourcesContent":["import { DropdownMenu as RadixDropdownMenu } from \"radix-ui\";\nimport { useTheme } from \"../ThemeProvider\";\nimport { csx } from \"../../utils/string\";\nimport { ActionMenuAction } from \"../ActionMenu/ActionMenu\";\n\nexport interface PopoverMenuProps {\n /** The trigger component */\n trigger: React.ReactNode;\n\n /** Array of menu actions/items to display\n * - type {@link ActionMenuAction}[]\n */\n items: ActionMenuAction[];\n\n /** Whether the menu is open */\n isOpen: boolean;\n\n /** Callback when the menu is opened or closed */\n onOpenChange: (open: boolean) => void;\n\n /** The key of the selected item */\n selectedKey: string;\n\n /** Callback when the selection changes */\n onSelectionChange: (key: string) => void;\n\n /** The keys of the disabled items */\n disabledKeys: string[];\n\n /** The title of the menu */\n title: string;\n}\n\n/**\n * A component that displays a popover menu.\n *\n * API:\n * - {@link PopoverMenuProps}\n */\nexport function PopoverMenu({\n trigger,\n items,\n isOpen,\n onOpenChange,\n selectedKey,\n onSelectionChange,\n disabledKeys,\n title,\n}: PopoverMenuProps) {\n const { className: themeClass, style: themeStyle } = useTheme();\n\n function renderMenuItem(props) {\n const { item, className, style, disabledKeys, onClose } = props;\n\n if (item.children && item.children.length > 0) {\n return (\n <RadixDropdownMenu.Sub key={item.key}>\n <RadixDropdownMenu.SubTrigger\n className={csx(\n \"proton-Menu__item\",\n \"proton-MenuTrigger__menu-item\"\n )}\n >\n {item.label}\n <svg\n className=\"proton-MenuTrigger__chevron\"\n viewBox=\"0 0 256 256\"\n width={16}\n height={12}\n >\n <path\n fill=\"currentColor\"\n d=\"m184.49 136.49l-80 80a12 12 0 0 1-17-17L159 128L87.51 56.49a12 12 0 1 1 17-17l80 80a12 12 0 0 1-.02 17\"\n />\n </svg>\n </RadixDropdownMenu.SubTrigger>\n\n <RadixDropdownMenu.SubContent\n sideOffset={8}\n data-has-submenu=\"true\"\n className={csx(\"proton-Menu\", \"proton-MenuTrigger__menu\")}\n >\n {item.children.map((child) =>\n renderMenuItem({\n item: child,\n className,\n style,\n disabledKeys,\n onClose,\n })\n )}\n </RadixDropdownMenu.SubContent>\n </RadixDropdownMenu.Sub>\n );\n } else {\n return (\n <RadixDropdownMenu.Item\n className={csx(\"proton-Menu__item\", \"proton-MenuTrigger__menu-item\")}\n key={item.key}\n aria-selected={selectedKey === item.key}\n disabled={disabledKeys?.includes(item.key)}\n onSelect={() => {\n item.onAction?.(item.key);\n onSelectionChange?.(item.key);\n onClose?.();\n }}\n >\n <span\n className=\"proton-MenuTrigger__label\"\n style={{ gridArea: \"label\" }}\n >\n {item.label}\n </span>\n {item.description && (\n <span\n className=\"proton-MenuTrigger__description\"\n style={{ gridArea: \"desc\" }}\n >\n {item.description}\n </span>\n )}\n </RadixDropdownMenu.Item>\n );\n }\n }\n\n return (\n <RadixDropdownMenu.Root open={isOpen} onOpenChange={onOpenChange}>\n <RadixDropdownMenu.Trigger asChild>{trigger}</RadixDropdownMenu.Trigger>\n <RadixDropdownMenu.Portal>\n <RadixDropdownMenu.Content\n className={csx(\"proton-Menu\", \"proton-MenuTrigger__menu\", themeClass)}\n style={themeStyle as React.CSSProperties}\n >\n {title && (\n <RadixDropdownMenu.Label className=\"proton-MenuTrigger__menu-header\">\n {title}\n </RadixDropdownMenu.Label>\n )}\n {items.map((item) =>\n renderMenuItem({\n item,\n className: themeClass,\n style: themeStyle as React.CSSProperties,\n disabledKeys,\n onClose: () => onOpenChange?.(false),\n })\n )}\n </RadixDropdownMenu.Content>\n </RadixDropdownMenu.Portal>\n </RadixDropdownMenu.Root>\n );\n}\n"],"names":["PopoverMenu","trigger","items","isOpen","onOpenChange","selectedKey","onSelectionChange","disabledKeys","title","themeClass","themeStyle","useTheme","renderMenuItem","props","item","onClose","jsxs","RadixDropdownMenu","csx","jsx","child","_a"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.cjs.js","sources":["../../../src/components/Modal/Modal.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useButton } from \"@react-aria/button\";\r\nimport { useDialog } from \"@react-aria/dialog\";\r\nimport { FocusScope } from \"@react-aria/focus\";\r\nimport { useModalOverlay, usePreventScroll } from \"@react-aria/overlays\";\r\nimport { mergeProps } from \"@react-aria/utils\";\r\nimport { useRef } from \"react\";\r\nimport { useOverlayTriggerState } from \"@react-stately/overlays\";\r\nimport { BREAKPOINTS } from \"../../constants\";\r\nimport { useBreakpoint } from \"../../hooks\";\r\nimport { useIsClosing } from \"../../hooks/useIsClosing\";\r\nimport { csx } from \"../../utils\";\r\nimport { Button, ButtonProps } from \"../Button/Button\";\r\nimport \"./Modal.css\";\r\nimport { ScreenOverlay } from \"../ScreenOverlay/ScreenOverlay\";\r\n\r\nconst ModalTitle = ({ children }: { children: React.ReactNode }) => {\r\n return <h2 className=\"proton-Modal__title\">{children}</h2>;\r\n};\r\n\r\nconst ModalSubtitle = ({ children }: { children: React.ReactNode }) => {\r\n return <h3 className=\"proton-Modal__subtitle\">{children}</h3>;\r\n};\r\n\r\nconst ModalBody = ({ children }: { children: React.ReactNode }) => {\r\n return <div className=\"proton-Modal__body\">{children}</div>;\r\n};\r\n\r\nconst ModalAction = (buttonProps: ButtonProps) => {\r\n return (\r\n <div className=\"proton-Modal__action\">\r\n <Button {...buttonProps} />\r\n </div>\r\n );\r\n};\r\n\r\nconst ModalActions = ({ children }: { children: React.ReactNode }) => {\r\n return (\r\n <FocusScope autoFocus>\r\n <div className=\"proton-Modal__actions\">{children}</div>\r\n </FocusScope>\r\n );\r\n};\r\n\r\nconst ModalContent = ({\r\n title,\r\n subtitle,\r\n body,\r\n onClose,\r\n children,\r\n isClosing,\r\n \"data-testid\": dataTestId,\r\n}: ModalProps & {\r\n isClosing: boolean;\r\n}) => {\r\n const ref = useRef<HTMLDivElement>(null);\r\n const state = useOverlayTriggerState({ isOpen: true, onOpenChange: onClose });\r\n const { modalProps } = useModalOverlay(\r\n {\r\n isDismissable: false, //handle dismiss behavior in useIsClosing\r\n },\r\n state,\r\n ref\r\n );\r\n\r\n const { dialogProps } = useDialog({ role: \"dialog\" }, ref);\r\n usePreventScroll();\r\n\r\n const closeButtonRef = useRef<HTMLButtonElement>(null);\r\n const { buttonProps: closeButtonProps } = useButton(\r\n {\r\n onPress: onClose,\r\n \"aria-label\": \"Close\",\r\n },\r\n closeButtonRef\r\n );\r\n\r\n return (\r\n <FocusScope contain restoreFocus autoFocus>\r\n <div\r\n data-testid={dataTestId}\r\n className={csx(\"proton-Modal\", isClosing && \"proton-Modal--closing\")}\r\n {...mergeProps(modalProps, dialogProps)}\r\n ref={ref}\r\n >\r\n <button\r\n name=\"Close\"\r\n className=\"proton-Modal__close-button\"\r\n {...closeButtonProps}\r\n ref={closeButtonRef}\r\n >\r\n ×\r\n </button>\r\n {title && <ModalTitle>{title}</ModalTitle>}\r\n {subtitle && <ModalSubtitle>{subtitle}</ModalSubtitle>}\r\n {body && <ModalBody>{body}</ModalBody>}\r\n <div className=\"proton-Modal__content\">{children}</div>\r\n </div>\r\n </FocusScope>\r\n );\r\n};\r\n\r\nexport interface ModalProps {\r\n /**\r\n * Optional body text content for the modal\r\n * */\r\n body?: string;\r\n /**\r\n * Content to render inside the modal\r\n * */\r\n children: React.ReactNode;\r\n /**\r\n * data-testid for the modal\r\n * */\r\n \"data-testid\"?: string;\r\n /**\r\n * Controls the visibility of the modal\r\n * */\r\n isOpen: boolean;\r\n /**\r\n * Whether to show the modal with an overlay background.\r\n * @default true\r\n * */\r\n isOverlay?: boolean;\r\n /**\r\n * Callback function when modal is closed\r\n * */\r\n onClose?: () => void;\r\n /**\r\n * Optional subtitle text below the modal title\r\n * */\r\n subtitle?: string;\r\n /**\r\n * Optional title text for the modal header\r\n * */\r\n title?: string;\r\n}\r\n\r\n/**\r\n * Modal component with overlay support and responsive behavior.\r\n *\r\n * API:\r\n * - {@link ModalProps}\r\n */\r\nconst ModalWrapper = ({\r\n isOpen,\r\n onClose,\r\n title,\r\n subtitle,\r\n body,\r\n children,\r\n isOverlay = true,\r\n \"data-testid\": dataTestId,\r\n}: ModalProps) => {\r\n const overlayRef = useRef<HTMLDivElement>(null);\r\n const { isClosing, handleClose } = useIsClosing({\r\n onClose,\r\n overlayRef,\r\n });\r\n const isMobile = useBreakpoint(BREAKPOINTS.MEDIUM);\r\n\r\n if (!isOpen) return null;\r\n\r\n const modalContent = (\r\n <ModalContent\r\n isOpen={isOpen}\r\n title={title}\r\n subtitle={subtitle}\r\n body={body}\r\n onClose={handleClose}\r\n isClosing={isClosing}\r\n data-testid={dataTestId}\r\n >\r\n {children}\r\n </ModalContent>\r\n );\r\n\r\n return isOverlay || isMobile ? (\r\n <ScreenOverlay fadeIn ref={overlayRef} onClose={handleClose}>\r\n {modalContent}\r\n </ScreenOverlay>\r\n ) : (\r\n modalContent\r\n );\r\n};\r\n\r\nexport const Modal = Object.assign(ModalWrapper, {\r\n /**\r\n * Renders a h2 styled title\r\n * */\r\n Title: ModalTitle,\r\n /**\r\n * Renders a h3 styled subtitle\r\n * */\r\n Subtitle: ModalSubtitle,\r\n /**\r\n * Renders a div styled body\r\n * */\r\n Body: ModalBody,\r\n /**\r\n * Renders a Proton Button action\r\n * - @prop buttonProps {@link ButtonProps}\r\n * */\r\n Action: ModalAction,\r\n /**\r\n * Renders a group of Proton Buttons\r\n * */\r\n Actions: ModalActions,\r\n});\r\n"],"names":["ModalTitle","children","jsx","ModalSubtitle","ModalBody","ModalAction","buttonProps","Button","ModalActions","FocusScope","ModalContent","title","subtitle","body","onClose","isClosing","dataTestId","ref","useRef","state","useOverlayTriggerState","modalProps","useModalOverlay","dialogProps","useDialog","usePreventScroll","closeButtonRef","closeButtonProps","useButton","jsxs","csx","mergeProps","ModalWrapper","isOpen","isOverlay","overlayRef","handleClose","useIsClosing","isMobile","useBreakpoint","BREAKPOINTS","modalContent","ScreenOverlay","Modal"],"mappings":"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"}
1
+ {"version":3,"file":"Modal.cjs.js","sources":["../../../src/components/Modal/Modal.tsx"],"sourcesContent":["\"use client\";\n\nimport { useButton } from \"@react-aria/button\";\nimport { useDialog } from \"@react-aria/dialog\";\nimport { FocusScope } from \"@react-aria/focus\";\nimport { useModalOverlay, usePreventScroll } from \"@react-aria/overlays\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { useRef } from \"react\";\nimport { useOverlayTriggerState } from \"@react-stately/overlays\";\nimport { BREAKPOINTS } from \"../../constants\";\nimport { useBreakpoint } from \"../../hooks\";\nimport { useIsClosing } from \"../../hooks/useIsClosing\";\nimport { csx } from \"../../utils\";\nimport { Button, ButtonProps } from \"../Button/Button\";\nimport \"./Modal.css\";\nimport { ScreenOverlay } from \"../ScreenOverlay/ScreenOverlay\";\n\nconst ModalTitle = ({ children }: { children: React.ReactNode }) => {\n return <h2 className=\"proton-Modal__title\">{children}</h2>;\n};\n\nconst ModalSubtitle = ({ children }: { children: React.ReactNode }) => {\n return <h3 className=\"proton-Modal__subtitle\">{children}</h3>;\n};\n\nconst ModalBody = ({ children }: { children: React.ReactNode }) => {\n return <div className=\"proton-Modal__body\">{children}</div>;\n};\n\nconst ModalAction = (buttonProps: ButtonProps) => {\n return (\n <div className=\"proton-Modal__action\">\n <Button {...buttonProps} />\n </div>\n );\n};\n\nconst ModalActions = ({ children }: { children: React.ReactNode }) => {\n return (\n <FocusScope autoFocus>\n <div className=\"proton-Modal__actions\">{children}</div>\n </FocusScope>\n );\n};\n\nconst ModalContent = ({\n title,\n subtitle,\n body,\n onClose,\n children,\n isClosing,\n \"data-testid\": dataTestId,\n}: ModalProps & {\n isClosing: boolean;\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const state = useOverlayTriggerState({ isOpen: true, onOpenChange: onClose });\n const { modalProps } = useModalOverlay(\n {\n isDismissable: false, //handle dismiss behavior in useIsClosing\n },\n state,\n ref\n );\n\n const { dialogProps } = useDialog({ role: \"dialog\" }, ref);\n usePreventScroll();\n\n const closeButtonRef = useRef<HTMLButtonElement>(null);\n const { buttonProps: closeButtonProps } = useButton(\n {\n onPress: onClose,\n \"aria-label\": \"Close\",\n },\n closeButtonRef\n );\n\n return (\n <FocusScope contain restoreFocus autoFocus>\n <div\n data-testid={dataTestId}\n className={csx(\"proton-Modal\", isClosing && \"proton-Modal--closing\")}\n {...mergeProps(modalProps, dialogProps)}\n ref={ref}\n >\n <button\n name=\"Close\"\n className=\"proton-Modal__close-button\"\n {...closeButtonProps}\n ref={closeButtonRef}\n >\n ×\n </button>\n {title && <ModalTitle>{title}</ModalTitle>}\n {subtitle && <ModalSubtitle>{subtitle}</ModalSubtitle>}\n {body && <ModalBody>{body}</ModalBody>}\n <div className=\"proton-Modal__content\">{children}</div>\n </div>\n </FocusScope>\n );\n};\n\nexport interface ModalProps {\n /**\n * Optional body text content for the modal\n * */\n body?: string;\n /**\n * Content to render inside the modal\n * */\n children: React.ReactNode;\n /**\n * data-testid for the modal\n * */\n \"data-testid\"?: string;\n /**\n * Controls the visibility of the modal\n * */\n isOpen: boolean;\n /**\n * Whether to show the modal with an overlay background.\n * @default true\n * */\n isOverlay?: boolean;\n /**\n * Callback function when modal is closed\n * */\n onClose?: () => void;\n /**\n * Optional subtitle text below the modal title\n * */\n subtitle?: string;\n /**\n * Optional title text for the modal header\n * */\n title?: string;\n}\n\n/**\n * Modal component with overlay support and responsive behavior.\n *\n * API:\n * - {@link ModalProps}\n */\nconst ModalWrapper = ({\n isOpen,\n onClose,\n title,\n subtitle,\n body,\n children,\n isOverlay = true,\n \"data-testid\": dataTestId,\n}: ModalProps) => {\n const overlayRef = useRef<HTMLDivElement>(null);\n const { isClosing, handleClose } = useIsClosing({\n onClose,\n overlayRef,\n });\n const isMobile = useBreakpoint(BREAKPOINTS.MEDIUM);\n\n if (!isOpen) return null;\n\n const modalContent = (\n <ModalContent\n isOpen={isOpen}\n title={title}\n subtitle={subtitle}\n body={body}\n onClose={handleClose}\n isClosing={isClosing}\n data-testid={dataTestId}\n >\n {children}\n </ModalContent>\n );\n\n return isOverlay || isMobile ? (\n <ScreenOverlay fadeIn ref={overlayRef} onClose={handleClose}>\n {modalContent}\n </ScreenOverlay>\n ) : (\n modalContent\n );\n};\n\nexport const Modal = Object.assign(ModalWrapper, {\n /**\n * Renders a h2 styled title\n * */\n Title: ModalTitle,\n /**\n * Renders a h3 styled subtitle\n * */\n Subtitle: ModalSubtitle,\n /**\n * Renders a div styled body\n * */\n Body: ModalBody,\n /**\n * Renders a Proton Button action\n * - @prop buttonProps {@link ButtonProps}\n * */\n Action: ModalAction,\n /**\n * Renders a group of Proton Buttons\n * */\n Actions: ModalActions,\n});\n"],"names":["ModalTitle","children","jsx","ModalSubtitle","ModalBody","ModalAction","buttonProps","Button","ModalActions","FocusScope","ModalContent","title","subtitle","body","onClose","isClosing","dataTestId","ref","useRef","state","useOverlayTriggerState","modalProps","useModalOverlay","dialogProps","useDialog","usePreventScroll","closeButtonRef","closeButtonProps","useButton","jsxs","csx","mergeProps","ModalWrapper","isOpen","isOverlay","overlayRef","handleClose","useIsClosing","isMobile","useBreakpoint","BREAKPOINTS","modalContent","ScreenOverlay","Modal"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.es.js","sources":["../../../src/components/Modal/Modal.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useButton } from \"@react-aria/button\";\r\nimport { useDialog } from \"@react-aria/dialog\";\r\nimport { FocusScope } from \"@react-aria/focus\";\r\nimport { useModalOverlay, usePreventScroll } from \"@react-aria/overlays\";\r\nimport { mergeProps } from \"@react-aria/utils\";\r\nimport { useRef } from \"react\";\r\nimport { useOverlayTriggerState } from \"@react-stately/overlays\";\r\nimport { BREAKPOINTS } from \"../../constants\";\r\nimport { useBreakpoint } from \"../../hooks\";\r\nimport { useIsClosing } from \"../../hooks/useIsClosing\";\r\nimport { csx } from \"../../utils\";\r\nimport { Button, ButtonProps } from \"../Button/Button\";\r\nimport \"./Modal.css\";\r\nimport { ScreenOverlay } from \"../ScreenOverlay/ScreenOverlay\";\r\n\r\nconst ModalTitle = ({ children }: { children: React.ReactNode }) => {\r\n return <h2 className=\"proton-Modal__title\">{children}</h2>;\r\n};\r\n\r\nconst ModalSubtitle = ({ children }: { children: React.ReactNode }) => {\r\n return <h3 className=\"proton-Modal__subtitle\">{children}</h3>;\r\n};\r\n\r\nconst ModalBody = ({ children }: { children: React.ReactNode }) => {\r\n return <div className=\"proton-Modal__body\">{children}</div>;\r\n};\r\n\r\nconst ModalAction = (buttonProps: ButtonProps) => {\r\n return (\r\n <div className=\"proton-Modal__action\">\r\n <Button {...buttonProps} />\r\n </div>\r\n );\r\n};\r\n\r\nconst ModalActions = ({ children }: { children: React.ReactNode }) => {\r\n return (\r\n <FocusScope autoFocus>\r\n <div className=\"proton-Modal__actions\">{children}</div>\r\n </FocusScope>\r\n );\r\n};\r\n\r\nconst ModalContent = ({\r\n title,\r\n subtitle,\r\n body,\r\n onClose,\r\n children,\r\n isClosing,\r\n \"data-testid\": dataTestId,\r\n}: ModalProps & {\r\n isClosing: boolean;\r\n}) => {\r\n const ref = useRef<HTMLDivElement>(null);\r\n const state = useOverlayTriggerState({ isOpen: true, onOpenChange: onClose });\r\n const { modalProps } = useModalOverlay(\r\n {\r\n isDismissable: false, //handle dismiss behavior in useIsClosing\r\n },\r\n state,\r\n ref\r\n );\r\n\r\n const { dialogProps } = useDialog({ role: \"dialog\" }, ref);\r\n usePreventScroll();\r\n\r\n const closeButtonRef = useRef<HTMLButtonElement>(null);\r\n const { buttonProps: closeButtonProps } = useButton(\r\n {\r\n onPress: onClose,\r\n \"aria-label\": \"Close\",\r\n },\r\n closeButtonRef\r\n );\r\n\r\n return (\r\n <FocusScope contain restoreFocus autoFocus>\r\n <div\r\n data-testid={dataTestId}\r\n className={csx(\"proton-Modal\", isClosing && \"proton-Modal--closing\")}\r\n {...mergeProps(modalProps, dialogProps)}\r\n ref={ref}\r\n >\r\n <button\r\n name=\"Close\"\r\n className=\"proton-Modal__close-button\"\r\n {...closeButtonProps}\r\n ref={closeButtonRef}\r\n >\r\n ×\r\n </button>\r\n {title && <ModalTitle>{title}</ModalTitle>}\r\n {subtitle && <ModalSubtitle>{subtitle}</ModalSubtitle>}\r\n {body && <ModalBody>{body}</ModalBody>}\r\n <div className=\"proton-Modal__content\">{children}</div>\r\n </div>\r\n </FocusScope>\r\n );\r\n};\r\n\r\nexport interface ModalProps {\r\n /**\r\n * Optional body text content for the modal\r\n * */\r\n body?: string;\r\n /**\r\n * Content to render inside the modal\r\n * */\r\n children: React.ReactNode;\r\n /**\r\n * data-testid for the modal\r\n * */\r\n \"data-testid\"?: string;\r\n /**\r\n * Controls the visibility of the modal\r\n * */\r\n isOpen: boolean;\r\n /**\r\n * Whether to show the modal with an overlay background.\r\n * @default true\r\n * */\r\n isOverlay?: boolean;\r\n /**\r\n * Callback function when modal is closed\r\n * */\r\n onClose?: () => void;\r\n /**\r\n * Optional subtitle text below the modal title\r\n * */\r\n subtitle?: string;\r\n /**\r\n * Optional title text for the modal header\r\n * */\r\n title?: string;\r\n}\r\n\r\n/**\r\n * Modal component with overlay support and responsive behavior.\r\n *\r\n * API:\r\n * - {@link ModalProps}\r\n */\r\nconst ModalWrapper = ({\r\n isOpen,\r\n onClose,\r\n title,\r\n subtitle,\r\n body,\r\n children,\r\n isOverlay = true,\r\n \"data-testid\": dataTestId,\r\n}: ModalProps) => {\r\n const overlayRef = useRef<HTMLDivElement>(null);\r\n const { isClosing, handleClose } = useIsClosing({\r\n onClose,\r\n overlayRef,\r\n });\r\n const isMobile = useBreakpoint(BREAKPOINTS.MEDIUM);\r\n\r\n if (!isOpen) return null;\r\n\r\n const modalContent = (\r\n <ModalContent\r\n isOpen={isOpen}\r\n title={title}\r\n subtitle={subtitle}\r\n body={body}\r\n onClose={handleClose}\r\n isClosing={isClosing}\r\n data-testid={dataTestId}\r\n >\r\n {children}\r\n </ModalContent>\r\n );\r\n\r\n return isOverlay || isMobile ? (\r\n <ScreenOverlay fadeIn ref={overlayRef} onClose={handleClose}>\r\n {modalContent}\r\n </ScreenOverlay>\r\n ) : (\r\n modalContent\r\n );\r\n};\r\n\r\nexport const Modal = Object.assign(ModalWrapper, {\r\n /**\r\n * Renders a h2 styled title\r\n * */\r\n Title: ModalTitle,\r\n /**\r\n * Renders a h3 styled subtitle\r\n * */\r\n Subtitle: ModalSubtitle,\r\n /**\r\n * Renders a div styled body\r\n * */\r\n Body: ModalBody,\r\n /**\r\n * Renders a Proton Button action\r\n * - @prop buttonProps {@link ButtonProps}\r\n * */\r\n Action: ModalAction,\r\n /**\r\n * Renders a group of Proton Buttons\r\n * */\r\n Actions: ModalActions,\r\n});\r\n"],"names":["ModalTitle","children","jsx","ModalSubtitle","ModalBody","ModalAction","buttonProps","Button","ModalActions","FocusScope","ModalContent","title","subtitle","body","onClose","isClosing","dataTestId","ref","useRef","state","useOverlayTriggerState","modalProps","useModalOverlay","dialogProps","useDialog","usePreventScroll","closeButtonRef","closeButtonProps","useButton","jsxs","csx","mergeProps","ModalWrapper","isOpen","isOverlay","overlayRef","handleClose","useIsClosing","isMobile","useBreakpoint","BREAKPOINTS","modalContent","ScreenOverlay","Modal"],"mappings":"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"}
1
+ {"version":3,"file":"Modal.es.js","sources":["../../../src/components/Modal/Modal.tsx"],"sourcesContent":["\"use client\";\n\nimport { useButton } from \"@react-aria/button\";\nimport { useDialog } from \"@react-aria/dialog\";\nimport { FocusScope } from \"@react-aria/focus\";\nimport { useModalOverlay, usePreventScroll } from \"@react-aria/overlays\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { useRef } from \"react\";\nimport { useOverlayTriggerState } from \"@react-stately/overlays\";\nimport { BREAKPOINTS } from \"../../constants\";\nimport { useBreakpoint } from \"../../hooks\";\nimport { useIsClosing } from \"../../hooks/useIsClosing\";\nimport { csx } from \"../../utils\";\nimport { Button, ButtonProps } from \"../Button/Button\";\nimport \"./Modal.css\";\nimport { ScreenOverlay } from \"../ScreenOverlay/ScreenOverlay\";\n\nconst ModalTitle = ({ children }: { children: React.ReactNode }) => {\n return <h2 className=\"proton-Modal__title\">{children}</h2>;\n};\n\nconst ModalSubtitle = ({ children }: { children: React.ReactNode }) => {\n return <h3 className=\"proton-Modal__subtitle\">{children}</h3>;\n};\n\nconst ModalBody = ({ children }: { children: React.ReactNode }) => {\n return <div className=\"proton-Modal__body\">{children}</div>;\n};\n\nconst ModalAction = (buttonProps: ButtonProps) => {\n return (\n <div className=\"proton-Modal__action\">\n <Button {...buttonProps} />\n </div>\n );\n};\n\nconst ModalActions = ({ children }: { children: React.ReactNode }) => {\n return (\n <FocusScope autoFocus>\n <div className=\"proton-Modal__actions\">{children}</div>\n </FocusScope>\n );\n};\n\nconst ModalContent = ({\n title,\n subtitle,\n body,\n onClose,\n children,\n isClosing,\n \"data-testid\": dataTestId,\n}: ModalProps & {\n isClosing: boolean;\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const state = useOverlayTriggerState({ isOpen: true, onOpenChange: onClose });\n const { modalProps } = useModalOverlay(\n {\n isDismissable: false, //handle dismiss behavior in useIsClosing\n },\n state,\n ref\n );\n\n const { dialogProps } = useDialog({ role: \"dialog\" }, ref);\n usePreventScroll();\n\n const closeButtonRef = useRef<HTMLButtonElement>(null);\n const { buttonProps: closeButtonProps } = useButton(\n {\n onPress: onClose,\n \"aria-label\": \"Close\",\n },\n closeButtonRef\n );\n\n return (\n <FocusScope contain restoreFocus autoFocus>\n <div\n data-testid={dataTestId}\n className={csx(\"proton-Modal\", isClosing && \"proton-Modal--closing\")}\n {...mergeProps(modalProps, dialogProps)}\n ref={ref}\n >\n <button\n name=\"Close\"\n className=\"proton-Modal__close-button\"\n {...closeButtonProps}\n ref={closeButtonRef}\n >\n ×\n </button>\n {title && <ModalTitle>{title}</ModalTitle>}\n {subtitle && <ModalSubtitle>{subtitle}</ModalSubtitle>}\n {body && <ModalBody>{body}</ModalBody>}\n <div className=\"proton-Modal__content\">{children}</div>\n </div>\n </FocusScope>\n );\n};\n\nexport interface ModalProps {\n /**\n * Optional body text content for the modal\n * */\n body?: string;\n /**\n * Content to render inside the modal\n * */\n children: React.ReactNode;\n /**\n * data-testid for the modal\n * */\n \"data-testid\"?: string;\n /**\n * Controls the visibility of the modal\n * */\n isOpen: boolean;\n /**\n * Whether to show the modal with an overlay background.\n * @default true\n * */\n isOverlay?: boolean;\n /**\n * Callback function when modal is closed\n * */\n onClose?: () => void;\n /**\n * Optional subtitle text below the modal title\n * */\n subtitle?: string;\n /**\n * Optional title text for the modal header\n * */\n title?: string;\n}\n\n/**\n * Modal component with overlay support and responsive behavior.\n *\n * API:\n * - {@link ModalProps}\n */\nconst ModalWrapper = ({\n isOpen,\n onClose,\n title,\n subtitle,\n body,\n children,\n isOverlay = true,\n \"data-testid\": dataTestId,\n}: ModalProps) => {\n const overlayRef = useRef<HTMLDivElement>(null);\n const { isClosing, handleClose } = useIsClosing({\n onClose,\n overlayRef,\n });\n const isMobile = useBreakpoint(BREAKPOINTS.MEDIUM);\n\n if (!isOpen) return null;\n\n const modalContent = (\n <ModalContent\n isOpen={isOpen}\n title={title}\n subtitle={subtitle}\n body={body}\n onClose={handleClose}\n isClosing={isClosing}\n data-testid={dataTestId}\n >\n {children}\n </ModalContent>\n );\n\n return isOverlay || isMobile ? (\n <ScreenOverlay fadeIn ref={overlayRef} onClose={handleClose}>\n {modalContent}\n </ScreenOverlay>\n ) : (\n modalContent\n );\n};\n\nexport const Modal = Object.assign(ModalWrapper, {\n /**\n * Renders a h2 styled title\n * */\n Title: ModalTitle,\n /**\n * Renders a h3 styled subtitle\n * */\n Subtitle: ModalSubtitle,\n /**\n * Renders a div styled body\n * */\n Body: ModalBody,\n /**\n * Renders a Proton Button action\n * - @prop buttonProps {@link ButtonProps}\n * */\n Action: ModalAction,\n /**\n * Renders a group of Proton Buttons\n * */\n Actions: ModalActions,\n});\n"],"names":["ModalTitle","children","jsx","ModalSubtitle","ModalBody","ModalAction","buttonProps","Button","ModalActions","FocusScope","ModalContent","title","subtitle","body","onClose","isClosing","dataTestId","ref","useRef","state","useOverlayTriggerState","modalProps","useModalOverlay","dialogProps","useDialog","usePreventScroll","closeButtonRef","closeButtonProps","useButton","jsxs","csx","mergeProps","ModalWrapper","isOpen","isOverlay","overlayRef","handleClose","useIsClosing","isMobile","useBreakpoint","BREAKPOINTS","modalContent","ScreenOverlay","Modal"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Popover.cjs.js","sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { Popover as RadixPopover } from \"radix-ui\";\r\nimport React, { CSSProperties } from \"react\";\r\nimport \"./Popover.css\";\r\nimport { useTheme } from \"../ThemeProvider\";\r\nimport { csx } from \"../../utils/string\";\r\n\r\nexport type PopoverSide = \"top\" | \"right\" | \"bottom\" | \"left\";\r\nexport type PopoverAlign = \"start\" | \"center\" | \"end\";\r\n\r\nexport interface PopoverProps {\r\n /**\r\n * The trigger element for the popover.\r\n */\r\n trigger: React.ReactNode;\r\n /**\r\n * The content of the popover.\r\n */\r\n children: React.ReactNode;\r\n /**\r\n * Constrain the width of the popover to the width of the trigger.\r\n */\r\n constrainWidth?: boolean;\r\n /**\r\n * Control open state (controlled mode).\r\n */\r\n open?: boolean;\r\n /**\r\n * Default open state (uncontrolled mode).\r\n */\r\n defaultOpen?: boolean;\r\n /**\r\n * Callback when open state changes.\r\n */\r\n onOpenChange?: (open: boolean) => void;\r\n /**\r\n * Popover side placement\r\n * {@link PopoverSide}\r\n */\r\n side?: PopoverSide;\r\n /**\r\n * Popover alignment\r\n * {@link PopoverAlign}\r\n */\r\n align?: PopoverAlign;\r\n /**\r\n * Show an arrow pointing to the trigger.\r\n */\r\n arrow?: boolean;\r\n /**\r\n * Test id for the popover content.\r\n */\r\n \"data-testid\"?: string;\r\n}\r\n\r\n/**\r\n * A popover component that handles positioning and supports controlled and uncontrolled modes.\r\n *\r\n * A popover displays interactive content in context with a trigger element.\r\n * A tooltip displays a description of an element on hover or focus.\r\n *\r\n * API:\r\n * - {@link PopoverProps}\r\n */\r\nexport function Popover({\r\n trigger,\r\n children,\r\n open,\r\n defaultOpen,\r\n onOpenChange,\r\n side = \"top\",\r\n align = \"center\",\r\n arrow = false,\r\n constrainWidth = false,\r\n \"data-testid\": testId,\r\n}: PopoverProps) {\r\n const { className: themeClass, style: themeStyle } = useTheme();\r\n\r\n return (\r\n <RadixPopover.Root\r\n open={open}\r\n defaultOpen={defaultOpen}\r\n onOpenChange={onOpenChange}\r\n >\r\n <RadixPopover.Trigger asChild>\r\n <div>{trigger}</div>\r\n </RadixPopover.Trigger>\r\n\r\n <RadixPopover.Portal>\r\n <RadixPopover.Content\r\n side={side}\r\n sideOffset={2}\r\n align={align}\r\n style={themeStyle as CSSProperties}\r\n className={csx(\r\n \"proton-Popover\",\r\n constrainWidth && \"proton-Popover__constrained\",\r\n themeClass\r\n )}\r\n data-testid={testId}\r\n >\r\n {arrow && <RadixPopover.Arrow className=\"arrow\" />}\r\n {children}\r\n </RadixPopover.Content>\r\n </RadixPopover.Portal>\r\n </RadixPopover.Root>\r\n );\r\n}\r\n\r\nPopover.displayName = \"Popover\";\r\n"],"names":["Popover","trigger","children","open","defaultOpen","onOpenChange","side","align","arrow","constrainWidth","testId","themeClass","themeStyle","useTheme","jsxs","RadixPopover","jsx","csx"],"mappings":"uRAiEO,SAASA,EAAQ,CACtB,QAAAC,EACA,SAAAC,EACA,KAAAC,EACA,YAAAC,EACA,aAAAC,EACA,KAAAC,EAAO,MACP,MAAAC,EAAQ,SACR,MAAAC,EAAQ,GACR,eAAAC,EAAiB,GACjB,cAAeC,CACjB,EAAiB,CACf,KAAM,CAAE,UAAWC,EAAY,MAAOC,CAAA,EAAeC,EAAAA,WAGnD,OAAAC,EAAA,kBAAA,KAACC,EAAAA,QAAa,KAAb,CACC,KAAAZ,EACA,YAAAC,EACA,aAAAC,EAEA,SAAA,CAACW,EAAAA,kBAAAA,IAAAD,EAAAA,QAAa,QAAb,CAAqB,QAAO,GAC3B,SAACC,EAAA,kBAAA,IAAA,MAAA,CAAK,WAAQ,CAChB,CAAA,EAEAA,EAAAA,kBAAAA,IAACD,EAAa,QAAA,OAAb,CACC,SAAAD,EAAA,kBAAA,KAACC,EAAAA,QAAa,QAAb,CACC,KAAAT,EACA,WAAY,EACZ,MAAAC,EACA,MAAOK,EACP,UAAWK,EAAA,IACT,iBACAR,GAAkB,8BAClBE,CACF,EACA,cAAaD,EAEZ,SAAA,CAAAF,GAAUQ,EAAA,kBAAA,IAAAD,EAAA,QAAa,MAAb,CAAmB,UAAU,QAAQ,EAC/Cb,CAAA,CAAA,CAAA,EAEL,CAAA,CAAA,CAAA,CAGN,CAEAF,EAAQ,YAAc"}
1
+ {"version":3,"file":"Popover.cjs.js","sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["\"use client\";\n\nimport { Popover as RadixPopover } from \"radix-ui\";\nimport React, { CSSProperties } from \"react\";\nimport \"./Popover.css\";\nimport { useTheme } from \"../ThemeProvider\";\nimport { csx } from \"../../utils/string\";\n\nexport type PopoverSide = \"top\" | \"right\" | \"bottom\" | \"left\";\nexport type PopoverAlign = \"start\" | \"center\" | \"end\";\n\nexport interface PopoverProps {\n /**\n * The trigger element for the popover.\n */\n trigger: React.ReactNode;\n /**\n * The content of the popover.\n */\n children: React.ReactNode;\n /**\n * Constrain the width of the popover to the width of the trigger.\n */\n constrainWidth?: boolean;\n /**\n * Control open state (controlled mode).\n */\n open?: boolean;\n /**\n * Default open state (uncontrolled mode).\n */\n defaultOpen?: boolean;\n /**\n * Callback when open state changes.\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * Popover side placement\n * {@link PopoverSide}\n */\n side?: PopoverSide;\n /**\n * Popover alignment\n * {@link PopoverAlign}\n */\n align?: PopoverAlign;\n /**\n * Show an arrow pointing to the trigger.\n */\n arrow?: boolean;\n /**\n * Test id for the popover content.\n */\n \"data-testid\"?: string;\n}\n\n/**\n * A popover component that handles positioning and supports controlled and uncontrolled modes.\n *\n * A popover displays interactive content in context with a trigger element.\n * A tooltip displays a description of an element on hover or focus.\n *\n * API:\n * - {@link PopoverProps}\n */\nexport function Popover({\n trigger,\n children,\n open,\n defaultOpen,\n onOpenChange,\n side = \"top\",\n align = \"center\",\n arrow = false,\n constrainWidth = false,\n \"data-testid\": testId,\n}: PopoverProps) {\n const { className: themeClass, style: themeStyle } = useTheme();\n\n return (\n <RadixPopover.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n >\n <RadixPopover.Trigger asChild>\n <div>{trigger}</div>\n </RadixPopover.Trigger>\n\n <RadixPopover.Portal>\n <RadixPopover.Content\n side={side}\n sideOffset={2}\n align={align}\n style={themeStyle as CSSProperties}\n className={csx(\n \"proton-Popover\",\n constrainWidth && \"proton-Popover__constrained\",\n themeClass\n )}\n data-testid={testId}\n >\n {arrow && <RadixPopover.Arrow className=\"arrow\" />}\n {children}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n </RadixPopover.Root>\n );\n}\n\nPopover.displayName = \"Popover\";\n"],"names":["Popover","trigger","children","open","defaultOpen","onOpenChange","side","align","arrow","constrainWidth","testId","themeClass","themeStyle","useTheme","jsxs","RadixPopover","jsx","csx"],"mappings":"uRAiEO,SAASA,EAAQ,CACtB,QAAAC,EACA,SAAAC,EACA,KAAAC,EACA,YAAAC,EACA,aAAAC,EACA,KAAAC,EAAO,MACP,MAAAC,EAAQ,SACR,MAAAC,EAAQ,GACR,eAAAC,EAAiB,GACjB,cAAeC,CACjB,EAAiB,CACf,KAAM,CAAE,UAAWC,EAAY,MAAOC,CAAA,EAAeC,EAAAA,SAAA,EAErD,OACEC,EAAAA,kBAAAA,KAACC,EAAAA,QAAa,KAAb,CACC,KAAAZ,EACA,YAAAC,EACA,aAAAC,EAEA,SAAA,CAAAW,EAAAA,kBAAAA,IAACD,EAAAA,QAAa,QAAb,CAAqB,QAAO,GAC3B,SAAAC,EAAAA,kBAAAA,IAAC,MAAA,CAAK,WAAQ,CAAA,CAChB,EAEAA,EAAAA,kBAAAA,IAACD,EAAAA,QAAa,OAAb,CACC,SAAAD,EAAAA,kBAAAA,KAACC,EAAAA,QAAa,QAAb,CACC,KAAAT,EACA,WAAY,EACZ,MAAAC,EACA,MAAOK,EACP,UAAWK,EAAAA,IACT,iBACAR,GAAkB,8BAClBE,CAAA,EAEF,cAAaD,EAEZ,SAAA,CAAAF,GAASQ,EAAAA,kBAAAA,IAACD,EAAAA,QAAa,MAAb,CAAmB,UAAU,QAAQ,EAC/Cb,CAAA,CAAA,CAAA,CACH,CACF,CAAA,CAAA,CAAA,CAGN,CAEAF,EAAQ,YAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"Popover.es.js","sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { Popover as RadixPopover } from \"radix-ui\";\r\nimport React, { CSSProperties } from \"react\";\r\nimport \"./Popover.css\";\r\nimport { useTheme } from \"../ThemeProvider\";\r\nimport { csx } from \"../../utils/string\";\r\n\r\nexport type PopoverSide = \"top\" | \"right\" | \"bottom\" | \"left\";\r\nexport type PopoverAlign = \"start\" | \"center\" | \"end\";\r\n\r\nexport interface PopoverProps {\r\n /**\r\n * The trigger element for the popover.\r\n */\r\n trigger: React.ReactNode;\r\n /**\r\n * The content of the popover.\r\n */\r\n children: React.ReactNode;\r\n /**\r\n * Constrain the width of the popover to the width of the trigger.\r\n */\r\n constrainWidth?: boolean;\r\n /**\r\n * Control open state (controlled mode).\r\n */\r\n open?: boolean;\r\n /**\r\n * Default open state (uncontrolled mode).\r\n */\r\n defaultOpen?: boolean;\r\n /**\r\n * Callback when open state changes.\r\n */\r\n onOpenChange?: (open: boolean) => void;\r\n /**\r\n * Popover side placement\r\n * {@link PopoverSide}\r\n */\r\n side?: PopoverSide;\r\n /**\r\n * Popover alignment\r\n * {@link PopoverAlign}\r\n */\r\n align?: PopoverAlign;\r\n /**\r\n * Show an arrow pointing to the trigger.\r\n */\r\n arrow?: boolean;\r\n /**\r\n * Test id for the popover content.\r\n */\r\n \"data-testid\"?: string;\r\n}\r\n\r\n/**\r\n * A popover component that handles positioning and supports controlled and uncontrolled modes.\r\n *\r\n * A popover displays interactive content in context with a trigger element.\r\n * A tooltip displays a description of an element on hover or focus.\r\n *\r\n * API:\r\n * - {@link PopoverProps}\r\n */\r\nexport function Popover({\r\n trigger,\r\n children,\r\n open,\r\n defaultOpen,\r\n onOpenChange,\r\n side = \"top\",\r\n align = \"center\",\r\n arrow = false,\r\n constrainWidth = false,\r\n \"data-testid\": testId,\r\n}: PopoverProps) {\r\n const { className: themeClass, style: themeStyle } = useTheme();\r\n\r\n return (\r\n <RadixPopover.Root\r\n open={open}\r\n defaultOpen={defaultOpen}\r\n onOpenChange={onOpenChange}\r\n >\r\n <RadixPopover.Trigger asChild>\r\n <div>{trigger}</div>\r\n </RadixPopover.Trigger>\r\n\r\n <RadixPopover.Portal>\r\n <RadixPopover.Content\r\n side={side}\r\n sideOffset={2}\r\n align={align}\r\n style={themeStyle as CSSProperties}\r\n className={csx(\r\n \"proton-Popover\",\r\n constrainWidth && \"proton-Popover__constrained\",\r\n themeClass\r\n )}\r\n data-testid={testId}\r\n >\r\n {arrow && <RadixPopover.Arrow className=\"arrow\" />}\r\n {children}\r\n </RadixPopover.Content>\r\n </RadixPopover.Portal>\r\n </RadixPopover.Root>\r\n );\r\n}\r\n\r\nPopover.displayName = \"Popover\";\r\n"],"names":["Popover","trigger","children","open","defaultOpen","onOpenChange","side","align","arrow","constrainWidth","testId","themeClass","themeStyle","useTheme","jsxs","RadixPopover","jsx","csx"],"mappings":";;;;;AAiEO,SAASA,EAAQ;AAAA,EACtB,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,gBAAAC,IAAiB;AAAA,EACjB,eAAeC;AACjB,GAAiB;AACf,QAAM,EAAE,WAAWC,GAAY,OAAOC,EAAA,IAAeC;AAGnD,SAAAC,gBAAAA,EAAA;AAAA,IAACC,EAAa;AAAA,IAAb;AAAA,MACC,MAAAZ;AAAA,MACA,aAAAC;AAAA,MACA,cAAAC;AAAA,MAEA,UAAA;AAAA,QAACW,gBAAAA,EAAAA,IAAAD,EAAa,SAAb,EAAqB,SAAO,IAC3B,UAACC,gBAAAA,EAAA,IAAA,OAAA,EAAK,aAAQ,EAChB,CAAA;AAAA,QAEAA,gBAAAA,EAAAA,IAACD,EAAa,QAAb,EACC,UAAAD,gBAAAA,EAAA;AAAA,UAACC,EAAa;AAAA,UAAb;AAAA,YACC,MAAAT;AAAA,YACA,YAAY;AAAA,YACZ,OAAAC;AAAA,YACA,OAAOK;AAAA,YACP,WAAWK;AAAA,cACT;AAAA,cACAR,KAAkB;AAAA,cAClBE;AAAA,YACF;AAAA,YACA,eAAaD;AAAA,YAEZ,UAAA;AAAA,cAAAF,KAAUQ,gBAAAA,EAAA,IAAAD,EAAa,OAAb,EAAmB,WAAU,SAAQ;AAAA,cAC/Cb;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,GAEL;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEAF,EAAQ,cAAc;"}
1
+ {"version":3,"file":"Popover.es.js","sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["\"use client\";\n\nimport { Popover as RadixPopover } from \"radix-ui\";\nimport React, { CSSProperties } from \"react\";\nimport \"./Popover.css\";\nimport { useTheme } from \"../ThemeProvider\";\nimport { csx } from \"../../utils/string\";\n\nexport type PopoverSide = \"top\" | \"right\" | \"bottom\" | \"left\";\nexport type PopoverAlign = \"start\" | \"center\" | \"end\";\n\nexport interface PopoverProps {\n /**\n * The trigger element for the popover.\n */\n trigger: React.ReactNode;\n /**\n * The content of the popover.\n */\n children: React.ReactNode;\n /**\n * Constrain the width of the popover to the width of the trigger.\n */\n constrainWidth?: boolean;\n /**\n * Control open state (controlled mode).\n */\n open?: boolean;\n /**\n * Default open state (uncontrolled mode).\n */\n defaultOpen?: boolean;\n /**\n * Callback when open state changes.\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * Popover side placement\n * {@link PopoverSide}\n */\n side?: PopoverSide;\n /**\n * Popover alignment\n * {@link PopoverAlign}\n */\n align?: PopoverAlign;\n /**\n * Show an arrow pointing to the trigger.\n */\n arrow?: boolean;\n /**\n * Test id for the popover content.\n */\n \"data-testid\"?: string;\n}\n\n/**\n * A popover component that handles positioning and supports controlled and uncontrolled modes.\n *\n * A popover displays interactive content in context with a trigger element.\n * A tooltip displays a description of an element on hover or focus.\n *\n * API:\n * - {@link PopoverProps}\n */\nexport function Popover({\n trigger,\n children,\n open,\n defaultOpen,\n onOpenChange,\n side = \"top\",\n align = \"center\",\n arrow = false,\n constrainWidth = false,\n \"data-testid\": testId,\n}: PopoverProps) {\n const { className: themeClass, style: themeStyle } = useTheme();\n\n return (\n <RadixPopover.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n >\n <RadixPopover.Trigger asChild>\n <div>{trigger}</div>\n </RadixPopover.Trigger>\n\n <RadixPopover.Portal>\n <RadixPopover.Content\n side={side}\n sideOffset={2}\n align={align}\n style={themeStyle as CSSProperties}\n className={csx(\n \"proton-Popover\",\n constrainWidth && \"proton-Popover__constrained\",\n themeClass\n )}\n data-testid={testId}\n >\n {arrow && <RadixPopover.Arrow className=\"arrow\" />}\n {children}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n </RadixPopover.Root>\n );\n}\n\nPopover.displayName = \"Popover\";\n"],"names":["Popover","trigger","children","open","defaultOpen","onOpenChange","side","align","arrow","constrainWidth","testId","themeClass","themeStyle","useTheme","jsxs","RadixPopover","jsx","csx"],"mappings":";;;;;AAiEO,SAASA,EAAQ;AAAA,EACtB,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,gBAAAC,IAAiB;AAAA,EACjB,eAAeC;AACjB,GAAiB;AACf,QAAM,EAAE,WAAWC,GAAY,OAAOC,EAAA,IAAeC,EAAA;AAErD,SACEC,gBAAAA,EAAAA;AAAAA,IAACC,EAAa;AAAA,IAAb;AAAA,MACC,MAAAZ;AAAA,MACA,aAAAC;AAAA,MACA,cAAAC;AAAA,MAEA,UAAA;AAAA,QAAAW,gBAAAA,EAAAA,IAACD,EAAa,SAAb,EAAqB,SAAO,IAC3B,UAAAC,gBAAAA,EAAAA,IAAC,OAAA,EAAK,aAAQ,EAAA,CAChB;AAAA,QAEAA,gBAAAA,EAAAA,IAACD,EAAa,QAAb,EACC,UAAAD,gBAAAA,EAAAA;AAAAA,UAACC,EAAa;AAAA,UAAb;AAAA,YACC,MAAAT;AAAA,YACA,YAAY;AAAA,YACZ,OAAAC;AAAA,YACA,OAAOK;AAAA,YACP,WAAWK;AAAA,cACT;AAAA,cACAR,KAAkB;AAAA,cAClBE;AAAA,YAAA;AAAA,YAEF,eAAaD;AAAA,YAEZ,UAAA;AAAA,cAAAF,KAASQ,gBAAAA,EAAAA,IAACD,EAAa,OAAb,EAAmB,WAAU,SAAQ;AAAA,cAC/Cb;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,EACH,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEAF,EAAQ,cAAc;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScreenOverlay.cjs.js","sources":["../../../src/components/ScreenOverlay/ScreenOverlay.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { forwardRef, useEffect } from \"react\";\r\nimport \"./ScreenOverlay.css\";\r\nimport { csx } from \"../../utils\";\r\nimport { Portal } from \"radix-ui\";\r\nimport { useTheme, ThemeProvider } from \"../ThemeProvider\";\r\n\r\ninterface ScreenOverlayProps {\r\n /**\r\n * Children to render inside the overlay.\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Whether to fade in the overlay.\r\n */\r\n fadeIn?: boolean;\r\n\r\n /**\r\n * Callback function to handle events (click or ESC key).\r\n */\r\n onClose?: () => void;\r\n\r\n /**\r\n * Ref to the overlay element.\r\n */\r\n ref?: React.RefObject<HTMLDivElement>;\r\n}\r\n\r\n/**\r\n * Base Overlay component for creating modal-like backgrounds.\r\n *\r\n * API:\r\n * - {@link ScreenOverlayProps}\r\n */\r\nexport const ScreenOverlay = forwardRef<HTMLDivElement, ScreenOverlayProps>(\r\n ({ fadeIn = false, onClose, children }, ref) => {\r\n const { theme, palette } = useTheme();\r\n\r\n useEffect(() => {\r\n if (!onClose) return;\r\n\r\n const handleEscKey = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") onClose();\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleEscKey);\r\n return () => {\r\n document.removeEventListener(\"keydown\", handleEscKey);\r\n };\r\n }, [onClose]);\r\n\r\n return (\r\n <Portal.Root>\r\n <ThemeProvider theme={theme} palette={palette}>\r\n <div\r\n ref={ref}\r\n id=\"background\"\r\n aria-label=\"Background overlay\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n data-testid=\"screen-overlay\"\r\n className={csx(\r\n \"proton-ScreenOverlay__background\",\r\n \"proton-ScreenOverlay__z-index\",\r\n fadeIn && \"proton-ScreenOverlay__fade-in\"\r\n )}\r\n onClick={(event: React.MouseEvent) => {\r\n if (!onClose) return;\r\n\r\n // Only trigger onClose if the click was directly on the background element\r\n if (event.target === event.currentTarget) {\r\n onClose();\r\n }\r\n }}\r\n >\r\n {children}\r\n </div>\r\n </ThemeProvider>\r\n </Portal.Root>\r\n );\r\n }\r\n);\r\n\r\nScreenOverlay.displayName = \"ProtonUIScreenOverlay\";\r\n"],"names":["ScreenOverlay","forwardRef","fadeIn","onClose","children","ref","theme","palette","useTheme","useEffect","handleEscKey","event","Portal","jsx","ThemeProvider","csx"],"mappings":"gTAoCaA,EAAgBC,EAAA,WAC3B,CAAC,CAAE,OAAAC,EAAS,GAAO,QAAAC,EAAS,SAAAC,CAAA,EAAYC,IAAQ,CAC9C,KAAM,CAAE,MAAAC,EAAO,QAAAC,CAAQ,EAAIC,EAAS,SAAA,EAEpCC,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACN,EAAS,OAER,MAAAO,EAAgBC,GAAyB,CACzCA,EAAM,MAAQ,UAAkBR,EAAA,CAAA,EAG7B,gBAAA,iBAAiB,UAAWO,CAAY,EAC1C,IAAM,CACF,SAAA,oBAAoB,UAAWA,CAAY,CAAA,CACtD,EACC,CAACP,CAAO,CAAC,0BAGTS,EAAAA,OAAO,KAAP,CACC,SAACC,wBAAAC,EAAAA,cAAA,CAAc,MAAAR,EAAc,QAAAC,EAC3B,SAAAM,EAAA,kBAAA,IAAC,MAAA,CACC,IAAAR,EACA,GAAG,aACH,aAAW,qBACX,KAAK,SACL,aAAW,OACX,cAAY,iBACZ,UAAWU,EAAA,IACT,mCACA,gCACAb,GAAU,+BACZ,EACA,QAAUS,GAA4B,CAC/BR,GAGDQ,EAAM,SAAWA,EAAM,eACjBR,GAEZ,EAEC,SAAAC,CAAA,CAAA,CAEL,CAAA,CACF,CAAA,CAEJ,CACF,EAEAJ,EAAc,YAAc"}
1
+ {"version":3,"file":"ScreenOverlay.cjs.js","sources":["../../../src/components/ScreenOverlay/ScreenOverlay.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef, useEffect } from \"react\";\nimport \"./ScreenOverlay.css\";\nimport { csx } from \"../../utils\";\nimport { Portal } from \"radix-ui\";\nimport { useTheme, ThemeProvider } from \"../ThemeProvider\";\n\ninterface ScreenOverlayProps {\n /**\n * Children to render inside the overlay.\n */\n children?: React.ReactNode;\n\n /**\n * Whether to fade in the overlay.\n */\n fadeIn?: boolean;\n\n /**\n * Callback function to handle events (click or ESC key).\n */\n onClose?: () => void;\n\n /**\n * Ref to the overlay element.\n */\n ref?: React.RefObject<HTMLDivElement>;\n}\n\n/**\n * Base Overlay component for creating modal-like backgrounds.\n *\n * API:\n * - {@link ScreenOverlayProps}\n */\nexport const ScreenOverlay = forwardRef<HTMLDivElement, ScreenOverlayProps>(\n ({ fadeIn = false, onClose, children }, ref) => {\n const { theme, palette } = useTheme();\n\n useEffect(() => {\n if (!onClose) return;\n\n const handleEscKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") onClose();\n };\n\n document.addEventListener(\"keydown\", handleEscKey);\n return () => {\n document.removeEventListener(\"keydown\", handleEscKey);\n };\n }, [onClose]);\n\n return (\n <Portal.Root>\n <ThemeProvider theme={theme} palette={palette}>\n <div\n ref={ref}\n id=\"background\"\n aria-label=\"Background overlay\"\n role=\"dialog\"\n aria-modal=\"true\"\n data-testid=\"screen-overlay\"\n className={csx(\n \"proton-ScreenOverlay__background\",\n \"proton-ScreenOverlay__z-index\",\n fadeIn && \"proton-ScreenOverlay__fade-in\"\n )}\n onClick={(event: React.MouseEvent) => {\n if (!onClose) return;\n\n // Only trigger onClose if the click was directly on the background element\n if (event.target === event.currentTarget) {\n onClose();\n }\n }}\n >\n {children}\n </div>\n </ThemeProvider>\n </Portal.Root>\n );\n }\n);\n\nScreenOverlay.displayName = \"ProtonUIScreenOverlay\";\n"],"names":["ScreenOverlay","forwardRef","fadeIn","onClose","children","ref","theme","palette","useTheme","useEffect","handleEscKey","event","Portal","jsx","ThemeProvider","csx"],"mappings":"gTAoCaA,EAAgBC,EAAAA,WAC3B,CAAC,CAAE,OAAAC,EAAS,GAAO,QAAAC,EAAS,SAAAC,CAAA,EAAYC,IAAQ,CAC9C,KAAM,CAAE,MAAAC,EAAO,QAAAC,CAAA,EAAYC,WAAA,EAE3BC,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACN,EAAS,OAEd,MAAMO,EAAgBC,GAAyB,CACzCA,EAAM,MAAQ,UAAUR,EAAA,CAC9B,EAEA,gBAAS,iBAAiB,UAAWO,CAAY,EAC1C,IAAM,CACX,SAAS,oBAAoB,UAAWA,CAAY,CACtD,CACF,EAAG,CAACP,CAAO,CAAC,0BAGTS,EAAAA,OAAO,KAAP,CACC,SAAAC,wBAACC,EAAAA,cAAA,CAAc,MAAAR,EAAc,QAAAC,EAC3B,SAAAM,EAAAA,kBAAAA,IAAC,MAAA,CACC,IAAAR,EACA,GAAG,aACH,aAAW,qBACX,KAAK,SACL,aAAW,OACX,cAAY,iBACZ,UAAWU,EAAAA,IACT,mCACA,gCACAb,GAAU,+BAAA,EAEZ,QAAUS,GAA4B,CAC/BR,GAGDQ,EAAM,SAAWA,EAAM,eACzBR,EAAA,CAEJ,EAEC,SAAAC,CAAA,CAAA,EAEL,CAAA,CACF,CAEJ,CACF,EAEAJ,EAAc,YAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScreenOverlay.es.js","sources":["../../../src/components/ScreenOverlay/ScreenOverlay.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { forwardRef, useEffect } from \"react\";\r\nimport \"./ScreenOverlay.css\";\r\nimport { csx } from \"../../utils\";\r\nimport { Portal } from \"radix-ui\";\r\nimport { useTheme, ThemeProvider } from \"../ThemeProvider\";\r\n\r\ninterface ScreenOverlayProps {\r\n /**\r\n * Children to render inside the overlay.\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Whether to fade in the overlay.\r\n */\r\n fadeIn?: boolean;\r\n\r\n /**\r\n * Callback function to handle events (click or ESC key).\r\n */\r\n onClose?: () => void;\r\n\r\n /**\r\n * Ref to the overlay element.\r\n */\r\n ref?: React.RefObject<HTMLDivElement>;\r\n}\r\n\r\n/**\r\n * Base Overlay component for creating modal-like backgrounds.\r\n *\r\n * API:\r\n * - {@link ScreenOverlayProps}\r\n */\r\nexport const ScreenOverlay = forwardRef<HTMLDivElement, ScreenOverlayProps>(\r\n ({ fadeIn = false, onClose, children }, ref) => {\r\n const { theme, palette } = useTheme();\r\n\r\n useEffect(() => {\r\n if (!onClose) return;\r\n\r\n const handleEscKey = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") onClose();\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleEscKey);\r\n return () => {\r\n document.removeEventListener(\"keydown\", handleEscKey);\r\n };\r\n }, [onClose]);\r\n\r\n return (\r\n <Portal.Root>\r\n <ThemeProvider theme={theme} palette={palette}>\r\n <div\r\n ref={ref}\r\n id=\"background\"\r\n aria-label=\"Background overlay\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n data-testid=\"screen-overlay\"\r\n className={csx(\r\n \"proton-ScreenOverlay__background\",\r\n \"proton-ScreenOverlay__z-index\",\r\n fadeIn && \"proton-ScreenOverlay__fade-in\"\r\n )}\r\n onClick={(event: React.MouseEvent) => {\r\n if (!onClose) return;\r\n\r\n // Only trigger onClose if the click was directly on the background element\r\n if (event.target === event.currentTarget) {\r\n onClose();\r\n }\r\n }}\r\n >\r\n {children}\r\n </div>\r\n </ThemeProvider>\r\n </Portal.Root>\r\n );\r\n }\r\n);\r\n\r\nScreenOverlay.displayName = \"ProtonUIScreenOverlay\";\r\n"],"names":["ScreenOverlay","forwardRef","fadeIn","onClose","children","ref","theme","palette","useTheme","useEffect","handleEscKey","event","Portal","jsx","ThemeProvider","csx"],"mappings":";;;;;;AAoCO,MAAMA,IAAgBC;AAAA,EAC3B,CAAC,EAAE,QAAAC,IAAS,IAAO,SAAAC,GAAS,UAAAC,EAAA,GAAYC,MAAQ;AAC9C,UAAM,EAAE,OAAAC,GAAO,SAAAC,EAAQ,IAAIC,EAAS;AAEpC,WAAAC,EAAU,MAAM;AACd,UAAI,CAACN,EAAS;AAER,YAAAO,IAAe,CAACC,MAAyB;AACzC,QAAAA,EAAM,QAAQ,YAAkBR,EAAA;AAAA,MAAA;AAG7B,sBAAA,iBAAiB,WAAWO,CAAY,GAC1C,MAAM;AACF,iBAAA,oBAAoB,WAAWA,CAAY;AAAA,MAAA;AAAA,IACtD,GACC,CAACP,CAAO,CAAC,yBAGTS,EAAO,MAAP,EACC,UAACC,gBAAAA,MAAAC,GAAA,EAAc,OAAAR,GAAc,SAAAC,GAC3B,UAAAM,gBAAAA,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAR;AAAA,QACA,IAAG;AAAA,QACH,cAAW;AAAA,QACX,MAAK;AAAA,QACL,cAAW;AAAA,QACX,eAAY;AAAA,QACZ,WAAWU;AAAA,UACT;AAAA,UACA;AAAA,UACAb,KAAU;AAAA,QACZ;AAAA,QACA,SAAS,CAACS,MAA4B;AACpC,UAAKR,KAGDQ,EAAM,WAAWA,EAAM,iBACjBR;QAEZ;AAAA,QAEC,UAAAC;AAAA,MAAA;AAAA,IAAA,EAEL,CAAA,EACF,CAAA;AAAA,EAEJ;AACF;AAEAJ,EAAc,cAAc;"}
1
+ {"version":3,"file":"ScreenOverlay.es.js","sources":["../../../src/components/ScreenOverlay/ScreenOverlay.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef, useEffect } from \"react\";\nimport \"./ScreenOverlay.css\";\nimport { csx } from \"../../utils\";\nimport { Portal } from \"radix-ui\";\nimport { useTheme, ThemeProvider } from \"../ThemeProvider\";\n\ninterface ScreenOverlayProps {\n /**\n * Children to render inside the overlay.\n */\n children?: React.ReactNode;\n\n /**\n * Whether to fade in the overlay.\n */\n fadeIn?: boolean;\n\n /**\n * Callback function to handle events (click or ESC key).\n */\n onClose?: () => void;\n\n /**\n * Ref to the overlay element.\n */\n ref?: React.RefObject<HTMLDivElement>;\n}\n\n/**\n * Base Overlay component for creating modal-like backgrounds.\n *\n * API:\n * - {@link ScreenOverlayProps}\n */\nexport const ScreenOverlay = forwardRef<HTMLDivElement, ScreenOverlayProps>(\n ({ fadeIn = false, onClose, children }, ref) => {\n const { theme, palette } = useTheme();\n\n useEffect(() => {\n if (!onClose) return;\n\n const handleEscKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") onClose();\n };\n\n document.addEventListener(\"keydown\", handleEscKey);\n return () => {\n document.removeEventListener(\"keydown\", handleEscKey);\n };\n }, [onClose]);\n\n return (\n <Portal.Root>\n <ThemeProvider theme={theme} palette={palette}>\n <div\n ref={ref}\n id=\"background\"\n aria-label=\"Background overlay\"\n role=\"dialog\"\n aria-modal=\"true\"\n data-testid=\"screen-overlay\"\n className={csx(\n \"proton-ScreenOverlay__background\",\n \"proton-ScreenOverlay__z-index\",\n fadeIn && \"proton-ScreenOverlay__fade-in\"\n )}\n onClick={(event: React.MouseEvent) => {\n if (!onClose) return;\n\n // Only trigger onClose if the click was directly on the background element\n if (event.target === event.currentTarget) {\n onClose();\n }\n }}\n >\n {children}\n </div>\n </ThemeProvider>\n </Portal.Root>\n );\n }\n);\n\nScreenOverlay.displayName = \"ProtonUIScreenOverlay\";\n"],"names":["ScreenOverlay","forwardRef","fadeIn","onClose","children","ref","theme","palette","useTheme","useEffect","handleEscKey","event","Portal","jsx","ThemeProvider","csx"],"mappings":";;;;;;AAoCO,MAAMA,IAAgBC;AAAA,EAC3B,CAAC,EAAE,QAAAC,IAAS,IAAO,SAAAC,GAAS,UAAAC,EAAA,GAAYC,MAAQ;AAC9C,UAAM,EAAE,OAAAC,GAAO,SAAAC,EAAA,IAAYC,EAAA;AAE3B,WAAAC,EAAU,MAAM;AACd,UAAI,CAACN,EAAS;AAEd,YAAMO,IAAe,CAACC,MAAyB;AAC7C,QAAIA,EAAM,QAAQ,YAAUR,EAAA;AAAA,MAC9B;AAEA,sBAAS,iBAAiB,WAAWO,CAAY,GAC1C,MAAM;AACX,iBAAS,oBAAoB,WAAWA,CAAY;AAAA,MACtD;AAAA,IACF,GAAG,CAACP,CAAO,CAAC,yBAGTS,EAAO,MAAP,EACC,UAAAC,gBAAAA,MAACC,GAAA,EAAc,OAAAR,GAAc,SAAAC,GAC3B,UAAAM,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAR;AAAA,QACA,IAAG;AAAA,QACH,cAAW;AAAA,QACX,MAAK;AAAA,QACL,cAAW;AAAA,QACX,eAAY;AAAA,QACZ,WAAWU;AAAA,UACT;AAAA,UACA;AAAA,UACAb,KAAU;AAAA,QAAA;AAAA,QAEZ,SAAS,CAACS,MAA4B;AACpC,UAAKR,KAGDQ,EAAM,WAAWA,EAAM,iBACzBR,EAAA;AAAA,QAEJ;AAAA,QAEC,UAAAC;AAAA,MAAA;AAAA,IAAA,GAEL,EAAA,CACF;AAAA,EAEJ;AACF;AAEAJ,EAAc,cAAc;"}