@lockerverse/react 0.2.157 → 0.2.159

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/dist/auctions.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,t as n}from"./use-auction-boundary.js";import{a as r,i,n as a,o,r as s,s as c,t as l}from"./lockerverse-auction.js";import{t as u}from"./use-lockerverse-auctions.js";import{ArrowRight as d,Gavel as f,ListChecks as p}from"lucide-react";import{useEffect as m,useRef as h,useState as g}from"react";import{Fragment as _,jsx as v,jsxs as y}from"react/jsx-runtime";function b({auction:a,onSelect:s,href:l}){n(a.startAt,a.endAt,a.items);let u=a.configuration.image||a.items.find(e=>e.image||e.images.length)?.image||a.items.find(e=>e.images.length)?.images[0]||a.community?.banner||a.community?.thumbnail,m=a.description||{active:`Bidding is open on available items.`,draft:`Preview the lineup before bidding opens.`,finished:`Bidding has wrapped. Review the completed items.`}[e(a)];return y(`article`,{className:`lockerverse-auctions__catalog-card`,children:[l?v(`a`,{"aria-label":`View items in ${a.name}`,className:`lockerverse-auctions__catalog-select`,"data-auction-id":a.id,href:l,onClick:e=>{s&&e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&(e.preventDefault(),s())},children:y(`span`,{className:`lockerverse-auctions__visually-hidden`,children:[`View items in `,a.name]})}):v(`button`,{"aria-label":`View items in ${a.name}`,className:`lockerverse-auctions__catalog-select`,"data-auction-id":a.id,onClick:s,type:`button`}),y(`div`,{className:`lockerverse-auctions__catalog-media`,children:[v(i,{fallback:u,name:a.name}),y(`div`,{className:`lockerverse-auctions__catalog-chips`,children:[v(`span`,{className:`lockerverse-auctions__catalog-chip`,children:o[e(a)]}),v(c,{auction:a})]}),y(`dl`,{className:`lockerverse-auctions__catalog-metrics`,children:[v(r,{icon:v(p,{"aria-hidden":`true`,size:16}),label:`Items`,value:String(a.items.length)}),v(r,{icon:v(f,{"aria-hidden":`true`,size:16}),label:`Bids`,value:String(a.items.reduce((e,t)=>e+t.bidCount,0))})]})]}),y(`div`,{className:`lockerverse-auctions__catalog-body`,children:[v(`h3`,{children:a.name}),v(t,{className:`lockerverse-auctions__catalog-description`,description:m}),y(`div`,{className:`lockerverse-auctions__catalog-footer`,children:[v(`span`,{className:`lockerverse-auctions__catalog-cta`,children:e(a)===`draft`?`Preview items`:`View items`}),v(`span`,{className:`lockerverse-auctions__catalog-arrow`,children:v(d,{"aria-hidden":`true`,size:16})})]})]})]})}function x({auctions:e,theme:t=`dark`,style:n,className:r,showFilters:i=!0,showHeader:a=!0,showLineup:o=!1,getAuctionHref:s,onSelectAuction:c,...u}){let[d,f]=g(null),p=h(null),_=h(null),b=h(d),x=e.auctions?.find(e=>e.id===d);return m(()=>{if(b.current!==d){if(d===null){let e=[..._.current?.querySelectorAll(`button[data-auction-id]`)??[]].find(e=>e.dataset.auctionId===b.current);(p.current??e??_.current)?.focus()}b.current=d}},[d]),y(`section`,{"aria-busy":e.loading,"aria-label":`Auctions`,className:[`lockerverse-auctions`,`lockerverse-auctions--catalog`,r].filter(Boolean).join(` `),"data-lockerverse-theme":t,ref:_,style:n,tabIndex:-1,children:[!x&&a?v(`header`,{className:`lockerverse-auctions__catalog-header`,children:v(`h2`,{ref:p,tabIndex:-1,children:`Auctions`})}):null,e.loading?v(`p`,{role:`status`,children:e.auctions?`Refreshing auctions…`:`Loading auctions…`}):null,e.error?y(`div`,{role:`alert`,children:[v(`p`,{children:e.error.message}),v(`button`,{onClick:e.refresh,type:`button`,children:`Try again`})]}):null,x?v(l,{auction:x,onBack:()=>f(null),...u,showFilters:i,showHeader:a,showLineup:o,theme:t,...n?{style:n}:{}},x.id):v(S,{auctions:e.auctions,onSelectAuction:e=>{c?c(e):f(e.id)},...s?{getAuctionHref:s}:{},interceptLinks:!!c,showLineup:o})]})}function S({auctions:e,showLineup:t,onSelectAuction:n,getAuctionHref:r,interceptLinks:i}){return e?e.length?y(_,{children:[t?y(`div`,{className:`lockerverse-auctions__catalog-lineup`,children:[y(`div`,{children:[v(`h3`,{children:`Auction lineup`}),v(`p`,{children:`Browse the current collection.`})]}),y(`span`,{children:[e.length,` `,e.length===1?`auction`:`auctions`]})]}):null,v(`ul`,{className:`lockerverse-auctions__catalog-grid`,children:e.map(e=>v(`li`,{children:v(b,{auction:e,...r?{href:r(e)}:{},...!r||i?{onSelect:()=>n(e)}:{}})},e.id))})]}):y(`div`,{className:`lockerverse-auctions__catalog-empty`,children:[v(`h3`,{children:`No auctions yet.`}),v(`p`,{children:`Published auctions will appear here once they are available.`})]}):null}export{a as LockerverseAuction,s as LockerverseAuctionItemCard,x as LockerverseAuctions,u as useLockerverseAuctions};
1
+ import{a as e,c as t,t as n}from"./use-auction-boundary.js";import{n as r}from"./auction-image.js";import{a as i,i as a,n as o,o as s,r as c,s as l,t as u}from"./lockerverse-auction.js";import{t as d}from"./use-lockerverse-auctions.js";import{ArrowRight as f,Gavel as p,ListChecks as m}from"lucide-react";import{useEffect as h,useRef as g,useState as _}from"react";import{Fragment as v,jsx as y,jsxs as b}from"react/jsx-runtime";function x({auction:o,onSelect:c,href:u}){n(o.startAt,o.endAt,o.items);let d=o.configuration.image||o.items.find(e=>e.image||e.images.length)?.image||o.items.find(e=>e.images.length)?.images[0]||o.community?.banner||o.community?.thumbnail,h=o.description||{active:`Bidding is open on available items.`,draft:`Preview the lineup before bidding opens.`,finished:`Bidding has wrapped. Review the completed items.`}[e(o)];return b(`article`,{className:`lockerverse-auctions__catalog-card`,children:[u?y(`a`,{"aria-label":`View items in ${o.name}`,className:`lockerverse-auctions__catalog-select`,"data-auction-id":o.id,href:u,onClick:e=>{c&&e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&(e.preventDefault(),c())},children:b(`span`,{className:`lockerverse-auctions__visually-hidden`,children:[`View items in `,o.name]})}):y(`button`,{"aria-label":`View items in ${o.name}`,className:`lockerverse-auctions__catalog-select`,"data-auction-id":o.id,onClick:c,type:`button`}),b(`div`,{className:`lockerverse-auctions__catalog-media`,children:[y(r.Provider,{value:o.mediaBaseUrl,children:y(a,{fallback:d,name:o.name})}),b(`div`,{className:`lockerverse-auctions__catalog-chips`,children:[y(`span`,{className:`lockerverse-auctions__catalog-chip`,children:s[e(o)]}),y(l,{auction:o})]}),b(`dl`,{className:`lockerverse-auctions__catalog-metrics`,children:[y(i,{icon:y(m,{"aria-hidden":`true`,size:16}),label:`Items`,value:String(o.items.length)}),y(i,{icon:y(p,{"aria-hidden":`true`,size:16}),label:`Bids`,value:String(o.items.reduce((e,t)=>e+t.bidCount,0))})]})]}),b(`div`,{className:`lockerverse-auctions__catalog-body`,children:[y(`h3`,{children:o.name}),y(t,{className:`lockerverse-auctions__catalog-description`,description:h}),b(`div`,{className:`lockerverse-auctions__catalog-footer`,children:[y(`span`,{className:`lockerverse-auctions__catalog-cta`,children:e(o)===`draft`?`Preview items`:`View items`}),y(`span`,{className:`lockerverse-auctions__catalog-arrow`,children:y(f,{"aria-hidden":`true`,size:16})})]})]})]})}function S({auctions:e,theme:t=`dark`,style:n,className:r,showFilters:i=!0,showHeader:a=!0,showLineup:o=!1,getAuctionHref:s,onSelectAuction:c,...l}){let[d,f]=_(null),p=g(null),m=g(null),v=g(d),x=e.auctions?.find(e=>e.id===d);return h(()=>{if(v.current!==d){if(d===null){let e=[...m.current?.querySelectorAll(`button[data-auction-id]`)??[]].find(e=>e.dataset.auctionId===v.current);(p.current??e??m.current)?.focus()}v.current=d}},[d]),b(`section`,{"aria-busy":e.loading,"aria-label":`Auctions`,className:[`lockerverse-auctions`,`lockerverse-auctions--catalog`,r].filter(Boolean).join(` `),"data-lockerverse-theme":t,ref:m,style:n,tabIndex:-1,children:[!x&&a?y(`header`,{className:`lockerverse-auctions__catalog-header`,children:y(`h2`,{ref:p,tabIndex:-1,children:`Auctions`})}):null,e.loading?y(`p`,{role:`status`,children:e.auctions?`Refreshing auctions…`:`Loading auctions…`}):null,e.error?b(`div`,{role:`alert`,children:[y(`p`,{children:e.error.message}),y(`button`,{onClick:e.refresh,type:`button`,children:`Try again`})]}):null,x?y(u,{auction:x,onBack:()=>f(null),...l,showFilters:i,showHeader:a,showLineup:o,theme:t,...n?{style:n}:{}},x.id):y(C,{auctions:e.auctions,onSelectAuction:e=>{c?c(e):f(e.id)},...s?{getAuctionHref:s}:{},interceptLinks:!!c,showLineup:o})]})}function C({auctions:e,showLineup:t,onSelectAuction:n,getAuctionHref:r,interceptLinks:i}){return e?e.length?b(v,{children:[t?b(`div`,{className:`lockerverse-auctions__catalog-lineup`,children:[b(`div`,{children:[y(`h3`,{children:`Auction lineup`}),y(`p`,{children:`Browse the current collection.`})]}),b(`span`,{children:[e.length,` `,e.length===1?`auction`:`auctions`]})]}):null,y(`ul`,{className:`lockerverse-auctions__catalog-grid`,children:e.map(e=>y(`li`,{children:y(x,{auction:e,...r?{href:r(e)}:{},...!r||i?{onSelect:()=>n(e)}:{}})},e.id))})]}):b(`div`,{className:`lockerverse-auctions__catalog-empty`,children:[y(`h3`,{children:`No auctions yet.`}),y(`p`,{children:`Published auctions will appear here once they are available.`})]}):null}export{o as LockerverseAuction,c as LockerverseAuctionItemCard,S as LockerverseAuctions,d as useLockerverseAuctions};
2
2
  //# sourceMappingURL=auctions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auctions.js","names":[],"sources":["../src/lockerverse-auctions.tsx"],"sourcesContent":["import type { LockerverseAuction as Auction } from \"@lockerverse/sdk/auctions\";\nimport { ArrowRight, Gavel, ListChecks } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n CatalogImage,\n Metric,\n STATUS_LABELS,\n Timing,\n} from \"./auction-catalog-parts.tsx\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport { getAuctionDisplayStatus } from \"./auction-display.ts\";\nimport {\n AuctionContent,\n type LockerverseAuctionProps,\n} from \"./lockerverse-auction.tsx\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\nimport type { UseLockerverseAuctionsResult } from \"./use-lockerverse-auctions.ts\";\n\nexport type LockerverseAuctionsProps = Omit<\n LockerverseAuctionProps,\n \"auction\" | \"onBack\"\n> & {\n auctions: UseLockerverseAuctionsResult;\n getAuctionHref?: (auction: Auction) => string;\n onSelectAuction?: (auction: Auction) => void;\n};\n\nfunction AuctionCard({\n auction,\n onSelect,\n href,\n}: {\n auction: Auction;\n onSelect?: () => void;\n href?: string;\n}) {\n useAuctionBoundary(auction.startAt, auction.endAt, auction.items);\n const fallback =\n auction.configuration.image ||\n auction.items.find((item) => item.image || item.images.length)?.image ||\n auction.items.find((item) => item.images.length)?.images[0] ||\n auction.community?.banner ||\n auction.community?.thumbnail;\n const description =\n auction.description ||\n {\n active: \"Bidding is open on available items.\",\n draft: \"Preview the lineup before bidding opens.\",\n finished: \"Bidding has wrapped. Review the completed items.\",\n }[getAuctionDisplayStatus(auction)];\n return (\n <article className=\"lockerverse-auctions__catalog-card\">\n {href ? (\n <a\n aria-label={`View items in ${auction.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n data-auction-id={auction.id}\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 items in {auction.name}\n </span>\n </a>\n ) : (\n <button\n aria-label={`View items in ${auction.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n data-auction-id={auction.id}\n onClick={onSelect}\n type=\"button\"\n />\n )}\n <div className=\"lockerverse-auctions__catalog-media\">\n <CatalogImage fallback={fallback} name={auction.name} />\n <div className=\"lockerverse-auctions__catalog-chips\">\n <span className=\"lockerverse-auctions__catalog-chip\">\n {STATUS_LABELS[getAuctionDisplayStatus(auction)]}\n </span>\n <Timing auction={auction} />\n </div>\n <dl className=\"lockerverse-auctions__catalog-metrics\">\n <Metric\n icon={<ListChecks aria-hidden=\"true\" size={16} />}\n label=\"Items\"\n value={String(auction.items.length)}\n />\n <Metric\n icon={<Gavel aria-hidden=\"true\" size={16} />}\n label=\"Bids\"\n value={String(\n auction.items.reduce((sum, item) => sum + item.bidCount, 0)\n )}\n />\n </dl>\n </div>\n <div className=\"lockerverse-auctions__catalog-body\">\n <h3>{auction.name}</h3>\n <AuctionDescription\n className=\"lockerverse-auctions__catalog-description\"\n description={description}\n />\n <div className=\"lockerverse-auctions__catalog-footer\">\n <span className=\"lockerverse-auctions__catalog-cta\">\n {getAuctionDisplayStatus(auction) === \"draft\"\n ? \"Preview items\"\n : \"View items\"}\n </span>\n <span className=\"lockerverse-auctions__catalog-arrow\">\n <ArrowRight aria-hidden=\"true\" size={16} />\n </span>\n </div>\n </div>\n </article>\n );\n}\n\n/** Optional auction browser. Select an auction to show its items. */\nexport function LockerverseAuctions({\n auctions,\n theme = \"dark\",\n style,\n className,\n showFilters = true,\n showHeader = true,\n showLineup = false,\n getAuctionHref,\n onSelectAuction,\n ...contentProps\n}: LockerverseAuctionsProps) {\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const headingRef = useRef<HTMLHeadingElement>(null);\n const sectionRef = useRef<HTMLElement>(null);\n const previousId = useRef(selectedId);\n const selected = auctions.auctions?.find(\n (auction) => auction.id === selectedId\n );\n useEffect(() => {\n if (previousId.current !== selectedId) {\n if (selectedId === null) {\n const card = [\n ...(sectionRef.current?.querySelectorAll<HTMLButtonElement>(\n \"button[data-auction-id]\"\n ) ?? []),\n ].find((button) => button.dataset.auctionId === previousId.current);\n (headingRef.current ?? card ?? sectionRef.current)?.focus();\n }\n previousId.current = selectedId;\n }\n }, [selectedId]);\n return (\n <section\n aria-busy={auctions.loading}\n aria-label=\"Auctions\"\n className={[\n \"lockerverse-auctions\",\n \"lockerverse-auctions--catalog\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n ref={sectionRef}\n style={style}\n tabIndex={-1}\n >\n {!selected && showHeader ? (\n <header className=\"lockerverse-auctions__catalog-header\">\n <h2 ref={headingRef} tabIndex={-1}>\n Auctions\n </h2>\n </header>\n ) : null}\n {auctions.loading ? (\n <p role=\"status\">\n {auctions.auctions ? \"Refreshing auctions…\" : \"Loading auctions…\"}\n </p>\n ) : null}\n {auctions.error ? (\n <div role=\"alert\">\n <p>{auctions.error.message}</p>\n <button onClick={auctions.refresh} type=\"button\">\n Try again\n </button>\n </div>\n ) : null}\n {selected ? (\n <AuctionContent\n auction={selected}\n key={selected.id}\n onBack={() => setSelectedId(null)}\n {...contentProps}\n showFilters={showFilters}\n showHeader={showHeader}\n showLineup={showLineup}\n theme={theme}\n {...(style ? { style } : {})}\n />\n ) : (\n <AuctionList\n auctions={auctions.auctions}\n onSelectAuction={(auction) => {\n if (onSelectAuction) {\n onSelectAuction(auction);\n } else {\n setSelectedId(auction.id);\n }\n }}\n {...(getAuctionHref ? { getAuctionHref } : {})}\n interceptLinks={Boolean(onSelectAuction)}\n showLineup={showLineup}\n />\n )}\n </section>\n );\n}\n\nfunction AuctionList({\n auctions,\n showLineup,\n onSelectAuction,\n getAuctionHref,\n interceptLinks,\n}: {\n auctions: Auction[] | null;\n showLineup: boolean;\n onSelectAuction: (auction: Auction) => void;\n getAuctionHref?: (auction: Auction) => string;\n interceptLinks: boolean;\n}) {\n if (!auctions) {\n return null;\n }\n if (!auctions.length) {\n return (\n <div className=\"lockerverse-auctions__catalog-empty\">\n <h3>No auctions yet.</h3>\n <p>Published auctions will appear here once they are available.</p>\n </div>\n );\n }\n return (\n <>\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 {auctions.length} {auctions.length === 1 ? \"auction\" : \"auctions\"}\n </span>\n </div>\n ) : null}\n <ul className=\"lockerverse-auctions__catalog-grid\">\n {auctions.map((auction) => (\n <li key={auction.id}>\n <AuctionCard\n auction={auction}\n {...(getAuctionHref ? { href: getAuctionHref(auction) } : {})}\n {...(!getAuctionHref || interceptLinks\n ? { onSelect: () => onSelectAuction(auction) }\n : {})}\n />\n </li>\n ))}\n </ul>\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"auctions.js","names":[],"sources":["../src/lockerverse-auctions.tsx"],"sourcesContent":["import type { LockerverseAuction as Auction } from \"@lockerverse/sdk/auctions\";\nimport { ArrowRight, Gavel, ListChecks } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n CatalogImage,\n Metric,\n STATUS_LABELS,\n Timing,\n} from \"./auction-catalog-parts.tsx\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport { getAuctionDisplayStatus } from \"./auction-display.ts\";\nimport { AuctionImageMediaBase } from \"./auction-image.tsx\";\nimport {\n AuctionContent,\n type LockerverseAuctionProps,\n} from \"./lockerverse-auction.tsx\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\nimport type { UseLockerverseAuctionsResult } from \"./use-lockerverse-auctions.ts\";\n\nexport type LockerverseAuctionsProps = Omit<\n LockerverseAuctionProps,\n \"auction\" | \"onBack\"\n> & {\n auctions: UseLockerverseAuctionsResult;\n getAuctionHref?: (auction: Auction) => string;\n onSelectAuction?: (auction: Auction) => void;\n};\n\nfunction AuctionCard({\n auction,\n onSelect,\n href,\n}: {\n auction: Auction;\n onSelect?: () => void;\n href?: string;\n}) {\n useAuctionBoundary(auction.startAt, auction.endAt, auction.items);\n const fallback =\n auction.configuration.image ||\n auction.items.find((item) => item.image || item.images.length)?.image ||\n auction.items.find((item) => item.images.length)?.images[0] ||\n auction.community?.banner ||\n auction.community?.thumbnail;\n const description =\n auction.description ||\n {\n active: \"Bidding is open on available items.\",\n draft: \"Preview the lineup before bidding opens.\",\n finished: \"Bidding has wrapped. Review the completed items.\",\n }[getAuctionDisplayStatus(auction)];\n return (\n <article className=\"lockerverse-auctions__catalog-card\">\n {href ? (\n <a\n aria-label={`View items in ${auction.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n data-auction-id={auction.id}\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 items in {auction.name}\n </span>\n </a>\n ) : (\n <button\n aria-label={`View items in ${auction.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n data-auction-id={auction.id}\n onClick={onSelect}\n type=\"button\"\n />\n )}\n <div className=\"lockerverse-auctions__catalog-media\">\n <AuctionImageMediaBase.Provider value={auction.mediaBaseUrl}>\n <CatalogImage fallback={fallback} name={auction.name} />\n </AuctionImageMediaBase.Provider>\n <div className=\"lockerverse-auctions__catalog-chips\">\n <span className=\"lockerverse-auctions__catalog-chip\">\n {STATUS_LABELS[getAuctionDisplayStatus(auction)]}\n </span>\n <Timing auction={auction} />\n </div>\n <dl className=\"lockerverse-auctions__catalog-metrics\">\n <Metric\n icon={<ListChecks aria-hidden=\"true\" size={16} />}\n label=\"Items\"\n value={String(auction.items.length)}\n />\n <Metric\n icon={<Gavel aria-hidden=\"true\" size={16} />}\n label=\"Bids\"\n value={String(\n auction.items.reduce((sum, item) => sum + item.bidCount, 0)\n )}\n />\n </dl>\n </div>\n <div className=\"lockerverse-auctions__catalog-body\">\n <h3>{auction.name}</h3>\n <AuctionDescription\n className=\"lockerverse-auctions__catalog-description\"\n description={description}\n />\n <div className=\"lockerverse-auctions__catalog-footer\">\n <span className=\"lockerverse-auctions__catalog-cta\">\n {getAuctionDisplayStatus(auction) === \"draft\"\n ? \"Preview items\"\n : \"View items\"}\n </span>\n <span className=\"lockerverse-auctions__catalog-arrow\">\n <ArrowRight aria-hidden=\"true\" size={16} />\n </span>\n </div>\n </div>\n </article>\n );\n}\n\n/** Optional auction browser. Select an auction to show its items. */\nexport function LockerverseAuctions({\n auctions,\n theme = \"dark\",\n style,\n className,\n showFilters = true,\n showHeader = true,\n showLineup = false,\n getAuctionHref,\n onSelectAuction,\n ...contentProps\n}: LockerverseAuctionsProps) {\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const headingRef = useRef<HTMLHeadingElement>(null);\n const sectionRef = useRef<HTMLElement>(null);\n const previousId = useRef(selectedId);\n const selected = auctions.auctions?.find(\n (auction) => auction.id === selectedId\n );\n useEffect(() => {\n if (previousId.current !== selectedId) {\n if (selectedId === null) {\n const card = [\n ...(sectionRef.current?.querySelectorAll<HTMLButtonElement>(\n \"button[data-auction-id]\"\n ) ?? []),\n ].find((button) => button.dataset.auctionId === previousId.current);\n (headingRef.current ?? card ?? sectionRef.current)?.focus();\n }\n previousId.current = selectedId;\n }\n }, [selectedId]);\n return (\n <section\n aria-busy={auctions.loading}\n aria-label=\"Auctions\"\n className={[\n \"lockerverse-auctions\",\n \"lockerverse-auctions--catalog\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n ref={sectionRef}\n style={style}\n tabIndex={-1}\n >\n {!selected && showHeader ? (\n <header className=\"lockerverse-auctions__catalog-header\">\n <h2 ref={headingRef} tabIndex={-1}>\n Auctions\n </h2>\n </header>\n ) : null}\n {auctions.loading ? (\n <p role=\"status\">\n {auctions.auctions ? \"Refreshing auctions…\" : \"Loading auctions…\"}\n </p>\n ) : null}\n {auctions.error ? (\n <div role=\"alert\">\n <p>{auctions.error.message}</p>\n <button onClick={auctions.refresh} type=\"button\">\n Try again\n </button>\n </div>\n ) : null}\n {selected ? (\n <AuctionContent\n auction={selected}\n key={selected.id}\n onBack={() => setSelectedId(null)}\n {...contentProps}\n showFilters={showFilters}\n showHeader={showHeader}\n showLineup={showLineup}\n theme={theme}\n {...(style ? { style } : {})}\n />\n ) : (\n <AuctionList\n auctions={auctions.auctions}\n onSelectAuction={(auction) => {\n if (onSelectAuction) {\n onSelectAuction(auction);\n } else {\n setSelectedId(auction.id);\n }\n }}\n {...(getAuctionHref ? { getAuctionHref } : {})}\n interceptLinks={Boolean(onSelectAuction)}\n showLineup={showLineup}\n />\n )}\n </section>\n );\n}\n\nfunction AuctionList({\n auctions,\n showLineup,\n onSelectAuction,\n getAuctionHref,\n interceptLinks,\n}: {\n auctions: Auction[] | null;\n showLineup: boolean;\n onSelectAuction: (auction: Auction) => void;\n getAuctionHref?: (auction: Auction) => string;\n interceptLinks: boolean;\n}) {\n if (!auctions) {\n return null;\n }\n if (!auctions.length) {\n return (\n <div className=\"lockerverse-auctions__catalog-empty\">\n <h3>No auctions yet.</h3>\n <p>Published auctions will appear here once they are available.</p>\n </div>\n );\n }\n return (\n <>\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 {auctions.length} {auctions.length === 1 ? \"auction\" : \"auctions\"}\n </span>\n </div>\n ) : null}\n <ul className=\"lockerverse-auctions__catalog-grid\">\n {auctions.map((auction) => (\n <li key={auction.id}>\n <AuctionCard\n auction={auction}\n {...(getAuctionHref ? { href: getAuctionHref(auction) } : {})}\n {...(!getAuctionHref || interceptLinks\n ? { onSelect: () => onSelectAuction(auction) }\n : {})}\n />\n </li>\n ))}\n </ul>\n </>\n );\n}\n"],"mappings":"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"}
@@ -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":";;;;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
+ {"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;;;KC7Dd;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,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};
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{n as l,t as u}from"./auction-image.js";import{ArrowRight as d,ChevronLeft as f,Clock3 as p,Gavel as m,ShoppingBag as h}from"lucide-react";import{useEffect as g,useMemo as _,useRef as v,useState as y}from"react";import{Fragment as b,jsx as x,jsxs as S}from"react/jsx-runtime";const C={active:`Live now`,draft:`Coming soon`,finished:`Closed`};function w({images:e,autoRotate:t=!1,fallback:n,name:r}){let a=_(()=>{let t=[...new Set(e?.filter(Boolean))];return!t.length&&n&&t.push(n),t},[e,n]),[o,s]=y(0),{ref:c,visible:l}=i(),[d,f]=y(!0),[p,m]=y(!1),h=v(new Set),b=a.length,S=t&&b?o%b:0;return g(()=>{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]),g(()=>{if(!t||b<2||!l||d||p)return;let e=window.setInterval(()=>{s(e=>h.current.has(a[(e+1)%b]??``)?(e+1)%b:e)},5e3);return()=>window.clearInterval(e)},[t,b,a,l,d,p]),x(`div`,{className:`lockerverse-auctions__catalog-images`,ref:c,children:b?[S,...t&&b>1?[(S+1)%b]:[]].map(e=>x(u,{alt:e===S?r:``,"aria-hidden":e!==S,className:`lockerverse-auctions__catalog-photo`,"data-visible":e===S,height:500,loading:`lazy`,maxWidth:960,onLoad:()=>h.current.add(a[e]??``),sizes:`auto, (max-width: 719px) 100vw, (max-width: 1231px) 50vw, 33vw`,src:a[e],width:640},a[e])):null})}function T({icon:e,label:t,value:n}){return S(`div`,{className:`lockerverse-auctions__catalog-metric`,children:[S(`dt`,{children:[e,t]}),x(`dd`,{children:n})]})}function E({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 `),S(`span`,{className:`lockerverse-auctions__catalog-timing`,children:[i,o(t,n,r)]})}function D(e,t){if(e.saleMode===`buy_now`){let r=s(e),i=t===`active`?`Buy now`:C[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`:C[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 O({auction:n,item:r,onSelect:i,href:a,autoRotateImages:o=!1,theme:s=`dark`,className:u,style:f,showDescription:g=!0,showMetrics:_=!0,showTiming:v=!0}){c(r.startAt??n.startAt,r.endAt??n.endAt);let y=e(n,r),b=r.saleMode===`buy_now`,C=D(r,y);return x(`div`,{className:[`lockerverse-auctions`,`lockerverse-auctions--card`,u].filter(Boolean).join(` `),"data-lockerverse-theme":s,style:f,children:S(`article`,{className:`lockerverse-auctions__catalog-card`,children:[a?x(`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:S(`span`,{className:`lockerverse-auctions__visually-hidden`,children:[`View `,r.name]})}):x(`button`,{"aria-label":`View ${r.name}`,className:`lockerverse-auctions__catalog-select`,onClick:i,type:`button`}),S(`div`,{className:`lockerverse-auctions__catalog-media`,children:[x(l.Provider,{value:n.mediaBaseUrl,children:x(w,{autoRotate:o,fallback:r.image||n.configuration.image||n.community?.banner||n.community?.thumbnail,images:r.images,name:r.name})}),S(`div`,{className:`lockerverse-auctions__catalog-chips`,children:[x(`span`,{className:`lockerverse-auctions__catalog-chip`,"data-live":y===`active`,children:C.chip}),v?x(E,{auction:n,item:r,status:y}):null]}),_?S(`dl`,{className:`lockerverse-auctions__catalog-metrics`,children:[x(T,{icon:x(b?h:m,{"aria-hidden":`true`,size:16}),label:C.priceLabel,value:C.price}),x(T,{icon:x(p,{"aria-hidden":`true`,size:16}),label:b?`Available`:`Floor`,value:C.secondary})]}):null]}),S(`div`,{className:`lockerverse-auctions__catalog-body`,children:[x(`h3`,{children:r.name}),g?x(t,{className:`lockerverse-auctions__catalog-description`,description:r.description||`View auction item details.`}):null,x(`div`,{className:`lockerverse-auctions__catalog-footer lockerverse-auctions__catalog-footer--item`,children:S(`span`,{className:`lockerverse-auctions__catalog-cta`,children:[C.cta,x(d,{"aria-hidden":`true`,size:16})]})})]})]})})}const k=[{label:`All`,value:`all`},{label:`Live`,value:`active`},{label:`Upcoming`,value:`draft`},{label:`Closed`,value:`finished`}];function A({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 x(`section`,{"aria-label":e.name,className:[`lockerverse-auctions`,`lockerverse-auctions--catalog`,d].filter(Boolean).join(` `),"data-lockerverse-theme":l,style:u,children:x(j,{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 j({auction:n,onSelectItem:i,filter:s,onFilterChange:l,getFilterHref:u,getItemHref:d,itemOrder:p=`position`,backHref:m,autoRotateImages:h=!1,theme:_=`dark`,style:C,showFilters:w=!0,showHeader:T=!0,showLineup:E=!1,onBack:D,renderItem:A}){c(n.startAt,n.endAt,n.items);let[j,M]=y({auctionId:n.id,value:`all`}),N=v(null),P=v(null),F=w?s??(j.auctionId===n.id?j.value:`all`):`all`;g(()=>{M({auctionId:n.id,value:`all`})},[n.id,w]);let I=e=>{M({auctionId:n.id,value:e}),l?.(e)},L=a(n),R=!!(D||m);g(()=>{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 S(b,{children:[S(r,{className:`lockerverse-auctions__catalog-back`,elementRef:e=>{P.current=e},href:m,onBack:D,children:[x(f,{"aria-hidden":`true`,size:16}),`Auctions`]}),T?S(`header`,{className:`lockerverse-auctions__catalog-header`,children:[x(`h2`,{ref:N,tabIndex:-1,children:n.name}),n.status!==`finished`&&L?S(`p`,{className:`lockerverse-auctions__catalog-next`,children:[`Next opens `,o(n,`draft`,L)]}):null,n.description?x(t,{description:n.description}):null]}):null,E?S(`div`,{className:`lockerverse-auctions__catalog-lineup`,children:[S(`div`,{children:[x(`h3`,{children:`Auction lineup`}),x(`p`,{children:`Browse the current collection.`})]}),S(`span`,{children:[H.length,` `,H.length===1?`item`:`items`]})]}):null,w?x(`fieldset`,{"aria-label":`Filter auction items`,className:`lockerverse-auctions__catalog-filters`,children:k.map(t=>{let r=u?.(t.value),i=S(b,{children:[t.label,x(`span`,{children:t.value===`all`?V.length:V.filter(r=>e(n,r)===t.value).length})]});return r?x(`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):x(`button`,{"aria-pressed":F===t.value,onClick:()=>I(t.value),type:`button`,children:i},t.value)})}):null,H.length?x(`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:_};d&&(r.href=d(n,t)),z&&(r.style=z);let{onSelect:a,...o}=r;return x(`li`,{children:A?A(r):x(O,{...o,...i?{onSelect:a}:{},autoRotateImages:h})},t.id)})}):x(`p`,{className:`lockerverse-auctions__catalog-empty`,children:`No items match this auction view.`})]})}export{T as a,w as i,A as n,C as o,O as r,E as s,j 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 { 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
+ {"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 { AuctionImageMediaBase } from \"./auction-image.tsx\";\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 <AuctionImageMediaBase.Provider value={auction.mediaBaseUrl}>\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 </AuctionImageMediaBase.Provider>\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":"2XAYA,MAAa,EAAgB,CAC3B,OAAQ,WACR,MAAO,cACP,SAAU,QACZ,EACA,SAAgB,EAAa,CAC3B,SACA,aAAa,GACb,WACA,QAMC,CACD,IAAM,EAAS,MAAc,CAC3B,IAAM,EAAS,CAAC,GAAG,IAAI,IAAI,GAAQ,OAAO,OAAO,CAAC,CAAC,EAInD,MAHI,CAAC,EAAO,QAAU,GACpB,EAAO,KAAK,CAAQ,EAEf,CACT,EAAG,CAAC,EAAQ,CAAQ,CAAC,EACf,CAAC,EAAO,GAAY,EAAS,CAAC,EAC9B,CAAE,IAAK,EAAU,WAAY,EAAqC,EAClE,CAAC,EAAe,GAAoB,EAAS,EAAI,EACjD,CAAC,EAAa,GAAkB,EAAS,EAAK,EAC9C,EAAS,EAAO,IAAI,GAAa,EACjC,EAAQ,EAAO,OACf,EAAU,GAAc,EAAQ,EAAQ,EAAQ,EA2CtD,OA1CA,MAAgB,CACd,IAAM,EAAS,OAAO,WAAW,kCAAkC,EAC7D,MAAqB,EAAiB,EAAO,OAAO,EAC1D,EAAa,EACb,EAAO,iBAAiB,SAAU,CAAY,EAC9C,IAAM,EAAO,EAAS,SAAS,QAAQ,SAAS,EAC1C,MACJ,EAAe,EAAQ,GAAM,QAAQ,uBAAuB,CAAE,EAC1D,EAAc,GAClB,EACE,GACE,GAAM,QAAQ,QAAQ,GACnB,EAAM,yBAAyB,MAC9B,GAAM,SAAS,EAAM,aAAa,EAE1C,EAMF,OALA,EAAkB,EAClB,GAAM,iBAAiB,aAAc,CAAiB,EACtD,GAAM,iBAAiB,aAAc,CAAiB,EACtD,GAAM,iBAAiB,UAAW,CAAiB,EACnD,GAAM,iBAAiB,WAAY,CAAU,MAChC,CACX,EAAO,oBAAoB,SAAU,CAAY,EACjD,GAAM,oBAAoB,aAAc,CAAiB,EACzD,GAAM,oBAAoB,aAAc,CAAiB,EACzD,GAAM,oBAAoB,UAAW,CAAiB,EACtD,GAAM,oBAAoB,WAAY,CAAU,CAClD,CACF,EAAG,CAAC,CAAQ,CAAC,EACb,MAAgB,CACd,GAAI,CAAC,GAAc,EAAQ,GAAK,CAAC,GAAW,GAAiB,EAC3D,OAEF,IAAM,EAAQ,OAAO,gBAAkB,CACrC,EAAU,GACR,EAAO,QAAQ,IAAI,GAAQ,EAAW,GAAK,IAAU,EAAE,GAClD,EAAW,GAAK,EACjB,CACN,CACF,EAAG,GAAI,EACP,UAAa,OAAO,cAAc,CAAK,CACzC,EAAG,CAAC,EAAY,EAAO,EAAQ,EAAS,EAAe,CAAW,CAAC,EAEjE,EAAC,MAAD,CAAK,UAAU,uCAAuC,IAAK,EACxD,SAAA,EACG,CACE,EACA,GAAI,GAAc,EAAQ,EAAI,EAAE,EAAU,GAAK,CAAK,EAAI,CAAC,CAC3D,CAAC,CAAC,IAAK,GACL,EAAC,EAAD,CACE,IAAK,IAAU,EAAU,EAAO,GAChC,cAAa,IAAU,EACvB,UAAU,sCACV,eAAc,IAAU,EACxB,OAAQ,IAER,QAAQ,OACR,SAAU,IACV,WAAc,EAAO,QAAQ,IAAI,EAAO,IAAU,EAAE,EACpD,MAAM,iEACN,IAAK,EAAO,GACZ,MAAO,GACR,EAPM,EAAO,EAOb,CACF,EACD,IACD,CAAA,CAET,CACA,SAAgB,EAAO,CACrB,OACA,QACA,SAKC,CACD,OACE,EAAC,MAAD,CAAK,UAAU,uCAAf,SAAA,CACE,EAAC,KAAD,CAAA,SAAA,CACG,EACA,CACC,CAAA,CAAA,EACJ,EAAC,KAAD,CAAA,SAAK,CAAU,CAAA,CACZ,GAET,CACA,SAAgB,EAAO,CACrB,UACA,SAAS,EAAwB,CAAO,EACxC,QAKC,CACD,IAAI,EAAQ,GAUZ,OATI,IAAW,UACb,EACE,CAAC,GAAQ,KAAK,MAAM,EAAQ,OAAO,GAAK,KAAK,IAAI,EAC7C,cACA,UAEJ,IAAW,WACb,EAAQ,EAAO,UAAY,SAG3B,EAAC,OAAD,CAAM,UAAU,uCAAhB,SAAA,CACG,EACA,EAAsB,EAAS,EAAQ,CAAI,CACxC,GAEV,CCrHA,SAAS,EAAgB,EAAmB,EAAkC,CAC5E,GAAI,EAAK,WAAa,UAAW,CAC/B,IAAM,EAAU,EAAqB,CAAI,EACnC,EACJ,IAAW,SAAW,UAAY,EAAc,GAElD,MAAO,CACL,KAFY,EAAU,WAAa,EAGnC,IAAK,EACD,WACA,CAAE,OAAQ,UAAW,MAAO,eAAgB,SAAU,WAAY,EAChE,GAEN,MAAOA,EAAY,EAAK,mBAAqB,CAAC,EAC9C,WAAY,UACZ,UACE,EAAK,oBAAsB,KACvB,YACA,OAAO,EAAK,iBAAiB,CACrC,CACF,CACA,MAAO,CACL,KAAM,IAAW,SAAW,OAAS,EAAc,GACnD,IAAK,CAAE,OAAQ,UAAW,MAAO,eAAgB,SAAU,WAAY,EACrE,GAEF,MACE,IAAW,YAAc,CAAC,EAAK,aAC3B,UACAA,EAAY,EAAK,cAAgB,CAAC,EACxC,WAAY,IAAW,WAAa,YAAc,UAClD,UAAWA,EAAY,EAAK,cAAgB,CAAC,CAC/C,CACF,CACA,SAAgB,EAA2B,CACzC,UACA,OACA,WACA,OACA,mBAAmB,GACnB,QAAQ,OACR,YACA,QACA,kBAAkB,GAClB,cAAc,GACd,aAAa,IACqB,CAClC,EACE,EAAK,SAAW,EAAQ,QACxB,EAAK,OAAS,EAAQ,KACxB,EACA,IAAM,EAAS,EAAwB,EAAS,CAAI,EAC9C,EAAS,EAAK,WAAa,UAC3B,EAAU,EAAgB,EAAM,CAAM,EAC5C,OACE,EAAC,MAAD,CACE,UAAW,CACT,uBACA,6BACA,CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,EACX,yBAAwB,EACjB,QAEP,SAAA,EAAC,UAAD,CAAS,UAAU,qCAAnB,SAAA,CACG,EACC,EAAC,IAAD,CACE,aAAY,QAAQ,EAAK,OACzB,UAAU,uCACJ,OACN,QAAU,GAAU,CAEhB,GACA,EAAM,SAAW,GACjB,CAAC,EAAM,SACP,CAAC,EAAM,SACP,CAAC,EAAM,UACP,CAAC,EAAM,SAEP,EAAM,eAAe,EACrB,EAAS,EAEb,EAEA,SAAA,EAAC,OAAD,CAAM,UAAU,wCAAhB,SAAA,CAAwD,QAChD,EAAK,IACP,GACL,CAAA,EAEH,EAAC,SAAD,CACE,aAAY,QAAQ,EAAK,OACzB,UAAU,uCACV,QAAS,EACT,KAAK,QACN,CAAA,EAEH,EAAC,MAAD,CAAK,UAAU,sCAAf,SAAA,CACE,EAAC,EAAsB,SAAvB,CAAgC,MAAO,EAAQ,aAC7C,SAAA,EAAC,EAAD,CACE,WAAY,EACZ,SACE,EAAK,OACL,EAAQ,cAAc,OACtB,EAAQ,WAAW,QACnB,EAAQ,WAAW,UAErB,OAAQ,EAAK,OACb,KAAM,EAAK,IACZ,CAAA,CAC6B,CAAA,EAChC,EAAC,MAAD,CAAK,UAAU,sCAAf,SAAA,CACE,EAAC,OAAD,CACE,UAAU,qCACV,YAAW,IAAW,SAErB,SAAA,EAAQ,IACL,CAAA,EACL,EACC,EAAC,EAAD,CAAiB,UAAe,OAAc,QAAS,CAAA,EACrD,IACD,IACJ,EACC,EAAC,KAAD,CAAI,UAAU,wCAAd,SAAA,CACE,EAAC,EAAD,CACE,KAEI,EADF,EACG,EAEA,EAFD,CAAa,cAAY,OAAO,KAAM,EAAK,CAEN,EAGzC,MAAO,EAAQ,WACf,MAAO,EAAQ,KAChB,CAAA,EACD,EAAC,EAAD,CACE,KAAM,EAAC,EAAD,CAAQ,cAAY,OAAO,KAAM,EAAK,CAAA,EAC5C,MAAO,EAAS,YAAc,QAC9B,MAAO,EAAQ,SAChB,CAAA,CACC,CACF,CAAA,EAAA,IACD,IACL,EAAC,MAAD,CAAK,UAAU,qCAAf,SAAA,CACE,EAAC,KAAD,CAAA,SAAK,EAAK,IAAS,CAAA,EAClB,EACC,EAAC,EAAD,CACE,UAAU,4CACV,YAAa,EAAK,aAAe,4BAClC,CAAA,EACC,KACJ,EAAC,MAAD,CAAK,UAAU,kFACb,SAAA,EAAC,OAAD,CAAM,UAAU,oCAAhB,SAAA,CACG,EAAQ,IACT,EAAC,EAAD,CAAY,cAAY,OAAO,KAAM,EAAK,CAAA,CACtC,GACH,CAAA,CACF,GACE,GACN,CAAA,CAET,CC/IA,MAAM,EAAU,CACd,CAAE,MAAO,MAAO,MAAO,KAAM,EAC7B,CAAE,MAAO,OAAQ,MAAO,QAAS,EACjC,CAAE,MAAO,WAAY,MAAO,OAAQ,EACpC,CAAE,MAAO,SAAU,MAAO,UAAW,CACvC,EAIA,SAAgB,EAAmB,CACjC,UACA,eACA,OAAQ,EACR,iBACA,gBACA,cACA,YAAY,WACZ,WACA,mBAAmB,GACnB,QAAQ,OACR,QACA,YACA,cAAc,GACd,aAAa,GACb,aAAa,GACb,SACA,cAC0B,CAC1B,OACE,EAAC,UAAD,CACE,aAAY,EAAQ,KACpB,UAAW,CACT,uBACA,gCACA,CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,EACX,yBAAwB,EACjB,QAEP,SAAA,EAAC,EAAD,CACW,UACT,GAAK,EAAe,CAAE,cAAa,EAAI,CAAC,EACxC,GAAK,EAAmB,CAAE,OAAQ,CAAiB,EAAI,CAAC,EACxD,GAAK,EAAiB,CAAE,gBAAe,EAAI,CAAC,EAC5C,GAAK,EAAgB,CAAE,eAAc,EAAI,CAAC,EAC1C,GAAK,EAAc,CAAE,aAAY,EAAI,CAAC,EAC3B,YACX,GAAK,EAAW,CAAE,UAAS,EAAI,CAAC,EACd,mBACL,cACD,aACA,aACL,QACP,GAAK,EAAQ,CAAE,OAAM,EAAI,CAAC,EAC1B,GAAK,EAAS,CAAE,QAAO,EAAI,CAAC,EAC5B,GAAK,EAAa,CAAE,YAAW,EAAI,CAAC,CACrC,CAAA,CACM,CAAA,CAEb,CAGA,SAAgB,EAAe,CAC7B,UACA,eACA,OAAQ,EACR,iBACA,gBACA,cACA,YAAY,WACZ,WACA,mBAAmB,GACnB,QAAQ,OACR,QACA,cAAc,GACd,aAAa,GACb,aAAa,GACb,SACA,cAC0B,CAC1B,EAAmB,EAAQ,QAAS,EAAQ,MAAO,EAAQ,KAAK,EAChE,GAAM,CAAC,EAAa,GAAkB,EAGnC,CAAE,UAAW,EAAQ,GAAI,MAAO,KAAM,CAAC,EACpC,EAAa,EAA2B,IAAI,EAC5C,EAAU,EAA8C,IAAI,EAC5D,EAAS,EACV,IACA,EAAY,YAAc,EAAQ,GAAK,EAAY,MAAQ,OAC5D,MACJ,MAAgB,CACd,EAAe,CAAE,UAAW,EAAQ,GAAI,MAAO,KAAM,CAAC,CACxD,EAAG,CAAC,EAAQ,GAAI,CAAW,CAAC,EAC5B,IAAM,EAAgB,GAAwC,CAC5D,EAAe,CAAE,UAAW,EAAQ,GAAI,OAAM,CAAC,EAC/C,IAAiB,CAAK,CACxB,EACM,EAAW,EAAmB,CAAO,EACrC,EAAe,GAAQ,GAAU,GACvC,MAAgB,CACV,IACD,EAAW,SAAW,EAAQ,QAAA,EAAU,MAAM,CAEnD,EAAG,CAAC,EAAQ,GAAI,EAAc,CAAU,CAAC,EACzC,IAAM,EAAY,EACd,OAAO,YACL,OAAO,QAAQ,CAAK,CAAC,CAAC,QAAQ,CAAC,KAC7B,EAAI,WAAW,gBAAgB,CACjC,CACF,EACA,IAAA,GACE,EAAc,CAAE,OAAQ,EAAG,MAAO,EAAG,SAAU,CAAE,EACjD,EAAQ,CAAC,GAAG,EAAQ,KAAK,CAAC,CAAC,MAAM,EAAM,KAEzC,IAAc,eACV,EAAY,EAAwB,EAAS,CAAI,GACjD,EAAY,EAAwB,EAAS,CAAK,GAClD,IAGJ,EAAK,SAAW,EAAM,UACtB,EAAK,UAAU,cAAc,EAAM,SAAS,CAE/C,EACK,EAAW,EAAM,OACpB,GACC,IAAW,OAAS,EAAwB,EAAS,CAAI,IAAM,CACnE,EACA,OACE,EAAA,EAAA,CAAA,SAAA,CACE,EAAC,EAAD,CACE,UAAU,qCACV,WAAa,GAAY,CACvB,EAAQ,QAAU,CACpB,EACA,KAAM,EACE,SANV,SAAA,CAQE,EAAC,EAAD,CAAa,cAAY,OAAO,KAAM,EAAK,CAAA,EAAC,UAE3B,IAClB,EACC,EAAC,SAAD,CAAQ,UAAU,uCAAlB,SAAA,CACE,EAAC,KAAD,CAAI,IAAK,EAAY,SAAU,GAC5B,SAAA,EAAQ,IACP,CAAA,EACH,EAAQ,SAAW,YAAc,EAChC,EAAC,IAAD,CAAG,UAAU,qCAAb,SAAA,CAAkD,cACpC,EAAsB,EAAS,QAAS,CAAQ,CAC3D,CACD,CAAA,EAAA,KACH,EAAQ,YACP,EAAC,EAAD,CAAoB,YAAa,EAAQ,WAAc,CAAA,EACrD,IACE,CACN,CAAA,EAAA,KACH,EACC,EAAC,MAAD,CAAK,UAAU,uCAAf,SAAA,CACE,EAAC,MAAD,CAAA,SAAA,CACE,EAAC,KAAD,CAAA,SAAI,gBAAkB,CAAA,EACtB,EAAC,IAAD,CAAA,SAAG,gCAAiC,CAAA,CACjC,CAAA,CAAA,EACL,EAAC,OAAD,CAAA,SAAA,CACG,EAAS,OAAO,IAAE,EAAS,SAAW,EAAI,OAAS,OAChD,CAAA,CAAA,CACH,CACH,CAAA,EAAA,KACH,EACC,EAAC,WAAD,CACE,aAAW,uBACX,UAAU,wCAET,SAAA,EAAQ,IAAK,GAAW,CACvB,IAAM,EAAO,IAAgB,EAAO,KAAK,EACnC,EACJ,EAAA,EAAA,CAAA,SAAA,CACG,EAAO,MACR,EAAC,OAAD,CAAA,SACG,EAAO,QAAU,MACd,EAAM,OACN,EAAM,OACH,GACC,EAAwB,EAAS,CAAI,IACrC,EAAO,KACX,CAAC,CAAC,MACF,CAAA,CACN,CAAA,CAAA,EAEJ,OAAO,EACL,EAAC,IAAD,CACE,eAAc,IAAW,EAAO,MAAQ,OAAS,IAAA,GAC3C,OAEN,QAAU,GAAU,CAEhB,GACA,EAAM,SAAW,GACjB,CAAC,EAAM,SACP,CAAC,EAAM,SACP,CAAC,EAAM,UACP,CAAC,EAAM,SAEP,EAAM,eAAe,EACrB,EAAa,EAAO,KAAK,EAE7B,EAEC,SAAA,CACA,EAhBI,EAAO,KAgBX,EAEH,EAAC,SAAD,CACE,eAAc,IAAW,EAAO,MAEhC,YAAe,EAAa,EAAO,KAAK,EACxC,KAAK,SAEJ,SAAA,CACK,EALD,EAAO,KAKN,CAEZ,CAAC,CACO,CAAA,EACR,KACH,EAAS,OACR,EAAC,KAAD,CAAI,UAAU,qCACX,SAAA,EAAS,IAAK,GAAS,CACtB,IAAM,EAA+C,CACnD,UACA,OACA,aAAgB,IAAe,EAAS,CAAI,EAC5C,OAAQ,EAAwB,EAAS,CAAI,EAC7C,OACF,EACI,IACF,EAAQ,KAAO,EAAY,EAAS,CAAI,GAEtC,IACF,EAAQ,MAAQ,GAElB,GAAM,CAAE,WAAU,GAAG,GAAgB,EACrC,OACE,EAAC,KAAD,CAAA,SACG,EACC,EAAW,CAAO,EAElB,EAAC,EAAD,CACE,GAAI,EACJ,GAAK,EAAe,CAAE,UAAS,EAAI,CAAC,EAClB,kBACnB,CAAA,CAED,EAVK,EAAK,EAUV,CAER,CAAC,CACC,CAAA,EAEJ,EAAC,IAAD,CAAG,UAAU,sCAAsC,SAAA,mCAEhD,CAAA,CAEL,CAAA,CAAA,CAEN"}
@@ -1,6 +1,6 @@
1
1
  # Lockerverse auctions guide
2
2
 
3
- Package: @lockerverse/react@0.2.157
3
+ Package: @lockerverse/react@0.2.159
4
4
 
5
5
  Generated from this release's maintained documentation. Do not edit this copy.
6
6
 
@@ -18,6 +18,10 @@ The item layout responds to its container width, so the same component can fill
18
18
 
19
19
  For public item pages, pass `backHref` to `LockerverseAuctionItem` so its return controls are real links. Add `onBack` to connect ordinary clicks to the host router or item selection; modified clicks keep native browser behavior. `onBack` without `backHref` keeps the existing button controls. Pass `communityName` only when the host needs to override the API community name. Keep the catalog mounted but hidden while showing an item to preserve the selected auction and filter. The example demonstrates this pattern.
20
20
 
21
+ On a dedicated public item page, pass `itemHeadingLevel={1}` and use a non-heading label for the shared auction title so the item name is the page’s main heading. The default is level 2 for embedded details. This changes heading semantics without changing its visual style.
22
+
23
+ The inline gallery gives the first photo high fetch priority, loads the selected photo eagerly, and loads other photos lazily. Lazy photos use their rendered width when the browser supports automatic image sizing. Set `galleryImageSizes` to a responsive HTML `sizes` value that matches your page container when its layout differs from the default full-width mobile and 45vw desktop layout. This also sizes the first photo correctly before hydration. Full-screen photos keep their separate viewport sizes.
24
+
21
25
  Pass `returnToItemHref` to add a **Return to item** link after a completed bid or purchase. It opens the item URL as a fresh page visit. When `backHref` or `onBack` is also supplied, **View auction items** remains as the secondary action. The completed result uses `backHref` as a fresh page visit when it is set. The link does not reset or resume checkout in the mounted component. Hosts that restore purchase recovery must clear completed recovery before a new page visit.
22
26
 
23
27
  For internal adoption, import these same SDK components and stylesheet. Keep routing, page metadata, and the site header in the app. Change auction presentation in the SDK rather than copying its markup or styles into a second implementation. The host owns route URLs, metadata, and page chrome; the SDK owns the shared auction presentation.
@@ -80,6 +84,8 @@ const auctions = useLockerverseAuctions({
80
84
 
81
85
  This option also works with `useLockerverseAuction` and `createLockerverseAuctionClient`. It changes Lockerverse auction, community, and item image URLs on every list, load, and refresh. Other image hosts keep their original URLs. Without this option, all image URLs stay unchanged. The host must configure the rewrite before using the option; the SDK does not create it.
82
86
 
87
+ The returned auction retains `mediaBaseUrl`. Pass the full auction snapshot to the React components, including when you serialize server-loaded data as `initialAuction`. Auction cards, item photos, thumbnails, and the full-screen gallery use the existing responsive WebP sizes through that exact proxy origin and path. The proxy must forward the `w` and `f` query parameters unchanged. Images outside that path, signed URLs, and unsupported formats keep their original URLs; a failed resized image falls back to its original URL.
88
+
83
89
  ## A page for one auction
84
90
 
85
91
  Use `LockerverseAuction` when the host already knows which auction to show. It goes straight to that auction's items, without an intermediate auction-list card. Use `useLockerverseAuction(options, auctionSlug)` from `@lockerverse/react/auction-data` for a dedicated page. It calls `client.load(auctionSlug)` directly and never requests the community auction list. The host handles initial loading, errors, and missing auctions before rendering this component.
package/guides/events.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Lockerverse events guide
2
2
 
3
- Package: @lockerverse/react@0.2.157
3
+ Package: @lockerverse/react@0.2.159
4
4
 
5
5
  Generated from this release's maintained documentation. Do not edit this copy.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Lockerverse integration guide
2
2
 
3
- Package: @lockerverse/react@0.2.157
3
+ Package: @lockerverse/react@0.2.159
4
4
 
5
5
  Generated from this release's maintained documentation. Do not edit this copy.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Lockerverse payment-widgets guide
2
2
 
3
- Package: @lockerverse/react@0.2.157
3
+ Package: @lockerverse/react@0.2.159
4
4
 
5
5
  Generated from this release's maintained documentation. Do not edit this copy.
6
6
 
package/guides/signup.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Lockerverse signup guide
2
2
 
3
- Package: @lockerverse/react@0.2.157
3
+ Package: @lockerverse/react@0.2.159
4
4
 
5
5
  Generated from this release's maintained documentation. Do not edit this copy.
6
6
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lockerverse/react",
3
- "version": "0.2.157",
3
+ "version": "0.2.159",
4
4
  "description": "Tree-shakable React payment and signup UI for Lockerverse",
5
5
  "repository": {
6
6
  "type": "git",
@@ -134,7 +134,7 @@
134
134
  "embla-carousel-react": "8.6.0",
135
135
  "lucide-react": "0.536.0",
136
136
  "valibot": "1.4.2",
137
- "@lockerverse/sdk": "0.2.157"
137
+ "@lockerverse/sdk": "0.2.159"
138
138
  },
139
139
  "devDependencies": {
140
140
  "@size-limit/file": "13.0.3",