@medialane/ui 0.184.0 → 0.185.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/components/drop/create/drop-create.cjs +6 -4
  2. package/dist/components/drop/create/drop-create.cjs.map +1 -1
  3. package/dist/components/drop/create/drop-create.d.cts +4 -6
  4. package/dist/components/drop/create/drop-create.d.ts +4 -6
  5. package/dist/components/drop/create/drop-create.js +6 -4
  6. package/dist/components/drop/create/drop-create.js.map +1 -1
  7. package/dist/components/drop/create/launch-dialog.cjs +4 -1
  8. package/dist/components/drop/create/launch-dialog.cjs.map +1 -1
  9. package/dist/components/drop/create/launch-dialog.js +5 -2
  10. package/dist/components/drop/create/launch-dialog.js.map +1 -1
  11. package/dist/components/drop/create/sale-section.cjs +2 -2
  12. package/dist/components/drop/create/sale-section.cjs.map +1 -1
  13. package/dist/components/drop/create/sale-section.d.cts +3 -3
  14. package/dist/components/drop/create/sale-section.d.ts +3 -3
  15. package/dist/components/drop/create/sale-section.js +2 -2
  16. package/dist/components/drop/create/sale-section.js.map +1 -1
  17. package/dist/components/drop/drop-card.cjs +2 -2
  18. package/dist/components/drop/drop-card.cjs.map +1 -1
  19. package/dist/components/drop/drop-card.js +1 -1
  20. package/dist/components/drop/drop-card.js.map +1 -1
  21. package/dist/components/drop/drop-features.cjs +44 -0
  22. package/dist/components/drop/drop-features.cjs.map +1 -0
  23. package/dist/components/drop/drop-features.d.cts +5 -0
  24. package/dist/components/drop/drop-features.d.ts +5 -0
  25. package/dist/components/drop/drop-features.js +20 -0
  26. package/dist/components/drop/drop-features.js.map +1 -0
  27. package/dist/components/{drop-status-display.cjs → drop/drop-status.cjs} +5 -5
  28. package/dist/components/drop/drop-status.cjs.map +1 -0
  29. package/dist/components/{drop-status-display.d.ts → drop/drop-status.d.cts} +1 -2
  30. package/dist/components/{drop-status-display.d.cts → drop/drop-status.d.ts} +1 -2
  31. package/dist/components/{drop-status-display.js → drop/drop-status.js} +2 -2
  32. package/dist/components/drop/drop-status.js.map +1 -0
  33. package/dist/components/drop/page/drop-action-box.cjs +3 -3
  34. package/dist/components/drop/page/drop-action-box.cjs.map +1 -1
  35. package/dist/components/drop/page/drop-action-box.d.cts +0 -1
  36. package/dist/components/drop/page/drop-action-box.d.ts +0 -1
  37. package/dist/components/drop/page/drop-action-box.js +1 -1
  38. package/dist/components/drop/page/drop-action-box.js.map +1 -1
  39. package/dist/components/drop/page/drop-page.cjs +6 -4
  40. package/dist/components/drop/page/drop-page.cjs.map +1 -1
  41. package/dist/components/drop/page/drop-page.d.cts +1 -2
  42. package/dist/components/drop/page/drop-page.d.ts +1 -2
  43. package/dist/components/drop/page/drop-page.js +7 -5
  44. package/dist/components/drop/page/drop-page.js.map +1 -1
  45. package/dist/index.cjs +8 -3
  46. package/dist/index.cjs.map +1 -1
  47. package/dist/index.d.cts +3 -2
  48. package/dist/index.d.ts +3 -2
  49. package/dist/index.js +5 -2
  50. package/dist/index.js.map +1 -1
  51. package/dist/utils/drop/sale.cjs +3 -3
  52. package/dist/utils/drop/sale.cjs.map +1 -1
  53. package/dist/utils/drop/sale.d.cts +2 -2
  54. package/dist/utils/drop/sale.d.ts +2 -2
  55. package/dist/utils/drop/sale.js +4 -4
  56. package/dist/utils/drop/sale.js.map +1 -1
  57. package/dist/utils/drop/view.cjs +2 -2
  58. package/dist/utils/drop/view.cjs.map +1 -1
  59. package/dist/utils/drop/view.d.cts +2 -2
  60. package/dist/utils/drop/view.d.ts +2 -2
  61. package/dist/utils/drop/view.js +2 -2
  62. package/dist/utils/drop/view.js.map +1 -1
  63. package/dist/utils/use-drops.cjs +7 -0
  64. package/dist/utils/use-drops.cjs.map +1 -1
  65. package/dist/utils/use-drops.d.cts +3 -1
  66. package/dist/utils/use-drops.d.ts +3 -1
  67. package/dist/utils/use-drops.js +6 -0
  68. package/dist/utils/use-drops.js.map +1 -1
  69. package/package.json +3 -3
  70. package/dist/components/drop-status-display.cjs.map +0 -1
  71. package/dist/components/drop-status-display.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { ResolvedFeeConfig, DropTermsBody } from '@medialane/sdk';
1
+ import { DropTermsBody } from '@medialane/sdk';
2
2
 
3
3
  interface SaleDraft {
4
4
  paid: boolean;
@@ -45,7 +45,7 @@ declare function validateSale(d: SaleDraft, now: number): SaleErrors;
45
45
  /** Terms for the create intent; call only after `validateSale` returns no errors. */
46
46
  declare function toDropTerms(d: SaleDraft): DropTermsBody;
47
47
  /** What one token costs a collector, with the platform fee; null while the price is free or unfinished. */
48
- declare function collectorPriceLine(d: SaleDraft, cfg: ResolvedFeeConfig): string | null;
48
+ declare function collectorPriceLine(d: SaleDraft, feeBps: number): string | null;
49
49
  declare function priceLabel(price: string, paymentToken: string): string;
50
50
  declare function supplyLabel(minted: string, maxSupply: string): string;
51
51
 
@@ -1,5 +1,5 @@
1
1
  import { formatAmount, getListableTokens, getTokenByAddress, parseAmount } from "@medialane/sdk";
2
- import { dropMintCost, feeBps } from "@medialane/sdk/starknet";
2
+ import { dropMintCost } from "@medialane/sdk/starknet";
3
3
  const EMPTY_SALE = {
4
4
  paid: false,
5
5
  price: "",
@@ -48,14 +48,14 @@ function toDropTerms(d) {
48
48
  maxPerWallet: d.limitPerWallet ? d.perWallet : "0"
49
49
  };
50
50
  }
51
- function collectorPriceLine(d, cfg) {
51
+ function collectorPriceLine(d, feeBps) {
52
52
  const token = d.paid ? saleToken(d.tokenSymbol) : null;
53
53
  if (!token || validateSale({ ...EMPTY_SALE, paid: true, price: d.price, tokenSymbol: d.tokenSymbol }, 0).price) return null;
54
54
  const price = BigInt(parseAmount(d.price, token.decimals));
55
- const { fee, total } = dropMintCost(price, 1, cfg);
55
+ const { fee, total } = dropMintCost(price, 1, feeBps);
56
56
  const amount = (v) => `${formatAmount(v.toString(), token.decimals)} ${token.symbol}`;
57
57
  if (fee === 0n) return `Collectors pay ${amount(price)}.`;
58
- return `Collectors pay ${amount(total)} (incl. ${feeBps("launchpad", cfg) / 100}% platform fee). You receive ${amount(price)}.`;
58
+ return `Collectors pay ${amount(total)} (incl. ${feeBps / 100}% platform fee). You receive ${amount(price)}.`;
59
59
  }
60
60
  function priceLabel(price, paymentToken) {
61
61
  if (BigInt(price) === 0n) return "Free";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/drop/sale.ts"],"sourcesContent":["import { formatAmount, getListableTokens, getTokenByAddress, parseAmount, type DropTermsBody, type ResolvedFeeConfig } from \"@medialane/sdk\";\nimport { dropMintCost, feeBps } from \"@medialane/sdk/starknet\";\n\nexport interface SaleDraft {\n paid: boolean;\n /** In the token's normal units, e.g. \"5.5\". */\n price: string;\n tokenSymbol: string;\n startNow: boolean;\n /** `datetime-local` value in the creator's time zone. */\n start: string;\n hasEnd: boolean;\n end: string;\n limitPerWallet: boolean;\n perWallet: string;\n}\n\nexport const EMPTY_SALE: SaleDraft = {\n paid: false, price: \"\", tokenSymbol: \"USDC\",\n startNow: true, start: \"\", hasEnd: false, end: \"\",\n limitPerWallet: false, perWallet: \"\",\n};\n\nexport type SaleErrors = Partial<Record<\"price\" | \"start\" | \"end\" | \"perWallet\", string>>;\n\nexport function saleToken(symbol: string) {\n return getListableTokens().find((t) => t.symbol === symbol) ?? null;\n}\n\nconst toSeconds = (local: string): number | null => {\n if (!local) return null;\n const ms = new Date(local).getTime();\n return Number.isNaN(ms) ? null : Math.floor(ms / 1000);\n};\n\nexport function validateSale(d: SaleDraft, now: number): SaleErrors {\n const errors: SaleErrors = {};\n if (d.paid) {\n const token = saleToken(d.tokenSymbol);\n const decimals = d.price.split(\".\")[1]?.length ?? 0;\n if (!token) errors.price = \"Choose a currency\";\n else if (!/^\\d+(\\.\\d+)?$/.test(d.price)) errors.price = \"Enter a price above 0\";\n else if (decimals > token.decimals) errors.price = `Use at most ${token.decimals} decimals for ${token.symbol}`;\n else if (BigInt(parseAmount(d.price, token.decimals)) === 0n) errors.price = \"Enter a price above 0\";\n }\n const start = d.startNow ? now : toSeconds(d.start);\n if (!d.startNow && (start === null || start <= now)) errors.start = \"Pick a start time in the future\";\n if (d.hasEnd) {\n const end = toSeconds(d.end);\n if (end === null || (start !== null && end <= start)) errors.end = \"The sale must end after it starts\";\n }\n if (d.limitPerWallet && !/^[1-9]\\d*$/.test(d.perWallet)) errors.perWallet = \"Enter 1 or more\";\n return errors;\n}\n\n/** Terms for the create intent; call only after `validateSale` returns no errors. */\nexport function toDropTerms(d: SaleDraft): DropTermsBody {\n const token = d.paid ? saleToken(d.tokenSymbol) : null;\n return {\n startTime: d.startNow ? 0 : toSeconds(d.start)!,\n endTime: d.hasEnd ? toSeconds(d.end)! : 0,\n price: token ? parseAmount(d.price, token.decimals) : \"0\",\n paymentToken: token ? token.address : \"0x0\",\n maxPerWallet: d.limitPerWallet ? d.perWallet : \"0\",\n };\n}\n\n/** What one token costs a collector, with the platform fee; null while the price is free or unfinished. */\nexport function collectorPriceLine(d: SaleDraft, cfg: ResolvedFeeConfig): string | null {\n const token = d.paid ? saleToken(d.tokenSymbol) : null;\n if (!token || validateSale({ ...EMPTY_SALE, paid: true, price: d.price, tokenSymbol: d.tokenSymbol }, 0).price) return null;\n const price = BigInt(parseAmount(d.price, token.decimals));\n const { fee, total } = dropMintCost(price, 1, cfg);\n const amount = (v: bigint) => `${formatAmount(v.toString(), token.decimals)} ${token.symbol}`;\n if (fee === 0n) return `Collectors pay ${amount(price)}.`;\n return `Collectors pay ${amount(total)} (incl. ${feeBps(\"launchpad\", cfg) / 100}% platform fee). You receive ${amount(price)}.`;\n}\n\nexport function priceLabel(price: string, paymentToken: string): string {\n if (BigInt(price) === 0n) return \"Free\";\n const token = getTokenByAddress(paymentToken);\n return token ? `${formatAmount(price, token.decimals)} ${token.symbol}` : \"Paid\";\n}\n\nconst count = (v: string) => Number(v).toLocaleString(\"en-US\");\n\nexport function supplyLabel(minted: string, maxSupply: string): string {\n return maxSupply === \"0\" ? `${count(minted)} minted` : `${count(minted)} / ${count(maxSupply)} minted`;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/utils/drop/sale.ts"],"sourcesContent":["import { formatAmount, getListableTokens, getTokenByAddress, parseAmount, type DropTermsBody } from \"@medialane/sdk\";\nimport { dropMintCost } from \"@medialane/sdk/starknet\";\n\nexport interface SaleDraft {\n paid: boolean;\n /** In the token's normal units, e.g. \"5.5\". */\n price: string;\n tokenSymbol: string;\n startNow: boolean;\n /** `datetime-local` value in the creator's time zone. */\n start: string;\n hasEnd: boolean;\n end: string;\n limitPerWallet: boolean;\n perWallet: string;\n}\n\nexport const EMPTY_SALE: SaleDraft = {\n paid: false, price: \"\", tokenSymbol: \"USDC\",\n startNow: true, start: \"\", hasEnd: false, end: \"\",\n limitPerWallet: false, perWallet: \"\",\n};\n\nexport type SaleErrors = Partial<Record<\"price\" | \"start\" | \"end\" | \"perWallet\", string>>;\n\nexport function saleToken(symbol: string) {\n return getListableTokens().find((t) => t.symbol === symbol) ?? null;\n}\n\nconst toSeconds = (local: string): number | null => {\n if (!local) return null;\n const ms = new Date(local).getTime();\n return Number.isNaN(ms) ? null : Math.floor(ms / 1000);\n};\n\nexport function validateSale(d: SaleDraft, now: number): SaleErrors {\n const errors: SaleErrors = {};\n if (d.paid) {\n const token = saleToken(d.tokenSymbol);\n const decimals = d.price.split(\".\")[1]?.length ?? 0;\n if (!token) errors.price = \"Choose a currency\";\n else if (!/^\\d+(\\.\\d+)?$/.test(d.price)) errors.price = \"Enter a price above 0\";\n else if (decimals > token.decimals) errors.price = `Use at most ${token.decimals} decimals for ${token.symbol}`;\n else if (BigInt(parseAmount(d.price, token.decimals)) === 0n) errors.price = \"Enter a price above 0\";\n }\n const start = d.startNow ? now : toSeconds(d.start);\n if (!d.startNow && (start === null || start <= now)) errors.start = \"Pick a start time in the future\";\n if (d.hasEnd) {\n const end = toSeconds(d.end);\n if (end === null || (start !== null && end <= start)) errors.end = \"The sale must end after it starts\";\n }\n if (d.limitPerWallet && !/^[1-9]\\d*$/.test(d.perWallet)) errors.perWallet = \"Enter 1 or more\";\n return errors;\n}\n\n/** Terms for the create intent; call only after `validateSale` returns no errors. */\nexport function toDropTerms(d: SaleDraft): DropTermsBody {\n const token = d.paid ? saleToken(d.tokenSymbol) : null;\n return {\n startTime: d.startNow ? 0 : toSeconds(d.start)!,\n endTime: d.hasEnd ? toSeconds(d.end)! : 0,\n price: token ? parseAmount(d.price, token.decimals) : \"0\",\n paymentToken: token ? token.address : \"0x0\",\n maxPerWallet: d.limitPerWallet ? d.perWallet : \"0\",\n };\n}\n\n/** What one token costs a collector, with the platform fee; null while the price is free or unfinished. */\nexport function collectorPriceLine(d: SaleDraft, feeBps: number): string | null {\n const token = d.paid ? saleToken(d.tokenSymbol) : null;\n if (!token || validateSale({ ...EMPTY_SALE, paid: true, price: d.price, tokenSymbol: d.tokenSymbol }, 0).price) return null;\n const price = BigInt(parseAmount(d.price, token.decimals));\n const { fee, total } = dropMintCost(price, 1, feeBps);\n const amount = (v: bigint) => `${formatAmount(v.toString(), token.decimals)} ${token.symbol}`;\n if (fee === 0n) return `Collectors pay ${amount(price)}.`;\n return `Collectors pay ${amount(total)} (incl. ${feeBps / 100}% platform fee). You receive ${amount(price)}.`;\n}\n\nexport function priceLabel(price: string, paymentToken: string): string {\n if (BigInt(price) === 0n) return \"Free\";\n const token = getTokenByAddress(paymentToken);\n return token ? `${formatAmount(price, token.decimals)} ${token.symbol}` : \"Paid\";\n}\n\nconst count = (v: string) => Number(v).toLocaleString(\"en-US\");\n\nexport function supplyLabel(minted: string, maxSupply: string): string {\n return maxSupply === \"0\" ? `${count(minted)} minted` : `${count(minted)} / ${count(maxSupply)} minted`;\n}\n"],"mappings":"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","names":[]}
@@ -33,7 +33,7 @@ function dropPhase(t, maxSupply, minted, now) {
33
33
  }
34
34
  const when = (ts) => new Date(ts * 1e3).toLocaleString(void 0, { weekday: "short", day: "numeric", month: "short", hour: "2-digit", minute: "2-digit" });
35
35
  function actionBoxView(input) {
36
- const { drop, mint, feeConfig, now } = input;
36
+ const { drop, mint, feeBps, now } = input;
37
37
  const phase = dropPhase(drop, drop.maxSupply, drop.totalMinted, now);
38
38
  const token = (0, import_sdk.getTokenByAddress)(drop.paymentToken);
39
39
  const listed = BigInt(drop.allowlistRoot) !== 0n;
@@ -42,7 +42,7 @@ function actionBoxView(input) {
42
42
  const countdown = phase === "upcoming" ? { label: "Starts in", target: drop.startTime } : phase === "live" && drop.endTime !== 0 ? { label: "Ends in", target: drop.endTime } : null;
43
43
  let totalText = null;
44
44
  if (mint.state === "ready" && drop.price > 0n && token) {
45
- const { total } = (0, import_starknet.dropMintCost)(drop.price, quantity, feeConfig);
45
+ const { total } = (0, import_starknet.dropMintCost)(drop.price, quantity, feeBps);
46
46
  totalText = `Total ${(0, import_sdk.formatAmount)(total.toString(), token.decimals)} ${token.symbol} (incl. platform fee)`;
47
47
  }
48
48
  const button = (() => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/drop/view.ts"],"sourcesContent":["import { formatAmount, getTokenByAddress, type ResolvedFeeConfig } from \"@medialane/sdk\";\nimport { dropMintCost, type DropMintState, type DropOnchain } from \"@medialane/sdk/starknet\";\nimport { priceLabel } from \"./sale.js\";\n\nexport type DropPhase = \"upcoming\" | \"live\" | \"sold-out\" | \"ended\";\n\nexport function dropPhase(t: { startTime: number; endTime: number }, maxSupply: bigint, minted: bigint, now: number): DropPhase {\n if (maxSupply !== 0n && minted >= maxSupply) return \"sold-out\";\n if (t.startTime !== 0 && now < t.startTime) return \"upcoming\";\n if (t.endTime !== 0 && now > t.endTime) return \"ended\";\n return \"live\";\n}\n\nexport interface ActionBoxView {\n phase: DropPhase;\n statusText: string;\n countdown: { label: string; target: number } | null;\n priceText: string;\n totalText: string | null;\n eligibility: string | null;\n button: { label: string; action: \"mint\" | \"sign-in\" | \"none\" };\n maxQuantity: bigint;\n}\n\nconst when = (ts: number) => new Date(ts * 1000).toLocaleString(undefined, { weekday: \"short\", day: \"numeric\", month: \"short\", hour: \"2-digit\", minute: \"2-digit\" });\n\n/** Everything the mint box shows, decided from chain state before any transaction. */\nexport function actionBoxView(input: {\n drop: DropOnchain;\n mint: DropMintState;\n quantity: bigint;\n feeConfig: ResolvedFeeConfig;\n now: number;\n}): ActionBoxView {\n const { drop, mint, feeConfig, now } = input;\n const phase = dropPhase(drop, drop.maxSupply, drop.totalMinted, now);\n const token = getTokenByAddress(drop.paymentToken);\n const listed = BigInt(drop.allowlistRoot) !== 0n;\n const quantity = input.quantity < 1n ? 1n : input.quantity > mint.maxQuantity ? mint.maxQuantity : input.quantity;\n\n const statusText =\n phase === \"upcoming\" ? `Upcoming · starts ${when(drop.startTime)}`\n : phase === \"sold-out\" ? \"Sold out\"\n : phase === \"ended\" ? \"Ended\"\n : drop.endTime === 0 ? \"Live · no end date\" : \"Live\";\n const countdown =\n phase === \"upcoming\" ? { label: \"Starts in\", target: drop.startTime }\n : phase === \"live\" && drop.endTime !== 0 ? { label: \"Ends in\", target: drop.endTime }\n : null;\n\n let totalText: string | null = null;\n if (mint.state === \"ready\" && drop.price > 0n && token) {\n const { total } = dropMintCost(drop.price, quantity, feeConfig);\n totalText = `Total ${formatAmount(total.toString(), token.decimals)} ${token.symbol} (incl. platform fee)`;\n }\n\n const button: ActionBoxView[\"button\"] = (() => {\n switch (mint.state) {\n case \"ready\": return { label: `Mint ${quantity}`, action: \"mint\" };\n case \"no-wallet\": return { label: \"Sign in to mint\", action: \"sign-in\" };\n case \"upcoming\": return { label: `Starts ${when(drop.startTime)}`, action: \"none\" };\n case \"ended\": return { label: \"This drop has ended\", action: \"none\" };\n case \"sold-out\": return { label: \"Sold out\", action: \"none\" };\n case \"no-link\": return { label: \"Open your claim link to mint\", action: \"none\" };\n case \"not-on-list\": return { label: \"This wallet isn't on the list\", action: \"none\" };\n case \"limit-reached\": return { label: `You've minted your limit (${drop.maxPerWallet})`, action: \"none\" };\n case \"insufficient-balance\": return { label: `Not enough ${token?.symbol ?? \"balance\"}`, action: \"none\" };\n case \"loading\": return { label: \"Checking…\", action: \"none\" };\n }\n })();\n\n const eligibility =\n !listed ? \"Open to everyone\"\n : mint.state === \"ready\" ? \"You're on the list\"\n : mint.state === \"no-link\" ? \"This drop is for a list — open your claim link to mint\"\n : \"This drop is for a list\";\n\n return {\n phase,\n statusText,\n countdown,\n priceText: priceLabel(drop.price.toString(), drop.paymentToken),\n totalText,\n eligibility,\n button,\n maxQuantity: mint.maxQuantity,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAwE;AACxE,sBAAmE;AACnE,kBAA2B;AAIpB,SAAS,UAAU,GAA2C,WAAmB,QAAgB,KAAwB;AAC9H,MAAI,cAAc,MAAM,UAAU,UAAW,QAAO;AACpD,MAAI,EAAE,cAAc,KAAK,MAAM,EAAE,UAAW,QAAO;AACnD,MAAI,EAAE,YAAY,KAAK,MAAM,EAAE,QAAS,QAAO;AAC/C,SAAO;AACT;AAaA,MAAM,OAAO,CAAC,OAAe,IAAI,KAAK,KAAK,GAAI,EAAE,eAAe,QAAW,EAAE,SAAS,SAAS,KAAK,WAAW,OAAO,SAAS,MAAM,WAAW,QAAQ,UAAU,CAAC;AAG5J,SAAS,cAAc,OAMZ;AAChB,QAAM,EAAE,MAAM,MAAM,WAAW,IAAI,IAAI;AACvC,QAAM,QAAQ,UAAU,MAAM,KAAK,WAAW,KAAK,aAAa,GAAG;AACnE,QAAM,YAAQ,8BAAkB,KAAK,YAAY;AACjD,QAAM,SAAS,OAAO,KAAK,aAAa,MAAM;AAC9C,QAAM,WAAW,MAAM,WAAW,KAAK,KAAK,MAAM,WAAW,KAAK,cAAc,KAAK,cAAc,MAAM;AAEzG,QAAM,aACJ,UAAU,aAAa,wBAAqB,KAAK,KAAK,SAAS,CAAC,KAC9D,UAAU,aAAa,aACvB,UAAU,UAAU,UACpB,KAAK,YAAY,IAAI,0BAAuB;AAChD,QAAM,YACJ,UAAU,aAAa,EAAE,OAAO,aAAa,QAAQ,KAAK,UAAU,IAClE,UAAU,UAAU,KAAK,YAAY,IAAI,EAAE,OAAO,WAAW,QAAQ,KAAK,QAAQ,IAClF;AAEJ,MAAI,YAA2B;AAC/B,MAAI,KAAK,UAAU,WAAW,KAAK,QAAQ,MAAM,OAAO;AACtD,UAAM,EAAE,MAAM,QAAI,8BAAa,KAAK,OAAO,UAAU,SAAS;AAC9D,gBAAY,aAAS,yBAAa,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,MAAM,MAAM;AAAA,EACrF;AAEA,QAAM,UAAmC,MAAM;AAC7C,YAAQ,KAAK,OAAO;AAAA,MAClB,KAAK;AAAS,eAAO,EAAE,OAAO,QAAQ,QAAQ,IAAI,QAAQ,OAAO;AAAA,MACjE,KAAK;AAAa,eAAO,EAAE,OAAO,mBAAmB,QAAQ,UAAU;AAAA,MACvE,KAAK;AAAY,eAAO,EAAE,OAAO,UAAU,KAAK,KAAK,SAAS,CAAC,IAAI,QAAQ,OAAO;AAAA,MAClF,KAAK;AAAS,eAAO,EAAE,OAAO,uBAAuB,QAAQ,OAAO;AAAA,MACpE,KAAK;AAAY,eAAO,EAAE,OAAO,YAAY,QAAQ,OAAO;AAAA,MAC5D,KAAK;AAAW,eAAO,EAAE,OAAO,gCAAgC,QAAQ,OAAO;AAAA,MAC/E,KAAK;AAAe,eAAO,EAAE,OAAO,iCAAiC,QAAQ,OAAO;AAAA,MACpF,KAAK;AAAiB,eAAO,EAAE,OAAO,6BAA6B,KAAK,YAAY,KAAK,QAAQ,OAAO;AAAA,MACxG,KAAK;AAAwB,eAAO,EAAE,OAAO,cAAc,OAAO,UAAU,SAAS,IAAI,QAAQ,OAAO;AAAA,MACxG,KAAK;AAAW,eAAO,EAAE,OAAO,kBAAa,QAAQ,OAAO;AAAA,IAC9D;AAAA,EACF,GAAG;AAEH,QAAM,cACJ,CAAC,SAAS,qBACR,KAAK,UAAU,UAAU,uBACzB,KAAK,UAAU,YAAY,gEAC3B;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAW,wBAAW,KAAK,MAAM,SAAS,GAAG,KAAK,YAAY;AAAA,IAC9D;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,KAAK;AAAA,EACpB;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/utils/drop/view.ts"],"sourcesContent":["import { formatAmount, getTokenByAddress } from \"@medialane/sdk\";\nimport { dropMintCost, type DropMintState, type DropOnchain } from \"@medialane/sdk/starknet\";\nimport { priceLabel } from \"./sale.js\";\n\nexport type DropPhase = \"upcoming\" | \"live\" | \"sold-out\" | \"ended\";\n\nexport function dropPhase(t: { startTime: number; endTime: number }, maxSupply: bigint, minted: bigint, now: number): DropPhase {\n if (maxSupply !== 0n && minted >= maxSupply) return \"sold-out\";\n if (t.startTime !== 0 && now < t.startTime) return \"upcoming\";\n if (t.endTime !== 0 && now > t.endTime) return \"ended\";\n return \"live\";\n}\n\nexport interface ActionBoxView {\n phase: DropPhase;\n statusText: string;\n countdown: { label: string; target: number } | null;\n priceText: string;\n totalText: string | null;\n eligibility: string | null;\n button: { label: string; action: \"mint\" | \"sign-in\" | \"none\" };\n maxQuantity: bigint;\n}\n\nconst when = (ts: number) => new Date(ts * 1000).toLocaleString(undefined, { weekday: \"short\", day: \"numeric\", month: \"short\", hour: \"2-digit\", minute: \"2-digit\" });\n\n/** Everything the mint box shows, decided from chain state before any transaction. */\nexport function actionBoxView(input: {\n drop: DropOnchain;\n mint: DropMintState;\n quantity: bigint;\n /** Platform fee added to a mint, in basis points. */\n feeBps: number;\n now: number;\n}): ActionBoxView {\n const { drop, mint, feeBps, now } = input;\n const phase = dropPhase(drop, drop.maxSupply, drop.totalMinted, now);\n const token = getTokenByAddress(drop.paymentToken);\n const listed = BigInt(drop.allowlistRoot) !== 0n;\n const quantity = input.quantity < 1n ? 1n : input.quantity > mint.maxQuantity ? mint.maxQuantity : input.quantity;\n\n const statusText =\n phase === \"upcoming\" ? `Upcoming · starts ${when(drop.startTime)}`\n : phase === \"sold-out\" ? \"Sold out\"\n : phase === \"ended\" ? \"Ended\"\n : drop.endTime === 0 ? \"Live · no end date\" : \"Live\";\n const countdown =\n phase === \"upcoming\" ? { label: \"Starts in\", target: drop.startTime }\n : phase === \"live\" && drop.endTime !== 0 ? { label: \"Ends in\", target: drop.endTime }\n : null;\n\n let totalText: string | null = null;\n if (mint.state === \"ready\" && drop.price > 0n && token) {\n const { total } = dropMintCost(drop.price, quantity, feeBps);\n totalText = `Total ${formatAmount(total.toString(), token.decimals)} ${token.symbol} (incl. platform fee)`;\n }\n\n const button: ActionBoxView[\"button\"] = (() => {\n switch (mint.state) {\n case \"ready\": return { label: `Mint ${quantity}`, action: \"mint\" };\n case \"no-wallet\": return { label: \"Sign in to mint\", action: \"sign-in\" };\n case \"upcoming\": return { label: `Starts ${when(drop.startTime)}`, action: \"none\" };\n case \"ended\": return { label: \"This drop has ended\", action: \"none\" };\n case \"sold-out\": return { label: \"Sold out\", action: \"none\" };\n case \"no-link\": return { label: \"Open your claim link to mint\", action: \"none\" };\n case \"not-on-list\": return { label: \"This wallet isn't on the list\", action: \"none\" };\n case \"limit-reached\": return { label: `You've minted your limit (${drop.maxPerWallet})`, action: \"none\" };\n case \"insufficient-balance\": return { label: `Not enough ${token?.symbol ?? \"balance\"}`, action: \"none\" };\n case \"loading\": return { label: \"Checking…\", action: \"none\" };\n }\n })();\n\n const eligibility =\n !listed ? \"Open to everyone\"\n : mint.state === \"ready\" ? \"You're on the list\"\n : mint.state === \"no-link\" ? \"This drop is for a list — open your claim link to mint\"\n : \"This drop is for a list\";\n\n return {\n phase,\n statusText,\n countdown,\n priceText: priceLabel(drop.price.toString(), drop.paymentToken),\n totalText,\n eligibility,\n button,\n maxQuantity: mint.maxQuantity,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAgD;AAChD,sBAAmE;AACnE,kBAA2B;AAIpB,SAAS,UAAU,GAA2C,WAAmB,QAAgB,KAAwB;AAC9H,MAAI,cAAc,MAAM,UAAU,UAAW,QAAO;AACpD,MAAI,EAAE,cAAc,KAAK,MAAM,EAAE,UAAW,QAAO;AACnD,MAAI,EAAE,YAAY,KAAK,MAAM,EAAE,QAAS,QAAO;AAC/C,SAAO;AACT;AAaA,MAAM,OAAO,CAAC,OAAe,IAAI,KAAK,KAAK,GAAI,EAAE,eAAe,QAAW,EAAE,SAAS,SAAS,KAAK,WAAW,OAAO,SAAS,MAAM,WAAW,QAAQ,UAAU,CAAC;AAG5J,SAAS,cAAc,OAOZ;AAChB,QAAM,EAAE,MAAM,MAAM,QAAQ,IAAI,IAAI;AACpC,QAAM,QAAQ,UAAU,MAAM,KAAK,WAAW,KAAK,aAAa,GAAG;AACnE,QAAM,YAAQ,8BAAkB,KAAK,YAAY;AACjD,QAAM,SAAS,OAAO,KAAK,aAAa,MAAM;AAC9C,QAAM,WAAW,MAAM,WAAW,KAAK,KAAK,MAAM,WAAW,KAAK,cAAc,KAAK,cAAc,MAAM;AAEzG,QAAM,aACJ,UAAU,aAAa,wBAAqB,KAAK,KAAK,SAAS,CAAC,KAC9D,UAAU,aAAa,aACvB,UAAU,UAAU,UACpB,KAAK,YAAY,IAAI,0BAAuB;AAChD,QAAM,YACJ,UAAU,aAAa,EAAE,OAAO,aAAa,QAAQ,KAAK,UAAU,IAClE,UAAU,UAAU,KAAK,YAAY,IAAI,EAAE,OAAO,WAAW,QAAQ,KAAK,QAAQ,IAClF;AAEJ,MAAI,YAA2B;AAC/B,MAAI,KAAK,UAAU,WAAW,KAAK,QAAQ,MAAM,OAAO;AACtD,UAAM,EAAE,MAAM,QAAI,8BAAa,KAAK,OAAO,UAAU,MAAM;AAC3D,gBAAY,aAAS,yBAAa,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,MAAM,MAAM;AAAA,EACrF;AAEA,QAAM,UAAmC,MAAM;AAC7C,YAAQ,KAAK,OAAO;AAAA,MAClB,KAAK;AAAS,eAAO,EAAE,OAAO,QAAQ,QAAQ,IAAI,QAAQ,OAAO;AAAA,MACjE,KAAK;AAAa,eAAO,EAAE,OAAO,mBAAmB,QAAQ,UAAU;AAAA,MACvE,KAAK;AAAY,eAAO,EAAE,OAAO,UAAU,KAAK,KAAK,SAAS,CAAC,IAAI,QAAQ,OAAO;AAAA,MAClF,KAAK;AAAS,eAAO,EAAE,OAAO,uBAAuB,QAAQ,OAAO;AAAA,MACpE,KAAK;AAAY,eAAO,EAAE,OAAO,YAAY,QAAQ,OAAO;AAAA,MAC5D,KAAK;AAAW,eAAO,EAAE,OAAO,gCAAgC,QAAQ,OAAO;AAAA,MAC/E,KAAK;AAAe,eAAO,EAAE,OAAO,iCAAiC,QAAQ,OAAO;AAAA,MACpF,KAAK;AAAiB,eAAO,EAAE,OAAO,6BAA6B,KAAK,YAAY,KAAK,QAAQ,OAAO;AAAA,MACxG,KAAK;AAAwB,eAAO,EAAE,OAAO,cAAc,OAAO,UAAU,SAAS,IAAI,QAAQ,OAAO;AAAA,MACxG,KAAK;AAAW,eAAO,EAAE,OAAO,kBAAa,QAAQ,OAAO;AAAA,IAC9D;AAAA,EACF,GAAG;AAEH,QAAM,cACJ,CAAC,SAAS,qBACR,KAAK,UAAU,UAAU,uBACzB,KAAK,UAAU,YAAY,gEAC3B;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAW,wBAAW,KAAK,MAAM,SAAS,GAAG,KAAK,YAAY;AAAA,IAC9D;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,KAAK;AAAA,EACpB;AACF;","names":[]}
@@ -1,4 +1,3 @@
1
- import { ResolvedFeeConfig } from '@medialane/sdk';
2
1
  import { DropOnchain, DropMintState } from '@medialane/sdk/starknet';
3
2
 
4
3
  type DropPhase = "upcoming" | "live" | "sold-out" | "ended";
@@ -27,7 +26,8 @@ declare function actionBoxView(input: {
27
26
  drop: DropOnchain;
28
27
  mint: DropMintState;
29
28
  quantity: bigint;
30
- feeConfig: ResolvedFeeConfig;
29
+ /** Platform fee added to a mint, in basis points. */
30
+ feeBps: number;
31
31
  now: number;
32
32
  }): ActionBoxView;
33
33
 
@@ -1,4 +1,3 @@
1
- import { ResolvedFeeConfig } from '@medialane/sdk';
2
1
  import { DropOnchain, DropMintState } from '@medialane/sdk/starknet';
3
2
 
4
3
  type DropPhase = "upcoming" | "live" | "sold-out" | "ended";
@@ -27,7 +26,8 @@ declare function actionBoxView(input: {
27
26
  drop: DropOnchain;
28
27
  mint: DropMintState;
29
28
  quantity: bigint;
30
- feeConfig: ResolvedFeeConfig;
29
+ /** Platform fee added to a mint, in basis points. */
30
+ feeBps: number;
31
31
  now: number;
32
32
  }): ActionBoxView;
33
33
 
@@ -9,7 +9,7 @@ function dropPhase(t, maxSupply, minted, now) {
9
9
  }
10
10
  const when = (ts) => new Date(ts * 1e3).toLocaleString(void 0, { weekday: "short", day: "numeric", month: "short", hour: "2-digit", minute: "2-digit" });
11
11
  function actionBoxView(input) {
12
- const { drop, mint, feeConfig, now } = input;
12
+ const { drop, mint, feeBps, now } = input;
13
13
  const phase = dropPhase(drop, drop.maxSupply, drop.totalMinted, now);
14
14
  const token = getTokenByAddress(drop.paymentToken);
15
15
  const listed = BigInt(drop.allowlistRoot) !== 0n;
@@ -18,7 +18,7 @@ function actionBoxView(input) {
18
18
  const countdown = phase === "upcoming" ? { label: "Starts in", target: drop.startTime } : phase === "live" && drop.endTime !== 0 ? { label: "Ends in", target: drop.endTime } : null;
19
19
  let totalText = null;
20
20
  if (mint.state === "ready" && drop.price > 0n && token) {
21
- const { total } = dropMintCost(drop.price, quantity, feeConfig);
21
+ const { total } = dropMintCost(drop.price, quantity, feeBps);
22
22
  totalText = `Total ${formatAmount(total.toString(), token.decimals)} ${token.symbol} (incl. platform fee)`;
23
23
  }
24
24
  const button = (() => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/drop/view.ts"],"sourcesContent":["import { formatAmount, getTokenByAddress, type ResolvedFeeConfig } from \"@medialane/sdk\";\nimport { dropMintCost, type DropMintState, type DropOnchain } from \"@medialane/sdk/starknet\";\nimport { priceLabel } from \"./sale.js\";\n\nexport type DropPhase = \"upcoming\" | \"live\" | \"sold-out\" | \"ended\";\n\nexport function dropPhase(t: { startTime: number; endTime: number }, maxSupply: bigint, minted: bigint, now: number): DropPhase {\n if (maxSupply !== 0n && minted >= maxSupply) return \"sold-out\";\n if (t.startTime !== 0 && now < t.startTime) return \"upcoming\";\n if (t.endTime !== 0 && now > t.endTime) return \"ended\";\n return \"live\";\n}\n\nexport interface ActionBoxView {\n phase: DropPhase;\n statusText: string;\n countdown: { label: string; target: number } | null;\n priceText: string;\n totalText: string | null;\n eligibility: string | null;\n button: { label: string; action: \"mint\" | \"sign-in\" | \"none\" };\n maxQuantity: bigint;\n}\n\nconst when = (ts: number) => new Date(ts * 1000).toLocaleString(undefined, { weekday: \"short\", day: \"numeric\", month: \"short\", hour: \"2-digit\", minute: \"2-digit\" });\n\n/** Everything the mint box shows, decided from chain state before any transaction. */\nexport function actionBoxView(input: {\n drop: DropOnchain;\n mint: DropMintState;\n quantity: bigint;\n feeConfig: ResolvedFeeConfig;\n now: number;\n}): ActionBoxView {\n const { drop, mint, feeConfig, now } = input;\n const phase = dropPhase(drop, drop.maxSupply, drop.totalMinted, now);\n const token = getTokenByAddress(drop.paymentToken);\n const listed = BigInt(drop.allowlistRoot) !== 0n;\n const quantity = input.quantity < 1n ? 1n : input.quantity > mint.maxQuantity ? mint.maxQuantity : input.quantity;\n\n const statusText =\n phase === \"upcoming\" ? `Upcoming · starts ${when(drop.startTime)}`\n : phase === \"sold-out\" ? \"Sold out\"\n : phase === \"ended\" ? \"Ended\"\n : drop.endTime === 0 ? \"Live · no end date\" : \"Live\";\n const countdown =\n phase === \"upcoming\" ? { label: \"Starts in\", target: drop.startTime }\n : phase === \"live\" && drop.endTime !== 0 ? { label: \"Ends in\", target: drop.endTime }\n : null;\n\n let totalText: string | null = null;\n if (mint.state === \"ready\" && drop.price > 0n && token) {\n const { total } = dropMintCost(drop.price, quantity, feeConfig);\n totalText = `Total ${formatAmount(total.toString(), token.decimals)} ${token.symbol} (incl. platform fee)`;\n }\n\n const button: ActionBoxView[\"button\"] = (() => {\n switch (mint.state) {\n case \"ready\": return { label: `Mint ${quantity}`, action: \"mint\" };\n case \"no-wallet\": return { label: \"Sign in to mint\", action: \"sign-in\" };\n case \"upcoming\": return { label: `Starts ${when(drop.startTime)}`, action: \"none\" };\n case \"ended\": return { label: \"This drop has ended\", action: \"none\" };\n case \"sold-out\": return { label: \"Sold out\", action: \"none\" };\n case \"no-link\": return { label: \"Open your claim link to mint\", action: \"none\" };\n case \"not-on-list\": return { label: \"This wallet isn't on the list\", action: \"none\" };\n case \"limit-reached\": return { label: `You've minted your limit (${drop.maxPerWallet})`, action: \"none\" };\n case \"insufficient-balance\": return { label: `Not enough ${token?.symbol ?? \"balance\"}`, action: \"none\" };\n case \"loading\": return { label: \"Checking…\", action: \"none\" };\n }\n })();\n\n const eligibility =\n !listed ? \"Open to everyone\"\n : mint.state === \"ready\" ? \"You're on the list\"\n : mint.state === \"no-link\" ? \"This drop is for a list — open your claim link to mint\"\n : \"This drop is for a list\";\n\n return {\n phase,\n statusText,\n countdown,\n priceText: priceLabel(drop.price.toString(), drop.paymentToken),\n totalText,\n eligibility,\n button,\n maxQuantity: mint.maxQuantity,\n };\n}\n"],"mappings":"AAAA,SAAS,cAAc,yBAAiD;AACxE,SAAS,oBAA0D;AACnE,SAAS,kBAAkB;AAIpB,SAAS,UAAU,GAA2C,WAAmB,QAAgB,KAAwB;AAC9H,MAAI,cAAc,MAAM,UAAU,UAAW,QAAO;AACpD,MAAI,EAAE,cAAc,KAAK,MAAM,EAAE,UAAW,QAAO;AACnD,MAAI,EAAE,YAAY,KAAK,MAAM,EAAE,QAAS,QAAO;AAC/C,SAAO;AACT;AAaA,MAAM,OAAO,CAAC,OAAe,IAAI,KAAK,KAAK,GAAI,EAAE,eAAe,QAAW,EAAE,SAAS,SAAS,KAAK,WAAW,OAAO,SAAS,MAAM,WAAW,QAAQ,UAAU,CAAC;AAG5J,SAAS,cAAc,OAMZ;AAChB,QAAM,EAAE,MAAM,MAAM,WAAW,IAAI,IAAI;AACvC,QAAM,QAAQ,UAAU,MAAM,KAAK,WAAW,KAAK,aAAa,GAAG;AACnE,QAAM,QAAQ,kBAAkB,KAAK,YAAY;AACjD,QAAM,SAAS,OAAO,KAAK,aAAa,MAAM;AAC9C,QAAM,WAAW,MAAM,WAAW,KAAK,KAAK,MAAM,WAAW,KAAK,cAAc,KAAK,cAAc,MAAM;AAEzG,QAAM,aACJ,UAAU,aAAa,wBAAqB,KAAK,KAAK,SAAS,CAAC,KAC9D,UAAU,aAAa,aACvB,UAAU,UAAU,UACpB,KAAK,YAAY,IAAI,0BAAuB;AAChD,QAAM,YACJ,UAAU,aAAa,EAAE,OAAO,aAAa,QAAQ,KAAK,UAAU,IAClE,UAAU,UAAU,KAAK,YAAY,IAAI,EAAE,OAAO,WAAW,QAAQ,KAAK,QAAQ,IAClF;AAEJ,MAAI,YAA2B;AAC/B,MAAI,KAAK,UAAU,WAAW,KAAK,QAAQ,MAAM,OAAO;AACtD,UAAM,EAAE,MAAM,IAAI,aAAa,KAAK,OAAO,UAAU,SAAS;AAC9D,gBAAY,SAAS,aAAa,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,MAAM,MAAM;AAAA,EACrF;AAEA,QAAM,UAAmC,MAAM;AAC7C,YAAQ,KAAK,OAAO;AAAA,MAClB,KAAK;AAAS,eAAO,EAAE,OAAO,QAAQ,QAAQ,IAAI,QAAQ,OAAO;AAAA,MACjE,KAAK;AAAa,eAAO,EAAE,OAAO,mBAAmB,QAAQ,UAAU;AAAA,MACvE,KAAK;AAAY,eAAO,EAAE,OAAO,UAAU,KAAK,KAAK,SAAS,CAAC,IAAI,QAAQ,OAAO;AAAA,MAClF,KAAK;AAAS,eAAO,EAAE,OAAO,uBAAuB,QAAQ,OAAO;AAAA,MACpE,KAAK;AAAY,eAAO,EAAE,OAAO,YAAY,QAAQ,OAAO;AAAA,MAC5D,KAAK;AAAW,eAAO,EAAE,OAAO,gCAAgC,QAAQ,OAAO;AAAA,MAC/E,KAAK;AAAe,eAAO,EAAE,OAAO,iCAAiC,QAAQ,OAAO;AAAA,MACpF,KAAK;AAAiB,eAAO,EAAE,OAAO,6BAA6B,KAAK,YAAY,KAAK,QAAQ,OAAO;AAAA,MACxG,KAAK;AAAwB,eAAO,EAAE,OAAO,cAAc,OAAO,UAAU,SAAS,IAAI,QAAQ,OAAO;AAAA,MACxG,KAAK;AAAW,eAAO,EAAE,OAAO,kBAAa,QAAQ,OAAO;AAAA,IAC9D;AAAA,EACF,GAAG;AAEH,QAAM,cACJ,CAAC,SAAS,qBACR,KAAK,UAAU,UAAU,uBACzB,KAAK,UAAU,YAAY,gEAC3B;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,WAAW,KAAK,MAAM,SAAS,GAAG,KAAK,YAAY;AAAA,IAC9D;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,KAAK;AAAA,EACpB;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/utils/drop/view.ts"],"sourcesContent":["import { formatAmount, getTokenByAddress } from \"@medialane/sdk\";\nimport { dropMintCost, type DropMintState, type DropOnchain } from \"@medialane/sdk/starknet\";\nimport { priceLabel } from \"./sale.js\";\n\nexport type DropPhase = \"upcoming\" | \"live\" | \"sold-out\" | \"ended\";\n\nexport function dropPhase(t: { startTime: number; endTime: number }, maxSupply: bigint, minted: bigint, now: number): DropPhase {\n if (maxSupply !== 0n && minted >= maxSupply) return \"sold-out\";\n if (t.startTime !== 0 && now < t.startTime) return \"upcoming\";\n if (t.endTime !== 0 && now > t.endTime) return \"ended\";\n return \"live\";\n}\n\nexport interface ActionBoxView {\n phase: DropPhase;\n statusText: string;\n countdown: { label: string; target: number } | null;\n priceText: string;\n totalText: string | null;\n eligibility: string | null;\n button: { label: string; action: \"mint\" | \"sign-in\" | \"none\" };\n maxQuantity: bigint;\n}\n\nconst when = (ts: number) => new Date(ts * 1000).toLocaleString(undefined, { weekday: \"short\", day: \"numeric\", month: \"short\", hour: \"2-digit\", minute: \"2-digit\" });\n\n/** Everything the mint box shows, decided from chain state before any transaction. */\nexport function actionBoxView(input: {\n drop: DropOnchain;\n mint: DropMintState;\n quantity: bigint;\n /** Platform fee added to a mint, in basis points. */\n feeBps: number;\n now: number;\n}): ActionBoxView {\n const { drop, mint, feeBps, now } = input;\n const phase = dropPhase(drop, drop.maxSupply, drop.totalMinted, now);\n const token = getTokenByAddress(drop.paymentToken);\n const listed = BigInt(drop.allowlistRoot) !== 0n;\n const quantity = input.quantity < 1n ? 1n : input.quantity > mint.maxQuantity ? mint.maxQuantity : input.quantity;\n\n const statusText =\n phase === \"upcoming\" ? `Upcoming · starts ${when(drop.startTime)}`\n : phase === \"sold-out\" ? \"Sold out\"\n : phase === \"ended\" ? \"Ended\"\n : drop.endTime === 0 ? \"Live · no end date\" : \"Live\";\n const countdown =\n phase === \"upcoming\" ? { label: \"Starts in\", target: drop.startTime }\n : phase === \"live\" && drop.endTime !== 0 ? { label: \"Ends in\", target: drop.endTime }\n : null;\n\n let totalText: string | null = null;\n if (mint.state === \"ready\" && drop.price > 0n && token) {\n const { total } = dropMintCost(drop.price, quantity, feeBps);\n totalText = `Total ${formatAmount(total.toString(), token.decimals)} ${token.symbol} (incl. platform fee)`;\n }\n\n const button: ActionBoxView[\"button\"] = (() => {\n switch (mint.state) {\n case \"ready\": return { label: `Mint ${quantity}`, action: \"mint\" };\n case \"no-wallet\": return { label: \"Sign in to mint\", action: \"sign-in\" };\n case \"upcoming\": return { label: `Starts ${when(drop.startTime)}`, action: \"none\" };\n case \"ended\": return { label: \"This drop has ended\", action: \"none\" };\n case \"sold-out\": return { label: \"Sold out\", action: \"none\" };\n case \"no-link\": return { label: \"Open your claim link to mint\", action: \"none\" };\n case \"not-on-list\": return { label: \"This wallet isn't on the list\", action: \"none\" };\n case \"limit-reached\": return { label: `You've minted your limit (${drop.maxPerWallet})`, action: \"none\" };\n case \"insufficient-balance\": return { label: `Not enough ${token?.symbol ?? \"balance\"}`, action: \"none\" };\n case \"loading\": return { label: \"Checking…\", action: \"none\" };\n }\n })();\n\n const eligibility =\n !listed ? \"Open to everyone\"\n : mint.state === \"ready\" ? \"You're on the list\"\n : mint.state === \"no-link\" ? \"This drop is for a list — open your claim link to mint\"\n : \"This drop is for a list\";\n\n return {\n phase,\n statusText,\n countdown,\n priceText: priceLabel(drop.price.toString(), drop.paymentToken),\n totalText,\n eligibility,\n button,\n maxQuantity: mint.maxQuantity,\n };\n}\n"],"mappings":"AAAA,SAAS,cAAc,yBAAyB;AAChD,SAAS,oBAA0D;AACnE,SAAS,kBAAkB;AAIpB,SAAS,UAAU,GAA2C,WAAmB,QAAgB,KAAwB;AAC9H,MAAI,cAAc,MAAM,UAAU,UAAW,QAAO;AACpD,MAAI,EAAE,cAAc,KAAK,MAAM,EAAE,UAAW,QAAO;AACnD,MAAI,EAAE,YAAY,KAAK,MAAM,EAAE,QAAS,QAAO;AAC/C,SAAO;AACT;AAaA,MAAM,OAAO,CAAC,OAAe,IAAI,KAAK,KAAK,GAAI,EAAE,eAAe,QAAW,EAAE,SAAS,SAAS,KAAK,WAAW,OAAO,SAAS,MAAM,WAAW,QAAQ,UAAU,CAAC;AAG5J,SAAS,cAAc,OAOZ;AAChB,QAAM,EAAE,MAAM,MAAM,QAAQ,IAAI,IAAI;AACpC,QAAM,QAAQ,UAAU,MAAM,KAAK,WAAW,KAAK,aAAa,GAAG;AACnE,QAAM,QAAQ,kBAAkB,KAAK,YAAY;AACjD,QAAM,SAAS,OAAO,KAAK,aAAa,MAAM;AAC9C,QAAM,WAAW,MAAM,WAAW,KAAK,KAAK,MAAM,WAAW,KAAK,cAAc,KAAK,cAAc,MAAM;AAEzG,QAAM,aACJ,UAAU,aAAa,wBAAqB,KAAK,KAAK,SAAS,CAAC,KAC9D,UAAU,aAAa,aACvB,UAAU,UAAU,UACpB,KAAK,YAAY,IAAI,0BAAuB;AAChD,QAAM,YACJ,UAAU,aAAa,EAAE,OAAO,aAAa,QAAQ,KAAK,UAAU,IAClE,UAAU,UAAU,KAAK,YAAY,IAAI,EAAE,OAAO,WAAW,QAAQ,KAAK,QAAQ,IAClF;AAEJ,MAAI,YAA2B;AAC/B,MAAI,KAAK,UAAU,WAAW,KAAK,QAAQ,MAAM,OAAO;AACtD,UAAM,EAAE,MAAM,IAAI,aAAa,KAAK,OAAO,UAAU,MAAM;AAC3D,gBAAY,SAAS,aAAa,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,MAAM,MAAM;AAAA,EACrF;AAEA,QAAM,UAAmC,MAAM;AAC7C,YAAQ,KAAK,OAAO;AAAA,MAClB,KAAK;AAAS,eAAO,EAAE,OAAO,QAAQ,QAAQ,IAAI,QAAQ,OAAO;AAAA,MACjE,KAAK;AAAa,eAAO,EAAE,OAAO,mBAAmB,QAAQ,UAAU;AAAA,MACvE,KAAK;AAAY,eAAO,EAAE,OAAO,UAAU,KAAK,KAAK,SAAS,CAAC,IAAI,QAAQ,OAAO;AAAA,MAClF,KAAK;AAAS,eAAO,EAAE,OAAO,uBAAuB,QAAQ,OAAO;AAAA,MACpE,KAAK;AAAY,eAAO,EAAE,OAAO,YAAY,QAAQ,OAAO;AAAA,MAC5D,KAAK;AAAW,eAAO,EAAE,OAAO,gCAAgC,QAAQ,OAAO;AAAA,MAC/E,KAAK;AAAe,eAAO,EAAE,OAAO,iCAAiC,QAAQ,OAAO;AAAA,MACpF,KAAK;AAAiB,eAAO,EAAE,OAAO,6BAA6B,KAAK,YAAY,KAAK,QAAQ,OAAO;AAAA,MACxG,KAAK;AAAwB,eAAO,EAAE,OAAO,cAAc,OAAO,UAAU,SAAS,IAAI,QAAQ,OAAO;AAAA,MACxG,KAAK;AAAW,eAAO,EAAE,OAAO,kBAAa,QAAQ,OAAO;AAAA,IAC9D;AAAA,EACF,GAAG;AAEH,QAAM,cACJ,CAAC,SAAS,qBACR,KAAK,UAAU,UAAU,uBACzB,KAAK,UAAU,YAAY,gEAC3B;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,WAAW,KAAK,MAAM,SAAS,GAAG,KAAK,YAAY;AAAA,IAC9D;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,KAAK;AAAA,EACpB;AACF;","names":[]}
@@ -31,6 +31,7 @@ var use_drops_exports = {};
31
31
  __export(use_drops_exports, {
32
32
  useDrop: () => useDrop,
33
33
  useDropChain: () => useDropChain,
34
+ useDropFee: () => useDropFee,
34
35
  useDropFile: () => useDropFile,
35
36
  useDropMints: () => useDropMints,
36
37
  useDrops: () => useDrops,
@@ -62,6 +63,11 @@ function useDropMints(getClient, contract) {
62
63
  const { data, isLoading, mutate } = (0, import_swr.default)(contract ? ["drop-mints", contract] : null, () => client.api.getDropMints(contract, { limit: 20 }), { ...quiet, refreshInterval: 3e4 });
63
64
  return { mints: data?.data ?? [], isLoading, mutate };
64
65
  }
66
+ function useDropFee(getClient) {
67
+ const client = (0, import_use_medialane_client.useMedialaneClient)(getClient);
68
+ const { data } = (0, import_swr.default)("drop-fee", () => client.api.getDropFee(), { revalidateOnFocus: false });
69
+ return data?.launchpadBps ?? null;
70
+ }
65
71
  function useDropFile(getClient, baseUri, name) {
66
72
  const client = (0, import_use_medialane_client.useMedialaneClient)(getClient);
67
73
  const { data } = (0, import_swr.default)(baseUri ? ["drop-file", baseUri, name] : null, async () => (await client.api.resolveMetadata(`${baseUri}${name}`)).data, quiet);
@@ -82,6 +88,7 @@ function useDropChain(provider, contract, wallet) {
82
88
  0 && (module.exports = {
83
89
  useDrop,
84
90
  useDropChain,
91
+ useDropFee,
85
92
  useDropFile,
86
93
  useDropMints,
87
94
  useDrops,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/use-drops.ts"],"sourcesContent":["\"use client\";\n\nimport useSWR from \"swr\";\nimport type { ApiDrop, ApiDropListStatus, ApiDropMint } from \"@medialane/sdk\";\nimport { dropClaimedBy, readDrop, type DropOnchain, type MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { useMedialaneClient } from \"./use-medialane-client.js\";\nimport { erc20Balance } from \"./drop/chain.js\";\nimport type { DropProvider } from \"./drop/types.js\";\n\nconst quiet = { revalidateOnFocus: false, shouldRetryOnError: false } as const;\n\nexport function useDrops(getClient: () => MedialaneClient, status: ApiDropListStatus) {\n const client = useMedialaneClient(getClient);\n const { data, error, isLoading } = useSWR([\"drops\", status], () => client.api.getDrops({ status, limit: 48 }), quiet);\n return { drops: data?.data ?? ([] as ApiDrop[]), isLoading, error };\n}\n\nexport function useMyDrops(getClient: () => MedialaneClient, organizer: string | null) {\n const client = useMedialaneClient(getClient);\n const { data, error, isLoading } = useSWR(organizer ? [\"my-drops\", organizer] : null, () => client.api.getDrops({ organizer: organizer!, limit: 100 }), quiet);\n return { drops: data?.data ?? ([] as ApiDrop[]), isLoading, error };\n}\n\nexport function useDrop(getClient: () => MedialaneClient, contract: string | null) {\n const client = useMedialaneClient(getClient);\n const { data, error, isLoading, mutate } = useSWR(contract ? [\"drop\", contract] : null, () => client.api.getDrop(contract!), { ...quiet, refreshInterval: 30_000 });\n return { drop: data ?? null, isLoading, error, mutate };\n}\n\nexport function useDropMints(getClient: () => MedialaneClient, contract: string | null) {\n const client = useMedialaneClient(getClient);\n const { data, isLoading, mutate } = useSWR(contract ? [\"drop-mints\", contract] : null, () => client.api.getDropMints(contract!, { limit: 20 }), { ...quiet, refreshInterval: 30_000 });\n return { mints: data?.data ?? ([] as ApiDropMint[]), isLoading, mutate };\n}\n\n/** A file from the drop's metadata folder (\"1\" or \"collection.json\"). */\nexport function useDropFile<T = Record<string, unknown>>(getClient: () => MedialaneClient, baseUri: string | null, name: string) {\n const client = useMedialaneClient(getClient);\n const { data } = useSWR(baseUri ? [\"drop-file\", baseUri, name] : null, async () => (await client.api.resolveMetadata(`${baseUri}${name}`)).data as T, quiet);\n return data ?? null;\n}\n\nexport interface DropChainState {\n drop: DropOnchain | null;\n claimed: bigint | null;\n balance: bigint | null;\n}\n\n/** The drop's terms and supply, the wallet's claims and balance — read from chain. */\nexport function useDropChain(provider: DropProvider, contract: string | null, wallet: string | null) {\n const { data, mutate, error } = useSWR(contract ? [\"drop-chain\", contract, wallet] : null, async (): Promise<DropChainState> => {\n const drop = await readDrop(provider, contract!);\n const [claimed, balance] = await Promise.all([\n wallet ? dropClaimedBy(provider, contract!, wallet) : Promise.resolve(null),\n wallet && drop.price > 0n ? erc20Balance(provider, drop.paymentToken, wallet) : Promise.resolve(null),\n ]);\n return { drop, claimed, balance };\n }, { revalidateOnFocus: true, refreshInterval: 15_000 });\n return { ...(data ?? { drop: null, claimed: null, balance: null }), error, mutate };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,iBAAmB;AAEnB,sBAAgF;AAChF,kCAAmC;AACnC,mBAA6B;AAG7B,MAAM,QAAQ,EAAE,mBAAmB,OAAO,oBAAoB,MAAM;AAE7D,SAAS,SAAS,WAAkC,QAA2B;AACpF,QAAM,aAAS,gDAAmB,SAAS;AAC3C,QAAM,EAAE,MAAM,OAAO,UAAU,QAAI,WAAAA,SAAO,CAAC,SAAS,MAAM,GAAG,MAAM,OAAO,IAAI,SAAS,EAAE,QAAQ,OAAO,GAAG,CAAC,GAAG,KAAK;AACpH,SAAO,EAAE,OAAO,MAAM,QAAS,CAAC,GAAiB,WAAW,MAAM;AACpE;AAEO,SAAS,WAAW,WAAkC,WAA0B;AACrF,QAAM,aAAS,gDAAmB,SAAS;AAC3C,QAAM,EAAE,MAAM,OAAO,UAAU,QAAI,WAAAA,SAAO,YAAY,CAAC,YAAY,SAAS,IAAI,MAAM,MAAM,OAAO,IAAI,SAAS,EAAE,WAAuB,OAAO,IAAI,CAAC,GAAG,KAAK;AAC7J,SAAO,EAAE,OAAO,MAAM,QAAS,CAAC,GAAiB,WAAW,MAAM;AACpE;AAEO,SAAS,QAAQ,WAAkC,UAAyB;AACjF,QAAM,aAAS,gDAAmB,SAAS;AAC3C,QAAM,EAAE,MAAM,OAAO,WAAW,OAAO,QAAI,WAAAA,SAAO,WAAW,CAAC,QAAQ,QAAQ,IAAI,MAAM,MAAM,OAAO,IAAI,QAAQ,QAAS,GAAG,EAAE,GAAG,OAAO,iBAAiB,IAAO,CAAC;AAClK,SAAO,EAAE,MAAM,QAAQ,MAAM,WAAW,OAAO,OAAO;AACxD;AAEO,SAAS,aAAa,WAAkC,UAAyB;AACtF,QAAM,aAAS,gDAAmB,SAAS;AAC3C,QAAM,EAAE,MAAM,WAAW,OAAO,QAAI,WAAAA,SAAO,WAAW,CAAC,cAAc,QAAQ,IAAI,MAAM,MAAM,OAAO,IAAI,aAAa,UAAW,EAAE,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,OAAO,iBAAiB,IAAO,CAAC;AACrL,SAAO,EAAE,OAAO,MAAM,QAAS,CAAC,GAAqB,WAAW,OAAO;AACzE;AAGO,SAAS,YAAyC,WAAkC,SAAwB,MAAc;AAC/H,QAAM,aAAS,gDAAmB,SAAS;AAC3C,QAAM,EAAE,KAAK,QAAI,WAAAA,SAAO,UAAU,CAAC,aAAa,SAAS,IAAI,IAAI,MAAM,aAAa,MAAM,OAAO,IAAI,gBAAgB,GAAG,OAAO,GAAG,IAAI,EAAE,GAAG,MAAW,KAAK;AAC3J,SAAO,QAAQ;AACjB;AASO,SAAS,aAAa,UAAwB,UAAyB,QAAuB;AACnG,QAAM,EAAE,MAAM,QAAQ,MAAM,QAAI,WAAAA,SAAO,WAAW,CAAC,cAAc,UAAU,MAAM,IAAI,MAAM,YAAqC;AAC9H,UAAM,OAAO,UAAM,0BAAS,UAAU,QAAS;AAC/C,UAAM,CAAC,SAAS,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC3C,aAAS,+BAAc,UAAU,UAAW,MAAM,IAAI,QAAQ,QAAQ,IAAI;AAAA,MAC1E,UAAU,KAAK,QAAQ,SAAK,2BAAa,UAAU,KAAK,cAAc,MAAM,IAAI,QAAQ,QAAQ,IAAI;AAAA,IACtG,CAAC;AACD,WAAO,EAAE,MAAM,SAAS,QAAQ;AAAA,EAClC,GAAG,EAAE,mBAAmB,MAAM,iBAAiB,KAAO,CAAC;AACvD,SAAO,EAAE,GAAI,QAAQ,EAAE,MAAM,MAAM,SAAS,MAAM,SAAS,KAAK,GAAI,OAAO,OAAO;AACpF;","names":["useSWR"]}
1
+ {"version":3,"sources":["../../src/utils/use-drops.ts"],"sourcesContent":["\"use client\";\n\nimport useSWR from \"swr\";\nimport type { ApiDrop, ApiDropListStatus, ApiDropMint } from \"@medialane/sdk\";\nimport { dropClaimedBy, readDrop, type DropOnchain, type MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { useMedialaneClient } from \"./use-medialane-client.js\";\nimport { erc20Balance } from \"./drop/chain.js\";\nimport type { DropProvider } from \"./drop/types.js\";\n\nconst quiet = { revalidateOnFocus: false, shouldRetryOnError: false } as const;\n\nexport function useDrops(getClient: () => MedialaneClient, status: ApiDropListStatus) {\n const client = useMedialaneClient(getClient);\n const { data, error, isLoading } = useSWR([\"drops\", status], () => client.api.getDrops({ status, limit: 48 }), quiet);\n return { drops: data?.data ?? ([] as ApiDrop[]), isLoading, error };\n}\n\nexport function useMyDrops(getClient: () => MedialaneClient, organizer: string | null) {\n const client = useMedialaneClient(getClient);\n const { data, error, isLoading } = useSWR(organizer ? [\"my-drops\", organizer] : null, () => client.api.getDrops({ organizer: organizer!, limit: 100 }), quiet);\n return { drops: data?.data ?? ([] as ApiDrop[]), isLoading, error };\n}\n\nexport function useDrop(getClient: () => MedialaneClient, contract: string | null) {\n const client = useMedialaneClient(getClient);\n const { data, error, isLoading, mutate } = useSWR(contract ? [\"drop\", contract] : null, () => client.api.getDrop(contract!), { ...quiet, refreshInterval: 30_000 });\n return { drop: data ?? null, isLoading, error, mutate };\n}\n\nexport function useDropMints(getClient: () => MedialaneClient, contract: string | null) {\n const client = useMedialaneClient(getClient);\n const { data, isLoading, mutate } = useSWR(contract ? [\"drop-mints\", contract] : null, () => client.api.getDropMints(contract!, { limit: 20 }), { ...quiet, refreshInterval: 30_000 });\n return { mints: data?.data ?? ([] as ApiDropMint[]), isLoading, mutate };\n}\n\n/** The platform fee, in basis points, the backend adds to a mint for this app; null until known. */\nexport function useDropFee(getClient: () => MedialaneClient): number | null {\n const client = useMedialaneClient(getClient);\n const { data } = useSWR(\"drop-fee\", () => client.api.getDropFee(), { revalidateOnFocus: false });\n return data?.launchpadBps ?? null;\n}\n\n/** A file from the drop's metadata folder (\"1\" or \"collection.json\"). */\nexport function useDropFile<T = Record<string, unknown>>(getClient: () => MedialaneClient, baseUri: string | null, name: string) {\n const client = useMedialaneClient(getClient);\n const { data } = useSWR(baseUri ? [\"drop-file\", baseUri, name] : null, async () => (await client.api.resolveMetadata(`${baseUri}${name}`)).data as T, quiet);\n return data ?? null;\n}\n\nexport interface DropChainState {\n drop: DropOnchain | null;\n claimed: bigint | null;\n balance: bigint | null;\n}\n\n/** The drop's terms and supply, the wallet's claims and balance — read from chain. */\nexport function useDropChain(provider: DropProvider, contract: string | null, wallet: string | null) {\n const { data, mutate, error } = useSWR(contract ? [\"drop-chain\", contract, wallet] : null, async (): Promise<DropChainState> => {\n const drop = await readDrop(provider, contract!);\n const [claimed, balance] = await Promise.all([\n wallet ? dropClaimedBy(provider, contract!, wallet) : Promise.resolve(null),\n wallet && drop.price > 0n ? erc20Balance(provider, drop.paymentToken, wallet) : Promise.resolve(null),\n ]);\n return { drop, claimed, balance };\n }, { revalidateOnFocus: true, refreshInterval: 15_000 });\n return { ...(data ?? { drop: null, claimed: null, balance: null }), error, mutate };\n}\n"],"mappings":"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","names":["useSWR"]}
@@ -28,6 +28,8 @@ declare function useDropMints(getClient: () => MedialaneClient, contract: string
28
28
  isLoading: boolean;
29
29
  mutate: swr.KeyedMutator<_medialane_sdk.ApiResponse<ApiDropMint[]>>;
30
30
  };
31
+ /** The platform fee, in basis points, the backend adds to a mint for this app; null until known. */
32
+ declare function useDropFee(getClient: () => MedialaneClient): number | null;
31
33
  /** A file from the drop's metadata folder ("1" or "collection.json"). */
32
34
  declare function useDropFile<T = Record<string, unknown>>(getClient: () => MedialaneClient, baseUri: string | null, name: string): NonNullable<T> | null;
33
35
  interface DropChainState {
@@ -44,4 +46,4 @@ declare function useDropChain(provider: DropProvider, contract: string | null, w
44
46
  balance: bigint | null;
45
47
  };
46
48
 
47
- export { type DropChainState, useDrop, useDropChain, useDropFile, useDropMints, useDrops, useMyDrops };
49
+ export { type DropChainState, useDrop, useDropChain, useDropFee, useDropFile, useDropMints, useDrops, useMyDrops };
@@ -28,6 +28,8 @@ declare function useDropMints(getClient: () => MedialaneClient, contract: string
28
28
  isLoading: boolean;
29
29
  mutate: swr.KeyedMutator<_medialane_sdk.ApiResponse<ApiDropMint[]>>;
30
30
  };
31
+ /** The platform fee, in basis points, the backend adds to a mint for this app; null until known. */
32
+ declare function useDropFee(getClient: () => MedialaneClient): number | null;
31
33
  /** A file from the drop's metadata folder ("1" or "collection.json"). */
32
34
  declare function useDropFile<T = Record<string, unknown>>(getClient: () => MedialaneClient, baseUri: string | null, name: string): NonNullable<T> | null;
33
35
  interface DropChainState {
@@ -44,4 +46,4 @@ declare function useDropChain(provider: DropProvider, contract: string | null, w
44
46
  balance: bigint | null;
45
47
  };
46
48
 
47
- export { type DropChainState, useDrop, useDropChain, useDropFile, useDropMints, useDrops, useMyDrops };
49
+ export { type DropChainState, useDrop, useDropChain, useDropFee, useDropFile, useDropMints, useDrops, useMyDrops };
@@ -24,6 +24,11 @@ function useDropMints(getClient, contract) {
24
24
  const { data, isLoading, mutate } = useSWR(contract ? ["drop-mints", contract] : null, () => client.api.getDropMints(contract, { limit: 20 }), { ...quiet, refreshInterval: 3e4 });
25
25
  return { mints: data?.data ?? [], isLoading, mutate };
26
26
  }
27
+ function useDropFee(getClient) {
28
+ const client = useMedialaneClient(getClient);
29
+ const { data } = useSWR("drop-fee", () => client.api.getDropFee(), { revalidateOnFocus: false });
30
+ return data?.launchpadBps ?? null;
31
+ }
27
32
  function useDropFile(getClient, baseUri, name) {
28
33
  const client = useMedialaneClient(getClient);
29
34
  const { data } = useSWR(baseUri ? ["drop-file", baseUri, name] : null, async () => (await client.api.resolveMetadata(`${baseUri}${name}`)).data, quiet);
@@ -43,6 +48,7 @@ function useDropChain(provider, contract, wallet) {
43
48
  export {
44
49
  useDrop,
45
50
  useDropChain,
51
+ useDropFee,
46
52
  useDropFile,
47
53
  useDropMints,
48
54
  useDrops,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/use-drops.ts"],"sourcesContent":["\"use client\";\n\nimport useSWR from \"swr\";\nimport type { ApiDrop, ApiDropListStatus, ApiDropMint } from \"@medialane/sdk\";\nimport { dropClaimedBy, readDrop, type DropOnchain, type MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { useMedialaneClient } from \"./use-medialane-client.js\";\nimport { erc20Balance } from \"./drop/chain.js\";\nimport type { DropProvider } from \"./drop/types.js\";\n\nconst quiet = { revalidateOnFocus: false, shouldRetryOnError: false } as const;\n\nexport function useDrops(getClient: () => MedialaneClient, status: ApiDropListStatus) {\n const client = useMedialaneClient(getClient);\n const { data, error, isLoading } = useSWR([\"drops\", status], () => client.api.getDrops({ status, limit: 48 }), quiet);\n return { drops: data?.data ?? ([] as ApiDrop[]), isLoading, error };\n}\n\nexport function useMyDrops(getClient: () => MedialaneClient, organizer: string | null) {\n const client = useMedialaneClient(getClient);\n const { data, error, isLoading } = useSWR(organizer ? [\"my-drops\", organizer] : null, () => client.api.getDrops({ organizer: organizer!, limit: 100 }), quiet);\n return { drops: data?.data ?? ([] as ApiDrop[]), isLoading, error };\n}\n\nexport function useDrop(getClient: () => MedialaneClient, contract: string | null) {\n const client = useMedialaneClient(getClient);\n const { data, error, isLoading, mutate } = useSWR(contract ? [\"drop\", contract] : null, () => client.api.getDrop(contract!), { ...quiet, refreshInterval: 30_000 });\n return { drop: data ?? null, isLoading, error, mutate };\n}\n\nexport function useDropMints(getClient: () => MedialaneClient, contract: string | null) {\n const client = useMedialaneClient(getClient);\n const { data, isLoading, mutate } = useSWR(contract ? [\"drop-mints\", contract] : null, () => client.api.getDropMints(contract!, { limit: 20 }), { ...quiet, refreshInterval: 30_000 });\n return { mints: data?.data ?? ([] as ApiDropMint[]), isLoading, mutate };\n}\n\n/** A file from the drop's metadata folder (\"1\" or \"collection.json\"). */\nexport function useDropFile<T = Record<string, unknown>>(getClient: () => MedialaneClient, baseUri: string | null, name: string) {\n const client = useMedialaneClient(getClient);\n const { data } = useSWR(baseUri ? [\"drop-file\", baseUri, name] : null, async () => (await client.api.resolveMetadata(`${baseUri}${name}`)).data as T, quiet);\n return data ?? null;\n}\n\nexport interface DropChainState {\n drop: DropOnchain | null;\n claimed: bigint | null;\n balance: bigint | null;\n}\n\n/** The drop's terms and supply, the wallet's claims and balance — read from chain. */\nexport function useDropChain(provider: DropProvider, contract: string | null, wallet: string | null) {\n const { data, mutate, error } = useSWR(contract ? [\"drop-chain\", contract, wallet] : null, async (): Promise<DropChainState> => {\n const drop = await readDrop(provider, contract!);\n const [claimed, balance] = await Promise.all([\n wallet ? dropClaimedBy(provider, contract!, wallet) : Promise.resolve(null),\n wallet && drop.price > 0n ? erc20Balance(provider, drop.paymentToken, wallet) : Promise.resolve(null),\n ]);\n return { drop, claimed, balance };\n }, { revalidateOnFocus: true, refreshInterval: 15_000 });\n return { ...(data ?? { drop: null, claimed: null, balance: null }), error, mutate };\n}\n"],"mappings":";AAEA,OAAO,YAAY;AAEnB,SAAS,eAAe,gBAAwD;AAChF,SAAS,0BAA0B;AACnC,SAAS,oBAAoB;AAG7B,MAAM,QAAQ,EAAE,mBAAmB,OAAO,oBAAoB,MAAM;AAE7D,SAAS,SAAS,WAAkC,QAA2B;AACpF,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,EAAE,MAAM,OAAO,UAAU,IAAI,OAAO,CAAC,SAAS,MAAM,GAAG,MAAM,OAAO,IAAI,SAAS,EAAE,QAAQ,OAAO,GAAG,CAAC,GAAG,KAAK;AACpH,SAAO,EAAE,OAAO,MAAM,QAAS,CAAC,GAAiB,WAAW,MAAM;AACpE;AAEO,SAAS,WAAW,WAAkC,WAA0B;AACrF,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,EAAE,MAAM,OAAO,UAAU,IAAI,OAAO,YAAY,CAAC,YAAY,SAAS,IAAI,MAAM,MAAM,OAAO,IAAI,SAAS,EAAE,WAAuB,OAAO,IAAI,CAAC,GAAG,KAAK;AAC7J,SAAO,EAAE,OAAO,MAAM,QAAS,CAAC,GAAiB,WAAW,MAAM;AACpE;AAEO,SAAS,QAAQ,WAAkC,UAAyB;AACjF,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,EAAE,MAAM,OAAO,WAAW,OAAO,IAAI,OAAO,WAAW,CAAC,QAAQ,QAAQ,IAAI,MAAM,MAAM,OAAO,IAAI,QAAQ,QAAS,GAAG,EAAE,GAAG,OAAO,iBAAiB,IAAO,CAAC;AAClK,SAAO,EAAE,MAAM,QAAQ,MAAM,WAAW,OAAO,OAAO;AACxD;AAEO,SAAS,aAAa,WAAkC,UAAyB;AACtF,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,EAAE,MAAM,WAAW,OAAO,IAAI,OAAO,WAAW,CAAC,cAAc,QAAQ,IAAI,MAAM,MAAM,OAAO,IAAI,aAAa,UAAW,EAAE,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,OAAO,iBAAiB,IAAO,CAAC;AACrL,SAAO,EAAE,OAAO,MAAM,QAAS,CAAC,GAAqB,WAAW,OAAO;AACzE;AAGO,SAAS,YAAyC,WAAkC,SAAwB,MAAc;AAC/H,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,EAAE,KAAK,IAAI,OAAO,UAAU,CAAC,aAAa,SAAS,IAAI,IAAI,MAAM,aAAa,MAAM,OAAO,IAAI,gBAAgB,GAAG,OAAO,GAAG,IAAI,EAAE,GAAG,MAAW,KAAK;AAC3J,SAAO,QAAQ;AACjB;AASO,SAAS,aAAa,UAAwB,UAAyB,QAAuB;AACnG,QAAM,EAAE,MAAM,QAAQ,MAAM,IAAI,OAAO,WAAW,CAAC,cAAc,UAAU,MAAM,IAAI,MAAM,YAAqC;AAC9H,UAAM,OAAO,MAAM,SAAS,UAAU,QAAS;AAC/C,UAAM,CAAC,SAAS,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC3C,SAAS,cAAc,UAAU,UAAW,MAAM,IAAI,QAAQ,QAAQ,IAAI;AAAA,MAC1E,UAAU,KAAK,QAAQ,KAAK,aAAa,UAAU,KAAK,cAAc,MAAM,IAAI,QAAQ,QAAQ,IAAI;AAAA,IACtG,CAAC;AACD,WAAO,EAAE,MAAM,SAAS,QAAQ;AAAA,EAClC,GAAG,EAAE,mBAAmB,MAAM,iBAAiB,KAAO,CAAC;AACvD,SAAO,EAAE,GAAI,QAAQ,EAAE,MAAM,MAAM,SAAS,MAAM,SAAS,KAAK,GAAI,OAAO,OAAO;AACpF;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/use-drops.ts"],"sourcesContent":["\"use client\";\n\nimport useSWR from \"swr\";\nimport type { ApiDrop, ApiDropListStatus, ApiDropMint } from \"@medialane/sdk\";\nimport { dropClaimedBy, readDrop, type DropOnchain, type MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { useMedialaneClient } from \"./use-medialane-client.js\";\nimport { erc20Balance } from \"./drop/chain.js\";\nimport type { DropProvider } from \"./drop/types.js\";\n\nconst quiet = { revalidateOnFocus: false, shouldRetryOnError: false } as const;\n\nexport function useDrops(getClient: () => MedialaneClient, status: ApiDropListStatus) {\n const client = useMedialaneClient(getClient);\n const { data, error, isLoading } = useSWR([\"drops\", status], () => client.api.getDrops({ status, limit: 48 }), quiet);\n return { drops: data?.data ?? ([] as ApiDrop[]), isLoading, error };\n}\n\nexport function useMyDrops(getClient: () => MedialaneClient, organizer: string | null) {\n const client = useMedialaneClient(getClient);\n const { data, error, isLoading } = useSWR(organizer ? [\"my-drops\", organizer] : null, () => client.api.getDrops({ organizer: organizer!, limit: 100 }), quiet);\n return { drops: data?.data ?? ([] as ApiDrop[]), isLoading, error };\n}\n\nexport function useDrop(getClient: () => MedialaneClient, contract: string | null) {\n const client = useMedialaneClient(getClient);\n const { data, error, isLoading, mutate } = useSWR(contract ? [\"drop\", contract] : null, () => client.api.getDrop(contract!), { ...quiet, refreshInterval: 30_000 });\n return { drop: data ?? null, isLoading, error, mutate };\n}\n\nexport function useDropMints(getClient: () => MedialaneClient, contract: string | null) {\n const client = useMedialaneClient(getClient);\n const { data, isLoading, mutate } = useSWR(contract ? [\"drop-mints\", contract] : null, () => client.api.getDropMints(contract!, { limit: 20 }), { ...quiet, refreshInterval: 30_000 });\n return { mints: data?.data ?? ([] as ApiDropMint[]), isLoading, mutate };\n}\n\n/** The platform fee, in basis points, the backend adds to a mint for this app; null until known. */\nexport function useDropFee(getClient: () => MedialaneClient): number | null {\n const client = useMedialaneClient(getClient);\n const { data } = useSWR(\"drop-fee\", () => client.api.getDropFee(), { revalidateOnFocus: false });\n return data?.launchpadBps ?? null;\n}\n\n/** A file from the drop's metadata folder (\"1\" or \"collection.json\"). */\nexport function useDropFile<T = Record<string, unknown>>(getClient: () => MedialaneClient, baseUri: string | null, name: string) {\n const client = useMedialaneClient(getClient);\n const { data } = useSWR(baseUri ? [\"drop-file\", baseUri, name] : null, async () => (await client.api.resolveMetadata(`${baseUri}${name}`)).data as T, quiet);\n return data ?? null;\n}\n\nexport interface DropChainState {\n drop: DropOnchain | null;\n claimed: bigint | null;\n balance: bigint | null;\n}\n\n/** The drop's terms and supply, the wallet's claims and balance — read from chain. */\nexport function useDropChain(provider: DropProvider, contract: string | null, wallet: string | null) {\n const { data, mutate, error } = useSWR(contract ? [\"drop-chain\", contract, wallet] : null, async (): Promise<DropChainState> => {\n const drop = await readDrop(provider, contract!);\n const [claimed, balance] = await Promise.all([\n wallet ? dropClaimedBy(provider, contract!, wallet) : Promise.resolve(null),\n wallet && drop.price > 0n ? erc20Balance(provider, drop.paymentToken, wallet) : Promise.resolve(null),\n ]);\n return { drop, claimed, balance };\n }, { revalidateOnFocus: true, refreshInterval: 15_000 });\n return { ...(data ?? { drop: null, claimed: null, balance: null }), error, mutate };\n}\n"],"mappings":";AAEA,OAAO,YAAY;AAEnB,SAAS,eAAe,gBAAwD;AAChF,SAAS,0BAA0B;AACnC,SAAS,oBAAoB;AAG7B,MAAM,QAAQ,EAAE,mBAAmB,OAAO,oBAAoB,MAAM;AAE7D,SAAS,SAAS,WAAkC,QAA2B;AACpF,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,EAAE,MAAM,OAAO,UAAU,IAAI,OAAO,CAAC,SAAS,MAAM,GAAG,MAAM,OAAO,IAAI,SAAS,EAAE,QAAQ,OAAO,GAAG,CAAC,GAAG,KAAK;AACpH,SAAO,EAAE,OAAO,MAAM,QAAS,CAAC,GAAiB,WAAW,MAAM;AACpE;AAEO,SAAS,WAAW,WAAkC,WAA0B;AACrF,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,EAAE,MAAM,OAAO,UAAU,IAAI,OAAO,YAAY,CAAC,YAAY,SAAS,IAAI,MAAM,MAAM,OAAO,IAAI,SAAS,EAAE,WAAuB,OAAO,IAAI,CAAC,GAAG,KAAK;AAC7J,SAAO,EAAE,OAAO,MAAM,QAAS,CAAC,GAAiB,WAAW,MAAM;AACpE;AAEO,SAAS,QAAQ,WAAkC,UAAyB;AACjF,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,EAAE,MAAM,OAAO,WAAW,OAAO,IAAI,OAAO,WAAW,CAAC,QAAQ,QAAQ,IAAI,MAAM,MAAM,OAAO,IAAI,QAAQ,QAAS,GAAG,EAAE,GAAG,OAAO,iBAAiB,IAAO,CAAC;AAClK,SAAO,EAAE,MAAM,QAAQ,MAAM,WAAW,OAAO,OAAO;AACxD;AAEO,SAAS,aAAa,WAAkC,UAAyB;AACtF,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,EAAE,MAAM,WAAW,OAAO,IAAI,OAAO,WAAW,CAAC,cAAc,QAAQ,IAAI,MAAM,MAAM,OAAO,IAAI,aAAa,UAAW,EAAE,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,OAAO,iBAAiB,IAAO,CAAC;AACrL,SAAO,EAAE,OAAO,MAAM,QAAS,CAAC,GAAqB,WAAW,OAAO;AACzE;AAGO,SAAS,WAAW,WAAiD;AAC1E,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,EAAE,KAAK,IAAI,OAAO,YAAY,MAAM,OAAO,IAAI,WAAW,GAAG,EAAE,mBAAmB,MAAM,CAAC;AAC/F,SAAO,MAAM,gBAAgB;AAC/B;AAGO,SAAS,YAAyC,WAAkC,SAAwB,MAAc;AAC/H,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,EAAE,KAAK,IAAI,OAAO,UAAU,CAAC,aAAa,SAAS,IAAI,IAAI,MAAM,aAAa,MAAM,OAAO,IAAI,gBAAgB,GAAG,OAAO,GAAG,IAAI,EAAE,GAAG,MAAW,KAAK;AAC3J,SAAO,QAAQ;AACjB;AASO,SAAS,aAAa,UAAwB,UAAyB,QAAuB;AACnG,QAAM,EAAE,MAAM,QAAQ,MAAM,IAAI,OAAO,WAAW,CAAC,cAAc,UAAU,MAAM,IAAI,MAAM,YAAqC;AAC9H,UAAM,OAAO,MAAM,SAAS,UAAU,QAAS;AAC/C,UAAM,CAAC,SAAS,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC3C,SAAS,cAAc,UAAU,UAAW,MAAM,IAAI,QAAQ,QAAQ,IAAI;AAAA,MAC1E,UAAU,KAAK,QAAQ,KAAK,aAAa,UAAU,KAAK,cAAc,MAAM,IAAI,QAAQ,QAAQ,IAAI;AAAA,IACtG,CAAC;AACD,WAAO,EAAE,MAAM,SAAS,QAAQ;AAAA,EAClC,GAAG,EAAE,mBAAmB,MAAM,iBAAiB,KAAO,CAAC;AACvD,SAAO,EAAE,GAAI,QAAQ,EAAE,MAAM,MAAM,SAAS,MAAM,SAAS,KAAK,GAAI,OAAO,OAAO;AACpF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medialane/ui",
3
- "version": "0.184.0",
3
+ "version": "0.185.0",
4
4
  "description": "Shared UI components for Medialane apps",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -51,7 +51,7 @@
51
51
  "preview": "vite --config preview/vite.config.ts"
52
52
  },
53
53
  "peerDependencies": {
54
- "@medialane/sdk": ">=0.170.0",
54
+ "@medialane/sdk": ">=0.171.0",
55
55
  "@radix-ui/react-checkbox": ">=1.1.0",
56
56
  "@radix-ui/react-collapsible": ">=1.1.0",
57
57
  "@radix-ui/react-dialog": ">=1.1.0",
@@ -80,7 +80,7 @@
80
80
  "zod": "^3.25.0"
81
81
  },
82
82
  "devDependencies": {
83
- "@medialane/sdk": "0.170.0",
83
+ "@medialane/sdk": "0.171.0",
84
84
  "@radix-ui/react-checkbox": "^1.3.8",
85
85
  "@radix-ui/react-collapsible": "^1.1.17",
86
86
  "@radix-ui/react-dialog": "^1.1.20",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/drop-status-display.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"../utils/cn.js\";\nimport type { DropPhase } from \"../utils/drop/view.js\";\n\nexport function DropStatusBadge({ phase }: { phase: DropPhase }) {\n const map = {\n live: { label: \"Live\", cls: \"text-green-400 bg-green-500/10\" },\n upcoming: { label: \"Upcoming\", cls: \"text-brand-blue bg-brand-blue/10\" },\n ended: { label: \"Ended\", cls: \"text-muted-foreground bg-muted\" },\n \"sold-out\": { label: \"Sold out\", cls: \"text-brand-orange bg-brand-orange/10\" },\n } as const;\n const { label, cls } = map[phase];\n return (\n <span className={cn(\"inline-flex items-center gap-1 text-xs font-bold uppercase tracking-widest rounded-full px-3 py-1\", cls)}>\n {phase === \"live\" && <span className=\"h-1.5 w-1.5 rounded-full bg-green-400 animate-pulse\" />}\n {label}\n </span>\n );\n}\n\nexport function DropSupplyProgress({ minted, max }: { minted: number; max: number }) {\n const pct = max > 0 ? Math.min(100, (minted / max) * 100) : 0;\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>{minted.toLocaleString()} minted</span>\n <span>of {max.toLocaleString()}</span>\n </div>\n <div className=\"h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-brand-orange transition-all duration-500\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground\">{pct.toFixed(1)}% claimed</p>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcI;AAZJ,gBAAmB;AAGZ,SAAS,gBAAgB,EAAE,MAAM,GAAyB;AAC/D,QAAM,MAAM;AAAA,IACV,MAAY,EAAE,OAAO,QAAY,KAAK,iCAAiC;AAAA,IACvE,UAAY,EAAE,OAAO,YAAY,KAAK,mCAAmC;AAAA,IACzE,OAAY,EAAE,OAAO,SAAY,KAAK,iCAAiC;AAAA,IACvE,YAAY,EAAE,OAAO,YAAY,KAAK,uCAAuC;AAAA,EAC/E;AACA,QAAM,EAAE,OAAO,IAAI,IAAI,IAAI,KAAK;AAChC,SACE,6CAAC,UAAK,eAAW,cAAG,qGAAqG,GAAG,GACzH;AAAA,cAAU,UAAU,4CAAC,UAAK,WAAU,uDAAsD;AAAA,IAC1F;AAAA,KACH;AAEJ;AAEO,SAAS,mBAAmB,EAAE,QAAQ,IAAI,GAAoC;AACnF,QAAM,MAAM,MAAM,IAAI,KAAK,IAAI,KAAM,SAAS,MAAO,GAAG,IAAI;AAC5D,SACE,6CAAC,SAAI,WAAU,eACb;AAAA,iDAAC,SAAI,WAAU,sDACb;AAAA,mDAAC,UAAM;AAAA,eAAO,eAAe;AAAA,QAAE;AAAA,SAAO;AAAA,MACtC,6CAAC,UAAK;AAAA;AAAA,QAAI,IAAI,eAAe;AAAA,SAAE;AAAA,OACjC;AAAA,IACA,4CAAC,SAAI,WAAU,6CACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,GAAG,GAAG,IAAI;AAAA;AAAA,IAC5B,GACF;AAAA,IACA,6CAAC,OAAE,WAAU,iCAAiC;AAAA,UAAI,QAAQ,CAAC;AAAA,MAAE;AAAA,OAAS;AAAA,KACxE;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/drop-status-display.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"../utils/cn.js\";\nimport type { DropPhase } from \"../utils/drop/view.js\";\n\nexport function DropStatusBadge({ phase }: { phase: DropPhase }) {\n const map = {\n live: { label: \"Live\", cls: \"text-green-400 bg-green-500/10\" },\n upcoming: { label: \"Upcoming\", cls: \"text-brand-blue bg-brand-blue/10\" },\n ended: { label: \"Ended\", cls: \"text-muted-foreground bg-muted\" },\n \"sold-out\": { label: \"Sold out\", cls: \"text-brand-orange bg-brand-orange/10\" },\n } as const;\n const { label, cls } = map[phase];\n return (\n <span className={cn(\"inline-flex items-center gap-1 text-xs font-bold uppercase tracking-widest rounded-full px-3 py-1\", cls)}>\n {phase === \"live\" && <span className=\"h-1.5 w-1.5 rounded-full bg-green-400 animate-pulse\" />}\n {label}\n </span>\n );\n}\n\nexport function DropSupplyProgress({ minted, max }: { minted: number; max: number }) {\n const pct = max > 0 ? Math.min(100, (minted / max) * 100) : 0;\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>{minted.toLocaleString()} minted</span>\n <span>of {max.toLocaleString()}</span>\n </div>\n <div className=\"h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-brand-orange transition-all duration-500\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground\">{pct.toFixed(1)}% claimed</p>\n </div>\n );\n}\n"],"mappings":";AAcI,SACuB,KADvB;AAZJ,SAAS,UAAU;AAGZ,SAAS,gBAAgB,EAAE,MAAM,GAAyB;AAC/D,QAAM,MAAM;AAAA,IACV,MAAY,EAAE,OAAO,QAAY,KAAK,iCAAiC;AAAA,IACvE,UAAY,EAAE,OAAO,YAAY,KAAK,mCAAmC;AAAA,IACzE,OAAY,EAAE,OAAO,SAAY,KAAK,iCAAiC;AAAA,IACvE,YAAY,EAAE,OAAO,YAAY,KAAK,uCAAuC;AAAA,EAC/E;AACA,QAAM,EAAE,OAAO,IAAI,IAAI,IAAI,KAAK;AAChC,SACE,qBAAC,UAAK,WAAW,GAAG,qGAAqG,GAAG,GACzH;AAAA,cAAU,UAAU,oBAAC,UAAK,WAAU,uDAAsD;AAAA,IAC1F;AAAA,KACH;AAEJ;AAEO,SAAS,mBAAmB,EAAE,QAAQ,IAAI,GAAoC;AACnF,QAAM,MAAM,MAAM,IAAI,KAAK,IAAI,KAAM,SAAS,MAAO,GAAG,IAAI;AAC5D,SACE,qBAAC,SAAI,WAAU,eACb;AAAA,yBAAC,SAAI,WAAU,sDACb;AAAA,2BAAC,UAAM;AAAA,eAAO,eAAe;AAAA,QAAE;AAAA,SAAO;AAAA,MACtC,qBAAC,UAAK;AAAA;AAAA,QAAI,IAAI,eAAe;AAAA,SAAE;AAAA,OACjC;AAAA,IACA,oBAAC,SAAI,WAAU,6CACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,GAAG,GAAG,IAAI;AAAA;AAAA,IAC5B,GACF;AAAA,IACA,qBAAC,OAAE,WAAU,iCAAiC;AAAA,UAAI,QAAQ,CAAC;AAAA,MAAE;AAAA,OAAS;AAAA,KACxE;AAEJ;","names":[]}