@cerberus-design/react 0.0.1-next-b88d5af → 0.0.1-next-ef8d639

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 +69 -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 +44 -0
  16. package/build/legacy/components/NavMenuLink.js.map +1 -0
  17. package/build/legacy/components/NavMenuList.cjs +107 -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 +82 -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 +69 -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 +44 -0
  66. package/build/modern/components/NavMenuLink.js.map +1 -0
  67. package/build/modern/components/NavMenuList.cjs +107 -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 +82 -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 +3 -3
  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 +43 -0
  105. package/src/components/NavMenuList.tsx +88 -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 @@
1
+ export { Positions_alias_1 as Positions } from './_tsup-dts-rollup';
@@ -0,0 +1 @@
1
+ export { Positions_alias_1 as Positions } from './_tsup-dts-rollup';
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cerberus-design/react",
3
- "version": "0.0.1-next-b88d5af",
3
+ "version": "0.0.1-next-ef8d639",
4
4
  "description": "The Cerberus Design React component library",
5
5
  "browserslist": "> 0.25%, not dead",
6
6
  "sideEffects": false,
@@ -20,8 +20,8 @@
20
20
  "react": "^18",
21
21
  "react-dom": "^18",
22
22
  "tsup": "^8.0.2",
23
- "@cerberus-design/styled-system": "0.0.0",
24
- "@cerberus-design/configs": "0.0.0"
23
+ "@cerberus-design/configs": "0.0.0",
24
+ "@cerberus-design/styled-system": "0.0.0"
25
25
  },
26
26
  "publishConfig": {
27
27
  "access": "public"
@@ -0,0 +1,11 @@
1
+ export interface NavTriggerAriaValues {
2
+ controls: string
3
+ expanded?: boolean
4
+ }
5
+
6
+ export function createNavTriggerProps(values: NavTriggerAriaValues) {
7
+ return {
8
+ ['aria-controls']: values.controls,
9
+ ['aria-expanded']: values.expanded ?? false,
10
+ }
11
+ }
@@ -8,6 +8,10 @@ export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
8
8
  shape?: 'sharp' | 'rounded'
9
9
  }
10
10
 
11
+ /**
12
+ * A component that allows the user to perform actions
13
+ * @description https://github.com/omnifed/cerberus/blob/main/packages/react/src/components/Button.tsx
14
+ */
11
15
  export function Button(props: ButtonProps) {
12
16
  const { palette, usage, shape, ...nativeProps } = props
13
17
  return (
@@ -0,0 +1,43 @@
1
+ import type { AnchorHTMLAttributes, ElementType } from 'react'
2
+ import { Show } from './Show'
3
+ import { css, cx } from '@cerberus-design/styled-system/css'
4
+
5
+ export interface NavMenuLinkProps
6
+ extends AnchorHTMLAttributes<HTMLAnchorElement> {
7
+ as?: ElementType
8
+ }
9
+
10
+ export function NavMenuLink(props: NavMenuLinkProps) {
11
+ const { as, ...nativeProps } = props
12
+ const hasAs = Boolean(as)
13
+ const AsSub: ElementType = as!
14
+
15
+ return (
16
+ <li
17
+ className={css({
18
+ w: 'full',
19
+ })}
20
+ >
21
+ <Show
22
+ when={hasAs}
23
+ fallback={
24
+ <a
25
+ {...nativeProps}
26
+ className={cx(
27
+ nativeProps.className,
28
+ css({
29
+ color: 'action.navigation.initial',
30
+ textStyle: 'link',
31
+ _hover: {
32
+ color: 'action.navigation.hover',
33
+ },
34
+ }),
35
+ )}
36
+ />
37
+ }
38
+ >
39
+ {hasAs && <AsSub {...nativeProps} />}
40
+ </Show>
41
+ </li>
42
+ )
43
+ }
@@ -0,0 +1,88 @@
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 { cx } from '@cerberus-design/styled-system/css'
8
+ import { vstack } from '@cerberus-design/styled-system/patterns'
9
+
10
+ export function getPosition(position: Positions) {
11
+ const defaultPositions = {
12
+ left: 'auto',
13
+ right: 'auto',
14
+ top: 'auto',
15
+ bottom: 'auto',
16
+ }
17
+ switch (position) {
18
+ case 'right':
19
+ return { ...defaultPositions, top: '0%', left: '105%' }
20
+ case 'left':
21
+ return { ...defaultPositions, top: '0%', right: '105%' }
22
+ case 'bottom':
23
+ return { ...defaultPositions, top: '110%' }
24
+ case 'top':
25
+ return { ...defaultPositions, bottom: '110%' }
26
+ default:
27
+ return defaultPositions
28
+ }
29
+ }
30
+
31
+ const navListStyles = vstack({
32
+ alignItems: 'flex-start',
33
+ bgColor: 'neutral.surface.100',
34
+ boxShadow: 'lg',
35
+ gap: '2',
36
+ opacity: '0',
37
+ p: '4',
38
+ position: 'absolute',
39
+ rounded: 'md',
40
+ zIndex: 'dropdown',
41
+ _motionSafe: {
42
+ animationName: 'zoomIn',
43
+ animationDelay: '100ms',
44
+ animationDuration: '150ms',
45
+ animationFillMode: 'both',
46
+ animationTimingFunction: 'ease-in-out',
47
+ },
48
+ _positionBottom: {
49
+ transformOrigin: 'top left',
50
+ },
51
+ _positionTop: {
52
+ transformOrigin: 'bottom left',
53
+ },
54
+ _positionLeft: {
55
+ transformOrigin: 'top right',
56
+ },
57
+ _positionRight: {
58
+ transformOrigin: 'top left',
59
+ },
60
+ })
61
+
62
+ // <NavMenuList />
63
+
64
+ export interface NavMenuListProps extends HTMLAttributes<HTMLUListElement> {
65
+ id: string
66
+ position?: Positions
67
+ }
68
+
69
+ export function NavMenuList(props: NavMenuListProps) {
70
+ const { position, ...nativeProps } = props
71
+ const { menuRef, expanded } = useNavMenuContext()
72
+ const locationStyles = useMemo(
73
+ () => getPosition(position ?? 'bottom'),
74
+ [position],
75
+ )
76
+
77
+ return (
78
+ <Show when={expanded}>
79
+ <ul
80
+ {...nativeProps}
81
+ data-position={position ?? 'bottom'}
82
+ className={cx(nativeProps.className, navListStyles)}
83
+ ref={menuRef}
84
+ style={locationStyles}
85
+ />
86
+ </Show>
87
+ )
88
+ }
@@ -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'