@lockerverse/react 0.2.100 → 0.2.102
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -18
- package/dist/auction-base.css +116 -0
- package/dist/auction-catalog.css +355 -0
- package/dist/auction-checkout.css +266 -0
- package/dist/auction-data.d.ts +16 -0
- package/dist/auction-data.d.ts.map +1 -0
- package/dist/auction-data.js +2 -0
- package/dist/auction-data.js.map +1 -0
- package/dist/auction-gallery.css +298 -0
- package/dist/auction-item-layout.css +298 -0
- package/dist/auction-item.css +4 -0
- package/dist/auction-item.d.ts +6 -0
- package/dist/auction-item.d.ts.map +1 -1
- package/dist/auction-item.js +1 -1
- package/dist/auction-item.js.map +1 -1
- package/dist/auction.css +2 -0
- package/dist/auction.d.ts +3 -0
- package/dist/auction.js +1 -0
- package/dist/auctions.css +5 -221
- package/dist/auctions.d.ts +6 -19
- package/dist/auctions.d.ts.map +1 -1
- package/dist/auctions.js +1 -1
- package/dist/auctions.js.map +1 -1
- package/dist/immutable-resource-identity.js.map +1 -1
- package/dist/lockerverse-auction-item-card.d.ts +47 -0
- package/dist/lockerverse-auction-item-card.d.ts.map +1 -0
- package/dist/lockerverse-auction.js +2 -0
- package/dist/lockerverse-auction.js.map +1 -0
- package/dist/lockerverse-payment.js +1 -1
- package/dist/lockerverse-payment.js.map +1 -1
- package/dist/phone.js +1 -1
- package/dist/signup.js +1 -1
- package/dist/signup.js.map +1 -1
- package/dist/use-auction-boundary.js +2 -0
- package/dist/use-auction-boundary.js.map +1 -0
- package/dist/use-lockerverse-auctions.d.ts +13 -0
- package/dist/use-lockerverse-auctions.d.ts.map +1 -0
- package/dist/use-lockerverse-auctions.js +2 -0
- package/dist/use-lockerverse-auctions.js.map +1 -0
- package/package.json +34 -3
- package/dist/format-money.js +0 -2
- package/dist/format-money.js.map +0 -1
package/dist/auctions.css
CHANGED
|
@@ -1,221 +1,5 @@
|
|
|
1
|
-
.
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
--lockerverse-muted: rgb(255 255 255 / 66%);
|
|
7
|
-
--lockerverse-radius: 10px;
|
|
8
|
-
--lockerverse-text: #fff;
|
|
9
|
-
--lockerverse-font-family: ui-sans-serif, system-ui, sans-serif;
|
|
10
|
-
box-sizing: border-box;
|
|
11
|
-
width: 100%;
|
|
12
|
-
padding: clamp(16px, 4%, 24px);
|
|
13
|
-
font: 15px / 1.5 var(--lockerverse-font-family);
|
|
14
|
-
color: var(--lockerverse-text);
|
|
15
|
-
background: var(--lockerverse-bg);
|
|
16
|
-
border-radius: var(--lockerverse-radius);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
.lockerverse-auctions[data-lockerverse-theme="light"] {
|
|
20
|
-
--lockerverse-bg: #fff;
|
|
21
|
-
--lockerverse-border: rgb(18 20 22 / 14%);
|
|
22
|
-
--lockerverse-control: #f5f6f7;
|
|
23
|
-
--lockerverse-muted: rgb(18 20 22 / 64%);
|
|
24
|
-
--lockerverse-text: #121416;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
.lockerverse-auctions * {
|
|
28
|
-
box-sizing: border-box;
|
|
29
|
-
}
|
|
30
|
-
.lockerverse-auctions h2 {
|
|
31
|
-
margin: 0;
|
|
32
|
-
font-size: 24px;
|
|
33
|
-
line-height: 1.25;
|
|
34
|
-
text-wrap: balance;
|
|
35
|
-
}
|
|
36
|
-
.lockerverse-auctions h3 {
|
|
37
|
-
margin: 0;
|
|
38
|
-
font-size: 19px;
|
|
39
|
-
line-height: 1.3;
|
|
40
|
-
overflow-wrap: anywhere;
|
|
41
|
-
}
|
|
42
|
-
.lockerverse-auctions p {
|
|
43
|
-
margin: 8px 0;
|
|
44
|
-
color: var(--lockerverse-muted);
|
|
45
|
-
overflow-wrap: anywhere;
|
|
46
|
-
white-space: pre-line;
|
|
47
|
-
}
|
|
48
|
-
.lockerverse-auctions__header {
|
|
49
|
-
margin-bottom: 24px;
|
|
50
|
-
}
|
|
51
|
-
.lockerverse-auctions__grid {
|
|
52
|
-
display: grid;
|
|
53
|
-
grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr));
|
|
54
|
-
gap: 20px;
|
|
55
|
-
padding: 0;
|
|
56
|
-
margin: 0;
|
|
57
|
-
list-style: none;
|
|
58
|
-
}
|
|
59
|
-
.lockerverse-auctions__card {
|
|
60
|
-
display: flex;
|
|
61
|
-
flex-direction: column;
|
|
62
|
-
height: 100%;
|
|
63
|
-
overflow: hidden;
|
|
64
|
-
background: var(--lockerverse-control);
|
|
65
|
-
border: 1px solid var(--lockerverse-border);
|
|
66
|
-
border-radius: var(--lockerverse-radius);
|
|
67
|
-
}
|
|
68
|
-
.lockerverse-auctions__image {
|
|
69
|
-
display: block;
|
|
70
|
-
width: 100%;
|
|
71
|
-
height: auto;
|
|
72
|
-
aspect-ratio: 1.28;
|
|
73
|
-
object-fit: cover;
|
|
74
|
-
}
|
|
75
|
-
.lockerverse-auctions__body {
|
|
76
|
-
display: flex;
|
|
77
|
-
flex: 1;
|
|
78
|
-
flex-direction: column;
|
|
79
|
-
gap: 12px;
|
|
80
|
-
padding: 20px;
|
|
81
|
-
}
|
|
82
|
-
.lockerverse-auctions__meta {
|
|
83
|
-
font-size: 13px;
|
|
84
|
-
color: var(--lockerverse-muted);
|
|
85
|
-
}
|
|
86
|
-
.lockerverse-auctions__metrics {
|
|
87
|
-
display: flex;
|
|
88
|
-
flex-wrap: wrap;
|
|
89
|
-
gap: 16px;
|
|
90
|
-
margin: 0 0 4px;
|
|
91
|
-
}
|
|
92
|
-
.lockerverse-auctions__metrics dt {
|
|
93
|
-
font-size: 13px;
|
|
94
|
-
color: var(--lockerverse-muted);
|
|
95
|
-
}
|
|
96
|
-
.lockerverse-auctions__metrics dd {
|
|
97
|
-
margin: 0;
|
|
98
|
-
font-size: 18px;
|
|
99
|
-
font-weight: 600;
|
|
100
|
-
font-variant-numeric: tabular-nums;
|
|
101
|
-
}
|
|
102
|
-
.lockerverse-auctions button {
|
|
103
|
-
min-height: 44px;
|
|
104
|
-
padding: 10px 16px;
|
|
105
|
-
font: inherit;
|
|
106
|
-
font-weight: 600;
|
|
107
|
-
color: var(--lockerverse-text);
|
|
108
|
-
touch-action: manipulation;
|
|
109
|
-
cursor: pointer;
|
|
110
|
-
background: var(--lockerverse-control);
|
|
111
|
-
border: 1px solid var(--lockerverse-border);
|
|
112
|
-
border-radius: var(--lockerverse-radius);
|
|
113
|
-
}
|
|
114
|
-
.lockerverse-auctions button:hover {
|
|
115
|
-
border-color: var(--lockerverse-text);
|
|
116
|
-
}
|
|
117
|
-
.lockerverse-auctions button:focus-visible,
|
|
118
|
-
.lockerverse-auctions h2:focus-visible {
|
|
119
|
-
outline: 2px solid var(--lockerverse-accent);
|
|
120
|
-
outline-offset: 3px;
|
|
121
|
-
}
|
|
122
|
-
.lockerverse-auctions__body > button {
|
|
123
|
-
width: 100%;
|
|
124
|
-
margin-top: auto;
|
|
125
|
-
}
|
|
126
|
-
.lockerverse-auctions__back {
|
|
127
|
-
margin-bottom: 20px;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
.lockerverse-auctions__detail {
|
|
131
|
-
display: grid;
|
|
132
|
-
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
133
|
-
gap: 32px;
|
|
134
|
-
}
|
|
135
|
-
.lockerverse-auctions__gallery {
|
|
136
|
-
display: flex;
|
|
137
|
-
gap: 8px;
|
|
138
|
-
min-width: 0;
|
|
139
|
-
padding: 0;
|
|
140
|
-
margin-top: 12px;
|
|
141
|
-
overflow-x: auto;
|
|
142
|
-
border: 0;
|
|
143
|
-
}
|
|
144
|
-
.lockerverse-auctions__gallery button {
|
|
145
|
-
padding: 2px;
|
|
146
|
-
cursor: pointer;
|
|
147
|
-
background: none;
|
|
148
|
-
border: 2px solid transparent;
|
|
149
|
-
border-radius: 4px;
|
|
150
|
-
}
|
|
151
|
-
.lockerverse-auctions__gallery button[aria-pressed="true"] {
|
|
152
|
-
border-color: var(--lockerverse-accent);
|
|
153
|
-
}
|
|
154
|
-
.lockerverse-auctions__gallery img {
|
|
155
|
-
display: block;
|
|
156
|
-
object-fit: cover;
|
|
157
|
-
}
|
|
158
|
-
.lockerverse-auctions__checkout {
|
|
159
|
-
display: grid;
|
|
160
|
-
gap: 16px;
|
|
161
|
-
padding: 24px;
|
|
162
|
-
border: 1px solid var(--lockerverse-border);
|
|
163
|
-
border-radius: var(--lockerverse-radius);
|
|
164
|
-
}
|
|
165
|
-
.lockerverse-auctions__checkout fieldset {
|
|
166
|
-
display: grid;
|
|
167
|
-
gap: 16px;
|
|
168
|
-
min-width: 0;
|
|
169
|
-
padding: 0;
|
|
170
|
-
margin: 0;
|
|
171
|
-
border: 0;
|
|
172
|
-
}
|
|
173
|
-
.lockerverse-auctions__checkout h4 {
|
|
174
|
-
margin: 4px 0 0;
|
|
175
|
-
}
|
|
176
|
-
.lockerverse-auctions__field {
|
|
177
|
-
display: grid;
|
|
178
|
-
gap: 8px;
|
|
179
|
-
}
|
|
180
|
-
.lockerverse-auctions__field input {
|
|
181
|
-
width: 100%;
|
|
182
|
-
min-width: 0;
|
|
183
|
-
min-height: 48px;
|
|
184
|
-
padding: 10px 12px;
|
|
185
|
-
font: inherit;
|
|
186
|
-
font-size: 16px;
|
|
187
|
-
color: var(--lockerverse-text);
|
|
188
|
-
background: var(--lockerverse-control);
|
|
189
|
-
border: 1px solid var(--lockerverse-border);
|
|
190
|
-
border-radius: var(--lockerverse-radius);
|
|
191
|
-
}
|
|
192
|
-
.lockerverse-auctions__fee {
|
|
193
|
-
display: flex;
|
|
194
|
-
gap: 10px;
|
|
195
|
-
align-items: center;
|
|
196
|
-
min-height: 44px;
|
|
197
|
-
}
|
|
198
|
-
.lockerverse-auctions__fee input {
|
|
199
|
-
width: 20px;
|
|
200
|
-
height: 20px;
|
|
201
|
-
accent-color: var(--lockerverse-accent);
|
|
202
|
-
}
|
|
203
|
-
.lockerverse-auctions__notice {
|
|
204
|
-
padding: 12px;
|
|
205
|
-
border: 1px solid var(--lockerverse-border);
|
|
206
|
-
border-radius: var(--lockerverse-radius);
|
|
207
|
-
}
|
|
208
|
-
.lockerverse-auctions input:focus-visible,
|
|
209
|
-
.lockerverse-auctions__gallery button:focus-visible {
|
|
210
|
-
outline: 2px solid var(--lockerverse-accent);
|
|
211
|
-
outline-offset: 3px;
|
|
212
|
-
}
|
|
213
|
-
@media (max-width: 720px) {
|
|
214
|
-
.lockerverse-auctions__detail {
|
|
215
|
-
grid-template-columns: minmax(0, 1fr);
|
|
216
|
-
gap: 24px;
|
|
217
|
-
}
|
|
218
|
-
.lockerverse-auctions__checkout {
|
|
219
|
-
padding: 16px;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
1
|
+
@import "./auction-catalog.css";
|
|
2
|
+
@import "./auction-gallery.css";
|
|
3
|
+
@import "./auction-checkout.css";
|
|
4
|
+
@import "./auction-base.css";
|
|
5
|
+
@import "./auction-item-layout.css";
|
package/dist/auctions.d.ts
CHANGED
|
@@ -1,25 +1,12 @@
|
|
|
1
|
+
import { n as useLockerverseAuctions, t as UseLockerverseAuctionsResult } from "./use-lockerverse-auctions.js";
|
|
1
2
|
import { n as LockerverseTheme, t as LockerverseStyle } from "./theme.js";
|
|
2
|
-
import {
|
|
3
|
-
//#region src/use-lockerverse-auctions.d.ts
|
|
4
|
-
type UseLockerverseAuctionsResult = {
|
|
5
|
-
client: LockerverseAuctionClient;
|
|
6
|
-
auctions: LockerverseAuction[] | null;
|
|
7
|
-
loading: boolean;
|
|
8
|
-
error: LockerverseSdkError | null;
|
|
9
|
-
refresh: () => void;
|
|
10
|
-
};
|
|
11
|
-
declare function useLockerverseAuctions(options: CreateLockerverseAuctionOptions): UseLockerverseAuctionsResult;
|
|
12
|
-
//#endregion
|
|
3
|
+
import { a as LockerverseAuctionProps, i as LockerverseAuctionItemRenderContext, n as LockerverseAuctionItemCardProps, r as LockerverseAuction, t as LockerverseAuctionItemCard } from "./lockerverse-auction-item-card.js";
|
|
13
4
|
//#region src/lockerverse-auctions.d.ts
|
|
14
|
-
type LockerverseAuctionsProps = {
|
|
5
|
+
type LockerverseAuctionsProps = Omit<LockerverseAuctionProps, "auction" | "onBack"> & {
|
|
15
6
|
auctions: UseLockerverseAuctionsResult;
|
|
16
|
-
onSelectItem: (auction: LockerverseAuction, item: LockerverseAuctionItem) => void;
|
|
17
|
-
theme?: LockerverseTheme;
|
|
18
|
-
style?: LockerverseStyle;
|
|
19
|
-
className?: string;
|
|
20
7
|
};
|
|
21
|
-
/** Optional
|
|
22
|
-
declare function LockerverseAuctions({ auctions, onSelectItem, theme, style, className }: LockerverseAuctionsProps): import("react").JSX.Element;
|
|
8
|
+
/** Optional auction browser. Select an auction to show its items. */
|
|
9
|
+
declare function LockerverseAuctions({ auctions, onSelectItem, theme, style, className, showFilters, showHeader, showLineup, renderItem }: LockerverseAuctionsProps): import("react").JSX.Element;
|
|
23
10
|
//#endregion
|
|
24
|
-
export { LockerverseAuctions, type LockerverseStyle, type LockerverseTheme, type UseLockerverseAuctionsResult, useLockerverseAuctions };
|
|
11
|
+
export { LockerverseAuction, LockerverseAuctionItemCard, type LockerverseAuctionItemCardProps, type LockerverseAuctionItemRenderContext, type LockerverseAuctionProps, LockerverseAuctions, type LockerverseAuctionsProps, type LockerverseStyle, type LockerverseTheme, type UseLockerverseAuctionsResult, useLockerverseAuctions };
|
|
25
12
|
//# sourceMappingURL=auctions.d.ts.map
|
package/dist/auctions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auctions.d.ts","names":[],"sources":["../src/
|
|
1
|
+
{"version":3,"file":"auctions.d.ts","names":[],"sources":["../src/lockerverse-auctions.tsx"],"mappings":";;;;KAkBY,2BAA2B,KACrC;EAGA,UAAU;;;iBA+EI,sBACd,UACA,cACA,OACA,OACA,WACA,aACA,YACA,YACA,cACC,2CAAwB,IAAA"}
|
package/dist/auctions.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as
|
|
1
|
+
import{a as e,s 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}){n(a.startAt,a.endAt);let l=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,u=a.description||{active:`Bidding is open across this auction's 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:[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:l,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:u,links:!1}),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,onSelectItem:t,theme:n=`dark`,style:r,className:i,showFilters:a=!0,showHeader:o=!0,showLineup:s=!0,renderItem:c}){let[u,d]=g(null),f=h(null),p=h(null),_=h(u),b=e.auctions?.find(e=>e.id===u);return m(()=>{if(_.current!==u){if(u===null){let e=[...p.current?.querySelectorAll(`button[data-auction-id]`)??[]].find(e=>e.dataset.auctionId===_.current);(f.current??e??p.current)?.focus()}_.current=u}},[u]),y(`section`,{"aria-busy":e.loading,"aria-label":`Auctions`,className:[`lockerverse-auctions`,`lockerverse-auctions--catalog`,i].filter(Boolean).join(` `),"data-lockerverse-theme":n,ref:p,style:r,tabIndex:-1,children:[!b&&o?v(`header`,{className:`lockerverse-auctions__catalog-header`,children:v(`h2`,{ref:f,tabIndex:-1,children:`Auctions`})}):null,e.loading?v(`p`,{role:`status`,children:`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,b?v(l,{auction:b,onBack:()=>d(null),onSelectItem:t,showFilters:a,showHeader:o,showLineup:s,theme:n,...r?{style:r}:{},...c?{renderItem:c}:{}},b.id):v(S,{auctions:e.auctions,onSelectAuction:d,showLineup:s})]})}function S({auctions:e,showLineup:t,onSelectAuction:n}){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,onSelect:()=>n(e.id)})},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};
|
|
2
2
|
//# sourceMappingURL=auctions.js.map
|
package/dist/auctions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auctions.js","names":[],"sources":["../src/lockerverse-auctions.tsx","../src/use-lockerverse-auctions.ts"],"sourcesContent":["import type {\n LockerverseAuction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { formatMoney } from \"./format-money.ts\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\nimport type { UseLockerverseAuctionsResult } from \"./use-lockerverse-auctions.ts\";\n\nexport type LockerverseAuctionsProps = {\n auctions: UseLockerverseAuctionsResult;\n onSelectItem: (\n auction: LockerverseAuction,\n item: LockerverseAuctionItem\n ) => void;\n theme?: LockerverseTheme;\n style?: LockerverseStyle;\n className?: string;\n};\n\nconst STATUS_LABELS = {\n active: \"Live now\",\n draft: \"Coming soon\",\n finished: \"Closed\",\n} satisfies Record<LockerverseAuctionStatus, string>;\nconst dateFormatter = new Intl.DateTimeFormat(\"en-US\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n timeZone: \"UTC\",\n});\n\nfunction AuctionTiming({ auction }: { auction: LockerverseAuction }) {\n const boundary = auction.status === \"draft\" ? auction.startAt : auction.endAt;\n const date = new Date(boundary);\n if (!Number.isFinite(date.getTime())) {\n return null;\n }\n const label = { active: \"Ends\", draft: \"Opens\", finished: \"Ended\" }[\n auction.status\n ];\n return (\n <span className=\"lockerverse-auctions__meta\">\n {label} <time dateTime={boundary}>{dateFormatter.format(date)} UTC</time>\n </span>\n );\n}\n\nfunction CatalogImage({ src }: { src: string | null | undefined }) {\n return src ? (\n <img\n alt=\"\"\n className=\"lockerverse-auctions__image\"\n height={250}\n loading=\"lazy\"\n src={src}\n width={320}\n />\n ) : null;\n}\n\nfunction AuctionCard({\n auction,\n onSelect,\n}: {\n auction: LockerverseAuction;\n onSelect: () => void;\n}) {\n return (\n <article className=\"lockerverse-auctions__card\">\n <CatalogImage\n src={\n auction.configuration.image ??\n auction.items.find((item) => item.image)?.image\n }\n />\n <div className=\"lockerverse-auctions__body\">\n <span className=\"lockerverse-auctions__meta\">\n {STATUS_LABELS[auction.status]} · {auction.items.length}{\" \"}\n {auction.items.length === 1 ? \"item\" : \"items\"}\n </span>\n <h3>{auction.name}</h3>\n <AuctionTiming auction={auction} />\n <button\n aria-label={`View items in ${auction.name}`}\n onClick={onSelect}\n type=\"button\"\n >\n View items\n </button>\n </div>\n </article>\n );\n}\n\nfunction ItemCard({\n auction,\n item,\n onSelect,\n}: {\n auction: LockerverseAuction;\n item: LockerverseAuctionItem;\n onSelect: () => void;\n}) {\n const status = auction.status === \"active\" ? item.status : auction.status;\n const canBuyNow = item.saleMode !== \"auction\";\n const canBid = item.saleMode !== \"buy_now\";\n return (\n <article className=\"lockerverse-auctions__card\">\n <CatalogImage\n src={item.image ?? item.images[0] ?? auction.configuration.image}\n />\n <div className=\"lockerverse-auctions__body\">\n <span className=\"lockerverse-auctions__meta\">\n {canBuyNow && item.isSoldOut ? \"Sold out\" : STATUS_LABELS[status]}\n </span>\n <h3>{item.name}</h3>\n <dl className=\"lockerverse-auctions__metrics\">\n {canBid ? (\n <div>\n <dt>\n {item.maxBidAmount === null ? \"Starting bid\" : \"Current bid\"}\n </dt>\n <dd>\n {formatMoney(item.maxBidAmount ?? item.minBidAmount ?? 0)}\n </dd>\n </div>\n ) : null}\n {canBuyNow && item.buyNowPriceAmount !== null ? (\n <div>\n <dt>Buy now</dt>\n <dd>{formatMoney(item.buyNowPriceAmount)}</dd>\n </div>\n ) : null}\n {canBuyNow && item.availableQuantity !== null ? (\n <div>\n <dt>Available</dt>\n <dd>{item.availableQuantity}</dd>\n </div>\n ) : null}\n </dl>\n <button\n aria-label={`View ${item.name}`}\n onClick={onSelect}\n type=\"button\"\n >\n View item\n </button>\n </div>\n </article>\n );\n}\n\n/** Optional catalog UI. Use onSelectItem to open your item view or LockerverseAuctionItem. */\nexport function LockerverseAuctions({\n auctions,\n onSelectItem,\n theme = \"dark\",\n style,\n className,\n}: LockerverseAuctionsProps) {\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const headingRef = useRef<HTMLHeadingElement>(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 headingRef.current?.focus();\n previousId.current = selectedId;\n }\n }, [selectedId]);\n return (\n <section\n aria-busy={auctions.loading}\n aria-label=\"Auctions\"\n className={[\"lockerverse-auctions\", className].filter(Boolean).join(\" \")}\n data-lockerverse-theme={theme}\n style={style}\n >\n <header className=\"lockerverse-auctions__header\">\n {selected ? (\n <button\n className=\"lockerverse-auctions__back\"\n onClick={() => setSelectedId(null)}\n type=\"button\"\n >\n Back to auctions\n </button>\n ) : null}\n <h2 ref={headingRef} tabIndex={-1}>\n {selected?.name ?? \"Auctions\"}\n </h2>\n {selected?.description ? <p>{selected.description}</p> : null}\n {selected ? <AuctionTiming auction={selected} /> : null}\n </header>\n {auctions.loading ? <p role=\"status\">Loading auctions…</p> : 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 && selected.items.length === 0 ? (\n <p>No items are available in this auction.</p>\n ) : null}\n {selected && selected.items.length > 0 ? (\n <ul className=\"lockerverse-auctions__grid\">\n {selected.items.map((item) => (\n <li key={item.id}>\n <ItemCard\n auction={selected}\n item={item}\n onSelect={() => onSelectItem(selected, item)}\n />\n </li>\n ))}\n </ul>\n ) : null}\n {!selected && auctions.auctions?.length === 0 ? (\n <p>No auctions are available.</p>\n ) : null}\n {!selected && auctions.auctions && auctions.auctions.length > 0 ? (\n <ul className=\"lockerverse-auctions__grid\">\n {auctions.auctions.map((auction) => (\n <li key={auction.id}>\n <AuctionCard\n auction={auction}\n onSelect={() => setSelectedId(auction.id)}\n />\n </li>\n ))}\n </ul>\n ) : null}\n </section>\n );\n}\n","import {\n type CreateLockerverseAuctionOptions,\n createLockerverseAuctionClient,\n type LockerverseAuction,\n type LockerverseAuctionClient,\n type LockerverseSdkError,\n} from \"@lockerverse/sdk/auctions\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\n\nexport type UseLockerverseAuctionsResult = {\n client: LockerverseAuctionClient;\n auctions: LockerverseAuction[] | null;\n loading: boolean;\n error: LockerverseSdkError | null;\n refresh: () => void;\n};\n\ntype AuctionLoadState = Pick<\n UseLockerverseAuctionsResult,\n \"auctions\" | \"error\"\n>;\n\nexport function useLockerverseAuctions(\n options: CreateLockerverseAuctionOptions\n): UseLockerverseAuctionsResult {\n useImmutableResourceIdentity(\"auctions\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n slug: \"\",\n });\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n const [client] = useState(() =>\n createLockerverseAuctionClient({\n ...options,\n onError: (error) => onErrorRef.current?.(error),\n })\n );\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<AuctionLoadState>({\n auctions: null,\n error: null,\n });\n useEffect(() => {\n let active = true;\n client.list().then(\n (auctions) => {\n if (active) {\n setState({ auctions, error: null });\n }\n },\n (error: LockerverseSdkError) => {\n if (active) {\n setState({ auctions: null, error });\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, revision]);\n const refresh = useCallback(() => {\n setState({ auctions: null, error: null });\n setRevision((value) => value + 1);\n }, []);\n return {\n ...state,\n client,\n loading: state.auctions === null && state.error === null,\n refresh,\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 {\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};\n\nfunction AuctionCard({\n auction,\n onSelect,\n}: {\n auction: Auction;\n onSelect: () => void;\n}) {\n useAuctionBoundary(auction.startAt, auction.endAt);\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 across this auction's 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 <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 <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 links={false}\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 onSelectItem,\n theme = \"dark\",\n style,\n className,\n showFilters = true,\n showHeader = true,\n showLineup = true,\n renderItem,\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 ? <p role=\"status\">Loading auctions…</p> : 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 onSelectItem={onSelectItem}\n showFilters={showFilters}\n showHeader={showHeader}\n showLineup={showLineup}\n theme={theme}\n {...(style ? { style } : {})}\n {...(renderItem ? { renderItem } : {})}\n />\n ) : (\n <AuctionList\n auctions={auctions.auctions}\n onSelectAuction={setSelectedId}\n showLineup={showLineup}\n />\n )}\n </section>\n );\n}\n\nfunction AuctionList({\n auctions,\n showLineup,\n onSelectAuction,\n}: {\n auctions: Auction[] | null;\n showLineup: boolean;\n onSelectAuction: (id: string) => void;\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 onSelect={() => onSelectAuction(auction.id)}\n />\n </li>\n ))}\n </ul>\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"immutable-resource-identity.js","names":[],"sources":["../src/immutable-resource-identity.ts"],"sourcesContent":["import { useRef } from \"react\";\n\ntype LockerverseResourceIdentity = {\n apiBaseUrl: string | undefined;\n communitySlug: string;\n environment: string | undefined;\n slug: string;\n};\n\nfunction hasSameIdentity(\n initial: LockerverseResourceIdentity,\n current: LockerverseResourceIdentity\n) {\n return (\n initial.apiBaseUrl === current.apiBaseUrl &&\n initial.communitySlug === current.communitySlug &&\n initial.environment === current.environment &&\n initial.slug === current.slug\n );\n}\n\nexport function useImmutableResourceIdentity(\n resource: \"payment widget\" | \"signup\" | \"auctions\",\n identity: LockerverseResourceIdentity\n) {\n const initial = useRef(identity);\n if (!hasSameIdentity(initial.current, identity)) {\n throw new TypeError(\n `Lockerverse ${resource} identity cannot change after initialization. Remount with a new React key.`\n );\n }\n}\n"],"mappings":"+BASA,SAAS,EACP,EACA,EACA,CACA,OACE,EAAQ,aAAe,EAAQ,YAC/B,EAAQ,gBAAkB,EAAQ,eAClC,EAAQ,cAAgB,EAAQ,aAChC,EAAQ,OAAS,EAAQ,IAE7B,CAEA,SAAgB,EACd,EACA,EACA,CAEA,GAAI,CAAC,EADW,EAAO,CACI,CAAC,CAAC,QAAS,CAAQ,EAC5C,MAAU,UACR,eAAe,EAAS,4EAC1B,CAEJ"}
|
|
1
|
+
{"version":3,"file":"immutable-resource-identity.js","names":[],"sources":["../src/immutable-resource-identity.ts"],"sourcesContent":["import { useRef } from \"react\";\n\ntype LockerverseResourceIdentity = {\n apiBaseUrl: string | undefined;\n communitySlug: string;\n environment: string | undefined;\n slug: string;\n};\n\nfunction hasSameIdentity(\n initial: LockerverseResourceIdentity,\n current: LockerverseResourceIdentity\n) {\n return (\n initial.apiBaseUrl === current.apiBaseUrl &&\n initial.communitySlug === current.communitySlug &&\n initial.environment === current.environment &&\n initial.slug === current.slug\n );\n}\n\nexport function useImmutableResourceIdentity(\n resource: \"payment widget\" | \"signup\" | \"auctions\" | \"auction\",\n identity: LockerverseResourceIdentity\n) {\n const initial = useRef(identity);\n if (!hasSameIdentity(initial.current, identity)) {\n throw new TypeError(\n `Lockerverse ${resource} identity cannot change after initialization. Remount with a new React key.`\n );\n }\n}\n"],"mappings":"+BASA,SAAS,EACP,EACA,EACA,CACA,OACE,EAAQ,aAAe,EAAQ,YAC/B,EAAQ,gBAAkB,EAAQ,eAClC,EAAQ,cAAgB,EAAQ,aAChC,EAAQ,OAAS,EAAQ,IAE7B,CAEA,SAAgB,EACd,EACA,EACA,CAEA,GAAI,CAAC,EADW,EAAO,CACI,CAAC,CAAC,QAAS,CAAQ,EAC5C,MAAU,UACR,eAAe,EAAS,4EAC1B,CAEJ"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { n as LockerverseTheme, t as LockerverseStyle } from "./theme.js";
|
|
2
|
+
import { ReactNode } from "react";
|
|
3
|
+
import { LockerverseAuction, LockerverseAuctionItem, LockerverseAuctionStatus } from "@lockerverse/sdk/auctions";
|
|
4
|
+
//#region src/lockerverse-auction.d.ts
|
|
5
|
+
type LockerverseAuctionItemRenderContext = {
|
|
6
|
+
auction: LockerverseAuction;
|
|
7
|
+
item: LockerverseAuctionItem;
|
|
8
|
+
/** Effective auction and item status, including elapsed closing dates. */
|
|
9
|
+
status: LockerverseAuctionStatus;
|
|
10
|
+
onSelect: () => void;
|
|
11
|
+
/** Parent theme and Lockerverse CSS custom properties for default-card reuse. */
|
|
12
|
+
theme: LockerverseTheme;
|
|
13
|
+
style?: LockerverseStyle;
|
|
14
|
+
};
|
|
15
|
+
type LockerverseAuctionProps = {
|
|
16
|
+
auction: LockerverseAuction;
|
|
17
|
+
onSelectItem: (auction: LockerverseAuction, item: LockerverseAuctionItem) => void;
|
|
18
|
+
theme?: LockerverseTheme;
|
|
19
|
+
style?: LockerverseStyle;
|
|
20
|
+
className?: string;
|
|
21
|
+
showFilters?: boolean;
|
|
22
|
+
showHeader?: boolean;
|
|
23
|
+
showLineup?: boolean;
|
|
24
|
+
onBack?: () => void;
|
|
25
|
+
/** Replace the card inside each list item. Keep onSelect connected to your item view. */
|
|
26
|
+
renderItem?: (context: LockerverseAuctionItemRenderContext) => ReactNode;
|
|
27
|
+
};
|
|
28
|
+
/** Display one loaded auction. Fetching and item navigation stay with the host. */
|
|
29
|
+
declare function LockerverseAuction$1({ auction, onSelectItem, theme, style, className, showFilters, showHeader, showLineup, onBack, renderItem }: LockerverseAuctionProps): import("react").JSX.Element;
|
|
30
|
+
//#endregion
|
|
31
|
+
//#region src/lockerverse-auction-item-card.d.ts
|
|
32
|
+
type LockerverseAuctionItemCardProps = {
|
|
33
|
+
auction: LockerverseAuction;
|
|
34
|
+
item: LockerverseAuctionItem;
|
|
35
|
+
onSelect: () => void;
|
|
36
|
+
theme?: LockerverseTheme;
|
|
37
|
+
/** Applied to the scoped card container. */
|
|
38
|
+
className?: string;
|
|
39
|
+
style?: LockerverseStyle;
|
|
40
|
+
showDescription?: boolean;
|
|
41
|
+
showMetrics?: boolean;
|
|
42
|
+
showTiming?: boolean;
|
|
43
|
+
};
|
|
44
|
+
declare function LockerverseAuctionItemCard({ auction, item, onSelect, theme, className, style, showDescription, showMetrics, showTiming }: LockerverseAuctionItemCardProps): import("react").JSX.Element;
|
|
45
|
+
//#endregion
|
|
46
|
+
export { LockerverseAuctionProps as a, LockerverseAuctionItemRenderContext as i, LockerverseAuctionItemCardProps as n, LockerverseAuction$1 as r, LockerverseAuctionItemCard as t };
|
|
47
|
+
//# sourceMappingURL=lockerverse-auction-item-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockerverse-auction-item-card.d.ts","names":[],"sources":["../src/lockerverse-auction.tsx","../src/lockerverse-auction-item-card.tsx"],"mappings":";;;;KAaY;EACV,SAAS;EACT,MAAM;;EAEN,QAAQ;EACR;;EAEA,OAAO;EACP,QAAQ;;KAEE;EACV,SAAS;EACT,eAAe,SAAS,oBAAS,MAAM;EACvC,QAAQ;EACR,QAAQ;EACR;EACA;EACA;EACA;EACA;;EAEA,cAAc,SAAS,wCAAwC;;;iBAWjD,uBACd,SACA,cACA,OACA,OACA,WACA,aACA,YACA,YACA,QACA,cACC,0CAAuB,IAAA;;;KCnCd;EACV,SAAS;EACT,MAAM;EACN;EACA,QAAQ;;EAER;EACA,QAAQ;EACR;EACA;EACA;;iBAoCc,6BACd,SACA,MACA,UACA,OACA,WACA,OACA,iBACA,aACA,cACC,kDAA+B,IAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,i as t,n,o as r,r as i,s as a,t as o}from"./use-auction-boundary.js";import{ArrowRight as s,ChevronLeft as c,Clock3 as l,Gavel as u,ShoppingBag as d}from"lucide-react";import{useEffect as f,useMemo as p,useRef as m,useState as h}from"react";import{Fragment as g,jsx as _,jsxs as v}from"react/jsx-runtime";const y={active:`Live now`,draft:`Coming soon`,finished:`Closed`};function b({images:e,fallback:t,name:r}){let i=p(()=>{let n=[...new Set(e?.filter(Boolean))];return!n.length&&t&&n.push(t),n},[e,t]),[a,o]=h(0),{ref:s,visible:c}=n(),[l,u]=h(!0),[d,g]=h(!1),v=m(new Set),y=i.length,b=y?a%y:0;return f(()=>{let e=window.matchMedia(`(prefers-reduced-motion: reduce)`),t=()=>u(e.matches);t(),e.addEventListener(`change`,t);let n=s.current?.closest(`article`),r=()=>g(!!n?.matches(`:hover, :focus-within`)),i=e=>g(!!(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)}},[s]),f(()=>{if(y<2||!c||l||d)return;let e=window.setInterval(()=>{o(e=>v.current.has(i[(e+1)%y]??``)?(e+1)%y:e)},5e3);return()=>window.clearInterval(e)},[y,i,c,l,d]),_(`div`,{className:`lockerverse-auctions__catalog-images`,ref:s,children:y?[b,...y>1?[(b+1)%y]:[]].map(e=>_(`img`,{alt:e===b?r:``,"aria-hidden":e!==b,className:`lockerverse-auctions__catalog-photo`,"data-visible":e===b,height:500,loading:`lazy`,onLoad:()=>v.current.add(i[e]??``),src:i[e],width:640},i[e])):null})}function x({icon:e,label:t,value:n}){return v(`div`,{className:`lockerverse-auctions__catalog-metric`,children:[v(`dt`,{children:[e,t]}),_(`dd`,{children:n})]})}function S({auction:t,status:n=e(t),item:r=!1}){let a=``;return n===`draft`&&(a=`Opens `),n===`active`&&(a=r?`Closes `:`Ends `),v(`span`,{className:`lockerverse-auctions__catalog-timing`,children:[a,i(t,n)]})}function C(e,n){if(e.saleMode===`buy_now`){let i=r(e),a=n===`active`?`Buy now`:y[n];return{chip:i?`Sold out`:a,cta:i?`Sold out`:{active:`Buy now`,draft:`Preview item`,finished:`View item`}[n],price:t(e.buyNowPriceAmount??0),priceLabel:`Buy Now`,secondary:e.availableQuantity===null?`Available`:String(e.availableQuantity)}}return{chip:n===`active`?`Live`:y[n],cta:{active:`Bid now`,draft:`Preview item`,finished:`View item`}[n],price:n===`finished`&&!e.maxBidAmount?`No bids`:t(e.maxBidAmount??0),priceLabel:n===`finished`?`Final bid`:`Current`,secondary:t(e.minBidAmount??0)}}function w({auction:t,item:n,onSelect:r,theme:i=`dark`,className:c,style:f,showDescription:p=!0,showMetrics:m=!0,showTiming:h=!0}){o(t.startAt,t.endAt);let g=e(t,n),y=n.saleMode===`buy_now`,w=C(n,g);return _(`div`,{className:[`lockerverse-auctions`,`lockerverse-auctions--card`,c].filter(Boolean).join(` `),"data-lockerverse-theme":i,style:f,children:v(`article`,{className:`lockerverse-auctions__catalog-card`,children:[_(`button`,{"aria-label":`View ${n.name}`,className:`lockerverse-auctions__catalog-select`,onClick:r,type:`button`}),v(`div`,{className:`lockerverse-auctions__catalog-media`,children:[_(b,{fallback:n.image||t.configuration.image||t.community?.banner||t.community?.thumbnail,images:n.images,name:n.name}),v(`div`,{className:`lockerverse-auctions__catalog-chips`,children:[_(`span`,{className:`lockerverse-auctions__catalog-chip`,"data-live":g===`active`,children:w.chip}),h?_(S,{auction:n.finishedAt&&g===`finished`?{...t,endAt:n.finishedAt}:t,item:!0,status:g}):null]}),m?v(`dl`,{className:`lockerverse-auctions__catalog-metrics`,children:[_(x,{icon:_(y?d:u,{"aria-hidden":`true`,size:16}),label:w.priceLabel,value:w.price}),_(x,{icon:_(l,{"aria-hidden":`true`,size:16}),label:y?`Available`:`Floor`,value:w.secondary})]}):null]}),v(`div`,{className:`lockerverse-auctions__catalog-body`,children:[_(`h3`,{children:n.name}),p?_(a,{className:`lockerverse-auctions__catalog-description`,description:n.description||`View auction item details.`,links:!1}):null,_(`div`,{className:`lockerverse-auctions__catalog-footer lockerverse-auctions__catalog-footer--item`,children:v(`span`,{className:`lockerverse-auctions__catalog-cta`,children:[w.cta,_(s,{"aria-hidden":`true`,size:16})]})})]})]})})}const T=[{label:`All`,value:`all`},{label:`Live`,value:`active`},{label:`Upcoming`,value:`draft`},{label:`Closed`,value:`finished`}];function E({auction:e,onSelectItem:t,theme:n=`dark`,style:r,className:i,showFilters:a=!0,showHeader:o=!0,showLineup:s=!0,onBack:c,renderItem:l}){return _(`section`,{"aria-label":e.name,className:[`lockerverse-auctions`,`lockerverse-auctions--catalog`,i].filter(Boolean).join(` `),"data-lockerverse-theme":n,style:r,children:_(D,{auction:e,onSelectItem:t,showFilters:a,showHeader:o,showLineup:s,theme:n,...r?{style:r}:{},...c?{onBack:c}:{},...l?{renderItem:l}:{}})})}function D({auction:t,onSelectItem:n,theme:r=`dark`,style:i,showFilters:s=!0,showHeader:l=!0,showLineup:u=!0,onBack:d,renderItem:p}){o(t.startAt,t.endAt);let[y,b]=h({auctionId:t.id,value:`all`}),x=m(null),S=m(null),C=s&&y.auctionId===t.id?y.value:`all`;f(()=>{b({auctionId:t.id,value:`all`})},[t.id,s]);let E=!!d;f(()=>{E&&(x.current??S.current)?.focus()},[t.id,E,l]);let D=i?Object.fromEntries(Object.entries(i).filter(([e])=>e.startsWith(`--lockerverse-`))):void 0,O=[...t.items].sort((e,t)=>e.position-t.position||e.createdAt.localeCompare(t.createdAt)),k=O.filter(n=>C===`all`||e(t,n)===C);return v(g,{children:[d?v(`button`,{className:`lockerverse-auctions__catalog-back`,onClick:d,ref:S,type:`button`,children:[_(c,{"aria-hidden":`true`,size:16}),`Auctions`]}):null,l?v(`header`,{className:`lockerverse-auctions__catalog-header`,children:[_(`h2`,{ref:x,tabIndex:-1,children:t.name}),t.description?_(a,{description:t.description}):null]}):null,u?v(`div`,{className:`lockerverse-auctions__catalog-lineup`,children:[v(`div`,{children:[_(`h3`,{children:`Auction lineup`}),_(`p`,{children:`Browse the current collection.`})]}),v(`span`,{children:[k.length,` `,k.length===1?`item`:`items`]})]}):null,s?_(`fieldset`,{"aria-label":`Filter auction items`,className:`lockerverse-auctions__catalog-filters`,children:T.map(n=>v(`button`,{"aria-pressed":C===n.value,onClick:()=>b({auctionId:t.id,value:n.value}),type:`button`,children:[n.label,_(`span`,{children:n.value===`all`?O.length:O.filter(r=>e(t,r)===n.value).length})]},n.value))}):null,k.length?_(`ul`,{className:`lockerverse-auctions__catalog-grid`,children:k.map(i=>{let a={auction:t,item:i,onSelect:()=>n(t,i),status:e(t,i),theme:r};return D&&(a.style=D),_(`li`,{children:p?p(a):_(w,{...a})},i.id)})}):_(`p`,{className:`lockerverse-auctions__catalog-empty`,children:`No items match this auction view.`})]})}export{x as a,b as i,E as n,y as o,w as r,S as s,D as t};
|
|
2
|
+
//# sourceMappingURL=lockerverse-auction.js.map
|
|
@@ -0,0 +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 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 { 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 fallback,\n name,\n}: {\n images?: string[];\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 = 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 (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 }, [count, photos, visible, reducedMotion, interacting]);\n return (\n <div className=\"lockerverse-auctions__catalog-images\" ref={imageRef}>\n {count\n ? [current, ...(count > 1 ? [(current + 1) % count] : [])].map(\n (photo) => (\n <img\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 onLoad={() => loaded.current.add(photos[photo] ?? \"\")}\n src={photos[photo]}\n width={640}\n />\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 = false,\n}: {\n auction: Auction;\n status?: LockerverseAuctionStatus;\n item?: boolean;\n}) {\n let label = \"\";\n if (status === \"draft\") {\n label = \"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)}\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 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 theme = \"dark\",\n className,\n style,\n showDescription = true,\n showMetrics = true,\n showTiming = true,\n}: LockerverseAuctionItemCardProps) {\n useAuctionBoundary(auction.startAt, auction.endAt);\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 <button\n aria-label={`View ${item.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n onClick={onSelect}\n type=\"button\"\n />\n <div className=\"lockerverse-auctions__catalog-media\">\n <CatalogImage\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\n auction={\n item.finishedAt && status === \"finished\"\n ? { ...auction, endAt: item.finishedAt }\n : auction\n }\n item\n status={status}\n />\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 links={false}\n />\n ) : null}\n <div className=\"lockerverse-auctions__catalog-footer lockerverse-auctions__catalog-footer--item\">\n <span className=\"lockerverse-auctions__catalog-cta\">\n {display.cta}\n <ArrowRight aria-hidden=\"true\" size={16} />\n </span>\n </div>\n </div>\n </article>\n </div>\n );\n}\n","import type {\n LockerverseAuction as Auction,\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { ChevronLeft } from \"lucide-react\";\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport { getAuctionDisplayStatus } 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 onSelect: () => void;\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 theme?: LockerverseTheme;\n style?: LockerverseStyle;\n className?: string;\n showFilters?: boolean;\n showHeader?: boolean;\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;\ntype ItemFilter = (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 theme = \"dark\",\n style,\n className,\n showFilters = true,\n showHeader = true,\n showLineup = true,\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 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 theme = \"dark\",\n style,\n showFilters = true,\n showHeader = true,\n showLineup = true,\n onBack,\n renderItem,\n}: LockerverseAuctionProps) {\n useAuctionBoundary(auction.startAt, auction.endAt);\n const [filterState, setFilterState] = useState<{\n auctionId: string;\n value: ItemFilter;\n }>({ auctionId: auction.id, value: \"all\" });\n const headingRef = useRef<HTMLHeadingElement>(null);\n const backRef = useRef<HTMLButtonElement>(null);\n const filter =\n showFilters && filterState.auctionId === auction.id\n ? filterState.value\n : \"all\";\n useEffect(() => {\n setFilterState({ auctionId: auction.id, value: \"all\" });\n }, [auction.id, showFilters]);\n const focusHeading = Boolean(onBack);\n useEffect(() => {\n if (focusHeading) {\n (headingRef.current ?? backRef.current)?.focus();\n }\n }, [auction.id, focusHeading, showHeader]);\n const cardStyle = style\n ? Object.fromEntries(\n Object.entries(style).filter(([key]) =>\n key.startsWith(\"--lockerverse-\")\n )\n )\n : undefined;\n const items = [...auction.items].sort(\n (left, right) =>\n left.position - right.position ||\n left.createdAt.localeCompare(right.createdAt)\n );\n const filtered = items.filter(\n (item) =>\n filter === \"all\" || getAuctionDisplayStatus(auction, item) === filter\n );\n return (\n <>\n {onBack ? (\n <button\n className=\"lockerverse-auctions__catalog-back\"\n onClick={onBack}\n ref={backRef}\n type=\"button\"\n >\n <ChevronLeft aria-hidden=\"true\" size={16} />\n Auctions\n </button>\n ) : null}\n {showHeader ? (\n <header className=\"lockerverse-auctions__catalog-header\">\n <h2 ref={headingRef} tabIndex={-1}>\n {auction.name}\n </h2>\n {auction.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 <button\n aria-pressed={filter === option.value}\n key={option.value}\n onClick={() =>\n setFilterState({ auctionId: auction.id, value: option.value })\n }\n type=\"button\"\n >\n {option.label}\n <span>\n {option.value === \"all\"\n ? items.length\n : items.filter(\n (item) =>\n getAuctionDisplayStatus(auction, item) === option.value\n ).length}\n </span>\n </button>\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 (cardStyle) {\n context.style = cardStyle;\n }\n return (\n <li key={item.id}>\n {renderItem ? (\n renderItem(context)\n ) : (\n <LockerverseAuctionItemCard {...context} />\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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"}
|