@luxfi/core 5.3.0 → 5.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. package/commerce/ui/conf.ts +13 -13
  2. package/commerce/ui/context.tsx +126 -123
  3. package/commerce/ui/store.ts +304 -289
  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 -49
  11. package/components/chat-widget.tsx +85 -85
  12. package/components/commerce/add-widget.tsx +20 -0
  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/{desktop-bag-carousel.tsx → dt-bag-carousel.tsx} +36 -36
  17. package/components/commerce/checkout-panel/dt-checkout-panel.tsx +85 -0
  18. package/components/commerce/checkout-panel/index.tsx +129 -126
  19. package/components/commerce/checkout-panel/links-row.tsx +21 -0
  20. package/components/commerce/checkout-panel/mb-checkout-panel.tsx +55 -0
  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/{_to_deprecate_checkout-widget → checkout-widget}/const.ts +13 -13
  24. package/components/commerce/{_to_deprecate_checkout-widget/index.tsx_ → checkout-widget/index.tsx} +192 -188
  25. package/components/commerce/{_to_deprecate_checkout-widget → checkout-widget}/obs-string-set.ts +48 -48
  26. package/components/commerce/{_to_deprecate_checkout-widget → 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 +130 -130
  29. package/components/commerce/drawer/index.tsx +99 -88
  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 +107 -101
  34. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  35. package/components/commerce/mobile-nav-menu-ai.tsx +51 -47
  36. package/components/commerce/mobile-nav-menu-item.tsx +49 -49
  37. package/components/commerce/mobile-nav-menu.tsx +101 -101
  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 +51 -50
  45. package/components/header/index.tsx +50 -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 -43
  49. package/components/icons/ai-chat-act.tsx +47 -47
  50. package/components/icons/ai-chat.tsx +29 -29
  51. package/components/icons/anodized-titanium.tsx +45 -45
  52. package/components/icons/avatar.tsx +11 -11
  53. package/components/icons/bag-icon.tsx +10 -10
  54. package/components/icons/blog-act.tsx +14 -14
  55. package/components/icons/blog.tsx +20 -20
  56. package/components/icons/bridge-act.tsx +18 -18
  57. package/components/icons/bridge.tsx +68 -68
  58. package/components/icons/changelog-act.tsx +15 -15
  59. package/components/icons/changelog.tsx +21 -21
  60. package/components/icons/chrome.tsx +45 -45
  61. package/components/icons/coins-act.tsx +29 -29
  62. package/components/icons/coins.tsx +20 -20
  63. package/components/icons/compare-cards-act.tsx +30 -30
  64. package/components/icons/compare-cards.tsx +21 -21
  65. package/components/icons/credit-act.tsx +29 -29
  66. package/components/icons/credit.tsx +20 -20
  67. package/components/icons/customer-support-act.tsx +27 -27
  68. package/components/icons/customer-support.tsx +21 -21
  69. package/components/icons/customers-act.tsx +65 -65
  70. package/components/icons/customers.tsx +33 -33
  71. package/components/icons/developer-docs-act.tsx +26 -26
  72. package/components/icons/developer-docs.tsx +20 -20
  73. package/components/icons/exchange-act.tsx +27 -27
  74. package/components/icons/exchange.tsx +21 -21
  75. package/components/icons/explorer-act.tsx +27 -27
  76. package/components/icons/explorer.tsx +22 -22
  77. package/components/icons/faqs-act.tsx +27 -27
  78. package/components/icons/faqs.tsx +21 -21
  79. package/components/icons/github.tsx +14 -14
  80. package/components/icons/guides-act.tsx +26 -26
  81. package/components/icons/guides.tsx +21 -21
  82. package/components/icons/gun-metal.tsx +44 -44
  83. package/components/icons/index.tsx +43 -43
  84. package/components/icons/integrations-act.tsx +41 -41
  85. package/components/icons/integrations.tsx +25 -25
  86. package/components/icons/irradescent.tsx +41 -41
  87. package/components/icons/launch-subnet.tsx +21 -21
  88. package/components/icons/launchsubnet-act.tsx +29 -29
  89. package/components/icons/left-arrow.tsx +11 -11
  90. package/components/icons/lux-finance-act.tsx +34 -34
  91. package/components/icons/lux-finance.tsx +23 -23
  92. package/components/icons/lux-logo.tsx +10 -10
  93. package/components/icons/lux-pass-act.tsx +41 -41
  94. package/components/icons/lux-pass.tsx +25 -25
  95. package/components/icons/lux-quests-act.tsx +15 -15
  96. package/components/icons/lux-quests.tsx +21 -21
  97. package/components/icons/market-act.tsx +39 -39
  98. package/components/icons/market.tsx +24 -24
  99. package/components/icons/mirrored-titanium.tsx +46 -46
  100. package/components/icons/more-benefits-act.tsx +29 -29
  101. package/components/icons/more-benefits.tsx +21 -21
  102. package/components/icons/open-source-act.tsx +41 -41
  103. package/components/icons/open-source.tsx +26 -26
  104. package/components/icons/right-arrow.tsx +10 -10
  105. package/components/icons/safe-act.tsx +77 -77
  106. package/components/icons/safe.tsx +37 -37
  107. package/components/icons/search.tsx +12 -12
  108. package/components/icons/secure-delivery.tsx +13 -13
  109. package/components/icons/shop-act.tsx +29 -29
  110. package/components/icons/shop.tsx +20 -20
  111. package/components/icons/social-icon.tsx +35 -35
  112. package/components/icons/social-svg.css +3 -3
  113. package/components/icons/sterling-silver-card.tsx +44 -44
  114. package/components/icons/templates-act.tsx +29 -29
  115. package/components/icons/templates.tsx +21 -21
  116. package/components/icons/validators-act.tsx +42 -42
  117. package/components/icons/validators.tsx +41 -41
  118. package/components/icons/view-all-card-act.tsx +28 -28
  119. package/components/icons/view-all-card.tsx +20 -20
  120. package/components/icons/wallet-act.tsx +29 -29
  121. package/components/icons/wallet.tsx +20 -20
  122. package/components/icons/warpcast.tsx +58 -58
  123. package/components/icons/youtube-logo.tsx +59 -59
  124. package/components/index.ts +27 -25
  125. package/components/logo.tsx +89 -89
  126. package/components/main.tsx +27 -27
  127. package/components/mini-chart/index.tsx +7 -7
  128. package/components/mini-chart/mini-chart-props.ts +43 -43
  129. package/components/mini-chart/mini-chart.tsx +85 -85
  130. package/components/mini-chart/wrapper.tsx +23 -23
  131. package/components/not-found/index.tsx +28 -28
  132. package/components/not-found/not-found-content.mdx +5 -5
  133. package/components/scripts.tsx +24 -24
  134. package/components/tooltip.tsx +31 -31
  135. package/environment.d.ts +5 -5
  136. package/next/analytics/fpixel.ts +15 -15
  137. package/next/analytics/google-analytics.ts +13 -13
  138. package/next/analytics/index.ts +3 -3
  139. package/next/analytics/pixel-analytics.tsx +54 -54
  140. package/next/font/get-app-router-font-classes.ts +12 -12
  141. package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
  142. package/next/font/next-font-desc.ts +27 -27
  143. package/next/font/pages-router-font-vars.tsx +18 -18
  144. package/next/head-metadata/from-next/metadata-types.ts +158 -158
  145. package/next/head-metadata/from-next/opengraph-types.ts +267 -267
  146. package/next/head-metadata/from-next/twitter-types.ts +92 -92
  147. package/next/head-metadata/index.tsx +208 -208
  148. package/next/middleware/determine-device-mw.ts +16 -16
  149. package/package.json +79 -79
  150. package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
  151. package/root-layout/index.tsx +112 -112
  152. package/server-actions/firebase-app.ts +14 -14
  153. package/server-actions/index.ts +5 -5
  154. package/server-actions/store-contact.ts +51 -51
  155. package/site-def/footer/community.tsx +67 -67
  156. package/site-def/footer/company.ts +37 -37
  157. package/site-def/footer/ecosystem.ts +37 -37
  158. package/site-def/footer/index.tsx +26 -26
  159. package/site-def/footer/legal.ts +28 -28
  160. package/site-def/footer/network.ts +45 -45
  161. package/site-def/footer/svg/warpcast-logo.svg +11 -11
  162. package/site-def/index.ts +2 -2
  163. package/site-def/main-nav.tsx +458 -458
  164. package/style/cart-animation.css +29 -29
  165. package/style/checkout-animation.css +23 -23
  166. package/style/drawer-handle-overrides.css +160 -160
  167. package/style/lux-colors.css +85 -85
  168. package/style/lux-global.css +50 -47
  169. package/tailwind/fontFamily.tailwind.lux.ts +18 -18
  170. package/tailwind/index.ts +2 -2
  171. package/tailwind/lux-tw-fonts.ts +39 -39
  172. package/tailwind/tailwind.config.lux-preset.ts +10 -10
  173. package/tsconfig.json +15 -15
  174. package/types/chatbot-config.ts +6 -6
  175. package/types/chatbot-suggested-question.ts +7 -7
  176. package/types/contact-info.ts +10 -10
  177. package/types/index.ts +4 -4
  178. package/types/site-def.ts +43 -43
  179. package/components/commerce/checkout-panel/cart-accordian.tsx +0 -66
  180. package/components/commerce/checkout-panel/checkout-panel-props.ts +0 -10
  181. package/components/commerce/checkout-panel/desktop-cp.tsx +0 -83
  182. package/components/commerce/checkout-panel/mobile-cp.tsx +0 -67
  183. package/components/commerce/checkout-panel/policy-links.tsx +0 -29
@@ -1,163 +1,163 @@
1
- 'use client'
2
- import React, { useState, useEffect } from 'react'
3
- import { useRouter } from 'next/navigation'
4
-
5
- import type { LinkDef } from '@hanzo/ui/types'
6
- import { cn } from '@hanzo/ui/util'
7
-
8
- import { CartPanel, useCommerce } from '@hanzo/commerce'
9
- import { AuthWidget, LoginPanel } from '@hanzo/auth/components'
10
- import sendGAEvent from '../../next/analytics/google-analytics'
11
- import * as Icons from '../icons'
12
-
13
- import { Logo } from '..'
14
-
15
- import MenuToggleButton from '../commerce/mobile-menu-toggle-button'
16
- import BagButton from '../commerce/bag-button'
17
- import MobileBagDrawer from '../commerce/mobile-bag-drawer'
18
- import NavMenu from '../commerce/mobile-nav-menu'
19
-
20
- const bagClx = 'mt-4 mb-8 border-none py-0 px-4 w-full ' +
21
- 'sm:min-w-[350px] sm:max-w-[500px] sm:mx-auto min-h-[60vh] max-h-[70vh] ' +
22
- 'sm:animate-in sm:zoom-in-90 '
23
-
24
- const MobileHeader: React.FC<{
25
- currentAs: string | undefined
26
- links: LinkDef[]
27
- className?: string,
28
- setChatbotOpen: (open: boolean) => void,
29
- }> = ({
30
- currentAs,
31
- links,
32
- className = '',
33
- setChatbotOpen,
34
- }) => {
35
- const cmmc = useCommerce()
36
- const [menuState, setMenuState] = useState<'closed' | 'nav' | 'login' | 'bag'>('closed')
37
- const [bagDrawerOpen, setBagDrawerOpen] = useState<boolean>(false)
38
- const router = useRouter()
39
-
40
- useEffect(() => {
41
- if (menuState === 'bag' || bagDrawerOpen) {
42
- sendGAEvent('view_cart', {
43
- items: cmmc.cartItems.map((item) => ({
44
- item_id: item.sku,
45
- item_name: item.title,
46
- item_category: item.familyId,
47
- price: item.price,
48
- quantity: item.quantity
49
- })),
50
- value: cmmc.cartTotal,
51
- currency: 'USD',
52
- })
53
- }
54
- }, [menuState, bagDrawerOpen])
55
-
56
- const menuOpen = () => (menuState !== 'closed')
57
-
58
- const onLoginChanged = (token: string) => {
59
- // by def, menu was in state 'login'
60
- if (!!token) { setMenuState('nav') }
61
- }
62
-
63
- const setMenuOpen = (open: boolean) => {
64
- if (!open) {
65
- setMenuState('closed')
66
- }
67
- else {
68
- setMenuState('nav')
69
- }
70
- }
71
-
72
- const handleCheckout = () => {
73
- setMenuState('closed')
74
- setBagDrawerOpen(false)
75
- router.push('/checkout')
76
- }
77
-
78
- const openBag = () => {
79
- if (menuOpen()) {
80
- setMenuState('bag')
81
- }
82
- else {
83
- setBagDrawerOpen(true)
84
- }
85
- }
86
- // header element MUST be fixed, and NOT sticky. Or else drawer breaks on mobile browsers
87
- return (<>
88
- <header className={cn(
89
- `bg-background fixed z-header top-0 left-0 w-full ${menuOpen() ? 'hidden' : 'block'}`,
90
- className
91
- )}>
92
- {/* smaller than md: mobile style drawer menu; h-11 is 44px, the standard mobile header height */}
93
- <div className='w-full h-11 flex flex-row justify-between items-center font-bold pl-6 pr-4'>
94
- <Logo href='/' size='sm' outerClx={'top-[3px] h-full'} variant='text-only' />
95
- {/* Not that key to the cross-fade effect
96
- is that this is **on top of** the logo. */}
97
- {menuOpen() && (
98
- <div className={'absolute left-0 top-0 bottom-0 right-0 pl-8 ' +
99
- 'flex flex-row ' +
100
- 'bg-background animate-mobile-menu-open'
101
- }>
102
- <Icons.Avatar className='self-center ' />
103
- </div>
104
- )}
105
- <div className='flex gap-0 flex-row'>
106
- <BagButton className='text-primary -mr-[3px]' onClick={openBag} />
107
- <MenuToggleButton className='text-foreground' open={menuOpen()} setOpen={setMenuOpen} />
108
- </div>
109
-
110
- </div>
111
- </header>
112
- <MobileBagDrawer
113
- className=''
114
- open={bagDrawerOpen}
115
- setOpen={setBagDrawerOpen}
116
- handleCheckout={handleCheckout}
117
- />
118
- {menuOpen() && (
119
- <div className={
120
- 'fixed top-0 left-0 w-full h-full ' +
121
- // z must below header itself
122
- 'flex flex-column bg-background z-below-header animate-mobile-menu-open'
123
- }>
124
- {menuState === 'login' ? (
125
- <LoginPanel noHeading onLoginChanged={onLoginChanged} className='sm:animate-in sm:zoom-in-90' />
126
- ) : (
127
- menuState === 'bag' ? (
128
-
129
- <CartPanel
130
- handleCheckout={() => { router.push('/checkout') }}
131
- className={bagClx}
132
- listClx='rounded-sm'
133
- scrollAfter={6}
134
- scrollHeightClx='h-[80vh]'
135
- itemClx='mt-2'
136
- totalClx='sticky px-1 pr-2 border rounded-sm -bottom-[1px] bg-level-1'
137
- buttonClx='max-w-[220px] flex-none'
138
- >
139
- <div className='flex flex-row items-center flex-none justify-center '>
140
- <Icons.bag className='mr-2 relative w-4 h-5 fill-foreground ' />
141
- <p className='font-heading text-foreground text-default'>Your Bag</p>
142
- </div>
143
- <div className='h-[1px] w-pr-80 bg-muted-3 mx-auto mt-1.5 flex-none' />
144
- </CartPanel>
145
-
146
- ) : ( /* menuState === 'nav' */
147
- <NavMenu
148
- currentAs={currentAs}
149
- links={links}
150
- className='sm:animate-in sm:zoom-in-90 w-full'
151
- commonItemClx='px-0 text-xl h-16 justify-start '
152
- setMenuState={setMenuState}
153
- setChatbotOpen={setChatbotOpen}
154
- setMenuOpen={setMenuOpen}
155
- />
156
- )
157
- )}
158
- </div>
159
- ) /* menuOpen */}
160
- </>)
161
- }
162
-
163
- export default MobileHeader
1
+ 'use client'
2
+ import React, { useState, useEffect } from 'react'
3
+ import { useRouter } from 'next/navigation'
4
+
5
+ import type { LinkDef } from '@hanzo/ui/types'
6
+ import { cn } from '@hanzo/ui/util'
7
+
8
+ import { CartPanel, useCommerce } from '@hanzo/commerce'
9
+ import { AuthWidget, LoginPanel } from '@hanzo/auth/components'
10
+ import sendGAEvent from '../../next/analytics/google-analytics'
11
+ import * as Icons from '../icons'
12
+
13
+ import { Logo } from '..'
14
+
15
+ import MenuToggleButton from '../commerce/mobile-menu-toggle-button'
16
+ import BagButton from '../commerce/bag-button'
17
+ import MobileBagDrawer from '../commerce/mobile-bag-drawer'
18
+ import NavMenu from '../commerce/mobile-nav-menu'
19
+
20
+ const bagClx = 'mt-4 mb-8 border-none py-0 px-4 w-full ' +
21
+ 'sm:min-w-[350px] sm:max-w-[500px] sm:mx-auto min-h-[60vh] max-h-[70vh] ' +
22
+ 'sm:animate-in sm:zoom-in-90 '
23
+
24
+ const MobileHeader: React.FC<{
25
+ currentAs: string | undefined
26
+ links: LinkDef[]
27
+ className?: string,
28
+ setChatbotOpen: (open: boolean) => void,
29
+ }> = ({
30
+ currentAs,
31
+ links,
32
+ className = '',
33
+ setChatbotOpen,
34
+ }) => {
35
+ const cmmc = useCommerce()
36
+ const [menuState, setMenuState] = useState<'closed' | 'nav' | 'login' | 'bag'>('closed')
37
+ const [bagDrawerOpen, setBagDrawerOpen] = useState<boolean>(false)
38
+ const router = useRouter()
39
+
40
+ useEffect(() => {
41
+ if (menuState === 'bag' || bagDrawerOpen) {
42
+ sendGAEvent('view_cart', {
43
+ items: cmmc.cartItems.map((item) => ({
44
+ item_id: item.sku,
45
+ item_name: item.title,
46
+ item_category: item.familyId,
47
+ price: item.price,
48
+ quantity: item.quantity
49
+ })),
50
+ value: cmmc.cartTotal,
51
+ currency: 'USD',
52
+ })
53
+ }
54
+ }, [menuState, bagDrawerOpen])
55
+
56
+ const menuOpen = () => (menuState !== 'closed')
57
+
58
+ const onLoginChanged = (token: string) => {
59
+ // by def, menu was in state 'login'
60
+ if (!!token) { setMenuState('nav') }
61
+ }
62
+
63
+ const setMenuOpen = (open: boolean) => {
64
+ if (!open) {
65
+ setMenuState('closed')
66
+ }
67
+ else {
68
+ setMenuState('nav')
69
+ }
70
+ }
71
+
72
+ const handleCheckout = () => {
73
+ setMenuState('closed')
74
+ setBagDrawerOpen(false)
75
+ router.push('/checkout')
76
+ }
77
+
78
+ const openBag = () => {
79
+ if (menuOpen()) {
80
+ setMenuState('bag')
81
+ }
82
+ else {
83
+ setBagDrawerOpen(true)
84
+ }
85
+ }
86
+ // header element MUST be fixed, and NOT sticky. Or else drawer breaks on mobile browsers
87
+ return (<>
88
+ <header className={cn(
89
+ `bg-background fixed z-header top-0 left-0 w-full ${menuOpen() ? 'hidden' : 'block'}`,
90
+ className
91
+ )}>
92
+ {/* smaller than md: mobile style drawer menu; h-11 is 44px, the standard mobile header height */}
93
+ <div className='w-full h-full flex flex-row justify-between items-center font-bold pr-5'>
94
+ <Logo href='/' size='md' outerClx={'p-6 h-full'} variant='text-only' />
95
+ {/* Not that key to the cross-fade effect
96
+ is that this is **on top of** the logo. */}
97
+ {menuOpen() && (
98
+ <div className={'absolute left-0 top-0 bottom-0 right-0 pl-8 ' +
99
+ 'flex flex-row ' +
100
+ 'bg-background animate-mobile-menu-open'
101
+ }>
102
+ <Icons.Avatar className='self-center ' />
103
+ </div>
104
+ )}
105
+ <div className='flex gap-0 flex-row'>
106
+ <BagButton className='text-primary -mr-[3px]' onClick={openBag} />
107
+ <MenuToggleButton className='text-foreground' open={menuOpen()} setOpen={setMenuOpen} />
108
+ </div>
109
+
110
+ </div>
111
+ </header>
112
+ <MobileBagDrawer
113
+ className=''
114
+ open={bagDrawerOpen}
115
+ setOpen={setBagDrawerOpen}
116
+ handleCheckout={handleCheckout}
117
+ />
118
+ {menuOpen() && (
119
+ <div className={
120
+ 'fixed top-0 left-0 w-full h-full ' +
121
+ // z must below header itself
122
+ 'flex flex-column bg-background z-below-header animate-mobile-menu-open'
123
+ }>
124
+ {menuState === 'login' ? (
125
+ <LoginPanel noHeading onLoginChanged={onLoginChanged} className='sm:animate-in sm:zoom-in-90' />
126
+ ) : (
127
+ menuState === 'bag' ? (
128
+
129
+ <CartPanel
130
+ handleCheckout={() => { router.push('/checkout') }}
131
+ className={bagClx}
132
+ listClx='rounded-sm'
133
+ scrollAfter={6}
134
+ scrollHeightClx='h-[80vh]'
135
+ itemClx='mt-2'
136
+ totalClx='sticky px-1 pr-2 border rounded-sm -bottom-[1px] bg-level-1'
137
+ buttonClx='max-w-[220px] flex-none'
138
+ >
139
+ <div className='flex flex-row items-center flex-none justify-center '>
140
+ <Icons.bag className='mr-2 relative w-4 h-5 fill-foreground ' />
141
+ <p className='font-heading text-foreground text-default'>Your Bag</p>
142
+ </div>
143
+ <div className='h-[1px] w-pr-80 bg-muted-3 mx-auto mt-1.5 flex-none' />
144
+ </CartPanel>
145
+
146
+ ) : ( /* menuState === 'nav' */
147
+ <NavMenu
148
+ currentAs={currentAs}
149
+ links={links}
150
+ className='sm:animate-in sm:zoom-in-90 w-full'
151
+ commonItemClx='px-0 text-xl h-16 justify-start '
152
+ setMenuState={setMenuState}
153
+ setChatbotOpen={setChatbotOpen}
154
+ setMenuOpen={setMenuOpen}
155
+ />
156
+ )
157
+ )}
158
+ </div>
159
+ ) /* menuOpen */}
160
+ </>)
161
+ }
162
+
163
+ export default MobileHeader
@@ -1,26 +1,26 @@
1
- 'use client'
2
-
3
- import React from 'react'
4
- import { Moon, Sun } from 'lucide-react'
5
- import { useTheme } from 'next-themes'
6
-
7
- import { Button } from '@hanzo/ui/primitives'
8
-
9
- const ThemeToggle: React.FC = () => {
10
-
11
- const { setTheme, theme } = useTheme()
12
-
13
- return (
14
- <Button
15
- variant='ghost'
16
- size='icon'
17
- onClick={() => {setTheme(theme === 'light' ? 'dark' : 'light')}}
18
- >
19
- <Sun className='h-[1.5rem] w-[1.3rem] dark:hidden' />
20
- <Moon className='hidden h-5 w-5 dark:block' />
21
- <span className='sr-only'>Toggle theme</span>
22
- </Button>
23
- )
24
- }
25
-
26
- export default ThemeToggle
1
+ 'use client'
2
+
3
+ import React from 'react'
4
+ import { Moon, Sun } from 'lucide-react'
5
+ import { useTheme } from 'next-themes'
6
+
7
+ import { Button } from '@hanzo/ui/primitives'
8
+
9
+ const ThemeToggle: React.FC = () => {
10
+
11
+ const { setTheme, theme } = useTheme()
12
+
13
+ return (
14
+ <Button
15
+ variant='ghost'
16
+ size='icon'
17
+ onClick={() => {setTheme(theme === 'light' ? 'dark' : 'light')}}
18
+ >
19
+ <Sun className='h-[1.5rem] w-[1.3rem] dark:hidden' />
20
+ <Moon className='hidden h-5 w-5 dark:block' />
21
+ <span className='sr-only'>Toggle theme</span>
22
+ </Button>
23
+ )
24
+ }
25
+
26
+ export default ThemeToggle