@luxfi/core 5.2.10 → 5.2.11

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 (155) hide show
  1. package/commerce/ui/conf.ts +13 -13
  2. package/commerce/ui/context.tsx +126 -126
  3. package/commerce/ui/store.ts +306 -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 +49 -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/cart-accordian.tsx +66 -0
  17. package/components/commerce/checkout-panel/checkout-panel-props.ts +10 -0
  18. package/components/commerce/checkout-panel/{dt-bag-carousel.tsx → desktop-bag-carousel.tsx} +36 -36
  19. package/components/commerce/checkout-panel/desktop-cp.tsx +83 -0
  20. package/components/commerce/checkout-panel/index.tsx +126 -129
  21. package/components/commerce/checkout-panel/mobile-cp.tsx +67 -0
  22. package/components/commerce/checkout-panel/policy-links.tsx +29 -0
  23. package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
  24. package/components/commerce/checkout-panel/thank-you.tsx +18 -18
  25. package/components/commerce/checkout-widget/const.ts +13 -13
  26. package/components/commerce/checkout-widget/index.tsx +192 -192
  27. package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
  28. package/components/commerce/checkout-widget/use-anim-clx-set.ts +58 -58
  29. package/components/commerce/desktop-bag-popup.tsx +78 -78
  30. package/components/commerce/desktop-nav-menu.tsx +130 -130
  31. package/components/commerce/drawer/index.tsx +99 -99
  32. package/components/commerce/drawer/micro.tsx +144 -144
  33. package/components/commerce/drawer/shell.tsx +85 -85
  34. package/components/commerce/mobile-bag-drawer.tsx +51 -51
  35. package/components/commerce/mobile-login-button.tsx +101 -101
  36. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  37. package/components/commerce/mobile-nav-menu-ai.tsx +47 -48
  38. package/components/commerce/mobile-nav-menu-item.tsx +49 -49
  39. package/components/commerce/mobile-nav-menu.tsx +101 -101
  40. package/components/contact-dialog/contact-form.tsx +113 -113
  41. package/components/contact-dialog/disclaimer.tsx +13 -13
  42. package/components/contact-dialog/index.tsx +64 -64
  43. package/components/copyright.tsx +21 -21
  44. package/components/drawer-margin.tsx +25 -25
  45. package/components/footer.tsx +77 -77
  46. package/components/header/desktop.tsx +50 -50
  47. package/components/header/index.tsx +52 -52
  48. package/components/header/mobile.tsx +163 -163
  49. package/components/header/theme-toggle.tsx +26 -26
  50. package/components/icons/24k-gold-card.tsx +43 -43
  51. package/components/icons/ai-chat.tsx +29 -29
  52. package/components/icons/anodized-titanium.tsx +45 -45
  53. package/components/icons/avatar.tsx +11 -11
  54. package/components/icons/bag-icon.tsx +10 -10
  55. package/components/icons/blog.tsx +20 -20
  56. package/components/icons/bridge.tsx +68 -68
  57. package/components/icons/changelog.tsx +21 -21
  58. package/components/icons/chrome.tsx +45 -45
  59. package/components/icons/coins.tsx +20 -20
  60. package/components/icons/compare-cards.tsx +21 -21
  61. package/components/icons/credit.tsx +20 -20
  62. package/components/icons/customer-support.tsx +21 -21
  63. package/components/icons/customers.tsx +33 -33
  64. package/components/icons/developer-docs.tsx +20 -20
  65. package/components/icons/exchange.tsx +21 -21
  66. package/components/icons/explorer.tsx +22 -22
  67. package/components/icons/faqs.tsx +21 -21
  68. package/components/icons/github.tsx +14 -14
  69. package/components/icons/guides.tsx +21 -21
  70. package/components/icons/gun-metal.tsx +44 -44
  71. package/components/icons/index.tsx +43 -43
  72. package/components/icons/integrations.tsx +25 -25
  73. package/components/icons/irradescent.tsx +41 -41
  74. package/components/icons/launch-subnet.tsx +21 -21
  75. package/components/icons/left-arrow.tsx +11 -11
  76. package/components/icons/lux-finance.tsx +23 -23
  77. package/components/icons/lux-logo.tsx +10 -10
  78. package/components/icons/lux-pass.tsx +25 -25
  79. package/components/icons/lux-quests.tsx +21 -21
  80. package/components/icons/market.tsx +24 -24
  81. package/components/icons/mirrored-titanium.tsx +46 -46
  82. package/components/icons/more-benefits.tsx +21 -21
  83. package/components/icons/open-source.tsx +26 -26
  84. package/components/icons/right-arrow.tsx +10 -10
  85. package/components/icons/safe.tsx +37 -37
  86. package/components/icons/search.tsx +12 -12
  87. package/components/icons/secure-delivery.tsx +13 -13
  88. package/components/icons/shop.tsx +20 -20
  89. package/components/icons/social-icon.tsx +35 -35
  90. package/components/icons/social-svg.css +3 -3
  91. package/components/icons/sterling-silver-card.tsx +44 -44
  92. package/components/icons/templates.tsx +21 -21
  93. package/components/icons/validators.tsx +41 -41
  94. package/components/icons/view-all-card.tsx +20 -20
  95. package/components/icons/wallet.tsx +20 -20
  96. package/components/icons/warpcast.tsx +58 -58
  97. package/components/icons/youtube-logo.tsx +59 -59
  98. package/components/index.ts +27 -27
  99. package/components/logo.tsx +89 -89
  100. package/components/main.tsx +27 -27
  101. package/components/mini-chart/index.tsx +7 -7
  102. package/components/mini-chart/mini-chart-props.ts +43 -43
  103. package/components/mini-chart/mini-chart.tsx +85 -85
  104. package/components/mini-chart/wrapper.tsx +23 -23
  105. package/components/not-found/index.tsx +28 -28
  106. package/components/not-found/not-found-content.mdx +5 -5
  107. package/components/scripts.tsx +24 -24
  108. package/components/tooltip.tsx +31 -31
  109. package/environment.d.ts +5 -5
  110. package/next/analytics/fpixel.ts +15 -15
  111. package/next/analytics/google-analytics.ts +13 -13
  112. package/next/analytics/index.ts +3 -3
  113. package/next/analytics/pixel-analytics.tsx +54 -54
  114. package/next/font/get-app-router-font-classes.ts +12 -12
  115. package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
  116. package/next/font/next-font-desc.ts +27 -27
  117. package/next/font/pages-router-font-vars.tsx +18 -18
  118. package/next/head-metadata/from-next/metadata-types.ts +158 -158
  119. package/next/head-metadata/from-next/opengraph-types.ts +267 -267
  120. package/next/head-metadata/from-next/twitter-types.ts +92 -92
  121. package/next/head-metadata/index.tsx +208 -208
  122. package/next/middleware/determine-device-mw.ts +16 -16
  123. package/package.json +79 -79
  124. package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
  125. package/root-layout/index.tsx +112 -112
  126. package/server-actions/firebase-app.ts +14 -14
  127. package/server-actions/index.ts +5 -5
  128. package/server-actions/store-contact.ts +51 -51
  129. package/site-def/footer/community.tsx +67 -67
  130. package/site-def/footer/company.ts +37 -37
  131. package/site-def/footer/ecosystem.ts +37 -37
  132. package/site-def/footer/index.tsx +26 -26
  133. package/site-def/footer/legal.ts +28 -28
  134. package/site-def/footer/network.ts +45 -45
  135. package/site-def/footer/svg/warpcast-logo.svg +11 -11
  136. package/site-def/index.ts +2 -2
  137. package/site-def/main-nav.tsx +392 -392
  138. package/style/cart-animation.css +29 -29
  139. package/style/checkout-animation.css +23 -23
  140. package/style/drawer-handle-overrides.css +160 -160
  141. package/style/lux-colors.css +85 -85
  142. package/style/lux-global.css +30 -30
  143. package/tailwind/fontFamily.tailwind.lux.ts +18 -18
  144. package/tailwind/index.ts +2 -2
  145. package/tailwind/lux-tw-fonts.ts +39 -39
  146. package/tailwind/tailwind.config.lux-preset.ts +10 -10
  147. package/tsconfig.json +15 -15
  148. package/types/chatbot-config.ts +6 -6
  149. package/types/chatbot-suggested-question.ts +7 -7
  150. package/types/contact-info.ts +10 -10
  151. package/types/index.ts +4 -4
  152. package/types/site-def.ts +43 -43
  153. package/components/commerce/checkout-panel/dt-checkout-panel.tsx +0 -85
  154. package/components/commerce/checkout-panel/links-row.tsx +0 -21
  155. package/components/commerce/checkout-panel/mb-checkout-panel.tsx +0 -55
@@ -1,305 +1,307 @@
1
- import {
2
- action,
3
- autorun,
4
- computed,
5
- makeObservable,
6
- observable,
7
- reaction,
8
- type IReactionDisposer,
9
- } from 'mobx'
10
-
11
- import type { CommerceService, LineItem, ObsLineItemRef } from '@hanzo/commerce/types'
12
-
13
- const LOG = false ////////////////////
14
-
15
- const log = (s: string) => {
16
- if (LOG) {
17
- console.log('COMMERCE_UI ' + s)
18
- }
19
- }
20
-
21
- type SnapPoint = number | string
22
-
23
- type SnapPoints = {
24
- full: SnapPoint
25
- micro: SnapPoint
26
- }
27
-
28
- type SnapPointsConfig = {
29
- mb: SnapPoints
30
- dt: SnapPoints
31
- }
32
-
33
- type DrawerState = 'closed' | 'micro' | 'full'
34
-
35
- interface RecentActivity extends ObsLineItemRef {
36
- quantityChanged(sku: string, val: number, prevVal: number): void
37
- }
38
-
39
- interface SelectAndBuy {
40
- showVariants: (skuPath: string) => void
41
- hideVariants: () => void
42
- get currentSkuPath(): string | undefined
43
- }
44
-
45
- interface CommerceDrawer {
46
-
47
- get open(): boolean
48
- get state(): DrawerState
49
- get closedByUser(): boolean
50
- setClosedByUser(b: boolean): void
51
- get modal(): boolean
52
- get points(): SnapPoint[]
53
- get activePoint(): SnapPoint | null
54
- // Called by UI Gesture
55
- onActivePointChanged: (p: SnapPoint | null) => void
56
- get showCheckout(): boolean
57
- get showAdded(): boolean
58
- get showBuy(): boolean
59
-
60
- get microHeight(): SnapPoint
61
- get isMobile(): boolean
62
- get snapPointPx(): number
63
- }
64
-
65
- class CommerceUIStore implements
66
- RecentActivity,
67
- SelectAndBuy,
68
- CommerceDrawer
69
- {
70
- _vHeight: number = 0
71
-
72
- _currentSkuPath: string | undefined = undefined
73
- _closedByUser: boolean = false
74
- _checkingOut: boolean | undefined = undefined
75
- _ignoreStateChange: boolean = false
76
- _activePoint: SnapPoint | null = null
77
-
78
- _activeItem: LineItem | undefined = undefined
79
- _reactionDisposers: IReactionDisposer[] = []
80
- _service: CommerceService
81
- _pointsConfig: SnapPointsConfig
82
- _points: SnapPoints // points to either this._pointsConfig.md or this._pointsConfig.dt
83
-
84
- constructor(s: CommerceService, conf: SnapPointsConfig) {
85
- this._service = s
86
- this._pointsConfig = conf
87
- this._points = this._pointsConfig.dt
88
-
89
- makeObservable(this, {
90
- _currentSkuPath: observable,
91
- _activeItem: observable.ref,
92
- _closedByUser: observable,
93
- _checkingOut: observable,
94
- _activePoint: observable,
95
- _points: observable.ref,
96
- _vHeight: observable,
97
-
98
- showVariants: action,
99
- hideVariants: action,
100
- quantityChanged: action,
101
- setClosedByUser: action,
102
- setCheckingOut: action,
103
- setActivePoint: action,
104
- setMobile: action,
105
- setViewportHeight: action,
106
- clearActiveItem: action,
107
-
108
- activePoint: computed,
109
- checkingOut: computed,
110
- closedByUser: computed,
111
- currentSkuPath: computed,
112
- item: computed,
113
- microHeight: computed,
114
- modal: computed,
115
- points: computed,
116
- showAdded: computed,
117
- showBuy: computed,
118
- showCheckout: computed,
119
- snapPointPx: computed,
120
- state: computed,
121
- open: computed
122
- })
123
- }
124
-
125
- initialize = (): void => {
126
-
127
- this._reactionDisposers.push(reaction(
128
- () => ( this.state ),
129
- (s) => {
130
- if (this.ignoreStateChange) {
131
- log(`STATE CHANGE to "${s}" (IGNORED)`) // ===========
132
- this.setIgnoreStateChange(false)
133
- return
134
- }
135
- else {
136
- log(`STATE CHANGE to "${s}" (UI REACTED)`) // ===========
137
- this._syncUIToState(s)
138
- }
139
- }
140
- ))
141
- this._reactionDisposers.push(autorun(() => {
142
- log('AUTORUN: OPEN: ' + this.open)
143
- log('AUTORUN:' + // ===============
144
- '[showCheckout: ' + this.showCheckout +
145
- '], [showAdded: ' + this.showAdded +
146
- '], [showBuy: ' + this.showBuy +
147
- '], [closedByUser: ' + this._closedByUser +
148
- '], [checkingOut: ' + this._checkingOut + ']'
149
- ) // ===========
150
- }))
151
- }
152
-
153
- reset = () => {
154
- this.hideVariants()
155
- this.setClosedByUser(false)
156
- this.clearActiveItem()
157
- // DO NOT reset _checkingOut!
158
- }
159
-
160
- onActivePointChanged = (pt: SnapPoint | null): void => {
161
- log("ON onActivePointChanged: " + pt) // ===========
162
- if (pt === this._points.micro && this.activePoint === this._points.full) {
163
- this.setIgnoreStateChange(true)
164
- this.hideVariants()
165
- }
166
- else if (pt === this._points.full && this.activePoint === this._points.micro) {
167
- this.setIgnoreStateChange(true)
168
- this.showVariants(this.item?.sku ?? '')
169
- }
170
- this.setActivePoint(pt)
171
- }
172
-
173
- showVariants = (skuPath: string): void => {
174
- this._service.setCurrentItem(undefined)
175
- this._currentSkuPath = skuPath
176
- this._closedByUser = false
177
- }
178
-
179
- hideVariants = (): void => { this._currentSkuPath = undefined }
180
-
181
- get currentSkuPath(): string | undefined { return this._currentSkuPath }
182
-
183
- quantityChanged = (sku: string, val: number, oldVal: number): void => {
184
-
185
- if (val === 0) {
186
- if (this._activeItem?.sku === sku) {
187
- this._activeItem = undefined
188
- }
189
- // otherwise ignore
190
- }
191
- else {
192
- if (!this._activeItem || this._activeItem.sku !== sku) {
193
- this._activeItem = this._service.getItemBySku(sku)
194
- }
195
- }
196
- }
197
-
198
- get item(): LineItem | undefined { return this._activeItem }
199
- clearActiveItem = (): void => { this._activeItem = undefined }
200
-
201
- get closedByUser(): boolean { return this._closedByUser }
202
- setClosedByUser = (b: boolean): void => { this._closedByUser = b}
203
-
204
- get ignoreStateChange(): boolean { return this._ignoreStateChange }
205
- setIgnoreStateChange = (b: boolean): void => { this._ignoreStateChange = b}
206
-
207
- get checkingOut(): boolean | undefined { return this._checkingOut }
208
- setCheckingOut = (b: boolean): void => { this._checkingOut = b }
209
-
210
- get activePoint(): SnapPoint | null { return this._activePoint }
211
- setActivePoint = (pt: SnapPoint | null): void => { this._activePoint = pt}
212
-
213
- get points(): SnapPoint[] {
214
- if (this.showBuy && !(this.showAdded || this.showCheckout)) {
215
- return [this._points.full]
216
- }
217
- else if (!this.showBuy && !this.showAdded && this.showCheckout) {
218
- return [this._points.micro]
219
- }
220
- return [this._points.micro, this._points.full]
221
- }
222
-
223
- _syncUIToState = (s: DrawerState) => {
224
- log("_syncUIToState: " + s) // ===========
225
- if (s === 'micro') {
226
- this.setActivePoint(this.points[0])
227
- }
228
- else if (s === 'full') {
229
- this.setActivePoint(this.points[this.points.length - 1])
230
- }
231
- }
232
-
233
- get open(): boolean {
234
-
235
- log('open():' + // ===============
236
- ' showCheckout: ' + this.showCheckout +
237
- ' showAdded: ' + this.showAdded +
238
- ' showBuy: ' + this.showBuy
239
- ) // ===========
240
-
241
-
242
-
243
- return (
244
- this._checkingOut !== undefined
245
- &&
246
- !this._checkingOut
247
- &&
248
- !this.closedByUser
249
- &&
250
- (this.showCheckout || this.showAdded || this.showBuy)
251
- )
252
- }
253
-
254
- get state(): DrawerState {
255
- if (!this.closedByUser && !this._checkingOut) {
256
- if (this.showBuy) {
257
- return 'full'
258
- }
259
- else if (this.showAdded || this.showCheckout) {
260
- return 'micro'
261
- }
262
- }
263
- return 'closed'
264
- }
265
-
266
- get showBuy(): boolean {return !!this.currentSkuPath}
267
- get showAdded(): boolean { return !!this.item}
268
- get showCheckout(): boolean { return !this._service.cartEmpty}
269
- get modal(): boolean { return this.state !== 'micro'}
270
-
271
- get microHeight(): SnapPoint {
272
- return this._points.micro
273
- }
274
-
275
- get isMobile(): boolean { return this._pointsConfig.mb === this._points }
276
- setMobile = (b: boolean): void => {
277
- log("setMobile: " + b) // ===========
278
- this._points = b ? this._pointsConfig.mb : this._pointsConfig.dt
279
- }
280
-
281
- setViewportHeight = (v: number) => {this._vHeight = v}
282
- get snapPointPx(): number {
283
- if (!this._activePoint || this._vHeight === 0) return 0
284
-
285
- if (typeof this._activePoint === 'string') {
286
- return parseInt(this._activePoint)
287
- }
288
-
289
- return this._vHeight * this._activePoint as number
290
- }
291
-
292
- dispose = () => {
293
- this._reactionDisposers.forEach((d) => {d()})
294
- }
295
- }
296
-
297
- export {
298
- CommerceUIStore,
299
- type CommerceDrawer,
300
- type RecentActivity,
301
- type SelectAndBuy,
302
- type SnapPointsConfig,
303
- type SnapPoints,
304
- type SnapPoint
1
+ import {
2
+ action,
3
+ autorun,
4
+ computed,
5
+ makeObservable,
6
+ observable,
7
+ reaction,
8
+ type IReactionDisposer,
9
+ } from 'mobx'
10
+
11
+ import type { CommerceService, LineItem, ObsLineItemRef } from '@hanzo/commerce/types'
12
+
13
+ const LOG = false ////////////////////
14
+
15
+ const log = (s: string) => {
16
+ if (LOG) {
17
+ console.log('COMMERCE_UI ' + s)
18
+ }
19
+ }
20
+
21
+ type SnapPoint = number | string
22
+
23
+ type SnapPoints = {
24
+ full: SnapPoint
25
+ micro: SnapPoint
26
+ }
27
+
28
+ type SnapPointsConfig = {
29
+ mb: SnapPoints
30
+ dt: SnapPoints
31
+ }
32
+
33
+ type DrawerState = 'closed' | 'micro' | 'full'
34
+
35
+ interface RecentActivity extends ObsLineItemRef {
36
+ quantityChanged(sku: string, val: number, prevVal: number): void
37
+ }
38
+
39
+ interface SelectAndBuy {
40
+ showVariants: (skuPath: string) => void
41
+ hideVariants: () => void
42
+ get currentSkuPath(): string | undefined
43
+ }
44
+
45
+ interface CommerceDrawer {
46
+
47
+ get open(): boolean
48
+ get state(): DrawerState
49
+ get closedByUser(): boolean
50
+ setClosedByUser(b: boolean): void
51
+ get modal(): boolean
52
+ get points(): SnapPoint[]
53
+ get activePoint(): SnapPoint | null
54
+ // Called by UI Gesture
55
+ onActivePointChanged: (p: SnapPoint | null) => void
56
+ get showCheckout(): boolean
57
+ get showAdded(): boolean
58
+ get showBuy(): boolean
59
+
60
+ get microHeight(): SnapPoint
61
+ get isMobile(): boolean
62
+ get snapPointPx(): number
63
+ }
64
+
65
+ class CommerceUIStore implements
66
+ RecentActivity,
67
+ SelectAndBuy,
68
+ CommerceDrawer
69
+ {
70
+ _vHeight: number = 0
71
+
72
+ _currentSkuPath: string | undefined = undefined
73
+ _closedByUser: boolean = false
74
+ _checkingOut: boolean | undefined = undefined
75
+ _ignoreStateChange: boolean = false
76
+ _activePoint: SnapPoint | null = null
77
+
78
+ _activeItem: LineItem | undefined = undefined
79
+ _reactionDisposers: IReactionDisposer[] = []
80
+ _service: CommerceService
81
+ _pointsConfig: SnapPointsConfig
82
+ _points: SnapPoints // points to either this._pointsConfig.md or this._pointsConfig.dt
83
+
84
+ constructor(s: CommerceService, conf: SnapPointsConfig) {
85
+ this._service = s
86
+ this._pointsConfig = conf
87
+ this._points = this._pointsConfig.dt
88
+
89
+ makeObservable(this, {
90
+ _currentSkuPath: observable,
91
+ _activeItem: observable.ref,
92
+ _closedByUser: observable,
93
+ _checkingOut: observable,
94
+ _activePoint: observable,
95
+ _points: observable.ref,
96
+ _vHeight: observable,
97
+
98
+ showVariants: action,
99
+ hideVariants: action,
100
+ quantityChanged: action,
101
+ setClosedByUser: action,
102
+ setCheckingOut: action,
103
+ setActivePoint: action,
104
+ setMobile: action,
105
+ setViewportHeight: action,
106
+ clearActiveItem: action,
107
+
108
+ activePoint: computed,
109
+ checkingOut: computed,
110
+ closedByUser: computed,
111
+ currentSkuPath: computed,
112
+ item: computed,
113
+ microHeight: computed,
114
+ modal: computed,
115
+ points: computed,
116
+ showAdded: computed,
117
+ showBuy: computed,
118
+ showCheckout: computed,
119
+ snapPointPx: computed,
120
+ state: computed,
121
+ open: computed
122
+ })
123
+ }
124
+
125
+ initialize = (): void => {
126
+
127
+ this._reactionDisposers.push(reaction(
128
+ () => ( this.state ),
129
+ (s) => {
130
+ if (this.ignoreStateChange) {
131
+ log(`STATE CHANGE to "${s}" (IGNORED)`) // ===========
132
+ this.setIgnoreStateChange(false)
133
+ return
134
+ }
135
+ else {
136
+ log(`STATE CHANGE to "${s}" (UI REACTED)`) // ===========
137
+ this._syncUIToState(s)
138
+ }
139
+ }
140
+ ))
141
+ /*
142
+ this._reactionDisposers.push(autorun(() => {
143
+ log('AUTORUN: OPEN: ' + this.open)
144
+ log('AUTORUN:' + // ===============
145
+ '[showCheckout: ' + this.showCheckout +
146
+ '], [showAdded: ' + this.showAdded +
147
+ '], [showBuy: ' + this.showBuy +
148
+ '], [closedByUser: ' + this._closedByUser +
149
+ '], [checkingOut: ' + this._checkingOut + ']'
150
+ ) // ===========
151
+ }))
152
+ */
153
+ }
154
+
155
+ reset = () => {
156
+ this.hideVariants()
157
+ this.setClosedByUser(false)
158
+ this.clearActiveItem()
159
+ // DO NOT reset _checkingOut!
160
+ }
161
+
162
+ onActivePointChanged = (pt: SnapPoint | null): void => {
163
+ log("ON onActivePointChanged: " + pt) // ===========
164
+ if (pt === this._points.micro && this.activePoint === this._points.full) {
165
+ this.setIgnoreStateChange(true)
166
+ this.hideVariants()
167
+ }
168
+ else if (pt === this._points.full && this.activePoint === this._points.micro) {
169
+ this.setIgnoreStateChange(true)
170
+ this.showVariants(this.item?.sku ?? '')
171
+ }
172
+ this.setActivePoint(pt)
173
+ }
174
+
175
+ showVariants = (skuPath: string): void => {
176
+ this._service.setCurrentItem(undefined)
177
+ this._currentSkuPath = skuPath
178
+ this._closedByUser = false
179
+ }
180
+
181
+ hideVariants = (): void => { this._currentSkuPath = undefined }
182
+
183
+ get currentSkuPath(): string | undefined { return this._currentSkuPath }
184
+
185
+ quantityChanged = (sku: string, val: number, oldVal: number): void => {
186
+
187
+ if (val === 0) {
188
+ if (this._activeItem?.sku === sku) {
189
+ this._activeItem = undefined
190
+ }
191
+ // otherwise ignore
192
+ }
193
+ else {
194
+ if (!this._activeItem || this._activeItem.sku !== sku) {
195
+ this._activeItem = this._service.getItemBySku(sku)
196
+ }
197
+ }
198
+ }
199
+
200
+ get item(): LineItem | undefined { return this._activeItem }
201
+ clearActiveItem = (): void => { this._activeItem = undefined }
202
+
203
+ get closedByUser(): boolean { return this._closedByUser }
204
+ setClosedByUser = (b: boolean): void => { this._closedByUser = b}
205
+
206
+ get ignoreStateChange(): boolean { return this._ignoreStateChange }
207
+ setIgnoreStateChange = (b: boolean): void => { this._ignoreStateChange = b}
208
+
209
+ get checkingOut(): boolean | undefined { return this._checkingOut }
210
+ setCheckingOut = (b: boolean): void => { this._checkingOut = b }
211
+
212
+ get activePoint(): SnapPoint | null { return this._activePoint }
213
+ setActivePoint = (pt: SnapPoint | null): void => { this._activePoint = pt}
214
+
215
+ get points(): SnapPoint[] {
216
+ if (this.showBuy && !(this.showAdded || this.showCheckout)) {
217
+ return [this._points.full]
218
+ }
219
+ else if (!this.showBuy && !this.showAdded && this.showCheckout) {
220
+ return [this._points.micro]
221
+ }
222
+ return [this._points.micro, this._points.full]
223
+ }
224
+
225
+ _syncUIToState = (s: DrawerState) => {
226
+ log("_syncUIToState: " + s) // ===========
227
+ if (s === 'micro') {
228
+ this.setActivePoint(this.points[0])
229
+ }
230
+ else if (s === 'full') {
231
+ this.setActivePoint(this.points[this.points.length - 1])
232
+ }
233
+ }
234
+
235
+ get open(): boolean {
236
+
237
+ log('open():' + // ===============
238
+ ' showCheckout: ' + this.showCheckout +
239
+ ' showAdded: ' + this.showAdded +
240
+ ' showBuy: ' + this.showBuy
241
+ ) // ===========
242
+
243
+
244
+
245
+ return (
246
+ this._checkingOut !== undefined
247
+ &&
248
+ !this._checkingOut
249
+ &&
250
+ !this.closedByUser
251
+ &&
252
+ (this.showCheckout || this.showAdded || this.showBuy)
253
+ )
254
+ }
255
+
256
+ get state(): DrawerState {
257
+ if (!this.closedByUser && !this._checkingOut) {
258
+ if (this.showBuy) {
259
+ return 'full'
260
+ }
261
+ else if (this.showAdded || this.showCheckout) {
262
+ return 'micro'
263
+ }
264
+ }
265
+ return 'closed'
266
+ }
267
+
268
+ get showBuy(): boolean {return !!this.currentSkuPath}
269
+ get showAdded(): boolean { return !!this.item}
270
+ get showCheckout(): boolean { return !this._service.cartEmpty}
271
+ get modal(): boolean { return this.state !== 'micro'}
272
+
273
+ get microHeight(): SnapPoint {
274
+ return this._points.micro
275
+ }
276
+
277
+ get isMobile(): boolean { return this._pointsConfig.mb === this._points }
278
+ setMobile = (b: boolean): void => {
279
+ log("setMobile: " + b) // ===========
280
+ this._points = b ? this._pointsConfig.mb : this._pointsConfig.dt
281
+ }
282
+
283
+ setViewportHeight = (v: number) => {this._vHeight = v}
284
+ get snapPointPx(): number {
285
+ if (!this._activePoint || this._vHeight === 0) return 0
286
+
287
+ if (typeof this._activePoint === 'string') {
288
+ return parseInt(this._activePoint)
289
+ }
290
+
291
+ return this._vHeight * this._activePoint as number
292
+ }
293
+
294
+ dispose = () => {
295
+ this._reactionDisposers.forEach((d) => {d()})
296
+ }
297
+ }
298
+
299
+ export {
300
+ CommerceUIStore,
301
+ type CommerceDrawer,
302
+ type RecentActivity,
303
+ type SelectAndBuy,
304
+ type SnapPointsConfig,
305
+ type SnapPoints,
306
+ type SnapPoint
305
307
  }