@graphcommerce/next-ui 4.11.2 → 4.13.1

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.
@@ -0,0 +1,237 @@
1
+ import styled from '@emotion/styled'
2
+ import { i18n } from '@lingui/core'
3
+ import { Trans } from '@lingui/react'
4
+ import { Box, Fab, SxProps, Theme, useEventCallback, useMediaQuery } from '@mui/material'
5
+ import { m } from 'framer-motion'
6
+ import { IconSvg, useIconSvgSize } from '../../IconSvg'
7
+ import { LayoutHeaderContent } from '../../Layout/components/LayoutHeaderContent'
8
+ import { LayoutTitle } from '../../Layout/components/LayoutTitle'
9
+ import { Overlay } from '../../Overlay/components/Overlay'
10
+ import { extendableComponent } from '../../Styles/extendableComponent'
11
+ import { useFabSize } from '../../Theme'
12
+ import { iconClose, iconChevronLeft } from '../../icons'
13
+ import {
14
+ isNavigationButton,
15
+ isNavigationComponent,
16
+ NavigationContextType,
17
+ NavigationNodeButton,
18
+ NavigationNodeHref,
19
+ useNavigation,
20
+ } from '../hooks/useNavigation'
21
+ import { NavigationList } from './NavigationList'
22
+
23
+ type NavigationOverlayProps = {
24
+ active: boolean
25
+ sx?: SxProps<Theme>
26
+ stretchColumns?: boolean
27
+ itemWidth: string
28
+ }
29
+
30
+ function findCurrent(
31
+ items: NavigationContextType['items'],
32
+ selected: NavigationContextType['selected'],
33
+ ): NavigationNodeHref | NavigationNodeButton | undefined {
34
+ const lastItem = selected.slice(-1)[0]
35
+
36
+ if (!lastItem) return undefined
37
+
38
+ for (const item of items) {
39
+ // eslint-disable-next-line no-continue
40
+ if (isNavigationComponent(item)) continue
41
+
42
+ // If the item is the current one, return it
43
+ if (item.id === lastItem) return item
44
+
45
+ // Recursively find item
46
+ if (isNavigationButton(item)) return findCurrent(item.childItems, selected)
47
+ }
48
+ return undefined
49
+ }
50
+
51
+ const MotionDiv = styled(m.div)()
52
+
53
+ const componentName = 'Navigation'
54
+ const parts = ['root', 'navigation', 'header', 'column'] as const
55
+ const { classes } = extendableComponent(componentName, parts)
56
+
57
+ export function NavigationOverlay(props: NavigationOverlayProps) {
58
+ const { active, sx, stretchColumns, itemWidth } = props
59
+ const { selected, select, items, onClose } = useNavigation()
60
+
61
+ const fabSize = useFabSize('responsive')
62
+ const svgSize = useIconSvgSize('large')
63
+
64
+ const isMobile = useMediaQuery<Theme>((theme) => theme.breakpoints.down('md'))
65
+ const handleOnBack = useEventCallback(() => {
66
+ if (isMobile) select(selected.slice(0, -1))
67
+ else select([])
68
+ })
69
+
70
+ const showBack = selected.length > 0
71
+
72
+ return (
73
+ <Overlay
74
+ className={classes.root}
75
+ active={active}
76
+ onClosed={onClose}
77
+ variantSm='left'
78
+ sizeSm='floating'
79
+ justifySm='start'
80
+ variantMd='left'
81
+ sizeMd='floating'
82
+ justifyMd='start'
83
+ sx={{
84
+ zIndex: 'drawer',
85
+ '& .LayoutOverlayBase-overlayPane': {
86
+ minWidth: 'auto !important',
87
+ width: 'max-content',
88
+ overflow: 'hidden',
89
+ display: 'grid',
90
+ gridTemplateRows: 'auto 1fr',
91
+ },
92
+ }}
93
+ >
94
+ <MotionDiv layout style={{ display: 'grid' }}>
95
+ <Box
96
+ className={classes.header}
97
+ sx={(theme) => ({
98
+ top: 0,
99
+ position: 'sticky',
100
+ height: { xs: theme.appShell.headerHeightSm, md: theme.appShell.appBarHeightMd },
101
+ zIndex: 1,
102
+ })}
103
+ >
104
+ <LayoutHeaderContent
105
+ floatingMd={false}
106
+ floatingSm={false}
107
+ switchPoint={0}
108
+ layout='position'
109
+ left={
110
+ showBack && (
111
+ <Fab
112
+ color='inherit'
113
+ onClick={handleOnBack}
114
+ sx={{
115
+ boxShadow: 'none',
116
+ marginLeft: `calc((${fabSize} - ${svgSize}) * -0.5)`,
117
+ marginRight: `calc((${fabSize} - ${svgSize}) * -0.5)`,
118
+ }}
119
+ size='responsive'
120
+ aria-label={i18n._(/* i18n */ 'Back')}
121
+ >
122
+ <IconSvg src={iconChevronLeft} size='large' aria-hidden />
123
+ </Fab>
124
+ )
125
+ }
126
+ right={
127
+ <Fab
128
+ color='inherit'
129
+ onClick={() => onClose()}
130
+ sx={{
131
+ boxShadow: 'none',
132
+ marginLeft: `calc((${fabSize} - ${svgSize}) * -0.5)`,
133
+ marginRight: `calc((${fabSize} - ${svgSize}) * -0.5)`,
134
+ }}
135
+ size='responsive'
136
+ aria-label={i18n._(/* i18n */ 'Close')}
137
+ >
138
+ <IconSvg src={iconClose} size='large' aria-hidden />
139
+ </Fab>
140
+ }
141
+ >
142
+ <LayoutTitle size='small' component='span'>
143
+ {findCurrent(items, selected)?.name ?? <Trans id='Menu' />}
144
+ </LayoutTitle>
145
+ </LayoutHeaderContent>
146
+ </Box>
147
+ </MotionDiv>
148
+
149
+ <MotionDiv layout='position' style={{ display: 'grid' }}>
150
+ <Box
151
+ sx={(theme) => ({
152
+ display: 'grid',
153
+ alignItems: !stretchColumns ? 'start' : undefined,
154
+
155
+ [theme.breakpoints.down('md')]: {
156
+ overflow: 'hidden',
157
+ scrollSnapType: 'x mandatory',
158
+ width: `calc(${theme.spacings.md} + ${theme.spacings.md} + ${itemWidth})`,
159
+ },
160
+ '& .NavigationItem-item': {
161
+ width: itemWidth,
162
+ },
163
+ })}
164
+ >
165
+ <Box
166
+ className={classes.navigation}
167
+ sx={[
168
+ (theme) => ({
169
+ py: theme.spacings.md,
170
+ display: 'grid',
171
+ gridAutoFlow: 'column',
172
+ scrollSnapAlign: 'end',
173
+ '& > ul > li > a, & > ul > li > [role=button]': {
174
+ '& span': {
175
+ typography: 'h2',
176
+ },
177
+ // '& svg': { display: 'none' },
178
+ },
179
+ '& .Navigation-column': {},
180
+ '& .NavigationItem-item': {
181
+ mx: theme.spacings.md,
182
+ whiteSpace: 'nowrap',
183
+ },
184
+ '& .NavigationItem-item.first': {
185
+ // mt: theme.spacings.md,
186
+ },
187
+ '& .Navigation-column:first-of-type': {
188
+ boxShadow: 'none',
189
+ },
190
+ }),
191
+ ...(Array.isArray(sx) ? sx : [sx]),
192
+ ]}
193
+ >
194
+ {selected.length >= 0 && (
195
+ <Box
196
+ sx={(theme) => ({
197
+ gridArea: '1 / 1 / 999 / 2',
198
+ boxShadow: `inset 1px 0 ${theme.palette.divider}`,
199
+ })}
200
+ className={classes.column}
201
+ />
202
+ )}
203
+ {selected.length >= 1 && (
204
+ <Box
205
+ sx={(theme) => ({
206
+ gridArea: '1 / 2 / 999 / 3',
207
+ boxShadow: `inset 1px 0 ${theme.palette.divider}`,
208
+ })}
209
+ className={classes.column}
210
+ />
211
+ )}
212
+ {selected.length >= 2 && (
213
+ <Box
214
+ sx={(theme) => ({
215
+ gridArea: '1 / 3 / 999 / 4',
216
+ boxShadow: `inset 1px 0 ${theme.palette.divider}`,
217
+ })}
218
+ className={classes.column}
219
+ />
220
+ )}
221
+ {selected.length >= 3 && (
222
+ <Box
223
+ sx={(theme) => ({
224
+ gridArea: '1 / 4 / 999 / 5',
225
+ boxShadow: `inset 1px 0 ${theme.palette.divider}`,
226
+ })}
227
+ className={classes.column}
228
+ />
229
+ )}
230
+
231
+ <NavigationList items={items} selected />
232
+ </Box>
233
+ </Box>
234
+ </MotionDiv>
235
+ </Overlay>
236
+ )
237
+ }
@@ -0,0 +1,66 @@
1
+ import { useEventCallback } from '@mui/material'
2
+ import { MotionConfig } from 'framer-motion'
3
+ import { useState, useMemo } from 'react'
4
+ import { isElement } from 'react-is'
5
+ import {
6
+ NavigationNode,
7
+ NavigationPath,
8
+ NavigationContextType,
9
+ NavigationContext,
10
+ NavigationSelect,
11
+ } from '../hooks/useNavigation'
12
+
13
+ export type NavigationProviderProps = {
14
+ items: (NavigationNode | React.ReactElement)[]
15
+ hideRootOnNavigate?: boolean
16
+ closeAfterNavigate?: boolean
17
+ children?: React.ReactNode
18
+ animationDuration?: number
19
+ onChange?: NavigationSelect
20
+ onClose?: NavigationContextType['onClose']
21
+ }
22
+
23
+ const nonNullable = <T,>(value: T): value is NonNullable<T> => value !== null && value !== undefined
24
+
25
+ export function NavigationProvider(props: NavigationProviderProps) {
26
+ const {
27
+ items,
28
+ onChange,
29
+ hideRootOnNavigate = true,
30
+ closeAfterNavigate = false,
31
+ animationDuration = 0.275,
32
+ children,
33
+ onClose: onCloseUnstable,
34
+ } = props
35
+
36
+ const [selected, setSelected] = useState<NavigationPath>([])
37
+
38
+ const select = useEventCallback((incomming: NavigationPath) => {
39
+ setSelected(incomming)
40
+ onChange?.(incomming)
41
+ })
42
+
43
+ const onClose: NavigationContextType['onClose'] = useEventCallback((e, href) => {
44
+ onCloseUnstable?.(e, href)
45
+ setTimeout(() => select([]), animationDuration * 1000)
46
+ })
47
+
48
+ const value = useMemo<NavigationContextType>(
49
+ () => ({
50
+ hideRootOnNavigate,
51
+ selected,
52
+ select,
53
+ items: items
54
+ .map((item, index) => (isElement(item) ? { id: item.key ?? index, component: item } : item))
55
+ .filter(nonNullable),
56
+ onClose,
57
+ }),
58
+ [hideRootOnNavigate, selected, select, items, onClose],
59
+ )
60
+
61
+ return (
62
+ <MotionConfig transition={{ duration: animationDuration }}>
63
+ <NavigationContext.Provider value={value}>{children}</NavigationContext.Provider>
64
+ </MotionConfig>
65
+ )
66
+ }
@@ -0,0 +1,58 @@
1
+ import { createContext, useContext } from 'react'
2
+
3
+ export type NavigationId = string | number
4
+ export type NavigationPath = NavigationId[]
5
+ export type NavigationSelect = (selected: NavigationPath) => void
6
+ export type NavigationRender = React.FC<
7
+ (NavigationNodeComponent | NavigationNodeHref) & { children?: React.ReactNode }
8
+ >
9
+
10
+ export type NavigationOnClose = (
11
+ event?: React.MouseEvent<HTMLAnchorElement>,
12
+ href?: string | undefined,
13
+ ) => void
14
+ export type NavigationContextType = {
15
+ selected: NavigationPath
16
+ select: NavigationSelect
17
+ items: NavigationNode[]
18
+ hideRootOnNavigate: boolean
19
+ onClose: NavigationOnClose
20
+ }
21
+
22
+ type NavigationNodeBase = {
23
+ id: NavigationId
24
+ }
25
+
26
+ export type NavigationNodeHref = NavigationNodeBase & {
27
+ name: string
28
+ href: string
29
+ }
30
+
31
+ export type NavigationNodeButton = NavigationNodeBase & {
32
+ name: string
33
+ childItems: NavigationNode[]
34
+ }
35
+
36
+ export type NavigationNodeComponent = NavigationNodeBase & {
37
+ component: React.ReactNode
38
+ }
39
+
40
+ export type NavigationNode = NavigationNodeHref | NavigationNodeButton | NavigationNodeComponent
41
+
42
+ export function isNavigationHref(node: NavigationNodeBase): node is NavigationNodeHref {
43
+ return 'href' in node
44
+ }
45
+
46
+ export function isNavigationButton(node: NavigationNodeBase): node is NavigationNodeButton {
47
+ return (node as NavigationNodeButton).childItems?.length > 0
48
+ }
49
+
50
+ export function isNavigationComponent(node: NavigationNodeBase): node is NavigationNodeComponent {
51
+ return 'component' in node
52
+ }
53
+
54
+ export const NavigationContext = createContext(undefined as unknown as NavigationContextType)
55
+
56
+ export function useNavigation() {
57
+ return useContext(NavigationContext)
58
+ }
@@ -0,0 +1,4 @@
1
+ export * from './components/NavigationOverlay'
2
+ export * from './components/NavigationFab'
3
+ export * from './hooks/useNavigation'
4
+ export * from './components/NavigationProvider'
@@ -0,0 +1,61 @@
1
+ import { ScrollerProvider, ScrollSnapType } from '@graphcommerce/framer-scroller'
2
+ import { Box } from '@mui/material'
3
+ import { useEffect, useState } from 'react'
4
+ import type { SetOptional } from 'type-fest'
5
+ import { OverlayBase, LayoutOverlayBaseProps } from './OverlayBase'
6
+
7
+ export type OverlayProps = Omit<
8
+ SetOptional<LayoutOverlayBaseProps, 'variantSm' | 'variantMd'>,
9
+ 'direction' | 'offsetPageY' | 'isPresent' | 'safeToRemove'
10
+ >
11
+
12
+ export function Overlay(props: OverlayProps) {
13
+ const { children, variantSm = 'bottom', variantMd = 'right', active, ...otherProps } = props
14
+
15
+ const scrollSnapTypeSm: ScrollSnapType =
16
+ variantSm === 'left' || variantSm === 'right' ? 'inline mandatory' : 'block proximity'
17
+ const scrollSnapTypeMd: ScrollSnapType =
18
+ variantMd === 'left' || variantMd === 'right' ? 'inline mandatory' : 'block proximity'
19
+
20
+ // todo: The overlay is always present in the DOM and the initial scroll position is set to 0.
21
+ // This means in this case that the overlay is visisble. LayoutOverlayBase sets the scroll position to 320 with JS.
22
+ // This would cause the overlay to be visisble for a moment before the scroll position is set.
23
+ // The solution is to set the the first scroll-snap-align and scroll-snap-stop to the open position of the overlay.
24
+ // However: We have control of the LayoutOverlayBase, we do not have control of all the child components so that solution will not work..
25
+ const [loaded, setLoaded] = useState(false)
26
+ useEffect(() => setLoaded(true), [])
27
+
28
+ return (
29
+ <Box
30
+ className='Overlay'
31
+ sx={{
32
+ position: 'fixed',
33
+ top: 0,
34
+ left: 0,
35
+ transform: loaded ? undefined : 'translateX(-200vw)',
36
+ pointerEvents: active ? undefined : 'none',
37
+ right: 0,
38
+ bottom: 0,
39
+ zIndex: 'drawer',
40
+ '& .LayoutOverlayBase-overlayPane': {
41
+ boxShadow: active ? undefined : 0,
42
+ },
43
+ }}
44
+ >
45
+ <ScrollerProvider scrollSnapTypeSm={scrollSnapTypeSm} scrollSnapTypeMd={scrollSnapTypeMd}>
46
+ <OverlayBase
47
+ offsetPageY={0}
48
+ variantMd={variantMd}
49
+ variantSm={variantSm}
50
+ direction={1}
51
+ active={active}
52
+ isPresent={active}
53
+ safeToRemove={undefined}
54
+ {...otherProps}
55
+ >
56
+ {children}
57
+ </OverlayBase>
58
+ </ScrollerProvider>
59
+ </Box>
60
+ )
61
+ }
@@ -1,4 +1,3 @@
1
- import { useGo, usePageContext, useScrollOffset } from '@graphcommerce/framer-next-pages'
2
1
  import { Scroller, useScrollerContext, useScrollTo } from '@graphcommerce/framer-scroller'
3
2
  import {
4
3
  clientSizeCssVar,
@@ -6,7 +5,7 @@ import {
6
5
  useIsomorphicLayoutEffect,
7
6
  } from '@graphcommerce/framer-utils'
8
7
  import { Box, styled, SxProps, Theme, useTheme, useThemeProps } from '@mui/material'
9
- import { m, useDomEvent, useMotionValue, usePresence, useTransform } from 'framer-motion'
8
+ import { m, useDomEvent, useMotionValue, useTransform } from 'framer-motion'
10
9
  import React, { useCallback, useEffect, useRef } from 'react'
11
10
  import { LayoutProvider } from '../../Layout/components/LayoutProvider'
12
11
  import { ExtendableComponent, extendableComponent } from '../../Styles'
@@ -35,6 +34,12 @@ export type LayoutOverlayBaseProps = {
35
34
  className?: string
36
35
  sx?: SxProps<Theme>
37
36
  sxBackdrop?: SxProps<Theme>
37
+ active: boolean
38
+ direction: 1 | -1
39
+ onClosed: () => void
40
+ offsetPageY: number
41
+ isPresent: boolean
42
+ safeToRemove: (() => void) | null | undefined
38
43
  } & StyleProps &
39
44
  OverridableProps
40
45
 
@@ -61,7 +66,7 @@ const clearScrollLock = () => {
61
66
  document.body.style.overflow = ''
62
67
  }
63
68
 
64
- export function LayoutOverlayBase(incommingProps: LayoutOverlayBaseProps) {
69
+ export function OverlayBase(incommingProps: LayoutOverlayBaseProps) {
65
70
  const props = useThemeProps({ name, props: incommingProps })
66
71
 
67
72
  const {
@@ -75,6 +80,12 @@ export function LayoutOverlayBase(incommingProps: LayoutOverlayBaseProps) {
75
80
  justifyMd = 'stretch',
76
81
  sx = [],
77
82
  sxBackdrop = [],
83
+ active,
84
+ onClosed,
85
+ direction,
86
+ offsetPageY,
87
+ isPresent,
88
+ safeToRemove,
78
89
  } = props
79
90
 
80
91
  const th = useTheme()
@@ -88,12 +99,8 @@ export function LayoutOverlayBase(incommingProps: LayoutOverlayBaseProps) {
88
99
  const { scrollerRef, snap } = useScrollerContext()
89
100
  const positions = useOverlayPosition()
90
101
  const scrollTo = useScrollTo()
91
- const [isPresent, safeToRemove] = usePresence()
92
102
  const beforeRef = useRef<HTMLDivElement>(null)
93
103
 
94
- const { closeSteps, active, direction } = usePageContext()
95
- const close = useGo(closeSteps * -1)
96
-
97
104
  const position = useMotionValue<OverlayPosition>(OverlayPosition.UNOPENED)
98
105
 
99
106
  const classes = withState({ variantSm, variantMd, sizeSm, sizeMd, justifySm, justifyMd })
@@ -105,7 +112,15 @@ export function LayoutOverlayBase(incommingProps: LayoutOverlayBaseProps) {
105
112
  // When the component is mounted, we need to set the initial position of the overlay.
106
113
  useIsomorphicLayoutEffect(() => {
107
114
  const scroller = scrollerRef.current
108
- if (!scroller || !isPresent) return undefined
115
+
116
+ if (!scroller) return undefined
117
+
118
+ if (!isPresent && position.get() === OverlayPosition.UNOPENED) {
119
+ scroller.scrollLeft = positions.closed.x.get()
120
+ scroller.scrollTop = positions.closed.y.get()
121
+ }
122
+
123
+ if (!isPresent) return undefined
109
124
 
110
125
  const open = { x: positions.open.x.get(), y: positions.open.y.get() }
111
126
 
@@ -148,7 +163,7 @@ export function LayoutOverlayBase(incommingProps: LayoutOverlayBaseProps) {
148
163
 
149
164
  // When the overlay is closed by navigating away, we're closing the overlay.
150
165
  useEffect(() => {
151
- if (isPresent) return
166
+ if (isPresent || position.get() === OverlayPosition.UNOPENED) return
152
167
  position.set(OverlayPosition.CLOSED)
153
168
  clearScrollLock()
154
169
 
@@ -164,8 +179,8 @@ export function LayoutOverlayBase(incommingProps: LayoutOverlayBaseProps) {
164
179
  if (position.get() !== OverlayPosition.OPENED) return
165
180
  position.set(OverlayPosition.CLOSED)
166
181
  clearScrollLock()
167
- close()
168
- }, [close, position])
182
+ onClosed()
183
+ }, [onClosed, position])
169
184
 
170
185
  // Handle escape key
171
186
  const windowRef = useRef(typeof window !== 'undefined' ? window : null)
@@ -187,7 +202,6 @@ export function LayoutOverlayBase(incommingProps: LayoutOverlayBaseProps) {
187
202
  }, [offsetY])
188
203
 
189
204
  // Create the exact position for the LayoutProvider which offsets the top of the overlay
190
- const offsetPageY = useScrollOffset().y
191
205
  const scrollWithoffset = useTransform(
192
206
  [scroll.y, positions.open.y, offsetY],
193
207
  ([y, openY, offsetYv]: number[]) => Math.max(0, y - openY - offsetYv + offsetPageY),
@@ -333,7 +347,6 @@ export function LayoutOverlayBase(incommingProps: LayoutOverlayBaseProps) {
333
347
  marginTop: `calc(${smSpacingTop} * -1)`,
334
348
  paddingTop: smSpacingTop,
335
349
  },
336
-
337
350
  '&.sizeSmFloating': {
338
351
  padding: `${theme.page.vertical} ${theme.page.horizontal}`,
339
352
  },
@@ -353,7 +366,8 @@ export function LayoutOverlayBase(incommingProps: LayoutOverlayBaseProps) {
353
366
  },
354
367
  })}
355
368
  >
356
- <Box
369
+ <MotionDiv
370
+ layout
357
371
  className={classes.overlayPane}
358
372
  sx={(theme) => ({
359
373
  pointerEvents: 'all',
@@ -419,7 +433,7 @@ export function LayoutOverlayBase(incommingProps: LayoutOverlayBaseProps) {
419
433
  })}
420
434
  >
421
435
  <LayoutProvider scroll={scrollWithoffset}>{children}</LayoutProvider>
422
- </Box>
436
+ </MotionDiv>
423
437
  </Box>
424
438
  </Scroller>
425
439
  </>
@@ -0,0 +1,2 @@
1
+ export * from './OverlayBase'
2
+ export * from './Overlay'
@@ -0,0 +1 @@
1
+ export * from './components'
@@ -1,10 +1,8 @@
1
1
  import { usePageContext } from '@graphcommerce/framer-next-pages'
2
- import {
3
- resolveHref,
4
- addBasePath,
5
- addLocale,
6
- getDomainLocale,
7
- } from 'next/dist/shared/lib/router/router'
2
+ import { addBasePath } from 'next/dist/client/add-base-path'
3
+ import { addLocale } from 'next/dist/client/add-locale'
4
+ import { getDomainLocale } from 'next/dist/client/get-domain-locale'
5
+ import { resolveHref } from 'next/dist/shared/lib/router/router'
8
6
  import Head from 'next/head'
9
7
  import { useRouter } from 'next/router'
10
8
 
@@ -108,11 +108,7 @@ export function DarkLightModeMenuSecondaryItem(props: ListItemButtonProps) {
108
108
  <IconSvg src={currentMode === 'light' ? iconMoon : iconSun} size='medium' />
109
109
  </ListItemIcon>
110
110
  <ListItemText>
111
- {currentMode === 'light' ? (
112
- <Trans id='Switch to Dark Mode' />
113
- ) : (
114
- <Trans id='Switch to Light Mode' />
115
- )}
111
+ {currentMode === 'light' ? <Trans id='Dark Mode' /> : <Trans id='Light Mode' />}
116
112
  </ListItemText>
117
113
  </ListItemButton>
118
114
  )
package/index.ts CHANGED
@@ -1,5 +1,5 @@
1
- export * from './ActionCard/ActionCardList'
2
1
  export * from './ActionCard/ActionCard'
2
+ export * from './ActionCard/ActionCardList'
3
3
  export * from './AnimatedRow/AnimatedRow'
4
4
  export * from './Blog/BlogAuthor/BlogAuthor'
5
5
  export * from './Blog/BlogContent/BlogContent'
@@ -22,6 +22,7 @@ export * from './Form/InputCheckmark'
22
22
  export * from './FramerScroller'
23
23
  export * from './FullPageMessage/FullPageMessage'
24
24
  export * from './Highlight/Highlight'
25
+ export * from './hooks'
25
26
  export * from './IconHeader/IconHeader'
26
27
  export * from './icons'
27
28
  export * from './IconSvg'
@@ -30,6 +31,8 @@ export * from './Layout'
30
31
  export * from './LayoutDefault'
31
32
  export * from './LayoutOverlay'
32
33
  export * from './LayoutParts'
34
+ export * from './Navigation'
35
+ export * from './Overlay'
33
36
  export * from './Page'
34
37
  export * from './PageLoadIndicator/PageLoadIndicator'
35
38
  export * from './PageMeta/PageMeta'
@@ -39,8 +42,8 @@ export * from './Row'
39
42
  export * from './SectionContainer/SectionContainer'
40
43
  export * from './SectionHeader/SectionHeader'
41
44
  export * from './Separator/Separator'
42
- export * from './Snackbar/MessageSnackbar'
43
45
  export * from './Snackbar/ErrorSnackbar'
46
+ export * from './Snackbar/MessageSnackbar'
44
47
  export * from './Snackbar/MessageSnackbarImpl'
45
48
  export * from './StarRatingField/StarRatingField'
46
49
  export * from './Stepper/Stepper'
@@ -50,6 +53,5 @@ export * from './Theme'
50
53
  export * from './TimeAgo/TimeAgo'
51
54
  export * from './ToggleButton/ToggleButton'
52
55
  export * from './ToggleButtonGroup/ToggleButtonGroup'
53
- export * from './hooks'
54
56
  export * from './UspList/UspList'
55
57
  export * from './UspList/UspListItem'
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@graphcommerce/next-ui",
3
3
  "homepage": "https://www.graphcommerce.org/",
4
4
  "repository": "github:graphcommerce-org/graphcommerce",
5
- "version": "4.11.2",
5
+ "version": "4.13.1",
6
6
  "author": "",
7
7
  "license": "MIT",
8
8
  "sideEffects": false,
@@ -15,15 +15,15 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "@emotion/babel-preset-css-prop": "^11.2.0",
18
- "@emotion/cache": "^11.7.1",
19
- "@emotion/react": "^11.9.0",
18
+ "@emotion/cache": "^11.9.3",
19
+ "@emotion/react": "^11.9.3",
20
20
  "@emotion/server": "^11.4.0",
21
- "@emotion/styled": "^11.6.0",
22
- "@graphcommerce/framer-next-pages": "3.2.3",
23
- "@graphcommerce/framer-scroller": "2.1.20",
21
+ "@emotion/styled": "^11.9.3",
22
+ "@graphcommerce/framer-next-pages": "3.2.4",
23
+ "@graphcommerce/framer-scroller": "2.1.23",
24
24
  "@graphcommerce/framer-utils": "3.1.4",
25
25
  "@graphcommerce/image": "3.1.7",
26
- "react-is": "^18.1.0",
26
+ "react-is": "^18.2.0",
27
27
  "react-schemaorg": "^2.0.0",
28
28
  "schema-dts": "^1.1.0"
29
29
  },
@@ -38,12 +38,12 @@
38
38
  "react-dom": "^18.0.0"
39
39
  },
40
40
  "devDependencies": {
41
- "@graphcommerce/eslint-config-pwa": "^4.1.8",
41
+ "@graphcommerce/eslint-config-pwa": "^4.1.9",
42
42
  "@graphcommerce/prettier-config-pwa": "^4.0.6",
43
- "@graphcommerce/typescript-config-pwa": "^4.0.3",
43
+ "@graphcommerce/typescript-config-pwa": "^4.0.4",
44
44
  "@playwright/test": "^1.21.1",
45
45
  "@types/react-is": "^17.0.3",
46
46
  "type-fest": "^2.12.2",
47
- "typescript": "4.7.3"
47
+ "typescript": "4.7.4"
48
48
  }
49
49
  }