@okta/odyssey-react-mui 1.22.0 → 1.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +40 -0
- package/dist/@types/i18next.d.js.map +1 -1
- package/dist/Autocomplete.js +32 -0
- package/dist/Autocomplete.js.map +1 -1
- package/dist/Banner.js +6 -2
- package/dist/Banner.js.map +1 -1
- package/dist/Callout.js +18 -26
- package/dist/Callout.js.map +1 -1
- package/dist/ContrastModeProvider.js +86 -0
- package/dist/ContrastModeProvider.js.map +1 -0
- package/dist/DataTable/useScrollIndication.js +7 -3
- package/dist/DataTable/useScrollIndication.js.map +1 -1
- package/dist/FieldHint.js +20 -6
- package/dist/FieldHint.js.map +1 -1
- package/dist/FileUploader/FileUploadIllustration.js.map +1 -0
- package/dist/FileUploader/FileUploadPreview.js.map +1 -0
- package/dist/{labs/FileUpload.js → FileUploader/FileUploader.js} +6 -5
- package/dist/FileUploader/FileUploader.js.map +1 -0
- package/dist/FileUploader/index.js +13 -0
- package/dist/FileUploader/index.js.map +1 -0
- package/dist/Link.js.map +1 -1
- package/dist/OdysseyProvider.js +43 -19
- package/dist/OdysseyProvider.js.map +1 -1
- package/dist/Radio.js +2 -2
- package/dist/Radio.js.map +1 -1
- package/dist/Select.js +36 -0
- package/dist/Select.js.map +1 -1
- package/dist/Stack.js +32 -0
- package/dist/Stack.js.map +1 -0
- package/dist/{labs/Switch.js → Switch.js} +7 -7
- package/dist/Switch.js.map +1 -0
- package/dist/Tabs.js +7 -9
- package/dist/Tabs.js.map +1 -1
- package/dist/Tag.js +144 -4
- package/dist/Tag.js.map +1 -1
- package/dist/TextField.js +16 -39
- package/dist/TextField.js.map +1 -1
- package/dist/Toast.js +2 -2
- package/dist/Toast.js.map +1 -1
- package/dist/Typography.js +27 -6
- package/dist/Typography.js.map +1 -1
- package/dist/createShadowDomElements.js +1 -0
- package/dist/createShadowDomElements.js.map +1 -1
- package/dist/i18n.js +1 -1
- package/dist/i18n.js.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/index.scss +96 -4
- package/dist/labs/DataView/DataView.js +64 -25
- package/dist/labs/DataView/DataView.js.map +1 -1
- package/dist/labs/DataView/TableLayoutContent.js +17 -3
- package/dist/labs/DataView/TableLayoutContent.js.map +1 -1
- package/dist/labs/DataView/componentTypes.js.map +1 -1
- package/dist/labs/DateField.js +2 -0
- package/dist/labs/DateField.js.map +1 -1
- package/dist/labs/DatePicker.js +5 -1
- package/dist/labs/DatePicker.js.map +1 -1
- package/dist/labs/SideNav/OktaLogo.js +36 -0
- package/dist/labs/SideNav/OktaLogo.js.map +1 -0
- package/dist/labs/SideNav/SideNav.js +125 -36
- package/dist/labs/SideNav/SideNav.js.map +1 -1
- package/dist/labs/SideNav/SideNavHeader.js +33 -10
- package/dist/labs/SideNav/SideNavHeader.js.map +1 -1
- package/dist/labs/SideNav/types.js.map +1 -1
- package/dist/labs/TopNav.js +2 -1
- package/dist/labs/TopNav.js.map +1 -1
- package/dist/labs/datePickerTheme.js +3 -6
- package/dist/labs/datePickerTheme.js.map +1 -1
- package/dist/labs/index.js +0 -2
- package/dist/labs/index.js.map +1 -1
- package/dist/labs/useDateFieldsTranslations.js +1 -1
- package/dist/labs/useDateFieldsTranslations.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui.js +3 -1
- package/dist/properties/ts/odyssey-react-mui.js.map +1 -1
- package/dist/src/Autocomplete.d.ts +37 -1
- package/dist/src/Autocomplete.d.ts.map +1 -1
- package/dist/src/Banner.d.ts +16 -12
- package/dist/src/Banner.d.ts.map +1 -1
- package/dist/src/Callout.d.ts +20 -32
- package/dist/src/Callout.d.ts.map +1 -1
- package/dist/src/ContrastModeProvider.d.ts +34 -0
- package/dist/src/ContrastModeProvider.d.ts.map +1 -0
- package/dist/src/DataTable/useScrollIndication.d.ts.map +1 -1
- package/dist/src/FieldHint.d.ts.map +1 -1
- package/dist/src/FileUploader/FileUploadIllustration.d.ts.map +1 -0
- package/dist/src/{labs → FileUploader}/FileUploadPreview.d.ts +2 -2
- package/dist/src/FileUploader/FileUploadPreview.d.ts.map +1 -0
- package/dist/src/{labs/FileUpload.d.ts → FileUploader/FileUploader.d.ts} +5 -4
- package/dist/src/FileUploader/FileUploader.d.ts.map +1 -0
- package/dist/src/FileUploader/index.d.ts +13 -0
- package/dist/src/FileUploader/index.d.ts.map +1 -0
- package/dist/src/Link.d.ts +3 -1
- package/dist/src/Link.d.ts.map +1 -1
- package/dist/src/NativeSelect.d.ts +1 -1
- package/dist/src/OdysseyProvider.d.ts +5 -3
- package/dist/src/OdysseyProvider.d.ts.map +1 -1
- package/dist/src/OdysseyTranslationProvider.d.ts +1 -1
- package/dist/src/OdysseyTranslationProvider.d.ts.map +1 -1
- package/dist/src/PasswordField.d.ts +1 -1
- package/dist/src/SearchField.d.ts +1 -1
- package/dist/src/Select.d.ts +36 -0
- package/dist/src/Select.d.ts.map +1 -1
- package/dist/src/Stack.d.ts +33 -0
- package/dist/src/Stack.d.ts.map +1 -0
- package/dist/src/{labs/Switch.d.ts → Switch.d.ts} +3 -3
- package/dist/src/Switch.d.ts.map +1 -0
- package/dist/src/Tabs.d.ts +6 -8
- package/dist/src/Tabs.d.ts.map +1 -1
- package/dist/src/Tag.d.ts +7 -1
- package/dist/src/Tag.d.ts.map +1 -1
- package/dist/src/TextField.d.ts +17 -40
- package/dist/src/TextField.d.ts.map +1 -1
- package/dist/src/Typography.d.ts +3 -2
- package/dist/src/Typography.d.ts.map +1 -1
- package/dist/src/createShadowDomElements.d.ts.map +1 -1
- package/dist/src/i18n.d.ts +2 -2
- package/dist/src/i18n.d.ts.map +1 -1
- package/dist/src/index.d.ts +8 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/labs/DataView/DataView.d.ts +1 -1
- package/dist/src/labs/DataView/DataView.d.ts.map +1 -1
- package/dist/src/labs/DataView/TableLayoutContent.d.ts +2 -1
- package/dist/src/labs/DataView/TableLayoutContent.d.ts.map +1 -1
- package/dist/src/labs/DataView/componentTypes.d.ts +10 -0
- package/dist/src/labs/DataView/componentTypes.d.ts.map +1 -1
- package/dist/src/labs/DateField.d.ts +2 -2
- package/dist/src/labs/DateField.d.ts.map +1 -1
- package/dist/src/labs/DatePicker.d.ts +2 -2
- package/dist/src/labs/DatePicker.d.ts.map +1 -1
- package/dist/{test-selectors/odysseyTestSelectors.js → src/labs/SideNav/OktaLogo.d.ts} +3 -9
- package/dist/src/labs/SideNav/OktaLogo.d.ts.map +1 -0
- package/dist/src/labs/SideNav/SideNav.d.ts +2 -1
- package/dist/src/labs/SideNav/SideNav.d.ts.map +1 -1
- package/dist/src/labs/SideNav/SideNavHeader.d.ts +1 -1
- package/dist/src/labs/SideNav/SideNavHeader.d.ts.map +1 -1
- package/dist/src/labs/SideNav/types.d.ts +28 -5
- package/dist/src/labs/SideNav/types.d.ts.map +1 -1
- package/dist/src/labs/TopNav.d.ts +1 -0
- package/dist/src/labs/TopNav.d.ts.map +1 -1
- package/dist/src/labs/datePickerTheme.d.ts.map +1 -1
- package/dist/src/labs/index.d.ts +0 -2
- package/dist/src/labs/index.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui.d.ts.map +1 -1
- package/dist/src/test-selectors/getByQuerySelector.d.ts +148 -0
- package/dist/src/test-selectors/getByQuerySelector.d.ts.map +1 -0
- package/dist/src/test-selectors/getComputedAccessibleErrorMessageText.d.ts +14 -0
- package/dist/src/test-selectors/getComputedAccessibleErrorMessageText.d.ts.map +1 -0
- package/dist/src/test-selectors/{featureTestSelector.d.ts → getComputedAccessibleText.d.ts} +11 -19
- package/dist/src/test-selectors/getComputedAccessibleText.d.ts.map +1 -0
- package/dist/src/test-selectors/index.d.ts +2 -2
- package/dist/src/test-selectors/index.d.ts.map +1 -1
- package/dist/src/test-selectors/interpolateString.d.ts +15 -0
- package/dist/src/test-selectors/interpolateString.d.ts.map +1 -0
- package/dist/src/test-selectors/linkedHtmlSelectors.d.ts +24 -0
- package/dist/src/test-selectors/linkedHtmlSelectors.d.ts.map +1 -0
- package/dist/src/test-selectors/queryOdysseySelector.d.ts +5755 -0
- package/dist/src/test-selectors/queryOdysseySelector.d.ts.map +1 -0
- package/dist/src/test-selectors/querySelector.d.ts +59 -3613
- package/dist/src/test-selectors/querySelector.d.ts.map +1 -1
- package/dist/src/test-selectors/sanityChecks.d.ts +18 -0
- package/dist/src/test-selectors/sanityChecks.d.ts.map +1 -0
- package/dist/src/test-selectors/testSelector.d.ts +46 -0
- package/dist/src/test-selectors/testSelector.d.ts.map +1 -0
- package/dist/src/theme/palette.d.ts.map +1 -1
- package/dist/src/theme/palette.types.d.ts +2 -0
- package/dist/src/theme/palette.types.d.ts.map +1 -1
- package/dist/test-selectors/getByQuerySelector.js +64 -0
- package/dist/test-selectors/getByQuerySelector.js.map +1 -0
- package/dist/test-selectors/getComputedAccessibleErrorMessageText.js +25 -0
- package/dist/test-selectors/getComputedAccessibleErrorMessageText.js.map +1 -0
- package/dist/test-selectors/getComputedAccessibleText.js +24 -0
- package/dist/test-selectors/getComputedAccessibleText.js.map +1 -0
- package/dist/test-selectors/index.js +2 -2
- package/dist/test-selectors/index.js.map +1 -1
- package/{src/test-selectors/featureTestSelector.ts → dist/test-selectors/interpolateString.js} +11 -27
- package/dist/test-selectors/interpolateString.js.map +1 -0
- package/dist/test-selectors/linkedHtmlSelectors.js +34 -0
- package/dist/test-selectors/linkedHtmlSelectors.js.map +1 -0
- package/dist/test-selectors/queryOdysseySelector.js +26 -0
- package/dist/test-selectors/queryOdysseySelector.js.map +1 -0
- package/dist/test-selectors/querySelector.js +82 -58
- package/dist/test-selectors/querySelector.js.map +1 -1
- package/dist/test-selectors/sanityChecks.js +33 -0
- package/dist/test-selectors/sanityChecks.js.map +1 -0
- package/dist/test-selectors/testSelector.js +2 -0
- package/dist/test-selectors/testSelector.js.map +1 -0
- package/dist/test-selectors/testSelectors.json +1 -1
- package/dist/theme/components.js +276 -274
- package/dist/theme/components.js.map +1 -1
- package/dist/theme/palette.js +2 -1
- package/dist/theme/palette.js.map +1 -1
- package/dist/theme/palette.types.js.map +1 -1
- package/dist/tsconfig.production.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/jest.setup.js +3 -0
- package/package.json +5 -4
- package/scripts/generateTestSelectorsJson.ts +1 -1
- package/src/@types/i18next.d.ts +1 -1
- package/src/Autocomplete.tsx +45 -0
- package/src/Banner.tsx +29 -14
- package/src/Callout.tsx +31 -36
- package/src/ContrastModeProvider.tsx +131 -0
- package/src/DataTable/useScrollIndication.tsx +9 -2
- package/src/FieldHint.tsx +28 -4
- package/src/{labs → FileUploader}/FileUploadPreview.tsx +3 -3
- package/src/{labs/FileUpload.tsx → FileUploader/FileUploader.tsx} +7 -6
- package/src/FileUploader/index.ts +13 -0
- package/src/Link.tsx +3 -1
- package/src/OdysseyCacheProvider.test.tsx +1 -0
- package/src/OdysseyProvider.tsx +58 -26
- package/src/Radio.tsx +2 -2
- package/src/Select.tsx +38 -0
- package/src/Stack.tsx +56 -0
- package/src/{labs/Switch.tsx → Switch.tsx} +10 -10
- package/src/Tabs.tsx +8 -10
- package/src/Tag.tsx +178 -3
- package/src/TextField.tsx +18 -41
- package/src/Toast.tsx +1 -1
- package/src/{test-selectors/odysseyTestSelectors.ts → Typography.test.tsx} +13 -9
- package/src/Typography.tsx +38 -6
- package/src/createShadowDomElements.ts +3 -0
- package/src/i18n.ts +3 -3
- package/src/index.ts +10 -1
- package/src/labs/DataView/DataView.test.tsx +158 -0
- package/src/labs/DataView/DataView.tsx +98 -50
- package/src/labs/DataView/TableLayoutContent.tsx +28 -1
- package/src/labs/DataView/componentTypes.ts +13 -0
- package/src/labs/DateField.tsx +3 -0
- package/src/labs/DatePicker.tsx +12 -1
- package/src/labs/SideNav/OktaLogo.tsx +39 -0
- package/src/labs/SideNav/SideNav.tsx +187 -51
- package/src/labs/SideNav/SideNavHeader.tsx +30 -7
- package/src/labs/SideNav/types.ts +32 -5
- package/src/labs/TopNav.tsx +3 -1
- package/src/labs/datePickerTheme.tsx +2 -6
- package/src/labs/index.ts +0 -3
- package/src/labs/useDateFieldsTranslations.ts +1 -1
- package/src/properties/odyssey-react-mui.properties +2 -1
- package/src/properties/ts/odyssey-react-mui.ts +1 -1
- package/src/test-selectors/getByQuerySelector.ts +176 -0
- package/src/test-selectors/getComputedAccessibleErrorMessageText.ts +52 -0
- package/src/test-selectors/getComputedAccessibleText.ts +36 -0
- package/src/test-selectors/index.ts +2 -2
- package/src/test-selectors/interpolateString.ts +41 -0
- package/src/test-selectors/linkedHtmlSelectors.ts +73 -0
- package/src/test-selectors/queryOdysseySelector.ts +36 -0
- package/src/test-selectors/querySelector.ts +221 -170
- package/src/test-selectors/sanityChecks.ts +53 -0
- package/src/test-selectors/testSelector.ts +143 -0
- package/src/theme/components.tsx +284 -284
- package/src/theme/palette.ts +2 -1
- package/src/theme/palette.types.ts +2 -0
- package/dist/labs/FileUpload.js.map +0 -1
- package/dist/labs/FileUploadIllustration.js.map +0 -1
- package/dist/labs/FileUploadPreview.js.map +0 -1
- package/dist/labs/Switch.js.map +0 -1
- package/dist/src/labs/FileUpload.d.ts.map +0 -1
- package/dist/src/labs/FileUploadIllustration.d.ts.map +0 -1
- package/dist/src/labs/FileUploadPreview.d.ts.map +0 -1
- package/dist/src/labs/Switch.d.ts.map +0 -1
- package/dist/src/test-selectors/featureTestSelector.d.ts.map +0 -1
- package/dist/src/test-selectors/odysseyTestSelectors.d.ts +0 -120
- package/dist/src/test-selectors/odysseyTestSelectors.d.ts.map +0 -1
- package/dist/test-selectors/featureTestSelector.js +0 -2
- package/dist/test-selectors/featureTestSelector.js.map +0 -1
- package/dist/test-selectors/odysseyTestSelectors.js.map +0 -1
- /package/dist/{labs → FileUploader}/FileUploadIllustration.js +0 -0
- /package/dist/{labs → FileUploader}/FileUploadPreview.js +0 -0
- /package/dist/src/{labs → FileUploader}/FileUploadIllustration.d.ts +0 -0
- /package/src/{labs → FileUploader}/FileUploadIllustration.tsx +0 -0
|
@@ -12,15 +12,26 @@
|
|
|
12
12
|
|
|
13
13
|
import styled from "@emotion/styled";
|
|
14
14
|
import { memo, useMemo, useState, useCallback, useRef, useEffect } from "react";
|
|
15
|
-
import { Box } from "../../Box.js";
|
|
16
15
|
import { ExpandLeftIcon } from "../../icons.generated/index.js";
|
|
17
16
|
import { NavAccordion } from "../NavAccordion.js";
|
|
18
17
|
import { useOdysseyDesignTokens } from "../../OdysseyDesignTokensContext.js";
|
|
18
|
+
import { OktaLogo } from "./OktaLogo.js";
|
|
19
19
|
import { SideNavHeader } from "./SideNavHeader.js";
|
|
20
20
|
import { SideNavItemContent, SideNavListItemContainer } from "./SideNavItemContent.js";
|
|
21
21
|
import { SideNavFooterContent } from "./SideNavFooterContent.js";
|
|
22
22
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
23
23
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
24
|
+
export const DEFAULT_SIDE_NAV_WIDTH = "300px";
|
|
25
|
+
const SideNavContainer = styled("div", {
|
|
26
|
+
shouldForwardProp: prop => prop !== "expandedWidth"
|
|
27
|
+
})(({
|
|
28
|
+
expandedWidth
|
|
29
|
+
}) => ({
|
|
30
|
+
display: "flex",
|
|
31
|
+
height: "100%",
|
|
32
|
+
maxWidth: expandedWidth,
|
|
33
|
+
overflow: "hidden"
|
|
34
|
+
}));
|
|
24
35
|
const SideNavCollapsedContainer = styled("div", {
|
|
25
36
|
shouldForwardProp: prop => prop !== "odysseyDesignTokens" && prop !== "isSideNavCollapsed"
|
|
26
37
|
})(({
|
|
@@ -37,32 +48,51 @@ const SideNavCollapsedContainer = styled("div", {
|
|
|
37
48
|
transitionDuration: odysseyDesignTokens.TransitionDurationMain,
|
|
38
49
|
transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain
|
|
39
50
|
}));
|
|
40
|
-
const SideNavExpandContainer = styled("
|
|
41
|
-
shouldForwardProp: prop => prop !== "odysseyDesignTokens" && prop !== "isSideNavCollapsed"
|
|
51
|
+
const SideNavExpandContainer = styled("nav", {
|
|
52
|
+
shouldForwardProp: prop => prop !== "odysseyDesignTokens" && prop !== "isSideNavCollapsed" && prop !== "expandedWidth"
|
|
42
53
|
})(({
|
|
43
54
|
odysseyDesignTokens,
|
|
44
|
-
isSideNavCollapsed
|
|
55
|
+
isSideNavCollapsed,
|
|
56
|
+
expandedWidth
|
|
45
57
|
}) => ({
|
|
46
58
|
backgroundColor: odysseyDesignTokens.HueNeutralWhite,
|
|
47
59
|
flexDirection: "column",
|
|
48
60
|
display: "flex",
|
|
49
61
|
opacity: isSideNavCollapsed ? 0 : 1,
|
|
50
62
|
visibility: isSideNavCollapsed ? "hidden" : "visible",
|
|
51
|
-
width: isSideNavCollapsed ? "0" :
|
|
63
|
+
width: isSideNavCollapsed ? "0" : expandedWidth,
|
|
52
64
|
transitionProperty: "opacity, width",
|
|
53
65
|
transitionDuration: odysseyDesignTokens.TransitionDurationMain,
|
|
54
|
-
transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain
|
|
66
|
+
transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain,
|
|
67
|
+
borderRight: `${odysseyDesignTokens.BorderWidthMain} ${odysseyDesignTokens.BorderStyleMain} ${odysseyDesignTokens.HueNeutral50}`
|
|
68
|
+
}));
|
|
69
|
+
const SideNavHeaderContainer = styled("div", {
|
|
70
|
+
shouldForwardProp: prop => prop !== "hasContentScrolled" && prop !== "odysseyDesignTokens"
|
|
71
|
+
})(({
|
|
72
|
+
hasContentScrolled,
|
|
73
|
+
odysseyDesignTokens
|
|
74
|
+
}) => ({
|
|
75
|
+
position: "sticky",
|
|
76
|
+
top: 0,
|
|
77
|
+
...(hasContentScrolled && {
|
|
78
|
+
borderBottom: `${odysseyDesignTokens.BorderWidthMain} ${odysseyDesignTokens.BorderStyleMain} ${odysseyDesignTokens.HueNeutral50}`
|
|
79
|
+
})
|
|
55
80
|
}));
|
|
56
81
|
const SideNavListContainer = styled.ul({
|
|
57
82
|
padding: 0,
|
|
58
83
|
listStyle: "none",
|
|
59
84
|
listStyleType: "none"
|
|
60
85
|
});
|
|
86
|
+
const SideNavScrollableContainer = styled.div({
|
|
87
|
+
flex: 1,
|
|
88
|
+
overflowY: "auto"
|
|
89
|
+
});
|
|
61
90
|
const SectionHeader = styled("li", {
|
|
62
91
|
shouldForwardProp: prop => prop !== "odysseyDesignTokens"
|
|
63
92
|
})(({
|
|
64
93
|
odysseyDesignTokens
|
|
65
94
|
}) => ({
|
|
95
|
+
fontFamily: odysseyDesignTokens.TypographyFamilyHeading,
|
|
66
96
|
fontSize: odysseyDesignTokens.TypographySizeOverline,
|
|
67
97
|
fontWeight: odysseyDesignTokens.TypographyWeightHeadingBold,
|
|
68
98
|
color: odysseyDesignTokens.HueNeutral600,
|
|
@@ -71,7 +101,23 @@ const SectionHeader = styled("li", {
|
|
|
71
101
|
paddingLeft: odysseyDesignTokens.Spacing4,
|
|
72
102
|
textTransform: "uppercase"
|
|
73
103
|
}));
|
|
74
|
-
const
|
|
104
|
+
const SideNavFooter = styled("div", {
|
|
105
|
+
shouldForwardProp: prop => prop !== "isContentScrollable" && prop !== "odysseyDesignTokens"
|
|
106
|
+
})(({
|
|
107
|
+
isContentScrollable,
|
|
108
|
+
odysseyDesignTokens
|
|
109
|
+
}) => ({
|
|
110
|
+
position: "sticky",
|
|
111
|
+
bottom: 0,
|
|
112
|
+
paddingTop: odysseyDesignTokens.Spacing2,
|
|
113
|
+
transitionProperty: "box-shadow",
|
|
114
|
+
transitionDuration: odysseyDesignTokens.TransitionDurationMain,
|
|
115
|
+
transitionTiming: odysseyDesignTokens.TransitionTimingMain,
|
|
116
|
+
...(isContentScrollable && {
|
|
117
|
+
boxShadow: odysseyDesignTokens.DepthHigh
|
|
118
|
+
})
|
|
119
|
+
}));
|
|
120
|
+
const SideNavFooterItemsContainer = styled("div", {
|
|
75
121
|
shouldForwardProp: prop => prop !== "odysseyDesignTokens"
|
|
76
122
|
})(({
|
|
77
123
|
odysseyDesignTokens
|
|
@@ -93,16 +139,71 @@ const SideNavFooterContainer = styled("div", {
|
|
|
93
139
|
color: odysseyDesignTokens.TypographyColorHeading
|
|
94
140
|
}
|
|
95
141
|
}));
|
|
142
|
+
const getHasScrollableContent = scrollableContainer => scrollableContainer.scrollHeight > scrollableContainer.clientHeight;
|
|
96
143
|
const SideNav = ({
|
|
97
144
|
navHeaderText,
|
|
98
145
|
isCollapsible,
|
|
99
146
|
onCollapse,
|
|
100
147
|
onExpand,
|
|
101
148
|
sideNavItems,
|
|
102
|
-
|
|
149
|
+
expandedWidth = DEFAULT_SIDE_NAV_WIDTH,
|
|
150
|
+
footerItems,
|
|
151
|
+
footerComponent,
|
|
152
|
+
logo
|
|
103
153
|
}) => {
|
|
104
154
|
const [isSideNavCollapsed, setSideNavCollapsed] = useState(false);
|
|
105
155
|
const odysseyDesignTokens = useOdysseyDesignTokens();
|
|
156
|
+
const [isContentScrollable, setIsContentScrollable] = useState(false);
|
|
157
|
+
const [hasContentScrolled, setHasContentScrolled] = useState(false);
|
|
158
|
+
const scrollableContentRef = useRef(null);
|
|
159
|
+
const resizeObserverRef = useRef(null);
|
|
160
|
+
const intersectionObserverRef = useRef(null);
|
|
161
|
+
useEffect(() => {
|
|
162
|
+
const updateIsContentScrollable = () => {
|
|
163
|
+
if (scrollableContentRef.current && scrollableContentRef.current.parentElement) {
|
|
164
|
+
setIsContentScrollable(getHasScrollableContent(scrollableContentRef.current.parentElement));
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
let resizeObserverDebounceTimer;
|
|
168
|
+
if (!resizeObserverRef.current) {
|
|
169
|
+
resizeObserverRef.current = new ResizeObserver(() => {
|
|
170
|
+
cancelAnimationFrame(resizeObserverDebounceTimer);
|
|
171
|
+
resizeObserverDebounceTimer = requestAnimationFrame(updateIsContentScrollable);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
if (resizeObserverRef.current && scrollableContentRef.current) {
|
|
175
|
+
resizeObserverRef.current.observe(scrollableContentRef.current);
|
|
176
|
+
if (scrollableContentRef.current.parentElement) {
|
|
177
|
+
resizeObserverRef.current.observe(scrollableContentRef.current.parentElement);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
updateIsContentScrollable();
|
|
181
|
+
if (!intersectionObserverRef.current && scrollableContentRef.current) {
|
|
182
|
+
intersectionObserverRef.current = new IntersectionObserver(entries => {
|
|
183
|
+
const isIntersecting = entries.slice().sort((a, b) => a.time - b.time).at(0)?.isIntersecting;
|
|
184
|
+
setHasContentScrolled(!isIntersecting);
|
|
185
|
+
}, {
|
|
186
|
+
root: scrollableContentRef.current.parentElement,
|
|
187
|
+
threshold: 1.0
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
if (intersectionObserverRef.current && scrollableContentRef.current) {
|
|
191
|
+
const ul = scrollableContentRef.current;
|
|
192
|
+
const li = ul?.firstChild;
|
|
193
|
+
intersectionObserverRef.current.observe(li);
|
|
194
|
+
}
|
|
195
|
+
return () => {
|
|
196
|
+
if (resizeObserverRef.current) {
|
|
197
|
+
resizeObserverRef.current.disconnect();
|
|
198
|
+
resizeObserverRef.current = null;
|
|
199
|
+
}
|
|
200
|
+
if (intersectionObserverRef.current) {
|
|
201
|
+
intersectionObserverRef.current.disconnect();
|
|
202
|
+
intersectionObserverRef.current = null;
|
|
203
|
+
}
|
|
204
|
+
cancelAnimationFrame(resizeObserverDebounceTimer);
|
|
205
|
+
};
|
|
206
|
+
}, []);
|
|
106
207
|
const scrollIntoViewRef = useRef(null);
|
|
107
208
|
const firstSideNavItemIdWithIsSelected = useMemo(() => {
|
|
108
209
|
const flattenedItems = sideNavItems.flatMap(sideNavItem => sideNavItem.children ? [sideNavItem, ...sideNavItem.children] : sideNavItem);
|
|
@@ -137,29 +238,12 @@ const SideNav = ({
|
|
|
137
238
|
onExpand?.();
|
|
138
239
|
}
|
|
139
240
|
}, [isSideNavCollapsed, setSideNavCollapsed, onExpand]);
|
|
140
|
-
const sideNavStyles = useMemo(() => ({
|
|
141
|
-
display: "flex",
|
|
142
|
-
height: "100vh"
|
|
143
|
-
}), []);
|
|
144
|
-
const sideNavHeaderContainerStyles = useMemo(() => ({
|
|
145
|
-
position: "sticky",
|
|
146
|
-
top: 0
|
|
147
|
-
}), []);
|
|
148
|
-
const sideNavListContainerStyles = useMemo(() => ({
|
|
149
|
-
flex: 1,
|
|
150
|
-
overflowY: "auto"
|
|
151
|
-
}), []);
|
|
152
|
-
const sideNavFooterContainerStyles = useMemo(() => ({
|
|
153
|
-
position: "sticky",
|
|
154
|
-
bottom: 0,
|
|
155
|
-
paddingTop: odysseyDesignTokens.Spacing2
|
|
156
|
-
}), [odysseyDesignTokens]);
|
|
157
241
|
const expandLeftIconStyles = useMemo(() => ({
|
|
158
242
|
fontSize: "1em",
|
|
159
243
|
margin: `0 ${odysseyDesignTokens.Spacing1}`
|
|
160
244
|
}), [odysseyDesignTokens]);
|
|
161
|
-
return _jsxs(
|
|
162
|
-
|
|
245
|
+
return _jsxs(SideNavContainer, {
|
|
246
|
+
expandedWidth: expandedWidth,
|
|
163
247
|
children: [_jsx(SideNavCollapsedContainer, {
|
|
164
248
|
tabIndex: 0,
|
|
165
249
|
role: "button",
|
|
@@ -176,17 +260,21 @@ const SideNav = ({
|
|
|
176
260
|
odysseyDesignTokens: odysseyDesignTokens,
|
|
177
261
|
isSideNavCollapsed: isSideNavCollapsed,
|
|
178
262
|
"data-se": "expanded-region",
|
|
179
|
-
|
|
180
|
-
|
|
263
|
+
expandedWidth: expandedWidth,
|
|
264
|
+
"aria-label": navHeaderText,
|
|
265
|
+
children: [_jsx(SideNavHeaderContainer, {
|
|
266
|
+
odysseyDesignTokens: odysseyDesignTokens,
|
|
267
|
+
hasContentScrolled: hasContentScrolled,
|
|
181
268
|
children: _jsx(SideNavHeader, {
|
|
269
|
+
logo: logo || _jsx(OktaLogo, {}),
|
|
182
270
|
navHeaderText: navHeaderText,
|
|
183
271
|
isCollapsible: isCollapsible,
|
|
184
272
|
onCollapse: sideNavCollapseHandler
|
|
185
273
|
})
|
|
186
|
-
}), _jsx(
|
|
187
|
-
|
|
188
|
-
testId: "scrollable-region",
|
|
274
|
+
}), _jsx(SideNavScrollableContainer, {
|
|
275
|
+
"data-se": "scrollable-region",
|
|
189
276
|
children: _jsx(SideNavListContainer, {
|
|
277
|
+
ref: scrollableContentRef,
|
|
190
278
|
children: processedSideNavItems?.map(item => {
|
|
191
279
|
const {
|
|
192
280
|
id,
|
|
@@ -228,14 +316,15 @@ const SideNav = ({
|
|
|
228
316
|
}
|
|
229
317
|
})
|
|
230
318
|
})
|
|
231
|
-
}), footerItems &&
|
|
232
|
-
|
|
233
|
-
|
|
319
|
+
}), (footerItems || footerComponent) && _jsxs(SideNavFooter, {
|
|
320
|
+
odysseyDesignTokens: odysseyDesignTokens,
|
|
321
|
+
isContentScrollable: isContentScrollable,
|
|
322
|
+
children: [footerComponent, footerItems && !footerComponent && _jsx(SideNavFooterItemsContainer, {
|
|
234
323
|
odysseyDesignTokens: odysseyDesignTokens,
|
|
235
324
|
children: _jsx(SideNavFooterContent, {
|
|
236
325
|
footerItems: footerItems
|
|
237
326
|
})
|
|
238
|
-
})
|
|
327
|
+
})]
|
|
239
328
|
})]
|
|
240
329
|
})]
|
|
241
330
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SideNav.js","names":["styled","memo","useMemo","useState","useCallback","useRef","useEffect","Box","ExpandLeftIcon","NavAccordion","useOdysseyDesignTokens","SideNavHeader","SideNavItemContent","SideNavListItemContainer","SideNavFooterContent","jsx","_jsx","jsxs","_jsxs","SideNavCollapsedContainer","shouldForwardProp","prop","odysseyDesignTokens","isSideNavCollapsed","backgroundColor","HueNeutral300","paddingTop","Spacing5","cursor","width","opacity","visibility","transitionProperty","transitionDuration","TransitionDurationMain","transitionTimingFunction","TransitionTimingMain","SideNavExpandContainer","HueNeutralWhite","flexDirection","display","SideNavListContainer","ul","padding","listStyle","listStyleType","SectionHeader","fontSize","TypographySizeOverline","fontWeight","TypographyWeightHeadingBold","color","HueNeutral600","Spacing3","paddingBottom","paddingLeft","Spacing4","textTransform","SideNavFooterContainer","Spacing2","justifyContent","flexWrap","alignItems","TypographyColorHeading","textDecoration","SideNav","navHeaderText","isCollapsible","onCollapse","onExpand","sideNavItems","footerItems","setSideNavCollapsed","scrollIntoViewRef","firstSideNavItemIdWithIsSelected","flattenedItems","flatMap","sideNavItem","children","firstItemWithIsSelected","find","isSelected","id","current","scrollIntoView","getRefIfThisIsFirstNodeWithIsSelected","itemId","undefined","processedSideNavItems","map","item","childProps","scrollRef","sideNavCollapseHandler","sideNavExpandClickHandler","sideNavExpandKeyHandler","event","key","code","preventDefault","sideNavStyles","height","sideNavHeaderContainerStyles","position","top","sideNavListContainerStyles","flex","overflowY","sideNavFooterContainerStyles","bottom","expandLeftIconStyles","margin","Spacing1","sx","tabIndex","role","onClick","onKeyDown","testId","label","isSectionHeader","startIcon","isDefaultExpanded","isDisabled","isExpanded","MemoizedSideNav","displayName"],"sources":["../../../src/labs/SideNav/SideNav.tsx"],"sourcesContent":["/*!\n * Copyright (c) 2022-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport styled from \"@emotion/styled\";\nimport {\n memo,\n useMemo,\n useState,\n useCallback,\n KeyboardEvent,\n useRef,\n useEffect,\n} from \"react\";\n\nimport { Box } from \"../../Box\";\nimport { ExpandLeftIcon } from \"../../icons.generated\";\nimport { NavAccordion } from \"../NavAccordion\";\nimport {\n DesignTokens,\n useOdysseyDesignTokens,\n} from \"../../OdysseyDesignTokensContext\";\nimport type { SideNavProps } from \"./types\";\nimport { SideNavHeader } from \"./SideNavHeader\";\nimport {\n SideNavItemContent,\n SideNavListItemContainer,\n} from \"./SideNavItemContent\";\nimport { SideNavFooterContent } from \"./SideNavFooterContent\";\n\nconst SideNavCollapsedContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"isSideNavCollapsed\",\n})(\n ({\n odysseyDesignTokens,\n isSideNavCollapsed,\n }: {\n odysseyDesignTokens: DesignTokens;\n isSideNavCollapsed: boolean;\n }) => ({\n backgroundColor: odysseyDesignTokens.HueNeutral300,\n paddingTop: odysseyDesignTokens.Spacing5,\n cursor: \"pointer\",\n width: isSideNavCollapsed ? \"auto\" : 0,\n opacity: isSideNavCollapsed ? 1 : 0,\n visibility: isSideNavCollapsed ? \"visible\" : \"hidden\",\n transitionProperty: \"opacity\",\n transitionDuration: odysseyDesignTokens.TransitionDurationMain,\n transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain,\n }),\n);\n\nconst SideNavExpandContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"isSideNavCollapsed\",\n})(\n ({\n odysseyDesignTokens,\n isSideNavCollapsed,\n }: {\n odysseyDesignTokens: DesignTokens;\n isSideNavCollapsed: boolean;\n }) => ({\n backgroundColor: odysseyDesignTokens.HueNeutralWhite,\n flexDirection: \"column\",\n display: \"flex\",\n opacity: isSideNavCollapsed ? 0 : 1,\n visibility: isSideNavCollapsed ? \"hidden\" : \"visible\",\n width: isSideNavCollapsed ? \"0\" : \"100%\",\n transitionProperty: \"opacity, width\",\n transitionDuration: odysseyDesignTokens.TransitionDurationMain,\n transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain,\n }),\n);\n\nconst SideNavListContainer = styled.ul({\n padding: 0,\n listStyle: \"none\",\n listStyleType: \"none\",\n});\n\nconst SectionHeader = styled(\"li\", {\n shouldForwardProp: (prop) => prop !== \"odysseyDesignTokens\",\n})(({ odysseyDesignTokens }: { odysseyDesignTokens: DesignTokens }) => ({\n fontSize: odysseyDesignTokens.TypographySizeOverline,\n fontWeight: odysseyDesignTokens.TypographyWeightHeadingBold,\n color: odysseyDesignTokens.HueNeutral600,\n paddingTop: odysseyDesignTokens.Spacing3,\n paddingBottom: odysseyDesignTokens.Spacing3,\n paddingLeft: odysseyDesignTokens.Spacing4,\n textTransform: \"uppercase\",\n}));\n\nconst SideNavFooterContainer = styled(\"div\", {\n shouldForwardProp: (prop) => prop !== \"odysseyDesignTokens\",\n})(({ odysseyDesignTokens }: { odysseyDesignTokens: DesignTokens }) => ({\n paddingTop: odysseyDesignTokens.Spacing2,\n paddingBottom: odysseyDesignTokens.Spacing2,\n display: \"flex\",\n justifyContent: \"center\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n fontSize: odysseyDesignTokens.TypographySizeOverline,\n \"& a\": {\n color: `${odysseyDesignTokens.TypographyColorHeading} !important`,\n },\n \"& a:hover\": {\n textDecoration: \"none\",\n },\n \"& a:visited\": {\n color: odysseyDesignTokens.TypographyColorHeading,\n },\n}));\n\nconst SideNav = ({\n navHeaderText,\n isCollapsible,\n onCollapse,\n onExpand,\n sideNavItems,\n footerItems,\n}: SideNavProps) => {\n const [isSideNavCollapsed, setSideNavCollapsed] = useState(false);\n const odysseyDesignTokens = useOdysseyDesignTokens();\n\n const scrollIntoViewRef = useRef<HTMLLIElement>(null);\n /**\n * Look through the sideNavItems and determine which is the first node\n * with isSelected. This should be the node we set a ref on in order to\n * call scrollIntoView in the effect\n */\n const firstSideNavItemIdWithIsSelected = useMemo(() => {\n const flattenedItems = sideNavItems.flatMap((sideNavItem) =>\n sideNavItem.children\n ? [sideNavItem, ...sideNavItem.children]\n : sideNavItem,\n );\n const firstItemWithIsSelected = flattenedItems.find(\n (sideNavItem) => sideNavItem.isSelected,\n );\n return firstItemWithIsSelected?.id;\n }, [sideNavItems]);\n /**\n * Once we've rendered and if we have an item to scroll to, do the scroll action.\n * This must rely on checking firstSideNavItemIdWithIsSelected or it will not run\n * once the actual ref is populated.\n */\n useEffect(() => {\n if (firstSideNavItemIdWithIsSelected && scrollIntoViewRef.current) {\n scrollIntoViewRef.current.scrollIntoView();\n }\n }, [firstSideNavItemIdWithIsSelected, scrollIntoViewRef]);\n\n /**\n * We only want to put a ref on a node iff it is the first selected node.\n * This function returns the ref only if the ID provided matches the first\n * selected node, otherwise returns undefined (so that the node has no ref)\n */\n const getRefIfThisIsFirstNodeWithIsSelected = useCallback(\n (itemId: string) =>\n itemId === firstSideNavItemIdWithIsSelected\n ? scrollIntoViewRef\n : undefined,\n [firstSideNavItemIdWithIsSelected],\n );\n\n const processedSideNavItems = useMemo(\n () =>\n sideNavItems.map((item) => ({\n ...item,\n children: item.children?.map((childProps) => (\n <SideNavItemContent\n key={childProps.id}\n scrollRef={getRefIfThisIsFirstNodeWithIsSelected(childProps.id)}\n {...childProps}\n />\n )),\n })),\n [getRefIfThisIsFirstNodeWithIsSelected, sideNavItems],\n );\n\n const sideNavCollapseHandler = useCallback(() => {\n setSideNavCollapsed(!isSideNavCollapsed);\n onCollapse?.();\n }, [isSideNavCollapsed, setSideNavCollapsed, onCollapse]);\n\n const sideNavExpandClickHandler = useCallback(() => {\n setSideNavCollapsed(!isSideNavCollapsed);\n onExpand?.();\n }, [isSideNavCollapsed, setSideNavCollapsed, onExpand]);\n\n const sideNavExpandKeyHandler = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (event?.key === \"Enter\" || event?.code === \"Space\") {\n event.preventDefault();\n setSideNavCollapsed(!isSideNavCollapsed);\n onExpand?.();\n }\n },\n [isSideNavCollapsed, setSideNavCollapsed, onExpand],\n );\n\n const sideNavStyles = useMemo(\n () => ({\n display: \"flex\",\n height: \"100vh\",\n }),\n [],\n );\n\n const sideNavHeaderContainerStyles = useMemo(\n () => ({\n position: \"sticky\",\n top: 0,\n }),\n [],\n );\n\n const sideNavListContainerStyles = useMemo(\n () => ({\n flex: 1,\n overflowY: \"auto\",\n }),\n [],\n );\n\n const sideNavFooterContainerStyles = useMemo(\n () => ({\n position: \"sticky\",\n bottom: 0,\n paddingTop: odysseyDesignTokens.Spacing2,\n }),\n [odysseyDesignTokens],\n );\n\n const expandLeftIconStyles = useMemo(\n () => ({\n fontSize: \"1em\",\n margin: `0 ${odysseyDesignTokens.Spacing1}`,\n }),\n [odysseyDesignTokens],\n );\n\n return (\n <Box sx={sideNavStyles}>\n <SideNavCollapsedContainer\n tabIndex={0}\n role=\"button\"\n odysseyDesignTokens={odysseyDesignTokens}\n isSideNavCollapsed={isSideNavCollapsed}\n onClick={sideNavExpandClickHandler}\n onKeyDown={sideNavExpandKeyHandler}\n data-se=\"collapsed-region\"\n data-aria-label=\"expand side navigation\"\n >\n <ExpandLeftIcon sx={expandLeftIconStyles} />\n </SideNavCollapsedContainer>\n <SideNavExpandContainer\n odysseyDesignTokens={odysseyDesignTokens}\n isSideNavCollapsed={isSideNavCollapsed}\n data-se=\"expanded-region\"\n >\n <Box sx={sideNavHeaderContainerStyles}>\n <SideNavHeader\n navHeaderText={navHeaderText}\n isCollapsible={isCollapsible}\n onCollapse={sideNavCollapseHandler}\n />\n </Box>\n <Box sx={sideNavListContainerStyles} testId=\"scrollable-region\">\n <SideNavListContainer>\n {processedSideNavItems?.map((item) => {\n const {\n id,\n label,\n isSectionHeader,\n startIcon,\n children,\n isDefaultExpanded,\n isDisabled,\n isExpanded,\n } = item;\n\n if (isSectionHeader) {\n return (\n <SectionHeader\n id={id}\n key={id}\n odysseyDesignTokens={odysseyDesignTokens}\n >\n {label}\n </SectionHeader>\n );\n } else if (children) {\n return (\n <SideNavListItemContainer\n id={id}\n key={id}\n odysseyDesignTokens={odysseyDesignTokens}\n >\n <NavAccordion\n label={label}\n isDefaultExpanded={isDefaultExpanded}\n isExpanded={isExpanded}\n startIcon={startIcon}\n isDisabled={isDisabled}\n >\n <SideNavListContainer id={`${id}-list`}>\n {children}\n </SideNavListContainer>\n </NavAccordion>\n </SideNavListItemContainer>\n );\n } else {\n return (\n <SideNavItemContent\n key={item.id}\n scrollRef={getRefIfThisIsFirstNodeWithIsSelected(item.id)}\n {...item}\n />\n );\n }\n })}\n </SideNavListContainer>\n </Box>\n {footerItems && (\n <Box sx={sideNavFooterContainerStyles}>\n <SideNavFooterContainer odysseyDesignTokens={odysseyDesignTokens}>\n <SideNavFooterContent footerItems={footerItems} />\n </SideNavFooterContainer>\n </Box>\n )}\n </SideNavExpandContainer>\n </Box>\n );\n};\n\nconst MemoizedSideNav = memo(SideNav);\nMemoizedSideNav.displayName = \"SideNav\";\n\nexport { MemoizedSideNav as SideNav };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SideNav.js","names":["styled","memo","useMemo","useState","useCallback","useRef","useEffect","ExpandLeftIcon","NavAccordion","useOdysseyDesignTokens","OktaLogo","SideNavHeader","SideNavItemContent","SideNavListItemContainer","SideNavFooterContent","jsx","_jsx","jsxs","_jsxs","DEFAULT_SIDE_NAV_WIDTH","SideNavContainer","shouldForwardProp","prop","expandedWidth","display","height","maxWidth","overflow","SideNavCollapsedContainer","odysseyDesignTokens","isSideNavCollapsed","backgroundColor","HueNeutral300","paddingTop","Spacing5","cursor","width","opacity","visibility","transitionProperty","transitionDuration","TransitionDurationMain","transitionTimingFunction","TransitionTimingMain","SideNavExpandContainer","HueNeutralWhite","flexDirection","borderRight","BorderWidthMain","BorderStyleMain","HueNeutral50","SideNavHeaderContainer","hasContentScrolled","position","top","borderBottom","SideNavListContainer","ul","padding","listStyle","listStyleType","SideNavScrollableContainer","div","flex","overflowY","SectionHeader","fontFamily","TypographyFamilyHeading","fontSize","TypographySizeOverline","fontWeight","TypographyWeightHeadingBold","color","HueNeutral600","Spacing3","paddingBottom","paddingLeft","Spacing4","textTransform","SideNavFooter","isContentScrollable","bottom","Spacing2","transitionTiming","boxShadow","DepthHigh","SideNavFooterItemsContainer","justifyContent","flexWrap","alignItems","TypographyColorHeading","textDecoration","getHasScrollableContent","scrollableContainer","scrollHeight","clientHeight","SideNav","navHeaderText","isCollapsible","onCollapse","onExpand","sideNavItems","footerItems","footerComponent","logo","setSideNavCollapsed","setIsContentScrollable","setHasContentScrolled","scrollableContentRef","resizeObserverRef","intersectionObserverRef","updateIsContentScrollable","current","parentElement","resizeObserverDebounceTimer","ResizeObserver","cancelAnimationFrame","requestAnimationFrame","observe","IntersectionObserver","entries","isIntersecting","slice","sort","a","b","time","at","root","threshold","li","firstChild","disconnect","scrollIntoViewRef","firstSideNavItemIdWithIsSelected","flattenedItems","flatMap","sideNavItem","children","firstItemWithIsSelected","find","isSelected","id","scrollIntoView","getRefIfThisIsFirstNodeWithIsSelected","itemId","undefined","processedSideNavItems","map","item","childProps","scrollRef","sideNavCollapseHandler","sideNavExpandClickHandler","sideNavExpandKeyHandler","event","key","code","preventDefault","expandLeftIconStyles","margin","Spacing1","tabIndex","role","onClick","onKeyDown","sx","ref","label","isSectionHeader","startIcon","isDefaultExpanded","isDisabled","isExpanded","MemoizedSideNav","displayName"],"sources":["../../../src/labs/SideNav/SideNav.tsx"],"sourcesContent":["/*!\n * Copyright (c) 2022-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport styled from \"@emotion/styled\";\nimport {\n memo,\n useMemo,\n useState,\n useCallback,\n KeyboardEvent,\n useRef,\n useEffect,\n} from \"react\";\n\nimport { ExpandLeftIcon } from \"../../icons.generated\";\nimport { NavAccordion } from \"../NavAccordion\";\nimport {\n DesignTokens,\n useOdysseyDesignTokens,\n} from \"../../OdysseyDesignTokensContext\";\nimport type { SideNavProps } from \"./types\";\nimport { OktaLogo } from \"./OktaLogo\";\nimport { SideNavHeader } from \"./SideNavHeader\";\nimport {\n SideNavItemContent,\n SideNavListItemContainer,\n} from \"./SideNavItemContent\";\nimport { SideNavFooterContent } from \"./SideNavFooterContent\";\n\nexport const DEFAULT_SIDE_NAV_WIDTH = \"300px\";\n\nconst SideNavContainer = styled(\"div\", {\n shouldForwardProp: (prop) => prop !== \"expandedWidth\",\n})(({ expandedWidth }: { expandedWidth: SideNavProps[\"expandedWidth\"] }) => ({\n display: \"flex\",\n height: \"100%\",\n maxWidth: expandedWidth,\n overflow: \"hidden\",\n}));\n\nconst SideNavCollapsedContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"isSideNavCollapsed\",\n})(\n ({\n odysseyDesignTokens,\n isSideNavCollapsed,\n }: {\n odysseyDesignTokens: DesignTokens;\n isSideNavCollapsed: boolean;\n }) => ({\n backgroundColor: odysseyDesignTokens.HueNeutral300,\n paddingTop: odysseyDesignTokens.Spacing5,\n cursor: \"pointer\",\n width: isSideNavCollapsed ? \"auto\" : 0,\n opacity: isSideNavCollapsed ? 1 : 0,\n visibility: isSideNavCollapsed ? \"visible\" : \"hidden\",\n transitionProperty: \"opacity\",\n transitionDuration: odysseyDesignTokens.TransitionDurationMain,\n transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain,\n }),\n);\n\nconst SideNavExpandContainer = styled(\"nav\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" &&\n prop !== \"isSideNavCollapsed\" &&\n prop !== \"expandedWidth\",\n})(\n ({\n odysseyDesignTokens,\n isSideNavCollapsed,\n expandedWidth,\n }: {\n odysseyDesignTokens: DesignTokens;\n isSideNavCollapsed: boolean;\n expandedWidth: string;\n }) => ({\n backgroundColor: odysseyDesignTokens.HueNeutralWhite,\n flexDirection: \"column\",\n display: \"flex\",\n opacity: isSideNavCollapsed ? 0 : 1,\n visibility: isSideNavCollapsed ? \"hidden\" : \"visible\",\n width: isSideNavCollapsed ? \"0\" : expandedWidth,\n transitionProperty: \"opacity, width\",\n transitionDuration: odysseyDesignTokens.TransitionDurationMain,\n transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain,\n borderRight: `${odysseyDesignTokens.BorderWidthMain} ${odysseyDesignTokens.BorderStyleMain} ${odysseyDesignTokens.HueNeutral50}`,\n }),\n);\n\nconst SideNavHeaderContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"hasContentScrolled\" && prop !== \"odysseyDesignTokens\",\n})(\n ({\n hasContentScrolled,\n odysseyDesignTokens,\n }: {\n hasContentScrolled: boolean;\n odysseyDesignTokens: DesignTokens;\n }) => ({\n position: \"sticky\",\n top: 0,\n // The bottom border should appear only if the scrollable region has been scrolled\n ...(hasContentScrolled && {\n borderBottom: `${odysseyDesignTokens.BorderWidthMain} ${odysseyDesignTokens.BorderStyleMain} ${odysseyDesignTokens.HueNeutral50}`,\n }),\n }),\n);\n\nconst SideNavListContainer = styled.ul({\n padding: 0,\n listStyle: \"none\",\n listStyleType: \"none\",\n});\n\nconst SideNavScrollableContainer = styled.div({\n flex: 1,\n overflowY: \"auto\",\n});\n\nconst SectionHeader = styled(\"li\", {\n shouldForwardProp: (prop) => prop !== \"odysseyDesignTokens\",\n})(({ odysseyDesignTokens }: { odysseyDesignTokens: DesignTokens }) => ({\n fontFamily: odysseyDesignTokens.TypographyFamilyHeading,\n fontSize: odysseyDesignTokens.TypographySizeOverline,\n fontWeight: odysseyDesignTokens.TypographyWeightHeadingBold,\n color: odysseyDesignTokens.HueNeutral600,\n paddingTop: odysseyDesignTokens.Spacing3,\n paddingBottom: odysseyDesignTokens.Spacing3,\n paddingLeft: odysseyDesignTokens.Spacing4,\n textTransform: \"uppercase\",\n}));\n\nconst SideNavFooter = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"isContentScrollable\" && prop !== \"odysseyDesignTokens\",\n})(\n ({\n isContentScrollable,\n odysseyDesignTokens,\n }: {\n isContentScrollable: boolean;\n odysseyDesignTokens: DesignTokens;\n }) => ({\n position: \"sticky\",\n bottom: 0,\n paddingTop: odysseyDesignTokens.Spacing2,\n transitionProperty: \"box-shadow\",\n transitionDuration: odysseyDesignTokens.TransitionDurationMain,\n transitionTiming: odysseyDesignTokens.TransitionTimingMain,\n // The box shadow should appear above the footer only if the scrollable region has overflow\n ...(isContentScrollable && {\n boxShadow: odysseyDesignTokens.DepthHigh,\n }),\n }),\n);\n\nconst SideNavFooterItemsContainer = styled(\"div\", {\n shouldForwardProp: (prop) => prop !== \"odysseyDesignTokens\",\n})(({ odysseyDesignTokens }: { odysseyDesignTokens: DesignTokens }) => ({\n paddingTop: odysseyDesignTokens.Spacing2,\n paddingBottom: odysseyDesignTokens.Spacing2,\n display: \"flex\",\n justifyContent: \"center\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n fontSize: odysseyDesignTokens.TypographySizeOverline,\n \"& a\": {\n color: `${odysseyDesignTokens.TypographyColorHeading} !important`,\n },\n \"& a:hover\": {\n textDecoration: \"none\",\n },\n \"& a:visited\": {\n color: odysseyDesignTokens.TypographyColorHeading,\n },\n}));\n\nconst getHasScrollableContent = (scrollableContainer: HTMLElement) =>\n scrollableContainer.scrollHeight > scrollableContainer.clientHeight;\n\nconst SideNav = ({\n navHeaderText,\n isCollapsible,\n onCollapse,\n onExpand,\n sideNavItems,\n expandedWidth = DEFAULT_SIDE_NAV_WIDTH,\n footerItems,\n footerComponent,\n logo,\n}: SideNavProps) => {\n const [isSideNavCollapsed, setSideNavCollapsed] = useState(false);\n const odysseyDesignTokens = useOdysseyDesignTokens();\n const [isContentScrollable, setIsContentScrollable] = useState(false);\n const [hasContentScrolled, setHasContentScrolled] = useState(false);\n const scrollableContentRef = useRef<HTMLUListElement>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const intersectionObserverRef = useRef<IntersectionObserver | null>(null);\n\n useEffect(() => {\n const updateIsContentScrollable = () => {\n if (\n scrollableContentRef.current &&\n scrollableContentRef.current.parentElement\n ) {\n setIsContentScrollable(\n getHasScrollableContent(scrollableContentRef.current.parentElement),\n );\n }\n };\n\n // If the window is resized, we may need to re-determine if the scrollable container has overflow\n // Setup a ResizeObserver to know if the size of the scrollableContent changes\n let resizeObserverDebounceTimer: ReturnType<typeof requestAnimationFrame>;\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n cancelAnimationFrame(resizeObserverDebounceTimer);\n resizeObserverDebounceTimer = requestAnimationFrame(\n updateIsContentScrollable,\n );\n });\n }\n\n if (resizeObserverRef.current && scrollableContentRef.current) {\n // Observe the <ul> itself (in case it changes size due to the content expanding)\n resizeObserverRef.current.observe(scrollableContentRef.current);\n if (scrollableContentRef.current.parentElement) {\n // ALSO observe the parent (<SideNavScrollableContainer>) in case the window resizes\n resizeObserverRef.current.observe(\n scrollableContentRef.current.parentElement,\n );\n }\n }\n\n // Determine if the scrollable container has overflow or not on load\n updateIsContentScrollable();\n\n // Finally, we only want to have the border on the bottom of the header iff the user has scrolled\n // the scrollable container\n if (!intersectionObserverRef.current && scrollableContentRef.current) {\n intersectionObserverRef.current = new IntersectionObserver(\n (entries) => {\n // If isIntersecting is true, then we're at the top of the scroll container\n // If isIntersecting is false, some scrolling has occurred.\n // The entries must be sorted by time and we only really need to look at the latest one\n const isIntersecting = entries\n .slice()\n .sort((a, b) => a.time - b.time)\n .at(0)?.isIntersecting;\n setHasContentScrolled(!isIntersecting);\n },\n {\n root: scrollableContentRef.current.parentElement,\n threshold: 1.0,\n },\n );\n }\n if (intersectionObserverRef.current && scrollableContentRef.current) {\n const ul = scrollableContentRef.current;\n const li = ul?.firstChild;\n intersectionObserverRef.current.observe(li as HTMLElement);\n }\n\n // Cleanup when unmounted:\n return () => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n resizeObserverRef.current = null;\n }\n if (intersectionObserverRef.current) {\n intersectionObserverRef.current.disconnect();\n intersectionObserverRef.current = null;\n }\n cancelAnimationFrame(resizeObserverDebounceTimer); // Ensure timer is cleared on component unmount\n };\n }, []);\n\n const scrollIntoViewRef = useRef<HTMLLIElement>(null);\n /**\n * Look through the sideNavItems and determine which is the first node\n * with isSelected. This should be the node we set a ref on in order to\n * call scrollIntoView in the effect\n */\n const firstSideNavItemIdWithIsSelected = useMemo(() => {\n const flattenedItems = sideNavItems.flatMap((sideNavItem) =>\n sideNavItem.children\n ? [sideNavItem, ...sideNavItem.children]\n : sideNavItem,\n );\n const firstItemWithIsSelected = flattenedItems.find(\n (sideNavItem) => sideNavItem.isSelected,\n );\n return firstItemWithIsSelected?.id;\n }, [sideNavItems]);\n /**\n * Once we've rendered and if we have an item to scroll to, do the scroll action.\n * This must rely on checking firstSideNavItemIdWithIsSelected or it will not run\n * once the actual ref is populated.\n */\n useEffect(() => {\n if (firstSideNavItemIdWithIsSelected && scrollIntoViewRef.current) {\n scrollIntoViewRef.current.scrollIntoView();\n }\n }, [firstSideNavItemIdWithIsSelected, scrollIntoViewRef]);\n\n /**\n * We only want to put a ref on a node iff it is the first selected node.\n * This function returns the ref only if the ID provided matches the first\n * selected node, otherwise returns undefined (so that the node has no ref)\n */\n const getRefIfThisIsFirstNodeWithIsSelected = useCallback(\n (itemId: string) =>\n itemId === firstSideNavItemIdWithIsSelected\n ? scrollIntoViewRef\n : undefined,\n [firstSideNavItemIdWithIsSelected],\n );\n\n const processedSideNavItems = useMemo(\n () =>\n sideNavItems.map((item) => ({\n ...item,\n children: item.children?.map((childProps) => (\n <SideNavItemContent\n key={childProps.id}\n scrollRef={getRefIfThisIsFirstNodeWithIsSelected(childProps.id)}\n {...childProps}\n />\n )),\n })),\n [getRefIfThisIsFirstNodeWithIsSelected, sideNavItems],\n );\n\n const sideNavCollapseHandler = useCallback(() => {\n setSideNavCollapsed(!isSideNavCollapsed);\n onCollapse?.();\n }, [isSideNavCollapsed, setSideNavCollapsed, onCollapse]);\n\n const sideNavExpandClickHandler = useCallback(() => {\n setSideNavCollapsed(!isSideNavCollapsed);\n onExpand?.();\n }, [isSideNavCollapsed, setSideNavCollapsed, onExpand]);\n\n const sideNavExpandKeyHandler = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (event?.key === \"Enter\" || event?.code === \"Space\") {\n event.preventDefault();\n setSideNavCollapsed(!isSideNavCollapsed);\n onExpand?.();\n }\n },\n [isSideNavCollapsed, setSideNavCollapsed, onExpand],\n );\n\n const expandLeftIconStyles = useMemo(\n () => ({\n fontSize: \"1em\",\n margin: `0 ${odysseyDesignTokens.Spacing1}`,\n }),\n [odysseyDesignTokens],\n );\n\n return (\n <SideNavContainer expandedWidth={expandedWidth}>\n <SideNavCollapsedContainer\n tabIndex={0}\n role=\"button\"\n odysseyDesignTokens={odysseyDesignTokens}\n isSideNavCollapsed={isSideNavCollapsed}\n onClick={sideNavExpandClickHandler}\n onKeyDown={sideNavExpandKeyHandler}\n data-se=\"collapsed-region\"\n data-aria-label=\"expand side navigation\"\n >\n <ExpandLeftIcon sx={expandLeftIconStyles} />\n </SideNavCollapsedContainer>\n <SideNavExpandContainer\n odysseyDesignTokens={odysseyDesignTokens}\n isSideNavCollapsed={isSideNavCollapsed}\n data-se=\"expanded-region\"\n expandedWidth={expandedWidth}\n aria-label={navHeaderText}\n >\n <SideNavHeaderContainer\n odysseyDesignTokens={odysseyDesignTokens}\n hasContentScrolled={hasContentScrolled}\n >\n <SideNavHeader\n logo={logo || <OktaLogo />}\n navHeaderText={navHeaderText}\n isCollapsible={isCollapsible}\n onCollapse={sideNavCollapseHandler}\n />\n </SideNavHeaderContainer>\n <SideNavScrollableContainer data-se=\"scrollable-region\">\n <SideNavListContainer ref={scrollableContentRef}>\n {processedSideNavItems?.map((item) => {\n const {\n id,\n label,\n isSectionHeader,\n startIcon,\n children,\n isDefaultExpanded,\n isDisabled,\n isExpanded,\n } = item;\n\n if (isSectionHeader) {\n return (\n <SectionHeader\n id={id}\n key={id}\n odysseyDesignTokens={odysseyDesignTokens}\n >\n {label}\n </SectionHeader>\n );\n } else if (children) {\n return (\n <SideNavListItemContainer\n id={id}\n key={id}\n odysseyDesignTokens={odysseyDesignTokens}\n >\n <NavAccordion\n label={label}\n isDefaultExpanded={isDefaultExpanded}\n isExpanded={isExpanded}\n startIcon={startIcon}\n isDisabled={isDisabled}\n >\n <SideNavListContainer id={`${id}-list`}>\n {children}\n </SideNavListContainer>\n </NavAccordion>\n </SideNavListItemContainer>\n );\n } else {\n return (\n <SideNavItemContent\n key={item.id}\n scrollRef={getRefIfThisIsFirstNodeWithIsSelected(item.id)}\n {...item}\n />\n );\n }\n })}\n </SideNavListContainer>\n </SideNavScrollableContainer>\n {(footerItems || footerComponent) && (\n <SideNavFooter\n odysseyDesignTokens={odysseyDesignTokens}\n isContentScrollable={isContentScrollable}\n >\n {footerComponent}\n {footerItems && !footerComponent && (\n <SideNavFooterItemsContainer\n odysseyDesignTokens={odysseyDesignTokens}\n >\n <SideNavFooterContent footerItems={footerItems} />\n </SideNavFooterItemsContainer>\n )}\n </SideNavFooter>\n )}\n </SideNavExpandContainer>\n </SideNavContainer>\n );\n};\n\nconst MemoizedSideNav = memo(SideNav);\nMemoizedSideNav.displayName = \"SideNav\";\n\nexport { MemoizedSideNav as SideNav };\n"],"mappings":"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"}
|
|
@@ -16,8 +16,21 @@ import { useOdysseyDesignTokens } from "../../OdysseyDesignTokensContext.js";
|
|
|
16
16
|
import { Box } from "../../Box.js";
|
|
17
17
|
import { Heading6 } from "../../Typography.js";
|
|
18
18
|
import { CollapseIcon } from "./CollapseIcon.js";
|
|
19
|
+
import { TOP_NAV_HEIGHT_TOKEN } from "../TopNav.js";
|
|
19
20
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
20
21
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
22
|
+
const SideNavLogoContainer = styled("div", {
|
|
23
|
+
shouldForwardProp: prop => prop !== "odysseyDesignTokens"
|
|
24
|
+
})(({
|
|
25
|
+
odysseyDesignTokens
|
|
26
|
+
}) => ({
|
|
27
|
+
height: odysseyDesignTokens[TOP_NAV_HEIGHT_TOKEN],
|
|
28
|
+
padding: odysseyDesignTokens.Spacing3,
|
|
29
|
+
borderColor: odysseyDesignTokens.HueNeutral50,
|
|
30
|
+
borderStyle: odysseyDesignTokens.BorderStyleMain,
|
|
31
|
+
borderWidth: 0,
|
|
32
|
+
borderBottomWidth: odysseyDesignTokens.BorderWidthMain
|
|
33
|
+
}));
|
|
21
34
|
const SideNavHeaderContainer = styled("div", {
|
|
22
35
|
shouldForwardProp: prop => prop !== "odysseyDesignTokens"
|
|
23
36
|
})(({
|
|
@@ -34,21 +47,31 @@ const SideNavHeaderContainer = styled("div", {
|
|
|
34
47
|
const SideNavHeader = ({
|
|
35
48
|
navHeaderText,
|
|
36
49
|
isCollapsible,
|
|
37
|
-
onCollapse
|
|
50
|
+
onCollapse,
|
|
51
|
+
logo
|
|
38
52
|
}) => {
|
|
39
53
|
const odysseyDesignTokens = useOdysseyDesignTokens();
|
|
40
54
|
const sideNavHeaderStyles = useMemo(() => ({
|
|
41
55
|
marginTop: odysseyDesignTokens.Spacing2
|
|
42
56
|
}), [odysseyDesignTokens]);
|
|
43
|
-
return _jsxs(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
57
|
+
return _jsxs(Box, {
|
|
58
|
+
sx: {
|
|
59
|
+
display: "flex",
|
|
60
|
+
flexDirection: "column"
|
|
61
|
+
},
|
|
62
|
+
children: [_jsx(SideNavLogoContainer, {
|
|
63
|
+
odysseyDesignTokens: odysseyDesignTokens,
|
|
64
|
+
children: logo
|
|
65
|
+
}), _jsxs(SideNavHeaderContainer, {
|
|
66
|
+
odysseyDesignTokens: odysseyDesignTokens,
|
|
67
|
+
children: [_jsx(Box, {
|
|
68
|
+
sx: sideNavHeaderStyles,
|
|
69
|
+
children: _jsx(Heading6, {
|
|
70
|
+
children: navHeaderText
|
|
71
|
+
})
|
|
72
|
+
}), isCollapsible && _jsx(CollapseIcon, {
|
|
73
|
+
onClick: onCollapse
|
|
74
|
+
})]
|
|
52
75
|
})]
|
|
53
76
|
});
|
|
54
77
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SideNavHeader.js","names":["styled","memo","useMemo","useOdysseyDesignTokens","Box","Heading6","CollapseIcon","jsx","_jsx","jsxs","_jsxs","
|
|
1
|
+
{"version":3,"file":"SideNavHeader.js","names":["styled","memo","useMemo","useOdysseyDesignTokens","Box","Heading6","CollapseIcon","TOP_NAV_HEIGHT_TOKEN","jsx","_jsx","jsxs","_jsxs","SideNavLogoContainer","shouldForwardProp","prop","odysseyDesignTokens","height","padding","Spacing3","borderColor","HueNeutral50","borderStyle","BorderStyleMain","borderWidth","borderBottomWidth","BorderWidthMain","SideNavHeaderContainer","display","justifyContent","alignItems","paddingLeft","Spacing4","paddingRight","paddingTop","paddingBottom","SideNavHeader","navHeaderText","isCollapsible","onCollapse","logo","sideNavHeaderStyles","marginTop","Spacing2","sx","flexDirection","children","onClick","MemoizedSideNavHeader","displayName"],"sources":["../../../src/labs/SideNav/SideNavHeader.tsx"],"sourcesContent":["/*!\n * Copyright (c) 2024-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport styled from \"@emotion/styled\";\nimport { memo, ReactNode, useMemo } from \"react\";\nimport {\n type DesignTokens,\n useOdysseyDesignTokens,\n} from \"../../OdysseyDesignTokensContext\";\nimport { Box } from \"../../Box\";\nimport { Heading6 } from \"../../Typography\";\nimport { CollapseIcon } from \"./CollapseIcon\";\nimport type { SideNavProps } from \"./types\";\nimport { TOP_NAV_HEIGHT_TOKEN } from \"../TopNav\";\n\nconst SideNavLogoContainer = styled(\"div\", {\n shouldForwardProp: (prop) => prop !== \"odysseyDesignTokens\",\n})(({ odysseyDesignTokens }: { odysseyDesignTokens: DesignTokens }) => ({\n height: odysseyDesignTokens[TOP_NAV_HEIGHT_TOKEN],\n padding: odysseyDesignTokens.Spacing3,\n borderColor: odysseyDesignTokens.HueNeutral50,\n borderStyle: odysseyDesignTokens.BorderStyleMain,\n borderWidth: 0,\n borderBottomWidth: odysseyDesignTokens.BorderWidthMain,\n}));\n\nconst SideNavHeaderContainer = styled(\"div\", {\n shouldForwardProp: (prop) => prop !== \"odysseyDesignTokens\",\n})(({ odysseyDesignTokens }: { odysseyDesignTokens: DesignTokens }) => ({\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n paddingLeft: odysseyDesignTokens.Spacing4,\n paddingRight: odysseyDesignTokens.Spacing4,\n paddingTop: odysseyDesignTokens.Spacing3,\n paddingBottom: odysseyDesignTokens.Spacing3,\n}));\n\nconst SideNavHeader = ({\n navHeaderText,\n isCollapsible,\n onCollapse,\n logo,\n}: Pick<\n SideNavProps,\n \"navHeaderText\" | \"isCollapsible\" | \"onCollapse\" | \"logo\"\n>): ReactNode => {\n const odysseyDesignTokens = useOdysseyDesignTokens();\n\n const sideNavHeaderStyles = useMemo(\n () => ({\n marginTop: odysseyDesignTokens.Spacing2,\n }),\n [odysseyDesignTokens],\n );\n\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <SideNavLogoContainer odysseyDesignTokens={odysseyDesignTokens}>\n {logo}\n </SideNavLogoContainer>\n <SideNavHeaderContainer odysseyDesignTokens={odysseyDesignTokens}>\n <Box sx={sideNavHeaderStyles}>\n <Heading6>{navHeaderText}</Heading6>\n </Box>\n {isCollapsible && <CollapseIcon onClick={onCollapse} />}\n </SideNavHeaderContainer>\n </Box>\n );\n};\nconst MemoizedSideNavHeader = memo(SideNavHeader);\nMemoizedSideNavHeader.displayName = \"SideNavHeader\";\n\nexport { MemoizedSideNavHeader as SideNavHeader };\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,MAAM,MAAM,iBAAiB;AACpC,SAASC,IAAI,EAAaC,OAAO,QAAQ,OAAO;AAAC,SAG/CC,sBAAsB;AAAA,SAEfC,GAAG;AAAA,SACHC,QAAQ;AAAA,SACRC,YAAY;AAAA,SAEZC,oBAAoB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAE7B,MAAMC,oBAAoB,GAAGZ,MAAM,CAAC,KAAK,EAAE;EACzCa,iBAAiB,EAAGC,IAAI,IAAKA,IAAI,KAAK;AACxC,CAAC,CAAC,CAAC,CAAC;EAAEC;AAA2D,CAAC,MAAM;EACtEC,MAAM,EAAED,mBAAmB,CAACR,oBAAoB,CAAC;EACjDU,OAAO,EAAEF,mBAAmB,CAACG,QAAQ;EACrCC,WAAW,EAAEJ,mBAAmB,CAACK,YAAY;EAC7CC,WAAW,EAAEN,mBAAmB,CAACO,eAAe;EAChDC,WAAW,EAAE,CAAC;EACdC,iBAAiB,EAAET,mBAAmB,CAACU;AACzC,CAAC,CAAC,CAAC;AAEH,MAAMC,sBAAsB,GAAG1B,MAAM,CAAC,KAAK,EAAE;EAC3Ca,iBAAiB,EAAGC,IAAI,IAAKA,IAAI,KAAK;AACxC,CAAC,CAAC,CAAC,CAAC;EAAEC;AAA2D,CAAC,MAAM;EACtEY,OAAO,EAAE,MAAM;EACfC,cAAc,EAAE,eAAe;EAC/BC,UAAU,EAAE,QAAQ;EACpBC,WAAW,EAAEf,mBAAmB,CAACgB,QAAQ;EACzCC,YAAY,EAAEjB,mBAAmB,CAACgB,QAAQ;EAC1CE,UAAU,EAAElB,mBAAmB,CAACG,QAAQ;EACxCgB,aAAa,EAAEnB,mBAAmB,CAACG;AACrC,CAAC,CAAC,CAAC;AAEH,MAAMiB,aAAa,GAAGA,CAAC;EACrBC,aAAa;EACbC,aAAa;EACbC,UAAU;EACVC;AAIF,CAAC,KAAgB;EACf,MAAMxB,mBAAmB,GAAGZ,sBAAsB,CAAC,CAAC;EAEpD,MAAMqC,mBAAmB,GAAGtC,OAAO,CACjC,OAAO;IACLuC,SAAS,EAAE1B,mBAAmB,CAAC2B;EACjC,CAAC,CAAC,EACF,CAAC3B,mBAAmB,CACtB,CAAC;EAED,OACEJ,KAAA,CAACP,GAAG;IACFuC,EAAE,EAAE;MACFhB,OAAO,EAAE,MAAM;MACfiB,aAAa,EAAE;IACjB,CAAE;IAAAC,QAAA,GAEFpC,IAAA,CAACG,oBAAoB;MAACG,mBAAmB,EAAEA,mBAAoB;MAAA8B,QAAA,EAC5DN;IAAI,CACe,CAAC,EACvB5B,KAAA,CAACe,sBAAsB;MAACX,mBAAmB,EAAEA,mBAAoB;MAAA8B,QAAA,GAC/DpC,IAAA,CAACL,GAAG;QAACuC,EAAE,EAAEH,mBAAoB;QAAAK,QAAA,EAC3BpC,IAAA,CAACJ,QAAQ;UAAAwC,QAAA,EAAET;QAAa,CAAW;MAAC,CACjC,CAAC,EACLC,aAAa,IAAI5B,IAAA,CAACH,YAAY;QAACwC,OAAO,EAAER;MAAW,CAAE,CAAC;IAAA,CACjC,CAAC;EAAA,CACtB,CAAC;AAEV,CAAC;AACD,MAAMS,qBAAqB,GAAG9C,IAAI,CAACkC,aAAa,CAAC;AACjDY,qBAAqB,CAACC,WAAW,GAAG,eAAe;AAEnD,SAASD,qBAAqB,IAAIZ,aAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../src/labs/SideNav/types.ts"],"sourcesContent":["/*!\n * Copyright (c) 2024-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport type { ReactElement } from \"react\";\nimport type { HtmlProps } from \"../../HtmlProps\";\nimport type { statusSeverityValues } from \"../../Status\";\n\nexport type SideNavProps = {\n /**\n * Side Nav header text that is usually reserved to show the App name\n */\n navHeaderText: string;\n /**\n * Determines whether the side nav is collapsible\n */\n isCollapsible?: boolean;\n /**\n *
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../src/labs/SideNav/types.ts"],"sourcesContent":["/*!\n * Copyright (c) 2024-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport type { ReactElement } from \"react\";\nimport type { HtmlProps } from \"../../HtmlProps\";\nimport type { statusSeverityValues } from \"../../Status\";\n\nexport type SideNavProps = {\n /**\n * Side Nav header text that is usually reserved to show the App name\n */\n navHeaderText: string;\n /**\n * Determines whether the side nav is collapsible\n */\n isCollapsible?: boolean;\n /**\n * Triggers when the side nav is collapsed\n */\n onCollapse?(): void;\n /**\n * Triggers when the side nav is expanded\n */\n onExpand?(): void;\n /**\n * Nav items in the side nav\n */\n sideNavItems: SideNavItem[];\n /**\n * A CSS length string indicating the customizable expanded width of the SideNav container.\n * (it will be smaller if isCollapsible and collapsed)\n */\n expandedWidth?: string;\n /**\n * An optional logo to display in the header. If not provided, will default to the Okta logo\n */\n logo?: ReactElement;\n} & (\n | {\n /**\n * Footer items in the side nav\n */\n footerItems?: SideNavFooterItem[];\n /**\n * footerComponent cannot be used if footerItems are defined\n */\n footerComponent?: never;\n }\n | {\n /**\n * footerItems cannot be used if footerComponent is defined\n */\n footerItems?: never;\n /**\n * The component to display as the footer; if present the `footerItems` are ignored and not rendered.\n */\n footerComponent?: ReactElement;\n }\n) &\n Pick<HtmlProps, \"testId\">;\n\nexport type SideNavItem = {\n id: string;\n label: string;\n /**\n * The icon element to display at the end of the Nav Item\n */\n endIcon?: ReactElement;\n /**\n * Whether the item is disabled. When set to true the nav item is set to Disabled color,\n * the link/item is not clickable, and item with children is not expandable.\n */\n isDisabled?: boolean;\n /**\n * Whether the item is active/selected\n */\n isSelected?: boolean;\n /**\n * Event fired when the nav item is clicked\n */\n onClick?(): void;\n /**\n * The status element to display after the label\n */\n severity?: (typeof statusSeverityValues)[number];\n /**\n * The icon element to display at the start of the Nav Item\n */\n startIcon?: ReactElement;\n /**\n * The label to display inside the status\n */\n statusLabel?: string;\n /**\n * The link target prop. e.g., \"_blank\"\n */\n target?: string;\n} & (\n | {\n /**\n * Determines if the side nav item is a section header\n */\n isSectionHeader: true;\n href?: never;\n children?: never;\n isDefaultExpanded?: never;\n isExpanded?: never;\n }\n | {\n /**\n * link added to the nav item. if it is undefined, static text will be displayed.\n * fires onClick event when it is passed\n */\n href: string;\n children?: never;\n isSectionHeader?: never;\n isDefaultExpanded?: never;\n isExpanded?: never;\n }\n | {\n /**\n * An array of side nav items to be displayed as children within Accordion\n */\n children?: SideNavItem[];\n /**\n * Whether the accordion (nav item with children) is expanded by default\n */\n isDefaultExpanded?: boolean;\n /**\n * If true, expands the accordion, otherwise collapse it.\n * Setting this prop enables control over the accordion.\n */\n isExpanded?: boolean;\n isSectionHeader?: never;\n href?: never;\n }\n);\n\nexport type SideNavFooterItem = {\n href?: string;\n id: string;\n label: string;\n};\n"],"mappings":""}
|
package/dist/labs/TopNav.js
CHANGED
|
@@ -19,6 +19,7 @@ import { Subordinate } from "../Typography.js";
|
|
|
19
19
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
20
20
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
21
21
|
import { createElement as _createElement } from "react";
|
|
22
|
+
export const TOP_NAV_HEIGHT_TOKEN = "Spacing9";
|
|
22
23
|
const UserProfileContainer = styled("div", {
|
|
23
24
|
shouldForwardProp: prop => prop !== "odysseyDesignTokens"
|
|
24
25
|
})(({
|
|
@@ -210,7 +211,7 @@ const TopNavContainer = styled("div", {
|
|
|
210
211
|
display: "flex",
|
|
211
212
|
alignItems: "center",
|
|
212
213
|
backgroundColor: odysseyDesignTokens.HueNeutralWhite,
|
|
213
|
-
height: odysseyDesignTokens
|
|
214
|
+
height: odysseyDesignTokens[TOP_NAV_HEIGHT_TOKEN]
|
|
214
215
|
}));
|
|
215
216
|
const SearchFieldContainer = styled("div", {
|
|
216
217
|
shouldForwardProp: prop => prop !== "odysseyDesignTokens"
|