@lockerverse/react 0.2.192-dev.1 → 0.2.194
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.
- package/MIGRATIONS.md +30 -77
- package/dist/auction-gallery.css +2 -2
- package/dist/auction-item.js +1 -1
- package/dist/auction-item.js.map +1 -1
- package/guides/auctions.md +1 -1
- package/guides/events.md +1 -1
- package/guides/integration.md +1 -1
- package/guides/payment-widgets.md +1 -1
- package/guides/signup.md +1 -1
- package/package.json +2 -2
package/MIGRATIONS.md
CHANGED
|
@@ -36,7 +36,32 @@ If it cannot be found, report that limit and use the baseline review below. Do n
|
|
|
36
36
|
claim that every historical migration was applied. Read this file even if the
|
|
37
37
|
version already matches: a previous upgrade may have missed host adoption steps.
|
|
38
38
|
|
|
39
|
-
## 0.2.
|
|
39
|
+
## 0.2.194 — sharper large auction gallery photos
|
|
40
|
+
|
|
41
|
+
- **Affected:** React auction item gallery responsive images.
|
|
42
|
+
- **Automatic:** the main gallery can select the existing 1920-pixel image
|
|
43
|
+
variant for large displays and high-density screens. Smaller variants remain
|
|
44
|
+
available; the browser selects a source for the rendered size and pixel ratio.
|
|
45
|
+
- **Required host changes:** upgrade Core and React together and deploy the host.
|
|
46
|
+
No integration code changes are required.
|
|
47
|
+
- **Unchanged:** image layout, thumbnails, full-screen viewer, and checkout.
|
|
48
|
+
- **Check:** inspect the selected image source in a wide embedded gallery on a
|
|
49
|
+
high-density screen. Confirm it can use the 1920-pixel variant without cropping.
|
|
50
|
+
|
|
51
|
+
## 0.2.193 — complete auction gallery photos
|
|
52
|
+
|
|
53
|
+
- **Affected:** React auction item galleries and photo thumbnails.
|
|
54
|
+
- **Automatic:** gallery photos fit inside their reserved space without cropping.
|
|
55
|
+
Wide and tall photos remain complete, matching the full-screen photo viewer.
|
|
56
|
+
- **Required host changes:** upgrade Core and React together and deploy the host.
|
|
57
|
+
No integration code changes are required.
|
|
58
|
+
- **Recommended:** use the original high-resolution product photo. This display
|
|
59
|
+
change cannot restore detail missing from an uploaded source image.
|
|
60
|
+
- **Unchanged:** catalog cards, gallery dimensions, navigation, and checkout.
|
|
61
|
+
- **Check:** inspect a wide and a tall photo on desktop and mobile. Confirm all
|
|
62
|
+
edges remain visible in the item gallery, thumbnails, and full-screen viewer.
|
|
63
|
+
|
|
64
|
+
## 0.2.191 — auction item additional charges
|
|
40
65
|
|
|
41
66
|
- **Affected:** Core auction item data, purchase quotes, and React auction checkout.
|
|
42
67
|
- **Automatic:** optional `additionalCharge` charges the first-item amount plus the
|
|
@@ -54,7 +79,7 @@ version already matches: a previous upgrade may have missed host adoption steps.
|
|
|
54
79
|
- **Check:** compare one, two, and maximum quantity totals with the server quote,
|
|
55
80
|
verify the per-order limit, and inspect the named charge row before payment.
|
|
56
81
|
|
|
57
|
-
## 0.2.
|
|
82
|
+
## 0.2.189 — widget load recovery and Sentry releases
|
|
58
83
|
|
|
59
84
|
- **Affected:** Core widget loading and SDK failure reporting.
|
|
60
85
|
- **Automatic:** a widget GET retries once after a network failure or request
|
|
@@ -81,7 +106,6 @@ version already matches: a previous upgrade may have missed host adoption steps.
|
|
|
81
106
|
- **Check:** select one, two, and the maximum allowed trigger quantity. Confirm the
|
|
82
107
|
local summary and server quote agree; removing all trigger items removes shipping.
|
|
83
108
|
|
|
84
|
-
|
|
85
109
|
## 0.2.184 — single focus boundary for form fields
|
|
86
110
|
|
|
87
111
|
- **Affected:** React form controls and the shared phone field in payment and signup.
|
|
@@ -101,7 +125,7 @@ Widgets can now use a private contact list for email eligibility, a fixed amount
|
|
|
101
125
|
Required shipping appears in `catalog.widget.requiredShipping`. Do not offer this product as a separate shopper choice. The SDK adds its quantity once when a trigger product is selected; the server also enforces this rule. Render authoritative quote line items and totals, including shipping. The built-in launcher and payment summary handle this automatically.
|
|
102
126
|
|
|
103
127
|
|
|
104
|
-
## 0.2.
|
|
128
|
+
## 0.2.177 — Secure checkout loading recovery
|
|
105
129
|
|
|
106
130
|
- **Affected:** React payment widget Stripe fields.
|
|
107
131
|
- **Automatic:** failed field or script loads show a reload action. Fields that
|
|
@@ -113,22 +137,8 @@ Required shipping appears in `catalog.widget.requiredShipping`. Do not offer thi
|
|
|
113
137
|
- Reload is an explicit customer action and can clear unsaved form entries.
|
|
114
138
|
Saved payment recovery remains in session storage.
|
|
115
139
|
|
|
116
|
-
## 0.2.175 — Match Stripe Elements payment method configuration
|
|
117
|
-
|
|
118
|
-
- **Affected:** Core checkout submission and React payment widgets.
|
|
119
|
-
- **Automatic:** React configures explicit card, Link, and community-enabled bank
|
|
120
|
-
methods in Stripe Elements and marks the confirmation request with
|
|
121
|
-
`paymentMethodConfiguration: "explicit"`. This matches the backend's Stripe
|
|
122
|
-
PaymentIntent configuration.
|
|
123
|
-
- **Required:** deploy the backend that supports this optional marker before
|
|
124
|
-
upgrading React. Keep Core and React matched. Existing Core-only callers omit
|
|
125
|
-
the marker and retain automatic payment methods. Custom Elements integrations
|
|
126
|
-
must send the marker only when they use the explicit method list.
|
|
127
|
-
- **Check:** submit card and bank payments through Stripe Elements in test mode,
|
|
128
|
-
including recurring checkout. Confirm pending recovery and settlement.
|
|
129
|
-
|
|
130
140
|
|
|
131
|
-
## 0.2.
|
|
141
|
+
## 0.2.175 — Match Stripe Elements payment method configuration
|
|
132
142
|
|
|
133
143
|
- **Affected:** Core checkout submission and React payment widgets.
|
|
134
144
|
- **Automatic:** React configures explicit card, Link, and community-enabled bank
|
|
@@ -203,39 +213,7 @@ Required shipping appears in `catalog.widget.requiredShipping`. Do not offer thi
|
|
|
203
213
|
verify a changed selection cannot discard it. Check both paid and free order
|
|
204
214
|
confirmation panels. Do not submit a live transaction for this check.
|
|
205
215
|
|
|
206
|
-
## 0.2.
|
|
207
|
-
|
|
208
|
-
- **Affected:** React payment widgets with unresolved payments.
|
|
209
|
-
- **Automatic behavior:** the existing pending-payment screen now offers Check
|
|
210
|
-
payment status. It checks the saved payment reference and cannot submit a new
|
|
211
|
-
payment. The control is disabled while the check runs.
|
|
212
|
-
- **Required host changes:** none. Update Core and React together.
|
|
213
|
-
- **Verification:** complete a test bank payment, return to its pending checkout,
|
|
214
|
-
and check its status. Confirm completion clears recovery storage.
|
|
215
|
-
|
|
216
|
-
## 0.2.171-dev.1 — SDK payment recovery and completion UI
|
|
217
|
-
|
|
218
|
-
- **Affected:** React payment widgets and custom hosts that persist payment recovery.
|
|
219
|
-
- **Optional adoption:** pass `recoveryStorageKey` to `LockerversePayment` to let
|
|
220
|
-
the SDK save and restore the pending payment in session storage. Use a stable
|
|
221
|
-
key scoped to the API environment, community, and widget. Remove the host's
|
|
222
|
-
storage code and recovery-driven component key. Do not combine automatic
|
|
223
|
-
persistence with a second host persistence writer.
|
|
224
|
-
- **Compatibility:** the SDK reads the hosted Next app's existing version 1
|
|
225
|
-
records when the same key is used. It writes version 2 records with widget
|
|
226
|
-
identity. It checks widget and selection identity before recovery and keeps
|
|
227
|
-
an unresolved record if those details differ. Recovery uses the saved connected
|
|
228
|
-
account even if current payment routing has changed. Storage is read after hydration,
|
|
229
|
-
before the payable form mounts. No contact details or payment tokens are saved.
|
|
230
|
-
- **Optional UI adoption:** use `completionView="summary"` for the SDK confirmation
|
|
231
|
-
panel and remove the host's duplicate success panel. Completion callbacks still
|
|
232
|
-
run. The default inline message and explicit `resumePayment` integrations remain
|
|
233
|
-
supported. Auctions and legacy custom checkout forms are unchanged.
|
|
234
|
-
- **Check:** reload a pending checkout and confirm the existing payment is checked;
|
|
235
|
-
verify a changed selection cannot discard it. Check both paid and free order
|
|
236
|
-
confirmation panels. Do not submit a live transaction for this check.
|
|
237
|
-
|
|
238
|
-
## 0.2.169-dev.1 — six-month payment widgets
|
|
216
|
+
## 0.2.170 — six-month payment widgets
|
|
239
217
|
|
|
240
218
|
Affected: @lockerverse/sdk checkout and @lockerverse/react payment widgets.
|
|
241
219
|
|
|
@@ -251,31 +229,6 @@ Affected: @lockerverse/sdk checkout and @lockerverse/react payment widgets.
|
|
|
251
229
|
submission. Do not submit a live payment for an integration check.
|
|
252
230
|
|
|
253
231
|
|
|
254
|
-
## 0.2.168-dev.1 — bank authorization terms
|
|
255
|
-
|
|
256
|
-
- **Affected:** React payment widgets with ACH enabled.
|
|
257
|
-
- **Automatic:** Stripe displays its bank authorization terms before payment confirmation.
|
|
258
|
-
- **Adoption:** update the matching SDK/React development pair. No prop changes are required.
|
|
259
|
-
- **Check:** confirm that the bank authorization text is visible when a bank account is selected.
|
|
260
|
-
|
|
261
|
-
## 0.2.167-dev.1 — widget ACH and subscription payment recovery
|
|
262
|
-
|
|
263
|
-
- **Affected:** Core checkout data and React payment widgets.
|
|
264
|
-
- **Automatic:** bank payment availability follows the organization default and
|
|
265
|
-
community override returned by the backend. Missing policy remains disabled.
|
|
266
|
-
Pending payments keep their existing payment reference. A failed subscription
|
|
267
|
-
invoice can return `action_required` with `requiresAction: false` and `retryUrl`;
|
|
268
|
-
React shows a link to pay the same invoice instead of creating a second subscription.
|
|
269
|
-
- **Required for custom payment UI:** preserve the reference for pending and
|
|
270
|
-
action-required results. Handle `retryUrl` by opening that invoice, and recover
|
|
271
|
-
status before permitting a new checkout. Do not treat submission as settlement.
|
|
272
|
-
- **Adoption:** deploy the matching backend policy and recovery contract before
|
|
273
|
-
enabling ACH. Existing React hosts need no component prop changes. Keep Core and
|
|
274
|
-
React versions matched when upgrading. Auction payment methods are unchanged.
|
|
275
|
-
- **Check:** verify disabled/inherited/enabled bank visibility and pending, bank
|
|
276
|
-
verification, invoice retry, success, and terminal failure in Stripe test mode.
|
|
277
|
-
Do not create a live transaction for this check.
|
|
278
|
-
|
|
279
232
|
## 0.2.166 — single dropdown arrow
|
|
280
233
|
|
|
281
234
|
- **Affected:** native single-select custom fields in React signup and payment forms.
|
package/dist/auction-gallery.css
CHANGED
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
display: block;
|
|
56
56
|
width: 100%;
|
|
57
57
|
height: 100%;
|
|
58
|
-
object-fit:
|
|
58
|
+
object-fit: contain;
|
|
59
59
|
}
|
|
60
60
|
.lockerverse-auction-gallery__rotation {
|
|
61
61
|
position: absolute;
|
|
@@ -185,7 +185,7 @@
|
|
|
185
185
|
display: block;
|
|
186
186
|
width: 100%;
|
|
187
187
|
height: 100%;
|
|
188
|
-
object-fit:
|
|
188
|
+
object-fit: contain;
|
|
189
189
|
border-radius: 5px;
|
|
190
190
|
}
|
|
191
191
|
.lockerverse-auction-gallery__backdrop {
|
package/dist/auction-item.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,c as t,i as n,l as r,n as i,r as a,s as o,t as s}from"./use-auction-boundary.js";import{n as c,t as l}from"./auction-image.js";import{a as u,i as d}from"./auction-payment.js";import{t as f}from"./auction-result2.js";import{t as p}from"./host-callback.js";import{ArrowRight as m,ChevronDown as h,ChevronLeft as g,ChevronRight as _,Clock3 as v,Gavel as y,Pause as b,Play as x,ShieldCheck as S,TimerReset as C,X as w}from"lucide-react";import{useCallback as T,useEffect as E,useId as D,useMemo as O,useRef as k,useState as A}from"react";import{Fragment as j,jsx as M,jsxs as N}from"react/jsx-runtime";import{getLockerverseAuctionMinimumBid as P}from"@lockerverse/sdk/auctions";import{Dialog as F}from"@base-ui/react/dialog";import I from"embla-carousel-autoplay";import L from"embla-carousel-react";const R=6e3;function z(e,t){let n=k(R),r=k(null),[i,a]=A(R),o=O(()=>I({delay:i,playOnInit:!1,stopOnFocusIn:!1,stopOnInteraction:!0,stopOnMouseEnter:!1}),[i]),[s,c]=L({duration:t?0:25,loop:!0},[o]),l=T(()=>{r.current&&(r.current.style.transform=`scaleX(${1-n.current/R})`)},[]),u=T(()=>{let e=o.timeUntilNext();e!==null&&(n.current=Math.max(1,Math.min(R,e))),o.stop(),l()},[o,l]),d=T(()=>{n.current=R,a(R),o.reset(),l()},[o,l]);return E(()=>{c&&(e?i===n.current?o.play():a(n.current):u())},[c,e,o,i,a,n,u]),E(()=>{if(!c)return;let t=0,r=()=>{let i=o.timeUntilNext();!e||i===null||(n.current=Math.max(0,Math.min(R,i)),l(),t=requestAnimationFrame(r))},i=()=>{cancelAnimationFrame(t),e&&(t=requestAnimationFrame(r))},a=()=>cancelAnimationFrame(t),s=()=>{e&&o.play()};return c.on(`select`,d).on(`reInit`,s).on(`autoplay:timerset`,i).on(`autoplay:timerstopped`,a),l(),i(),()=>{a(),c.off(`select`,d).off(`reInit`,s).off(`autoplay:timerset`,i).off(`autoplay:timerstopped`,a)}},[c,o,e,n,d,l]),{embla:c,freeze:u,progressRef:r,reset:d,viewportRef:s}}function B({photos:e,name:t,imageSizes:n=`(max-width: 1279px) 100vw, 45vw`,selected:r,paused:a=!1,photoButtonRef:o,onSelect:s,onExpand:c}){let u=k(null),d=k(null),f=k([]),[p,m]=A(!0),[h,v]=A(!1),[y,S]=A(!1),[C,w]=A(!1),[T,D]=A(!1),{ref:O,visible:P}=i(),[F,I]=A(!1),[L,R]=A(!0),B=k(null),V=`lockerverse-auction-gallery__control ${L||F||y?`is-visible`:``}`,H=()=>{B.current&&clearTimeout(B.current),B.current=setTimeout(()=>I(!1),2e3)},U=e=>{if(e.pointerType!==`mouse`){R(!0);return}I(!0),B.current&&clearTimeout(B.current),e.target instanceof Element&&e.target.closest(`[data-gallery-control]`)||H()};E(()=>{let e=window.matchMedia(`(hover: none), (pointer: coarse)`),t=()=>R(e.matches);return t(),e.addEventListener(`change`,t),()=>{e.removeEventListener(`change`,t),clearTimeout(B.current??void 0)}},[]);let W=!(a||p||h||y||C||T)&&P,G=e.length,K=G?(r%G+G)%G:0,{viewportRef:q,embla:J,progressRef:Y,freeze:X,reset:Z}=z(W&&G>1,p);E(()=>{let e=window.matchMedia(`(prefers-reduced-motion: reduce)`),t=()=>m(e.matches);return t(),e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]),E(()=>{if(!J)return;let e=()=>s(J.selectedScrollSnap());return J.on(`select`,e).on(`reInit`,e),()=>{J.off(`select`,e).off(`reInit`,e)}},[J,s]),E(()=>{J&&J.selectedScrollSnap()!==K&&J.scrollTo(K,!0)},[J,K]),E(()=>{let e=()=>{document.hidden&&X()},t=()=>D(!1);return e(),document.addEventListener(`visibilitychange`,e,!0),window.addEventListener(`pointerup`,t),window.addEventListener(`pointercancel`,t),()=>{document.removeEventListener(`visibilitychange`,e,!0),window.removeEventListener(`pointerup`,t),window.removeEventListener(`pointercancel`,t)}},[X]);let Q=e=>{J?.scrollTo((e+G)%G,p),Z()};return E(()=>{let e=d.current;d.current=null,e&&document.activeElement===e&&O.current?.querySelector(`.lockerverse-auction-gallery__photo[tabindex="0"]`)?.focus({preventScroll:!0})},[K,O]),E(()=>{let e=u.current,t=f.current[K];if(!(e&&t))return;let n=e.getBoundingClientRect(),r=t.getBoundingClientRect();r.left<n.left?e.scrollLeft-=n.left-r.left:r.right>n.right&&(e.scrollLeft+=r.right-n.right)},[K,G]),N(`section`,{"aria-label":`${t} photos`,className:`lockerverse-auction-gallery`,onBlurCapture:e=>{e.currentTarget.contains(e.relatedTarget)||S(!1)},onFocusCapture:e=>S(e.target.matches(`:focus-visible`)),onKeyDown:e=>{G<2||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||(e.key===`ArrowLeft`||e.key===`ArrowRight`)&&(e.preventDefault(),e.target instanceof HTMLButtonElement&&e.target.classList.contains(`lockerverse-auction-gallery__photo`)&&(d.current=e.target),Q(K+(e.key===`ArrowRight`?1:-1)))},onPointerEnter:e=>{e.pointerType===`mouse`&&v(!0)},onPointerLeave:e=>{e.pointerType===`mouse`&&v(!1)},ref:O,children:[G?N(`div`,{className:`lockerverse-auction-gallery__stage`,onPointerEnter:U,onPointerLeave:H,onPointerMove:U,children:[M(`div`,{className:`lockerverse-auction-gallery__viewport`,onPointerDownCapture:()=>{X(),D(!0)},ref:q,children:M(`div`,{className:`lockerverse-auction-gallery__track`,children:e.map((e,r)=>M(`div`,{"aria-hidden":r!==K,className:`lockerverse-auction-gallery__slide`,children:M(`button`,{"aria-label":`View photo ${r+1} of ${t} at full size`,className:`lockerverse-auction-gallery__photo`,onClick:()=>{c(r)},ref:r===K?o:void 0,tabIndex:r===K?0:-1,type:`button`,children:M(l,{alt:`${t}, ${r+1} of ${G}`,className:`lockerverse-auction-gallery__image`,draggable:!1,fetchPriority:r===0?`high`:`auto`,height:900,loading:r===K?`eager`:`lazy`,maxWidth:1280,sizes:r===K?n:`auto, ${n}`,src:e,width:1200})})},`${e}-${r}`))})}),G>1&&!p&&N(`div`,{className:`lockerverse-auction-gallery__rotation`,children:[M(`div`,{"aria-hidden":`true`,className:`lockerverse-auction-gallery__progress-track`,children:M(`div`,{className:`lockerverse-auction-gallery__progress`,ref:Y,style:{transform:`scaleX(0)`}})}),M(`button`,{"aria-label":C?`Play photo rotation`:`Pause photo rotation`,className:`lockerverse-auction-gallery__play ${V}`,"data-gallery-control":!0,onClick:()=>w(e=>!e),title:C?`Play photo rotation`:`Pause photo rotation`,type:`button`,children:M(C?x:b,{"aria-hidden":`true`,size:13})})]}),G>1&&N(j,{children:[M(`button`,{"aria-label":`Previous photo`,className:`lockerverse-auction-gallery__previous ${V}`,"data-gallery-control":!0,onClick:()=>Q(K-1),type:`button`,children:M(g,{"aria-hidden":`true`,className:`lockerverse-auction-gallery__chevron`})}),M(`button`,{"aria-label":`Next photo`,className:`lockerverse-auction-gallery__next ${V}`,"data-gallery-control":!0,onClick:()=>Q(K+1),type:`button`,children:M(_,{"aria-hidden":`true`,className:`lockerverse-auction-gallery__chevron`})})]})]}):M(`div`,{className:`lockerverse-auction-gallery__empty`,children:`No photo available`}),G>1&&M(`section`,{"aria-label":`Choose a photo`,className:`lockerverse-auction-gallery__strip`,ref:u,children:M(`div`,{className:`lockerverse-auction-gallery__thumbnails`,children:e.map((e,t)=>M(`button`,{"aria-label":`Show photo ${t+1} of ${G}`,"aria-pressed":K===t,className:`lockerverse-auction-gallery__thumbnail ${K===t?`is-selected`:``}`,onClick:()=>Q(t),ref:e=>{f.current[t]=e},type:`button`,children:M(l,{alt:``,className:`lockerverse-auction-gallery__thumbnail-image`,height:66,loading:`lazy`,maxWidth:192,sizes:`88px`,src:e,width:88})},`${e}-${t}`))})})]})}function V({images:e,fallbackImage:t,name:n,imageSizes:r}){let i=[...new Set(e.filter(Boolean))];!i.length&&t&&i.push(t);let[a,o]=A(0),[s,c]=A(!1),u=k(null),d=k(null),f=i.length,p=f?(a%f+f)%f:0;return N(j,{children:[M(B,{imageSizes:r,name:n,onExpand:e=>{o(e),c(!0)},onSelect:o,paused:s,photoButtonRef:u,photos:i,selected:p}),f>0&&M(F.Root,{onOpenChange:c,open:s,children:N(F.Portal,{children:[M(F.Backdrop,{className:`lockerverse-auction-gallery__backdrop`}),N(F.Popup,{"aria-describedby":void 0,className:`lockerverse-auction-gallery__viewer`,finalFocus:u,onKeyDown:e=>{f<2||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||(e.key===`ArrowLeft`||e.key===`ArrowRight`)&&(e.preventDefault(),o((p+(e.key===`ArrowRight`?1:-1)+f)%f))},children:[N(F.Title,{className:`lockerverse-auction-gallery__sr-only`,children:[n,` · Photo `,p+1,` of `,f]}),N(`div`,{className:`lockerverse-auction-gallery__full-image`,onTouchCancel:()=>{d.current=null},onTouchEnd:e=>{let t=d.current;d.current=null;let n=e.changedTouches.item(0);if(!(t&&n)||f<2)return;let r=n.clientX-t.x,i=n.clientY-t.y;Math.abs(r)>=45&&Math.abs(r)>Math.abs(i)*1.3&&o((p+(r<0?1:-1)+f)%f)},onTouchMove:e=>{e.touches.length!==1&&(d.current=null)},onTouchStart:e=>{let t=e.touches.item(0);d.current=e.touches.length===1&&t?{x:t.clientX,y:t.clientY}:null},children:[M(l,{alt:`${n}, ${p+1} of ${f}`,height:900,maxWidth:1920,sizes:`100vw`,src:i[p],width:1200}),s&&f>1&&M(l,{alt:``,"aria-hidden":`true`,className:`lockerverse-auction-gallery__preload`,height:900,loading:`eager`,maxWidth:1920,sizes:`100vw`,src:i[(p+1)%f],width:1200})]}),M(F.Close,{"aria-label":`Close photo viewer`,className:`lockerverse-auction-gallery__viewer-close`,children:M(w,{"aria-hidden":`true`,size:22})}),f>1&&N(j,{children:[M(`button`,{"aria-label":`Previous photo`,className:`lockerverse-auction-gallery__viewer-previous`,onClick:()=>o((p-1+f)%f),type:`button`,children:M(g,{"aria-hidden":`true`,size:28})}),M(`button`,{"aria-label":`Next photo`,className:`lockerverse-auction-gallery__viewer-next`,onClick:()=>o((p+1)%f),type:`button`,children:M(_,{"aria-hidden":`true`,size:28})})]})]})]})})]})}const H={1:`h1`,2:`h2`};function U(e){return M(e===`Buy Now`?S:e===`Available`||e===`Increment`?C:y,{"aria-hidden":`true`,size:16})}function W(e,t){return e.saleMode===`buy_now`?[[`Buy Now`,n(e.buyNowPriceAmount??0)],[`Available`,e.availableQuantity===null?`Available`:String(e.availableQuantity)]]:t===`finished`?[[`Final bid`,e.maxBidAmount?n(e.maxBidAmount):`No bids`]]:[[`Current bid`,n(e.maxBidAmount??0)],[`Floor`,n(e.minBidAmount??0)],[`Increment`,n(e.bidIncrementAmount??100)]]}function G({auction:r,item:i,itemHeadingLevel:o=2,galleryImageSizes:c}){s(i.startAt??r.startAt,i.endAt??r.endAt);let[l,u]=A(!1),d=D(),f=e(r,i),p={active:`Closes`,draft:`Opens`,finished:`Closed`}[f],m=a(r,f,i),g=i.saleMode===`buy_now`,_=(i.description??``).trim().length>240,y=W(i,f),b=H[o];return N(`section`,{className:`lockerverse-auctions__item-summary`,children:[M(V,{fallbackImage:i.image??r.configuration.image??r.community?.banner??r.community?.thumbnail??null,imageSizes:c,images:i.images,name:i.name}),N(`div`,{className:`lockerverse-auctions__item-copy`,children:[M(b,{children:i.name}),i.description?N(`div`,{className:`lockerverse-auctions__item-description`,children:[M(t,{className:!l&&_?`lockerverse-auctions__description-clamped`:void 0,description:i.description,id:d}),_?N(`button`,{"aria-controls":d,"aria-expanded":l,className:`lockerverse-auctions__description-toggle`,onClick:()=>u(!l),type:`button`,children:[l?`Hide description`:`Read full description`,` `,M(h,{"aria-hidden":`true`,size:16,style:{transform:l?`rotate(180deg)`:void 0}})]}):null]}):null,N(`dl`,{className:`lockerverse-auctions__stat-panel`,children:[y.map(([e,t])=>N(`div`,{className:`lockerverse-auctions__stat-row`,children:[N(`dt`,{children:[U(e),e]}),M(`dd`,{children:t})]},e)),N(`div`,{className:`lockerverse-auctions__stat-row`,children:[N(`dt`,{children:[M(v,{"aria-hidden":`true`,size:16}),p]}),M(`dd`,{className:`lockerverse-auctions__stat-date`,children:m})]}),!g&&f===`finished`?N(`div`,{className:`lockerverse-auctions__stat-footer`,children:[N(`div`,{children:[M(`dt`,{children:`Floor`}),M(`dd`,{children:n(i.minBidAmount??0)})]}),N(`div`,{children:[M(`dt`,{children:`Bid increment`}),M(`dd`,{children:n(i.bidIncrementAmount??100)})]})]}):null]})]})]})}const K={1:`h2`,2:`h3`},q=/^\d+$/;function J(e,t){let r=Number(e),i=r*(t.buyNowPriceAmount??0);if(!(q.test(e)&&Number.isSafeInteger(i))||r<1)return`Enter a whole-number quantity.`;if(!t.additionalCharge)return`Total: ${n(i)}`;let a=t.additionalCharge.firstUnitAmountCents+t.additionalCharge.additionalUnitAmountCents*(r-1),o=i+a;return Number.isSafeInteger(o)?`Subtotal: ${n(i)} · ${t.additionalCharge.name}: ${n(a)} · Total: ${n(o)}`:`Enter a valid quantity.`}function Y(e,t,n){return String(e?t?t.quantity:1:t?t.amount/100:n)}function X(e,t){return o(e)?`This item is sold out.`:t===`draft`?`This item is not open yet.`:t===`finished`?e.saleMode===`buy_now`?`Purchases are closed for this item.`:`Bidding is closed for this item.`:`This item is not available.`}function Z(e,t,n){return o(t)?`All available quantities have been purchased.`:n===`draft`?`This item opens ${a(e,`draft`,t)}.`:t.saleMode===`buy_now`?`This item is no longer available to purchase.`:`Bidding has closed for this item.`}function Q(e,t,n,r){return{amount:t?0:Number(r)*100,includeServiceFee:n?n.includeServiceFee:e.serviceFeeEnabled&&e.serviceFeeDefaultChecked,quantity:t?Number(r):1}}function $({auction:t,item:i,initialSelection:a,onContinue:c,onError:l,onBack:f,backHref:p,itemHeadingLevel:h=2}){let g=K[h],_=i.saleMode===`buy_now`,v=Math.ceil(P(i)/100),[y,b]=A(Y(_,a,v)),[x,S]=A(null),C=D();s(i.startAt??t.startAt,i.endAt??t.endAt);let w=e(t,i),T=w===`active`&&!o(i)&&i.saleMode!==`hybrid`;function E(e){if(e.preventDefault(),!q.test(y)){S(_?`Enter a whole-number quantity.`:`Enter a whole-dollar bid amount.`);return}let n=Q(t,_,a,y),r=d(t,i,n);if(r){S(r),l(r);return}try{u(t,i,n)}catch{S(`Enter a valid amount or quantity.`);return}c(n)}return T?N(`form`,{className:`lockerverse-auctions__selection`,onSubmit:E,children:[M(ee,{buyNow:_,headingTag:g,item:i,minimum:v}),N(`div`,{className:`lockerverse-auctions__selection-body`,children:[N(`label`,{className:`lockerverse-auctions__field`,htmlFor:C,children:[_?`Quantity`:`Your bid amount`,N(`span`,{className:`lockerverse-auctions__amount-control`,children:[_?null:M(`span`,{"aria-hidden":`true`,children:`$`}),M(`input`,{"aria-describedby":`${C}-help`,"aria-invalid":!!x,autoComplete:`off`,id:C,inputMode:`numeric`,onChange:e=>{b(e.target.value),S(null)},placeholder:_?`1`:String(v),required:!0,value:y})]})]}),x?M(`p`,{role:`alert`,children:x}):null,M(`p`,{id:`${C}-help`,children:_?J(y,i):`Enter a whole-dollar bid of at least ${n(v*100)}. Bid increment: ${n(i.bidIncrementAmount??100)}.`}),M(te,{item:i}),N(`div`,{className:`lockerverse-auctions__selection-footer`,children:[M(`p`,{children:_?`Continuing moves you into secure checkout where your payment is processed immediately.`:`Continuing moves you into the secure payment step where your card is stored for settlement only if your bid wins.`}),N(`button`,{className:`lockerverse-auctions__button`,disabled:!t.payment,type:`submit`,children:[_?`Continue to Checkout`:`Continue to Payment`,` `,M(m,{"aria-hidden":`true`,size:16})]})]}),t.payment?null:M(`p`,{role:`alert`,children:`Payments are not configured for this auction.`})]})]}):N(`div`,{className:`lockerverse-auctions__selection lockerverse-auctions__read-only`,children:[M(`p`,{className:`lockerverse-auctions__eyebrow`,children:`Item status`}),M(g,{children:X(i,w)}),M(`p`,{children:Z(t,i,w)}),N(r,{className:`lockerverse-auctions__button`,href:p,onBack:f,children:[`Browse auction items `,M(m,{"aria-hidden":`true`,size:16})]})]})}function ee({headingTag:e,item:t,buyNow:r,minimum:i}){return N(`div`,{className:`lockerverse-auctions__selection-header`,children:[M(`p`,{className:`lockerverse-auctions__eyebrow`,children:`Step 1 of 2`}),M(e,{children:r?`Buy this item now.`:`Place your bid.`}),M(`p`,{children:r?`Choose how many you want, then complete the secure checkout.`:`Enter the bid amount you want to place for this item. You are only charged if this bid wins after bidding closes.`}),N(`p`,{children:[r?`Price: `:`Minimum qualifying bid: `,M(`strong`,{children:n(r?t.buyNowPriceAmount??0:i*100)})]}),r&&t.availableQuantity!==null?N(`p`,{children:[t.availableQuantity,` available`]}):null,t.collectShippingAddress?M(`p`,{children:`The next step will also collect a delivery address for seller fulfillment.`}):null]})}function te({item:e}){return e.saleMode===`buy_now`||!e.additionalCharge?null:N(`p`,{children:[e.additionalCharge.name,`:`,` `,n(e.additionalCharge.firstUnitAmountCents),` will be added to your winning bid.`]})}function ne(e){let[t,n]=A(null),[r,i]=A(!1),a=!!(e.resumePurchase||e.interactionLocked);return E(()=>{let e=!0;return import(`./auction-payment-view.js`).then(({AuctionPayment:t})=>{e&&n(()=>t)},()=>{e&&i(!0)}),()=>{e=!1}},[]),t?M(t,{...e}):N(`div`,{children:[M(`p`,{role:r?`alert`:`status`,children:r?`Payment details could not load.`:`Loading secure payment details…`}),r&&a&&M(`p`,{children:`Your purchase status is not confirmed. Keep this page open and contact the auction organizer before you try another purchase.`}),a?null:M(`button`,{onClick:e.onBack,type:`button`,children:`Back to item`}),r&&!a&&M(`button`,{onClick:()=>window.location.reload(),type:`button`,children:`Reload page to try again`})]})}function re({buyNow:e}){return N(`div`,{className:`lockerverse-auctions__progress`,children:[N(`span`,{children:[M(e?S:y,{"aria-hidden":`true`,size:16}),e?`Choose quantity`:`Place bid`]}),N(`span`,{children:[M(S,{"aria-hidden":`true`,size:16}),e?`Pay securely`:`Secure card`]}),N(`span`,{children:[M(C,{"aria-hidden":`true`,size:16}),e?`Get confirmation`:`Wait for close`]})]})}function ie(e){let{auction:t,item:n,outcome:r}=e,i;return e.backHref?i={href:e.backHref,label:`View auction items`}:e.onBack&&(i={label:`View auction items`,onClick:e.onBack}),M(f,{auctionName:t.name,className:e.className,closesAtLabel:a(t,`active`,n),communityName:e.communityName??t.community?.name,focusHeading:!0,imageUrl:n.image??n.images[0]??t.configuration.image??void 0,itemName:n.name,outcome:r,primaryAction:e.returnToItemHref?{href:e.returnToItemHref,label:`Return to item`}:i,secondaryAction:e.returnToItemHref?i:void 0,style:{"--lockerverse-accent":t.community?.color??`#6f8f6d`,...e.style},theme:e.theme})}function ae(t){let{auction:n,itemId:i,resumePurchase:a,className:o,theme:c=`dark`,style:l}=t,u=k(null),[d,f]=A(n),h=k(n),_=d.items.find(e=>e.id===i)??a?.item;s(_?.startAt??d.startAt,_?.endAt??d.endAt);let[v,y]=A(()=>a?{amount:0,includeServiceFee:a.submission.includeServiceFee??!1,quantity:a.submission.quantity}:null),[b,x]=A(!!a),S=k(!0),C=k(t);C.current=t;let w=k(null),D=T(e=>{S.current&&x(e),w.current!==e&&(w.current=e,p(C.current.onInteractionLockChange,e))},[]),O=!!a;E(()=>(S.current=!0,D(O),()=>{S.current=!1}),[O,D]);let[j,P]=A({email:``,phone:``}),[F,I]=A(!!a),[L,R]=A(null),[z,B]=A(null);E(()=>{!(F||b||a)&&h.current!==n&&(h.current=n,f(n))},[n,F,b,a]);function V(e,t){D(!1),h.current=C.current.auction,f(e),y(null),I(!1),R(t)}function H(e){R(null),y(e),I(!0)}return _?z?M(ie,{...t,auction:d,item:_,outcome:z}):N(`section`,{className:[`lockerverse-auctions`,o].filter(Boolean).join(` `),"data-lockerverse-theme":c,ref:u,style:{"--lockerverse-accent":d.community?.color??`#6f8f6d`,...l},children:[b?null:N(r,{className:`lockerverse-auctions__back`,href:t.backHref,onBack:t.onBack,children:[M(g,{"aria-hidden":`true`,size:16}),` All items`]}),N(`div`,{className:`lockerverse-auctions__detail`,children:[M(G,{auction:d,galleryImageSizes:t.galleryImageSizes,item:_,itemHeadingLevel:t.itemHeadingLevel}),N(`div`,{className:`lockerverse-auctions__transaction`,children:[e(d,_)===`active`?M(re,{buyNow:_.saleMode===`buy_now`}):null,L?M(`p`,{className:`lockerverse-auctions__notice`,role:`alert`,children:L}):null,F&&v?M(ne,{...t,appearanceRoot:u,auction:d,communityName:t.communityName??d.community?.name,contact:j,interactionLocked:b,item:_,onBack:()=>I(!1),onContactChange:P,onIncludeServiceFeeChange:e=>y(t=>t&&{...t,includeServiceFee:d.serviceFeeEnabled&&e}),onInteractionLockChange:D,onResult:B,onReview:V,selection:v}):M($,{auction:d,backHref:t.backHref,initialSelection:v,item:_,itemHeadingLevel:t.itemHeadingLevel,onBack:t.onBack,onContinue:H,onError:R}),b?null:N(r,{className:`lockerverse-auctions__footer-back`,href:t.backHref,onBack:t.onBack,children:[`Back to auction items `,M(m,{"aria-hidden":`true`,size:16})]})]})]})]}):N(`div`,{children:[M(`p`,{role:`alert`,children:`This auction item is no longer available.`}),M(r,{href:t.backHref,onBack:t.onBack,children:`Back to auction items`})]})}function oe(e){let t=k({auctionId:e.auction.id,client:e.client,itemId:e.itemId});if(t.current.client!==e.client||t.current.auctionId!==e.auction.id||t.current.itemId!==e.itemId)throw TypeError(`Auction item identity cannot change. Remount with a new React key.`);if(e.resumePurchase&&(e.resumePurchase.auctionId!==e.auction.id||e.resumePurchase.itemId!==e.itemId||e.resumePurchase.item.id!==e.itemId||e.resumePurchase.item.auctionId!==e.auction.id))throw TypeError(`The purchase recovery record belongs to a different auction item.`);return M(c.Provider,{value:e.auction.mediaBaseUrl,children:M(ae,{...e})})}export{oe as LockerverseAuctionItem};
|
|
1
|
+
import{a as e,c as t,i as n,l as r,n as i,r as a,s as o,t as s}from"./use-auction-boundary.js";import{n as c,t as l}from"./auction-image.js";import{a as u,i as d}from"./auction-payment.js";import{t as f}from"./auction-result2.js";import{t as p}from"./host-callback.js";import{ArrowRight as m,ChevronDown as h,ChevronLeft as g,ChevronRight as _,Clock3 as v,Gavel as y,Pause as b,Play as x,ShieldCheck as S,TimerReset as C,X as w}from"lucide-react";import{useCallback as T,useEffect as E,useId as D,useMemo as O,useRef as k,useState as A}from"react";import{Fragment as j,jsx as M,jsxs as N}from"react/jsx-runtime";import{getLockerverseAuctionMinimumBid as P}from"@lockerverse/sdk/auctions";import{Dialog as F}from"@base-ui/react/dialog";import I from"embla-carousel-autoplay";import L from"embla-carousel-react";const R=6e3;function z(e,t){let n=k(R),r=k(null),[i,a]=A(R),o=O(()=>I({delay:i,playOnInit:!1,stopOnFocusIn:!1,stopOnInteraction:!0,stopOnMouseEnter:!1}),[i]),[s,c]=L({duration:t?0:25,loop:!0},[o]),l=T(()=>{r.current&&(r.current.style.transform=`scaleX(${1-n.current/R})`)},[]),u=T(()=>{let e=o.timeUntilNext();e!==null&&(n.current=Math.max(1,Math.min(R,e))),o.stop(),l()},[o,l]),d=T(()=>{n.current=R,a(R),o.reset(),l()},[o,l]);return E(()=>{c&&(e?i===n.current?o.play():a(n.current):u())},[c,e,o,i,a,n,u]),E(()=>{if(!c)return;let t=0,r=()=>{let i=o.timeUntilNext();!e||i===null||(n.current=Math.max(0,Math.min(R,i)),l(),t=requestAnimationFrame(r))},i=()=>{cancelAnimationFrame(t),e&&(t=requestAnimationFrame(r))},a=()=>cancelAnimationFrame(t),s=()=>{e&&o.play()};return c.on(`select`,d).on(`reInit`,s).on(`autoplay:timerset`,i).on(`autoplay:timerstopped`,a),l(),i(),()=>{a(),c.off(`select`,d).off(`reInit`,s).off(`autoplay:timerset`,i).off(`autoplay:timerstopped`,a)}},[c,o,e,n,d,l]),{embla:c,freeze:u,progressRef:r,reset:d,viewportRef:s}}function B({photos:e,name:t,imageSizes:n=`(max-width: 1279px) 100vw, 45vw`,selected:r,paused:a=!1,photoButtonRef:o,onSelect:s,onExpand:c}){let u=k(null),d=k(null),f=k([]),[p,m]=A(!0),[h,v]=A(!1),[y,S]=A(!1),[C,w]=A(!1),[T,D]=A(!1),{ref:O,visible:P}=i(),[F,I]=A(!1),[L,R]=A(!0),B=k(null),V=`lockerverse-auction-gallery__control ${L||F||y?`is-visible`:``}`,H=()=>{B.current&&clearTimeout(B.current),B.current=setTimeout(()=>I(!1),2e3)},U=e=>{if(e.pointerType!==`mouse`){R(!0);return}I(!0),B.current&&clearTimeout(B.current),e.target instanceof Element&&e.target.closest(`[data-gallery-control]`)||H()};E(()=>{let e=window.matchMedia(`(hover: none), (pointer: coarse)`),t=()=>R(e.matches);return t(),e.addEventListener(`change`,t),()=>{e.removeEventListener(`change`,t),clearTimeout(B.current??void 0)}},[]);let W=!(a||p||h||y||C||T)&&P,G=e.length,K=G?(r%G+G)%G:0,{viewportRef:q,embla:J,progressRef:Y,freeze:X,reset:Z}=z(W&&G>1,p);E(()=>{let e=window.matchMedia(`(prefers-reduced-motion: reduce)`),t=()=>m(e.matches);return t(),e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]),E(()=>{if(!J)return;let e=()=>s(J.selectedScrollSnap());return J.on(`select`,e).on(`reInit`,e),()=>{J.off(`select`,e).off(`reInit`,e)}},[J,s]),E(()=>{J&&J.selectedScrollSnap()!==K&&J.scrollTo(K,!0)},[J,K]),E(()=>{let e=()=>{document.hidden&&X()},t=()=>D(!1);return e(),document.addEventListener(`visibilitychange`,e,!0),window.addEventListener(`pointerup`,t),window.addEventListener(`pointercancel`,t),()=>{document.removeEventListener(`visibilitychange`,e,!0),window.removeEventListener(`pointerup`,t),window.removeEventListener(`pointercancel`,t)}},[X]);let Q=e=>{J?.scrollTo((e+G)%G,p),Z()};return E(()=>{let e=d.current;d.current=null,e&&document.activeElement===e&&O.current?.querySelector(`.lockerverse-auction-gallery__photo[tabindex="0"]`)?.focus({preventScroll:!0})},[K,O]),E(()=>{let e=u.current,t=f.current[K];if(!(e&&t))return;let n=e.getBoundingClientRect(),r=t.getBoundingClientRect();r.left<n.left?e.scrollLeft-=n.left-r.left:r.right>n.right&&(e.scrollLeft+=r.right-n.right)},[K,G]),N(`section`,{"aria-label":`${t} photos`,className:`lockerverse-auction-gallery`,onBlurCapture:e=>{e.currentTarget.contains(e.relatedTarget)||S(!1)},onFocusCapture:e=>S(e.target.matches(`:focus-visible`)),onKeyDown:e=>{G<2||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||(e.key===`ArrowLeft`||e.key===`ArrowRight`)&&(e.preventDefault(),e.target instanceof HTMLButtonElement&&e.target.classList.contains(`lockerverse-auction-gallery__photo`)&&(d.current=e.target),Q(K+(e.key===`ArrowRight`?1:-1)))},onPointerEnter:e=>{e.pointerType===`mouse`&&v(!0)},onPointerLeave:e=>{e.pointerType===`mouse`&&v(!1)},ref:O,children:[G?N(`div`,{className:`lockerverse-auction-gallery__stage`,onPointerEnter:U,onPointerLeave:H,onPointerMove:U,children:[M(`div`,{className:`lockerverse-auction-gallery__viewport`,onPointerDownCapture:()=>{X(),D(!0)},ref:q,children:M(`div`,{className:`lockerverse-auction-gallery__track`,children:e.map((e,r)=>M(`div`,{"aria-hidden":r!==K,className:`lockerverse-auction-gallery__slide`,children:M(`button`,{"aria-label":`View photo ${r+1} of ${t} at full size`,className:`lockerverse-auction-gallery__photo`,onClick:()=>{c(r)},ref:r===K?o:void 0,tabIndex:r===K?0:-1,type:`button`,children:M(l,{alt:`${t}, ${r+1} of ${G}`,className:`lockerverse-auction-gallery__image`,draggable:!1,fetchPriority:r===0?`high`:`auto`,height:900,loading:r===K?`eager`:`lazy`,maxWidth:1920,sizes:r===K?n:`auto, ${n}`,src:e,width:1200})})},`${e}-${r}`))})}),G>1&&!p&&N(`div`,{className:`lockerverse-auction-gallery__rotation`,children:[M(`div`,{"aria-hidden":`true`,className:`lockerverse-auction-gallery__progress-track`,children:M(`div`,{className:`lockerverse-auction-gallery__progress`,ref:Y,style:{transform:`scaleX(0)`}})}),M(`button`,{"aria-label":C?`Play photo rotation`:`Pause photo rotation`,className:`lockerverse-auction-gallery__play ${V}`,"data-gallery-control":!0,onClick:()=>w(e=>!e),title:C?`Play photo rotation`:`Pause photo rotation`,type:`button`,children:M(C?x:b,{"aria-hidden":`true`,size:13})})]}),G>1&&N(j,{children:[M(`button`,{"aria-label":`Previous photo`,className:`lockerverse-auction-gallery__previous ${V}`,"data-gallery-control":!0,onClick:()=>Q(K-1),type:`button`,children:M(g,{"aria-hidden":`true`,className:`lockerverse-auction-gallery__chevron`})}),M(`button`,{"aria-label":`Next photo`,className:`lockerverse-auction-gallery__next ${V}`,"data-gallery-control":!0,onClick:()=>Q(K+1),type:`button`,children:M(_,{"aria-hidden":`true`,className:`lockerverse-auction-gallery__chevron`})})]})]}):M(`div`,{className:`lockerverse-auction-gallery__empty`,children:`No photo available`}),G>1&&M(`section`,{"aria-label":`Choose a photo`,className:`lockerverse-auction-gallery__strip`,ref:u,children:M(`div`,{className:`lockerverse-auction-gallery__thumbnails`,children:e.map((e,t)=>M(`button`,{"aria-label":`Show photo ${t+1} of ${G}`,"aria-pressed":K===t,className:`lockerverse-auction-gallery__thumbnail ${K===t?`is-selected`:``}`,onClick:()=>Q(t),ref:e=>{f.current[t]=e},type:`button`,children:M(l,{alt:``,className:`lockerverse-auction-gallery__thumbnail-image`,height:66,loading:`lazy`,maxWidth:192,sizes:`88px`,src:e,width:88})},`${e}-${t}`))})})]})}function V({images:e,fallbackImage:t,name:n,imageSizes:r}){let i=[...new Set(e.filter(Boolean))];!i.length&&t&&i.push(t);let[a,o]=A(0),[s,c]=A(!1),u=k(null),d=k(null),f=i.length,p=f?(a%f+f)%f:0;return N(j,{children:[M(B,{imageSizes:r,name:n,onExpand:e=>{o(e),c(!0)},onSelect:o,paused:s,photoButtonRef:u,photos:i,selected:p}),f>0&&M(F.Root,{onOpenChange:c,open:s,children:N(F.Portal,{children:[M(F.Backdrop,{className:`lockerverse-auction-gallery__backdrop`}),N(F.Popup,{"aria-describedby":void 0,className:`lockerverse-auction-gallery__viewer`,finalFocus:u,onKeyDown:e=>{f<2||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||(e.key===`ArrowLeft`||e.key===`ArrowRight`)&&(e.preventDefault(),o((p+(e.key===`ArrowRight`?1:-1)+f)%f))},children:[N(F.Title,{className:`lockerverse-auction-gallery__sr-only`,children:[n,` · Photo `,p+1,` of `,f]}),N(`div`,{className:`lockerverse-auction-gallery__full-image`,onTouchCancel:()=>{d.current=null},onTouchEnd:e=>{let t=d.current;d.current=null;let n=e.changedTouches.item(0);if(!(t&&n)||f<2)return;let r=n.clientX-t.x,i=n.clientY-t.y;Math.abs(r)>=45&&Math.abs(r)>Math.abs(i)*1.3&&o((p+(r<0?1:-1)+f)%f)},onTouchMove:e=>{e.touches.length!==1&&(d.current=null)},onTouchStart:e=>{let t=e.touches.item(0);d.current=e.touches.length===1&&t?{x:t.clientX,y:t.clientY}:null},children:[M(l,{alt:`${n}, ${p+1} of ${f}`,height:900,maxWidth:1920,sizes:`100vw`,src:i[p],width:1200}),s&&f>1&&M(l,{alt:``,"aria-hidden":`true`,className:`lockerverse-auction-gallery__preload`,height:900,loading:`eager`,maxWidth:1920,sizes:`100vw`,src:i[(p+1)%f],width:1200})]}),M(F.Close,{"aria-label":`Close photo viewer`,className:`lockerverse-auction-gallery__viewer-close`,children:M(w,{"aria-hidden":`true`,size:22})}),f>1&&N(j,{children:[M(`button`,{"aria-label":`Previous photo`,className:`lockerverse-auction-gallery__viewer-previous`,onClick:()=>o((p-1+f)%f),type:`button`,children:M(g,{"aria-hidden":`true`,size:28})}),M(`button`,{"aria-label":`Next photo`,className:`lockerverse-auction-gallery__viewer-next`,onClick:()=>o((p+1)%f),type:`button`,children:M(_,{"aria-hidden":`true`,size:28})})]})]})]})})]})}const H={1:`h1`,2:`h2`};function U(e){return M(e===`Buy Now`?S:e===`Available`||e===`Increment`?C:y,{"aria-hidden":`true`,size:16})}function W(e,t){return e.saleMode===`buy_now`?[[`Buy Now`,n(e.buyNowPriceAmount??0)],[`Available`,e.availableQuantity===null?`Available`:String(e.availableQuantity)]]:t===`finished`?[[`Final bid`,e.maxBidAmount?n(e.maxBidAmount):`No bids`]]:[[`Current bid`,n(e.maxBidAmount??0)],[`Floor`,n(e.minBidAmount??0)],[`Increment`,n(e.bidIncrementAmount??100)]]}function G({auction:r,item:i,itemHeadingLevel:o=2,galleryImageSizes:c}){s(i.startAt??r.startAt,i.endAt??r.endAt);let[l,u]=A(!1),d=D(),f=e(r,i),p={active:`Closes`,draft:`Opens`,finished:`Closed`}[f],m=a(r,f,i),g=i.saleMode===`buy_now`,_=(i.description??``).trim().length>240,y=W(i,f),b=H[o];return N(`section`,{className:`lockerverse-auctions__item-summary`,children:[M(V,{fallbackImage:i.image??r.configuration.image??r.community?.banner??r.community?.thumbnail??null,imageSizes:c,images:i.images,name:i.name}),N(`div`,{className:`lockerverse-auctions__item-copy`,children:[M(b,{children:i.name}),i.description?N(`div`,{className:`lockerverse-auctions__item-description`,children:[M(t,{className:!l&&_?`lockerverse-auctions__description-clamped`:void 0,description:i.description,id:d}),_?N(`button`,{"aria-controls":d,"aria-expanded":l,className:`lockerverse-auctions__description-toggle`,onClick:()=>u(!l),type:`button`,children:[l?`Hide description`:`Read full description`,` `,M(h,{"aria-hidden":`true`,size:16,style:{transform:l?`rotate(180deg)`:void 0}})]}):null]}):null,N(`dl`,{className:`lockerverse-auctions__stat-panel`,children:[y.map(([e,t])=>N(`div`,{className:`lockerverse-auctions__stat-row`,children:[N(`dt`,{children:[U(e),e]}),M(`dd`,{children:t})]},e)),N(`div`,{className:`lockerverse-auctions__stat-row`,children:[N(`dt`,{children:[M(v,{"aria-hidden":`true`,size:16}),p]}),M(`dd`,{className:`lockerverse-auctions__stat-date`,children:m})]}),!g&&f===`finished`?N(`div`,{className:`lockerverse-auctions__stat-footer`,children:[N(`div`,{children:[M(`dt`,{children:`Floor`}),M(`dd`,{children:n(i.minBidAmount??0)})]}),N(`div`,{children:[M(`dt`,{children:`Bid increment`}),M(`dd`,{children:n(i.bidIncrementAmount??100)})]})]}):null]})]})]})}const K={1:`h2`,2:`h3`},q=/^\d+$/;function J(e,t){let r=Number(e),i=r*(t.buyNowPriceAmount??0);if(!(q.test(e)&&Number.isSafeInteger(i))||r<1)return`Enter a whole-number quantity.`;if(!t.additionalCharge)return`Total: ${n(i)}`;let a=t.additionalCharge.firstUnitAmountCents+t.additionalCharge.additionalUnitAmountCents*(r-1),o=i+a;return Number.isSafeInteger(o)?`Subtotal: ${n(i)} · ${t.additionalCharge.name}: ${n(a)} · Total: ${n(o)}`:`Enter a valid quantity.`}function Y(e,t,n){return String(e?t?t.quantity:1:t?t.amount/100:n)}function X(e,t){return o(e)?`This item is sold out.`:t===`draft`?`This item is not open yet.`:t===`finished`?e.saleMode===`buy_now`?`Purchases are closed for this item.`:`Bidding is closed for this item.`:`This item is not available.`}function Z(e,t,n){return o(t)?`All available quantities have been purchased.`:n===`draft`?`This item opens ${a(e,`draft`,t)}.`:t.saleMode===`buy_now`?`This item is no longer available to purchase.`:`Bidding has closed for this item.`}function Q(e,t,n,r){return{amount:t?0:Number(r)*100,includeServiceFee:n?n.includeServiceFee:e.serviceFeeEnabled&&e.serviceFeeDefaultChecked,quantity:t?Number(r):1}}function $({auction:t,item:i,initialSelection:a,onContinue:c,onError:l,onBack:f,backHref:p,itemHeadingLevel:h=2}){let g=K[h],_=i.saleMode===`buy_now`,v=Math.ceil(P(i)/100),[y,b]=A(Y(_,a,v)),[x,S]=A(null),C=D();s(i.startAt??t.startAt,i.endAt??t.endAt);let w=e(t,i),T=w===`active`&&!o(i)&&i.saleMode!==`hybrid`;function E(e){if(e.preventDefault(),!q.test(y)){S(_?`Enter a whole-number quantity.`:`Enter a whole-dollar bid amount.`);return}let n=Q(t,_,a,y),r=d(t,i,n);if(r){S(r),l(r);return}try{u(t,i,n)}catch{S(`Enter a valid amount or quantity.`);return}c(n)}return T?N(`form`,{className:`lockerverse-auctions__selection`,onSubmit:E,children:[M(ee,{buyNow:_,headingTag:g,item:i,minimum:v}),N(`div`,{className:`lockerverse-auctions__selection-body`,children:[N(`label`,{className:`lockerverse-auctions__field`,htmlFor:C,children:[_?`Quantity`:`Your bid amount`,N(`span`,{className:`lockerverse-auctions__amount-control`,children:[_?null:M(`span`,{"aria-hidden":`true`,children:`$`}),M(`input`,{"aria-describedby":`${C}-help`,"aria-invalid":!!x,autoComplete:`off`,id:C,inputMode:`numeric`,onChange:e=>{b(e.target.value),S(null)},placeholder:_?`1`:String(v),required:!0,value:y})]})]}),x?M(`p`,{role:`alert`,children:x}):null,M(`p`,{id:`${C}-help`,children:_?J(y,i):`Enter a whole-dollar bid of at least ${n(v*100)}. Bid increment: ${n(i.bidIncrementAmount??100)}.`}),M(te,{item:i}),N(`div`,{className:`lockerverse-auctions__selection-footer`,children:[M(`p`,{children:_?`Continuing moves you into secure checkout where your payment is processed immediately.`:`Continuing moves you into the secure payment step where your card is stored for settlement only if your bid wins.`}),N(`button`,{className:`lockerverse-auctions__button`,disabled:!t.payment,type:`submit`,children:[_?`Continue to Checkout`:`Continue to Payment`,` `,M(m,{"aria-hidden":`true`,size:16})]})]}),t.payment?null:M(`p`,{role:`alert`,children:`Payments are not configured for this auction.`})]})]}):N(`div`,{className:`lockerverse-auctions__selection lockerverse-auctions__read-only`,children:[M(`p`,{className:`lockerverse-auctions__eyebrow`,children:`Item status`}),M(g,{children:X(i,w)}),M(`p`,{children:Z(t,i,w)}),N(r,{className:`lockerverse-auctions__button`,href:p,onBack:f,children:[`Browse auction items `,M(m,{"aria-hidden":`true`,size:16})]})]})}function ee({headingTag:e,item:t,buyNow:r,minimum:i}){return N(`div`,{className:`lockerverse-auctions__selection-header`,children:[M(`p`,{className:`lockerverse-auctions__eyebrow`,children:`Step 1 of 2`}),M(e,{children:r?`Buy this item now.`:`Place your bid.`}),M(`p`,{children:r?`Choose how many you want, then complete the secure checkout.`:`Enter the bid amount you want to place for this item. You are only charged if this bid wins after bidding closes.`}),N(`p`,{children:[r?`Price: `:`Minimum qualifying bid: `,M(`strong`,{children:n(r?t.buyNowPriceAmount??0:i*100)})]}),r&&t.availableQuantity!==null?N(`p`,{children:[t.availableQuantity,` available`]}):null,t.collectShippingAddress?M(`p`,{children:`The next step will also collect a delivery address for seller fulfillment.`}):null]})}function te({item:e}){return e.saleMode===`buy_now`||!e.additionalCharge?null:N(`p`,{children:[e.additionalCharge.name,`:`,` `,n(e.additionalCharge.firstUnitAmountCents),` will be added to your winning bid.`]})}function ne(e){let[t,n]=A(null),[r,i]=A(!1),a=!!(e.resumePurchase||e.interactionLocked);return E(()=>{let e=!0;return import(`./auction-payment-view.js`).then(({AuctionPayment:t})=>{e&&n(()=>t)},()=>{e&&i(!0)}),()=>{e=!1}},[]),t?M(t,{...e}):N(`div`,{children:[M(`p`,{role:r?`alert`:`status`,children:r?`Payment details could not load.`:`Loading secure payment details…`}),r&&a&&M(`p`,{children:`Your purchase status is not confirmed. Keep this page open and contact the auction organizer before you try another purchase.`}),a?null:M(`button`,{onClick:e.onBack,type:`button`,children:`Back to item`}),r&&!a&&M(`button`,{onClick:()=>window.location.reload(),type:`button`,children:`Reload page to try again`})]})}function re({buyNow:e}){return N(`div`,{className:`lockerverse-auctions__progress`,children:[N(`span`,{children:[M(e?S:y,{"aria-hidden":`true`,size:16}),e?`Choose quantity`:`Place bid`]}),N(`span`,{children:[M(S,{"aria-hidden":`true`,size:16}),e?`Pay securely`:`Secure card`]}),N(`span`,{children:[M(C,{"aria-hidden":`true`,size:16}),e?`Get confirmation`:`Wait for close`]})]})}function ie(e){let{auction:t,item:n,outcome:r}=e,i;return e.backHref?i={href:e.backHref,label:`View auction items`}:e.onBack&&(i={label:`View auction items`,onClick:e.onBack}),M(f,{auctionName:t.name,className:e.className,closesAtLabel:a(t,`active`,n),communityName:e.communityName??t.community?.name,focusHeading:!0,imageUrl:n.image??n.images[0]??t.configuration.image??void 0,itemName:n.name,outcome:r,primaryAction:e.returnToItemHref?{href:e.returnToItemHref,label:`Return to item`}:i,secondaryAction:e.returnToItemHref?i:void 0,style:{"--lockerverse-accent":t.community?.color??`#6f8f6d`,...e.style},theme:e.theme})}function ae(t){let{auction:n,itemId:i,resumePurchase:a,className:o,theme:c=`dark`,style:l}=t,u=k(null),[d,f]=A(n),h=k(n),_=d.items.find(e=>e.id===i)??a?.item;s(_?.startAt??d.startAt,_?.endAt??d.endAt);let[v,y]=A(()=>a?{amount:0,includeServiceFee:a.submission.includeServiceFee??!1,quantity:a.submission.quantity}:null),[b,x]=A(!!a),S=k(!0),C=k(t);C.current=t;let w=k(null),D=T(e=>{S.current&&x(e),w.current!==e&&(w.current=e,p(C.current.onInteractionLockChange,e))},[]),O=!!a;E(()=>(S.current=!0,D(O),()=>{S.current=!1}),[O,D]);let[j,P]=A({email:``,phone:``}),[F,I]=A(!!a),[L,R]=A(null),[z,B]=A(null);E(()=>{!(F||b||a)&&h.current!==n&&(h.current=n,f(n))},[n,F,b,a]);function V(e,t){D(!1),h.current=C.current.auction,f(e),y(null),I(!1),R(t)}function H(e){R(null),y(e),I(!0)}return _?z?M(ie,{...t,auction:d,item:_,outcome:z}):N(`section`,{className:[`lockerverse-auctions`,o].filter(Boolean).join(` `),"data-lockerverse-theme":c,ref:u,style:{"--lockerverse-accent":d.community?.color??`#6f8f6d`,...l},children:[b?null:N(r,{className:`lockerverse-auctions__back`,href:t.backHref,onBack:t.onBack,children:[M(g,{"aria-hidden":`true`,size:16}),` All items`]}),N(`div`,{className:`lockerverse-auctions__detail`,children:[M(G,{auction:d,galleryImageSizes:t.galleryImageSizes,item:_,itemHeadingLevel:t.itemHeadingLevel}),N(`div`,{className:`lockerverse-auctions__transaction`,children:[e(d,_)===`active`?M(re,{buyNow:_.saleMode===`buy_now`}):null,L?M(`p`,{className:`lockerverse-auctions__notice`,role:`alert`,children:L}):null,F&&v?M(ne,{...t,appearanceRoot:u,auction:d,communityName:t.communityName??d.community?.name,contact:j,interactionLocked:b,item:_,onBack:()=>I(!1),onContactChange:P,onIncludeServiceFeeChange:e=>y(t=>t&&{...t,includeServiceFee:d.serviceFeeEnabled&&e}),onInteractionLockChange:D,onResult:B,onReview:V,selection:v}):M($,{auction:d,backHref:t.backHref,initialSelection:v,item:_,itemHeadingLevel:t.itemHeadingLevel,onBack:t.onBack,onContinue:H,onError:R}),b?null:N(r,{className:`lockerverse-auctions__footer-back`,href:t.backHref,onBack:t.onBack,children:[`Back to auction items `,M(m,{"aria-hidden":`true`,size:16})]})]})]})]}):N(`div`,{children:[M(`p`,{role:`alert`,children:`This auction item is no longer available.`}),M(r,{href:t.backHref,onBack:t.onBack,children:`Back to auction items`})]})}function oe(e){let t=k({auctionId:e.auction.id,client:e.client,itemId:e.itemId});if(t.current.client!==e.client||t.current.auctionId!==e.auction.id||t.current.itemId!==e.itemId)throw TypeError(`Auction item identity cannot change. Remount with a new React key.`);if(e.resumePurchase&&(e.resumePurchase.auctionId!==e.auction.id||e.resumePurchase.itemId!==e.itemId||e.resumePurchase.item.id!==e.itemId||e.resumePurchase.item.auctionId!==e.auction.id))throw TypeError(`The purchase recovery record belongs to a different auction item.`);return M(c.Provider,{value:e.auction.mediaBaseUrl,children:M(ae,{...e})})}export{oe as LockerverseAuctionItem};
|
|
2
2
|
//# sourceMappingURL=auction-item.js.map
|
package/dist/auction-item.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auction-item.js","names":["Close","formatMoney","formatMoney"],"sources":["../src/use-auction-autoplay.ts","../src/auction-photo-filmstrip.tsx","../src/auction-gallery.tsx","../src/auction-item-details.tsx","../src/auction-item-selection.tsx","../src/auction-payment-loader.tsx","../src/lockerverse-auction-item.tsx"],"sourcesContent":["import Autoplay from \"embla-carousel-autoplay\";\nimport useEmblaCarousel from \"embla-carousel-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst PHOTO_DELAY = 6000;\n\n// Embla 8 has stop(), but no pause(). Resume with the saved delay, then restore\n// the full delay on selection. Embla remains the only owner of the slide timer.\nexport function useAuctionAutoplay(enabled: boolean, reducedMotion: boolean) {\n const remaining = useRef(PHOTO_DELAY);\n const progressRef = useRef<HTMLDivElement>(null);\n const [cycleDelay, setCycleDelay] = useState(PHOTO_DELAY);\n const autoplay = useMemo(\n () =>\n Autoplay({\n delay: cycleDelay,\n playOnInit: false,\n stopOnFocusIn: false,\n stopOnInteraction: true,\n stopOnMouseEnter: false,\n }),\n [cycleDelay]\n );\n\n const [viewportRef, embla] = useEmblaCarousel(\n { duration: reducedMotion ? 0 : 25, loop: true },\n [autoplay]\n );\n\n const draw = useCallback(() => {\n // biome-ignore lint/suspicious/noUnnecessaryConditions: React assigns this ref in the filmstrip component.\n if (progressRef.current) {\n progressRef.current.style.transform = `scaleX(${1 - remaining.current / PHOTO_DELAY})`;\n }\n }, []);\n\n const freeze = useCallback(() => {\n const left = autoplay.timeUntilNext();\n if (left !== null) {\n remaining.current = Math.max(1, Math.min(PHOTO_DELAY, left));\n }\n autoplay.stop();\n draw();\n }, [autoplay, draw]);\n\n const reset = useCallback(() => {\n remaining.current = PHOTO_DELAY;\n setCycleDelay(PHOTO_DELAY);\n autoplay.reset();\n draw();\n }, [autoplay, draw]);\n\n useEffect(() => {\n if (!embla) {\n return;\n }\n if (!enabled) {\n freeze();\n } else if (cycleDelay === remaining.current) {\n autoplay.play();\n } else {\n setCycleDelay(remaining.current);\n }\n }, [embla, enabled, autoplay, cycleDelay, setCycleDelay, remaining, freeze]);\n\n useEffect(() => {\n if (!embla) {\n return;\n }\n let frame = 0;\n const update = () => {\n const left = autoplay.timeUntilNext();\n if (!enabled || left === null) {\n return;\n }\n remaining.current = Math.max(0, Math.min(PHOTO_DELAY, left));\n draw();\n frame = requestAnimationFrame(update);\n };\n const start = () => {\n cancelAnimationFrame(frame);\n if (enabled) {\n frame = requestAnimationFrame(update);\n }\n };\n const stop = () => cancelAnimationFrame(frame);\n const reinitialize = () => {\n if (enabled) {\n autoplay.play();\n }\n };\n embla\n .on(\"select\", reset)\n .on(\"reInit\", reinitialize)\n .on(\"autoplay:timerset\", start)\n .on(\"autoplay:timerstopped\", stop);\n draw();\n start();\n return () => {\n stop();\n embla\n .off(\"select\", reset)\n .off(\"reInit\", reinitialize)\n .off(\"autoplay:timerset\", start)\n .off(\"autoplay:timerstopped\", stop);\n };\n }, [embla, autoplay, enabled, remaining, reset, draw]);\n return { embla, freeze, progressRef, reset, viewportRef };\n}\n","import { ChevronLeft, ChevronRight, Pause, Play } from \"lucide-react\";\nimport {\n type PointerEvent,\n type Ref,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { AuctionImage } from \"./auction-image.tsx\";\nimport { useAuctionAutoplay } from \"./use-auction-autoplay\";\nimport { useAuctionVisibility } from \"./use-auction-visibility\";\n\ntype FilmstripProps = {\n photos: string[];\n name: string;\n imageSizes?: string | undefined;\n selected: number;\n paused?: boolean;\n photoButtonRef: Ref<HTMLButtonElement>;\n onSelect: (index: number) => void;\n onExpand: (index: number) => void;\n};\n\nexport function AuctionPhotoFilmstrip({\n photos,\n name,\n imageSizes = \"(max-width: 1279px) 100vw, 45vw\",\n selected,\n paused = false,\n photoButtonRef,\n onSelect,\n onExpand,\n}: FilmstripProps) {\n const stripRef = useRef<HTMLDivElement>(null);\n const keyboardPhoto = useRef<HTMLButtonElement | null>(null);\n const thumbnailRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const [reducedMotion, setReducedMotion] = useState(true);\n const [hovered, setHovered] = useState(false);\n const [keyboardFocused, setKeyboardFocused] = useState(false);\n const [userPaused, setUserPaused] = useState(false);\n const [dragging, setDragging] = useState(false);\n const { ref: galleryRef, visible } = useAuctionVisibility<HTMLElement>();\n const [controlsActive, setControlsActive] = useState(false);\n const [touchControls, setTouchControls] = useState(true);\n const hideControlsTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const controlsVisible = touchControls || controlsActive || keyboardFocused;\n const controlsFade = `lockerverse-auction-gallery__control ${controlsVisible ? \"is-visible\" : \"\"}`;\n\n const scheduleControlsHide = () => {\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The timer ref is assigned after pointer activity.\n if (hideControlsTimer.current) {\n clearTimeout(hideControlsTimer.current);\n }\n hideControlsTimer.current = setTimeout(\n () => setControlsActive(false),\n 2000\n );\n };\n const showControls = (event: PointerEvent<HTMLDivElement>) => {\n if (event.pointerType !== \"mouse\") {\n setTouchControls(true);\n return;\n }\n setControlsActive(true);\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The timer ref is assigned after pointer activity.\n if (hideControlsTimer.current) {\n clearTimeout(hideControlsTimer.current);\n }\n if (\n !(\n event.target instanceof Element &&\n event.target.closest(\"[data-gallery-control]\")\n )\n ) {\n scheduleControlsHide();\n }\n };\n\n useEffect(() => {\n const preference = window.matchMedia(\"(hover: none), (pointer: coarse)\");\n const update = () => setTouchControls(preference.matches);\n update();\n preference.addEventListener(\"change\", update);\n return () => {\n preference.removeEventListener(\"change\", update);\n clearTimeout(hideControlsTimer.current ?? undefined);\n };\n }, []);\n\n const autoplayEnabled =\n !(\n paused ||\n reducedMotion ||\n hovered ||\n keyboardFocused ||\n userPaused ||\n dragging\n ) && visible;\n const count = photos.length;\n const current = count ? ((selected % count) + count) % count : 0;\n const { viewportRef, embla, progressRef, freeze, reset } = useAuctionAutoplay(\n autoplayEnabled && count > 1,\n reducedMotion\n );\n\n useEffect(() => {\n const preference = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const update = () => setReducedMotion(preference.matches);\n update();\n preference.addEventListener(\"change\", update);\n return () => preference.removeEventListener(\"change\", update);\n }, []);\n\n useEffect(() => {\n if (!embla) {\n return;\n }\n const select = () => onSelect(embla.selectedScrollSnap());\n embla.on(\"select\", select).on(\"reInit\", select);\n return () => {\n embla.off(\"select\", select).off(\"reInit\", select);\n };\n }, [embla, onSelect]);\n\n useEffect(() => {\n if (embla && embla.selectedScrollSnap() !== current) {\n embla.scrollTo(current, true);\n }\n }, [embla, current]);\n\n useEffect(() => {\n const updateVisibility = () => {\n if (document.hidden) {\n freeze();\n }\n };\n const release = () => setDragging(false);\n updateVisibility();\n document.addEventListener(\"visibilitychange\", updateVisibility, true);\n window.addEventListener(\"pointerup\", release);\n window.addEventListener(\"pointercancel\", release);\n return () => {\n document.removeEventListener(\"visibilitychange\", updateVisibility, true);\n window.removeEventListener(\"pointerup\", release);\n window.removeEventListener(\"pointercancel\", release);\n };\n }, [freeze]);\n\n const selectPhoto = (next: number) => {\n embla?.scrollTo((next + count) % count, reducedMotion);\n reset();\n };\n\n useEffect(() => {\n const previousPhoto = keyboardPhoto.current;\n keyboardPhoto.current = null;\n // biome-ignore lint/suspicious/noUnnecessaryConditions: Keyboard events assign this ref before the selected photo changes.\n if (previousPhoto && document.activeElement === previousPhoto) {\n galleryRef.current\n ?.querySelector<HTMLButtonElement>(\n '.lockerverse-auction-gallery__photo[tabindex=\"0\"]'\n )\n ?.focus({ preventScroll: true });\n }\n }, [current, galleryRef]);\n\n useEffect(() => {\n const strip = stripRef.current;\n const thumbnail = thumbnailRefs.current[current];\n // biome-ignore lint/suspicious/noUnnecessaryConditions: React assigns the element ref after mounting.\n if (!(strip && thumbnail)) {\n return;\n }\n const stripBounds = strip.getBoundingClientRect();\n const photoBounds = thumbnail.getBoundingClientRect();\n if (photoBounds.left < stripBounds.left) {\n strip.scrollLeft -= stripBounds.left - photoBounds.left;\n } else if (photoBounds.right > stripBounds.right) {\n strip.scrollLeft += photoBounds.right - stripBounds.right;\n }\n }, [current, count]);\n\n return (\n // biome-ignore lint/a11y/noNoninteractiveElementInteractions: The gallery handles keys from its focusable photo and navigation buttons.\n <section\n aria-label={`${name} photos`}\n className=\"lockerverse-auction-gallery\"\n onBlurCapture={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n setKeyboardFocused(false);\n }\n }}\n onFocusCapture={(event) =>\n setKeyboardFocused(event.target.matches(\":focus-visible\"))\n }\n onKeyDown={(event) => {\n if (\n count < 2 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n ) {\n return;\n }\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n if (\n event.target instanceof HTMLButtonElement &&\n event.target.classList.contains(\n \"lockerverse-auction-gallery__photo\"\n )\n ) {\n keyboardPhoto.current = event.target;\n }\n selectPhoto(current + (event.key === \"ArrowRight\" ? 1 : -1));\n }\n }}\n onPointerEnter={(event) => {\n if (event.pointerType === \"mouse\") {\n setHovered(true);\n }\n }}\n onPointerLeave={(event) => {\n if (event.pointerType === \"mouse\") {\n setHovered(false);\n }\n }}\n ref={galleryRef}\n >\n {count ? (\n <div\n className=\"lockerverse-auction-gallery__stage\"\n onPointerEnter={showControls}\n onPointerLeave={scheduleControlsHide}\n onPointerMove={showControls}\n >\n <div\n className=\"lockerverse-auction-gallery__viewport\"\n onPointerDownCapture={() => {\n freeze();\n setDragging(true);\n }}\n ref={viewportRef}\n >\n <div className=\"lockerverse-auction-gallery__track\">\n {photos.map((photo, photoIndex) => (\n <div\n aria-hidden={photoIndex !== current}\n className=\"lockerverse-auction-gallery__slide\"\n key={`${photo}-${photoIndex}`}\n >\n <button\n aria-label={`View photo ${photoIndex + 1} of ${name} at full size`}\n className=\"lockerverse-auction-gallery__photo\"\n onClick={() => {\n onExpand(photoIndex);\n }}\n ref={photoIndex === current ? photoButtonRef : undefined}\n tabIndex={photoIndex === current ? 0 : -1}\n type=\"button\"\n >\n <AuctionImage\n alt={`${name}, ${photoIndex + 1} of ${count}`}\n className=\"lockerverse-auction-gallery__image\"\n draggable={false}\n fetchPriority={photoIndex === 0 ? \"high\" : \"auto\"}\n height={900}\n loading={photoIndex === current ? \"eager\" : \"lazy\"}\n maxWidth={1280}\n sizes={\n photoIndex === current\n ? imageSizes\n : `auto, ${imageSizes}`\n }\n src={photo}\n width={1200}\n />\n </button>\n </div>\n ))}\n </div>\n </div>\n {count > 1 && !reducedMotion && (\n <div className=\"lockerverse-auction-gallery__rotation\">\n <div\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__progress-track\"\n >\n <div\n className=\"lockerverse-auction-gallery__progress\"\n ref={progressRef}\n style={{ transform: \"scaleX(0)\" }}\n />\n </div>\n <button\n aria-label={\n userPaused ? \"Play photo rotation\" : \"Pause photo rotation\"\n }\n className={`lockerverse-auction-gallery__play ${controlsFade}`}\n data-gallery-control\n onClick={() => setUserPaused((value) => !value)}\n title={\n userPaused ? \"Play photo rotation\" : \"Pause photo rotation\"\n }\n type=\"button\"\n >\n {userPaused ? (\n <Play aria-hidden=\"true\" size={13} />\n ) : (\n <Pause aria-hidden=\"true\" size={13} />\n )}\n </button>\n </div>\n )}\n {count > 1 && (\n <>\n <button\n aria-label=\"Previous photo\"\n className={`lockerverse-auction-gallery__previous ${controlsFade}`}\n data-gallery-control\n onClick={() => selectPhoto(current - 1)}\n type=\"button\"\n >\n <ChevronLeft\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__chevron\"\n />\n </button>\n <button\n aria-label=\"Next photo\"\n className={`lockerverse-auction-gallery__next ${controlsFade}`}\n data-gallery-control\n onClick={() => selectPhoto(current + 1)}\n type=\"button\"\n >\n <ChevronRight\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__chevron\"\n />\n </button>\n </>\n )}\n </div>\n ) : (\n <div className=\"lockerverse-auction-gallery__empty\">\n No photo available\n </div>\n )}\n {count > 1 && (\n <section\n aria-label=\"Choose a photo\"\n className=\"lockerverse-auction-gallery__strip\"\n ref={stripRef}\n >\n <div className=\"lockerverse-auction-gallery__thumbnails\">\n {photos.map((photo, photoIndex) => (\n <button\n aria-label={`Show photo ${photoIndex + 1} of ${count}`}\n aria-pressed={current === photoIndex}\n className={`lockerverse-auction-gallery__thumbnail ${current === photoIndex ? \"is-selected\" : \"\"}`}\n key={`${photo}-${photoIndex}`}\n onClick={() => selectPhoto(photoIndex)}\n ref={(element) => {\n thumbnailRefs.current[photoIndex] = element;\n }}\n type=\"button\"\n >\n <AuctionImage\n alt=\"\"\n className=\"lockerverse-auction-gallery__thumbnail-image\"\n height={66}\n loading=\"lazy\"\n maxWidth={192}\n sizes=\"88px\"\n src={photo}\n width={88}\n />\n </button>\n ))}\n </div>\n </section>\n )}\n </section>\n );\n}\n","import { Dialog } from \"@base-ui/react/dialog\";\nimport { ChevronLeft, ChevronRight, X as Close } from \"lucide-react\";\nimport { useRef, useState } from \"react\";\nimport { AuctionImage } from \"./auction-image.tsx\";\nimport { AuctionPhotoFilmstrip } from \"./auction-photo-filmstrip\";\n\nexport function AuctionGallery({\n images,\n fallbackImage,\n name,\n imageSizes,\n}: {\n images: readonly string[];\n fallbackImage?: string | null;\n name: string;\n imageSizes?: string | undefined;\n}) {\n const photos = [...new Set(images.filter(Boolean))];\n if (!photos.length && fallbackImage) {\n photos.push(fallbackImage);\n }\n const [index, setIndex] = useState(0);\n const [open, setOpen] = useState(false);\n const opener = useRef<HTMLButtonElement | null>(null);\n const swipeStart = useRef<{ x: number; y: number } | null>(null);\n const count = photos.length;\n const selected = count ? ((index % count) + count) % count : 0;\n\n return (\n <>\n <AuctionPhotoFilmstrip\n imageSizes={imageSizes}\n name={name}\n onExpand={(next) => {\n setIndex(next);\n setOpen(true);\n }}\n onSelect={setIndex}\n paused={open}\n photoButtonRef={opener}\n photos={photos}\n selected={selected}\n />\n {count > 0 && (\n <Dialog.Root onOpenChange={setOpen} open={open}>\n <Dialog.Portal>\n <Dialog.Backdrop className=\"lockerverse-auction-gallery__backdrop\" />\n <Dialog.Popup\n aria-describedby={undefined}\n className=\"lockerverse-auction-gallery__viewer\"\n finalFocus={opener}\n onKeyDown={(event) => {\n if (\n count < 2 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n ) {\n return;\n }\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n setIndex(\n (selected + (event.key === \"ArrowRight\" ? 1 : -1) + count) %\n count\n );\n }\n }}\n >\n <Dialog.Title className=\"lockerverse-auction-gallery__sr-only\">\n {name} · Photo {selected + 1} of {count}\n </Dialog.Title>\n <div\n className=\"lockerverse-auction-gallery__full-image\"\n onTouchCancel={() => {\n swipeStart.current = null;\n }}\n onTouchEnd={(event) => {\n const start = swipeStart.current;\n swipeStart.current = null;\n const end = event.changedTouches.item(0);\n // biome-ignore lint/suspicious/noUnnecessaryConditions: Touch start assigns the shared ref before this event.\n if (!(start && end) || count < 2) {\n return;\n }\n const dx = end.clientX - start.x;\n const dy = end.clientY - start.y;\n if (Math.abs(dx) >= 45 && Math.abs(dx) > Math.abs(dy) * 1.3) {\n setIndex((selected + (dx < 0 ? 1 : -1) + count) % count);\n }\n }}\n onTouchMove={(event) => {\n if (event.touches.length !== 1) {\n swipeStart.current = null;\n }\n }}\n onTouchStart={(event) => {\n const touch = event.touches.item(0);\n swipeStart.current =\n event.touches.length === 1 && touch\n ? { x: touch.clientX, y: touch.clientY }\n : null;\n }}\n >\n <AuctionImage\n alt={`${name}, ${selected + 1} of ${count}`}\n height={900}\n maxWidth={1920}\n sizes=\"100vw\"\n src={photos[selected]}\n width={1200}\n />\n {open && count > 1 && (\n <AuctionImage\n alt=\"\"\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__preload\"\n height={900}\n loading=\"eager\"\n maxWidth={1920}\n sizes=\"100vw\"\n src={photos[(selected + 1) % count]}\n width={1200}\n />\n )}\n </div>\n <Dialog.Close\n aria-label=\"Close photo viewer\"\n className=\"lockerverse-auction-gallery__viewer-close\"\n >\n <Close aria-hidden=\"true\" size={22} />\n </Dialog.Close>\n {count > 1 && (\n <>\n <button\n aria-label=\"Previous photo\"\n className=\"lockerverse-auction-gallery__viewer-previous\"\n onClick={() => setIndex((selected - 1 + count) % count)}\n type=\"button\"\n >\n <ChevronLeft aria-hidden=\"true\" size={28} />\n </button>\n <button\n aria-label=\"Next photo\"\n className=\"lockerverse-auction-gallery__viewer-next\"\n onClick={() => setIndex((selected + 1) % count)}\n type=\"button\"\n >\n <ChevronRight aria-hidden=\"true\" size={28} />\n </button>\n </>\n )}\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n )}\n </>\n );\n}\n","import type {\n LockerverseAuction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport {\n ChevronDown,\n Clock3,\n Gavel,\n ShieldCheck,\n TimerReset,\n} from \"lucide-react\";\nimport { useId, useState } from \"react\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport {\n formatAuctionBoundary,\n formatAuctionMoney as formatMoney,\n getAuctionDisplayStatus,\n} from \"./auction-display.ts\";\nimport { AuctionGallery } from \"./auction-gallery.tsx\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nconst itemHeadingTags = { 1: \"h1\", 2: \"h2\" } as const;\n\nfunction metricIcon(label: string | undefined) {\n if (label === \"Buy Now\") {\n return <ShieldCheck aria-hidden=\"true\" size={16} />;\n }\n if (label === \"Available\" || label === \"Increment\") {\n return <TimerReset aria-hidden=\"true\" size={16} />;\n }\n return <Gavel aria-hidden=\"true\" size={16} />;\n}\nfunction itemMetrics(\n item: LockerverseAuctionItem,\n status: LockerverseAuctionStatus\n) {\n if (item.saleMode === \"buy_now\") {\n return [\n [\"Buy Now\", formatMoney(item.buyNowPriceAmount ?? 0)],\n [\n \"Available\",\n item.availableQuantity === null\n ? \"Available\"\n : String(item.availableQuantity),\n ],\n ];\n }\n if (status === \"finished\") {\n return [\n [\n \"Final bid\",\n item.maxBidAmount ? formatMoney(item.maxBidAmount) : \"No bids\",\n ],\n ];\n }\n return [\n [\"Current bid\", formatMoney(item.maxBidAmount ?? 0)],\n [\"Floor\", formatMoney(item.minBidAmount ?? 0)],\n [\"Increment\", formatMoney(item.bidIncrementAmount ?? 100)],\n ];\n}\nexport function AuctionItemDetails({\n auction,\n item,\n itemHeadingLevel = 2,\n galleryImageSizes,\n}: {\n auction: LockerverseAuction;\n item: LockerverseAuctionItem;\n itemHeadingLevel?: 1 | 2 | undefined;\n galleryImageSizes?: string | undefined;\n}) {\n useAuctionBoundary(\n item.startAt ?? auction.startAt,\n item.endAt ?? auction.endAt\n );\n const [expanded, setExpanded] = useState(false);\n const descriptionId = useId();\n const status = getAuctionDisplayStatus(auction, item);\n const boundaryLabel = {\n active: \"Closes\",\n draft: \"Opens\",\n finished: \"Closed\",\n }[status];\n const boundary = formatAuctionBoundary(auction, status, item);\n const buyNow = item.saleMode === \"buy_now\";\n const longDescription = (item.description ?? \"\").trim().length > 240;\n const metrics = itemMetrics(item, status);\n const ItemHeading = itemHeadingTags[itemHeadingLevel];\n return (\n <section className=\"lockerverse-auctions__item-summary\">\n <AuctionGallery\n fallbackImage={\n item.image ??\n auction.configuration.image ??\n auction.community?.banner ??\n auction.community?.thumbnail ??\n null\n }\n imageSizes={galleryImageSizes}\n images={item.images}\n name={item.name}\n />\n <div className=\"lockerverse-auctions__item-copy\">\n <ItemHeading>{item.name}</ItemHeading>\n {item.description ? (\n <div className=\"lockerverse-auctions__item-description\">\n <AuctionDescription\n className={\n !expanded && longDescription\n ? \"lockerverse-auctions__description-clamped\"\n : undefined\n }\n description={item.description}\n id={descriptionId}\n />\n {longDescription ? (\n <button\n aria-controls={descriptionId}\n aria-expanded={expanded}\n className=\"lockerverse-auctions__description-toggle\"\n onClick={() => setExpanded(!expanded)}\n type=\"button\"\n >\n {expanded ? \"Hide description\" : \"Read full description\"}{\" \"}\n <ChevronDown\n aria-hidden=\"true\"\n size={16}\n style={{ transform: expanded ? \"rotate(180deg)\" : undefined }}\n />\n </button>\n ) : null}\n </div>\n ) : null}\n <dl className=\"lockerverse-auctions__stat-panel\">\n {metrics.map(([label, value]) => (\n <div className=\"lockerverse-auctions__stat-row\" key={label}>\n <dt>\n {metricIcon(label)}\n {label}\n </dt>\n <dd>{value}</dd>\n </div>\n ))}\n <div className=\"lockerverse-auctions__stat-row\">\n <dt>\n <Clock3 aria-hidden=\"true\" size={16} />\n {boundaryLabel}\n </dt>\n <dd className=\"lockerverse-auctions__stat-date\">{boundary}</dd>\n </div>\n {!buyNow && status === \"finished\" ? (\n <div className=\"lockerverse-auctions__stat-footer\">\n <div>\n <dt>Floor</dt>\n <dd>{formatMoney(item.minBidAmount ?? 0)}</dd>\n </div>\n <div>\n <dt>Bid increment</dt>\n <dd>{formatMoney(item.bidIncrementAmount ?? 100)}</dd>\n </div>\n </div>\n ) : null}\n </dl>\n </div>\n </section>\n );\n}\n","import {\n getLockerverseAuctionMinimumBid,\n type LockerverseAuction,\n type LockerverseAuctionItem,\n type LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { ArrowRight } from \"lucide-react\";\nimport { type FormEvent, useId, useState } from \"react\";\nimport { AuctionBackAction } from \"./auction-back-action.tsx\";\nimport {\n formatAuctionBoundary,\n formatAuctionMoney as formatMoney,\n getAuctionDisplayStatus,\n isAuctionItemSoldOut,\n} from \"./auction-display.ts\";\nimport {\n type AuctionSelection,\n getAuctionSelectionError,\n getAuctionSelectionPricing,\n} from \"./auction-payment.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nconst selectionHeadingTags = { 1: \"h2\", 2: \"h3\" } as const;\n\nconst WHOLE_NUMBER = /^\\d+$/;\n\ntype SelectionProps = {\n auction: LockerverseAuction;\n item: LockerverseAuctionItem;\n itemHeadingLevel?: 1 | 2 | undefined;\n initialSelection: AuctionSelection | null;\n onContinue: (selection: AuctionSelection) => void;\n onError: (message: string) => void;\n onBack?: (() => void) | undefined;\n backHref?: string | undefined;\n};\n\nfunction quantitySummary(value: string, item: LockerverseAuctionItem) {\n const quantity = Number(value);\n const subtotal = quantity * (item.buyNowPriceAmount ?? 0);\n if (\n !(WHOLE_NUMBER.test(value) && Number.isSafeInteger(subtotal)) ||\n quantity < 1\n ) {\n return \"Enter a whole-number quantity.\";\n }\n if (!item.additionalCharge) {\n return `Total: ${formatMoney(subtotal)}`;\n }\n const charge =\n item.additionalCharge.firstUnitAmountCents +\n item.additionalCharge.additionalUnitAmountCents * (quantity - 1);\n const total = subtotal + charge;\n if (!Number.isSafeInteger(total)) {\n return \"Enter a valid quantity.\";\n }\n return `Subtotal: ${formatMoney(subtotal)} · ${item.additionalCharge.name}: ${formatMoney(charge)} · Total: ${formatMoney(total)}`;\n}\nfunction selectionInitialValue(\n buyNow: boolean,\n initial: AuctionSelection | null,\n minimum: number\n) {\n if (buyNow) {\n return String(initial ? initial.quantity : 1);\n }\n return String(initial ? initial.amount / 100 : minimum);\n}\nfunction readOnlyTitle(\n item: LockerverseAuctionItem,\n status: LockerverseAuctionStatus\n) {\n if (isAuctionItemSoldOut(item)) {\n return \"This item is sold out.\";\n }\n if (status === \"draft\") {\n return \"This item is not open yet.\";\n }\n if (status === \"finished\") {\n return item.saleMode === \"buy_now\"\n ? \"Purchases are closed for this item.\"\n : \"Bidding is closed for this item.\";\n }\n return \"This item is not available.\";\n}\nfunction readOnlyDescription(\n auction: LockerverseAuction,\n item: LockerverseAuctionItem,\n status: LockerverseAuctionStatus\n) {\n if (isAuctionItemSoldOut(item)) {\n return \"All available quantities have been purchased.\";\n }\n if (status === \"draft\") {\n return `This item opens ${formatAuctionBoundary(auction, \"draft\", item)}.`;\n }\n return item.saleMode === \"buy_now\"\n ? \"This item is no longer available to purchase.\"\n : \"Bidding has closed for this item.\";\n}\nfunction selectionFromInput(\n auction: LockerverseAuction,\n buyNow: boolean,\n initialSelection: AuctionSelection | null,\n value: string\n): AuctionSelection {\n return {\n amount: buyNow ? 0 : Number(value) * 100,\n includeServiceFee: initialSelection\n ? initialSelection.includeServiceFee\n : auction.serviceFeeEnabled && auction.serviceFeeDefaultChecked,\n quantity: buyNow ? Number(value) : 1,\n };\n}\nexport function AuctionItemSelection({\n auction,\n item,\n initialSelection,\n onContinue,\n onError,\n onBack,\n backHref,\n itemHeadingLevel = 2,\n}: SelectionProps) {\n const SelectionHeading = selectionHeadingTags[itemHeadingLevel];\n const buyNow = item.saleMode === \"buy_now\";\n const minimum = Math.ceil(getLockerverseAuctionMinimumBid(item) / 100);\n const [value, setValue] = useState(\n selectionInitialValue(buyNow, initialSelection, minimum)\n );\n const [error, setError] = useState<string | null>(null);\n const id = useId();\n useAuctionBoundary(\n item.startAt ?? auction.startAt,\n item.endAt ?? auction.endAt\n );\n const status = getAuctionDisplayStatus(auction, item);\n const open =\n status === \"active\" &&\n !isAuctionItemSoldOut(item) &&\n item.saleMode !== \"hybrid\";\n function continueToPayment(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (!WHOLE_NUMBER.test(value)) {\n setError(\n buyNow\n ? \"Enter a whole-number quantity.\"\n : \"Enter a whole-dollar bid amount.\"\n );\n return;\n }\n const selection = selectionFromInput(\n auction,\n buyNow,\n initialSelection,\n value\n );\n const message = getAuctionSelectionError(auction, item, selection);\n if (message) {\n setError(message);\n onError(message);\n return;\n }\n try {\n getAuctionSelectionPricing(auction, item, selection);\n } catch {\n setError(\"Enter a valid amount or quantity.\");\n return;\n }\n onContinue(selection);\n }\n if (!open) {\n return (\n <div className=\"lockerverse-auctions__selection lockerverse-auctions__read-only\">\n <p className=\"lockerverse-auctions__eyebrow\">Item status</p>\n <SelectionHeading>{readOnlyTitle(item, status)}</SelectionHeading>\n <p>{readOnlyDescription(auction, item, status)}</p>\n <AuctionBackAction\n className=\"lockerverse-auctions__button\"\n href={backHref}\n onBack={onBack}\n >\n Browse auction items <ArrowRight aria-hidden=\"true\" size={16} />\n </AuctionBackAction>\n </div>\n );\n }\n return (\n <form\n className=\"lockerverse-auctions__selection\"\n onSubmit={continueToPayment}\n >\n <SelectionHeader\n buyNow={buyNow}\n headingTag={SelectionHeading}\n item={item}\n minimum={minimum}\n />\n <div className=\"lockerverse-auctions__selection-body\">\n <label className=\"lockerverse-auctions__field\" htmlFor={id}>\n {buyNow ? \"Quantity\" : \"Your bid amount\"}\n <span className=\"lockerverse-auctions__amount-control\">\n {buyNow ? null : <span aria-hidden=\"true\">$</span>}\n <input\n aria-describedby={`${id}-help`}\n aria-invalid={Boolean(error)}\n autoComplete=\"off\"\n id={id}\n inputMode=\"numeric\"\n onChange={(event) => {\n setValue(event.target.value);\n setError(null);\n }}\n placeholder={buyNow ? \"1\" : String(minimum)}\n required\n value={value}\n />\n </span>\n </label>\n {error ? <p role=\"alert\">{error}</p> : null}\n <p id={`${id}-help`}>\n {buyNow\n ? quantitySummary(value, item)\n : `Enter a whole-dollar bid of at least ${formatMoney(minimum * 100)}. Bid increment: ${formatMoney(item.bidIncrementAmount ?? 100)}.`}\n </p>\n <BidAdditionalCharge item={item} />\n <div className=\"lockerverse-auctions__selection-footer\">\n <p>\n {buyNow\n ? \"Continuing moves you into secure checkout where your payment is processed immediately.\"\n : \"Continuing moves you into the secure payment step where your card is stored for settlement only if your bid wins.\"}\n </p>\n <button\n className=\"lockerverse-auctions__button\"\n disabled={!auction.payment}\n type=\"submit\"\n >\n {buyNow ? \"Continue to Checkout\" : \"Continue to Payment\"}{\" \"}\n <ArrowRight aria-hidden=\"true\" size={16} />\n </button>\n </div>\n {auction.payment ? null : (\n <p role=\"alert\">Payments are not configured for this auction.</p>\n )}\n </div>\n </form>\n );\n}\n\nfunction SelectionHeader({\n headingTag: SelectionHeading,\n item,\n buyNow,\n minimum,\n}: {\n item: LockerverseAuctionItem;\n buyNow: boolean;\n minimum: number;\n headingTag: \"h2\" | \"h3\";\n}) {\n return (\n <div className=\"lockerverse-auctions__selection-header\">\n <p className=\"lockerverse-auctions__eyebrow\">Step 1 of 2</p>\n <SelectionHeading>\n {buyNow ? \"Buy this item now.\" : \"Place your bid.\"}\n </SelectionHeading>\n <p>\n {buyNow\n ? \"Choose how many you want, then complete the secure checkout.\"\n : \"Enter the bid amount you want to place for this item. You are only charged if this bid wins after bidding closes.\"}\n </p>\n <p>\n {buyNow ? \"Price: \" : \"Minimum qualifying bid: \"}\n <strong>\n {formatMoney(buyNow ? (item.buyNowPriceAmount ?? 0) : minimum * 100)}\n </strong>\n </p>\n {buyNow && item.availableQuantity !== null ? (\n <p>{item.availableQuantity} available</p>\n ) : null}\n {item.collectShippingAddress ? (\n <p>\n The next step will also collect a delivery address for seller\n fulfillment.\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction BidAdditionalCharge({ item }: { item: LockerverseAuctionItem }) {\n if (item.saleMode === \"buy_now\" || !item.additionalCharge) {\n return null;\n }\n return (\n <p>\n {item.additionalCharge.name}:{\" \"}\n {formatMoney(item.additionalCharge.firstUnitAmountCents)} will be added to\n your winning bid.\n </p>\n );\n}\n","import { type ComponentType, useEffect, useState } from \"react\";\nimport type { AuctionPaymentProps } from \"./auction-payment-view.tsx\";\n\n/** Keep checkout dependencies out of the server-rendered item and catalog. */\nexport function AuctionPaymentLoader(props: AuctionPaymentProps) {\n const [PaymentView, setPaymentView] =\n useState<ComponentType<AuctionPaymentProps> | null>(null);\n const [failed, setFailed] = useState(false);\n const locked = Boolean(props.resumePurchase || props.interactionLocked);\n\n useEffect(() => {\n let active = true;\n import(\"./auction-payment-view.tsx\").then(\n ({ AuctionPayment }) => {\n if (active) {\n setPaymentView(() => AuctionPayment);\n }\n },\n () => {\n if (active) {\n setFailed(true);\n }\n }\n );\n return () => {\n active = false;\n };\n }, []);\n\n if (PaymentView) {\n return <PaymentView {...props} />;\n }\n return (\n <div>\n <p role={failed ? \"alert\" : \"status\"}>\n {failed\n ? \"Payment details could not load.\"\n : \"Loading secure payment details…\"}\n </p>\n {failed && locked && (\n <p>\n Your purchase status is not confirmed. Keep this page open and contact\n the auction organizer before you try another purchase.\n </p>\n )}\n {locked ? null : (\n <button onClick={props.onBack} type=\"button\">\n Back to item\n </button>\n )}\n {failed && !locked && (\n <button onClick={() => window.location.reload()} type=\"button\">\n Reload page to try again\n </button>\n )}\n </div>\n );\n}\n","import type {\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuction,\n} from \"@lockerverse/sdk/auctions\";\nimport {\n ArrowRight,\n ChevronLeft,\n Gavel,\n ShieldCheck,\n TimerReset,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { AuctionBackAction } from \"./auction-back-action.tsx\";\nimport {\n formatAuctionBoundary,\n getAuctionDisplayStatus,\n} from \"./auction-display.ts\";\nimport { AuctionImageMediaBase } from \"./auction-image.tsx\";\nimport { AuctionItemDetails } from \"./auction-item-details.tsx\";\nimport { AuctionItemSelection } from \"./auction-item-selection.tsx\";\nimport type { LockerverseAuctionItemProps } from \"./auction-item-types.ts\";\nimport type { AuctionSelection } from \"./auction-payment.ts\";\nimport { AuctionPaymentLoader } from \"./auction-payment-loader.tsx\";\nimport {\n type LockerverseAuctionOutcome,\n LockerverseAuctionResult,\n type LockerverseAuctionResultAction,\n} from \"./auction-result.tsx\";\nimport { notifyHostCallback } from \"./host-callback.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nfunction AuctionProgress({ buyNow }: { buyNow: boolean }) {\n return (\n <div className=\"lockerverse-auctions__progress\">\n <span>\n {buyNow ? (\n <ShieldCheck aria-hidden=\"true\" size={16} />\n ) : (\n <Gavel aria-hidden=\"true\" size={16} />\n )}\n {buyNow ? \"Choose quantity\" : \"Place bid\"}\n </span>\n <span>\n <ShieldCheck aria-hidden=\"true\" size={16} />\n {buyNow ? \"Pay securely\" : \"Secure card\"}\n </span>\n <span>\n <TimerReset aria-hidden=\"true\" size={16} />\n {buyNow ? \"Get confirmation\" : \"Wait for close\"}\n </span>\n </div>\n );\n}\n\nfunction AuctionItemResult(\n props: LockerverseAuctionItemProps & {\n item: AuctionItem;\n outcome: LockerverseAuctionOutcome;\n }\n) {\n const { auction, item, outcome } = props;\n let auctionAction: LockerverseAuctionResultAction | undefined;\n if (props.backHref) {\n auctionAction = { href: props.backHref, label: \"View auction items\" };\n } else if (props.onBack) {\n auctionAction = { label: \"View auction items\", onClick: props.onBack };\n }\n return (\n <LockerverseAuctionResult\n auctionName={auction.name}\n className={props.className}\n closesAtLabel={formatAuctionBoundary(auction, \"active\", item)}\n communityName={props.communityName ?? auction.community?.name}\n focusHeading\n imageUrl={\n item.image ?? item.images[0] ?? auction.configuration.image ?? undefined\n }\n itemName={item.name}\n outcome={outcome}\n primaryAction={\n props.returnToItemHref\n ? { href: props.returnToItemHref, label: \"Return to item\" }\n : auctionAction\n }\n secondaryAction={props.returnToItemHref ? auctionAction : undefined}\n style={{\n \"--lockerverse-accent\": auction.community?.color ?? \"#6f8f6d\",\n ...props.style,\n }}\n theme={props.theme}\n />\n );\n}\n\nfunction AuctionItemView(props: LockerverseAuctionItemProps) {\n const {\n auction: initialAuction,\n itemId,\n resumePurchase,\n className,\n theme = \"dark\",\n style,\n } = props;\n const appearanceRoot = useRef<HTMLElement | null>(null);\n const [auction, setAuction] = useState(initialAuction);\n const acceptedHost = useRef(initialAuction);\n const item =\n auction.items.find((candidate) => candidate.id === itemId) ??\n resumePurchase?.item;\n useAuctionBoundary(\n item?.startAt ?? auction.startAt,\n item?.endAt ?? auction.endAt\n );\n const [selection, setSelection] = useState<AuctionSelection | null>(() =>\n resumePurchase\n ? {\n amount: 0,\n includeServiceFee:\n resumePurchase.submission.includeServiceFee ?? false,\n quantity: resumePurchase.submission.quantity,\n }\n : null\n );\n const [interactionLocked, setInteractionLocked] = useState(\n Boolean(resumePurchase)\n );\n const viewMounted = useRef<boolean>(true);\n const hostCallbacks = useRef(props);\n hostCallbacks.current = props;\n const reportedLock = useRef<boolean | null>(null);\n const updateInteractionLock = useCallback((locked: boolean) => {\n // biome-ignore lint/suspicious/noUnnecessaryConditions: Effect cleanup changes this ref outside the callback.\n if (viewMounted.current) {\n setInteractionLocked(locked);\n }\n if (reportedLock.current !== locked) {\n reportedLock.current = locked;\n notifyHostCallback(hostCallbacks.current.onInteractionLockChange, locked);\n }\n }, []);\n const hasRecovery = Boolean(resumePurchase);\n useEffect(() => {\n viewMounted.current = true;\n updateInteractionLock(hasRecovery);\n return () => {\n viewMounted.current = false;\n };\n }, [hasRecovery, updateInteractionLock]);\n const [contact, setContact] = useState({ email: \"\", phone: \"\" });\n const [paying, setPaying] = useState(Boolean(resumePurchase));\n const [notice, setNotice] = useState<string | null>(null);\n const [outcome, setOutcome] = useState<LockerverseAuctionOutcome | null>(\n null\n );\n\n useEffect(() => {\n if (\n !(paying || interactionLocked || resumePurchase) &&\n acceptedHost.current !== initialAuction\n ) {\n acceptedHost.current = initialAuction;\n setAuction(initialAuction);\n }\n }, [initialAuction, paying, interactionLocked, resumePurchase]);\n\n function review(current: LockerverseAuction, message: string) {\n updateInteractionLock(false);\n // The checkout just fetched this snapshot. Do not restore an older host\n // snapshot that arrived while payment was open; accept its next refresh.\n acceptedHost.current = hostCallbacks.current.auction;\n setAuction(current);\n setSelection(null);\n setPaying(false);\n setNotice(message);\n }\n function continueToPayment(next: AuctionSelection) {\n setNotice(null);\n setSelection(next);\n setPaying(true);\n }\n if (!item) {\n return (\n <div>\n <p role=\"alert\">This auction item is no longer available.</p>\n <AuctionBackAction href={props.backHref} onBack={props.onBack}>\n Back to auction items\n </AuctionBackAction>\n </div>\n );\n }\n if (outcome) {\n return (\n <AuctionItemResult\n {...props}\n auction={auction}\n item={item}\n outcome={outcome}\n />\n );\n }\n return (\n <section\n className={[\"lockerverse-auctions\", className].filter(Boolean).join(\" \")}\n data-lockerverse-theme={theme}\n ref={appearanceRoot}\n style={{\n \"--lockerverse-accent\": auction.community?.color ?? \"#6f8f6d\",\n ...style,\n }}\n >\n {interactionLocked ? null : (\n <AuctionBackAction\n className=\"lockerverse-auctions__back\"\n href={props.backHref}\n onBack={props.onBack}\n >\n <ChevronLeft aria-hidden=\"true\" size={16} /> All items\n </AuctionBackAction>\n )}\n <div className=\"lockerverse-auctions__detail\">\n <AuctionItemDetails\n auction={auction}\n galleryImageSizes={props.galleryImageSizes}\n item={item}\n itemHeadingLevel={props.itemHeadingLevel}\n />\n <div className=\"lockerverse-auctions__transaction\">\n {getAuctionDisplayStatus(auction, item) === \"active\" ? (\n <AuctionProgress buyNow={item.saleMode === \"buy_now\"} />\n ) : null}\n {notice ? (\n <p className=\"lockerverse-auctions__notice\" role=\"alert\">\n {notice}\n </p>\n ) : null}\n {paying && selection ? (\n <AuctionPaymentLoader\n {...props}\n appearanceRoot={appearanceRoot}\n auction={auction}\n communityName={props.communityName ?? auction.community?.name}\n contact={contact}\n interactionLocked={interactionLocked}\n item={item}\n onBack={() => setPaying(false)}\n onContactChange={setContact}\n onIncludeServiceFeeChange={(includeServiceFee) =>\n setSelection((current) =>\n current\n ? {\n ...current,\n includeServiceFee:\n auction.serviceFeeEnabled && includeServiceFee,\n }\n : current\n )\n }\n onInteractionLockChange={updateInteractionLock}\n onResult={setOutcome}\n onReview={review}\n selection={selection}\n />\n ) : (\n <AuctionItemSelection\n auction={auction}\n backHref={props.backHref}\n initialSelection={selection}\n item={item}\n itemHeadingLevel={props.itemHeadingLevel}\n onBack={props.onBack}\n onContinue={continueToPayment}\n onError={setNotice}\n />\n )}\n {interactionLocked ? null : (\n <AuctionBackAction\n className=\"lockerverse-auctions__footer-back\"\n href={props.backHref}\n onBack={props.onBack}\n >\n Back to auction items <ArrowRight aria-hidden=\"true\" size={16} />\n </AuctionBackAction>\n )}\n </div>\n </div>\n </section>\n );\n}\n\nexport function LockerverseAuctionItem(props: LockerverseAuctionItemProps) {\n const identity = useRef({\n auctionId: props.auction.id,\n client: props.client,\n itemId: props.itemId,\n });\n if (\n identity.current.client !== props.client ||\n identity.current.auctionId !== props.auction.id ||\n identity.current.itemId !== props.itemId\n ) {\n throw new TypeError(\n \"Auction item identity cannot change. Remount with a new React key.\"\n );\n }\n if (\n props.resumePurchase &&\n (props.resumePurchase.auctionId !== props.auction.id ||\n props.resumePurchase.itemId !== props.itemId ||\n props.resumePurchase.item.id !== props.itemId ||\n props.resumePurchase.item.auctionId !== props.auction.id)\n ) {\n throw new TypeError(\n \"The purchase recovery record belongs to a different auction item.\"\n );\n }\n // Keep the view mounted when a refreshed host snapshot removes the item.\n // Its transaction snapshot remains authoritative until it is safe to leave.\n return (\n <AuctionImageMediaBase.Provider value={props.auction.mediaBaseUrl}>\n <AuctionItemView {...props} />\n </AuctionImageMediaBase.Provider>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auction-item.js","names":["Close","formatMoney","formatMoney"],"sources":["../src/use-auction-autoplay.ts","../src/auction-photo-filmstrip.tsx","../src/auction-gallery.tsx","../src/auction-item-details.tsx","../src/auction-item-selection.tsx","../src/auction-payment-loader.tsx","../src/lockerverse-auction-item.tsx"],"sourcesContent":["import Autoplay from \"embla-carousel-autoplay\";\nimport useEmblaCarousel from \"embla-carousel-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst PHOTO_DELAY = 6000;\n\n// Embla 8 has stop(), but no pause(). Resume with the saved delay, then restore\n// the full delay on selection. Embla remains the only owner of the slide timer.\nexport function useAuctionAutoplay(enabled: boolean, reducedMotion: boolean) {\n const remaining = useRef(PHOTO_DELAY);\n const progressRef = useRef<HTMLDivElement>(null);\n const [cycleDelay, setCycleDelay] = useState(PHOTO_DELAY);\n const autoplay = useMemo(\n () =>\n Autoplay({\n delay: cycleDelay,\n playOnInit: false,\n stopOnFocusIn: false,\n stopOnInteraction: true,\n stopOnMouseEnter: false,\n }),\n [cycleDelay]\n );\n\n const [viewportRef, embla] = useEmblaCarousel(\n { duration: reducedMotion ? 0 : 25, loop: true },\n [autoplay]\n );\n\n const draw = useCallback(() => {\n // biome-ignore lint/suspicious/noUnnecessaryConditions: React assigns this ref in the filmstrip component.\n if (progressRef.current) {\n progressRef.current.style.transform = `scaleX(${1 - remaining.current / PHOTO_DELAY})`;\n }\n }, []);\n\n const freeze = useCallback(() => {\n const left = autoplay.timeUntilNext();\n if (left !== null) {\n remaining.current = Math.max(1, Math.min(PHOTO_DELAY, left));\n }\n autoplay.stop();\n draw();\n }, [autoplay, draw]);\n\n const reset = useCallback(() => {\n remaining.current = PHOTO_DELAY;\n setCycleDelay(PHOTO_DELAY);\n autoplay.reset();\n draw();\n }, [autoplay, draw]);\n\n useEffect(() => {\n if (!embla) {\n return;\n }\n if (!enabled) {\n freeze();\n } else if (cycleDelay === remaining.current) {\n autoplay.play();\n } else {\n setCycleDelay(remaining.current);\n }\n }, [embla, enabled, autoplay, cycleDelay, setCycleDelay, remaining, freeze]);\n\n useEffect(() => {\n if (!embla) {\n return;\n }\n let frame = 0;\n const update = () => {\n const left = autoplay.timeUntilNext();\n if (!enabled || left === null) {\n return;\n }\n remaining.current = Math.max(0, Math.min(PHOTO_DELAY, left));\n draw();\n frame = requestAnimationFrame(update);\n };\n const start = () => {\n cancelAnimationFrame(frame);\n if (enabled) {\n frame = requestAnimationFrame(update);\n }\n };\n const stop = () => cancelAnimationFrame(frame);\n const reinitialize = () => {\n if (enabled) {\n autoplay.play();\n }\n };\n embla\n .on(\"select\", reset)\n .on(\"reInit\", reinitialize)\n .on(\"autoplay:timerset\", start)\n .on(\"autoplay:timerstopped\", stop);\n draw();\n start();\n return () => {\n stop();\n embla\n .off(\"select\", reset)\n .off(\"reInit\", reinitialize)\n .off(\"autoplay:timerset\", start)\n .off(\"autoplay:timerstopped\", stop);\n };\n }, [embla, autoplay, enabled, remaining, reset, draw]);\n return { embla, freeze, progressRef, reset, viewportRef };\n}\n","import { ChevronLeft, ChevronRight, Pause, Play } from \"lucide-react\";\nimport {\n type PointerEvent,\n type Ref,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { AuctionImage } from \"./auction-image.tsx\";\nimport { useAuctionAutoplay } from \"./use-auction-autoplay\";\nimport { useAuctionVisibility } from \"./use-auction-visibility\";\n\ntype FilmstripProps = {\n photos: string[];\n name: string;\n imageSizes?: string | undefined;\n selected: number;\n paused?: boolean;\n photoButtonRef: Ref<HTMLButtonElement>;\n onSelect: (index: number) => void;\n onExpand: (index: number) => void;\n};\n\nexport function AuctionPhotoFilmstrip({\n photos,\n name,\n imageSizes = \"(max-width: 1279px) 100vw, 45vw\",\n selected,\n paused = false,\n photoButtonRef,\n onSelect,\n onExpand,\n}: FilmstripProps) {\n const stripRef = useRef<HTMLDivElement>(null);\n const keyboardPhoto = useRef<HTMLButtonElement | null>(null);\n const thumbnailRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const [reducedMotion, setReducedMotion] = useState(true);\n const [hovered, setHovered] = useState(false);\n const [keyboardFocused, setKeyboardFocused] = useState(false);\n const [userPaused, setUserPaused] = useState(false);\n const [dragging, setDragging] = useState(false);\n const { ref: galleryRef, visible } = useAuctionVisibility<HTMLElement>();\n const [controlsActive, setControlsActive] = useState(false);\n const [touchControls, setTouchControls] = useState(true);\n const hideControlsTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const controlsVisible = touchControls || controlsActive || keyboardFocused;\n const controlsFade = `lockerverse-auction-gallery__control ${controlsVisible ? \"is-visible\" : \"\"}`;\n\n const scheduleControlsHide = () => {\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The timer ref is assigned after pointer activity.\n if (hideControlsTimer.current) {\n clearTimeout(hideControlsTimer.current);\n }\n hideControlsTimer.current = setTimeout(\n () => setControlsActive(false),\n 2000\n );\n };\n const showControls = (event: PointerEvent<HTMLDivElement>) => {\n if (event.pointerType !== \"mouse\") {\n setTouchControls(true);\n return;\n }\n setControlsActive(true);\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The timer ref is assigned after pointer activity.\n if (hideControlsTimer.current) {\n clearTimeout(hideControlsTimer.current);\n }\n if (\n !(\n event.target instanceof Element &&\n event.target.closest(\"[data-gallery-control]\")\n )\n ) {\n scheduleControlsHide();\n }\n };\n\n useEffect(() => {\n const preference = window.matchMedia(\"(hover: none), (pointer: coarse)\");\n const update = () => setTouchControls(preference.matches);\n update();\n preference.addEventListener(\"change\", update);\n return () => {\n preference.removeEventListener(\"change\", update);\n clearTimeout(hideControlsTimer.current ?? undefined);\n };\n }, []);\n\n const autoplayEnabled =\n !(\n paused ||\n reducedMotion ||\n hovered ||\n keyboardFocused ||\n userPaused ||\n dragging\n ) && visible;\n const count = photos.length;\n const current = count ? ((selected % count) + count) % count : 0;\n const { viewportRef, embla, progressRef, freeze, reset } = useAuctionAutoplay(\n autoplayEnabled && count > 1,\n reducedMotion\n );\n\n useEffect(() => {\n const preference = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const update = () => setReducedMotion(preference.matches);\n update();\n preference.addEventListener(\"change\", update);\n return () => preference.removeEventListener(\"change\", update);\n }, []);\n\n useEffect(() => {\n if (!embla) {\n return;\n }\n const select = () => onSelect(embla.selectedScrollSnap());\n embla.on(\"select\", select).on(\"reInit\", select);\n return () => {\n embla.off(\"select\", select).off(\"reInit\", select);\n };\n }, [embla, onSelect]);\n\n useEffect(() => {\n if (embla && embla.selectedScrollSnap() !== current) {\n embla.scrollTo(current, true);\n }\n }, [embla, current]);\n\n useEffect(() => {\n const updateVisibility = () => {\n if (document.hidden) {\n freeze();\n }\n };\n const release = () => setDragging(false);\n updateVisibility();\n document.addEventListener(\"visibilitychange\", updateVisibility, true);\n window.addEventListener(\"pointerup\", release);\n window.addEventListener(\"pointercancel\", release);\n return () => {\n document.removeEventListener(\"visibilitychange\", updateVisibility, true);\n window.removeEventListener(\"pointerup\", release);\n window.removeEventListener(\"pointercancel\", release);\n };\n }, [freeze]);\n\n const selectPhoto = (next: number) => {\n embla?.scrollTo((next + count) % count, reducedMotion);\n reset();\n };\n\n useEffect(() => {\n const previousPhoto = keyboardPhoto.current;\n keyboardPhoto.current = null;\n // biome-ignore lint/suspicious/noUnnecessaryConditions: Keyboard events assign this ref before the selected photo changes.\n if (previousPhoto && document.activeElement === previousPhoto) {\n galleryRef.current\n ?.querySelector<HTMLButtonElement>(\n '.lockerverse-auction-gallery__photo[tabindex=\"0\"]'\n )\n ?.focus({ preventScroll: true });\n }\n }, [current, galleryRef]);\n\n useEffect(() => {\n const strip = stripRef.current;\n const thumbnail = thumbnailRefs.current[current];\n // biome-ignore lint/suspicious/noUnnecessaryConditions: React assigns the element ref after mounting.\n if (!(strip && thumbnail)) {\n return;\n }\n const stripBounds = strip.getBoundingClientRect();\n const photoBounds = thumbnail.getBoundingClientRect();\n if (photoBounds.left < stripBounds.left) {\n strip.scrollLeft -= stripBounds.left - photoBounds.left;\n } else if (photoBounds.right > stripBounds.right) {\n strip.scrollLeft += photoBounds.right - stripBounds.right;\n }\n }, [current, count]);\n\n return (\n // biome-ignore lint/a11y/noNoninteractiveElementInteractions: The gallery handles keys from its focusable photo and navigation buttons.\n <section\n aria-label={`${name} photos`}\n className=\"lockerverse-auction-gallery\"\n onBlurCapture={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n setKeyboardFocused(false);\n }\n }}\n onFocusCapture={(event) =>\n setKeyboardFocused(event.target.matches(\":focus-visible\"))\n }\n onKeyDown={(event) => {\n if (\n count < 2 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n ) {\n return;\n }\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n if (\n event.target instanceof HTMLButtonElement &&\n event.target.classList.contains(\n \"lockerverse-auction-gallery__photo\"\n )\n ) {\n keyboardPhoto.current = event.target;\n }\n selectPhoto(current + (event.key === \"ArrowRight\" ? 1 : -1));\n }\n }}\n onPointerEnter={(event) => {\n if (event.pointerType === \"mouse\") {\n setHovered(true);\n }\n }}\n onPointerLeave={(event) => {\n if (event.pointerType === \"mouse\") {\n setHovered(false);\n }\n }}\n ref={galleryRef}\n >\n {count ? (\n <div\n className=\"lockerverse-auction-gallery__stage\"\n onPointerEnter={showControls}\n onPointerLeave={scheduleControlsHide}\n onPointerMove={showControls}\n >\n <div\n className=\"lockerverse-auction-gallery__viewport\"\n onPointerDownCapture={() => {\n freeze();\n setDragging(true);\n }}\n ref={viewportRef}\n >\n <div className=\"lockerverse-auction-gallery__track\">\n {photos.map((photo, photoIndex) => (\n <div\n aria-hidden={photoIndex !== current}\n className=\"lockerverse-auction-gallery__slide\"\n key={`${photo}-${photoIndex}`}\n >\n <button\n aria-label={`View photo ${photoIndex + 1} of ${name} at full size`}\n className=\"lockerverse-auction-gallery__photo\"\n onClick={() => {\n onExpand(photoIndex);\n }}\n ref={photoIndex === current ? photoButtonRef : undefined}\n tabIndex={photoIndex === current ? 0 : -1}\n type=\"button\"\n >\n <AuctionImage\n alt={`${name}, ${photoIndex + 1} of ${count}`}\n className=\"lockerverse-auction-gallery__image\"\n draggable={false}\n fetchPriority={photoIndex === 0 ? \"high\" : \"auto\"}\n height={900}\n loading={photoIndex === current ? \"eager\" : \"lazy\"}\n maxWidth={1920}\n sizes={\n photoIndex === current\n ? imageSizes\n : `auto, ${imageSizes}`\n }\n src={photo}\n width={1200}\n />\n </button>\n </div>\n ))}\n </div>\n </div>\n {count > 1 && !reducedMotion && (\n <div className=\"lockerverse-auction-gallery__rotation\">\n <div\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__progress-track\"\n >\n <div\n className=\"lockerverse-auction-gallery__progress\"\n ref={progressRef}\n style={{ transform: \"scaleX(0)\" }}\n />\n </div>\n <button\n aria-label={\n userPaused ? \"Play photo rotation\" : \"Pause photo rotation\"\n }\n className={`lockerverse-auction-gallery__play ${controlsFade}`}\n data-gallery-control\n onClick={() => setUserPaused((value) => !value)}\n title={\n userPaused ? \"Play photo rotation\" : \"Pause photo rotation\"\n }\n type=\"button\"\n >\n {userPaused ? (\n <Play aria-hidden=\"true\" size={13} />\n ) : (\n <Pause aria-hidden=\"true\" size={13} />\n )}\n </button>\n </div>\n )}\n {count > 1 && (\n <>\n <button\n aria-label=\"Previous photo\"\n className={`lockerverse-auction-gallery__previous ${controlsFade}`}\n data-gallery-control\n onClick={() => selectPhoto(current - 1)}\n type=\"button\"\n >\n <ChevronLeft\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__chevron\"\n />\n </button>\n <button\n aria-label=\"Next photo\"\n className={`lockerverse-auction-gallery__next ${controlsFade}`}\n data-gallery-control\n onClick={() => selectPhoto(current + 1)}\n type=\"button\"\n >\n <ChevronRight\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__chevron\"\n />\n </button>\n </>\n )}\n </div>\n ) : (\n <div className=\"lockerverse-auction-gallery__empty\">\n No photo available\n </div>\n )}\n {count > 1 && (\n <section\n aria-label=\"Choose a photo\"\n className=\"lockerverse-auction-gallery__strip\"\n ref={stripRef}\n >\n <div className=\"lockerverse-auction-gallery__thumbnails\">\n {photos.map((photo, photoIndex) => (\n <button\n aria-label={`Show photo ${photoIndex + 1} of ${count}`}\n aria-pressed={current === photoIndex}\n className={`lockerverse-auction-gallery__thumbnail ${current === photoIndex ? \"is-selected\" : \"\"}`}\n key={`${photo}-${photoIndex}`}\n onClick={() => selectPhoto(photoIndex)}\n ref={(element) => {\n thumbnailRefs.current[photoIndex] = element;\n }}\n type=\"button\"\n >\n <AuctionImage\n alt=\"\"\n className=\"lockerverse-auction-gallery__thumbnail-image\"\n height={66}\n loading=\"lazy\"\n maxWidth={192}\n sizes=\"88px\"\n src={photo}\n width={88}\n />\n </button>\n ))}\n </div>\n </section>\n )}\n </section>\n );\n}\n","import { Dialog } from \"@base-ui/react/dialog\";\nimport { ChevronLeft, ChevronRight, X as Close } from \"lucide-react\";\nimport { useRef, useState } from \"react\";\nimport { AuctionImage } from \"./auction-image.tsx\";\nimport { AuctionPhotoFilmstrip } from \"./auction-photo-filmstrip\";\n\nexport function AuctionGallery({\n images,\n fallbackImage,\n name,\n imageSizes,\n}: {\n images: readonly string[];\n fallbackImage?: string | null;\n name: string;\n imageSizes?: string | undefined;\n}) {\n const photos = [...new Set(images.filter(Boolean))];\n if (!photos.length && fallbackImage) {\n photos.push(fallbackImage);\n }\n const [index, setIndex] = useState(0);\n const [open, setOpen] = useState(false);\n const opener = useRef<HTMLButtonElement | null>(null);\n const swipeStart = useRef<{ x: number; y: number } | null>(null);\n const count = photos.length;\n const selected = count ? ((index % count) + count) % count : 0;\n\n return (\n <>\n <AuctionPhotoFilmstrip\n imageSizes={imageSizes}\n name={name}\n onExpand={(next) => {\n setIndex(next);\n setOpen(true);\n }}\n onSelect={setIndex}\n paused={open}\n photoButtonRef={opener}\n photos={photos}\n selected={selected}\n />\n {count > 0 && (\n <Dialog.Root onOpenChange={setOpen} open={open}>\n <Dialog.Portal>\n <Dialog.Backdrop className=\"lockerverse-auction-gallery__backdrop\" />\n <Dialog.Popup\n aria-describedby={undefined}\n className=\"lockerverse-auction-gallery__viewer\"\n finalFocus={opener}\n onKeyDown={(event) => {\n if (\n count < 2 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n ) {\n return;\n }\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n setIndex(\n (selected + (event.key === \"ArrowRight\" ? 1 : -1) + count) %\n count\n );\n }\n }}\n >\n <Dialog.Title className=\"lockerverse-auction-gallery__sr-only\">\n {name} · Photo {selected + 1} of {count}\n </Dialog.Title>\n <div\n className=\"lockerverse-auction-gallery__full-image\"\n onTouchCancel={() => {\n swipeStart.current = null;\n }}\n onTouchEnd={(event) => {\n const start = swipeStart.current;\n swipeStart.current = null;\n const end = event.changedTouches.item(0);\n // biome-ignore lint/suspicious/noUnnecessaryConditions: Touch start assigns the shared ref before this event.\n if (!(start && end) || count < 2) {\n return;\n }\n const dx = end.clientX - start.x;\n const dy = end.clientY - start.y;\n if (Math.abs(dx) >= 45 && Math.abs(dx) > Math.abs(dy) * 1.3) {\n setIndex((selected + (dx < 0 ? 1 : -1) + count) % count);\n }\n }}\n onTouchMove={(event) => {\n if (event.touches.length !== 1) {\n swipeStart.current = null;\n }\n }}\n onTouchStart={(event) => {\n const touch = event.touches.item(0);\n swipeStart.current =\n event.touches.length === 1 && touch\n ? { x: touch.clientX, y: touch.clientY }\n : null;\n }}\n >\n <AuctionImage\n alt={`${name}, ${selected + 1} of ${count}`}\n height={900}\n maxWidth={1920}\n sizes=\"100vw\"\n src={photos[selected]}\n width={1200}\n />\n {open && count > 1 && (\n <AuctionImage\n alt=\"\"\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__preload\"\n height={900}\n loading=\"eager\"\n maxWidth={1920}\n sizes=\"100vw\"\n src={photos[(selected + 1) % count]}\n width={1200}\n />\n )}\n </div>\n <Dialog.Close\n aria-label=\"Close photo viewer\"\n className=\"lockerverse-auction-gallery__viewer-close\"\n >\n <Close aria-hidden=\"true\" size={22} />\n </Dialog.Close>\n {count > 1 && (\n <>\n <button\n aria-label=\"Previous photo\"\n className=\"lockerverse-auction-gallery__viewer-previous\"\n onClick={() => setIndex((selected - 1 + count) % count)}\n type=\"button\"\n >\n <ChevronLeft aria-hidden=\"true\" size={28} />\n </button>\n <button\n aria-label=\"Next photo\"\n className=\"lockerverse-auction-gallery__viewer-next\"\n onClick={() => setIndex((selected + 1) % count)}\n type=\"button\"\n >\n <ChevronRight aria-hidden=\"true\" size={28} />\n </button>\n </>\n )}\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n )}\n </>\n );\n}\n","import type {\n LockerverseAuction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport {\n ChevronDown,\n Clock3,\n Gavel,\n ShieldCheck,\n TimerReset,\n} from \"lucide-react\";\nimport { useId, useState } from \"react\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport {\n formatAuctionBoundary,\n formatAuctionMoney as formatMoney,\n getAuctionDisplayStatus,\n} from \"./auction-display.ts\";\nimport { AuctionGallery } from \"./auction-gallery.tsx\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nconst itemHeadingTags = { 1: \"h1\", 2: \"h2\" } as const;\n\nfunction metricIcon(label: string | undefined) {\n if (label === \"Buy Now\") {\n return <ShieldCheck aria-hidden=\"true\" size={16} />;\n }\n if (label === \"Available\" || label === \"Increment\") {\n return <TimerReset aria-hidden=\"true\" size={16} />;\n }\n return <Gavel aria-hidden=\"true\" size={16} />;\n}\nfunction itemMetrics(\n item: LockerverseAuctionItem,\n status: LockerverseAuctionStatus\n) {\n if (item.saleMode === \"buy_now\") {\n return [\n [\"Buy Now\", formatMoney(item.buyNowPriceAmount ?? 0)],\n [\n \"Available\",\n item.availableQuantity === null\n ? \"Available\"\n : String(item.availableQuantity),\n ],\n ];\n }\n if (status === \"finished\") {\n return [\n [\n \"Final bid\",\n item.maxBidAmount ? formatMoney(item.maxBidAmount) : \"No bids\",\n ],\n ];\n }\n return [\n [\"Current bid\", formatMoney(item.maxBidAmount ?? 0)],\n [\"Floor\", formatMoney(item.minBidAmount ?? 0)],\n [\"Increment\", formatMoney(item.bidIncrementAmount ?? 100)],\n ];\n}\nexport function AuctionItemDetails({\n auction,\n item,\n itemHeadingLevel = 2,\n galleryImageSizes,\n}: {\n auction: LockerverseAuction;\n item: LockerverseAuctionItem;\n itemHeadingLevel?: 1 | 2 | undefined;\n galleryImageSizes?: string | undefined;\n}) {\n useAuctionBoundary(\n item.startAt ?? auction.startAt,\n item.endAt ?? auction.endAt\n );\n const [expanded, setExpanded] = useState(false);\n const descriptionId = useId();\n const status = getAuctionDisplayStatus(auction, item);\n const boundaryLabel = {\n active: \"Closes\",\n draft: \"Opens\",\n finished: \"Closed\",\n }[status];\n const boundary = formatAuctionBoundary(auction, status, item);\n const buyNow = item.saleMode === \"buy_now\";\n const longDescription = (item.description ?? \"\").trim().length > 240;\n const metrics = itemMetrics(item, status);\n const ItemHeading = itemHeadingTags[itemHeadingLevel];\n return (\n <section className=\"lockerverse-auctions__item-summary\">\n <AuctionGallery\n fallbackImage={\n item.image ??\n auction.configuration.image ??\n auction.community?.banner ??\n auction.community?.thumbnail ??\n null\n }\n imageSizes={galleryImageSizes}\n images={item.images}\n name={item.name}\n />\n <div className=\"lockerverse-auctions__item-copy\">\n <ItemHeading>{item.name}</ItemHeading>\n {item.description ? (\n <div className=\"lockerverse-auctions__item-description\">\n <AuctionDescription\n className={\n !expanded && longDescription\n ? \"lockerverse-auctions__description-clamped\"\n : undefined\n }\n description={item.description}\n id={descriptionId}\n />\n {longDescription ? (\n <button\n aria-controls={descriptionId}\n aria-expanded={expanded}\n className=\"lockerverse-auctions__description-toggle\"\n onClick={() => setExpanded(!expanded)}\n type=\"button\"\n >\n {expanded ? \"Hide description\" : \"Read full description\"}{\" \"}\n <ChevronDown\n aria-hidden=\"true\"\n size={16}\n style={{ transform: expanded ? \"rotate(180deg)\" : undefined }}\n />\n </button>\n ) : null}\n </div>\n ) : null}\n <dl className=\"lockerverse-auctions__stat-panel\">\n {metrics.map(([label, value]) => (\n <div className=\"lockerverse-auctions__stat-row\" key={label}>\n <dt>\n {metricIcon(label)}\n {label}\n </dt>\n <dd>{value}</dd>\n </div>\n ))}\n <div className=\"lockerverse-auctions__stat-row\">\n <dt>\n <Clock3 aria-hidden=\"true\" size={16} />\n {boundaryLabel}\n </dt>\n <dd className=\"lockerverse-auctions__stat-date\">{boundary}</dd>\n </div>\n {!buyNow && status === \"finished\" ? (\n <div className=\"lockerverse-auctions__stat-footer\">\n <div>\n <dt>Floor</dt>\n <dd>{formatMoney(item.minBidAmount ?? 0)}</dd>\n </div>\n <div>\n <dt>Bid increment</dt>\n <dd>{formatMoney(item.bidIncrementAmount ?? 100)}</dd>\n </div>\n </div>\n ) : null}\n </dl>\n </div>\n </section>\n );\n}\n","import {\n getLockerverseAuctionMinimumBid,\n type LockerverseAuction,\n type LockerverseAuctionItem,\n type LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { ArrowRight } from \"lucide-react\";\nimport { type FormEvent, useId, useState } from \"react\";\nimport { AuctionBackAction } from \"./auction-back-action.tsx\";\nimport {\n formatAuctionBoundary,\n formatAuctionMoney as formatMoney,\n getAuctionDisplayStatus,\n isAuctionItemSoldOut,\n} from \"./auction-display.ts\";\nimport {\n type AuctionSelection,\n getAuctionSelectionError,\n getAuctionSelectionPricing,\n} from \"./auction-payment.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nconst selectionHeadingTags = { 1: \"h2\", 2: \"h3\" } as const;\n\nconst WHOLE_NUMBER = /^\\d+$/;\n\ntype SelectionProps = {\n auction: LockerverseAuction;\n item: LockerverseAuctionItem;\n itemHeadingLevel?: 1 | 2 | undefined;\n initialSelection: AuctionSelection | null;\n onContinue: (selection: AuctionSelection) => void;\n onError: (message: string) => void;\n onBack?: (() => void) | undefined;\n backHref?: string | undefined;\n};\n\nfunction quantitySummary(value: string, item: LockerverseAuctionItem) {\n const quantity = Number(value);\n const subtotal = quantity * (item.buyNowPriceAmount ?? 0);\n if (\n !(WHOLE_NUMBER.test(value) && Number.isSafeInteger(subtotal)) ||\n quantity < 1\n ) {\n return \"Enter a whole-number quantity.\";\n }\n if (!item.additionalCharge) {\n return `Total: ${formatMoney(subtotal)}`;\n }\n const charge =\n item.additionalCharge.firstUnitAmountCents +\n item.additionalCharge.additionalUnitAmountCents * (quantity - 1);\n const total = subtotal + charge;\n if (!Number.isSafeInteger(total)) {\n return \"Enter a valid quantity.\";\n }\n return `Subtotal: ${formatMoney(subtotal)} · ${item.additionalCharge.name}: ${formatMoney(charge)} · Total: ${formatMoney(total)}`;\n}\nfunction selectionInitialValue(\n buyNow: boolean,\n initial: AuctionSelection | null,\n minimum: number\n) {\n if (buyNow) {\n return String(initial ? initial.quantity : 1);\n }\n return String(initial ? initial.amount / 100 : minimum);\n}\nfunction readOnlyTitle(\n item: LockerverseAuctionItem,\n status: LockerverseAuctionStatus\n) {\n if (isAuctionItemSoldOut(item)) {\n return \"This item is sold out.\";\n }\n if (status === \"draft\") {\n return \"This item is not open yet.\";\n }\n if (status === \"finished\") {\n return item.saleMode === \"buy_now\"\n ? \"Purchases are closed for this item.\"\n : \"Bidding is closed for this item.\";\n }\n return \"This item is not available.\";\n}\nfunction readOnlyDescription(\n auction: LockerverseAuction,\n item: LockerverseAuctionItem,\n status: LockerverseAuctionStatus\n) {\n if (isAuctionItemSoldOut(item)) {\n return \"All available quantities have been purchased.\";\n }\n if (status === \"draft\") {\n return `This item opens ${formatAuctionBoundary(auction, \"draft\", item)}.`;\n }\n return item.saleMode === \"buy_now\"\n ? \"This item is no longer available to purchase.\"\n : \"Bidding has closed for this item.\";\n}\nfunction selectionFromInput(\n auction: LockerverseAuction,\n buyNow: boolean,\n initialSelection: AuctionSelection | null,\n value: string\n): AuctionSelection {\n return {\n amount: buyNow ? 0 : Number(value) * 100,\n includeServiceFee: initialSelection\n ? initialSelection.includeServiceFee\n : auction.serviceFeeEnabled && auction.serviceFeeDefaultChecked,\n quantity: buyNow ? Number(value) : 1,\n };\n}\nexport function AuctionItemSelection({\n auction,\n item,\n initialSelection,\n onContinue,\n onError,\n onBack,\n backHref,\n itemHeadingLevel = 2,\n}: SelectionProps) {\n const SelectionHeading = selectionHeadingTags[itemHeadingLevel];\n const buyNow = item.saleMode === \"buy_now\";\n const minimum = Math.ceil(getLockerverseAuctionMinimumBid(item) / 100);\n const [value, setValue] = useState(\n selectionInitialValue(buyNow, initialSelection, minimum)\n );\n const [error, setError] = useState<string | null>(null);\n const id = useId();\n useAuctionBoundary(\n item.startAt ?? auction.startAt,\n item.endAt ?? auction.endAt\n );\n const status = getAuctionDisplayStatus(auction, item);\n const open =\n status === \"active\" &&\n !isAuctionItemSoldOut(item) &&\n item.saleMode !== \"hybrid\";\n function continueToPayment(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (!WHOLE_NUMBER.test(value)) {\n setError(\n buyNow\n ? \"Enter a whole-number quantity.\"\n : \"Enter a whole-dollar bid amount.\"\n );\n return;\n }\n const selection = selectionFromInput(\n auction,\n buyNow,\n initialSelection,\n value\n );\n const message = getAuctionSelectionError(auction, item, selection);\n if (message) {\n setError(message);\n onError(message);\n return;\n }\n try {\n getAuctionSelectionPricing(auction, item, selection);\n } catch {\n setError(\"Enter a valid amount or quantity.\");\n return;\n }\n onContinue(selection);\n }\n if (!open) {\n return (\n <div className=\"lockerverse-auctions__selection lockerverse-auctions__read-only\">\n <p className=\"lockerverse-auctions__eyebrow\">Item status</p>\n <SelectionHeading>{readOnlyTitle(item, status)}</SelectionHeading>\n <p>{readOnlyDescription(auction, item, status)}</p>\n <AuctionBackAction\n className=\"lockerverse-auctions__button\"\n href={backHref}\n onBack={onBack}\n >\n Browse auction items <ArrowRight aria-hidden=\"true\" size={16} />\n </AuctionBackAction>\n </div>\n );\n }\n return (\n <form\n className=\"lockerverse-auctions__selection\"\n onSubmit={continueToPayment}\n >\n <SelectionHeader\n buyNow={buyNow}\n headingTag={SelectionHeading}\n item={item}\n minimum={minimum}\n />\n <div className=\"lockerverse-auctions__selection-body\">\n <label className=\"lockerverse-auctions__field\" htmlFor={id}>\n {buyNow ? \"Quantity\" : \"Your bid amount\"}\n <span className=\"lockerverse-auctions__amount-control\">\n {buyNow ? null : <span aria-hidden=\"true\">$</span>}\n <input\n aria-describedby={`${id}-help`}\n aria-invalid={Boolean(error)}\n autoComplete=\"off\"\n id={id}\n inputMode=\"numeric\"\n onChange={(event) => {\n setValue(event.target.value);\n setError(null);\n }}\n placeholder={buyNow ? \"1\" : String(minimum)}\n required\n value={value}\n />\n </span>\n </label>\n {error ? <p role=\"alert\">{error}</p> : null}\n <p id={`${id}-help`}>\n {buyNow\n ? quantitySummary(value, item)\n : `Enter a whole-dollar bid of at least ${formatMoney(minimum * 100)}. Bid increment: ${formatMoney(item.bidIncrementAmount ?? 100)}.`}\n </p>\n <BidAdditionalCharge item={item} />\n <div className=\"lockerverse-auctions__selection-footer\">\n <p>\n {buyNow\n ? \"Continuing moves you into secure checkout where your payment is processed immediately.\"\n : \"Continuing moves you into the secure payment step where your card is stored for settlement only if your bid wins.\"}\n </p>\n <button\n className=\"lockerverse-auctions__button\"\n disabled={!auction.payment}\n type=\"submit\"\n >\n {buyNow ? \"Continue to Checkout\" : \"Continue to Payment\"}{\" \"}\n <ArrowRight aria-hidden=\"true\" size={16} />\n </button>\n </div>\n {auction.payment ? null : (\n <p role=\"alert\">Payments are not configured for this auction.</p>\n )}\n </div>\n </form>\n );\n}\n\nfunction SelectionHeader({\n headingTag: SelectionHeading,\n item,\n buyNow,\n minimum,\n}: {\n item: LockerverseAuctionItem;\n buyNow: boolean;\n minimum: number;\n headingTag: \"h2\" | \"h3\";\n}) {\n return (\n <div className=\"lockerverse-auctions__selection-header\">\n <p className=\"lockerverse-auctions__eyebrow\">Step 1 of 2</p>\n <SelectionHeading>\n {buyNow ? \"Buy this item now.\" : \"Place your bid.\"}\n </SelectionHeading>\n <p>\n {buyNow\n ? \"Choose how many you want, then complete the secure checkout.\"\n : \"Enter the bid amount you want to place for this item. You are only charged if this bid wins after bidding closes.\"}\n </p>\n <p>\n {buyNow ? \"Price: \" : \"Minimum qualifying bid: \"}\n <strong>\n {formatMoney(buyNow ? (item.buyNowPriceAmount ?? 0) : minimum * 100)}\n </strong>\n </p>\n {buyNow && item.availableQuantity !== null ? (\n <p>{item.availableQuantity} available</p>\n ) : null}\n {item.collectShippingAddress ? (\n <p>\n The next step will also collect a delivery address for seller\n fulfillment.\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction BidAdditionalCharge({ item }: { item: LockerverseAuctionItem }) {\n if (item.saleMode === \"buy_now\" || !item.additionalCharge) {\n return null;\n }\n return (\n <p>\n {item.additionalCharge.name}:{\" \"}\n {formatMoney(item.additionalCharge.firstUnitAmountCents)} will be added to\n your winning bid.\n </p>\n );\n}\n","import { type ComponentType, useEffect, useState } from \"react\";\nimport type { AuctionPaymentProps } from \"./auction-payment-view.tsx\";\n\n/** Keep checkout dependencies out of the server-rendered item and catalog. */\nexport function AuctionPaymentLoader(props: AuctionPaymentProps) {\n const [PaymentView, setPaymentView] =\n useState<ComponentType<AuctionPaymentProps> | null>(null);\n const [failed, setFailed] = useState(false);\n const locked = Boolean(props.resumePurchase || props.interactionLocked);\n\n useEffect(() => {\n let active = true;\n import(\"./auction-payment-view.tsx\").then(\n ({ AuctionPayment }) => {\n if (active) {\n setPaymentView(() => AuctionPayment);\n }\n },\n () => {\n if (active) {\n setFailed(true);\n }\n }\n );\n return () => {\n active = false;\n };\n }, []);\n\n if (PaymentView) {\n return <PaymentView {...props} />;\n }\n return (\n <div>\n <p role={failed ? \"alert\" : \"status\"}>\n {failed\n ? \"Payment details could not load.\"\n : \"Loading secure payment details…\"}\n </p>\n {failed && locked && (\n <p>\n Your purchase status is not confirmed. Keep this page open and contact\n the auction organizer before you try another purchase.\n </p>\n )}\n {locked ? null : (\n <button onClick={props.onBack} type=\"button\">\n Back to item\n </button>\n )}\n {failed && !locked && (\n <button onClick={() => window.location.reload()} type=\"button\">\n Reload page to try again\n </button>\n )}\n </div>\n );\n}\n","import type {\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuction,\n} from \"@lockerverse/sdk/auctions\";\nimport {\n ArrowRight,\n ChevronLeft,\n Gavel,\n ShieldCheck,\n TimerReset,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { AuctionBackAction } from \"./auction-back-action.tsx\";\nimport {\n formatAuctionBoundary,\n getAuctionDisplayStatus,\n} from \"./auction-display.ts\";\nimport { AuctionImageMediaBase } from \"./auction-image.tsx\";\nimport { AuctionItemDetails } from \"./auction-item-details.tsx\";\nimport { AuctionItemSelection } from \"./auction-item-selection.tsx\";\nimport type { LockerverseAuctionItemProps } from \"./auction-item-types.ts\";\nimport type { AuctionSelection } from \"./auction-payment.ts\";\nimport { AuctionPaymentLoader } from \"./auction-payment-loader.tsx\";\nimport {\n type LockerverseAuctionOutcome,\n LockerverseAuctionResult,\n type LockerverseAuctionResultAction,\n} from \"./auction-result.tsx\";\nimport { notifyHostCallback } from \"./host-callback.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nfunction AuctionProgress({ buyNow }: { buyNow: boolean }) {\n return (\n <div className=\"lockerverse-auctions__progress\">\n <span>\n {buyNow ? (\n <ShieldCheck aria-hidden=\"true\" size={16} />\n ) : (\n <Gavel aria-hidden=\"true\" size={16} />\n )}\n {buyNow ? \"Choose quantity\" : \"Place bid\"}\n </span>\n <span>\n <ShieldCheck aria-hidden=\"true\" size={16} />\n {buyNow ? \"Pay securely\" : \"Secure card\"}\n </span>\n <span>\n <TimerReset aria-hidden=\"true\" size={16} />\n {buyNow ? \"Get confirmation\" : \"Wait for close\"}\n </span>\n </div>\n );\n}\n\nfunction AuctionItemResult(\n props: LockerverseAuctionItemProps & {\n item: AuctionItem;\n outcome: LockerverseAuctionOutcome;\n }\n) {\n const { auction, item, outcome } = props;\n let auctionAction: LockerverseAuctionResultAction | undefined;\n if (props.backHref) {\n auctionAction = { href: props.backHref, label: \"View auction items\" };\n } else if (props.onBack) {\n auctionAction = { label: \"View auction items\", onClick: props.onBack };\n }\n return (\n <LockerverseAuctionResult\n auctionName={auction.name}\n className={props.className}\n closesAtLabel={formatAuctionBoundary(auction, \"active\", item)}\n communityName={props.communityName ?? auction.community?.name}\n focusHeading\n imageUrl={\n item.image ?? item.images[0] ?? auction.configuration.image ?? undefined\n }\n itemName={item.name}\n outcome={outcome}\n primaryAction={\n props.returnToItemHref\n ? { href: props.returnToItemHref, label: \"Return to item\" }\n : auctionAction\n }\n secondaryAction={props.returnToItemHref ? auctionAction : undefined}\n style={{\n \"--lockerverse-accent\": auction.community?.color ?? \"#6f8f6d\",\n ...props.style,\n }}\n theme={props.theme}\n />\n );\n}\n\nfunction AuctionItemView(props: LockerverseAuctionItemProps) {\n const {\n auction: initialAuction,\n itemId,\n resumePurchase,\n className,\n theme = \"dark\",\n style,\n } = props;\n const appearanceRoot = useRef<HTMLElement | null>(null);\n const [auction, setAuction] = useState(initialAuction);\n const acceptedHost = useRef(initialAuction);\n const item =\n auction.items.find((candidate) => candidate.id === itemId) ??\n resumePurchase?.item;\n useAuctionBoundary(\n item?.startAt ?? auction.startAt,\n item?.endAt ?? auction.endAt\n );\n const [selection, setSelection] = useState<AuctionSelection | null>(() =>\n resumePurchase\n ? {\n amount: 0,\n includeServiceFee:\n resumePurchase.submission.includeServiceFee ?? false,\n quantity: resumePurchase.submission.quantity,\n }\n : null\n );\n const [interactionLocked, setInteractionLocked] = useState(\n Boolean(resumePurchase)\n );\n const viewMounted = useRef<boolean>(true);\n const hostCallbacks = useRef(props);\n hostCallbacks.current = props;\n const reportedLock = useRef<boolean | null>(null);\n const updateInteractionLock = useCallback((locked: boolean) => {\n // biome-ignore lint/suspicious/noUnnecessaryConditions: Effect cleanup changes this ref outside the callback.\n if (viewMounted.current) {\n setInteractionLocked(locked);\n }\n if (reportedLock.current !== locked) {\n reportedLock.current = locked;\n notifyHostCallback(hostCallbacks.current.onInteractionLockChange, locked);\n }\n }, []);\n const hasRecovery = Boolean(resumePurchase);\n useEffect(() => {\n viewMounted.current = true;\n updateInteractionLock(hasRecovery);\n return () => {\n viewMounted.current = false;\n };\n }, [hasRecovery, updateInteractionLock]);\n const [contact, setContact] = useState({ email: \"\", phone: \"\" });\n const [paying, setPaying] = useState(Boolean(resumePurchase));\n const [notice, setNotice] = useState<string | null>(null);\n const [outcome, setOutcome] = useState<LockerverseAuctionOutcome | null>(\n null\n );\n\n useEffect(() => {\n if (\n !(paying || interactionLocked || resumePurchase) &&\n acceptedHost.current !== initialAuction\n ) {\n acceptedHost.current = initialAuction;\n setAuction(initialAuction);\n }\n }, [initialAuction, paying, interactionLocked, resumePurchase]);\n\n function review(current: LockerverseAuction, message: string) {\n updateInteractionLock(false);\n // The checkout just fetched this snapshot. Do not restore an older host\n // snapshot that arrived while payment was open; accept its next refresh.\n acceptedHost.current = hostCallbacks.current.auction;\n setAuction(current);\n setSelection(null);\n setPaying(false);\n setNotice(message);\n }\n function continueToPayment(next: AuctionSelection) {\n setNotice(null);\n setSelection(next);\n setPaying(true);\n }\n if (!item) {\n return (\n <div>\n <p role=\"alert\">This auction item is no longer available.</p>\n <AuctionBackAction href={props.backHref} onBack={props.onBack}>\n Back to auction items\n </AuctionBackAction>\n </div>\n );\n }\n if (outcome) {\n return (\n <AuctionItemResult\n {...props}\n auction={auction}\n item={item}\n outcome={outcome}\n />\n );\n }\n return (\n <section\n className={[\"lockerverse-auctions\", className].filter(Boolean).join(\" \")}\n data-lockerverse-theme={theme}\n ref={appearanceRoot}\n style={{\n \"--lockerverse-accent\": auction.community?.color ?? \"#6f8f6d\",\n ...style,\n }}\n >\n {interactionLocked ? null : (\n <AuctionBackAction\n className=\"lockerverse-auctions__back\"\n href={props.backHref}\n onBack={props.onBack}\n >\n <ChevronLeft aria-hidden=\"true\" size={16} /> All items\n </AuctionBackAction>\n )}\n <div className=\"lockerverse-auctions__detail\">\n <AuctionItemDetails\n auction={auction}\n galleryImageSizes={props.galleryImageSizes}\n item={item}\n itemHeadingLevel={props.itemHeadingLevel}\n />\n <div className=\"lockerverse-auctions__transaction\">\n {getAuctionDisplayStatus(auction, item) === \"active\" ? (\n <AuctionProgress buyNow={item.saleMode === \"buy_now\"} />\n ) : null}\n {notice ? (\n <p className=\"lockerverse-auctions__notice\" role=\"alert\">\n {notice}\n </p>\n ) : null}\n {paying && selection ? (\n <AuctionPaymentLoader\n {...props}\n appearanceRoot={appearanceRoot}\n auction={auction}\n communityName={props.communityName ?? auction.community?.name}\n contact={contact}\n interactionLocked={interactionLocked}\n item={item}\n onBack={() => setPaying(false)}\n onContactChange={setContact}\n onIncludeServiceFeeChange={(includeServiceFee) =>\n setSelection((current) =>\n current\n ? {\n ...current,\n includeServiceFee:\n auction.serviceFeeEnabled && includeServiceFee,\n }\n : current\n )\n }\n onInteractionLockChange={updateInteractionLock}\n onResult={setOutcome}\n onReview={review}\n selection={selection}\n />\n ) : (\n <AuctionItemSelection\n auction={auction}\n backHref={props.backHref}\n initialSelection={selection}\n item={item}\n itemHeadingLevel={props.itemHeadingLevel}\n onBack={props.onBack}\n onContinue={continueToPayment}\n onError={setNotice}\n />\n )}\n {interactionLocked ? null : (\n <AuctionBackAction\n className=\"lockerverse-auctions__footer-back\"\n href={props.backHref}\n onBack={props.onBack}\n >\n Back to auction items <ArrowRight aria-hidden=\"true\" size={16} />\n </AuctionBackAction>\n )}\n </div>\n </div>\n </section>\n );\n}\n\nexport function LockerverseAuctionItem(props: LockerverseAuctionItemProps) {\n const identity = useRef({\n auctionId: props.auction.id,\n client: props.client,\n itemId: props.itemId,\n });\n if (\n identity.current.client !== props.client ||\n identity.current.auctionId !== props.auction.id ||\n identity.current.itemId !== props.itemId\n ) {\n throw new TypeError(\n \"Auction item identity cannot change. Remount with a new React key.\"\n );\n }\n if (\n props.resumePurchase &&\n (props.resumePurchase.auctionId !== props.auction.id ||\n props.resumePurchase.itemId !== props.itemId ||\n props.resumePurchase.item.id !== props.itemId ||\n props.resumePurchase.item.auctionId !== props.auction.id)\n ) {\n throw new TypeError(\n \"The purchase recovery record belongs to a different auction item.\"\n );\n }\n // Keep the view mounted when a refreshed host snapshot removes the item.\n // Its transaction snapshot remains authoritative until it is safe to leave.\n return (\n <AuctionImageMediaBase.Provider value={props.auction.mediaBaseUrl}>\n <AuctionItemView {...props} />\n </AuctionImageMediaBase.Provider>\n );\n}\n"],"mappings":"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"}
|
package/guides/auctions.md
CHANGED
package/guides/events.md
CHANGED
package/guides/integration.md
CHANGED
package/guides/signup.md
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lockerverse/react",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.194",
|
|
4
4
|
"description": "Tree-shakable React payment and signup UI for Lockerverse",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -136,7 +136,7 @@
|
|
|
136
136
|
"embla-carousel-react": "8.6.0",
|
|
137
137
|
"lucide-react": "0.536.0",
|
|
138
138
|
"valibot": "1.4.2",
|
|
139
|
-
"@lockerverse/sdk": "0.2.
|
|
139
|
+
"@lockerverse/sdk": "0.2.194"
|
|
140
140
|
},
|
|
141
141
|
"devDependencies": {
|
|
142
142
|
"@size-limit/file": "13.0.3",
|