@backstage/ui 0.6.1 → 0.7.0-next.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 (32) hide show
  1. package/CHANGELOG.md +7 -2
  2. package/css/styles.css +92 -138
  3. package/dist/components/Checkbox/Checkbox.esm.js +2 -2
  4. package/dist/components/DataTable/Pagination/DataTablePagination.esm.js +1 -1
  5. package/dist/components/DataTable/Pagination/DataTablePagination.esm.js.map +1 -1
  6. package/dist/components/Header/Header.esm.js +21 -2
  7. package/dist/components/Header/Header.esm.js.map +1 -1
  8. package/dist/components/Header/HeaderToolbar.esm.js +20 -9
  9. package/dist/components/Header/HeaderToolbar.esm.js.map +1 -1
  10. package/dist/components/HeaderPage/HeaderPage.esm.js +12 -3
  11. package/dist/components/HeaderPage/HeaderPage.esm.js.map +1 -1
  12. package/dist/components/Link/Link.esm.js +9 -5
  13. package/dist/components/Link/Link.esm.js.map +1 -1
  14. package/dist/components/Menu/Combobox.esm.js +2 -2
  15. package/dist/components/Table/TableCellLink/TableCellLink.esm.js +1 -1
  16. package/dist/components/Table/TableCellLink/TableCellLink.esm.js.map +1 -1
  17. package/dist/components/Table/TableCellProfile/TableCellProfile.esm.js +1 -1
  18. package/dist/components/Table/TableCellProfile/TableCellProfile.esm.js.map +1 -1
  19. package/dist/components/Table/TableCellText/TableCellText.esm.js +2 -2
  20. package/dist/components/Table/TableCellText/TableCellText.esm.js.map +1 -1
  21. package/dist/components/Tabs/Tabs.esm.js +15 -3
  22. package/dist/components/Tabs/Tabs.esm.js.map +1 -1
  23. package/dist/components/Text/Text.esm.js +3 -2
  24. package/dist/components/Text/Text.esm.js.map +1 -1
  25. package/dist/components/Tooltip/Tooltip.esm.js +5 -2
  26. package/dist/components/Tooltip/Tooltip.esm.js.map +1 -1
  27. package/dist/index.d.ts +106 -94
  28. package/dist/index.esm.js +1 -2
  29. package/dist/index.esm.js.map +1 -1
  30. package/package.json +2 -2
  31. package/dist/components/Heading/Heading.esm.js +0 -37
  32. package/dist/components/Heading/Heading.esm.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,10 +1,15 @@
1
1
  # @backstage/ui
2
2
 
3
- ## 0.6.1
3
+ ## 0.7.0-next.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 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.
4
8
 
5
9
  ### Patch Changes
6
10
 
7
- - b9288aa: Fix missing `dist` folder.
11
+ - e7ff178: Update styling of Tooltip element
12
+ - e0e886f: Adds onTabSelectionChange to ui header component.
8
13
 
9
14
  ## 0.6.0
10
15
 
package/css/styles.css CHANGED
@@ -9191,8 +9191,8 @@
9191
9191
  --bui-gray-6: #7b7b7b;
9192
9192
  --bui-gray-7: #9e9e9e;
9193
9193
  --bui-gray-8: #b4b4b4;
9194
- --bui-bg: var(--bui-black);
9195
- --bui-bg-surface-1: var(--bui-gray-1);
9194
+ --bui-bg: #333;
9195
+ --bui-bg-surface-1: #424242;
9196
9196
  --bui-bg-surface-2: var(--bui-gray-2);
9197
9197
  --bui-bg-solid: #9cc9ff;
9198
9198
  --bui-bg-solid-hover: #83b9fd;
@@ -9217,7 +9217,7 @@
9217
9217
  --bui-fg-danger: #e22b2b;
9218
9218
  --bui-fg-warning: #e36d05;
9219
9219
  --bui-fg-success: #1db954;
9220
- --bui-border: #fff3;
9220
+ --bui-border: #ffffff1f;
9221
9221
  --bui-border-hover: #fff6;
9222
9222
  --bui-border-pressed: #ffffff80;
9223
9223
  --bui-border-disabled: #fff3;
@@ -9732,58 +9732,6 @@
9732
9732
  display: flex;
9733
9733
  }
9734
9734
 
9735
- .bui-Heading {
9736
- font-family: var(--bui-font-regular);
9737
- color: var(--bui-fg-primary);
9738
- margin: 0;
9739
- padding: 0;
9740
- line-height: 100%;
9741
- }
9742
-
9743
- .bui-Heading[data-variant="display"] {
9744
- font-size: var(--bui-font-size-10);
9745
- font-weight: var(--bui-font-weight-bold);
9746
- }
9747
-
9748
- .bui-Heading[data-variant="title1"] {
9749
- font-size: var(--bui-font-size-9);
9750
- font-weight: var(--bui-font-weight-bold);
9751
- }
9752
-
9753
- .bui-Heading[data-variant="title2"] {
9754
- font-size: var(--bui-font-size-8);
9755
- font-weight: var(--bui-font-weight-bold);
9756
- }
9757
-
9758
- .bui-Heading[data-variant="title3"] {
9759
- font-size: var(--bui-font-size-7);
9760
- font-weight: var(--bui-font-weight-bold);
9761
- }
9762
-
9763
- .bui-Heading[data-variant="title4"] {
9764
- font-size: var(--bui-font-size-6);
9765
- font-weight: var(--bui-font-weight-bold);
9766
- }
9767
-
9768
- .bui-Heading[data-variant="title5"] {
9769
- font-size: var(--bui-font-size-5);
9770
- font-weight: var(--bui-font-weight-bold);
9771
- }
9772
-
9773
- .bui-Heading[data-color="primary"] {
9774
- color: var(--bui-fg-primary);
9775
- }
9776
-
9777
- .bui-Heading[data-color="secondary"] {
9778
- color: var(--bui-fg-secondary);
9779
- }
9780
-
9781
- .bui-Heading[data-truncate] {
9782
- text-overflow: ellipsis;
9783
- white-space: nowrap;
9784
- overflow: hidden;
9785
- }
9786
-
9787
9735
  .bui-Icon {
9788
9736
  width: 1rem;
9789
9737
  height: 1rem;
@@ -9795,72 +9743,17 @@
9795
9743
  margin: 0;
9796
9744
  padding: 0;
9797
9745
  text-decoration-line: none;
9746
+ display: inline-block;
9798
9747
 
9799
9748
  &:hover {
9800
9749
  text-underline-offset: calc(.025em + 2px);
9801
9750
  text-decoration-line: underline;
9802
9751
  text-decoration-style: solid;
9803
9752
  text-decoration-thickness: min(2px, max(1px, .05em));
9804
- text-decoration-color: color-mix(in srgb, var(--bui-fg-link-hover) 30%, transparent);
9753
+ text-decoration-color: color-mix(in srgb, currentColor 30%, transparent);
9805
9754
  }
9806
9755
  }
9807
9756
 
9808
- .bui-Link[data-variant="title-large"] {
9809
- font-size: var(--bui-font-size-8);
9810
- line-height: 140%;
9811
- }
9812
-
9813
- .bui-Link[data-variant="title-medium"] {
9814
- font-size: var(--bui-font-size-7);
9815
- line-height: 140%;
9816
- }
9817
-
9818
- .bui-Link[data-variant="title-small"] {
9819
- font-size: var(--bui-font-size-6);
9820
- line-height: 140%;
9821
- }
9822
-
9823
- .bui-Link[data-variant="title-x-small"] {
9824
- font-size: var(--bui-font-size-5);
9825
- line-height: 140%;
9826
- }
9827
-
9828
- .bui-Link[data-variant="body-large"] {
9829
- font-size: var(--bui-font-size-4);
9830
- line-height: 140%;
9831
- }
9832
-
9833
- .bui-Link[data-variant="body-medium"] {
9834
- font-size: var(--bui-font-size-3);
9835
- line-height: 140%;
9836
- }
9837
-
9838
- .bui-Link[data-variant="body-small"] {
9839
- font-size: var(--bui-font-size-2);
9840
- line-height: 140%;
9841
- }
9842
-
9843
- .bui-Link[data-variant="body-x-small"] {
9844
- font-size: var(--bui-font-size-1);
9845
- line-height: 140%;
9846
- }
9847
-
9848
- .bui-Link[data-weight="regular"] {
9849
- font-weight: var(--bui-font-weight-regular);
9850
- }
9851
-
9852
- .bui-Link[data-weight="bold"] {
9853
- font-weight: var(--bui-font-weight-bold);
9854
- }
9855
-
9856
- .bui-Link[data-color="primary"] {
9857
- color: var(--bui-fg-primary);
9858
- }
9859
-
9860
- .bui-Link[data-color="secondary"] {
9861
- color: var(--bui-fg-secondary);
9862
- }
9863
-
9864
9757
  .bui-MenuPositioner {
9865
9758
  z-index: 100;
9866
9759
  outline: 0;
@@ -10303,22 +10196,42 @@
10303
10196
  padding: 0;
10304
10197
  }
10305
10198
 
10306
- .bui-Text[data-variant="body"] {
10307
- font-size: var(--bui-font-size-3);
10199
+ .bui-Text[data-variant="title-large"] {
10200
+ font-size: var(--bui-font-size-8);
10201
+ line-height: 140%;
10202
+ }
10203
+
10204
+ .bui-Text[data-variant="title-medium"] {
10205
+ font-size: var(--bui-font-size-7);
10206
+ line-height: 140%;
10207
+ }
10208
+
10209
+ .bui-Text[data-variant="title-small"] {
10210
+ font-size: var(--bui-font-size-6);
10211
+ line-height: 140%;
10212
+ }
10213
+
10214
+ .bui-Text[data-variant="title-x-small"] {
10215
+ font-size: var(--bui-font-size-5);
10308
10216
  line-height: 140%;
10309
10217
  }
10310
10218
 
10311
- .bui-Text[data-variant="subtitle"] {
10219
+ .bui-Text[data-variant="body-large"] {
10312
10220
  font-size: var(--bui-font-size-4);
10313
10221
  line-height: 140%;
10314
10222
  }
10315
10223
 
10316
- .bui-Text[data-variant="caption"] {
10224
+ .bui-Text[data-variant="body-medium"] {
10225
+ font-size: var(--bui-font-size-3);
10226
+ line-height: 140%;
10227
+ }
10228
+
10229
+ .bui-Text[data-variant="body-small"] {
10317
10230
  font-size: var(--bui-font-size-2);
10318
10231
  line-height: 140%;
10319
10232
  }
10320
10233
 
10321
- .bui-Text[data-variant="label"] {
10234
+ .bui-Text[data-variant="body-x-small"] {
10322
10235
  font-size: var(--bui-font-size-1);
10323
10236
  line-height: 140%;
10324
10237
  }
@@ -10357,6 +10270,10 @@
10357
10270
  overflow: hidden;
10358
10271
  }
10359
10272
 
10273
+ .bui-Text[data-as="span"], .bui-Text[data-as="label"], .bui-Text[data-as="strong"], .bui-Text[data-as="em"], .bui-Text[data-as="small"] {
10274
+ display: inline-block;
10275
+ }
10276
+
10360
10277
  .bui-TextField {
10361
10278
  font-family: var(--bui-font-regular);
10362
10279
  flex-direction: column;
@@ -10504,18 +10421,20 @@
10504
10421
  }
10505
10422
 
10506
10423
  .bui-Tooltip {
10507
- background: var(--bui-bg-surface-2);
10424
+ background: var(--bui-bg-surface-1);
10425
+ border: 1px solid var(--bui-gray-3);
10508
10426
  forced-color-adjust: none;
10509
10427
  padding: var(--bui-space-2) var(--bui-space-3);
10510
10428
  max-width: 240px;
10511
10429
  font-size: var(--bui-font-size-3);
10512
10430
  font-family: var(--bui-font-regular);
10513
10431
  color: var(--bui-fg-primary);
10432
+ --tooltip-offset: var(--bui-space-3);
10514
10433
  border-radius: 4px;
10515
10434
  outline: none;
10516
10435
  transition: transform .2s, opacity .2s;
10517
10436
  transform: translate3d(0, 0, 0);
10518
- box-shadow: 0 8px 20px #0000001a;
10437
+ box-shadow: 0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;
10519
10438
 
10520
10439
  &[data-entering], &[data-exiting] {
10521
10440
  transform: var(--origin);
@@ -10523,41 +10442,76 @@
10523
10442
  }
10524
10443
 
10525
10444
  &[data-placement="top"] {
10526
- margin-bottom: var(--bui-space-2);
10445
+ margin-bottom: var(--tooltip-offset);
10527
10446
  --origin: translateY(4px);
10528
10447
  }
10529
10448
 
10449
+ &[data-placement="right"] {
10450
+ margin-left: var(--tooltip-offset);
10451
+ --origin: translateX(-4px);
10452
+ }
10453
+
10530
10454
  &[data-placement="bottom"] {
10531
- margin-top: var(--bui-space-2);
10455
+ margin-top: var(--tooltip-offset);
10532
10456
  --origin: translateY(-4px);
10457
+ }
10533
10458
 
10534
- & .bui-TooltipArrow svg {
10535
- transform: rotate(180deg);
10536
- }
10459
+ &[data-placement="left"] {
10460
+ margin-right: var(--tooltip-offset);
10461
+ --origin: translateX(4px);
10537
10462
  }
10463
+ }
10538
10464
 
10539
- &[data-placement="right"] {
10540
- margin-left: var(--bui-space-2);
10541
- --origin: translateX(-4px);
10465
+ .bui-TooltipArrow {
10466
+ & svg {
10467
+ --tooltip-arrow-overlap: -2px;
10468
+ display: block;
10469
+
10470
+ & path:first-child {
10471
+ fill: var(--bui-bg-surface-1);
10472
+ }
10542
10473
 
10543
- & .bui-TooltipArrow svg {
10544
- transform: rotate(90deg);
10474
+ & path:nth-child(2) {
10475
+ fill: var(--bui-gray-3);
10545
10476
  }
10546
10477
  }
10547
10478
 
10548
- &[data-placement="left"] {
10549
- margin-right: var(--bui-space-2);
10550
- --origin: translateX(4px);
10479
+ &[data-placement="top"] svg {
10480
+ margin-top: var(--tooltip-arrow-overlap);
10481
+ }
10551
10482
 
10552
- & .bui-TooltipArrow svg {
10553
- transform: rotate(-90deg);
10554
- }
10483
+ &[data-placement="bottom"] svg {
10484
+ margin-bottom: var(--tooltip-arrow-overlap);
10485
+ transform: rotate(180deg);
10486
+ }
10487
+
10488
+ &[data-placement="right"] svg {
10489
+ margin-right: var(--tooltip-arrow-overlap);
10490
+ transform: rotate(90deg);
10491
+ }
10492
+
10493
+ &[data-placement="left"] svg {
10494
+ margin-left: var(--tooltip-arrow-overlap);
10495
+ transform: rotate(-90deg);
10555
10496
  }
10556
10497
  }
10557
10498
 
10558
- .bui-TooltipArrow svg {
10559
- fill: var(--bui-bg-surface-1);
10560
- display: block;
10499
+ [data-theme="dark"] {
10500
+ & .bui-Tooltip {
10501
+ background: var(--bui-bg-surface-2);
10502
+ box-shadow: none;
10503
+ border: 1px solid var(--bui-gray-4);
10504
+ }
10505
+
10506
+ & .bui-TooltipArrow {
10507
+ & svg path:first-child {
10508
+ fill: var(--bui-bg-surface-2);
10509
+ }
10510
+
10511
+ & svg path:nth-child(2) {
10512
+ fill: var(--bui-gray-4);
10513
+ }
10514
+ }
10561
10515
  }
10562
10516
 
10563
10517
  .bui-ScrollAreaRoot {
@@ -6,8 +6,6 @@ import '../Box/Box.esm.js';
6
6
  import '../Grid/Grid.esm.js';
7
7
  import '../Flex/Flex.esm.js';
8
8
  import '../Container/Container.esm.js';
9
- import '../Text/Text.esm.js';
10
- import '../Heading/Heading.esm.js';
11
9
  import '../Avatar/Avatar.esm.js';
12
10
  import '../Button/Button.esm.js';
13
11
  import '../Card/Card.esm.js';
@@ -19,7 +17,9 @@ import { useStyles } from '../../hooks/useStyles.esm.js';
19
17
  import '@remixicon/react';
20
18
  import '../ButtonIcon/ButtonIcon.esm.js';
21
19
  import '../Menu/Menu.esm.js';
20
+ import '../Text/Text.esm.js';
22
21
  import 'motion/react';
22
+ import 'react-router-dom';
23
23
  import '../Tabs/Tabs.esm.js';
24
24
  import { Icon } from '../Icon/Icon.esm.js';
25
25
  import '../ButtonLink/ButtonLink.esm.js';
@@ -51,7 +51,7 @@ const DataTablePagination = forwardRef(
51
51
  }
52
52
  ) }),
53
53
  /* @__PURE__ */ jsxs("div", { className: "bui-DataTablePagination--right", children: [
54
- /* @__PURE__ */ jsx(Text, { variant: "body", children: `${fromCount} - ${toCount} of ${rowCount}` }),
54
+ /* @__PURE__ */ jsx(Text, { variant: "body-medium", children: `${fromCount} - ${toCount} of ${rowCount}` }),
55
55
  /* @__PURE__ */ jsx(
56
56
  ButtonIcon,
57
57
  {
@@ -1 +1 @@
1
- {"version":3,"file":"DataTablePagination.esm.js","sources":["../../../../src/components/DataTable/Pagination/DataTablePagination.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 { Text } from '../../Text';\nimport { DataTablePaginationProps } from './types';\nimport { ButtonIcon } from '../../ButtonIcon';\nimport clsx from 'clsx';\nimport { Select } from '../../Select';\nimport { useDataTable } from '../Root/DataTableRoot';\nimport { Icon } from '../../Icon';\n\n/** @public */\nconst DataTablePagination = forwardRef(\n (\n props: DataTablePaginationProps,\n ref: React.ForwardedRef<HTMLDivElement>,\n ) => {\n const { className, ...rest } = props;\n const { table } = useDataTable();\n const pageIndex = table?.getState().pagination.pageIndex;\n const pageSize = table?.getState().pagination.pageSize;\n const rowCount = table?.getRowCount();\n const fromCount = (pageIndex ?? 0) * (pageSize ?? 10) + 1;\n const toCount = Math.min(\n ((pageIndex ?? 0) + 1) * (pageSize ?? 10),\n rowCount,\n );\n\n return (\n <div\n ref={ref}\n style={{ minWidth: table?.getTotalSize() }}\n className={clsx('bui-DataTablePagination', className)}\n {...rest}\n >\n <div className=\"bui-DataTablePagination--left\">\n {!table.options.manualPagination && (\n <Select\n name=\"pageSize\"\n size=\"small\"\n placeholder=\"Show 10 results\"\n options={[\n { label: 'Show 5 results', value: '5' },\n { label: 'Show 10 results', value: '10' },\n { label: 'Show 20 results', value: '20' },\n { label: 'Show 30 results', value: '30' },\n { label: 'Show 40 results', value: '40' },\n { label: 'Show 50 results', value: '50' },\n ]}\n selectedKey={pageSize?.toString()}\n onSelectionChange={value => {\n table?.setPageSize(Number(value));\n }}\n className=\"bui-DataTablePagination--select\"\n />\n )}\n </div>\n <div className=\"bui-DataTablePagination--right\">\n <Text variant=\"body\">{`${fromCount} - ${toCount} of ${rowCount}`}</Text>\n <ButtonIcon\n variant=\"secondary\"\n size=\"small\"\n onClick={() => table?.previousPage()}\n isDisabled={!table?.getCanPreviousPage()}\n icon={<Icon name=\"chevron-left\" />}\n />\n <ButtonIcon\n variant=\"secondary\"\n size=\"small\"\n onClick={() => table?.nextPage()}\n isDisabled={!table?.getCanNextPage()}\n icon={<Icon name=\"chevron-right\" />}\n />\n </div>\n </div>\n );\n },\n);\n\nDataTablePagination.displayName = 'DataTablePagination';\n\nexport { DataTablePagination };\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DataTablePagination.esm.js","sources":["../../../../src/components/DataTable/Pagination/DataTablePagination.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 { Text } from '../../Text';\nimport { DataTablePaginationProps } from './types';\nimport { ButtonIcon } from '../../ButtonIcon';\nimport clsx from 'clsx';\nimport { Select } from '../../Select';\nimport { useDataTable } from '../Root/DataTableRoot';\nimport { Icon } from '../../Icon';\n\n/** @public */\nconst DataTablePagination = forwardRef(\n (\n props: DataTablePaginationProps,\n ref: React.ForwardedRef<HTMLDivElement>,\n ) => {\n const { className, ...rest } = props;\n const { table } = useDataTable();\n const pageIndex = table?.getState().pagination.pageIndex;\n const pageSize = table?.getState().pagination.pageSize;\n const rowCount = table?.getRowCount();\n const fromCount = (pageIndex ?? 0) * (pageSize ?? 10) + 1;\n const toCount = Math.min(\n ((pageIndex ?? 0) + 1) * (pageSize ?? 10),\n rowCount,\n );\n\n return (\n <div\n ref={ref}\n style={{ minWidth: table?.getTotalSize() }}\n className={clsx('bui-DataTablePagination', className)}\n {...rest}\n >\n <div className=\"bui-DataTablePagination--left\">\n {!table.options.manualPagination && (\n <Select\n name=\"pageSize\"\n size=\"small\"\n placeholder=\"Show 10 results\"\n options={[\n { label: 'Show 5 results', value: '5' },\n { label: 'Show 10 results', value: '10' },\n { label: 'Show 20 results', value: '20' },\n { label: 'Show 30 results', value: '30' },\n { label: 'Show 40 results', value: '40' },\n { label: 'Show 50 results', value: '50' },\n ]}\n selectedKey={pageSize?.toString()}\n onSelectionChange={value => {\n table?.setPageSize(Number(value));\n }}\n className=\"bui-DataTablePagination--select\"\n />\n )}\n </div>\n <div className=\"bui-DataTablePagination--right\">\n <Text variant=\"body-medium\">{`${fromCount} - ${toCount} of ${rowCount}`}</Text>\n <ButtonIcon\n variant=\"secondary\"\n size=\"small\"\n onClick={() => table?.previousPage()}\n isDisabled={!table?.getCanPreviousPage()}\n icon={<Icon name=\"chevron-left\" />}\n />\n <ButtonIcon\n variant=\"secondary\"\n size=\"small\"\n onClick={() => table?.nextPage()}\n isDisabled={!table?.getCanNextPage()}\n icon={<Icon name=\"chevron-right\" />}\n />\n </div>\n </div>\n );\n },\n);\n\nDataTablePagination.displayName = 'DataTablePagination';\n\nexport { DataTablePagination };\n"],"names":[],"mappings":"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"}
@@ -4,7 +4,16 @@ 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 { tabs, icon, title, menuItems, breadcrumbs, customActions } = props;
7
+ const {
8
+ tabs,
9
+ icon,
10
+ title,
11
+ titleLink,
12
+ menuItems,
13
+ breadcrumbs,
14
+ customActions,
15
+ onTabSelectionChange
16
+ } = props;
8
17
  const { classNames } = useStyles("Header");
9
18
  const hasTabs = tabs && tabs.length > 0;
10
19
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -13,13 +22,23 @@ const Header = (props) => {
13
22
  {
14
23
  icon,
15
24
  title,
25
+ titleLink,
16
26
  menuItems,
17
27
  breadcrumbs,
18
28
  customActions,
19
29
  hasTabs
20
30
  }
21
31
  ),
22
- tabs && /* @__PURE__ */ jsx("div", { className: classNames.tabsWrapper, children: /* @__PURE__ */ jsx(Tabs, { children: /* @__PURE__ */ jsx(TabList, { children: tabs?.map((tab) => /* @__PURE__ */ jsx(Tab, { id: tab.id, href: tab.href, children: tab.label }, tab.id)) }) }) })
32
+ tabs && /* @__PURE__ */ jsx("div", { className: classNames.tabsWrapper, children: /* @__PURE__ */ jsx(Tabs, { onSelectionChange: onTabSelectionChange, children: /* @__PURE__ */ jsx(TabList, { children: tabs?.map((tab) => /* @__PURE__ */ jsx(
33
+ Tab,
34
+ {
35
+ id: tab.id,
36
+ href: tab.href,
37
+ matchStrategy: tab.matchStrategy,
38
+ children: tab.label
39
+ },
40
+ tab.id
41
+ )) }) }) })
23
42
  ] });
24
43
  };
25
44
 
@@ -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 { tabs, icon, title, menuItems, breadcrumbs, customActions } = 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 menuItems={menuItems}\n breadcrumbs={breadcrumbs}\n customActions={customActions}\n hasTabs={hasTabs}\n />\n {tabs && (\n <div className={classNames.tabsWrapper}>\n <Tabs>\n <TabList>\n {tabs?.map(tab => (\n <Tab key={tab.id} id={tab.id} href={tab.href}>\n {tab.label}\n </Tab>\n ))}\n </TabList>\n </Tabs>\n </div>\n )}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;AAiCa,MAAA,MAAA,GAAS,CAAC,KAAuB,KAAA;AAC5C,EAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAM,OAAO,SAAW,EAAA,WAAA,EAAa,eAAkB,GAAA,KAAA;AAErE,EAAA,MAAM,EAAE,UAAA,EAAe,GAAA,SAAA,CAAU,QAAQ,CAAA;AAEzC,EAAM,MAAA,OAAA,GAAU,IAAQ,IAAA,IAAA,CAAK,MAAS,GAAA,CAAA;AAEtC,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,IACC,IACC,oBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,UAAW,CAAA,WAAA,EACzB,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EACC,QAAC,kBAAA,GAAA,CAAA,OAAA,EAAA,EACE,QAAM,EAAA,IAAA,EAAA,GAAA,CAAI,CACT,GAAA,qBAAA,GAAA,CAAC,GAAiB,EAAA,EAAA,EAAA,EAAI,GAAI,CAAA,EAAA,EAAI,IAAM,EAAA,GAAA,CAAI,IACrC,EAAA,QAAA,EAAA,GAAA,CAAI,KADG,EAAA,EAAA,GAAA,CAAI,EAEd,CACD,CACH,EAAA,CAAA,EACF,CACF,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
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 breadcrumbs,\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 breadcrumbs={breadcrumbs}\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":";;;;;AAiCa,MAAA,MAAA,GAAS,CAAC,KAAuB,KAAA;AAC5C,EAAM,MAAA;AAAA,IACJ,IAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACE,GAAA,KAAA;AAEJ,EAAA,MAAM,EAAE,UAAA,EAAe,GAAA,SAAA,CAAU,QAAQ,CAAA;AAEzC,EAAM,MAAA,OAAA,GAAU,IAAQ,IAAA,IAAA,CAAK,MAAS,GAAA,CAAA;AAEtC,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,IACC,IACC,oBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,WAAW,WACzB,EAAA,QAAA,kBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,iBAAA,EAAmB,oBACvB,EAAA,QAAA,kBAAA,GAAA,CAAC,OACE,EAAA,EAAA,QAAA,EAAA,IAAA,EAAM,IAAI,CACT,GAAA,qBAAA,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QAEC,IAAI,GAAI,CAAA,EAAA;AAAA,QACR,MAAM,GAAI,CAAA,IAAA;AAAA,QACV,eAAe,GAAI,CAAA,aAAA;AAAA,QAElB,QAAI,EAAA,GAAA,CAAA;AAAA,OAAA;AAAA,MALA,GAAI,CAAA;AAAA,KAOZ,CACH,EAAA,CAAA,EACF,CACF,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
@@ -1,5 +1,5 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { Link } from 'react-aria-components';
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { RouterProvider, Link } from 'react-aria-components';
3
3
  import { useStyles } from '../../hooks/useStyles.esm.js';
4
4
  import { useRef, useState, useEffect } from 'react';
5
5
  import { RiShapesLine, RiArrowRightSLine, RiMore2Line } from '@remixicon/react';
@@ -7,10 +7,20 @@ import { ButtonIcon } from '../ButtonIcon/ButtonIcon.esm.js';
7
7
  import { Menu } from '../Menu/Menu.esm.js';
8
8
  import { Text } from '../Text/Text.esm.js';
9
9
  import { useScroll, useTransform, motion } from 'motion/react';
10
+ import { useNavigate, useHref } from 'react-router-dom';
10
11
 
11
12
  const HeaderToolbar = (props) => {
12
- const { icon, title, menuItems, breadcrumbs, customActions, hasTabs } = props;
13
+ const {
14
+ icon,
15
+ title,
16
+ titleLink,
17
+ menuItems,
18
+ breadcrumbs,
19
+ customActions,
20
+ hasTabs
21
+ } = props;
13
22
  const { classNames } = useStyles("Header");
23
+ let navigate = useNavigate();
14
24
  const { scrollY } = useScroll();
15
25
  const breadcrumbOpacity = useTransform(scrollY, [80, 120], [0, 1]);
16
26
  const toolbarWrapperRef = useRef(null);
@@ -43,12 +53,13 @@ const HeaderToolbar = (props) => {
43
53
  resizeObserver.disconnect();
44
54
  };
45
55
  }, []);
46
- return /* @__PURE__ */ jsx("div", { className: classNames.toolbar, "data-has-tabs": hasTabs, children: /* @__PURE__ */ jsxs("div", { className: classNames.toolbarWrapper, ref: toolbarWrapperRef, children: [
56
+ const titleContent = /* @__PURE__ */ jsxs(Fragment, { children: [
57
+ /* @__PURE__ */ jsx("div", { className: classNames.toolbarIcon, children: icon || /* @__PURE__ */ jsx(RiShapesLine, {}) }),
58
+ /* @__PURE__ */ jsx(Text, { variant: "body-medium", children: title || "Your plugin" })
59
+ ] });
60
+ 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: [
47
61
  /* @__PURE__ */ jsxs("div", { className: classNames.toolbarContent, ref: toolbarContentRef, children: [
48
- /* @__PURE__ */ jsxs("div", { className: classNames.toolbarName, children: [
49
- /* @__PURE__ */ jsx("div", { className: classNames.toolbarIcon, children: icon || /* @__PURE__ */ jsx(RiShapesLine, {}) }),
50
- /* @__PURE__ */ jsx(Text, { variant: "body", children: title || "Your plugin" })
51
- ] }),
62
+ titleLink ? /* @__PURE__ */ jsx(Link, { className: classNames.toolbarName, href: titleLink, children: titleContent }) : /* @__PURE__ */ jsx("div", { className: classNames.toolbarName, children: titleContent }),
52
63
  breadcrumbs && /* @__PURE__ */ jsxs(
53
64
  motion.div,
54
65
  {
@@ -114,7 +125,7 @@ const HeaderToolbar = (props) => {
114
125
  )) }) }) })
115
126
  ] })
116
127
  ] })
117
- ] }) });
128
+ ] }) }) });
118
129
  };
119
130
 
120
131
  export { HeaderToolbar };
@@ -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 } from 'react-aria-components';\nimport { useStyles } from '../../hooks/useStyles';\nimport { useRef, useState, useEffect } from 'react';\nimport { RiArrowRightSLine, RiMore2Line, RiShapesLine } from '@remixicon/react';\nimport type { HeaderToolbarProps } from './types';\nimport { ButtonIcon } from '../ButtonIcon';\nimport { Menu } from '../Menu';\nimport { Text } from '../Text';\nimport { motion, useScroll, useTransform } from 'motion/react';\n\n/**\n * A component that renders a toolbar.\n *\n * @internal\n */\nexport const HeaderToolbar = (props: HeaderToolbarProps) => {\n const { icon, title, menuItems, breadcrumbs, customActions, hasTabs } = props;\n const { classNames } = useStyles('Header');\n\n const { scrollY } = useScroll();\n const breadcrumbOpacity = useTransform(scrollY, [80, 120], [0, 1]);\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 // State for breadcrumb visibility\n const [showBreadcrumbs, setShowBreadcrumbs] = useState(true);\n\n // Set up resize observer\n useEffect(() => {\n const wrapper = toolbarWrapperRef.current;\n if (!wrapper) return;\n\n const resizeObserver = new ResizeObserver(() => {\n const wrapper = toolbarWrapperRef.current;\n const content = toolbarContentRef.current;\n const options = toolbarControlsRef.current;\n\n if (!wrapper || !content) return;\n\n // Get dimensions\n const wrapperRect = wrapper.getBoundingClientRect();\n const wrapperWidth = wrapperRect.width;\n const wrapperPadding = 24; // 12px on each side (var(--bui-space-3))\n const availableWidth = wrapperWidth - wrapperPadding;\n\n // Calculate required width for content\n const contentRect = content.getBoundingClientRect();\n const contentWidth = contentRect?.width || 0;\n\n // Calculate options width (if exists)\n const optionsRect = options?.getBoundingClientRect();\n const optionsWidth = optionsRect?.width || 0;\n\n // Check if we need to hide breadcrumbs\n const shouldShowBreadcrumbs =\n contentWidth + optionsWidth + 32 <= availableWidth;\n\n // Only update state if the value actually changed to prevent flickering\n setShowBreadcrumbs(prev =>\n prev !== shouldShowBreadcrumbs ? shouldShowBreadcrumbs : prev,\n );\n });\n\n resizeObserver.observe(wrapper);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n\n return (\n <div className={classNames.toolbar} data-has-tabs={hasTabs}>\n <div className={classNames.toolbarWrapper} ref={toolbarWrapperRef}>\n <div className={classNames.toolbarContent} ref={toolbarContentRef}>\n <div className={classNames.toolbarName}>\n <div className={classNames.toolbarIcon}>\n {icon || <RiShapesLine />}\n </div>\n <Text variant=\"body\">{title || 'Your plugin'}</Text>\n </div>\n {breadcrumbs && (\n <motion.div\n className={classNames.breadcrumbs}\n style={{\n opacity: breadcrumbOpacity,\n visibility: showBreadcrumbs ? 'visible' : 'hidden',\n }}\n >\n <RiArrowRightSLine\n size={16}\n className={classNames.breadcrumbSeparator}\n />\n {breadcrumbs.map((breadcrumb, index) => (\n <div key={breadcrumb.label} className={classNames.breadcrumb}>\n <Link\n href={breadcrumb.href}\n className={classNames.breadcrumbLink}\n data-active={index === breadcrumbs.length - 1}\n >\n {breadcrumb.label}\n </Link>\n {index < breadcrumbs.length - 1 && (\n <RiArrowRightSLine\n size={16}\n className={classNames.breadcrumbSeparator}\n />\n )}\n </div>\n ))}\n </motion.div>\n )}\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 );\n};\n"],"names":["wrapper","props"],"mappings":"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"}
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, useState, useEffect } from 'react';\nimport { RiArrowRightSLine, RiMore2Line, RiShapesLine } from '@remixicon/react';\nimport type { HeaderToolbarProps } from './types';\nimport { ButtonIcon } from '../ButtonIcon';\nimport { Menu } from '../Menu';\nimport { Text } from '../Text';\nimport { motion, useScroll, useTransform } from 'motion/react';\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 {\n icon,\n title,\n titleLink,\n menuItems,\n breadcrumbs,\n customActions,\n hasTabs,\n } = props;\n const { classNames } = useStyles('Header');\n let navigate = useNavigate();\n const { scrollY } = useScroll();\n const breadcrumbOpacity = useTransform(scrollY, [80, 120], [0, 1]);\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 // State for breadcrumb visibility\n const [showBreadcrumbs, setShowBreadcrumbs] = useState(true);\n\n // Set up resize observer\n useEffect(() => {\n const wrapper = toolbarWrapperRef.current;\n if (!wrapper) return;\n\n const resizeObserver = new ResizeObserver(() => {\n const wrapper = toolbarWrapperRef.current;\n const content = toolbarContentRef.current;\n const options = toolbarControlsRef.current;\n\n if (!wrapper || !content) return;\n\n // Get dimensions\n const wrapperRect = wrapper.getBoundingClientRect();\n const wrapperWidth = wrapperRect.width;\n const wrapperPadding = 24; // 12px on each side (var(--bui-space-3))\n const availableWidth = wrapperWidth - wrapperPadding;\n\n // Calculate required width for content\n const contentRect = content.getBoundingClientRect();\n const contentWidth = contentRect?.width || 0;\n\n // Calculate options width (if exists)\n const optionsRect = options?.getBoundingClientRect();\n const optionsWidth = optionsRect?.width || 0;\n\n // Check if we need to hide breadcrumbs\n const shouldShowBreadcrumbs =\n contentWidth + optionsWidth + 32 <= availableWidth;\n\n // Only update state if the value actually changed to prevent flickering\n setShowBreadcrumbs(prev =>\n prev !== shouldShowBreadcrumbs ? shouldShowBreadcrumbs : prev,\n );\n });\n\n resizeObserver.observe(wrapper);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\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 {titleLink ? (\n <Link className={classNames.toolbarName} href={titleLink}>\n {titleContent}\n </Link>\n ) : (\n <div className={classNames.toolbarName}>{titleContent}</div>\n )}\n {breadcrumbs && (\n <motion.div\n className={classNames.breadcrumbs}\n style={{\n opacity: breadcrumbOpacity,\n visibility: showBreadcrumbs ? 'visible' : 'hidden',\n }}\n >\n <RiArrowRightSLine\n size={16}\n className={classNames.breadcrumbSeparator}\n />\n {breadcrumbs.map((breadcrumb, index) => (\n <div key={breadcrumb.label} className={classNames.breadcrumb}>\n <Link\n href={breadcrumb.href}\n className={classNames.breadcrumbLink}\n data-active={index === breadcrumbs.length - 1}\n >\n {breadcrumb.label}\n </Link>\n {index < breadcrumbs.length - 1 && (\n <RiArrowRightSLine\n size={16}\n className={classNames.breadcrumbSeparator}\n />\n )}\n </div>\n ))}\n </motion.div>\n )}\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":["wrapper","props"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { Heading } from '../Heading/Heading.esm.js';
3
2
  import { Menu } from '../Menu/Menu.esm.js';
3
+ import { Text } from '../Text/Text.esm.js';
4
4
  import { ButtonIcon } from '../ButtonIcon/ButtonIcon.esm.js';
5
5
  import { RiMore2Line } from '@remixicon/react';
6
6
  import { Tabs, TabList, Tab } from '../Tabs/Tabs.esm.js';
@@ -11,7 +11,7 @@ const HeaderPage = (props) => {
11
11
  const { classNames } = useStyles("HeaderPage");
12
12
  return /* @__PURE__ */ jsxs("div", { className: classNames.root, children: [
13
13
  /* @__PURE__ */ jsxs("div", { className: classNames.content, children: [
14
- /* @__PURE__ */ jsx(Heading, { variant: "title4", children: title }),
14
+ /* @__PURE__ */ jsx(Text, { variant: "title-small", weight: "bold", children: title }),
15
15
  /* @__PURE__ */ jsxs("div", { className: classNames.controls, children: [
16
16
  customActions,
17
17
  menuItems && /* @__PURE__ */ jsxs(Menu.Root, { children: [
@@ -40,7 +40,16 @@ const HeaderPage = (props) => {
40
40
  ] })
41
41
  ] })
42
42
  ] }),
43
- tabs && /* @__PURE__ */ jsx("div", { className: classNames.tabsWrapper, children: /* @__PURE__ */ jsx(Tabs, { children: /* @__PURE__ */ jsx(TabList, { children: tabs.map((tab) => /* @__PURE__ */ jsx(Tab, { id: tab.id, href: tab.href, children: tab.label }, tab.id)) }) }) })
43
+ tabs && /* @__PURE__ */ jsx("div", { className: classNames.tabsWrapper, children: /* @__PURE__ */ jsx(Tabs, { children: /* @__PURE__ */ jsx(TabList, { children: tabs.map((tab) => /* @__PURE__ */ jsx(
44
+ Tab,
45
+ {
46
+ id: tab.id,
47
+ href: tab.href,
48
+ matchStrategy: tab.matchStrategy,
49
+ children: tab.label
50
+ },
51
+ tab.id
52
+ )) }) }) })
44
53
  ] });
45
54
  };
46
55
 
@@ -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 { Heading } from '../Heading';\nimport { Menu } from '../Menu';\nimport { ButtonIcon } from '../ButtonIcon';\nimport { RiMore2Line } from '@remixicon/react';\nimport { Tabs, TabList, Tab } from '../Tabs';\nimport { useStyles } from '../../hooks/useStyles';\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 } = props;\n const { classNames } = useStyles('HeaderPage');\n\n return (\n <div className={classNames.root}>\n <div className={classNames.content}>\n <Heading variant=\"title4\">{title}</Heading>\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 key={tab.id} id={tab.id} href={tab.href}>\n {tab.label}\n </Tab>\n ))}\n </TabList>\n </Tabs>\n </div>\n )}\n </div>\n );\n};\n"],"names":["props"],"mappings":";;;;;;;;AA6Ba,MAAA,UAAA,GAAa,CAAC,KAA2B,KAAA;AACpD,EAAA,MAAM,EAAE,KAAA,EAAO,SAAW,EAAA,IAAA,EAAM,eAAkB,GAAA,KAAA;AAClD,EAAA,MAAM,EAAE,UAAA,EAAe,GAAA,SAAA,CAAU,YAAY,CAAA;AAE7C,EAAA,uBACG,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,UAAA,CAAW,IACzB,EAAA,QAAA,EAAA;AAAA,oBAAC,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,UAAA,CAAW,OACzB,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,OAAA,EAAA,EAAQ,OAAQ,EAAA,QAAA,EAAU,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,sBAChC,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,UAAA,CAAW,QACxB,EAAA,QAAA,EAAA;AAAA,QAAA,aAAA;AAAA,QACA,SACC,oBAAA,IAAA,CAAC,IAAK,CAAA,IAAA,EAAL,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,IAAK,CAAA,OAAA;AAAA,YAAL;AAAA,cACC,MAAA,EAAQ,CAAAA,MACN,qBAAA,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACE,GAAGA,MAAAA;AAAA,kBACJ,IAAK,EAAA,OAAA;AAAA,kBACL,IAAA,sBAAO,WAAY,EAAA,EAAA,CAAA;AAAA,kBACnB,OAAQ,EAAA;AAAA;AAAA;AACV;AAAA,WAEJ;AAAA,8BACC,IAAK,CAAA,MAAA,EAAL,EACC,QAAC,kBAAA,GAAA,CAAA,IAAA,CAAK,YAAL,EAAgB,UAAA,EAAY,CAAG,EAAA,KAAA,EAAM,OACpC,QAAC,kBAAA,GAAA,CAAA,IAAA,CAAK,OAAL,EACE,QAAA,EAAA,SAAA,CAAU,IAAI,CACb,QAAA,qBAAA,GAAA;AAAA,YAAC,IAAK,CAAA,IAAA;AAAA,YAAL;AAAA,cAEC,OAAA,EAAS,MAAM,QAAA,CAAS,OAAU,IAAA;AAAA,cAEjC,QAAS,EAAA,QAAA,CAAA;AAAA,aAAA;AAAA,YAHL,QAAS,CAAA;AAAA,WAKjB,CACH,EAAA,CAAA,EACF,CACF,EAAA;AAAA,SACF,EAAA;AAAA,OAEJ,EAAA;AAAA,KACF,EAAA,CAAA;AAAA,IACC,IACC,oBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,UAAW,CAAA,WAAA,EACzB,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EACC,QAAC,kBAAA,GAAA,CAAA,OAAA,EAAA,EACE,QAAK,EAAA,IAAA,CAAA,GAAA,CAAI,CACR,GAAA,qBAAA,GAAA,CAAC,GAAiB,EAAA,EAAA,EAAA,EAAI,GAAI,CAAA,EAAA,EAAI,IAAM,EAAA,GAAA,CAAI,IACrC,EAAA,QAAA,EAAA,GAAA,CAAI,KADG,EAAA,EAAA,GAAA,CAAI,EAEd,CACD,CACH,EAAA,CAAA,EACF,CACF,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
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 { RiMore2Line } from '@remixicon/react';\nimport { Tabs, TabList, Tab } from '../Tabs';\nimport { useStyles } from '../../hooks/useStyles';\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 } = props;\n const { classNames } = useStyles('HeaderPage');\n\n return (\n <div className={classNames.root}>\n <div className={classNames.content}>\n <Text variant=\"title-small\" weight=\"bold\">\n {title}\n </Text>\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 </div>\n );\n};\n"],"names":["props"],"mappings":";;;;;;;;AA6Ba,MAAA,UAAA,GAAa,CAAC,KAA2B,KAAA;AACpD,EAAA,MAAM,EAAE,KAAA,EAAO,SAAW,EAAA,IAAA,EAAM,eAAkB,GAAA,KAAA;AAClD,EAAA,MAAM,EAAE,UAAA,EAAe,GAAA,SAAA,CAAU,YAAY,CAAA;AAE7C,EAAA,uBACG,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,UAAA,CAAW,IACzB,EAAA,QAAA,EAAA;AAAA,oBAAC,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,UAAA,CAAW,OACzB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,aAAc,EAAA,MAAA,EAAO,QAChC,QACH,EAAA,KAAA,EAAA,CAAA;AAAA,sBACC,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,UAAA,CAAW,QACxB,EAAA,QAAA,EAAA;AAAA,QAAA,aAAA;AAAA,QACA,SACC,oBAAA,IAAA,CAAC,IAAK,CAAA,IAAA,EAAL,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,IAAK,CAAA,OAAA;AAAA,YAAL;AAAA,cACC,MAAA,EAAQ,CAAAA,MACN,qBAAA,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACE,GAAGA,MAAAA;AAAA,kBACJ,IAAK,EAAA,OAAA;AAAA,kBACL,IAAA,sBAAO,WAAY,EAAA,EAAA,CAAA;AAAA,kBACnB,OAAQ,EAAA;AAAA;AAAA;AACV;AAAA,WAEJ;AAAA,8BACC,IAAK,CAAA,MAAA,EAAL,EACC,QAAC,kBAAA,GAAA,CAAA,IAAA,CAAK,YAAL,EAAgB,UAAA,EAAY,CAAG,EAAA,KAAA,EAAM,OACpC,QAAC,kBAAA,GAAA,CAAA,IAAA,CAAK,OAAL,EACE,QAAA,EAAA,SAAA,CAAU,IAAI,CACb,QAAA,qBAAA,GAAA;AAAA,YAAC,IAAK,CAAA,IAAA;AAAA,YAAL;AAAA,cAEC,OAAA,EAAS,MAAM,QAAA,CAAS,OAAU,IAAA;AAAA,cAEjC,QAAS,EAAA,QAAA,CAAA;AAAA,aAAA;AAAA,YAHL,QAAS,CAAA;AAAA,WAKjB,CACH,EAAA,CAAA,EACF,CACF,EAAA;AAAA,SACF,EAAA;AAAA,OAEJ,EAAA;AAAA,KACF,EAAA,CAAA;AAAA,IACC,IACC,oBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,UAAW,CAAA,WAAA,EACzB,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EACC,QAAC,kBAAA,GAAA,CAAA,OAAA,EAAA,EACE,QAAK,EAAA,IAAA,CAAA,GAAA,CAAI,CACR,GAAA,qBAAA,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QAEC,IAAI,GAAI,CAAA,EAAA;AAAA,QACR,MAAM,GAAI,CAAA,IAAA;AAAA,QACV,eAAe,GAAI,CAAA,aAAA;AAAA,QAElB,QAAI,EAAA,GAAA,CAAA;AAAA,OAAA;AAAA,MALA,GAAI,CAAA;AAAA,KAOZ,CACH,EAAA,CAAA,EACF,CACF,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}