* docs: migrate ui docs to docs universe * created yarn workspace * added eslint and tsconfig configurations * fix eslint configurations * fixed eslint configurations * shared tailwind configurations * added shared ui package * added more shared components * migrating more components * made details components shared * move InlineCode component * moved InputText * moved Loading component * Moved Modal component * moved Select components * Moved Tooltip component * moved Search components * moved ColorMode provider * Moved Notification components and providers * used icons package * use UI colors in api-reference * moved Navbar component * used Navbar and Search in UI docs * added Feedback to UI docs * general enhancements * fix color mode * added copy colors file from ui-preset * added features and enhancements to UI docs * move Sidebar component and provider * general fixes and preparations for deployment * update docusaurus version * adjusted versions * fix output directory * remove rootDirectory property * fix yarn.lock * moved code component * added vale for all docs MD and MDX * fix tests * fix vale error * fix deployment errors * change ignore commands * add output directory * fix docs test * general fixes * content fixes * fix announcement script * added changeset * fix vale checks * added nofilter option * fix vale error
103 lines
2.5 KiB
TypeScript
103 lines
2.5 KiB
TypeScript
import React, {
|
|
createContext,
|
|
useCallback,
|
|
useContext,
|
|
useEffect,
|
|
useState,
|
|
} from "react"
|
|
import { prefersReducedMotion } from "@docusaurus/theme-common"
|
|
|
|
type SidebarContextType = {
|
|
hasSidebar: boolean
|
|
hiddenSidebar: boolean
|
|
setHiddenSidebar: (value: boolean) => void
|
|
hiddenSidebarContainer: boolean
|
|
setHiddenSidebarContainer: (value: boolean) => void
|
|
floatingSidebar: boolean
|
|
setFloatingSidebar: (value: boolean) => void
|
|
onCollapse: () => void
|
|
}
|
|
|
|
const SidebarContext = createContext<SidebarContextType | null>(null)
|
|
|
|
type SidebarProviderProps = {
|
|
sidebarName?: string
|
|
children?: React.ReactNode
|
|
}
|
|
|
|
const SidebarProvider: React.FC<SidebarProviderProps> = ({
|
|
sidebarName,
|
|
children,
|
|
}) => {
|
|
const [hiddenSidebar, setHiddenSidebar] = useState(false)
|
|
const [hiddenSidebarContainer, setHiddenSidebarContainer] = useState(false)
|
|
const [floatingSidebar, setFloatingSidebar] = useState(false)
|
|
|
|
const toggleSidebar = useCallback(() => {
|
|
if (hiddenSidebar) {
|
|
setHiddenSidebar(false)
|
|
}
|
|
// onTransitionEnd won't fire when sidebar animation is disabled
|
|
// fixes https://github.com/facebook/docusaurus/issues/8918
|
|
if (!hiddenSidebar && prefersReducedMotion()) {
|
|
setHiddenSidebar(true)
|
|
}
|
|
setHiddenSidebarContainer((value) => !value)
|
|
}, [setHiddenSidebarContainer, hiddenSidebar])
|
|
|
|
useEffect(() => {
|
|
function isEditingContent(event: KeyboardEvent) {
|
|
const element = event.target as HTMLElement
|
|
const tagName = element.tagName
|
|
return (
|
|
element.isContentEditable ||
|
|
tagName === "INPUT" ||
|
|
tagName === "SELECT" ||
|
|
tagName === "TEXTAREA"
|
|
)
|
|
}
|
|
|
|
function sidebarShortcut(e: KeyboardEvent) {
|
|
if (
|
|
(e.metaKey || e.ctrlKey) &&
|
|
e.key.toLowerCase() === "i" &&
|
|
!isEditingContent(e)
|
|
) {
|
|
e.preventDefault()
|
|
toggleSidebar()
|
|
}
|
|
}
|
|
|
|
window.addEventListener("keydown", sidebarShortcut)
|
|
|
|
return () => {
|
|
window.removeEventListener("keydown", sidebarShortcut)
|
|
}
|
|
})
|
|
|
|
return (
|
|
<SidebarContext.Provider
|
|
value={{
|
|
hasSidebar: sidebarName !== undefined,
|
|
hiddenSidebar,
|
|
setHiddenSidebar,
|
|
hiddenSidebarContainer,
|
|
setHiddenSidebarContainer,
|
|
floatingSidebar,
|
|
setFloatingSidebar,
|
|
onCollapse: toggleSidebar,
|
|
}}
|
|
>
|
|
{children}
|
|
</SidebarContext.Provider>
|
|
)
|
|
}
|
|
|
|
export default SidebarProvider
|
|
|
|
export const useSidebar = () => {
|
|
const context = useContext(SidebarContext)
|
|
|
|
return context
|
|
}
|