@backstage/ui 0.7.2-next.2 → 0.8.1

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 (186) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/css/styles.css +6398 -8163
  3. package/dist/components/Avatar/Avatar.esm.js +21 -7
  4. package/dist/components/Avatar/Avatar.esm.js.map +1 -1
  5. package/dist/components/Avatar/Avatar.module.css.esm.js +8 -0
  6. package/dist/components/Avatar/Avatar.module.css.esm.js.map +1 -0
  7. package/dist/components/Box/Box.esm.js +20 -23
  8. package/dist/components/Box/Box.esm.js.map +1 -1
  9. package/dist/components/Box/Box.module.css.esm.js +8 -0
  10. package/dist/components/Box/Box.module.css.esm.js.map +1 -0
  11. package/dist/components/Button/Button.esm.js +10 -19
  12. package/dist/components/Button/Button.esm.js.map +1 -1
  13. package/dist/components/Button/Button.module.css.esm.js +8 -0
  14. package/dist/components/Button/Button.module.css.esm.js.map +1 -0
  15. package/dist/components/ButtonIcon/ButtonIcon.esm.js +14 -12
  16. package/dist/components/ButtonIcon/ButtonIcon.esm.js.map +1 -1
  17. package/dist/components/ButtonIcon/ButtonIcon.module.css.esm.js +8 -0
  18. package/dist/components/ButtonIcon/ButtonIcon.module.css.esm.js.map +1 -0
  19. package/dist/components/ButtonLink/ButtonLink.esm.js +8 -13
  20. package/dist/components/ButtonLink/ButtonLink.esm.js.map +1 -1
  21. package/dist/components/Card/Card.esm.js +46 -28
  22. package/dist/components/Card/Card.esm.js.map +1 -1
  23. package/dist/components/Card/Card.module.css.esm.js +8 -0
  24. package/dist/components/Card/Card.module.css.esm.js.map +1 -0
  25. package/dist/components/Checkbox/Checkbox.esm.js +14 -49
  26. package/dist/components/Checkbox/Checkbox.esm.js.map +1 -1
  27. package/dist/components/Checkbox/Checkbox.module.css.esm.js +8 -0
  28. package/dist/components/Checkbox/Checkbox.module.css.esm.js.map +1 -0
  29. package/dist/components/Collapsible/Collapsible.esm.js +14 -9
  30. package/dist/components/Collapsible/Collapsible.esm.js.map +1 -1
  31. package/dist/components/Collapsible/Collapsible.module.css.esm.js +8 -0
  32. package/dist/components/Collapsible/Collapsible.module.css.esm.js.map +1 -0
  33. package/dist/components/Container/Container.esm.js +22 -25
  34. package/dist/components/Container/Container.esm.js.map +1 -1
  35. package/dist/components/Container/Container.module.css.esm.js +8 -0
  36. package/dist/components/Container/Container.module.css.esm.js.map +1 -0
  37. package/dist/components/Dialog/Dialog.esm.js +103 -0
  38. package/dist/components/Dialog/Dialog.esm.js.map +1 -0
  39. package/dist/components/Dialog/Dialog.module.css.esm.js +8 -0
  40. package/dist/components/Dialog/Dialog.module.css.esm.js.map +1 -0
  41. package/dist/components/FieldError/FieldError.esm.js +5 -2
  42. package/dist/components/FieldError/FieldError.esm.js.map +1 -1
  43. package/dist/components/FieldError/FieldError.module.css.esm.js +8 -0
  44. package/dist/components/FieldError/FieldError.module.css.esm.js.map +1 -0
  45. package/dist/components/FieldLabel/FieldLabel.esm.js +50 -13
  46. package/dist/components/FieldLabel/FieldLabel.esm.js.map +1 -1
  47. package/dist/components/FieldLabel/FieldLabel.module.css.esm.js +8 -0
  48. package/dist/components/FieldLabel/FieldLabel.module.css.esm.js.map +1 -0
  49. package/dist/components/Flex/Flex.esm.js +22 -18
  50. package/dist/components/Flex/Flex.esm.js.map +1 -1
  51. package/dist/components/Flex/Flex.module.css.esm.js +8 -0
  52. package/dist/components/Flex/Flex.module.css.esm.js.map +1 -0
  53. package/dist/components/Grid/Grid.esm.js +41 -29
  54. package/dist/components/Grid/Grid.esm.js.map +1 -1
  55. package/dist/components/Grid/Grid.module.css.esm.js +8 -0
  56. package/dist/components/Grid/Grid.module.css.esm.js.map +1 -0
  57. package/dist/components/Header/Header.esm.js +22 -11
  58. package/dist/components/Header/Header.esm.js.map +1 -1
  59. package/dist/components/Header/Header.module.css.esm.js +8 -0
  60. package/dist/components/Header/Header.module.css.esm.js.map +1 -0
  61. package/dist/components/Header/HeaderToolbar.esm.js +71 -7
  62. package/dist/components/Header/HeaderToolbar.esm.js.map +1 -1
  63. package/dist/components/HeaderPage/HeaderPage.esm.js +51 -31
  64. package/dist/components/HeaderPage/HeaderPage.esm.js.map +1 -1
  65. package/dist/components/HeaderPage/HeaderPage.module.css.esm.js +8 -0
  66. package/dist/components/HeaderPage/HeaderPage.module.css.esm.js.map +1 -0
  67. package/dist/components/Link/Link.esm.js +26 -15
  68. package/dist/components/Link/Link.esm.js.map +1 -1
  69. package/dist/components/Link/Link.module.css.esm.js +8 -0
  70. package/dist/components/Link/Link.module.css.esm.js.map +1 -0
  71. package/dist/components/Menu/Menu.esm.js +376 -118
  72. package/dist/components/Menu/Menu.esm.js.map +1 -1
  73. package/dist/components/Menu/Menu.module.css.esm.js +8 -0
  74. package/dist/components/Menu/Menu.module.css.esm.js.map +1 -0
  75. package/dist/components/Popover/Popover.module.css.esm.js +8 -0
  76. package/dist/components/Popover/Popover.module.css.esm.js.map +1 -0
  77. package/dist/components/RadioGroup/RadioGroup.esm.js +6 -5
  78. package/dist/components/RadioGroup/RadioGroup.esm.js.map +1 -1
  79. package/dist/components/RadioGroup/RadioGroup.module.css.esm.js +8 -0
  80. package/dist/components/RadioGroup/RadioGroup.module.css.esm.js.map +1 -0
  81. package/dist/components/SearchField/SearchField.esm.js +44 -23
  82. package/dist/components/SearchField/SearchField.esm.js.map +1 -1
  83. package/dist/components/SearchField/SearchField.module.css.esm.js +8 -0
  84. package/dist/components/SearchField/SearchField.module.css.esm.js.map +1 -0
  85. package/dist/components/Select/Select.esm.js +60 -25
  86. package/dist/components/Select/Select.esm.js.map +1 -1
  87. package/dist/components/Select/Select.module.css.esm.js +8 -0
  88. package/dist/components/Select/Select.module.css.esm.js.map +1 -0
  89. package/dist/components/Skeleton/Skeleton.esm.js +12 -4
  90. package/dist/components/Skeleton/Skeleton.esm.js.map +1 -1
  91. package/dist/components/Skeleton/Skeleton.module.css.esm.js +8 -0
  92. package/dist/components/Skeleton/Skeleton.module.css.esm.js.map +1 -0
  93. package/dist/components/Switch/Switch.esm.js +22 -6
  94. package/dist/components/Switch/Switch.esm.js.map +1 -1
  95. package/dist/components/Switch/Switch.module.css.esm.js +8 -0
  96. package/dist/components/Switch/Switch.module.css.esm.js.map +1 -0
  97. package/dist/components/Table/Table.module.css.esm.js +8 -0
  98. package/dist/components/Table/Table.module.css.esm.js.map +1 -0
  99. package/dist/components/Table/components/Cell.esm.js +44 -17
  100. package/dist/components/Table/components/Cell.esm.js.map +1 -1
  101. package/dist/components/Table/components/CellProfile.esm.js +71 -26
  102. package/dist/components/Table/components/CellProfile.esm.js.map +1 -1
  103. package/dist/components/Table/components/Column.esm.js +39 -9
  104. package/dist/components/Table/components/Column.esm.js.map +1 -1
  105. package/dist/components/Table/components/Row.esm.js +19 -11
  106. package/dist/components/Table/components/Row.esm.js.map +1 -1
  107. package/dist/components/Table/components/Table.esm.js +8 -3
  108. package/dist/components/Table/components/Table.esm.js.map +1 -1
  109. package/dist/components/Table/components/TableBody.esm.js +13 -2
  110. package/dist/components/Table/components/TableBody.esm.js.map +1 -1
  111. package/dist/components/Table/components/TableHeader.esm.js +20 -10
  112. package/dist/components/Table/components/TableHeader.esm.js.map +1 -1
  113. package/dist/components/TablePagination/TablePagination.esm.js +80 -63
  114. package/dist/components/TablePagination/TablePagination.esm.js.map +1 -1
  115. package/dist/components/TablePagination/TablePagination.module.css.esm.js +8 -0
  116. package/dist/components/TablePagination/TablePagination.module.css.esm.js.map +1 -0
  117. package/dist/components/Tabs/Tabs.esm.js +55 -31
  118. package/dist/components/Tabs/Tabs.esm.js.map +1 -1
  119. package/dist/components/Tabs/Tabs.module.css.esm.js +8 -0
  120. package/dist/components/Tabs/Tabs.module.css.esm.js.map +1 -0
  121. package/dist/components/Tabs/TabsIndicators.esm.js +14 -2
  122. package/dist/components/Tabs/TabsIndicators.esm.js.map +1 -1
  123. package/dist/components/TagGroup/TagGroup.esm.js +35 -19
  124. package/dist/components/TagGroup/TagGroup.esm.js.map +1 -1
  125. package/dist/components/TagGroup/TagGroup.module.css.esm.js +8 -0
  126. package/dist/components/TagGroup/TagGroup.module.css.esm.js.map +1 -0
  127. package/dist/components/Text/Text.esm.js +10 -19
  128. package/dist/components/Text/Text.esm.js.map +1 -1
  129. package/dist/components/Text/Text.module.css.esm.js +8 -0
  130. package/dist/components/Text/Text.module.css.esm.js.map +1 -0
  131. package/dist/components/TextField/TextField.esm.js +29 -16
  132. package/dist/components/TextField/TextField.esm.js.map +1 -1
  133. package/dist/components/TextField/TextField.module.css.esm.js +8 -0
  134. package/dist/components/TextField/TextField.module.css.esm.js.map +1 -0
  135. package/dist/components/Tooltip/Tooltip.esm.js +19 -7
  136. package/dist/components/Tooltip/Tooltip.esm.js.map +1 -1
  137. package/dist/components/Tooltip/Tooltip.module.css.esm.js +8 -0
  138. package/dist/components/Tooltip/Tooltip.module.css.esm.js.map +1 -0
  139. package/dist/hooks/useStyles.esm.js +65 -9
  140. package/dist/hooks/useStyles.esm.js.map +1 -1
  141. package/dist/index.d.ts +148 -433
  142. package/dist/index.esm.js +1 -9
  143. package/dist/index.esm.js.map +1 -1
  144. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +29 -0
  145. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -0
  146. package/dist/utils/componentDefinitions.esm.js +113 -16
  147. package/dist/utils/componentDefinitions.esm.js.map +1 -1
  148. package/dist/utils/utilityClassMap.esm.js +189 -0
  149. package/dist/utils/utilityClassMap.esm.js.map +1 -0
  150. package/package.json +3 -3
  151. package/dist/components/Box/Box.props.esm.js +0 -7
  152. package/dist/components/Box/Box.props.esm.js.map +0 -1
  153. package/dist/components/Flex/Flex.props.esm.js +0 -31
  154. package/dist/components/Flex/Flex.props.esm.js.map +0 -1
  155. package/dist/components/Grid/Grid.props.esm.js +0 -58
  156. package/dist/components/Grid/Grid.props.esm.js.map +0 -1
  157. package/dist/components/Icon/Icon.esm.js +0 -29
  158. package/dist/components/Icon/Icon.esm.js.map +0 -1
  159. package/dist/components/Icon/context.esm.js +0 -10
  160. package/dist/components/Icon/context.esm.js.map +0 -1
  161. package/dist/components/Icon/icons.esm.js +0 -63
  162. package/dist/components/Icon/icons.esm.js.map +0 -1
  163. package/dist/components/Icon/provider.esm.js +0 -12
  164. package/dist/components/Icon/provider.esm.js.map +0 -1
  165. package/dist/components/ScrollArea/ScrollArea.esm.js +0 -63
  166. package/dist/components/ScrollArea/ScrollArea.esm.js.map +0 -1
  167. package/dist/props/display.props.esm.js +0 -12
  168. package/dist/props/display.props.esm.js.map +0 -1
  169. package/dist/props/gap-props.esm.js +0 -15
  170. package/dist/props/gap-props.esm.js.map +0 -1
  171. package/dist/props/height.props.esm.js +0 -23
  172. package/dist/props/height.props.esm.js.map +0 -1
  173. package/dist/props/margin.props.esm.js +0 -54
  174. package/dist/props/margin.props.esm.js.map +0 -1
  175. package/dist/props/padding.props.esm.js +0 -54
  176. package/dist/props/padding.props.esm.js.map +0 -1
  177. package/dist/props/position.props.esm.js +0 -18
  178. package/dist/props/position.props.esm.js.map +0 -1
  179. package/dist/props/prop-def.esm.js +0 -4
  180. package/dist/props/prop-def.esm.js.map +0 -1
  181. package/dist/props/spacing.props.esm.js +0 -28
  182. package/dist/props/spacing.props.esm.js.map +0 -1
  183. package/dist/props/width.props.esm.js +0 -23
  184. package/dist/props/width.props.esm.js.map +0 -1
  185. package/dist/utils/extractProps.esm.js +0 -49
  186. package/dist/utils/extractProps.esm.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Link.esm.js","sources":["../../../src/components/Link/Link.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { forwardRef } from 'react';\nimport { Link as AriaLink, RouterProvider } from 'react-aria-components';\nimport clsx from 'clsx';\nimport { useStyles } from '../../hooks/useStyles';\nimport type { LinkProps } from './types';\nimport { useNavigate, useHref } from 'react-router-dom';\nimport { isExternalLink } from '../../utils/isExternalLink';\n\n/** @public */\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>((props, ref) => {\n const navigate = useNavigate();\n const {\n className,\n variant = 'body',\n weight = 'regular',\n color = 'primary',\n truncate,\n href,\n ...restProps\n } = props;\n\n const { classNames: linkClassNames } = useStyles('Link');\n const { classNames: textClassNames, dataAttributes: textDataAttributes } =\n useStyles('Text', {\n variant,\n weight,\n color,\n });\n\n const isExternal = isExternalLink(href);\n\n // If it's an external link, render AriaLink without RouterProvider\n if (isExternal) {\n return (\n <AriaLink\n ref={ref}\n className={clsx(textClassNames.root, linkClassNames.root, className)}\n data-truncate={truncate}\n href={href}\n {...textDataAttributes}\n {...restProps}\n />\n );\n }\n\n // For internal links, use RouterProvider\n return (\n <RouterProvider navigate={navigate} useHref={useHref}>\n <AriaLink\n ref={ref}\n className={clsx(textClassNames.root, linkClassNames.root, className)}\n data-truncate={truncate}\n {...textDataAttributes}\n href={href}\n {...restProps}\n />\n </RouterProvider>\n );\n});\n\nLink.displayName = 'Link';\n"],"names":["AriaLink"],"mappings":";;;;;;;;AAyBO,MAAM,IAAA,GAAO,UAAA,CAAyC,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC3E,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,OAAA,GAAU,MAAA;AAAA,IACV,MAAA,GAAS,SAAA;AAAA,IACT,KAAA,GAAQ,SAAA;AAAA,IACR,QAAA;AAAA,IACA,IAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,MAAM,EAAE,UAAA,EAAY,cAAA,EAAe,GAAI,UAAU,MAAM,CAAA;AACvD,EAAA,MAAM,EAAE,UAAA,EAAY,cAAA,EAAgB,gBAAgB,kBAAA,EAAmB,GACrE,UAAU,MAAA,EAAQ;AAAA,IAChB,OAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AAEH,EAAA,MAAM,UAAA,GAAa,eAAe,IAAI,CAAA;AAGtC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBACE,GAAA;AAAA,MAACA,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAW,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,cAAA,CAAe,MAAM,SAAS,CAAA;AAAA,QACnE,eAAA,EAAe,QAAA;AAAA,QACf,IAAA;AAAA,QACC,GAAG,kBAAA;AAAA,QACH,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AAGA,EAAA,uBACE,GAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAoB,OAAA,EAClC,QAAA,kBAAA,GAAA;AAAA,IAACA,MAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,WAAW,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,cAAA,CAAe,MAAM,SAAS,CAAA;AAAA,MACnE,eAAA,EAAe,QAAA;AAAA,MACd,GAAG,kBAAA;AAAA,MACJ,IAAA;AAAA,MACC,GAAG;AAAA;AAAA,GACN,EACF,CAAA;AAEJ,CAAC;AAED,IAAA,CAAK,WAAA,GAAc,MAAA;;;;"}
1
+ {"version":3,"file":"Link.esm.js","sources":["../../../src/components/Link/Link.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { forwardRef } from 'react';\nimport { Link as AriaLink, RouterProvider } from 'react-aria-components';\nimport clsx from 'clsx';\nimport { useStyles } from '../../hooks/useStyles';\nimport type { LinkProps } from './types';\nimport { useNavigate, useHref } from 'react-router-dom';\nimport { isExternalLink } from '../../utils/isExternalLink';\nimport stylesLink from './Link.module.css';\nimport stylesText from '../Text/Text.module.css';\n\n/** @public */\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>((props, ref) => {\n const navigate = useNavigate();\n const { classNames: classNamesLink } = useStyles('Link', props);\n const {\n classNames: classNamesText,\n dataAttributes: textDataAttributes,\n cleanedProps,\n } = useStyles('Text', {\n variant: 'body',\n weight: 'regular',\n color: 'primary',\n ...props,\n });\n const { className, variant, weight, color, truncate, href, ...restProps } =\n cleanedProps;\n\n const isExternal = isExternalLink(href);\n\n // If it's an external link, render AriaLink without RouterProvider\n if (isExternal) {\n return (\n <AriaLink\n ref={ref}\n className={clsx(\n classNamesText.root,\n classNamesLink.root,\n stylesText[classNamesText.root],\n stylesLink[classNamesLink.root],\n className,\n )}\n data-truncate={truncate}\n href={href}\n {...textDataAttributes}\n {...restProps}\n />\n );\n }\n\n // For internal links, use RouterProvider\n return (\n <RouterProvider navigate={navigate} useHref={useHref}>\n <AriaLink\n ref={ref}\n className={clsx(\n classNamesText.root,\n classNamesLink.root,\n stylesText[classNamesText.root],\n stylesLink[classNamesLink.root],\n className,\n )}\n data-truncate={truncate}\n {...textDataAttributes}\n href={href}\n {...restProps}\n />\n </RouterProvider>\n );\n});\n\nLink.displayName = 'Link';\n"],"names":["AriaLink"],"mappings":";;;;;;;;;;AA2BO,MAAM,IAAA,GAAO,UAAA,CAAyC,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC3E,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,EAAE,UAAA,EAAY,cAAA,EAAe,GAAI,SAAA,CAAU,QAAQ,KAAK,CAAA;AAC9D,EAAA,MAAM;AAAA,IACJ,UAAA,EAAY,cAAA;AAAA,IACZ,cAAA,EAAgB,kBAAA;AAAA,IAChB;AAAA,GACF,GAAI,UAAU,MAAA,EAAQ;AAAA,IACpB,OAAA,EAAS,MAAA;AAAA,IACT,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA,IACP,GAAG;AAAA,GACJ,CAAA;AACD,EAAA,MAAM,EAAE,WAAW,OAAA,EAAS,MAAA,EAAQ,OAAO,QAAA,EAAU,IAAA,EAAM,GAAG,SAAA,EAAU,GACtE,YAAA;AAEF,EAAA,MAAM,UAAA,GAAa,eAAe,IAAI,CAAA;AAGtC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBACE,GAAA;AAAA,MAACA,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,IAAA;AAAA,UACT,cAAA,CAAe,IAAA;AAAA,UACf,cAAA,CAAe,IAAA;AAAA,UACf,UAAA,CAAW,eAAe,IAAI,CAAA;AAAA,UAC9B,UAAA,CAAW,eAAe,IAAI,CAAA;AAAA,UAC9B;AAAA,SACF;AAAA,QACA,eAAA,EAAe,QAAA;AAAA,QACf,IAAA;AAAA,QACC,GAAG,kBAAA;AAAA,QACH,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AAGA,EAAA,uBACE,GAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAoB,OAAA,EAClC,QAAA,kBAAA,GAAA;AAAA,IAACA,MAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,IAAA;AAAA,QACT,cAAA,CAAe,IAAA;AAAA,QACf,cAAA,CAAe,IAAA;AAAA,QACf,UAAA,CAAW,eAAe,IAAI,CAAA;AAAA,QAC9B,UAAA,CAAW,eAAe,IAAI,CAAA;AAAA,QAC9B;AAAA,OACF;AAAA,MACA,eAAA,EAAe,QAAA;AAAA,MACd,GAAG,kBAAA;AAAA,MACJ,IAAA;AAAA,MACC,GAAG;AAAA;AAAA,GACN,EACF,CAAA;AAEJ,CAAC;AAED,IAAA,CAAK,WAAA,GAAc,MAAA;;;;"}
@@ -0,0 +1,8 @@
1
+ import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
2
+
3
+ var css_248z = "/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@layer components {\n .Link-module_bui-Link__3bbuU {\n font-family: var(--bui-font-regular);\n padding: 0;\n margin: 0;\n cursor: pointer;\n text-decoration-line: none;\n display: inline-block;\n\n &:hover {\n text-decoration-line: underline;\n text-decoration-style: solid;\n text-decoration-thickness: min(2px, max(1px, 0.05em));\n text-underline-offset: calc(0.025em + 2px);\n text-decoration-color: color-mix(in srgb, currentColor 30%, transparent);\n }\n }\n}\n";
4
+ var stylesLink = {"bui-Link":"Link-module_bui-Link__3bbuU"};
5
+ styleInject(css_248z);
6
+
7
+ export { stylesLink as default };
8
+ //# sourceMappingURL=Link.module.css.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Link.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -1,14 +1,17 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { MenuTrigger as MenuTrigger$1, SubmenuTrigger as SubmenuTrigger$1, Popover, RouterProvider, Menu as Menu$1, ListBox, useFilter, Autocomplete, SearchField, Input, Button, MenuItem as MenuItem$1, ListBoxItem, MenuSection as MenuSection$1, Header, Separator } from 'react-aria-components';
3
- import { ScrollArea } from '../ScrollArea/ScrollArea.esm.js';
2
+ import { MenuTrigger as MenuTrigger$1, SubmenuTrigger as SubmenuTrigger$1, OverlayTriggerStateContext, Menu as Menu$1, Popover, RouterProvider, Virtualizer, ListLayout, ListBox, useFilter, Autocomplete, SearchField, Input, Button, MenuItem as MenuItem$1, ListBoxItem, MenuSection as MenuSection$1, Header, Separator } from 'react-aria-components';
4
3
  import { useStyles } from '../../hooks/useStyles.esm.js';
5
4
  import { RiCloseCircleLine, RiArrowRightSLine, RiCheckLine } from '@remixicon/react';
6
5
  import { useNavigate, useHref } from 'react-router-dom';
7
6
  import { isExternalLink } from '../../utils/isExternalLink.esm.js';
7
+ import { useRef, useContext, useEffect } from 'react';
8
+ import styles from './Menu.module.css.esm.js';
9
+ import clsx from 'clsx';
8
10
 
11
+ const rowHeight = 32;
9
12
  const MenuEmptyState = () => {
10
13
  const { classNames } = useStyles("Menu");
11
- return /* @__PURE__ */ jsx("div", { className: classNames.emptyState, children: "No results found." });
14
+ return /* @__PURE__ */ jsx("div", { className: clsx(classNames.emptyState, styles[classNames.emptyState]), children: "No results found." });
12
15
  };
13
16
  const MenuTrigger = (props) => {
14
17
  return /* @__PURE__ */ jsx(MenuTrigger$1, { ...props });
@@ -17,165 +20,420 @@ const SubmenuTrigger = (props) => {
17
20
  return /* @__PURE__ */ jsx(SubmenuTrigger$1, { ...props });
18
21
  };
19
22
  const Menu = (props) => {
20
- const { placement = "bottom start", ...rest } = props;
21
- const { classNames } = useStyles("Menu");
23
+ const { classNames, cleanedProps } = useStyles("Menu", props);
24
+ const {
25
+ placement = "bottom start",
26
+ virtualized = false,
27
+ maxWidth,
28
+ maxHeight,
29
+ style,
30
+ ...rest
31
+ } = cleanedProps;
22
32
  const navigate = useNavigate();
23
- return /* @__PURE__ */ jsx(Popover, { className: classNames.popover, placement, children: /* @__PURE__ */ jsx(RouterProvider, { navigate, useHref, children: /* @__PURE__ */ jsxs(ScrollArea.Root, { children: [
24
- /* @__PURE__ */ jsx(ScrollArea.Viewport, { children: /* @__PURE__ */ jsx(Menu$1, { className: classNames.content, ...rest, children: props.children }) }),
25
- /* @__PURE__ */ jsx(ScrollArea.Scrollbar, { orientation: "vertical", style: {}, children: /* @__PURE__ */ jsx(ScrollArea.Thumb, {}) })
26
- ] }) }) });
33
+ let newMaxWidth = maxWidth || (virtualized ? "260px" : "undefined");
34
+ const popoverRef = useRef(null);
35
+ const state = useContext(OverlayTriggerStateContext);
36
+ useEffect(() => {
37
+ if (!state?.isOpen) return;
38
+ const handleClickOutside = (event) => {
39
+ const target = event.target;
40
+ if (popoverRef.current && !popoverRef.current.contains(target)) {
41
+ const isOnTrigger = target.closest("[data-trigger]");
42
+ const isOnSubmenu = target.closest('[role="menu"]');
43
+ if (!isOnTrigger && !isOnSubmenu) {
44
+ state.close();
45
+ }
46
+ }
47
+ };
48
+ document.addEventListener("mousedown", handleClickOutside);
49
+ return () => {
50
+ document.removeEventListener("mousedown", handleClickOutside);
51
+ };
52
+ }, [state]);
53
+ const menuContent = /* @__PURE__ */ jsx(
54
+ Menu$1,
55
+ {
56
+ className: clsx(classNames.content, styles[classNames.content]),
57
+ renderEmptyState: () => /* @__PURE__ */ jsx(MenuEmptyState, {}),
58
+ style: { width: newMaxWidth, maxHeight, ...style },
59
+ ...rest
60
+ }
61
+ );
62
+ return /* @__PURE__ */ jsx(
63
+ Popover,
64
+ {
65
+ ref: popoverRef,
66
+ className: clsx(classNames.popover, styles[classNames.popover]),
67
+ placement,
68
+ isNonModal: true,
69
+ isKeyboardDismissDisabled: false,
70
+ children: /* @__PURE__ */ jsx(RouterProvider, { navigate, useHref, children: virtualized ? /* @__PURE__ */ jsx(
71
+ Virtualizer,
72
+ {
73
+ layout: ListLayout,
74
+ layoutOptions: {
75
+ rowHeight
76
+ },
77
+ children: menuContent
78
+ }
79
+ ) : menuContent })
80
+ }
81
+ );
27
82
  };
28
83
  const MenuListBox = (props) => {
84
+ const { classNames, cleanedProps } = useStyles("Menu", props);
29
85
  const {
30
86
  selectionMode = "single",
31
87
  placement = "bottom start",
88
+ virtualized = false,
89
+ maxWidth,
90
+ maxHeight,
91
+ style,
32
92
  ...rest
33
- } = props;
34
- const { classNames } = useStyles("Menu");
35
- return /* @__PURE__ */ jsx(Popover, { className: classNames.popover, placement, children: /* @__PURE__ */ jsxs(ScrollArea.Root, { children: [
36
- /* @__PURE__ */ jsx(ScrollArea.Viewport, { children: /* @__PURE__ */ jsx(
37
- ListBox,
38
- {
39
- className: classNames.content,
40
- selectionMode,
41
- ...rest
42
- }
43
- ) }),
44
- /* @__PURE__ */ jsx(ScrollArea.Scrollbar, { orientation: "vertical", style: {}, children: /* @__PURE__ */ jsx(ScrollArea.Thumb, {}) })
45
- ] }) });
93
+ } = cleanedProps;
94
+ let newMaxWidth = maxWidth || (virtualized ? "260px" : "undefined");
95
+ const listBoxContent = /* @__PURE__ */ jsx(
96
+ ListBox,
97
+ {
98
+ className: clsx(classNames.content, styles[classNames.content]),
99
+ selectionMode,
100
+ style: { width: newMaxWidth, maxHeight, ...style },
101
+ ...rest
102
+ }
103
+ );
104
+ return /* @__PURE__ */ jsx(
105
+ Popover,
106
+ {
107
+ className: clsx(classNames.popover, styles[classNames.popover]),
108
+ placement,
109
+ children: virtualized ? /* @__PURE__ */ jsx(
110
+ Virtualizer,
111
+ {
112
+ layout: ListLayout,
113
+ layoutOptions: {
114
+ rowHeight
115
+ },
116
+ children: listBoxContent
117
+ }
118
+ ) : listBoxContent
119
+ }
120
+ );
46
121
  };
47
122
  const MenuAutocomplete = (props) => {
48
- const { placement = "bottom start", ...rest } = props;
49
- const { classNames } = useStyles("Menu");
123
+ const { classNames, cleanedProps } = useStyles("Menu", props);
124
+ const {
125
+ placement = "bottom start",
126
+ virtualized = false,
127
+ maxWidth,
128
+ maxHeight,
129
+ style,
130
+ ...rest
131
+ } = cleanedProps;
50
132
  const { contains } = useFilter({ sensitivity: "base" });
51
- return /* @__PURE__ */ jsx(Popover, { className: classNames.popover, placement, children: /* @__PURE__ */ jsxs(Autocomplete, { filter: contains, children: [
52
- /* @__PURE__ */ jsxs(SearchField, { className: classNames.searchField, children: [
53
- /* @__PURE__ */ jsx(
54
- Input,
55
- {
56
- className: classNames.searchFieldInput,
57
- "aria-label": "Search",
58
- placeholder: props.placeholder || "Search..."
59
- }
60
- ),
61
- /* @__PURE__ */ jsx(Button, { className: classNames.searchFieldClear, children: /* @__PURE__ */ jsx(RiCloseCircleLine, {}) })
62
- ] }),
63
- /* @__PURE__ */ jsxs(ScrollArea.Root, { children: [
64
- /* @__PURE__ */ jsx(ScrollArea.Viewport, { children: /* @__PURE__ */ jsx(
65
- Menu$1,
66
- {
67
- className: classNames.content,
68
- renderEmptyState: () => /* @__PURE__ */ jsx(MenuEmptyState, {}),
69
- ...rest
70
- }
71
- ) }),
72
- /* @__PURE__ */ jsx(ScrollArea.Scrollbar, { orientation: "vertical", style: {}, children: /* @__PURE__ */ jsx(ScrollArea.Thumb, {}) })
73
- ] })
74
- ] }) });
133
+ let newMaxWidth = maxWidth || (virtualized ? "260px" : "undefined");
134
+ const navigate = useNavigate();
135
+ const menuContent = /* @__PURE__ */ jsx(
136
+ Menu$1,
137
+ {
138
+ className: clsx(classNames.content, styles[classNames.content]),
139
+ renderEmptyState: () => /* @__PURE__ */ jsx(MenuEmptyState, {}),
140
+ style: { width: newMaxWidth, maxHeight, ...style },
141
+ ...rest
142
+ }
143
+ );
144
+ return /* @__PURE__ */ jsx(
145
+ Popover,
146
+ {
147
+ className: clsx(classNames.popover, styles[classNames.popover]),
148
+ placement,
149
+ children: /* @__PURE__ */ jsx(RouterProvider, { navigate, useHref, children: /* @__PURE__ */ jsxs(Autocomplete, { filter: contains, children: [
150
+ /* @__PURE__ */ jsxs(
151
+ SearchField,
152
+ {
153
+ className: clsx(
154
+ classNames.searchField,
155
+ styles[classNames.searchField]
156
+ ),
157
+ children: [
158
+ /* @__PURE__ */ jsx(
159
+ Input,
160
+ {
161
+ className: clsx(
162
+ classNames.searchFieldInput,
163
+ styles[classNames.searchFieldInput]
164
+ ),
165
+ "aria-label": "Search",
166
+ placeholder: props.placeholder || "Search..."
167
+ }
168
+ ),
169
+ /* @__PURE__ */ jsx(
170
+ Button,
171
+ {
172
+ className: clsx(
173
+ classNames.searchFieldClear,
174
+ styles[classNames.searchFieldClear]
175
+ ),
176
+ children: /* @__PURE__ */ jsx(RiCloseCircleLine, {})
177
+ }
178
+ )
179
+ ]
180
+ }
181
+ ),
182
+ virtualized ? /* @__PURE__ */ jsx(
183
+ Virtualizer,
184
+ {
185
+ layout: ListLayout,
186
+ layoutOptions: {
187
+ rowHeight
188
+ },
189
+ children: menuContent
190
+ }
191
+ ) : menuContent
192
+ ] }) })
193
+ }
194
+ );
75
195
  };
76
196
  const MenuAutocompleteListbox = (props) => {
197
+ const { classNames, cleanedProps } = useStyles("Menu", props);
77
198
  const {
78
199
  selectionMode = "single",
79
200
  placement = "bottom start",
201
+ virtualized = false,
202
+ maxWidth,
203
+ maxHeight,
204
+ style,
80
205
  ...rest
81
- } = props;
82
- const { classNames } = useStyles("Menu");
206
+ } = cleanedProps;
83
207
  const { contains } = useFilter({ sensitivity: "base" });
84
- return /* @__PURE__ */ jsx(Popover, { className: classNames.popover, placement, children: /* @__PURE__ */ jsxs(Autocomplete, { filter: contains, children: [
85
- /* @__PURE__ */ jsxs(SearchField, { className: classNames.searchField, children: [
86
- /* @__PURE__ */ jsx(
87
- Input,
88
- {
89
- className: classNames.searchFieldInput,
90
- "aria-label": "Search",
91
- placeholder: props.placeholder || "Search..."
92
- }
93
- ),
94
- /* @__PURE__ */ jsx(Button, { className: classNames.searchFieldClear, children: /* @__PURE__ */ jsx(RiCloseCircleLine, {}) })
95
- ] }),
96
- /* @__PURE__ */ jsxs(ScrollArea.Root, { children: [
97
- /* @__PURE__ */ jsx(ScrollArea.Viewport, { children: /* @__PURE__ */ jsx(
98
- ListBox,
99
- {
100
- className: classNames.content,
101
- renderEmptyState: () => /* @__PURE__ */ jsx(MenuEmptyState, {}),
102
- selectionMode,
103
- ...rest
104
- }
105
- ) }),
106
- /* @__PURE__ */ jsx(ScrollArea.Scrollbar, { orientation: "vertical", style: {}, children: /* @__PURE__ */ jsx(ScrollArea.Thumb, {}) })
107
- ] })
108
- ] }) });
208
+ let newMaxWidth = maxWidth || (virtualized ? "260px" : "undefined");
209
+ const listBoxContent = /* @__PURE__ */ jsx(
210
+ ListBox,
211
+ {
212
+ className: clsx(classNames.content, styles[classNames.content]),
213
+ renderEmptyState: () => /* @__PURE__ */ jsx(MenuEmptyState, {}),
214
+ selectionMode,
215
+ style: { width: newMaxWidth, maxHeight, ...style },
216
+ ...rest
217
+ }
218
+ );
219
+ return /* @__PURE__ */ jsx(
220
+ Popover,
221
+ {
222
+ className: clsx(classNames.popover, styles[classNames.popover]),
223
+ placement,
224
+ children: /* @__PURE__ */ jsxs(Autocomplete, { filter: contains, children: [
225
+ /* @__PURE__ */ jsxs(
226
+ SearchField,
227
+ {
228
+ className: clsx(
229
+ classNames.searchField,
230
+ styles[classNames.searchField]
231
+ ),
232
+ children: [
233
+ /* @__PURE__ */ jsx(
234
+ Input,
235
+ {
236
+ className: clsx(
237
+ classNames.searchFieldInput,
238
+ styles[classNames.searchFieldInput]
239
+ ),
240
+ "aria-label": "Search",
241
+ placeholder: props.placeholder || "Search..."
242
+ }
243
+ ),
244
+ /* @__PURE__ */ jsx(
245
+ Button,
246
+ {
247
+ className: clsx(
248
+ classNames.searchFieldClear,
249
+ styles[classNames.searchFieldClear]
250
+ ),
251
+ children: /* @__PURE__ */ jsx(RiCloseCircleLine, {})
252
+ }
253
+ )
254
+ ]
255
+ }
256
+ ),
257
+ virtualized ? /* @__PURE__ */ jsx(
258
+ Virtualizer,
259
+ {
260
+ layout: ListLayout,
261
+ layoutOptions: {
262
+ rowHeight
263
+ },
264
+ children: listBoxContent
265
+ }
266
+ ) : listBoxContent
267
+ ] })
268
+ }
269
+ );
109
270
  };
110
271
  const MenuItem = (props) => {
111
- const { iconStart, color = "primary", children, href, ...rest } = props;
112
- const { classNames } = useStyles("Menu");
272
+ const { classNames, cleanedProps } = useStyles("Menu", props);
273
+ const {
274
+ iconStart,
275
+ color = "primary",
276
+ children,
277
+ href,
278
+ ...rest
279
+ } = cleanedProps;
113
280
  const isLink = href !== void 0;
114
281
  const isExternal = isExternalLink(href);
115
- const content = /* @__PURE__ */ jsxs(
116
- MenuItem$1,
117
- {
118
- className: classNames.item,
119
- "data-color": color,
120
- href,
121
- textValue: typeof children === "string" ? children : void 0,
122
- ...rest,
123
- children: [
124
- /* @__PURE__ */ jsxs("div", { className: classNames.itemContent, children: [
125
- iconStart,
126
- children
127
- ] }),
128
- /* @__PURE__ */ jsx("div", { className: classNames.itemArrow, children: /* @__PURE__ */ jsx(RiArrowRightSLine, {}) })
129
- ]
130
- }
131
- );
132
282
  if (isLink && isExternal) {
133
- return /* @__PURE__ */ jsxs(
283
+ return /* @__PURE__ */ jsx(
134
284
  MenuItem$1,
135
285
  {
136
- className: classNames.item,
286
+ className: clsx(classNames.item, styles[classNames.item]),
137
287
  "data-color": color,
138
288
  textValue: typeof children === "string" ? children : void 0,
139
289
  onAction: () => window.open(href, "_blank", "noopener,noreferrer"),
140
290
  ...rest,
141
- children: [
142
- /* @__PURE__ */ jsxs("div", { className: classNames.itemContent, children: [
143
- iconStart,
144
- children
145
- ] }),
146
- /* @__PURE__ */ jsx("div", { className: classNames.itemArrow, children: /* @__PURE__ */ jsx(RiArrowRightSLine, {}) })
147
- ]
291
+ children: /* @__PURE__ */ jsxs(
292
+ "div",
293
+ {
294
+ className: clsx(
295
+ classNames.itemWrapper,
296
+ styles[classNames.itemWrapper]
297
+ ),
298
+ children: [
299
+ /* @__PURE__ */ jsxs(
300
+ "div",
301
+ {
302
+ className: clsx(
303
+ classNames.itemContent,
304
+ styles[classNames.itemContent]
305
+ ),
306
+ children: [
307
+ iconStart,
308
+ children
309
+ ]
310
+ }
311
+ ),
312
+ /* @__PURE__ */ jsx(
313
+ "div",
314
+ {
315
+ className: clsx(classNames.itemArrow, styles[classNames.itemArrow]),
316
+ children: /* @__PURE__ */ jsx(RiArrowRightSLine, {})
317
+ }
318
+ )
319
+ ]
320
+ }
321
+ )
148
322
  }
149
323
  );
150
324
  }
151
- return content;
325
+ return /* @__PURE__ */ jsx(
326
+ MenuItem$1,
327
+ {
328
+ className: clsx(classNames.item, styles[classNames.item]),
329
+ "data-color": color,
330
+ href,
331
+ textValue: typeof children === "string" ? children : void 0,
332
+ ...rest,
333
+ children: /* @__PURE__ */ jsxs(
334
+ "div",
335
+ {
336
+ className: clsx(classNames.itemWrapper, styles[classNames.itemWrapper]),
337
+ children: [
338
+ /* @__PURE__ */ jsxs(
339
+ "div",
340
+ {
341
+ className: clsx(
342
+ classNames.itemContent,
343
+ styles[classNames.itemContent]
344
+ ),
345
+ children: [
346
+ iconStart,
347
+ children
348
+ ]
349
+ }
350
+ ),
351
+ /* @__PURE__ */ jsx(
352
+ "div",
353
+ {
354
+ className: clsx(classNames.itemArrow, styles[classNames.itemArrow]),
355
+ children: /* @__PURE__ */ jsx(RiArrowRightSLine, {})
356
+ }
357
+ )
358
+ ]
359
+ }
360
+ )
361
+ }
362
+ );
152
363
  };
153
364
  const MenuListBoxItem = (props) => {
154
- const { children, ...rest } = props;
155
- const { classNames } = useStyles("Menu");
365
+ const { classNames, cleanedProps } = useStyles("Menu", props);
366
+ const { children, ...rest } = cleanedProps;
156
367
  return /* @__PURE__ */ jsx(
157
368
  ListBoxItem,
158
369
  {
159
370
  textValue: typeof props.children === "string" ? props.children : void 0,
160
- className: classNames.itemListBox,
371
+ className: clsx(classNames.itemListBox, styles[classNames.itemListBox]),
161
372
  ...rest,
162
- children: /* @__PURE__ */ jsxs("div", { className: classNames.itemContent, children: [
163
- /* @__PURE__ */ jsx("div", { className: classNames.itemListBoxCheck, children: /* @__PURE__ */ jsx(RiCheckLine, {}) }),
164
- children
165
- ] })
373
+ children: /* @__PURE__ */ jsx(
374
+ "div",
375
+ {
376
+ className: clsx(classNames.itemWrapper, styles[classNames.itemWrapper]),
377
+ children: /* @__PURE__ */ jsxs(
378
+ "div",
379
+ {
380
+ className: clsx(
381
+ classNames.itemContent,
382
+ styles[classNames.itemContent]
383
+ ),
384
+ children: [
385
+ /* @__PURE__ */ jsx(
386
+ "div",
387
+ {
388
+ className: clsx(
389
+ classNames.itemListBoxCheck,
390
+ styles[classNames.itemListBoxCheck]
391
+ ),
392
+ children: /* @__PURE__ */ jsx(RiCheckLine, {})
393
+ }
394
+ ),
395
+ children
396
+ ]
397
+ }
398
+ )
399
+ }
400
+ )
166
401
  }
167
402
  );
168
403
  };
169
404
  const MenuSection = (props) => {
170
- const { classNames } = useStyles("Menu");
171
- return /* @__PURE__ */ jsxs(MenuSection$1, { className: classNames.section, ...props, children: [
172
- /* @__PURE__ */ jsx(Header, { className: classNames.sectionHeader, children: props.title }),
173
- props.children
174
- ] });
405
+ const { classNames, cleanedProps } = useStyles("Menu", props);
406
+ const { children, title, ...rest } = cleanedProps;
407
+ return /* @__PURE__ */ jsxs(
408
+ MenuSection$1,
409
+ {
410
+ className: clsx(classNames.section, styles[classNames.section]),
411
+ ...rest,
412
+ children: [
413
+ /* @__PURE__ */ jsx(
414
+ Header,
415
+ {
416
+ className: clsx(
417
+ classNames.sectionHeader,
418
+ styles[classNames.sectionHeader]
419
+ ),
420
+ children: title
421
+ }
422
+ ),
423
+ children
424
+ ]
425
+ }
426
+ );
175
427
  };
176
428
  const MenuSeparator = (props) => {
177
- const { classNames } = useStyles("Menu");
178
- return /* @__PURE__ */ jsx(Separator, { className: classNames.separator, ...props });
429
+ const { classNames, cleanedProps } = useStyles("Menu", props);
430
+ return /* @__PURE__ */ jsx(
431
+ Separator,
432
+ {
433
+ className: clsx(classNames.separator, styles[classNames.separator]),
434
+ ...cleanedProps
435
+ }
436
+ );
179
437
  };
180
438
 
181
439
  export { Menu, MenuAutocomplete, MenuAutocompleteListbox, MenuItem, MenuListBox, MenuListBoxItem, MenuSection, MenuSeparator, MenuTrigger, SubmenuTrigger };