@luxfi/core 5.2.8 → 5.2.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (150) hide show
  1. package/commerce/ui/conf.ts +13 -13
  2. package/commerce/ui/context.tsx +126 -126
  3. package/commerce/ui/store.ts +304 -304
  4. package/components/access-code-input.tsx +71 -71
  5. package/components/auth/auth-listener.tsx +29 -29
  6. package/components/auth/auth-token/clear-auth-token.tsx +12 -12
  7. package/components/auth/auth-token/set-auth-token.tsx +16 -16
  8. package/components/auth/common-auth-domains.ts +16 -16
  9. package/components/auth/login-panel.tsx +107 -107
  10. package/components/back-button.tsx +42 -42
  11. package/components/chat-widget.tsx +85 -85
  12. package/components/commerce/add-widget.tsx +20 -20
  13. package/components/commerce/bag-button.tsx +98 -98
  14. package/components/commerce/buy-button.tsx +34 -34
  15. package/components/commerce/checkout-button.tsx +129 -129
  16. package/components/commerce/checkout-panel/dt-bag-carousel.tsx +36 -36
  17. package/components/commerce/checkout-panel/dt-checkout-panel.tsx +84 -84
  18. package/components/commerce/checkout-panel/index.tsx +129 -129
  19. package/components/commerce/checkout-panel/links-row.tsx +21 -21
  20. package/components/commerce/checkout-panel/mb-checkout-panel.tsx +54 -54
  21. package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
  22. package/components/commerce/checkout-panel/thank-you.tsx +18 -18
  23. package/components/commerce/checkout-widget/const.ts +13 -13
  24. package/components/commerce/checkout-widget/index.tsx +192 -192
  25. package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
  26. package/components/commerce/checkout-widget/use-anim-clx-set.ts +58 -58
  27. package/components/commerce/desktop-bag-popup.tsx +78 -78
  28. package/components/commerce/desktop-nav-menu.tsx +131 -130
  29. package/components/commerce/drawer/index.tsx +99 -99
  30. package/components/commerce/drawer/micro.tsx +144 -144
  31. package/components/commerce/drawer/shell.tsx +85 -85
  32. package/components/commerce/mobile-bag-drawer.tsx +51 -51
  33. package/components/commerce/mobile-login-button.tsx +101 -101
  34. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  35. package/components/commerce/mobile-nav-menu-ai.tsx +48 -42
  36. package/components/commerce/mobile-nav-menu-item.tsx +49 -49
  37. package/components/commerce/mobile-nav-menu.tsx +102 -68
  38. package/components/contact-dialog/contact-form.tsx +113 -113
  39. package/components/contact-dialog/disclaimer.tsx +13 -13
  40. package/components/contact-dialog/index.tsx +64 -64
  41. package/components/copyright.tsx +21 -21
  42. package/components/drawer-margin.tsx +25 -25
  43. package/components/footer.tsx +77 -77
  44. package/components/header/desktop.tsx +50 -49
  45. package/components/header/index.tsx +52 -52
  46. package/components/header/mobile.tsx +163 -163
  47. package/components/header/theme-toggle.tsx +26 -26
  48. package/components/icons/24k-gold-card.tsx +43 -0
  49. package/components/icons/ai-chat.tsx +29 -0
  50. package/components/icons/anodized-titanium.tsx +45 -0
  51. package/components/icons/avatar.tsx +11 -11
  52. package/components/icons/bag-icon.tsx +10 -10
  53. package/components/icons/blog.tsx +20 -0
  54. package/components/icons/bridge.tsx +68 -0
  55. package/components/icons/changelog.tsx +21 -0
  56. package/components/icons/chrome.tsx +45 -0
  57. package/components/icons/coins.tsx +20 -0
  58. package/components/icons/compare-cards.tsx +21 -0
  59. package/components/icons/credit.tsx +20 -0
  60. package/components/icons/customer-support.tsx +21 -0
  61. package/components/icons/customers.tsx +33 -0
  62. package/components/icons/developer-docs.tsx +20 -0
  63. package/components/icons/exchange.tsx +21 -0
  64. package/components/icons/explorer.tsx +22 -0
  65. package/components/icons/faqs.tsx +21 -0
  66. package/components/icons/github.tsx +14 -14
  67. package/components/icons/guides.tsx +21 -0
  68. package/components/icons/gun-metal.tsx +44 -0
  69. package/components/icons/index.tsx +43 -43
  70. package/components/icons/integrations.tsx +25 -0
  71. package/components/icons/irradescent.tsx +41 -0
  72. package/components/icons/launch-subnet.tsx +21 -0
  73. package/components/icons/left-arrow.tsx +11 -11
  74. package/components/icons/lux-finance.tsx +23 -0
  75. package/components/icons/lux-logo.tsx +10 -10
  76. package/components/icons/lux-pass.tsx +25 -0
  77. package/components/icons/lux-quests.tsx +21 -0
  78. package/components/icons/market.tsx +24 -0
  79. package/components/icons/mirrored-titanium.tsx +46 -0
  80. package/components/icons/more-benefits.tsx +21 -0
  81. package/components/icons/open-source.tsx +26 -0
  82. package/components/icons/right-arrow.tsx +10 -10
  83. package/components/icons/safe.tsx +37 -0
  84. package/components/icons/search.tsx +12 -12
  85. package/components/icons/secure-delivery.tsx +13 -13
  86. package/components/icons/shop.tsx +20 -0
  87. package/components/icons/social-icon.tsx +35 -35
  88. package/components/icons/social-svg.css +3 -3
  89. package/components/icons/sterling-silver-card.tsx +44 -0
  90. package/components/icons/templates.tsx +21 -0
  91. package/components/icons/validators.tsx +41 -0
  92. package/components/icons/view-all-card.tsx +20 -0
  93. package/components/icons/wallet.tsx +20 -0
  94. package/components/icons/warpcast.tsx +58 -58
  95. package/components/icons/youtube-logo.tsx +59 -59
  96. package/components/index.ts +27 -27
  97. package/components/logo.tsx +89 -89
  98. package/components/main.tsx +27 -27
  99. package/components/mini-chart/index.tsx +7 -7
  100. package/components/mini-chart/mini-chart-props.ts +43 -43
  101. package/components/mini-chart/mini-chart.tsx +85 -85
  102. package/components/mini-chart/wrapper.tsx +23 -23
  103. package/components/not-found/index.tsx +28 -28
  104. package/components/not-found/not-found-content.mdx +5 -5
  105. package/components/scripts.tsx +24 -24
  106. package/components/tooltip.tsx +31 -31
  107. package/environment.d.ts +5 -5
  108. package/next/analytics/fpixel.ts +15 -15
  109. package/next/analytics/google-analytics.ts +13 -13
  110. package/next/analytics/index.ts +3 -3
  111. package/next/analytics/pixel-analytics.tsx +54 -54
  112. package/next/font/get-app-router-font-classes.ts +12 -12
  113. package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
  114. package/next/font/next-font-desc.ts +27 -27
  115. package/next/font/pages-router-font-vars.tsx +18 -18
  116. package/next/head-metadata/from-next/metadata-types.ts +158 -158
  117. package/next/head-metadata/from-next/opengraph-types.ts +267 -267
  118. package/next/head-metadata/from-next/twitter-types.ts +92 -92
  119. package/next/head-metadata/index.tsx +208 -208
  120. package/next/middleware/determine-device-mw.ts +16 -16
  121. package/package.json +79 -79
  122. package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
  123. package/root-layout/index.tsx +112 -112
  124. package/server-actions/firebase-app.ts +14 -14
  125. package/server-actions/index.ts +5 -5
  126. package/server-actions/store-contact.ts +51 -51
  127. package/site-def/footer/community.tsx +67 -67
  128. package/site-def/footer/company.ts +37 -37
  129. package/site-def/footer/ecosystem.ts +37 -37
  130. package/site-def/footer/index.tsx +26 -26
  131. package/site-def/footer/legal.ts +28 -28
  132. package/site-def/footer/network.ts +45 -45
  133. package/site-def/footer/svg/warpcast-logo.svg +11 -11
  134. package/site-def/index.ts +2 -2
  135. package/site-def/main-nav.tsx +392 -338
  136. package/style/cart-animation.css +29 -29
  137. package/style/checkout-animation.css +23 -23
  138. package/style/drawer-handle-overrides.css +160 -160
  139. package/style/lux-colors.css +85 -85
  140. package/style/lux-global.css +30 -30
  141. package/tailwind/fontFamily.tailwind.lux.ts +18 -18
  142. package/tailwind/index.ts +2 -2
  143. package/tailwind/lux-tw-fonts.ts +39 -39
  144. package/tailwind/tailwind.config.lux-preset.ts +10 -10
  145. package/tsconfig.json +15 -15
  146. package/types/chatbot-config.ts +6 -6
  147. package/types/chatbot-suggested-question.ts +7 -7
  148. package/types/contact-info.ts +10 -10
  149. package/types/index.ts +4 -4
  150. package/types/site-def.ts +43 -43
@@ -1,144 +1,144 @@
1
- 'use client'
2
- import React from 'react'
3
- import { observer } from 'mobx-react-lite'
4
-
5
- import { Button, Image } from '@hanzo/ui/primitives'
6
- import { cn, } from '@hanzo/ui/util'
7
- import type { LineItem } from '@hanzo/commerce/types'
8
- import { useCommerce, formatCurrencyValue } from '@hanzo/commerce'
9
-
10
- import CheckoutButton from '../checkout-button'
11
- import { useCommerceDrawer, useRecentActivity } from '../../../commerce/ui/context'
12
-
13
- const CN = {
14
- // h: mind padding!
15
- mobile: { w: 36, h: 32 },
16
- sm: { w: 60, h: 34 },
17
- desktop: { w: 60, h: 32 },
18
- }
19
-
20
- const Info: React.FC<{
21
- item: LineItem
22
- clx?: string
23
- }> = ({
24
- item,
25
- clx=''
26
- }) => {
27
-
28
- const cmmc = useCommerce()
29
- const family = cmmc.getFamilyById(item.familyId)
30
-
31
- let topLine = family!.title
32
- if (item.sku.startsWith('LXM-AG') || item.sku.startsWith('LXM-AU')) {
33
- topLine = family!.parentTitle + ', ' + family!.title
34
- }
35
-
36
- const optionLabel = item.optionLabelShort ?? item.optionLabel
37
- const priceStr = formatCurrencyValue(item.price)
38
-
39
- return (<>
40
- <div className={cn('sm:hidden flex flex-col !text-muted items-stretch whitespace-nowrap text-ellipsis ', clx)}>
41
- <p className='text-left text-xs'>{topLine}</p>
42
- <div className='flex justify-between text-xxs'>
43
- <div>{optionLabel}</div>
44
- <div className='pl-2.5'>{priceStr}</div>
45
- </div>
46
- </div>
47
- <div className={cn('hidden sm:flex !text-muted flex-col items-stretch whitespace-nowrap text-ellipsis text-xs', clx)}>
48
- <p className='text-left'>{topLine}</p>
49
- <div className='flex justify-between'>
50
- <div>{optionLabel}</div>
51
- <div className='pl-2.5'>{priceStr}</div>
52
- </div>
53
- </div>
54
- </>)
55
- }
56
-
57
- const PROMPT_COMMON_CLX = 'block absolute top-0 left-0 bg-transparent duration-400 transition-opacity'
58
-
59
- const Micro: React.FC<{
60
- clx?: string
61
- handleCheckout: () => void
62
- handleItemClicked: () => void
63
- }> = observer(({
64
- clx='',
65
- handleCheckout,
66
- handleItemClicked
67
- }) => {
68
-
69
- const drawer = useCommerceDrawer()
70
- const recent = useRecentActivity()
71
- const mobile = drawer.isMobile
72
-
73
- return (
74
- <div className={cn(
75
- (drawer.showAdded ? 'grid grid-cols-2' : 'flex justify-center items-center '),
76
- (drawer.showAdded ? ((drawer.isMobile) ? '-mt-3' : '-mt-3') : ''),
77
- 'gap-2 md:gap-3 relative',
78
- clx
79
- )}>
80
- {drawer.showAdded && (
81
- <div className={'flex flex-col items-stretch ' + (drawer.isMobile ? 'justify-start' : 'group')}>
82
- <p className={'relative text-muted text-xxs md:text-xs leading-none pl-1 self-start ' + (drawer.isMobile ? 'top-[3px]' : 'top-[1px]')}>
83
- <span className='invisible'>scrictly for layout</span>
84
- {drawer.isMobile ? (
85
- <span className={PROMPT_COMMON_CLX}>tap for options:</span>
86
- ) : (<>
87
- <span className={PROMPT_COMMON_CLX + ' group-hover:opacity-0'}>recent item:</span>
88
- <span className={PROMPT_COMMON_CLX + ' opacity-0 group-hover:opacity-100'}>view options:</span>
89
- </>)}
90
- </p>
91
- <Button
92
- variant='ghost'
93
- rounded={drawer.isMobile ? 'md' : 'lg'}
94
- size={drawer.isMobile ? 'default' : 'lg'}
95
- onClick={handleItemClicked}
96
- className={cn(
97
- 'box-content',
98
- 'flex flex-row justify-between items-center gap-1',
99
- '-ml-1.5',
100
- 'overflow-hidden ',
101
- 'px-1 md:px-2 py-[2px]',
102
- 'border border-transparent group-hover:border-muted-3',
103
- 'group-hover:!bg-transparent '
104
- )}
105
- >
106
- {recent.item?.img && (<>
107
- <Image def={recent.item.img} constrainTo={CN.mobile} preload className='sm:hidden grow-0 shrink-0'/>
108
- <Image def={recent.item.img} constrainTo={CN.sm} preload className='hidden sm:block md:hidden grow-0 shrink-0'/>
109
- <Image def={recent.item.img} constrainTo={CN.desktop} preload className='hidden md:block grow-0 shrink-0'/>
110
- </>)}
111
- {recent.item && (
112
- <div className='grow w-full'>
113
- <Info item={recent.item} clx='w-full'/>
114
- </div>
115
- )}
116
- </Button>
117
- </div>
118
- )}
119
- {drawer.showCheckout && (
120
- <div className={cn(
121
- 'flex flex-col w-full',
122
- (drawer.showAdded ? 'items-stretch' : 'items-center' ),
123
- (drawer.isMobile ? 'justify-start' : 'justify-center')
124
- )}>
125
- {drawer.showAdded && <p className='invisible text-muted text-xxs md:text-xs leading-none pl-1 self-start'>for layout</p>}
126
- <CheckoutButton
127
- handleCheckout={handleCheckout}
128
- variant='primary'
129
- size={drawer.isMobile ? 'default' : 'lg'}
130
- rounded={drawer.isMobile ? 'md' : 'lg'}
131
- centerText={drawer.isMobile ? !drawer.showAdded : true}
132
- className={cn(drawer.isMobile ?
133
- (drawer.showAdded ? 'pl-3.5 pr-2.5' : 'min-w-[320px]')
134
- :
135
- (drawer.showAdded ? '' : 'w-[320px]')
136
- )}
137
- />
138
- </div>
139
- )}
140
- </div>
141
- )
142
- })
143
-
144
- export default Micro
1
+ 'use client'
2
+ import React from 'react'
3
+ import { observer } from 'mobx-react-lite'
4
+
5
+ import { Button, Image } from '@hanzo/ui/primitives'
6
+ import { cn, } from '@hanzo/ui/util'
7
+ import type { LineItem } from '@hanzo/commerce/types'
8
+ import { useCommerce, formatCurrencyValue } from '@hanzo/commerce'
9
+
10
+ import CheckoutButton from '../checkout-button'
11
+ import { useCommerceDrawer, useRecentActivity } from '../../../commerce/ui/context'
12
+
13
+ const CN = {
14
+ // h: mind padding!
15
+ mobile: { w: 36, h: 32 },
16
+ sm: { w: 60, h: 34 },
17
+ desktop: { w: 60, h: 32 },
18
+ }
19
+
20
+ const Info: React.FC<{
21
+ item: LineItem
22
+ clx?: string
23
+ }> = ({
24
+ item,
25
+ clx=''
26
+ }) => {
27
+
28
+ const cmmc = useCommerce()
29
+ const family = cmmc.getFamilyById(item.familyId)
30
+
31
+ let topLine = family!.title
32
+ if (item.sku.startsWith('LXM-AG') || item.sku.startsWith('LXM-AU')) {
33
+ topLine = family!.parentTitle + ', ' + family!.title
34
+ }
35
+
36
+ const optionLabel = item.optionLabelShort ?? item.optionLabel
37
+ const priceStr = formatCurrencyValue(item.price)
38
+
39
+ return (<>
40
+ <div className={cn('sm:hidden flex flex-col !text-muted items-stretch whitespace-nowrap text-ellipsis ', clx)}>
41
+ <p className='text-left text-xs'>{topLine}</p>
42
+ <div className='flex justify-between text-xxs'>
43
+ <div>{optionLabel}</div>
44
+ <div className='pl-2.5'>{priceStr}</div>
45
+ </div>
46
+ </div>
47
+ <div className={cn('hidden sm:flex !text-muted flex-col items-stretch whitespace-nowrap text-ellipsis text-xs', clx)}>
48
+ <p className='text-left'>{topLine}</p>
49
+ <div className='flex justify-between'>
50
+ <div>{optionLabel}</div>
51
+ <div className='pl-2.5'>{priceStr}</div>
52
+ </div>
53
+ </div>
54
+ </>)
55
+ }
56
+
57
+ const PROMPT_COMMON_CLX = 'block absolute top-0 left-0 bg-transparent duration-400 transition-opacity'
58
+
59
+ const Micro: React.FC<{
60
+ clx?: string
61
+ handleCheckout: () => void
62
+ handleItemClicked: () => void
63
+ }> = observer(({
64
+ clx='',
65
+ handleCheckout,
66
+ handleItemClicked
67
+ }) => {
68
+
69
+ const drawer = useCommerceDrawer()
70
+ const recent = useRecentActivity()
71
+ const mobile = drawer.isMobile
72
+
73
+ return (
74
+ <div className={cn(
75
+ (drawer.showAdded ? 'grid grid-cols-2' : 'flex justify-center items-center '),
76
+ (drawer.showAdded ? ((drawer.isMobile) ? '-mt-3' : '-mt-3') : ''),
77
+ 'gap-2 md:gap-3 relative',
78
+ clx
79
+ )}>
80
+ {drawer.showAdded && (
81
+ <div className={'flex flex-col items-stretch ' + (drawer.isMobile ? 'justify-start' : 'group')}>
82
+ <p className={'relative text-muted text-xxs md:text-xs leading-none pl-1 self-start ' + (drawer.isMobile ? 'top-[3px]' : 'top-[1px]')}>
83
+ <span className='invisible'>scrictly for layout</span>
84
+ {drawer.isMobile ? (
85
+ <span className={PROMPT_COMMON_CLX}>tap for options:</span>
86
+ ) : (<>
87
+ <span className={PROMPT_COMMON_CLX + ' group-hover:opacity-0'}>recent item:</span>
88
+ <span className={PROMPT_COMMON_CLX + ' opacity-0 group-hover:opacity-100'}>view options:</span>
89
+ </>)}
90
+ </p>
91
+ <Button
92
+ variant='ghost'
93
+ rounded={drawer.isMobile ? 'md' : 'lg'}
94
+ size={drawer.isMobile ? 'default' : 'lg'}
95
+ onClick={handleItemClicked}
96
+ className={cn(
97
+ 'box-content',
98
+ 'flex flex-row justify-between items-center gap-1',
99
+ '-ml-1.5',
100
+ 'overflow-hidden ',
101
+ 'px-1 md:px-2 py-[2px]',
102
+ 'border border-transparent group-hover:border-muted-3',
103
+ 'group-hover:!bg-transparent '
104
+ )}
105
+ >
106
+ {recent.item?.img && (<>
107
+ <Image def={recent.item.img} constrainTo={CN.mobile} preload className='sm:hidden grow-0 shrink-0'/>
108
+ <Image def={recent.item.img} constrainTo={CN.sm} preload className='hidden sm:block md:hidden grow-0 shrink-0'/>
109
+ <Image def={recent.item.img} constrainTo={CN.desktop} preload className='hidden md:block grow-0 shrink-0'/>
110
+ </>)}
111
+ {recent.item && (
112
+ <div className='grow w-full'>
113
+ <Info item={recent.item} clx='w-full'/>
114
+ </div>
115
+ )}
116
+ </Button>
117
+ </div>
118
+ )}
119
+ {drawer.showCheckout && (
120
+ <div className={cn(
121
+ 'flex flex-col w-full',
122
+ (drawer.showAdded ? 'items-stretch' : 'items-center' ),
123
+ (drawer.isMobile ? 'justify-start' : 'justify-center')
124
+ )}>
125
+ {drawer.showAdded && <p className='invisible text-muted text-xxs md:text-xs leading-none pl-1 self-start'>for layout</p>}
126
+ <CheckoutButton
127
+ handleCheckout={handleCheckout}
128
+ variant='primary'
129
+ size={drawer.isMobile ? 'default' : 'lg'}
130
+ rounded={drawer.isMobile ? 'md' : 'lg'}
131
+ centerText={drawer.isMobile ? !drawer.showAdded : true}
132
+ className={cn(drawer.isMobile ?
133
+ (drawer.showAdded ? 'pl-3.5 pr-2.5' : 'min-w-[320px]')
134
+ :
135
+ (drawer.showAdded ? '' : 'w-[320px]')
136
+ )}
137
+ />
138
+ </div>
139
+ )}
140
+ </div>
141
+ )
142
+ })
143
+
144
+ export default Micro
@@ -1,85 +1,85 @@
1
- 'use client'
2
- import React, {type PropsWithChildren } from 'react'
3
- import { observer } from 'mobx-react-lite'
4
-
5
- import {
6
- Drawer,
7
- DrawerContent,
8
- DrawerHandle,
9
- type DrawerProps,
10
- } from '@hanzo/ui/primitives'
11
- import { cn } from '@hanzo/ui/util'
12
-
13
- import '../../../style/drawer-handle-overrides.css'
14
- import { useCommerceDrawer } from '../../../commerce/ui/context'
15
-
16
- const CommerceDrawer: React.FC<PropsWithChildren &
17
- Omit<DrawerProps,
18
- 'onOpenChange' |
19
- 'open' |
20
- 'snapPoints' |
21
- 'modal' |
22
- 'setActiveSnapPoint' |
23
- 'activeSnapPoint'
24
- > &
25
- {
26
- handleHandleClicked: () => void
27
- drawerClx?: string
28
- }
29
- > = observer(({
30
- children,
31
- handleHandleClicked,
32
- drawerClx='',
33
- ...rest
34
- }) => {
35
-
36
- const drawer = useCommerceDrawer()
37
-
38
- return (
39
- <Drawer
40
- open={drawer.open}
41
- onOpenChange={() => {}}
42
- modal={drawer.modal}
43
- snapPoints={drawer.points}
44
- activeSnapPoint={drawer.activePoint}
45
- setActiveSnapPoint={drawer.onActivePointChanged.bind(drawer)}
46
- fastDragSkipsToEnd={false}
47
- dragHandleOnly={true}
48
- handleHandleClicked={handleHandleClicked}
49
- extendHandleDragRegion={false}
50
- // debugOutput
51
- {...rest}
52
- >
53
- <DrawerContent
54
- defaultHandle={false}
55
- className={cn(
56
- 'border-0',
57
- drawer.isMobile ? 'pt-5' : 'pt-6',
58
- 'w-full h-full',
59
- )}
60
- // https://github.com/radix-ui/primitives/discussions/935
61
- onOpenAutoFocus={(e) => {e.preventDefault()}}
62
- >
63
- <DrawerHandle
64
- className={cn(
65
- 'absolute top-0 left-0 right-0 mx-auto z-10',
66
- 'flex justify-center items-start',
67
- 'border-t rounded-t-lg border-muted-3',
68
- drawer.isMobile ? 'h-5 touch-pan-y' : 'h-6',
69
- )}
70
- >
71
- <div className={cn(
72
- // pseudo-handle
73
- 'rounded-[3px] bg-level-3',
74
- drawer.isMobile ? 'w-[155px] mt-[5px] h-1.5' : 'w-[180px] mt-[3px] h-2.5 hover:bg-level-4',
75
- !drawer.isMobile ? 'cursor-grab active:cursor-grabbing' : '',
76
- )} />
77
- </DrawerHandle>
78
- {children}
79
- </DrawerContent>
80
- </Drawer>
81
- )
82
- })
83
-
84
-
85
- export default CommerceDrawer
1
+ 'use client'
2
+ import React, {type PropsWithChildren } from 'react'
3
+ import { observer } from 'mobx-react-lite'
4
+
5
+ import {
6
+ Drawer,
7
+ DrawerContent,
8
+ DrawerHandle,
9
+ type DrawerProps,
10
+ } from '@hanzo/ui/primitives'
11
+ import { cn } from '@hanzo/ui/util'
12
+
13
+ import '../../../style/drawer-handle-overrides.css'
14
+ import { useCommerceDrawer } from '../../../commerce/ui/context'
15
+
16
+ const CommerceDrawer: React.FC<PropsWithChildren &
17
+ Omit<DrawerProps,
18
+ 'onOpenChange' |
19
+ 'open' |
20
+ 'snapPoints' |
21
+ 'modal' |
22
+ 'setActiveSnapPoint' |
23
+ 'activeSnapPoint'
24
+ > &
25
+ {
26
+ handleHandleClicked: () => void
27
+ drawerClx?: string
28
+ }
29
+ > = observer(({
30
+ children,
31
+ handleHandleClicked,
32
+ drawerClx='',
33
+ ...rest
34
+ }) => {
35
+
36
+ const drawer = useCommerceDrawer()
37
+
38
+ return (
39
+ <Drawer
40
+ open={drawer.open}
41
+ onOpenChange={() => {}}
42
+ modal={drawer.modal}
43
+ snapPoints={drawer.points}
44
+ activeSnapPoint={drawer.activePoint}
45
+ setActiveSnapPoint={drawer.onActivePointChanged.bind(drawer)}
46
+ fastDragSkipsToEnd={false}
47
+ dragHandleOnly={true}
48
+ handleHandleClicked={handleHandleClicked}
49
+ extendHandleDragRegion={false}
50
+ // debugOutput
51
+ {...rest}
52
+ >
53
+ <DrawerContent
54
+ defaultHandle={false}
55
+ className={cn(
56
+ 'border-0',
57
+ drawer.isMobile ? 'pt-5' : 'pt-6',
58
+ 'w-full h-full',
59
+ )}
60
+ // https://github.com/radix-ui/primitives/discussions/935
61
+ onOpenAutoFocus={(e) => {e.preventDefault()}}
62
+ >
63
+ <DrawerHandle
64
+ className={cn(
65
+ 'absolute top-0 left-0 right-0 mx-auto z-10',
66
+ 'flex justify-center items-start',
67
+ 'border-t rounded-t-lg border-muted-3',
68
+ drawer.isMobile ? 'h-5 touch-pan-y' : 'h-6',
69
+ )}
70
+ >
71
+ <div className={cn(
72
+ // pseudo-handle
73
+ 'rounded-[3px] bg-level-3',
74
+ drawer.isMobile ? 'w-[155px] mt-[5px] h-1.5' : 'w-[180px] mt-[3px] h-2.5 hover:bg-level-4',
75
+ !drawer.isMobile ? 'cursor-grab active:cursor-grabbing' : '',
76
+ )} />
77
+ </DrawerHandle>
78
+ {children}
79
+ </DrawerContent>
80
+ </Drawer>
81
+ )
82
+ })
83
+
84
+
85
+ export default CommerceDrawer
@@ -1,51 +1,51 @@
1
- 'use client'
2
- import React from 'react'
3
-
4
- import { Drawer, DrawerContent} from '@hanzo/ui/primitives'
5
- import { cn } from '@hanzo/ui/util'
6
- import { CartPanel } from '@hanzo/commerce'
7
-
8
- import BagButton from './bag-button'
9
-
10
- const MobileBagDrawer: React.FC<{
11
- open: boolean,
12
- setOpen: (b: boolean) => void
13
- handleCheckout: () => void
14
- className?: string
15
- }> = ({
16
- open,
17
- setOpen,
18
- handleCheckout,
19
- className='',
20
- }) => {
21
-
22
- return (
23
- <Drawer open={open} onOpenChange={setOpen}>
24
- <DrawerContent className={cn('rounded-t-xl mt-6 pb-12 h-auto', className)} >
25
- <CartPanel
26
- handleCheckout={handleCheckout}
27
- className='mt-4 mb-4 border-none py-0 px-4 w-full '
28
- listClx='rounded-sm pr-3'
29
- scrollAfter={5}
30
- itemClx='mt-2'
31
- totalClx='sticky px-1 pr-2 border rounded-sm -bottom-[1px] bg-background'
32
- buttonClx='max-w-[220px] flex-none'
33
- >
34
- <div className='flex flex-row items-center flex-none justify-center '>
35
- <BagButton
36
- animateOnHover={false}
37
- showIfEmpty
38
- className=
39
- 'mr-2 relative w-6 h-7'
40
- iconClx='fill-foreground '
41
- />
42
- <p className='font-heading text-foreground text-default'>Your Bag</p>
43
- </div>
44
- <div className='h-[1px] w-pr-80 bg-muted-3 mx-auto mt-1.5 flex-none'/>
45
- </CartPanel>
46
- </DrawerContent>
47
- </Drawer>
48
- )
49
- }
50
-
51
- export default MobileBagDrawer
1
+ 'use client'
2
+ import React from 'react'
3
+
4
+ import { Drawer, DrawerContent} from '@hanzo/ui/primitives'
5
+ import { cn } from '@hanzo/ui/util'
6
+ import { CartPanel } from '@hanzo/commerce'
7
+
8
+ import BagButton from './bag-button'
9
+
10
+ const MobileBagDrawer: React.FC<{
11
+ open: boolean,
12
+ setOpen: (b: boolean) => void
13
+ handleCheckout: () => void
14
+ className?: string
15
+ }> = ({
16
+ open,
17
+ setOpen,
18
+ handleCheckout,
19
+ className='',
20
+ }) => {
21
+
22
+ return (
23
+ <Drawer open={open} onOpenChange={setOpen}>
24
+ <DrawerContent className={cn('rounded-t-xl mt-6 pb-12 h-auto', className)} >
25
+ <CartPanel
26
+ handleCheckout={handleCheckout}
27
+ className='mt-4 mb-4 border-none py-0 px-4 w-full '
28
+ listClx='rounded-sm pr-3'
29
+ scrollAfter={5}
30
+ itemClx='mt-2'
31
+ totalClx='sticky px-1 pr-2 border rounded-sm -bottom-[1px] bg-background'
32
+ buttonClx='max-w-[220px] flex-none'
33
+ >
34
+ <div className='flex flex-row items-center flex-none justify-center '>
35
+ <BagButton
36
+ animateOnHover={false}
37
+ showIfEmpty
38
+ className=
39
+ 'mr-2 relative w-6 h-7'
40
+ iconClx='fill-foreground '
41
+ />
42
+ <p className='font-heading text-foreground text-default'>Your Bag</p>
43
+ </div>
44
+ <div className='h-[1px] w-pr-80 bg-muted-3 mx-auto mt-1.5 flex-none'/>
45
+ </CartPanel>
46
+ </DrawerContent>
47
+ </Drawer>
48
+ )
49
+ }
50
+
51
+ export default MobileBagDrawer