@backstage/ui 0.0.0-nightly-20250816024305 → 0.0.0-nightly-20250818024926

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.
package/CHANGELOG.md CHANGED
@@ -1,11 +1,12 @@
1
1
  # @backstage/ui
2
2
 
3
- ## 0.0.0-nightly-20250816024305
3
+ ## 0.0.0-nightly-20250818024926
4
4
 
5
5
  ### Minor Changes
6
6
 
7
7
  - 0615e54: We are moving our DataTable component to React Aria. We removed our DataTable to only use Table as a single and opinionated option for tables. This new structure is made possible by using React Aria under the hood.
8
8
  - b245c9d: Backstage UI - HeaderPage - We are updating the breadcrumb to be more visible and accessible.
9
+ - 800f593: **Breaking change** We are updating the Menu component to use React Aria under the hood. The structure and all props are changing to follow React Aria's guidance.
9
10
  - b0e47f3: **Breaking** We are upgrading our `Text` component to support all font sizes making the `Heading` component redundant. The new `Text` component introduces 4 sizes for title and 4 sizes for body text. All of these work in multiple colors and font weights. We improved the `as` prop to include all possible values. The `Link` component has also been updated to match the new `Text` component.
10
11
 
11
12
  ### Patch Changes
package/css/styles.css CHANGED
@@ -9688,184 +9688,245 @@
9688
9688
  }
9689
9689
  }
9690
9690
 
9691
- .bui-MenuPositioner {
9692
- z-index: 100;
9693
- outline: 0;
9694
- }
9695
-
9696
- .bui-MenuPopup {
9697
- background-color: var(--bui-bg-surface-1);
9691
+ .bui-MenuPopover {
9698
9692
  border: 1px solid var(--bui-border);
9693
+ border-radius: var(--bui-radius-2);
9694
+ background: var(--bui-bg-surface-1);
9699
9695
  color: var(--bui-fg-primary);
9700
- transform-origin: var(--transform-origin);
9701
- max-width: min(var(--available-width), 340px);
9702
- max-height: min(var(--available-height), 500px);
9703
- padding-bottom: var(--bui-space-1);
9704
- border-radius: .375rem;
9705
9696
  outline: none;
9706
9697
  flex-direction: column;
9707
- transition: transform .15s, opacity .15s;
9698
+ min-height: 0;
9699
+ transition: transform .2s, opacity .2s;
9708
9700
  display: flex;
9709
- position: relative;
9710
- overflow: auto;
9701
+ overflow: hidden;
9711
9702
 
9712
- &[data-starting-style], &[data-ending-style] {
9703
+ &[data-entering], &[data-exiting] {
9704
+ transform: var(--origin);
9713
9705
  opacity: 0;
9714
- transform: scale(.9);
9715
9706
  }
9716
- }
9717
9707
 
9718
- .bui-MenuItem {
9719
- user-select: none;
9720
- align-items: center;
9721
- gap: var(--bui-space-2);
9722
- height: 32px;
9723
- color: var(--bui-fg-primary);
9724
- border-radius: var(--bui-radius-2);
9725
- margin-inline: var(--bui-space-1);
9726
- padding-inline: var(--bui-space-2);
9727
- font-size: var(--bui-font-size-3);
9728
- cursor: pointer;
9729
- outline: 0;
9730
- flex-shrink: 0;
9731
- text-decoration: none;
9732
- display: flex;
9708
+ &[data-placement="top"] {
9709
+ --origin: translateY(8px);
9710
+ }
9733
9711
 
9734
- &:first-child {
9735
- margin-top: var(--bui-space-1);
9712
+ &[data-placement="bottom"] {
9713
+ --origin: translateY(-8px);
9714
+ }
9715
+
9716
+ &[data-placement="right"] {
9717
+ --origin: translateX(-8px);
9736
9718
  }
9737
9719
 
9738
- &[data-highlighted] {
9739
- background-color: var(--bui-gray-3);
9720
+ &[data-placement="left"] {
9721
+ --origin: translateX(8px);
9740
9722
  }
9741
9723
  }
9742
9724
 
9743
- .bui-MenuSubmenuTrigger {
9744
- user-select: none;
9745
- justify-content: space-between;
9746
- align-items: center;
9747
- gap: var(--bui-space-2);
9748
- height: 32px;
9749
- color: var(--bui-fg-primary);
9750
- border-radius: var(--bui-radius-2);
9751
- margin-inline: var(--bui-space-1);
9725
+ .bui-MenuContent {
9726
+ max-height: inherit;
9727
+ box-sizing: border-box;
9728
+ padding: var(--bui-space-1);
9729
+ outline: none;
9730
+ min-width: 150px;
9731
+ overflow: auto;
9732
+ }
9733
+
9734
+ .bui-MenuPopover .bui-ScrollAreaRoot {
9735
+ flex-direction: column;
9736
+ flex: 1;
9737
+ height: 100%;
9738
+ min-height: 0;
9739
+ display: flex;
9740
+ }
9741
+
9742
+ .bui-MenuPopover .bui-ScrollAreaScrollbar {
9743
+ margin-inline: var(--bui-space-1_5);
9744
+ }
9745
+
9746
+ .bui-MenuItem {
9747
+ height: 2rem;
9752
9748
  padding-inline: var(--bui-space-2);
9749
+ border-radius: var(--bui-radius-2);
9750
+ cursor: default;
9751
+ color: var(--bui-fg-primary);
9753
9752
  font-size: var(--bui-font-size-3);
9754
- cursor: pointer;
9755
- outline: 0;
9756
- flex-shrink: 0;
9757
- text-decoration: none;
9753
+ justify-content: space-between;
9754
+ align-items: center;
9755
+ gap: var(--bui-space-6);
9756
+ outline: none;
9758
9757
  display: flex;
9759
9758
 
9760
- & .bui-Icon {
9761
- color: var(--bui-fg-secondary);
9759
+ &[data-focused], &[data-open] {
9760
+ background: var(--bui-bg-surface-2);
9761
+ color: var(--bui-fg-primary);
9762
9762
  }
9763
9763
 
9764
- &:first-child {
9765
- margin-top: var(--bui-space-1);
9764
+ &[data-color="danger"] {
9765
+ color: var(--bui-fg-danger);
9766
9766
  }
9767
9767
 
9768
- &[data-popup-open], &[data-highlighted] {
9769
- background-color: var(--bui-gray-3);
9768
+ &[data-color="danger"][data-focused] {
9769
+ background: var(--bui-bg-danger);
9770
+ color: var(--bui-fg-danger);
9771
+ }
9770
9772
 
9771
- & .bui-Icon {
9772
- color: var(--bui-fg-primary);
9773
+ &[data-has-submenu] {
9774
+ & > .bui-MenuItemArrow {
9775
+ display: block;
9773
9776
  }
9774
9777
  }
9775
9778
  }
9776
9779
 
9777
- .bui-MenuSeparator {
9778
- background-color: var(--color-gray-200);
9779
- height: 1px;
9780
- margin: .375rem 1rem;
9781
- }
9782
-
9783
- .bui-SubmenuComboboxSearch {
9784
- padding-inline: var(--bui-space-3);
9785
- border: none;
9786
- border-bottom: 1px solid var(--bui-border);
9787
- background-color: var(--bui-bg-surface-1);
9788
- width: 100%;
9789
- height: 32px;
9780
+ .bui-MenuItemListBox {
9781
+ height: 2rem;
9782
+ padding-inline: var(--bui-space-2);
9783
+ border-radius: var(--bui-radius-2);
9784
+ cursor: default;
9790
9785
  color: var(--bui-fg-primary);
9791
- line-height: 140%;
9792
9786
  font-size: var(--bui-font-size-3);
9793
- z-index: 1;
9787
+ justify-content: space-between;
9788
+ align-items: center;
9789
+ gap: var(--bui-space-6);
9794
9790
  outline: none;
9795
- position: sticky;
9796
- top: 0;
9791
+ display: flex;
9797
9792
 
9798
- &::placeholder {
9799
- color: var(--bui-fg-secondary);
9793
+ &:hover {
9794
+ background: var(--bui-bg-surface-2);
9795
+ color: var(--bui-fg-primary);
9800
9796
  }
9801
9797
 
9802
- &:disabled {
9803
- opacity: .6;
9804
- cursor: not-allowed;
9798
+ &[data-selected] .bui-MenuItemListBoxCheck {
9799
+ & > svg {
9800
+ opacity: 1;
9801
+ color: var(--bui-fg-primary);
9802
+ }
9805
9803
  }
9806
9804
  }
9807
9805
 
9808
- .bui-SubmenuComboboxItems {
9809
- padding-top: var(--bui-space-2);
9810
- outline: none;
9811
- flex-direction: column;
9806
+ .bui-MenuItemListBoxCheck {
9807
+ justify-content: center;
9808
+ align-items: center;
9809
+ width: 1rem;
9810
+ height: 1rem;
9812
9811
  display: flex;
9813
- overflow-y: auto;
9814
- }
9815
9812
 
9816
- .bui-SubmenuComboboxNoResults {
9817
- padding-inline: var(--bui-space-3);
9818
- padding-top: var(--bui-space-2);
9819
- padding-bottom: var(--bui-space-4);
9820
- color: var(--bui-fg-secondary);
9821
- font-size: var(--bui-font-size-3);
9813
+ & > svg {
9814
+ opacity: 0;
9815
+ width: 1rem;
9816
+ height: 1rem;
9817
+ }
9822
9818
  }
9823
9819
 
9824
- .bui-SubmenuComboboxItem {
9825
- user-select: none;
9826
- justify-content: space-between;
9820
+ .bui-MenuItemContent {
9827
9821
  align-items: center;
9828
9822
  gap: var(--bui-space-2);
9829
- height: 32px;
9830
- color: var(--bui-fg-primary);
9831
- border-radius: var(--bui-radius-2);
9832
- margin-inline: var(--bui-space-1);
9833
- padding-inline: var(--bui-space-2);
9834
- font-size: var(--bui-font-size-3);
9835
- cursor: pointer;
9836
- outline: 0;
9837
- flex-shrink: 0;
9838
- text-decoration: none;
9839
9823
  display: flex;
9840
9824
 
9841
- &[data-highlighted] {
9842
- background-color: var(--bui-gray-3);
9825
+ & > svg {
9826
+ width: 1rem;
9827
+ height: 1rem;
9843
9828
  }
9829
+ }
9844
9830
 
9845
- &[data-disabled] {
9846
- opacity: .5;
9847
- cursor: not-allowed;
9831
+ .bui-MenuItemArrow {
9832
+ width: 1rem;
9833
+ height: 1rem;
9834
+ display: none;
9835
+
9836
+ & > svg {
9837
+ width: 1rem;
9838
+ height: 1rem;
9848
9839
  }
9849
9840
  }
9850
9841
 
9851
- .bui-SubmenuComboboxItemCheckbox {
9852
- width: 16px;
9853
- height: 16px;
9842
+ .bui-MenuSection {
9843
+ &:first-child .bui-MenuSectionHeader {
9844
+ padding-top: 0;
9845
+ }
9846
+ }
9847
+
9848
+ .bui-MenuSectionHeader {
9849
+ height: 2rem;
9850
+ padding-top: var(--bui-space-3);
9851
+ padding-left: var(--bui-space-2);
9854
9852
  color: var(--bui-fg-primary);
9855
- border-radius: var(--bui-radius-2);
9856
- border: 1px solid var(--bui-border);
9857
- background: var(--bui-bg-surface-1);
9853
+ font-size: var(--bui-font-size-1);
9854
+ letter-spacing: .05rem;
9855
+ text-transform: uppercase;
9856
+ align-items: center;
9857
+ font-weight: bold;
9858
+ display: flex;
9859
+ }
9860
+
9861
+ .bui-MenuSeparator {
9862
+ background: var(--bui-border);
9863
+ height: 1px;
9864
+ margin-inline: var(--bui-space-1_5);
9865
+ margin-block: var(--bui-space-1);
9866
+ }
9867
+
9868
+ .bui-MenuSearchField {
9869
+ font-family: var(--bui-font-regular);
9858
9870
  flex-shrink: 0;
9871
+ width: 100%;
9872
+ position: relative;
9873
+
9874
+ &[data-empty] {
9875
+ & .bui-MenuSearchFieldClear {
9876
+ display: none;
9877
+ }
9878
+ }
9879
+ }
9880
+
9881
+ .bui-MenuSearchFieldInput {
9882
+ padding: 0 var(--bui-space-3);
9883
+ border: none;
9884
+ border-bottom: 1px solid var(--bui-border);
9885
+ background-color: var(--bui-bg-surface-1);
9886
+ font-size: var(--bui-font-size-3);
9887
+ font-family: var(--bui-font-regular);
9888
+ font-weight: var(--bui-font-weight-regular);
9889
+ color: var(--bui-fg-primary);
9890
+ width: 100%;
9891
+ height: 2rem;
9892
+ cursor: inherit;
9893
+ outline: none;
9894
+ align-items: center;
9895
+ display: flex;
9896
+
9897
+ &::-webkit-search-cancel-button, &::-webkit-search-decoration {
9898
+ -webkit-appearance: none;
9899
+ }
9900
+ }
9901
+
9902
+ .bui-MenuSearchFieldClear {
9903
+ right: var(--bui-space-2);
9904
+ cursor: pointer;
9905
+ color: var(--bui-fg-secondary);
9906
+ background-color: #0000;
9907
+ border: none;
9859
9908
  justify-content: center;
9860
9909
  align-items: center;
9910
+ margin: 0;
9911
+ padding: 0;
9912
+ transition: color .2s ease-in-out;
9861
9913
  display: flex;
9914
+ position: absolute;
9915
+ top: 0;
9916
+ bottom: 0;
9917
+
9918
+ & > svg {
9919
+ width: 1rem;
9920
+ height: 1rem;
9921
+ }
9862
9922
  }
9863
9923
 
9864
- .bui-SubmenuComboboxItemLabel {
9865
- text-overflow: ellipsis;
9866
- white-space: nowrap;
9867
- flex: 1;
9868
- overflow: hidden;
9924
+ .bui-MenuEmptyState {
9925
+ padding: var(--bui-space-1);
9926
+ color: var(--bui-fg-secondary);
9927
+ font-size: var(--bui-font-size-3);
9928
+ font-family: var(--bui-font-regular);
9929
+ font-weight: var(--bui-font-weight-regular);
9869
9930
  }
9870
9931
 
9871
9932
  .bui-Popover {
@@ -14,13 +14,12 @@ import '../FieldLabel/FieldLabel.esm.js';
14
14
  import 'react-aria-components';
15
15
  import { useStyles } from '../../hooks/useStyles.esm.js';
16
16
  import '@remixicon/react';
17
- import '../ButtonIcon/ButtonIcon.esm.js';
18
- import '../Menu/Menu.esm.js';
19
17
  import '../Text/Text.esm.js';
20
18
  import 'react-router-dom';
21
19
  import '../Tabs/Tabs.esm.js';
22
20
  import '../Link/Link.esm.js';
23
21
  import { Icon } from '../Icon/Icon.esm.js';
22
+ import '../ButtonIcon/ButtonIcon.esm.js';
24
23
  import '../ButtonLink/ButtonLink.esm.js';
25
24
  import '../RadioGroup/RadioGroup.esm.js';
26
25
  import '../Table/components/Cell.esm.js';
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.esm.js","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { forwardRef } from 'react';\nimport { Checkbox as CheckboxPrimitive } from '@base-ui-components/react/checkbox';\nimport { Icon } from '../..';\nimport type { CheckboxProps } from './types';\nimport { useStyles } from '../../hooks/useStyles';\nimport clsx from 'clsx';\n\n/** @public */\nexport const Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(\n (props, ref) => {\n const {\n label,\n checked,\n onChange,\n disabled,\n required,\n className,\n name,\n value,\n style,\n } = props;\n\n const { classNames } = useStyles('Checkbox');\n\n const checkboxElement = (\n <CheckboxPrimitive.Root\n ref={ref}\n className={clsx(classNames.root, className)}\n checked={checked}\n onCheckedChange={onChange}\n disabled={disabled}\n required={required}\n name={name}\n value={value}\n style={style}\n >\n <CheckboxPrimitive.Indicator className={classNames.indicator}>\n <Icon name=\"check\" size={12} />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n\n return label ? (\n <label className={classNames.label}>\n {checkboxElement}\n {label}\n </label>\n ) : (\n checkboxElement\n );\n },\n);\n"],"names":["CheckboxPrimitive"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBO,MAAM,QAAA,GAAW,UAAA;AAAA,EACtB,CAAC,OAAO,GAAA,KAAQ;AACd,IAAA,MAAM;AAAA,MACJ,KAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF,GAAI,KAAA;AAEJ,IAAA,MAAM,EAAE,UAAA,EAAW,GAAI,SAAA,CAAU,UAAU,CAAA;AAE3C,IAAA,MAAM,eAAA,mBACJ,GAAA;AAAA,MAACA,UAAA,CAAkB,IAAA;AAAA,MAAlB;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,IAAA,CAAK,UAAA,CAAW,IAAA,EAAM,SAAS,CAAA;AAAA,QAC1C,OAAA;AAAA,QACA,eAAA,EAAiB,QAAA;AAAA,QACjB,QAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QAEA,QAAA,kBAAA,GAAA,CAACA,UAAA,CAAkB,SAAA,EAAlB,EAA4B,SAAA,EAAW,UAAA,CAAW,SAAA,EACjD,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,IAAA,EAAM,IAAI,CAAA,EAC/B;AAAA;AAAA,KACF;AAGF,IAAA,OAAO,KAAA,mBACL,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,WAAW,KAAA,EAC1B,QAAA,EAAA;AAAA,MAAA,eAAA;AAAA,MACA;AAAA,KAAA,EACH,CAAA,GAEA,eAAA;AAAA,EAEJ;AACF;;;;"}
1
+ {"version":3,"file":"Checkbox.esm.js","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { forwardRef } from 'react';\nimport { Checkbox as CheckboxPrimitive } from '@base-ui-components/react/checkbox';\nimport { Icon } from '../..';\nimport type { CheckboxProps } from './types';\nimport { useStyles } from '../../hooks/useStyles';\nimport clsx from 'clsx';\n\n/** @public */\nexport const Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(\n (props, ref) => {\n const {\n label,\n checked,\n onChange,\n disabled,\n required,\n className,\n name,\n value,\n style,\n } = props;\n\n const { classNames } = useStyles('Checkbox');\n\n const checkboxElement = (\n <CheckboxPrimitive.Root\n ref={ref}\n className={clsx(classNames.root, className)}\n checked={checked}\n onCheckedChange={onChange}\n disabled={disabled}\n required={required}\n name={name}\n value={value}\n style={style}\n >\n <CheckboxPrimitive.Indicator className={classNames.indicator}>\n <Icon name=\"check\" size={12} />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n\n return label ? (\n <label className={classNames.label}>\n {checkboxElement}\n {label}\n </label>\n ) : (\n checkboxElement\n );\n },\n);\n"],"names":["CheckboxPrimitive"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBO,MAAM,QAAA,GAAW,UAAA;AAAA,EACtB,CAAC,OAAO,GAAA,KAAQ;AACd,IAAA,MAAM;AAAA,MACJ,KAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF,GAAI,KAAA;AAEJ,IAAA,MAAM,EAAE,UAAA,EAAW,GAAI,SAAA,CAAU,UAAU,CAAA;AAE3C,IAAA,MAAM,eAAA,mBACJ,GAAA;AAAA,MAACA,UAAA,CAAkB,IAAA;AAAA,MAAlB;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,IAAA,CAAK,UAAA,CAAW,IAAA,EAAM,SAAS,CAAA;AAAA,QAC1C,OAAA;AAAA,QACA,eAAA,EAAiB,QAAA;AAAA,QACjB,QAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QAEA,QAAA,kBAAA,GAAA,CAACA,UAAA,CAAkB,SAAA,EAAlB,EAA4B,SAAA,EAAW,UAAA,CAAW,SAAA,EACjD,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,IAAA,EAAM,IAAI,CAAA,EAC/B;AAAA;AAAA,KACF;AAGF,IAAA,OAAO,KAAA,mBACL,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,WAAW,KAAA,EAC1B,QAAA,EAAA;AAAA,MAAA,eAAA;AAAA,MACA;AAAA,KAAA,EACH,CAAA,GAEA,eAAA;AAAA,EAEJ;AACF;;;;"}
@@ -4,15 +4,7 @@ import { Tabs, TabList, Tab } from '../Tabs/Tabs.esm.js';
4
4
  import { useStyles } from '../../hooks/useStyles.esm.js';
5
5
 
6
6
  const Header = (props) => {
7
- const {
8
- tabs,
9
- icon,
10
- title,
11
- titleLink,
12
- menuItems,
13
- customActions,
14
- onTabSelectionChange
15
- } = props;
7
+ const { tabs, icon, title, titleLink, customActions, onTabSelectionChange } = props;
16
8
  const { classNames } = useStyles("Header");
17
9
  const hasTabs = tabs && tabs.length > 0;
18
10
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -22,7 +14,6 @@ const Header = (props) => {
22
14
  icon,
23
15
  title,
24
16
  titleLink,
25
- menuItems,
26
17
  customActions,
27
18
  hasTabs
28
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Header.esm.js","sources":["../../../src/components/Header/Header.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 type { HeaderProps } from './types';\nimport { HeaderToolbar } from './HeaderToolbar';\nimport { Tabs, TabList, Tab } from '../Tabs';\nimport { useStyles } from '../../hooks/useStyles';\nimport { type NavigateOptions } from 'react-router-dom';\n\ndeclare module 'react-aria-components' {\n interface RouterConfig {\n routerOptions: NavigateOptions;\n }\n}\n\n/**\n * A component that renders a toolbar.\n *\n * @public\n */\nexport const Header = (props: HeaderProps) => {\n const {\n tabs,\n icon,\n title,\n titleLink,\n menuItems,\n customActions,\n onTabSelectionChange,\n } = props;\n\n const { classNames } = useStyles('Header');\n\n const hasTabs = tabs && tabs.length > 0;\n\n return (\n <>\n <HeaderToolbar\n icon={icon}\n title={title}\n titleLink={titleLink}\n menuItems={menuItems}\n customActions={customActions}\n hasTabs={hasTabs}\n />\n {tabs && (\n <div className={classNames.tabsWrapper}>\n <Tabs onSelectionChange={onTabSelectionChange}>\n <TabList>\n {tabs?.map(tab => (\n <Tab\n key={tab.id}\n id={tab.id}\n href={tab.href}\n matchStrategy={tab.matchStrategy}\n >\n {tab.label}\n </Tab>\n ))}\n </TabList>\n </Tabs>\n </div>\n )}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;AAiCO,MAAM,MAAA,GAAS,CAAC,KAAA,KAAuB;AAC5C,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,SAAA,CAAU,QAAQ,CAAA;AAEzC,EAAA,MAAM,OAAA,GAAU,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,CAAA;AAEtC,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,IACC,IAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,WAAW,WAAA,EACzB,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,iBAAA,EAAmB,oBAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,OAAA,EAAA,EACE,QAAA,EAAA,IAAA,EAAM,IAAI,CAAA,GAAA,qBACT,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QAEC,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,eAAe,GAAA,CAAI,aAAA;AAAA,QAElB,QAAA,EAAA,GAAA,CAAI;AAAA,OAAA;AAAA,MALA,GAAA,CAAI;AAAA,KAOZ,CAAA,EACH,CAAA,EACF,CAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;;"}
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 { HeaderToolbar } from './HeaderToolbar';\nimport { Tabs, TabList, Tab } from '../Tabs';\nimport { useStyles } from '../../hooks/useStyles';\nimport { type NavigateOptions } from 'react-router-dom';\n\ndeclare module 'react-aria-components' {\n interface RouterConfig {\n routerOptions: NavigateOptions;\n }\n}\n\n/**\n * A component that renders a toolbar.\n *\n * @public\n */\nexport const Header = (props: HeaderProps) => {\n const { tabs, icon, title, titleLink, customActions, onTabSelectionChange } =\n props;\n\n const { classNames } = useStyles('Header');\n\n const hasTabs = tabs && tabs.length > 0;\n\n return (\n <>\n <HeaderToolbar\n icon={icon}\n title={title}\n titleLink={titleLink}\n customActions={customActions}\n hasTabs={hasTabs}\n />\n {tabs && (\n <div className={classNames.tabsWrapper}>\n <Tabs onSelectionChange={onTabSelectionChange}>\n <TabList>\n {tabs?.map(tab => (\n <Tab\n key={tab.id}\n id={tab.id}\n href={tab.href}\n matchStrategy={tab.matchStrategy}\n >\n {tab.label}\n </Tab>\n ))}\n </TabList>\n </Tabs>\n </div>\n )}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;AAiCO,MAAM,MAAA,GAAS,CAAC,KAAA,KAAuB;AAC5C,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,OAAO,SAAA,EAAW,aAAA,EAAe,sBAAqB,GACxE,KAAA;AAEF,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,SAAA,CAAU,QAAQ,CAAA;AAEzC,EAAA,MAAM,OAAA,GAAU,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,CAAA;AAEtC,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,IACC,IAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,WAAW,WAAA,EACzB,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,iBAAA,EAAmB,oBAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,OAAA,EAAA,EACE,QAAA,EAAA,IAAA,EAAM,IAAI,CAAA,GAAA,qBACT,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QAEC,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,eAAe,GAAA,CAAI,aAAA;AAAA,QAElB,QAAA,EAAA,GAAA,CAAI;AAAA,OAAA;AAAA,MALA,GAAA,CAAI;AAAA,KAOZ,CAAA,EACH,CAAA,EACF,CAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;;"}
@@ -2,14 +2,12 @@ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
2
  import { RouterProvider, Link } from 'react-aria-components';
3
3
  import { useStyles } from '../../hooks/useStyles.esm.js';
4
4
  import { useRef } from 'react';
5
- import { RiShapesLine, RiMore2Line } from '@remixicon/react';
6
- import { ButtonIcon } from '../ButtonIcon/ButtonIcon.esm.js';
7
- import { Menu } from '../Menu/Menu.esm.js';
5
+ import { RiShapesLine } from '@remixicon/react';
8
6
  import { Text } from '../Text/Text.esm.js';
9
7
  import { useNavigate, useHref } from 'react-router-dom';
10
8
 
11
9
  const HeaderToolbar = (props) => {
12
- const { icon, title, titleLink, menuItems, customActions, hasTabs } = props;
10
+ const { icon, title, titleLink, customActions, hasTabs } = props;
13
11
  const { classNames } = useStyles("Header");
14
12
  let navigate = useNavigate();
15
13
  const toolbarWrapperRef = useRef(null);
@@ -21,33 +19,7 @@ const HeaderToolbar = (props) => {
21
19
  ] });
22
20
  return /* @__PURE__ */ jsx(RouterProvider, { navigate, useHref, children: /* @__PURE__ */ jsx("div", { className: classNames.toolbar, "data-has-tabs": hasTabs, children: /* @__PURE__ */ jsxs("div", { className: classNames.toolbarWrapper, ref: toolbarWrapperRef, children: [
23
21
  /* @__PURE__ */ jsx("div", { className: classNames.toolbarContent, ref: toolbarContentRef, children: /* @__PURE__ */ jsx(Text, { as: "h1", variant: "body-medium", children: titleLink ? /* @__PURE__ */ jsx(Link, { className: classNames.toolbarName, href: titleLink, children: titleContent }) : /* @__PURE__ */ jsx("div", { className: classNames.toolbarName, children: titleContent }) }) }),
24
- /* @__PURE__ */ jsxs("div", { className: classNames.toolbarControls, ref: toolbarControlsRef, children: [
25
- customActions,
26
- menuItems && /* @__PURE__ */ jsxs(Menu.Root, { children: [
27
- /* @__PURE__ */ jsx(
28
- Menu.Trigger,
29
- {
30
- render: (props2) => /* @__PURE__ */ jsx(
31
- ButtonIcon,
32
- {
33
- size: "small",
34
- icon: /* @__PURE__ */ jsx(RiMore2Line, {}),
35
- variant: "tertiary",
36
- ...props2
37
- }
38
- )
39
- }
40
- ),
41
- /* @__PURE__ */ jsx(Menu.Portal, { children: /* @__PURE__ */ jsx(Menu.Positioner, { sideOffset: 4, align: "end", children: /* @__PURE__ */ jsx(Menu.Popup, { children: menuItems.map((option) => /* @__PURE__ */ jsx(
42
- Menu.Item,
43
- {
44
- onClick: () => option.onClick?.(),
45
- children: option.label
46
- },
47
- option.value
48
- )) }) }) })
49
- ] })
50
- ] })
22
+ /* @__PURE__ */ jsx("div", { className: classNames.toolbarControls, ref: toolbarControlsRef, children: customActions })
51
23
  ] }) }) });
52
24
  };
53
25
 
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderToolbar.esm.js","sources":["../../../src/components/Header/HeaderToolbar.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 { Link, RouterProvider } from 'react-aria-components';\nimport { useStyles } from '../../hooks/useStyles';\nimport { useRef } from 'react';\nimport { RiMore2Line, RiShapesLine } from '@remixicon/react';\nimport type { HeaderToolbarProps } from './types';\nimport { ButtonIcon } from '../ButtonIcon';\nimport { Menu } from '../Menu';\nimport { Text } from '../Text';\nimport { useNavigate, useHref } from 'react-router-dom';\n\n/**\n * A component that renders a toolbar.\n *\n * @internal\n */\nexport const HeaderToolbar = (props: HeaderToolbarProps) => {\n const { icon, title, titleLink, menuItems, customActions, hasTabs } = props;\n const { classNames } = useStyles('Header');\n let navigate = useNavigate();\n\n // Refs for collision detection\n const toolbarWrapperRef = useRef<HTMLDivElement>(null);\n const toolbarContentRef = useRef<HTMLDivElement>(null);\n const toolbarControlsRef = useRef<HTMLDivElement>(null);\n\n const titleContent = (\n <>\n <div className={classNames.toolbarIcon}>{icon || <RiShapesLine />}</div>\n <Text variant=\"body-medium\">{title || 'Your plugin'}</Text>\n </>\n );\n\n return (\n <RouterProvider navigate={navigate} useHref={useHref}>\n <div className={classNames.toolbar} data-has-tabs={hasTabs}>\n <div className={classNames.toolbarWrapper} ref={toolbarWrapperRef}>\n <div className={classNames.toolbarContent} ref={toolbarContentRef}>\n <Text as=\"h1\" variant=\"body-medium\">\n {titleLink ? (\n <Link className={classNames.toolbarName} href={titleLink}>\n {titleContent}\n </Link>\n ) : (\n <div className={classNames.toolbarName}>{titleContent}</div>\n )}\n </Text>\n </div>\n <div className={classNames.toolbarControls} ref={toolbarControlsRef}>\n {customActions}\n {menuItems && (\n <Menu.Root>\n <Menu.Trigger\n render={props => (\n <ButtonIcon\n size=\"small\"\n icon={<RiMore2Line />}\n variant=\"tertiary\"\n {...props}\n />\n )}\n />\n <Menu.Portal>\n <Menu.Positioner sideOffset={4} align=\"end\">\n <Menu.Popup>\n {menuItems.map(option => (\n <Menu.Item\n key={option.value}\n onClick={() => option.onClick?.()}\n >\n {option.label}\n </Menu.Item>\n ))}\n </Menu.Popup>\n </Menu.Positioner>\n </Menu.Portal>\n </Menu.Root>\n )}\n </div>\n </div>\n </div>\n </RouterProvider>\n );\n};\n"],"names":["props"],"mappings":"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"}
1
+ {"version":3,"file":"HeaderToolbar.esm.js","sources":["../../../src/components/Header/HeaderToolbar.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 { Link, RouterProvider } from 'react-aria-components';\nimport { useStyles } from '../../hooks/useStyles';\nimport { useRef } from 'react';\nimport { RiShapesLine } from '@remixicon/react';\nimport type { HeaderToolbarProps } from './types';\nimport { Text } from '../Text';\nimport { useNavigate, useHref } from 'react-router-dom';\n\n/**\n * A component that renders a toolbar.\n *\n * @internal\n */\nexport const HeaderToolbar = (props: HeaderToolbarProps) => {\n const { icon, title, titleLink, customActions, hasTabs } = props;\n const { classNames } = useStyles('Header');\n let navigate = useNavigate();\n\n // Refs for collision detection\n const toolbarWrapperRef = useRef<HTMLDivElement>(null);\n const toolbarContentRef = useRef<HTMLDivElement>(null);\n const toolbarControlsRef = useRef<HTMLDivElement>(null);\n\n const titleContent = (\n <>\n <div className={classNames.toolbarIcon}>{icon || <RiShapesLine />}</div>\n <Text variant=\"body-medium\">{title || 'Your plugin'}</Text>\n </>\n );\n\n return (\n <RouterProvider navigate={navigate} useHref={useHref}>\n <div className={classNames.toolbar} data-has-tabs={hasTabs}>\n <div className={classNames.toolbarWrapper} ref={toolbarWrapperRef}>\n <div className={classNames.toolbarContent} ref={toolbarContentRef}>\n <Text as=\"h1\" variant=\"body-medium\">\n {titleLink ? (\n <Link className={classNames.toolbarName} href={titleLink}>\n {titleContent}\n </Link>\n ) : (\n <div className={classNames.toolbarName}>{titleContent}</div>\n )}\n </Text>\n </div>\n <div className={classNames.toolbarControls} ref={toolbarControlsRef}>\n {customActions}\n </div>\n </div>\n </div>\n </RouterProvider>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AA6BO,MAAM,aAAA,GAAgB,CAAC,KAAA,KAA8B;AAC1D,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,aAAA,EAAe,SAAQ,GAAI,KAAA;AAC3D,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,SAAA,CAAU,QAAQ,CAAA;AACzC,EAAA,IAAI,WAAW,WAAA,EAAY;AAG3B,EAAA,MAAM,iBAAA,GAAoB,OAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,iBAAA,GAAoB,OAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,kBAAA,GAAqB,OAAuB,IAAI,CAAA;AAEtD,EAAA,MAAM,+BACJ,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAI,SAAA,EAAW,UAAA,CAAW,aAAc,QAAA,EAAA,IAAA,oBAAQ,GAAA,CAAC,gBAAa,CAAA,EAAG,CAAA;AAAA,oBAClE,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,aAAA,EAAe,mBAAS,aAAA,EAAc;AAAA,GAAA,EACtD,CAAA;AAGF,EAAA,2BACG,cAAA,EAAA,EAAe,QAAA,EAAoB,OAAA,EAClC,QAAA,kBAAA,GAAA,CAAC,SAAI,SAAA,EAAW,UAAA,CAAW,OAAA,EAAS,eAAA,EAAe,SACjD,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAW,UAAA,CAAW,cAAA,EAAgB,KAAK,iBAAA,EAC9C,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,CAAW,cAAA,EAAgB,GAAA,EAAK,iBAAA,EAC9C,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,OAAA,EAAQ,aAAA,EACnB,QAAA,EAAA,SAAA,mBACC,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,UAAA,CAAW,WAAA,EAAa,IAAA,EAAM,SAAA,EAC5C,QAAA,EAAA,YAAA,EACH,CAAA,mBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,CAAW,WAAA,EAAc,QAAA,EAAA,YAAA,EAAa,GAE1D,CAAA,EACF,CAAA;AAAA,wBACC,KAAA,EAAA,EAAI,SAAA,EAAW,WAAW,eAAA,EAAiB,GAAA,EAAK,oBAC9C,QAAA,EAAA,aAAA,EACH;AAAA,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1,15 +1,13 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { Menu } from '../Menu/Menu.esm.js';
3
2
  import { Text } from '../Text/Text.esm.js';
4
- import { ButtonIcon } from '../ButtonIcon/ButtonIcon.esm.js';
5
- import { RiArrowRightSLine, RiMore2Line } from '@remixicon/react';
3
+ import { RiArrowRightSLine } from '@remixicon/react';
6
4
  import { Tabs, TabList, Tab } from '../Tabs/Tabs.esm.js';
7
5
  import { useStyles } from '../../hooks/useStyles.esm.js';
8
6
  import { Container } from '../Container/Container.esm.js';
9
7
  import { Link } from '../Link/Link.esm.js';
10
8
 
11
9
  const HeaderPage = (props) => {
12
- const { title, menuItems, tabs, customActions, breadcrumbs } = props;
10
+ const { title, tabs, customActions, breadcrumbs } = props;
13
11
  const { classNames } = useStyles("HeaderPage");
14
12
  return /* @__PURE__ */ jsxs(Container, { className: classNames.root, children: [
15
13
  /* @__PURE__ */ jsxs("div", { className: classNames.content, children: [
@@ -31,33 +29,7 @@ const HeaderPage = (props) => {
31
29
  ] }, breadcrumb.label)),
32
30
  /* @__PURE__ */ jsx(Text, { variant: "title-small", weight: "bold", as: "h2", children: title })
33
31
  ] }),
34
- /* @__PURE__ */ jsxs("div", { className: classNames.controls, children: [
35
- customActions,
36
- menuItems && /* @__PURE__ */ jsxs(Menu.Root, { children: [
37
- /* @__PURE__ */ jsx(
38
- Menu.Trigger,
39
- {
40
- render: (props2) => /* @__PURE__ */ jsx(
41
- ButtonIcon,
42
- {
43
- ...props2,
44
- size: "small",
45
- icon: /* @__PURE__ */ jsx(RiMore2Line, {}),
46
- variant: "tertiary"
47
- }
48
- )
49
- }
50
- ),
51
- /* @__PURE__ */ jsx(Menu.Portal, { children: /* @__PURE__ */ jsx(Menu.Positioner, { sideOffset: 4, align: "end", children: /* @__PURE__ */ jsx(Menu.Popup, { children: menuItems.map((menuItem) => /* @__PURE__ */ jsx(
52
- Menu.Item,
53
- {
54
- onClick: () => menuItem.onClick?.(),
55
- children: menuItem.label
56
- },
57
- menuItem.value
58
- )) }) }) })
59
- ] })
60
- ] })
32
+ /* @__PURE__ */ jsx("div", { className: classNames.controls, children: customActions })
61
33
  ] }),
62
34
  tabs && /* @__PURE__ */ jsx("div", { className: classNames.tabsWrapper, children: /* @__PURE__ */ jsx(Tabs, { children: /* @__PURE__ */ jsx(TabList, { children: tabs.map((tab) => /* @__PURE__ */ jsx(
63
35
  Tab,
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderPage.esm.js","sources":["../../../src/components/HeaderPage/HeaderPage.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 { HeaderPageProps } from './types';\nimport { Menu } from '../Menu';\nimport { Text } from '../Text';\nimport { ButtonIcon } from '../ButtonIcon';\nimport { RiArrowRightSLine, RiMore2Line } from '@remixicon/react';\nimport { Tabs, TabList, Tab } from '../Tabs';\nimport { useStyles } from '../../hooks/useStyles';\nimport { Container } from '../Container';\nimport { Link } from '../Link';\nimport { Fragment } from 'react/jsx-runtime';\n\n/**\n * A component that renders a header page.\n *\n * @public\n */\nexport const HeaderPage = (props: HeaderPageProps) => {\n const { title, menuItems, tabs, customActions, breadcrumbs } = props;\n const { classNames } = useStyles('HeaderPage');\n\n return (\n <Container className={classNames.root}>\n <div className={classNames.content}>\n <div className={classNames.breadcrumbs}>\n {breadcrumbs &&\n breadcrumbs.map(breadcrumb => (\n <Fragment key={breadcrumb.label}>\n <Link\n href={breadcrumb.href}\n variant=\"title-small\"\n weight=\"bold\"\n color=\"secondary\"\n truncate\n style={{ maxWidth: '240px' }}\n >\n {breadcrumb.label}\n </Link>\n <RiArrowRightSLine size={16} color=\"var(--bui-fg-secondary)\" />\n </Fragment>\n ))}\n <Text variant=\"title-small\" weight=\"bold\" as=\"h2\">\n {title}\n </Text>\n </div>\n <div className={classNames.controls}>\n {customActions}\n {menuItems && (\n <Menu.Root>\n <Menu.Trigger\n render={props => (\n <ButtonIcon\n {...props}\n size=\"small\"\n icon={<RiMore2Line />}\n variant=\"tertiary\"\n />\n )}\n />\n <Menu.Portal>\n <Menu.Positioner sideOffset={4} align=\"end\">\n <Menu.Popup>\n {menuItems.map(menuItem => (\n <Menu.Item\n key={menuItem.value}\n onClick={() => menuItem.onClick?.()}\n >\n {menuItem.label}\n </Menu.Item>\n ))}\n </Menu.Popup>\n </Menu.Positioner>\n </Menu.Portal>\n </Menu.Root>\n )}\n </div>\n </div>\n {tabs && (\n <div className={classNames.tabsWrapper}>\n <Tabs>\n <TabList>\n {tabs.map(tab => (\n <Tab\n key={tab.id}\n id={tab.id}\n href={tab.href}\n matchStrategy={tab.matchStrategy}\n >\n {tab.label}\n </Tab>\n ))}\n </TabList>\n </Tabs>\n </div>\n )}\n </Container>\n );\n};\n"],"names":["props"],"mappings":"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"}
1
+ {"version":3,"file":"HeaderPage.esm.js","sources":["../../../src/components/HeaderPage/HeaderPage.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 { HeaderPageProps } from './types';\nimport { Text } from '../Text';\nimport { RiArrowRightSLine } from '@remixicon/react';\nimport { Tabs, TabList, Tab } from '../Tabs';\nimport { useStyles } from '../../hooks/useStyles';\nimport { Container } from '../Container';\nimport { Link } from '../Link';\nimport { Fragment } from 'react/jsx-runtime';\n\n/**\n * A component that renders a header page.\n *\n * @public\n */\nexport const HeaderPage = (props: HeaderPageProps) => {\n const { title, tabs, customActions, breadcrumbs } = props;\n const { classNames } = useStyles('HeaderPage');\n\n return (\n <Container className={classNames.root}>\n <div className={classNames.content}>\n <div className={classNames.breadcrumbs}>\n {breadcrumbs &&\n breadcrumbs.map(breadcrumb => (\n <Fragment key={breadcrumb.label}>\n <Link\n href={breadcrumb.href}\n variant=\"title-small\"\n weight=\"bold\"\n color=\"secondary\"\n truncate\n style={{ maxWidth: '240px' }}\n >\n {breadcrumb.label}\n </Link>\n <RiArrowRightSLine size={16} color=\"var(--bui-fg-secondary)\" />\n </Fragment>\n ))}\n <Text variant=\"title-small\" weight=\"bold\" as=\"h2\">\n {title}\n </Text>\n </div>\n <div className={classNames.controls}>{customActions}</div>\n </div>\n {tabs && (\n <div className={classNames.tabsWrapper}>\n <Tabs>\n <TabList>\n {tabs.map(tab => (\n <Tab\n key={tab.id}\n id={tab.id}\n href={tab.href}\n matchStrategy={tab.matchStrategy}\n >\n {tab.label}\n </Tab>\n ))}\n </TabList>\n </Tabs>\n </div>\n )}\n </Container>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AA8BO,MAAM,UAAA,GAAa,CAAC,KAAA,KAA2B;AACpD,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,aAAA,EAAe,aAAY,GAAI,KAAA;AACpD,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,SAAA,CAAU,YAAY,CAAA;AAE7C,EAAA,uBACE,IAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAW,UAAA,CAAW,IAAA,EAC/B,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,CAAW,OAAA,EACzB,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,CAAW,WAAA,EACxB,QAAA,EAAA;AAAA,QAAA,WAAA,IACC,WAAA,CAAY,GAAA,CAAI,CAAA,UAAA,qBACd,IAAA,CAAC,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,MAAM,UAAA,CAAW,IAAA;AAAA,cACjB,OAAA,EAAQ,aAAA;AAAA,cACR,MAAA,EAAO,MAAA;AAAA,cACP,KAAA,EAAM,WAAA;AAAA,cACN,QAAA,EAAQ,IAAA;AAAA,cACR,KAAA,EAAO,EAAE,QAAA,EAAU,OAAA,EAAQ;AAAA,cAE1B,QAAA,EAAA,UAAA,CAAW;AAAA;AAAA,WACd;AAAA,0BACA,GAAA,CAAC,iBAAA,EAAA,EAAkB,IAAA,EAAM,EAAA,EAAI,OAAM,yBAAA,EAA0B;AAAA,SAAA,EAAA,EAXhD,UAAA,CAAW,KAY1B,CACD,CAAA;AAAA,wBACH,GAAA,CAAC,QAAK,OAAA,EAAQ,aAAA,EAAc,QAAO,MAAA,EAAO,EAAA,EAAG,MAC1C,QAAA,EAAA,KAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,CAAW,UAAW,QAAA,EAAA,aAAA,EAAc;AAAA,KAAA,EACtD,CAAA;AAAA,IACC,IAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,CAAW,WAAA,EACzB,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,OAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,qBACR,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QAEC,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,eAAe,GAAA,CAAI,aAAA;AAAA,QAElB,QAAA,EAAA,GAAA,CAAI;AAAA,OAAA;AAAA,MALA,GAAA,CAAI;AAAA,KAOZ,CAAA,EACH,CAAA,EACF,CAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;;"}