@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.
Files changed (47) hide show
  1. package/README.md +4 -0
  2. package/dist/auction-base.css +12 -0
  3. package/dist/auction-catalog.css +1 -1
  4. package/dist/auction-checkout.css +8 -75
  5. package/dist/auction-data.js +1 -1
  6. package/dist/auction-data.js.map +1 -1
  7. package/dist/auction-item-layout.css +7 -3
  8. package/dist/auction-item.d.ts.map +1 -1
  9. package/dist/auction-item.js +1 -1
  10. package/dist/auction-item.js.map +1 -1
  11. package/dist/auctions.d.ts.map +1 -1
  12. package/dist/auctions.js +1 -1
  13. package/dist/auctions.js.map +1 -1
  14. package/dist/form-controls.css +114 -0
  15. package/dist/form-skeleton.js +2 -0
  16. package/dist/form-skeleton.js.map +1 -0
  17. package/dist/form-ui.css +25 -9
  18. package/dist/format-money.js +2 -0
  19. package/dist/format-money.js.map +1 -0
  20. package/dist/host-callback.js +1 -1
  21. package/dist/host-callback.js.map +1 -1
  22. package/dist/immutable-resource-identity.js +1 -1
  23. package/dist/immutable-resource-identity.js.map +1 -1
  24. package/dist/lockerverse-auction.js +1 -1
  25. package/dist/lockerverse-auction.js.map +1 -1
  26. package/dist/lockerverse-donate-launcher.js +1 -1
  27. package/dist/lockerverse-donate-launcher.js.map +1 -1
  28. package/dist/lockerverse-payment.js +1 -1
  29. package/dist/lockerverse-payment.js.map +1 -1
  30. package/dist/payment-form.d.ts +1 -0
  31. package/dist/payment-form.d.ts.map +1 -1
  32. package/dist/phone-field.css +89 -0
  33. package/dist/select-control.css +18 -0
  34. package/dist/signup.css +1 -60
  35. package/dist/signup.d.ts.map +1 -1
  36. package/dist/signup.js +1 -1
  37. package/dist/signup.js.map +1 -1
  38. package/dist/stripe-loader.js +2 -0
  39. package/dist/stripe-loader.js.map +1 -0
  40. package/dist/styles.css +6 -232
  41. package/dist/use-auction-boundary.js +1 -1
  42. package/dist/use-auction-boundary.js.map +1 -1
  43. package/dist/use-lockerverse-auctions.js +1 -1
  44. package/dist/use-lockerverse-auctions.js.map +1 -1
  45. package/package.json +5 -5
  46. package/dist/phone.js +0 -2
  47. 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-payment__select-trigger:focus {
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 e,useEffect as t,useRef as n,useState as r,useSyncExternalStore as i}from"react";import a from"sanitize-html";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,t=!0){return s.test(e)?a(e,{allowedAttributes:{a:t?[`href`]:[],ol:[`start`]},allowedSchemes:[`http`,`https`,`mailto`,`tel`],allowedTags:[`p`,`br`,`strong`,`em`,`u`,`s`,`ul`,`ol`,`li`,`blockquote`,`pre`,`code`,`hr`,`h1`,`h2`,`h3`,`h4`,`h5`,`h6`,...t?[`a`]:[]],allowProtocolRelative:!1}):e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/\r\n|\r|\n/g,`<br>`)}function l(e){return s.test(e)?a(e.replace(/<\/?(?:p|br|li|ul|ol|blockquote|pre|hr|h[1-6])(?:\s[^>]*)?\/?>/gi,` `),{allowedAttributes:{},allowedTags:[]}).replace(/&nbsp;/g,` `).replace(/&lt;/g,`<`).replace(/&gt;/g,`>`).replace(/&quot;/g,`"`).replace(/&#39;/g,`'`).replace(/&amp;/g,`&`).replace(/\s+/g,` `).trim():e.trim()}function u({description:e,links:t=!0,className:n,id:r}){return o(`div`,{className:[`lockerverse-auctions__description`,n].filter(Boolean).join(` `),dangerouslySetInnerHTML:{__html:c(e,t)},id:r})}function d(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 f(e){return new Intl.NumberFormat(`en-US`,{currency:`USD`,maximumFractionDigits:2,minimumFractionDigits:0,style:`currency`}).format(e/100)}function p(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 m(e){return e.isSoldOut||e.saleMode===`buy_now`&&e.availableQuantity===0}function h(){let e=n(null),[i,a]=r(!1);return t(()=>{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:i}}const g=new Map;let _,v=0;function y(){clearTimeout(_),_=void 0;let e=Date.now(),t=1/0;for(let n of g.values())for(let r of n)r>e&&(t=Math.min(t,r));Number.isFinite(t)&&(_=setTimeout(b,Math.min(t-e+1,2147483647)))}function b(){v+=1;for(let e of g.keys())e();y()}function x(){document.hidden||b()}const S=()=>v,C=()=>0;function w(t,n){let r=e(e=>(g.size||document.addEventListener(`visibilitychange`,x),g.set(e,[Date.parse(t),Date.parse(n)]),y(),()=>{g.delete(e),y(),g.size||document.removeEventListener(`visibilitychange`,x)}),[t,n]);i(r,S,C)}export{p as a,l as c,f as i,h as n,m as o,d as r,u as s,w as t};
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,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).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, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\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(/&nbsp;/g, \" \")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&amp;/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, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\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.102",
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.102"
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":"mNAAA,MAAM,EAAY,8BACZ,EAAuB,6BAE7B,SAAgB,EAAqB,EAAe,CAClD,IAAM,EAAe,EAAM,KAAK,EAChC,OAAO,EAAqB,KAAK,CAAY,EACzC,IAAI,IACJ,CACN,CAEA,SAAS,EAAc,EAAe,CACpC,IAAM,EAAQ,EAAU,KAAK,EAAqB,CAAK,CAAC,EACxD,GAAI,CAAC,EACH,OAEF,GAAM,EAAG,GAAS,EAClB,GAAI,CAAC,EACH,OAEF,IAAM,EACJ,EAAM,SAAW,EACb,MAAM,KAAK,EAAQ,GAAc,GAAG,IAAY,GAAW,CAAC,CAAC,KAAK,EAAE,EACpE,EACN,MAAO,CAAC,EAAG,EAAG,CAAC,CAAC,CAAC,IAAK,GACpB,OAAO,SAAS,EAAS,MAAM,EAAQ,EAAS,CAAC,EAAG,EAAE,CACxD,CACF,CAEA,SAAS,EAAkB,CAAC,EAAK,EAAO,GAAiB,CACvD,GAAM,CAAC,EAAY,EAAG,EAAc,EAAG,EAAa,GAAK,CACvD,EACA,EACA,CACF,CAAC,CAAC,KAAK,EAAU,IAAM,CACrB,IAAM,EAAa,EAAU,IAC7B,OAAO,GAAc,OACjB,EAAa,QACX,EAAa,MAAS,QAAU,GACxC,CAAC,EACD,MAAO,OAAS,EAAY,MAAS,EAAc,MAAS,CAC9D,CAEA,SAAgB,EAAkB,EAAe,CAC/C,IAAM,EAAS,EAAc,CAAK,EAClC,GAAI,CAAC,EACH,OAEF,IAAM,EAAY,EAAkB,CAAM,EAG1C,OAFuB,EAAY,KAAQ,KACrB,MAAQ,EAAY,KACF,OAAS,MACnD,CChCA,SAAS,EAAuB,EAA+B,CAO7D,OANI,EAAM,OAAS,WACV,GAEL,EAAM,OAAS,cAAgB,EAAM,OAAS,eACzC,CAAC,EAEH,EACT,CAEA,SAAgB,EAAwB,EAAkC,CACxE,IAAM,EAA4B,CAAC,EACnC,IAAK,IAAM,KAAS,EAClB,EAAO,EAAM,IAAM,EAAuB,CAAK,EAEjD,OAAO,CACT,CAEA,SAAS,EAAe,EAA8C,CACpE,IAAM,EAAS,EAAU,EAAO,EAAG,CAAK,EACxC,OAAO,EAAO,QAAU,EAAO,OAAS,EAC1C,CAEA,SAAgB,EACd,EACA,EACgC,CAChC,OAAO,EAAO,IAAK,GAAwC,CACzD,IAAM,EAAQ,EAAO,EAAM,IAO3B,OANI,EAAM,OAAS,WACV,CAAE,QAAS,EAAM,GAAI,MAAO,IAAU,EAAK,EAEhD,EAAM,OAAS,cAAgB,EAAM,OAAS,eACzC,CAAE,QAAS,EAAM,GAAI,MAAO,MAAM,QAAQ,CAAK,EAAI,EAAQ,CAAC,CAAE,EAEhE,CACL,QAAS,EAAM,GACf,MAAO,EAAe,CAAK,CAC7B,CACF,CAAC,CACH,CAEA,SAAgB,EACd,EACA,EACA,CACA,IAAM,EAAiC,CAAC,EACxC,IAAK,IAAM,KAAS,EAAQ,CAC1B,GAAI,CAAC,EAAM,SACT,SAEF,IAAM,EAAU,GAAG,EAAM,MAAM,eACzB,EAAQ,EAAO,EAAM,IAC3B,GAAI,EAAM,OAAS,WAAY,CACzB,IAAU,KACZ,EAAO,EAAM,IAAM,GAErB,QACF,CACA,IAAM,EACJ,EAAM,OAAS,cAAgB,EAAM,OAAS,eAC1C,EAAU,EAAK,EAAM,EAAO,CAAC,EAAG,EAAU,EAAG,CAAO,CAAC,EAAG,GAAS,CAAC,CAAC,EACnE,EACE,EAAK,EAAO,EAAG,EAAK,EAAG,EAAS,CAAO,CAAC,EACxC,EAAe,CAAK,CACtB,EACD,EAAO,UACV,EAAO,EAAM,IAAM,EAAO,OAAO,EAAE,EAAE,SAAW,EAEpD,CACA,OAAO,CACT,CAEA,SAAgB,EAAa,CAC3B,kBACA,iBACA,SACA,SACA,WACA,WACA,UASC,CACD,OAAO,EAAO,IAAK,GACjB,EAAC,EAAD,CACmB,kBACjB,MAAO,EAAO,EAAM,IACJ,iBACT,QACG,WAEV,SAAW,GAAU,EAAS,CAAE,GAAG,GAAS,EAAM,IAAK,CAAM,CAAC,EAC9D,MAAO,EAAO,EAAM,GACrB,EAHM,EAAM,EAGZ,CACF,CACH,CAYA,SAAS,EAAY,EAAyB,CAC5C,GAAM,CAAE,QAAO,YAAa,EACtB,EAAY,GAAG,EAAS,UAAU,EAAM,KACxC,EAAU,GAAG,EAAU,QACvB,EAAe,CAAE,GAAG,EAAO,YAAW,SAAQ,EACpD,OAAQ,EAAM,KAAd,CACE,IAAK,WACH,OAAO,EAAC,EAAD,CAAoB,GAAI,EAAqB,OAAQ,CAAA,EAC9D,IAAK,OACL,IAAK,WACH,OAAO,EAAC,EAAD,CAAiB,GAAI,EAAqB,OAAQ,CAAA,EAC3D,IAAK,SACL,IAAK,eACH,OAAO,EAAC,EAAD,CAAmB,GAAI,EAAqB,OAAQ,CAAA,EAC7D,IAAK,QACL,IAAK,aACH,OAAO,EAAC,EAAD,CAAmB,GAAI,EAAqB,OAAQ,CAAA,EAC7D,QACE,OAAO,IACX,CACF,CAEA,SAAS,EAAmB,CAC1B,kBACA,YACA,QACA,iBACA,UACA,QACA,WACA,SAC0D,CAC1D,OACE,EAAC,QAAD,CAAO,UAAW,EAAiB,QAAS,EAA5C,SAAA,CACE,EAAC,QAAD,CACE,mBAAkB,EAAQ,EAAU,IAAA,GACpC,eAAc,EAAQ,OAAS,IAAA,GAC/B,QAAS,IAAU,GACnB,GAAI,EACJ,KAAM,UAAU,EAAM,KACtB,SAAW,GAAU,EAAS,EAAM,cAAc,OAAO,EACzD,SAAU,EAAM,SAChB,KAAK,UACN,CAAA,EACD,EAAC,OAAD,CAAA,SAAO,EAAM,KAAY,CAAA,EACzB,EAAC,EAAD,CAAY,UAAW,EAAuB,QAAO,GAAI,CAAU,CAAA,CAC9D,GAEX,CAOA,SAAS,EAAW,CAClB,YACA,QACA,MAKC,CACD,OAAO,EACL,EAAC,OAAD,CAAiB,YAAe,KAAI,KAAK,QACtC,SAAA,CACG,CAAA,EACJ,IACN,CAEA,SAAS,EAAgB,CACvB,YACA,QACA,iBACA,UACA,QACA,WACA,SAGC,CACD,IAAM,EAAc,CAClB,mBAAoB,EAAQ,EAAU,IAAA,GACtC,eAAgB,EAAS,OAAmB,IAAA,GAC5C,GAAI,EACJ,KAAM,UAAU,EAAM,KACtB,SACE,GACG,EAAS,EAAM,cAAc,KAAK,EACvC,SAAU,EAAM,SAChB,MAAO,EAAe,CAAK,CAC7B,EACA,OACE,EAAC,QAAD,CAAO,QAAS,EAAhB,SAAA,CACE,EAAC,OAAD,CAAA,SAAO,EAAM,KAAY,CAAA,EACxB,EAAM,OAAS,WACd,EAAC,WAAD,CAAU,GAAI,CAAc,CAAA,EAE5B,EAAC,QAAD,CAAO,GAAI,CAAc,CAAA,EAE3B,EAAC,EAAD,CAAY,UAAW,EAAuB,QAAO,GAAI,CAAU,CAAA,CAC9D,GAEX,CAEA,SAAS,EAAkB,CACzB,YACA,QACA,iBACA,UACA,QACA,WACA,SAGC,CACD,OACE,EAAC,QAAD,CAAO,QAAS,EAAhB,SAAA,CACE,EAAC,OAAD,CAAA,SAAO,EAAM,KAAY,CAAA,EACzB,EAAC,SAAD,CACE,mBAAkB,EAAQ,EAAU,IAAA,GACpC,eAAc,EAAQ,OAAS,IAAA,GAC/B,GAAI,EACJ,SAAU,EAAM,OAAS,eACzB,KAAM,UAAU,EAAM,KACtB,SAAW,GACT,EACE,EAAM,OAAS,eACX,CAAC,GAAG,EAAM,cAAc,eAAe,CAAC,CAAC,IACtC,GAAW,EAAO,KACrB,EACA,EAAM,cAAc,KAC1B,EAEF,SAAU,EAAM,SAChB,MACE,IAAU,IAAQ,IAAU,GACxB,GACC,IAAU,EAAM,OAAS,eAAiB,CAAC,EAAI,IAnBxD,SAAA,CAsBG,EAAM,OAAS,SAAW,EAAC,SAAD,CAAQ,MAAM,GAAG,SAAA,SAAe,CAAA,EAAI,KAC9D,EAAM,QAAQ,IAAK,GAClB,EAAC,SAAD,CAAwB,MAAO,EAAO,GACnC,SAAA,EAAO,KACF,EAFK,EAAO,EAEZ,CACT,CACK,IACR,EAAC,EAAD,CAAY,UAAW,EAAuB,QAAO,GAAI,CAAU,CAAA,CAC9D,GAEX,CAEA,SAAS,EAAkB,CACzB,kBACA,YACA,QACA,iBACA,UACA,QACA,WACA,SAGC,CACD,IAAM,EAAiB,MAAM,QAAQ,CAAK,EAAI,EAAQ,CAAC,EACvD,OACE,EAAC,WAAD,CACE,mBAAkB,EAAQ,EAAU,IAAA,GACpC,eAAc,EAAQ,OAAS,IAAA,GAFjC,SAAA,CAIE,EAAC,SAAD,CAAA,SAAS,EAAM,KAAc,CAAA,EAC5B,EAAM,QAAQ,KAAK,EAAQ,IAC1B,EAAC,QAAD,CAAO,UAAW,EAAlB,SAAA,CACE,EAAC,QAAD,CACE,QACE,MAAM,QAAQ,CAAK,EACf,EAAM,SAAS,EAAO,EAAE,EACxB,IAAU,EAAO,GAEvB,GAAI,GAAG,EAAU,GAAG,IACpB,KAAM,UAAU,EAAM,KACtB,SAAW,GAAU,CACnB,GAAI,EAAM,OAAS,QAAS,CAC1B,EAAS,EAAO,EAAE,EAClB,MACF,CACA,EACE,EAAM,cAAc,QAChB,CAAC,GAAG,EAAgB,EAAO,EAAE,EAC7B,EAAe,OAAQ,GAAO,IAAO,EAAO,EAAE,CACpD,CACF,EACA,SAAU,EAAM,UAAY,EAAM,OAAS,QAC3C,KAAM,EAAM,OAAS,QAAU,QAAU,WACzC,MAAO,EAAO,EACf,CAAA,EACD,EAAC,OAAD,CAAA,SAAO,EAAO,KAAY,CAAA,CACrB,CAzBiC,EAAA,EAAO,EAyBxC,CACR,EACD,EAAC,EAAD,CAAY,UAAW,EAAuB,QAAO,GAAI,CAAU,CAAA,CAC3D,GAEd,CCjVA,SAAgB,EAAa,CAC3B,aACA,QACA,eAAe,EACf,eAAe,IAMd,CACD,OACE,EAAC,MAAD,CAAK,UAAU,qCAAf,SAAA,CACE,EAAC,OAAD,CAAM,UAAU,qCAAqC,KAAK,SACvD,SAAA,CACG,CAAA,EACN,EAAC,MAAD,CAAK,cAAY,OAAO,UAAU,4BAAlC,SAAA,CACE,EAAC,MAAD,CAAK,UAAU,sCAAf,SAAA,CACE,EAAC,OAAD,CAAM,UAAU,mCAAqC,CAAA,EACrD,EAAC,OAAD,CAAM,UAAU,sCAAwC,CAAA,CACrD,IACL,EAAC,MAAD,CAAK,UAAU,oCACZ,SAAA,MAAM,KAAK,CAAE,OAAQ,CAAW,GAAI,EAAG,IACtC,EAAC,MAAD,CAAK,UAAU,mCAAf,SAAA,CACE,EAAC,OAAD,CAAM,UAAU,kCAAoC,CAAA,EACpD,EAAC,OAAD,CAAM,UAAU,kCAAoC,CAAA,CACjD,CAHkD,EAAA,CAGlD,CACN,CACE,CAAA,EACJ,MAAM,KAAK,CAAE,OAAQ,CAAa,GAAI,EAAG,IACxC,EAAC,MAAD,CAAK,UAAU,qCAAf,SAAA,CACE,EAAC,OAAD,CAAM,UAAU,0CAA4C,CAAA,EAC5D,EAAC,MAAD,CAAK,UAAU,6CAAf,SAAA,CACE,EAAC,OAAD,CAAM,UAAU,yCAA2C,CAAA,EAC3D,EAAC,MAAD,CAAK,UAAU,0CAAf,SAAA,CACE,EAAC,OAAD,CAAM,UAAU,yCAA2C,CAAA,EAC3D,EAAC,OAAD,CAAM,UAAU,yCAA2C,CAAA,CACxD,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAToD,EAAA,CASpD,CACN,EACD,EAAC,MAAD,CAAK,UAAU,qCAAf,SAAA,CACG,EACC,EAAC,OAAD,CAAM,UAAU,uCAAyC,CAAA,EACvD,KACJ,EAAC,OAAD,CAAM,UAAU,mCAAqC,CAAA,CAClD,GACF,CACF,CAAA,CAAA,GAET,CC5CA,MAAa,EAAkB,CAC7B,CACE,YAAa,KACb,MAAO,UACP,MAAO,IACT,EACA,CACE,YAAa,MACb,MAAO,WACP,MAAO,IACT,EACA,CACE,YAAa,OACb,MAAO,YACP,MAAO,IACT,EACA,CACE,YAAa,MACb,MAAO,WACP,MAAO,IACT,EACA,CACE,YAAa,KACb,MAAO,UACP,MAAO,IACT,EACA,CACE,YAAa,MACb,MAAO,WACP,MAAO,IACT,EACA,CACE,YAAa,MACb,MAAO,WACP,MAAO,IACT,EACA,CACE,YAAa,MACb,MAAO,WACP,MAAO,IACT,EACA,CACE,YAAa,OACb,MAAO,YACP,MAAO,IACT,EACA,CACE,YAAa,KACb,MAAO,UACP,MAAO,IACT,CACF,EAIA,SAAgB,EAAoB,EAAgC,CAClE,GACE,IAAe,iCACf,IAAe,gCAEf,OAAO,EAET,GACE,IAAe,gCACf,IAAe,+BAEf,OAAO,CAEX,CAEA,SAAS,EAAgB,EAAiB,CACxC,OACE,EAAgB,KAAM,GAAW,EAAO,QAAU,CAAO,GACzD,EAAgB,EAEpB,CAEA,SAAS,EAA0B,EAAe,EAAqB,CACrE,IAAM,EAAsB,GAAG,IAAc,IACzC,EAAkB,EACtB,KAAO,EAAgB,WAAW,CAAmB,GACnD,EAAkB,GAAG,IAAc,EAAgB,MAAM,EAAoB,MAAM,IAErF,OAAO,CACT,CAEA,SAAgB,EAAsB,EAAe,EAAiB,CACpE,IAAM,EAAkB,EAAe,CAAK,EAC5C,GAAI,CAAC,EACH,MAAO,GAGT,IAAM,EAAkB,EAAgB,CAAO,EACzC,EAA0B,EAC9B,EACA,EAAgB,WAClB,EAEA,OAAO,EAAwB,WAAW,GAAG,EACzC,EACA,GAAG,EAAgB,cAAc,GACvC"}