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