@lockerverse/react 0.2.102 โ 0.2.104
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 +4 -0
- package/dist/auction-base.css +12 -0
- package/dist/auction-catalog.css +1 -1
- package/dist/auction-checkout.css +8 -75
- package/dist/auction-data.js +1 -1
- package/dist/auction-data.js.map +1 -1
- package/dist/auction-item-layout.css +7 -3
- 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/auctions.d.ts.map +1 -1
- package/dist/auctions.js +1 -1
- package/dist/auctions.js.map +1 -1
- package/dist/form-controls.css +114 -0
- package/dist/form-skeleton.js +2 -0
- package/dist/form-skeleton.js.map +1 -0
- package/dist/form-ui.css +25 -9
- package/dist/format-money.js +2 -0
- package/dist/format-money.js.map +1 -0
- package/dist/host-callback.js +1 -1
- package/dist/host-callback.js.map +1 -1
- package/dist/immutable-resource-identity.js +1 -1
- package/dist/immutable-resource-identity.js.map +1 -1
- package/dist/lockerverse-auction.js +1 -1
- package/dist/lockerverse-auction.js.map +1 -1
- package/dist/lockerverse-donate-launcher.js +1 -1
- package/dist/lockerverse-donate-launcher.js.map +1 -1
- package/dist/lockerverse-payment.js +1 -1
- package/dist/lockerverse-payment.js.map +1 -1
- package/dist/payment-form.d.ts +1 -0
- package/dist/payment-form.d.ts.map +1 -1
- package/dist/phone-field.css +89 -0
- package/dist/select-control.css +18 -0
- package/dist/signup.css +1 -60
- package/dist/signup.d.ts.map +1 -1
- package/dist/signup.js +1 -1
- package/dist/signup.js.map +1 -1
- package/dist/stripe-loader.js +2 -0
- package/dist/stripe-loader.js.map +1 -0
- package/dist/styles.css +6 -232
- package/dist/use-auction-boundary.js +1 -1
- package/dist/use-auction-boundary.js.map +1 -1
- package/dist/use-lockerverse-auctions.js +1 -1
- package/dist/use-lockerverse-auctions.js.map +1 -1
- package/package.json +5 -5
- package/dist/phone.js +0 -2
- package/dist/phone.js.map +0 -1
package/dist/styles.css
CHANGED
|
@@ -312,18 +312,12 @@
|
|
|
312
312
|
color: var(--lockerverse-text);
|
|
313
313
|
}
|
|
314
314
|
|
|
315
|
-
.lockerverse-payment__check-row input:focus
|
|
316
|
-
.lockerverse-payment__select-trigger:focus {
|
|
315
|
+
.lockerverse-payment__check-row input[type="radio"]:focus {
|
|
317
316
|
outline: none;
|
|
318
317
|
border-color: var(--lockerverse-accent);
|
|
319
318
|
}
|
|
320
319
|
|
|
321
|
-
.lockerverse-
|
|
322
|
-
box-shadow: 0 0 0 1px var(--lockerverse-accent);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
.lockerverse-payment__check-row input:focus-visible,
|
|
326
|
-
.lockerverse-payment__select-trigger:focus-visible {
|
|
320
|
+
.lockerverse-payment__check-row input[type="radio"]:focus-visible {
|
|
327
321
|
box-shadow: 0 0 0 2px
|
|
328
322
|
color-mix(in srgb, var(--lockerverse-accent) 24%, transparent);
|
|
329
323
|
}
|
|
@@ -332,226 +326,6 @@
|
|
|
332
326
|
border-color: var(--lockerverse-danger-border) !important;
|
|
333
327
|
}
|
|
334
328
|
|
|
335
|
-
.lockerverse-payment__phone-control {
|
|
336
|
-
display: grid;
|
|
337
|
-
grid-template-columns: max-content minmax(0, 1fr);
|
|
338
|
-
overflow: visible;
|
|
339
|
-
background: var(--lockerverse-control);
|
|
340
|
-
border: 1px solid var(--lockerverse-border);
|
|
341
|
-
border-radius: var(--lockerverse-radius);
|
|
342
|
-
box-shadow: inset 0 1px 0 rgb(255 255 255 / 4%);
|
|
343
|
-
transition:
|
|
344
|
-
border-color 140ms ease,
|
|
345
|
-
box-shadow 140ms ease;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
.lockerverse-payment__phone-control:focus-within {
|
|
349
|
-
border-color: var(--lockerverse-accent);
|
|
350
|
-
box-shadow:
|
|
351
|
-
inset 0 1px 0 rgb(255 255 255 / 4%),
|
|
352
|
-
0 0 0 1px var(--lockerverse-accent);
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
.lockerverse-payment__phone-control:has(:focus-visible) {
|
|
356
|
-
box-shadow: 0 0 0 2px
|
|
357
|
-
color-mix(in srgb, var(--lockerverse-accent) 24%, transparent);
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
.lockerverse-payment__phone-control:has([aria-invalid="true"]) {
|
|
361
|
-
border-color: var(--lockerverse-danger-border) !important;
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
.lockerverse-payment__select {
|
|
365
|
-
min-width: 0;
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
.lockerverse-payment__select-trigger {
|
|
369
|
-
display: flex;
|
|
370
|
-
gap: 8px;
|
|
371
|
-
align-items: center;
|
|
372
|
-
justify-content: space-between;
|
|
373
|
-
width: 100%;
|
|
374
|
-
min-height: 48px;
|
|
375
|
-
padding: 8px 12px;
|
|
376
|
-
font: inherit;
|
|
377
|
-
font-size: 16px;
|
|
378
|
-
line-height: 1.5;
|
|
379
|
-
color: var(--lockerverse-text);
|
|
380
|
-
text-align: left;
|
|
381
|
-
cursor: pointer;
|
|
382
|
-
background: var(--lockerverse-control);
|
|
383
|
-
border: 1px solid var(--lockerverse-border);
|
|
384
|
-
border-radius: var(--lockerverse-radius);
|
|
385
|
-
box-shadow: inset 0 1px 0 rgb(255 255 255 / 4%);
|
|
386
|
-
transition:
|
|
387
|
-
border-color 140ms ease,
|
|
388
|
-
box-shadow 140ms ease,
|
|
389
|
-
background-color 140ms ease;
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
.lockerverse-payment__select-trigger:hover,
|
|
393
|
-
.lockerverse-payment__select-trigger[data-popup-open] {
|
|
394
|
-
background: color-mix(
|
|
395
|
-
in srgb,
|
|
396
|
-
var(--lockerverse-control) 94%,
|
|
397
|
-
var(--lockerverse-text)
|
|
398
|
-
);
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
.lockerverse-payment__select-trigger:focus-visible {
|
|
402
|
-
outline: none;
|
|
403
|
-
border-color: var(--lockerverse-accent);
|
|
404
|
-
box-shadow: 0 0 0 2px
|
|
405
|
-
color-mix(in srgb, var(--lockerverse-accent) 24%, transparent);
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
.lockerverse-payment__select-trigger:focus {
|
|
409
|
-
border-color: var(--lockerverse-accent);
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
.lockerverse-payment__select-icon {
|
|
413
|
-
display: grid;
|
|
414
|
-
flex: 0 0 auto;
|
|
415
|
-
place-items: center;
|
|
416
|
-
width: 16px;
|
|
417
|
-
height: 16px;
|
|
418
|
-
color: var(--lockerverse-muted);
|
|
419
|
-
transition: transform 140ms ease;
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
.lockerverse-payment__select-icon svg,
|
|
423
|
-
.lockerverse-payment__select-item-indicator svg {
|
|
424
|
-
width: 16px;
|
|
425
|
-
height: 16px;
|
|
426
|
-
stroke: currentcolor;
|
|
427
|
-
stroke-width: 1.8;
|
|
428
|
-
stroke-linecap: round;
|
|
429
|
-
stroke-linejoin: round;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
.lockerverse-payment__select-trigger[data-popup-open]
|
|
433
|
-
.lockerverse-payment__select-icon {
|
|
434
|
-
transform: rotate(180deg);
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
.lockerverse-payment__select--phone-country {
|
|
438
|
-
position: relative;
|
|
439
|
-
z-index: 1;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
.lockerverse-payment__select--phone-country
|
|
443
|
-
.lockerverse-payment__select-trigger {
|
|
444
|
-
padding-right: 9px;
|
|
445
|
-
padding-left: 11px;
|
|
446
|
-
white-space: nowrap;
|
|
447
|
-
background: transparent;
|
|
448
|
-
border: 0;
|
|
449
|
-
border-right: 1px solid var(--lockerverse-border);
|
|
450
|
-
border-radius: var(--lockerverse-radius) 0 0 var(--lockerverse-radius);
|
|
451
|
-
box-shadow: none;
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
.lockerverse-payment__phone-control
|
|
455
|
-
input:not([type="checkbox"]):not([type="radio"]) {
|
|
456
|
-
background: transparent;
|
|
457
|
-
border: 0;
|
|
458
|
-
border-radius: 0 var(--lockerverse-radius) var(--lockerverse-radius) 0;
|
|
459
|
-
box-shadow: none;
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
.lockerverse-payment__phone-control
|
|
463
|
-
input:not([type="checkbox"]):not([type="radio"]):focus,
|
|
464
|
-
.lockerverse-payment__phone-control .lockerverse-payment__select-trigger:focus {
|
|
465
|
-
border-color: transparent;
|
|
466
|
-
box-shadow: none;
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
.lockerverse-payment__phone-control .lockerverse-payment__select-trigger:focus {
|
|
470
|
-
border-right-color: var(--lockerverse-accent);
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
.lockerverse-payment__phone-control:focus-within
|
|
474
|
-
.lockerverse-payment__select-trigger {
|
|
475
|
-
border-right-color: var(--lockerverse-accent);
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
.lockerverse-payment__phone-control [aria-invalid="true"] {
|
|
479
|
-
border-color: transparent !important;
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
.lockerverse-payment__select-positioner {
|
|
483
|
-
z-index: 100;
|
|
484
|
-
user-select: none;
|
|
485
|
-
outline: none;
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
.lockerverse-payment__select-popup {
|
|
489
|
-
min-width: var(--anchor-width);
|
|
490
|
-
max-width: min(320px, var(--available-width));
|
|
491
|
-
overflow: hidden;
|
|
492
|
-
color: var(--lockerverse-text);
|
|
493
|
-
background: color-mix(
|
|
494
|
-
in srgb,
|
|
495
|
-
var(--lockerverse-control) 96%,
|
|
496
|
-
var(--lockerverse-bg)
|
|
497
|
-
);
|
|
498
|
-
background-clip: padding-box;
|
|
499
|
-
border: 1px solid color-mix(in srgb, var(--lockerverse-text) 16%, transparent);
|
|
500
|
-
border-radius: var(--lockerverse-radius);
|
|
501
|
-
box-shadow: 0 18px 48px rgb(0 0 0 / 48%);
|
|
502
|
-
opacity: 1;
|
|
503
|
-
transform: scale(1);
|
|
504
|
-
transform-origin: var(--transform-origin);
|
|
505
|
-
transition:
|
|
506
|
-
transform 100ms ease-out,
|
|
507
|
-
opacity 100ms ease-out;
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
.lockerverse-payment__select-popup[data-starting-style],
|
|
511
|
-
.lockerverse-payment__select-popup[data-ending-style] {
|
|
512
|
-
opacity: 0;
|
|
513
|
-
transform: scale(0.98);
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
.lockerverse-payment__select-list {
|
|
517
|
-
position: relative;
|
|
518
|
-
max-height: min(320px, var(--available-height));
|
|
519
|
-
padding: 4px;
|
|
520
|
-
overflow-y: auto;
|
|
521
|
-
overscroll-behavior: contain;
|
|
522
|
-
outline: none;
|
|
523
|
-
scroll-padding-block: 4px;
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
.lockerverse-payment__select-item {
|
|
527
|
-
display: grid;
|
|
528
|
-
grid-template-columns: minmax(0, 1fr) 16px;
|
|
529
|
-
gap: 10px;
|
|
530
|
-
align-items: center;
|
|
531
|
-
min-height: 38px;
|
|
532
|
-
padding: 8px 10px;
|
|
533
|
-
font-size: 15px;
|
|
534
|
-
line-height: 1.35;
|
|
535
|
-
cursor: default;
|
|
536
|
-
outline: none;
|
|
537
|
-
border-radius: 6px;
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
.lockerverse-payment__select-item[data-highlighted] {
|
|
541
|
-
background: var(--lockerverse-subtle);
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
.lockerverse-payment__select-item[data-selected] {
|
|
545
|
-
font-weight: 600;
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
.lockerverse-payment__select-item-indicator {
|
|
549
|
-
display: grid;
|
|
550
|
-
grid-column: 2;
|
|
551
|
-
place-items: center;
|
|
552
|
-
color: var(--lockerverse-accent);
|
|
553
|
-
}
|
|
554
|
-
|
|
555
329
|
.lockerverse-payment__check-row {
|
|
556
330
|
display: flex;
|
|
557
331
|
gap: 12px;
|
|
@@ -564,7 +338,7 @@
|
|
|
564
338
|
color: color-mix(in srgb, var(--lockerverse-text) 86%, transparent);
|
|
565
339
|
}
|
|
566
340
|
|
|
567
|
-
.lockerverse-payment__check-row input {
|
|
341
|
+
.lockerverse-payment__check-row input[type="radio"] {
|
|
568
342
|
display: grid;
|
|
569
343
|
flex: 0 0 auto;
|
|
570
344
|
place-content: center;
|
|
@@ -580,7 +354,7 @@
|
|
|
580
354
|
border-radius: calc(var(--lockerverse-radius) / 2);
|
|
581
355
|
}
|
|
582
356
|
|
|
583
|
-
.lockerverse-payment__check-row input::before {
|
|
357
|
+
.lockerverse-payment__check-row input[type="radio"]::before {
|
|
584
358
|
width: 11px;
|
|
585
359
|
height: 7px;
|
|
586
360
|
content: "";
|
|
@@ -593,12 +367,12 @@
|
|
|
593
367
|
transform 100ms ease;
|
|
594
368
|
}
|
|
595
369
|
|
|
596
|
-
.lockerverse-payment__check-row input:checked {
|
|
370
|
+
.lockerverse-payment__check-row input[type="radio"]:checked {
|
|
597
371
|
background: var(--lockerverse-accent);
|
|
598
372
|
border-color: var(--lockerverse-accent);
|
|
599
373
|
}
|
|
600
374
|
|
|
601
|
-
.lockerverse-payment__check-row input:checked::before {
|
|
375
|
+
.lockerverse-payment__check-row input[type="radio"]:checked::before {
|
|
602
376
|
opacity: 1;
|
|
603
377
|
transform: translateY(-1px) rotate(-45deg) scale(1);
|
|
604
378
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useCallback as
|
|
1
|
+
import{t as e}from"./format-money.js";import{useCallback as t,useEffect as n,useRef as r,useState as i,useSyncExternalStore as a}from"react";import{jsx as o}from"react/jsx-runtime";const s=/<\/?(?:p|br|strong|em|u|s|ul|ol|li|blockquote|pre|code|hr|h[1-6]|a)(?:\s|\/?>)/i;function c(e){return s.test(e)?e:e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/\r\n|\r|\n/g,`<br>`)}function l({description:e,className:t,id:n}){return o(`div`,{className:[`lockerverse-auctions__description`,t].filter(Boolean).join(` `),dangerouslySetInnerHTML:{__html:c(e)},id:n})}function u(e,t=e.status){let n=t===`draft`,r=n?e.startAt:e.endAt,i=new Date(r);if(!Number.isFinite(i.getTime()))return``;let a=(n?e.configuration.startTimeEnabled:e.configuration.endTimeEnabled)??!0,o=new Intl.DateTimeFormat(`en-US`,{day:`numeric`,month:`short`,timeZone:`America/New_York`,year:`numeric`}).format(i);return a?`${o} at ${new Intl.DateTimeFormat(`en-US`,{hour:`numeric`,minute:`2-digit`,timeZone:`America/New_York`,timeZoneName:`short`}).format(i)}`:o}function d(t){return e(t,0)}function f(e,t){return e.status===`finished`||t?.status===`finished`?`finished`:e.status===`draft`||t?.status===`draft`?`draft`:Date.parse(e.endAt)<=Date.now()?`finished`:Date.parse(e.startAt)>Date.now()?`draft`:`active`}function p(e){return e.isSoldOut||e.saleMode===`buy_now`&&e.availableQuantity===0}function m(){let e=r(null),[t,a]=i(!1);return n(()=>{let t=e.current;if(!(t&&`IntersectionObserver`in window))return;let n=!1,r=()=>a(n&&!document.hidden),i=new IntersectionObserver(([e])=>{n=!!(e?.isIntersecting&&e.intersectionRatio>0),r()});return i.observe(t),document.addEventListener(`visibilitychange`,r),()=>{i.disconnect(),document.removeEventListener(`visibilitychange`,r)}},[]),{ref:e,visible:t}}const h=new Map;let g,_=0;function v(){clearTimeout(g),g=void 0;let e=Date.now(),t=1/0;for(let n of h.values())for(let r of n)r>e&&(t=Math.min(t,r));Number.isFinite(t)&&(g=setTimeout(y,Math.min(t-e+1,2147483647)))}function y(){_+=1;for(let e of h.keys())e();v()}function b(){document.hidden||y()}const x=()=>_,S=()=>0;function C(e,n){let r=t(t=>(h.size||document.addEventListener(`visibilitychange`,b),h.set(t,[Date.parse(e),Date.parse(n)]),v(),()=>{h.delete(t),v(),h.size||document.removeEventListener(`visibilitychange`,b)}),[e,n]);a(r,x,S)}export{f as a,d as i,m as n,p as o,u as r,l as s,C as t};
|
|
2
2
|
//# sourceMappingURL=use-auction-boundary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-auction-boundary.js","names":[],"sources":["../src/auction-description-html.ts","../src/auction-description.tsx","../src/auction-display.ts","../src/use-auction-visibility.ts","../src/use-auction-boundary.ts"],"sourcesContent":["import sanitizeHtml from \"sanitize-html\";\n\nconst richDescriptionPattern =\n /<\\/?(?:p|br|strong|em|u|s|ul|ol|li|blockquote|pre|code|hr|h[1-6]|a)(?:\\s|\\/?>)/i;\n\nexport function auctionDescriptionHtml(\n description: string,\n links = true\n): string {\n if (!richDescriptionPattern.test(description)) {\n return description\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\\r\\n|\\r|\\n/g, \"<br>\");\n }\n\n return sanitizeHtml(description, {\n allowedAttributes: { a: links ? [\"href\"] : [], ol: [\"start\"] },\n allowedSchemes: [\"http\", \"https\", \"mailto\", \"tel\"],\n allowedTags: [\n \"p\",\n \"br\",\n \"strong\",\n \"em\",\n \"u\",\n \"s\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"pre\",\n \"code\",\n \"hr\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n ...(links ? [\"a\"] : []),\n ],\n allowProtocolRelative: false,\n });\n}\n\nexport function auctionDescriptionText(description: string): string {\n if (!richDescriptionPattern.test(description)) {\n return description.trim();\n }\n return sanitizeHtml(\n description.replace(\n /<\\/?(?:p|br|li|ul|ol|blockquote|pre|hr|h[1-6])(?:\\s[^>]*)?\\/?>/gi,\n \" \"\n ),\n {\n allowedAttributes: {},\n allowedTags: [],\n }\n )\n .replace(/ /g, \" \")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n","import { auctionDescriptionHtml } from \"./auction-description-html.ts\";\n\nexport function AuctionDescription({\n description,\n links = true,\n className,\n id,\n}: {\n description: string;\n links?: boolean;\n className?: string | undefined;\n id?: string | undefined;\n}) {\n return (\n <div\n className={[\"lockerverse-auctions__description\", className]\n .filter(Boolean)\n .join(\" \")}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: The shared allowlist strips scripts, event handlers, attributes, and unsafe link protocols before rendering.\n dangerouslySetInnerHTML={{\n __html: auctionDescriptionHtml(description, links),\n }}\n id={id}\n />\n );\n}\n","import type {\n LockerverseAuction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\n\n// Match the public web app. Keep display policy here for all SDK auction surfaces.\nexport function formatAuctionBoundary(\n auction: LockerverseAuction,\n status: LockerverseAuctionStatus = auction.status\n) {\n const starts = status === \"draft\";\n const value = starts ? auction.startAt : auction.endAt;\n const date = new Date(value);\n if (!Number.isFinite(date.getTime())) {\n return \"\";\n }\n const showTime =\n (starts\n ? auction.configuration.startTimeEnabled\n : auction.configuration.endTimeEnabled) ?? true;\n const dateLabel = new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"short\",\n timeZone: \"America/New_York\",\n year: \"numeric\",\n }).format(date);\n if (!showTime) {\n return dateLabel;\n }\n const timeLabel = new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone: \"America/New_York\",\n timeZoneName: \"short\",\n }).format(date);\n return `${dateLabel} at ${timeLabel}`;\n}\n\nexport function formatAuctionMoney(cents: number) {\n return new Intl.NumberFormat(\"en-US\", {\n currency: \"USD\",\n maximumFractionDigits: 2,\n minimumFractionDigits: 0,\n style: \"currency\",\n }).format(cents / 100);\n}\n\nexport function getAuctionDisplayStatus(\n auction: LockerverseAuction,\n item?: LockerverseAuctionItem\n): LockerverseAuctionStatus {\n if (auction.status === \"finished\" || item?.status === \"finished\") {\n return \"finished\";\n }\n if (auction.status === \"draft\" || item?.status === \"draft\") {\n return \"draft\";\n }\n if (Date.parse(auction.endAt) <= Date.now()) {\n return \"finished\";\n }\n if (Date.parse(auction.startAt) > Date.now()) {\n return \"draft\";\n }\n return \"active\";\n}\n\nexport function isAuctionItemSoldOut(item: LockerverseAuctionItem) {\n return (\n item.isSoldOut ||\n (item.saleMode === \"buy_now\" && item.availableQuantity === 0)\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n/** Automatic motion stays off during SSR and in browsers without observation.\n * Manual gallery navigation remains available in those environments. */\nexport function useAuctionVisibility<ElementType extends HTMLElement>() {\n const ref = useRef<ElementType>(null);\n const [visible, setVisible] = useState(false);\n useEffect(() => {\n const element = ref.current;\n // biome-ignore lint/suspicious/noUnnecessaryConditions: React assigns this ref after rendering.\n if (!(element && \"IntersectionObserver\" in window)) {\n return;\n }\n let intersecting = false;\n const update = () => setVisible(intersecting && !document.hidden);\n const observer = new IntersectionObserver(([entry]) => {\n intersecting = Boolean(\n entry?.isIntersecting && entry.intersectionRatio > 0\n );\n update();\n });\n observer.observe(element);\n document.addEventListener(\"visibilitychange\", update);\n return () => {\n observer.disconnect();\n document.removeEventListener(\"visibilitychange\", update);\n };\n }, []);\n return { ref, visible };\n}\n","import { useCallback, useSyncExternalStore } from \"react\";\n\n// One timer serves every mounted auction surface, including standalone cards.\nconst subscriptions = new Map<() => void, readonly number[]>();\nlet timer: ReturnType<typeof setTimeout> | undefined;\nlet revision = 0;\nconst MAX_DELAY = 2_147_483_647;\n\nfunction schedule() {\n clearTimeout(timer);\n timer = undefined;\n const now = Date.now();\n let next = Number.POSITIVE_INFINITY;\n for (const boundaries of subscriptions.values()) {\n for (const boundary of boundaries) {\n if (boundary > now) {\n next = Math.min(next, boundary);\n }\n }\n }\n if (Number.isFinite(next)) {\n timer = setTimeout(notify, Math.min(next - now + 1, MAX_DELAY));\n }\n}\nfunction notify() {\n revision += 1;\n for (const listener of subscriptions.keys()) {\n listener();\n }\n schedule();\n}\nfunction onVisibilityChange() {\n if (!document.hidden) {\n notify();\n }\n}\nconst getSnapshot = () => revision;\nconst getServerSnapshot = () => 0;\n\n/** Re-render at known boundaries without polling or changing server status. */\nexport function useAuctionBoundary(startAt: string, endAt: string) {\n const subscribe = useCallback(\n (listener: () => void) => {\n if (!subscriptions.size) {\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n }\n subscriptions.set(listener, [Date.parse(startAt), Date.parse(endAt)]);\n schedule();\n return () => {\n subscriptions.delete(listener);\n schedule();\n if (!subscriptions.size) {\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n }\n };\n },\n [startAt, endAt]\n );\n useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-auction-boundary.js","names":[],"sources":["../src/auction-description-html.ts","../src/auction-description.tsx","../src/auction-display.ts","../src/use-auction-visibility.ts","../src/use-auction-boundary.ts"],"sourcesContent":["const richDescriptionPattern =\n /<\\/?(?:p|br|strong|em|u|s|ul|ol|li|blockquote|pre|code|hr|h[1-6]|a)(?:\\s|\\/?>)/i;\n\nexport function auctionDescriptionHtml(description: string): string {\n if (!richDescriptionPattern.test(description)) {\n return description\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\\r\\n|\\r|\\n/g, \"<br>\");\n }\n\n return description;\n}\n","import { auctionDescriptionHtml } from \"./auction-description-html.ts\";\n\nexport function AuctionDescription({\n description,\n className,\n id,\n}: {\n description: string;\n className?: string | undefined;\n id?: string | undefined;\n}) {\n return (\n <div\n className={[\"lockerverse-auctions__description\", className]\n .filter(Boolean)\n .join(\" \")}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: Auction description HTML is trusted content supplied by the backend; the SDK renders it unchanged.\n dangerouslySetInnerHTML={{\n __html: auctionDescriptionHtml(description),\n }}\n id={id}\n />\n );\n}\n","import type {\n LockerverseAuction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { formatMoney } from \"./format-money.ts\";\n\n// Match the public web app. Keep display policy here for all SDK auction surfaces.\nexport function formatAuctionBoundary(\n auction: LockerverseAuction,\n status: LockerverseAuctionStatus = auction.status\n) {\n const starts = status === \"draft\";\n const value = starts ? auction.startAt : auction.endAt;\n const date = new Date(value);\n if (!Number.isFinite(date.getTime())) {\n return \"\";\n }\n const showTime =\n (starts\n ? auction.configuration.startTimeEnabled\n : auction.configuration.endTimeEnabled) ?? true;\n const dateLabel = new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"short\",\n timeZone: \"America/New_York\",\n year: \"numeric\",\n }).format(date);\n if (!showTime) {\n return dateLabel;\n }\n const timeLabel = new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone: \"America/New_York\",\n timeZoneName: \"short\",\n }).format(date);\n return `${dateLabel} at ${timeLabel}`;\n}\n\nexport function formatAuctionMoney(cents: number) {\n return formatMoney(cents, 0);\n}\n\nexport function getAuctionDisplayStatus(\n auction: LockerverseAuction,\n item?: LockerverseAuctionItem\n): LockerverseAuctionStatus {\n if (auction.status === \"finished\" || item?.status === \"finished\") {\n return \"finished\";\n }\n if (auction.status === \"draft\" || item?.status === \"draft\") {\n return \"draft\";\n }\n if (Date.parse(auction.endAt) <= Date.now()) {\n return \"finished\";\n }\n if (Date.parse(auction.startAt) > Date.now()) {\n return \"draft\";\n }\n return \"active\";\n}\n\nexport function isAuctionItemSoldOut(item: LockerverseAuctionItem) {\n return (\n item.isSoldOut ||\n (item.saleMode === \"buy_now\" && item.availableQuantity === 0)\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n/** Automatic motion stays off during SSR and in browsers without observation.\n * Manual gallery navigation remains available in those environments. */\nexport function useAuctionVisibility<ElementType extends HTMLElement>() {\n const ref = useRef<ElementType>(null);\n const [visible, setVisible] = useState(false);\n useEffect(() => {\n const element = ref.current;\n // biome-ignore lint/suspicious/noUnnecessaryConditions: React assigns this ref after rendering.\n if (!(element && \"IntersectionObserver\" in window)) {\n return;\n }\n let intersecting = false;\n const update = () => setVisible(intersecting && !document.hidden);\n const observer = new IntersectionObserver(([entry]) => {\n intersecting = Boolean(\n entry?.isIntersecting && entry.intersectionRatio > 0\n );\n update();\n });\n observer.observe(element);\n document.addEventListener(\"visibilitychange\", update);\n return () => {\n observer.disconnect();\n document.removeEventListener(\"visibilitychange\", update);\n };\n }, []);\n return { ref, visible };\n}\n","import { useCallback, useSyncExternalStore } from \"react\";\n\n// One timer serves every mounted auction surface, including standalone cards.\nconst subscriptions = new Map<() => void, readonly number[]>();\nlet timer: ReturnType<typeof setTimeout> | undefined;\nlet revision = 0;\nconst MAX_DELAY = 2_147_483_647;\n\nfunction schedule() {\n clearTimeout(timer);\n timer = undefined;\n const now = Date.now();\n let next = Number.POSITIVE_INFINITY;\n for (const boundaries of subscriptions.values()) {\n for (const boundary of boundaries) {\n if (boundary > now) {\n next = Math.min(next, boundary);\n }\n }\n }\n if (Number.isFinite(next)) {\n timer = setTimeout(notify, Math.min(next - now + 1, MAX_DELAY));\n }\n}\nfunction notify() {\n revision += 1;\n for (const listener of subscriptions.keys()) {\n listener();\n }\n schedule();\n}\nfunction onVisibilityChange() {\n if (!document.hidden) {\n notify();\n }\n}\nconst getSnapshot = () => revision;\nconst getServerSnapshot = () => 0;\n\n/** Re-render at known boundaries without polling or changing server status. */\nexport function useAuctionBoundary(startAt: string, endAt: string) {\n const subscribe = useCallback(\n (listener: () => void) => {\n if (!subscriptions.size) {\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n }\n subscriptions.set(listener, [Date.parse(startAt), Date.parse(endAt)]);\n schedule();\n return () => {\n subscriptions.delete(listener);\n schedule();\n if (!subscriptions.size) {\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n }\n };\n },\n [startAt, endAt]\n );\n useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./immutable-resource-identity.js";import{useCallback as t,useEffect as n,useRef as r,useState as i}from"react";import{createLockerverseAuctionClient as a}from"@lockerverse/sdk/auctions";function o(o){e(`auctions`,{apiBaseUrl:o.apiBaseUrl,communitySlug:o.communitySlug,environment:o.environment,slug:``});let s=r(o.onError);s.current=o.onError;let[c]=i(()=>a({...o,onError:e=>s.current?.(e)})),[l,u]=i(0),[d,f]=i({auctions:null,error:null});n(()=>{let e=!0;return c.list().then(t=>{e&&f({auctions:t,error:null})},t=>{e&&f({auctions:null,error:t})}),()=>{e=!1}},[c,l]);let p=t(()=>{f({auctions:null,error:null}),u(e=>e+1)},[]);return{...d,client:c,loading:d.auctions===null&&d.error===null,refresh:p}}export{o as t};
|
|
1
|
+
import{t as e}from"./immutable-resource-identity.js";import{useCallback as t,useEffect as n,useRef as r,useState as i}from"react";import{createLockerverseAuctionClient as a}from"@lockerverse/sdk/auctions";function o(o){e(`auctions`,{apiBaseUrl:o.apiBaseUrl,communitySlug:o.communitySlug,environment:o.environment,mediaBaseUrl:o.mediaBaseUrl,slug:``});let s=r(o.onError);s.current=o.onError;let[c]=i(()=>a({...o,onError:e=>s.current?.(e)})),[l,u]=i(0),[d,f]=i({auctions:null,error:null});n(()=>{let e=!0;return c.list().then(t=>{e&&f({auctions:t,error:null})},t=>{e&&f({auctions:null,error:t})}),()=>{e=!1}},[c,l]);let p=t(()=>{f({auctions:null,error:null}),u(e=>e+1)},[]);return{...d,client:c,loading:d.auctions===null&&d.error===null,refresh:p}}export{o as t};
|
|
2
2
|
//# sourceMappingURL=use-lockerverse-auctions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-lockerverse-auctions.js","names":[],"sources":["../src/use-lockerverse-auctions.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 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":"6MAuBA,SAAgB,EACd,EAC8B,CAC9B,EAA6B,WAAY,CACvC,WAAY,EAAQ,WACpB,cAAe,EAAQ,cACvB,YAAa,EAAQ,YACrB,KAAM,EACR,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,CAAC,EAAU,GAAe,EAAS,CAAC,EACpC,CAAC,EAAO,GAAY,EAA2B,CACnD,SAAU,KACV,MAAO,IACT,CAAC,EACD,MAAgB,CACd,IAAI,EAAS,GAab,OAZA,EAAO,KAAK,CAAC,CAAC,KACX,GAAa,CACR,GACF,EAAS,CAAE,WAAU,MAAO,IAAK,CAAC,CAEtC,EACC,GAA+B,CAC1B,GACF,EAAS,CAAE,SAAU,KAAM,OAAM,CAAC,CAEtC,CACF,MACa,CACX,EAAS,EACX,CACF,EAAG,CAAC,EAAQ,CAAQ,CAAC,EACrB,IAAM,EAAU,MAAkB,CAChC,EAAS,CAAE,SAAU,KAAM,MAAO,IAAK,CAAC,EACxC,EAAa,GAAU,EAAQ,CAAC,CAClC,EAAG,CAAC,CAAC,EACL,MAAO,CACL,GAAG,EACH,SACA,QAAS,EAAM,WAAa,MAAQ,EAAM,QAAU,KACpD,SACF,CACF"}
|
|
1
|
+
{"version":3,"file":"use-lockerverse-auctions.js","names":[],"sources":["../src/use-lockerverse-auctions.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 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 mediaBaseUrl: options.mediaBaseUrl,\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":"6MAuBA,SAAgB,EACd,EAC8B,CAC9B,EAA6B,WAAY,CACvC,WAAY,EAAQ,WACpB,cAAe,EAAQ,cACvB,YAAa,EAAQ,YACrB,aAAc,EAAQ,aACtB,KAAM,EACR,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,CAAC,EAAU,GAAe,EAAS,CAAC,EACpC,CAAC,EAAO,GAAY,EAA2B,CACnD,SAAU,KACV,MAAO,IACT,CAAC,EACD,MAAgB,CACd,IAAI,EAAS,GAab,OAZA,EAAO,KAAK,CAAC,CAAC,KACX,GAAa,CACR,GACF,EAAS,CAAE,WAAU,MAAO,IAAK,CAAC,CAEtC,EACC,GAA+B,CAC1B,GACF,EAAS,CAAE,SAAU,KAAM,OAAM,CAAC,CAEtC,CACF,MACa,CACX,EAAS,EACX,CACF,EAAG,CAAC,EAAQ,CAAQ,CAAC,EACrB,IAAM,EAAU,MAAkB,CAChC,EAAS,CAAE,SAAU,KAAM,MAAO,IAAK,CAAC,EACxC,EAAa,GAAU,EAAQ,CAAC,CAClC,EAAG,CAAC,CAAC,EACL,MAAO,CACL,GAAG,EACH,SACA,QAAS,EAAM,WAAa,MAAQ,EAAM,QAAU,KACpD,SACF,CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lockerverse/react",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.104",
|
|
4
4
|
"description": "Tree-shakable React payment and signup UI for Lockerverse",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
},
|
|
10
10
|
"sideEffects": [
|
|
11
11
|
"./dist/form-ui.css",
|
|
12
|
+
"./dist/form-controls.css",
|
|
13
|
+
"./dist/phone-field.css",
|
|
14
|
+
"./dist/select-control.css",
|
|
12
15
|
"./dist/styles.css",
|
|
13
16
|
"./dist/signup.css",
|
|
14
17
|
"./dist/auctions.css",
|
|
@@ -102,11 +105,9 @@
|
|
|
102
105
|
"@base-ui/react": "1.6.0",
|
|
103
106
|
"embla-carousel-autoplay": "8.6.0",
|
|
104
107
|
"embla-carousel-react": "8.6.0",
|
|
105
|
-
"libphonenumber-js": "1.13.11",
|
|
106
108
|
"lucide-react": "0.536.0",
|
|
107
|
-
"sanitize-html": "2.17.7",
|
|
108
109
|
"valibot": "1.4.2",
|
|
109
|
-
"@lockerverse/sdk": "0.2.
|
|
110
|
+
"@lockerverse/sdk": "0.2.104"
|
|
110
111
|
},
|
|
111
112
|
"devDependencies": {
|
|
112
113
|
"@size-limit/file": "13.0.3",
|
|
@@ -115,7 +116,6 @@
|
|
|
115
116
|
"@types/node": "24.10.0",
|
|
116
117
|
"@types/react": "19.2.18",
|
|
117
118
|
"@types/react-dom": "19.2.4",
|
|
118
|
-
"@types/sanitize-html": "2.16.1",
|
|
119
119
|
"@vitest/browser-playwright": "4.1.10",
|
|
120
120
|
"playwright": "1.62.1",
|
|
121
121
|
"prop-types": "15.8.1",
|
package/dist/phone.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e,n as t,r as n}from"./host-callback.js";import{jsx as r,jsxs as i}from"react/jsx-runtime";import{array as a,minLength as o,nonEmpty as s,pipe as c,safeParse as l,string as u,trim as d}from"valibot";const f=/^#([\da-f]{3}|[\da-f]{6})$/i,p=/^([\da-f]{3}|[\da-f]{6})$/i;function m(e){let t=e.trim();return p.test(t)?`#${t}`:t}function h(e){let t=f.exec(m(e));if(!t)return;let[,n]=t;if(!n)return;let r=n.length===3?Array.from(n,e=>`${e}${e}`).join(``):n;return[0,2,4].map(e=>Number.parseInt(r.slice(e,e+2),16))}function g([e,t,n]){let[r=0,i=0,a=0]=[e,t,n].map((e=0)=>{let t=e/255;return t<=.04045?t/12.92:((t+.055)/1.055)**2.4});return .2126*r+.7152*i+.0722*a}function _(e){let t=h(e);if(!t)return;let n=g(t);return(n+.05)/.05>=1.05/(n+.05)?`#000`:`#fff`}function v(e){return e.type===`checkbox`?!1:e.type===`checkboxes`||e.type===`multi_select`?[]:``}function y(e){let t={};for(let n of e)t[n.id]=v(n);return t}function b(e){let t=l(u(),e);return t.success?t.output:``}function x(e,t){return e.map(e=>{let n=t[e.id];return e.type===`checkbox`?{fieldId:e.id,value:n===!0}:e.type===`checkboxes`||e.type===`multi_select`?{fieldId:e.id,value:Array.isArray(n)?n:[]}:{fieldId:e.id,value:b(n)}})}function S(e,t){let n={};for(let r of e){if(!r.required)continue;let e=`${r.label} is required.`,i=t[r.id];if(r.type===`checkbox`){i!==!0&&(n[r.id]=e);continue}let f=r.type===`checkboxes`||r.type===`multi_select`?l(c(a(u()),o(1,e)),i??[]):l(c(u(),d(),s(e)),b(i));f.success||(n[r.id]=f.issues[0]?.message??e)}return n}function C({choiceClassName:e,errorClassName:t,errors:n,fields:i,idPrefix:a,onChange:o,values:s}){return i.map(i=>r(w,{choiceClassName:e,error:n[i.id],errorClassName:t,field:i,idPrefix:a,onChange:e=>o({...s,[i.id]:e}),value:s[i.id]},i.id))}function w(e){let{field:t,idPrefix:n}=e,i=`${n}-custom-${t.id}`,a=`${i}-error`,o={...e,controlId:i,errorId:a};switch(t.type){case`checkbox`:return r(T,{...o,field:t});case`text`:case`textarea`:return r(D,{...o,field:t});case`select`:case`multi_select`:return r(O,{...o,field:t});case`radio`:case`checkboxes`:return r(k,{...o,field:t});default:return null}}function T({choiceClassName:e,controlId:t,error:n,errorClassName:a,errorId:o,field:s,onChange:c,value:l}){return i(`label`,{className:e,htmlFor:t,children:[r(`input`,{"aria-describedby":n?o:void 0,"aria-invalid":n?`true`:void 0,checked:l===!0,id:t,name:`custom:${s.id}`,onChange:e=>c(e.currentTarget.checked),required:s.required,type:`checkbox`}),r(`span`,{children:s.label}),r(E,{className:a,error:n,id:o})]})}function E({className:e,error:t,id:n}){return t?r(`span`,{className:e,id:n,role:`alert`,children:t}):null}function D({controlId:e,error:t,errorClassName:n,errorId:a,field:o,onChange:s,value:c}){let l={"aria-describedby":t?a:void 0,"aria-invalid":t?`true`:void 0,id:e,name:`custom:${o.id}`,onChange:e=>s(e.currentTarget.value),required:o.required,value:b(c)};return i(`label`,{htmlFor:e,children:[r(`span`,{children:o.label}),o.type===`textarea`?r(`textarea`,{...l}):r(`input`,{...l}),r(E,{className:n,error:t,id:a})]})}function O({controlId:e,error:t,errorClassName:n,errorId:a,field:o,onChange:s,value:c}){return i(`label`,{htmlFor:e,children:[r(`span`,{children:o.label}),i(`select`,{"aria-describedby":t?a:void 0,"aria-invalid":t?`true`:void 0,id:e,multiple:o.type===`multi_select`,name:`custom:${o.id}`,onChange:e=>s(o.type===`multi_select`?[...e.currentTarget.selectedOptions].map(e=>e.value):e.currentTarget.value),required:o.required,value:c===!0||c===!1?``:c??(o.type===`multi_select`?[]:``),children:[o.type===`select`?r(`option`,{value:``,children:`Selectโฆ`}):null,o.options.map(e=>r(`option`,{value:e.id,children:e.label},e.id))]}),r(E,{className:n,error:t,id:a})]})}function k({choiceClassName:e,controlId:t,error:n,errorClassName:a,errorId:o,field:s,onChange:c,value:l}){let u=Array.isArray(l)?l:[];return i(`fieldset`,{"aria-describedby":n?o:void 0,"aria-invalid":n?`true`:void 0,children:[r(`legend`,{children:s.label}),s.options.map((n,a)=>i(`label`,{className:e,children:[r(`input`,{checked:Array.isArray(l)?l.includes(n.id):l===n.id,id:`${t}-${a}`,name:`custom:${s.id}`,onChange:e=>{if(s.type===`radio`){c(n.id);return}c(e.currentTarget.checked?[...u,n.id]:u.filter(e=>e!==n.id))},required:s.required&&s.type===`radio`,type:s.type===`radio`?`radio`:`checkbox`,value:n.id}),r(`span`,{children:n.label})]},n.id)),r(E,{className:a,error:n,id:o})]})}function A({fieldCount:e,label:t,sectionCount:n=0,showCheckbox:a=!1}){return i(`div`,{className:`lockerverse-form-skeleton__loading`,children:[r(`span`,{className:`lockerverse-form-skeleton__sr-only`,role:`status`,children:t}),i(`div`,{"aria-hidden":`true`,className:`lockerverse-form-skeleton`,children:[i(`div`,{className:`lockerverse-form-skeleton__branding`,children:[r(`span`,{className:`lockerverse-form-skeleton__avatar`}),r(`span`,{className:`lockerverse-form-skeleton__community`})]}),r(`div`,{className:`lockerverse-form-skeleton__fields`,children:Array.from({length:e},(e,t)=>i(`div`,{className:`lockerverse-form-skeleton__field`,children:[r(`span`,{className:`lockerverse-form-skeleton__label`}),r(`span`,{className:`lockerverse-form-skeleton__input`})]},t))}),Array.from({length:n},(e,t)=>i(`div`,{className:`lockerverse-form-skeleton__section`,children:[r(`span`,{className:`lockerverse-form-skeleton__section-label`}),i(`div`,{className:`lockerverse-form-skeleton__section-content`,children:[r(`span`,{className:`lockerverse-form-skeleton__section-full`}),i(`div`,{className:`lockerverse-form-skeleton__section-grid`,children:[r(`span`,{className:`lockerverse-form-skeleton__section-half`}),r(`span`,{className:`lockerverse-form-skeleton__section-half`})]})]})]},t)),i(`div`,{className:`lockerverse-form-skeleton__actions`,children:[a?r(`span`,{className:`lockerverse-form-skeleton__check-line`}):null,r(`span`,{className:`lockerverse-form-skeleton__button`})]})]})]})}const j=[{callingCode:`+1`,label:`๐บ๐ธ +1`,value:`US`},{callingCode:`+52`,label:`๐ฒ๐ฝ +52`,value:`MX`},{callingCode:`+380`,label:`๐บ๐ฆ +380`,value:`UA`},{callingCode:`+48`,label:`๐ต๐ฑ +48`,value:`PL`},{callingCode:`+1`,label:`๐จ๐ฆ +1`,value:`CA`},{callingCode:`+49`,label:`๐ฉ๐ช +49`,value:`DE`},{callingCode:`+44`,label:`๐ฌ๐ง +44`,value:`GB`},{callingCode:`+46`,label:`๐ธ๐ช +46`,value:`SE`},{callingCode:`+358`,label:`๐ซ๐ฎ +358`,value:`FI`},{callingCode:`+1`,label:`๐ต๐ท +1`,value:`PR`}];function M(e){if(e===`PAYMENT_WIDGET_PHONE_REQUIRED`||e===`SIGN_UP_WIDGET_PHONE_REQUIRED`)return n;if(e===`PAYMENT_WIDGET_PHONE_INVALID`||e===`SIGN_UP_WIDGET_PHONE_INVALID`)return t}function N(e){return j.find(t=>t.value===e)??j[0]}function P(e,t){let n=`${t}${t}`,r=e;for(;r.startsWith(n);)r=`${t}${r.slice(n.length)}`;return r}function F(t,n){let r=e(t);if(!r)return``;let i=N(n),a=P(r,i.callingCode);return a.startsWith(`+`)?a:`${i.callingCode}${a}`}export{C as a,S as c,A as i,_ as l,F as n,x as o,M as r,y as s,j as t,m as u};
|
|
2
|
-
//# sourceMappingURL=phone.js.map
|
package/dist/phone.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"phone.js","names":[],"sources":["../src/accent-contrast.ts","../src/custom-fields.tsx","../src/form-skeleton.tsx","../src/phone.ts"],"sourcesContent":["const HEX_COLOR = /^#([\\da-f]{3}|[\\da-f]{6})$/i;\nconst UNPREFIXED_HEX_COLOR = /^([\\da-f]{3}|[\\da-f]{6})$/i;\n\nexport function normalizeAccentColor(color: string) {\n const trimmedColor = color.trim();\n return UNPREFIXED_HEX_COLOR.test(trimmedColor)\n ? `#${trimmedColor}`\n : trimmedColor;\n}\n\nfunction parseHexColor(color: string) {\n const match = HEX_COLOR.exec(normalizeAccentColor(color));\n if (!match) {\n return;\n }\n const [, value] = match;\n if (!value) {\n return;\n }\n const expanded =\n value.length === 3\n ? Array.from(value, (character) => `${character}${character}`).join(\"\")\n : value;\n return [0, 2, 4].map((offset) =>\n Number.parseInt(expanded.slice(offset, offset + 2), 16)\n );\n}\n\nfunction relativeLuminance([red, green, blue]: number[]) {\n const [linearRed = 0, linearGreen = 0, linearBlue = 0] = [\n red,\n green,\n blue,\n ].map((channel = 0) => {\n const normalized = channel / 255;\n return normalized <= 0.040_45\n ? normalized / 12.92\n : ((normalized + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * linearRed + 0.7152 * linearGreen + 0.0722 * linearBlue;\n}\n\nexport function getAccentContrast(color: string) {\n const parsed = parseHexColor(color);\n if (!parsed) {\n return;\n }\n const luminance = relativeLuminance(parsed);\n const blackContrast = (luminance + 0.05) / 0.05;\n const whiteContrast = 1.05 / (luminance + 0.05);\n return blackContrast >= whiteContrast ? \"#000\" : \"#fff\";\n}\n","import type {\n LockerverseBooleanCustomField,\n LockerverseCustomField,\n LockerverseCustomFieldAnswer,\n LockerverseMultiOptionCustomField,\n LockerverseSingleOptionCustomField,\n} from \"@lockerverse/sdk/checkout\";\nimport {\n array,\n minLength,\n nonEmpty,\n pipe,\n safeParse,\n string,\n trim,\n} from \"valibot\";\n\nexport type CustomFieldValues = Record<string, boolean | string | string[]>;\n\nfunction createCustomFieldValue(field: LockerverseCustomField) {\n if (field.type === \"checkbox\") {\n return false;\n }\n if (field.type === \"checkboxes\" || field.type === \"multi_select\") {\n return [];\n }\n return \"\";\n}\n\nexport function createCustomFieldValues(fields: LockerverseCustomField[]) {\n const values: CustomFieldValues = {};\n for (const field of fields) {\n values[field.id] = createCustomFieldValue(field);\n }\n return values;\n}\n\nfunction getStringValue(value: CustomFieldValues[string] | undefined) {\n const result = safeParse(string(), value);\n return result.success ? result.output : \"\";\n}\n\nexport function buildCustomFieldAnswers(\n fields: LockerverseCustomField[],\n values: CustomFieldValues\n): LockerverseCustomFieldAnswer[] {\n return fields.map((field): LockerverseCustomFieldAnswer => {\n const value = values[field.id];\n if (field.type === \"checkbox\") {\n return { fieldId: field.id, value: value === true };\n }\n if (field.type === \"checkboxes\" || field.type === \"multi_select\") {\n return { fieldId: field.id, value: Array.isArray(value) ? value : [] };\n }\n return {\n fieldId: field.id,\n value: getStringValue(value),\n };\n });\n}\n\nexport function validateCustomFields(\n fields: LockerverseCustomField[],\n values: CustomFieldValues\n) {\n const errors: Record<string, string> = {};\n for (const field of fields) {\n if (!field.required) {\n continue;\n }\n const message = `${field.label} is required.`;\n const value = values[field.id];\n if (field.type === \"checkbox\") {\n if (value !== true) {\n errors[field.id] = message;\n }\n continue;\n }\n const result =\n field.type === \"checkboxes\" || field.type === \"multi_select\"\n ? safeParse(pipe(array(string()), minLength(1, message)), value ?? [])\n : safeParse(\n pipe(string(), trim(), nonEmpty(message)),\n getStringValue(value)\n );\n if (!result.success) {\n errors[field.id] = result.issues[0]?.message ?? message;\n }\n }\n return errors;\n}\n\nexport function CustomFields({\n choiceClassName,\n errorClassName,\n errors,\n fields,\n idPrefix,\n onChange,\n values,\n}: {\n choiceClassName: string;\n errorClassName: string;\n errors: Record<string, string>;\n fields: LockerverseCustomField[];\n idPrefix: string;\n onChange: (values: CustomFieldValues) => void;\n values: CustomFieldValues;\n}) {\n return fields.map((field) => (\n <CustomField\n choiceClassName={choiceClassName}\n error={errors[field.id]}\n errorClassName={errorClassName}\n field={field}\n idPrefix={idPrefix}\n key={field.id}\n onChange={(value) => onChange({ ...values, [field.id]: value })}\n value={values[field.id]}\n />\n ));\n}\n\ntype CustomFieldProps = {\n choiceClassName: string;\n error: string | undefined;\n errorClassName: string;\n field: LockerverseCustomField;\n idPrefix: string;\n onChange: (value: boolean | string | string[]) => void;\n value: boolean | string | string[] | undefined;\n};\n\nfunction CustomField(props: CustomFieldProps) {\n const { field, idPrefix } = props;\n const controlId = `${idPrefix}-custom-${field.id}`;\n const errorId = `${controlId}-error`;\n const controlProps = { ...props, controlId, errorId };\n switch (field.type) {\n case \"checkbox\":\n return <BooleanCustomField {...controlProps} field={field} />;\n case \"text\":\n case \"textarea\":\n return <TextCustomField {...controlProps} field={field} />;\n case \"select\":\n case \"multi_select\":\n return <SelectCustomField {...controlProps} field={field} />;\n case \"radio\":\n case \"checkboxes\":\n return <ChoiceCustomField {...controlProps} field={field} />;\n default:\n return null;\n }\n}\n\nfunction BooleanCustomField({\n choiceClassName,\n controlId,\n error,\n errorClassName,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & { field: LockerverseBooleanCustomField }) {\n return (\n <label className={choiceClassName} htmlFor={controlId}>\n <input\n aria-describedby={error ? errorId : undefined}\n aria-invalid={error ? \"true\" : undefined}\n checked={value === true}\n id={controlId}\n name={`custom:${field.id}`}\n onChange={(event) => onChange(event.currentTarget.checked)}\n required={field.required}\n type=\"checkbox\"\n />\n <span>{field.label}</span>\n <FieldError className={errorClassName} error={error} id={errorId} />\n </label>\n );\n}\n\ntype ControlProps = CustomFieldProps & {\n controlId: string;\n errorId: string;\n};\n\nfunction FieldError({\n className,\n error,\n id,\n}: {\n className: string;\n error: string | undefined;\n id: string;\n}) {\n return error ? (\n <span className={className} id={id} role=\"alert\">\n {error}\n </span>\n ) : null;\n}\n\nfunction TextCustomField({\n controlId,\n error,\n errorClassName,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & {\n field: Extract<LockerverseCustomField, { type: \"text\" | \"textarea\" }>;\n}) {\n const commonProps = {\n \"aria-describedby\": error ? errorId : undefined,\n \"aria-invalid\": error ? (\"true\" as const) : undefined,\n id: controlId,\n name: `custom:${field.id}`,\n onChange: (\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n ) => onChange(event.currentTarget.value),\n required: field.required,\n value: getStringValue(value),\n };\n return (\n <label htmlFor={controlId}>\n <span>{field.label}</span>\n {field.type === \"textarea\" ? (\n <textarea {...commonProps} />\n ) : (\n <input {...commonProps} />\n )}\n <FieldError className={errorClassName} error={error} id={errorId} />\n </label>\n );\n}\n\nfunction SelectCustomField({\n controlId,\n error,\n errorClassName,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & {\n field: LockerverseMultiOptionCustomField | LockerverseSingleOptionCustomField;\n}) {\n return (\n <label htmlFor={controlId}>\n <span>{field.label}</span>\n <select\n aria-describedby={error ? errorId : undefined}\n aria-invalid={error ? \"true\" : undefined}\n id={controlId}\n multiple={field.type === \"multi_select\"}\n name={`custom:${field.id}`}\n onChange={(event) =>\n onChange(\n field.type === \"multi_select\"\n ? [...event.currentTarget.selectedOptions].map(\n (option) => option.value\n )\n : event.currentTarget.value\n )\n }\n required={field.required}\n value={\n value === true || value === false\n ? \"\"\n : (value ?? (field.type === \"multi_select\" ? [] : \"\"))\n }\n >\n {field.type === \"select\" ? <option value=\"\">Selectโฆ</option> : null}\n {field.options.map((option) => (\n <option key={option.id} value={option.id}>\n {option.label}\n </option>\n ))}\n </select>\n <FieldError className={errorClassName} error={error} id={errorId} />\n </label>\n );\n}\n\nfunction ChoiceCustomField({\n choiceClassName,\n controlId,\n error,\n errorClassName,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & {\n field: LockerverseMultiOptionCustomField | LockerverseSingleOptionCustomField;\n}) {\n const selectedValues = Array.isArray(value) ? value : [];\n return (\n <fieldset\n aria-describedby={error ? errorId : undefined}\n aria-invalid={error ? \"true\" : undefined}\n >\n <legend>{field.label}</legend>\n {field.options.map((option, index) => (\n <label className={choiceClassName} key={option.id}>\n <input\n checked={\n Array.isArray(value)\n ? value.includes(option.id)\n : value === option.id\n }\n id={`${controlId}-${index}`}\n name={`custom:${field.id}`}\n onChange={(event) => {\n if (field.type === \"radio\") {\n onChange(option.id);\n return;\n }\n onChange(\n event.currentTarget.checked\n ? [...selectedValues, option.id]\n : selectedValues.filter((id) => id !== option.id)\n );\n }}\n required={field.required && field.type === \"radio\"}\n type={field.type === \"radio\" ? \"radio\" : \"checkbox\"}\n value={option.id}\n />\n <span>{option.label}</span>\n </label>\n ))}\n <FieldError className={errorClassName} error={error} id={errorId} />\n </fieldset>\n );\n}\n","export function FormSkeleton({\n fieldCount,\n label,\n sectionCount = 0,\n showCheckbox = false,\n}: {\n fieldCount: number;\n label: string;\n sectionCount?: number;\n showCheckbox?: boolean;\n}) {\n return (\n <div className=\"lockerverse-form-skeleton__loading\">\n <span className=\"lockerverse-form-skeleton__sr-only\" role=\"status\">\n {label}\n </span>\n <div aria-hidden=\"true\" className=\"lockerverse-form-skeleton\">\n <div className=\"lockerverse-form-skeleton__branding\">\n <span className=\"lockerverse-form-skeleton__avatar\" />\n <span className=\"lockerverse-form-skeleton__community\" />\n </div>\n <div className=\"lockerverse-form-skeleton__fields\">\n {Array.from({ length: fieldCount }, (_, index) => (\n <div className=\"lockerverse-form-skeleton__field\" key={index}>\n <span className=\"lockerverse-form-skeleton__label\" />\n <span className=\"lockerverse-form-skeleton__input\" />\n </div>\n ))}\n </div>\n {Array.from({ length: sectionCount }, (_, index) => (\n <div className=\"lockerverse-form-skeleton__section\" key={index}>\n <span className=\"lockerverse-form-skeleton__section-label\" />\n <div className=\"lockerverse-form-skeleton__section-content\">\n <span className=\"lockerverse-form-skeleton__section-full\" />\n <div className=\"lockerverse-form-skeleton__section-grid\">\n <span className=\"lockerverse-form-skeleton__section-half\" />\n <span className=\"lockerverse-form-skeleton__section-half\" />\n </div>\n </div>\n </div>\n ))}\n <div className=\"lockerverse-form-skeleton__actions\">\n {showCheckbox ? (\n <span className=\"lockerverse-form-skeleton__check-line\" />\n ) : null}\n <span className=\"lockerverse-form-skeleton__button\" />\n </div>\n </div>\n </div>\n );\n}\n","import {\n normalizePhone,\n PHONE_INVALID_MESSAGE,\n PHONE_REQUIRED_MESSAGE,\n} from \"./contact-validation.ts\";\n\nexport const PHONE_COUNTRIES = [\n {\n callingCode: \"+1\",\n label: \"๐บ๐ธ +1\",\n value: \"US\",\n },\n {\n callingCode: \"+52\",\n label: \"๐ฒ๐ฝ +52\",\n value: \"MX\",\n },\n {\n callingCode: \"+380\",\n label: \"๐บ๐ฆ +380\",\n value: \"UA\",\n },\n {\n callingCode: \"+48\",\n label: \"๐ต๐ฑ +48\",\n value: \"PL\",\n },\n {\n callingCode: \"+1\",\n label: \"๐จ๐ฆ +1\",\n value: \"CA\",\n },\n {\n callingCode: \"+49\",\n label: \"๐ฉ๐ช +49\",\n value: \"DE\",\n },\n {\n callingCode: \"+44\",\n label: \"๐ฌ๐ง +44\",\n value: \"GB\",\n },\n {\n callingCode: \"+46\",\n label: \"๐ธ๐ช +46\",\n value: \"SE\",\n },\n {\n callingCode: \"+358\",\n label: \"๐ซ๐ฎ +358\",\n value: \"FI\",\n },\n {\n callingCode: \"+1\",\n label: \"๐ต๐ท +1\",\n value: \"PR\",\n },\n] as const;\n\nexport type PhoneCountry = (typeof PHONE_COUNTRIES)[number][\"value\"];\n\nexport function getPhoneServerError(serverCode: string | undefined) {\n if (\n serverCode === \"PAYMENT_WIDGET_PHONE_REQUIRED\" ||\n serverCode === \"SIGN_UP_WIDGET_PHONE_REQUIRED\"\n ) {\n return PHONE_REQUIRED_MESSAGE;\n }\n if (\n serverCode === \"PAYMENT_WIDGET_PHONE_INVALID\" ||\n serverCode === \"SIGN_UP_WIDGET_PHONE_INVALID\"\n ) {\n return PHONE_INVALID_MESSAGE;\n }\n}\n\nfunction getPhoneCountry(country: string) {\n return (\n PHONE_COUNTRIES.find((option) => option.value === country) ??\n PHONE_COUNTRIES[0]\n );\n}\n\nfunction removeRepeatedCallingCode(phone: string, callingCode: string) {\n const repeatedCallingCode = `${callingCode}${callingCode}`;\n let normalizedPhone = phone;\n while (normalizedPhone.startsWith(repeatedCallingCode)) {\n normalizedPhone = `${callingCode}${normalizedPhone.slice(repeatedCallingCode.length)}`;\n }\n return normalizedPhone;\n}\n\nexport function getInternationalPhone(phone: string, country: string) {\n const normalizedPhone = normalizePhone(phone);\n if (!normalizedPhone) {\n return \"\";\n }\n\n const selectedCountry = getPhoneCountry(country);\n const phoneWithOneCallingCode = removeRepeatedCallingCode(\n normalizedPhone,\n selectedCountry.callingCode\n );\n\n return phoneWithOneCallingCode.startsWith(\"+\")\n ? phoneWithOneCallingCode\n : `${selectedCountry.callingCode}${phoneWithOneCallingCode}`;\n}\n"],"mappings":"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"}
|