@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
package/README.md CHANGED
@@ -328,6 +328,14 @@ Malformed host selections and invalid custom tips render customer-safe validatio
328
328
 
329
329
  ## Auctions
330
330
 
331
+ For a page containing one auction, use `LockerverseAuction` from
332
+ `@lockerverse/react/auction` and `@lockerverse/react/auction.css`. Its header,
333
+ filters, and lineup can be hidden independently; `renderItem` can keep the
334
+ built-in card or supply a custom card. See the [auction composition reference](https://sdk.lockerverse.com/react/auctions)
335
+ and [complete example](https://sdk.lockerverse.com/examples/auctions).
336
+ The [State Lab](https://sdk.lockerverse.com/examples/state-lab) provides visibly
337
+ labelled local simulations of bid uncertainty and purchase recovery.
338
+
331
339
  Browse auctions and open the built-in item checkout. The catalog entry does not
332
340
  load Stripe. The checkout entry uses the optional Stripe peers listed above.
333
341
  Import `auctions.css` for both components. Built-in auction checkout accepts
@@ -347,27 +355,33 @@ export function AuctionPage() {
347
355
  auction: LockerverseAuction;
348
356
  itemId: string;
349
357
  } | null>(null);
350
-
351
- return selected ? (
352
- <LockerverseAuctionItem
358
+ const [locked, setLocked] = useState(false);
359
+ const [message, setMessage] = useState("");
360
+
361
+ return <>
362
+ <div hidden={Boolean(selected)}>
363
+ <LockerverseAuctions
364
+ auctions={auctions}
365
+ onSelectItem={(auction, item) => {
366
+ if (!locked) setSelected({ auction, itemId: item.id });
367
+ }}
368
+ theme="light"
369
+ />
370
+ </div>
371
+ {selected && <LockerverseAuctionItem
372
+ key={`${selected.auction.id}:${selected.itemId}`}
353
373
  auction={selected.auction}
354
374
  client={auctions.client}
355
375
  itemId={selected.itemId}
356
- onBidSubmitted={() => auctions.refresh()}
357
- onPurchaseComplete={() => auctions.refresh()}
358
- onUncertain={(kind) => {
359
- // Show an unresolved-result message. Do not retry a bid.
360
- console.info(`${kind} result is unknown`);
361
- }}
362
- theme="light"
363
- />
364
- ) : (
365
- <LockerverseAuctions
366
- auctions={auctions}
367
- onSelectItem={(auction, item) => setSelected({ auction, itemId: item.id })}
376
+ onBack={locked ? undefined : () => setSelected(null)}
377
+ onInteractionLockChange={setLocked}
378
+ onBidSubmitted={() => { setMessage("Bid submitted; this is not a winning bid."); auctions.refresh(); }}
379
+ onPurchaseComplete={() => { setMessage("Payment complete."); auctions.refresh(); }}
380
+ onUncertain={(kind) => setMessage(`The ${kind} result is unknown. Keep this page open; do not submit another bid.`)}
368
381
  theme="light"
369
- />
370
- );
382
+ />}
383
+ <p role="status">{message}</p>
384
+ </>;
371
385
  }
372
386
  ```
373
387
 
@@ -389,7 +403,12 @@ the backend can reconcile Stripe status and send the purchase notification.
389
403
  A `null` status lookup is not proof that an original in-flight request ended.
390
404
  Any retry must keep the original `clientRequestId` and purchase details.
391
405
  If a bid result is unknown, block a new bid and keep the support message visible.
392
- Do not navigate away or unmount checkout while submission is in progress.
406
+ Connect `onInteractionLockChange` to all host navigation, resource selectors, and
407
+ reset controls. A true lock covers submission and unresolved outcomes. Keep host
408
+ callback state above checkout. If checkout is unexpectedly removed after send,
409
+ known completion or uncertainty is still reported once for that operation;
410
+ no new Stripe action starts after unmount. Full page reload or browser shutdown
411
+ cannot guarantee callback delivery.
393
412
  Never automatically retry a bid: the backend has no public bid recovery API.
394
413
 
395
414
  For a host that needs recovery after navigation, connect
@@ -414,3 +433,21 @@ recovery in memory only and asks the customer to keep the page open.
414
433
 
415
434
  The raw receipt endpoint returns amounts, not payment status. Do not use a
416
435
  receipt response alone to show a payment as complete.
436
+
437
+ ### Direct auction pages
438
+
439
+ Import `useLockerverseAuction` from `@lockerverse/react/auction-data` and call
440
+ `useLockerverseAuction({ communitySlug }, auctionSlug)` to load one auction.
441
+ This uses the detail endpoint; it never fetches the full community list.
442
+ Render `LockerverseAuction` from `@lockerverse/react/auction` with the result,
443
+ and import `@lockerverse/react/auction.css`. Use `auction-item` and its stylesheet
444
+ when opening built-in item details and checkout.
445
+
446
+ The singular hook returns `client`, `auction`, `loading`, `error`, and `refresh`.
447
+ Refresh retains the last good data. Keep checkout mounted across refresh and
448
+ errors. The item component applies new same-ID data while idle and preserves
449
+ its payment snapshot while payment is open. Connect `onInteractionLockChange`
450
+ to host navigation. Resource identity changes require a new React key.
451
+
452
+ [Complete direct-auction example](https://sdk.lockerverse.com/examples/auctions?community=lckrvrs-internal&auction=auction).
453
+ Built-in styled UI is the default for Lovable. There is no automatic headless switch.
@@ -0,0 +1,128 @@
1
+ /* Reference: lockerverse-web-app-next auction pages at 8ead019. */
2
+ .lockerverse-auctions {
3
+ --lockerverse-auction-stat-bg: rgb(0 0 0 / 18%);
4
+ --lockerverse-auction-amount-bg: rgb(0 0 0 / 25%);
5
+ --lockerverse-auction-card-shadow: 0 28px 80px rgb(0 0 0 / 42%);
6
+ --lockerverse-auction-selection-shadow: 0 30px 90px rgb(0 0 0 / 20%);
7
+ --lockerverse-auction-checkout-shadow: 0 30px 90px rgb(0 0 0 / 45%);
8
+ --lockerverse-auction-action-shadow: 0 18px 40px rgb(0 0 0 / 32%);
9
+ --lockerverse-accent: #6f8f6d;
10
+ --lockerverse-bg: #050505;
11
+ --lockerverse-border: rgb(255 255 255 / 10%);
12
+ --lockerverse-control: #111216;
13
+ --lockerverse-muted: #bbb7c2;
14
+ --lockerverse-radius: 24px;
15
+ --lockerverse-text: #fff;
16
+ --lockerverse-font-family: ui-sans-serif, system-ui, sans-serif;
17
+ box-sizing: border-box;
18
+ width: 100%;
19
+ max-width: 1520px;
20
+ padding: 40px 32px;
21
+ margin-inline: auto;
22
+ container-type: inline-size;
23
+ font: 14px / 1.5 var(--lockerverse-font-family);
24
+ color: var(--lockerverse-text);
25
+ background: var(--lockerverse-bg);
26
+ border-radius: 0;
27
+ }
28
+
29
+ .lockerverse-auctions[data-lockerverse-theme="light"] {
30
+ --lockerverse-auction-stat-bg: var(--lockerverse-bg);
31
+ --lockerverse-auction-amount-bg: var(--lockerverse-bg);
32
+ --lockerverse-auction-card-shadow: 0 8px 24px rgb(0 0 0 / 6%);
33
+ --lockerverse-auction-selection-shadow: 0 8px 24px rgb(0 0 0 / 6%);
34
+ --lockerverse-auction-checkout-shadow: 0 8px 24px rgb(0 0 0 / 6%);
35
+ --lockerverse-auction-action-shadow: 0 4px 12px rgb(0 0 0 / 10%);
36
+ --lockerverse-bg: #fff;
37
+ --lockerverse-border: rgb(18 20 22 / 14%);
38
+ --lockerverse-control: #f5f6f7;
39
+ --lockerverse-muted: rgb(18 20 22 / 64%);
40
+ --lockerverse-text: #121416;
41
+ }
42
+
43
+ .lockerverse-auctions * {
44
+ box-sizing: border-box;
45
+ }
46
+ .lockerverse-auctions h2 {
47
+ margin: 0;
48
+ font-size: 24px;
49
+ line-height: 1.25;
50
+ text-wrap: balance;
51
+ }
52
+ .lockerverse-auctions h3 {
53
+ margin: 0;
54
+ font-size: 19px;
55
+ line-height: 1.3;
56
+ overflow-wrap: anywhere;
57
+ }
58
+ .lockerverse-auctions p {
59
+ margin: 8px 0;
60
+ color: var(--lockerverse-muted);
61
+ overflow-wrap: anywhere;
62
+ white-space: pre-line;
63
+ }
64
+ .lockerverse-auctions button {
65
+ font-family: inherit;
66
+ touch-action: manipulation;
67
+ cursor: pointer;
68
+ }
69
+ .lockerverse-auctions button:hover {
70
+ border-color: var(--lockerverse-text);
71
+ }
72
+ .lockerverse-auctions button:focus-visible,
73
+ .lockerverse-auctions h2:focus-visible {
74
+ outline: 2px solid var(--lockerverse-accent);
75
+ outline-offset: 3px;
76
+ }
77
+ .lockerverse-auctions__description {
78
+ line-height: 2;
79
+ overflow-wrap: anywhere;
80
+ }
81
+ .lockerverse-auctions__description p {
82
+ color: inherit;
83
+ }
84
+ .lockerverse-auctions__description ul {
85
+ padding-left: 20px;
86
+ list-style: disc;
87
+ }
88
+ .lockerverse-auctions__description ol {
89
+ padding-left: 20px;
90
+ list-style: decimal;
91
+ }
92
+ .lockerverse-auctions__description li {
93
+ margin-block: 4px;
94
+ }
95
+ .lockerverse-auctions__description a {
96
+ color: inherit;
97
+ text-decoration: underline;
98
+ }
99
+ .lockerverse-auctions__description blockquote {
100
+ padding-left: 16px;
101
+ margin-inline: 0;
102
+ border-left: 2px solid currentColor;
103
+ }
104
+ .lockerverse-auctions__description pre {
105
+ overflow-x: auto;
106
+ }
107
+ .lockerverse-auctions__description-clamped {
108
+ display: -webkit-box;
109
+ -webkit-box-orient: vertical;
110
+ overflow: hidden;
111
+ -webkit-line-clamp: 4;
112
+ }
113
+ .lockerverse-auctions .lockerverse-auctions__description-toggle {
114
+ display: inline-flex;
115
+ gap: 8px;
116
+ align-items: center;
117
+ min-height: 32px;
118
+ padding: 6px 12px;
119
+ margin-top: 12px;
120
+ font-size: 10px;
121
+ font-weight: 500;
122
+ color: var(--lockerverse-text);
123
+ text-transform: uppercase;
124
+ letter-spacing: 0.14em;
125
+ background: var(--lockerverse-control);
126
+ border: 1px solid var(--lockerverse-border);
127
+ border-radius: 999px;
128
+ }
@@ -104,7 +104,7 @@
104
104
  background: var(--lockerverse-control, #0a0a0c);
105
105
  border: 1px solid var(--lockerverse-border);
106
106
  border-radius: 30px;
107
- box-shadow: 0 28px 80px rgb(0 0 0 / 42%);
107
+ box-shadow: var(--lockerverse-auction-card-shadow);
108
108
  transition:
109
109
  transform 0.3s,
110
110
  border-color 0.3s;
@@ -346,3 +346,10 @@
346
346
  transform: none;
347
347
  }
348
348
  }
349
+
350
+ .lockerverse-auctions.lockerverse-auctions--card {
351
+ width: 100%;
352
+ max-width: none;
353
+ padding: 0;
354
+ background: transparent;
355
+ }
@@ -6,7 +6,7 @@
6
6
  background: var(--lockerverse-control, #111216);
7
7
  border: 1px solid var(--lockerverse-border);
8
8
  border-radius: 32px;
9
- box-shadow: 0 30px 90px rgb(0 0 0 / 45%);
9
+ box-shadow: var(--lockerverse-auction-checkout-shadow);
10
10
  }
11
11
  .lockerverse-auctions__checkout-header,
12
12
  .lockerverse-auctions__checkout-body {
@@ -197,7 +197,7 @@
197
197
  text-transform: uppercase;
198
198
  letter-spacing: 0.14em;
199
199
  border-radius: 999px;
200
- box-shadow: 0 18px 40px rgb(0 0 0 / 32%);
200
+ box-shadow: var(--lockerverse-auction-action-shadow);
201
201
  }
202
202
  @media (max-width: 639px) {
203
203
  .lockerverse-auctions__checkout-header,
@@ -0,0 +1,16 @@
1
+ import { n as useLockerverseAuctions, t as UseLockerverseAuctionsResult } from "./use-lockerverse-auctions.js";
2
+ import { CreateLockerverseAuctionOptions, LockerverseAuction, LockerverseAuctionClient, LockerverseSdkError } from "@lockerverse/sdk/auctions";
3
+ //#region src/use-lockerverse-auction.d.ts
4
+ type UseLockerverseAuctionResult = {
5
+ client: LockerverseAuctionClient;
6
+ /** Last successful snapshot, retained during refresh and refresh errors. */
7
+ auction: LockerverseAuction | null;
8
+ loading: boolean;
9
+ error: LockerverseSdkError | null;
10
+ refresh: () => void;
11
+ };
12
+ /** Load one auction by slug without requesting the community auction list. */
13
+ declare function useLockerverseAuction(options: CreateLockerverseAuctionOptions, auctionSlug: string): UseLockerverseAuctionResult;
14
+ //#endregion
15
+ export { type UseLockerverseAuctionResult, type UseLockerverseAuctionsResult, useLockerverseAuction, useLockerverseAuctions };
16
+ //# sourceMappingURL=auction-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auction-data.d.ts","names":[],"sources":["../src/use-lockerverse-auction.ts"],"mappings":";;;KAUY;EACV,QAAQ;;EAER,SAAS;EACT;EACA,OAAO;EACP;;;iBAIc,sBACd,SAAS,iCACT,sBACC"}
@@ -0,0 +1,2 @@
1
+ import{t as e}from"./immutable-resource-identity.js";import{t}from"./use-lockerverse-auctions.js";import{useCallback as n,useEffect as r,useRef as i,useState as a}from"react";import{createLockerverseAuctionClient as o}from"@lockerverse/sdk/auctions";function s(t,s){e(`auction`,{apiBaseUrl:t.apiBaseUrl,communitySlug:t.communitySlug,environment:t.environment,slug:s});let c=i(t.onError);c.current=t.onError;let[l]=a(()=>o({...t,onError:e=>c.current?.(e)})),u=i(0),[d,f]=a(0),[p,m]=a({auction:null,error:null,loading:!0});r(()=>{let e=!0,t=u.current;return l.load(s).then(n=>{e&&t===u.current&&m({auction:n,error:null,loading:!1})},n=>{e&&t===u.current&&m(e=>({...e,error:n,loading:!1}))}),()=>{e=!1}},[l,s,d]);let h=n(()=>{u.current+=1,m(e=>({...e,error:null,loading:!0})),f(e=>e+1)},[]);return{...p,client:l,refresh:h}}export{s as useLockerverseAuction,t as useLockerverseAuctions};
2
+ //# sourceMappingURL=auction-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auction-data.js","names":[],"sources":["../src/use-lockerverse-auction.ts"],"sourcesContent":["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 UseLockerverseAuctionResult = {\n client: LockerverseAuctionClient;\n /** Last successful snapshot, retained during refresh and refresh errors. */\n auction: LockerverseAuction | null;\n loading: boolean;\n error: LockerverseSdkError | null;\n refresh: () => void;\n};\n\n/** Load one auction by slug without requesting the community auction list. */\nexport function useLockerverseAuction(\n options: CreateLockerverseAuctionOptions,\n auctionSlug: string\n): UseLockerverseAuctionResult {\n useImmutableResourceIdentity(\"auction\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n slug: auctionSlug,\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 generation = useRef(0);\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<\n Pick<UseLockerverseAuctionResult, \"auction\" | \"loading\" | \"error\">\n >({ auction: null, error: null, loading: true });\n\n useEffect(() => {\n let active = true;\n const requestGeneration = generation.current;\n client.load(auctionSlug).then(\n (auction) => {\n if (active && requestGeneration === generation.current) {\n setState({ auction, error: null, loading: false });\n }\n },\n (error: LockerverseSdkError) => {\n if (active && requestGeneration === generation.current) {\n setState((current) => ({ ...current, error, loading: false }));\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, auctionSlug, revision]);\n\n const refresh = useCallback(() => {\n generation.current += 1;\n setState((current) => ({ ...current, error: null, loading: true }));\n setRevision((current) => current + 1);\n }, []);\n\n return { ...state, client, refresh };\n}\n"],"mappings":"0PAoBA,SAAgB,EACd,EACA,EAC6B,CAC7B,EAA6B,UAAW,CACtC,WAAY,EAAQ,WACpB,cAAe,EAAQ,cACvB,YAAa,EAAQ,YACrB,KAAM,CACR,CAAC,EACD,IAAM,EAAa,EAAO,EAAQ,OAAO,EACzC,EAAW,QAAU,EAAQ,QAC7B,GAAM,CAAC,GAAU,MACf,EAA+B,CAC7B,GAAG,EACH,QAAU,GAAU,EAAW,UAAU,CAAK,CAChD,CAAC,CACH,EACM,EAAa,EAAO,CAAC,EACrB,CAAC,EAAU,GAAe,EAAS,CAAC,EACpC,CAAC,EAAO,GAAY,EAExB,CAAE,QAAS,KAAM,MAAO,KAAM,QAAS,EAAK,CAAC,EAE/C,MAAgB,CACd,IAAI,EAAS,GACP,EAAoB,EAAW,QAarC,OAZA,EAAO,KAAK,CAAW,CAAC,CAAC,KACtB,GAAY,CACP,GAAU,IAAsB,EAAW,SAC7C,EAAS,CAAE,UAAS,MAAO,KAAM,QAAS,EAAM,CAAC,CAErD,EACC,GAA+B,CAC1B,GAAU,IAAsB,EAAW,SAC7C,EAAU,IAAa,CAAE,GAAG,EAAS,QAAO,QAAS,EAAM,EAAE,CAEjE,CACF,MACa,CACX,EAAS,EACX,CACF,EAAG,CAAC,EAAQ,EAAa,CAAQ,CAAC,EAElC,IAAM,EAAU,MAAkB,CAChC,EAAW,SAAW,EACtB,EAAU,IAAa,CAAE,GAAG,EAAS,MAAO,KAAM,QAAS,EAAK,EAAE,EAClE,EAAa,GAAY,EAAU,CAAC,CACtC,EAAG,CAAC,CAAC,EAEL,MAAO,CAAE,GAAG,EAAO,SAAQ,SAAQ,CACrC"}
@@ -0,0 +1,302 @@
1
+ .lockerverse-auctions__field {
2
+ display: grid;
3
+ gap: 8px;
4
+ }
5
+ .lockerverse-auctions__field input {
6
+ width: 100%;
7
+ min-width: 0;
8
+ min-height: 48px;
9
+ padding: 10px 12px;
10
+ font: inherit;
11
+ font-size: 16px;
12
+ color: var(--lockerverse-text);
13
+ background: var(--lockerverse-control);
14
+ border: 1px solid var(--lockerverse-border);
15
+ border-radius: var(--lockerverse-radius);
16
+ }
17
+ .lockerverse-auctions__notice {
18
+ padding: 12px;
19
+ border: 1px solid var(--lockerverse-border);
20
+ border-radius: var(--lockerverse-radius);
21
+ }
22
+ .lockerverse-auctions input:focus-visible {
23
+ outline: 2px solid var(--lockerverse-accent);
24
+ outline-offset: 3px;
25
+ }
26
+ .lockerverse-auctions__detail {
27
+ display: grid;
28
+ grid-template-columns: minmax(360px, 0.9fr) minmax(540px, 1.1fr);
29
+ gap: 32px;
30
+ align-items: start;
31
+ }
32
+ .lockerverse-auctions__item-summary {
33
+ min-width: 0;
34
+ overflow: hidden;
35
+ background: var(--lockerverse-control);
36
+ border: 1px solid var(--lockerverse-border);
37
+ border-radius: 12px;
38
+ }
39
+ .lockerverse-auctions__item-copy {
40
+ padding: 20px 24px;
41
+ border-top: 1px solid var(--lockerverse-border);
42
+ }
43
+ .lockerverse-auctions__item-copy h2 {
44
+ margin-top: 16px;
45
+ font-size: 36px;
46
+ font-weight: 600;
47
+ line-height: 1.12;
48
+ }
49
+ .lockerverse-auctions .lockerverse-auctions__eyebrow {
50
+ margin: 0;
51
+ font-size: 11px;
52
+ font-weight: 500;
53
+ line-height: 1.7;
54
+ text-transform: uppercase;
55
+ letter-spacing: 0.18em;
56
+ }
57
+ .lockerverse-auctions__item-description {
58
+ margin-top: 16px;
59
+ }
60
+ .lockerverse-auctions__stat-panel {
61
+ margin: 20px 0 0;
62
+ overflow: hidden;
63
+ background: var(--lockerverse-auction-stat-bg);
64
+ border: 1px solid var(--lockerverse-border);
65
+ border-radius: 24px;
66
+ }
67
+ .lockerverse-auctions__stat-row {
68
+ display: flex;
69
+ gap: 16px;
70
+ align-items: center;
71
+ justify-content: space-between;
72
+ padding: 16px 24px;
73
+ border-bottom: 1px solid var(--lockerverse-border);
74
+ }
75
+ .lockerverse-auctions__stat-row:last-child {
76
+ border-bottom: 0;
77
+ }
78
+ .lockerverse-auctions__stat-panel dt {
79
+ font-size: 11px;
80
+ font-weight: 500;
81
+ color: var(--lockerverse-muted);
82
+ text-transform: uppercase;
83
+ letter-spacing: 0.12em;
84
+ }
85
+ .lockerverse-auctions__stat-panel dd {
86
+ margin: 0;
87
+ font-size: 20px;
88
+ font-weight: 500;
89
+ font-variant-numeric: tabular-nums;
90
+ text-align: right;
91
+ }
92
+ .lockerverse-auctions__stat-panel .lockerverse-auctions__stat-date {
93
+ font-size: 15px;
94
+ }
95
+ .lockerverse-auctions__stat-footer {
96
+ display: grid;
97
+ grid-template-columns: 1fr 1fr;
98
+ }
99
+ .lockerverse-auctions__stat-footer > div {
100
+ padding: 12px 24px;
101
+ }
102
+ .lockerverse-auctions__stat-footer > div + div {
103
+ border-left: 1px solid var(--lockerverse-border);
104
+ }
105
+ .lockerverse-auctions__stat-footer dd {
106
+ margin-top: 4px;
107
+ font-size: 14px;
108
+ text-align: left;
109
+ }
110
+ .lockerverse-auctions__transaction {
111
+ display: grid;
112
+ gap: 24px;
113
+ min-width: 0;
114
+ }
115
+ .lockerverse-auctions__progress {
116
+ display: flex;
117
+ flex-wrap: wrap;
118
+ gap: 8px;
119
+ padding: 24px;
120
+ background: rgb(128 128 128 / 4%);
121
+ border: 1px solid var(--lockerverse-border);
122
+ border-radius: 28px;
123
+ }
124
+ .lockerverse-auctions__progress span {
125
+ padding: 10px 16px;
126
+ font-size: 14px;
127
+ font-weight: 500;
128
+ border: 1px solid var(--lockerverse-border);
129
+ border-radius: 999px;
130
+ }
131
+ .lockerverse-auctions__selection {
132
+ overflow: hidden;
133
+ background: var(--lockerverse-control);
134
+ border: 1px solid var(--lockerverse-border);
135
+ border-radius: 32px;
136
+ box-shadow: var(--lockerverse-auction-selection-shadow);
137
+ }
138
+ .lockerverse-auctions__selection-header,
139
+ .lockerverse-auctions__selection-body {
140
+ padding: 28px;
141
+ }
142
+ .lockerverse-auctions__selection-header {
143
+ border-bottom: 1px solid var(--lockerverse-border);
144
+ }
145
+ .lockerverse-auctions__selection h3 {
146
+ margin-top: 12px;
147
+ font-size: 30px;
148
+ font-weight: 600;
149
+ letter-spacing: -0.04em;
150
+ }
151
+ .lockerverse-auctions__selection p {
152
+ margin-top: 12px;
153
+ font-size: 14px;
154
+ line-height: 2;
155
+ }
156
+ .lockerverse-auctions__selection strong {
157
+ color: var(--lockerverse-text);
158
+ }
159
+ .lockerverse-auctions__amount-control {
160
+ position: relative;
161
+ display: block;
162
+ }
163
+ .lockerverse-auctions__amount-control > span {
164
+ position: absolute;
165
+ top: 50%;
166
+ left: 20px;
167
+ font-size: 24px;
168
+ color: var(--lockerverse-muted);
169
+ transform: translateY(-50%);
170
+ }
171
+ .lockerverse-auctions__amount-control input {
172
+ height: 78px;
173
+ padding-left: 24px;
174
+ font-size: 36px;
175
+ font-weight: 600;
176
+ letter-spacing: -0.05em;
177
+ background: var(--lockerverse-auction-amount-bg);
178
+ border-radius: 24px;
179
+ }
180
+ .lockerverse-auctions__amount-control > span + input {
181
+ padding-left: 48px;
182
+ }
183
+ .lockerverse-auctions__selection-footer {
184
+ display: flex;
185
+ flex-wrap: wrap;
186
+ gap: 16px;
187
+ align-items: center;
188
+ justify-content: space-between;
189
+ padding-top: 20px;
190
+ margin-top: 24px;
191
+ border-top: 1px solid var(--lockerverse-border);
192
+ }
193
+ .lockerverse-auctions__selection-footer > p {
194
+ flex: 1 1 220px;
195
+ margin: 0;
196
+ }
197
+ .lockerverse-auctions .lockerverse-auctions__button {
198
+ display: inline-flex;
199
+ gap: 8px;
200
+ align-items: center;
201
+ justify-content: center;
202
+ min-height: 48px;
203
+ padding: 12px 24px;
204
+ font-size: 14px;
205
+ font-weight: 600;
206
+ color: #fff;
207
+ text-transform: uppercase;
208
+ letter-spacing: 0.14em;
209
+ background: var(--lockerverse-accent);
210
+ border: 0;
211
+ border-radius: 999px;
212
+ }
213
+ .lockerverse-auctions button:disabled {
214
+ cursor: not-allowed;
215
+ opacity: 0.5;
216
+ }
217
+ .lockerverse-auctions .lockerverse-auctions__back {
218
+ display: inline-flex;
219
+ gap: 8px;
220
+ align-items: center;
221
+ min-height: 40px;
222
+ padding: 8px 12px;
223
+ margin-bottom: 16px;
224
+ font-size: 14px;
225
+ font-weight: 500;
226
+ color: var(--lockerverse-text);
227
+ background: rgb(128 128 128 / 6%);
228
+ border: 1px solid var(--lockerverse-border);
229
+ border-radius: 999px;
230
+ }
231
+ .lockerverse-auctions .lockerverse-auctions__footer-back {
232
+ display: inline-flex;
233
+ gap: 8px;
234
+ align-items: center;
235
+ justify-self: end;
236
+ min-height: 44px;
237
+ padding: 0;
238
+ font-size: 14px;
239
+ font-weight: 500;
240
+ color: var(--lockerverse-muted);
241
+ background: transparent;
242
+ border: 0;
243
+ }
244
+ .lockerverse-auctions__read-only {
245
+ padding: 24px;
246
+ }
247
+ .lockerverse-auctions__read-only > p {
248
+ line-height: 2;
249
+ }
250
+ .lockerverse-auctions__read-only .lockerverse-auctions__button {
251
+ margin-top: 20px;
252
+ }
253
+ @media (max-width: 1279px) {
254
+ .lockerverse-auctions__detail {
255
+ grid-template-columns: minmax(0, 1fr);
256
+ }
257
+ }
258
+ @media (max-width: 720px) {
259
+ .lockerverse-auctions__detail {
260
+ gap: 24px;
261
+ }
262
+ }
263
+ @media (max-width: 639px) {
264
+ .lockerverse-auctions {
265
+ padding: 32px 16px;
266
+ }
267
+ .lockerverse-auctions__item-copy {
268
+ padding: 20px;
269
+ }
270
+ .lockerverse-auctions__item-copy h2 {
271
+ font-size: 30px;
272
+ }
273
+ .lockerverse-auctions__selection-header,
274
+ .lockerverse-auctions__selection-body {
275
+ padding: 24px;
276
+ }
277
+ .lockerverse-auctions__selection-footer {
278
+ flex-direction: column;
279
+ align-items: stretch;
280
+ }
281
+ .lockerverse-auctions__selection-footer > p {
282
+ flex-basis: auto;
283
+ }
284
+ }
285
+
286
+ @container (max-width: 1150px) {
287
+ .lockerverse-auctions__detail {
288
+ grid-template-columns: minmax(0, 1fr);
289
+ }
290
+ }
291
+
292
+ .lockerverse-auctions__stat-row dt,
293
+ .lockerverse-auctions__progress span {
294
+ display: flex;
295
+ gap: 10px;
296
+ align-items: center;
297
+ }
298
+ .lockerverse-auctions__progress svg,
299
+ .lockerverse-auctions__stat-row dt svg {
300
+ flex-shrink: 0;
301
+ opacity: 0.65;
302
+ }
@@ -0,0 +1,4 @@
1
+ @import "./auction-gallery.css";
2
+ @import "./auction-checkout.css";
3
+ @import "./auction-base.css";
4
+ @import "./auction-item-layout.css";
@@ -17,6 +17,9 @@ type LockerverseAuctionItemProps = {
17
17
  itemId: string;
18
18
  /** Host navigation; the SDK does not depend on a router. */
19
19
  onBack?: (() => void) | undefined;
20
+ /** Disable host navigation/reset while submitting or resolving an uncertain operation.
21
+ * This callback can run after unmount when a sent request resolves. */
22
+ onInteractionLockChange?: (locked: boolean) => void;
20
23
  communityName?: string | undefined;
21
24
  className?: string;
22
25
  theme?: LockerverseTheme;
@@ -1 +1 @@
1
- {"version":3,"file":"auction-item.d.ts","names":[],"sources":["../src/auction-item-types.ts","../src/lockerverse-auction-item.tsx"],"mappings":";;;;;KAaY;EACV;EACA;EACA,MAAM;EACN,SAAS,YAAY;EACrB,SAAS;EACT,YAAY;;KAGF;EACV,SAAS;EACT,QAAQ;EACR;;EAEA;EACA;EACA;EACA,QAAQ;EACR,QAAQ;EACR,eAAe;;EAEf,kBAAkB,QAAQ;;EAE1B,sBAAsB,QAAQ;EAC9B,4BACE,UAAU;EAEZ,eAAe;;EAEf,iBAAiB;;;;iBCgRH,uBAAuB,OAAO,8CAA2B,IAAA"}
1
+ {"version":3,"file":"auction-item.d.ts","names":[],"sources":["../src/auction-item-types.ts","../src/lockerverse-auction-item.tsx"],"mappings":";;;;;KAaY;EACV;EACA;EACA,MAAM;EACN,SAAS,YAAY;EACrB,SAAS;EACT,YAAY;;KAGF;EACV,SAAS;EACT,QAAQ;EACR;;EAEA;;;EAGA,2BAA2B;EAC3B;EACA;EACA,QAAQ;EACR,QAAQ;EACR,eAAe;;EAEf,kBAAkB,QAAQ;;EAE1B,sBAAsB,QAAQ;EAC9B,4BACE,UAAU;EAEZ,eAAe;;EAEf,iBAAiB;;;;iBC4TH,uBAAuB,OAAO,8CAA2B,IAAA"}