@lockerverse/react 0.2.101 → 0.2.103

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +55 -18
  2. package/dist/auction-base.css +128 -0
  3. package/dist/auction-catalog.css +8 -1
  4. package/dist/auction-checkout.css +2 -2
  5. package/dist/auction-data.d.ts +16 -0
  6. package/dist/auction-data.d.ts.map +1 -0
  7. package/dist/auction-data.js +2 -0
  8. package/dist/auction-data.js.map +1 -0
  9. package/dist/auction-item-layout.css +302 -0
  10. package/dist/auction-item.css +4 -0
  11. package/dist/auction-item.d.ts +3 -0
  12. package/dist/auction-item.d.ts.map +1 -1
  13. package/dist/auction-item.js +1 -1
  14. package/dist/auction-item.js.map +1 -1
  15. package/dist/auction.css +2 -0
  16. package/dist/auction.d.ts +3 -0
  17. package/dist/auction.js +1 -0
  18. package/dist/auctions.css +2 -406
  19. package/dist/auctions.d.ts +6 -19
  20. package/dist/auctions.d.ts.map +1 -1
  21. package/dist/auctions.js +1 -1
  22. package/dist/auctions.js.map +1 -1
  23. package/dist/immutable-resource-identity.js.map +1 -1
  24. package/dist/lockerverse-auction-item-card.d.ts +47 -0
  25. package/dist/lockerverse-auction-item-card.d.ts.map +1 -0
  26. package/dist/lockerverse-auction.js +2 -0
  27. package/dist/lockerverse-auction.js.map +1 -0
  28. package/dist/lockerverse-payment.js +1 -1
  29. package/dist/lockerverse-payment.js.map +1 -1
  30. package/dist/phone.js +1 -1
  31. package/dist/signup.js +1 -1
  32. package/dist/signup.js.map +1 -1
  33. package/dist/use-auction-boundary.js +2 -0
  34. package/dist/use-auction-boundary.js.map +1 -0
  35. package/dist/use-lockerverse-auctions.d.ts +13 -0
  36. package/dist/use-lockerverse-auctions.d.ts.map +1 -0
  37. package/dist/use-lockerverse-auctions.js +2 -0
  38. package/dist/use-lockerverse-auctions.js.map +1 -0
  39. package/package.json +26 -3
  40. package/dist/auction-description.js +0 -2
  41. package/dist/auction-description.js.map +0 -1
@@ -0,0 +1 @@
1
+ import{n as e,r as t}from"./lockerverse-auction.js";export{e as LockerverseAuction,t as LockerverseAuctionItemCard};
package/dist/auctions.css CHANGED
@@ -1,409 +1,5 @@
1
1
  @import "./auction-catalog.css";
2
2
  @import "./auction-gallery.css";
3
3
  @import "./auction-checkout.css";
4
-
5
- /* Reference: lockerverse-web-app-next auction pages at 8ead019. */
6
- .lockerverse-auctions {
7
- --lockerverse-accent: #6f8f6d;
8
- --lockerverse-bg: #050505;
9
- --lockerverse-border: rgb(255 255 255 / 10%);
10
- --lockerverse-control: #111216;
11
- --lockerverse-muted: #bbb7c2;
12
- --lockerverse-radius: 24px;
13
- --lockerverse-text: #fff;
14
- --lockerverse-font-family: ui-sans-serif, system-ui, sans-serif;
15
- box-sizing: border-box;
16
- width: 100%;
17
- max-width: 1520px;
18
- padding: 40px 32px;
19
- margin-inline: auto;
20
- container-type: inline-size;
21
- font: 14px / 1.5 var(--lockerverse-font-family);
22
- color: var(--lockerverse-text);
23
- background: var(--lockerverse-bg);
24
- border-radius: 0;
25
- }
26
-
27
- .lockerverse-auctions[data-lockerverse-theme="light"] {
28
- --lockerverse-bg: #fff;
29
- --lockerverse-border: rgb(18 20 22 / 14%);
30
- --lockerverse-control: #f5f6f7;
31
- --lockerverse-muted: rgb(18 20 22 / 64%);
32
- --lockerverse-text: #121416;
33
- }
34
-
35
- .lockerverse-auctions * {
36
- box-sizing: border-box;
37
- }
38
- .lockerverse-auctions h2 {
39
- margin: 0;
40
- font-size: 24px;
41
- line-height: 1.25;
42
- text-wrap: balance;
43
- }
44
- .lockerverse-auctions h3 {
45
- margin: 0;
46
- font-size: 19px;
47
- line-height: 1.3;
48
- overflow-wrap: anywhere;
49
- }
50
- .lockerverse-auctions p {
51
- margin: 8px 0;
52
- color: var(--lockerverse-muted);
53
- overflow-wrap: anywhere;
54
- white-space: pre-line;
55
- }
56
- .lockerverse-auctions button {
57
- font-family: inherit;
58
- touch-action: manipulation;
59
- cursor: pointer;
60
- }
61
- .lockerverse-auctions button:hover {
62
- border-color: var(--lockerverse-text);
63
- }
64
- .lockerverse-auctions button:focus-visible,
65
- .lockerverse-auctions h2:focus-visible {
66
- outline: 2px solid var(--lockerverse-accent);
67
- outline-offset: 3px;
68
- }
69
- .lockerverse-auctions__field {
70
- display: grid;
71
- gap: 8px;
72
- }
73
- .lockerverse-auctions__field input {
74
- width: 100%;
75
- min-width: 0;
76
- min-height: 48px;
77
- padding: 10px 12px;
78
- font: inherit;
79
- font-size: 16px;
80
- color: var(--lockerverse-text);
81
- background: var(--lockerverse-control);
82
- border: 1px solid var(--lockerverse-border);
83
- border-radius: var(--lockerverse-radius);
84
- }
85
- .lockerverse-auctions__notice {
86
- padding: 12px;
87
- border: 1px solid var(--lockerverse-border);
88
- border-radius: var(--lockerverse-radius);
89
- }
90
- .lockerverse-auctions input:focus-visible {
91
- outline: 2px solid var(--lockerverse-accent);
92
- outline-offset: 3px;
93
- }
94
- .lockerverse-auctions__detail {
95
- display: grid;
96
- grid-template-columns: minmax(360px, 0.9fr) minmax(540px, 1.1fr);
97
- gap: 32px;
98
- align-items: start;
99
- }
100
- .lockerverse-auctions__item-summary {
101
- min-width: 0;
102
- overflow: hidden;
103
- background: var(--lockerverse-control);
104
- border: 1px solid var(--lockerverse-border);
105
- border-radius: 12px;
106
- }
107
- .lockerverse-auctions__item-copy {
108
- padding: 20px 24px;
109
- border-top: 1px solid var(--lockerverse-border);
110
- }
111
- .lockerverse-auctions__item-copy h2 {
112
- margin-top: 16px;
113
- font-size: 36px;
114
- font-weight: 600;
115
- line-height: 1.12;
116
- }
117
- .lockerverse-auctions .lockerverse-auctions__eyebrow {
118
- margin: 0;
119
- font-size: 11px;
120
- font-weight: 500;
121
- line-height: 1.7;
122
- text-transform: uppercase;
123
- letter-spacing: 0.18em;
124
- }
125
- .lockerverse-auctions__item-description {
126
- margin-top: 16px;
127
- }
128
- .lockerverse-auctions__description {
129
- line-height: 2;
130
- overflow-wrap: anywhere;
131
- }
132
- .lockerverse-auctions__description p {
133
- color: inherit;
134
- }
135
- .lockerverse-auctions__description ul {
136
- padding-left: 20px;
137
- list-style: disc;
138
- }
139
- .lockerverse-auctions__description ol {
140
- padding-left: 20px;
141
- list-style: decimal;
142
- }
143
- .lockerverse-auctions__description li {
144
- margin-block: 4px;
145
- }
146
- .lockerverse-auctions__description a {
147
- color: inherit;
148
- text-decoration: underline;
149
- }
150
- .lockerverse-auctions__description blockquote {
151
- padding-left: 16px;
152
- margin-inline: 0;
153
- border-left: 2px solid currentColor;
154
- }
155
- .lockerverse-auctions__description pre {
156
- overflow-x: auto;
157
- }
158
- .lockerverse-auctions__description-clamped {
159
- display: -webkit-box;
160
- -webkit-box-orient: vertical;
161
- overflow: hidden;
162
- -webkit-line-clamp: 4;
163
- }
164
- .lockerverse-auctions .lockerverse-auctions__description-toggle {
165
- min-height: 32px;
166
- padding: 6px 12px;
167
- margin-top: 12px;
168
- font-size: 10px;
169
- font-weight: 500;
170
- color: var(--lockerverse-text);
171
- text-transform: uppercase;
172
- letter-spacing: 0.14em;
173
- background: var(--lockerverse-control);
174
- border: 1px solid var(--lockerverse-border);
175
- border-radius: 999px;
176
- }
177
- .lockerverse-auctions__stat-panel {
178
- margin: 20px 0 0;
179
- overflow: hidden;
180
- background: rgb(0 0 0 / 18%);
181
- border: 1px solid var(--lockerverse-border);
182
- border-radius: 24px;
183
- }
184
- .lockerverse-auctions__stat-row {
185
- display: flex;
186
- gap: 16px;
187
- align-items: center;
188
- justify-content: space-between;
189
- padding: 16px 24px;
190
- border-bottom: 1px solid var(--lockerverse-border);
191
- }
192
- .lockerverse-auctions__stat-row:last-child {
193
- border-bottom: 0;
194
- }
195
- .lockerverse-auctions__stat-panel dt {
196
- font-size: 11px;
197
- font-weight: 500;
198
- color: var(--lockerverse-muted);
199
- text-transform: uppercase;
200
- letter-spacing: 0.12em;
201
- }
202
- .lockerverse-auctions__stat-panel dd {
203
- margin: 0;
204
- font-size: 20px;
205
- font-weight: 500;
206
- font-variant-numeric: tabular-nums;
207
- text-align: right;
208
- }
209
- .lockerverse-auctions__stat-panel .lockerverse-auctions__stat-date {
210
- font-size: 15px;
211
- }
212
- .lockerverse-auctions__stat-footer {
213
- display: grid;
214
- grid-template-columns: 1fr 1fr;
215
- }
216
- .lockerverse-auctions__stat-footer > div {
217
- padding: 12px 24px;
218
- }
219
- .lockerverse-auctions__stat-footer > div + div {
220
- border-left: 1px solid var(--lockerverse-border);
221
- }
222
- .lockerverse-auctions__stat-footer dd {
223
- margin-top: 4px;
224
- font-size: 14px;
225
- text-align: left;
226
- }
227
- .lockerverse-auctions__transaction {
228
- display: grid;
229
- gap: 24px;
230
- min-width: 0;
231
- }
232
- .lockerverse-auctions__progress {
233
- display: flex;
234
- flex-wrap: wrap;
235
- gap: 8px;
236
- padding: 24px;
237
- background: rgb(128 128 128 / 4%);
238
- border: 1px solid var(--lockerverse-border);
239
- border-radius: 28px;
240
- }
241
- .lockerverse-auctions__progress span {
242
- padding: 10px 16px;
243
- font-size: 14px;
244
- font-weight: 500;
245
- border: 1px solid var(--lockerverse-border);
246
- border-radius: 999px;
247
- }
248
- .lockerverse-auctions__selection {
249
- overflow: hidden;
250
- background: var(--lockerverse-control);
251
- border: 1px solid var(--lockerverse-border);
252
- border-radius: 32px;
253
- box-shadow: 0 30px 90px rgb(0 0 0 / 20%);
254
- }
255
- .lockerverse-auctions__selection-header,
256
- .lockerverse-auctions__selection-body {
257
- padding: 28px;
258
- }
259
- .lockerverse-auctions__selection-header {
260
- border-bottom: 1px solid var(--lockerverse-border);
261
- }
262
- .lockerverse-auctions__selection h3 {
263
- margin-top: 12px;
264
- font-size: 30px;
265
- font-weight: 600;
266
- letter-spacing: -0.04em;
267
- }
268
- .lockerverse-auctions__selection p {
269
- margin-top: 12px;
270
- font-size: 14px;
271
- line-height: 2;
272
- }
273
- .lockerverse-auctions__selection strong {
274
- color: var(--lockerverse-text);
275
- }
276
- .lockerverse-auctions__amount-control {
277
- position: relative;
278
- display: block;
279
- }
280
- .lockerverse-auctions__amount-control > span {
281
- position: absolute;
282
- top: 50%;
283
- left: 20px;
284
- font-size: 24px;
285
- color: var(--lockerverse-muted);
286
- transform: translateY(-50%);
287
- }
288
- .lockerverse-auctions__amount-control input {
289
- height: 78px;
290
- padding-left: 24px;
291
- font-size: 36px;
292
- font-weight: 600;
293
- letter-spacing: -0.05em;
294
- background: rgb(0 0 0 / 25%);
295
- border-radius: 24px;
296
- }
297
- .lockerverse-auctions__amount-control > span + input {
298
- padding-left: 48px;
299
- }
300
- .lockerverse-auctions__selection-footer {
301
- display: flex;
302
- flex-wrap: wrap;
303
- gap: 16px;
304
- align-items: center;
305
- justify-content: space-between;
306
- padding-top: 20px;
307
- margin-top: 24px;
308
- border-top: 1px solid var(--lockerverse-border);
309
- }
310
- .lockerverse-auctions__selection-footer > p {
311
- flex: 1 1 220px;
312
- margin: 0;
313
- }
314
- .lockerverse-auctions .lockerverse-auctions__button {
315
- min-height: 48px;
316
- padding: 12px 24px;
317
- font-size: 14px;
318
- font-weight: 600;
319
- color: #fff;
320
- text-transform: uppercase;
321
- letter-spacing: 0.14em;
322
- background: var(--lockerverse-accent);
323
- border: 0;
324
- border-radius: 999px;
325
- }
326
- .lockerverse-auctions button:disabled {
327
- cursor: not-allowed;
328
- opacity: 0.5;
329
- }
330
- .lockerverse-auctions .lockerverse-auctions__back {
331
- min-height: 40px;
332
- padding: 8px 12px;
333
- margin-bottom: 16px;
334
- font-size: 14px;
335
- font-weight: 500;
336
- color: var(--lockerverse-text);
337
- background: rgb(128 128 128 / 6%);
338
- border: 1px solid var(--lockerverse-border);
339
- border-radius: 999px;
340
- }
341
- .lockerverse-auctions .lockerverse-auctions__footer-back {
342
- justify-self: end;
343
- min-height: 44px;
344
- padding: 0;
345
- font-size: 14px;
346
- font-weight: 500;
347
- color: var(--lockerverse-muted);
348
- background: transparent;
349
- border: 0;
350
- }
351
- .lockerverse-auctions__read-only {
352
- padding: 24px;
353
- }
354
- .lockerverse-auctions__read-only > p {
355
- line-height: 2;
356
- }
357
- .lockerverse-auctions__read-only .lockerverse-auctions__button {
358
- margin-top: 20px;
359
- }
360
- @media (max-width: 1279px) {
361
- .lockerverse-auctions__detail {
362
- grid-template-columns: minmax(0, 1fr);
363
- }
364
- }
365
- @media (max-width: 720px) {
366
- .lockerverse-auctions__detail {
367
- gap: 24px;
368
- }
369
- }
370
- @media (max-width: 639px) {
371
- .lockerverse-auctions {
372
- padding: 32px 16px;
373
- }
374
- .lockerverse-auctions__item-copy {
375
- padding: 20px;
376
- }
377
- .lockerverse-auctions__item-copy h2 {
378
- font-size: 30px;
379
- }
380
- .lockerverse-auctions__selection-header,
381
- .lockerverse-auctions__selection-body {
382
- padding: 24px;
383
- }
384
- .lockerverse-auctions__selection-footer {
385
- flex-direction: column;
386
- align-items: stretch;
387
- }
388
- .lockerverse-auctions__selection-footer > p {
389
- flex-basis: auto;
390
- }
391
- }
392
-
393
- @container (max-width: 1150px) {
394
- .lockerverse-auctions__detail {
395
- grid-template-columns: minmax(0, 1fr);
396
- }
397
- }
398
-
399
- .lockerverse-auctions__stat-row dt,
400
- .lockerverse-auctions__progress span {
401
- display: flex;
402
- gap: 10px;
403
- align-items: center;
404
- }
405
- .lockerverse-auctions__progress svg,
406
- .lockerverse-auctions__stat-row dt svg {
407
- flex-shrink: 0;
408
- opacity: 0.65;
409
- }
4
+ @import "./auction-base.css";
5
+ @import "./auction-item-layout.css";
@@ -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 { CreateLockerverseAuctionOptions, LockerverseAuction, LockerverseAuctionClient, LockerverseAuctionItem, LockerverseSdkError } from "@lockerverse/sdk/auctions";
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 catalog UI, shared with the Lockerverse auction design. */
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
@@ -1 +1 @@
1
- {"version":3,"file":"auctions.d.ts","names":[],"sources":["../src/use-lockerverse-auctions.ts","../src/lockerverse-auctions.tsx"],"mappings":";;;KAUY;EACV,QAAQ;EACR,UAAU;EACV;EACA,OAAO;EACP;;iBAQc,uBACd,SAAS,kCACR;;;KCTS;EACV,UAAU;EACV,eACE,SAAS,oBACT,MAAM;EAER,QAAQ;EACR,QAAQ;EACR;;;iBA4Sc,sBACd,UACA,cACA,OACA,OACA,aACC,2CAAwB,IAAA"}
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{a as e,i as t,o as n,r,t as i}from"./auction-description.js";import{t as a}from"./immutable-resource-identity.js";import{useCallback as o,useEffect as s,useRef as c,useState as l}from"react";import{createLockerverseAuctionClient as u}from"@lockerverse/sdk/auctions";import{Fragment as d,jsx as f,jsxs as p}from"react/jsx-runtime";const m={active:`Live now`,draft:`Coming soon`,finished:`Closed`},h=[{label:`All`,value:`all`},{label:`Live`,value:`active`},{label:`Upcoming`,value:`draft`},{label:`Closed`,value:`finished`}];function g({images:e,fallback:t,name:n}){let r=[...new Set(e?.filter(Boolean))];!r.length&&t&&r.push(t);let[i,a]=l(0),o=c(null),u=c(new Set),d=r.length,p=d?i%d:0;return s(()=>{if(d<2)return;let e=window.matchMedia(`(prefers-reduced-motion: reduce)`),t=window.setInterval(()=>{document.hidden||e.matches||o.current?.closest(`article`)?.matches(`:hover, :focus-within`)||a(e=>u.current.has(r[(e+1)%d]??``)?(e+1)%d:e)},5e3);return()=>window.clearInterval(t)},[d,r]),f(`div`,{className:`lockerverse-auctions__catalog-images`,ref:o,children:d?[p,...d>1?[(p+1)%d]:[]].map(e=>f(`img`,{alt:e===p?n:``,"aria-hidden":e!==p,className:`lockerverse-auctions__catalog-photo`,"data-visible":e===p,height:500,loading:`lazy`,onLoad:()=>u.current.add(r[e]??``),src:r[e],width:640},r[e])):null})}function _({icon:e,label:t,value:n}){return p(`div`,{className:`lockerverse-auctions__catalog-metric`,children:[p(`dt`,{children:[f(r,{kind:e}),t]}),f(`dd`,{children:n})]})}function v({auction:e,status:r=n(e),item:i=!1}){let a=``;return r===`draft`&&(a=`Opens `),r===`active`&&(a=i?`Closes `:`Ends `),p(`span`,{className:`lockerverse-auctions__catalog-timing`,children:[a,t(e,r)]})}function y({auction:e,onSelect:t}){let a=e.configuration.image||e.items.find(e=>e.image||e.images.length)?.image||e.items.find(e=>e.images.length)?.images[0]||e.community?.banner||e.community?.thumbnail,o=e.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.`}[n(e)];return p(`article`,{className:`lockerverse-auctions__catalog-card`,children:[f(`button`,{"aria-label":`View items in ${e.name}`,className:`lockerverse-auctions__catalog-select`,onClick:t,type:`button`}),p(`div`,{className:`lockerverse-auctions__catalog-media`,children:[f(g,{fallback:a,name:e.name}),p(`div`,{className:`lockerverse-auctions__catalog-chips`,children:[f(`span`,{className:`lockerverse-auctions__catalog-chip`,children:m[n(e)]}),f(v,{auction:e})]}),p(`dl`,{className:`lockerverse-auctions__catalog-metrics`,children:[f(_,{icon:`items`,label:`Items`,value:String(e.items.length)}),f(_,{icon:`gavel`,label:`Bids`,value:String(e.items.reduce((e,t)=>e+t.bidCount,0))})]})]}),p(`div`,{className:`lockerverse-auctions__catalog-body`,children:[f(`h3`,{children:e.name}),f(i,{className:`lockerverse-auctions__catalog-description`,description:o,links:!1}),p(`div`,{className:`lockerverse-auctions__catalog-footer`,children:[f(`span`,{className:`lockerverse-auctions__catalog-cta`,children:n(e)===`draft`?`Preview items`:`View items`}),f(`span`,{className:`lockerverse-auctions__catalog-arrow`,children:f(r,{kind:`arrow`})})]})]})]})}function b(t,n){if(t.saleMode===`buy_now`){let n=t.isSoldOut?`Sold out`:`Buy now`;return{chip:n,cta:n,price:e(t.buyNowPriceAmount??0),priceLabel:`Buy Now`,secondary:t.availableQuantity===null?`Available`:String(t.availableQuantity)}}return{chip:n===`active`?`Live`:m[n],cta:{active:`Bid now`,draft:`Preview item`,finished:`View item`}[n],price:n===`finished`&&!t.maxBidAmount?`No bids`:e(t.maxBidAmount??0),priceLabel:n===`finished`?`Final bid`:`Current`,secondary:e(t.minBidAmount??0)}}function x({auction:e,item:t,onSelect:a}){let o=n(e,t),s=t.saleMode===`buy_now`,c=b(t,o);return p(`article`,{className:`lockerverse-auctions__catalog-card`,children:[f(`button`,{"aria-label":`View ${t.name}`,className:`lockerverse-auctions__catalog-select`,onClick:a,type:`button`}),p(`div`,{className:`lockerverse-auctions__catalog-media`,children:[f(g,{fallback:t.image||e.configuration.image||e.community?.banner||e.community?.thumbnail,images:t.images,name:t.name}),p(`div`,{className:`lockerverse-auctions__catalog-chips`,children:[f(`span`,{className:`lockerverse-auctions__catalog-chip`,"data-live":o===`active`,children:c.chip}),f(v,{auction:t.finishedAt&&o===`finished`?{...e,endAt:t.finishedAt}:e,item:!0,status:o})]}),p(`dl`,{className:`lockerverse-auctions__catalog-metrics`,children:[f(_,{icon:s?`bag`:`gavel`,label:c.priceLabel,value:c.price}),f(_,{icon:`clock`,label:s?`Available`:`Floor`,value:c.secondary})]})]}),p(`div`,{className:`lockerverse-auctions__catalog-body`,children:[f(`h3`,{children:t.name}),f(i,{className:`lockerverse-auctions__catalog-description`,description:t.description||`View auction item details.`,links:!1}),f(`div`,{className:`lockerverse-auctions__catalog-footer lockerverse-auctions__catalog-footer--item`,children:p(`span`,{className:`lockerverse-auctions__catalog-cta`,children:[c.cta,f(r,{kind:`arrow`})]})})]})]})}function S({auctions:e,onSelectItem:t,theme:a=`dark`,style:o,className:u}){let[m,g]=l(null),[_,v]=l(`all`),y=c(null),b=c(m),x=e.auctions?.find(e=>e.id===m);s(()=>{b.current!==m&&(y.current?.focus(),b.current=m)},[m]);let S=[...x?.items??[]].sort((e,t)=>e.position-t.position||e.createdAt.localeCompare(t.createdAt)),w=x?S.filter(e=>_===`all`||n(x,e)===_):[];return p(`section`,{"aria-busy":e.loading,"aria-label":`Auctions`,className:[`lockerverse-auctions`,`lockerverse-auctions--catalog`,u].filter(Boolean).join(` `),"data-lockerverse-theme":a,style:o,children:[p(`header`,{className:`lockerverse-auctions__catalog-header`,children:[x?p(`button`,{className:`lockerverse-auctions__catalog-back`,onClick:()=>{g(null),v(`all`)},type:`button`,children:[f(r,{kind:`back`}),`Auctions`]}):null,f(`h2`,{ref:y,tabIndex:-1,children:x?.name??`Auctions`}),x?.description?f(i,{description:x.description}):null]}),e.loading?f(`p`,{role:`status`,children:`Loading auctions…`}):null,e.error?p(`div`,{role:`alert`,children:[f(`p`,{children:e.error.message}),f(`button`,{onClick:e.refresh,type:`button`,children:`Try again`})]}):null,e.auctions&&(x||e.auctions.length>0)?p(d,{children:[p(`div`,{className:`lockerverse-auctions__catalog-lineup`,children:[p(`div`,{children:[f(`h3`,{children:`Auction lineup`}),f(`p`,{children:`Browse the current collection.`})]}),f(`span`,{children:x?`${w.length} ${w.length===1?`item`:`items`}`:`${e.auctions.length} ${e.auctions.length===1?`auction`:`auctions`}`})]}),x?f(`fieldset`,{"aria-label":`Filter auction items`,className:`lockerverse-auctions__catalog-filters`,children:h.map(e=>p(`button`,{"aria-pressed":_===e.value,onClick:()=>v(e.value),type:`button`,children:[e.label,f(`span`,{children:e.value===`all`?S.length:S.filter(t=>n(x,t)===e.value).length})]},e.value))}):null]}):null,f(C,{auctions:e.auctions,filtered:w,onSelectAuction:e=>{g(e),v(`all`)},onSelectItem:t,selected:x})]})}function C({selected:e,filtered:t,auctions:n,onSelectItem:r,onSelectAuction:i}){return e?t.length?f(`ul`,{className:`lockerverse-auctions__catalog-grid`,children:t.map(t=>f(`li`,{children:f(x,{auction:e,item:t,onSelect:()=>r(e,t)})},t.id))}):f(`p`,{className:`lockerverse-auctions__catalog-empty`,children:`No items match this auction view.`}):n?n.length?f(`ul`,{className:`lockerverse-auctions__catalog-grid`,children:n.map(e=>f(`li`,{children:f(y,{auction:e,onSelect:()=>i(e.id)})},e.id))}):p(`div`,{className:`lockerverse-auctions__catalog-empty`,children:[f(`h3`,{children:`No auctions yet.`}),f(`p`,{children:`Published auctions will appear here once they are available.`})]}):null}function w(e){a(`auctions`,{apiBaseUrl:e.apiBaseUrl,communitySlug:e.communitySlug,environment:e.environment,slug:``});let t=c(e.onError);t.current=e.onError;let[n]=l(()=>u({...e,onError:e=>t.current?.(e)})),[r,i]=l(0),[d,f]=l({auctions:null,error:null});s(()=>{let e=!0;return n.list().then(t=>{e&&f({auctions:t,error:null})},t=>{e&&f({auctions:null,error:t})}),()=>{e=!1}},[n,r]);let p=o(()=>{f({auctions:null,error:null}),i(e=>e+1)},[]);return{...d,client:n,loading:d.auctions===null&&d.error===null,refresh:p}}export{S as LockerverseAuctions,w as useLockerverseAuctions};
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
@@ -1 +1 @@
1
- {"version":3,"file":"auctions.js","names":["Icon","formatMoney"],"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 { AuctionDescription } from \"./auction-description.tsx\";\nimport {\n formatAuctionBoundary,\n formatAuctionMoney as formatMoney,\n getAuctionDisplayStatus,\n} from \"./auction-display.ts\";\nimport { AuctionIcon as Icon } from \"./auction-icons.tsx\";\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};\nconst STATUS_LABELS = {\n active: \"Live now\",\n draft: \"Coming soon\",\n finished: \"Closed\",\n} satisfies Record<LockerverseAuctionStatus, string>;\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\nfunction CatalogImage({\n images,\n fallback,\n name,\n}: {\n images?: string[];\n fallback?: string | null | undefined;\n name: string;\n}) {\n const photos = [...new Set(images?.filter(Boolean))];\n if (!photos.length && fallback) {\n photos.push(fallback);\n }\n const [index, setIndex] = useState(0);\n const imageRef = useRef<HTMLDivElement>(null);\n const loaded = useRef(new Set<string>());\n const count = photos.length;\n const current = count ? index % count : 0;\n useEffect(() => {\n if (count < 2) {\n return;\n }\n const motion = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const timer = window.setInterval(() => {\n if (\n document.hidden ||\n motion.matches ||\n imageRef.current?.closest(\"article\")?.matches(\":hover, :focus-within\")\n ) {\n return;\n }\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]);\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}\nfunction Metric({\n icon,\n label,\n value,\n}: {\n icon: \"items\" | \"gavel\" | \"clock\" | \"bag\";\n label: string;\n value: string;\n}) {\n return (\n <div className=\"lockerverse-auctions__catalog-metric\">\n <dt>\n <Icon kind={icon} />\n {label}\n </dt>\n <dd>{value}</dd>\n </div>\n );\n}\nfunction Timing({\n auction,\n status = getAuctionDisplayStatus(auction),\n item = false,\n}: {\n auction: LockerverseAuction;\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}\nfunction AuctionCard({\n auction,\n onSelect,\n}: {\n auction: LockerverseAuction;\n onSelect: () => void;\n}) {\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 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=\"items\"\n label=\"Items\"\n value={String(auction.items.length)}\n />\n <Metric\n icon=\"gavel\"\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 <Icon kind=\"arrow\" />\n </span>\n </div>\n </div>\n </article>\n );\n}\nfunction itemCardDisplay(\n item: LockerverseAuctionItem,\n status: LockerverseAuctionStatus\n) {\n if (item.saleMode === \"buy_now\") {\n const label = item.isSoldOut ? \"Sold out\" : \"Buy now\";\n return {\n chip: label,\n cta: label,\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}\nfunction ItemCard({\n auction,\n item,\n onSelect,\n}: {\n auction: LockerverseAuction;\n item: LockerverseAuctionItem;\n onSelect: () => void;\n}) {\n const status = getAuctionDisplayStatus(auction, item);\n const buyNow = item.saleMode === \"buy_now\";\n const display = itemCardDisplay(item, status);\n return (\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 <Timing\n auction={\n item.finishedAt && status === \"finished\"\n ? { ...auction, endAt: item.finishedAt }\n : auction\n }\n item\n status={status}\n />\n </div>\n <dl className=\"lockerverse-auctions__catalog-metrics\">\n <Metric\n icon={buyNow ? \"bag\" : \"gavel\"}\n label={display.priceLabel}\n value={display.price}\n />\n <Metric\n icon=\"clock\"\n label={buyNow ? \"Available\" : \"Floor\"}\n value={display.secondary}\n />\n </dl>\n </div>\n <div className=\"lockerverse-auctions__catalog-body\">\n <h3>{item.name}</h3>\n <AuctionDescription\n className=\"lockerverse-auctions__catalog-description\"\n description={item.description || \"View auction item details.\"}\n links={false}\n />\n <div className=\"lockerverse-auctions__catalog-footer lockerverse-auctions__catalog-footer--item\">\n <span className=\"lockerverse-auctions__catalog-cta\">\n {display.cta}\n <Icon kind=\"arrow\" />\n </span>\n </div>\n </div>\n </article>\n );\n}\n/** Optional catalog UI, shared with the Lockerverse auction design. */\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 [filter, setFilter] = useState<ItemFilter>(\"all\");\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 const items = [...(selected?.items ?? [])].sort(\n (left, right) =>\n left.position - right.position ||\n left.createdAt.localeCompare(right.createdAt)\n );\n const filtered = selected\n ? items.filter(\n (item) =>\n filter === \"all\" || getAuctionDisplayStatus(selected, item) === filter\n )\n : [];\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 style={style}\n >\n <header className=\"lockerverse-auctions__catalog-header\">\n {selected ? (\n <button\n className=\"lockerverse-auctions__catalog-back\"\n onClick={() => {\n setSelectedId(null);\n setFilter(\"all\");\n }}\n type=\"button\"\n >\n <Icon kind=\"back\" />\n Auctions\n </button>\n ) : null}\n <h2 ref={headingRef} tabIndex={-1}>\n {selected?.name ?? \"Auctions\"}\n </h2>\n {selected?.description ? (\n <AuctionDescription description={selected.description} />\n ) : 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 {auctions.auctions && (selected || auctions.auctions.length > 0) ? (\n <>\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 {selected\n ? `${filtered.length} ${filtered.length === 1 ? \"item\" : \"items\"}`\n : `${auctions.auctions.length} ${auctions.auctions.length === 1 ? \"auction\" : \"auctions\"}`}\n </span>\n </div>\n {selected ? (\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={() => setFilter(option.value)}\n type=\"button\"\n >\n {option.label}\n <span>\n {option.value === \"all\"\n ? items.length\n : items.filter(\n (item) =>\n getAuctionDisplayStatus(selected, item) ===\n option.value\n ).length}\n </span>\n </button>\n ))}\n </fieldset>\n ) : null}\n </>\n ) : null}\n <CatalogResults\n auctions={auctions.auctions}\n filtered={filtered}\n onSelectAuction={(id) => {\n setSelectedId(id);\n setFilter(\"all\");\n }}\n onSelectItem={onSelectItem}\n selected={selected}\n />\n </section>\n );\n}\n\nfunction CatalogResults({\n selected,\n filtered,\n auctions,\n onSelectItem,\n onSelectAuction,\n}: {\n selected: LockerverseAuction | undefined;\n filtered: LockerverseAuctionItem[];\n auctions: LockerverseAuction[] | null;\n onSelectItem: LockerverseAuctionsProps[\"onSelectItem\"];\n onSelectAuction: (id: string) => void;\n}) {\n if (selected) {\n if (!filtered.length) {\n return (\n <p className=\"lockerverse-auctions__catalog-empty\">\n No items match this auction view.\n </p>\n );\n }\n return (\n <ul className=\"lockerverse-auctions__catalog-grid\">\n {filtered.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 );\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 <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","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"}