@lockerverse/react 0.2.155 → 0.2.157
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/README.md +14 -57
- package/dist/auction-catalog.css +3 -1
- package/dist/auction-item-layout.css +3 -0
- package/dist/auction-item.d.ts +2 -0
- package/dist/auction-item.d.ts.map +1 -1
- package/dist/auction-item.js +1 -1
- package/dist/auction-item.js.map +1 -1
- package/dist/lockerverse-auction-item-card.d.ts +5 -1
- package/dist/lockerverse-auction-item-card.d.ts.map +1 -1
- package/dist/lockerverse-auction.js +1 -1
- package/dist/lockerverse-auction.js.map +1 -1
- package/dist/use-auction-boundary.js +1 -1
- package/dist/use-auction-boundary.js.map +1 -1
- package/guides/auctions.md +547 -0
- package/guides/events.md +100 -0
- package/guides/integration.md +259 -0
- package/guides/payment-widgets.md +704 -0
- package/guides/signup.md +94 -0
- package/package.json +7 -5
|
@@ -23,6 +23,10 @@ type LockerverseAuctionProps = {
|
|
|
23
23
|
/** Native links preserve opening filters and items in another tab. */
|
|
24
24
|
getFilterHref?: (filter: LockerverseAuctionItemFilter) => string;
|
|
25
25
|
getItemHref?: (auction: LockerverseAuction, item: LockerverseAuctionItem) => string;
|
|
26
|
+
/** Keep configured positions by default, or show live, upcoming, then closed items. */
|
|
27
|
+
itemOrder?: "position" | "availability";
|
|
28
|
+
/** Native URL for returning to the auction list. */
|
|
29
|
+
backHref?: string;
|
|
26
30
|
/** Rotate catalog photos. Static images are the default. */
|
|
27
31
|
autoRotateImages?: boolean;
|
|
28
32
|
theme?: LockerverseTheme;
|
|
@@ -51,7 +55,7 @@ declare const FILTERS: readonly [{
|
|
|
51
55
|
}];
|
|
52
56
|
type LockerverseAuctionItemFilter = (typeof FILTERS)[number]["value"];
|
|
53
57
|
/** Display one loaded auction. Fetching and item navigation stay with the host. */
|
|
54
|
-
declare function LockerverseAuction$1({ auction, onSelectItem, filter: controlledFilter, onFilterChange, getFilterHref, getItemHref, autoRotateImages, theme, style, className, showFilters, showHeader, showLineup, onBack, renderItem }: LockerverseAuctionProps): import("react").JSX.Element;
|
|
58
|
+
declare function LockerverseAuction$1({ auction, onSelectItem, filter: controlledFilter, onFilterChange, getFilterHref, getItemHref, itemOrder, backHref, autoRotateImages, theme, style, className, showFilters, showHeader, showLineup, onBack, renderItem }: LockerverseAuctionProps): import("react").JSX.Element;
|
|
55
59
|
//#endregion
|
|
56
60
|
//#region src/lockerverse-auction-item-card.d.ts
|
|
57
61
|
type LockerverseAuctionItemCardProps = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockerverse-auction-item-card.d.ts","names":[],"sources":["../src/lockerverse-auction.tsx","../src/lockerverse-auction-item-card.tsx"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"lockerverse-auction-item-card.d.ts","names":[],"sources":["../src/lockerverse-auction.tsx","../src/lockerverse-auction-item-card.tsx"],"mappings":";;;;KAkBY;EACV,SAAS;EACT,MAAM;;EAEN,QAAQ;;EAER;EACA;;EAEA,OAAO;EACP,QAAQ;;KAEE;EACV,SAAS;EACT,gBAAgB,SAAS,oBAAS,MAAM;;EAExC,SAAS;EACT,kBAAkB,QAAQ;;EAE1B,iBAAiB,QAAQ;EACzB,eAAe,SAAS,oBAAS,MAAM;;EAEvC;;EAEA;;EAEA;EACA,QAAQ;EACR,QAAQ;EACR;EACA;EACA;;EAEA;EACA;;EAEA,cAAc,SAAS,wCAAwC;;cAE3D;;;;;;;;;;;;;KAMM,uCAAuC;;iBAGnC,uBACd,SACA,cACA,QAAQ,kBACR,gBACA,eACA,aACA,WACA,UACA,kBACA,OACA,OACA,WACA,aACA,YACA,YACA,QACA,cACC,0CAAuB,IAAA;;;KC9Dd;EACV,SAAS;EACT,MAAM;EACN;EACA;;EAEA;EACA,QAAQ;;EAER;EACA,QAAQ;EACR;EACA;EACA;;iBAoCc,6BACd,SACA,MACA,UACA,MACA,kBACA,OACA,WACA,OACA,iBACA,aACA,cACC,kDAA+B,IAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,c as t,i as n,
|
|
1
|
+
import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"./use-auction-boundary.js";import{t as l}from"./auction-image.js";import{ArrowRight as u,ChevronLeft as d,Clock3 as f,Gavel as p,ShoppingBag as m}from"lucide-react";import{useEffect as h,useMemo as g,useRef as _,useState as v}from"react";import{Fragment as y,jsx as b,jsxs as x}from"react/jsx-runtime";const S={active:`Live now`,draft:`Coming soon`,finished:`Closed`};function C({images:e,autoRotate:t=!1,fallback:n,name:r}){let a=g(()=>{let t=[...new Set(e?.filter(Boolean))];return!t.length&&n&&t.push(n),t},[e,n]),[o,s]=v(0),{ref:c,visible:u}=i(),[d,f]=v(!0),[p,m]=v(!1),y=_(new Set),x=a.length,S=t&&x?o%x:0;return h(()=>{let e=window.matchMedia(`(prefers-reduced-motion: reduce)`),t=()=>f(e.matches);t(),e.addEventListener(`change`,t);let n=c.current?.closest(`article`),r=()=>m(!!n?.matches(`:hover, :focus-within`)),i=e=>m(!!(n?.matches(`:hover`)||e.relatedTarget instanceof Node&&n?.contains(e.relatedTarget)));return r(),n?.addEventListener(`mouseenter`,r),n?.addEventListener(`mouseleave`,r),n?.addEventListener(`focusin`,r),n?.addEventListener(`focusout`,i),()=>{e.removeEventListener(`change`,t),n?.removeEventListener(`mouseenter`,r),n?.removeEventListener(`mouseleave`,r),n?.removeEventListener(`focusin`,r),n?.removeEventListener(`focusout`,i)}},[c]),h(()=>{if(!t||x<2||!u||d||p)return;let e=window.setInterval(()=>{s(e=>y.current.has(a[(e+1)%x]??``)?(e+1)%x:e)},5e3);return()=>window.clearInterval(e)},[t,x,a,u,d,p]),b(`div`,{className:`lockerverse-auctions__catalog-images`,ref:c,children:x?[S,...t&&x>1?[(S+1)%x]:[]].map(e=>b(l,{alt:e===S?r:``,"aria-hidden":e!==S,className:`lockerverse-auctions__catalog-photo`,"data-visible":e===S,height:500,loading:`lazy`,maxWidth:960,onLoad:()=>y.current.add(a[e]??``),sizes:`auto, (max-width: 719px) 100vw, (max-width: 1231px) 50vw, 33vw`,src:a[e],width:640},a[e])):null})}function w({icon:e,label:t,value:n}){return x(`div`,{className:`lockerverse-auctions__catalog-metric`,children:[x(`dt`,{children:[e,t]}),b(`dd`,{children:n})]})}function T({auction:t,status:n=e(t),item:r}){let i=``;return n===`draft`&&(i=!r&&Date.parse(t.startAt)<=Date.now()?`Next opens `:`Opens `),n===`active`&&(i=r?`Closes `:`Ends `),x(`span`,{className:`lockerverse-auctions__catalog-timing`,children:[i,o(t,n,r)]})}function E(e,t){if(e.saleMode===`buy_now`){let r=s(e),i=t===`active`?`Buy now`:S[t];return{chip:r?`Sold out`:i,cta:r?`Sold out`:{active:`Buy now`,draft:`Preview item`,finished:`View item`}[t],price:n(e.buyNowPriceAmount??0),priceLabel:`Buy Now`,secondary:e.availableQuantity===null?`Available`:String(e.availableQuantity)}}return{chip:t===`active`?`Live`:S[t],cta:{active:`Bid now`,draft:`Preview item`,finished:`View item`}[t],price:t===`finished`&&!e.maxBidAmount?`No bids`:n(e.maxBidAmount??0),priceLabel:t===`finished`?`Final bid`:`Current`,secondary:n(e.minBidAmount??0)}}function D({auction:n,item:r,onSelect:i,href:a,autoRotateImages:o=!1,theme:s=`dark`,className:l,style:d,showDescription:h=!0,showMetrics:g=!0,showTiming:_=!0}){c(r.startAt??n.startAt,r.endAt??n.endAt);let v=e(n,r),y=r.saleMode===`buy_now`,S=E(r,v);return b(`div`,{className:[`lockerverse-auctions`,`lockerverse-auctions--card`,l].filter(Boolean).join(` `),"data-lockerverse-theme":s,style:d,children:x(`article`,{className:`lockerverse-auctions__catalog-card`,children:[a?b(`a`,{"aria-label":`View ${r.name}`,className:`lockerverse-auctions__catalog-select`,href:a,onClick:e=>{i&&e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&(e.preventDefault(),i())},children:x(`span`,{className:`lockerverse-auctions__visually-hidden`,children:[`View `,r.name]})}):b(`button`,{"aria-label":`View ${r.name}`,className:`lockerverse-auctions__catalog-select`,onClick:i,type:`button`}),x(`div`,{className:`lockerverse-auctions__catalog-media`,children:[b(C,{autoRotate:o,fallback:r.image||n.configuration.image||n.community?.banner||n.community?.thumbnail,images:r.images,name:r.name}),x(`div`,{className:`lockerverse-auctions__catalog-chips`,children:[b(`span`,{className:`lockerverse-auctions__catalog-chip`,"data-live":v===`active`,children:S.chip}),_?b(T,{auction:n,item:r,status:v}):null]}),g?x(`dl`,{className:`lockerverse-auctions__catalog-metrics`,children:[b(w,{icon:b(y?m:p,{"aria-hidden":`true`,size:16}),label:S.priceLabel,value:S.price}),b(w,{icon:b(f,{"aria-hidden":`true`,size:16}),label:y?`Available`:`Floor`,value:S.secondary})]}):null]}),x(`div`,{className:`lockerverse-auctions__catalog-body`,children:[b(`h3`,{children:r.name}),h?b(t,{className:`lockerverse-auctions__catalog-description`,description:r.description||`View auction item details.`}):null,b(`div`,{className:`lockerverse-auctions__catalog-footer lockerverse-auctions__catalog-footer--item`,children:x(`span`,{className:`lockerverse-auctions__catalog-cta`,children:[S.cta,b(u,{"aria-hidden":`true`,size:16})]})})]})]})})}const O=[{label:`All`,value:`all`},{label:`Live`,value:`active`},{label:`Upcoming`,value:`draft`},{label:`Closed`,value:`finished`}];function k({auction:e,onSelectItem:t,filter:n,onFilterChange:r,getFilterHref:i,getItemHref:a,itemOrder:o=`position`,backHref:s,autoRotateImages:c=!1,theme:l=`dark`,style:u,className:d,showFilters:f=!0,showHeader:p=!0,showLineup:m=!1,onBack:h,renderItem:g}){return b(`section`,{"aria-label":e.name,className:[`lockerverse-auctions`,`lockerverse-auctions--catalog`,d].filter(Boolean).join(` `),"data-lockerverse-theme":l,style:u,children:b(A,{auction:e,...t?{onSelectItem:t}:{},...n?{filter:n}:{},...r?{onFilterChange:r}:{},...i?{getFilterHref:i}:{},...a?{getItemHref:a}:{},itemOrder:o,...s?{backHref:s}:{},autoRotateImages:c,showFilters:f,showHeader:p,showLineup:m,theme:l,...u?{style:u}:{},...h?{onBack:h}:{},...g?{renderItem:g}:{}})})}function A({auction:n,onSelectItem:i,filter:s,onFilterChange:l,getFilterHref:u,getItemHref:f,itemOrder:p=`position`,backHref:m,autoRotateImages:g=!1,theme:S=`dark`,style:C,showFilters:w=!0,showHeader:T=!0,showLineup:E=!1,onBack:k,renderItem:A}){c(n.startAt,n.endAt,n.items);let[j,M]=v({auctionId:n.id,value:`all`}),N=_(null),P=_(null),F=w?s??(j.auctionId===n.id?j.value:`all`):`all`;h(()=>{M({auctionId:n.id,value:`all`})},[n.id,w]);let I=e=>{M({auctionId:n.id,value:e}),l?.(e)},L=a(n),R=!!(k||m);h(()=>{R&&(N.current??P.current)?.focus()},[n.id,R,T]);let z=C?Object.fromEntries(Object.entries(C).filter(([e])=>e.startsWith(`--lockerverse-`))):void 0,B={active:0,draft:1,finished:2},V=[...n.items].sort((t,r)=>(p===`availability`?B[e(n,t)]-B[e(n,r)]:0)||t.position-r.position||t.createdAt.localeCompare(r.createdAt)),H=V.filter(t=>F===`all`||e(n,t)===F);return x(y,{children:[x(r,{className:`lockerverse-auctions__catalog-back`,elementRef:e=>{P.current=e},href:m,onBack:k,children:[b(d,{"aria-hidden":`true`,size:16}),`Auctions`]}),T?x(`header`,{className:`lockerverse-auctions__catalog-header`,children:[b(`h2`,{ref:N,tabIndex:-1,children:n.name}),n.status!==`finished`&&L?x(`p`,{className:`lockerverse-auctions__catalog-next`,children:[`Next opens `,o(n,`draft`,L)]}):null,n.description?b(t,{description:n.description}):null]}):null,E?x(`div`,{className:`lockerverse-auctions__catalog-lineup`,children:[x(`div`,{children:[b(`h3`,{children:`Auction lineup`}),b(`p`,{children:`Browse the current collection.`})]}),x(`span`,{children:[H.length,` `,H.length===1?`item`:`items`]})]}):null,w?b(`fieldset`,{"aria-label":`Filter auction items`,className:`lockerverse-auctions__catalog-filters`,children:O.map(t=>{let r=u?.(t.value),i=x(y,{children:[t.label,b(`span`,{children:t.value===`all`?V.length:V.filter(r=>e(n,r)===t.value).length})]});return r?b(`a`,{"aria-current":F===t.value?`page`:void 0,href:r,onClick:e=>{l&&e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&(e.preventDefault(),I(t.value))},children:i},t.value):b(`button`,{"aria-pressed":F===t.value,onClick:()=>I(t.value),type:`button`,children:i},t.value)})}):null,H.length?b(`ul`,{className:`lockerverse-auctions__catalog-grid`,children:H.map(t=>{let r={auction:n,item:t,onSelect:()=>i?.(n,t),status:e(n,t),theme:S};f&&(r.href=f(n,t)),z&&(r.style=z);let{onSelect:a,...o}=r;return b(`li`,{children:A?A(r):b(D,{...o,...i?{onSelect:a}:{},autoRotateImages:g})},t.id)})}):b(`p`,{className:`lockerverse-auctions__catalog-empty`,children:`No items match this auction view.`})]})}export{w as a,C as i,k as n,S as o,D as r,T as s,A as t};
|
|
2
2
|
//# sourceMappingURL=lockerverse-auction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockerverse-auction.js","names":["formatMoney"],"sources":["../src/auction-catalog-parts.tsx","../src/lockerverse-auction-item-card.tsx","../src/lockerverse-auction.tsx"],"sourcesContent":["import type {\n LockerverseAuction as Auction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n formatAuctionBoundary,\n getAuctionDisplayStatus,\n} from \"./auction-display.ts\";\nimport { AuctionImage } from \"./auction-image.tsx\";\nimport { useAuctionVisibility } from \"./use-auction-visibility.ts\";\nexport const STATUS_LABELS = {\n active: \"Live now\",\n draft: \"Coming soon\",\n finished: \"Closed\",\n} satisfies Record<LockerverseAuctionStatus, string>;\nexport function CatalogImage({\n images,\n autoRotate = false,\n fallback,\n name,\n}: {\n images?: string[];\n autoRotate?: boolean;\n fallback?: string | null | undefined;\n name: string;\n}) {\n const photos = useMemo(() => {\n const unique = [...new Set(images?.filter(Boolean))];\n if (!unique.length && fallback) {\n unique.push(fallback);\n }\n return unique;\n }, [images, fallback]);\n const [index, setIndex] = useState(0);\n const { ref: imageRef, visible } = useAuctionVisibility<HTMLDivElement>();\n const [reducedMotion, setReducedMotion] = useState(true);\n const [interacting, setInteracting] = useState(false);\n const loaded = useRef(new Set<string>());\n const count = photos.length;\n const current = autoRotate && count ? index % count : 0;\n useEffect(() => {\n const motion = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const updateMotion = () => setReducedMotion(motion.matches);\n updateMotion();\n motion.addEventListener(\"change\", updateMotion);\n const card = imageRef.current?.closest(\"article\");\n const updateInteraction = () =>\n setInteracting(Boolean(card?.matches(\":hover, :focus-within\")));\n const leaveFocus = (event: FocusEvent) =>\n setInteracting(\n Boolean(\n card?.matches(\":hover\") ||\n (event.relatedTarget instanceof Node &&\n card?.contains(event.relatedTarget))\n )\n );\n updateInteraction();\n card?.addEventListener(\"mouseenter\", updateInteraction);\n card?.addEventListener(\"mouseleave\", updateInteraction);\n card?.addEventListener(\"focusin\", updateInteraction);\n card?.addEventListener(\"focusout\", leaveFocus);\n return () => {\n motion.removeEventListener(\"change\", updateMotion);\n card?.removeEventListener(\"mouseenter\", updateInteraction);\n card?.removeEventListener(\"mouseleave\", updateInteraction);\n card?.removeEventListener(\"focusin\", updateInteraction);\n card?.removeEventListener(\"focusout\", leaveFocus);\n };\n }, [imageRef]);\n useEffect(() => {\n if (!autoRotate || count < 2 || !visible || reducedMotion || interacting) {\n return;\n }\n const timer = window.setInterval(() => {\n setIndex((previous) =>\n loaded.current.has(photos[(previous + 1) % count] ?? \"\")\n ? (previous + 1) % count\n : previous\n );\n }, 5000);\n return () => window.clearInterval(timer);\n }, [autoRotate, count, photos, visible, reducedMotion, interacting]);\n return (\n <div className=\"lockerverse-auctions__catalog-images\" ref={imageRef}>\n {count\n ? [\n current,\n ...(autoRotate && count > 1 ? [(current + 1) % count] : []),\n ].map((photo) => (\n <AuctionImage\n alt={photo === current ? name : \"\"}\n aria-hidden={photo !== current}\n className=\"lockerverse-auctions__catalog-photo\"\n data-visible={photo === current}\n height={500}\n key={photos[photo]}\n loading=\"lazy\"\n maxWidth={960}\n onLoad={() => loaded.current.add(photos[photo] ?? \"\")}\n sizes=\"auto, (max-width: 719px) 100vw, (max-width: 1231px) 50vw, 33vw\"\n src={photos[photo]}\n width={640}\n />\n ))\n : null}\n </div>\n );\n}\nexport function Metric({\n icon,\n label,\n value,\n}: {\n icon: ReactNode;\n label: string;\n value: string;\n}) {\n return (\n <div className=\"lockerverse-auctions__catalog-metric\">\n <dt>\n {icon}\n {label}\n </dt>\n <dd>{value}</dd>\n </div>\n );\n}\nexport function Timing({\n auction,\n status = getAuctionDisplayStatus(auction),\n item,\n}: {\n auction: Auction;\n status?: LockerverseAuctionStatus;\n item?: LockerverseAuctionItem;\n}) {\n let label = \"\";\n if (status === \"draft\") {\n label =\n !item && Date.parse(auction.startAt) <= Date.now()\n ? \"Next opens \"\n : \"Opens \";\n }\n if (status === \"active\") {\n label = item ? \"Closes \" : \"Ends \";\n }\n return (\n <span className=\"lockerverse-auctions__catalog-timing\">\n {label}\n {formatAuctionBoundary(auction, status, item)}\n </span>\n );\n}\n","import type {\n LockerverseAuction as Auction,\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { ArrowRight, Clock3, Gavel, ShoppingBag } from \"lucide-react\";\nimport {\n CatalogImage,\n Metric,\n STATUS_LABELS,\n Timing,\n} from \"./auction-catalog-parts.tsx\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport {\n formatAuctionMoney as formatMoney,\n getAuctionDisplayStatus,\n isAuctionItemSoldOut,\n} from \"./auction-display.ts\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nexport type LockerverseAuctionItemCardProps = {\n auction: Auction;\n item: AuctionItem;\n onSelect?: () => void;\n href?: string;\n /** Rotate photos every five seconds. Static by default. */\n autoRotateImages?: boolean;\n theme?: LockerverseTheme;\n /** Applied to the scoped card container. */\n className?: string;\n style?: LockerverseStyle;\n showDescription?: boolean;\n showMetrics?: boolean;\n showTiming?: boolean;\n};\nfunction itemCardDisplay(item: AuctionItem, status: LockerverseAuctionStatus) {\n if (item.saleMode === \"buy_now\") {\n const soldOut = isAuctionItemSoldOut(item);\n const availabilityLabel =\n status === \"active\" ? \"Buy now\" : STATUS_LABELS[status];\n const label = soldOut ? \"Sold out\" : availabilityLabel;\n return {\n chip: label,\n cta: soldOut\n ? \"Sold out\"\n : { active: \"Buy now\", draft: \"Preview item\", finished: \"View item\" }[\n status\n ],\n price: formatMoney(item.buyNowPriceAmount ?? 0),\n priceLabel: \"Buy Now\",\n secondary:\n item.availableQuantity === null\n ? \"Available\"\n : String(item.availableQuantity),\n };\n }\n return {\n chip: status === \"active\" ? \"Live\" : STATUS_LABELS[status],\n cta: { active: \"Bid now\", draft: \"Preview item\", finished: \"View item\" }[\n status\n ],\n price:\n status === \"finished\" && !item.maxBidAmount\n ? \"No bids\"\n : formatMoney(item.maxBidAmount ?? 0),\n priceLabel: status === \"finished\" ? \"Final bid\" : \"Current\",\n secondary: formatMoney(item.minBidAmount ?? 0),\n };\n}\nexport function LockerverseAuctionItemCard({\n auction,\n item,\n onSelect,\n href,\n autoRotateImages = false,\n theme = \"dark\",\n className,\n style,\n showDescription = true,\n showMetrics = true,\n showTiming = true,\n}: LockerverseAuctionItemCardProps) {\n useAuctionBoundary(\n item.startAt ?? auction.startAt,\n item.endAt ?? auction.endAt\n );\n const status = getAuctionDisplayStatus(auction, item);\n const buyNow = item.saleMode === \"buy_now\";\n const display = itemCardDisplay(item, status);\n return (\n <div\n className={[\n \"lockerverse-auctions\",\n \"lockerverse-auctions--card\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={style}\n >\n <article className=\"lockerverse-auctions__catalog-card\">\n {href ? (\n <a\n aria-label={`View ${item.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n href={href}\n onClick={(event) => {\n if (\n onSelect &&\n event.button === 0 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n onSelect();\n }\n }}\n >\n <span className=\"lockerverse-auctions__visually-hidden\">\n View {item.name}\n </span>\n </a>\n ) : (\n <button\n aria-label={`View ${item.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n onClick={onSelect}\n type=\"button\"\n />\n )}\n <div className=\"lockerverse-auctions__catalog-media\">\n <CatalogImage\n autoRotate={autoRotateImages}\n fallback={\n item.image ||\n auction.configuration.image ||\n auction.community?.banner ||\n auction.community?.thumbnail\n }\n images={item.images}\n name={item.name}\n />\n <div className=\"lockerverse-auctions__catalog-chips\">\n <span\n className=\"lockerverse-auctions__catalog-chip\"\n data-live={status === \"active\"}\n >\n {display.chip}\n </span>\n {showTiming ? (\n <Timing auction={auction} item={item} status={status} />\n ) : null}\n </div>\n {showMetrics ? (\n <dl className=\"lockerverse-auctions__catalog-metrics\">\n <Metric\n icon={\n buyNow ? (\n <ShoppingBag aria-hidden=\"true\" size={16} />\n ) : (\n <Gavel aria-hidden=\"true\" size={16} />\n )\n }\n label={display.priceLabel}\n value={display.price}\n />\n <Metric\n icon={<Clock3 aria-hidden=\"true\" size={16} />}\n label={buyNow ? \"Available\" : \"Floor\"}\n value={display.secondary}\n />\n </dl>\n ) : null}\n </div>\n <div className=\"lockerverse-auctions__catalog-body\">\n <h3>{item.name}</h3>\n {showDescription ? (\n <AuctionDescription\n className=\"lockerverse-auctions__catalog-description\"\n description={item.description || \"View auction item details.\"}\n />\n ) : null}\n <div className=\"lockerverse-auctions__catalog-footer lockerverse-auctions__catalog-footer--item\">\n <span className=\"lockerverse-auctions__catalog-cta\">\n {display.cta}\n <ArrowRight aria-hidden=\"true\" size={16} />\n </span>\n </div>\n </div>\n </article>\n </div>\n );\n}\n","import type {\n LockerverseAuction as Auction,\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { ChevronLeft } from \"lucide-react\";\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport {\n formatAuctionBoundary,\n getAuctionDisplayStatus,\n getNextAuctionItem,\n} from \"./auction-display.ts\";\nimport { LockerverseAuctionItemCard } from \"./lockerverse-auction-item-card.tsx\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nexport type LockerverseAuctionItemRenderContext = {\n auction: Auction;\n item: AuctionItem;\n /** Effective auction and item status, including elapsed closing dates. */\n status: LockerverseAuctionStatus;\n /** Calls the host selection callback when one is supplied. Use href for native navigation. */\n onSelect: () => void;\n href?: string;\n /** Parent theme and Lockerverse CSS custom properties for default-card reuse. */\n theme: LockerverseTheme;\n style?: LockerverseStyle;\n};\nexport type LockerverseAuctionProps = {\n auction: Auction;\n onSelectItem?: (auction: Auction, item: AuctionItem) => void;\n /** Controlled item status filter. Omit to use the internal filter state. */\n filter?: LockerverseAuctionItemFilter;\n onFilterChange?: (filter: LockerverseAuctionItemFilter) => void;\n /** Native links preserve opening filters and items in another tab. */\n getFilterHref?: (filter: LockerverseAuctionItemFilter) => string;\n getItemHref?: (auction: Auction, item: AuctionItem) => string;\n /** Rotate catalog photos. Static images are the default. */\n autoRotateImages?: boolean;\n theme?: LockerverseTheme;\n style?: LockerverseStyle;\n className?: string;\n showFilters?: boolean;\n showHeader?: boolean;\n /** Show the optional catalog introduction and count. Hidden by default. */\n showLineup?: boolean;\n onBack?: () => void;\n /** Replace the card inside each list item. Keep onSelect connected to your item view. */\n renderItem?: (context: LockerverseAuctionItemRenderContext) => ReactNode;\n};\nconst FILTERS = [\n { label: \"All\", value: \"all\" },\n { label: \"Live\", value: \"active\" },\n { label: \"Upcoming\", value: \"draft\" },\n { label: \"Closed\", value: \"finished\" },\n] as const;\nexport type LockerverseAuctionItemFilter = (typeof FILTERS)[number][\"value\"];\n\n/** Display one loaded auction. Fetching and item navigation stay with the host. */\nexport function LockerverseAuction({\n auction,\n onSelectItem,\n filter: controlledFilter,\n onFilterChange,\n getFilterHref,\n getItemHref,\n autoRotateImages = false,\n theme = \"dark\",\n style,\n className,\n showFilters = true,\n showHeader = true,\n showLineup = false,\n onBack,\n renderItem,\n}: LockerverseAuctionProps) {\n return (\n <section\n aria-label={auction.name}\n className={[\n \"lockerverse-auctions\",\n \"lockerverse-auctions--catalog\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={style}\n >\n <AuctionContent\n auction={auction}\n {...(onSelectItem ? { onSelectItem } : {})}\n {...(controlledFilter ? { filter: controlledFilter } : {})}\n {...(onFilterChange ? { onFilterChange } : {})}\n {...(getFilterHref ? { getFilterHref } : {})}\n {...(getItemHref ? { getItemHref } : {})}\n autoRotateImages={autoRotateImages}\n showFilters={showFilters}\n showHeader={showHeader}\n showLineup={showLineup}\n theme={theme}\n {...(style ? { style } : {})}\n {...(onBack ? { onBack } : {})}\n {...(renderItem ? { renderItem } : {})}\n />\n </section>\n );\n}\n\n/** Shared content without a second themed container when used in the browser. */\nexport function AuctionContent({\n auction,\n onSelectItem,\n filter: controlledFilter,\n onFilterChange,\n getFilterHref,\n getItemHref,\n autoRotateImages = false,\n theme = \"dark\",\n style,\n showFilters = true,\n showHeader = true,\n showLineup = false,\n onBack,\n renderItem,\n}: LockerverseAuctionProps) {\n useAuctionBoundary(auction.startAt, auction.endAt, auction.items);\n const [filterState, setFilterState] = useState<{\n auctionId: string;\n value: LockerverseAuctionItemFilter;\n }>({ auctionId: auction.id, value: \"all\" });\n const headingRef = useRef<HTMLHeadingElement>(null);\n const backRef = useRef<HTMLButtonElement>(null);\n const filter = showFilters\n ? (controlledFilter ??\n (filterState.auctionId === auction.id ? filterState.value : \"all\"))\n : \"all\";\n useEffect(() => {\n setFilterState({ auctionId: auction.id, value: \"all\" });\n }, [auction.id, showFilters]);\n const changeFilter = (value: LockerverseAuctionItemFilter) => {\n setFilterState({ auctionId: auction.id, value });\n onFilterChange?.(value);\n };\n const nextItem = getNextAuctionItem(auction);\n const focusHeading = Boolean(onBack);\n useEffect(() => {\n if (focusHeading) {\n (headingRef.current ?? backRef.current)?.focus();\n }\n }, [auction.id, focusHeading, showHeader]);\n const cardStyle = style\n ? Object.fromEntries(\n Object.entries(style).filter(([key]) =>\n key.startsWith(\"--lockerverse-\")\n )\n )\n : undefined;\n const items = [...auction.items].sort(\n (left, right) =>\n left.position - right.position ||\n left.createdAt.localeCompare(right.createdAt)\n );\n const filtered = items.filter(\n (item) =>\n filter === \"all\" || getAuctionDisplayStatus(auction, item) === filter\n );\n return (\n <>\n {onBack ? (\n <button\n className=\"lockerverse-auctions__catalog-back\"\n onClick={onBack}\n ref={backRef}\n type=\"button\"\n >\n <ChevronLeft aria-hidden=\"true\" size={16} />\n Auctions\n </button>\n ) : null}\n {showHeader ? (\n <header className=\"lockerverse-auctions__catalog-header\">\n <h2 ref={headingRef} tabIndex={-1}>\n {auction.name}\n </h2>\n {auction.status !== \"finished\" && nextItem ? (\n <p className=\"lockerverse-auctions__catalog-next\">\n Next opens {formatAuctionBoundary(auction, \"draft\", nextItem)}\n </p>\n ) : null}\n {auction.description ? (\n <AuctionDescription description={auction.description} />\n ) : null}\n </header>\n ) : null}\n {showLineup ? (\n <div className=\"lockerverse-auctions__catalog-lineup\">\n <div>\n <h3>Auction lineup</h3>\n <p>Browse the current collection.</p>\n </div>\n <span>\n {filtered.length} {filtered.length === 1 ? \"item\" : \"items\"}\n </span>\n </div>\n ) : null}\n {showFilters ? (\n <fieldset\n aria-label=\"Filter auction items\"\n className=\"lockerverse-auctions__catalog-filters\"\n >\n {FILTERS.map((option) => {\n const href = getFilterHref?.(option.value);\n const label = (\n <>\n {option.label}\n <span>\n {option.value === \"all\"\n ? items.length\n : items.filter(\n (item) =>\n getAuctionDisplayStatus(auction, item) ===\n option.value\n ).length}\n </span>\n </>\n );\n return href ? (\n <a\n aria-current={filter === option.value ? \"page\" : undefined}\n href={href}\n key={option.value}\n onClick={(event) => {\n if (\n onFilterChange &&\n event.button === 0 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n changeFilter(option.value);\n }\n }}\n >\n {label}\n </a>\n ) : (\n <button\n aria-pressed={filter === option.value}\n key={option.value}\n onClick={() => changeFilter(option.value)}\n type=\"button\"\n >\n {label}\n </button>\n );\n })}\n </fieldset>\n ) : null}\n {filtered.length ? (\n <ul className=\"lockerverse-auctions__catalog-grid\">\n {filtered.map((item) => {\n const context: LockerverseAuctionItemRenderContext = {\n auction,\n item,\n onSelect: () => onSelectItem?.(auction, item),\n status: getAuctionDisplayStatus(auction, item),\n theme,\n };\n if (getItemHref) {\n context.href = getItemHref(auction, item);\n }\n if (cardStyle) {\n context.style = cardStyle;\n }\n const { onSelect, ...cardContext } = context;\n return (\n <li key={item.id}>\n {renderItem ? (\n renderItem(context)\n ) : (\n <LockerverseAuctionItemCard\n {...cardContext}\n {...(onSelectItem ? { onSelect } : {})}\n autoRotateImages={autoRotateImages}\n />\n )}\n </li>\n );\n })}\n </ul>\n ) : (\n <p className=\"lockerverse-auctions__catalog-empty\">\n No items match this auction view.\n </p>\n )}\n </>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lockerverse-auction.js","names":["formatMoney"],"sources":["../src/auction-catalog-parts.tsx","../src/lockerverse-auction-item-card.tsx","../src/lockerverse-auction.tsx"],"sourcesContent":["import type {\n LockerverseAuction as Auction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n formatAuctionBoundary,\n getAuctionDisplayStatus,\n} from \"./auction-display.ts\";\nimport { AuctionImage } from \"./auction-image.tsx\";\nimport { useAuctionVisibility } from \"./use-auction-visibility.ts\";\nexport const STATUS_LABELS = {\n active: \"Live now\",\n draft: \"Coming soon\",\n finished: \"Closed\",\n} satisfies Record<LockerverseAuctionStatus, string>;\nexport function CatalogImage({\n images,\n autoRotate = false,\n fallback,\n name,\n}: {\n images?: string[];\n autoRotate?: boolean;\n fallback?: string | null | undefined;\n name: string;\n}) {\n const photos = useMemo(() => {\n const unique = [...new Set(images?.filter(Boolean))];\n if (!unique.length && fallback) {\n unique.push(fallback);\n }\n return unique;\n }, [images, fallback]);\n const [index, setIndex] = useState(0);\n const { ref: imageRef, visible } = useAuctionVisibility<HTMLDivElement>();\n const [reducedMotion, setReducedMotion] = useState(true);\n const [interacting, setInteracting] = useState(false);\n const loaded = useRef(new Set<string>());\n const count = photos.length;\n const current = autoRotate && count ? index % count : 0;\n useEffect(() => {\n const motion = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const updateMotion = () => setReducedMotion(motion.matches);\n updateMotion();\n motion.addEventListener(\"change\", updateMotion);\n const card = imageRef.current?.closest(\"article\");\n const updateInteraction = () =>\n setInteracting(Boolean(card?.matches(\":hover, :focus-within\")));\n const leaveFocus = (event: FocusEvent) =>\n setInteracting(\n Boolean(\n card?.matches(\":hover\") ||\n (event.relatedTarget instanceof Node &&\n card?.contains(event.relatedTarget))\n )\n );\n updateInteraction();\n card?.addEventListener(\"mouseenter\", updateInteraction);\n card?.addEventListener(\"mouseleave\", updateInteraction);\n card?.addEventListener(\"focusin\", updateInteraction);\n card?.addEventListener(\"focusout\", leaveFocus);\n return () => {\n motion.removeEventListener(\"change\", updateMotion);\n card?.removeEventListener(\"mouseenter\", updateInteraction);\n card?.removeEventListener(\"mouseleave\", updateInteraction);\n card?.removeEventListener(\"focusin\", updateInteraction);\n card?.removeEventListener(\"focusout\", leaveFocus);\n };\n }, [imageRef]);\n useEffect(() => {\n if (!autoRotate || count < 2 || !visible || reducedMotion || interacting) {\n return;\n }\n const timer = window.setInterval(() => {\n setIndex((previous) =>\n loaded.current.has(photos[(previous + 1) % count] ?? \"\")\n ? (previous + 1) % count\n : previous\n );\n }, 5000);\n return () => window.clearInterval(timer);\n }, [autoRotate, count, photos, visible, reducedMotion, interacting]);\n return (\n <div className=\"lockerverse-auctions__catalog-images\" ref={imageRef}>\n {count\n ? [\n current,\n ...(autoRotate && count > 1 ? [(current + 1) % count] : []),\n ].map((photo) => (\n <AuctionImage\n alt={photo === current ? name : \"\"}\n aria-hidden={photo !== current}\n className=\"lockerverse-auctions__catalog-photo\"\n data-visible={photo === current}\n height={500}\n key={photos[photo]}\n loading=\"lazy\"\n maxWidth={960}\n onLoad={() => loaded.current.add(photos[photo] ?? \"\")}\n sizes=\"auto, (max-width: 719px) 100vw, (max-width: 1231px) 50vw, 33vw\"\n src={photos[photo]}\n width={640}\n />\n ))\n : null}\n </div>\n );\n}\nexport function Metric({\n icon,\n label,\n value,\n}: {\n icon: ReactNode;\n label: string;\n value: string;\n}) {\n return (\n <div className=\"lockerverse-auctions__catalog-metric\">\n <dt>\n {icon}\n {label}\n </dt>\n <dd>{value}</dd>\n </div>\n );\n}\nexport function Timing({\n auction,\n status = getAuctionDisplayStatus(auction),\n item,\n}: {\n auction: Auction;\n status?: LockerverseAuctionStatus;\n item?: LockerverseAuctionItem;\n}) {\n let label = \"\";\n if (status === \"draft\") {\n label =\n !item && Date.parse(auction.startAt) <= Date.now()\n ? \"Next opens \"\n : \"Opens \";\n }\n if (status === \"active\") {\n label = item ? \"Closes \" : \"Ends \";\n }\n return (\n <span className=\"lockerverse-auctions__catalog-timing\">\n {label}\n {formatAuctionBoundary(auction, status, item)}\n </span>\n );\n}\n","import type {\n LockerverseAuction as Auction,\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { ArrowRight, Clock3, Gavel, ShoppingBag } from \"lucide-react\";\nimport {\n CatalogImage,\n Metric,\n STATUS_LABELS,\n Timing,\n} from \"./auction-catalog-parts.tsx\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport {\n formatAuctionMoney as formatMoney,\n getAuctionDisplayStatus,\n isAuctionItemSoldOut,\n} from \"./auction-display.ts\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nexport type LockerverseAuctionItemCardProps = {\n auction: Auction;\n item: AuctionItem;\n onSelect?: () => void;\n href?: string;\n /** Rotate photos every five seconds. Static by default. */\n autoRotateImages?: boolean;\n theme?: LockerverseTheme;\n /** Applied to the scoped card container. */\n className?: string;\n style?: LockerverseStyle;\n showDescription?: boolean;\n showMetrics?: boolean;\n showTiming?: boolean;\n};\nfunction itemCardDisplay(item: AuctionItem, status: LockerverseAuctionStatus) {\n if (item.saleMode === \"buy_now\") {\n const soldOut = isAuctionItemSoldOut(item);\n const availabilityLabel =\n status === \"active\" ? \"Buy now\" : STATUS_LABELS[status];\n const label = soldOut ? \"Sold out\" : availabilityLabel;\n return {\n chip: label,\n cta: soldOut\n ? \"Sold out\"\n : { active: \"Buy now\", draft: \"Preview item\", finished: \"View item\" }[\n status\n ],\n price: formatMoney(item.buyNowPriceAmount ?? 0),\n priceLabel: \"Buy Now\",\n secondary:\n item.availableQuantity === null\n ? \"Available\"\n : String(item.availableQuantity),\n };\n }\n return {\n chip: status === \"active\" ? \"Live\" : STATUS_LABELS[status],\n cta: { active: \"Bid now\", draft: \"Preview item\", finished: \"View item\" }[\n status\n ],\n price:\n status === \"finished\" && !item.maxBidAmount\n ? \"No bids\"\n : formatMoney(item.maxBidAmount ?? 0),\n priceLabel: status === \"finished\" ? \"Final bid\" : \"Current\",\n secondary: formatMoney(item.minBidAmount ?? 0),\n };\n}\nexport function LockerverseAuctionItemCard({\n auction,\n item,\n onSelect,\n href,\n autoRotateImages = false,\n theme = \"dark\",\n className,\n style,\n showDescription = true,\n showMetrics = true,\n showTiming = true,\n}: LockerverseAuctionItemCardProps) {\n useAuctionBoundary(\n item.startAt ?? auction.startAt,\n item.endAt ?? auction.endAt\n );\n const status = getAuctionDisplayStatus(auction, item);\n const buyNow = item.saleMode === \"buy_now\";\n const display = itemCardDisplay(item, status);\n return (\n <div\n className={[\n \"lockerverse-auctions\",\n \"lockerverse-auctions--card\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={style}\n >\n <article className=\"lockerverse-auctions__catalog-card\">\n {href ? (\n <a\n aria-label={`View ${item.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n href={href}\n onClick={(event) => {\n if (\n onSelect &&\n event.button === 0 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n onSelect();\n }\n }}\n >\n <span className=\"lockerverse-auctions__visually-hidden\">\n View {item.name}\n </span>\n </a>\n ) : (\n <button\n aria-label={`View ${item.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n onClick={onSelect}\n type=\"button\"\n />\n )}\n <div className=\"lockerverse-auctions__catalog-media\">\n <CatalogImage\n autoRotate={autoRotateImages}\n fallback={\n item.image ||\n auction.configuration.image ||\n auction.community?.banner ||\n auction.community?.thumbnail\n }\n images={item.images}\n name={item.name}\n />\n <div className=\"lockerverse-auctions__catalog-chips\">\n <span\n className=\"lockerverse-auctions__catalog-chip\"\n data-live={status === \"active\"}\n >\n {display.chip}\n </span>\n {showTiming ? (\n <Timing auction={auction} item={item} status={status} />\n ) : null}\n </div>\n {showMetrics ? (\n <dl className=\"lockerverse-auctions__catalog-metrics\">\n <Metric\n icon={\n buyNow ? (\n <ShoppingBag aria-hidden=\"true\" size={16} />\n ) : (\n <Gavel aria-hidden=\"true\" size={16} />\n )\n }\n label={display.priceLabel}\n value={display.price}\n />\n <Metric\n icon={<Clock3 aria-hidden=\"true\" size={16} />}\n label={buyNow ? \"Available\" : \"Floor\"}\n value={display.secondary}\n />\n </dl>\n ) : null}\n </div>\n <div className=\"lockerverse-auctions__catalog-body\">\n <h3>{item.name}</h3>\n {showDescription ? (\n <AuctionDescription\n className=\"lockerverse-auctions__catalog-description\"\n description={item.description || \"View auction item details.\"}\n />\n ) : null}\n <div className=\"lockerverse-auctions__catalog-footer lockerverse-auctions__catalog-footer--item\">\n <span className=\"lockerverse-auctions__catalog-cta\">\n {display.cta}\n <ArrowRight aria-hidden=\"true\" size={16} />\n </span>\n </div>\n </div>\n </article>\n </div>\n );\n}\n","import type {\n LockerverseAuction as Auction,\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { ChevronLeft } from \"lucide-react\";\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { AuctionBackAction } from \"./auction-back-action.tsx\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport {\n formatAuctionBoundary,\n getAuctionDisplayStatus,\n getNextAuctionItem,\n} from \"./auction-display.ts\";\nimport { LockerverseAuctionItemCard } from \"./lockerverse-auction-item-card.tsx\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nexport type LockerverseAuctionItemRenderContext = {\n auction: Auction;\n item: AuctionItem;\n /** Effective auction and item status, including elapsed closing dates. */\n status: LockerverseAuctionStatus;\n /** Calls the host selection callback when one is supplied. Use href for native navigation. */\n onSelect: () => void;\n href?: string;\n /** Parent theme and Lockerverse CSS custom properties for default-card reuse. */\n theme: LockerverseTheme;\n style?: LockerverseStyle;\n};\nexport type LockerverseAuctionProps = {\n auction: Auction;\n onSelectItem?: (auction: Auction, item: AuctionItem) => void;\n /** Controlled item status filter. Omit to use the internal filter state. */\n filter?: LockerverseAuctionItemFilter;\n onFilterChange?: (filter: LockerverseAuctionItemFilter) => void;\n /** Native links preserve opening filters and items in another tab. */\n getFilterHref?: (filter: LockerverseAuctionItemFilter) => string;\n getItemHref?: (auction: Auction, item: AuctionItem) => string;\n /** Keep configured positions by default, or show live, upcoming, then closed items. */\n itemOrder?: \"position\" | \"availability\";\n /** Native URL for returning to the auction list. */\n backHref?: string;\n /** Rotate catalog photos. Static images are the default. */\n autoRotateImages?: boolean;\n theme?: LockerverseTheme;\n style?: LockerverseStyle;\n className?: string;\n showFilters?: boolean;\n showHeader?: boolean;\n /** Show the optional catalog introduction and count. Hidden by default. */\n showLineup?: boolean;\n onBack?: () => void;\n /** Replace the card inside each list item. Keep onSelect connected to your item view. */\n renderItem?: (context: LockerverseAuctionItemRenderContext) => ReactNode;\n};\nconst FILTERS = [\n { label: \"All\", value: \"all\" },\n { label: \"Live\", value: \"active\" },\n { label: \"Upcoming\", value: \"draft\" },\n { label: \"Closed\", value: \"finished\" },\n] as const;\nexport type LockerverseAuctionItemFilter = (typeof FILTERS)[number][\"value\"];\n\n/** Display one loaded auction. Fetching and item navigation stay with the host. */\nexport function LockerverseAuction({\n auction,\n onSelectItem,\n filter: controlledFilter,\n onFilterChange,\n getFilterHref,\n getItemHref,\n itemOrder = \"position\",\n backHref,\n autoRotateImages = false,\n theme = \"dark\",\n style,\n className,\n showFilters = true,\n showHeader = true,\n showLineup = false,\n onBack,\n renderItem,\n}: LockerverseAuctionProps) {\n return (\n <section\n aria-label={auction.name}\n className={[\n \"lockerverse-auctions\",\n \"lockerverse-auctions--catalog\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={style}\n >\n <AuctionContent\n auction={auction}\n {...(onSelectItem ? { onSelectItem } : {})}\n {...(controlledFilter ? { filter: controlledFilter } : {})}\n {...(onFilterChange ? { onFilterChange } : {})}\n {...(getFilterHref ? { getFilterHref } : {})}\n {...(getItemHref ? { getItemHref } : {})}\n itemOrder={itemOrder}\n {...(backHref ? { backHref } : {})}\n autoRotateImages={autoRotateImages}\n showFilters={showFilters}\n showHeader={showHeader}\n showLineup={showLineup}\n theme={theme}\n {...(style ? { style } : {})}\n {...(onBack ? { onBack } : {})}\n {...(renderItem ? { renderItem } : {})}\n />\n </section>\n );\n}\n\n/** Shared content without a second themed container when used in the browser. */\nexport function AuctionContent({\n auction,\n onSelectItem,\n filter: controlledFilter,\n onFilterChange,\n getFilterHref,\n getItemHref,\n itemOrder = \"position\",\n backHref,\n autoRotateImages = false,\n theme = \"dark\",\n style,\n showFilters = true,\n showHeader = true,\n showLineup = false,\n onBack,\n renderItem,\n}: LockerverseAuctionProps) {\n useAuctionBoundary(auction.startAt, auction.endAt, auction.items);\n const [filterState, setFilterState] = useState<{\n auctionId: string;\n value: LockerverseAuctionItemFilter;\n }>({ auctionId: auction.id, value: \"all\" });\n const headingRef = useRef<HTMLHeadingElement>(null);\n const backRef = useRef<HTMLAnchorElement | HTMLButtonElement>(null);\n const filter = showFilters\n ? (controlledFilter ??\n (filterState.auctionId === auction.id ? filterState.value : \"all\"))\n : \"all\";\n useEffect(() => {\n setFilterState({ auctionId: auction.id, value: \"all\" });\n }, [auction.id, showFilters]);\n const changeFilter = (value: LockerverseAuctionItemFilter) => {\n setFilterState({ auctionId: auction.id, value });\n onFilterChange?.(value);\n };\n const nextItem = getNextAuctionItem(auction);\n const focusHeading = Boolean(onBack || backHref);\n useEffect(() => {\n if (focusHeading) {\n (headingRef.current ?? backRef.current)?.focus();\n }\n }, [auction.id, focusHeading, showHeader]);\n const cardStyle = style\n ? Object.fromEntries(\n Object.entries(style).filter(([key]) =>\n key.startsWith(\"--lockerverse-\")\n )\n )\n : undefined;\n const statusOrder = { active: 0, draft: 1, finished: 2 };\n const items = [...auction.items].sort((left, right) => {\n const availability =\n itemOrder === \"availability\"\n ? statusOrder[getAuctionDisplayStatus(auction, left)] -\n statusOrder[getAuctionDisplayStatus(auction, right)]\n : 0;\n return (\n availability ||\n left.position - right.position ||\n left.createdAt.localeCompare(right.createdAt)\n );\n });\n const filtered = items.filter(\n (item) =>\n filter === \"all\" || getAuctionDisplayStatus(auction, item) === filter\n );\n return (\n <>\n <AuctionBackAction\n className=\"lockerverse-auctions__catalog-back\"\n elementRef={(element) => {\n backRef.current = element;\n }}\n href={backHref}\n onBack={onBack}\n >\n <ChevronLeft aria-hidden=\"true\" size={16} />\n Auctions\n </AuctionBackAction>\n {showHeader ? (\n <header className=\"lockerverse-auctions__catalog-header\">\n <h2 ref={headingRef} tabIndex={-1}>\n {auction.name}\n </h2>\n {auction.status !== \"finished\" && nextItem ? (\n <p className=\"lockerverse-auctions__catalog-next\">\n Next opens {formatAuctionBoundary(auction, \"draft\", nextItem)}\n </p>\n ) : null}\n {auction.description ? (\n <AuctionDescription description={auction.description} />\n ) : null}\n </header>\n ) : null}\n {showLineup ? (\n <div className=\"lockerverse-auctions__catalog-lineup\">\n <div>\n <h3>Auction lineup</h3>\n <p>Browse the current collection.</p>\n </div>\n <span>\n {filtered.length} {filtered.length === 1 ? \"item\" : \"items\"}\n </span>\n </div>\n ) : null}\n {showFilters ? (\n <fieldset\n aria-label=\"Filter auction items\"\n className=\"lockerverse-auctions__catalog-filters\"\n >\n {FILTERS.map((option) => {\n const href = getFilterHref?.(option.value);\n const label = (\n <>\n {option.label}\n <span>\n {option.value === \"all\"\n ? items.length\n : items.filter(\n (item) =>\n getAuctionDisplayStatus(auction, item) ===\n option.value\n ).length}\n </span>\n </>\n );\n return href ? (\n <a\n aria-current={filter === option.value ? \"page\" : undefined}\n href={href}\n key={option.value}\n onClick={(event) => {\n if (\n onFilterChange &&\n event.button === 0 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n changeFilter(option.value);\n }\n }}\n >\n {label}\n </a>\n ) : (\n <button\n aria-pressed={filter === option.value}\n key={option.value}\n onClick={() => changeFilter(option.value)}\n type=\"button\"\n >\n {label}\n </button>\n );\n })}\n </fieldset>\n ) : null}\n {filtered.length ? (\n <ul className=\"lockerverse-auctions__catalog-grid\">\n {filtered.map((item) => {\n const context: LockerverseAuctionItemRenderContext = {\n auction,\n item,\n onSelect: () => onSelectItem?.(auction, item),\n status: getAuctionDisplayStatus(auction, item),\n theme,\n };\n if (getItemHref) {\n context.href = getItemHref(auction, item);\n }\n if (cardStyle) {\n context.style = cardStyle;\n }\n const { onSelect, ...cardContext } = context;\n return (\n <li key={item.id}>\n {renderItem ? (\n renderItem(context)\n ) : (\n <LockerverseAuctionItemCard\n {...cardContext}\n {...(onSelectItem ? { onSelect } : {})}\n autoRotateImages={autoRotateImages}\n />\n )}\n </li>\n );\n })}\n </ul>\n ) : (\n <p className=\"lockerverse-auctions__catalog-empty\">\n No items match this auction view.\n </p>\n )}\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./format-money.js";import{useCallback as t,useEffect as n,useRef as r,useState as i,useSyncExternalStore as a}from"react";import{jsx as o}from"react/jsx-runtime";const
|
|
1
|
+
import{t as e}from"./format-money.js";import{useCallback as t,useEffect as n,useRef as r,useState as i,useSyncExternalStore as a}from"react";import{jsx as o}from"react/jsx-runtime";function s({href:e,onBack:t,className:n,children:r,elementRef:i}){return e?o(`a`,{className:n,href:e,onClick:e=>{t&&e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&(e.preventDefault(),t())},ref:i,children:r}):t?o(`button`,{className:n,onClick:t,ref:i,type:`button`,children:r}):null}const c=/<\/?(?:p|br|strong|em|u|s|ul|ol|li|blockquote|pre|code|hr|h[1-6]|a)(?:\s|\/?>)/i;function l(e){return c.test(e)?e:e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/\r\n|\r|\n/g,`<br>`)}function u({description:e,className:t,id:n}){return o(`div`,{className:[`lockerverse-auctions__description`,t].filter(Boolean).join(` `),dangerouslySetInnerHTML:{__html:l(e)},id:n})}function d(e,t=e.status,n){let r=t===`draft`,i=n??m(e),a=r?i?.startAt??e.startAt:(t===`finished`?n?.finishedAt:void 0)??n?.endAt??e.endAt,o=new Date(a);if(!Number.isFinite(o.getTime()))return``;let s=(r?i?.startAt:n?.endAt)?!0:(r?e.configuration.startTimeEnabled:e.configuration.endTimeEnabled)??!0,c=new Intl.DateTimeFormat(`en-US`,{day:`numeric`,month:`short`,timeZone:`America/New_York`,year:`numeric`}).format(o);return s?`${c} at ${new Intl.DateTimeFormat(`en-US`,{hour:`numeric`,minute:`2-digit`,timeZone:`America/New_York`,timeZoneName:`short`}).format(o)}`:c}function f(t){return e(t,0)}function p(e,t){if(e.status===`finished`||t?.status===`finished`)return`finished`;if(t&&!(t.startAt&&t.endAt)&&(t.status===`draft`||e.status===`draft`))return`draft`;let n=Date.now();if(Date.parse(t?.endAt??e.endAt)<=n)return`finished`;if(Date.parse(t?.startAt??e.startAt)>n)return`draft`;if(t)return`active`;if(e.items.length){let t=e.items.map(t=>p(e,t));return t.includes(`active`)?`active`:t.includes(`draft`)?`draft`:`finished`}return e.status}function m(e){let t=Date.now();return e.items.filter(n=>n.status!==`finished`&&Date.parse(n.startAt??e.startAt)>t).sort((t,n)=>Date.parse(t.startAt??e.startAt)-Date.parse(n.startAt??e.startAt))[0]}function h(e){return e.isSoldOut||e.saleMode===`buy_now`&&e.availableQuantity===0}function g(){let e=r(null),[t,a]=i(!1);return n(()=>{let t=e.current;if(!(t&&`IntersectionObserver`in window))return;let n=!1,r=()=>a(n&&!document.hidden),i=new IntersectionObserver(([e])=>{n=!!(e?.isIntersecting&&e.intersectionRatio>0),r()});return i.observe(t),document.addEventListener(`visibilitychange`,r),()=>{i.disconnect(),document.removeEventListener(`visibilitychange`,r)}},[]),{ref:e,visible:t}}const _=new Map;let v,y=0;function b(){clearTimeout(v),v=void 0;let e=Date.now(),t=1/0;for(let n of _.values())for(let r of n)r>e&&(t=Math.min(t,r));Number.isFinite(t)&&(v=setTimeout(x,Math.min(t-e+1,2147483647)))}function x(){y+=1;for(let e of _.keys())e();b()}function S(){document.hidden||x()}const C=()=>y,w=()=>0;function T(e,n,r=[]){let i=[e,n,...r.flatMap(t=>[t.startAt??e,t.endAt??n])].join(`,`),o=t(e=>(_.size||document.addEventListener(`visibilitychange`,S),_.set(e,i.split(`,`).map(Date.parse)),b(),()=>{_.delete(e),b(),_.size||document.removeEventListener(`visibilitychange`,S)}),[i]);a(o,C,w)}export{p as a,u as c,f as i,s as l,g as n,m as o,d as r,h as s,T as t};
|
|
2
2
|
//# sourceMappingURL=use-auction-boundary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-auction-boundary.js","names":[],"sources":["../src/auction-description-html.ts","../src/auction-description.tsx","../src/auction-display.ts","../src/use-auction-visibility.ts","../src/use-auction-boundary.ts"],"sourcesContent":["const richDescriptionPattern =\n /<\\/?(?:p|br|strong|em|u|s|ul|ol|li|blockquote|pre|code|hr|h[1-6]|a)(?:\\s|\\/?>)/i;\n\nexport function auctionDescriptionHtml(description: string): string {\n if (!richDescriptionPattern.test(description)) {\n return description\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\\r\\n|\\r|\\n/g, \"<br>\");\n }\n\n return description;\n}\n","import { auctionDescriptionHtml } from \"./auction-description-html.ts\";\n\nexport function AuctionDescription({\n description,\n className,\n id,\n}: {\n description: string;\n className?: string | undefined;\n id?: string | undefined;\n}) {\n return (\n <div\n className={[\"lockerverse-auctions__description\", className]\n .filter(Boolean)\n .join(\" \")}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: Auction description HTML is trusted content supplied by the backend; the SDK renders it unchanged.\n dangerouslySetInnerHTML={{\n __html: auctionDescriptionHtml(description),\n }}\n id={id}\n />\n );\n}\n","import type {\n LockerverseAuction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { formatMoney } from \"./format-money.ts\";\n\n// Match the public web app. Keep display policy here for all SDK auction surfaces.\nexport function formatAuctionBoundary(\n auction: LockerverseAuction,\n status: LockerverseAuctionStatus = auction.status,\n item?: LockerverseAuctionItem\n) {\n const starts = status === \"draft\";\n const nextItem = item ?? getNextAuctionItem(auction);\n const value = starts\n ? (nextItem?.startAt ?? auction.startAt)\n : ((status === \"finished\" ? item?.finishedAt : undefined) ??\n item?.endAt ??\n auction.endAt);\n const date = new Date(value);\n if (!Number.isFinite(date.getTime())) {\n return \"\";\n }\n const explicitBoundary = starts ? nextItem?.startAt : item?.endAt;\n const showTime = explicitBoundary\n ? true\n : ((starts\n ? auction.configuration.startTimeEnabled\n : auction.configuration.endTimeEnabled) ?? true);\n const dateLabel = new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"short\",\n timeZone: \"America/New_York\",\n year: \"numeric\",\n }).format(date);\n if (!showTime) {\n return dateLabel;\n }\n const timeLabel = new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone: \"America/New_York\",\n timeZoneName: \"short\",\n }).format(date);\n return `${dateLabel} at ${timeLabel}`;\n}\n\nexport function formatAuctionMoney(cents: number) {\n return formatMoney(cents, 0);\n}\n\nexport function getAuctionDisplayStatus(\n auction: LockerverseAuction,\n item?: LockerverseAuctionItem\n): LockerverseAuctionStatus {\n if (auction.status === \"finished\" || item?.status === \"finished\") {\n return \"finished\";\n }\n // Preserve legacy draft responses until both item boundaries are available.\n if (\n item &&\n !(item.startAt && item.endAt) &&\n (item.status === \"draft\" || auction.status === \"draft\")\n ) {\n return \"draft\";\n }\n const now = Date.now();\n if (Date.parse(item?.endAt ?? auction.endAt) <= now) {\n return \"finished\";\n }\n if (Date.parse(item?.startAt ?? auction.startAt) > now) {\n return \"draft\";\n }\n if (item) {\n return \"active\";\n }\n if (auction.items.length) {\n const statuses = auction.items.map((entry) =>\n getAuctionDisplayStatus(auction, entry)\n );\n if (statuses.includes(\"active\")) {\n return \"active\";\n }\n return statuses.includes(\"draft\") ? \"draft\" : \"finished\";\n }\n return auction.status;\n}\n\n/** The next scheduled item, including a gap between groups of items. */\nexport function getNextAuctionItem(auction: LockerverseAuction) {\n const now = Date.now();\n return auction.items\n .filter(\n (item) =>\n item.status !== \"finished\" &&\n Date.parse(item.startAt ?? auction.startAt) > now\n )\n .sort(\n (left, right) =>\n Date.parse(left.startAt ?? auction.startAt) -\n Date.parse(right.startAt ?? auction.startAt)\n )[0];\n}\n\nexport function isAuctionItemSoldOut(item: LockerverseAuctionItem) {\n return (\n item.isSoldOut ||\n (item.saleMode === \"buy_now\" && item.availableQuantity === 0)\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n/** Automatic motion stays off during SSR and in browsers without observation.\n * Manual gallery navigation remains available in those environments. */\nexport function useAuctionVisibility<ElementType extends HTMLElement>() {\n const ref = useRef<ElementType>(null);\n const [visible, setVisible] = useState(false);\n useEffect(() => {\n const element = ref.current;\n // biome-ignore lint/suspicious/noUnnecessaryConditions: React assigns this ref after rendering.\n if (!(element && \"IntersectionObserver\" in window)) {\n return;\n }\n let intersecting = false;\n const update = () => setVisible(intersecting && !document.hidden);\n const observer = new IntersectionObserver(([entry]) => {\n intersecting = Boolean(\n entry?.isIntersecting && entry.intersectionRatio > 0\n );\n update();\n });\n observer.observe(element);\n document.addEventListener(\"visibilitychange\", update);\n return () => {\n observer.disconnect();\n document.removeEventListener(\"visibilitychange\", update);\n };\n }, []);\n return { ref, visible };\n}\n","import { useCallback, useSyncExternalStore } from \"react\";\n\n// One timer serves every mounted auction surface, including standalone cards.\nconst subscriptions = new Map<() => void, readonly number[]>();\nlet timer: ReturnType<typeof setTimeout> | undefined;\nlet revision = 0;\nconst MAX_DELAY = 2_147_483_647;\n\nfunction schedule() {\n clearTimeout(timer);\n timer = undefined;\n const now = Date.now();\n let next = Number.POSITIVE_INFINITY;\n for (const boundaries of subscriptions.values()) {\n for (const boundary of boundaries) {\n if (boundary > now) {\n next = Math.min(next, boundary);\n }\n }\n }\n if (Number.isFinite(next)) {\n timer = setTimeout(notify, Math.min(next - now + 1, MAX_DELAY));\n }\n}\nfunction notify() {\n revision += 1;\n for (const listener of subscriptions.keys()) {\n listener();\n }\n schedule();\n}\nfunction onVisibilityChange() {\n if (!document.hidden) {\n notify();\n }\n}\nconst getSnapshot = () => revision;\nconst getServerSnapshot = () => 0;\n\n/** Re-render at known boundaries without polling or changing server status. */\nexport function useAuctionBoundary(\n startAt: string,\n endAt: string,\n items: readonly {\n startAt?: string | null | undefined;\n endAt?: string | null | undefined;\n }[] = []\n) {\n const boundaryKey = [\n startAt,\n endAt,\n ...items.flatMap((item) => [item.startAt ?? startAt, item.endAt ?? endAt]),\n ].join(\",\");\n const subscribe = useCallback(\n (listener: () => void) => {\n if (!subscriptions.size) {\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n }\n subscriptions.set(listener, boundaryKey.split(\",\").map(Date.parse));\n schedule();\n return () => {\n subscriptions.delete(listener);\n schedule();\n if (!subscriptions.size) {\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n }\n };\n },\n [boundaryKey]\n );\n useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-auction-boundary.js","names":[],"sources":["../src/auction-back-action.tsx","../src/auction-description-html.ts","../src/auction-description.tsx","../src/auction-display.ts","../src/use-auction-visibility.ts","../src/use-auction-boundary.ts"],"sourcesContent":["import type { ReactNode, RefCallback } from \"react\";\n\n/** Native route navigation; an optional host callback handles plain clicks. */\nexport function AuctionBackAction({\n href,\n onBack,\n className,\n children,\n elementRef,\n}: {\n href?: string | undefined;\n onBack?: (() => void) | undefined;\n className?: string;\n children: ReactNode;\n elementRef?: RefCallback<HTMLAnchorElement | HTMLButtonElement>;\n}) {\n if (href) {\n return (\n <a\n className={className}\n href={href}\n onClick={(event) => {\n if (\n onBack &&\n event.button === 0 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n onBack();\n }\n }}\n ref={elementRef}\n >\n {children}\n </a>\n );\n }\n return onBack ? (\n <button\n className={className}\n onClick={onBack}\n ref={elementRef}\n type=\"button\"\n >\n {children}\n </button>\n ) : null;\n}\n","const richDescriptionPattern =\n /<\\/?(?:p|br|strong|em|u|s|ul|ol|li|blockquote|pre|code|hr|h[1-6]|a)(?:\\s|\\/?>)/i;\n\nexport function auctionDescriptionHtml(description: string): string {\n if (!richDescriptionPattern.test(description)) {\n return description\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\\r\\n|\\r|\\n/g, \"<br>\");\n }\n\n return description;\n}\n","import { auctionDescriptionHtml } from \"./auction-description-html.ts\";\n\nexport function AuctionDescription({\n description,\n className,\n id,\n}: {\n description: string;\n className?: string | undefined;\n id?: string | undefined;\n}) {\n return (\n <div\n className={[\"lockerverse-auctions__description\", className]\n .filter(Boolean)\n .join(\" \")}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: Auction description HTML is trusted content supplied by the backend; the SDK renders it unchanged.\n dangerouslySetInnerHTML={{\n __html: auctionDescriptionHtml(description),\n }}\n id={id}\n />\n );\n}\n","import type {\n LockerverseAuction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { formatMoney } from \"./format-money.ts\";\n\n// Match the public web app. Keep display policy here for all SDK auction surfaces.\nexport function formatAuctionBoundary(\n auction: LockerverseAuction,\n status: LockerverseAuctionStatus = auction.status,\n item?: LockerverseAuctionItem\n) {\n const starts = status === \"draft\";\n const nextItem = item ?? getNextAuctionItem(auction);\n const value = starts\n ? (nextItem?.startAt ?? auction.startAt)\n : ((status === \"finished\" ? item?.finishedAt : undefined) ??\n item?.endAt ??\n auction.endAt);\n const date = new Date(value);\n if (!Number.isFinite(date.getTime())) {\n return \"\";\n }\n const explicitBoundary = starts ? nextItem?.startAt : item?.endAt;\n const showTime = explicitBoundary\n ? true\n : ((starts\n ? auction.configuration.startTimeEnabled\n : auction.configuration.endTimeEnabled) ?? true);\n const dateLabel = new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"short\",\n timeZone: \"America/New_York\",\n year: \"numeric\",\n }).format(date);\n if (!showTime) {\n return dateLabel;\n }\n const timeLabel = new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone: \"America/New_York\",\n timeZoneName: \"short\",\n }).format(date);\n return `${dateLabel} at ${timeLabel}`;\n}\n\nexport function formatAuctionMoney(cents: number) {\n return formatMoney(cents, 0);\n}\n\nexport function getAuctionDisplayStatus(\n auction: LockerverseAuction,\n item?: LockerverseAuctionItem\n): LockerverseAuctionStatus {\n if (auction.status === \"finished\" || item?.status === \"finished\") {\n return \"finished\";\n }\n // Preserve legacy draft responses until both item boundaries are available.\n if (\n item &&\n !(item.startAt && item.endAt) &&\n (item.status === \"draft\" || auction.status === \"draft\")\n ) {\n return \"draft\";\n }\n const now = Date.now();\n if (Date.parse(item?.endAt ?? auction.endAt) <= now) {\n return \"finished\";\n }\n if (Date.parse(item?.startAt ?? auction.startAt) > now) {\n return \"draft\";\n }\n if (item) {\n return \"active\";\n }\n if (auction.items.length) {\n const statuses = auction.items.map((entry) =>\n getAuctionDisplayStatus(auction, entry)\n );\n if (statuses.includes(\"active\")) {\n return \"active\";\n }\n return statuses.includes(\"draft\") ? \"draft\" : \"finished\";\n }\n return auction.status;\n}\n\n/** The next scheduled item, including a gap between groups of items. */\nexport function getNextAuctionItem(auction: LockerverseAuction) {\n const now = Date.now();\n return auction.items\n .filter(\n (item) =>\n item.status !== \"finished\" &&\n Date.parse(item.startAt ?? auction.startAt) > now\n )\n .sort(\n (left, right) =>\n Date.parse(left.startAt ?? auction.startAt) -\n Date.parse(right.startAt ?? auction.startAt)\n )[0];\n}\n\nexport function isAuctionItemSoldOut(item: LockerverseAuctionItem) {\n return (\n item.isSoldOut ||\n (item.saleMode === \"buy_now\" && item.availableQuantity === 0)\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n/** Automatic motion stays off during SSR and in browsers without observation.\n * Manual gallery navigation remains available in those environments. */\nexport function useAuctionVisibility<ElementType extends HTMLElement>() {\n const ref = useRef<ElementType>(null);\n const [visible, setVisible] = useState(false);\n useEffect(() => {\n const element = ref.current;\n // biome-ignore lint/suspicious/noUnnecessaryConditions: React assigns this ref after rendering.\n if (!(element && \"IntersectionObserver\" in window)) {\n return;\n }\n let intersecting = false;\n const update = () => setVisible(intersecting && !document.hidden);\n const observer = new IntersectionObserver(([entry]) => {\n intersecting = Boolean(\n entry?.isIntersecting && entry.intersectionRatio > 0\n );\n update();\n });\n observer.observe(element);\n document.addEventListener(\"visibilitychange\", update);\n return () => {\n observer.disconnect();\n document.removeEventListener(\"visibilitychange\", update);\n };\n }, []);\n return { ref, visible };\n}\n","import { useCallback, useSyncExternalStore } from \"react\";\n\n// One timer serves every mounted auction surface, including standalone cards.\nconst subscriptions = new Map<() => void, readonly number[]>();\nlet timer: ReturnType<typeof setTimeout> | undefined;\nlet revision = 0;\nconst MAX_DELAY = 2_147_483_647;\n\nfunction schedule() {\n clearTimeout(timer);\n timer = undefined;\n const now = Date.now();\n let next = Number.POSITIVE_INFINITY;\n for (const boundaries of subscriptions.values()) {\n for (const boundary of boundaries) {\n if (boundary > now) {\n next = Math.min(next, boundary);\n }\n }\n }\n if (Number.isFinite(next)) {\n timer = setTimeout(notify, Math.min(next - now + 1, MAX_DELAY));\n }\n}\nfunction notify() {\n revision += 1;\n for (const listener of subscriptions.keys()) {\n listener();\n }\n schedule();\n}\nfunction onVisibilityChange() {\n if (!document.hidden) {\n notify();\n }\n}\nconst getSnapshot = () => revision;\nconst getServerSnapshot = () => 0;\n\n/** Re-render at known boundaries without polling or changing server status. */\nexport function useAuctionBoundary(\n startAt: string,\n endAt: string,\n items: readonly {\n startAt?: string | null | undefined;\n endAt?: string | null | undefined;\n }[] = []\n) {\n const boundaryKey = [\n startAt,\n endAt,\n ...items.flatMap((item) => [item.startAt ?? startAt, item.endAt ?? endAt]),\n ].join(\",\");\n const subscribe = useCallback(\n (listener: () => void) => {\n if (!subscriptions.size) {\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n }\n subscriptions.set(listener, boundaryKey.split(\",\").map(Date.parse));\n schedule();\n return () => {\n subscriptions.delete(listener);\n schedule();\n if (!subscriptions.size) {\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n }\n };\n },\n [boundaryKey]\n );\n useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n"],"mappings":"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"}
|