@cerberus-design/react 0.0.1-next-bbce7d4 → 0.0.1-next-7d9e858
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/build/legacy/_tsup-dts-rollup.d.cts +96 -1
- package/build/legacy/_tsup-dts-rollup.d.ts +96 -1
- package/build/legacy/aria-helpers/nav-menu.aria.cjs +36 -0
- package/build/legacy/aria-helpers/nav-menu.aria.cjs.map +1 -0
- package/build/legacy/aria-helpers/nav-menu.aria.d.cts +2 -0
- package/build/legacy/aria-helpers/nav-menu.aria.d.ts +2 -0
- package/build/legacy/aria-helpers/nav-menu.aria.js +11 -0
- package/build/legacy/aria-helpers/nav-menu.aria.js.map +1 -0
- package/build/legacy/components/Button.cjs.map +1 -1
- package/build/legacy/components/Button.js.map +1 -1
- package/build/legacy/components/NavMenuLink.cjs +38 -0
- package/build/legacy/components/NavMenuLink.cjs.map +1 -0
- package/build/legacy/components/NavMenuLink.d.cts +2 -0
- package/build/legacy/components/NavMenuLink.d.ts +2 -0
- package/build/legacy/components/NavMenuLink.js +13 -0
- package/build/legacy/components/NavMenuLink.js.map +1 -0
- package/build/legacy/components/NavMenuList.cjs +81 -0
- package/build/legacy/components/NavMenuList.cjs.map +1 -0
- package/build/legacy/components/NavMenuList.d.cts +3 -0
- package/build/legacy/components/NavMenuList.d.ts +3 -0
- package/build/legacy/components/NavMenuList.js +56 -0
- package/build/legacy/components/NavMenuList.js.map +1 -0
- package/build/legacy/components/NavMenuTrigger.cjs +98 -0
- package/build/legacy/components/NavMenuTrigger.cjs.map +1 -0
- package/build/legacy/components/NavMenuTrigger.d.cts +2 -0
- package/build/legacy/components/NavMenuTrigger.d.ts +2 -0
- package/build/legacy/components/NavMenuTrigger.js +78 -0
- package/build/legacy/components/NavMenuTrigger.js.map +1 -0
- package/build/legacy/context/navMenu.cjs +70 -0
- package/build/legacy/context/navMenu.cjs.map +1 -0
- package/build/legacy/context/navMenu.d.cts +5 -0
- package/build/legacy/context/navMenu.d.ts +5 -0
- package/build/legacy/context/navMenu.js +52 -0
- package/build/legacy/context/navMenu.js.map +1 -0
- package/build/legacy/context/theme.cjs +3 -9
- package/build/legacy/context/theme.cjs.map +1 -1
- package/build/legacy/context/theme.js +3 -9
- package/build/legacy/context/theme.js.map +1 -1
- package/build/legacy/index.cjs +13 -1
- package/build/legacy/index.cjs.map +1 -1
- package/build/legacy/index.d.cts +15 -0
- package/build/legacy/index.d.ts +15 -0
- package/build/legacy/index.js +6 -0
- package/build/legacy/index.js.map +1 -1
- package/build/legacy/types.cjs +19 -0
- package/build/legacy/types.cjs.map +1 -0
- package/build/legacy/types.d.cts +1 -0
- package/build/legacy/types.d.ts +1 -0
- package/build/legacy/types.js +1 -0
- package/build/legacy/types.js.map +1 -0
- package/build/modern/_tsup-dts-rollup.d.cts +96 -1
- package/build/modern/_tsup-dts-rollup.d.ts +96 -1
- package/build/modern/aria-helpers/nav-menu.aria.cjs +36 -0
- package/build/modern/aria-helpers/nav-menu.aria.cjs.map +1 -0
- package/build/modern/aria-helpers/nav-menu.aria.d.cts +2 -0
- package/build/modern/aria-helpers/nav-menu.aria.d.ts +2 -0
- package/build/modern/aria-helpers/nav-menu.aria.js +11 -0
- package/build/modern/aria-helpers/nav-menu.aria.js.map +1 -0
- package/build/modern/components/Button.cjs.map +1 -1
- package/build/modern/components/Button.js.map +1 -1
- package/build/modern/components/NavMenuLink.cjs +38 -0
- package/build/modern/components/NavMenuLink.cjs.map +1 -0
- package/build/modern/components/NavMenuLink.d.cts +2 -0
- package/build/modern/components/NavMenuLink.d.ts +2 -0
- package/build/modern/components/NavMenuLink.js +13 -0
- package/build/modern/components/NavMenuLink.js.map +1 -0
- package/build/modern/components/NavMenuList.cjs +81 -0
- package/build/modern/components/NavMenuList.cjs.map +1 -0
- package/build/modern/components/NavMenuList.d.cts +3 -0
- package/build/modern/components/NavMenuList.d.ts +3 -0
- package/build/modern/components/NavMenuList.js +56 -0
- package/build/modern/components/NavMenuList.js.map +1 -0
- package/build/modern/components/NavMenuTrigger.cjs +98 -0
- package/build/modern/components/NavMenuTrigger.cjs.map +1 -0
- package/build/modern/components/NavMenuTrigger.d.cts +2 -0
- package/build/modern/components/NavMenuTrigger.d.ts +2 -0
- package/build/modern/components/NavMenuTrigger.js +78 -0
- package/build/modern/components/NavMenuTrigger.js.map +1 -0
- package/build/modern/context/navMenu.cjs +70 -0
- package/build/modern/context/navMenu.cjs.map +1 -0
- package/build/modern/context/navMenu.d.cts +5 -0
- package/build/modern/context/navMenu.d.ts +5 -0
- package/build/modern/context/navMenu.js +52 -0
- package/build/modern/context/navMenu.js.map +1 -0
- package/build/modern/context/theme.cjs +3 -9
- package/build/modern/context/theme.cjs.map +1 -1
- package/build/modern/context/theme.js +3 -9
- package/build/modern/context/theme.js.map +1 -1
- package/build/modern/index.cjs +13 -1
- package/build/modern/index.cjs.map +1 -1
- package/build/modern/index.d.cts +15 -0
- package/build/modern/index.d.ts +15 -0
- package/build/modern/index.js +6 -0
- package/build/modern/index.js.map +1 -1
- package/build/modern/types.cjs +19 -0
- package/build/modern/types.cjs.map +1 -0
- package/build/modern/types.d.cts +1 -0
- package/build/modern/types.d.ts +1 -0
- package/build/modern/types.js +1 -0
- package/build/modern/types.js.map +1 -0
- package/package.json +1 -1
- package/src/aria-helpers/nav-menu.aria.ts +11 -0
- package/src/components/Button.tsx +4 -0
- package/src/components/NavMenuLink.tsx +21 -0
- package/src/components/NavMenuList.tsx +61 -0
- package/src/components/NavMenuTrigger.tsx +89 -0
- package/src/context/navMenu.tsx +65 -0
- package/src/context/theme.tsx +3 -9
- package/src/index.ts +12 -0
- package/src/types.ts +1 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useMemo, type HTMLAttributes } from 'react'
|
|
4
|
+
import { useNavMenuContext } from '../context/navMenu'
|
|
5
|
+
import { Show } from './Show'
|
|
6
|
+
import type { Positions } from '../types'
|
|
7
|
+
import { css, cx } from '@cerberus-design/styled-system/css'
|
|
8
|
+
|
|
9
|
+
export function getPosition(position: Positions) {
|
|
10
|
+
const defaultPositions = {
|
|
11
|
+
left: 'auto',
|
|
12
|
+
right: 'auto',
|
|
13
|
+
top: 'auto',
|
|
14
|
+
bottom: 'auto',
|
|
15
|
+
}
|
|
16
|
+
switch (position) {
|
|
17
|
+
case 'right':
|
|
18
|
+
return { ...defaultPositions, bottom: '50%', left: '110%' }
|
|
19
|
+
case 'left':
|
|
20
|
+
return { ...defaultPositions, bottom: '50%', right: '110%' }
|
|
21
|
+
case 'bottom':
|
|
22
|
+
return { ...defaultPositions, top: '110%' }
|
|
23
|
+
case 'top':
|
|
24
|
+
return { ...defaultPositions, bottom: '110%' }
|
|
25
|
+
default:
|
|
26
|
+
return defaultPositions
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// <NavMenuList />
|
|
31
|
+
|
|
32
|
+
export interface NavMenuListProps extends HTMLAttributes<HTMLUListElement> {
|
|
33
|
+
id: string
|
|
34
|
+
position?: Positions
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function NavMenuList(props: NavMenuListProps) {
|
|
38
|
+
const { position, ...nativeProps } = props
|
|
39
|
+
const { menuRef, expanded } = useNavMenuContext()
|
|
40
|
+
const locationStyles = useMemo(
|
|
41
|
+
() => getPosition(position ?? 'bottom'),
|
|
42
|
+
[position],
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<Show when={expanded}>
|
|
47
|
+
<ul
|
|
48
|
+
{...nativeProps}
|
|
49
|
+
className={cx(
|
|
50
|
+
nativeProps.className,
|
|
51
|
+
css({
|
|
52
|
+
position: 'absolute',
|
|
53
|
+
zIndex: 'dropdown',
|
|
54
|
+
}),
|
|
55
|
+
)}
|
|
56
|
+
ref={menuRef}
|
|
57
|
+
style={locationStyles}
|
|
58
|
+
/>
|
|
59
|
+
</Show>
|
|
60
|
+
)
|
|
61
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
useCallback,
|
|
5
|
+
type ButtonHTMLAttributes,
|
|
6
|
+
type ElementType,
|
|
7
|
+
type MouseEvent,
|
|
8
|
+
} from 'react'
|
|
9
|
+
import { cx } from '@cerberus-design/styled-system/css'
|
|
10
|
+
import { button } from '@cerberus-design/styled-system/recipes'
|
|
11
|
+
import {
|
|
12
|
+
createNavTriggerProps,
|
|
13
|
+
type NavTriggerAriaValues,
|
|
14
|
+
} from '../aria-helpers/nav-menu.aria'
|
|
15
|
+
import { Show } from './Show'
|
|
16
|
+
import type { ButtonProps } from './Button'
|
|
17
|
+
import { useNavMenuContext } from '../context/navMenu'
|
|
18
|
+
|
|
19
|
+
export interface NavMenuTriggerProps
|
|
20
|
+
extends ButtonHTMLAttributes<HTMLButtonElement>,
|
|
21
|
+
ButtonProps,
|
|
22
|
+
NavTriggerAriaValues {
|
|
23
|
+
as?: ElementType
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A component that allows the user to trigger a navigation menu.
|
|
28
|
+
* @description https://github.com/omnifed/cerberus/blob/main/packages/react/src/components/NavMenuTrigger.tsx
|
|
29
|
+
*/
|
|
30
|
+
export function NavMenuTrigger(props: NavMenuTriggerProps) {
|
|
31
|
+
const {
|
|
32
|
+
as,
|
|
33
|
+
palette,
|
|
34
|
+
usage,
|
|
35
|
+
shape,
|
|
36
|
+
controls,
|
|
37
|
+
expanded: propsExpanded,
|
|
38
|
+
onClick,
|
|
39
|
+
...nativeProps
|
|
40
|
+
} = props
|
|
41
|
+
const { triggerRef, onToggle, expanded } = useNavMenuContext()
|
|
42
|
+
const ariaProps = createNavTriggerProps({
|
|
43
|
+
controls,
|
|
44
|
+
expanded: propsExpanded ?? expanded,
|
|
45
|
+
})
|
|
46
|
+
const hasAs = Boolean(as)
|
|
47
|
+
const AsSub: ElementType = as!
|
|
48
|
+
|
|
49
|
+
const handleClick = useCallback(
|
|
50
|
+
(e: MouseEvent<HTMLButtonElement>) => {
|
|
51
|
+
if (onClick) return onClick(e)
|
|
52
|
+
onToggle()
|
|
53
|
+
},
|
|
54
|
+
[onClick, onToggle],
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
<Show
|
|
59
|
+
when={hasAs}
|
|
60
|
+
fallback={
|
|
61
|
+
<button
|
|
62
|
+
{...nativeProps}
|
|
63
|
+
{...ariaProps}
|
|
64
|
+
className={cx(
|
|
65
|
+
nativeProps.className,
|
|
66
|
+
button({
|
|
67
|
+
palette,
|
|
68
|
+
usage,
|
|
69
|
+
shape,
|
|
70
|
+
}),
|
|
71
|
+
)}
|
|
72
|
+
onClick={handleClick}
|
|
73
|
+
ref={triggerRef}
|
|
74
|
+
>
|
|
75
|
+
{props.children}
|
|
76
|
+
</button>
|
|
77
|
+
}
|
|
78
|
+
>
|
|
79
|
+
{hasAs && (
|
|
80
|
+
<AsSub
|
|
81
|
+
{...nativeProps}
|
|
82
|
+
{...ariaProps}
|
|
83
|
+
onClick={handleClick}
|
|
84
|
+
ref={triggerRef}
|
|
85
|
+
/>
|
|
86
|
+
)}
|
|
87
|
+
</Show>
|
|
88
|
+
)
|
|
89
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { css } from '@cerberus-design/styled-system/css'
|
|
4
|
+
import {
|
|
5
|
+
createContext,
|
|
6
|
+
useCallback,
|
|
7
|
+
useContext,
|
|
8
|
+
useMemo,
|
|
9
|
+
useRef,
|
|
10
|
+
useState,
|
|
11
|
+
type PropsWithChildren,
|
|
12
|
+
type RefObject,
|
|
13
|
+
} from 'react'
|
|
14
|
+
|
|
15
|
+
export type NavTriggerRef = RefObject<HTMLButtonElement>
|
|
16
|
+
export type NavMenuRef = RefObject<HTMLUListElement>
|
|
17
|
+
|
|
18
|
+
export interface NavMenuContextValue {
|
|
19
|
+
triggerRef: NavTriggerRef | null
|
|
20
|
+
menuRef: NavMenuRef | null
|
|
21
|
+
expanded: boolean
|
|
22
|
+
onToggle: () => void
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const NavMenuContext = createContext<NavMenuContextValue | null>(null)
|
|
26
|
+
|
|
27
|
+
export function NavMenu(props: PropsWithChildren) {
|
|
28
|
+
const triggerRef = useRef<HTMLButtonElement>(null)
|
|
29
|
+
const menuRef = useRef<HTMLUListElement>(null)
|
|
30
|
+
const [expanded, setExpanded] = useState<boolean>(false)
|
|
31
|
+
|
|
32
|
+
const handleToggle = useCallback(() => {
|
|
33
|
+
setExpanded((prev) => !prev)
|
|
34
|
+
}, [])
|
|
35
|
+
|
|
36
|
+
const value = useMemo(
|
|
37
|
+
() => ({
|
|
38
|
+
triggerRef,
|
|
39
|
+
menuRef,
|
|
40
|
+
expanded,
|
|
41
|
+
onToggle: handleToggle,
|
|
42
|
+
}),
|
|
43
|
+
[expanded, handleToggle],
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<NavMenuContext.Provider value={value}>
|
|
48
|
+
<nav
|
|
49
|
+
className={css({
|
|
50
|
+
position: 'relative',
|
|
51
|
+
})}
|
|
52
|
+
>
|
|
53
|
+
{props.children}
|
|
54
|
+
</nav>
|
|
55
|
+
</NavMenuContext.Provider>
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function useNavMenuContext() {
|
|
60
|
+
const context = useContext(NavMenuContext)
|
|
61
|
+
if (!context) {
|
|
62
|
+
throw new Error('useNavMenuContext must be used within a NavMenu.')
|
|
63
|
+
}
|
|
64
|
+
return context
|
|
65
|
+
}
|
package/src/context/theme.tsx
CHANGED
|
@@ -17,15 +17,9 @@ export interface ThemeContextValue<T extends DefaultThemes> {
|
|
|
17
17
|
export const THEME_KEY = 'cerberus-theme'
|
|
18
18
|
export const MODE_KEY = 'cerberus-mode'
|
|
19
19
|
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
updateTheme: () => {},
|
|
24
|
-
updateMode: () => {},
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const ThemeContext =
|
|
28
|
-
createContext<ThemeContextValue<DefaultThemes>>(initialThemeState)
|
|
20
|
+
const ThemeContext = createContext<ThemeContextValue<DefaultThemes> | null>(
|
|
21
|
+
null,
|
|
22
|
+
)
|
|
29
23
|
|
|
30
24
|
export function ThemeProvider(props: PropsWithChildren<unknown>) {
|
|
31
25
|
const state = useTheme()
|
package/src/index.ts
CHANGED
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
// components
|
|
2
2
|
|
|
3
3
|
export * from './components/Button'
|
|
4
|
+
export * from './components/NavMenuTrigger'
|
|
5
|
+
export * from './components/NavMenuList'
|
|
6
|
+
export * from './components/NavMenuLink'
|
|
4
7
|
export * from './components/Show'
|
|
5
8
|
|
|
6
9
|
// context
|
|
7
10
|
|
|
11
|
+
export * from './context/navMenu'
|
|
8
12
|
export * from './context/theme'
|
|
9
13
|
|
|
10
14
|
// hooks
|
|
11
15
|
|
|
12
16
|
export * from './hooks/useTheme'
|
|
17
|
+
|
|
18
|
+
// aria-helpers
|
|
19
|
+
|
|
20
|
+
export * from './aria-helpers/nav-menu.aria'
|
|
21
|
+
|
|
22
|
+
// shared types
|
|
23
|
+
|
|
24
|
+
export * from './types'
|
package/src/types.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type Positions = 'top' | 'right' | 'bottom' | 'left'
|