@backstage/ui 0.7.0-next.2 → 0.7.0-next.3

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 (66) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/css/styles.css +187 -73
  3. package/dist/components/Checkbox/Checkbox.esm.js +10 -7
  4. package/dist/components/Checkbox/Checkbox.esm.js.map +1 -1
  5. package/dist/components/Header/Header.esm.js +0 -2
  6. package/dist/components/Header/Header.esm.js.map +1 -1
  7. package/dist/components/Header/HeaderToolbar.esm.js +4 -93
  8. package/dist/components/Header/HeaderToolbar.esm.js.map +1 -1
  9. package/dist/components/HeaderPage/HeaderPage.esm.js +95 -41
  10. package/dist/components/HeaderPage/HeaderPage.esm.js.map +1 -1
  11. package/dist/components/Link/Link.esm.js +1 -13
  12. package/dist/components/Link/Link.esm.js.map +1 -1
  13. package/dist/components/Menu/Combobox.esm.js +9 -6
  14. package/dist/components/Menu/Combobox.esm.js.map +1 -1
  15. package/dist/components/SearchField/SearchField.esm.js +27 -4
  16. package/dist/components/SearchField/SearchField.esm.js.map +1 -1
  17. package/dist/components/Select/Select.esm.js +0 -1
  18. package/dist/components/Select/Select.esm.js.map +1 -1
  19. package/dist/components/Table/components/Cell.esm.js +30 -0
  20. package/dist/components/Table/components/Cell.esm.js.map +1 -0
  21. package/dist/components/Table/components/CellProfile.esm.js +41 -0
  22. package/dist/components/Table/components/CellProfile.esm.js.map +1 -0
  23. package/dist/components/Table/components/Column.esm.js +17 -0
  24. package/dist/components/Table/components/Column.esm.js.map +1 -0
  25. package/dist/components/Table/components/Row.esm.js +38 -0
  26. package/dist/components/Table/components/Row.esm.js.map +1 -0
  27. package/dist/components/Table/components/Table.esm.js +18 -0
  28. package/dist/components/Table/components/Table.esm.js.map +1 -0
  29. package/dist/components/Table/components/TableBody.esm.js +11 -0
  30. package/dist/components/Table/components/TableBody.esm.js.map +1 -0
  31. package/dist/components/Table/components/TableHeader.esm.js +20 -0
  32. package/dist/components/Table/components/TableHeader.esm.js.map +1 -0
  33. package/dist/components/Table/hooks/useTable.esm.js +116 -0
  34. package/dist/components/Table/hooks/useTable.esm.js.map +1 -0
  35. package/dist/components/TablePagination/TablePagination.esm.js +130 -0
  36. package/dist/components/TablePagination/TablePagination.esm.js.map +1 -0
  37. package/dist/index.d.ts +161 -94
  38. package/dist/index.esm.js +9 -2
  39. package/dist/index.esm.js.map +1 -1
  40. package/dist/utils/componentDefinitions.esm.js +16 -5
  41. package/dist/utils/componentDefinitions.esm.js.map +1 -1
  42. package/dist/utils/isExternalLink.esm.js +16 -0
  43. package/dist/utils/isExternalLink.esm.js.map +1 -0
  44. package/package.json +2 -2
  45. package/dist/components/DataTable/DataTable.esm.js +0 -26
  46. package/dist/components/DataTable/DataTable.esm.js.map +0 -1
  47. package/dist/components/DataTable/Pagination/DataTablePagination.esm.js +0 -84
  48. package/dist/components/DataTable/Pagination/DataTablePagination.esm.js.map +0 -1
  49. package/dist/components/DataTable/Root/DataTableRoot.esm.js +0 -24
  50. package/dist/components/DataTable/Root/DataTableRoot.esm.js.map +0 -1
  51. package/dist/components/DataTable/Table/DataTableTable.esm.js +0 -64
  52. package/dist/components/DataTable/Table/DataTableTable.esm.js.map +0 -1
  53. package/dist/components/Select/Select.styles.css.esm.js +0 -7
  54. package/dist/components/Select/Select.styles.css.esm.js.map +0 -1
  55. package/dist/components/Table/Table.esm.js +0 -68
  56. package/dist/components/Table/Table.esm.js.map +0 -1
  57. package/dist/components/Table/TableCell/TableCell.esm.js +0 -13
  58. package/dist/components/Table/TableCell/TableCell.esm.js.map +0 -1
  59. package/dist/components/Table/TableCellLink/TableCellLink.esm.js +0 -28
  60. package/dist/components/Table/TableCellLink/TableCellLink.esm.js.map +0 -1
  61. package/dist/components/Table/TableCellProfile/TableCellProfile.esm.js +0 -40
  62. package/dist/components/Table/TableCellProfile/TableCellProfile.esm.js.map +0 -1
  63. package/dist/components/Table/TableCellText/TableCellText.esm.js +0 -27
  64. package/dist/components/Table/TableCellText/TableCellText.esm.js.map +0 -1
  65. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +0 -29
  66. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @backstage/ui
2
2
 
3
+ ## 0.7.0-next.3
4
+
5
+ ### Minor Changes
6
+
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
+
9
+ ### Patch Changes
10
+
11
+ - 230b410: **Breaking change** Move breadcrumb to fit in the `HeaderPage` instead of the `Header` in Backstage UI.
12
+ - 8bdc491: Remove stylesheet import from Select component.
13
+ - 404b426: Add `startCollapsed` prop on the `SearchField` component in BUI.
14
+
3
15
  ## 0.7.0-next.2
4
16
 
5
17
  ### Patch Changes
package/css/styles.css CHANGED
@@ -9517,36 +9517,6 @@
9517
9517
  }
9518
9518
  }
9519
9519
 
9520
- .bui-DataTableRoot {
9521
- gap: var(--bui-space-3);
9522
- flex-direction: column;
9523
- display: flex;
9524
- }
9525
-
9526
- .bui-DataTablePagination {
9527
- padding-top: var(--bui-space-5);
9528
- justify-content: space-between;
9529
- align-items: center;
9530
- display: flex;
9531
- }
9532
-
9533
- .bui-DataTablePagination--left {
9534
- justify-content: space-between;
9535
- align-items: center;
9536
- display: flex;
9537
- }
9538
-
9539
- .bui-DataTablePagination--right {
9540
- justify-content: space-between;
9541
- align-items: center;
9542
- gap: var(--bui-space-2);
9543
- display: flex;
9544
- }
9545
-
9546
- .bui-DataTablePagination--select {
9547
- min-width: 10.5rem;
9548
- }
9549
-
9550
9520
  .bui-FieldError {
9551
9521
  color: var(--bui-fg-danger);
9552
9522
  font-size: var(--bui-font-size-2);
@@ -9593,10 +9563,7 @@
9593
9563
  }
9594
9564
 
9595
9565
  .bui-HeaderToolbar {
9596
- z-index: 10;
9597
9566
  margin-bottom: var(--bui-space-6);
9598
- position: sticky;
9599
- top: 0;
9600
9567
 
9601
9568
  &:before {
9602
9569
  content: "";
@@ -9667,38 +9634,6 @@
9667
9634
  transform: translateY(-50%);
9668
9635
  }
9669
9636
 
9670
- .bui-HeaderBreadcrumbs {
9671
- align-items: center;
9672
- gap: var(--bui-space-2);
9673
- font-size: var(--bui-font-size-3);
9674
- font-weight: var(--bui-font-weight-regular);
9675
- flex-direction: row;
9676
- display: flex;
9677
- }
9678
-
9679
- .bui-HeaderBreadcrumb {
9680
- align-items: center;
9681
- gap: var(--bui-space-2);
9682
- flex-direction: row;
9683
- display: flex;
9684
- }
9685
-
9686
- .bui-HeaderBreadcrumbLink {
9687
- color: var(--bui-fg-secondary);
9688
- cursor: pointer;
9689
- text-decoration: none;
9690
-
9691
- &[data-active="true"] {
9692
- color: var(--bui-fg-primary);
9693
- }
9694
- }
9695
-
9696
- .bui-HeaderBreadcrumbSeparator {
9697
- width: 16px;
9698
- height: 16px;
9699
- color: var(--bui-fg-secondary);
9700
- }
9701
-
9702
9637
  .bui-HeaderTabsWrapper {
9703
9638
  margin-bottom: var(--bui-space-4);
9704
9639
  padding-inline: var(--bui-space-3);
@@ -9708,7 +9643,6 @@
9708
9643
 
9709
9644
  .bui-HeaderPage {
9710
9645
  gap: var(--bui-space-1);
9711
- padding-inline: var(--bui-space-5);
9712
9646
  margin-top: var(--bui-space-6);
9713
9647
  margin-bottom: var(--bui-space-6);
9714
9648
  flex-direction: column;
@@ -9732,6 +9666,59 @@
9732
9666
  display: flex;
9733
9667
  }
9734
9668
 
9669
+ .bui-HeaderPageSticky {
9670
+ z-index: -1;
9671
+ height: 0;
9672
+ color: var(--bui-fg-primary);
9673
+ position: sticky;
9674
+ top: 0;
9675
+ }
9676
+
9677
+ .bui-HeaderPageStickyWrapper {
9678
+ background-color: var(--bui-bg-surface-1);
9679
+ border-bottom: 1px solid var(--bui-border);
9680
+ opacity: 0;
9681
+ }
9682
+
9683
+ .bui-HeaderPageStickyContent {
9684
+ justify-content: space-between;
9685
+ align-items: center;
9686
+ height: 48px;
9687
+ display: flex;
9688
+ }
9689
+
9690
+ .bui-HeaderPageBreadcrumbs {
9691
+ align-items: center;
9692
+ gap: var(--bui-space-2);
9693
+ font-size: var(--bui-font-size-3);
9694
+ font-weight: var(--bui-font-weight-regular);
9695
+ flex-direction: row;
9696
+ display: flex;
9697
+ }
9698
+
9699
+ .bui-HeaderPageBreadcrumb {
9700
+ align-items: center;
9701
+ gap: var(--bui-space-2);
9702
+ flex-direction: row;
9703
+ display: flex;
9704
+ }
9705
+
9706
+ .bui-HeaderPageBreadcrumbLink {
9707
+ color: var(--bui-fg-secondary);
9708
+ cursor: pointer;
9709
+ text-decoration: none;
9710
+
9711
+ &[data-active="true"] {
9712
+ color: var(--bui-fg-primary);
9713
+ }
9714
+ }
9715
+
9716
+ .bui-HeaderPageBreadcrumbSeparator {
9717
+ width: 16px;
9718
+ height: 16px;
9719
+ color: var(--bui-fg-secondary);
9720
+ }
9721
+
9735
9722
  .bui-Icon {
9736
9723
  width: 1rem;
9737
9724
  height: 1rem;
@@ -10034,12 +10021,17 @@
10034
10021
  }
10035
10022
  }
10036
10023
 
10037
- .bui-TableRoot {
10024
+ .bui-Table {
10038
10025
  caption-side: bottom;
10039
10026
  border-collapse: collapse;
10040
10027
  width: 100%;
10041
10028
  }
10042
10029
 
10030
+ .bui-TableHeader {
10031
+ border-bottom: 1px solid var(--bui-border);
10032
+ transition: color .2s ease-in-out;
10033
+ }
10034
+
10043
10035
  .bui-TableHead {
10044
10036
  text-align: left;
10045
10037
  padding: var(--bui-space-3);
@@ -10047,6 +10039,33 @@
10047
10039
  color: var(--bui-fg-primary);
10048
10040
  }
10049
10041
 
10042
+ .bui-TableHeadSortButton {
10043
+ cursor: pointer;
10044
+ user-select: none;
10045
+ align-items: center;
10046
+ gap: var(--bui-space-1);
10047
+ display: inline-flex;
10048
+
10049
+ &:hover svg {
10050
+ opacity: .5;
10051
+ }
10052
+
10053
+ & svg {
10054
+ opacity: 0;
10055
+ transition: opacity .1s ease-in-out, transform .1s ease-in-out;
10056
+ }
10057
+
10058
+ &[data-sort-order="asc"] svg {
10059
+ opacity: 1;
10060
+ transform: rotate(0);
10061
+ }
10062
+
10063
+ &[data-sort-order="desc"] svg {
10064
+ opacity: 1;
10065
+ transform: rotate(180deg);
10066
+ }
10067
+ }
10068
+
10050
10069
  .bui-TableBody {
10051
10070
  color: var(--bui-fg-primary);
10052
10071
  }
@@ -10054,6 +10073,10 @@
10054
10073
  .bui-TableRow {
10055
10074
  border-bottom: 1px solid var(--bui-border);
10056
10075
  transition: color .2s ease-in-out;
10076
+
10077
+ &[data-react-aria-pressable="true"] {
10078
+ cursor: pointer;
10079
+ }
10057
10080
  }
10058
10081
 
10059
10082
  .bui-TableBody .bui-TableRow:hover {
@@ -10063,9 +10086,24 @@
10063
10086
  .bui-TableCell {
10064
10087
  padding: var(--bui-space-3);
10065
10088
  font-size: var(--bui-font-size-3);
10089
+ padding: var(--bui-space-3);
10090
+ font-size: var(--bui-font-size-3);
10066
10091
  }
10067
10092
 
10068
- .bui-TableCellText, .bui-TableCellLink {
10093
+ .bui-TableCellContentWrapper {
10094
+ align-items: center;
10095
+ gap: var(--bui-space-2);
10096
+ flex-direction: row;
10097
+ display: inline-flex;
10098
+ }
10099
+
10100
+ .bui-TableCellIcon, .bui-TableCellIcon svg {
10101
+ color: var(--bui-fg-primary);
10102
+ align-items: center;
10103
+ display: inline-flex;
10104
+ }
10105
+
10106
+ .bui-TableCellContent {
10069
10107
  gap: var(--bui-space-0_5);
10070
10108
  flex-direction: column;
10071
10109
  display: flex;
@@ -10113,6 +10151,30 @@
10113
10151
  display: flex;
10114
10152
  }
10115
10153
 
10154
+ .bui-DataTablePagination {
10155
+ padding-top: var(--bui-space-5);
10156
+ justify-content: space-between;
10157
+ align-items: center;
10158
+ display: flex;
10159
+ }
10160
+
10161
+ .bui-DataTablePagination--left {
10162
+ justify-content: space-between;
10163
+ align-items: center;
10164
+ display: flex;
10165
+ }
10166
+
10167
+ .bui-DataTablePagination--right {
10168
+ justify-content: space-between;
10169
+ align-items: center;
10170
+ gap: var(--bui-space-2);
10171
+ display: flex;
10172
+ }
10173
+
10174
+ .bui-DataTablePagination--select {
10175
+ min-width: 10.5rem;
10176
+ }
10177
+
10116
10178
  .bui-Tabs {
10117
10179
  --active-tab-left: 0px;
10118
10180
  --active-tab-right: 0px;
@@ -10277,6 +10339,7 @@
10277
10339
  .bui-TextField {
10278
10340
  font-family: var(--bui-font-regular);
10279
10341
  flex-direction: column;
10342
+ flex-shrink: 0;
10280
10343
  width: 100%;
10281
10344
  display: flex;
10282
10345
  }
@@ -10305,7 +10368,9 @@
10305
10368
  left: var(--bui-space-3);
10306
10369
  margin-right: var(--bui-space-1);
10307
10370
  color: var(--bui-fg-primary);
10371
+ pointer-events: none;
10308
10372
  flex-shrink: 0;
10373
+ transition: left .2s ease-in-out;
10309
10374
  position: absolute;
10310
10375
  top: 50%;
10311
10376
  transform: translateY(-50%);
@@ -10323,7 +10388,7 @@
10323
10388
 
10324
10389
  .bui-Input {
10325
10390
  padding: 0 var(--bui-space-3);
10326
- border-radius: var(--bui-radius-3);
10391
+ border-radius: var(--bui-radius-2);
10327
10392
  border: 1px solid var(--bui-border);
10328
10393
  background-color: var(--bui-bg-surface-1);
10329
10394
  font-size: var(--bui-font-size-3);
@@ -10370,8 +10435,55 @@
10370
10435
  }
10371
10436
  }
10372
10437
 
10373
- .bui-SearchField[data-empty] .bui-InputClear {
10374
- display: none;
10438
+ .bui-SearchField {
10439
+ &[data-empty] {
10440
+ & .bui-InputClear {
10441
+ display: none;
10442
+ }
10443
+ }
10444
+
10445
+ &[data-start-collapsed="true"] {
10446
+ padding: 0;
10447
+ transition: width .3s ease-in-out;
10448
+
10449
+ &[data-collapsed="false"] {
10450
+ cursor: pointer;
10451
+
10452
+ &[data-size="medium"] {
10453
+ width: 2.5rem;
10454
+ height: 2.5rem;
10455
+ }
10456
+
10457
+ &[data-size="small"] {
10458
+ width: 2rem;
10459
+ height: 2rem;
10460
+ }
10461
+
10462
+ &[data-size="medium"] .bui-Input {
10463
+ padding-left: 0;
10464
+
10465
+ &::placeholder {
10466
+ opacity: 0;
10467
+ }
10468
+ }
10469
+
10470
+ &[data-size="small"] .bui-Input {
10471
+ padding-left: 0;
10472
+
10473
+ &::placeholder {
10474
+ opacity: 0;
10475
+ }
10476
+ }
10477
+
10478
+ &[data-size="small"] .bui-InputIcon {
10479
+ left: var(--bui-space-2);
10480
+ }
10481
+
10482
+ &[data-size="medium"] .bui-InputIcon {
10483
+ left: 10px;
10484
+ }
10485
+ }
10486
+ }
10375
10487
  }
10376
10488
 
10377
10489
  .bui-InputClear {
@@ -10429,7 +10541,6 @@
10429
10541
  font-size: var(--bui-font-size-3);
10430
10542
  font-family: var(--bui-font-regular);
10431
10543
  color: var(--bui-fg-primary);
10432
- --tooltip-offset: var(--bui-space-3);
10433
10544
  border-radius: 4px;
10434
10545
  outline: none;
10435
10546
  transition: transform .2s, opacity .2s;
@@ -10441,6 +10552,8 @@
10441
10552
  opacity: 0;
10442
10553
  }
10443
10554
 
10555
+ --tooltip-offset: var(--bui-space-3);
10556
+
10444
10557
  &[data-placement="top"] {
10445
10558
  margin-bottom: var(--tooltip-offset);
10446
10559
  --origin: translateY(4px);
@@ -10464,7 +10577,6 @@
10464
10577
 
10465
10578
  .bui-TooltipArrow {
10466
10579
  & svg {
10467
- --tooltip-arrow-overlap: -2px;
10468
10580
  display: block;
10469
10581
 
10470
10582
  & path:first-child {
@@ -10474,6 +10586,8 @@
10474
10586
  & path:nth-child(2) {
10475
10587
  fill: var(--bui-gray-3);
10476
10588
  }
10589
+
10590
+ --tooltip-arrow-overlap: -2px;
10477
10591
  }
10478
10592
 
10479
10593
  &[data-placement="top"] svg {
@@ -10,27 +10,30 @@ import '../Avatar/Avatar.esm.js';
10
10
  import '../Button/Button.esm.js';
11
11
  import '../Card/Card.esm.js';
12
12
  import '../Collapsible/Collapsible.esm.js';
13
- import '../DataTable/DataTable.esm.js';
14
13
  import '../FieldLabel/FieldLabel.esm.js';
15
14
  import '../Header/HeaderToolbar.esm.js';
16
15
  import '../Tabs/Tabs.esm.js';
17
16
  import { useStyles } from '../../hooks/useStyles.esm.js';
18
- import '../Menu/Menu.esm.js';
19
- import '../Text/Text.esm.js';
20
- import '../ButtonIcon/ButtonIcon.esm.js';
17
+ import '../HeaderPage/HeaderPage.esm.js';
21
18
  import '@remixicon/react';
22
19
  import { Icon } from '../Icon/Icon.esm.js';
20
+ import '../ButtonIcon/ButtonIcon.esm.js';
23
21
  import '../ButtonLink/ButtonLink.esm.js';
24
22
  import '../RadioGroup/RadioGroup.esm.js';
25
- import '../Table/Table.esm.js';
23
+ import 'react-aria-components';
24
+ import 'react-router-dom';
25
+ import '../Table/components/Cell.esm.js';
26
+ import clsx from 'clsx';
27
+ import '../Text/Text.esm.js';
28
+ import '../Link/Link.esm.js';
29
+ import '@base-ui-components/react/avatar';
26
30
  import '../TextField/TextField.esm.js';
27
31
  import '../Tooltip/Tooltip.esm.js';
32
+ import '../Menu/Menu.esm.js';
28
33
  import '../ScrollArea/ScrollArea.esm.js';
29
34
  import '../SearchField/SearchField.esm.js';
30
- import '../Link/Link.esm.js';
31
35
  import '../Select/Select.esm.js';
32
36
  import '../Switch/Switch.esm.js';
33
- import clsx from 'clsx';
34
37
 
35
38
  const Checkbox = forwardRef(
36
39
  (props, ref) => {
@@ -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,QAAW,GAAA,UAAA;AAAA,EACtB,CAAC,OAAO,GAAQ,KAAA;AACd,IAAM,MAAA;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,KACE,GAAA,KAAA;AAEJ,IAAA,MAAM,EAAE,UAAA,EAAe,GAAA,SAAA,CAAU,UAAU,CAAA;AAE3C,IAAA,MAAM,eACJ,mBAAA,GAAA;AAAA,MAACA,UAAkB,CAAA,IAAA;AAAA,MAAlB;AAAA,QACC,GAAA;AAAA,QACA,SAAW,EAAA,IAAA,CAAK,UAAW,CAAA,IAAA,EAAM,SAAS,CAAA;AAAA,QAC1C,OAAA;AAAA,QACA,eAAiB,EAAA,QAAA;AAAA,QACjB,QAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QAEA,QAAC,kBAAA,GAAA,CAAAA,UAAA,CAAkB,SAAlB,EAAA,EAA4B,SAAW,EAAA,UAAA,CAAW,SACjD,EAAA,QAAA,kBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAK,OAAQ,EAAA,IAAA,EAAM,IAAI,CAC/B,EAAA;AAAA;AAAA,KACF;AAGF,IAAA,OAAO,KACL,mBAAA,IAAA,CAAC,OAAM,EAAA,EAAA,SAAA,EAAW,WAAW,KAC1B,EAAA,QAAA,EAAA;AAAA,MAAA,eAAA;AAAA,MACA;AAAA,KAAA,EACH,CAEA,GAAA,eAAA;AAAA;AAGN;;;;"}
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,QAAW,GAAA,UAAA;AAAA,EACtB,CAAC,OAAO,GAAQ,KAAA;AACd,IAAM,MAAA;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,KACE,GAAA,KAAA;AAEJ,IAAA,MAAM,EAAE,UAAA,EAAe,GAAA,SAAA,CAAU,UAAU,CAAA;AAE3C,IAAA,MAAM,eACJ,mBAAA,GAAA;AAAA,MAACA,UAAkB,CAAA,IAAA;AAAA,MAAlB;AAAA,QACC,GAAA;AAAA,QACA,SAAW,EAAA,IAAA,CAAK,UAAW,CAAA,IAAA,EAAM,SAAS,CAAA;AAAA,QAC1C,OAAA;AAAA,QACA,eAAiB,EAAA,QAAA;AAAA,QACjB,QAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QAEA,QAAC,kBAAA,GAAA,CAAAA,UAAA,CAAkB,SAAlB,EAAA,EAA4B,SAAW,EAAA,UAAA,CAAW,SACjD,EAAA,QAAA,kBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAK,OAAQ,EAAA,IAAA,EAAM,IAAI,CAC/B,EAAA;AAAA;AAAA,KACF;AAGF,IAAA,OAAO,KACL,mBAAA,IAAA,CAAC,OAAM,EAAA,EAAA,SAAA,EAAW,WAAW,KAC1B,EAAA,QAAA,EAAA;AAAA,MAAA,eAAA;AAAA,MACA;AAAA,KAAA,EACH,CAEA,GAAA,eAAA;AAAA;AAGN;;;;"}
@@ -10,7 +10,6 @@ const Header = (props) => {
10
10
  title,
11
11
  titleLink,
12
12
  menuItems,
13
- breadcrumbs,
14
13
  customActions,
15
14
  onTabSelectionChange
16
15
  } = props;
@@ -24,7 +23,6 @@ const Header = (props) => {
24
23
  title,
25
24
  titleLink,
26
25
  menuItems,
27
- breadcrumbs,
28
26
  customActions,
29
27
  hasTabs
30
28
  }
@@ -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 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
+ {"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":";;;;;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,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,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,118 +1,29 @@
1
1
  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
- import { useRef, useState, useEffect } from 'react';
5
- import { RiShapesLine, RiArrowRightSLine, RiMore2Line } from '@remixicon/react';
4
+ import { useRef } from 'react';
5
+ import { RiShapesLine, RiMore2Line } from '@remixicon/react';
6
6
  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 { useNavigate, useHref } from 'react-router-dom';
10
10
  import { gsap } from 'gsap';
11
11
  import { ScrollTrigger } from 'gsap/ScrollTrigger';
12
- import { useGSAP } from '@gsap/react';
13
12
 
14
13
  gsap.registerPlugin(ScrollTrigger);
15
14
  const HeaderToolbar = (props) => {
16
- const {
17
- icon,
18
- title,
19
- titleLink,
20
- menuItems,
21
- breadcrumbs,
22
- customActions,
23
- hasTabs
24
- } = props;
15
+ const { icon, title, titleLink, menuItems, customActions, hasTabs } = props;
25
16
  const { classNames } = useStyles("Header");
26
17
  let navigate = useNavigate();
27
18
  const toolbarWrapperRef = useRef(null);
28
19
  const toolbarContentRef = useRef(null);
29
20
  const toolbarControlsRef = useRef(null);
30
- const breadcrumbsRef = useRef(null);
31
- const [showBreadcrumbs, setShowBreadcrumbs] = useState(true);
32
- useEffect(() => {
33
- const wrapper = toolbarWrapperRef.current;
34
- if (!wrapper) return;
35
- const resizeObserver = new ResizeObserver(() => {
36
- const wrapper2 = toolbarWrapperRef.current;
37
- const content = toolbarContentRef.current;
38
- const options = toolbarControlsRef.current;
39
- if (!wrapper2 || !content) return;
40
- const wrapperRect = wrapper2.getBoundingClientRect();
41
- const wrapperWidth = wrapperRect.width;
42
- const wrapperPadding = 24;
43
- const availableWidth = wrapperWidth - wrapperPadding;
44
- const contentRect = content.getBoundingClientRect();
45
- const contentWidth = contentRect?.width || 0;
46
- const optionsRect = options?.getBoundingClientRect();
47
- const optionsWidth = optionsRect?.width || 0;
48
- const shouldShowBreadcrumbs = contentWidth + optionsWidth + 32 <= availableWidth;
49
- setShowBreadcrumbs(
50
- (prev) => prev !== shouldShowBreadcrumbs ? shouldShowBreadcrumbs : prev
51
- );
52
- });
53
- resizeObserver.observe(wrapper);
54
- return () => {
55
- resizeObserver.disconnect();
56
- };
57
- }, []);
58
- useGSAP(() => {
59
- gsap.to(breadcrumbsRef.current, {
60
- scrollTrigger: {
61
- start: "10% 10%",
62
- end: "20% 20%",
63
- scrub: true
64
- },
65
- opacity: 1,
66
- duration: 1,
67
- ease: "power2.inOut"
68
- });
69
- });
70
21
  const titleContent = /* @__PURE__ */ jsxs(Fragment, { children: [
71
22
  /* @__PURE__ */ jsx("div", { className: classNames.toolbarIcon, children: icon || /* @__PURE__ */ jsx(RiShapesLine, {}) }),
72
23
  /* @__PURE__ */ jsx(Text, { variant: "body-medium", children: title || "Your plugin" })
73
24
  ] });
74
25
  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: [
75
- /* @__PURE__ */ jsxs("div", { className: classNames.toolbarContent, ref: toolbarContentRef, children: [
76
- /* @__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 }) }),
77
- breadcrumbs && /* @__PURE__ */ jsxs(
78
- "div",
79
- {
80
- ref: breadcrumbsRef,
81
- className: classNames.breadcrumbs,
82
- style: {
83
- opacity: 0,
84
- visibility: showBreadcrumbs ? "visible" : "hidden"
85
- },
86
- children: [
87
- /* @__PURE__ */ jsx(
88
- RiArrowRightSLine,
89
- {
90
- size: 16,
91
- className: classNames.breadcrumbSeparator
92
- }
93
- ),
94
- breadcrumbs.map((breadcrumb, index) => /* @__PURE__ */ jsxs("div", { className: classNames.breadcrumb, children: [
95
- /* @__PURE__ */ jsx(
96
- Link,
97
- {
98
- href: breadcrumb.href,
99
- className: classNames.breadcrumbLink,
100
- "data-active": index === breadcrumbs.length - 1,
101
- children: breadcrumb.label
102
- }
103
- ),
104
- index < breadcrumbs.length - 1 && /* @__PURE__ */ jsx(
105
- RiArrowRightSLine,
106
- {
107
- size: 16,
108
- className: classNames.breadcrumbSeparator
109
- }
110
- )
111
- ] }, breadcrumb.label))
112
- ]
113
- }
114
- )
115
- ] }),
26
+ /* @__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 }) }) }),
116
27
  /* @__PURE__ */ jsxs("div", { className: classNames.toolbarControls, ref: toolbarControlsRef, children: [
117
28
  customActions,
118
29
  menuItems && /* @__PURE__ */ jsxs(Menu.Root, { children: [
@@ -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, 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 { useNavigate, useHref } from 'react-router-dom';\nimport { gsap } from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\nimport { useGSAP } from '@gsap/react';\n\ngsap.registerPlugin(ScrollTrigger);\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\n // Refs for collision detection\n const toolbarWrapperRef = useRef<HTMLDivElement>(null);\n const toolbarContentRef = useRef<HTMLDivElement>(null);\n const toolbarControlsRef = useRef<HTMLDivElement>(null);\n const breadcrumbsRef = 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 useGSAP(() => {\n gsap.to(breadcrumbsRef.current, {\n scrollTrigger: {\n start: '10% 10%',\n end: '20% 20%',\n scrub: true,\n },\n opacity: 1,\n duration: 1,\n ease: 'power2.inOut',\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 <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 {breadcrumbs && (\n <div\n ref={breadcrumbsRef}\n className={classNames.breadcrumbs}\n style={{\n opacity: 0,\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 </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
+ {"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';\nimport { gsap } from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\n\ngsap.registerPlugin(ScrollTrigger);\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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"}