@okta/odyssey-react-mui 1.25.0 → 1.27.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 +17 -0
- package/dist/Autocomplete.js +30 -191
- package/dist/Autocomplete.js.map +1 -1
- package/dist/Box.js +2 -0
- package/dist/Box.js.map +1 -1
- package/dist/Card.js +1 -0
- package/dist/Card.js.map +1 -1
- package/dist/OdysseyDesignTokensContext.js +3 -2
- package/dist/OdysseyDesignTokensContext.js.map +1 -1
- package/dist/OdysseyProvider.js +9 -7
- package/dist/OdysseyProvider.js.map +1 -1
- package/dist/OdysseyThemeProvider.js +33 -13
- package/dist/OdysseyThemeProvider.js.map +1 -1
- package/dist/Pagination/Pagination.js +46 -14
- package/dist/Pagination/Pagination.js.map +1 -1
- package/dist/Surface.js +14 -3
- package/dist/Surface.js.map +1 -1
- package/dist/Tag.js +42 -27
- package/dist/Tag.js.map +1 -1
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/dist/index.scss +1 -1
- package/dist/labs/AppTile.js +137 -39
- package/dist/labs/AppTile.js.map +1 -1
- package/dist/labs/DataView/CardLayoutContent.js +7 -8
- package/dist/labs/DataView/CardLayoutContent.js.map +1 -1
- package/dist/labs/DataView/DataCard.js +96 -43
- package/dist/labs/DataView/DataCard.js.map +1 -1
- package/dist/labs/DataView/DataView.js +6 -0
- package/dist/labs/DataView/DataView.js.map +1 -1
- package/dist/labs/DataView/TableLayoutContent.js +3 -2
- package/dist/labs/DataView/TableLayoutContent.js.map +1 -1
- package/dist/labs/DataView/componentTypes.js.map +1 -1
- package/dist/labs/DataView/index.js.map +1 -1
- package/dist/labs/OdysseyPickers/ComposablePicker.js +113 -0
- package/dist/labs/OdysseyPickers/ComposablePicker.js.map +1 -0
- package/dist/labs/OdysseyPickers/Picker.js +261 -0
- package/dist/labs/OdysseyPickers/Picker.js.map +1 -0
- package/dist/labs/OdysseyPickers/PickerVirtualizationListBox.js +132 -0
- package/dist/labs/OdysseyPickers/PickerVirtualizationListBox.js.map +1 -0
- package/dist/labs/OdysseyPickers/PickerWithOptionAdornment.js +291 -0
- package/dist/labs/OdysseyPickers/PickerWithOptionAdornment.js.map +1 -0
- package/dist/{src/createShadowDomElements.d.ts → labs/OdysseyPickers/index.js} +4 -7
- package/dist/labs/OdysseyPickers/index.js.map +1 -0
- package/dist/labs/PageTemplate.js +14 -10
- package/dist/labs/PageTemplate.js.map +1 -1
- package/dist/labs/SideNav/CollapseIcon.js +11 -25
- package/dist/labs/SideNav/CollapseIcon.js.map +1 -1
- package/dist/labs/SideNav/HandleIcon.js +32 -0
- package/dist/labs/SideNav/HandleIcon.js.map +1 -0
- package/dist/labs/{NavAccordion.js → SideNav/NavAccordion.js} +36 -8
- package/dist/labs/SideNav/NavAccordion.js.map +1 -0
- package/dist/labs/SideNav/OktaAura.js +32 -0
- package/dist/labs/SideNav/OktaAura.js.map +1 -0
- package/dist/labs/SideNav/OktaLogo.js +6 -9
- package/dist/labs/SideNav/OktaLogo.js.map +1 -1
- package/dist/labs/SideNav/SideNav.js +316 -172
- package/dist/labs/SideNav/SideNav.js.map +1 -1
- package/dist/labs/SideNav/SideNavFooterContent.js +32 -18
- package/dist/labs/SideNav/SideNavFooterContent.js.map +1 -1
- package/dist/labs/SideNav/SideNavHeader.js +48 -37
- package/dist/labs/SideNav/SideNavHeader.js.map +1 -1
- package/dist/labs/SideNav/SideNavItemContent.js +150 -68
- package/dist/labs/SideNav/SideNavItemContent.js.map +1 -1
- package/dist/labs/SideNav/SideNavItemContentContext.js +20 -0
- package/dist/labs/SideNav/SideNavItemContentContext.js.map +1 -0
- package/dist/labs/SideNav/SideNavItemLinkContent.js +15 -14
- package/dist/labs/SideNav/SideNavItemLinkContent.js.map +1 -1
- package/dist/labs/SideNav/SideNavLogo.js +42 -0
- package/dist/labs/SideNav/SideNavLogo.js.map +1 -0
- package/dist/labs/SideNav/SideNavToggleButton.js +170 -0
- package/dist/labs/SideNav/SideNavToggleButton.js.map +1 -0
- package/dist/labs/SideNav/SortableList/SortableItem.js +162 -0
- package/dist/labs/SideNav/SortableList/SortableItem.js.map +1 -0
- package/dist/labs/SideNav/SortableList/SortableList.js +118 -0
- package/dist/labs/SideNav/SortableList/SortableList.js.map +1 -0
- package/dist/labs/SideNav/SortableList/SortableOverlay.js +30 -0
- package/dist/labs/SideNav/SortableList/SortableOverlay.js.map +1 -0
- package/dist/labs/SideNav/types.js.map +1 -1
- package/dist/labs/TopNav/TopNav.js +65 -0
- package/dist/labs/TopNav/TopNav.js.map +1 -0
- package/dist/labs/TopNav/TopNavLinksList.js +38 -0
- package/dist/labs/TopNav/TopNavLinksList.js.map +1 -0
- package/dist/labs/TopNav/TopNavListItem.js +132 -0
- package/dist/labs/TopNav/TopNavListItem.js.map +1 -0
- package/dist/labs/TopNav/UserProfile.js +65 -0
- package/dist/labs/TopNav/UserProfile.js.map +1 -0
- package/dist/labs/TopNav/index.js +14 -0
- package/dist/labs/TopNav/index.js.map +1 -0
- package/dist/labs/UiShell/UiShell.js +68 -0
- package/dist/labs/UiShell/UiShell.js.map +1 -0
- package/dist/labs/UiShell/UiShellContent.js +114 -0
- package/dist/labs/UiShell/UiShellContent.js.map +1 -0
- package/dist/labs/UiShell/bufferLatest.js +37 -0
- package/dist/labs/UiShell/bufferLatest.js.map +1 -0
- package/dist/labs/UiShell/createMessageBus.js +30 -0
- package/dist/labs/UiShell/createMessageBus.js.map +1 -0
- package/dist/labs/UiShell/createStore.js +24 -0
- package/dist/labs/UiShell/createStore.js.map +1 -0
- package/dist/labs/UiShell/index.js +15 -0
- package/dist/labs/UiShell/index.js.map +1 -0
- package/dist/labs/UiShell/renderUiShell.js +78 -0
- package/dist/labs/UiShell/renderUiShell.js.map +1 -0
- package/dist/labs/UiShell/useHasUiShell.js +22 -0
- package/dist/labs/UiShell/useHasUiShell.js.map +1 -0
- package/dist/labs/UiShell/useScrollState.js +41 -0
- package/dist/labs/UiShell/useScrollState.js.map +1 -0
- package/dist/labs/index.js +5 -3
- package/dist/labs/index.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui.js +14 -1
- package/dist/properties/ts/odyssey-react-mui.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_cs.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_cs.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_da.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_da.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_de.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_de.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_el.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_el.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_es.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_es.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_fi.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_fi.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_fr.js +5 -3
- package/dist/properties/ts/odyssey-react-mui_fr.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_ht.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_ht.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_hu.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_hu.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_id.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_id.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_it.js +4 -2
- package/dist/properties/ts/odyssey-react-mui_it.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_ja.js +9 -7
- package/dist/properties/ts/odyssey-react-mui_ja.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_ko.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_ko.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_ms.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_ms.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_nb.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_nb.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_nl_NL.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_nl_NL.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_pl.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_pl.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_pt_BR.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_pt_BR.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_ro.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_ro.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_ru.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_ru.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_sv.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_sv.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_th.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_th.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_tr.js +4 -2
- package/dist/properties/ts/odyssey-react-mui_tr.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_uk.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_uk.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_vi.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_vi.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_zh_CN.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_zh_CN.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui_zh_TW.js +3 -1
- package/dist/properties/ts/odyssey-react-mui_zh_TW.js.map +1 -1
- package/dist/src/Autocomplete.d.ts +21 -22
- package/dist/src/Autocomplete.d.ts.map +1 -1
- package/dist/src/Box.d.ts +3 -1
- package/dist/src/Box.d.ts.map +1 -1
- package/dist/src/Card.d.ts.map +1 -1
- package/dist/src/OdysseyDesignTokensContext.d.ts +5 -4
- package/dist/src/OdysseyDesignTokensContext.d.ts.map +1 -1
- package/dist/src/OdysseyProvider.d.ts +3 -3
- package/dist/src/OdysseyProvider.d.ts.map +1 -1
- package/dist/src/OdysseyThemeProvider.d.ts +10 -12
- package/dist/src/OdysseyThemeProvider.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/Pagination/Pagination.d.ts +21 -7
- package/dist/src/Pagination/Pagination.d.ts.map +1 -1
- package/dist/src/Surface.d.ts.map +1 -1
- package/dist/src/Tag.d.ts +5 -2
- package/dist/src/Tag.d.ts.map +1 -1
- package/dist/src/index.d.ts +6 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/labs/AppTile.d.ts +3 -1
- package/dist/src/labs/AppTile.d.ts.map +1 -1
- package/dist/src/labs/DataView/CardLayoutContent.d.ts.map +1 -1
- package/dist/src/labs/DataView/DataCard.d.ts +9 -3
- package/dist/src/labs/DataView/DataCard.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.map +1 -1
- package/dist/src/labs/DataView/componentTypes.d.ts +4 -3
- package/dist/src/labs/DataView/componentTypes.d.ts.map +1 -1
- package/dist/src/labs/DataView/index.d.ts +1 -0
- package/dist/src/labs/DataView/index.d.ts.map +1 -1
- package/dist/src/labs/OdysseyPickers/ComposablePicker.d.ts +33 -0
- package/dist/src/labs/OdysseyPickers/ComposablePicker.d.ts.map +1 -0
- package/dist/src/labs/OdysseyPickers/Picker.d.ts +98 -0
- package/dist/src/labs/OdysseyPickers/Picker.d.ts.map +1 -0
- package/dist/src/labs/OdysseyPickers/PickerVirtualizationListBox.d.ts +17 -0
- package/dist/src/labs/OdysseyPickers/PickerVirtualizationListBox.d.ts.map +1 -0
- package/dist/src/labs/OdysseyPickers/PickerWithOptionAdornment.d.ts +26 -0
- package/dist/src/labs/OdysseyPickers/PickerWithOptionAdornment.d.ts.map +1 -0
- package/dist/src/labs/OdysseyPickers/index.d.ts +15 -0
- package/dist/src/labs/OdysseyPickers/index.d.ts.map +1 -0
- package/dist/src/labs/PageTemplate.d.ts +1 -1
- package/dist/src/labs/PageTemplate.d.ts.map +1 -1
- package/dist/src/labs/SideNav/CollapseIcon.d.ts +1 -4
- package/dist/src/labs/SideNav/CollapseIcon.d.ts.map +1 -1
- package/dist/src/labs/SideNav/HandleIcon.d.ts +14 -0
- package/dist/src/labs/SideNav/HandleIcon.d.ts.map +1 -0
- package/dist/src/labs/{NavAccordion.d.ts → SideNav/NavAccordion.d.ts} +7 -7
- package/dist/src/labs/SideNav/NavAccordion.d.ts.map +1 -0
- package/dist/src/labs/SideNav/OktaAura.d.ts +14 -0
- package/dist/src/labs/SideNav/OktaAura.d.ts.map +1 -0
- package/dist/src/labs/SideNav/OktaLogo.d.ts.map +1 -1
- 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/SideNavFooterContent.d.ts +1 -1
- package/dist/src/labs/SideNav/SideNavFooterContent.d.ts.map +1 -1
- package/dist/src/labs/SideNav/SideNavHeader.d.ts +12 -3
- package/dist/src/labs/SideNav/SideNavHeader.d.ts.map +1 -1
- package/dist/src/labs/SideNav/SideNavItemContent.d.ts +38 -3
- package/dist/src/labs/SideNav/SideNavItemContent.d.ts.map +1 -1
- package/dist/src/labs/SideNav/SideNavItemContentContext.d.ts +19 -0
- package/dist/src/labs/SideNav/SideNavItemContentContext.d.ts.map +1 -0
- package/dist/src/labs/SideNav/SideNavItemLinkContent.d.ts +1 -1
- package/dist/src/labs/SideNav/SideNavItemLinkContent.d.ts.map +1 -1
- package/dist/src/labs/SideNav/SideNavLogo.d.ts +15 -0
- package/dist/src/labs/SideNav/SideNavLogo.d.ts.map +1 -0
- package/dist/src/labs/SideNav/SideNavToggleButton.d.ts +38 -0
- package/dist/src/labs/SideNav/SideNavToggleButton.d.ts.map +1 -0
- package/dist/src/labs/SideNav/SortableList/SortableItem.d.ts +26 -0
- package/dist/src/labs/SideNav/SortableList/SortableItem.d.ts.map +1 -0
- package/dist/src/labs/SideNav/SortableList/SortableList.d.ts +36 -0
- package/dist/src/labs/SideNav/SortableList/SortableList.d.ts.map +1 -0
- package/dist/src/labs/SideNav/SortableList/SortableOverlay.d.ts +17 -0
- package/dist/src/labs/SideNav/SortableList/SortableOverlay.d.ts.map +1 -0
- package/dist/src/labs/SideNav/types.d.ts +79 -35
- package/dist/src/labs/SideNav/types.d.ts.map +1 -1
- package/dist/src/labs/TopNav/TopNav.d.ts +31 -0
- package/dist/src/labs/TopNav/TopNav.d.ts.map +1 -0
- package/dist/src/labs/TopNav/TopNavLinksList.d.ts +44 -0
- package/dist/src/labs/TopNav/TopNavLinksList.d.ts.map +1 -0
- package/dist/src/labs/TopNav/TopNavListItem.d.ts +42 -0
- package/dist/src/labs/TopNav/TopNavListItem.d.ts.map +1 -0
- package/dist/src/labs/TopNav/UserProfile.d.ts +29 -0
- package/dist/src/labs/TopNav/UserProfile.d.ts.map +1 -0
- package/dist/src/labs/TopNav/index.d.ts +14 -0
- package/dist/src/labs/TopNav/index.d.ts.map +1 -0
- package/dist/src/labs/UiShell/UiShell.d.ts +33 -0
- package/dist/src/labs/UiShell/UiShell.d.ts.map +1 -0
- package/dist/src/labs/UiShell/UiShellContent.d.ts +47 -0
- package/dist/src/labs/UiShell/UiShellContent.d.ts.map +1 -0
- package/dist/src/labs/UiShell/bufferLatest.d.ts +31 -0
- package/dist/src/labs/UiShell/bufferLatest.d.ts.map +1 -0
- package/dist/src/labs/UiShell/createMessageBus.d.ts +24 -0
- package/dist/src/labs/UiShell/createMessageBus.d.ts.map +1 -0
- package/dist/src/labs/UiShell/createStore.d.ts +22 -0
- package/dist/src/labs/UiShell/createStore.d.ts.map +1 -0
- package/dist/src/labs/UiShell/index.d.ts +16 -0
- package/dist/src/labs/UiShell/index.d.ts.map +1 -0
- package/dist/src/labs/UiShell/renderUiShell.d.ts +45 -0
- package/dist/src/labs/UiShell/renderUiShell.d.ts.map +1 -0
- package/dist/src/labs/UiShell/useHasUiShell.d.ts +13 -0
- package/dist/src/labs/UiShell/useHasUiShell.d.ts.map +1 -0
- package/dist/src/labs/UiShell/useScrollState.d.ts +16 -0
- package/dist/src/labs/UiShell/useScrollState.d.ts.map +1 -0
- package/dist/src/labs/index.d.ts +6 -2
- package/dist/src/labs/index.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui.d.ts +13 -0
- package/dist/src/properties/ts/odyssey-react-mui.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_cs.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_cs.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_da.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_da.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_de.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_de.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_el.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_el.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_es.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_es.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_fi.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_fi.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_fr.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_fr.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_ht.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_ht.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_hu.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_hu.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_id.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_id.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_it.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_it.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_ja.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_ja.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_ko.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_ko.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_ms.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_ms.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_nb.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_nb.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_nl_NL.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_nl_NL.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_pl.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_pl.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_pt_BR.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_pt_BR.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_ro.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_ro.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_ru.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_ru.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_sv.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_sv.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_th.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_th.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_tr.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_tr.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_uk.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_uk.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_vi.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_vi.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_zh_CN.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_zh_CN.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui_zh_TW.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui_zh_TW.d.ts.map +1 -1
- package/dist/src/test-selectors/querySelector.d.ts +2 -2
- package/dist/src/theme/components.d.ts +3 -1
- package/dist/src/theme/components.d.ts.map +1 -1
- package/dist/src/theme/createOdysseyMuiTheme.d.ts +2 -1
- package/dist/src/theme/createOdysseyMuiTheme.d.ts.map +1 -1
- package/dist/src/useAutocomplete.d.ts +29 -0
- package/dist/src/useAutocomplete.d.ts.map +1 -0
- package/dist/src/useContrastMode.d.ts +46 -0
- package/dist/src/useContrastMode.d.ts.map +1 -0
- package/dist/src/web-component/index.d.ts +14 -0
- package/dist/src/web-component/index.d.ts.map +1 -0
- package/dist/src/web-component/renderReactInWebComponent.d.ts +76 -0
- package/dist/src/web-component/renderReactInWebComponent.d.ts.map +1 -0
- package/dist/src/web-component/shadow-dom.d.ts +23 -0
- package/dist/src/web-component/shadow-dom.d.ts.map +1 -0
- package/dist/test-selectors/querySelector.js.map +1 -1
- package/dist/theme/components.js +36 -32
- package/dist/theme/components.js.map +1 -1
- package/dist/theme/createOdysseyMuiTheme.js +3 -2
- package/dist/theme/createOdysseyMuiTheme.js.map +1 -1
- package/dist/tsconfig.production.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/useAutocomplete.js +105 -0
- package/dist/useAutocomplete.js.map +1 -0
- package/dist/useContrastMode.js +93 -0
- package/dist/useContrastMode.js.map +1 -0
- package/dist/web-component/index.js +14 -0
- package/dist/web-component/index.js.map +1 -0
- package/dist/web-component/renderReactInWebComponent.js +72 -0
- package/dist/web-component/renderReactInWebComponent.js.map +1 -0
- package/dist/{createShadowDomElements.js → web-component/shadow-dom.js} +10 -12
- package/dist/web-component/shadow-dom.js.map +1 -0
- package/i18n.config.json +2 -1
- package/jest.config.cjs +1 -1
- package/jest.setup.js +0 -3
- package/package.json +7 -3
- package/src/Autocomplete.tsx +40 -330
- package/src/Box.tsx +4 -2
- package/src/Card.tsx +1 -0
- package/src/OdysseyDesignTokensContext.tsx +6 -3
- package/src/OdysseyProvider.tsx +13 -8
- package/src/OdysseyThemeProvider.test.tsx +209 -0
- package/src/OdysseyThemeProvider.tsx +42 -26
- package/src/Pagination/Pagination.test.tsx +305 -0
- package/src/Pagination/Pagination.tsx +86 -38
- package/src/Surface.tsx +18 -5
- package/src/Tag.tsx +64 -39
- package/src/createUniqueAlphabeticalId.test.ts +1 -1
- package/src/createUniqueId.test.ts +1 -1
- package/src/index.ts +6 -7
- package/src/labs/AppTile.tsx +169 -40
- package/src/labs/DataView/CardLayoutContent.tsx +12 -14
- package/src/labs/DataView/DataCard.tsx +137 -69
- package/src/labs/DataView/DataView.test.tsx +6 -4
- package/src/labs/DataView/DataView.tsx +6 -0
- package/src/labs/DataView/TableLayoutContent.tsx +6 -2
- package/src/labs/DataView/componentTypes.ts +7 -3
- package/src/labs/DataView/index.tsx +1 -0
- package/src/labs/OdysseyPickers/ComposablePicker.test.tsx +29 -0
- package/src/labs/OdysseyPickers/ComposablePicker.tsx +188 -0
- package/src/labs/OdysseyPickers/Picker.tsx +381 -0
- package/src/labs/OdysseyPickers/PickerVirtualizationListBox.tsx +191 -0
- package/src/labs/OdysseyPickers/PickerWithOptionAdornment.tsx +429 -0
- package/src/labs/OdysseyPickers/index.ts +15 -0
- package/src/labs/PageTemplate.tsx +18 -10
- package/src/labs/SideNav/CollapseIcon.tsx +14 -28
- package/src/labs/SideNav/HandleIcon.tsx +35 -0
- package/src/labs/{NavAccordion.tsx → SideNav/NavAccordion.tsx} +51 -16
- package/src/labs/SideNav/OktaAura.tsx +35 -0
- package/src/labs/SideNav/OktaLogo.tsx +5 -10
- package/src/labs/SideNav/SideNav.test.tsx +323 -0
- package/src/labs/SideNav/SideNav.tsx +405 -205
- package/src/labs/SideNav/SideNavFooterContent.tsx +36 -28
- package/src/labs/SideNav/SideNavHeader.tsx +62 -45
- package/src/labs/SideNav/SideNavItemContent.tsx +202 -69
- package/src/labs/SideNav/SideNavItemContentContext.tsx +29 -0
- package/src/labs/SideNav/SideNavItemLinkContent.tsx +18 -15
- package/src/labs/SideNav/SideNavLogo.tsx +41 -0
- package/src/labs/SideNav/SideNavToggleButton.tsx +245 -0
- package/src/labs/SideNav/SortableList/SortableItem.tsx +202 -0
- package/src/labs/SideNav/SortableList/SortableList.tsx +122 -0
- package/src/labs/SideNav/SortableList/SortableOverlay.tsx +34 -0
- package/src/labs/SideNav/types.ts +85 -36
- package/src/labs/TopNav/TopNav.tsx +95 -0
- package/src/labs/TopNav/TopNavLinksList.tsx +68 -0
- package/src/labs/TopNav/TopNavListItem.tsx +209 -0
- package/src/labs/TopNav/UserProfile.tsx +79 -0
- package/src/labs/TopNav/index.ts +14 -0
- package/src/labs/UiShell/UiShell.test.tsx +284 -0
- package/src/labs/UiShell/UiShell.tsx +109 -0
- package/src/labs/UiShell/UiShellContent.tsx +170 -0
- package/src/labs/UiShell/bufferLatest.test.ts +79 -0
- package/src/labs/UiShell/bufferLatest.ts +64 -0
- package/src/labs/UiShell/createMessageBus.test.ts +115 -0
- package/src/labs/UiShell/createMessageBus.ts +53 -0
- package/src/labs/UiShell/createStore.test.ts +103 -0
- package/src/labs/UiShell/createStore.ts +37 -0
- package/src/labs/UiShell/index.ts +17 -0
- package/src/labs/UiShell/renderUiShell.test.tsx +197 -0
- package/src/labs/UiShell/renderUiShell.tsx +132 -0
- package/src/labs/UiShell/useHasUiShell.ts +25 -0
- package/src/labs/UiShell/useScrollState.ts +56 -0
- package/src/labs/index.ts +10 -3
- package/src/properties/odyssey-react-mui.properties +14 -0
- package/src/properties/translations/odyssey-react-mui_cs.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_da.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_de.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_el.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_es.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_fi.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_fr.properties +4 -3
- package/src/properties/translations/odyssey-react-mui_ht.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_hu.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_id.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_it.properties +3 -2
- package/src/properties/translations/odyssey-react-mui_ja.properties +8 -7
- package/src/properties/translations/odyssey-react-mui_ko.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_ms.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_nb.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_nl_NL.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_pl.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_pt_BR.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_ro.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_ru.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_sv.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_th.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_tr.properties +3 -2
- package/src/properties/translations/odyssey-react-mui_uk.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_vi.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_zh_CN.properties +2 -1
- package/src/properties/translations/odyssey-react-mui_zh_TW.properties +2 -1
- package/src/properties/ts/odyssey-react-mui.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_cs.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_da.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_de.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_el.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_es.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_fi.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_fr.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_ht.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_hu.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_id.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_it.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_ja.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_ko.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_ms.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_nb.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_nl_NL.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_pl.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_pt_BR.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_ro.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_ru.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_sv.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_th.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_tr.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_uk.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_vi.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_zh_CN.ts +1 -1
- package/src/properties/ts/odyssey-react-mui_zh_TW.ts +1 -1
- package/src/test-selectors/querySelector.ts +1 -1
- package/src/theme/components.tsx +50 -33
- package/src/theme/createOdysseyMuiTheme.ts +4 -3
- package/src/theme/useContrastMode.test.tsx +503 -0
- package/src/useAutocomplete.tsx +183 -0
- package/src/useContrastMode.tsx +149 -0
- package/src/web-component/index.ts +14 -0
- package/src/web-component/renderReactInWebComponent.test.tsx +156 -0
- package/src/web-component/renderReactInWebComponent.ts +153 -0
- package/src/web-component/shadow-dom.test.ts +24 -0
- package/src/{createShadowDomElements.ts → web-component/shadow-dom.ts} +15 -14
- package/dist/ContrastModeProvider.js +0 -86
- package/dist/ContrastModeProvider.js.map +0 -1
- package/dist/createShadowDomElements.js.map +0 -1
- package/dist/labs/NavAccordion.js.map +0 -1
- package/dist/labs/TopNav.js +0 -281
- package/dist/labs/TopNav.js.map +0 -1
- package/dist/src/ContrastModeProvider.d.ts +0 -34
- package/dist/src/ContrastModeProvider.d.ts.map +0 -1
- package/dist/src/createShadowDomElements.d.ts.map +0 -1
- package/dist/src/labs/NavAccordion.d.ts.map +0 -1
- package/dist/src/labs/TopNav.d.ts +0 -78
- package/dist/src/labs/TopNav.d.ts.map +0 -1
- package/src/ContrastModeProvider.tsx +0 -131
- package/src/labs/TopNav.tsx +0 -396
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2024-present, Okta, Inc. and/or its affiliates. All rights reserved.
|
|
3
|
+
* The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
|
|
4
|
+
*
|
|
5
|
+
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
|
6
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
8
|
+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
*
|
|
10
|
+
* See the License for the specific language governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export * from "./TopNav";
|
|
14
|
+
export * from "./UserProfile";
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2024-present, Okta, Inc. and/or its affiliates. All rights reserved.
|
|
3
|
+
* The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
|
|
4
|
+
*
|
|
5
|
+
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
|
6
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
8
|
+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
*
|
|
10
|
+
* See the License for the specific language governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { render, within } from "@testing-library/react";
|
|
14
|
+
|
|
15
|
+
import { Dialog } from "../../Dialog";
|
|
16
|
+
import { defaultComponentProps, UiShell, UiShellProps } from "./UiShell";
|
|
17
|
+
import { ReactElement } from "react";
|
|
18
|
+
|
|
19
|
+
describe("UiShell", () => {
|
|
20
|
+
test("renders `appRootElement`", async () => {
|
|
21
|
+
const appRootElement = document.createElement("div");
|
|
22
|
+
|
|
23
|
+
render(
|
|
24
|
+
<UiShell
|
|
25
|
+
appComponent={<div />}
|
|
26
|
+
appRootElement={appRootElement}
|
|
27
|
+
onSubscriptionCreated={() => {}}
|
|
28
|
+
optionalComponents={{
|
|
29
|
+
sideNavFooter: <div />,
|
|
30
|
+
topNavLeftSide: <div />,
|
|
31
|
+
topNavRightSide: (
|
|
32
|
+
<Dialog
|
|
33
|
+
children={undefined}
|
|
34
|
+
title="Hello World!"
|
|
35
|
+
isOpen
|
|
36
|
+
onClose={() => {}}
|
|
37
|
+
/>
|
|
38
|
+
),
|
|
39
|
+
}}
|
|
40
|
+
stylesRootElement={document.createElement("div")}
|
|
41
|
+
subscribeToPropChanges={() => () => {}}
|
|
42
|
+
/>,
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
expect(Array.from(appRootElement.children)).toHaveLength(1);
|
|
46
|
+
expect(appRootElement).toHaveTextContent("Hello World!");
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test("renders `stylesRootElement`", async () => {
|
|
50
|
+
const rootElement = document.createElement("div");
|
|
51
|
+
|
|
52
|
+
// If this isn't appended to the DOM, the React app won't exist because of how Web Components run.
|
|
53
|
+
document.body.append(rootElement);
|
|
54
|
+
|
|
55
|
+
const stylesRootElement = document.createElement("div");
|
|
56
|
+
|
|
57
|
+
render(
|
|
58
|
+
<UiShell
|
|
59
|
+
appComponent={<div />}
|
|
60
|
+
appRootElement={document.createElement("div")}
|
|
61
|
+
onSubscriptionCreated={() => {}}
|
|
62
|
+
stylesRootElement={stylesRootElement}
|
|
63
|
+
subscribeToPropChanges={() => () => {}}
|
|
64
|
+
/>,
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
expect(Array.from(stylesRootElement.children).length).toBeGreaterThan(0);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("renders `appComponent`", async () => {
|
|
71
|
+
const testId = "app-component";
|
|
72
|
+
|
|
73
|
+
const { container } = render(
|
|
74
|
+
<UiShell
|
|
75
|
+
appComponent={<div data-testid={testId} />}
|
|
76
|
+
appRootElement={document.createElement("div")}
|
|
77
|
+
onSubscriptionCreated={() => {}}
|
|
78
|
+
stylesRootElement={document.createElement("div")}
|
|
79
|
+
subscribeToPropChanges={() => () => {}}
|
|
80
|
+
/>,
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
expect(within(container).getByTestId(testId)).toBeInTheDocument();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("renders always-available `componentSlots`", async () => {
|
|
87
|
+
const optionalComponentTestIds: Array<
|
|
88
|
+
keyof Required<UiShellProps>["optionalComponents"]
|
|
89
|
+
> = ["banners", "topNavLeftSide", "topNavRightSide"];
|
|
90
|
+
|
|
91
|
+
const { container } = render(
|
|
92
|
+
<UiShell
|
|
93
|
+
appComponent={<div />}
|
|
94
|
+
appRootElement={document.createElement("div")}
|
|
95
|
+
onSubscriptionCreated={() => {}}
|
|
96
|
+
optionalComponents={
|
|
97
|
+
Object.fromEntries(
|
|
98
|
+
optionalComponentTestIds.map((testId) => [
|
|
99
|
+
testId,
|
|
100
|
+
<div data-testid={testId} />,
|
|
101
|
+
]),
|
|
102
|
+
) as Record<keyof UiShellProps["optionalComponents"], ReactElement>
|
|
103
|
+
}
|
|
104
|
+
stylesRootElement={document.createElement("div")}
|
|
105
|
+
subscribeToPropChanges={() => () => {}}
|
|
106
|
+
/>,
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
optionalComponentTestIds.forEach((testId) => {
|
|
110
|
+
expect(within(container).getByTestId(testId)).toBeInTheDocument();
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test("renders optionally-available `componentSlots`", async () => {
|
|
115
|
+
const optionalComponentTestIds: Array<
|
|
116
|
+
keyof Required<UiShellProps>["optionalComponents"]
|
|
117
|
+
> = ["sideNavFooter"];
|
|
118
|
+
|
|
119
|
+
// This is the subscription we give the component, and then once subscribed, we're going to immediately call it with new props.
|
|
120
|
+
const subscribeToPropChanges: UiShellProps["subscribeToPropChanges"] = (
|
|
121
|
+
subscriber,
|
|
122
|
+
) => {
|
|
123
|
+
subscriber({
|
|
124
|
+
...defaultComponentProps,
|
|
125
|
+
sideNavProps: {
|
|
126
|
+
appName: "",
|
|
127
|
+
hasCustomFooter: true,
|
|
128
|
+
sideNavItems: [],
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
return () => {};
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const { container } = render(
|
|
136
|
+
<UiShell
|
|
137
|
+
appComponent={<div />}
|
|
138
|
+
appRootElement={document.createElement("div")}
|
|
139
|
+
onSubscriptionCreated={() => {}}
|
|
140
|
+
optionalComponents={
|
|
141
|
+
Object.fromEntries(
|
|
142
|
+
optionalComponentTestIds.map((testId) => [
|
|
143
|
+
testId,
|
|
144
|
+
<div data-testid={testId} />,
|
|
145
|
+
]),
|
|
146
|
+
) as Record<keyof UiShellProps["optionalComponents"], ReactElement>
|
|
147
|
+
}
|
|
148
|
+
stylesRootElement={document.createElement("div")}
|
|
149
|
+
subscribeToPropChanges={subscribeToPropChanges}
|
|
150
|
+
/>,
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
optionalComponentTestIds.forEach((testId) => {
|
|
154
|
+
expect(within(container).getByTestId(testId)).toBeInTheDocument();
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test("unsubscribes from prop changes when unmounted", async () => {
|
|
159
|
+
const rootElement = document.createElement("div");
|
|
160
|
+
|
|
161
|
+
// If this isn't appended to the DOM, the React app won't exist because of how Web Components run.
|
|
162
|
+
document.body.append(rootElement);
|
|
163
|
+
|
|
164
|
+
const unsubscribeFromPropChanges = jest.fn();
|
|
165
|
+
const subscribeToPropChanges = jest.fn(() => unsubscribeFromPropChanges);
|
|
166
|
+
|
|
167
|
+
const { unmount } = render(
|
|
168
|
+
<UiShell
|
|
169
|
+
appComponent={<div />}
|
|
170
|
+
appRootElement={document.createElement("div")}
|
|
171
|
+
onSubscriptionCreated={() => {}}
|
|
172
|
+
stylesRootElement={document.createElement("div")}
|
|
173
|
+
subscribeToPropChanges={subscribeToPropChanges}
|
|
174
|
+
/>,
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
unmount();
|
|
178
|
+
|
|
179
|
+
expect(subscribeToPropChanges).toHaveBeenCalledTimes(1);
|
|
180
|
+
expect(unsubscribeFromPropChanges).toHaveBeenCalledTimes(1);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("allows changing props through the subscription", async () => {
|
|
184
|
+
const rootElement = document.createElement("div");
|
|
185
|
+
const sideNavItemText = "Add New Folder";
|
|
186
|
+
|
|
187
|
+
// If this isn't appended to the DOM, the React app won't exist because of how Web Components run.
|
|
188
|
+
document.body.append(rootElement);
|
|
189
|
+
|
|
190
|
+
// This is the subscription we give the component, and then once subscribed, we're going to immediately call it with new props.
|
|
191
|
+
const subscribeToPropChanges: UiShellProps["subscribeToPropChanges"] = (
|
|
192
|
+
subscriber,
|
|
193
|
+
) => {
|
|
194
|
+
subscriber({
|
|
195
|
+
...defaultComponentProps,
|
|
196
|
+
sideNavProps: {
|
|
197
|
+
appName: "",
|
|
198
|
+
sideNavItems: [
|
|
199
|
+
{
|
|
200
|
+
id: "AddNewFolder",
|
|
201
|
+
label: sideNavItemText,
|
|
202
|
+
onClick: () => {},
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
return () => {};
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
const { container } = render(
|
|
212
|
+
<UiShell
|
|
213
|
+
appComponent={<div />}
|
|
214
|
+
appRootElement={document.createElement("div")}
|
|
215
|
+
onSubscriptionCreated={() => {}}
|
|
216
|
+
stylesRootElement={document.createElement("div")}
|
|
217
|
+
subscribeToPropChanges={subscribeToPropChanges}
|
|
218
|
+
/>,
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
expect(container).toHaveTextContent(sideNavItemText);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
test("uses default props if no value passed to subscription", async () => {
|
|
225
|
+
const rootElement = document.createElement("div");
|
|
226
|
+
|
|
227
|
+
// If this isn't appended to the DOM, the React app won't exist because of how Web Components run.
|
|
228
|
+
document.body.append(rootElement);
|
|
229
|
+
|
|
230
|
+
// This is the subscription we give the component, and then once subscribed, we're going to immediately call it with new props.
|
|
231
|
+
const subscribeToPropChanges: UiShellProps["subscribeToPropChanges"] = (
|
|
232
|
+
subscriber,
|
|
233
|
+
) => {
|
|
234
|
+
// @ts-expect-error This unit test is checking what happens when we don't pass a value.
|
|
235
|
+
subscriber();
|
|
236
|
+
|
|
237
|
+
return () => {};
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
const { container } = render(
|
|
241
|
+
<UiShell
|
|
242
|
+
appComponent={<div />}
|
|
243
|
+
appRootElement={document.createElement("div")}
|
|
244
|
+
onSubscriptionCreated={() => {}}
|
|
245
|
+
stylesRootElement={document.createElement("div")}
|
|
246
|
+
subscribeToPropChanges={subscribeToPropChanges}
|
|
247
|
+
/>,
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
expect(container).toBeInTheDocument();
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
test("has previous state in prop change subscription", async () => {
|
|
254
|
+
const rootElement = document.createElement("div");
|
|
255
|
+
|
|
256
|
+
// If this isn't appended to the DOM, the React app won't exist because of how Web Components run.
|
|
257
|
+
document.body.append(rootElement);
|
|
258
|
+
|
|
259
|
+
// This passed to React's state setter. The return value here prevents a test error. It wouldn't be required otherwise as this test could care less what's returned.
|
|
260
|
+
const stateUpdater = jest.fn(() => defaultComponentProps);
|
|
261
|
+
|
|
262
|
+
// This is the subscription we give the component, and then once subscribed, we're going to immediately call it to see if it passes us the previous state.
|
|
263
|
+
const subscribeToPropChanges: UiShellProps["subscribeToPropChanges"] = (
|
|
264
|
+
subscriber,
|
|
265
|
+
) => {
|
|
266
|
+
subscriber(stateUpdater);
|
|
267
|
+
|
|
268
|
+
return () => {};
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
render(
|
|
272
|
+
<UiShell
|
|
273
|
+
appComponent={<div />}
|
|
274
|
+
appRootElement={document.createElement("div")}
|
|
275
|
+
onSubscriptionCreated={() => {}}
|
|
276
|
+
stylesRootElement={document.createElement("div")}
|
|
277
|
+
subscribeToPropChanges={subscribeToPropChanges}
|
|
278
|
+
/>,
|
|
279
|
+
);
|
|
280
|
+
|
|
281
|
+
expect(stateUpdater).toHaveBeenCalledWith(defaultComponentProps);
|
|
282
|
+
expect(stateUpdater).toHaveBeenCalledTimes(1);
|
|
283
|
+
});
|
|
284
|
+
});
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2024-present, Okta, Inc. and/or its affiliates. All rights reserved.
|
|
3
|
+
* The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
|
|
4
|
+
*
|
|
5
|
+
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
|
6
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
8
|
+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
*
|
|
10
|
+
* See the License for the specific language governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { memo, useEffect, useState, type SetStateAction } from "react";
|
|
14
|
+
import { ErrorBoundary } from "react-error-boundary";
|
|
15
|
+
|
|
16
|
+
import { CssBaseline } from "../../CssBaseline";
|
|
17
|
+
import { OdysseyProvider } from "../../OdysseyProvider";
|
|
18
|
+
import {
|
|
19
|
+
UiShellContent,
|
|
20
|
+
type UiShellContentProps,
|
|
21
|
+
type UiShellNavComponentProps,
|
|
22
|
+
} from "./UiShellContent";
|
|
23
|
+
import { type ReactRootElements } from "../../web-component";
|
|
24
|
+
|
|
25
|
+
export const defaultComponentProps: UiShellNavComponentProps = {
|
|
26
|
+
sideNavProps: {
|
|
27
|
+
appName: "",
|
|
28
|
+
sideNavItems: [],
|
|
29
|
+
},
|
|
30
|
+
topNavProps: {},
|
|
31
|
+
} as const;
|
|
32
|
+
|
|
33
|
+
export type UiShellProps = {
|
|
34
|
+
/**
|
|
35
|
+
* Notifies when subscribed to prop changes.
|
|
36
|
+
*
|
|
37
|
+
* UI Shell listens to prop updates, and it won't subscribe synchronously. Because of that, this callback notifies when that subscription is ready.
|
|
38
|
+
*/
|
|
39
|
+
onSubscriptionCreated: () => void;
|
|
40
|
+
/**
|
|
41
|
+
* This is a callback that provides a subscriber callback to listen for changes to state.
|
|
42
|
+
* It allows UI Shell to listen for state changes.
|
|
43
|
+
*
|
|
44
|
+
* The props coming in this callback go directly to a React state; therefore, it shares the same signature and provides a previous state.
|
|
45
|
+
*/
|
|
46
|
+
subscribeToPropChanges: (
|
|
47
|
+
subscriber: (
|
|
48
|
+
componentProps: SetStateAction<UiShellNavComponentProps>,
|
|
49
|
+
) => void,
|
|
50
|
+
) => () => void;
|
|
51
|
+
} & Pick<ReactRootElements, "appRootElement" | "stylesRootElement"> &
|
|
52
|
+
Pick<UiShellContentProps, "appComponent" | "onError" | "optionalComponents">;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Our new Unified Platform UI Shell.
|
|
56
|
+
*
|
|
57
|
+
* This includes the top and side navigation as well as the footer and provides a spot for your app to render into.
|
|
58
|
+
*
|
|
59
|
+
* If an error occurs, this will revert to only showing the app.
|
|
60
|
+
*/
|
|
61
|
+
const UiShell = ({
|
|
62
|
+
appComponent,
|
|
63
|
+
appRootElement,
|
|
64
|
+
onError = console.error,
|
|
65
|
+
onSubscriptionCreated,
|
|
66
|
+
optionalComponents,
|
|
67
|
+
stylesRootElement,
|
|
68
|
+
subscribeToPropChanges,
|
|
69
|
+
}: UiShellProps) => {
|
|
70
|
+
const [componentProps, setComponentProps] = useState(defaultComponentProps);
|
|
71
|
+
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
const unsubscribe = subscribeToPropChanges((componentProps) => {
|
|
74
|
+
// If for some reason nothing is passed as `componentProps`, we fallback on `defaultComponentProps` as a safety mechanism to ensure nothing breaks.
|
|
75
|
+
setComponentProps(componentProps || defaultComponentProps);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
onSubscriptionCreated();
|
|
79
|
+
|
|
80
|
+
return () => {
|
|
81
|
+
unsubscribe();
|
|
82
|
+
};
|
|
83
|
+
}, [onSubscriptionCreated, subscribeToPropChanges]);
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<ErrorBoundary fallback={appComponent} onError={onError}>
|
|
87
|
+
<OdysseyProvider
|
|
88
|
+
emotionRootElement={stylesRootElement}
|
|
89
|
+
shadowRootElement={appRootElement}
|
|
90
|
+
>
|
|
91
|
+
<ErrorBoundary fallback={appComponent} onError={onError}>
|
|
92
|
+
<CssBaseline />
|
|
93
|
+
|
|
94
|
+
<UiShellContent
|
|
95
|
+
{...componentProps}
|
|
96
|
+
appComponent={appComponent}
|
|
97
|
+
onError={onError}
|
|
98
|
+
optionalComponents={optionalComponents}
|
|
99
|
+
/>
|
|
100
|
+
</ErrorBoundary>
|
|
101
|
+
</OdysseyProvider>
|
|
102
|
+
</ErrorBoundary>
|
|
103
|
+
);
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const MemoizedUiShell = memo(UiShell);
|
|
107
|
+
MemoizedUiShell.displayName = "UiShell";
|
|
108
|
+
|
|
109
|
+
export { MemoizedUiShell as UiShell };
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2024-present, Okta, Inc. and/or its affiliates. All rights reserved.
|
|
3
|
+
* The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
|
|
4
|
+
*
|
|
5
|
+
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
|
6
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
8
|
+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
*
|
|
10
|
+
* See the License for the specific language governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import styled from "@emotion/styled";
|
|
14
|
+
import { memo, type ReactElement, type ReactNode } from "react";
|
|
15
|
+
import { ErrorBoundary, ErrorBoundaryProps } from "react-error-boundary";
|
|
16
|
+
|
|
17
|
+
import { SideNav, type SideNavProps } from "../SideNav";
|
|
18
|
+
import { TopNav, type TopNavProps } from "../TopNav";
|
|
19
|
+
import {
|
|
20
|
+
useOdysseyDesignTokens,
|
|
21
|
+
type DesignTokens,
|
|
22
|
+
} from "../../OdysseyDesignTokensContext";
|
|
23
|
+
import { useScrollState } from "./useScrollState";
|
|
24
|
+
|
|
25
|
+
const StyledAppContainer = styled("div", {
|
|
26
|
+
shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
|
|
27
|
+
})<{
|
|
28
|
+
odysseyDesignTokens: DesignTokens;
|
|
29
|
+
}>(({ odysseyDesignTokens }) => ({
|
|
30
|
+
gridArea: "app-content",
|
|
31
|
+
overflowX: "hidden",
|
|
32
|
+
overflowY: "auto",
|
|
33
|
+
paddingBlock: odysseyDesignTokens.Spacing5,
|
|
34
|
+
paddingInline: odysseyDesignTokens.Spacing8,
|
|
35
|
+
}));
|
|
36
|
+
|
|
37
|
+
const StyledBannersContainer = styled("div")(() => ({
|
|
38
|
+
gridArea: "banners",
|
|
39
|
+
}));
|
|
40
|
+
|
|
41
|
+
const StyledSideNavContainer = styled("div")(() => ({
|
|
42
|
+
gridArea: "side-nav",
|
|
43
|
+
}));
|
|
44
|
+
|
|
45
|
+
const StyledShellContainer = styled("div", {
|
|
46
|
+
shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
|
|
47
|
+
})<{
|
|
48
|
+
odysseyDesignTokens: DesignTokens;
|
|
49
|
+
}>(({ odysseyDesignTokens }) => ({
|
|
50
|
+
backgroundColor: odysseyDesignTokens.HueNeutral50,
|
|
51
|
+
display: "grid",
|
|
52
|
+
gridGap: 0,
|
|
53
|
+
gridTemplateAreas: `
|
|
54
|
+
"banners banners"
|
|
55
|
+
"side-nav top-nav"
|
|
56
|
+
"side-nav app-content"
|
|
57
|
+
`,
|
|
58
|
+
gridTemplateColumns: "auto 1fr",
|
|
59
|
+
gridTemplateRows: "auto auto 1fr",
|
|
60
|
+
height: "100vh",
|
|
61
|
+
width: "100vw",
|
|
62
|
+
}));
|
|
63
|
+
|
|
64
|
+
const StyledTopNavContainer = styled("div")(() => ({
|
|
65
|
+
gridArea: "top-nav",
|
|
66
|
+
}));
|
|
67
|
+
|
|
68
|
+
export type UiShellNavComponentProps = {
|
|
69
|
+
/**
|
|
70
|
+
* Object that gets pass directly to the side nav component.
|
|
71
|
+
*/
|
|
72
|
+
sideNavProps?: Omit<SideNavProps, "footerComponent">;
|
|
73
|
+
/**
|
|
74
|
+
* Object that gets pass directly to the top nav component.
|
|
75
|
+
*/
|
|
76
|
+
topNavProps: Omit<TopNavProps, "leftSideComponent" | "rightSideComponent">;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export type UiShellContentProps = {
|
|
80
|
+
/**
|
|
81
|
+
* React app component that renders as children in the correct location of the shell.
|
|
82
|
+
*/
|
|
83
|
+
appComponent: ReactNode;
|
|
84
|
+
/**
|
|
85
|
+
* Notifies when a React rendering error occurs. This could be useful for logging, flagging "p0"s, and recovering UI Shell when errors occur.
|
|
86
|
+
*/
|
|
87
|
+
onError?: ErrorBoundaryProps["onError"];
|
|
88
|
+
/**
|
|
89
|
+
* Components that will render as children of various other components such as the top nav or side nav.
|
|
90
|
+
*/
|
|
91
|
+
optionalComponents?: {
|
|
92
|
+
banners?: ReactElement;
|
|
93
|
+
sideNavFooter?: SideNavProps["footerComponent"];
|
|
94
|
+
topNavLeftSide?: TopNavProps["leftSideComponent"];
|
|
95
|
+
topNavRightSide?: TopNavProps["rightSideComponent"];
|
|
96
|
+
};
|
|
97
|
+
} & UiShellNavComponentProps;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Our new Unified Platform UI Shell.
|
|
101
|
+
*
|
|
102
|
+
* This includes the top and side navigation as well as the footer and provides a spot for your app to render into.
|
|
103
|
+
*
|
|
104
|
+
* If an error occurs, this will revert to only showing the app.
|
|
105
|
+
*/
|
|
106
|
+
const UiShellContent = ({
|
|
107
|
+
appComponent,
|
|
108
|
+
onError = console.error,
|
|
109
|
+
optionalComponents,
|
|
110
|
+
sideNavProps,
|
|
111
|
+
topNavProps,
|
|
112
|
+
}: UiShellContentProps) => {
|
|
113
|
+
const odysseyDesignTokens = useOdysseyDesignTokens();
|
|
114
|
+
const { isContentScrolled, scrollableContentRef } = useScrollState();
|
|
115
|
+
|
|
116
|
+
return (
|
|
117
|
+
<StyledShellContainer odysseyDesignTokens={odysseyDesignTokens}>
|
|
118
|
+
<StyledBannersContainer>
|
|
119
|
+
{optionalComponents?.banners}
|
|
120
|
+
</StyledBannersContainer>
|
|
121
|
+
|
|
122
|
+
<StyledSideNavContainer>
|
|
123
|
+
{sideNavProps && (
|
|
124
|
+
<ErrorBoundary fallback={null} onError={onError}>
|
|
125
|
+
<SideNav
|
|
126
|
+
{...{
|
|
127
|
+
...sideNavProps,
|
|
128
|
+
...(sideNavProps.hasCustomFooter &&
|
|
129
|
+
optionalComponents?.sideNavFooter
|
|
130
|
+
? {
|
|
131
|
+
footerComponent: optionalComponents.sideNavFooter,
|
|
132
|
+
footerItems: undefined,
|
|
133
|
+
hasCustomFooter: sideNavProps.hasCustomFooter,
|
|
134
|
+
}
|
|
135
|
+
: {
|
|
136
|
+
footerItems: sideNavProps.footerItems,
|
|
137
|
+
hasCustomFooter: false,
|
|
138
|
+
}),
|
|
139
|
+
}}
|
|
140
|
+
/>
|
|
141
|
+
</ErrorBoundary>
|
|
142
|
+
)}
|
|
143
|
+
</StyledSideNavContainer>
|
|
144
|
+
|
|
145
|
+
<StyledTopNavContainer>
|
|
146
|
+
<ErrorBoundary fallback={null} onError={onError}>
|
|
147
|
+
<TopNav
|
|
148
|
+
{...topNavProps}
|
|
149
|
+
isScrolled={isContentScrolled}
|
|
150
|
+
leftSideComponent={optionalComponents?.topNavLeftSide}
|
|
151
|
+
rightSideComponent={optionalComponents?.topNavRightSide}
|
|
152
|
+
/>
|
|
153
|
+
</ErrorBoundary>
|
|
154
|
+
</StyledTopNavContainer>
|
|
155
|
+
|
|
156
|
+
<StyledAppContainer
|
|
157
|
+
odysseyDesignTokens={odysseyDesignTokens}
|
|
158
|
+
tabIndex={0}
|
|
159
|
+
ref={scrollableContentRef}
|
|
160
|
+
>
|
|
161
|
+
{appComponent}
|
|
162
|
+
</StyledAppContainer>
|
|
163
|
+
</StyledShellContainer>
|
|
164
|
+
);
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
const MemoizedUiShellContent = memo(UiShellContent);
|
|
168
|
+
MemoizedUiShellContent.displayName = "UiShellContent";
|
|
169
|
+
|
|
170
|
+
export { MemoizedUiShellContent as UiShellContent };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2024-present, Okta, Inc. and/or its affiliates. All rights reserved.
|
|
3
|
+
* The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
|
|
4
|
+
*
|
|
5
|
+
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
|
6
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
8
|
+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
*
|
|
10
|
+
* See the License for the specific language governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { bufferLatest } from "./bufferLatest";
|
|
14
|
+
import { createMessageBus } from "./createMessageBus";
|
|
15
|
+
|
|
16
|
+
describe("bufferLatest", () => {
|
|
17
|
+
test("calls subscriber after ready", async () => {
|
|
18
|
+
const { publish: publish1, subscribe: subscribe1 } = createMessageBus();
|
|
19
|
+
|
|
20
|
+
const { publish: publish2, subscribe: subscribe2 } = createMessageBus();
|
|
21
|
+
|
|
22
|
+
const subscriber = jest.fn();
|
|
23
|
+
|
|
24
|
+
subscribe1(subscriber);
|
|
25
|
+
|
|
26
|
+
const bufferedPublish1 = bufferLatest({
|
|
27
|
+
publish: publish1,
|
|
28
|
+
subscribe: subscribe2,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
publish2();
|
|
32
|
+
bufferedPublish1();
|
|
33
|
+
|
|
34
|
+
expect(subscriber).toHaveBeenCalledTimes(1);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test("calls subscriber before ready", async () => {
|
|
38
|
+
const { publish: publish1, subscribe: subscribe1 } = createMessageBus();
|
|
39
|
+
|
|
40
|
+
const { publish: publish2, subscribe: subscribe2 } = createMessageBus();
|
|
41
|
+
|
|
42
|
+
const subscriber = jest.fn();
|
|
43
|
+
|
|
44
|
+
subscribe1(subscriber);
|
|
45
|
+
|
|
46
|
+
const bufferedPublish1 = bufferLatest({
|
|
47
|
+
publish: publish1,
|
|
48
|
+
subscribe: subscribe2,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
bufferedPublish1();
|
|
52
|
+
publish2();
|
|
53
|
+
|
|
54
|
+
expect(subscriber).toHaveBeenCalledTimes(1);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("keeps only the last value passed when ready", async () => {
|
|
58
|
+
const { publish: publish1, subscribe: subscribe1 } =
|
|
59
|
+
createMessageBus<string>();
|
|
60
|
+
|
|
61
|
+
const { publish: publish2, subscribe: subscribe2 } = createMessageBus();
|
|
62
|
+
|
|
63
|
+
const subscriber = jest.fn();
|
|
64
|
+
|
|
65
|
+
subscribe1(subscriber);
|
|
66
|
+
|
|
67
|
+
const bufferedPublish1 = bufferLatest({
|
|
68
|
+
publish: publish1,
|
|
69
|
+
subscribe: subscribe2,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
bufferedPublish1("a");
|
|
73
|
+
bufferedPublish1("b");
|
|
74
|
+
publish2();
|
|
75
|
+
|
|
76
|
+
expect(subscriber).toHaveBeenCalledWith("b");
|
|
77
|
+
expect(subscriber).toHaveBeenCalledTimes(1);
|
|
78
|
+
});
|
|
79
|
+
});
|