@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.
- package/CHANGELOG.md +12 -0
- package/css/styles.css +187 -73
- package/dist/components/Checkbox/Checkbox.esm.js +10 -7
- package/dist/components/Checkbox/Checkbox.esm.js.map +1 -1
- package/dist/components/Header/Header.esm.js +0 -2
- package/dist/components/Header/Header.esm.js.map +1 -1
- package/dist/components/Header/HeaderToolbar.esm.js +4 -93
- package/dist/components/Header/HeaderToolbar.esm.js.map +1 -1
- package/dist/components/HeaderPage/HeaderPage.esm.js +95 -41
- package/dist/components/HeaderPage/HeaderPage.esm.js.map +1 -1
- package/dist/components/Link/Link.esm.js +1 -13
- package/dist/components/Link/Link.esm.js.map +1 -1
- package/dist/components/Menu/Combobox.esm.js +9 -6
- package/dist/components/Menu/Combobox.esm.js.map +1 -1
- package/dist/components/SearchField/SearchField.esm.js +27 -4
- package/dist/components/SearchField/SearchField.esm.js.map +1 -1
- package/dist/components/Select/Select.esm.js +0 -1
- package/dist/components/Select/Select.esm.js.map +1 -1
- package/dist/components/Table/components/Cell.esm.js +30 -0
- package/dist/components/Table/components/Cell.esm.js.map +1 -0
- package/dist/components/Table/components/CellProfile.esm.js +41 -0
- package/dist/components/Table/components/CellProfile.esm.js.map +1 -0
- package/dist/components/Table/components/Column.esm.js +17 -0
- package/dist/components/Table/components/Column.esm.js.map +1 -0
- package/dist/components/Table/components/Row.esm.js +38 -0
- package/dist/components/Table/components/Row.esm.js.map +1 -0
- package/dist/components/Table/components/Table.esm.js +18 -0
- package/dist/components/Table/components/Table.esm.js.map +1 -0
- package/dist/components/Table/components/TableBody.esm.js +11 -0
- package/dist/components/Table/components/TableBody.esm.js.map +1 -0
- package/dist/components/Table/components/TableHeader.esm.js +20 -0
- package/dist/components/Table/components/TableHeader.esm.js.map +1 -0
- package/dist/components/Table/hooks/useTable.esm.js +116 -0
- package/dist/components/Table/hooks/useTable.esm.js.map +1 -0
- package/dist/components/TablePagination/TablePagination.esm.js +130 -0
- package/dist/components/TablePagination/TablePagination.esm.js.map +1 -0
- package/dist/index.d.ts +161 -94
- package/dist/index.esm.js +9 -2
- package/dist/index.esm.js.map +1 -1
- package/dist/utils/componentDefinitions.esm.js +16 -5
- package/dist/utils/componentDefinitions.esm.js.map +1 -1
- package/dist/utils/isExternalLink.esm.js +16 -0
- package/dist/utils/isExternalLink.esm.js.map +1 -0
- package/package.json +2 -2
- package/dist/components/DataTable/DataTable.esm.js +0 -26
- package/dist/components/DataTable/DataTable.esm.js.map +0 -1
- package/dist/components/DataTable/Pagination/DataTablePagination.esm.js +0 -84
- package/dist/components/DataTable/Pagination/DataTablePagination.esm.js.map +0 -1
- package/dist/components/DataTable/Root/DataTableRoot.esm.js +0 -24
- package/dist/components/DataTable/Root/DataTableRoot.esm.js.map +0 -1
- package/dist/components/DataTable/Table/DataTableTable.esm.js +0 -64
- package/dist/components/DataTable/Table/DataTableTable.esm.js.map +0 -1
- package/dist/components/Select/Select.styles.css.esm.js +0 -7
- package/dist/components/Select/Select.styles.css.esm.js.map +0 -1
- package/dist/components/Table/Table.esm.js +0 -68
- package/dist/components/Table/Table.esm.js.map +0 -1
- package/dist/components/Table/TableCell/TableCell.esm.js +0 -13
- package/dist/components/Table/TableCell/TableCell.esm.js.map +0 -1
- package/dist/components/Table/TableCellLink/TableCellLink.esm.js +0 -28
- package/dist/components/Table/TableCellLink/TableCellLink.esm.js.map +0 -1
- package/dist/components/Table/TableCellProfile/TableCellProfile.esm.js +0 -40
- package/dist/components/Table/TableCellProfile/TableCellProfile.esm.js.map +0 -1
- package/dist/components/Table/TableCellText/TableCellText.esm.js +0 -27
- package/dist/components/Table/TableCellText/TableCellText.esm.js.map +0 -1
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +0 -29
- 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-
|
|
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-
|
|
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-
|
|
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
|
|
10374
|
-
|
|
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 '../
|
|
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 '
|
|
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":"
|
|
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
|
|
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
|
|
5
|
-
import { RiShapesLine,
|
|
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__ */
|
|
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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"}
|