@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.
Files changed (110) hide show
  1. package/build/legacy/_tsup-dts-rollup.d.cts +96 -1
  2. package/build/legacy/_tsup-dts-rollup.d.ts +96 -1
  3. package/build/legacy/aria-helpers/nav-menu.aria.cjs +36 -0
  4. package/build/legacy/aria-helpers/nav-menu.aria.cjs.map +1 -0
  5. package/build/legacy/aria-helpers/nav-menu.aria.d.cts +2 -0
  6. package/build/legacy/aria-helpers/nav-menu.aria.d.ts +2 -0
  7. package/build/legacy/aria-helpers/nav-menu.aria.js +11 -0
  8. package/build/legacy/aria-helpers/nav-menu.aria.js.map +1 -0
  9. package/build/legacy/components/Button.cjs.map +1 -1
  10. package/build/legacy/components/Button.js.map +1 -1
  11. package/build/legacy/components/NavMenuLink.cjs +38 -0
  12. package/build/legacy/components/NavMenuLink.cjs.map +1 -0
  13. package/build/legacy/components/NavMenuLink.d.cts +2 -0
  14. package/build/legacy/components/NavMenuLink.d.ts +2 -0
  15. package/build/legacy/components/NavMenuLink.js +13 -0
  16. package/build/legacy/components/NavMenuLink.js.map +1 -0
  17. package/build/legacy/components/NavMenuList.cjs +81 -0
  18. package/build/legacy/components/NavMenuList.cjs.map +1 -0
  19. package/build/legacy/components/NavMenuList.d.cts +3 -0
  20. package/build/legacy/components/NavMenuList.d.ts +3 -0
  21. package/build/legacy/components/NavMenuList.js +56 -0
  22. package/build/legacy/components/NavMenuList.js.map +1 -0
  23. package/build/legacy/components/NavMenuTrigger.cjs +98 -0
  24. package/build/legacy/components/NavMenuTrigger.cjs.map +1 -0
  25. package/build/legacy/components/NavMenuTrigger.d.cts +2 -0
  26. package/build/legacy/components/NavMenuTrigger.d.ts +2 -0
  27. package/build/legacy/components/NavMenuTrigger.js +78 -0
  28. package/build/legacy/components/NavMenuTrigger.js.map +1 -0
  29. package/build/legacy/context/navMenu.cjs +70 -0
  30. package/build/legacy/context/navMenu.cjs.map +1 -0
  31. package/build/legacy/context/navMenu.d.cts +5 -0
  32. package/build/legacy/context/navMenu.d.ts +5 -0
  33. package/build/legacy/context/navMenu.js +52 -0
  34. package/build/legacy/context/navMenu.js.map +1 -0
  35. package/build/legacy/context/theme.cjs +3 -9
  36. package/build/legacy/context/theme.cjs.map +1 -1
  37. package/build/legacy/context/theme.js +3 -9
  38. package/build/legacy/context/theme.js.map +1 -1
  39. package/build/legacy/index.cjs +13 -1
  40. package/build/legacy/index.cjs.map +1 -1
  41. package/build/legacy/index.d.cts +15 -0
  42. package/build/legacy/index.d.ts +15 -0
  43. package/build/legacy/index.js +6 -0
  44. package/build/legacy/index.js.map +1 -1
  45. package/build/legacy/types.cjs +19 -0
  46. package/build/legacy/types.cjs.map +1 -0
  47. package/build/legacy/types.d.cts +1 -0
  48. package/build/legacy/types.d.ts +1 -0
  49. package/build/legacy/types.js +1 -0
  50. package/build/legacy/types.js.map +1 -0
  51. package/build/modern/_tsup-dts-rollup.d.cts +96 -1
  52. package/build/modern/_tsup-dts-rollup.d.ts +96 -1
  53. package/build/modern/aria-helpers/nav-menu.aria.cjs +36 -0
  54. package/build/modern/aria-helpers/nav-menu.aria.cjs.map +1 -0
  55. package/build/modern/aria-helpers/nav-menu.aria.d.cts +2 -0
  56. package/build/modern/aria-helpers/nav-menu.aria.d.ts +2 -0
  57. package/build/modern/aria-helpers/nav-menu.aria.js +11 -0
  58. package/build/modern/aria-helpers/nav-menu.aria.js.map +1 -0
  59. package/build/modern/components/Button.cjs.map +1 -1
  60. package/build/modern/components/Button.js.map +1 -1
  61. package/build/modern/components/NavMenuLink.cjs +38 -0
  62. package/build/modern/components/NavMenuLink.cjs.map +1 -0
  63. package/build/modern/components/NavMenuLink.d.cts +2 -0
  64. package/build/modern/components/NavMenuLink.d.ts +2 -0
  65. package/build/modern/components/NavMenuLink.js +13 -0
  66. package/build/modern/components/NavMenuLink.js.map +1 -0
  67. package/build/modern/components/NavMenuList.cjs +81 -0
  68. package/build/modern/components/NavMenuList.cjs.map +1 -0
  69. package/build/modern/components/NavMenuList.d.cts +3 -0
  70. package/build/modern/components/NavMenuList.d.ts +3 -0
  71. package/build/modern/components/NavMenuList.js +56 -0
  72. package/build/modern/components/NavMenuList.js.map +1 -0
  73. package/build/modern/components/NavMenuTrigger.cjs +98 -0
  74. package/build/modern/components/NavMenuTrigger.cjs.map +1 -0
  75. package/build/modern/components/NavMenuTrigger.d.cts +2 -0
  76. package/build/modern/components/NavMenuTrigger.d.ts +2 -0
  77. package/build/modern/components/NavMenuTrigger.js +78 -0
  78. package/build/modern/components/NavMenuTrigger.js.map +1 -0
  79. package/build/modern/context/navMenu.cjs +70 -0
  80. package/build/modern/context/navMenu.cjs.map +1 -0
  81. package/build/modern/context/navMenu.d.cts +5 -0
  82. package/build/modern/context/navMenu.d.ts +5 -0
  83. package/build/modern/context/navMenu.js +52 -0
  84. package/build/modern/context/navMenu.js.map +1 -0
  85. package/build/modern/context/theme.cjs +3 -9
  86. package/build/modern/context/theme.cjs.map +1 -1
  87. package/build/modern/context/theme.js +3 -9
  88. package/build/modern/context/theme.js.map +1 -1
  89. package/build/modern/index.cjs +13 -1
  90. package/build/modern/index.cjs.map +1 -1
  91. package/build/modern/index.d.cts +15 -0
  92. package/build/modern/index.d.ts +15 -0
  93. package/build/modern/index.js +6 -0
  94. package/build/modern/index.js.map +1 -1
  95. package/build/modern/types.cjs +19 -0
  96. package/build/modern/types.cjs.map +1 -0
  97. package/build/modern/types.d.cts +1 -0
  98. package/build/modern/types.d.ts +1 -0
  99. package/build/modern/types.js +1 -0
  100. package/build/modern/types.js.map +1 -0
  101. package/package.json +1 -1
  102. package/src/aria-helpers/nav-menu.aria.ts +11 -0
  103. package/src/components/Button.tsx +4 -0
  104. package/src/components/NavMenuLink.tsx +21 -0
  105. package/src/components/NavMenuList.tsx +61 -0
  106. package/src/components/NavMenuTrigger.tsx +89 -0
  107. package/src/context/navMenu.tsx +65 -0
  108. package/src/context/theme.tsx +3 -9
  109. package/src/index.ts +12 -0
  110. 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
+ }
@@ -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 initialThemeState = {
21
- theme: 'cerberus' as const,
22
- mode: 'light' as const,
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'