@coinlist-co/react 0.12.1-rc.6b77fc6 → 0.12.1-rc.9aec85a

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.
@@ -59,6 +59,7 @@ __export(client_exports, {
59
59
  OAUTH_STATE_KEY: () => OAUTH_STATE_KEY,
60
60
  OfferAssetCard: () => OfferAssetCard,
61
61
  OfferAssetCardUi: () => OfferAssetCardUi,
62
+ OfferLogoUi: () => OfferLogoUi,
62
63
  OfferSaleCard: () => OfferSaleCard,
63
64
  OfferSaleCardUi: () => OfferSaleCardUi,
64
65
  OffersAssetGrid: () => OffersAssetGrid,
@@ -120,6 +121,7 @@ __export(client_exports, {
120
121
  quoteOverAsks: () => quoteOverAsks,
121
122
  stablecoinIconUrl: () => stablecoinIconUrl,
122
123
  submitErc20Approval: () => submitErc20Approval,
124
+ tokenLogoSrcSet: () => tokenLogoSrcSet,
123
125
  tokenLogoUrl: () => tokenLogoUrl,
124
126
  tokenMetadataOf: () => tokenMetadataOf,
125
127
  useCheckoutOfferTokenMetadata: () => useCheckoutOfferTokenMetadata,
@@ -162,6 +164,7 @@ __export(client_exports, {
162
164
  useTaxDocument: () => useTaxDocument,
163
165
  useTaxDocumentModalViewModel: () => useTaxDocumentModalViewModel,
164
166
  useTokenMetadata: () => useTokenMetadata,
167
+ useTokenRegistry: () => useTokenRegistry,
165
168
  validateAmount: () => validateAmount,
166
169
  validateSellAmount: () => validateSellAmount,
167
170
  validateSuperstateAmount: () => validateSuperstateAmount
@@ -1317,8 +1320,15 @@ async function fetchAllPages(fetchPage, baseParams) {
1317
1320
  // src/universal/types/pagination.ts
1318
1321
  var Cursor = (value) => value;
1319
1322
  var PaginatedResponse = {
1320
- fromDto: (dto, itemMapper) => ({
1321
- data: dto.data.map(itemMapper),
1323
+ fromDto: (dto, itemMapper) => PaginatedResponse.fromDtoPage(dto, (items) => items.map(itemMapper)),
1324
+ /**
1325
+ * For a mapper that decides the page as a whole - one that drops items it
1326
+ * cannot map, such as `Offer.listFromDto` - rather than item by item. The
1327
+ * cursors are the wire's either way: dropping an item changes what the
1328
+ * page holds, not where the next page starts.
1329
+ */
1330
+ fromDtoPage: (dto, pageMapper) => ({
1331
+ data: pageMapper(dto.data),
1322
1332
  startingAfter: dto.starting_after ? Cursor(dto.starting_after) : null,
1323
1333
  startingBefore: dto.starting_before ? Cursor(dto.starting_before) : null
1324
1334
  })
@@ -1351,6 +1361,40 @@ var Asset = {
1351
1361
  })
1352
1362
  };
1353
1363
 
1364
+ // src/universal/core/shared/utils/wire.ts
1365
+ function unknownTypeError(dto, model) {
1366
+ const type = dto.type;
1367
+ throw new ValidationError(
1368
+ `${model}.type: unknown type ${JSON.stringify(type)}`
1369
+ );
1370
+ }
1371
+ function requiredString(value, field) {
1372
+ const text = notBlankStringOrNull(value);
1373
+ if (text === null) {
1374
+ throw new ValidationError(
1375
+ `${field}: expected a non-blank string, got ${typeof value === "string" ? "a blank string" : String(value)}`
1376
+ );
1377
+ }
1378
+ return text;
1379
+ }
1380
+ function requiredDate(value, field) {
1381
+ const date = typeof value === "string" ? new Date(value) : null;
1382
+ if (date === null || Number.isNaN(date.getTime())) {
1383
+ throw new ValidationError(
1384
+ `${field}: expected a date, got ${JSON.stringify(value)}`
1385
+ );
1386
+ }
1387
+ return date;
1388
+ }
1389
+ function requiredArray(value, field) {
1390
+ if (!Array.isArray(value)) {
1391
+ throw new ValidationError(
1392
+ `${field}: expected an array, got ${typeof value}`
1393
+ );
1394
+ }
1395
+ return value;
1396
+ }
1397
+
1354
1398
  // src/universal/types/blockchain/core.ts
1355
1399
  var ETHEREUM_CHAINS = {
1356
1400
  ethereum_mainnet: true,
@@ -1444,25 +1488,69 @@ var Bps = (value) => value;
1444
1488
  // src/universal/types/offer.ts
1445
1489
  var OfferId = (value) => value;
1446
1490
  var OfferSlug = (value) => value;
1491
+ var OFFER_TYPES = {
1492
+ "coinlist::token_sale": true,
1493
+ "superstate::swap": true,
1494
+ "ondo::swap": true
1495
+ };
1496
+ var isOfferType = (value) => Object.keys(OFFER_TYPES).includes(value);
1497
+ var OfferEditorial = {
1498
+ /**
1499
+ * `model` prefixes the field in the error (`'Offer'`, `'OfferDetail'`), so
1500
+ * the same three checks name the payload that failed them.
1501
+ */
1502
+ fromDto: (dto, model) => ({
1503
+ tagline: requiredString(dto.tagline, `${model}.tagline`),
1504
+ bannerUrl: requiredString(dto.banner_url, `${model}.banner_url`),
1505
+ startsAt: requiredDate(dto.starts_at, `${model}.starts_at`)
1506
+ })
1507
+ };
1447
1508
  var Offer = {
1448
1509
  fromDto: (dto) => {
1449
- if (!Array.isArray(dto.tokens)) {
1450
- throw new ValidationError(
1451
- `Offer.tokens: expected an array, got ${typeof dto.tokens}`
1452
- );
1453
- }
1454
- return {
1510
+ const tokens = requiredArray(dto.tokens, "Offer.tokens");
1511
+ const base2 = {
1455
1512
  id: OfferId(dto.id),
1456
1513
  slug: OfferSlug(dto.slug),
1457
- type: dto.type,
1458
- tagline: dto.tagline,
1459
- bannerUrl: dto.banner_url,
1460
- logoUrl: dto.logo_url,
1461
- startsAt: new Date(dto.starts_at),
1462
1514
  endsAt: dto.ends_at ? new Date(dto.ends_at) : null,
1463
- tokens: OfferToken.listFromDto(dto.tokens)
1515
+ tokens: OfferToken.listFromDto(tokens)
1464
1516
  };
1465
- }
1517
+ switch (dto.type) {
1518
+ case "coinlist::token_sale":
1519
+ return {
1520
+ ...base2,
1521
+ ...OfferEditorial.fromDto(dto, "Offer"),
1522
+ type: dto.type,
1523
+ logoUrl: requiredString(dto.logo_url, "Offer.logo_url")
1524
+ };
1525
+ case "superstate::swap":
1526
+ return {
1527
+ ...base2,
1528
+ ...OfferEditorial.fromDto(dto, "Offer"),
1529
+ type: dto.type,
1530
+ logoUrl: notBlankStringOrNull(dto.logo_url)
1531
+ };
1532
+ // `tagline`, `banner_url` and `starts_at` arrive as `null` and are left
1533
+ // on the wire: copying them would hand every consumer a `startsAt` that
1534
+ // is 1970 for one variant and a date for the others.
1535
+ case "ondo::swap":
1536
+ return {
1537
+ ...base2,
1538
+ type: dto.type,
1539
+ logoUrl: notBlankStringOrNull(dto.logo_url)
1540
+ };
1541
+ default:
1542
+ return unknownTypeError(dto, "Offer");
1543
+ }
1544
+ },
1545
+ /**
1546
+ * Maps a page of offers, dropping every offer whose `type` this SDK does not
1547
+ * name. The same reasoning as {@link OfferToken.listFromDto}: a plain `.map`
1548
+ * would throw out of `fromDto` and, through `PaginatedResponse.fromDto`,
1549
+ * reject the whole page, so one offer of an unknown type would blank the
1550
+ * grid for every offer beside it. A single offer fetched by id still
1551
+ * throws, because there is nothing beside it to keep.
1552
+ */
1553
+ listFromDto: (dtos) => dtos.filter((dto) => isOfferType(dto.type)).map(Offer.fromDto)
1466
1554
  };
1467
1555
  var OfferToken = {
1468
1556
  fromDto: (dto) => ({
@@ -1499,76 +1587,69 @@ var OfferSwapContract = {
1499
1587
  };
1500
1588
  var OfferDetail = {
1501
1589
  fromDto: (dto) => {
1502
- if (!Array.isArray(dto.funding_assets)) {
1503
- throw new ValidationError(
1504
- `OfferDetail.funding_assets: expected an array, got ${typeof dto.funding_assets}`
1505
- );
1506
- }
1507
- if (!Array.isArray(dto.options)) {
1508
- throw new ValidationError(
1509
- `OfferDetail.options: expected an array, got ${typeof dto.options}`
1510
- );
1511
- }
1512
- if (!Array.isArray(dto.terms)) {
1513
- throw new ValidationError(
1514
- `OfferDetail.terms: expected an array, got ${typeof dto.terms}`
1515
- );
1516
- }
1517
- if (!Array.isArray(dto.links)) {
1518
- throw new ValidationError(
1519
- `OfferDetail.links: expected an array, got ${typeof dto.links}`
1520
- );
1521
- }
1522
- if (!Array.isArray(dto.faqs)) {
1523
- throw new ValidationError(
1524
- `OfferDetail.faqs: expected an array, got ${typeof dto.faqs}`
1525
- );
1526
- }
1527
- if (!Array.isArray(dto.milestones)) {
1528
- throw new ValidationError(
1529
- `OfferDetail.milestones: expected an array, got ${typeof dto.milestones}`
1530
- );
1531
- }
1532
- if (!Array.isArray(dto.tokens)) {
1533
- throw new ValidationError(
1534
- `OfferDetail.tokens: expected an array, got ${typeof dto.tokens}`
1535
- );
1536
- }
1537
- const swapContracts = dto.swap_contracts === void 0 ? [] : dto.swap_contracts;
1538
- if (!Array.isArray(swapContracts)) {
1539
- throw new ValidationError(
1540
- `OfferDetail.swap_contracts: expected an array, got ${typeof swapContracts}`
1541
- );
1542
- }
1590
+ const fundingAssets = requiredArray(
1591
+ dto.funding_assets,
1592
+ "OfferDetail.funding_assets"
1593
+ );
1594
+ const options = requiredArray(dto.options, "OfferDetail.options");
1595
+ const terms = requiredArray(dto.terms, "OfferDetail.terms");
1596
+ const links = requiredArray(dto.links, "OfferDetail.links");
1597
+ const faqs = requiredArray(dto.faqs, "OfferDetail.faqs");
1598
+ const milestones = requiredArray(dto.milestones, "OfferDetail.milestones");
1599
+ const tokens = requiredArray(dto.tokens, "OfferDetail.tokens");
1543
1600
  const isin = notBlankStringOrNull(dto.isin);
1544
1601
  const ticker = notBlankStringOrNull(dto.ticker);
1545
- return {
1602
+ const base2 = {
1546
1603
  id: OfferId(dto.id),
1547
1604
  slug: OfferSlug(dto.slug),
1548
- type: dto.type,
1549
1605
  name: dto.name,
1550
1606
  asset: Asset.fromDto(dto.asset),
1551
- fundingAssets: dto.funding_assets.map(Asset.fromDto),
1552
- tokens: OfferToken.listFromDto(dto.tokens),
1553
- swapContracts: swapContracts.map(OfferSwapContract.fromDto),
1607
+ fundingAssets: fundingAssets.map(Asset.fromDto),
1608
+ tokens: OfferToken.listFromDto(tokens),
1554
1609
  about: notBlankStringOrNull(dto.about),
1555
- tagline: dto.tagline,
1556
- bannerUrl: dto.banner_url,
1557
- logoUrl: dto.logo_url,
1558
1610
  category: dto.category,
1559
1611
  issuer: notBlankStringOrNull(dto.issuer),
1560
1612
  isin: isin === null ? null : Isin(isin),
1561
1613
  ticker: ticker === null ? null : Ticker(ticker),
1562
1614
  instrumentType: notBlankStringOrNull(dto.instrument_type),
1563
1615
  listingVenue: notBlankStringOrNull(dto.listing_venue),
1564
- startsAt: new Date(dto.starts_at),
1565
1616
  endsAt: dto.ends_at ? new Date(dto.ends_at) : null,
1566
- faqs: dto.faqs.map(FaqItem.fromDto),
1567
- links: dto.links.map(Link.fromDto),
1568
- milestones: dto.milestones.map(Milestone.fromDto),
1569
- options: dto.options.map(OfferOption.fromDto),
1570
- terms: dto.terms.map(TermItem.fromDto)
1617
+ faqs: faqs.map(FaqItem.fromDto),
1618
+ links: links.map(Link.fromDto),
1619
+ milestones: milestones.map(Milestone.fromDto),
1620
+ options: options.map(OfferOption.fromDto),
1621
+ terms: terms.map(TermItem.fromDto)
1571
1622
  };
1623
+ switch (dto.type) {
1624
+ case "coinlist::token_sale":
1625
+ return {
1626
+ ...base2,
1627
+ ...OfferEditorial.fromDto(dto, "OfferDetail"),
1628
+ type: dto.type,
1629
+ logoUrl: requiredString(dto.logo_url, "OfferDetail.logo_url")
1630
+ };
1631
+ case "superstate::swap":
1632
+ return {
1633
+ ...base2,
1634
+ ...OfferEditorial.fromDto(dto, "OfferDetail"),
1635
+ type: dto.type,
1636
+ logoUrl: notBlankStringOrNull(dto.logo_url)
1637
+ };
1638
+ // `tagline`, `banner_url` and `starts_at` arrive as `null` and are left
1639
+ // on the wire, as in `Offer.fromDto`.
1640
+ case "ondo::swap":
1641
+ return {
1642
+ ...base2,
1643
+ type: dto.type,
1644
+ logoUrl: notBlankStringOrNull(dto.logo_url),
1645
+ swapContracts: requiredArray(
1646
+ dto.swap_contracts,
1647
+ "OfferDetail.swap_contracts"
1648
+ ).map(OfferSwapContract.fromDto)
1649
+ };
1650
+ default:
1651
+ return unknownTypeError(dto, "OfferDetail");
1652
+ }
1572
1653
  }
1573
1654
  };
1574
1655
  var OfferOption = {
@@ -1787,7 +1868,7 @@ var TOKEN_REGISTRY = {
1787
1868
 
1788
1869
  // src/universal/core/checkout/ondo/constants.ts
1789
1870
  var ONDO_POLL_INTERVAL_MS = 15e3;
1790
- var ONDO_QUOTE_EXPIRY_THRESHOLD_MS = 5e3;
1871
+ var ONDO_QUOTE_MAX_TTL_MS = 15e3;
1791
1872
  var DEFAULT_ONDO_AMOUNT_TO_COMPUTE_PRICE = DecimalString("1000");
1792
1873
  var ONDO_SETTLEMENT_ASSET = USDC_SYMBOL;
1793
1874
  var DEFAULT_ONDO_SELL_TOKENS_TO_COMPUTE_PRICE = 1;
@@ -1810,6 +1891,9 @@ function computeOndoSellPrice(transaction) {
1810
1891
  shares: spendInputAmount
1811
1892
  });
1812
1893
  }
1894
+ function ondoQuoteOfferDeadline(expiresAt, nowMs = Date.now()) {
1895
+ return new Date(Math.min(expiresAt.getTime(), nowMs + ONDO_QUOTE_MAX_TTL_MS));
1896
+ }
1813
1897
  function grossProceeds(expected) {
1814
1898
  const raw = expected.quantity.raw + expected.fee.raw;
1815
1899
  if (raw > MAX_UINT_256) {
@@ -2019,10 +2103,14 @@ function parseBlockchainAmount(amount, decimals) {
2019
2103
  if (/[eE]/.test(trimmed)) {
2020
2104
  return { valid: false, reason: { type: "invalid-format" } };
2021
2105
  }
2022
- if (!/^\d+(\.\d+)?$/.test(trimmed)) {
2106
+ if (trimmed === ".") {
2023
2107
  return { valid: false, reason: { type: "invalid-format" } };
2024
2108
  }
2025
- const [, fraction = ""] = trimmed.split(".");
2109
+ const normalised = trimmed.replace(/^\./, "0.").replace(/\.$/, "");
2110
+ if (!/^\d+(\.\d+)?$/.test(normalised)) {
2111
+ return { valid: false, reason: { type: "invalid-format" } };
2112
+ }
2113
+ const [, fraction = ""] = normalised.split(".");
2026
2114
  if (fraction.length > decimals) {
2027
2115
  return {
2028
2116
  valid: false,
@@ -2030,7 +2118,7 @@ function parseBlockchainAmount(amount, decimals) {
2030
2118
  };
2031
2119
  }
2032
2120
  try {
2033
- const raw = (0, import_viem4.parseUnits)(trimmed, decimals);
2121
+ const raw = (0, import_viem4.parseUnits)(normalised, decimals);
2034
2122
  if (raw > MAX_UINT_256) {
2035
2123
  return { valid: false, reason: { type: "overflow" } };
2036
2124
  }
@@ -3491,7 +3579,7 @@ async function fetchOffersPage(api, params, clientCreds) {
3491
3579
  Attributes.clientCredentials(clientCreds)
3492
3580
  )
3493
3581
  });
3494
- return PaginatedResponse.fromDto(pageDto, Offer.fromDto);
3582
+ return PaginatedResponse.fromDtoPage(pageDto, Offer.listFromDto);
3495
3583
  }
3496
3584
  async function fetchOfferDetails(api, id, clientCreds) {
3497
3585
  const dto = await api.send({
@@ -3753,6 +3841,52 @@ var Erc20NamespaceImpl = class {
3753
3841
  }
3754
3842
  };
3755
3843
 
3844
+ // src/universal/core/tokens/token-registry-snapshot.ts
3845
+ var TokenRegistrySnapshot = {
3846
+ /** Indexes a `tokens.list()` result. `[]` is a valid, empty snapshot. */
3847
+ fromTokens: (tokens) => ({
3848
+ tokens,
3849
+ byKey: new Map(
3850
+ tokens.map((token) => [registryKey(token.identifier), token])
3851
+ )
3852
+ }),
3853
+ /**
3854
+ * The registry's entry for one token, or `null` when it lists none. The
3855
+ * registry is curated, so `null` is an ordinary answer rather than an
3856
+ * error, and callers fall back to their own display defaults.
3857
+ */
3858
+ get: (snapshot, token) => snapshot.byKey.get(registryKey(token)) ?? null,
3859
+ /**
3860
+ * The registry's entry for the token an offer is *about*, or `null` when
3861
+ * it lists none of them.
3862
+ *
3863
+ * Resolution follows {@link offerDisplayTokens}: the token a sale
3864
+ * distributes or a swap hands over, never the funding token the user pays
3865
+ * with. An offer deployed on several chains carries one such token per
3866
+ * chain, and the first the registry knows wins - they are the same asset,
3867
+ * so any listed one answers for the offer.
3868
+ */
3869
+ forOffer: (snapshot, offer) => {
3870
+ for (const token of offerDisplayTokens(offer)) {
3871
+ const metadata = TokenRegistrySnapshot.get(snapshot, token);
3872
+ if (metadata !== null) {
3873
+ return metadata;
3874
+ }
3875
+ }
3876
+ return null;
3877
+ }
3878
+ };
3879
+ function offerDisplayTokens(offer) {
3880
+ const swaps = offer.tokens.filter((token) => token.role === "swap");
3881
+ const distributions = offer.tokens.filter(
3882
+ (token) => token.role === "distribution"
3883
+ );
3884
+ return [...swaps, ...distributions];
3885
+ }
3886
+ function registryKey(token) {
3887
+ return `${token.chain}:${token.address.toLowerCase()}`;
3888
+ }
3889
+
3756
3890
  // src/universal/api/nabu/tokens.ts
3757
3891
  var import_viem6 = require("viem");
3758
3892
 
@@ -4953,7 +5087,7 @@ var CoinListProvider = CoinListContextProvider;
4953
5087
  var import_react4 = require("react");
4954
5088
 
4955
5089
  // src/client/generated/sdk-styles.gen.ts
4956
- var sdkStyles = '/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--clcosdk-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--clcosdk-color-red-400:oklch(70.4% .191 22.216);--clcosdk-color-red-500:oklch(63.7% .237 25.331);--clcosdk-color-amber-500:oklch(76.9% .188 70.08);--clcosdk-color-gray-400:oklch(70.7% .022 261.325);--clcosdk-color-gray-500:oklch(55.1% .027 264.364);--clcosdk-color-black:#000;--clcosdk-spacing:.25rem;--clcosdk-container-sm:24rem;--clcosdk-container-md:28rem;--clcosdk-container-xl:36rem;--clcosdk-text-xs:.75rem;--clcosdk-text-xs--line-height:calc(1 / .75);--clcosdk-text-sm:.875rem;--clcosdk-text-sm--line-height:calc(1.25 / .875);--clcosdk-text-base:1rem;--clcosdk-text-base--line-height:calc(1.5 / 1);--clcosdk-text-lg:1.125rem;--clcosdk-text-lg--line-height:calc(1.75 / 1.125);--clcosdk-font-weight-normal:400;--clcosdk-font-weight-medium:500;--clcosdk-font-weight-semibold:600;--clcosdk-radius-md:.375rem;--clcosdk-radius-lg:.5rem;--clcosdk-radius-xl:.75rem;--clcosdk-radius-2xl:1rem;--clcosdk-ease-out:cubic-bezier(0, 0, .2, 1);--clcosdk-ease-in-out:cubic-bezier(.4, 0, .2, 1);--clcosdk-animate-spin:spin 1s linear infinite;--clcosdk-animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--clcosdk-color-brand-primary:var(--color-brand-primary)}}@layer base{.clco-sdk-root{--color-brand-primary:#171717;--color-brand-primary-hover:#000;--color-brand-primary-active:#262626;--color-accent:#2b3a67;--color-accent-hover:#243057;--color-accent-active:#1d2647;--color-accent-focus:#c7d2fe;--color-accent-subtle:#eef1f8;--color-text-primary:#171717;--color-text-secondary:#8c8c8c;--color-text-disabled:#d1d1d1;--color-text-inverse:#fff;--color-background:#fff;--color-surface:#fafafa;--color-section:#f3f3f3;--color-border:#e5e5e5;--color-divider:#ececec;--color-overlay:#00000080;--color-positive:#15803d;--color-positive-subtle:#dcfce7;--color-negative:#dc2626;--color-negative-subtle:#fee2e2;--color-success:#2c8c5e;--color-success-subtle:#e6f4ec;--color-success-border:#cfe9db;--color-warning:#e08a1a;--color-warning-subtle:#fff7ed;--color-warning-border:#fdead7;--color-error:#b42318;--color-error-subtle:#feeceb;--color-error-border:#fbd5d2;--shadow-step-active:0px 0px 10px 0px #0000001a;--shadow-dialog:0px 8px 32px 0px #0000001a;--btn-primary-gradient:linear-gradient(180deg, #262626 0%, #1c1c1c 50%, #0f0f0f 100%);--btn-primary-shadow:inset 0px -1px 3px 0px #00000059, inset 0px 1px 2px 0px #ffffff2e, inset 0px 1px 0px 0px #ffffff1a;--sale-card-surface:linear-gradient(to top, #0a0a0a 0%, #1a1a1a 100%);--color-sale-card-text:#f4f4f5;--color-sale-card-text-muted:#a1a1aa;--color-sale-card-text-strong:#fff;--color-sale-card-border:#ffffff40;--color-sale-card-chrome-border:#ffffff4d;--color-sale-card-chrome-bg:#ffffff26;--color-sale-card-chrome-emphasis-border:#fff6;--color-sale-card-chrome-emphasis-bg:#ffffff40;--color-sale-card-focus-ring:#ffffff80}@media (prefers-color-scheme:dark){.clco-sdk-root:not(:where(.light,.light *)){--color-brand-primary:#f4f4f5;--color-brand-primary-hover:#fff;--color-brand-primary-active:#e4e4e7;--color-accent:#6f82c9;--color-accent-hover:#8799e4;--color-accent-active:#5b6fcf;--color-accent-focus:#6f82c959;--color-accent-subtle:#6f82c91f;--color-text-primary:#f4f4f5;--color-text-secondary:#a1a1aa;--color-text-disabled:#71717a;--color-text-inverse:#171717;--color-background:#0f1115;--color-surface:#161a20;--color-section:#20242c;--color-border:#2a2e35;--color-divider:#323741;--color-overlay:#000000b3;--color-positive:#22c55e;--color-positive-subtle:#22c55e1f;--color-negative:#ef4444;--color-negative-subtle:#ef44441f;--color-success:#34d399;--color-success-subtle:#34d3991f;--color-success-border:#34d39940;--color-warning:#f59e0b;--color-warning-subtle:#f59e0b1f;--color-warning-border:#f59e0b40;--color-error:#f87171;--color-error-subtle:#f871711f;--color-error-border:#f8717140;--shadow-step-active:0px 0px 10px 0px #00000080;--shadow-dialog:0px 8px 32px 0px #0009;--btn-primary-gradient:linear-gradient(180deg, #fafafa 0%, #f0f0f0 50%, #e4e4e7 100%);--btn-primary-shadow:inset 0px -1px 3px 0px #0000001f, inset 0px 1px 2px 0px #fff9, inset 0px 1px 0px 0px #fff6}}:where(.dark,.dark *) .clco-sdk-root{--color-brand-primary:#f4f4f5;--color-brand-primary-hover:#fff;--color-brand-primary-active:#e4e4e7;--color-accent:#6f82c9;--color-accent-hover:#8799e4;--color-accent-active:#5b6fcf;--color-accent-focus:#6f82c959;--color-accent-subtle:#6f82c91f;--color-text-primary:#f4f4f5;--color-text-secondary:#a1a1aa;--color-text-disabled:#71717a;--color-text-inverse:#171717;--color-background:#0f1115;--color-surface:#161a20;--color-section:#20242c;--color-border:#2a2e35;--color-divider:#323741;--color-overlay:#000000b3;--color-positive:#22c55e;--color-positive-subtle:#22c55e1f;--color-negative:#ef4444;--color-negative-subtle:#ef44441f;--color-success:#34d399;--color-success-subtle:#34d3991f;--color-success-border:#34d39940;--color-warning:#f59e0b;--color-warning-subtle:#f59e0b1f;--color-warning-border:#f59e0b40;--color-error:#f87171;--color-error-subtle:#f871711f;--color-error-border:#f8717140;--shadow-step-active:0px 0px 10px 0px #00000080;--shadow-dialog:0px 8px 32px 0px #0009;--btn-primary-gradient:linear-gradient(180deg, #fafafa 0%, #f0f0f0 50%, #e4e4e7 100%);--btn-primary-shadow:inset 0px -1px 3px 0px #0000001f, inset 0px 1px 2px 0px #fff9, inset 0px 1px 0px 0px #fff6}.clco-sdk-root{color:var(--color-text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,sans-serif}.clco-sdk-root *,.clco-sdk-root :before,.clco-sdk-root :after{box-sizing:border-box}.clco-sdk-root button{appearance:none;cursor:pointer;font:inherit;color:inherit;background:0 0;border:none;padding:0}.clco-sdk-root input,.clco-sdk-root textarea,.clco-sdk-root select{font:inherit;color:inherit;background:0 0;border:none;border-radius:0;padding:0}.clco-sdk-root a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}.clco-sdk-root ul,.clco-sdk-root ol{margin:0;padding:0;list-style:none}.clco-sdk-root h1,.clco-sdk-root h2,.clco-sdk-root h3,.clco-sdk-root h4,.clco-sdk-root h5,.clco-sdk-root h6,.clco-sdk-root p,.clco-sdk-root figure,.clco-sdk-root blockquote,.clco-sdk-root dl,.clco-sdk-root dd,.clco-sdk-root pre{margin:0}.clco-sdk-root img,.clco-sdk-root svg{max-width:100%;display:block}@keyframes clco-status-ping{0%{opacity:.7;transform:scale(1)}75%,to{opacity:0;transform:scale(3.25)}}.clco-sdk-root .clcosdk-status-dot-ping{animation:1.6s cubic-bezier(0,0,.2,1) infinite clco-status-ping}@media (prefers-reduced-motion:reduce){.clco-sdk-root .clcosdk-status-dot-ping{opacity:0;animation:none}}}@layer components;@layer utilities{.clcosdk\\:pointer-events-none{pointer-events:none}.clcosdk\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.clcosdk\\:absolute{position:absolute}.clcosdk\\:fixed{position:fixed}.clcosdk\\:relative{position:relative}.clcosdk\\:inset-0{inset:0}.clcosdk\\:top-1\\/2{top:50%}.clcosdk\\:top-4{top:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:top-full{top:100%}.clcosdk\\:-right-0\\.5{right:calc(var(--clcosdk-spacing) * -.5)}.clcosdk\\:right-4{right:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:right-\\[-14\\%\\]{right:-14%}.clcosdk\\:-bottom-0\\.5{bottom:calc(var(--clcosdk-spacing) * -.5)}.clcosdk\\:bottom-full{bottom:100%}.clcosdk\\:left-1\\/2{left:50%}.clcosdk\\:z-0{z-index:0}.clcosdk\\:z-10{z-index:10}.clcosdk\\:z-50{z-index:50}.clcosdk\\:order-1{order:1}.clcosdk\\:order-2{order:2}.clcosdk\\:mt-2{margin-top:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:mt-4{margin-top:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:mt-auto{margin-top:auto}.clcosdk\\:mb-2{margin-bottom:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:flex{display:flex}.clcosdk\\:grid{display:grid}.clcosdk\\:inline-flex{display:inline-flex}.clcosdk\\:size-2{width:calc(var(--clcosdk-spacing) * 2);height:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:size-3{width:calc(var(--clcosdk-spacing) * 3);height:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:size-3\\.5{width:calc(var(--clcosdk-spacing) * 3.5);height:calc(var(--clcosdk-spacing) * 3.5)}.clcosdk\\:size-4{width:calc(var(--clcosdk-spacing) * 4);height:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:size-5{width:calc(var(--clcosdk-spacing) * 5);height:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:size-10{width:calc(var(--clcosdk-spacing) * 10);height:calc(var(--clcosdk-spacing) * 10)}.clcosdk\\:size-16{width:calc(var(--clcosdk-spacing) * 16);height:calc(var(--clcosdk-spacing) * 16)}.clcosdk\\:size-24{width:calc(var(--clcosdk-spacing) * 24);height:calc(var(--clcosdk-spacing) * 24)}.clcosdk\\:size-\\[15rem\\]{width:15rem;height:15rem}.clcosdk\\:size-full{width:100%;height:100%}.clcosdk\\:h-1{height:var(--clcosdk-spacing)}.clcosdk\\:h-3{height:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:h-4{height:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:h-5{height:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:h-6{height:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:h-8{height:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:h-9{height:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:h-10{height:calc(var(--clcosdk-spacing) * 10)}.clcosdk\\:h-11{height:calc(var(--clcosdk-spacing) * 11)}.clcosdk\\:h-12{height:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:h-14{height:calc(var(--clcosdk-spacing) * 14)}.clcosdk\\:h-\\[18px\\]{height:18px}.clcosdk\\:h-\\[54px\\]{height:54px}.clcosdk\\:h-\\[71px\\]{height:71px}.clcosdk\\:h-auto{height:auto}.clcosdk\\:h-full{height:100%}.clcosdk\\:h-px{height:1px}.clcosdk\\:max-h-\\[92vh\\]{max-height:92vh}.clcosdk\\:max-h-full{max-height:100%}.clcosdk\\:min-h-0{min-height:0}.clcosdk\\:min-h-9{min-height:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:min-h-40{min-height:calc(var(--clcosdk-spacing) * 40)}.clcosdk\\:min-h-screen{min-height:100vh}.clcosdk\\:w-1{width:var(--clcosdk-spacing)}.clcosdk\\:w-4{width:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:w-5{width:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:w-6{width:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:w-8{width:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:w-10{width:calc(var(--clcosdk-spacing) * 10)}.clcosdk\\:w-12{width:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:w-16{width:calc(var(--clcosdk-spacing) * 16)}.clcosdk\\:w-20{width:calc(var(--clcosdk-spacing) * 20)}.clcosdk\\:w-24{width:calc(var(--clcosdk-spacing) * 24)}.clcosdk\\:w-28{width:calc(var(--clcosdk-spacing) * 28)}.clcosdk\\:w-32{width:calc(var(--clcosdk-spacing) * 32)}.clcosdk\\:w-40{width:calc(var(--clcosdk-spacing) * 40)}.clcosdk\\:w-48{width:calc(var(--clcosdk-spacing) * 48)}.clcosdk\\:w-80{width:calc(var(--clcosdk-spacing) * 80)}.clcosdk\\:w-96{width:calc(var(--clcosdk-spacing) * 96)}.clcosdk\\:w-\\[16px\\]{width:16px}.clcosdk\\:w-\\[28rem\\]{width:28rem}.clcosdk\\:w-\\[448px\\]{width:448px}.clcosdk\\:w-auto{width:auto}.clcosdk\\:w-component{width:448px}.clcosdk\\:w-fit{width:fit-content}.clcosdk\\:w-full{width:100%}.clcosdk\\:w-max{width:max-content}.clcosdk\\:max-w-\\[16rem\\]{max-width:16rem}.clcosdk\\:max-w-\\[28rem\\]{max-width:28rem}.clcosdk\\:max-w-\\[30rem\\]{max-width:30rem}.clcosdk\\:max-w-\\[40rem\\]{max-width:40rem}.clcosdk\\:max-w-\\[56rem\\]{max-width:56rem}.clcosdk\\:max-w-\\[64rem\\]{max-width:64rem}.clcosdk\\:max-w-\\[760px\\]{max-width:760px}.clcosdk\\:max-w-full{max-width:100%}.clcosdk\\:max-w-md{max-width:var(--clcosdk-container-md)}.clcosdk\\:max-w-sm{max-width:var(--clcosdk-container-sm)}.clcosdk\\:max-w-xl{max-width:var(--clcosdk-container-xl)}.clcosdk\\:min-w-0{min-width:0}.clcosdk\\:flex-1{flex:1}.clcosdk\\:shrink-0{flex-shrink:0}.clcosdk\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.clcosdk\\:-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.clcosdk\\:rotate-90{rotate:90deg}.clcosdk\\:rotate-180{rotate:180deg}.clcosdk\\:animate-pulse{animation:var(--clcosdk-animate-pulse)}.clcosdk\\:animate-spin{animation:var(--clcosdk-animate-spin)}.clcosdk\\:cursor-pointer{cursor:pointer}.clcosdk\\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.clcosdk\\:grid-rows-\\[0fr\\]{grid-template-rows:0fr}.clcosdk\\:grid-rows-\\[1fr\\]{grid-template-rows:1fr}.clcosdk\\:flex-col{flex-direction:column}.clcosdk\\:flex-wrap{flex-wrap:wrap}.clcosdk\\:items-center{align-items:center}.clcosdk\\:items-end{align-items:flex-end}.clcosdk\\:items-start{align-items:flex-start}.clcosdk\\:justify-between{justify-content:space-between}.clcosdk\\:justify-center{justify-content:center}.clcosdk\\:justify-end{justify-content:flex-end}.clcosdk\\:gap-1{gap:var(--clcosdk-spacing)}.clcosdk\\:gap-1\\.5{gap:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:gap-2{gap:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:gap-2\\.5{gap:calc(var(--clcosdk-spacing) * 2.5)}.clcosdk\\:gap-3{gap:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:gap-4{gap:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:gap-6{gap:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:gap-\\[5px\\]{gap:5px}:where(.clcosdk\\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--clcosdk-spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--clcosdk-spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.clcosdk\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--clcosdk-spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--clcosdk-spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.clcosdk\\:divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.clcosdk\\:divide-border>:not(:last-child)){border-color:var(--color-border)}:where(.clcosdk\\:divide-divider>:not(:last-child)){border-color:var(--color-divider)}.clcosdk\\:self-start{align-self:flex-start}.clcosdk\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.clcosdk\\:overflow-hidden{overflow:hidden}.clcosdk\\:overflow-y-auto{overflow-y:auto}.clcosdk\\:rounded{border-radius:.25rem}.clcosdk\\:rounded-2xl{border-radius:var(--clcosdk-radius-2xl)}.clcosdk\\:rounded-\\[20px\\]{border-radius:20px}.clcosdk\\:rounded-\\[28px\\]{border-radius:28px}.clcosdk\\:rounded-btn{border-radius:12px}.clcosdk\\:rounded-card{border-radius:24px}.clcosdk\\:rounded-full{border-radius:3.40282e38px}.clcosdk\\:rounded-lg{border-radius:var(--clcosdk-radius-lg)}.clcosdk\\:rounded-md{border-radius:var(--clcosdk-radius-md)}.clcosdk\\:rounded-xl{border-radius:var(--clcosdk-radius-xl)}.clcosdk\\:border{border-style:var(--tw-border-style);border-width:1px}.clcosdk\\:border-2{border-style:var(--tw-border-style);border-width:2px}.clcosdk\\:border-\\[1\\.5px\\]{border-style:var(--tw-border-style);border-width:1.5px}.clcosdk\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.clcosdk\\:border-accent\\/60{border-color:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.clcosdk\\:border-accent\\/60{border-color:color-mix(in oklab, var(--color-accent) 60%, transparent)}}.clcosdk\\:border-amber-500{border-color:var(--clcosdk-color-amber-500)}.clcosdk\\:border-background{border-color:var(--color-background)}.clcosdk\\:border-border{border-color:var(--color-border)}.clcosdk\\:border-brand-primary{border-color:var(--color-brand-primary)}.clcosdk\\:border-current{border-color:currentColor}.clcosdk\\:border-divider{border-color:var(--color-divider)}.clcosdk\\:border-error-border{border-color:var(--color-error-border)}.clcosdk\\:border-sale-card-border{border-color:var(--color-sale-card-border)}.clcosdk\\:border-sale-card-chrome-border{border-color:var(--color-sale-card-chrome-border)}.clcosdk\\:border-success-border{border-color:var(--color-success-border)}.clcosdk\\:border-warning-border{border-color:var(--color-warning-border)}.clcosdk\\:border-t-transparent{border-top-color:#0000}.clcosdk\\:bg-background{background-color:var(--color-background)}.clcosdk\\:bg-black\\/50{background-color:var(--clcosdk-color-black)}@supports (color:color-mix(in lab, red, red)){.clcosdk\\:bg-black\\/50{background-color:color-mix(in oklab, var(--clcosdk-color-black) 50%, transparent)}}.clcosdk\\:bg-brand-primary{background-color:var(--color-brand-primary)}.clcosdk\\:bg-divider{background-color:var(--color-divider)}.clcosdk\\:bg-error-subtle{background-color:var(--color-error-subtle)}.clcosdk\\:bg-overlay{background-color:var(--color-overlay)}.clcosdk\\:bg-positive{background-color:var(--color-positive)}.clcosdk\\:bg-positive-subtle{background-color:var(--color-positive-subtle)}.clcosdk\\:bg-sale-card-chrome-bg{background-color:var(--color-sale-card-chrome-bg)}.clcosdk\\:bg-section{background-color:var(--color-section)}.clcosdk\\:bg-success-subtle{background-color:var(--color-success-subtle)}.clcosdk\\:bg-surface{background-color:var(--color-surface)}.clcosdk\\:bg-text-disabled{background-color:var(--color-text-disabled)}.clcosdk\\:bg-text-primary{background-color:var(--color-text-primary)}.clcosdk\\:bg-transparent{background-color:#0000}.clcosdk\\:bg-warning-subtle{background-color:var(--color-warning-subtle)}.clcosdk\\:bg-\\[image\\:var\\(--btn-primary-gradient\\)\\]{background-image:var(--btn-primary-gradient)}.clcosdk\\:bg-\\[image\\:var\\(--sale-card-surface\\)\\]{background-image:var(--sale-card-surface)}.clcosdk\\:object-contain{object-fit:contain}.clcosdk\\:object-cover{object-fit:cover}.clcosdk\\:p-0{padding:0}.clcosdk\\:p-1\\.5{padding:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:p-3{padding:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:p-3\\.5{padding:calc(var(--clcosdk-spacing) * 3.5)}.clcosdk\\:p-4{padding:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:p-5{padding:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:p-6{padding:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:p-8{padding:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:p-16{padding:calc(var(--clcosdk-spacing) * 16)}.clcosdk\\:px-2{padding-inline:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:px-3{padding-inline:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:px-4{padding-inline:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:px-5{padding-inline:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:px-6{padding-inline:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:py-1\\.5{padding-block:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:py-2{padding-block:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:py-3{padding-block:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:py-8{padding-block:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:py-12{padding-block:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:pt-1{padding-top:var(--clcosdk-spacing)}.clcosdk\\:pt-4{padding-top:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:pt-14{padding-top:calc(var(--clcosdk-spacing) * 14)}.clcosdk\\:pr-1\\.5{padding-right:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:pr-3{padding-right:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:pr-4{padding-right:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:pb-4{padding-bottom:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:pl-3{padding-left:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:text-center{text-align:center}.clcosdk\\:text-left{text-align:left}.clcosdk\\:text-right{text-align:right}.clcosdk\\:font-mono{font-family:var(--clcosdk-font-mono)}.clcosdk\\:text-base{font-size:var(--clcosdk-text-base);line-height:var(--tw-leading,var(--clcosdk-text-base--line-height))}.clcosdk\\:text-lg{font-size:var(--clcosdk-text-lg);line-height:var(--tw-leading,var(--clcosdk-text-lg--line-height))}.clcosdk\\:text-sm{font-size:var(--clcosdk-text-sm);line-height:var(--tw-leading,var(--clcosdk-text-sm--line-height))}.clcosdk\\:text-xs{font-size:var(--clcosdk-text-xs);line-height:var(--tw-leading,var(--clcosdk-text-xs--line-height))}.clcosdk\\:text-\\[11px\\]{font-size:11px}.clcosdk\\:text-\\[12px\\]{font-size:12px}.clcosdk\\:text-\\[13px\\]{font-size:13px}.clcosdk\\:text-\\[14px\\]{font-size:14px}.clcosdk\\:text-\\[15px\\]{font-size:15px}.clcosdk\\:text-\\[16px\\]{font-size:16px}.clcosdk\\:text-\\[18px\\]{font-size:18px}.clcosdk\\:text-\\[22px\\]{font-size:22px}.clcosdk\\:text-\\[28px\\]{font-size:28px}.clcosdk\\:text-\\[36px\\]{font-size:36px}.clcosdk\\:text-\\[48px\\]{font-size:48px}.clcosdk\\:text-\\[64px\\]{font-size:64px}.clcosdk\\:leading-\\[105\\%\\]{--tw-leading:105%;line-height:105%}.clcosdk\\:leading-\\[108\\%\\]{--tw-leading:108%;line-height:108%}.clcosdk\\:leading-\\[110\\%\\]{--tw-leading:110%;line-height:110%}.clcosdk\\:leading-\\[120\\%\\]{--tw-leading:120%;line-height:120%}.clcosdk\\:leading-\\[130\\%\\]{--tw-leading:130%;line-height:130%}.clcosdk\\:leading-\\[140\\%\\]{--tw-leading:140%;line-height:140%}.clcosdk\\:leading-\\[150\\%\\]{--tw-leading:150%;line-height:150%}.clcosdk\\:leading-\\[160\\%\\]{--tw-leading:160%;line-height:160%}.clcosdk\\:font-medium{--tw-font-weight:var(--clcosdk-font-weight-medium);font-weight:var(--clcosdk-font-weight-medium)}.clcosdk\\:font-normal{--tw-font-weight:var(--clcosdk-font-weight-normal);font-weight:var(--clcosdk-font-weight-normal)}.clcosdk\\:font-semibold{--tw-font-weight:var(--clcosdk-font-weight-semibold);font-weight:var(--clcosdk-font-weight-semibold)}.clcosdk\\:tracking-\\[0\\.12px\\]{--tw-tracking:.12px;letter-spacing:.12px}.clcosdk\\:tracking-\\[0\\.28px\\]{--tw-tracking:.28px;letter-spacing:.28px}.clcosdk\\:break-words{overflow-wrap:break-word}.clcosdk\\:whitespace-nowrap{white-space:nowrap}.clcosdk\\:text-background{color:var(--color-background)}.clcosdk\\:text-brand-primary{color:var(--color-brand-primary)}.clcosdk\\:text-error{color:var(--color-error)}.clcosdk\\:text-positive{color:var(--color-positive)}.clcosdk\\:text-sale-card-text{color:var(--color-sale-card-text)}.clcosdk\\:text-sale-card-text-muted{color:var(--color-sale-card-text-muted)}.clcosdk\\:text-sale-card-text-strong{color:var(--color-sale-card-text-strong)}.clcosdk\\:text-success{color:var(--color-success)}.clcosdk\\:text-text-disabled{color:var(--color-text-disabled)}.clcosdk\\:text-text-inverse{color:var(--color-text-inverse)}.clcosdk\\:text-text-primary{color:var(--color-text-primary)}.clcosdk\\:text-text-secondary{color:var(--color-text-secondary)}.clcosdk\\:text-warning{color:var(--color-warning)}.clcosdk\\:capitalize{text-transform:capitalize}.clcosdk\\:lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.clcosdk\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.clcosdk\\:no-underline{text-decoration-line:none}.clcosdk\\:underline{text-decoration-line:underline}.clcosdk\\:underline-offset-2{text-underline-offset:2px}.clcosdk\\:underline-offset-4{text-underline-offset:4px}.clcosdk\\:opacity-0{opacity:0}.clcosdk\\:opacity-60{opacity:.6}.clcosdk\\:shadow-\\[0_0_0_3px_rgba\\(59\\,130\\,246\\,0\\.2\\)\\]{--tw-shadow:0 0 0 3px var(--tw-shadow-color,#3b82f633);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-\\[0px_1px_1px_0px_rgba\\(10\\,10\\,10\\,0\\.04\\)\\,0px_8px_12px_0px_rgba\\(10\\,10\\,10\\,0\\.08\\)\\]{--tw-shadow:0px 1px 1px 0px var(--tw-shadow-color,#0a0a0a0a), 0px 8px 12px 0px var(--tw-shadow-color,#0a0a0a14);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-\\[0px_4px_12px_0px_rgba\\(0\\,0\\,0\\,0\\.08\\)\\,0px_12px_28px_0px_rgba\\(0\\,0\\,0\\,0\\.13\\)\\]{--tw-shadow:0px 4px 12px 0px var(--tw-shadow-color,#00000014), 0px 12px 28px 0px var(--tw-shadow-color,#00000021);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-\\[var\\(--btn-primary-shadow\\)\\]{--tw-shadow:var(--btn-primary-shadow);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-card{--tw-shadow:0px 4px 6px -2px var(--tw-shadow-color,#0000000d), 0px 12px 24px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-dialog{--tw-shadow:var(--shadow-dialog);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-step-active{--tw-shadow:var(--shadow-step-active);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:transition-\\[background-color\\,border-color\\]{transition-property:background-color,border-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-\\[grid-template-rows\\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.clcosdk\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.clcosdk\\:duration-500{--tw-duration:.5s;transition-duration:.5s}.clcosdk\\:ease-in-out{--tw-ease:var(--clcosdk-ease-in-out);transition-timing-function:var(--clcosdk-ease-in-out)}.clcosdk\\:ease-out{--tw-ease:var(--clcosdk-ease-out);transition-timing-function:var(--clcosdk-ease-out)}.clcosdk\\:outline-none{--tw-outline-style:none;outline-style:none}.clcosdk\\:group-focus-within\\:opacity-100:is(:where(.clcosdk\\:group):focus-within *){opacity:1}@media (hover:hover){.clcosdk\\:group-hover\\:border-sale-card-chrome-emphasis-border:is(:where(.clcosdk\\:group):hover *){border-color:var(--color-sale-card-chrome-emphasis-border)}.clcosdk\\:group-hover\\:bg-sale-card-chrome-emphasis-bg:is(:where(.clcosdk\\:group):hover *){background-color:var(--color-sale-card-chrome-emphasis-bg)}.clcosdk\\:group-hover\\:opacity-100:is(:where(.clcosdk\\:group):hover *){opacity:1}}.clcosdk\\:group-focus-visible\\:border-sale-card-chrome-emphasis-border:is(:where(.clcosdk\\:group):focus-visible *){border-color:var(--color-sale-card-chrome-emphasis-border)}.clcosdk\\:group-focus-visible\\:bg-sale-card-chrome-emphasis-bg:is(:where(.clcosdk\\:group):focus-visible *){background-color:var(--color-sale-card-chrome-emphasis-bg)}.clcosdk\\:placeholder\\:text-text-disabled::placeholder{color:var(--color-text-disabled)}@media (hover:hover){.clcosdk\\:hover\\:scale-\\[1\\.02\\]:hover{scale:1.02}.clcosdk\\:hover\\:border-text-disabled:hover{border-color:var(--color-text-disabled)}.clcosdk\\:hover\\:bg-\\[\\#fcdcd8\\]:hover{background-color:#fcdcd8}.clcosdk\\:hover\\:bg-border:hover{background-color:var(--color-border)}.clcosdk\\:hover\\:bg-brand-primary:hover{background-color:var(--color-brand-primary)}.clcosdk\\:hover\\:bg-brand-primary-hover:hover{background-color:var(--color-brand-primary-hover)}.clcosdk\\:hover\\:bg-section:hover{background-color:var(--color-section)}.clcosdk\\:hover\\:bg-surface:hover{background-color:var(--color-surface)}.clcosdk\\:hover\\:text-\\[\\#8b1a13\\]:hover{color:#8b1a13}.clcosdk\\:hover\\:text-text-primary:hover{color:var(--color-text-primary)}.clcosdk\\:hover\\:underline:hover{text-decoration-line:underline}.clcosdk\\:hover\\:opacity-80:hover{opacity:.8}.clcosdk\\:hover\\:opacity-90:hover{opacity:.9}}.clcosdk\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:focus-visible\\:ring-gray-400:focus-visible{--tw-ring-color:var(--clcosdk-color-gray-400)}.clcosdk\\:focus-visible\\:ring-gray-500:focus-visible{--tw-ring-color:var(--clcosdk-color-gray-500)}.clcosdk\\:focus-visible\\:ring-red-400:focus-visible{--tw-ring-color:var(--clcosdk-color-red-400)}.clcosdk\\:focus-visible\\:ring-red-500:focus-visible{--tw-ring-color:var(--clcosdk-color-red-500)}.clcosdk\\:focus-visible\\:ring-sale-card-focus-ring:focus-visible{--tw-ring-color:var(--color-sale-card-focus-ring)}.clcosdk\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.clcosdk\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.clcosdk\\:active\\:bg-\\[\\#d9d9d9\\]:active{background-color:#d9d9d9}.clcosdk\\:active\\:bg-\\[\\#f9c9c4\\]:active{background-color:#f9c9c4}.clcosdk\\:active\\:bg-border:active{background-color:var(--color-border)}.clcosdk\\:active\\:bg-brand-primary-active:active{background-color:var(--color-brand-primary-active)}.clcosdk\\:active\\:text-\\[\\#6d1510\\]:active{color:#6d1510}.clcosdk\\:active\\:opacity-80:active{opacity:.8}.clcosdk\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.clcosdk\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.clcosdk\\:disabled\\:opacity-40:disabled{opacity:.4}.clcosdk\\:disabled\\:opacity-50:disabled{opacity:.5}.clcosdk\\:aria-disabled\\:cursor-not-allowed[aria-disabled=true]{cursor:not-allowed}.clcosdk\\:aria-disabled\\:opacity-50[aria-disabled=true]{opacity:.5}@media not all and (min-width:48rem){.clcosdk\\:max-md\\:hidden{display:none}.clcosdk\\:max-md\\:w-full{width:100%}.clcosdk\\:max-md\\:justify-start{justify-content:flex-start}.clcosdk\\:max-md\\:gap-4{gap:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:max-md\\:rounded-none{border-radius:0}.clcosdk\\:max-md\\:border-0{border-style:var(--tw-border-style);border-width:0}.clcosdk\\:max-md\\:bg-transparent{background-color:#0000}.clcosdk\\:max-md\\:p-0{padding:0}@media (hover:hover){.clcosdk\\:max-md\\:hover\\:scale-100:hover{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}}}@media (min-width:40rem){.clcosdk\\:sm\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:48rem){.clcosdk\\:md\\:right-\\[-10\\%\\]{right:-10%}.clcosdk\\:md\\:order-1{order:1}.clcosdk\\:md\\:order-2{order:2}.clcosdk\\:md\\:hidden{display:none}.clcosdk\\:md\\:size-\\[20rem\\]{width:20rem;height:20rem}.clcosdk\\:md\\:h-9{height:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:md\\:h-12{height:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:md\\:h-\\[54px\\]{height:54px}.clcosdk\\:md\\:w-9{width:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:md\\:w-12{width:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.clcosdk\\:md\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.clcosdk\\:md\\:grid-cols-\\[minmax\\(0\\,11fr\\)_minmax\\(0\\,8fr\\)\\]{grid-template-columns:minmax(0,11fr) minmax(0,8fr)}.clcosdk\\:md\\:flex-row{flex-direction:row}.clcosdk\\:md\\:items-center{align-items:center}.clcosdk\\:md\\:items-end{align-items:flex-end}.clcosdk\\:md\\:justify-between{justify-content:space-between}.clcosdk\\:md\\:justify-end{justify-content:flex-end}.clcosdk\\:md\\:gap-3{gap:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:md\\:gap-6{gap:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:md\\:gap-x-12{column-gap:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:md\\:self-end{align-self:flex-end}.clcosdk\\:md\\:rounded-\\[40px\\]{border-radius:40px}.clcosdk\\:md\\:rounded-card{border-radius:24px}.clcosdk\\:md\\:rounded-dialog{border-radius:32px}.clcosdk\\:md\\:p-4{padding:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:md\\:p-6{padding:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:md\\:p-8{padding:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:md\\:px-6{padding-inline:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:md\\:px-8{padding-inline:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:md\\:py-2{padding-block:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:md\\:pr-2{padding-right:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:md\\:pr-4{padding-right:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:md\\:pl-4{padding-left:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:md\\:text-base{font-size:var(--clcosdk-text-base);line-height:var(--tw-leading,var(--clcosdk-text-base--line-height))}.clcosdk\\:md\\:text-\\[14px\\]{font-size:14px}.clcosdk\\:md\\:text-\\[16px\\]{font-size:16px}.clcosdk\\:md\\:text-\\[18px\\]{font-size:18px}.clcosdk\\:md\\:text-\\[28px\\]{font-size:28px}.clcosdk\\:md\\:leading-\\[120\\%\\]{--tw-leading:120%;line-height:120%}.clcosdk\\:md\\:leading-\\[160\\%\\]{--tw-leading:160%;line-height:160%}}@media (prefers-color-scheme:dark){@media (hover:hover){.clcosdk\\:dark\\:hover\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.20\\)\\]:not(:where(.light,.light *)):hover{background-color:#f8717133}}}@media (hover:hover){.clcosdk\\:dark\\:hover\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.20\\)\\]:where(.dark,.dark *):hover{background-color:#f8717133}}@media (prefers-color-scheme:dark){@media (hover:hover){.clcosdk\\:dark\\:hover\\:text-\\[\\#fca5a5\\]:not(:where(.light,.light *)):hover{color:#fca5a5}}}@media (hover:hover){.clcosdk\\:dark\\:hover\\:text-\\[\\#fca5a5\\]:where(.dark,.dark *):hover{color:#fca5a5}}@media (prefers-color-scheme:dark){.clcosdk\\:dark\\:active\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.30\\)\\]:not(:where(.light,.light *)):active{background-color:#f871714d}}.clcosdk\\:dark\\:active\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.30\\)\\]:where(.dark,.dark *):active{background-color:#f871714d}@media (prefers-color-scheme:dark){.clcosdk\\:dark\\:active\\:bg-divider:not(:where(.light,.light *)):active{background-color:var(--color-divider)}}.clcosdk\\:dark\\:active\\:bg-divider:where(.dark,.dark *):active{background-color:var(--color-divider)}@media (prefers-color-scheme:dark){.clcosdk\\:dark\\:active\\:text-\\[\\#f87171\\]:not(:where(.light,.light *)):active{color:#f87171}}.clcosdk\\:dark\\:active\\:text-\\[\\#f87171\\]:where(.dark,.dark *):active{color:#f87171}.clcosdk\\:\\[\\&_circle\\]\\:fill-error-subtle circle{fill:var(--color-error-subtle)}.clcosdk\\:\\[\\&_circle\\]\\:fill-success-subtle circle{fill:var(--color-success-subtle)}.clcosdk\\:\\[\\&_circle\\]\\:fill-warning-subtle circle{fill:var(--color-warning-subtle)}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}';
5090
+ var sdkStyles = '/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--clcosdk-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--clcosdk-color-red-400:oklch(70.4% .191 22.216);--clcosdk-color-red-500:oklch(63.7% .237 25.331);--clcosdk-color-amber-500:oklch(76.9% .188 70.08);--clcosdk-color-gray-400:oklch(70.7% .022 261.325);--clcosdk-color-gray-500:oklch(55.1% .027 264.364);--clcosdk-color-black:#000;--clcosdk-spacing:.25rem;--clcosdk-container-sm:24rem;--clcosdk-container-md:28rem;--clcosdk-container-xl:36rem;--clcosdk-text-xs:.75rem;--clcosdk-text-xs--line-height:calc(1 / .75);--clcosdk-text-sm:.875rem;--clcosdk-text-sm--line-height:calc(1.25 / .875);--clcosdk-text-base:1rem;--clcosdk-text-base--line-height:calc(1.5 / 1);--clcosdk-text-lg:1.125rem;--clcosdk-text-lg--line-height:calc(1.75 / 1.125);--clcosdk-font-weight-normal:400;--clcosdk-font-weight-medium:500;--clcosdk-font-weight-semibold:600;--clcosdk-radius-md:.375rem;--clcosdk-radius-lg:.5rem;--clcosdk-radius-xl:.75rem;--clcosdk-radius-2xl:1rem;--clcosdk-ease-out:cubic-bezier(0, 0, .2, 1);--clcosdk-ease-in-out:cubic-bezier(.4, 0, .2, 1);--clcosdk-animate-spin:spin 1s linear infinite;--clcosdk-animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--clcosdk-color-brand-primary:var(--color-brand-primary)}}@layer base{.clco-sdk-root{--color-brand-primary:#171717;--color-brand-primary-hover:#000;--color-brand-primary-active:#262626;--color-accent:#2b3a67;--color-accent-hover:#243057;--color-accent-active:#1d2647;--color-accent-focus:#c7d2fe;--color-accent-subtle:#eef1f8;--color-text-primary:#171717;--color-text-secondary:#8c8c8c;--color-text-disabled:#d1d1d1;--color-text-inverse:#fff;--color-background:#fff;--color-surface:#fafafa;--color-section:#f3f3f3;--color-border:#e5e5e5;--color-divider:#ececec;--color-overlay:#00000080;--color-positive:#15803d;--color-positive-subtle:#dcfce7;--color-negative:#dc2626;--color-negative-subtle:#fee2e2;--color-success:#2c8c5e;--color-success-subtle:#e6f4ec;--color-success-border:#cfe9db;--color-warning:#e08a1a;--color-warning-subtle:#fff7ed;--color-warning-border:#fdead7;--color-error:#b42318;--color-error-subtle:#feeceb;--color-error-border:#fbd5d2;--shadow-step-active:0px 0px 10px 0px #0000001a;--shadow-dialog:0px 8px 32px 0px #0000001a;--btn-primary-gradient:linear-gradient(180deg, #262626 0%, #1c1c1c 50%, #0f0f0f 100%);--btn-primary-shadow:inset 0px -1px 3px 0px #00000059, inset 0px 1px 2px 0px #ffffff2e, inset 0px 1px 0px 0px #ffffff1a;--sale-card-surface:linear-gradient(to top, #0a0a0a 0%, #1a1a1a 100%);--color-sale-card-text:#f4f4f5;--color-sale-card-text-muted:#a1a1aa;--color-sale-card-text-strong:#fff;--color-sale-card-border:#ffffff40;--color-sale-card-chrome-border:#ffffff4d;--color-sale-card-chrome-bg:#ffffff26;--color-sale-card-chrome-emphasis-border:#fff6;--color-sale-card-chrome-emphasis-bg:#ffffff40;--color-sale-card-focus-ring:#ffffff80;--display-on-light:block;--display-on-dark:none}@media (prefers-color-scheme:dark){.clco-sdk-root:not(:where(.light,.light *)){--color-brand-primary:#f4f4f5;--color-brand-primary-hover:#fff;--color-brand-primary-active:#e4e4e7;--color-accent:#6f82c9;--color-accent-hover:#8799e4;--color-accent-active:#5b6fcf;--color-accent-focus:#6f82c959;--color-accent-subtle:#6f82c91f;--color-text-primary:#f4f4f5;--color-text-secondary:#a1a1aa;--color-text-disabled:#71717a;--color-text-inverse:#171717;--color-background:#0f1115;--color-surface:#161a20;--color-section:#20242c;--color-border:#2a2e35;--color-divider:#323741;--color-overlay:#000000b3;--color-positive:#22c55e;--color-positive-subtle:#22c55e1f;--color-negative:#ef4444;--color-negative-subtle:#ef44441f;--color-success:#34d399;--color-success-subtle:#34d3991f;--color-success-border:#34d39940;--color-warning:#f59e0b;--color-warning-subtle:#f59e0b1f;--color-warning-border:#f59e0b40;--color-error:#f87171;--color-error-subtle:#f871711f;--color-error-border:#f8717140;--shadow-step-active:0px 0px 10px 0px #00000080;--shadow-dialog:0px 8px 32px 0px #0009;--btn-primary-gradient:linear-gradient(180deg, #fafafa 0%, #f0f0f0 50%, #e4e4e7 100%);--btn-primary-shadow:inset 0px -1px 3px 0px #0000001f, inset 0px 1px 2px 0px #fff9, inset 0px 1px 0px 0px #fff6;--display-on-light:none;--display-on-dark:block}}:where(.dark,.dark *) .clco-sdk-root{--color-brand-primary:#f4f4f5;--color-brand-primary-hover:#fff;--color-brand-primary-active:#e4e4e7;--color-accent:#6f82c9;--color-accent-hover:#8799e4;--color-accent-active:#5b6fcf;--color-accent-focus:#6f82c959;--color-accent-subtle:#6f82c91f;--color-text-primary:#f4f4f5;--color-text-secondary:#a1a1aa;--color-text-disabled:#71717a;--color-text-inverse:#171717;--color-background:#0f1115;--color-surface:#161a20;--color-section:#20242c;--color-border:#2a2e35;--color-divider:#323741;--color-overlay:#000000b3;--color-positive:#22c55e;--color-positive-subtle:#22c55e1f;--color-negative:#ef4444;--color-negative-subtle:#ef44441f;--color-success:#34d399;--color-success-subtle:#34d3991f;--color-success-border:#34d39940;--color-warning:#f59e0b;--color-warning-subtle:#f59e0b1f;--color-warning-border:#f59e0b40;--color-error:#f87171;--color-error-subtle:#f871711f;--color-error-border:#f8717140;--shadow-step-active:0px 0px 10px 0px #00000080;--shadow-dialog:0px 8px 32px 0px #0009;--btn-primary-gradient:linear-gradient(180deg, #fafafa 0%, #f0f0f0 50%, #e4e4e7 100%);--btn-primary-shadow:inset 0px -1px 3px 0px #0000001f, inset 0px 1px 2px 0px #fff9, inset 0px 1px 0px 0px #fff6;--display-on-light:none;--display-on-dark:block}.clco-sdk-root{color:var(--color-text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,sans-serif}.clco-sdk-root *,.clco-sdk-root :before,.clco-sdk-root :after{box-sizing:border-box}.clco-sdk-root button{appearance:none;cursor:pointer;font:inherit;color:inherit;background:0 0;border:none;padding:0}.clco-sdk-root input,.clco-sdk-root textarea,.clco-sdk-root select{font:inherit;color:inherit;background:0 0;border:none;border-radius:0;padding:0}.clco-sdk-root a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}.clco-sdk-root ul,.clco-sdk-root ol{margin:0;padding:0;list-style:none}.clco-sdk-root h1,.clco-sdk-root h2,.clco-sdk-root h3,.clco-sdk-root h4,.clco-sdk-root h5,.clco-sdk-root h6,.clco-sdk-root p,.clco-sdk-root figure,.clco-sdk-root blockquote,.clco-sdk-root dl,.clco-sdk-root dd,.clco-sdk-root pre{margin:0}.clco-sdk-root img,.clco-sdk-root svg{max-width:100%;display:block}@keyframes clco-status-ping{0%{opacity:.7;transform:scale(1)}75%,to{opacity:0;transform:scale(3.25)}}.clco-sdk-root .clcosdk-status-dot-ping{animation:1.6s cubic-bezier(0,0,.2,1) infinite clco-status-ping}.clco-sdk-root .clcosdk-on-light{display:var(--display-on-light)}.clco-sdk-root .clcosdk-on-dark{display:var(--display-on-dark)}@media (prefers-reduced-motion:reduce){.clco-sdk-root .clcosdk-status-dot-ping{opacity:0;animation:none}}}@layer components;@layer utilities{.clcosdk\\:pointer-events-none{pointer-events:none}.clcosdk\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.clcosdk\\:absolute{position:absolute}.clcosdk\\:fixed{position:fixed}.clcosdk\\:relative{position:relative}.clcosdk\\:inset-0{inset:0}.clcosdk\\:top-1\\/2{top:50%}.clcosdk\\:top-4{top:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:top-full{top:100%}.clcosdk\\:-right-0\\.5{right:calc(var(--clcosdk-spacing) * -.5)}.clcosdk\\:right-4{right:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:right-\\[-14\\%\\]{right:-14%}.clcosdk\\:-bottom-0\\.5{bottom:calc(var(--clcosdk-spacing) * -.5)}.clcosdk\\:bottom-full{bottom:100%}.clcosdk\\:left-1\\/2{left:50%}.clcosdk\\:z-0{z-index:0}.clcosdk\\:z-10{z-index:10}.clcosdk\\:z-50{z-index:50}.clcosdk\\:order-1{order:1}.clcosdk\\:order-2{order:2}.clcosdk\\:-mx-2{margin-inline:calc(var(--clcosdk-spacing) * -2)}.clcosdk\\:mt-2{margin-top:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:mt-4{margin-top:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:mt-auto{margin-top:auto}.clcosdk\\:mb-2{margin-bottom:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:flex{display:flex}.clcosdk\\:grid{display:grid}.clcosdk\\:inline-flex{display:inline-flex}.clcosdk\\:size-2{width:calc(var(--clcosdk-spacing) * 2);height:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:size-3{width:calc(var(--clcosdk-spacing) * 3);height:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:size-3\\.5{width:calc(var(--clcosdk-spacing) * 3.5);height:calc(var(--clcosdk-spacing) * 3.5)}.clcosdk\\:size-4{width:calc(var(--clcosdk-spacing) * 4);height:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:size-5{width:calc(var(--clcosdk-spacing) * 5);height:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:size-10{width:calc(var(--clcosdk-spacing) * 10);height:calc(var(--clcosdk-spacing) * 10)}.clcosdk\\:size-12{width:calc(var(--clcosdk-spacing) * 12);height:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:size-16{width:calc(var(--clcosdk-spacing) * 16);height:calc(var(--clcosdk-spacing) * 16)}.clcosdk\\:size-24{width:calc(var(--clcosdk-spacing) * 24);height:calc(var(--clcosdk-spacing) * 24)}.clcosdk\\:size-\\[15rem\\]{width:15rem;height:15rem}.clcosdk\\:size-full{width:100%;height:100%}.clcosdk\\:h-1{height:var(--clcosdk-spacing)}.clcosdk\\:h-3{height:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:h-4{height:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:h-5{height:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:h-6{height:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:h-8{height:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:h-9{height:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:h-10{height:calc(var(--clcosdk-spacing) * 10)}.clcosdk\\:h-11{height:calc(var(--clcosdk-spacing) * 11)}.clcosdk\\:h-12{height:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:h-14{height:calc(var(--clcosdk-spacing) * 14)}.clcosdk\\:h-\\[1em\\]{height:1em}.clcosdk\\:h-\\[18px\\]{height:18px}.clcosdk\\:h-\\[54px\\]{height:54px}.clcosdk\\:h-\\[71px\\]{height:71px}.clcosdk\\:h-auto{height:auto}.clcosdk\\:h-full{height:100%}.clcosdk\\:h-px{height:1px}.clcosdk\\:max-h-\\[92vh\\]{max-height:92vh}.clcosdk\\:max-h-full{max-height:100%}.clcosdk\\:min-h-0{min-height:0}.clcosdk\\:min-h-9{min-height:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:min-h-40{min-height:calc(var(--clcosdk-spacing) * 40)}.clcosdk\\:min-h-\\[1lh\\]{min-height:1lh}.clcosdk\\:min-h-screen{min-height:100vh}.clcosdk\\:w-1{width:var(--clcosdk-spacing)}.clcosdk\\:w-1\\/2{width:50%}.clcosdk\\:w-2\\/5{width:40%}.clcosdk\\:w-3\\/5{width:60%}.clcosdk\\:w-4{width:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:w-5{width:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:w-6{width:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:w-8{width:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:w-10{width:calc(var(--clcosdk-spacing) * 10)}.clcosdk\\:w-12{width:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:w-16{width:calc(var(--clcosdk-spacing) * 16)}.clcosdk\\:w-20{width:calc(var(--clcosdk-spacing) * 20)}.clcosdk\\:w-24{width:calc(var(--clcosdk-spacing) * 24)}.clcosdk\\:w-28{width:calc(var(--clcosdk-spacing) * 28)}.clcosdk\\:w-32{width:calc(var(--clcosdk-spacing) * 32)}.clcosdk\\:w-40{width:calc(var(--clcosdk-spacing) * 40)}.clcosdk\\:w-48{width:calc(var(--clcosdk-spacing) * 48)}.clcosdk\\:w-80{width:calc(var(--clcosdk-spacing) * 80)}.clcosdk\\:w-96{width:calc(var(--clcosdk-spacing) * 96)}.clcosdk\\:w-\\[16px\\]{width:16px}.clcosdk\\:w-\\[28rem\\]{width:28rem}.clcosdk\\:w-\\[448px\\]{width:448px}.clcosdk\\:w-\\[calc\\(100\\%\\+16px\\)\\]{width:calc(100% + 16px)}.clcosdk\\:w-auto{width:auto}.clcosdk\\:w-component{width:448px}.clcosdk\\:w-fit{width:fit-content}.clcosdk\\:w-full{width:100%}.clcosdk\\:w-max{width:max-content}.clcosdk\\:max-w-\\[16rem\\]{max-width:16rem}.clcosdk\\:max-w-\\[28rem\\]{max-width:28rem}.clcosdk\\:max-w-\\[30rem\\]{max-width:30rem}.clcosdk\\:max-w-\\[40rem\\]{max-width:40rem}.clcosdk\\:max-w-\\[56rem\\]{max-width:56rem}.clcosdk\\:max-w-\\[64rem\\]{max-width:64rem}.clcosdk\\:max-w-\\[760px\\]{max-width:760px}.clcosdk\\:max-w-full{max-width:100%}.clcosdk\\:max-w-md{max-width:var(--clcosdk-container-md)}.clcosdk\\:max-w-sm{max-width:var(--clcosdk-container-sm)}.clcosdk\\:max-w-xl{max-width:var(--clcosdk-container-xl)}.clcosdk\\:min-w-0{min-width:0}.clcosdk\\:flex-1{flex:1}.clcosdk\\:shrink-0{flex-shrink:0}.clcosdk\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.clcosdk\\:-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.clcosdk\\:rotate-90{rotate:90deg}.clcosdk\\:rotate-180{rotate:180deg}.clcosdk\\:animate-pulse{animation:var(--clcosdk-animate-pulse)}.clcosdk\\:animate-spin{animation:var(--clcosdk-animate-spin)}.clcosdk\\:cursor-pointer{cursor:pointer}.clcosdk\\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.clcosdk\\:grid-rows-\\[0fr\\]{grid-template-rows:0fr}.clcosdk\\:grid-rows-\\[1fr\\]{grid-template-rows:1fr}.clcosdk\\:flex-col{flex-direction:column}.clcosdk\\:flex-row{flex-direction:row}.clcosdk\\:flex-wrap{flex-wrap:wrap}.clcosdk\\:items-center{align-items:center}.clcosdk\\:items-end{align-items:flex-end}.clcosdk\\:items-start{align-items:flex-start}.clcosdk\\:justify-between{justify-content:space-between}.clcosdk\\:justify-center{justify-content:center}.clcosdk\\:justify-end{justify-content:flex-end}.clcosdk\\:justify-start{justify-content:flex-start}.clcosdk\\:gap-1{gap:var(--clcosdk-spacing)}.clcosdk\\:gap-1\\.5{gap:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:gap-2{gap:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:gap-2\\.5{gap:calc(var(--clcosdk-spacing) * 2.5)}.clcosdk\\:gap-3{gap:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:gap-4{gap:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:gap-6{gap:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:gap-\\[5px\\]{gap:5px}:where(.clcosdk\\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--clcosdk-spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--clcosdk-spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.clcosdk\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--clcosdk-spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--clcosdk-spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.clcosdk\\:divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.clcosdk\\:divide-divider>:not(:last-child)){border-color:var(--color-divider)}.clcosdk\\:self-start{align-self:flex-start}.clcosdk\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.clcosdk\\:overflow-hidden{overflow:hidden}.clcosdk\\:overflow-y-auto{overflow-y:auto}.clcosdk\\:rounded{border-radius:.25rem}.clcosdk\\:rounded-2xl{border-radius:var(--clcosdk-radius-2xl)}.clcosdk\\:rounded-\\[20px\\]{border-radius:20px}.clcosdk\\:rounded-\\[28px\\]{border-radius:28px}.clcosdk\\:rounded-btn{border-radius:12px}.clcosdk\\:rounded-card{border-radius:24px}.clcosdk\\:rounded-full{border-radius:3.40282e38px}.clcosdk\\:rounded-lg{border-radius:var(--clcosdk-radius-lg)}.clcosdk\\:rounded-md{border-radius:var(--clcosdk-radius-md)}.clcosdk\\:rounded-xl{border-radius:var(--clcosdk-radius-xl)}.clcosdk\\:border{border-style:var(--tw-border-style);border-width:1px}.clcosdk\\:border-2{border-style:var(--tw-border-style);border-width:2px}.clcosdk\\:border-\\[1\\.5px\\]{border-style:var(--tw-border-style);border-width:1.5px}.clcosdk\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.clcosdk\\:border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.clcosdk\\:border-accent\\/60{border-color:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.clcosdk\\:border-accent\\/60{border-color:color-mix(in oklab, var(--color-accent) 60%, transparent)}}.clcosdk\\:border-amber-500{border-color:var(--clcosdk-color-amber-500)}.clcosdk\\:border-background{border-color:var(--color-background)}.clcosdk\\:border-border{border-color:var(--color-border)}.clcosdk\\:border-brand-primary{border-color:var(--color-brand-primary)}.clcosdk\\:border-current{border-color:currentColor}.clcosdk\\:border-divider{border-color:var(--color-divider)}.clcosdk\\:border-error-border{border-color:var(--color-error-border)}.clcosdk\\:border-sale-card-border{border-color:var(--color-sale-card-border)}.clcosdk\\:border-sale-card-chrome-border{border-color:var(--color-sale-card-chrome-border)}.clcosdk\\:border-success-border{border-color:var(--color-success-border)}.clcosdk\\:border-text-primary{border-color:var(--color-text-primary)}.clcosdk\\:border-transparent{border-color:#0000}.clcosdk\\:border-warning-border{border-color:var(--color-warning-border)}.clcosdk\\:border-t-transparent{border-top-color:#0000}.clcosdk\\:bg-background{background-color:var(--color-background)}.clcosdk\\:bg-black\\/50{background-color:var(--clcosdk-color-black)}@supports (color:color-mix(in lab, red, red)){.clcosdk\\:bg-black\\/50{background-color:color-mix(in oklab, var(--clcosdk-color-black) 50%, transparent)}}.clcosdk\\:bg-brand-primary{background-color:var(--color-brand-primary)}.clcosdk\\:bg-divider{background-color:var(--color-divider)}.clcosdk\\:bg-error-subtle{background-color:var(--color-error-subtle)}.clcosdk\\:bg-overlay{background-color:var(--color-overlay)}.clcosdk\\:bg-positive{background-color:var(--color-positive)}.clcosdk\\:bg-positive-subtle{background-color:var(--color-positive-subtle)}.clcosdk\\:bg-sale-card-chrome-bg{background-color:var(--color-sale-card-chrome-bg)}.clcosdk\\:bg-section{background-color:var(--color-section)}.clcosdk\\:bg-success-subtle{background-color:var(--color-success-subtle)}.clcosdk\\:bg-surface{background-color:var(--color-surface)}.clcosdk\\:bg-text-disabled{background-color:var(--color-text-disabled)}.clcosdk\\:bg-text-primary{background-color:var(--color-text-primary)}.clcosdk\\:bg-transparent{background-color:#0000}.clcosdk\\:bg-warning-subtle{background-color:var(--color-warning-subtle)}.clcosdk\\:bg-\\[image\\:var\\(--btn-primary-gradient\\)\\]{background-image:var(--btn-primary-gradient)}.clcosdk\\:bg-\\[image\\:var\\(--sale-card-surface\\)\\]{background-image:var(--sale-card-surface)}.clcosdk\\:object-contain{object-fit:contain}.clcosdk\\:object-cover{object-fit:cover}.clcosdk\\:p-0{padding:0}.clcosdk\\:p-1\\.5{padding:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:p-3{padding:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:p-3\\.5{padding:calc(var(--clcosdk-spacing) * 3.5)}.clcosdk\\:p-4{padding:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:p-5{padding:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:p-6{padding:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:p-8{padding:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:p-16{padding:calc(var(--clcosdk-spacing) * 16)}.clcosdk\\:px-2{padding-inline:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:px-3{padding-inline:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:px-4{padding-inline:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:px-5{padding-inline:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:px-6{padding-inline:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:py-1\\.5{padding-block:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:py-2{padding-block:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:py-3{padding-block:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:py-8{padding-block:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:py-12{padding-block:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:pt-1{padding-top:var(--clcosdk-spacing)}.clcosdk\\:pt-4{padding-top:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:pt-14{padding-top:calc(var(--clcosdk-spacing) * 14)}.clcosdk\\:pr-1\\.5{padding-right:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:pr-3{padding-right:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:pr-4{padding-right:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:pb-1{padding-bottom:var(--clcosdk-spacing)}.clcosdk\\:pb-4{padding-bottom:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:pl-3{padding-left:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:text-center{text-align:center}.clcosdk\\:text-left{text-align:left}.clcosdk\\:text-right{text-align:right}.clcosdk\\:font-mono{font-family:var(--clcosdk-font-mono)}.clcosdk\\:text-base{font-size:var(--clcosdk-text-base);line-height:var(--tw-leading,var(--clcosdk-text-base--line-height))}.clcosdk\\:text-lg{font-size:var(--clcosdk-text-lg);line-height:var(--tw-leading,var(--clcosdk-text-lg--line-height))}.clcosdk\\:text-sm{font-size:var(--clcosdk-text-sm);line-height:var(--tw-leading,var(--clcosdk-text-sm--line-height))}.clcosdk\\:text-xs{font-size:var(--clcosdk-text-xs);line-height:var(--tw-leading,var(--clcosdk-text-xs--line-height))}.clcosdk\\:text-\\[11px\\]{font-size:11px}.clcosdk\\:text-\\[12px\\]{font-size:12px}.clcosdk\\:text-\\[13px\\]{font-size:13px}.clcosdk\\:text-\\[14px\\]{font-size:14px}.clcosdk\\:text-\\[15px\\]{font-size:15px}.clcosdk\\:text-\\[16px\\]{font-size:16px}.clcosdk\\:text-\\[18px\\]{font-size:18px}.clcosdk\\:text-\\[22px\\]{font-size:22px}.clcosdk\\:text-\\[28px\\]{font-size:28px}.clcosdk\\:text-\\[36px\\]{font-size:36px}.clcosdk\\:text-\\[48px\\]{font-size:48px}.clcosdk\\:text-\\[64px\\]{font-size:64px}.clcosdk\\:leading-\\[105\\%\\]{--tw-leading:105%;line-height:105%}.clcosdk\\:leading-\\[108\\%\\]{--tw-leading:108%;line-height:108%}.clcosdk\\:leading-\\[110\\%\\]{--tw-leading:110%;line-height:110%}.clcosdk\\:leading-\\[120\\%\\]{--tw-leading:120%;line-height:120%}.clcosdk\\:leading-\\[130\\%\\]{--tw-leading:130%;line-height:130%}.clcosdk\\:leading-\\[140\\%\\]{--tw-leading:140%;line-height:140%}.clcosdk\\:leading-\\[150\\%\\]{--tw-leading:150%;line-height:150%}.clcosdk\\:leading-\\[160\\%\\]{--tw-leading:160%;line-height:160%}.clcosdk\\:font-medium{--tw-font-weight:var(--clcosdk-font-weight-medium);font-weight:var(--clcosdk-font-weight-medium)}.clcosdk\\:font-normal{--tw-font-weight:var(--clcosdk-font-weight-normal);font-weight:var(--clcosdk-font-weight-normal)}.clcosdk\\:font-semibold{--tw-font-weight:var(--clcosdk-font-weight-semibold);font-weight:var(--clcosdk-font-weight-semibold)}.clcosdk\\:tracking-\\[0\\.12px\\]{--tw-tracking:.12px;letter-spacing:.12px}.clcosdk\\:tracking-\\[0\\.28px\\]{--tw-tracking:.28px;letter-spacing:.28px}.clcosdk\\:break-words{overflow-wrap:break-word}.clcosdk\\:whitespace-nowrap{white-space:nowrap}.clcosdk\\:text-background{color:var(--color-background)}.clcosdk\\:text-brand-primary{color:var(--color-brand-primary)}.clcosdk\\:text-error{color:var(--color-error)}.clcosdk\\:text-positive{color:var(--color-positive)}.clcosdk\\:text-sale-card-text{color:var(--color-sale-card-text)}.clcosdk\\:text-sale-card-text-muted{color:var(--color-sale-card-text-muted)}.clcosdk\\:text-sale-card-text-strong{color:var(--color-sale-card-text-strong)}.clcosdk\\:text-success{color:var(--color-success)}.clcosdk\\:text-text-disabled{color:var(--color-text-disabled)}.clcosdk\\:text-text-inverse{color:var(--color-text-inverse)}.clcosdk\\:text-text-primary{color:var(--color-text-primary)}.clcosdk\\:text-text-secondary{color:var(--color-text-secondary)}.clcosdk\\:text-warning{color:var(--color-warning)}.clcosdk\\:capitalize{text-transform:capitalize}.clcosdk\\:lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.clcosdk\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.clcosdk\\:no-underline{text-decoration-line:none}.clcosdk\\:underline{text-decoration-line:underline}.clcosdk\\:underline-offset-2{text-underline-offset:2px}.clcosdk\\:underline-offset-4{text-underline-offset:4px}.clcosdk\\:opacity-0{opacity:0}.clcosdk\\:opacity-60{opacity:.6}.clcosdk\\:shadow-\\[0_0_0_3px_rgba\\(59\\,130\\,246\\,0\\.2\\)\\]{--tw-shadow:0 0 0 3px var(--tw-shadow-color,#3b82f633);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-\\[0px_1px_1px_0px_rgba\\(10\\,10\\,10\\,0\\.04\\)\\,0px_8px_12px_0px_rgba\\(10\\,10\\,10\\,0\\.08\\)\\]{--tw-shadow:0px 1px 1px 0px var(--tw-shadow-color,#0a0a0a0a), 0px 8px 12px 0px var(--tw-shadow-color,#0a0a0a14);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-\\[0px_4px_12px_0px_rgba\\(0\\,0\\,0\\,0\\.08\\)\\,0px_12px_28px_0px_rgba\\(0\\,0\\,0\\,0\\.13\\)\\]{--tw-shadow:0px 4px 12px 0px var(--tw-shadow-color,#00000014), 0px 12px 28px 0px var(--tw-shadow-color,#00000021);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-\\[var\\(--btn-primary-shadow\\)\\]{--tw-shadow:var(--btn-primary-shadow);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-card{--tw-shadow:0px 4px 6px -2px var(--tw-shadow-color,#0000000d), 0px 12px 24px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-dialog{--tw-shadow:var(--shadow-dialog);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-step-active{--tw-shadow:var(--shadow-step-active);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:transition-\\[background-color\\,border-color\\]{transition-property:background-color,border-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-\\[grid-template-rows\\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.clcosdk\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.clcosdk\\:duration-500{--tw-duration:.5s;transition-duration:.5s}.clcosdk\\:ease-in-out{--tw-ease:var(--clcosdk-ease-in-out);transition-timing-function:var(--clcosdk-ease-in-out)}.clcosdk\\:ease-out{--tw-ease:var(--clcosdk-ease-out);transition-timing-function:var(--clcosdk-ease-out)}.clcosdk\\:outline-none{--tw-outline-style:none;outline-style:none}.clcosdk\\:group-focus-within\\:opacity-100:is(:where(.clcosdk\\:group):focus-within *){opacity:1}@media (hover:hover){.clcosdk\\:group-hover\\:border-sale-card-chrome-emphasis-border:is(:where(.clcosdk\\:group):hover *){border-color:var(--color-sale-card-chrome-emphasis-border)}.clcosdk\\:group-hover\\:bg-sale-card-chrome-emphasis-bg:is(:where(.clcosdk\\:group):hover *){background-color:var(--color-sale-card-chrome-emphasis-bg)}.clcosdk\\:group-hover\\:opacity-100:is(:where(.clcosdk\\:group):hover *){opacity:1}}.clcosdk\\:group-focus-visible\\:border-sale-card-chrome-emphasis-border:is(:where(.clcosdk\\:group):focus-visible *){border-color:var(--color-sale-card-chrome-emphasis-border)}.clcosdk\\:group-focus-visible\\:bg-sale-card-chrome-emphasis-bg:is(:where(.clcosdk\\:group):focus-visible *){background-color:var(--color-sale-card-chrome-emphasis-bg)}.clcosdk\\:placeholder\\:text-text-disabled::placeholder{color:var(--color-text-disabled)}@media (hover:hover){.clcosdk\\:hover\\:scale-\\[1\\.02\\]:hover{scale:1.02}.clcosdk\\:hover\\:border-text-disabled:hover{border-color:var(--color-text-disabled)}.clcosdk\\:hover\\:bg-\\[\\#fcdcd8\\]:hover{background-color:#fcdcd8}.clcosdk\\:hover\\:bg-border:hover{background-color:var(--color-border)}.clcosdk\\:hover\\:bg-brand-primary:hover{background-color:var(--color-brand-primary)}.clcosdk\\:hover\\:bg-brand-primary-hover:hover{background-color:var(--color-brand-primary-hover)}.clcosdk\\:hover\\:bg-section:hover{background-color:var(--color-section)}.clcosdk\\:hover\\:bg-surface:hover{background-color:var(--color-surface)}.clcosdk\\:hover\\:text-\\[\\#8b1a13\\]:hover{color:#8b1a13}.clcosdk\\:hover\\:text-text-primary:hover{color:var(--color-text-primary)}.clcosdk\\:hover\\:underline:hover{text-decoration-line:underline}.clcosdk\\:hover\\:opacity-80:hover{opacity:.8}.clcosdk\\:hover\\:opacity-90:hover{opacity:.9}}.clcosdk\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:focus-visible\\:ring-gray-400:focus-visible{--tw-ring-color:var(--clcosdk-color-gray-400)}.clcosdk\\:focus-visible\\:ring-gray-500:focus-visible{--tw-ring-color:var(--clcosdk-color-gray-500)}.clcosdk\\:focus-visible\\:ring-red-400:focus-visible{--tw-ring-color:var(--clcosdk-color-red-400)}.clcosdk\\:focus-visible\\:ring-red-500:focus-visible{--tw-ring-color:var(--clcosdk-color-red-500)}.clcosdk\\:focus-visible\\:ring-sale-card-focus-ring:focus-visible{--tw-ring-color:var(--color-sale-card-focus-ring)}.clcosdk\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.clcosdk\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.clcosdk\\:active\\:bg-\\[\\#d9d9d9\\]:active{background-color:#d9d9d9}.clcosdk\\:active\\:bg-\\[\\#f9c9c4\\]:active{background-color:#f9c9c4}.clcosdk\\:active\\:bg-border:active{background-color:var(--color-border)}.clcosdk\\:active\\:bg-brand-primary-active:active{background-color:var(--color-brand-primary-active)}.clcosdk\\:active\\:text-\\[\\#6d1510\\]:active{color:#6d1510}.clcosdk\\:active\\:opacity-80:active{opacity:.8}.clcosdk\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.clcosdk\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.clcosdk\\:disabled\\:opacity-40:disabled{opacity:.4}.clcosdk\\:disabled\\:opacity-50:disabled{opacity:.5}.clcosdk\\:aria-disabled\\:cursor-not-allowed[aria-disabled=true]{cursor:not-allowed}.clcosdk\\:aria-disabled\\:opacity-50[aria-disabled=true]{opacity:.5}@media not all and (min-width:48rem){.clcosdk\\:max-md\\:hidden{display:none}.clcosdk\\:max-md\\:w-full{width:100%}.clcosdk\\:max-md\\:justify-start{justify-content:flex-start}.clcosdk\\:max-md\\:gap-4{gap:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:max-md\\:rounded-none{border-radius:0}.clcosdk\\:max-md\\:border-0{border-style:var(--tw-border-style);border-width:0}.clcosdk\\:max-md\\:bg-transparent{background-color:#0000}.clcosdk\\:max-md\\:p-0{padding:0}@media (hover:hover){.clcosdk\\:max-md\\:hover\\:scale-100:hover{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}}}@media (min-width:40rem){.clcosdk\\:sm\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:48rem){.clcosdk\\:md\\:right-\\[-10\\%\\]{right:-10%}.clcosdk\\:md\\:order-1{order:1}.clcosdk\\:md\\:order-2{order:2}.clcosdk\\:md\\:hidden{display:none}.clcosdk\\:md\\:size-\\[20rem\\]{width:20rem;height:20rem}.clcosdk\\:md\\:h-9{height:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:md\\:h-12{height:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:md\\:h-\\[54px\\]{height:54px}.clcosdk\\:md\\:w-9{width:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:md\\:w-12{width:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.clcosdk\\:md\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.clcosdk\\:md\\:grid-cols-\\[minmax\\(0\\,11fr\\)_minmax\\(0\\,8fr\\)\\]{grid-template-columns:minmax(0,11fr) minmax(0,8fr)}.clcosdk\\:md\\:flex-row{flex-direction:row}.clcosdk\\:md\\:items-center{align-items:center}.clcosdk\\:md\\:items-end{align-items:flex-end}.clcosdk\\:md\\:justify-between{justify-content:space-between}.clcosdk\\:md\\:justify-end{justify-content:flex-end}.clcosdk\\:md\\:gap-3{gap:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:md\\:gap-6{gap:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:md\\:gap-x-12{column-gap:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:md\\:self-end{align-self:flex-end}.clcosdk\\:md\\:rounded-\\[40px\\]{border-radius:40px}.clcosdk\\:md\\:rounded-card{border-radius:24px}.clcosdk\\:md\\:rounded-dialog{border-radius:32px}.clcosdk\\:md\\:p-4{padding:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:md\\:p-6{padding:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:md\\:p-8{padding:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:md\\:px-6{padding-inline:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:md\\:px-8{padding-inline:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:md\\:py-2{padding-block:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:md\\:pr-2{padding-right:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:md\\:pr-4{padding-right:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:md\\:pl-4{padding-left:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:md\\:text-base{font-size:var(--clcosdk-text-base);line-height:var(--tw-leading,var(--clcosdk-text-base--line-height))}.clcosdk\\:md\\:text-\\[14px\\]{font-size:14px}.clcosdk\\:md\\:text-\\[16px\\]{font-size:16px}.clcosdk\\:md\\:text-\\[18px\\]{font-size:18px}.clcosdk\\:md\\:text-\\[28px\\]{font-size:28px}.clcosdk\\:md\\:leading-\\[120\\%\\]{--tw-leading:120%;line-height:120%}.clcosdk\\:md\\:leading-\\[160\\%\\]{--tw-leading:160%;line-height:160%}}@media (prefers-color-scheme:dark){@media (hover:hover){.clcosdk\\:dark\\:hover\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.20\\)\\]:not(:where(.light,.light *)):hover{background-color:#f8717133}}}@media (hover:hover){.clcosdk\\:dark\\:hover\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.20\\)\\]:where(.dark,.dark *):hover{background-color:#f8717133}}@media (prefers-color-scheme:dark){@media (hover:hover){.clcosdk\\:dark\\:hover\\:text-\\[\\#fca5a5\\]:not(:where(.light,.light *)):hover{color:#fca5a5}}}@media (hover:hover){.clcosdk\\:dark\\:hover\\:text-\\[\\#fca5a5\\]:where(.dark,.dark *):hover{color:#fca5a5}}@media (prefers-color-scheme:dark){.clcosdk\\:dark\\:active\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.30\\)\\]:not(:where(.light,.light *)):active{background-color:#f871714d}}.clcosdk\\:dark\\:active\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.30\\)\\]:where(.dark,.dark *):active{background-color:#f871714d}@media (prefers-color-scheme:dark){.clcosdk\\:dark\\:active\\:bg-divider:not(:where(.light,.light *)):active{background-color:var(--color-divider)}}.clcosdk\\:dark\\:active\\:bg-divider:where(.dark,.dark *):active{background-color:var(--color-divider)}@media (prefers-color-scheme:dark){.clcosdk\\:dark\\:active\\:text-\\[\\#f87171\\]:not(:where(.light,.light *)):active{color:#f87171}}.clcosdk\\:dark\\:active\\:text-\\[\\#f87171\\]:where(.dark,.dark *):active{color:#f87171}.clcosdk\\:\\[\\&_circle\\]\\:fill-error-subtle circle{fill:var(--color-error-subtle)}.clcosdk\\:\\[\\&_circle\\]\\:fill-success-subtle circle{fill:var(--color-success-subtle)}.clcosdk\\:\\[\\&_circle\\]\\:fill-warning-subtle circle{fill:var(--color-warning-subtle)}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}';
4957
5091
 
4958
5092
  // src/client/CoinListStyleScope.tsx
4959
5093
  var import_jsx_runtime2 = require("react/jsx-runtime");
@@ -5255,7 +5389,7 @@ function AlertBanner({
5255
5389
  "aria-hidden": "true"
5256
5390
  }
5257
5391
  ),
5258
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: cn(typeClasses.subhead, text), children: content })
5392
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: cn(typeClasses.bodySm, text), children: content })
5259
5393
  ]
5260
5394
  }
5261
5395
  );
@@ -6251,12 +6385,16 @@ function AssetSummaryRow({
6251
6385
  ] })
6252
6386
  ] }),
6253
6387
  (value || caption) && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "clcosdk:flex clcosdk:shrink-0 clcosdk:flex-col clcosdk:items-end clcosdk:justify-center", children: [
6254
- value && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
6388
+ value && // `min-h-[1lh]` + flex center: a Skeleton sized to `1em` (cap
6389
+ // height) sits in the same line box as loaded copy, so leading
6390
+ // keeps the two rows apart instead of two full-lh bars colliding.
6391
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
6255
6392
  "div",
6256
6393
  {
6257
6394
  className: cn(
6258
6395
  typeClasses.h4,
6259
- "clcosdk:text-right clcosdk:text-text-primary"
6396
+ "clcosdk:flex clcosdk:min-h-[1lh] clcosdk:items-center",
6397
+ "clcosdk:justify-end clcosdk:text-text-primary"
6260
6398
  ),
6261
6399
  children: value
6262
6400
  }
@@ -6269,7 +6407,8 @@ function AssetSummaryRow({
6269
6407
  {
6270
6408
  className: cn(
6271
6409
  typeClasses.subhead,
6272
- "clcosdk:text-right clcosdk:text-text-secondary"
6410
+ "clcosdk:flex clcosdk:min-h-[1lh] clcosdk:items-center",
6411
+ "clcosdk:justify-end clcosdk:text-text-secondary"
6273
6412
  ),
6274
6413
  children: caption
6275
6414
  }
@@ -6989,7 +7128,7 @@ function detailRows2(state) {
6989
7128
  function PriceValue({ price }) {
6990
7129
  switch (price.type) {
6991
7130
  case "loading":
6992
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Skeleton, { className: "clcosdk:h-6 clcosdk:w-24" });
7131
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Skeleton, { className: "clcosdk:h-[1em] clcosdk:w-24" });
6993
7132
  case "known":
6994
7133
  return price.price;
6995
7134
  case "unavailable":
@@ -7003,7 +7142,7 @@ function PriceValue({ price }) {
7003
7142
  function PriceCaption({ price }) {
7004
7143
  switch (price.type) {
7005
7144
  case "loading":
7006
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Skeleton, { className: "clcosdk:h-4 clcosdk:w-20" });
7145
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Skeleton, { className: "clcosdk:h-[1em] clcosdk:w-20" });
7007
7146
  case "known":
7008
7147
  return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(StatusIndicator, { status: price.market });
7009
7148
  // Nothing to say about a market whose price never arrived: the order steps
@@ -7456,7 +7595,7 @@ function stablecoinIconUrl(symbol) {
7456
7595
  }
7457
7596
  }
7458
7597
  function offerIconUrl(offer) {
7459
- return offer.logoUrl === "" ? null : AssetIconUrl(offer.logoUrl);
7598
+ return offer.logoUrl ? AssetIconUrl(offer.logoUrl) : null;
7460
7599
  }
7461
7600
  function tokenLogoUrl(logo, minWidth = 40) {
7462
7601
  switch (logo.kind) {
@@ -7475,6 +7614,20 @@ function tokenLogoUrl(logo, minWidth = 40) {
7475
7614
  }
7476
7615
  }
7477
7616
  }
7617
+ function tokenLogoSrcSet(logo) {
7618
+ switch (logo.kind) {
7619
+ case "VECTOR":
7620
+ return null;
7621
+ case "RASTER": {
7622
+ const candidates = logo.variants.length > 0 ? logo.variants : [logo.original];
7623
+ return [...candidates].sort((a, b) => a.width - b.width).map((image) => `${image.url} ${image.width}w`).join(", ");
7624
+ }
7625
+ default: {
7626
+ const exhaustive = logo;
7627
+ return exhaustive;
7628
+ }
7629
+ }
7630
+ }
7478
7631
  function offerAssetIconUrl(offer, tokenMetadata) {
7479
7632
  return (tokenMetadata ? tokenLogoUrl(tokenMetadata.logo) : null) ?? offerIconUrl(offer);
7480
7633
  }
@@ -8081,8 +8234,12 @@ function useOndoBuyReviewViewModel({
8081
8234
  }
8082
8235
  }, [stepInput.type]);
8083
8236
  const transaction = transactionState.type === "CONTENT" ? transactionState.transaction : null;
8237
+ const offerUntil = (0, import_react17.useMemo)(
8238
+ () => transaction === null ? null : ondoQuoteOfferDeadline(transaction.expiresAt),
8239
+ [transaction]
8240
+ );
8084
8241
  const secondsLeft = useCountdown({
8085
- until: transaction?.expiresAt ?? null,
8242
+ until: offerUntil,
8086
8243
  enabled
8087
8244
  });
8088
8245
  const quoteStatus = toQuoteStatusUi(transactionState, secondsLeft);
@@ -8206,14 +8363,11 @@ function toQuoteStatusUi(state, secondsLeft) {
8206
8363
  message: refreshErrorMessage(state.refreshError)
8207
8364
  };
8208
8365
  }
8209
- if (secondsLeft === null || isTooCloseToExpiry(secondsLeft)) {
8366
+ if (secondsLeft === null || secondsLeft === 0) {
8210
8367
  return { type: "expired" };
8211
8368
  }
8212
8369
  return { type: "valid", expiresInLabel: expiresInLabel(secondsLeft) };
8213
8370
  }
8214
- function isTooCloseToExpiry(secondsLeft) {
8215
- return secondsLeft * 1e3 <= ONDO_QUOTE_EXPIRY_THRESHOLD_MS;
8216
- }
8217
8371
  function expiresInLabel(secondsLeft) {
8218
8372
  const unit = secondsLeft === 1 ? "second" : "seconds";
8219
8373
  return `Quote expires in ${secondsLeft} ${unit}`;
@@ -8705,8 +8859,9 @@ var NO_TOKEN_ADDRESS = EvmContractAddress(
8705
8859
  "0x0000000000000000000000000000000000000000"
8706
8860
  );
8707
8861
  function offerTokenIdentifier(offer, chain) {
8708
- const byChain = offer.tokens.filter((token) => token.chain === chain);
8709
- const asset = byChain.find((token) => token.role === "swap") ?? byChain.find((token) => token.role === "distribution");
8862
+ const asset = offerDisplayTokens(offer).find(
8863
+ (token) => token.chain === chain
8864
+ );
8710
8865
  return asset === void 0 ? null : { chain, address: asset.address };
8711
8866
  }
8712
8867
  function tokenMetadataOf(state) {
@@ -10143,8 +10298,12 @@ function useOndoSellReviewViewModel({
10143
10298
  }
10144
10299
  }, [stepInput.type]);
10145
10300
  const transaction = transactionState.type === "CONTENT" ? transactionState.transaction : null;
10301
+ const offerUntil = (0, import_react26.useMemo)(
10302
+ () => transaction === null ? null : ondoQuoteOfferDeadline(transaction.expiresAt),
10303
+ [transaction]
10304
+ );
10146
10305
  const secondsLeft = useCountdown({
10147
- until: transaction?.expiresAt ?? null,
10306
+ until: offerUntil,
10148
10307
  enabled
10149
10308
  });
10150
10309
  const quoteStatus = toQuoteStatusUi2(transactionState, secondsLeft);
@@ -10273,14 +10432,11 @@ function toQuoteStatusUi2(state, secondsLeft) {
10273
10432
  message: refreshErrorMessage2(state.refreshError)
10274
10433
  };
10275
10434
  }
10276
- if (secondsLeft === null || isTooCloseToExpiry2(secondsLeft)) {
10435
+ if (secondsLeft === null || secondsLeft === 0) {
10277
10436
  return { type: "expired" };
10278
10437
  }
10279
10438
  return { type: "valid", expiresInLabel: expiresInLabel2(secondsLeft) };
10280
10439
  }
10281
- function isTooCloseToExpiry2(secondsLeft) {
10282
- return secondsLeft * 1e3 <= ONDO_QUOTE_EXPIRY_THRESHOLD_MS;
10283
- }
10284
10440
  function expiresInLabel2(secondsLeft) {
10285
10441
  const unit = secondsLeft === 1 ? "second" : "seconds";
10286
10442
  return `Quote expires in ${secondsLeft} ${unit}`;
@@ -11368,7 +11524,7 @@ function LiveDot() {
11368
11524
  function PriceValue2({ price }) {
11369
11525
  switch (price.type) {
11370
11526
  case "loading":
11371
- return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "clcosdk:h-6 clcosdk:w-24" });
11527
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "clcosdk:h-[1em] clcosdk:w-24" });
11372
11528
  case "known":
11373
11529
  return price.price;
11374
11530
  default: {
@@ -12964,11 +13120,11 @@ function CheckoutContainer({
12964
13120
  enabled = true,
12965
13121
  className
12966
13122
  }) {
12967
- return renderOffer(offer.type, {
12968
- ondo: () => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
13123
+ return renderOffer(offer, {
13124
+ ondo: (ondoOffer) => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
12969
13125
  OndoCheckoutContainer,
12970
13126
  {
12971
- offer,
13127
+ offer: ondoOffer,
12972
13128
  chain,
12973
13129
  wallets,
12974
13130
  config: config["ondo::swap"],
@@ -12976,10 +13132,10 @@ function CheckoutContainer({
12976
13132
  className
12977
13133
  }
12978
13134
  ),
12979
- superstate: () => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
13135
+ superstate: (superstateOffer) => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
12980
13136
  SuperstateSwapCheckoutContainer,
12981
13137
  {
12982
- offer,
13138
+ offer: superstateOffer,
12983
13139
  chain,
12984
13140
  wallets,
12985
13141
  enabled,
@@ -12987,7 +13143,7 @@ function CheckoutContainer({
12987
13143
  className
12988
13144
  }
12989
13145
  ),
12990
- tokenSale: () => config["coinlist::token_sale"].render(offer)
13146
+ tokenSale: (tokenSaleOffer) => config["coinlist::token_sale"].render(tokenSaleOffer)
12991
13147
  });
12992
13148
  }
12993
13149
  function OndoCheckoutContainer({
@@ -13027,16 +13183,16 @@ function OndoCheckoutContainer({
13027
13183
  )
13028
13184
  });
13029
13185
  }
13030
- function renderOffer(type, branches) {
13031
- switch (type) {
13186
+ function renderOffer(offer, branches) {
13187
+ switch (offer.type) {
13032
13188
  case "ondo::swap":
13033
- return branches.ondo();
13189
+ return branches.ondo(offer);
13034
13190
  case "superstate::swap":
13035
- return branches.superstate();
13191
+ return branches.superstate(offer);
13036
13192
  case "coinlist::token_sale":
13037
- return branches.tokenSale();
13193
+ return branches.tokenSale(offer);
13038
13194
  default: {
13039
- const exhaustive = type;
13195
+ const exhaustive = offer;
13040
13196
  return exhaustive;
13041
13197
  }
13042
13198
  }
@@ -13054,6 +13210,58 @@ function renderOndoSide(side, branches) {
13054
13210
  }
13055
13211
  }
13056
13212
 
13213
+ // src/client/components/design-system/ThemedImage.tsx
13214
+ var import_jsx_runtime51 = require("react/jsx-runtime");
13215
+ function ThemedImage({
13216
+ light,
13217
+ dark,
13218
+ sizes,
13219
+ alt,
13220
+ width,
13221
+ height,
13222
+ className,
13223
+ style
13224
+ }) {
13225
+ const shared = { width, height, style };
13226
+ if (!dark) {
13227
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
13228
+ "img",
13229
+ {
13230
+ src: light.src,
13231
+ srcSet: light.srcSet,
13232
+ sizes: light.srcSet ? sizes : void 0,
13233
+ className,
13234
+ alt,
13235
+ ...shared
13236
+ }
13237
+ );
13238
+ }
13239
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_jsx_runtime51.Fragment, { children: [
13240
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
13241
+ "img",
13242
+ {
13243
+ src: light.src,
13244
+ srcSet: light.srcSet,
13245
+ sizes: light.srcSet ? sizes : void 0,
13246
+ className: cn("clcosdk-on-light", className),
13247
+ alt,
13248
+ ...shared
13249
+ }
13250
+ ),
13251
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
13252
+ "img",
13253
+ {
13254
+ src: dark.src,
13255
+ srcSet: dark.srcSet,
13256
+ sizes: dark.srcSet ? sizes : void 0,
13257
+ className: cn("clcosdk-on-dark", className),
13258
+ alt,
13259
+ ...shared
13260
+ }
13261
+ )
13262
+ ] });
13263
+ }
13264
+
13057
13265
  // src/client/components/offers/shared/offer-card-keyboard.ts
13058
13266
  function onOfferCardKeyDown(event, onClick) {
13059
13267
  if (event.key !== "Enter" && event.key !== " ") return;
@@ -13062,7 +13270,8 @@ function onOfferCardKeyDown(event, onClick) {
13062
13270
  }
13063
13271
 
13064
13272
  // src/client/components/offers/shared/OfferAssetCard.tsx
13065
- var import_jsx_runtime51 = require("react/jsx-runtime");
13273
+ var import_jsx_runtime52 = require("react/jsx-runtime");
13274
+ var LOGO_SIZES = "(min-width: 768px) 48px, 40px";
13066
13275
  function OfferAssetCard({
13067
13276
  offer,
13068
13277
  onClick,
@@ -13070,7 +13279,7 @@ function OfferAssetCard({
13070
13279
  containerClassName
13071
13280
  }) {
13072
13281
  const interactive = onClick !== void 0;
13073
- const card = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
13282
+ const card = /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
13074
13283
  "article",
13075
13284
  {
13076
13285
  className: cn(
@@ -13084,11 +13293,13 @@ function OfferAssetCard({
13084
13293
  tabIndex: interactive ? 0 : void 0,
13085
13294
  onClick,
13086
13295
  onKeyDown: interactive ? (event) => onOfferCardKeyDown(event, onClick) : void 0,
13087
- children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: "clcosdk:flex clcosdk:min-w-0 clcosdk:flex-1 clcosdk:items-center clcosdk:gap-2.5 clcosdk:pr-3 clcosdk:md:gap-3 clcosdk:md:pr-4", children: [
13088
- offer.logoUrl ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "clcosdk:h-10 clcosdk:w-10 clcosdk:shrink-0 clcosdk:overflow-hidden clcosdk:rounded-full clcosdk:md:h-12 clcosdk:md:w-12", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
13089
- "img",
13296
+ children: /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("div", { className: "clcosdk:flex clcosdk:min-w-0 clcosdk:flex-1 clcosdk:items-center clcosdk:gap-2.5 clcosdk:pr-3 clcosdk:md:gap-3 clcosdk:md:pr-4", children: [
13297
+ offer.logo ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "clcosdk:h-10 clcosdk:w-10 clcosdk:shrink-0 clcosdk:overflow-hidden clcosdk:rounded-full clcosdk:md:h-12 clcosdk:md:w-12", children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
13298
+ ThemedImage,
13090
13299
  {
13091
- src: offer.logoUrl,
13300
+ light: offer.logo.light,
13301
+ dark: offer.logo.dark ?? void 0,
13302
+ sizes: LOGO_SIZES,
13092
13303
  alt: "",
13093
13304
  width: 48,
13094
13305
  height: 48,
@@ -13096,8 +13307,8 @@ function OfferAssetCard({
13096
13307
  style: { maxWidth: "none", width: "100%", height: "100%" }
13097
13308
  }
13098
13309
  ) }) : null,
13099
- /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: "clcosdk:flex clcosdk:min-w-0 clcosdk:flex-1 clcosdk:flex-col clcosdk:items-start clcosdk:justify-center", children: [
13100
- offer.name ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
13310
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("div", { className: "clcosdk:flex clcosdk:min-w-0 clcosdk:flex-1 clcosdk:flex-col clcosdk:items-start clcosdk:justify-center", children: [
13311
+ offer.name ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
13101
13312
  "h2",
13102
13313
  {
13103
13314
  className: cn(
@@ -13106,13 +13317,13 @@ function OfferAssetCard({
13106
13317
  children: offer.name
13107
13318
  }
13108
13319
  ) : null,
13109
- offer.symbol ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("p", { className: "clcosdk:w-full clcosdk:truncate clcosdk:text-[13px] clcosdk:leading-[150%] clcosdk:font-normal clcosdk:text-text-secondary clcosdk:md:text-[14px]", children: offer.symbol }) : null
13320
+ offer.symbol ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("p", { className: "clcosdk:w-full clcosdk:truncate clcosdk:text-[13px] clcosdk:leading-[150%] clcosdk:font-normal clcosdk:text-text-secondary clcosdk:md:text-[14px]", children: offer.symbol }) : null
13110
13321
  ] })
13111
13322
  ] })
13112
13323
  }
13113
13324
  );
13114
- const wrapped = containerClassName ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: containerClassName, children: card }) : card;
13115
- return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(CoinListStyleScope, { children: wrapped });
13325
+ const wrapped = containerClassName ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: containerClassName, children: card }) : card;
13326
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(CoinListStyleScope, { children: wrapped });
13116
13327
  }
13117
13328
  function cardActionLabel(offer) {
13118
13329
  const parts = [offer.name, offer.symbol].filter(Boolean);
@@ -13120,7 +13331,7 @@ function cardActionLabel(offer) {
13120
13331
  }
13121
13332
 
13122
13333
  // src/client/components/offers/grid/OffersAssetGrid.tsx
13123
- var import_jsx_runtime52 = require("react/jsx-runtime");
13334
+ var import_jsx_runtime53 = require("react/jsx-runtime");
13124
13335
  var DEFAULT_MAX_COLUMNS = 3;
13125
13336
  function OffersAssetGrid({
13126
13337
  offers,
@@ -13135,14 +13346,14 @@ function OffersAssetGrid({
13135
13346
  );
13136
13347
  const maxGridWidth = `calc(${cols} * 20rem + ${Math.max(cols - 1, 0)} * 1.5rem)`;
13137
13348
  const interactive = onOfferClick !== void 0;
13138
- return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
13349
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
13139
13350
  "div",
13140
13351
  {
13141
13352
  className: cn(
13142
13353
  "clcosdk:flex clcosdk:w-full clcosdk:justify-center",
13143
13354
  containerClassName
13144
13355
  ),
13145
- children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
13356
+ children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
13146
13357
  "div",
13147
13358
  {
13148
13359
  className: cn(
@@ -13152,7 +13363,7 @@ function OffersAssetGrid({
13152
13363
  className
13153
13364
  ),
13154
13365
  style: { maxWidth: maxGridWidth },
13155
- children: offers.map((offer) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
13366
+ children: offers.map((offer) => /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
13156
13367
  OfferAssetCard,
13157
13368
  {
13158
13369
  offer,
@@ -13194,7 +13405,9 @@ function saleCardStatus({
13194
13405
  }
13195
13406
 
13196
13407
  // src/client/components/offers/shared/OfferSaleCard.tsx
13197
- var import_jsx_runtime53 = require("react/jsx-runtime");
13408
+ var import_jsx_runtime54 = require("react/jsx-runtime");
13409
+ var HEADER_LOGO_SIZES = "(min-width: 768px) 36px, 32px";
13410
+ var WATERMARK_SIZES = "(min-width: 768px) 20rem, 15rem";
13198
13411
  function OfferSaleCard({
13199
13412
  offer,
13200
13413
  onClick,
@@ -13209,7 +13422,8 @@ function OfferSaleCard({
13209
13422
  secondsLeft
13210
13423
  });
13211
13424
  const interactive = onClick !== void 0;
13212
- const card = /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(
13425
+ const logo = offer.logo ? offer.logo.dark ?? offer.logo.light : null;
13426
+ const card = /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
13213
13427
  "article",
13214
13428
  {
13215
13429
  className: cn(
@@ -13224,16 +13438,17 @@ function OfferSaleCard({
13224
13438
  onClick,
13225
13439
  onKeyDown: interactive ? (event) => onOfferCardKeyDown(event, onClick) : void 0,
13226
13440
  children: [
13227
- offer.logoUrl ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
13441
+ logo ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
13228
13442
  "div",
13229
13443
  {
13230
13444
  "aria-hidden": "true",
13231
13445
  className: "clcosdk:pointer-events-none clcosdk:absolute clcosdk:top-1/2 clcosdk:right-[-14%] clcosdk:z-0 clcosdk:size-[15rem] clcosdk:-translate-y-1/2 clcosdk:md:right-[-10%] clcosdk:md:size-[20rem]",
13232
13446
  style: { mixBlendMode: "overlay" },
13233
- children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
13234
- "img",
13447
+ children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
13448
+ ThemedImage,
13235
13449
  {
13236
- src: offer.logoUrl,
13450
+ light: logo,
13451
+ sizes: WATERMARK_SIZES,
13237
13452
  alt: "",
13238
13453
  className: "clcosdk:size-full clcosdk:rounded-full clcosdk:object-cover",
13239
13454
  style: { maxWidth: "none", width: "100%", height: "100%" }
@@ -13241,12 +13456,13 @@ function OfferSaleCard({
13241
13456
  )
13242
13457
  }
13243
13458
  ) : null,
13244
- /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className: "clcosdk:relative clcosdk:z-10 clcosdk:flex clcosdk:flex-col clcosdk:gap-2 clcosdk:md:gap-3", children: [
13245
- /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className: "clcosdk:flex clcosdk:min-w-0 clcosdk:items-center clcosdk:gap-2.5 clcosdk:md:gap-3", children: [
13246
- offer.logoUrl ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("div", { className: "clcosdk:h-8 clcosdk:w-8 clcosdk:shrink-0 clcosdk:overflow-hidden clcosdk:rounded-full clcosdk:md:h-9 clcosdk:md:w-9", children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
13247
- "img",
13459
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "clcosdk:relative clcosdk:z-10 clcosdk:flex clcosdk:flex-col clcosdk:gap-2 clcosdk:md:gap-3", children: [
13460
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "clcosdk:flex clcosdk:min-w-0 clcosdk:items-center clcosdk:gap-2.5 clcosdk:md:gap-3", children: [
13461
+ logo ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "clcosdk:h-8 clcosdk:w-8 clcosdk:shrink-0 clcosdk:overflow-hidden clcosdk:rounded-full clcosdk:md:h-9 clcosdk:md:w-9", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
13462
+ ThemedImage,
13248
13463
  {
13249
- src: offer.logoUrl,
13464
+ light: logo,
13465
+ sizes: HEADER_LOGO_SIZES,
13250
13466
  alt: "",
13251
13467
  width: 36,
13252
13468
  height: 36,
@@ -13254,7 +13470,7 @@ function OfferSaleCard({
13254
13470
  style: { maxWidth: "none", width: "100%", height: "100%" }
13255
13471
  }
13256
13472
  ) }) : null,
13257
- offer.name ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
13473
+ offer.name ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
13258
13474
  "h2",
13259
13475
  {
13260
13476
  className: cn(
@@ -13264,7 +13480,7 @@ function OfferSaleCard({
13264
13480
  }
13265
13481
  ) : null
13266
13482
  ] }),
13267
- offer.tagline ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
13483
+ offer.tagline ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
13268
13484
  "p",
13269
13485
  {
13270
13486
  className: cn(
@@ -13275,20 +13491,20 @@ function OfferSaleCard({
13275
13491
  }
13276
13492
  ) : null
13277
13493
  ] }),
13278
- /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className: "clcosdk:relative clcosdk:z-10 clcosdk:mt-auto clcosdk:flex clcosdk:h-11 clcosdk:w-full clcosdk:min-w-0 clcosdk:items-center clcosdk:justify-between clcosdk:gap-2 clcosdk:rounded-full clcosdk:border clcosdk:border-sale-card-chrome-border clcosdk:bg-sale-card-chrome-bg clcosdk:py-1.5 clcosdk:pr-1.5 clcosdk:pl-3 clcosdk:md:h-[54px] clcosdk:md:gap-3 clcosdk:md:py-2 clcosdk:md:pr-2 clcosdk:md:pl-4", children: [
13279
- /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className: "clcosdk:flex clcosdk:min-w-0 clcosdk:items-center clcosdk:gap-2 clcosdk:md:gap-3", children: [
13280
- status.phase === "live" ? /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(
13494
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "clcosdk:relative clcosdk:z-10 clcosdk:mt-auto clcosdk:flex clcosdk:h-11 clcosdk:w-full clcosdk:min-w-0 clcosdk:items-center clcosdk:justify-between clcosdk:gap-2 clcosdk:rounded-full clcosdk:border clcosdk:border-sale-card-chrome-border clcosdk:bg-sale-card-chrome-bg clcosdk:py-1.5 clcosdk:pr-1.5 clcosdk:pl-3 clcosdk:md:h-[54px] clcosdk:md:gap-3 clcosdk:md:py-2 clcosdk:md:pr-2 clcosdk:md:pl-4", children: [
13495
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "clcosdk:flex clcosdk:min-w-0 clcosdk:items-center clcosdk:gap-2 clcosdk:md:gap-3", children: [
13496
+ status.phase === "live" ? /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
13281
13497
  "span",
13282
13498
  {
13283
13499
  className: "clcosdk:relative clcosdk:inline-flex clcosdk:size-2 clcosdk:shrink-0",
13284
13500
  "aria-hidden": "true",
13285
13501
  children: [
13286
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("span", { className: "clcosdk-status-dot-ping clcosdk:absolute clcosdk:inset-0 clcosdk:rounded-full clcosdk:bg-positive" }),
13287
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("span", { className: "clcosdk:relative clcosdk:inline-flex clcosdk:size-full clcosdk:rounded-full clcosdk:bg-positive" })
13502
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { className: "clcosdk-status-dot-ping clcosdk:absolute clcosdk:inset-0 clcosdk:rounded-full clcosdk:bg-positive" }),
13503
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { className: "clcosdk:relative clcosdk:inline-flex clcosdk:size-full clcosdk:rounded-full clcosdk:bg-positive" })
13288
13504
  ]
13289
13505
  }
13290
13506
  ) : null,
13291
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
13507
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
13292
13508
  "p",
13293
13509
  {
13294
13510
  className: cn(
@@ -13299,7 +13515,7 @@ function OfferSaleCard({
13299
13515
  }
13300
13516
  )
13301
13517
  ] }),
13302
- /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(
13518
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
13303
13519
  "span",
13304
13520
  {
13305
13521
  className: cn(
@@ -13309,8 +13525,8 @@ function OfferSaleCard({
13309
13525
  "aria-hidden": "true",
13310
13526
  children: [
13311
13527
  "View",
13312
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("span", { className: "clcosdk:max-md:hidden", children: " offer" }),
13313
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_lucide_react13.ArrowRight, { className: "clcosdk:size-4", "aria-hidden": true })
13528
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { className: "clcosdk:max-md:hidden", children: " offer" }),
13529
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_lucide_react13.ArrowRight, { className: "clcosdk:size-4", "aria-hidden": true })
13314
13530
  ]
13315
13531
  }
13316
13532
  )
@@ -13318,8 +13534,8 @@ function OfferSaleCard({
13318
13534
  ]
13319
13535
  }
13320
13536
  );
13321
- const wrapped = containerClassName ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("div", { className: containerClassName, children: card }) : card;
13322
- return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(CoinListStyleScope, { children: wrapped });
13537
+ const wrapped = containerClassName ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: containerClassName, children: card }) : card;
13538
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(CoinListStyleScope, { children: wrapped });
13323
13539
  }
13324
13540
  var SALE_PHASE_LABEL = {
13325
13541
  upcoming: "Upcoming",
@@ -13332,10 +13548,10 @@ function cardActionLabel2(offer, phase) {
13332
13548
  }
13333
13549
 
13334
13550
  // src/client/components/offers/grid/OffersGridView.tsx
13335
- var import_jsx_runtime54 = require("react/jsx-runtime");
13551
+ var import_jsx_runtime55 = require("react/jsx-runtime");
13336
13552
  var DEFAULT_MAX_COLUMNS2 = 2;
13337
13553
  function OffersGridView(props) {
13338
- return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(OffersGridViewBody, { ...props }) });
13554
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(OffersGridViewBody, { ...props }) });
13339
13555
  }
13340
13556
  function OffersGridViewBody({
13341
13557
  state,
@@ -13349,13 +13565,13 @@ function OffersGridViewBody({
13349
13565
  }) {
13350
13566
  switch (state.type) {
13351
13567
  case "loading":
13352
- return loading ?? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(LoadingState, {});
13568
+ return loading ?? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(LoadingState, {});
13353
13569
  case "error":
13354
- return error ?? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(ErrorState, { message: state.message });
13570
+ return error ?? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(ErrorState, { message: state.message });
13355
13571
  case "empty":
13356
- return emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(EmptyState, {});
13572
+ return emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(EmptyState, {});
13357
13573
  case "content":
13358
- return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
13574
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
13359
13575
  OffersGridContent,
13360
13576
  {
13361
13577
  offers: state.offers,
@@ -13385,14 +13601,14 @@ function OffersGridContent({
13385
13601
  Math.max(1, maxColumns ?? DEFAULT_MAX_COLUMNS2)
13386
13602
  );
13387
13603
  const maxGridWidth = `calc(${cols} * 28rem + ${Math.max(cols - 1, 0)} * 1.5rem)`;
13388
- return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
13604
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
13389
13605
  "div",
13390
13606
  {
13391
13607
  className: cn(
13392
13608
  "clcosdk:flex clcosdk:w-full clcosdk:justify-center",
13393
13609
  containerClassName
13394
13610
  ),
13395
- children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
13611
+ children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
13396
13612
  "div",
13397
13613
  {
13398
13614
  className: cn(
@@ -13401,7 +13617,7 @@ function OffersGridContent({
13401
13617
  className
13402
13618
  ),
13403
13619
  style: { maxWidth: maxGridWidth },
13404
- children: offers.map((offer) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
13620
+ children: offers.map((offer) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
13405
13621
  OfferSaleCard,
13406
13622
  {
13407
13623
  offer,
@@ -13415,17 +13631,17 @@ function OffersGridContent({
13415
13631
  );
13416
13632
  }
13417
13633
  function LoadingState() {
13418
- return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
13634
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
13419
13635
  "output",
13420
13636
  {
13421
13637
  "aria-live": "polite",
13422
13638
  className: "clcosdk:flex clcosdk:min-h-40 clcosdk:items-center clcosdk:justify-center clcosdk:rounded-2xl clcosdk:border clcosdk:border-border clcosdk:bg-background clcosdk:p-6",
13423
- children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Loading offers..." })
13639
+ children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Loading offers..." })
13424
13640
  }
13425
13641
  );
13426
13642
  }
13427
13643
  function ErrorState({ message }) {
13428
- return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
13644
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
13429
13645
  AlertBanner,
13430
13646
  {
13431
13647
  variant: "error",
@@ -13436,13 +13652,13 @@ function ErrorState({ message }) {
13436
13652
  );
13437
13653
  }
13438
13654
  function EmptyState() {
13439
- return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
13655
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
13440
13656
  "output",
13441
13657
  {
13442
13658
  "aria-live": "polite",
13443
13659
  className: "clcosdk:flex clcosdk:min-h-40 clcosdk:flex-col clcosdk:items-center clcosdk:justify-center clcosdk:gap-2 clcosdk:rounded-2xl clcosdk:border clcosdk:border-border clcosdk:bg-background clcosdk:p-6 clcosdk:text-center",
13444
13660
  children: [
13445
- /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
13661
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
13446
13662
  "p",
13447
13663
  {
13448
13664
  className: cn(
@@ -13452,14 +13668,14 @@ function EmptyState() {
13452
13668
  children: "No offers available"
13453
13669
  }
13454
13670
  ),
13455
- /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { className: cn(typeClasses.subhead, "clcosdk:text-text-secondary"), children: "Check back soon for upcoming opportunities." })
13671
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("p", { className: cn(typeClasses.subhead, "clcosdk:text-text-secondary"), children: "Check back soon for upcoming opportunities." })
13456
13672
  ]
13457
13673
  }
13458
13674
  );
13459
13675
  }
13460
13676
 
13461
13677
  // src/client/hooks/offers/grid/useOffersGridViewModel.ts
13462
- var import_react37 = require("react");
13678
+ var import_react38 = require("react");
13463
13679
 
13464
13680
  // src/client/hooks/offers/data/useOffers.ts
13465
13681
  var import_react36 = require("react");
@@ -13517,36 +13733,147 @@ function useOffers(options = {}) {
13517
13733
  return { offersState };
13518
13734
  }
13519
13735
 
13736
+ // src/client/hooks/offers/shared/offer-logo.types.ts
13737
+ var CARD_LOGO_WIDTH = 96;
13738
+ var OfferLogoUi = {
13739
+ /**
13740
+ * The registry's logo for the token an offer is about, or the offer's own
13741
+ * artwork otherwise, or `null` when neither exists.
13742
+ *
13743
+ * The registry wins when both exist because it is the token's real artwork
13744
+ * where `Offer.logoUrl` is catalogue artwork, and because a swap publishes
13745
+ * without artwork more often than not - which is why `logoUrl` is `null`
13746
+ * on the swap variants.
13747
+ */
13748
+ fromOffer: (offer, tokenMetadata) => {
13749
+ const light = tokenMetadata ? logoImage(tokenMetadata.logo) : null;
13750
+ if (light !== null) {
13751
+ const dark = tokenMetadata?.logoDark ? logoImage(tokenMetadata.logoDark) : null;
13752
+ return { light, dark };
13753
+ }
13754
+ return offer.logoUrl ? { light: { src: offer.logoUrl }, dark: null } : null;
13755
+ }
13756
+ };
13757
+ function logoImage(logo) {
13758
+ const src = tokenLogoUrl(logo, CARD_LOGO_WIDTH);
13759
+ if (src === null) {
13760
+ return null;
13761
+ }
13762
+ const srcSet = tokenLogoSrcSet(logo);
13763
+ return srcSet === null ? { src } : { src, srcSet };
13764
+ }
13765
+
13520
13766
  // src/client/hooks/offers/shared/offer-sale-card.types.ts
13521
13767
  var OfferSaleCardUi = {
13522
- fromOffer: (offer) => ({
13768
+ /**
13769
+ * `tokenMetadata` is the registry's entry for the token the offer is about
13770
+ * (`TokenRegistrySnapshot.forOffer`), or `null` when it lists none. The
13771
+ * registry names win over the offer's own where both exist: they are the
13772
+ * token's canonical name and artwork, where the offer's are catalogue copy.
13773
+ */
13774
+ fromOffer: (offer, tokenMetadata = null) => ({
13523
13775
  id: offer.id,
13524
- tagline: offer.tagline,
13525
- logoUrl: offer.logoUrl,
13526
- startsAt: offer.startsAt,
13776
+ ...tokenMetadata ? { name: tokenMetadata.name } : {},
13777
+ ...saleWindow(offer),
13778
+ logo: OfferLogoUi.fromOffer(offer, tokenMetadata),
13527
13779
  endsAt: offer.endsAt
13528
13780
  }),
13529
- fromDetail: (detail) => ({
13781
+ fromDetail: (detail, tokenMetadata = null) => ({
13530
13782
  id: detail.id,
13531
- name: detail.name,
13532
- tagline: detail.tagline,
13533
- logoUrl: detail.logoUrl,
13534
- startsAt: detail.startsAt,
13783
+ name: tokenMetadata?.name ?? detail.name,
13784
+ ...saleWindow(detail),
13785
+ logo: OfferLogoUi.fromOffer(detail, tokenMetadata),
13535
13786
  endsAt: detail.endsAt
13536
13787
  })
13537
13788
  };
13789
+ function saleWindow(offer) {
13790
+ switch (offer.type) {
13791
+ case "coinlist::token_sale":
13792
+ case "superstate::swap":
13793
+ return { tagline: offer.tagline, startsAt: offer.startsAt };
13794
+ case "ondo::swap":
13795
+ return { tagline: null, startsAt: null };
13796
+ default: {
13797
+ const exhaustive = offer;
13798
+ return exhaustive;
13799
+ }
13800
+ }
13801
+ }
13802
+
13803
+ // src/client/hooks/shared/useTokenRegistry.ts
13804
+ var import_react37 = require("react");
13805
+ var DISABLED_STATE2 = { type: "DISABLED" };
13806
+ var LOADING_STATE4 = { type: "LOADING" };
13807
+ function useTokenRegistry(options = {}) {
13808
+ const { data, enabled = true } = options;
13809
+ const { coinlist, isReady } = useCoinList();
13810
+ const log = useLogger("useTokenRegistry");
13811
+ const [state, setState] = (0, import_react37.useState)(
13812
+ () => data !== void 0 ? { type: "CONTENT", registry: TokenRegistrySnapshot.fromTokens(data) } : LOADING_STATE4
13813
+ );
13814
+ const [refetchCount, setRefetchCount] = (0, import_react37.useState)(0);
13815
+ const refetch = (0, import_react37.useCallback)(() => {
13816
+ setRefetchCount((count) => count + 1);
13817
+ }, []);
13818
+ (0, import_react37.useEffect)(() => {
13819
+ let isCancelled = false;
13820
+ const seedActive = data !== void 0 && refetchCount === 0;
13821
+ if (!isReady || !enabled || seedActive) {
13822
+ return () => {
13823
+ isCancelled = true;
13824
+ };
13825
+ }
13826
+ setState(LOADING_STATE4);
13827
+ coinlist.tokens.list().then((tokens) => {
13828
+ if (!isCancelled) {
13829
+ log.debug(() => ({
13830
+ msg: "settled",
13831
+ fields: { state: "CONTENT", count: tokens.length }
13832
+ }));
13833
+ setState({
13834
+ type: "CONTENT",
13835
+ registry: TokenRegistrySnapshot.fromTokens(tokens)
13836
+ });
13837
+ }
13838
+ }).catch((error) => {
13839
+ if (!isCancelled) {
13840
+ log.failure(
13841
+ () => ({
13842
+ msg: "settled",
13843
+ fields: { state: "ERROR", reason: "generic-error" }
13844
+ }),
13845
+ error
13846
+ );
13847
+ setState({ type: "ERROR", reason: "generic-error" });
13848
+ }
13849
+ });
13850
+ return () => {
13851
+ isCancelled = true;
13852
+ };
13853
+ }, [coinlist, isReady, enabled, data, refetchCount, log]);
13854
+ return {
13855
+ // LOADING would be a lie while disabled: nothing is in flight and nothing
13856
+ // will replace it. Settled states (a seed, a previous answer) survive.
13857
+ state: !enabled && state.type === "LOADING" ? DISABLED_STATE2 : state,
13858
+ refetch
13859
+ };
13860
+ }
13538
13861
 
13539
13862
  // src/client/hooks/offers/grid/useOffersGridViewModel.ts
13540
13863
  var NOT_AUTHENTICATED_MESSAGE = "Sign in to view available offers.";
13541
13864
  var GENERIC_ERROR_MESSAGE = "Unable to load offers right now. Please try again.";
13542
13865
  function useOffersGridViewModel(options = {}) {
13543
13866
  const { data, onOfferClick, enabled = true } = options;
13544
- const { offersState } = useOffers({ data, enabled });
13545
- const state = (0, import_react37.useMemo)(
13546
- () => toUiState(offersState, onOfferClick !== void 0),
13547
- [offersState, onOfferClick]
13867
+ const { offersState } = useOffers({ data: data?.offers, enabled });
13868
+ const { state: registryState } = useTokenRegistry({
13869
+ data: data?.tokens,
13870
+ enabled
13871
+ });
13872
+ const state = (0, import_react38.useMemo)(
13873
+ () => toUiState(offersState, registryState, onOfferClick !== void 0),
13874
+ [offersState, registryState, onOfferClick]
13548
13875
  );
13549
- const onEvent = (0, import_react37.useCallback)(
13876
+ const onEvent = (0, import_react38.useCallback)(
13550
13877
  (event) => {
13551
13878
  switch (event.type) {
13552
13879
  case "ON_OFFER_CLICK": {
@@ -13569,7 +13896,7 @@ function useOffersGridViewModel(options = {}) {
13569
13896
  );
13570
13897
  return { state, onEvent };
13571
13898
  }
13572
- function toUiState(offersState, interactive) {
13899
+ function toUiState(offersState, registryState, interactive) {
13573
13900
  switch (offersState.type) {
13574
13901
  case "LOADING":
13575
13902
  return { type: "loading" };
@@ -13582,9 +13909,18 @@ function toUiState(offersState, interactive) {
13582
13909
  if (offersState.offers.length === 0) {
13583
13910
  return { type: "empty" };
13584
13911
  }
13912
+ if (registryState.type === "LOADING") {
13913
+ return { type: "loading" };
13914
+ }
13915
+ const registry = registryState.type === "CONTENT" ? registryState.registry : null;
13585
13916
  return {
13586
13917
  type: "content",
13587
- offers: offersState.offers.map(OfferSaleCardUi.fromOffer),
13918
+ offers: offersState.offers.map(
13919
+ (offer) => OfferSaleCardUi.fromOffer(
13920
+ offer,
13921
+ registry ? TokenRegistrySnapshot.forOffer(registry, offer) : null
13922
+ )
13923
+ ),
13588
13924
  interactive
13589
13925
  };
13590
13926
  }
@@ -13596,7 +13932,7 @@ function toUiState(offersState, interactive) {
13596
13932
  }
13597
13933
 
13598
13934
  // src/client/components/offers/grid/OffersGridContainer.tsx
13599
- var import_jsx_runtime55 = require("react/jsx-runtime");
13935
+ var import_jsx_runtime56 = require("react/jsx-runtime");
13600
13936
  function OffersGridContainer({
13601
13937
  data,
13602
13938
  onOfferClick,
@@ -13608,17 +13944,17 @@ function OffersGridContainer({
13608
13944
  onOfferClick,
13609
13945
  enabled
13610
13946
  });
13611
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(OffersGridView, { state, onEvent, ...viewProps });
13947
+ return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(OffersGridView, { state, onEvent, ...viewProps });
13612
13948
  }
13613
13949
 
13614
13950
  // src/client/components/requirements/ConnectedWalletList.tsx
13615
- var import_react38 = require("react");
13616
- var import_jsx_runtime56 = require("react/jsx-runtime");
13951
+ var import_react39 = require("react");
13952
+ var import_jsx_runtime57 = require("react/jsx-runtime");
13617
13953
  function ConnectedWalletRow({
13618
13954
  wallet,
13619
13955
  onRemove
13620
13956
  }) {
13621
- const [state, setState] = (0, import_react38.useState)("idle");
13957
+ const [state, setState] = (0, import_react39.useState)("idle");
13622
13958
  const remove = async () => {
13623
13959
  if (!onRemove) return;
13624
13960
  setState("removing");
@@ -13629,8 +13965,8 @@ function ConnectedWalletRow({
13629
13965
  setState("error");
13630
13966
  }
13631
13967
  };
13632
- return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { className: "clcosdk:flex clcosdk:min-h-9 clcosdk:flex-wrap clcosdk:items-center clcosdk:justify-between clcosdk:gap-2", children: [
13633
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
13968
+ return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "clcosdk:flex clcosdk:min-h-9 clcosdk:flex-wrap clcosdk:items-center clcosdk:justify-between clcosdk:gap-2", children: [
13969
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13634
13970
  "span",
13635
13971
  {
13636
13972
  title: wallet.address,
@@ -13641,16 +13977,16 @@ function ConnectedWalletRow({
13641
13977
  children: wallet.shortAddress
13642
13978
  }
13643
13979
  ),
13644
- onRemove != null && (state === "confirming" ? /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { className: "clcosdk:flex clcosdk:items-center clcosdk:gap-2", children: [
13645
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
13980
+ onRemove != null && (state === "confirming" ? /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "clcosdk:flex clcosdk:items-center clcosdk:gap-2", children: [
13981
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13646
13982
  "span",
13647
13983
  {
13648
13984
  className: cn(typeClasses.subhead, "clcosdk:text-text-secondary"),
13649
13985
  children: "Remove?"
13650
13986
  }
13651
13987
  ),
13652
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(ClButton, { size: "sm", variant: "destructive", onClick: remove, children: "Remove" }),
13653
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
13988
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(ClButton, { size: "sm", variant: "destructive", onClick: remove, children: "Remove" }),
13989
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13654
13990
  ClButton,
13655
13991
  {
13656
13992
  size: "sm",
@@ -13659,9 +13995,9 @@ function ConnectedWalletRow({
13659
13995
  children: "Cancel"
13660
13996
  }
13661
13997
  )
13662
- ] }) : state === "error" ? /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { className: "clcosdk:flex clcosdk:items-center clcosdk:gap-2", children: [
13663
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: cn(typeClasses.subhead, "clcosdk:text-error"), children: "Couldn't remove." }),
13664
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
13998
+ ] }) : state === "error" ? /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "clcosdk:flex clcosdk:items-center clcosdk:gap-2", children: [
13999
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: cn(typeClasses.subhead, "clcosdk:text-error"), children: "Couldn't remove." }),
14000
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13665
14001
  ClButton,
13666
14002
  {
13667
14003
  size: "sm",
@@ -13670,7 +14006,7 @@ function ConnectedWalletRow({
13670
14006
  children: "Try again"
13671
14007
  }
13672
14008
  )
13673
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
14009
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13674
14010
  ClButton,
13675
14011
  {
13676
14012
  size: "sm",
@@ -13683,7 +14019,7 @@ function ConnectedWalletRow({
13683
14019
  ] });
13684
14020
  }
13685
14021
  function ConnectedWalletList(props) {
13686
- return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(ConnectedWalletListBody, { ...props }) });
14022
+ return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(ConnectedWalletListBody, { ...props }) });
13687
14023
  }
13688
14024
  function ConnectedWalletListBody({
13689
14025
  wallets,
@@ -13693,18 +14029,18 @@ function ConnectedWalletListBody({
13693
14029
  status = "ready",
13694
14030
  className
13695
14031
  }) {
13696
- return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
14032
+ return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
13697
14033
  "div",
13698
14034
  {
13699
14035
  className: cn("clcosdk:flex clcosdk:flex-col clcosdk:gap-2", className),
13700
14036
  children: [
13701
- status === "loading" ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(AlertBanner, { variant: "info", content: "Loading your connected wallets\u2026" }) : status === "error" ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
14037
+ status === "loading" ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(AlertBanner, { variant: "info", content: "Loading your connected wallets\u2026" }) : status === "error" ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13702
14038
  AlertBanner,
13703
14039
  {
13704
14040
  variant: "error",
13705
14041
  content: "Couldn't load your connected wallets."
13706
14042
  }
13707
- ) : wallets.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(AlertBanner, { variant: "info", content: "No wallets connected yet." }) : /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:divide-y clcosdk:divide-divider", children: wallets.map((wallet) => /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
14043
+ ) : wallets.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(AlertBanner, { variant: "info", content: "No wallets connected yet." }) : /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:divide-y clcosdk:divide-divider", children: wallets.map((wallet) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13708
14044
  ConnectedWalletRow,
13709
14045
  {
13710
14046
  wallet,
@@ -13712,7 +14048,7 @@ function ConnectedWalletListBody({
13712
14048
  },
13713
14049
  wallet.id
13714
14050
  )) }),
13715
- onAdd != null && status !== "loading" && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
14051
+ onAdd != null && status !== "loading" && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13716
14052
  ClButton,
13717
14053
  {
13718
14054
  size: "sm",
@@ -13729,9 +14065,9 @@ function ConnectedWalletListBody({
13729
14065
 
13730
14066
  // src/client/components/requirements/identity-verification/IdentityVerificationView.tsx
13731
14067
  var import_websdk_react = __toESM(require("@sumsub/websdk-react"), 1);
13732
- var import_jsx_runtime57 = require("react/jsx-runtime");
14068
+ var import_jsx_runtime58 = require("react/jsx-runtime");
13733
14069
  function IdentityVerificationView(props) {
13734
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(IdentityVerificationViewBody, { ...props }) });
14070
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(IdentityVerificationViewBody, { ...props }) });
13735
14071
  }
13736
14072
  function IdentityVerificationViewBody({
13737
14073
  state,
@@ -13740,7 +14076,7 @@ function IdentityVerificationViewBody({
13740
14076
  }) {
13741
14077
  switch (state.type) {
13742
14078
  case "loading":
13743
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
14079
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
13744
14080
  "output",
13745
14081
  {
13746
14082
  "aria-live": "polite",
@@ -13748,11 +14084,11 @@ function IdentityVerificationViewBody({
13748
14084
  "clcosdk:flex clcosdk:min-h-40 clcosdk:items-center clcosdk:justify-center",
13749
14085
  className
13750
14086
  ),
13751
- children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Loading identity verification..." })
14087
+ children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Loading identity verification..." })
13752
14088
  }
13753
14089
  );
13754
14090
  case "error":
13755
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
14091
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
13756
14092
  "div",
13757
14093
  {
13758
14094
  className: cn(
@@ -13760,13 +14096,13 @@ function IdentityVerificationViewBody({
13760
14096
  className
13761
14097
  ),
13762
14098
  children: [
13763
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(AlertBanner, { variant: "error", icon: true, content: state.message }),
13764
- state.retryable && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(ClButton, { size: "sm", onClick: () => onEvent({ type: "ON_RETRY" }), children: "Try again" })
14099
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(AlertBanner, { variant: "error", icon: true, content: state.message }),
14100
+ state.retryable && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(ClButton, { size: "sm", onClick: () => onEvent({ type: "ON_RETRY" }), children: "Try again" })
13765
14101
  ]
13766
14102
  }
13767
14103
  );
13768
14104
  case "ready":
13769
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: cn("clcosdk:w-full", className), children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
14105
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: cn("clcosdk:w-full", className), children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
13770
14106
  import_websdk_react.default,
13771
14107
  {
13772
14108
  accessToken: state.accessToken,
@@ -13806,25 +14142,25 @@ function toError(error) {
13806
14142
  }
13807
14143
 
13808
14144
  // src/client/hooks/requirements/identity-verification/useIdentityVerificationViewModel.ts
13809
- var import_react40 = require("react");
14145
+ var import_react41 = require("react");
13810
14146
 
13811
14147
  // src/client/hooks/requirements/data/useKycToken.ts
13812
- var import_react39 = require("react");
14148
+ var import_react40 = require("react");
13813
14149
  var IDLE_STATE = { type: "IDLE" };
13814
- var LOADING_STATE4 = { type: "LOADING" };
14150
+ var LOADING_STATE5 = { type: "LOADING" };
13815
14151
  function useKycToken(levelName, reset) {
13816
14152
  const { coinlist } = useCoinList();
13817
14153
  const log = useLogger("useKycToken");
13818
- const [kycTokenState, setKycTokenState] = (0, import_react39.useState)(IDLE_STATE);
13819
- const resetPendingRef = (0, import_react39.useRef)(reset === true);
13820
- const tokenIssuedRef = (0, import_react39.useRef)(false);
13821
- (0, import_react39.useEffect)(() => {
14154
+ const [kycTokenState, setKycTokenState] = (0, import_react40.useState)(IDLE_STATE);
14155
+ const resetPendingRef = (0, import_react40.useRef)(reset === true);
14156
+ const tokenIssuedRef = (0, import_react40.useRef)(false);
14157
+ (0, import_react40.useEffect)(() => {
13822
14158
  if (!tokenIssuedRef.current) {
13823
14159
  resetPendingRef.current = reset === true;
13824
14160
  }
13825
14161
  }, [reset]);
13826
- const fetchToken = (0, import_react39.useCallback)(async () => {
13827
- setKycTokenState(LOADING_STATE4);
14162
+ const fetchToken = (0, import_react40.useCallback)(async () => {
14163
+ setKycTokenState(LOADING_STATE5);
13828
14164
  try {
13829
14165
  const kycToken = await coinlist.requirements.createKycToken({
13830
14166
  levelName,
@@ -13857,8 +14193,8 @@ var GENERIC_ERROR_MESSAGE2 = "Unable to start identity verification right now. P
13857
14193
  function useIdentityVerificationViewModel(options = {}) {
13858
14194
  const { levelName, reset, locale, onSubmitted, onError } = options;
13859
14195
  const { kycTokenState, fetchToken } = useKycToken(levelName, reset);
13860
- const fetchedRef = (0, import_react40.useRef)(false);
13861
- (0, import_react40.useEffect)(() => {
14196
+ const fetchedRef = (0, import_react41.useRef)(false);
14197
+ (0, import_react41.useEffect)(() => {
13862
14198
  if (fetchedRef.current) {
13863
14199
  return;
13864
14200
  }
@@ -13866,7 +14202,7 @@ function useIdentityVerificationViewModel(options = {}) {
13866
14202
  fetchToken().catch(() => {
13867
14203
  });
13868
14204
  }, [fetchToken]);
13869
- const state = (0, import_react40.useMemo)(() => {
14205
+ const state = (0, import_react41.useMemo)(() => {
13870
14206
  switch (kycTokenState.type) {
13871
14207
  case "IDLE":
13872
14208
  case "LOADING":
@@ -13892,7 +14228,7 @@ function useIdentityVerificationViewModel(options = {}) {
13892
14228
  }
13893
14229
  }
13894
14230
  }, [kycTokenState, locale, fetchToken]);
13895
- const onEvent = (0, import_react40.useCallback)(
14231
+ const onEvent = (0, import_react41.useCallback)(
13896
14232
  (event) => {
13897
14233
  switch (event.type) {
13898
14234
  case "ON_RETRY":
@@ -13917,7 +14253,7 @@ function useIdentityVerificationViewModel(options = {}) {
13917
14253
  }
13918
14254
 
13919
14255
  // src/client/components/requirements/identity-verification/IdentityVerificationContainer.tsx
13920
- var import_jsx_runtime58 = require("react/jsx-runtime");
14256
+ var import_jsx_runtime59 = require("react/jsx-runtime");
13921
14257
  function IdentityVerificationContainer({
13922
14258
  levelName,
13923
14259
  reset,
@@ -13933,7 +14269,7 @@ function IdentityVerificationContainer({
13933
14269
  onSubmitted,
13934
14270
  onError
13935
14271
  });
13936
- return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
14272
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13937
14273
  IdentityVerificationView,
13938
14274
  {
13939
14275
  state,
@@ -13948,7 +14284,7 @@ var import_lucide_react15 = require("lucide-react");
13948
14284
 
13949
14285
  // src/client/components/design-system/StepStatusIcon.tsx
13950
14286
  var import_lucide_react14 = require("lucide-react");
13951
- var import_jsx_runtime59 = require("react/jsx-runtime");
14287
+ var import_jsx_runtime60 = require("react/jsx-runtime");
13952
14288
  var statusConfig = {
13953
14289
  required: {
13954
14290
  Icon: import_lucide_react14.Info,
@@ -13973,7 +14309,7 @@ var statusConfig = {
13973
14309
  };
13974
14310
  function StepStatusIcon({ status, className }) {
13975
14311
  const { Icon, colorClass, fillClass } = statusConfig[status];
13976
- return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
14312
+ return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
13977
14313
  Icon,
13978
14314
  {
13979
14315
  className: cn(
@@ -13988,49 +14324,90 @@ function StepStatusIcon({ status, className }) {
13988
14324
  }
13989
14325
 
13990
14326
  // src/client/components/requirements/RequirementItem.tsx
13991
- var import_jsx_runtime60 = require("react/jsx-runtime");
14327
+ var import_jsx_runtime61 = require("react/jsx-runtime");
14328
+ var DEFAULT_PENDING = "Under review. We'll notify you when complete.";
14329
+ var DEFAULT_REJECTED = "Verification rejected.";
14330
+ var SUPPORT_LINK = "Contact support";
13992
14331
  function VerificationActionZone({
13993
14332
  status,
14333
+ statusMessages,
13994
14334
  onAction,
13995
14335
  onContactSupport
13996
14336
  }) {
13997
14337
  switch (status) {
13998
14338
  case "required":
13999
14339
  if (onAction === null) return null;
14000
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(ClButton, { size: "sm", onClick: onAction, children: "Continue" });
14340
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(ClButton, { size: "sm", className: "clcosdk:self-start", onClick: onAction, children: "Continue" });
14001
14341
  case "pending":
14002
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14342
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14003
14343
  AlertBanner,
14004
14344
  {
14005
14345
  variant: "warning",
14006
- content: "Under review. We'll notify you when complete."
14346
+ content: statusMessages?.pending ?? DEFAULT_PENDING
14007
14347
  }
14008
14348
  );
14009
14349
  case "completed":
14010
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(AlertBanner, { variant: "success", content: "Identity verified." });
14350
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14351
+ AlertBanner,
14352
+ {
14353
+ variant: "success",
14354
+ content: statusMessages?.completed ?? "Identity verified."
14355
+ }
14356
+ );
14011
14357
  case "rejected":
14012
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14358
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14013
14359
  AlertBanner,
14014
14360
  {
14015
14361
  variant: "error",
14016
- content: onContactSupport === null ? "Verification rejected." : /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(import_jsx_runtime60.Fragment, { children: [
14017
- "Verification rejected.",
14018
- " ",
14019
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14020
- "button",
14021
- {
14022
- type: "button",
14023
- onClick: onContactSupport,
14024
- className: "clcosdk:underline",
14025
- children: "Contact support"
14026
- }
14027
- ),
14028
- "."
14029
- ] })
14362
+ content: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14363
+ RejectedMessage,
14364
+ {
14365
+ message: statusMessages?.rejected ?? DEFAULT_REJECTED,
14366
+ onContactSupport
14367
+ }
14368
+ )
14030
14369
  }
14031
14370
  );
14032
14371
  }
14033
14372
  }
14373
+ function RejectedMessage({
14374
+ message,
14375
+ onContactSupport
14376
+ }) {
14377
+ const linkAt = message.indexOf(SUPPORT_LINK);
14378
+ if (onContactSupport == null) {
14379
+ return message;
14380
+ }
14381
+ if (linkAt === -1) {
14382
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_jsx_runtime61.Fragment, { children: [
14383
+ message,
14384
+ " ",
14385
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14386
+ "button",
14387
+ {
14388
+ type: "button",
14389
+ onClick: onContactSupport,
14390
+ className: "clcosdk:underline",
14391
+ children: SUPPORT_LINK
14392
+ }
14393
+ ),
14394
+ "."
14395
+ ] });
14396
+ }
14397
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_jsx_runtime61.Fragment, { children: [
14398
+ message.slice(0, linkAt),
14399
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14400
+ "button",
14401
+ {
14402
+ type: "button",
14403
+ onClick: onContactSupport,
14404
+ className: "clcosdk:underline",
14405
+ children: SUPPORT_LINK
14406
+ }
14407
+ ),
14408
+ message.slice(linkAt + SUPPORT_LINK.length)
14409
+ ] });
14410
+ }
14034
14411
  function WalletActionZone({
14035
14412
  status,
14036
14413
  multiWallet,
@@ -14040,8 +14417,8 @@ function WalletActionZone({
14040
14417
  onRemoveWallet
14041
14418
  }) {
14042
14419
  if (multiWallet) {
14043
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(import_jsx_runtime60.Fragment, { children: [
14044
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14420
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_jsx_runtime61.Fragment, { children: [
14421
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14045
14422
  ConnectedWalletList,
14046
14423
  {
14047
14424
  wallets: connectedWallets,
@@ -14050,7 +14427,7 @@ function WalletActionZone({
14050
14427
  status: walletsStatus
14051
14428
  }
14052
14429
  ),
14053
- status === "rejected" && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14430
+ status === "rejected" && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14054
14431
  AlertBanner,
14055
14432
  {
14056
14433
  variant: "error",
@@ -14061,21 +14438,30 @@ function WalletActionZone({
14061
14438
  }
14062
14439
  if (status === "completed") {
14063
14440
  const connected = connectedWallets[0];
14064
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(import_jsx_runtime60.Fragment, { children: [
14065
- onAction !== null && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(ClButton, { size: "sm", variant: "secondary", onClick: onAction, children: "Change wallet" }),
14066
- walletsStatus === "loading" ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14441
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_jsx_runtime61.Fragment, { children: [
14442
+ onAction !== null && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14443
+ ClButton,
14444
+ {
14445
+ size: "sm",
14446
+ variant: "secondary",
14447
+ className: "clcosdk:self-start",
14448
+ onClick: onAction,
14449
+ children: "Change wallet"
14450
+ }
14451
+ ),
14452
+ walletsStatus === "loading" ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14067
14453
  AlertBanner,
14068
14454
  {
14069
14455
  variant: "info",
14070
14456
  content: "Loading your connected wallet\u2026"
14071
14457
  }
14072
- ) : walletsStatus === "error" ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14458
+ ) : walletsStatus === "error" ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14073
14459
  AlertBanner,
14074
14460
  {
14075
14461
  variant: "error",
14076
14462
  content: "Couldn't load your connected wallet."
14077
14463
  }
14078
- ) : /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14464
+ ) : /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14079
14465
  AlertBanner,
14080
14466
  {
14081
14467
  variant: "success",
@@ -14085,9 +14471,9 @@ function WalletActionZone({
14085
14471
  ] });
14086
14472
  }
14087
14473
  if (status === "rejected") {
14088
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(import_jsx_runtime60.Fragment, { children: [
14089
- onAction !== null && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(ClButton, { size: "sm", onClick: onAction, children: "Connect wallet" }),
14090
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14474
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_jsx_runtime61.Fragment, { children: [
14475
+ onAction !== null && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(ClButton, { size: "sm", className: "clcosdk:self-start", onClick: onAction, children: "Connect wallet" }),
14476
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14091
14477
  AlertBanner,
14092
14478
  {
14093
14479
  variant: "error",
@@ -14097,7 +14483,7 @@ function WalletActionZone({
14097
14483
  ] });
14098
14484
  }
14099
14485
  if (onAction === null) return null;
14100
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(ClButton, { size: "sm", onClick: onAction, children: "Connect wallet" });
14486
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(ClButton, { size: "sm", className: "clcosdk:self-start", onClick: onAction, children: "Connect wallet" });
14101
14487
  }
14102
14488
  function RequirementItem({
14103
14489
  ui,
@@ -14107,9 +14493,10 @@ function RequirementItem({
14107
14493
  onAction,
14108
14494
  onRemoveWallet,
14109
14495
  walletsStatus,
14110
- onContactSupport
14496
+ onContactSupport,
14497
+ spaceBeforeNextRow = true
14111
14498
  }) {
14112
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
14499
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
14113
14500
  "div",
14114
14501
  {
14115
14502
  className: cn(
@@ -14117,17 +14504,17 @@ function RequirementItem({
14117
14504
  className
14118
14505
  ),
14119
14506
  children: [
14120
- /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
14507
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
14121
14508
  "button",
14122
14509
  {
14123
14510
  type: "button",
14124
14511
  onClick: onToggle,
14125
14512
  "aria-expanded": expanded,
14126
- className: "clcosdk:flex clcosdk:h-14 clcosdk:w-full clcosdk:cursor-pointer clcosdk:items-center clcosdk:justify-between clcosdk:rounded-2xl clcosdk:px-2 clcosdk:transition-colors clcosdk:hover:bg-surface",
14513
+ className: "clcosdk:-mx-2 clcosdk:flex clcosdk:h-14 clcosdk:w-[calc(100%+16px)] clcosdk:cursor-pointer clcosdk:items-center clcosdk:justify-between clcosdk:rounded-2xl clcosdk:px-2 clcosdk:transition-colors clcosdk:hover:bg-surface",
14127
14514
  children: [
14128
- /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("div", { className: "clcosdk:flex clcosdk:items-center clcosdk:gap-3", children: [
14129
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(StepStatusIcon, { status: ui.status }),
14130
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14515
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)("div", { className: "clcosdk:flex clcosdk:items-center clcosdk:gap-3", children: [
14516
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(StepStatusIcon, { status: ui.status }),
14517
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14131
14518
  "span",
14132
14519
  {
14133
14520
  className: cn(
@@ -14138,7 +14525,7 @@ function RequirementItem({
14138
14525
  }
14139
14526
  )
14140
14527
  ] }),
14141
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14528
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14142
14529
  import_lucide_react15.ChevronRight,
14143
14530
  {
14144
14531
  className: cn(
@@ -14151,43 +14538,53 @@ function RequirementItem({
14151
14538
  ]
14152
14539
  }
14153
14540
  ),
14154
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14541
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14155
14542
  "div",
14156
14543
  {
14157
14544
  className: cn(
14158
14545
  "clcosdk:grid clcosdk:transition-[grid-template-rows] clcosdk:duration-300 clcosdk:ease-in-out",
14159
14546
  expanded ? "clcosdk:grid-rows-[1fr]" : "clcosdk:grid-rows-[0fr]"
14160
14547
  ),
14161
- children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("div", { className: "clcosdk:min-h-0 clcosdk:overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-4 clcosdk:px-2 clcosdk:pb-4", children: [
14162
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14163
- "p",
14164
- {
14165
- className: cn(
14166
- typeClasses.subhead,
14167
- "clcosdk:text-text-secondary"
14548
+ children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { className: "clcosdk:min-h-0 clcosdk:overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
14549
+ "div",
14550
+ {
14551
+ className: cn(
14552
+ "clcosdk:flex clcosdk:flex-col clcosdk:gap-4",
14553
+ spaceBeforeNextRow && "clcosdk:pb-4"
14554
+ ),
14555
+ children: [
14556
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14557
+ "p",
14558
+ {
14559
+ className: cn(
14560
+ typeClasses.bodySm,
14561
+ "clcosdk:text-text-secondary"
14562
+ ),
14563
+ children: ui.description
14564
+ }
14168
14565
  ),
14169
- children: ui.description
14170
- }
14171
- ),
14172
- ui.variant === "verification" ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14173
- VerificationActionZone,
14174
- {
14175
- status: ui.status,
14176
- onAction,
14177
- onContactSupport
14178
- }
14179
- ) : /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
14180
- WalletActionZone,
14181
- {
14182
- status: ui.status,
14183
- multiWallet: ui.multiWallet,
14184
- connectedWallets: ui.connectedWallets,
14185
- walletsStatus,
14186
- onAction,
14187
- onRemoveWallet
14188
- }
14189
- )
14190
- ] }) })
14566
+ ui.variant === "verification" ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14567
+ VerificationActionZone,
14568
+ {
14569
+ status: ui.status,
14570
+ statusMessages: ui.statusMessages,
14571
+ onAction,
14572
+ onContactSupport
14573
+ }
14574
+ ) : /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14575
+ WalletActionZone,
14576
+ {
14577
+ status: ui.status,
14578
+ multiWallet: ui.multiWallet,
14579
+ connectedWallets: ui.connectedWallets,
14580
+ walletsStatus,
14581
+ onAction,
14582
+ onRemoveWallet
14583
+ }
14584
+ )
14585
+ ]
14586
+ }
14587
+ ) })
14191
14588
  }
14192
14589
  )
14193
14590
  ]
@@ -14196,35 +14593,29 @@ function RequirementItem({
14196
14593
  }
14197
14594
 
14198
14595
  // src/client/components/requirements/RequirementsChecklistView.tsx
14199
- var import_jsx_runtime61 = require("react/jsx-runtime");
14596
+ var import_jsx_runtime62 = require("react/jsx-runtime");
14200
14597
  function RequirementsChecklistView(props) {
14201
- return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(RequirementsChecklistViewBody, { ...props }) });
14598
+ return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(RequirementsChecklistViewBody, { ...props }) });
14202
14599
  }
14203
14600
  function RequirementsChecklistViewBody({
14204
14601
  state,
14205
14602
  onEvent,
14206
14603
  loading,
14207
14604
  error,
14208
- unauthenticatedState,
14209
14605
  className
14210
14606
  }) {
14211
14607
  switch (state.type) {
14212
14608
  case "loading":
14213
- return loading ?? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(LoadingState2, {});
14214
- case "not-authenticated":
14215
- return unauthenticatedState ?? null;
14216
- case "error":
14217
- return error ?? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14218
- AlertBanner,
14609
+ return loading ?? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14610
+ LoadingState2,
14219
14611
  {
14220
- variant: "error",
14221
- icon: true,
14222
- content: "Unable to load requirements right now. Please try again.",
14223
- className: "clcosdk:w-full clcosdk:max-w-[28rem]"
14612
+ title: state.title,
14613
+ description: state.description,
14614
+ className
14224
14615
  }
14225
14616
  );
14226
- case "content":
14227
- return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
14617
+ case "error":
14618
+ return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(
14228
14619
  "div",
14229
14620
  {
14230
14621
  className: cn(
@@ -14232,46 +14623,91 @@ function RequirementsChecklistViewBody({
14232
14623
  className
14233
14624
  ),
14234
14625
  children: [
14235
- /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-2", children: [
14236
- /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("h3", { className: cn(typeClasses.h3, "clcosdk:text-text-primary"), children: state.title }),
14237
- /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: state.description })
14238
- ] }),
14239
- /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:divide-y clcosdk:divide-divider", children: state.items.map((row) => /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14240
- RequirementItem,
14241
- {
14242
- ui: row.item,
14243
- expanded: row.expanded,
14244
- onToggle: () => onEvent({ type: "ON_TOGGLE_ITEM", requirementId: row.id }),
14245
- onAction: row.actionEnabled ? () => onEvent({
14246
- type: "ON_REQUIREMENT_ACTION",
14247
- requirementId: row.id
14248
- }) : null,
14249
- onRemoveWallet: row.wallets ? (id) => state.removeWallet(id) : void 0,
14250
- walletsStatus: row.wallets?.status,
14251
- onContactSupport: row.contactSupportEnabled ? () => onEvent({
14252
- type: "ON_CONTACT_SUPPORT",
14253
- requirementId: row.id
14254
- }) : null
14255
- },
14256
- row.id
14257
- )) }),
14258
- state.ineligible && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14626
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("h3", { className: cn(typeClasses.h3, "clcosdk:text-text-primary"), children: state.title }),
14627
+ error ?? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14259
14628
  AlertBanner,
14260
14629
  {
14261
14630
  variant: "error",
14262
14631
  icon: true,
14263
- content: "You are not eligible to participate."
14632
+ content: "Unable to load requirements. Refresh the page to try again."
14264
14633
  }
14265
- ),
14266
- state.continueAction && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14634
+ )
14635
+ ]
14636
+ }
14637
+ );
14638
+ case "content":
14639
+ return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(
14640
+ "div",
14641
+ {
14642
+ className: cn(
14643
+ "clcosdk:flex clcosdk:w-full clcosdk:flex-col clcosdk:gap-4",
14644
+ className
14645
+ ),
14646
+ children: [
14647
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-2", children: [
14648
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("h3", { className: cn(typeClasses.h3, "clcosdk:text-text-primary"), children: state.title }),
14649
+ state.blockedMessage == null && /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14650
+ "p",
14651
+ {
14652
+ className: cn(typeClasses.body, "clcosdk:text-text-secondary"),
14653
+ children: state.items.length === 0 ? "No requirements to complete." : state.description
14654
+ }
14655
+ )
14656
+ ] }),
14657
+ state.blockedMessage != null ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(AlertBanner, { variant: "info", icon: true, content: state.blockedMessage }) : state.items.length === 0 ? state.continueAction && /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14267
14658
  ClButton,
14268
14659
  {
14660
+ variant: "primary",
14269
14661
  fullWidth: true,
14270
14662
  disabled: !state.continueAction.enabled,
14271
14663
  onClick: () => onEvent({ type: "ON_CONTINUE" }),
14272
14664
  children: "Continue"
14273
14665
  }
14274
- )
14666
+ ) : /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_jsx_runtime62.Fragment, { children: [
14667
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:divide-y clcosdk:divide-divider", children: state.items.map((row, index) => /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14668
+ RequirementItem,
14669
+ {
14670
+ ui: row.item,
14671
+ expanded: row.expanded,
14672
+ spaceBeforeNextRow: index < state.items.length - 1,
14673
+ onToggle: () => onEvent({ type: "ON_TOGGLE_ITEM", requirementId: row.id }),
14674
+ onAction: row.actionEnabled ? () => onEvent({
14675
+ type: "ON_REQUIREMENT_ACTION",
14676
+ requirementId: row.id
14677
+ }) : null,
14678
+ onRemoveWallet: row.wallets ? (id) => state.removeWallet(id) : void 0,
14679
+ walletsStatus: row.wallets?.status,
14680
+ onContactSupport: row.contactSupportEnabled ? () => onEvent({
14681
+ type: "ON_CONTACT_SUPPORT",
14682
+ requirementId: row.id
14683
+ }) : null
14684
+ },
14685
+ row.id
14686
+ )) }),
14687
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-row clcosdk:items-center clcosdk:justify-between clcosdk:gap-6", children: [
14688
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14689
+ "span",
14690
+ {
14691
+ className: cn(
14692
+ typeClasses.subhead,
14693
+ "clcosdk:min-w-0",
14694
+ state.ineligible ? "clcosdk:text-error" : "clcosdk:text-text-secondary"
14695
+ ),
14696
+ children: state.ineligible ? "You are not eligible to invest." : completedLabel(state.items)
14697
+ }
14698
+ ),
14699
+ state.continueAction && /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14700
+ ClButton,
14701
+ {
14702
+ variant: "primary",
14703
+ disabled: !state.continueAction.enabled,
14704
+ onClick: () => onEvent({ type: "ON_CONTINUE" }),
14705
+ className: "clcosdk:shrink-0",
14706
+ children: "Continue"
14707
+ }
14708
+ )
14709
+ ] })
14710
+ ] })
14275
14711
  ]
14276
14712
  }
14277
14713
  );
@@ -14281,19 +14717,43 @@ function RequirementsChecklistViewBody({
14281
14717
  }
14282
14718
  }
14283
14719
  }
14284
- function LoadingState2() {
14285
- return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14286
- "output",
14720
+ function completedLabel(items) {
14721
+ const completed = items.filter(
14722
+ (row) => row.item.status === "completed"
14723
+ ).length;
14724
+ return `${completed}/${items.length} completed`;
14725
+ }
14726
+ var LOADING_ROW_WIDTHS = [
14727
+ "clcosdk:w-3/5",
14728
+ "clcosdk:w-2/5",
14729
+ "clcosdk:w-1/2"
14730
+ ];
14731
+ function LoadingState2({
14732
+ title: title2,
14733
+ description: description2,
14734
+ className
14735
+ }) {
14736
+ return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(
14737
+ "div",
14287
14738
  {
14288
- "aria-live": "polite",
14289
- className: "clcosdk:flex clcosdk:min-h-40 clcosdk:items-center clcosdk:justify-center clcosdk:rounded-2xl clcosdk:border clcosdk:border-border clcosdk:bg-background clcosdk:p-6",
14290
- children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Loading requirements..." })
14739
+ className: cn(
14740
+ "clcosdk:flex clcosdk:w-full clcosdk:flex-col clcosdk:gap-4",
14741
+ className
14742
+ ),
14743
+ children: [
14744
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("output", { className: "clcosdk:sr-only", children: "Loading requirements..." }),
14745
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-2", children: [
14746
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("h3", { className: cn(typeClasses.h3, "clcosdk:text-text-primary"), children: title2 }),
14747
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: description2 })
14748
+ ] }),
14749
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-3", children: LOADING_ROW_WIDTHS.map((width) => /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(Skeleton, { className: cn("clcosdk:h-8", width) }, width)) })
14750
+ ]
14291
14751
  }
14292
14752
  );
14293
14753
  }
14294
14754
 
14295
14755
  // src/client/components/requirements/tax-document/TaxDocumentModalView.tsx
14296
- var import_jsx_runtime62 = require("react/jsx-runtime");
14756
+ var import_jsx_runtime63 = require("react/jsx-runtime");
14297
14757
  function TaxDocumentModalView({
14298
14758
  state,
14299
14759
  onEvent,
@@ -14302,7 +14762,7 @@ function TaxDocumentModalView({
14302
14762
  if (state.type === "hidden") {
14303
14763
  return null;
14304
14764
  }
14305
- return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("div", { className: "clcosdk:fixed clcosdk:inset-0 clcosdk:z-50 clcosdk:flex clcosdk:items-center clcosdk:justify-center clcosdk:bg-black/50 clcosdk:p-4", children: /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(
14765
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: "clcosdk:fixed clcosdk:inset-0 clcosdk:z-50 clcosdk:flex clcosdk:items-center clcosdk:justify-center clcosdk:bg-black/50 clcosdk:p-4", children: /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(
14306
14766
  "div",
14307
14767
  {
14308
14768
  className: cn(
@@ -14310,11 +14770,11 @@ function TaxDocumentModalView({
14310
14770
  className
14311
14771
  ),
14312
14772
  children: [
14313
- /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "clcosdk:flex clcosdk:items-start clcosdk:justify-between clcosdk:gap-4", children: [
14314
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("h3", { className: cn(typeClasses.h3, "clcosdk:text-text-primary"), children: state.title }),
14315
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(CloseButton, { onClick: () => onEvent({ type: "ON_CLOSE" }) })
14773
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("div", { className: "clcosdk:flex clcosdk:items-start clcosdk:justify-between clcosdk:gap-4", children: [
14774
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("h3", { className: cn(typeClasses.h3, "clcosdk:text-text-primary"), children: state.title }),
14775
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(CloseButton, { onClick: () => onEvent({ type: "ON_CLOSE" }) })
14316
14776
  ] }),
14317
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(Screen, { screen: state.screen, onEvent })
14777
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Screen, { screen: state.screen, onEvent })
14318
14778
  ]
14319
14779
  }
14320
14780
  ) }) });
@@ -14325,11 +14785,11 @@ function Screen({
14325
14785
  }) {
14326
14786
  switch (screen.type) {
14327
14787
  case "loading":
14328
- return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(LoadingScreen, {});
14788
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(LoadingScreen, {});
14329
14789
  case "error":
14330
- return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(AlertBanner, { variant: "error", icon: true, content: screen.message });
14790
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(AlertBanner, { variant: "error", icon: true, content: screen.message });
14331
14791
  case "review":
14332
- return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14792
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14333
14793
  ReviewScreen,
14334
14794
  {
14335
14795
  fields: screen.fields,
@@ -14340,9 +14800,9 @@ function Screen({
14340
14800
  }
14341
14801
  );
14342
14802
  case "editing":
14343
- return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(EditScreen, { fields: screen.fields, onEvent });
14803
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(EditScreen, { fields: screen.fields, onEvent });
14344
14804
  case "sign-only":
14345
- return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14805
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14346
14806
  SignOnlyScreen,
14347
14807
  {
14348
14808
  signing: screen.signing,
@@ -14357,14 +14817,14 @@ function Screen({
14357
14817
  }
14358
14818
  }
14359
14819
  function LoadingScreen() {
14360
- return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14820
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14361
14821
  "output",
14362
14822
  {
14363
14823
  "aria-live": "polite",
14364
14824
  className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-4",
14365
- children: [0, 1, 2, 3, 4].map((row) => /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-1", children: [
14366
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("div", { className: "clcosdk:h-3 clcosdk:w-28 clcosdk:animate-pulse clcosdk:rounded clcosdk:bg-surface" }),
14367
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("div", { className: "clcosdk:h-5 clcosdk:w-48 clcosdk:animate-pulse clcosdk:rounded clcosdk:bg-surface" })
14825
+ children: [0, 1, 2, 3, 4].map((row) => /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-1", children: [
14826
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: "clcosdk:h-3 clcosdk:w-28 clcosdk:animate-pulse clcosdk:rounded clcosdk:bg-surface" }),
14827
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: "clcosdk:h-5 clcosdk:w-48 clcosdk:animate-pulse clcosdk:rounded clcosdk:bg-surface" })
14368
14828
  ] }, row))
14369
14829
  }
14370
14830
  );
@@ -14376,9 +14836,9 @@ function ReviewScreen({
14376
14836
  signError,
14377
14837
  onEvent
14378
14838
  }) {
14379
- return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
14380
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Review your information below. If anything looks incorrect, edit before signing." }),
14381
- piiUnavailable && /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14839
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
14840
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Review your information below. If anything looks incorrect, edit before signing." }),
14841
+ piiUnavailable && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14382
14842
  AlertBanner,
14383
14843
  {
14384
14844
  variant: "info",
@@ -14386,27 +14846,27 @@ function ReviewScreen({
14386
14846
  content: "We don't have this information on file yet \u2014 please fill it in below."
14387
14847
  }
14388
14848
  ),
14389
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-4 clcosdk:border-t clcosdk:border-divider clcosdk:pt-4", children: fields.map(({ field, label, displayValue }) => /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(
14849
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-4 clcosdk:border-t clcosdk:border-divider clcosdk:pt-4", children: fields.map(({ field, label, displayValue }) => /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(
14390
14850
  "div",
14391
14851
  {
14392
14852
  className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-1",
14393
14853
  children: [
14394
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14854
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14395
14855
  "span",
14396
14856
  {
14397
14857
  className: cn(typeClasses.label, "clcosdk:text-text-secondary"),
14398
14858
  children: label
14399
14859
  }
14400
14860
  ),
14401
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("span", { className: cn(typeClasses.body, "clcosdk:text-text-primary"), children: displayValue })
14861
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("span", { className: cn(typeClasses.body, "clcosdk:text-text-primary"), children: displayValue })
14402
14862
  ]
14403
14863
  },
14404
14864
  field
14405
14865
  )) }),
14406
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("p", { className: cn(typeClasses.caption, "clcosdk:text-text-secondary"), children: "By signing, you certify that the information above is accurate and that you are the beneficial owner of the income this form relates to. This document cannot be edited once signed." }),
14407
- signError && /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(AlertBanner, { variant: "error", icon: true, content: signError }),
14408
- /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-2", children: [
14409
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14866
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("p", { className: cn(typeClasses.caption, "clcosdk:text-text-secondary"), children: "By signing, you certify that the information above is accurate and that you are the beneficial owner of the income this form relates to. This document cannot be edited once signed." }),
14867
+ signError && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(AlertBanner, { variant: "error", icon: true, content: signError }),
14868
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-2", children: [
14869
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14410
14870
  ClButton,
14411
14871
  {
14412
14872
  fullWidth: true,
@@ -14416,7 +14876,7 @@ function ReviewScreen({
14416
14876
  children: "Sign W-8BEN"
14417
14877
  }
14418
14878
  ),
14419
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14879
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14420
14880
  ClButton,
14421
14881
  {
14422
14882
  fullWidth: true,
@@ -14433,20 +14893,20 @@ function EditScreen({
14433
14893
  fields,
14434
14894
  onEvent
14435
14895
  }) {
14436
- return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
14437
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-4 clcosdk:border-t clcosdk:border-divider clcosdk:pt-4", children: fields.map(({ field, label, placeholder, value }) => /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(
14896
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
14897
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-4 clcosdk:border-t clcosdk:border-divider clcosdk:pt-4", children: fields.map(({ field, label, placeholder, value }) => /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(
14438
14898
  "label",
14439
14899
  {
14440
14900
  className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-1",
14441
14901
  children: [
14442
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14902
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14443
14903
  "span",
14444
14904
  {
14445
14905
  className: cn(typeClasses.label, "clcosdk:text-text-secondary"),
14446
14906
  children: label
14447
14907
  }
14448
14908
  ),
14449
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14909
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14450
14910
  "input",
14451
14911
  {
14452
14912
  type: "text",
@@ -14467,9 +14927,9 @@ function EditScreen({
14467
14927
  },
14468
14928
  field
14469
14929
  )) }),
14470
- /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-2", children: [
14471
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(ClButton, { fullWidth: true, onClick: () => onEvent({ type: "ON_SAVE_EDIT" }), children: "Save & review" }),
14472
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14930
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-2", children: [
14931
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(ClButton, { fullWidth: true, onClick: () => onEvent({ type: "ON_SAVE_EDIT" }), children: "Save & review" }),
14932
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14473
14933
  ClButton,
14474
14934
  {
14475
14935
  fullWidth: true,
@@ -14486,10 +14946,10 @@ function SignOnlyScreen({
14486
14946
  signError,
14487
14947
  onEvent
14488
14948
  }) {
14489
- return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
14490
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "As an entity investor, you must complete a W-8BEN-E to confirm your foreign tax status and claim applicable treaty benefits. You'll receive an email to complete the signing." }),
14491
- signError && /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(AlertBanner, { variant: "error", icon: true, content: signError }),
14492
- /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14949
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
14950
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "As an entity investor, you must complete a W-8BEN-E to confirm your foreign tax status and claim applicable treaty benefits. You'll receive an email to complete the signing." }),
14951
+ signError && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(AlertBanner, { variant: "error", icon: true, content: signError }),
14952
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14493
14953
  ClButton,
14494
14954
  {
14495
14955
  fullWidth: true,
@@ -14503,12 +14963,12 @@ function SignOnlyScreen({
14503
14963
  }
14504
14964
 
14505
14965
  // src/client/hooks/requirements/tax-document/useTaxDocumentModalViewModel.ts
14506
- var import_react42 = require("react");
14966
+ var import_react43 = require("react");
14507
14967
 
14508
14968
  // src/client/hooks/requirements/data/useTaxDocument.ts
14509
- var import_react41 = require("react");
14969
+ var import_react42 = require("react");
14510
14970
  var IDLE_SIGN = { type: "idle", error: null };
14511
- var LOADING_STATE5 = { type: "LOADING" };
14971
+ var LOADING_STATE6 = { type: "LOADING" };
14512
14972
  var SIGN_FAILED_MESSAGE = "Unable to sign document. Please try again.";
14513
14973
  var DOB_INVALID_MESSAGE = "Enter your date of birth as MM/DD/YYYY.";
14514
14974
  var FIELD_KEYS = {
@@ -14581,8 +15041,8 @@ function useTaxDocument({
14581
15041
  }) {
14582
15042
  const { coinlist, isReady } = useCoinList();
14583
15043
  const log = useLogger("useTaxDocument");
14584
- const [state, setState] = (0, import_react41.useState)(LOADING_STATE5);
14585
- (0, import_react41.useEffect)(() => {
15044
+ const [state, setState] = (0, import_react42.useState)(LOADING_STATE6);
15045
+ (0, import_react42.useEffect)(() => {
14586
15046
  let isCancelled = false;
14587
15047
  if (!isOpen) {
14588
15048
  return () => {
@@ -14590,12 +15050,12 @@ function useTaxDocument({
14590
15050
  };
14591
15051
  }
14592
15052
  if (!isReady) {
14593
- setState(LOADING_STATE5);
15053
+ setState(LOADING_STATE6);
14594
15054
  return () => {
14595
15055
  isCancelled = true;
14596
15056
  };
14597
15057
  }
14598
- setState(LOADING_STATE5);
15058
+ setState(LOADING_STATE6);
14599
15059
  coinlist.requirements.getPii().then((pii) => {
14600
15060
  if (isCancelled) return;
14601
15061
  if (pii.kind === "company") {
@@ -14623,7 +15083,7 @@ function useTaxDocument({
14623
15083
  isCancelled = true;
14624
15084
  };
14625
15085
  }, [coinlist, isReady, isOpen, log]);
14626
- const onEditField = (0, import_react41.useCallback)(
15086
+ const onEditField = (0, import_react42.useCallback)(
14627
15087
  (field, value) => {
14628
15088
  setState(
14629
15089
  (prev) => prev.type === "EDITING" ? { ...prev, fields: { ...prev.fields, [field]: value } } : prev
@@ -14631,7 +15091,7 @@ function useTaxDocument({
14631
15091
  },
14632
15092
  []
14633
15093
  );
14634
- const onStartEdit = (0, import_react41.useCallback)(() => {
15094
+ const onStartEdit = (0, import_react42.useCallback)(() => {
14635
15095
  setState(
14636
15096
  (prev) => prev.type === "REVIEW" ? {
14637
15097
  type: "EDITING",
@@ -14642,7 +15102,7 @@ function useTaxDocument({
14642
15102
  } : prev
14643
15103
  );
14644
15104
  }, []);
14645
- const onSaveEdit = (0, import_react41.useCallback)(() => {
15105
+ const onSaveEdit = (0, import_react42.useCallback)(() => {
14646
15106
  setState(
14647
15107
  (prev) => prev.type === "EDITING" ? {
14648
15108
  type: "REVIEW",
@@ -14653,7 +15113,7 @@ function useTaxDocument({
14653
15113
  } : prev
14654
15114
  );
14655
15115
  }, []);
14656
- const onCancelEdit = (0, import_react41.useCallback)(() => {
15116
+ const onCancelEdit = (0, import_react42.useCallback)(() => {
14657
15117
  setState(
14658
15118
  (prev) => prev.type === "EDITING" ? {
14659
15119
  type: "REVIEW",
@@ -14664,7 +15124,7 @@ function useTaxDocument({
14664
15124
  } : prev
14665
15125
  );
14666
15126
  }, []);
14667
- const onSign = (0, import_react41.useCallback)(() => {
15127
+ const onSign = (0, import_react42.useCallback)(() => {
14668
15128
  if (state.type !== "REVIEW" && state.type !== "SIGN_ONLY") return;
14669
15129
  if (state.type === "REVIEW" && state.fields.dob.trim() !== "" && !isValidUsDate(state.fields.dob)) {
14670
15130
  setState({
@@ -14706,19 +15166,19 @@ function useTaxDocumentModalViewModel({
14706
15166
  onSubmitted
14707
15167
  }) {
14708
15168
  const { state, onEditField, onStartEdit, onSaveEdit, onCancelEdit, onSign } = useTaxDocument({ isOpen });
14709
- (0, import_react42.useEffect)(() => {
15169
+ (0, import_react43.useEffect)(() => {
14710
15170
  if (state.type === "SUBMITTED") {
14711
15171
  onSubmitted?.(state.submission);
14712
15172
  onClose();
14713
15173
  }
14714
15174
  }, [state]);
14715
- const uiState = (0, import_react42.useMemo)(() => {
15175
+ const uiState = (0, import_react43.useMemo)(() => {
14716
15176
  if (!isOpen || state.type === "SUBMITTED") {
14717
15177
  return { type: "hidden" };
14718
15178
  }
14719
15179
  return { type: "content", title: toTitle(state), screen: toScreen(state) };
14720
15180
  }, [isOpen, state]);
14721
- const onEvent = (0, import_react42.useCallback)(
15181
+ const onEvent = (0, import_react43.useCallback)(
14722
15182
  (event) => {
14723
15183
  switch (event.type) {
14724
15184
  case "ON_CLOSE":
@@ -14801,7 +15261,7 @@ function toFieldsUi(fields) {
14801
15261
  }
14802
15262
 
14803
15263
  // src/client/components/requirements/tax-document/TaxDocumentModalContainer.tsx
14804
- var import_jsx_runtime63 = require("react/jsx-runtime");
15264
+ var import_jsx_runtime64 = require("react/jsx-runtime");
14805
15265
  function TaxDocumentModalContainer({
14806
15266
  isOpen,
14807
15267
  onClose,
@@ -14813,7 +15273,7 @@ function TaxDocumentModalContainer({
14813
15273
  onClose,
14814
15274
  onSubmitted
14815
15275
  });
14816
- return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
15276
+ return /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
14817
15277
  TaxDocumentModalView,
14818
15278
  {
14819
15279
  state,
@@ -14824,26 +15284,26 @@ function TaxDocumentModalContainer({
14824
15284
  }
14825
15285
 
14826
15286
  // src/client/components/requirements/VerificationOverlay.tsx
14827
- var import_jsx_runtime64 = require("react/jsx-runtime");
15287
+ var import_jsx_runtime65 = require("react/jsx-runtime");
14828
15288
  function VerificationOverlay({
14829
15289
  onClose,
14830
15290
  children
14831
15291
  }) {
14832
- return /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(VerificationOverlayBody, { onClose, children }) });
15292
+ return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(VerificationOverlayBody, { onClose, children }) });
14833
15293
  }
14834
15294
  function VerificationOverlayBody({
14835
15295
  onClose,
14836
15296
  children
14837
15297
  }) {
14838
- return /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
15298
+ return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14839
15299
  "div",
14840
15300
  {
14841
15301
  role: "dialog",
14842
15302
  "aria-modal": "true",
14843
15303
  "aria-label": "Identity verification",
14844
15304
  className: "clcosdk:fixed clcosdk:inset-0 clcosdk:z-50 clcosdk:flex clcosdk:items-center clcosdk:justify-center clcosdk:bg-overlay clcosdk:p-4",
14845
- children: /* @__PURE__ */ (0, import_jsx_runtime64.jsxs)("div", { className: "clcosdk:relative clcosdk:flex clcosdk:max-h-[92vh] clcosdk:w-full clcosdk:max-w-[760px] clcosdk:flex-col clcosdk:overflow-y-auto clcosdk:rounded-2xl clcosdk:bg-background clcosdk:p-6 clcosdk:pt-14", children: [
14846
- /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
15305
+ children: /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "clcosdk:relative clcosdk:flex clcosdk:max-h-[92vh] clcosdk:w-full clcosdk:max-w-[760px] clcosdk:flex-col clcosdk:overflow-y-auto clcosdk:rounded-2xl clcosdk:bg-background clcosdk:p-6 clcosdk:pt-14", children: [
15306
+ /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14847
15307
  CloseButton,
14848
15308
  {
14849
15309
  onClick: onClose,
@@ -14857,18 +15317,18 @@ function VerificationOverlayBody({
14857
15317
  }
14858
15318
 
14859
15319
  // src/client/components/requirements/wallet/ConnectWalletModalView.tsx
14860
- var import_react43 = require("react");
14861
- var import_jsx_runtime65 = require("react/jsx-runtime");
15320
+ var import_react44 = require("react");
15321
+ var import_jsx_runtime66 = require("react/jsx-runtime");
14862
15322
  function ConnectWalletModalView({
14863
15323
  state,
14864
15324
  onEvent,
14865
15325
  className
14866
15326
  }) {
14867
- const titleId = (0, import_react43.useId)();
15327
+ const titleId = (0, import_react44.useId)();
14868
15328
  if (state.type === "hidden") {
14869
15329
  return null;
14870
15330
  }
14871
- return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: "clcosdk:fixed clcosdk:inset-0 clcosdk:z-50 clcosdk:flex clcosdk:items-center clcosdk:justify-center clcosdk:bg-black/50 clcosdk:p-4", children: /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
15331
+ return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(CoinListStyleScope, { children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { className: "clcosdk:fixed clcosdk:inset-0 clcosdk:z-50 clcosdk:flex clcosdk:items-center clcosdk:justify-center clcosdk:bg-black/50 clcosdk:p-4", children: /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
14872
15332
  "div",
14873
15333
  {
14874
15334
  role: "dialog",
@@ -14879,8 +15339,8 @@ function ConnectWalletModalView({
14879
15339
  className
14880
15340
  ),
14881
15341
  children: [
14882
- /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "clcosdk:flex clcosdk:items-start clcosdk:justify-between clcosdk:gap-4", children: [
14883
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
15342
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { className: "clcosdk:flex clcosdk:items-start clcosdk:justify-between clcosdk:gap-4", children: [
15343
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14884
15344
  "h3",
14885
15345
  {
14886
15346
  id: titleId,
@@ -14888,9 +15348,9 @@ function ConnectWalletModalView({
14888
15348
  children: "Connect your wallet"
14889
15349
  }
14890
15350
  ),
14891
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(CloseButton, { onClick: () => onEvent({ type: "ON_CLOSE" }) })
15351
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(CloseButton, { onClick: () => onEvent({ type: "ON_CLOSE" }) })
14892
15352
  ] }),
14893
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
15353
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14894
15354
  Screen2,
14895
15355
  {
14896
15356
  screen: state.screen,
@@ -14909,9 +15369,9 @@ function Screen2({
14909
15369
  }) {
14910
15370
  switch (screen.type) {
14911
15371
  case "needs-wallet":
14912
- return /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
14913
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Connect an external wallet to prove ownership and bind it to this offer." }),
14914
- canRequestConnect && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
15372
+ return /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
15373
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Connect an external wallet to prove ownership and bind it to this offer." }),
15374
+ canRequestConnect && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14915
15375
  ClButton,
14916
15376
  {
14917
15377
  fullWidth: true,
@@ -14921,23 +15381,23 @@ function Screen2({
14921
15381
  )
14922
15382
  ] });
14923
15383
  case "ready":
14924
- return /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
14925
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Sign a message with your connected wallet to prove you own it. This does not cost gas or move any funds." }),
14926
- /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-1 clcosdk:border-t clcosdk:border-divider clcosdk:pt-4", children: [
14927
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
15384
+ return /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
15385
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Sign a message with your connected wallet to prove you own it. This does not cost gas or move any funds." }),
15386
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-1 clcosdk:border-t clcosdk:border-divider clcosdk:pt-4", children: [
15387
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14928
15388
  "span",
14929
15389
  {
14930
15390
  className: cn(typeClasses.label, "clcosdk:text-text-secondary"),
14931
15391
  children: "Wallet address"
14932
15392
  }
14933
15393
  ),
14934
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("span", { className: cn(typeClasses.body, "clcosdk:text-text-primary"), children: screen.shortAddress })
15394
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("span", { className: cn(typeClasses.body, "clcosdk:text-text-primary"), children: screen.shortAddress })
14935
15395
  ] }),
14936
15396
  screen.signError && // Live region: the error is inserted async after a failed attempt,
14937
15397
  // so screen readers need it announced rather than silently
14938
15398
  // rendered.
14939
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { role: "alert", children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(AlertBanner, { variant: "error", icon: true, content: screen.signError }) }),
14940
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
15399
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { role: "alert", children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(AlertBanner, { variant: "error", icon: true, content: screen.signError }) }),
15400
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14941
15401
  ClButton,
14942
15402
  {
14943
15403
  fullWidth: true,
@@ -14948,7 +15408,7 @@ function Screen2({
14948
15408
  children: "Sign & connect"
14949
15409
  }
14950
15410
  ),
14951
- canRequestConnect && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
15411
+ canRequestConnect && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14952
15412
  ClButton,
14953
15413
  {
14954
15414
  fullWidth: true,
@@ -14967,10 +15427,10 @@ function Screen2({
14967
15427
  }
14968
15428
 
14969
15429
  // src/client/hooks/requirements/wallet/useConnectWalletModalViewModel.ts
14970
- var import_react45 = require("react");
15430
+ var import_react46 = require("react");
14971
15431
 
14972
15432
  // src/client/hooks/requirements/data/useConnectWallet.ts
14973
- var import_react44 = require("react");
15433
+ var import_react45 = require("react");
14974
15434
 
14975
15435
  // src/client/core/wallets/connect-external-wallet.ts
14976
15436
  var DEFAULT_STATEMENT = "Sign this message to prove you own this wallet. This does not cost gas or move funds.";
@@ -15101,24 +15561,24 @@ function useConnectWallet({
15101
15561
  statement
15102
15562
  }) {
15103
15563
  const { coinlist } = useCoinList();
15104
- const [state, setState] = (0, import_react44.useState)(
15564
+ const [state, setState] = (0, import_react45.useState)(
15105
15565
  () => wallet ? { type: "READY", address: wallet.address, sign: IDLE_SIGN2 } : { type: "NEEDS_WALLET" }
15106
15566
  );
15107
- const attempt = (0, import_react44.useRef)(0);
15108
- (0, import_react44.useEffect)(() => {
15567
+ const attempt = (0, import_react45.useRef)(0);
15568
+ (0, import_react45.useEffect)(() => {
15109
15569
  attempt.current += 1;
15110
15570
  if (!isOpen) return;
15111
15571
  setState(
15112
15572
  wallet ? { type: "READY", address: wallet.address, sign: IDLE_SIGN2 } : { type: "NEEDS_WALLET" }
15113
15573
  );
15114
15574
  }, [isOpen, wallet?.address]);
15115
- (0, import_react44.useEffect)(
15575
+ (0, import_react45.useEffect)(
15116
15576
  () => () => {
15117
15577
  attempt.current += 1;
15118
15578
  },
15119
15579
  []
15120
15580
  );
15121
- const onSign = (0, import_react44.useCallback)(() => {
15581
+ const onSign = (0, import_react45.useCallback)(() => {
15122
15582
  if (!wallet || state.type !== "READY") return;
15123
15583
  attempt.current += 1;
15124
15584
  const gen = attempt.current;
@@ -15180,13 +15640,13 @@ function useConnectWalletModalViewModel({
15180
15640
  challengeType,
15181
15641
  statement
15182
15642
  });
15183
- (0, import_react45.useEffect)(() => {
15643
+ (0, import_react46.useEffect)(() => {
15184
15644
  if (state.type === "CONNECTED") {
15185
15645
  onConnected?.(state.binding);
15186
15646
  onClose();
15187
15647
  }
15188
15648
  }, [state]);
15189
- const uiState = (0, import_react45.useMemo)(() => {
15649
+ const uiState = (0, import_react46.useMemo)(() => {
15190
15650
  if (!isOpen || state.type === "CONNECTED") {
15191
15651
  return { type: "hidden" };
15192
15652
  }
@@ -15211,7 +15671,7 @@ function useConnectWalletModalViewModel({
15211
15671
  canRequestConnect
15212
15672
  };
15213
15673
  }, [isOpen, state, onRequestConnect]);
15214
- const onEvent = (0, import_react45.useCallback)(
15674
+ const onEvent = (0, import_react46.useCallback)(
15215
15675
  (event) => {
15216
15676
  switch (event.type) {
15217
15677
  case "ON_CLOSE":
@@ -15235,13 +15695,13 @@ function useConnectWalletModalViewModel({
15235
15695
  }
15236
15696
 
15237
15697
  // src/client/components/requirements/wallet/ConnectWalletModalContainer.tsx
15238
- var import_jsx_runtime66 = require("react/jsx-runtime");
15698
+ var import_jsx_runtime67 = require("react/jsx-runtime");
15239
15699
  function ConnectWalletModalContainer({
15240
15700
  className,
15241
15701
  ...options
15242
15702
  }) {
15243
15703
  const { state, onEvent } = useConnectWalletModalViewModel(options);
15244
- return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
15704
+ return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
15245
15705
  ConnectWalletModalView,
15246
15706
  {
15247
15707
  state,
@@ -15252,11 +15712,11 @@ function ConnectWalletModalContainer({
15252
15712
  }
15253
15713
 
15254
15714
  // src/client/hooks/requirements/useRequirementsChecklistViewModel.ts
15255
- var import_react48 = require("react");
15715
+ var import_react49 = require("react");
15256
15716
 
15257
15717
  // src/client/hooks/requirements/data/useOptionAddresses.ts
15258
- var import_react46 = require("react");
15259
- var LOADING_STATE6 = { type: "LOADING" };
15718
+ var import_react47 = require("react");
15719
+ var LOADING_STATE7 = { type: "LOADING" };
15260
15720
  var EMPTY_STATE = {
15261
15721
  type: "CONTENT",
15262
15722
  addresses: []
@@ -15265,19 +15725,19 @@ function useOptionAddresses(offerId, offerOptionId, options = {}) {
15265
15725
  const { coinlist, isReady } = useCoinList();
15266
15726
  const log = useLogger("useOptionAddresses");
15267
15727
  const { data, enabled = true } = options;
15268
- const [addressesState, setAddressesState] = (0, import_react46.useState)(
15269
- data !== void 0 ? { type: "CONTENT", addresses: data } : LOADING_STATE6
15728
+ const [addressesState, setAddressesState] = (0, import_react47.useState)(
15729
+ data !== void 0 ? { type: "CONTENT", addresses: data } : LOADING_STATE7
15270
15730
  );
15271
- const [fetchKey, setFetchKey] = (0, import_react46.useState)(0);
15272
- const refetch = (0, import_react46.useCallback)(() => setFetchKey((k) => k + 1), []);
15273
- const disconnect = (0, import_react46.useCallback)(
15731
+ const [fetchKey, setFetchKey] = (0, import_react47.useState)(0);
15732
+ const refetch = (0, import_react47.useCallback)(() => setFetchKey((k) => k + 1), []);
15733
+ const disconnect = (0, import_react47.useCallback)(
15274
15734
  async (addressId) => {
15275
15735
  await coinlist.wallets.remove({ offerId, addressId });
15276
15736
  refetch();
15277
15737
  },
15278
15738
  [coinlist, offerId, refetch]
15279
15739
  );
15280
- (0, import_react46.useEffect)(() => {
15740
+ (0, import_react47.useEffect)(() => {
15281
15741
  let isCancelled = false;
15282
15742
  if (!enabled) {
15283
15743
  setAddressesState(
@@ -15289,7 +15749,7 @@ function useOptionAddresses(offerId, offerOptionId, options = {}) {
15289
15749
  }
15290
15750
  if (!isReady) {
15291
15751
  if (data === void 0) {
15292
- setAddressesState(LOADING_STATE6);
15752
+ setAddressesState(LOADING_STATE7);
15293
15753
  }
15294
15754
  return () => {
15295
15755
  isCancelled = true;
@@ -15306,7 +15766,7 @@ function useOptionAddresses(offerId, offerOptionId, options = {}) {
15306
15766
  isCancelled = true;
15307
15767
  };
15308
15768
  }
15309
- setAddressesState(LOADING_STATE6);
15769
+ setAddressesState(LOADING_STATE7);
15310
15770
  coinlist.wallets.list({ offerId, offerOptionId }).then((addresses) => {
15311
15771
  if (!isCancelled) {
15312
15772
  log.debug(() => ({
@@ -15333,18 +15793,18 @@ function useOptionAddresses(offerId, offerOptionId, options = {}) {
15333
15793
  }
15334
15794
 
15335
15795
  // src/client/hooks/requirements/data/useRequirements.ts
15336
- var import_react47 = require("react");
15337
- var LOADING_STATE7 = { type: "LOADING" };
15796
+ var import_react48 = require("react");
15797
+ var LOADING_STATE8 = { type: "LOADING" };
15338
15798
  function useRequirements(offerId, options = {}) {
15339
15799
  const { coinlist, isReady } = useCoinList();
15340
15800
  const log = useLogger("useRequirements");
15341
15801
  const { data, enabled = true } = options;
15342
- const [requirementsState, setRequirementsState] = (0, import_react47.useState)(
15343
- data !== void 0 ? { type: "CONTENT", ...data } : LOADING_STATE7
15802
+ const [requirementsState, setRequirementsState] = (0, import_react48.useState)(
15803
+ data !== void 0 ? { type: "CONTENT", ...data } : LOADING_STATE8
15344
15804
  );
15345
- const [fetchKey, setFetchKey] = (0, import_react47.useState)(0);
15346
- const refetch = (0, import_react47.useCallback)(() => setFetchKey((k) => k + 1), []);
15347
- (0, import_react47.useEffect)(() => {
15805
+ const [fetchKey, setFetchKey] = (0, import_react48.useState)(0);
15806
+ const refetch = (0, import_react48.useCallback)(() => setFetchKey((k) => k + 1), []);
15807
+ (0, import_react48.useEffect)(() => {
15348
15808
  let isCancelled = false;
15349
15809
  if (!enabled) {
15350
15810
  return () => {
@@ -15353,7 +15813,7 @@ function useRequirements(offerId, options = {}) {
15353
15813
  }
15354
15814
  if (!isReady) {
15355
15815
  if (data === void 0) {
15356
- setRequirementsState(LOADING_STATE7);
15816
+ setRequirementsState(LOADING_STATE8);
15357
15817
  }
15358
15818
  return () => {
15359
15819
  isCancelled = true;
@@ -15370,7 +15830,7 @@ function useRequirements(offerId, options = {}) {
15370
15830
  isCancelled = true;
15371
15831
  };
15372
15832
  }
15373
- setRequirementsState(LOADING_STATE7);
15833
+ setRequirementsState(LOADING_STATE8);
15374
15834
  Promise.all([
15375
15835
  coinlist.requirements.forOffer(offerId),
15376
15836
  coinlist.requirements.statuses(offerId)
@@ -15412,7 +15872,7 @@ var RequirementItemUi = {
15412
15872
  fromDomain(req, statusInfo, label, description2, addresses = []) {
15413
15873
  return {
15414
15874
  variant: RequirementVariant.fromType(req.type),
15415
- status: statusInfo ? RequirementStatus.fromStatusValue(statusInfo.status) : "required",
15875
+ status: requirementStatus(req, statusInfo),
15416
15876
  label,
15417
15877
  description: description2,
15418
15878
  multiWallet: req.type === "whitelisted_wallet",
@@ -15420,10 +15880,44 @@ var RequirementItemUi = {
15420
15880
  id: address.id,
15421
15881
  address: address.address,
15422
15882
  shortAddress: shortenAddress(address.address)
15423
- }))
15883
+ })),
15884
+ statusMessages: statusMessagesFor(req.type)
15424
15885
  };
15425
15886
  }
15426
15887
  };
15888
+ var IDENTITY_STATUS_MESSAGES = {
15889
+ pending: "Verification under review. We'll notify you when it's complete.",
15890
+ completed: "Identity verified.",
15891
+ rejected: "We couldn't verify your identity. Contact support for help."
15892
+ };
15893
+ var ACCREDITATION_STATUS_MESSAGES = {
15894
+ pending: "Accreditation under review. We'll notify you when it's complete.",
15895
+ completed: "Accreditation verified.",
15896
+ rejected: "We couldn't verify your accreditation. Contact support for help."
15897
+ };
15898
+ var TAX_DOCUMENTATION_STATUS_MESSAGES = {
15899
+ completed: "Tax documentation completed.",
15900
+ rejected: "We couldn't accept your tax documentation. Contact support for help."
15901
+ };
15902
+ function statusMessagesFor(type) {
15903
+ switch (type) {
15904
+ case "kyc_approved":
15905
+ return IDENTITY_STATUS_MESSAGES;
15906
+ case "accreditation":
15907
+ return ACCREDITATION_STATUS_MESSAGES;
15908
+ case "document":
15909
+ return TAX_DOCUMENTATION_STATUS_MESSAGES;
15910
+ default:
15911
+ return void 0;
15912
+ }
15913
+ }
15914
+ function requirementStatus(req, statusInfo) {
15915
+ if (!statusInfo) return "required";
15916
+ if (req.type === "document" && statusInfo.status === "in_progress") {
15917
+ return "required";
15918
+ }
15919
+ return RequirementStatus.fromStatusValue(statusInfo.status);
15920
+ }
15427
15921
  var RequirementVariant = {
15428
15922
  fromType(type) {
15429
15923
  switch (type) {
@@ -15460,20 +15954,20 @@ var ChecklistStatus = {
15460
15954
 
15461
15955
  // src/client/hooks/requirements/useRequirementsChecklistViewModel.ts
15462
15956
  var DEFAULT_LABELS = {
15463
- kyc_approved: "KYC Verification",
15957
+ kyc_approved: "Identity Verification",
15464
15958
  external_wallet: "External Wallet",
15465
15959
  whitelisted_wallet: "Whitelisted Wallet",
15466
15960
  jurisdiction: "Jurisdiction Check",
15467
15961
  accreditation: "Accreditation",
15468
- document: "Document"
15962
+ document: "Tax Documentation"
15469
15963
  };
15470
15964
  var DEFAULT_DESCRIPTIONS = {
15471
- kyc_approved: "Complete Know Your Customer verification.",
15965
+ kyc_approved: "Complete Know Your Customer (KYC) verification.",
15472
15966
  external_wallet: "Connect an external wallet.",
15473
15967
  whitelisted_wallet: "Connect a whitelisted wallet.",
15474
15968
  jurisdiction: "Confirm your jurisdiction eligibility.",
15475
- accreditation: "Verify your accreditation status.",
15476
- document: "Confirm your Tax Documents."
15969
+ accreditation: "Confirm that you meet accredited investor requirements.",
15970
+ document: "Review and sign the required tax documentation."
15477
15971
  };
15478
15972
  var VERIFICATION_POLL_INTERVAL_MS = 5e3;
15479
15973
  var VERIFICATION_POLL_TIMEOUT_MS = 12e4;
@@ -15504,19 +15998,19 @@ function useRequirementsChecklistViewModel(options) {
15504
15998
  data,
15505
15999
  enabled
15506
16000
  });
15507
- const [expandedId, setExpandedId] = (0, import_react48.useState)(null);
15508
- const [taxDocumentOpen, setTaxDocumentOpen] = (0, import_react48.useState)(false);
15509
- const [connectWalletOpen, setConnectWalletOpen] = (0, import_react48.useState)(false);
15510
- const [verifyingRequirementId, setVerifyingRequirementId] = (0, import_react48.useState)(null);
15511
- const isMountedRef = (0, import_react48.useRef)(true);
15512
- (0, import_react48.useEffect)(() => {
16001
+ const [expandedId, setExpandedId] = (0, import_react49.useState)(null);
16002
+ const [taxDocumentOpen, setTaxDocumentOpen] = (0, import_react49.useState)(false);
16003
+ const [connectWalletOpen, setConnectWalletOpen] = (0, import_react49.useState)(false);
16004
+ const [verifyingRequirementId, setVerifyingRequirementId] = (0, import_react49.useState)(null);
16005
+ const isMountedRef = (0, import_react49.useRef)(true);
16006
+ (0, import_react49.useEffect)(() => {
15513
16007
  isMountedRef.current = true;
15514
16008
  return () => {
15515
16009
  isMountedRef.current = false;
15516
16010
  };
15517
16011
  }, []);
15518
- const [hasWalletRequirement, setHasWalletRequirement] = (0, import_react48.useState)(false);
15519
- (0, import_react48.useEffect)(() => {
16012
+ const [hasWalletRequirement, setHasWalletRequirement] = (0, import_react49.useState)(false);
16013
+ (0, import_react49.useEffect)(() => {
15520
16014
  if (requirementsState.type === "CONTENT") {
15521
16015
  setHasWalletRequirement(
15522
16016
  (requirementsState.requirements[optionId] ?? []).some(
@@ -15532,14 +16026,14 @@ function useRequirementsChecklistViewModel(options) {
15532
16026
  } = useOptionAddresses(offerId, optionId, {
15533
16027
  enabled: enabled && hasWalletRequirement
15534
16028
  });
15535
- const removeWallet = (0, import_react48.useCallback)(
16029
+ const removeWallet = (0, import_react49.useCallback)(
15536
16030
  async (addressId) => {
15537
16031
  await disconnect(OfferOptionAddressId(addressId));
15538
16032
  refetch();
15539
16033
  },
15540
16034
  [disconnect, refetch]
15541
16035
  );
15542
- const awaitVerificationResult = (0, import_react48.useCallback)(
16036
+ const awaitVerificationResult = (0, import_react49.useCallback)(
15543
16037
  (requirementId, statusBeforeSubmit) => {
15544
16038
  void (async () => {
15545
16039
  const deadline = Date.now() + VERIFICATION_POLL_TIMEOUT_MS;
@@ -15566,11 +16060,11 @@ function useRequirementsChecklistViewModel(options) {
15566
16060
  },
15567
16061
  [coinlist, offerId, refetch, log]
15568
16062
  );
15569
- const requirements = (0, import_react48.useMemo)(
16063
+ const requirements = (0, import_react49.useMemo)(
15570
16064
  () => requirementsState.type === "CONTENT" ? requirementsState.requirements[optionId] ?? [] : [],
15571
16065
  [requirementsState, optionId]
15572
16066
  );
15573
- const statusById = (0, import_react48.useMemo)(() => {
16067
+ const statusById = (0, import_react49.useMemo)(() => {
15574
16068
  if (requirementsState.type !== "CONTENT") {
15575
16069
  return /* @__PURE__ */ new Map();
15576
16070
  }
@@ -15579,12 +16073,12 @@ function useRequirementsChecklistViewModel(options) {
15579
16073
  requirementsState.statuses.filter((s) => ids.has(s.id)).map((s) => [s.id, s])
15580
16074
  );
15581
16075
  }, [requirementsState, requirements]);
15582
- const state = (0, import_react48.useMemo)(() => {
16076
+ const state = (0, import_react49.useMemo)(() => {
15583
16077
  switch (requirementsState.type) {
15584
16078
  case "LOADING":
15585
- return { type: "loading" };
16079
+ return { type: "loading", title: title2, description: description2 };
15586
16080
  case "ERROR":
15587
- return requirementsState.reason === "not-authenticated" ? { type: "not-authenticated" } : { type: "error" };
16081
+ return { type: "error", title: title2 };
15588
16082
  case "CONTENT": {
15589
16083
  const optionStatuses = [...statusById.values()];
15590
16084
  const checklistStatus = ChecklistStatus.derive(optionStatuses);
@@ -15648,7 +16142,7 @@ function useRequirementsChecklistViewModel(options) {
15648
16142
  identityVerificationOptions,
15649
16143
  removeWallet
15650
16144
  ]);
15651
- const handleRequirementAction = (0, import_react48.useCallback)(
16145
+ const handleRequirementAction = (0, import_react49.useCallback)(
15652
16146
  (requirement) => {
15653
16147
  const inlineVerification = statusById.get(requirement.id)?.kycLevel !== void 0 && onRequirementActionOverride === void 0;
15654
16148
  if (inlineVerification) {
@@ -15680,7 +16174,7 @@ function useRequirementsChecklistViewModel(options) {
15680
16174
  coinlist
15681
16175
  ]
15682
16176
  );
15683
- const onEvent = (0, import_react48.useCallback)(
16177
+ const onEvent = (0, import_react49.useCallback)(
15684
16178
  (event) => {
15685
16179
  switch (event.type) {
15686
16180
  case "ON_TOGGLE_ITEM":
@@ -15778,11 +16272,10 @@ function toVerificationUi(verifyingRequirementId, statusById, identityVerificati
15778
16272
  }
15779
16273
 
15780
16274
  // src/client/components/requirements/RequirementsChecklistContainer.tsx
15781
- var import_jsx_runtime67 = require("react/jsx-runtime");
16275
+ var import_jsx_runtime68 = require("react/jsx-runtime");
15782
16276
  function RequirementsChecklistContainer({
15783
16277
  loading,
15784
16278
  error,
15785
- unauthenticatedState,
15786
16279
  className,
15787
16280
  enabled = true,
15788
16281
  ...options
@@ -15791,24 +16284,19 @@ function RequirementsChecklistContainer({
15791
16284
  ...options,
15792
16285
  enabled
15793
16286
  });
15794
- return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_jsx_runtime67.Fragment, { children: [
15795
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
16287
+ return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
16288
+ /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
15796
16289
  RequirementsChecklistView,
15797
16290
  {
15798
16291
  state,
15799
16292
  onEvent,
15800
16293
  loading,
15801
16294
  error,
15802
- unauthenticatedState: (
15803
- // The sign-in default lives here, not in the View: it is a connected
15804
- // component, and a View must render from what it is handed.
15805
- unauthenticatedState !== void 0 ? unauthenticatedState : /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(CoinListSignInCardContainer, {})
15806
- ),
15807
16295
  className
15808
16296
  }
15809
16297
  ),
15810
- state.type === "content" && /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_jsx_runtime67.Fragment, { children: [
15811
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
16298
+ state.type === "content" && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
16299
+ /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
15812
16300
  TaxDocumentModalContainer,
15813
16301
  {
15814
16302
  isOpen: state.taxDocumentOpen,
@@ -15816,11 +16304,11 @@ function RequirementsChecklistContainer({
15816
16304
  onSubmitted: () => onEvent({ type: "ON_TAX_DOCUMENT_SUBMITTED" })
15817
16305
  }
15818
16306
  ),
15819
- state.verification && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
16307
+ state.verification && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
15820
16308
  VerificationOverlay,
15821
16309
  {
15822
16310
  onClose: () => onEvent({ type: "ON_CLOSE_VERIFICATION" }),
15823
- children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
16311
+ children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
15824
16312
  IdentityVerificationContainer,
15825
16313
  {
15826
16314
  levelName: state.verification.levelName,
@@ -15831,7 +16319,7 @@ function RequirementsChecklistContainer({
15831
16319
  )
15832
16320
  }
15833
16321
  ),
15834
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
16322
+ /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
15835
16323
  ConnectWalletModalContainer,
15836
16324
  {
15837
16325
  isOpen: state.connectWalletOpen,
@@ -15992,18 +16480,18 @@ function pinoClientLogger(options) {
15992
16480
  }
15993
16481
 
15994
16482
  // src/client/hooks/auth/useCompleteOAuth.ts
15995
- var import_react49 = require("react");
16483
+ var import_react50 = require("react");
15996
16484
  function useCompleteOAuth(options) {
15997
16485
  const { coinlist } = useCoinList();
15998
16486
  const log = useLogger("useCompleteOAuth");
15999
- const postOAuthCompleteRef = (0, import_react49.useRef)(options.postOAuthComplete);
16000
- const onFailureRef = (0, import_react49.useRef)(options.onFailure);
16001
- const onSuccessRef = (0, import_react49.useRef)(options.onSuccess);
16487
+ const postOAuthCompleteRef = (0, import_react50.useRef)(options.postOAuthComplete);
16488
+ const onFailureRef = (0, import_react50.useRef)(options.onFailure);
16489
+ const onSuccessRef = (0, import_react50.useRef)(options.onSuccess);
16002
16490
  postOAuthCompleteRef.current = options.postOAuthComplete;
16003
16491
  onFailureRef.current = options.onFailure;
16004
16492
  onSuccessRef.current = options.onSuccess;
16005
- const hasStartedExchangeRef = (0, import_react49.useRef)(false);
16006
- (0, import_react49.useEffect)(() => {
16493
+ const hasStartedExchangeRef = (0, import_react50.useRef)(false);
16494
+ (0, import_react50.useEffect)(() => {
16007
16495
  if (typeof window === "undefined") return;
16008
16496
  const params = new URLSearchParams(window.location.search);
16009
16497
  if (!params.has("code") && !params.has("error")) return;
@@ -16067,16 +16555,16 @@ function useCompleteOAuth(options) {
16067
16555
  }
16068
16556
 
16069
16557
  // src/client/hooks/checkout/coin-list/token-sale/data/useParticipations.ts
16070
- var import_react50 = require("react");
16071
- var LOADING_STATE8 = { type: "LOADING" };
16558
+ var import_react51 = require("react");
16559
+ var LOADING_STATE9 = { type: "LOADING" };
16072
16560
  function useParticipations(offerId, options = {}) {
16073
16561
  const { coinlist, isReady } = useCoinList();
16074
16562
  const log = useLogger("useParticipations");
16075
16563
  const { data, enabled = true } = options;
16076
- const [participationsState, setParticipationsState] = (0, import_react50.useState)(
16077
- data !== void 0 ? { type: "CONTENT", participations: data } : LOADING_STATE8
16564
+ const [participationsState, setParticipationsState] = (0, import_react51.useState)(
16565
+ data !== void 0 ? { type: "CONTENT", participations: data } : LOADING_STATE9
16078
16566
  );
16079
- (0, import_react50.useEffect)(() => {
16567
+ (0, import_react51.useEffect)(() => {
16080
16568
  let isCancelled = false;
16081
16569
  if (!enabled) {
16082
16570
  return () => {
@@ -16085,7 +16573,7 @@ function useParticipations(offerId, options = {}) {
16085
16573
  }
16086
16574
  if (!isReady) {
16087
16575
  if (data === void 0) {
16088
- setParticipationsState(LOADING_STATE8);
16576
+ setParticipationsState(LOADING_STATE9);
16089
16577
  }
16090
16578
  return () => {
16091
16579
  isCancelled = true;
@@ -16096,7 +16584,7 @@ function useParticipations(offerId, options = {}) {
16096
16584
  isCancelled = true;
16097
16585
  };
16098
16586
  }
16099
- setParticipationsState(LOADING_STATE8);
16587
+ setParticipationsState(LOADING_STATE9);
16100
16588
  coinlist.tokenSale.list(offerId).then((participations) => {
16101
16589
  if (!isCancelled) {
16102
16590
  log.debug(() => ({
@@ -16123,16 +16611,16 @@ function useParticipations(offerId, options = {}) {
16123
16611
  }
16124
16612
 
16125
16613
  // src/client/hooks/offers/data/useOfferDetails.ts
16126
- var import_react51 = require("react");
16127
- var LOADING_STATE9 = { type: "LOADING" };
16614
+ var import_react52 = require("react");
16615
+ var LOADING_STATE10 = { type: "LOADING" };
16128
16616
  function useOfferDetails(offerId, options = {}) {
16129
16617
  const { coinlist, isReady } = useCoinList();
16130
16618
  const log = useLogger("useOfferDetails");
16131
16619
  const { data, enabled = true } = options;
16132
- const [offerDetailsState, setOfferDetailsState] = (0, import_react51.useState)(
16133
- data !== void 0 ? { type: "CONTENT", offerDetail: data } : LOADING_STATE9
16620
+ const [offerDetailsState, setOfferDetailsState] = (0, import_react52.useState)(
16621
+ data !== void 0 ? { type: "CONTENT", offerDetail: data } : LOADING_STATE10
16134
16622
  );
16135
- (0, import_react51.useEffect)(() => {
16623
+ (0, import_react52.useEffect)(() => {
16136
16624
  let isCancelled = false;
16137
16625
  if (!enabled) {
16138
16626
  return () => {
@@ -16141,7 +16629,7 @@ function useOfferDetails(offerId, options = {}) {
16141
16629
  }
16142
16630
  if (!isReady) {
16143
16631
  if (data === void 0) {
16144
- setOfferDetailsState(LOADING_STATE9);
16632
+ setOfferDetailsState(LOADING_STATE10);
16145
16633
  }
16146
16634
  return () => {
16147
16635
  isCancelled = true;
@@ -16152,7 +16640,7 @@ function useOfferDetails(offerId, options = {}) {
16152
16640
  isCancelled = true;
16153
16641
  };
16154
16642
  }
16155
- setOfferDetailsState(LOADING_STATE9);
16643
+ setOfferDetailsState(LOADING_STATE10);
16156
16644
  coinlist.offers.get(offerId).then((offerDetail) => {
16157
16645
  if (!isCancelled) {
16158
16646
  log.debug(() => ({
@@ -16180,15 +16668,23 @@ function useOfferDetails(offerId, options = {}) {
16180
16668
 
16181
16669
  // src/client/hooks/offers/shared/offer-asset-card.types.ts
16182
16670
  var OfferAssetCardUi = {
16183
- fromOffer: (offer) => ({
16671
+ /**
16672
+ * `tokenMetadata` is the registry's entry for the token the offer is about
16673
+ * (`TokenRegistrySnapshot.forOffer`), or `null` when it lists none. The
16674
+ * registry names win over the offer's own where both exist: they are the
16675
+ * token's canonical name, ticker and artwork, where the offer's are
16676
+ * catalogue copy.
16677
+ */
16678
+ fromOffer: (offer, tokenMetadata = null) => ({
16184
16679
  id: offer.id,
16185
- logoUrl: offer.logoUrl
16680
+ ...tokenMetadata ? { name: tokenMetadata.name, symbol: String(tokenMetadata.symbol) } : {},
16681
+ logo: OfferLogoUi.fromOffer(offer, tokenMetadata)
16186
16682
  }),
16187
- fromDetail: (detail) => ({
16683
+ fromDetail: (detail, tokenMetadata = null) => ({
16188
16684
  id: detail.id,
16189
- name: detail.name,
16190
- symbol: detail.asset.code,
16191
- logoUrl: detail.logoUrl
16685
+ name: tokenMetadata?.name ?? detail.name,
16686
+ symbol: tokenMetadata ? String(tokenMetadata.symbol) : detail.asset.code,
16687
+ logo: OfferLogoUi.fromOffer(detail, tokenMetadata)
16192
16688
  })
16193
16689
  };
16194
16690
 
@@ -16231,6 +16727,7 @@ function formatMonthYear(date, locale) {
16231
16727
  OAUTH_STATE_KEY,
16232
16728
  OfferAssetCard,
16233
16729
  OfferAssetCardUi,
16730
+ OfferLogoUi,
16234
16731
  OfferSaleCard,
16235
16732
  OfferSaleCardUi,
16236
16733
  OffersAssetGrid,
@@ -16292,6 +16789,7 @@ function formatMonthYear(date, locale) {
16292
16789
  quoteOverAsks,
16293
16790
  stablecoinIconUrl,
16294
16791
  submitErc20Approval,
16792
+ tokenLogoSrcSet,
16295
16793
  tokenLogoUrl,
16296
16794
  tokenMetadataOf,
16297
16795
  useCheckoutOfferTokenMetadata,
@@ -16334,6 +16832,7 @@ function formatMonthYear(date, locale) {
16334
16832
  useTaxDocument,
16335
16833
  useTaxDocumentModalViewModel,
16336
16834
  useTokenMetadata,
16835
+ useTokenRegistry,
16337
16836
  validateAmount,
16338
16837
  validateSellAmount,
16339
16838
  validateSuperstateAmount