@backstage/ui 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/dist/analytics/getNodeText.esm.js.map +1 -1
  3. package/dist/analytics/useAnalytics.esm.js.map +1 -1
  4. package/dist/components/Accordion/Accordion.esm.js.map +1 -1
  5. package/dist/components/Accordion/Accordion.module.css.esm.js +2 -2
  6. package/dist/components/Accordion/Accordion.module.css.esm.js.map +1 -1
  7. package/dist/components/Accordion/definition.esm.js.map +1 -1
  8. package/dist/components/Alert/Alert.esm.js.map +1 -1
  9. package/dist/components/Alert/Alert.module.css.esm.js +2 -2
  10. package/dist/components/Alert/Alert.module.css.esm.js.map +1 -1
  11. package/dist/components/Alert/definition.esm.js.map +1 -1
  12. package/dist/components/Avatar/Avatar.esm.js.map +1 -1
  13. package/dist/components/Avatar/Avatar.module.css.esm.js +2 -2
  14. package/dist/components/Avatar/Avatar.module.css.esm.js.map +1 -1
  15. package/dist/components/Avatar/definition.esm.js.map +1 -1
  16. package/dist/components/Badge/Badge.esm.js.map +1 -1
  17. package/dist/components/Badge/Badge.module.css.esm.js +2 -2
  18. package/dist/components/Badge/Badge.module.css.esm.js.map +1 -1
  19. package/dist/components/Badge/definition.esm.js.map +1 -1
  20. package/dist/components/Box/Box.esm.js.map +1 -1
  21. package/dist/components/Box/Box.module.css.esm.js +2 -2
  22. package/dist/components/Box/Box.module.css.esm.js.map +1 -1
  23. package/dist/components/Box/definition.esm.js.map +1 -1
  24. package/dist/components/Button/Button.esm.js.map +1 -1
  25. package/dist/components/Button/Button.module.css.esm.js +2 -2
  26. package/dist/components/Button/Button.module.css.esm.js.map +1 -1
  27. package/dist/components/Button/definition.esm.js.map +1 -1
  28. package/dist/components/ButtonIcon/ButtonIcon.esm.js.map +1 -1
  29. package/dist/components/ButtonIcon/ButtonIcon.module.css.esm.js +2 -2
  30. package/dist/components/ButtonIcon/ButtonIcon.module.css.esm.js.map +1 -1
  31. package/dist/components/ButtonIcon/definition.esm.js.map +1 -1
  32. package/dist/components/ButtonLink/ButtonLink.esm.js.map +1 -1
  33. package/dist/components/ButtonLink/ButtonLink.module.css.esm.js +2 -2
  34. package/dist/components/ButtonLink/ButtonLink.module.css.esm.js.map +1 -1
  35. package/dist/components/ButtonLink/definition.esm.js.map +1 -1
  36. package/dist/components/Card/Card.esm.js.map +1 -1
  37. package/dist/components/Card/Card.module.css.esm.js +2 -2
  38. package/dist/components/Card/Card.module.css.esm.js.map +1 -1
  39. package/dist/components/Card/definition.esm.js.map +1 -1
  40. package/dist/components/Checkbox/Checkbox.esm.js.map +1 -1
  41. package/dist/components/Checkbox/Checkbox.module.css.esm.js +2 -2
  42. package/dist/components/Checkbox/Checkbox.module.css.esm.js.map +1 -1
  43. package/dist/components/Checkbox/definition.esm.js.map +1 -1
  44. package/dist/components/CheckboxGroup/CheckboxGroup.esm.js.map +1 -1
  45. package/dist/components/CheckboxGroup/CheckboxGroup.module.css.esm.js +2 -2
  46. package/dist/components/CheckboxGroup/CheckboxGroup.module.css.esm.js.map +1 -1
  47. package/dist/components/CheckboxGroup/definition.esm.js.map +1 -1
  48. package/dist/components/Combobox/Combobox.esm.js +72 -10
  49. package/dist/components/Combobox/Combobox.esm.js.map +1 -1
  50. package/dist/components/Combobox/Combobox.module.css.esm.js +2 -2
  51. package/dist/components/Combobox/Combobox.module.css.esm.js.map +1 -1
  52. package/dist/components/Combobox/ComboboxInput.esm.js.map +1 -1
  53. package/dist/components/Combobox/ComboboxItem.esm.js.map +1 -1
  54. package/dist/components/Combobox/ComboboxListBox.esm.js +11 -34
  55. package/dist/components/Combobox/ComboboxListBox.esm.js.map +1 -1
  56. package/dist/components/Combobox/definition.esm.js +1 -1
  57. package/dist/components/Combobox/definition.esm.js.map +1 -1
  58. package/dist/components/Combobox/useAsyncComboboxState.esm.js.map +1 -1
  59. package/dist/components/Container/Container.esm.js.map +1 -1
  60. package/dist/components/Container/Container.module.css.esm.js +2 -2
  61. package/dist/components/Container/Container.module.css.esm.js.map +1 -1
  62. package/dist/components/Container/definition.esm.js.map +1 -1
  63. package/dist/components/DatePicker/DatePicker.esm.js.map +1 -1
  64. package/dist/components/DatePicker/DatePicker.module.css.esm.js +2 -2
  65. package/dist/components/DatePicker/DatePicker.module.css.esm.js.map +1 -1
  66. package/dist/components/DatePicker/DatePickerCalendar.esm.js.map +1 -1
  67. package/dist/components/DatePicker/DatePickerGroup.esm.js.map +1 -1
  68. package/dist/components/DatePicker/definition.esm.js.map +1 -1
  69. package/dist/components/DateRangePicker/DateRangePicker.esm.js.map +1 -1
  70. package/dist/components/DateRangePicker/DateRangePicker.module.css.esm.js +2 -2
  71. package/dist/components/DateRangePicker/DateRangePicker.module.css.esm.js.map +1 -1
  72. package/dist/components/DateRangePicker/DateRangePickerCalendar.esm.js.map +1 -1
  73. package/dist/components/DateRangePicker/DateRangePickerGroup.esm.js.map +1 -1
  74. package/dist/components/DateRangePicker/definition.esm.js.map +1 -1
  75. package/dist/components/Dialog/Dialog.esm.js.map +1 -1
  76. package/dist/components/Dialog/Dialog.module.css.esm.js +2 -2
  77. package/dist/components/Dialog/Dialog.module.css.esm.js.map +1 -1
  78. package/dist/components/Dialog/definition.esm.js.map +1 -1
  79. package/dist/components/FieldError/FieldError.esm.js.map +1 -1
  80. package/dist/components/FieldError/FieldError.module.css.esm.js +2 -2
  81. package/dist/components/FieldError/FieldError.module.css.esm.js.map +1 -1
  82. package/dist/components/FieldError/definition.esm.js.map +1 -1
  83. package/dist/components/FieldLabel/FieldLabel.esm.js.map +1 -1
  84. package/dist/components/FieldLabel/FieldLabel.module.css.esm.js +2 -2
  85. package/dist/components/FieldLabel/FieldLabel.module.css.esm.js.map +1 -1
  86. package/dist/components/FieldLabel/definition.esm.js.map +1 -1
  87. package/dist/components/Flex/Flex.esm.js.map +1 -1
  88. package/dist/components/Flex/Flex.module.css.esm.js +2 -2
  89. package/dist/components/Flex/Flex.module.css.esm.js.map +1 -1
  90. package/dist/components/Flex/definition.esm.js.map +1 -1
  91. package/dist/components/FullPage/FullPage.esm.js.map +1 -1
  92. package/dist/components/FullPage/FullPage.module.css.esm.js +2 -2
  93. package/dist/components/FullPage/FullPage.module.css.esm.js.map +1 -1
  94. package/dist/components/FullPage/definition.esm.js.map +1 -1
  95. package/dist/components/Grid/Grid.esm.js.map +1 -1
  96. package/dist/components/Grid/Grid.module.css.esm.js +2 -2
  97. package/dist/components/Grid/Grid.module.css.esm.js.map +1 -1
  98. package/dist/components/Grid/definition.esm.js.map +1 -1
  99. package/dist/components/Header/Header.esm.js.map +1 -1
  100. package/dist/components/Header/Header.module.css.esm.js +2 -2
  101. package/dist/components/Header/Header.module.css.esm.js.map +1 -1
  102. package/dist/components/Header/HeaderMetadataStatus.esm.js.map +1 -1
  103. package/dist/components/Header/HeaderMetadataStatus.module.css.esm.js +2 -2
  104. package/dist/components/Header/HeaderMetadataStatus.module.css.esm.js.map +1 -1
  105. package/dist/components/Header/HeaderMetadataUsers.esm.js.map +1 -1
  106. package/dist/components/Header/HeaderMetadataUsers.module.css.esm.js +2 -2
  107. package/dist/components/Header/HeaderMetadataUsers.module.css.esm.js.map +1 -1
  108. package/dist/components/Header/HeaderNav.esm.js.map +1 -1
  109. package/dist/components/Header/HeaderNav.module.css.esm.js +2 -2
  110. package/dist/components/Header/HeaderNav.module.css.esm.js.map +1 -1
  111. package/dist/components/Header/HeaderNavDefinition.esm.js.map +1 -1
  112. package/dist/components/Header/HeaderNavIndicators.esm.js.map +1 -1
  113. package/dist/components/Header/definition.esm.js.map +1 -1
  114. package/dist/components/Link/Link.esm.js.map +1 -1
  115. package/dist/components/Link/Link.module.css.esm.js +2 -2
  116. package/dist/components/Link/Link.module.css.esm.js.map +1 -1
  117. package/dist/components/Link/definition.esm.js.map +1 -1
  118. package/dist/components/List/List.esm.js.map +1 -1
  119. package/dist/components/List/List.module.css.esm.js +2 -2
  120. package/dist/components/List/List.module.css.esm.js.map +1 -1
  121. package/dist/components/List/definition.esm.js.map +1 -1
  122. package/dist/components/Menu/Menu.esm.js.map +1 -1
  123. package/dist/components/Menu/Menu.module.css.esm.js +2 -2
  124. package/dist/components/Menu/Menu.module.css.esm.js.map +1 -1
  125. package/dist/components/Menu/definition.esm.js.map +1 -1
  126. package/dist/components/NumberField/NumberField.esm.js.map +1 -1
  127. package/dist/components/NumberField/NumberField.module.css.esm.js +2 -2
  128. package/dist/components/NumberField/NumberField.module.css.esm.js.map +1 -1
  129. package/dist/components/NumberField/definition.esm.js.map +1 -1
  130. package/dist/components/PasswordField/PasswordField.esm.js.map +1 -1
  131. package/dist/components/PasswordField/PasswordField.module.css.esm.js +2 -2
  132. package/dist/components/PasswordField/PasswordField.module.css.esm.js.map +1 -1
  133. package/dist/components/PasswordField/definition.esm.js.map +1 -1
  134. package/dist/components/PluginHeader/PluginHeader.esm.js.map +1 -1
  135. package/dist/components/PluginHeader/PluginHeader.module.css.esm.js +2 -2
  136. package/dist/components/PluginHeader/PluginHeader.module.css.esm.js.map +1 -1
  137. package/dist/components/PluginHeader/PluginHeaderBreadcrumbs.esm.js.map +1 -1
  138. package/dist/components/PluginHeader/definition.esm.js.map +1 -1
  139. package/dist/components/PluginHeader/useIsTruncated.esm.js.map +1 -1
  140. package/dist/components/Popover/Popover.esm.js.map +1 -1
  141. package/dist/components/Popover/Popover.module.css.esm.js +2 -2
  142. package/dist/components/Popover/Popover.module.css.esm.js.map +1 -1
  143. package/dist/components/Popover/definition.esm.js.map +1 -1
  144. package/dist/components/RadioGroup/RadioGroup.esm.js.map +1 -1
  145. package/dist/components/RadioGroup/RadioGroup.module.css.esm.js +2 -2
  146. package/dist/components/RadioGroup/RadioGroup.module.css.esm.js.map +1 -1
  147. package/dist/components/RadioGroup/definition.esm.js.map +1 -1
  148. package/dist/components/SearchAutocomplete/SearchAutocomplete.esm.js.map +1 -1
  149. package/dist/components/SearchAutocomplete/SearchAutocomplete.module.css.esm.js +2 -2
  150. package/dist/components/SearchAutocomplete/SearchAutocomplete.module.css.esm.js.map +1 -1
  151. package/dist/components/SearchAutocomplete/definition.esm.js.map +1 -1
  152. package/dist/components/SearchField/SearchField.esm.js.map +1 -1
  153. package/dist/components/SearchField/SearchField.module.css.esm.js +2 -2
  154. package/dist/components/SearchField/SearchField.module.css.esm.js.map +1 -1
  155. package/dist/components/SearchField/definition.esm.js.map +1 -1
  156. package/dist/components/Select/Select.esm.js.map +1 -1
  157. package/dist/components/Select/Select.module.css.esm.js +2 -2
  158. package/dist/components/Select/Select.module.css.esm.js.map +1 -1
  159. package/dist/components/Select/SelectContent.esm.js.map +1 -1
  160. package/dist/components/Select/SelectItem.esm.js.map +1 -1
  161. package/dist/components/Select/SelectListBox.esm.js.map +1 -1
  162. package/dist/components/Select/SelectTrigger.esm.js.map +1 -1
  163. package/dist/components/Select/definition.esm.js.map +1 -1
  164. package/dist/components/Skeleton/Skeleton.esm.js.map +1 -1
  165. package/dist/components/Skeleton/Skeleton.module.css.esm.js +2 -2
  166. package/dist/components/Skeleton/Skeleton.module.css.esm.js.map +1 -1
  167. package/dist/components/Skeleton/definition.esm.js.map +1 -1
  168. package/dist/components/Slider/Slider.esm.js.map +1 -1
  169. package/dist/components/Slider/Slider.module.css.esm.js +2 -2
  170. package/dist/components/Slider/Slider.module.css.esm.js.map +1 -1
  171. package/dist/components/Slider/definition.esm.js.map +1 -1
  172. package/dist/components/Switch/Switch.esm.js.map +1 -1
  173. package/dist/components/Switch/Switch.module.css.esm.js +2 -2
  174. package/dist/components/Switch/Switch.module.css.esm.js.map +1 -1
  175. package/dist/components/Switch/definition.esm.js.map +1 -1
  176. package/dist/components/Table/Table.module.css.esm.js +2 -2
  177. package/dist/components/Table/Table.module.css.esm.js.map +1 -1
  178. package/dist/components/Table/components/Cell.esm.js.map +1 -1
  179. package/dist/components/Table/components/CellProfile.esm.js.map +1 -1
  180. package/dist/components/Table/components/CellText.esm.js.map +1 -1
  181. package/dist/components/Table/components/Column.esm.js.map +1 -1
  182. package/dist/components/Table/components/Row.esm.js.map +1 -1
  183. package/dist/components/Table/components/Table.esm.js.map +1 -1
  184. package/dist/components/Table/components/TableBody.esm.js.map +1 -1
  185. package/dist/components/Table/components/TableBodySkeleton.esm.js.map +1 -1
  186. package/dist/components/Table/components/TableHeader.esm.js.map +1 -1
  187. package/dist/components/Table/components/TableRoot.esm.js.map +1 -1
  188. package/dist/components/Table/definition.esm.js.map +1 -1
  189. package/dist/components/Table/hooks/getEffectivePageSize.esm.js.map +1 -1
  190. package/dist/components/Table/hooks/useCompletePagination.esm.js.map +1 -1
  191. package/dist/components/Table/hooks/useCursorPagination.esm.js.map +1 -1
  192. package/dist/components/Table/hooks/useDebouncedReload.esm.js.map +1 -1
  193. package/dist/components/Table/hooks/useDebouncedValue.esm.js.map +1 -1
  194. package/dist/components/Table/hooks/useOffsetPagination.esm.js.map +1 -1
  195. package/dist/components/Table/hooks/usePageCache.esm.js.map +1 -1
  196. package/dist/components/Table/hooks/useQueryState.esm.js.map +1 -1
  197. package/dist/components/Table/hooks/useStableCallback.esm.js.map +1 -1
  198. package/dist/components/Table/hooks/useTable.esm.js.map +1 -1
  199. package/dist/components/TablePagination/TablePagination.esm.js.map +1 -1
  200. package/dist/components/TablePagination/TablePagination.module.css.esm.js +2 -2
  201. package/dist/components/TablePagination/TablePagination.module.css.esm.js.map +1 -1
  202. package/dist/components/TablePagination/definition.esm.js.map +1 -1
  203. package/dist/components/Tabs/Tabs.esm.js.map +1 -1
  204. package/dist/components/Tabs/Tabs.module.css.esm.js +2 -2
  205. package/dist/components/Tabs/Tabs.module.css.esm.js.map +1 -1
  206. package/dist/components/Tabs/TabsIndicators.esm.js.map +1 -1
  207. package/dist/components/Tabs/definition.esm.js.map +1 -1
  208. package/dist/components/TagGroup/TagGroup.esm.js.map +1 -1
  209. package/dist/components/TagGroup/TagGroup.module.css.esm.js +2 -2
  210. package/dist/components/TagGroup/TagGroup.module.css.esm.js.map +1 -1
  211. package/dist/components/TagGroup/definition.esm.js.map +1 -1
  212. package/dist/components/Text/Text.esm.js.map +1 -1
  213. package/dist/components/Text/Text.module.css.esm.js +2 -2
  214. package/dist/components/Text/Text.module.css.esm.js.map +1 -1
  215. package/dist/components/Text/definition.esm.js.map +1 -1
  216. package/dist/components/TextAreaField/TextAreaField.esm.js.map +1 -1
  217. package/dist/components/TextAreaField/TextAreaField.module.css.esm.js +2 -2
  218. package/dist/components/TextAreaField/TextAreaField.module.css.esm.js.map +1 -1
  219. package/dist/components/TextAreaField/definition.esm.js.map +1 -1
  220. package/dist/components/TextField/TextField.esm.js.map +1 -1
  221. package/dist/components/TextField/TextField.module.css.esm.js +2 -2
  222. package/dist/components/TextField/TextField.module.css.esm.js.map +1 -1
  223. package/dist/components/TextField/definition.esm.js.map +1 -1
  224. package/dist/components/ToggleButton/ToggleButton.esm.js.map +1 -1
  225. package/dist/components/ToggleButton/ToggleButton.module.css.esm.js +2 -2
  226. package/dist/components/ToggleButton/ToggleButton.module.css.esm.js.map +1 -1
  227. package/dist/components/ToggleButton/definition.esm.js.map +1 -1
  228. package/dist/components/ToggleButtonGroup/ToggleButtonGroup.esm.js.map +1 -1
  229. package/dist/components/ToggleButtonGroup/ToggleButtonGroup.module.css.esm.js +2 -2
  230. package/dist/components/ToggleButtonGroup/ToggleButtonGroup.module.css.esm.js.map +1 -1
  231. package/dist/components/ToggleButtonGroup/definition.esm.js.map +1 -1
  232. package/dist/components/Tooltip/Tooltip.esm.js.map +1 -1
  233. package/dist/components/Tooltip/Tooltip.module.css.esm.js +2 -2
  234. package/dist/components/Tooltip/Tooltip.module.css.esm.js.map +1 -1
  235. package/dist/components/Tooltip/definition.esm.js.map +1 -1
  236. package/dist/components/VisuallyHidden/VisuallyHidden.esm.js.map +1 -1
  237. package/dist/components/VisuallyHidden/VisuallyHidden.module.css.esm.js +2 -2
  238. package/dist/components/VisuallyHidden/VisuallyHidden.module.css.esm.js.map +1 -1
  239. package/dist/components/VisuallyHidden/definition.esm.js.map +1 -1
  240. package/dist/css/styles.css +39 -1
  241. package/dist/hooks/useBg.esm.js.map +1 -1
  242. package/dist/hooks/useBreakpoint.esm.js.map +1 -1
  243. package/dist/hooks/useCollectionAdapter.esm.js.map +1 -1
  244. package/dist/hooks/useDefinition/defineComponent.esm.js.map +1 -1
  245. package/dist/hooks/useDefinition/helpers.esm.js.map +1 -1
  246. package/dist/hooks/useDefinition/useDefinition.esm.js.map +1 -1
  247. package/dist/hooks/useDefinition/useDefinitionNavigation.esm.js.map +1 -1
  248. package/dist/hooks/useDelayedVisibility.esm.js.map +1 -1
  249. package/dist/hooks/useIsomorphicLayoutEffect.esm.js.map +1 -1
  250. package/dist/hooks/useResolvedHref.esm.js.map +1 -1
  251. package/dist/hooks/useTrackedSelectionKeys.esm.js.map +1 -1
  252. package/dist/index.d.ts +7 -2
  253. package/dist/navigation/BUIRoutingProvider.esm.js.map +1 -1
  254. package/dist/navigation/useNavigation.esm.js.map +1 -1
  255. package/dist/navigation/useRouting.esm.js.map +1 -1
  256. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -1
  257. package/dist/provider/BUIContext.esm.js.map +1 -1
  258. package/dist/provider/BUIProvider.esm.js.map +1 -1
  259. package/dist/utils/linkUtils.esm.js.map +1 -1
  260. package/dist/utils/selectableCollection.esm.js +13 -1
  261. package/dist/utils/selectableCollection.esm.js.map +1 -1
  262. package/dist/utils/utilityClassMap.esm.js.map +1 -1
  263. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"Header.esm.js","sources":["../../../src/components/Header/Header.tsx"],"sourcesContent":["/*\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\nimport type { HeaderProps } from './types';\nimport { Text } from '../Text';\nimport { RiArrowRightSLine } from '@remixicon/react';\nimport { HeaderNav } from './HeaderNav';\nimport { useDefinition } from '../../hooks/useDefinition';\nimport { HeaderDefinition } from './definition';\nimport { sanitizeUrl } from '@braintree/sanitize-url';\nimport { Lexer } from 'marked';\nimport { Link } from '../Link';\nimport { Fragment, useEffect, useMemo, useRef, useState } from 'react';\nimport { Container } from '../Container';\n\nconst getScrollParent = (element: HTMLElement | null): Element | null => {\n let parent = element?.parentElement;\n\n while (parent) {\n const { overflow, overflowX, overflowY } = window.getComputedStyle(parent);\n\n if (\n /(auto|scroll|overlay|hidden)/.test(`${overflow}${overflowX}${overflowY}`)\n ) {\n return parent;\n }\n\n parent = parent.parentElement;\n }\n\n return null;\n};\n\nconst isStickySentinelOutOfView = (\n sentinel: HTMLElement,\n root: Element | null,\n) => {\n const sentinelRect = sentinel.getBoundingClientRect();\n const rootTop = root ? root.getBoundingClientRect().top : 0;\n\n return sentinelRect.bottom <= rootTop;\n};\n\n/**\n * Parses inline Markdown links in a string and returns an array of React nodes.\n * URLs are sanitized via `@braintree/sanitize-url`; unsafe URLs are rendered as\n * plain text. Uses `marked` instead of `react-markdown` to avoid ESM issues.\n */\nfunction renderInlineMarkdown(text: string): React.ReactNode[] {\n return Lexer.lexInline(text).map((token, i) => {\n if (token.type === 'link') {\n const href = sanitizeUrl(token.href);\n if (href === 'about:blank') return token.text;\n return (\n <Link key={i} href={href} standalone>\n {token.text}\n </Link>\n );\n }\n return token.raw;\n });\n}\n\n/**\n * A secondary header with title, breadcrumbs, tabs, and actions.\n *\n * @public\n */\nexport const Header = (props: HeaderProps) => {\n const { ownProps, dataAttributes } = useDefinition(HeaderDefinition, props, {\n classNameTarget: 'content',\n });\n const {\n classes,\n title,\n tabs,\n activeTabId,\n customActions,\n breadcrumbs,\n description,\n tags,\n metadata,\n sticky,\n } = ownProps;\n\n const descriptionNodes = useMemo(\n () => (description ? renderInlineMarkdown(description) : null),\n [description],\n );\n\n // The sentinel sits directly before the sticky content and leaves the\n // viewport when the content becomes stuck, letting us toggle stuck styling.\n const stickySentinelRef = useRef<HTMLDivElement>(null);\n const [isStuck, setIsStuck] = useState(false);\n\n useEffect(() => {\n if (!sticky) {\n setIsStuck(false);\n return;\n }\n\n const sentinel = stickySentinelRef.current;\n if (!sentinel) {\n return;\n }\n\n const root = getScrollParent(sentinel);\n\n if (typeof IntersectionObserver === 'undefined') {\n const updateStuckState = () => {\n setIsStuck(isStickySentinelOutOfView(sentinel, root));\n };\n const scrollTarget = root ?? window;\n\n updateStuckState();\n scrollTarget.addEventListener('scroll', updateStuckState, {\n passive: true,\n });\n window.addEventListener('resize', updateStuckState);\n\n return () => {\n scrollTarget.removeEventListener('scroll', updateStuckState);\n window.removeEventListener('resize', updateStuckState);\n };\n }\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n setIsStuck(!entry.isIntersecting);\n },\n { root, threshold: 0 },\n );\n\n observer.observe(sentinel);\n\n return () => {\n observer.disconnect();\n };\n }, [sticky]);\n\n return (\n <>\n <Container\n className={classes.headerTop}\n data-sticky={sticky || undefined}\n >\n {tags && tags.length > 0 && (\n <ul className={classes.tags}>\n {tags.map((tag, i) => (\n <li\n key={`${i}:${tag.label}:${tag.href ?? ''}`}\n className={classes.tag}\n >\n {tag.href ? (\n <Link\n href={tag.href}\n variant=\"body-medium\"\n color=\"secondary\"\n standalone\n >\n {tag.label}\n </Link>\n ) : (\n <Text variant=\"body-medium\" color=\"secondary\">\n {tag.label}\n </Text>\n )}\n </li>\n ))}\n </ul>\n )}\n </Container>\n {sticky && (\n <div\n ref={stickySentinelRef}\n className={classes.stickySentinel}\n data-sticky=\"\"\n aria-hidden=\"true\"\n />\n )}\n <Container\n className={classes.content}\n data-sticky={sticky || undefined}\n data-stuck={isStuck || undefined}\n data-has-tags={tags && tags.length > 0 ? '' : undefined}\n {...dataAttributes}\n >\n <div className={classes.titleStack}>\n {isStuck ? (\n <div className={classes.breadcrumbsSmall}>\n {breadcrumbs &&\n breadcrumbs.map(breadcrumb => (\n <Fragment key={breadcrumb.label}>\n <Link\n href={breadcrumb.href}\n color=\"secondary\"\n className={classes.breadcrumbLinkSmall}\n standalone\n >\n {breadcrumb.label}\n </Link>\n <RiArrowRightSLine\n className={classes.breadcrumbSeparator}\n size={16}\n color=\"var(--bui-fg-secondary)\"\n />\n </Fragment>\n ))}\n <h2 className={classes.titleSmall}>{title}</h2>\n </div>\n ) : (\n <div className={classes.breadcrumbs}>\n {breadcrumbs &&\n breadcrumbs.map(breadcrumb => (\n <Fragment key={breadcrumb.label}>\n <Link\n href={breadcrumb.href}\n color=\"secondary\"\n className={classes.breadcrumbLink}\n standalone\n >\n {breadcrumb.label}\n </Link>\n <RiArrowRightSLine\n className={classes.breadcrumbSeparator}\n size={16}\n color=\"var(--bui-fg-secondary)\"\n />\n </Fragment>\n ))}\n <h2 className={classes.title}>{title}</h2>\n </div>\n )}\n </div>\n <div className={classes.controls}>{customActions}</div>\n </Container>\n <Container\n className={classes.headerBottom}\n data-sticky={sticky || undefined}\n >\n {description && (\n <Text\n variant=\"body-medium\"\n color=\"secondary\"\n className={classes.description}\n >\n {descriptionNodes}\n </Text>\n )}\n {metadata && metadata.length > 0 && (\n <dl className={classes.metaRow}>\n {metadata.map((item, i) => (\n <div key={`${i}:${item.label}`} className={classes.metaItem}>\n <dt>\n <Text variant=\"body-medium\" color=\"secondary\">\n {item.label}\n </Text>\n </dt>\n <dd>\n {typeof item.value === 'string' ? (\n <Text variant=\"body-medium\">{item.value}</Text>\n ) : (\n item.value\n )}\n </dd>\n </div>\n ))}\n </dl>\n )}\n {tabs && (\n <div className={classes.tabsWrapper}>\n <HeaderNav tabs={tabs} activeTabId={activeTabId} />\n </div>\n )}\n </Container>\n </>\n );\n};\n\n/**\n * @public\n * @deprecated Use {@link Header} instead.\n */\nexport const HeaderPage = Header;\n"],"names":["Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"Header.esm.js","sources":["../../../src/components/Header/Header.tsx"],"sourcesContent":["/*\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\nimport type { HeaderProps } from './types';\nimport { Text } from '../Text';\nimport { RiArrowRightSLine } from '@remixicon/react';\nimport { HeaderNav } from './HeaderNav';\nimport { useDefinition } from '../../hooks/useDefinition';\nimport { HeaderDefinition } from './definition';\nimport { sanitizeUrl } from '@braintree/sanitize-url';\nimport { Lexer } from 'marked';\nimport { Link } from '../Link';\nimport { Fragment, useEffect, useMemo, useRef, useState } from 'react';\nimport { Container } from '../Container';\n\nconst getScrollParent = (element: HTMLElement | null): Element | null => {\n let parent = element?.parentElement;\n\n while (parent) {\n const { overflow, overflowX, overflowY } = window.getComputedStyle(parent);\n\n if (\n /(auto|scroll|overlay|hidden)/.test(`${overflow}${overflowX}${overflowY}`)\n ) {\n return parent;\n }\n\n parent = parent.parentElement;\n }\n\n return null;\n};\n\nconst isStickySentinelOutOfView = (\n sentinel: HTMLElement,\n root: Element | null,\n) => {\n const sentinelRect = sentinel.getBoundingClientRect();\n const rootTop = root ? root.getBoundingClientRect().top : 0;\n\n return sentinelRect.bottom <= rootTop;\n};\n\n/**\n * Parses inline Markdown links in a string and returns an array of React nodes.\n * URLs are sanitized via `@braintree/sanitize-url`; unsafe URLs are rendered as\n * plain text. Uses `marked` instead of `react-markdown` to avoid ESM issues.\n */\nfunction renderInlineMarkdown(text: string): React.ReactNode[] {\n return Lexer.lexInline(text).map((token, i) => {\n if (token.type === 'link') {\n const href = sanitizeUrl(token.href);\n if (href === 'about:blank') return token.text;\n return (\n <Link key={i} href={href} standalone>\n {token.text}\n </Link>\n );\n }\n return token.raw;\n });\n}\n\n/**\n * A secondary header with title, breadcrumbs, tabs, and actions.\n *\n * @public\n */\nexport const Header = (props: HeaderProps) => {\n const { ownProps, dataAttributes } = useDefinition(HeaderDefinition, props, {\n classNameTarget: 'content',\n });\n const {\n classes,\n title,\n tabs,\n activeTabId,\n customActions,\n breadcrumbs,\n description,\n tags,\n metadata,\n sticky,\n } = ownProps;\n\n const descriptionNodes = useMemo(\n () => (description ? renderInlineMarkdown(description) : null),\n [description],\n );\n\n // The sentinel sits directly before the sticky content and leaves the\n // viewport when the content becomes stuck, letting us toggle stuck styling.\n const stickySentinelRef = useRef<HTMLDivElement>(null);\n const [isStuck, setIsStuck] = useState(false);\n\n useEffect(() => {\n if (!sticky) {\n setIsStuck(false);\n return;\n }\n\n const sentinel = stickySentinelRef.current;\n if (!sentinel) {\n return;\n }\n\n const root = getScrollParent(sentinel);\n\n if (typeof IntersectionObserver === 'undefined') {\n const updateStuckState = () => {\n setIsStuck(isStickySentinelOutOfView(sentinel, root));\n };\n const scrollTarget = root ?? window;\n\n updateStuckState();\n scrollTarget.addEventListener('scroll', updateStuckState, {\n passive: true,\n });\n window.addEventListener('resize', updateStuckState);\n\n return () => {\n scrollTarget.removeEventListener('scroll', updateStuckState);\n window.removeEventListener('resize', updateStuckState);\n };\n }\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n setIsStuck(!entry.isIntersecting);\n },\n { root, threshold: 0 },\n );\n\n observer.observe(sentinel);\n\n return () => {\n observer.disconnect();\n };\n }, [sticky]);\n\n return (\n <>\n <Container\n className={classes.headerTop}\n data-sticky={sticky || undefined}\n >\n {tags && tags.length > 0 && (\n <ul className={classes.tags}>\n {tags.map((tag, i) => (\n <li\n key={`${i}:${tag.label}:${tag.href ?? ''}`}\n className={classes.tag}\n >\n {tag.href ? (\n <Link\n href={tag.href}\n variant=\"body-medium\"\n color=\"secondary\"\n standalone\n >\n {tag.label}\n </Link>\n ) : (\n <Text variant=\"body-medium\" color=\"secondary\">\n {tag.label}\n </Text>\n )}\n </li>\n ))}\n </ul>\n )}\n </Container>\n {sticky && (\n <div\n ref={stickySentinelRef}\n className={classes.stickySentinel}\n data-sticky=\"\"\n aria-hidden=\"true\"\n />\n )}\n <Container\n className={classes.content}\n data-sticky={sticky || undefined}\n data-stuck={isStuck || undefined}\n data-has-tags={tags && tags.length > 0 ? '' : undefined}\n {...dataAttributes}\n >\n <div className={classes.titleStack}>\n {isStuck ? (\n <div className={classes.breadcrumbsSmall}>\n {breadcrumbs &&\n breadcrumbs.map(breadcrumb => (\n <Fragment key={breadcrumb.label}>\n <Link\n href={breadcrumb.href}\n color=\"secondary\"\n className={classes.breadcrumbLinkSmall}\n standalone\n >\n {breadcrumb.label}\n </Link>\n <RiArrowRightSLine\n className={classes.breadcrumbSeparator}\n size={16}\n color=\"var(--bui-fg-secondary)\"\n />\n </Fragment>\n ))}\n <h2 className={classes.titleSmall}>{title}</h2>\n </div>\n ) : (\n <div className={classes.breadcrumbs}>\n {breadcrumbs &&\n breadcrumbs.map(breadcrumb => (\n <Fragment key={breadcrumb.label}>\n <Link\n href={breadcrumb.href}\n color=\"secondary\"\n className={classes.breadcrumbLink}\n standalone\n >\n {breadcrumb.label}\n </Link>\n <RiArrowRightSLine\n className={classes.breadcrumbSeparator}\n size={16}\n color=\"var(--bui-fg-secondary)\"\n />\n </Fragment>\n ))}\n <h2 className={classes.title}>{title}</h2>\n </div>\n )}\n </div>\n <div className={classes.controls}>{customActions}</div>\n </Container>\n <Container\n className={classes.headerBottom}\n data-sticky={sticky || undefined}\n >\n {description && (\n <Text\n variant=\"body-medium\"\n color=\"secondary\"\n className={classes.description}\n >\n {descriptionNodes}\n </Text>\n )}\n {metadata && metadata.length > 0 && (\n <dl className={classes.metaRow}>\n {metadata.map((item, i) => (\n <div key={`${i}:${item.label}`} className={classes.metaItem}>\n <dt>\n <Text variant=\"body-medium\" color=\"secondary\">\n {item.label}\n </Text>\n </dt>\n <dd>\n {typeof item.value === 'string' ? (\n <Text variant=\"body-medium\">{item.value}</Text>\n ) : (\n item.value\n )}\n </dd>\n </div>\n ))}\n </dl>\n )}\n {tabs && (\n <div className={classes.tabsWrapper}>\n <HeaderNav tabs={tabs} activeTabId={activeTabId} />\n </div>\n )}\n </Container>\n </>\n );\n};\n\n/**\n * @public\n * @deprecated Use {@link Header} instead.\n */\nexport const HeaderPage = Header;\n"],"names":["Fragment"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
2
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 tokens, base, components, utilities;\n\n@layer components {\n .Header_bui-HeaderTop__f866914784.Header_bui-HeaderTop__f866914784,\n .Header_bui-HeaderContent__f866914784.Header_bui-HeaderContent__f866914784 {\n flex: none;\n margin-bottom: 0;\n }\n\n .Header_bui-HeaderBottom__f866914784 {\n display: flex;\n flex-direction: column;\n gap: var(--bui-space-3);\n margin-bottom: var(--bui-space-5);\n }\n\n .Header_bui-HeaderBottom__f866914784.Header_bui-HeaderBottom__f866914784 {\n flex: none;\n margin-bottom: var(--bui-space-5);\n }\n\n .Header_bui-HeaderStickySentinel__f866914784 {\n height: 1px;\n margin-bottom: -1px;\n pointer-events: none;\n }\n\n .Header_bui-HeaderContent__f866914784 {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n gap: var(--bui-space-3);\n padding-top: var(--bui-space-3);\n padding-bottom: var(--bui-space-3);\n }\n\n .Header_bui-HeaderContent__f866914784[data-has-tags] {\n padding-top: var(--bui-space-2);\n }\n\n .Header_bui-HeaderContent__f866914784[data-sticky] {\n position: sticky;\n top: 0;\n z-index: 10;\n background-color: var(--bui-bg-app);\n\n &[data-on-bg='neutral-1'] {\n background-color: var(--bui-bg-neutral-1);\n }\n\n &[data-on-bg='neutral-2'] {\n background-color: var(--bui-bg-neutral-2);\n }\n\n &[data-on-bg='neutral-3'] {\n background-color: var(--bui-bg-neutral-3);\n }\n }\n\n .Header_bui-HeaderContent__f866914784[data-sticky]::after {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 1px;\n content: '';\n background-color: var(--bui-border-1);\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n .Header_bui-HeaderContent__f866914784[data-stuck]::after {\n opacity: 1;\n }\n\n .Header_bui-HeaderTabsWrapper__f866914784 {\n margin-left: -8px;\n }\n\n .Header_bui-HeaderControls__f866914784 {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-2);\n flex-shrink: 0;\n }\n\n .Header_bui-HeaderTitleStack__f866914784 {\n position: relative;\n flex: 1 1 auto;\n height: 1lh;\n min-width: 0;\n font-size: var(--bui-font-size-6);\n line-height: 140%;\n overflow: hidden;\n }\n\n .Header_bui-HeaderBreadcrumbs__f866914784,\n .Header_bui-HeaderBreadcrumbsSmall__f866914784 {\n position: absolute;\n inset-inline: 0;\n top: 50%;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-2);\n min-width: 0;\n transform: translateY(-50%);\n }\n\n .Header_bui-HeaderBreadcrumbsSmall__f866914784 {\n gap: var(--bui-space-1);\n }\n\n /*\n * Link variant defaults have the same specificity as these contextual styles.\n * Repeat the slot class so the Header styles win regardless of stylesheet order.\n */\n .Header_bui-HeaderBreadcrumbs__f866914784 .Header_bui-HeaderBreadcrumbLink__f866914784.Header_bui-HeaderBreadcrumbLink__f866914784,\n .Header_bui-HeaderBreadcrumbsSmall__f866914784\n .Header_bui-HeaderBreadcrumbLinkSmall__f866914784.Header_bui-HeaderBreadcrumbLinkSmall__f866914784 {\n max-width: 240px;\n overflow: hidden;\n font-family: var(--bui-font-regular);\n font-weight: var(--bui-font-weight-bold);\n line-height: inherit;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .Header_bui-HeaderBreadcrumbs__f866914784 .Header_bui-HeaderBreadcrumbLink__f866914784.Header_bui-HeaderBreadcrumbLink__f866914784 {\n font-size: inherit;\n }\n\n .Header_bui-HeaderBreadcrumbsSmall__f866914784\n .Header_bui-HeaderBreadcrumbLinkSmall__f866914784.Header_bui-HeaderBreadcrumbLinkSmall__f866914784 {\n font-size: var(--bui-font-size-4);\n }\n\n .Header_bui-HeaderBreadcrumbSeparator__f866914784 {\n flex-shrink: 0;\n }\n\n .Header_bui-HeaderTitle__f866914784,\n .Header_bui-HeaderTitleSmall__f866914784 {\n margin: 0;\n padding: 0;\n flex: 1 1 auto;\n min-width: 0;\n font-family: var(--bui-font-regular);\n font-weight: var(--bui-font-weight-bold);\n line-height: inherit;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .Header_bui-HeaderTitle__f866914784 {\n font-size: inherit;\n }\n\n .Header_bui-HeaderTitleSmall__f866914784 {\n font-size: var(--bui-font-size-4);\n }\n\n .Header_bui-HeaderTags__f866914784 {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-2);\n flex-wrap: wrap;\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .Header_bui-HeaderTag__f866914784 {\n display: flex;\n align-items: center;\n gap: var(--bui-space-2);\n }\n\n .Header_bui-HeaderTag__f866914784 + .Header_bui-HeaderTag__f866914784::before {\n content: '';\n width: 3px;\n height: 3px;\n border-radius: 50%;\n background-color: var(--bui-fg-secondary);\n flex-shrink: 0;\n }\n\n .Header_bui-HeaderMetaRow__f866914784 {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-5);\n flex-wrap: wrap;\n margin: 0;\n }\n\n .Header_bui-HeaderMetaItem__f866914784 {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-2);\n\n dd {\n margin: 0;\n }\n }\n}\n";
4
- var styles = {"bui-HeaderTop":"Header_bui-HeaderTop__f866914784","bui-HeaderContent":"Header_bui-HeaderContent__f866914784","bui-HeaderBottom":"Header_bui-HeaderBottom__f866914784","bui-HeaderStickySentinel":"Header_bui-HeaderStickySentinel__f866914784","bui-HeaderTabsWrapper":"Header_bui-HeaderTabsWrapper__f866914784","bui-HeaderControls":"Header_bui-HeaderControls__f866914784","bui-HeaderTitleStack":"Header_bui-HeaderTitleStack__f866914784","bui-HeaderBreadcrumbs":"Header_bui-HeaderBreadcrumbs__f866914784","bui-HeaderBreadcrumbsSmall":"Header_bui-HeaderBreadcrumbsSmall__f866914784","bui-HeaderBreadcrumbLink":"Header_bui-HeaderBreadcrumbLink__f866914784","bui-HeaderBreadcrumbLinkSmall":"Header_bui-HeaderBreadcrumbLinkSmall__f866914784","bui-HeaderBreadcrumbSeparator":"Header_bui-HeaderBreadcrumbSeparator__f866914784","bui-HeaderTitle":"Header_bui-HeaderTitle__f866914784","bui-HeaderTitleSmall":"Header_bui-HeaderTitleSmall__f866914784","bui-HeaderTags":"Header_bui-HeaderTags__f866914784","bui-HeaderTag":"Header_bui-HeaderTag__f866914784","bui-HeaderMetaRow":"Header_bui-HeaderMetaRow__f866914784","bui-HeaderMetaItem":"Header_bui-HeaderMetaItem__f866914784"};
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 tokens, base, components, theme, utilities;\n\n@layer components {\n .Header_bui-HeaderTop__ede29d4b6e.Header_bui-HeaderTop__ede29d4b6e,\n .Header_bui-HeaderContent__ede29d4b6e.Header_bui-HeaderContent__ede29d4b6e {\n flex: none;\n margin-bottom: 0;\n }\n\n .Header_bui-HeaderBottom__ede29d4b6e {\n display: flex;\n flex-direction: column;\n gap: var(--bui-space-3);\n margin-bottom: var(--bui-space-5);\n }\n\n .Header_bui-HeaderBottom__ede29d4b6e.Header_bui-HeaderBottom__ede29d4b6e {\n flex: none;\n margin-bottom: var(--bui-space-5);\n }\n\n .Header_bui-HeaderStickySentinel__ede29d4b6e {\n height: 1px;\n margin-bottom: -1px;\n pointer-events: none;\n }\n\n .Header_bui-HeaderContent__ede29d4b6e {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n gap: var(--bui-space-3);\n padding-top: var(--bui-space-3);\n padding-bottom: var(--bui-space-3);\n }\n\n .Header_bui-HeaderContent__ede29d4b6e[data-has-tags] {\n padding-top: var(--bui-space-2);\n }\n\n .Header_bui-HeaderContent__ede29d4b6e[data-sticky] {\n position: sticky;\n top: 0;\n z-index: 10;\n background-color: var(--bui-bg-app);\n\n &[data-on-bg='neutral-1'] {\n background-color: var(--bui-bg-neutral-1);\n }\n\n &[data-on-bg='neutral-2'] {\n background-color: var(--bui-bg-neutral-2);\n }\n\n &[data-on-bg='neutral-3'] {\n background-color: var(--bui-bg-neutral-3);\n }\n }\n\n .Header_bui-HeaderContent__ede29d4b6e[data-sticky]::after {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 1px;\n content: '';\n background-color: var(--bui-border-1);\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n .Header_bui-HeaderContent__ede29d4b6e[data-stuck]::after {\n opacity: 1;\n }\n\n .Header_bui-HeaderTabsWrapper__ede29d4b6e {\n margin-left: -8px;\n }\n\n .Header_bui-HeaderControls__ede29d4b6e {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-2);\n flex-shrink: 0;\n }\n\n .Header_bui-HeaderTitleStack__ede29d4b6e {\n position: relative;\n flex: 1 1 auto;\n height: 1lh;\n min-width: 0;\n font-size: var(--bui-font-size-6);\n line-height: 140%;\n overflow: hidden;\n }\n\n .Header_bui-HeaderBreadcrumbs__ede29d4b6e,\n .Header_bui-HeaderBreadcrumbsSmall__ede29d4b6e {\n position: absolute;\n inset-inline: 0;\n top: 50%;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-2);\n min-width: 0;\n transform: translateY(-50%);\n }\n\n .Header_bui-HeaderBreadcrumbsSmall__ede29d4b6e {\n gap: var(--bui-space-1);\n }\n\n /*\n * Link variant defaults have the same specificity as these contextual styles.\n * Repeat the slot class so the Header styles win regardless of stylesheet order.\n */\n .Header_bui-HeaderBreadcrumbs__ede29d4b6e .Header_bui-HeaderBreadcrumbLink__ede29d4b6e.Header_bui-HeaderBreadcrumbLink__ede29d4b6e,\n .Header_bui-HeaderBreadcrumbsSmall__ede29d4b6e\n .Header_bui-HeaderBreadcrumbLinkSmall__ede29d4b6e.Header_bui-HeaderBreadcrumbLinkSmall__ede29d4b6e {\n max-width: 240px;\n overflow: hidden;\n font-family: var(--bui-font-regular);\n font-weight: var(--bui-font-weight-bold);\n line-height: inherit;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .Header_bui-HeaderBreadcrumbs__ede29d4b6e .Header_bui-HeaderBreadcrumbLink__ede29d4b6e.Header_bui-HeaderBreadcrumbLink__ede29d4b6e {\n font-size: inherit;\n }\n\n .Header_bui-HeaderBreadcrumbsSmall__ede29d4b6e\n .Header_bui-HeaderBreadcrumbLinkSmall__ede29d4b6e.Header_bui-HeaderBreadcrumbLinkSmall__ede29d4b6e {\n font-size: var(--bui-font-size-4);\n }\n\n .Header_bui-HeaderBreadcrumbSeparator__ede29d4b6e {\n flex-shrink: 0;\n }\n\n .Header_bui-HeaderTitle__ede29d4b6e,\n .Header_bui-HeaderTitleSmall__ede29d4b6e {\n margin: 0;\n padding: 0;\n flex: 1 1 auto;\n min-width: 0;\n font-family: var(--bui-font-regular);\n font-weight: var(--bui-font-weight-bold);\n line-height: inherit;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .Header_bui-HeaderTitle__ede29d4b6e {\n font-size: inherit;\n }\n\n .Header_bui-HeaderTitleSmall__ede29d4b6e {\n font-size: var(--bui-font-size-4);\n }\n\n .Header_bui-HeaderTags__ede29d4b6e {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-2);\n flex-wrap: wrap;\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .Header_bui-HeaderTag__ede29d4b6e {\n display: flex;\n align-items: center;\n gap: var(--bui-space-2);\n }\n\n .Header_bui-HeaderTag__ede29d4b6e + .Header_bui-HeaderTag__ede29d4b6e::before {\n content: '';\n width: 3px;\n height: 3px;\n border-radius: 50%;\n background-color: var(--bui-fg-secondary);\n flex-shrink: 0;\n }\n\n .Header_bui-HeaderMetaRow__ede29d4b6e {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-5);\n flex-wrap: wrap;\n margin: 0;\n }\n\n .Header_bui-HeaderMetaItem__ede29d4b6e {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-2);\n\n dd {\n margin: 0;\n }\n }\n}\n";
4
+ var styles = {"bui-HeaderTop":"Header_bui-HeaderTop__ede29d4b6e","bui-HeaderContent":"Header_bui-HeaderContent__ede29d4b6e","bui-HeaderBottom":"Header_bui-HeaderBottom__ede29d4b6e","bui-HeaderStickySentinel":"Header_bui-HeaderStickySentinel__ede29d4b6e","bui-HeaderTabsWrapper":"Header_bui-HeaderTabsWrapper__ede29d4b6e","bui-HeaderControls":"Header_bui-HeaderControls__ede29d4b6e","bui-HeaderTitleStack":"Header_bui-HeaderTitleStack__ede29d4b6e","bui-HeaderBreadcrumbs":"Header_bui-HeaderBreadcrumbs__ede29d4b6e","bui-HeaderBreadcrumbsSmall":"Header_bui-HeaderBreadcrumbsSmall__ede29d4b6e","bui-HeaderBreadcrumbLink":"Header_bui-HeaderBreadcrumbLink__ede29d4b6e","bui-HeaderBreadcrumbLinkSmall":"Header_bui-HeaderBreadcrumbLinkSmall__ede29d4b6e","bui-HeaderBreadcrumbSeparator":"Header_bui-HeaderBreadcrumbSeparator__ede29d4b6e","bui-HeaderTitle":"Header_bui-HeaderTitle__ede29d4b6e","bui-HeaderTitleSmall":"Header_bui-HeaderTitleSmall__ede29d4b6e","bui-HeaderTags":"Header_bui-HeaderTags__ede29d4b6e","bui-HeaderTag":"Header_bui-HeaderTag__ede29d4b6e","bui-HeaderMetaRow":"Header_bui-HeaderMetaRow__ede29d4b6e","bui-HeaderMetaItem":"Header_bui-HeaderMetaItem__ede29d4b6e"};
5
5
  styleInject(css_248z);
6
6
 
7
7
  export { styles as default };
@@ -1 +1 @@
1
- {"version":3,"file":"Header.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
1
+ {"version":3,"file":"Header.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderMetadataStatus.esm.js","sources":["../../../src/components/Header/HeaderMetadataStatus.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 type { HeaderMetadataStatusProps } from './types';\nimport { Text } from '../Text';\nimport { Link } from '../Link';\nimport styles from './HeaderMetadataStatus.module.css';\n\n/**\n * Displays a single status indicator as a colored dot with a label inside a\n * Header metadata value. Optionally renders the label as a link when href is provided.\n *\n * @public\n */\nexport const HeaderMetadataStatus = ({\n label,\n color,\n href,\n}: HeaderMetadataStatusProps) => {\n return (\n <div className={styles.single}>\n <span\n aria-hidden=\"true\"\n className={`${styles.dot} ${styles[`dot-${color}`]}`}\n />\n <Text variant=\"body-medium\">\n {href ? (\n <Link href={href} standalone>\n {label}\n </Link>\n ) : (\n label\n )}\n </Text>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA2BO,MAAM,uBAAuB,CAAC;AAAA,EACnC,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,KAAiC;AAC/B,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,MAAA,EACrB,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAW,GAAG,MAAA,CAAO,GAAG,IAAI,MAAA,CAAO,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAC,CAAA;AAAA;AAAA,KACpD;AAAA,oBACA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,aAAA,EACX,QAAA,EAAA,IAAA,mBACC,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAY,UAAA,EAAU,IAAA,EACzB,QAAA,EAAA,KAAA,EACH,CAAA,GAEA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"HeaderMetadataStatus.esm.js","sources":["../../../src/components/Header/HeaderMetadataStatus.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 type { HeaderMetadataStatusProps } from './types';\nimport { Text } from '../Text';\nimport { Link } from '../Link';\nimport styles from './HeaderMetadataStatus.module.css';\n\n/**\n * Displays a single status indicator as a colored dot with a label inside a\n * Header metadata value. Optionally renders the label as a link when href is provided.\n *\n * @public\n */\nexport const HeaderMetadataStatus = ({\n label,\n color,\n href,\n}: HeaderMetadataStatusProps) => {\n return (\n <div className={styles.single}>\n <span\n aria-hidden=\"true\"\n className={`${styles.dot} ${styles[`dot-${color}`]}`}\n />\n <Text variant=\"body-medium\">\n {href ? (\n <Link href={href} standalone>\n {label}\n </Link>\n ) : (\n label\n )}\n </Text>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA2BO,MAAM,uBAAuB,CAAC;AAAA,EACnC,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,KAAiC;AAC/B,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,MAAA,EACrB,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAW,GAAG,MAAA,CAAO,GAAG,IAAI,MAAA,CAAO,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAC,CAAA;AAAA;AAAA,KACpD;AAAA,oBACA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,aAAA,EACX,QAAA,EAAA,IAAA,mBACC,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAY,UAAA,EAAU,IAAA,EACzB,QAAA,EAAA,KAAA,EACH,CAAA,GAEA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;;"}
@@ -1,7 +1,7 @@
1
1
  import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
2
2
 
3
- var css_248z = "/*\n * Copyright 2026 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 tokens, base, components, utilities;\n\n@layer components {\n .HeaderMetadataStatus_single__eb0b2e23ff {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-2);\n }\n\n .HeaderMetadataStatus_dot__eb0b2e23ff {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .HeaderMetadataStatus_dot-danger__eb0b2e23ff {\n background-color: var(--bui-fg-danger);\n }\n\n .HeaderMetadataStatus_dot-warning__eb0b2e23ff {\n background-color: var(--bui-fg-warning);\n }\n\n .HeaderMetadataStatus_dot-success__eb0b2e23ff {\n background-color: var(--bui-fg-success);\n }\n\n .HeaderMetadataStatus_dot-info__eb0b2e23ff {\n background-color: var(--bui-fg-info);\n }\n}\n";
4
- var styles = {"single":"HeaderMetadataStatus_single__eb0b2e23ff","dot":"HeaderMetadataStatus_dot__eb0b2e23ff","dot-danger":"HeaderMetadataStatus_dot-danger__eb0b2e23ff","dot-warning":"HeaderMetadataStatus_dot-warning__eb0b2e23ff","dot-success":"HeaderMetadataStatus_dot-success__eb0b2e23ff","dot-info":"HeaderMetadataStatus_dot-info__eb0b2e23ff"};
3
+ var css_248z = "/*\n * Copyright 2026 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 tokens, base, components, theme, utilities;\n\n@layer components {\n .HeaderMetadataStatus_single__dae789db9f {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-2);\n }\n\n .HeaderMetadataStatus_dot__dae789db9f {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .HeaderMetadataStatus_dot-danger__dae789db9f {\n background-color: var(--bui-fg-danger);\n }\n\n .HeaderMetadataStatus_dot-warning__dae789db9f {\n background-color: var(--bui-fg-warning);\n }\n\n .HeaderMetadataStatus_dot-success__dae789db9f {\n background-color: var(--bui-fg-success);\n }\n\n .HeaderMetadataStatus_dot-info__dae789db9f {\n background-color: var(--bui-fg-info);\n }\n}\n";
4
+ var styles = {"single":"HeaderMetadataStatus_single__dae789db9f","dot":"HeaderMetadataStatus_dot__dae789db9f","dot-danger":"HeaderMetadataStatus_dot-danger__dae789db9f","dot-warning":"HeaderMetadataStatus_dot-warning__dae789db9f","dot-success":"HeaderMetadataStatus_dot-success__dae789db9f","dot-info":"HeaderMetadataStatus_dot-info__dae789db9f"};
5
5
  styleInject(css_248z);
6
6
 
7
7
  export { styles as default };
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderMetadataStatus.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
1
+ {"version":3,"file":"HeaderMetadataStatus.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderMetadataUsers.esm.js","sources":["../../../src/components/Header/HeaderMetadataUsers.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 type { HeaderMetadataUser } from './types';\nimport { Avatar } from '../Avatar';\nimport { Tooltip, TooltipTrigger } from '../Tooltip';\nimport { Text } from '../Text';\nimport { Link } from '../Link';\nimport { Pressable } from 'react-aria';\nimport styles from './HeaderMetadataUsers.module.css';\n\n/**\n * Displays a list of users as avatars inside a Header metadata value.\n * A single user shows the avatar with their name beside it.\n * Multiple users show avatars in a row with the name revealed on hover via tooltip.\n * When a user has an `href`, the avatar and name become links.\n *\n * @public\n */\nexport const HeaderMetadataUsers = ({\n users,\n}: {\n users: HeaderMetadataUser[];\n}) => {\n if (users.length === 0) return null;\n\n if (users.length === 1) {\n const user = users[0];\n if (user.href) {\n return (\n <Link\n href={user.href}\n variant=\"body-medium\"\n standalone\n className={styles.single}\n >\n <Avatar\n src={user.src ?? 'data:,'}\n name={user.name}\n size=\"small\"\n purpose=\"decoration\"\n />\n {user.name}\n </Link>\n );\n }\n\n return (\n <div className={styles.single}>\n <Avatar\n src={user.src ?? 'data:,'}\n name={user.name}\n size=\"small\"\n purpose=\"decoration\"\n />\n <Text variant=\"body-medium\">{user.name}</Text>\n </div>\n );\n }\n\n return (\n <ul className={styles.stack}>\n {users.map((user, i) => (\n <li key={user.href ?? `${i}:${user.name}`}>\n <TooltipTrigger>\n {user.href ? (\n <Link\n href={user.href}\n aria-label={user.name}\n className={styles.avatarLink}\n >\n <Avatar\n src={user.src ?? 'data:,'}\n name={user.name}\n size=\"small\"\n purpose=\"decoration\"\n />\n </Link>\n ) : (\n <Pressable>\n <Avatar\n src={user.src ?? 'data:,'}\n name={user.name}\n size=\"small\"\n purpose=\"informative\"\n />\n </Pressable>\n )}\n <Tooltip>{user.name}</Tooltip>\n </TooltipTrigger>\n </li>\n ))}\n </ul>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAgCO,MAAM,sBAAsB,CAAC;AAAA,EAClC;AACF,CAAA,KAEM;AACJ,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,uBACE,IAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAA,EAAQ,aAAA;AAAA,UACR,UAAA,EAAU,IAAA;AAAA,UACV,WAAW,MAAA,CAAO,MAAA;AAAA,UAElB,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,KAAK,GAAA,IAAO,QAAA;AAAA,gBACjB,MAAM,IAAA,CAAK,IAAA;AAAA,gBACX,IAAA,EAAK,OAAA;AAAA,gBACL,OAAA,EAAQ;AAAA;AAAA,aACV;AAAA,YACC,IAAA,CAAK;AAAA;AAAA;AAAA,OACR;AAAA,IAEJ;AAEA,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,MAAA,EACrB,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,KAAK,GAAA,IAAO,QAAA;AAAA,UACjB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAQ;AAAA;AAAA,OACV;AAAA,sBACA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,aAAA,EAAe,eAAK,IAAA,EAAK;AAAA,KAAA,EACzC,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,MAAA,CAAO,KAAA,EACnB,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAChB,GAAA,CAAC,IAAA,EAAA,EACC,+BAAC,cAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,IAAA,CAAK,IAAA,mBACJ,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,cAAY,IAAA,CAAK,IAAA;AAAA,QACjB,WAAW,MAAA,CAAO,UAAA;AAAA,QAElB,QAAA,kBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,KAAK,GAAA,IAAO,QAAA;AAAA,YACjB,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,IAAA,EAAK,OAAA;AAAA,YACL,OAAA,EAAQ;AAAA;AAAA;AACV;AAAA,KACF,uBAEC,SAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,KAAK,GAAA,IAAO,QAAA;AAAA,QACjB,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,IAAA,EAAK,OAAA;AAAA,QACL,OAAA,EAAQ;AAAA;AAAA,KACV,EACF,CAAA;AAAA,oBAEF,GAAA,CAAC,OAAA,EAAA,EAAS,QAAA,EAAA,IAAA,CAAK,IAAA,EAAK;AAAA,GAAA,EACtB,CAAA,EAAA,EA1BO,IAAA,CAAK,IAAA,IAAQ,CAAA,EAAG,CAAC,IAAI,IAAA,CAAK,IAAI,CAAA,CA2BvC,CACD,CAAA,EACH,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"HeaderMetadataUsers.esm.js","sources":["../../../src/components/Header/HeaderMetadataUsers.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 type { HeaderMetadataUser } from './types';\nimport { Avatar } from '../Avatar';\nimport { Tooltip, TooltipTrigger } from '../Tooltip';\nimport { Text } from '../Text';\nimport { Link } from '../Link';\nimport { Pressable } from 'react-aria';\nimport styles from './HeaderMetadataUsers.module.css';\n\n/**\n * Displays a list of users as avatars inside a Header metadata value.\n * A single user shows the avatar with their name beside it.\n * Multiple users show avatars in a row with the name revealed on hover via tooltip.\n * When a user has an `href`, the avatar and name become links.\n *\n * @public\n */\nexport const HeaderMetadataUsers = ({\n users,\n}: {\n users: HeaderMetadataUser[];\n}) => {\n if (users.length === 0) return null;\n\n if (users.length === 1) {\n const user = users[0];\n if (user.href) {\n return (\n <Link\n href={user.href}\n variant=\"body-medium\"\n standalone\n className={styles.single}\n >\n <Avatar\n src={user.src ?? 'data:,'}\n name={user.name}\n size=\"small\"\n purpose=\"decoration\"\n />\n {user.name}\n </Link>\n );\n }\n\n return (\n <div className={styles.single}>\n <Avatar\n src={user.src ?? 'data:,'}\n name={user.name}\n size=\"small\"\n purpose=\"decoration\"\n />\n <Text variant=\"body-medium\">{user.name}</Text>\n </div>\n );\n }\n\n return (\n <ul className={styles.stack}>\n {users.map((user, i) => (\n <li key={user.href ?? `${i}:${user.name}`}>\n <TooltipTrigger>\n {user.href ? (\n <Link\n href={user.href}\n aria-label={user.name}\n className={styles.avatarLink}\n >\n <Avatar\n src={user.src ?? 'data:,'}\n name={user.name}\n size=\"small\"\n purpose=\"decoration\"\n />\n </Link>\n ) : (\n <Pressable>\n <Avatar\n src={user.src ?? 'data:,'}\n name={user.name}\n size=\"small\"\n purpose=\"informative\"\n />\n </Pressable>\n )}\n <Tooltip>{user.name}</Tooltip>\n </TooltipTrigger>\n </li>\n ))}\n </ul>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAgCO,MAAM,sBAAsB,CAAC;AAAA,EAClC;AACF,CAAA,KAEM;AACJ,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,uBACE,IAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAA,EAAQ,aAAA;AAAA,UACR,UAAA,EAAU,IAAA;AAAA,UACV,WAAW,MAAA,CAAO,MAAA;AAAA,UAElB,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,KAAK,GAAA,IAAO,QAAA;AAAA,gBACjB,MAAM,IAAA,CAAK,IAAA;AAAA,gBACX,IAAA,EAAK,OAAA;AAAA,gBACL,OAAA,EAAQ;AAAA;AAAA,aACV;AAAA,YACC,IAAA,CAAK;AAAA;AAAA;AAAA,OACR;AAAA,IAEJ;AAEA,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,MAAA,EACrB,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,KAAK,GAAA,IAAO,QAAA;AAAA,UACjB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAQ;AAAA;AAAA,OACV;AAAA,sBACA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,aAAA,EAAe,eAAK,IAAA,EAAK;AAAA,KAAA,EACzC,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,MAAA,CAAO,KAAA,EACnB,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAChB,GAAA,CAAC,IAAA,EAAA,EACC,+BAAC,cAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,IAAA,CAAK,IAAA,mBACJ,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,cAAY,IAAA,CAAK,IAAA;AAAA,QACjB,WAAW,MAAA,CAAO,UAAA;AAAA,QAElB,QAAA,kBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,KAAK,GAAA,IAAO,QAAA;AAAA,YACjB,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,IAAA,EAAK,OAAA;AAAA,YACL,OAAA,EAAQ;AAAA;AAAA;AACV;AAAA,KACF,uBAEC,SAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,KAAK,GAAA,IAAO,QAAA;AAAA,QACjB,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,IAAA,EAAK,OAAA;AAAA,QACL,OAAA,EAAQ;AAAA;AAAA,KACV,EACF,CAAA;AAAA,oBAEF,GAAA,CAAC,OAAA,EAAA,EAAS,QAAA,EAAA,IAAA,CAAK,IAAA,EAAK;AAAA,GAAA,EACtB,CAAA,EAAA,EA1BO,IAAA,CAAK,IAAA,IAAQ,CAAA,EAAG,CAAC,IAAI,IAAA,CAAK,IAAI,CAAA,CA2BvC,CACD,CAAA,EACH,CAAA;AAEJ;;"}
@@ -1,7 +1,7 @@
1
1
  import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
2
2
 
3
- var css_248z = "/*\n * Copyright 2026 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 tokens, base, components, utilities;\n\n@layer components {\n .HeaderMetadataUsers_single__24e14a3de1 {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-2);\n }\n\n .HeaderMetadataUsers_stack__24e14a3de1 {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-1);\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .HeaderMetadataUsers_avatarLink__24e14a3de1 {\n display: flex;\n text-decoration: none;\n }\n}\n";
4
- var styles = {"single":"HeaderMetadataUsers_single__24e14a3de1","stack":"HeaderMetadataUsers_stack__24e14a3de1","avatarLink":"HeaderMetadataUsers_avatarLink__24e14a3de1"};
3
+ var css_248z = "/*\n * Copyright 2026 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 tokens, base, components, theme, utilities;\n\n@layer components {\n .HeaderMetadataUsers_single__e1d6d3b0c0 {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-2);\n }\n\n .HeaderMetadataUsers_stack__e1d6d3b0c0 {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--bui-space-1);\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .HeaderMetadataUsers_avatarLink__e1d6d3b0c0 {\n display: flex;\n text-decoration: none;\n }\n}\n";
4
+ var styles = {"single":"HeaderMetadataUsers_single__e1d6d3b0c0","stack":"HeaderMetadataUsers_stack__e1d6d3b0c0","avatarLink":"HeaderMetadataUsers_avatarLink__e1d6d3b0c0"};
5
5
  styleInject(css_248z);
6
6
 
7
7
  export { styles as default };
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderMetadataUsers.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
1
+ {"version":3,"file":"HeaderMetadataUsers.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderNav.esm.js","sources":["../../../src/components/Header/HeaderNav.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { useCallback, useMemo, useRef, useState } from 'react';\nimport { mergeProps, useFocusVisible, useHover, useLink } from 'react-aria';\nimport {\n matchRoutes,\n resolvePath,\n type NavigateOptions,\n} from 'react-router-dom';\nimport { Button as RAButton } from 'react-aria-components';\nimport { RiArrowDownSLine } from '@remixicon/react';\nimport {\n useDefinition,\n type UseDefinitionResult,\n} from '../../hooks/useDefinition';\nimport {\n HeaderNavDefinition,\n HeaderNavItemDefinition,\n HeaderNavGroupDefinition,\n} from './HeaderNavDefinition';\nimport { HeaderNavIndicators } from './HeaderNavIndicators';\nimport { MenuTrigger, Menu, MenuItem } from '../Menu';\nimport type {\n HeaderNavLinkProps,\n HeaderNavTabGroup,\n HeaderNavTabItem,\n} from './types';\nimport { useRoutingIntegration } from '../../navigation/useRouting';\nimport type { AnchorNavigation } from '../../navigation/useNavigation';\n\nfunction isTabGroup(tab: HeaderNavTabItem): tab is HeaderNavTabGroup {\n return 'items' in tab;\n}\n\ntype HeaderNavLinkViewProps = {\n definitionResult: UseDefinitionResult<\n typeof HeaderNavItemDefinition,\n HeaderNavLinkProps\n >;\n navigation: AnchorNavigation;\n};\n\nfunction HeaderNavLinkView({\n definitionResult,\n navigation,\n}: HeaderNavLinkViewProps) {\n const { ownProps, analytics } = definitionResult;\n const { id, label, active, registerRef, onHighlight } = ownProps;\n const { href } = ownProps;\n\n const linkRef = useRef<HTMLAnchorElement>(null);\n let ariaHref = href;\n let routerOptions: NavigateOptions | undefined;\n if (navigation.type === 'router') {\n ariaHref = navigation.ariaHref;\n routerOptions = navigation.routerOptions;\n } else if (navigation.type === 'native') {\n ariaHref = navigation.ariaHref;\n }\n const { linkProps } = useLink(\n {\n href: ariaHref,\n routerOptions,\n },\n linkRef,\n );\n const { hoverProps } = useHover({\n onHoverStart: () => onHighlight(id),\n onHoverEnd: () => onHighlight(null),\n });\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n linkProps.onClick?.(e);\n analytics.captureEvent('click', label, {\n attributes: { to: href },\n });\n };\n const { href: _href, ...anchorProps } = mergeProps(\n linkProps,\n hoverProps,\n ) as React.AnchorHTMLAttributes<HTMLAnchorElement>;\n const ref = (el: HTMLAnchorElement | null) => {\n (linkRef as React.MutableRefObject<HTMLAnchorElement | null>).current = el;\n registerRef(id, el);\n };\n const commonProps = {\n ...anchorProps,\n ref,\n className: ownProps.classes.root,\n 'aria-current': active ? ('page' as const) : undefined,\n onClick: handleClick,\n onFocus: () => onHighlight(id),\n onBlur: () => onHighlight(null),\n children: label,\n };\n const browserHref =\n navigation.type === 'native' ? navigation.browserHref : href;\n\n return (\n <li>\n {navigation.type === 'router' ? (\n <navigation.Link\n {...commonProps}\n {...navigation.routerLinkOptions}\n to={navigation.to}\n />\n ) : (\n <a {...commonProps} href={browserHref} />\n )}\n </li>\n );\n}\n\nfunction HeaderNavLink(props: HeaderNavLinkProps) {\n const definitionResult = useDefinition(HeaderNavItemDefinition, props);\n const Navigation = definitionResult.navigation;\n\n return (\n <Navigation\n props={{ href: definitionResult.ownProps.href }}\n view={HeaderNavLinkView}\n viewProps={{ definitionResult }}\n />\n );\n}\n\ninterface HeaderNavGroupItemProps {\n group: HeaderNavTabGroup;\n active: boolean;\n activeChildId?: string;\n registerRef: (key: string, el: HTMLElement | null) => void;\n onHighlight: (key: string | null) => void;\n}\n\nfunction HeaderNavGroupItem(props: HeaderNavGroupItemProps) {\n const { group, active, activeChildId, registerRef, onHighlight } = props;\n const { ownProps } = useDefinition(HeaderNavGroupDefinition, {});\n const { hoverProps } = useHover({\n onHoverStart: () => onHighlight(group.id),\n onHoverEnd: () => onHighlight(null),\n });\n\n return (\n <li>\n <MenuTrigger>\n <RAButton\n ref={el => {\n registerRef(group.id, el);\n }}\n className={ownProps.classes.root}\n aria-current={active ? 'page' : undefined}\n {...hoverProps}\n onFocus={() => onHighlight(group.id)}\n onBlur={() => onHighlight(null)}\n >\n {group.label}\n <RiArrowDownSLine size={16} />\n </RAButton>\n <Menu\n selectionMode=\"single\"\n selectedKeys={new Set(activeChildId ? [activeChildId] : [])}\n >\n {group.items.map(item => (\n <MenuItem key={item.id} id={item.id} href={item.href}>\n {item.label}\n </MenuItem>\n ))}\n </Menu>\n </MenuTrigger>\n </li>\n );\n}\n\ninterface HeaderNavProps {\n tabs: HeaderNavTabItem[];\n activeTabId?: string | null;\n}\n\nfunction useAutoActiveTabId(tabs: HeaderNavTabItem[]): string | undefined {\n const routing = useRoutingIntegration({ fallback: true });\n const basePath = routing.useResolvedPath('.').pathname;\n const { pathname } = routing.useLocation();\n\n return useMemo(() => {\n const allTabs = tabs.flatMap(tab => (isTabGroup(tab) ? tab.items : [tab]));\n const routeObjects = allTabs.map(tab => ({\n path: `${resolvePath(tab.href, basePath).pathname}/*`,\n id: tab.id,\n }));\n const matches = matchRoutes(routeObjects, pathname);\n return matches?.[0]?.route.id;\n }, [tabs, basePath, pathname]);\n}\n\nfunction HeaderNavAutoDetect(props: { tabs: HeaderNavTabItem[] }) {\n const activeTabId = useAutoActiveTabId(props.tabs);\n return <HeaderNavInner tabs={props.tabs} activeTabId={activeTabId} />;\n}\n\nfunction HeaderNavInner(props: HeaderNavProps) {\n const { tabs, activeTabId } = props;\n const { ownProps } = useDefinition(HeaderNavDefinition, {\n tabs,\n activeTabId,\n });\n const { classes } = ownProps;\n\n const { isFocusVisible } = useFocusVisible();\n const navRef = useRef<HTMLElement>(null);\n const itemRefs = useRef<Map<string, HTMLElement>>(new Map());\n\n const [highlightedKey, setHighlightedKey] = useState<string | null>(null);\n\n // Resolve activeTabId to a top-level key (groups own their children's active state)\n const { activeKey, activeChildId } = useMemo(() => {\n if (!activeTabId) return { activeKey: undefined, activeChildId: undefined };\n for (const item of tabs) {\n if (isTabGroup(item)) {\n const child = item.items.find(c => c.id === activeTabId);\n if (child) {\n return { activeKey: item.id, activeChildId: child.id };\n }\n } else if (item.id === activeTabId) {\n return { activeKey: item.id, activeChildId: undefined };\n }\n }\n return { activeKey: undefined, activeChildId: undefined };\n }, [activeTabId, tabs]);\n\n const registerRef = useCallback((key: string, el: HTMLElement | null) => {\n if (el) {\n itemRefs.current.set(key, el);\n } else {\n itemRefs.current.delete(key);\n }\n }, []);\n\n return (\n <nav\n ref={navRef}\n aria-label=\"Content navigation\"\n className={classes.root}\n data-focus-visible={isFocusVisible || undefined}\n >\n <ul role=\"list\" className={classes.list}>\n {tabs.map(item =>\n isTabGroup(item) ? (\n <HeaderNavGroupItem\n key={item.id}\n group={item}\n active={activeKey === item.id}\n activeChildId={activeChildId}\n registerRef={registerRef}\n onHighlight={setHighlightedKey}\n />\n ) : (\n <HeaderNavLink\n key={item.id}\n id={item.id}\n label={item.label}\n href={item.href}\n active={activeKey === item.id}\n registerRef={registerRef}\n onHighlight={setHighlightedKey}\n />\n ),\n )}\n </ul>\n <HeaderNavIndicators\n navRef={navRef}\n itemRefs={itemRefs}\n activeKey={activeKey}\n highlightedKey={highlightedKey}\n classes={{ active: classes.active, hovered: classes.hovered }}\n />\n </nav>\n );\n}\n\n/** @internal */\nexport function HeaderNav(props: HeaderNavProps) {\n const routing = useRoutingIntegration({ fallback: true });\n const inRouter = routing.useInRouterContext();\n\n if (props.activeTabId === undefined && inRouter) {\n return <HeaderNavAutoDetect tabs={props.tabs} />;\n }\n\n return <HeaderNavInner tabs={props.tabs} activeTabId={props.activeTabId} />;\n}\n"],"names":["RAButton"],"mappings":"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"}
1
+ {"version":3,"file":"HeaderNav.esm.js","sources":["../../../src/components/Header/HeaderNav.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { useCallback, useMemo, useRef, useState } from 'react';\nimport { mergeProps, useFocusVisible, useHover, useLink } from 'react-aria';\nimport {\n matchRoutes,\n resolvePath,\n type NavigateOptions,\n} from 'react-router-dom';\nimport { Button as RAButton } from 'react-aria-components';\nimport { RiArrowDownSLine } from '@remixicon/react';\nimport {\n useDefinition,\n type UseDefinitionResult,\n} from '../../hooks/useDefinition';\nimport {\n HeaderNavDefinition,\n HeaderNavItemDefinition,\n HeaderNavGroupDefinition,\n} from './HeaderNavDefinition';\nimport { HeaderNavIndicators } from './HeaderNavIndicators';\nimport { MenuTrigger, Menu, MenuItem } from '../Menu';\nimport type {\n HeaderNavLinkProps,\n HeaderNavTabGroup,\n HeaderNavTabItem,\n} from './types';\nimport { useRoutingIntegration } from '../../navigation/useRouting';\nimport type { AnchorNavigation } from '../../navigation/useNavigation';\n\nfunction isTabGroup(tab: HeaderNavTabItem): tab is HeaderNavTabGroup {\n return 'items' in tab;\n}\n\ntype HeaderNavLinkViewProps = {\n definitionResult: UseDefinitionResult<\n typeof HeaderNavItemDefinition,\n HeaderNavLinkProps\n >;\n navigation: AnchorNavigation;\n};\n\nfunction HeaderNavLinkView({\n definitionResult,\n navigation,\n}: HeaderNavLinkViewProps) {\n const { ownProps, analytics } = definitionResult;\n const { id, label, active, registerRef, onHighlight } = ownProps;\n const { href } = ownProps;\n\n const linkRef = useRef<HTMLAnchorElement>(null);\n let ariaHref = href;\n let routerOptions: NavigateOptions | undefined;\n if (navigation.type === 'router') {\n ariaHref = navigation.ariaHref;\n routerOptions = navigation.routerOptions;\n } else if (navigation.type === 'native') {\n ariaHref = navigation.ariaHref;\n }\n const { linkProps } = useLink(\n {\n href: ariaHref,\n routerOptions,\n },\n linkRef,\n );\n const { hoverProps } = useHover({\n onHoverStart: () => onHighlight(id),\n onHoverEnd: () => onHighlight(null),\n });\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n linkProps.onClick?.(e);\n analytics.captureEvent('click', label, {\n attributes: { to: href },\n });\n };\n const { href: _href, ...anchorProps } = mergeProps(\n linkProps,\n hoverProps,\n ) as React.AnchorHTMLAttributes<HTMLAnchorElement>;\n const ref = (el: HTMLAnchorElement | null) => {\n (linkRef as React.MutableRefObject<HTMLAnchorElement | null>).current = el;\n registerRef(id, el);\n };\n const commonProps = {\n ...anchorProps,\n ref,\n className: ownProps.classes.root,\n 'aria-current': active ? ('page' as const) : undefined,\n onClick: handleClick,\n onFocus: () => onHighlight(id),\n onBlur: () => onHighlight(null),\n children: label,\n };\n const browserHref =\n navigation.type === 'native' ? navigation.browserHref : href;\n\n return (\n <li>\n {navigation.type === 'router' ? (\n <navigation.Link\n {...commonProps}\n {...navigation.routerLinkOptions}\n to={navigation.to}\n />\n ) : (\n <a {...commonProps} href={browserHref} />\n )}\n </li>\n );\n}\n\nfunction HeaderNavLink(props: HeaderNavLinkProps) {\n const definitionResult = useDefinition(HeaderNavItemDefinition, props);\n const Navigation = definitionResult.navigation;\n\n return (\n <Navigation\n props={{ href: definitionResult.ownProps.href }}\n view={HeaderNavLinkView}\n viewProps={{ definitionResult }}\n />\n );\n}\n\ninterface HeaderNavGroupItemProps {\n group: HeaderNavTabGroup;\n active: boolean;\n activeChildId?: string;\n registerRef: (key: string, el: HTMLElement | null) => void;\n onHighlight: (key: string | null) => void;\n}\n\nfunction HeaderNavGroupItem(props: HeaderNavGroupItemProps) {\n const { group, active, activeChildId, registerRef, onHighlight } = props;\n const { ownProps } = useDefinition(HeaderNavGroupDefinition, {});\n const { hoverProps } = useHover({\n onHoverStart: () => onHighlight(group.id),\n onHoverEnd: () => onHighlight(null),\n });\n\n return (\n <li>\n <MenuTrigger>\n <RAButton\n ref={el => {\n registerRef(group.id, el);\n }}\n className={ownProps.classes.root}\n aria-current={active ? 'page' : undefined}\n {...hoverProps}\n onFocus={() => onHighlight(group.id)}\n onBlur={() => onHighlight(null)}\n >\n {group.label}\n <RiArrowDownSLine size={16} />\n </RAButton>\n <Menu\n selectionMode=\"single\"\n selectedKeys={new Set(activeChildId ? [activeChildId] : [])}\n >\n {group.items.map(item => (\n <MenuItem key={item.id} id={item.id} href={item.href}>\n {item.label}\n </MenuItem>\n ))}\n </Menu>\n </MenuTrigger>\n </li>\n );\n}\n\ninterface HeaderNavProps {\n tabs: HeaderNavTabItem[];\n activeTabId?: string | null;\n}\n\nfunction useAutoActiveTabId(tabs: HeaderNavTabItem[]): string | undefined {\n const routing = useRoutingIntegration({ fallback: true });\n const basePath = routing.useResolvedPath('.').pathname;\n const { pathname } = routing.useLocation();\n\n return useMemo(() => {\n const allTabs = tabs.flatMap(tab => (isTabGroup(tab) ? tab.items : [tab]));\n const routeObjects = allTabs.map(tab => ({\n path: `${resolvePath(tab.href, basePath).pathname}/*`,\n id: tab.id,\n }));\n const matches = matchRoutes(routeObjects, pathname);\n return matches?.[0]?.route.id;\n }, [tabs, basePath, pathname]);\n}\n\nfunction HeaderNavAutoDetect(props: { tabs: HeaderNavTabItem[] }) {\n const activeTabId = useAutoActiveTabId(props.tabs);\n return <HeaderNavInner tabs={props.tabs} activeTabId={activeTabId} />;\n}\n\nfunction HeaderNavInner(props: HeaderNavProps) {\n const { tabs, activeTabId } = props;\n const { ownProps } = useDefinition(HeaderNavDefinition, {\n tabs,\n activeTabId,\n });\n const { classes } = ownProps;\n\n const { isFocusVisible } = useFocusVisible();\n const navRef = useRef<HTMLElement>(null);\n const itemRefs = useRef<Map<string, HTMLElement>>(new Map());\n\n const [highlightedKey, setHighlightedKey] = useState<string | null>(null);\n\n // Resolve activeTabId to a top-level key (groups own their children's active state)\n const { activeKey, activeChildId } = useMemo(() => {\n if (!activeTabId) return { activeKey: undefined, activeChildId: undefined };\n for (const item of tabs) {\n if (isTabGroup(item)) {\n const child = item.items.find(c => c.id === activeTabId);\n if (child) {\n return { activeKey: item.id, activeChildId: child.id };\n }\n } else if (item.id === activeTabId) {\n return { activeKey: item.id, activeChildId: undefined };\n }\n }\n return { activeKey: undefined, activeChildId: undefined };\n }, [activeTabId, tabs]);\n\n const registerRef = useCallback((key: string, el: HTMLElement | null) => {\n if (el) {\n itemRefs.current.set(key, el);\n } else {\n itemRefs.current.delete(key);\n }\n }, []);\n\n return (\n <nav\n ref={navRef}\n aria-label=\"Content navigation\"\n className={classes.root}\n data-focus-visible={isFocusVisible || undefined}\n >\n <ul role=\"list\" className={classes.list}>\n {tabs.map(item =>\n isTabGroup(item) ? (\n <HeaderNavGroupItem\n key={item.id}\n group={item}\n active={activeKey === item.id}\n activeChildId={activeChildId}\n registerRef={registerRef}\n onHighlight={setHighlightedKey}\n />\n ) : (\n <HeaderNavLink\n key={item.id}\n id={item.id}\n label={item.label}\n href={item.href}\n active={activeKey === item.id}\n registerRef={registerRef}\n onHighlight={setHighlightedKey}\n />\n ),\n )}\n </ul>\n <HeaderNavIndicators\n navRef={navRef}\n itemRefs={itemRefs}\n activeKey={activeKey}\n highlightedKey={highlightedKey}\n classes={{ active: classes.active, hovered: classes.hovered }}\n />\n </nav>\n );\n}\n\n/** @internal */\nexport function HeaderNav(props: HeaderNavProps) {\n const routing = useRoutingIntegration({ fallback: true });\n const inRouter = routing.useInRouterContext();\n\n if (props.activeTabId === undefined && inRouter) {\n return <HeaderNavAutoDetect tabs={props.tabs} />;\n }\n\n return <HeaderNavInner tabs={props.tabs} activeTabId={props.activeTabId} />;\n}\n"],"names":["RAButton"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
2
2
 
3
- var css_248z = "/*\n * Copyright 2026 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 tokens, base, components, utilities;\n\n@layer components {\n .HeaderNav_bui-HeaderNav__e4ad50ef7c {\n position: relative;\n\n /* CSS custom properties for indicator positioning — set by HeaderNavIndicators */\n --active-tab-left: 0px;\n --active-tab-right: 0px;\n --active-tab-top: 0px;\n --active-tab-bottom: 0px;\n --active-tab-width: 0px;\n --active-tab-height: 0px;\n --active-tab-opacity: 0;\n --active-transition-duration: 0s;\n\n --hovered-tab-left: 0px;\n --hovered-tab-right: 0px;\n --hovered-tab-top: 0px;\n --hovered-tab-bottom: 0px;\n --hovered-tab-width: 0px;\n --hovered-tab-height: 0px;\n --hovered-tab-opacity: 0;\n --hovered-transition-duration: 0s;\n }\n\n .HeaderNav_bui-HeaderNavList__e4ad50ef7c {\n display: flex;\n flex-direction: row;\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .HeaderNav_bui-HeaderNavItem__e4ad50ef7c,\n .HeaderNav_bui-HeaderNavGroup__e4ad50ef7c {\n font-family: var(--bui-font-regular);\n font-size: var(--bui-font-size-3);\n line-height: 1.15;\n font-weight: var(--bui-font-weight-regular);\n color: var(--bui-fg-secondary);\n height: 36px;\n display: flex;\n gap: var(--bui-space-1);\n align-items: center;\n padding-inline: var(--bui-space-2);\n text-decoration: none;\n cursor: pointer;\n position: relative;\n z-index: 2;\n border: none;\n background: none;\n outline: none;\n }\n\n .HeaderNav_bui-HeaderNavItem__e4ad50ef7c[aria-current='page'],\n .HeaderNav_bui-HeaderNavGroup__e4ad50ef7c[aria-current='page'] {\n color: var(--bui-fg-primary);\n }\n\n .HeaderNav_bui-HeaderNavActive__e4ad50ef7c {\n pointer-events: none;\n position: absolute;\n bottom: -1px;\n left: calc(var(--active-tab-left) + var(--bui-space-2));\n width: calc(var(--active-tab-width) - var(--bui-space-4));\n height: 1px;\n background-color: var(--bui-fg-primary);\n border-radius: 4px;\n opacity: var(--active-tab-opacity);\n transition: left var(--active-transition-duration) ease-out,\n width var(--active-transition-duration) ease-out, opacity 0.15s;\n }\n\n .HeaderNav_bui-HeaderNavHovered__e4ad50ef7c {\n pointer-events: none;\n position: absolute;\n left: var(--hovered-tab-left);\n top: calc(var(--hovered-tab-top) + 4px);\n width: var(--hovered-tab-width);\n height: calc(var(--hovered-tab-height) - 8px);\n background-color: var(--bui-bg-neutral-2);\n border-radius: 4px;\n opacity: var(--hovered-tab-opacity);\n transition: left var(--hovered-transition-duration) ease-out,\n top var(--hovered-transition-duration) ease-out,\n width var(--hovered-transition-duration) ease-out,\n height var(--hovered-transition-duration) ease-out, opacity 0.15s;\n\n [data-focus-visible] & {\n outline: 2px solid var(--bui-ring);\n outline-offset: -2px;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .HeaderNav_bui-HeaderNavActive__e4ad50ef7c,\n .HeaderNav_bui-HeaderNavHovered__e4ad50ef7c {\n transition: none;\n }\n }\n}\n";
4
- var styles = {"bui-HeaderNav":"HeaderNav_bui-HeaderNav__e4ad50ef7c","bui-HeaderNavList":"HeaderNav_bui-HeaderNavList__e4ad50ef7c","bui-HeaderNavItem":"HeaderNav_bui-HeaderNavItem__e4ad50ef7c","bui-HeaderNavGroup":"HeaderNav_bui-HeaderNavGroup__e4ad50ef7c","bui-HeaderNavActive":"HeaderNav_bui-HeaderNavActive__e4ad50ef7c","bui-HeaderNavHovered":"HeaderNav_bui-HeaderNavHovered__e4ad50ef7c"};
3
+ var css_248z = "/*\n * Copyright 2026 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 tokens, base, components, theme, utilities;\n\n@layer components {\n .HeaderNav_bui-HeaderNav__98236a1772 {\n position: relative;\n\n /* CSS custom properties for indicator positioning — set by HeaderNavIndicators */\n --active-tab-left: 0px;\n --active-tab-right: 0px;\n --active-tab-top: 0px;\n --active-tab-bottom: 0px;\n --active-tab-width: 0px;\n --active-tab-height: 0px;\n --active-tab-opacity: 0;\n --active-transition-duration: 0s;\n\n --hovered-tab-left: 0px;\n --hovered-tab-right: 0px;\n --hovered-tab-top: 0px;\n --hovered-tab-bottom: 0px;\n --hovered-tab-width: 0px;\n --hovered-tab-height: 0px;\n --hovered-tab-opacity: 0;\n --hovered-transition-duration: 0s;\n }\n\n .HeaderNav_bui-HeaderNavList__98236a1772 {\n display: flex;\n flex-direction: row;\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .HeaderNav_bui-HeaderNavItem__98236a1772,\n .HeaderNav_bui-HeaderNavGroup__98236a1772 {\n font-family: var(--bui-font-regular);\n font-size: var(--bui-font-size-3);\n line-height: 1.15;\n font-weight: var(--bui-font-weight-regular);\n color: var(--bui-fg-secondary);\n height: 36px;\n display: flex;\n gap: var(--bui-space-1);\n align-items: center;\n padding-inline: var(--bui-space-2);\n text-decoration: none;\n cursor: pointer;\n position: relative;\n z-index: 2;\n border: none;\n background: none;\n outline: none;\n }\n\n .HeaderNav_bui-HeaderNavItem__98236a1772[aria-current='page'],\n .HeaderNav_bui-HeaderNavGroup__98236a1772[aria-current='page'] {\n color: var(--bui-fg-primary);\n }\n\n .HeaderNav_bui-HeaderNavActive__98236a1772 {\n pointer-events: none;\n position: absolute;\n bottom: -1px;\n left: calc(var(--active-tab-left) + var(--bui-space-2));\n width: calc(var(--active-tab-width) - var(--bui-space-4));\n height: 1px;\n background-color: var(--bui-fg-primary);\n border-radius: 4px;\n opacity: var(--active-tab-opacity);\n transition: left var(--active-transition-duration) ease-out,\n width var(--active-transition-duration) ease-out, opacity 0.15s;\n }\n\n .HeaderNav_bui-HeaderNavHovered__98236a1772 {\n pointer-events: none;\n position: absolute;\n left: var(--hovered-tab-left);\n top: calc(var(--hovered-tab-top) + 4px);\n width: var(--hovered-tab-width);\n height: calc(var(--hovered-tab-height) - 8px);\n background-color: var(--bui-bg-neutral-2);\n border-radius: 4px;\n opacity: var(--hovered-tab-opacity);\n transition: left var(--hovered-transition-duration) ease-out,\n top var(--hovered-transition-duration) ease-out,\n width var(--hovered-transition-duration) ease-out,\n height var(--hovered-transition-duration) ease-out, opacity 0.15s;\n\n [data-focus-visible] & {\n outline: 2px solid var(--bui-ring);\n outline-offset: -2px;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .HeaderNav_bui-HeaderNavActive__98236a1772,\n .HeaderNav_bui-HeaderNavHovered__98236a1772 {\n transition: none;\n }\n }\n}\n";
4
+ var styles = {"bui-HeaderNav":"HeaderNav_bui-HeaderNav__98236a1772","bui-HeaderNavList":"HeaderNav_bui-HeaderNavList__98236a1772","bui-HeaderNavItem":"HeaderNav_bui-HeaderNavItem__98236a1772","bui-HeaderNavGroup":"HeaderNav_bui-HeaderNavGroup__98236a1772","bui-HeaderNavActive":"HeaderNav_bui-HeaderNavActive__98236a1772","bui-HeaderNavHovered":"HeaderNav_bui-HeaderNavHovered__98236a1772"};
5
5
  styleInject(css_248z);
6
6
 
7
7
  export { styles as default };
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderNav.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
1
+ {"version":3,"file":"HeaderNav.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderNavDefinition.esm.js","sources":["../../../src/components/Header/HeaderNavDefinition.ts"],"sourcesContent":["/*\n * Copyright 2026 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 { defineComponent } from '../../hooks/useDefinition';\nimport type { HeaderNavTabItem, HeaderNavLinkProps } from './types';\nimport styles from './HeaderNav.module.css';\n\n/** @public */\nexport const HeaderNavDefinition = defineComponent<{\n tabs: HeaderNavTabItem[];\n activeTabId?: string | null;\n children?: React.ReactNode;\n className?: string;\n}>()({\n styles,\n classNames: {\n root: 'bui-HeaderNav',\n list: 'bui-HeaderNavList',\n active: 'bui-HeaderNavActive',\n hovered: 'bui-HeaderNavHovered',\n },\n propDefs: {\n tabs: {},\n activeTabId: {},\n children: {},\n className: {},\n },\n});\n\n/** @public */\nexport const HeaderNavItemDefinition = defineComponent<HeaderNavLinkProps>()({\n styles,\n classNames: {\n root: 'bui-HeaderNavItem',\n },\n analytics: true,\n navigation: { type: 'anchor' },\n propDefs: {\n noTrack: {},\n id: {},\n label: {},\n href: {},\n active: {},\n registerRef: {},\n onHighlight: {},\n className: {},\n },\n});\n\n/** @public */\nexport const HeaderNavGroupDefinition = defineComponent<{\n className?: string;\n}>()({\n styles,\n classNames: {\n root: 'bui-HeaderNavGroup',\n },\n propDefs: {\n className: {},\n },\n});\n"],"names":[],"mappings":";;;;;;;;;;;;AAqBO,MAAM,mBAAA,GAAsB,iBAKhC,CAAE;AAAA,EACH,MAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,eAAA;AAAA,IACN,IAAA,EAAM,mBAAA;AAAA,IACN,MAAA,EAAQ,qBAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAM,EAAC;AAAA,IACP,aAAa,EAAC;AAAA,IACd,UAAU,EAAC;AAAA,IACX,WAAW;AAAC;AAEhB,CAAC;AAGM,MAAM,uBAAA,GAA0B,iBAAoC,CAAE;AAAA,EAC3E,MAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM;AAAA,GACR;AAAA,EACA,SAAA,EAAW,IAAA;AAAA,EACX,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAU;AAAA,IACR,SAAS,EAAC;AAAA,IACV,IAAI,EAAC;AAAA,IACL,OAAO,EAAC;AAAA,IACR,MAAM,EAAC;AAAA,IACP,QAAQ,EAAC;AAAA,IACT,aAAa,EAAC;AAAA,IACd,aAAa,EAAC;AAAA,IACd,WAAW;AAAC;AAEhB,CAAC;AAGM,MAAM,wBAAA,GAA2B,iBAErC,CAAE;AAAA,EACH,MAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM;AAAA,GACR;AAAA,EACA,QAAA,EAAU;AAAA,IACR,WAAW;AAAC;AAEhB,CAAC;;;;"}
1
+ {"version":3,"file":"HeaderNavDefinition.esm.js","sources":["../../../src/components/Header/HeaderNavDefinition.ts"],"sourcesContent":["/*\n * Copyright 2026 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 { defineComponent } from '../../hooks/useDefinition';\nimport type { HeaderNavTabItem, HeaderNavLinkProps } from './types';\nimport styles from './HeaderNav.module.css';\n\n/** @public */\nexport const HeaderNavDefinition = defineComponent<{\n tabs: HeaderNavTabItem[];\n activeTabId?: string | null;\n children?: React.ReactNode;\n className?: string;\n}>()({\n styles,\n classNames: {\n root: 'bui-HeaderNav',\n list: 'bui-HeaderNavList',\n active: 'bui-HeaderNavActive',\n hovered: 'bui-HeaderNavHovered',\n },\n propDefs: {\n tabs: {},\n activeTabId: {},\n children: {},\n className: {},\n },\n});\n\n/** @public */\nexport const HeaderNavItemDefinition = defineComponent<HeaderNavLinkProps>()({\n styles,\n classNames: {\n root: 'bui-HeaderNavItem',\n },\n analytics: true,\n navigation: { type: 'anchor' },\n propDefs: {\n noTrack: {},\n id: {},\n label: {},\n href: {},\n active: {},\n registerRef: {},\n onHighlight: {},\n className: {},\n },\n});\n\n/** @public */\nexport const HeaderNavGroupDefinition = defineComponent<{\n className?: string;\n}>()({\n styles,\n classNames: {\n root: 'bui-HeaderNavGroup',\n },\n propDefs: {\n className: {},\n },\n});\n"],"names":[],"mappings":";;;;;;;;;;;;AAqBO,MAAM,mBAAA,GAAsB,iBAKhC,CAAE;AAAA,EACH,MAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,eAAA;AAAA,IACN,IAAA,EAAM,mBAAA;AAAA,IACN,MAAA,EAAQ,qBAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAM,EAAC;AAAA,IACP,aAAa,EAAC;AAAA,IACd,UAAU,EAAC;AAAA,IACX,WAAW;AAAC;AAEhB,CAAC;AAGM,MAAM,uBAAA,GAA0B,iBAAoC,CAAE;AAAA,EAC3E,MAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM;AAAA,GACR;AAAA,EACA,SAAA,EAAW,IAAA;AAAA,EACX,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAU;AAAA,IACR,SAAS,EAAC;AAAA,IACV,IAAI,EAAC;AAAA,IACL,OAAO,EAAC;AAAA,IACR,MAAM,EAAC;AAAA,IACP,QAAQ,EAAC;AAAA,IACT,aAAa,EAAC;AAAA,IACd,aAAa,EAAC;AAAA,IACd,WAAW;AAAC;AAEhB,CAAC;AAGM,MAAM,wBAAA,GAA2B,iBAErC,CAAE;AAAA,EACH,MAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM;AAAA,GACR;AAAA,EACA,QAAA,EAAU;AAAA,IACR,WAAW;AAAC;AAEhB,CAAC;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderNavIndicators.esm.js","sources":["../../../src/components/Header/HeaderNavIndicators.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { useCallback, useEffect, useRef } from 'react';\n\ninterface HeaderNavIndicatorsProps {\n navRef: React.RefObject<HTMLElement | null>;\n itemRefs: React.MutableRefObject<Map<string, HTMLElement>>;\n activeKey: string | undefined;\n highlightedKey: string | null;\n classes: {\n active: string;\n hovered: string;\n };\n}\n\nexport function HeaderNavIndicators(props: HeaderNavIndicatorsProps) {\n const { navRef, itemRefs, activeKey, highlightedKey, classes } = props;\n const prevActiveKey = useRef<string | null>(null);\n const prevHoveredKey = useRef<string | null>(null);\n const resetTimer = useRef<number | null>(null);\n\n const updateCSSVariables = useCallback(() => {\n const container = navRef.current;\n if (!container) return;\n\n const containerRect = container.getBoundingClientRect();\n\n // Active indicator\n if (activeKey) {\n const el = itemRefs.current.get(activeKey);\n if (el) {\n const rect = el.getBoundingClientRect();\n const relativeLeft = rect.left - containerRect.left;\n const relativeTop = rect.top - containerRect.top;\n\n if (prevActiveKey.current === null) {\n container.style.setProperty('--active-transition-duration', '0s');\n requestAnimationFrame(() => {\n container.style.setProperty(\n '--active-transition-duration',\n '0.25s',\n );\n });\n } else {\n container.style.setProperty('--active-transition-duration', '0.25s');\n }\n\n container.style.setProperty('--active-tab-left', `${relativeLeft}px`);\n container.style.setProperty('--active-tab-width', `${rect.width}px`);\n container.style.setProperty('--active-tab-height', `${rect.height}px`);\n container.style.setProperty('--active-tab-top', `${relativeTop}px`);\n container.style.setProperty('--active-tab-opacity', '1');\n prevActiveKey.current = activeKey;\n }\n } else {\n container.style.setProperty('--active-tab-opacity', '0');\n prevActiveKey.current = null;\n }\n\n // Highlight indicator (follows whichever interaction happened last — hover or focus)\n if (highlightedKey) {\n if (resetTimer.current !== null) {\n cancelAnimationFrame(resetTimer.current);\n resetTimer.current = null;\n }\n const el = itemRefs.current.get(highlightedKey);\n if (el) {\n const rect = el.getBoundingClientRect();\n const relativeLeft = rect.left - containerRect.left;\n const relativeTop = rect.top - containerRect.top;\n\n if (prevHoveredKey.current === null) {\n container.style.setProperty('--hovered-transition-duration', '0s');\n requestAnimationFrame(() => {\n container.style.setProperty(\n '--hovered-transition-duration',\n '0.2s',\n );\n });\n } else {\n container.style.setProperty('--hovered-transition-duration', '0.2s');\n }\n\n container.style.setProperty('--hovered-tab-left', `${relativeLeft}px`);\n container.style.setProperty('--hovered-tab-top', `${relativeTop}px`);\n container.style.setProperty('--hovered-tab-width', `${rect.width}px`);\n container.style.setProperty('--hovered-tab-height', `${rect.height}px`);\n container.style.setProperty('--hovered-tab-opacity', '1');\n prevHoveredKey.current = highlightedKey;\n }\n } else {\n container.style.setProperty('--hovered-tab-opacity', '0');\n resetTimer.current = requestAnimationFrame(() => {\n prevHoveredKey.current = null;\n resetTimer.current = null;\n });\n }\n }, [activeKey, highlightedKey, navRef, itemRefs]);\n\n useEffect(() => {\n updateCSSVariables();\n }, [updateCSSVariables]);\n\n useEffect(() => {\n const handleResize = () => updateCSSVariables();\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [updateCSSVariables]);\n\n return (\n <>\n <div className={classes.active} />\n <div className={classes.hovered} />\n </>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HeaderNavIndicators.esm.js","sources":["../../../src/components/Header/HeaderNavIndicators.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { useCallback, useEffect, useRef } from 'react';\n\ninterface HeaderNavIndicatorsProps {\n navRef: React.RefObject<HTMLElement | null>;\n itemRefs: React.MutableRefObject<Map<string, HTMLElement>>;\n activeKey: string | undefined;\n highlightedKey: string | null;\n classes: {\n active: string;\n hovered: string;\n };\n}\n\nexport function HeaderNavIndicators(props: HeaderNavIndicatorsProps) {\n const { navRef, itemRefs, activeKey, highlightedKey, classes } = props;\n const prevActiveKey = useRef<string | null>(null);\n const prevHoveredKey = useRef<string | null>(null);\n const resetTimer = useRef<number | null>(null);\n\n const updateCSSVariables = useCallback(() => {\n const container = navRef.current;\n if (!container) return;\n\n const containerRect = container.getBoundingClientRect();\n\n // Active indicator\n if (activeKey) {\n const el = itemRefs.current.get(activeKey);\n if (el) {\n const rect = el.getBoundingClientRect();\n const relativeLeft = rect.left - containerRect.left;\n const relativeTop = rect.top - containerRect.top;\n\n if (prevActiveKey.current === null) {\n container.style.setProperty('--active-transition-duration', '0s');\n requestAnimationFrame(() => {\n container.style.setProperty(\n '--active-transition-duration',\n '0.25s',\n );\n });\n } else {\n container.style.setProperty('--active-transition-duration', '0.25s');\n }\n\n container.style.setProperty('--active-tab-left', `${relativeLeft}px`);\n container.style.setProperty('--active-tab-width', `${rect.width}px`);\n container.style.setProperty('--active-tab-height', `${rect.height}px`);\n container.style.setProperty('--active-tab-top', `${relativeTop}px`);\n container.style.setProperty('--active-tab-opacity', '1');\n prevActiveKey.current = activeKey;\n }\n } else {\n container.style.setProperty('--active-tab-opacity', '0');\n prevActiveKey.current = null;\n }\n\n // Highlight indicator (follows whichever interaction happened last — hover or focus)\n if (highlightedKey) {\n if (resetTimer.current !== null) {\n cancelAnimationFrame(resetTimer.current);\n resetTimer.current = null;\n }\n const el = itemRefs.current.get(highlightedKey);\n if (el) {\n const rect = el.getBoundingClientRect();\n const relativeLeft = rect.left - containerRect.left;\n const relativeTop = rect.top - containerRect.top;\n\n if (prevHoveredKey.current === null) {\n container.style.setProperty('--hovered-transition-duration', '0s');\n requestAnimationFrame(() => {\n container.style.setProperty(\n '--hovered-transition-duration',\n '0.2s',\n );\n });\n } else {\n container.style.setProperty('--hovered-transition-duration', '0.2s');\n }\n\n container.style.setProperty('--hovered-tab-left', `${relativeLeft}px`);\n container.style.setProperty('--hovered-tab-top', `${relativeTop}px`);\n container.style.setProperty('--hovered-tab-width', `${rect.width}px`);\n container.style.setProperty('--hovered-tab-height', `${rect.height}px`);\n container.style.setProperty('--hovered-tab-opacity', '1');\n prevHoveredKey.current = highlightedKey;\n }\n } else {\n container.style.setProperty('--hovered-tab-opacity', '0');\n resetTimer.current = requestAnimationFrame(() => {\n prevHoveredKey.current = null;\n resetTimer.current = null;\n });\n }\n }, [activeKey, highlightedKey, navRef, itemRefs]);\n\n useEffect(() => {\n updateCSSVariables();\n }, [updateCSSVariables]);\n\n useEffect(() => {\n const handleResize = () => updateCSSVariables();\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [updateCSSVariables]);\n\n return (\n <>\n <div className={classes.active} />\n <div className={classes.hovered} />\n </>\n );\n}\n"],"names":[],"mappings":";;;AA6BO,SAAS,oBAAoB,KAAA,EAAiC;AACnE,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,cAAA,EAAgB,SAAQ,GAAI,KAAA;AACjE,EAAA,MAAM,aAAA,GAAgB,OAAsB,IAAI,CAAA;AAChD,EAAA,MAAM,cAAA,GAAiB,OAAsB,IAAI,CAAA;AACjD,EAAA,MAAM,UAAA,GAAa,OAAsB,IAAI,CAAA;AAE7C,EAAA,MAAM,kBAAA,GAAqB,YAAY,MAAM;AAC3C,IAAA,MAAM,YAAY,MAAA,CAAO,OAAA;AACzB,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,aAAA,GAAgB,UAAU,qBAAA,EAAsB;AAGtD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA;AACzC,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,GAAO,aAAA,CAAc,IAAA;AAC/C,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,GAAM,aAAA,CAAc,GAAA;AAE7C,QAAA,IAAI,aAAA,CAAc,YAAY,IAAA,EAAM;AAClC,UAAA,SAAA,CAAU,KAAA,CAAM,WAAA,CAAY,8BAAA,EAAgC,IAAI,CAAA;AAChE,UAAA,qBAAA,CAAsB,MAAM;AAC1B,YAAA,SAAA,CAAU,KAAA,CAAM,WAAA;AAAA,cACd,8BAAA;AAAA,cACA;AAAA,aACF;AAAA,UACF,CAAC,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,KAAA,CAAM,WAAA,CAAY,8BAAA,EAAgC,OAAO,CAAA;AAAA,QACrE;AAEA,QAAA,SAAA,CAAU,KAAA,CAAM,WAAA,CAAY,mBAAA,EAAqB,CAAA,EAAG,YAAY,CAAA,EAAA,CAAI,CAAA;AACpE,QAAA,SAAA,CAAU,MAAM,WAAA,CAAY,oBAAA,EAAsB,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAI,CAAA;AACnE,QAAA,SAAA,CAAU,MAAM,WAAA,CAAY,qBAAA,EAAuB,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAA,CAAI,CAAA;AACrE,QAAA,SAAA,CAAU,KAAA,CAAM,WAAA,CAAY,kBAAA,EAAoB,CAAA,EAAG,WAAW,CAAA,EAAA,CAAI,CAAA;AAClE,QAAA,SAAA,CAAU,KAAA,CAAM,WAAA,CAAY,sBAAA,EAAwB,GAAG,CAAA;AACvD,QAAA,aAAA,CAAc,OAAA,GAAU,SAAA;AAAA,MAC1B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,KAAA,CAAM,WAAA,CAAY,sBAAA,EAAwB,GAAG,CAAA;AACvD,MAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAI,UAAA,CAAW,YAAY,IAAA,EAAM;AAC/B,QAAA,oBAAA,CAAqB,WAAW,OAAO,CAAA;AACvC,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AACA,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AAC9C,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,GAAO,aAAA,CAAc,IAAA;AAC/C,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,GAAM,aAAA,CAAc,GAAA;AAE7C,QAAA,IAAI,cAAA,CAAe,YAAY,IAAA,EAAM;AACnC,UAAA,SAAA,CAAU,KAAA,CAAM,WAAA,CAAY,+BAAA,EAAiC,IAAI,CAAA;AACjE,UAAA,qBAAA,CAAsB,MAAM;AAC1B,YAAA,SAAA,CAAU,KAAA,CAAM,WAAA;AAAA,cACd,+BAAA;AAAA,cACA;AAAA,aACF;AAAA,UACF,CAAC,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,KAAA,CAAM,WAAA,CAAY,+BAAA,EAAiC,MAAM,CAAA;AAAA,QACrE;AAEA,QAAA,SAAA,CAAU,KAAA,CAAM,WAAA,CAAY,oBAAA,EAAsB,CAAA,EAAG,YAAY,CAAA,EAAA,CAAI,CAAA;AACrE,QAAA,SAAA,CAAU,KAAA,CAAM,WAAA,CAAY,mBAAA,EAAqB,CAAA,EAAG,WAAW,CAAA,EAAA,CAAI,CAAA;AACnE,QAAA,SAAA,CAAU,MAAM,WAAA,CAAY,qBAAA,EAAuB,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAI,CAAA;AACpE,QAAA,SAAA,CAAU,MAAM,WAAA,CAAY,sBAAA,EAAwB,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAA,CAAI,CAAA;AACtE,QAAA,SAAA,CAAU,KAAA,CAAM,WAAA,CAAY,uBAAA,EAAyB,GAAG,CAAA;AACxD,QAAA,cAAA,CAAe,OAAA,GAAU,cAAA;AAAA,MAC3B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,KAAA,CAAM,WAAA,CAAY,uBAAA,EAAyB,GAAG,CAAA;AACxD,MAAA,UAAA,CAAW,OAAA,GAAU,sBAAsB,MAAM;AAC/C,QAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB,CAAC,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,cAAA,EAAgB,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAEhD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,kBAAA,EAAmB;AAAA,EACrB,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAEvB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,YAAA,GAAe,MAAM,kBAAA,EAAmB;AAC9C,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAC9C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAEvB,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAAA,oBAChC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAS;AAAA,GAAA,EACnC,CAAA;AAEJ;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"definition.esm.js","sources":["../../../src/components/Header/definition.ts"],"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 { defineComponent } from '../../hooks/useDefinition';\nimport type { HeaderOwnProps } from './types';\nimport styles from './Header.module.css';\n\n/**\n * Component definition for Header\n * @public\n */\nexport const HeaderDefinition = defineComponent<HeaderOwnProps>()({\n styles,\n bg: 'consumer',\n classNames: {\n headerTop: 'bui-HeaderTop',\n stickySentinel: 'bui-HeaderStickySentinel',\n content: 'bui-HeaderContent',\n headerBottom: 'bui-HeaderBottom',\n breadcrumbs: 'bui-HeaderBreadcrumbs',\n breadcrumbsSmall: 'bui-HeaderBreadcrumbsSmall',\n breadcrumbLink: 'bui-HeaderBreadcrumbLink',\n breadcrumbLinkSmall: 'bui-HeaderBreadcrumbLinkSmall',\n breadcrumbSeparator: 'bui-HeaderBreadcrumbSeparator',\n titleStack: 'bui-HeaderTitleStack',\n title: 'bui-HeaderTitle',\n titleSmall: 'bui-HeaderTitleSmall',\n tabsWrapper: 'bui-HeaderTabsWrapper',\n controls: 'bui-HeaderControls',\n tags: 'bui-HeaderTags',\n tag: 'bui-HeaderTag',\n description: 'bui-HeaderDescription',\n metaRow: 'bui-HeaderMetaRow',\n metaItem: 'bui-HeaderMetaItem',\n },\n propDefs: {\n title: {},\n customActions: {},\n tabs: {},\n activeTabId: {},\n breadcrumbs: {},\n description: {},\n tags: {},\n metadata: {},\n className: {},\n sticky: {},\n },\n});\n\n/**\n * @public\n * @deprecated Use {@link HeaderDefinition} instead.\n */\nexport const HeaderPageDefinition = HeaderDefinition;\n"],"names":[],"mappings":";;;;;;;;;;;;AAwBO,MAAM,gBAAA,GAAmB,iBAAgC,CAAE;AAAA,EAChE,MAAA;AAAA,EACA,EAAA,EAAI,UAAA;AAAA,EACJ,UAAA,EAAY;AAAA,IACV,SAAA,EAAW,eAAA;AAAA,IACX,cAAA,EAAgB,0BAAA;AAAA,IAChB,OAAA,EAAS,mBAAA;AAAA,IACT,YAAA,EAAc,kBAAA;AAAA,IACd,WAAA,EAAa,uBAAA;AAAA,IACb,gBAAA,EAAkB,4BAAA;AAAA,IAClB,cAAA,EAAgB,0BAAA;AAAA,IAChB,mBAAA,EAAqB,+BAAA;AAAA,IACrB,mBAAA,EAAqB,+BAAA;AAAA,IACrB,UAAA,EAAY,sBAAA;AAAA,IACZ,KAAA,EAAO,iBAAA;AAAA,IACP,UAAA,EAAY,sBAAA;AAAA,IACZ,WAAA,EAAa,uBAAA;AAAA,IACb,QAAA,EAAU,oBAAA;AAAA,IACV,IAAA,EAAM,gBAAA;AAAA,IACN,GAAA,EAAK,eAAA;AAAA,IACL,WAAA,EAAa,uBAAA;AAAA,IACb,OAAA,EAAS,mBAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAO,EAAC;AAAA,IACR,eAAe,EAAC;AAAA,IAChB,MAAM,EAAC;AAAA,IACP,aAAa,EAAC;AAAA,IACd,aAAa,EAAC;AAAA,IACd,aAAa,EAAC;AAAA,IACd,MAAM,EAAC;AAAA,IACP,UAAU,EAAC;AAAA,IACX,WAAW,EAAC;AAAA,IACZ,QAAQ;AAAC;AAEb,CAAC;AAMM,MAAM,oBAAA,GAAuB;;;;"}
1
+ {"version":3,"file":"definition.esm.js","sources":["../../../src/components/Header/definition.ts"],"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 { defineComponent } from '../../hooks/useDefinition';\nimport type { HeaderOwnProps } from './types';\nimport styles from './Header.module.css';\n\n/**\n * Component definition for Header\n * @public\n */\nexport const HeaderDefinition = defineComponent<HeaderOwnProps>()({\n styles,\n bg: 'consumer',\n classNames: {\n headerTop: 'bui-HeaderTop',\n stickySentinel: 'bui-HeaderStickySentinel',\n content: 'bui-HeaderContent',\n headerBottom: 'bui-HeaderBottom',\n breadcrumbs: 'bui-HeaderBreadcrumbs',\n breadcrumbsSmall: 'bui-HeaderBreadcrumbsSmall',\n breadcrumbLink: 'bui-HeaderBreadcrumbLink',\n breadcrumbLinkSmall: 'bui-HeaderBreadcrumbLinkSmall',\n breadcrumbSeparator: 'bui-HeaderBreadcrumbSeparator',\n titleStack: 'bui-HeaderTitleStack',\n title: 'bui-HeaderTitle',\n titleSmall: 'bui-HeaderTitleSmall',\n tabsWrapper: 'bui-HeaderTabsWrapper',\n controls: 'bui-HeaderControls',\n tags: 'bui-HeaderTags',\n tag: 'bui-HeaderTag',\n description: 'bui-HeaderDescription',\n metaRow: 'bui-HeaderMetaRow',\n metaItem: 'bui-HeaderMetaItem',\n },\n propDefs: {\n title: {},\n customActions: {},\n tabs: {},\n activeTabId: {},\n breadcrumbs: {},\n description: {},\n tags: {},\n metadata: {},\n className: {},\n sticky: {},\n },\n});\n\n/**\n * @public\n * @deprecated Use {@link HeaderDefinition} instead.\n */\nexport const HeaderPageDefinition = HeaderDefinition;\n"],"names":[],"mappings":";;;;;;;;;;;;AAwBO,MAAM,gBAAA,GAAmB,iBAAgC,CAAE;AAAA,EAChE,MAAA;AAAA,EACA,EAAA,EAAI,UAAA;AAAA,EACJ,UAAA,EAAY;AAAA,IACV,SAAA,EAAW,eAAA;AAAA,IACX,cAAA,EAAgB,0BAAA;AAAA,IAChB,OAAA,EAAS,mBAAA;AAAA,IACT,YAAA,EAAc,kBAAA;AAAA,IACd,WAAA,EAAa,uBAAA;AAAA,IACb,gBAAA,EAAkB,4BAAA;AAAA,IAClB,cAAA,EAAgB,0BAAA;AAAA,IAChB,mBAAA,EAAqB,+BAAA;AAAA,IACrB,mBAAA,EAAqB,+BAAA;AAAA,IACrB,UAAA,EAAY,sBAAA;AAAA,IACZ,KAAA,EAAO,iBAAA;AAAA,IACP,UAAA,EAAY,sBAAA;AAAA,IACZ,WAAA,EAAa,uBAAA;AAAA,IACb,QAAA,EAAU,oBAAA;AAAA,IACV,IAAA,EAAM,gBAAA;AAAA,IACN,GAAA,EAAK,eAAA;AAAA,IACL,WAAA,EAAa,uBAAA;AAAA,IACb,OAAA,EAAS,mBAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAO,EAAC;AAAA,IACR,eAAe,EAAC;AAAA,IAChB,MAAM,EAAC;AAAA,IACP,aAAa,EAAC;AAAA,IACd,aAAa,EAAC;AAAA,IACd,aAAa,EAAC;AAAA,IACd,MAAM,EAAC;AAAA,IACP,UAAU,EAAC;AAAA,IACX,WAAW,EAAC;AAAA,IACZ,QAAQ;AAAC;AAEb,CAAC;AAMM,MAAM,oBAAA,GAAuB;;"}
@@ -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, useRef } from 'react';\nimport { mergeProps, useFocusRing, useLink } from 'react-aria';\nimport type { LinkProps } from './types';\nimport {\n useDefinition,\n type UseDefinitionResult,\n} from '../../hooks/useDefinition';\nimport { useResolvedHref } from '../../hooks/useResolvedHref';\nimport { LinkDefinition } from './definition';\nimport { getNodeText } from '../../analytics/getNodeText';\nimport {\n handleRouterLinkClick,\n type AnchorNavigation,\n} from '../../navigation/useNavigation';\n\ntype LinkViewProps = {\n definitionResult: UseDefinitionResult<typeof LinkDefinition, LinkProps>;\n navigation: AnchorNavigation;\n forwardedRef: React.ForwardedRef<HTMLAnchorElement>;\n};\n\nfunction LinkView({\n definitionResult,\n navigation,\n forwardedRef,\n}: LinkViewProps) {\n const { ownProps, restProps, dataAttributes, analytics } = definitionResult;\n const { classes, title, children } = ownProps;\n\n const internalRef = useRef<HTMLAnchorElement>(null);\n const linkRef = (forwardedRef ||\n internalRef) as React.RefObject<HTMLAnchorElement>;\n\n let resolvedLinkProps = restProps;\n if (navigation.type === 'router') {\n resolvedLinkProps = {\n ...restProps,\n href: navigation.ariaHref,\n routerOptions: navigation.routerOptions,\n };\n } else if (navigation.type === 'native') {\n resolvedLinkProps = {\n ...restProps,\n href: navigation.ariaHref,\n };\n }\n // React Aria Components' Link filters out the native title attribute.\n // Render the anchor explicitly so truncated links retain their browser tooltip.\n const { linkProps } = useLink(resolvedLinkProps, linkRef);\n const { isFocusVisible, focusProps } = useFocusRing();\n const fallbackHref = useResolvedHref(restProps.href);\n const resolvedHref =\n navigation.type === 'native' ? navigation.browserHref : fallbackHref;\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n linkProps.onClick?.(e);\n const text =\n restProps['aria-label'] ??\n getNodeText(children) ??\n String(restProps.href ?? '');\n analytics.captureEvent('click', text, {\n attributes: { to: String(restProps.href ?? '') },\n });\n handleRouterLinkClick(e, navigation);\n };\n\n const { href: _href, ...interactionProps } = mergeProps(\n linkProps,\n focusProps,\n ) as React.AnchorHTMLAttributes<HTMLAnchorElement>;\n const {\n href: _restHref,\n routerOptions: _routerOptions,\n ...anchorProps\n } = restProps;\n const commonProps = {\n ...interactionProps,\n ...dataAttributes,\n ...(anchorProps as React.AnchorHTMLAttributes<HTMLAnchorElement>),\n ref: linkRef,\n title,\n className: classes.root,\n 'data-focus-visible': isFocusVisible || undefined,\n onClick: handleClick,\n children,\n };\n\n if (navigation.type === 'router') {\n return (\n <navigation.Link\n {...commonProps}\n {...navigation.routerLinkOptions}\n to={navigation.to}\n />\n );\n }\n\n return <a {...commonProps} href={resolvedHref} />;\n}\n\n/**\n * A styled anchor element that supports analytics event tracking on click.\n *\n * @public\n */\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>((props, ref) => {\n const definitionResult = useDefinition(LinkDefinition, props);\n const Navigation = definitionResult.navigation;\n\n return (\n <Navigation\n props={definitionResult.restProps}\n view={LinkView}\n viewProps={{ definitionResult, forwardedRef: ref }}\n />\n );\n});\n\nLink.displayName = 'Link';\n"],"names":[],"mappings":"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"}
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, useRef } from 'react';\nimport { mergeProps, useFocusRing, useLink } from 'react-aria';\nimport type { LinkProps } from './types';\nimport {\n useDefinition,\n type UseDefinitionResult,\n} from '../../hooks/useDefinition';\nimport { useResolvedHref } from '../../hooks/useResolvedHref';\nimport { LinkDefinition } from './definition';\nimport { getNodeText } from '../../analytics/getNodeText';\nimport {\n handleRouterLinkClick,\n type AnchorNavigation,\n} from '../../navigation/useNavigation';\n\ntype LinkViewProps = {\n definitionResult: UseDefinitionResult<typeof LinkDefinition, LinkProps>;\n navigation: AnchorNavigation;\n forwardedRef: React.ForwardedRef<HTMLAnchorElement>;\n};\n\nfunction LinkView({\n definitionResult,\n navigation,\n forwardedRef,\n}: LinkViewProps) {\n const { ownProps, restProps, dataAttributes, analytics } = definitionResult;\n const { classes, title, children } = ownProps;\n\n const internalRef = useRef<HTMLAnchorElement>(null);\n const linkRef = (forwardedRef ||\n internalRef) as React.RefObject<HTMLAnchorElement>;\n\n let resolvedLinkProps = restProps;\n if (navigation.type === 'router') {\n resolvedLinkProps = {\n ...restProps,\n href: navigation.ariaHref,\n routerOptions: navigation.routerOptions,\n };\n } else if (navigation.type === 'native') {\n resolvedLinkProps = {\n ...restProps,\n href: navigation.ariaHref,\n };\n }\n // React Aria Components' Link filters out the native title attribute.\n // Render the anchor explicitly so truncated links retain their browser tooltip.\n const { linkProps } = useLink(resolvedLinkProps, linkRef);\n const { isFocusVisible, focusProps } = useFocusRing();\n const fallbackHref = useResolvedHref(restProps.href);\n const resolvedHref =\n navigation.type === 'native' ? navigation.browserHref : fallbackHref;\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n linkProps.onClick?.(e);\n const text =\n restProps['aria-label'] ??\n getNodeText(children) ??\n String(restProps.href ?? '');\n analytics.captureEvent('click', text, {\n attributes: { to: String(restProps.href ?? '') },\n });\n handleRouterLinkClick(e, navigation);\n };\n\n const { href: _href, ...interactionProps } = mergeProps(\n linkProps,\n focusProps,\n ) as React.AnchorHTMLAttributes<HTMLAnchorElement>;\n const {\n href: _restHref,\n routerOptions: _routerOptions,\n ...anchorProps\n } = restProps;\n const commonProps = {\n ...interactionProps,\n ...dataAttributes,\n ...(anchorProps as React.AnchorHTMLAttributes<HTMLAnchorElement>),\n ref: linkRef,\n title,\n className: classes.root,\n 'data-focus-visible': isFocusVisible || undefined,\n onClick: handleClick,\n children,\n };\n\n if (navigation.type === 'router') {\n return (\n <navigation.Link\n {...commonProps}\n {...navigation.routerLinkOptions}\n to={navigation.to}\n />\n );\n }\n\n return <a {...commonProps} href={resolvedHref} />;\n}\n\n/**\n * A styled anchor element that supports analytics event tracking on click.\n *\n * @public\n */\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>((props, ref) => {\n const definitionResult = useDefinition(LinkDefinition, props);\n const Navigation = definitionResult.navigation;\n\n return (\n <Navigation\n props={definitionResult.restProps}\n view={LinkView}\n viewProps={{ definitionResult, forwardedRef: ref }}\n />\n );\n});\n\nLink.displayName = 'Link';\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
2
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 tokens, base, components, utilities;\n\n@layer components {\n .Link_bui-Link__b9cba1725b {\n font-family: var(--bui-font-regular);\n padding: 0;\n margin: 0;\n cursor: pointer;\n display: inline-block;\n\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 &: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 &[data-focus-visible] {\n outline: 2px solid var(--bui-ring);\n outline-offset: 2px;\n }\n }\n\n .Link_bui-Link__b9cba1725b[data-variant='title-large'] {\n font-size: var(--bui-font-size-8);\n line-height: 140%;\n }\n\n .Link_bui-Link__b9cba1725b[data-variant='title-medium'] {\n font-size: var(--bui-font-size-7);\n line-height: 140%;\n }\n\n .Link_bui-Link__b9cba1725b[data-variant='title-small'] {\n font-size: var(--bui-font-size-6);\n line-height: 140%;\n }\n\n .Link_bui-Link__b9cba1725b[data-variant='title-x-small'] {\n font-size: var(--bui-font-size-5);\n line-height: 140%;\n }\n\n .Link_bui-Link__b9cba1725b[data-variant='body-large'] {\n font-size: var(--bui-font-size-4);\n line-height: 140%;\n }\n\n .Link_bui-Link__b9cba1725b[data-variant='body-medium'] {\n font-size: var(--bui-font-size-3);\n line-height: 140%;\n }\n\n .Link_bui-Link__b9cba1725b[data-variant='body-small'] {\n font-size: var(--bui-font-size-2);\n line-height: 140%;\n }\n\n .Link_bui-Link__b9cba1725b[data-variant='body-x-small'] {\n font-size: var(--bui-font-size-1);\n line-height: 140%;\n }\n\n .Link_bui-Link__b9cba1725b[data-weight='regular'] {\n font-weight: var(--bui-font-weight-regular);\n }\n\n .Link_bui-Link__b9cba1725b[data-weight='bold'] {\n font-weight: var(--bui-font-weight-bold);\n }\n\n .Link_bui-Link__b9cba1725b[data-color='primary'] {\n color: var(--bui-fg-primary);\n }\n\n .Link_bui-Link__b9cba1725b[data-color='secondary'] {\n color: var(--bui-fg-secondary);\n }\n\n .Link_bui-Link__b9cba1725b[data-color='danger'] {\n color: var(--bui-fg-danger);\n }\n\n .Link_bui-Link__b9cba1725b[data-color='warning'] {\n color: var(--bui-fg-warning);\n }\n\n .Link_bui-Link__b9cba1725b[data-color='success'] {\n color: var(--bui-fg-success);\n }\n\n .Link_bui-Link__b9cba1725b[data-color='info'] {\n color: var(--bui-fg-info);\n }\n\n .Link_bui-Link__b9cba1725b[data-truncate] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .Link_bui-Link__b9cba1725b[data-standalone] {\n text-decoration-line: none;\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 styles = {"bui-Link":"Link_bui-Link__b9cba1725b"};
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 tokens, base, components, theme, utilities;\n\n@layer components {\n .Link_bui-Link__aeb151f5ef {\n font-family: var(--bui-font-regular);\n padding: 0;\n margin: 0;\n cursor: pointer;\n display: inline-block;\n\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 &: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 &[data-focus-visible] {\n outline: 2px solid var(--bui-ring);\n outline-offset: 2px;\n }\n }\n\n .Link_bui-Link__aeb151f5ef[data-variant='title-large'] {\n font-size: var(--bui-font-size-8);\n line-height: 140%;\n }\n\n .Link_bui-Link__aeb151f5ef[data-variant='title-medium'] {\n font-size: var(--bui-font-size-7);\n line-height: 140%;\n }\n\n .Link_bui-Link__aeb151f5ef[data-variant='title-small'] {\n font-size: var(--bui-font-size-6);\n line-height: 140%;\n }\n\n .Link_bui-Link__aeb151f5ef[data-variant='title-x-small'] {\n font-size: var(--bui-font-size-5);\n line-height: 140%;\n }\n\n .Link_bui-Link__aeb151f5ef[data-variant='body-large'] {\n font-size: var(--bui-font-size-4);\n line-height: 140%;\n }\n\n .Link_bui-Link__aeb151f5ef[data-variant='body-medium'] {\n font-size: var(--bui-font-size-3);\n line-height: 140%;\n }\n\n .Link_bui-Link__aeb151f5ef[data-variant='body-small'] {\n font-size: var(--bui-font-size-2);\n line-height: 140%;\n }\n\n .Link_bui-Link__aeb151f5ef[data-variant='body-x-small'] {\n font-size: var(--bui-font-size-1);\n line-height: 140%;\n }\n\n .Link_bui-Link__aeb151f5ef[data-weight='regular'] {\n font-weight: var(--bui-font-weight-regular);\n }\n\n .Link_bui-Link__aeb151f5ef[data-weight='bold'] {\n font-weight: var(--bui-font-weight-bold);\n }\n\n .Link_bui-Link__aeb151f5ef[data-color='primary'] {\n color: var(--bui-fg-primary);\n }\n\n .Link_bui-Link__aeb151f5ef[data-color='secondary'] {\n color: var(--bui-fg-secondary);\n }\n\n .Link_bui-Link__aeb151f5ef[data-color='danger'] {\n color: var(--bui-fg-danger);\n }\n\n .Link_bui-Link__aeb151f5ef[data-color='warning'] {\n color: var(--bui-fg-warning);\n }\n\n .Link_bui-Link__aeb151f5ef[data-color='success'] {\n color: var(--bui-fg-success);\n }\n\n .Link_bui-Link__aeb151f5ef[data-color='info'] {\n color: var(--bui-fg-info);\n }\n\n .Link_bui-Link__aeb151f5ef[data-truncate] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .Link_bui-Link__aeb151f5ef[data-standalone] {\n text-decoration-line: none;\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 styles = {"bui-Link":"Link_bui-Link__aeb151f5ef"};
5
5
  styleInject(css_248z);
6
6
 
7
7
  export { styles as default };
@@ -1 +1 @@
1
- {"version":3,"file":"Link.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
1
+ {"version":3,"file":"Link.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"definition.esm.js","sources":["../../../src/components/Link/definition.ts"],"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 { defineComponent } from '../../hooks/useDefinition';\nimport type { LinkOwnProps } from './types';\nimport styles from './Link.module.css';\n\n/**\n * Component definition for Link\n * @public\n */\nexport const LinkDefinition = defineComponent<LinkOwnProps>()({\n styles,\n classNames: {\n root: 'bui-Link',\n },\n analytics: true,\n navigation: { type: 'anchor' },\n propDefs: {\n noTrack: {},\n variant: { dataAttribute: true, default: 'body-medium' },\n weight: { dataAttribute: true, default: 'regular' },\n color: { dataAttribute: true, default: 'primary' },\n truncate: { dataAttribute: true },\n standalone: { dataAttribute: true },\n title: {},\n children: {},\n className: {},\n },\n});\n"],"names":[],"mappings":";;;;;;;;;;;;AAwBO,MAAM,cAAA,GAAiB,iBAA8B,CAAE;AAAA,EAC5D,MAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM;AAAA,GACR;AAAA,EACA,SAAA,EAAW,IAAA;AAAA,EACX,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAU;AAAA,IACR,SAAS,EAAC;AAAA,IACV,OAAA,EAAS,EAAE,aAAA,EAAe,IAAA,EAAM,SAAS,aAAA,EAAc;AAAA,IACvD,MAAA,EAAQ,EAAE,aAAA,EAAe,IAAA,EAAM,SAAS,SAAA,EAAU;AAAA,IAClD,KAAA,EAAO,EAAE,aAAA,EAAe,IAAA,EAAM,SAAS,SAAA,EAAU;AAAA,IACjD,QAAA,EAAU,EAAE,aAAA,EAAe,IAAA,EAAK;AAAA,IAChC,UAAA,EAAY,EAAE,aAAA,EAAe,IAAA,EAAK;AAAA,IAClC,OAAO,EAAC;AAAA,IACR,UAAU,EAAC;AAAA,IACX,WAAW;AAAC;AAEhB,CAAC;;;;"}
1
+ {"version":3,"file":"definition.esm.js","sources":["../../../src/components/Link/definition.ts"],"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 { defineComponent } from '../../hooks/useDefinition';\nimport type { LinkOwnProps } from './types';\nimport styles from './Link.module.css';\n\n/**\n * Component definition for Link\n * @public\n */\nexport const LinkDefinition = defineComponent<LinkOwnProps>()({\n styles,\n classNames: {\n root: 'bui-Link',\n },\n analytics: true,\n navigation: { type: 'anchor' },\n propDefs: {\n noTrack: {},\n variant: { dataAttribute: true, default: 'body-medium' },\n weight: { dataAttribute: true, default: 'regular' },\n color: { dataAttribute: true, default: 'primary' },\n truncate: { dataAttribute: true },\n standalone: { dataAttribute: true },\n title: {},\n children: {},\n className: {},\n },\n});\n"],"names":[],"mappings":";;;;;;;;;;;;AAwBO,MAAM,cAAA,GAAiB,iBAA8B,CAAE;AAAA,EAC5D,MAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM;AAAA,GACR;AAAA,EACA,SAAA,EAAW,IAAA;AAAA,EACX,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAU;AAAA,IACR,SAAS,EAAC;AAAA,IACV,OAAA,EAAS,EAAE,aAAA,EAAe,IAAA,EAAM,SAAS,aAAA,EAAc;AAAA,IACvD,MAAA,EAAQ,EAAE,aAAA,EAAe,IAAA,EAAM,SAAS,SAAA,EAAU;AAAA,IAClD,KAAA,EAAO,EAAE,aAAA,EAAe,IAAA,EAAM,SAAS,SAAA,EAAU;AAAA,IACjD,QAAA,EAAU,EAAE,aAAA,EAAe,IAAA,EAAK;AAAA,IAChC,UAAA,EAAY,EAAE,aAAA,EAAe,IAAA,EAAK;AAAA,IAClC,OAAO,EAAC;AAAA,IACR,UAAU,EAAC;AAAA,IACX,WAAW;AAAC;AAEhB,CAAC;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"List.esm.js","sources":["../../../src/components/List/List.tsx"],"sourcesContent":["/*\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\nimport {\n GridList as RAGridList,\n GridListItem as RAGridListItem,\n Text,\n} from 'react-aria-components';\nimport { RiCheckLine, RiMoreLine } from '@remixicon/react';\nimport { useDefinition } from '../../hooks/useDefinition';\nimport { ListDefinition, ListRowDefinition } from './definition';\nimport type { ListProps, ListRowProps } from './types';\nimport { Box } from '../Box/Box';\nimport { ButtonIcon } from '../ButtonIcon';\nimport { MenuTrigger, Menu } from '../Menu';\nimport { BUIRoutingProvider } from '../../navigation/BUIRoutingProvider';\n\n/**\n * A list displays a list of interactive rows with support for keyboard\n * navigation, single or multiple selection, and row actions.\n *\n * @public\n */\nexport const List = <T extends object>(props: ListProps<T>) => {\n const { ownProps, restProps, dataAttributes } = useDefinition(\n ListDefinition,\n props,\n );\n const { classes, items, children, renderEmptyState } = ownProps;\n\n return (\n <BUIRoutingProvider>\n <RAGridList\n className={classes.root}\n items={items}\n renderEmptyState={renderEmptyState}\n {...dataAttributes}\n {...restProps}\n >\n {children}\n </RAGridList>\n </BUIRoutingProvider>\n );\n};\n\n/**\n * A row within a List.\n *\n * @public\n */\nexport const ListRow = (props: ListRowProps) => {\n const { ownProps, restProps, dataAttributes } = useDefinition(\n ListRowDefinition,\n props,\n );\n const { classes, children, description, icon, menuItems, customActions } =\n ownProps;\n\n const textValue = typeof children === 'string' ? children : undefined;\n\n return (\n <RAGridListItem\n textValue={textValue}\n className={classes.root}\n {...dataAttributes}\n {...restProps}\n >\n {({ isSelected }) => (\n <>\n {isSelected && (\n <div className={classes.check}>\n <RiCheckLine />\n </div>\n )}\n {icon && (\n <Box bg=\"neutral\" className={classes.icon}>\n {icon}\n </Box>\n )}\n <div className={classes.label}>\n <span>{children}</span>\n {description && (\n <Text slot=\"description\" className={classes.description}>\n {description}\n </Text>\n )}\n </div>\n {customActions && (\n <div className={classes.actions}>{customActions}</div>\n )}\n {menuItems && (\n <div className={classes.actions}>\n <MenuTrigger>\n <ButtonIcon\n icon={<RiMoreLine />}\n size=\"small\"\n aria-label=\"More actions\"\n variant=\"tertiary\"\n />\n <Menu placement=\"bottom end\">{menuItems}</Menu>\n </MenuTrigger>\n </div>\n )}\n </>\n )}\n </RAGridListItem>\n );\n};\n"],"names":["RAGridList","RAGridListItem"],"mappings":";;;;;;;;;;;;AAoCO,MAAM,IAAA,GAAO,CAAmB,KAAA,KAAwB;AAC7D,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,cAAA,EAAe,GAAI,aAAA;AAAA,IAC9C,cAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,kBAAiB,GAAI,QAAA;AAEvD,EAAA,2BACG,kBAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,IAACA,QAAA;AAAA,IAAA;AAAA,MACC,WAAW,OAAA,CAAQ,IAAA;AAAA,MACnB,KAAA;AAAA,MACA,gBAAA;AAAA,MACC,GAAG,cAAA;AAAA,MACH,GAAG,SAAA;AAAA,MAEH;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAOO,MAAM,OAAA,GAAU,CAAC,KAAA,KAAwB;AAC9C,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,cAAA,EAAe,GAAI,aAAA;AAAA,IAC9C,iBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,aAAa,IAAA,EAAM,SAAA,EAAW,eAAc,GACrE,QAAA;AAEF,EAAA,MAAM,SAAA,GAAY,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,MAAA;AAE5D,EAAA,uBACE,GAAA;AAAA,IAACC,YAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,WAAW,OAAA,CAAQ,IAAA;AAAA,MAClB,GAAG,cAAA;AAAA,MACH,GAAG,SAAA;AAAA,MAEH,QAAA,EAAA,CAAC,EAAE,UAAA,EAAW,qBACb,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,UAAA,wBACE,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,KAAA,EACtB,QAAA,kBAAA,GAAA,CAAC,eAAY,CAAA,EACf,CAAA;AAAA,QAED,IAAA,wBACE,GAAA,EAAA,EAAI,EAAA,EAAG,WAAU,SAAA,EAAW,OAAA,CAAQ,MAClC,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,wBAEF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,KAAA,EACtB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAM,QAAA,EAAS,CAAA;AAAA,UACf,WAAA,wBACE,IAAA,EAAA,EAAK,IAAA,EAAK,eAAc,SAAA,EAAW,OAAA,CAAQ,aACzC,QAAA,EAAA,WAAA,EACH;AAAA,SAAA,EAEJ,CAAA;AAAA,QACC,iCACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,SAAU,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,QAEjD,6BACC,GAAA,CAAC,KAAA,EAAA,EAAI,WAAW,OAAA,CAAQ,OAAA,EACtB,+BAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,IAAA,sBAAO,UAAA,EAAA,EAAW,CAAA;AAAA,cAClB,IAAA,EAAK,OAAA;AAAA,cACL,YAAA,EAAW,cAAA;AAAA,cACX,OAAA,EAAQ;AAAA;AAAA,WACV;AAAA,0BACA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAc,QAAA,EAAA,SAAA,EAAU;AAAA,SAAA,EAC1C,CAAA,EACF;AAAA,OAAA,EAEJ;AAAA;AAAA,GAEJ;AAEJ;;;;"}
1
+ {"version":3,"file":"List.esm.js","sources":["../../../src/components/List/List.tsx"],"sourcesContent":["/*\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\nimport {\n GridList as RAGridList,\n GridListItem as RAGridListItem,\n Text,\n} from 'react-aria-components';\nimport { RiCheckLine, RiMoreLine } from '@remixicon/react';\nimport { useDefinition } from '../../hooks/useDefinition';\nimport { ListDefinition, ListRowDefinition } from './definition';\nimport type { ListProps, ListRowProps } from './types';\nimport { Box } from '../Box/Box';\nimport { ButtonIcon } from '../ButtonIcon';\nimport { MenuTrigger, Menu } from '../Menu';\nimport { BUIRoutingProvider } from '../../navigation/BUIRoutingProvider';\n\n/**\n * A list displays a list of interactive rows with support for keyboard\n * navigation, single or multiple selection, and row actions.\n *\n * @public\n */\nexport const List = <T extends object>(props: ListProps<T>) => {\n const { ownProps, restProps, dataAttributes } = useDefinition(\n ListDefinition,\n props,\n );\n const { classes, items, children, renderEmptyState } = ownProps;\n\n return (\n <BUIRoutingProvider>\n <RAGridList\n className={classes.root}\n items={items}\n renderEmptyState={renderEmptyState}\n {...dataAttributes}\n {...restProps}\n >\n {children}\n </RAGridList>\n </BUIRoutingProvider>\n );\n};\n\n/**\n * A row within a List.\n *\n * @public\n */\nexport const ListRow = (props: ListRowProps) => {\n const { ownProps, restProps, dataAttributes } = useDefinition(\n ListRowDefinition,\n props,\n );\n const { classes, children, description, icon, menuItems, customActions } =\n ownProps;\n\n const textValue = typeof children === 'string' ? children : undefined;\n\n return (\n <RAGridListItem\n textValue={textValue}\n className={classes.root}\n {...dataAttributes}\n {...restProps}\n >\n {({ isSelected }) => (\n <>\n {isSelected && (\n <div className={classes.check}>\n <RiCheckLine />\n </div>\n )}\n {icon && (\n <Box bg=\"neutral\" className={classes.icon}>\n {icon}\n </Box>\n )}\n <div className={classes.label}>\n <span>{children}</span>\n {description && (\n <Text slot=\"description\" className={classes.description}>\n {description}\n </Text>\n )}\n </div>\n {customActions && (\n <div className={classes.actions}>{customActions}</div>\n )}\n {menuItems && (\n <div className={classes.actions}>\n <MenuTrigger>\n <ButtonIcon\n icon={<RiMoreLine />}\n size=\"small\"\n aria-label=\"More actions\"\n variant=\"tertiary\"\n />\n <Menu placement=\"bottom end\">{menuItems}</Menu>\n </MenuTrigger>\n </div>\n )}\n </>\n )}\n </RAGridListItem>\n );\n};\n"],"names":["RAGridList","RAGridListItem"],"mappings":";;;;;;;;;;;;AAoCO,MAAM,IAAA,GAAO,CAAmB,KAAA,KAAwB;AAC7D,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,cAAA,EAAe,GAAI,aAAA;AAAA,IAC9C,cAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,kBAAiB,GAAI,QAAA;AAEvD,EAAA,2BACG,kBAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,IAACA,QAAA;AAAA,IAAA;AAAA,MACC,WAAW,OAAA,CAAQ,IAAA;AAAA,MACnB,KAAA;AAAA,MACA,gBAAA;AAAA,MACC,GAAG,cAAA;AAAA,MACH,GAAG,SAAA;AAAA,MAEH;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAOO,MAAM,OAAA,GAAU,CAAC,KAAA,KAAwB;AAC9C,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,cAAA,EAAe,GAAI,aAAA;AAAA,IAC9C,iBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,aAAa,IAAA,EAAM,SAAA,EAAW,eAAc,GACrE,QAAA;AAEF,EAAA,MAAM,SAAA,GAAY,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,MAAA;AAE5D,EAAA,uBACE,GAAA;AAAA,IAACC,YAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,WAAW,OAAA,CAAQ,IAAA;AAAA,MAClB,GAAG,cAAA;AAAA,MACH,GAAG,SAAA;AAAA,MAEH,QAAA,EAAA,CAAC,EAAE,UAAA,EAAW,qBACb,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,UAAA,wBACE,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,KAAA,EACtB,QAAA,kBAAA,GAAA,CAAC,eAAY,CAAA,EACf,CAAA;AAAA,QAED,IAAA,wBACE,GAAA,EAAA,EAAI,EAAA,EAAG,WAAU,SAAA,EAAW,OAAA,CAAQ,MAClC,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,wBAEF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,KAAA,EACtB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAM,QAAA,EAAS,CAAA;AAAA,UACf,WAAA,wBACE,IAAA,EAAA,EAAK,IAAA,EAAK,eAAc,SAAA,EAAW,OAAA,CAAQ,aACzC,QAAA,EAAA,WAAA,EACH;AAAA,SAAA,EAEJ,CAAA;AAAA,QACC,iCACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,SAAU,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,QAEjD,6BACC,GAAA,CAAC,KAAA,EAAA,EAAI,WAAW,OAAA,CAAQ,OAAA,EACtB,+BAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,IAAA,sBAAO,UAAA,EAAA,EAAW,CAAA;AAAA,cAClB,IAAA,EAAK,OAAA;AAAA,cACL,YAAA,EAAW,cAAA;AAAA,cACX,OAAA,EAAQ;AAAA;AAAA,WACV;AAAA,0BACA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAc,QAAA,EAAA,SAAA,EAAU;AAAA,SAAA,EAC1C,CAAA,EACF;AAAA,OAAA,EAEJ;AAAA;AAAA,GAEJ;AAEJ;;"}
@@ -1,7 +1,7 @@
1
1
  import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
2
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 tokens, base, components, utilities;\n\n@layer components {\n .List_bui-List__d81bf3f80c {\n box-sizing: border-box;\n outline: none;\n display: flex;\n flex-direction: column;\n\n gap: var(--bui-space-3);\n\n &:has([data-selection-mode]) {\n gap: 0;\n }\n\n &[data-focus-visible] {\n outline: none;\n }\n }\n\n .List_bui-ListRow__d81bf3f80c {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--bui-space-3);\n border-radius: var(--bui-radius-2);\n font-size: var(--bui-font-size-3);\n font-family: var(--bui-font-regular);\n line-height: 1.15;\n color: var(--bui-fg-primary);\n outline: none;\n\n &[data-disabled] {\n cursor: not-allowed;\n color: var(--bui-fg-disabled);\n }\n\n &[data-focus-visible] {\n outline: 2px solid var(--bui-ring);\n }\n\n &[data-selection-mode] {\n cursor: pointer;\n padding-block: var(--bui-space-2);\n padding-inline: var(--bui-space-2);\n\n &[data-selected] {\n &:has(+ [data-selected]) {\n border-end-start-radius: 0;\n border-end-end-radius: 0;\n }\n\n + [data-selected] {\n border-start-start-radius: 0;\n border-start-end-radius: 0;\n }\n }\n\n &[data-hovered],\n &[data-focus-visible] {\n background-color: var(--bui-bg-neutral-1-hover);\n }\n\n &[data-pressed],\n &[data-selected],\n &[data-selected][data-hovered],\n &[data-selected][data-focus-visible],\n &[data-selected][data-pressed] {\n background-color: var(--bui-bg-neutral-1-pressed);\n }\n\n &[data-on-bg='neutral-1'] {\n &[data-hovered],\n &[data-focus-visible] {\n background-color: var(--bui-bg-neutral-2-hover);\n }\n\n &[data-pressed],\n &[data-selected],\n &[data-selected][data-hovered],\n &[data-selected][data-focus-visible],\n &[data-selected][data-pressed] {\n background-color: var(--bui-bg-neutral-2-pressed);\n }\n }\n\n &[data-on-bg='neutral-2'] {\n &[data-hovered],\n &[data-focus-visible] {\n background-color: var(--bui-bg-neutral-3-hover);\n }\n\n &[data-pressed],\n &[data-selected],\n &[data-selected][data-hovered],\n &[data-selected][data-focus-visible],\n &[data-selected][data-pressed] {\n background-color: var(--bui-bg-neutral-3-pressed);\n }\n }\n\n &[data-on-bg='neutral-3'],\n &[data-on-bg='neutral-4'] {\n &[data-hovered],\n &[data-focus-visible] {\n background-color: var(--bui-bg-neutral-4-hover);\n }\n\n &[data-pressed],\n &[data-selected],\n &[data-selected][data-hovered],\n &[data-selected][data-focus-visible],\n &[data-selected][data-pressed] {\n background-color: var(--bui-bg-neutral-4-pressed);\n }\n }\n }\n }\n\n .List_bui-ListRowCheck__d81bf3f80c {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1rem;\n height: 1rem;\n\n & svg {\n width: 1rem;\n height: 1rem;\n }\n }\n\n .List_bui-ListRowIcon__d81bf3f80c {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 2rem;\n height: 2rem;\n color: var(--bui-fg-secondary);\n border-radius: var(--bui-radius-2);\n\n & svg {\n width: 1rem;\n height: 1rem;\n }\n }\n\n .List_bui-ListRowLabel__d81bf3f80c {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: var(--bui-space-1);\n min-width: 0;\n overflow: hidden;\n\n & > * {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n }\n\n .List_bui-ListRowDescription__d81bf3f80c {\n font-size: var(--bui-font-size-2);\n color: var(--bui-fg-secondary);\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .List_bui-ListRowActions__d81bf3f80c {\n display: flex;\n align-items: center;\n gap: var(--bui-space-1);\n flex-shrink: 0;\n margin-left: auto;\n }\n}\n";
4
- var styles = {"bui-List":"List_bui-List__d81bf3f80c","bui-ListRow":"List_bui-ListRow__d81bf3f80c","bui-ListRowCheck":"List_bui-ListRowCheck__d81bf3f80c","bui-ListRowIcon":"List_bui-ListRowIcon__d81bf3f80c","bui-ListRowLabel":"List_bui-ListRowLabel__d81bf3f80c","bui-ListRowDescription":"List_bui-ListRowDescription__d81bf3f80c","bui-ListRowActions":"List_bui-ListRowActions__d81bf3f80c"};
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 tokens, base, components, theme, utilities;\n\n@layer components {\n .List_bui-List__3e417299c2 {\n box-sizing: border-box;\n outline: none;\n display: flex;\n flex-direction: column;\n\n gap: var(--bui-space-3);\n\n &:has([data-selection-mode]) {\n gap: 0;\n }\n\n &[data-focus-visible] {\n outline: none;\n }\n }\n\n .List_bui-ListRow__3e417299c2 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--bui-space-3);\n border-radius: var(--bui-radius-2);\n font-size: var(--bui-font-size-3);\n font-family: var(--bui-font-regular);\n line-height: 1.15;\n color: var(--bui-fg-primary);\n outline: none;\n\n &[data-disabled] {\n cursor: not-allowed;\n color: var(--bui-fg-disabled);\n }\n\n &[data-focus-visible] {\n outline: 2px solid var(--bui-ring);\n }\n\n &[data-selection-mode] {\n cursor: pointer;\n padding-block: var(--bui-space-2);\n padding-inline: var(--bui-space-2);\n\n &[data-selected] {\n &:has(+ [data-selected]) {\n border-end-start-radius: 0;\n border-end-end-radius: 0;\n }\n\n + [data-selected] {\n border-start-start-radius: 0;\n border-start-end-radius: 0;\n }\n }\n\n &[data-hovered],\n &[data-focus-visible] {\n background-color: var(--bui-bg-neutral-1-hover);\n }\n\n &[data-pressed],\n &[data-selected],\n &[data-selected][data-hovered],\n &[data-selected][data-focus-visible],\n &[data-selected][data-pressed] {\n background-color: var(--bui-bg-neutral-1-pressed);\n }\n\n &[data-on-bg='neutral-1'] {\n &[data-hovered],\n &[data-focus-visible] {\n background-color: var(--bui-bg-neutral-2-hover);\n }\n\n &[data-pressed],\n &[data-selected],\n &[data-selected][data-hovered],\n &[data-selected][data-focus-visible],\n &[data-selected][data-pressed] {\n background-color: var(--bui-bg-neutral-2-pressed);\n }\n }\n\n &[data-on-bg='neutral-2'] {\n &[data-hovered],\n &[data-focus-visible] {\n background-color: var(--bui-bg-neutral-3-hover);\n }\n\n &[data-pressed],\n &[data-selected],\n &[data-selected][data-hovered],\n &[data-selected][data-focus-visible],\n &[data-selected][data-pressed] {\n background-color: var(--bui-bg-neutral-3-pressed);\n }\n }\n\n &[data-on-bg='neutral-3'],\n &[data-on-bg='neutral-4'] {\n &[data-hovered],\n &[data-focus-visible] {\n background-color: var(--bui-bg-neutral-4-hover);\n }\n\n &[data-pressed],\n &[data-selected],\n &[data-selected][data-hovered],\n &[data-selected][data-focus-visible],\n &[data-selected][data-pressed] {\n background-color: var(--bui-bg-neutral-4-pressed);\n }\n }\n }\n }\n\n .List_bui-ListRowCheck__3e417299c2 {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1rem;\n height: 1rem;\n\n & svg {\n width: 1rem;\n height: 1rem;\n }\n }\n\n .List_bui-ListRowIcon__3e417299c2 {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 2rem;\n height: 2rem;\n color: var(--bui-fg-secondary);\n border-radius: var(--bui-radius-2);\n\n & svg {\n width: 1rem;\n height: 1rem;\n }\n }\n\n .List_bui-ListRowLabel__3e417299c2 {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: var(--bui-space-1);\n min-width: 0;\n overflow: hidden;\n\n & > * {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n }\n\n .List_bui-ListRowDescription__3e417299c2 {\n font-size: var(--bui-font-size-2);\n color: var(--bui-fg-secondary);\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .List_bui-ListRowActions__3e417299c2 {\n display: flex;\n align-items: center;\n gap: var(--bui-space-1);\n flex-shrink: 0;\n margin-left: auto;\n }\n}\n";
4
+ var styles = {"bui-List":"List_bui-List__3e417299c2","bui-ListRow":"List_bui-ListRow__3e417299c2","bui-ListRowCheck":"List_bui-ListRowCheck__3e417299c2","bui-ListRowIcon":"List_bui-ListRowIcon__3e417299c2","bui-ListRowLabel":"List_bui-ListRowLabel__3e417299c2","bui-ListRowDescription":"List_bui-ListRowDescription__3e417299c2","bui-ListRowActions":"List_bui-ListRowActions__3e417299c2"};
5
5
  styleInject(css_248z);
6
6
 
7
7
  export { styles as default };