@medialane/ui 0.97.0 → 0.99.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 (73) hide show
  1. package/dist/components/community-rewards-section.cjs +123 -0
  2. package/dist/components/community-rewards-section.cjs.map +1 -0
  3. package/dist/components/community-rewards-section.d.cts +15 -0
  4. package/dist/components/community-rewards-section.d.ts +15 -0
  5. package/dist/components/community-rewards-section.js +89 -0
  6. package/dist/components/community-rewards-section.js.map +1 -0
  7. package/dist/components/creator-airdrop-banner.cjs +79 -0
  8. package/dist/components/creator-airdrop-banner.cjs.map +1 -0
  9. package/dist/components/creator-airdrop-banner.d.cts +9 -0
  10. package/dist/components/creator-airdrop-banner.d.ts +9 -0
  11. package/dist/components/creator-airdrop-banner.js +45 -0
  12. package/dist/components/creator-airdrop-banner.js.map +1 -0
  13. package/dist/components/rewards/badge-shelf.cjs +2 -0
  14. package/dist/components/rewards/badge-shelf.cjs.map +1 -1
  15. package/dist/components/rewards/badge-shelf.d.cts +6 -1
  16. package/dist/components/rewards/badge-shelf.d.ts +6 -1
  17. package/dist/components/rewards/badge-shelf.js +1 -0
  18. package/dist/components/rewards/badge-shelf.js.map +1 -1
  19. package/dist/components/rewards/badge-unlock-toast-content.cjs +49 -0
  20. package/dist/components/rewards/badge-unlock-toast-content.cjs.map +1 -0
  21. package/dist/components/rewards/badge-unlock-toast-content.d.cts +11 -0
  22. package/dist/components/rewards/badge-unlock-toast-content.d.ts +11 -0
  23. package/dist/components/rewards/badge-unlock-toast-content.js +25 -0
  24. package/dist/components/rewards/badge-unlock-toast-content.js.map +1 -0
  25. package/dist/components/rewards/journey-path.cjs +77 -0
  26. package/dist/components/rewards/journey-path.cjs.map +1 -0
  27. package/dist/components/rewards/journey-path.d.cts +26 -0
  28. package/dist/components/rewards/journey-path.d.ts +26 -0
  29. package/dist/components/rewards/journey-path.js +53 -0
  30. package/dist/components/rewards/journey-path.js.map +1 -0
  31. package/dist/components/rewards/level-badge.cjs +1 -3
  32. package/dist/components/rewards/level-badge.cjs.map +1 -1
  33. package/dist/components/rewards/level-badge.d.cts +4 -2
  34. package/dist/components/rewards/level-badge.d.ts +4 -2
  35. package/dist/components/rewards/level-badge.js +1 -3
  36. package/dist/components/rewards/level-badge.js.map +1 -1
  37. package/dist/components/rewards/level-up-celebration.cjs +71 -0
  38. package/dist/components/rewards/level-up-celebration.cjs.map +1 -0
  39. package/dist/components/rewards/level-up-celebration.d.cts +16 -0
  40. package/dist/components/rewards/level-up-celebration.d.ts +16 -0
  41. package/dist/components/rewards/level-up-celebration.js +47 -0
  42. package/dist/components/rewards/level-up-celebration.js.map +1 -0
  43. package/dist/components/rewards/reward-toast.cjs +20 -2
  44. package/dist/components/rewards/reward-toast.cjs.map +1 -1
  45. package/dist/components/rewards/reward-toast.d.cts +6 -2
  46. package/dist/components/rewards/reward-toast.d.ts +6 -2
  47. package/dist/components/rewards/reward-toast.js +20 -2
  48. package/dist/components/rewards/reward-toast.js.map +1 -1
  49. package/dist/components/rewards/use-rewards-celebrations.cjs +70 -0
  50. package/dist/components/rewards/use-rewards-celebrations.cjs.map +1 -0
  51. package/dist/components/rewards/use-rewards-celebrations.d.cts +25 -0
  52. package/dist/components/rewards/use-rewards-celebrations.d.ts +25 -0
  53. package/dist/components/rewards/use-rewards-celebrations.js +46 -0
  54. package/dist/components/rewards/use-rewards-celebrations.js.map +1 -0
  55. package/dist/components/rewards/xp-toast-content.cjs +23 -18
  56. package/dist/components/rewards/xp-toast-content.cjs.map +1 -1
  57. package/dist/components/rewards/xp-toast-content.d.cts +7 -1
  58. package/dist/components/rewards/xp-toast-content.d.ts +7 -1
  59. package/dist/components/rewards/xp-toast-content.js +23 -18
  60. package/dist/components/rewards/xp-toast-content.js.map +1 -1
  61. package/dist/index.cjs +20 -5
  62. package/dist/index.cjs.map +1 -1
  63. package/dist/index.d.cts +7 -2
  64. package/dist/index.d.ts +7 -2
  65. package/dist/index.js +13 -3
  66. package/dist/index.js.map +1 -1
  67. package/package.json +1 -1
  68. package/dist/components/creators-fund-section.cjs +0 -139
  69. package/dist/components/creators-fund-section.cjs.map +0 -1
  70. package/dist/components/creators-fund-section.d.cts +0 -26
  71. package/dist/components/creators-fund-section.d.ts +0 -26
  72. package/dist/components/creators-fund-section.js +0 -105
  73. package/dist/components/creators-fund-section.js.map +0 -1
@@ -8,11 +8,29 @@ function createRewardToast(getRewardsConfig) {
8
8
  configPromise ?? (configPromise = getRewardsConfig());
9
9
  return configPromise;
10
10
  }
11
- return function rewardToast(actionType) {
11
+ return function rewardToast(actionType, snapshot) {
12
12
  loadConfig().then((config) => {
13
13
  const action = config.actions.find((a) => a.type === actionType);
14
14
  if (!action) return;
15
- toast(/* @__PURE__ */ jsx(XpToastContent, { xp: action.xp, label: action.label }), { duration: 3500 });
15
+ if (!snapshot) {
16
+ toast(/* @__PURE__ */ jsx(XpToastContent, { xp: action.xp, label: action.label }), { duration: 3500 });
17
+ return;
18
+ }
19
+ const level = config.levels.find((l) => l.level === snapshot.currentLevel);
20
+ const nextLevel = config.levels.find((l) => l.level === snapshot.currentLevel + 1);
21
+ toast(
22
+ /* @__PURE__ */ jsx(
23
+ XpToastContent,
24
+ {
25
+ xp: action.xp,
26
+ label: action.label,
27
+ totalXp: snapshot.totalXp,
28
+ levelXp: level?.xpRequired ?? 0,
29
+ nextLevelXp: nextLevel?.xpRequired ?? null
30
+ }
31
+ ),
32
+ { duration: 3500 }
33
+ );
16
34
  }).catch(() => {
17
35
  configPromise = null;
18
36
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/rewards/reward-toast.tsx"],"sourcesContent":["\"use client\";\n\nimport { toast } from \"sonner\";\nimport { XpToastContent } from \"./xp-toast-content.js\";\nimport type { ApiRewardsConfig } from \"@medialane/sdk\";\n\n/**\n * Optimistic XP feedback after a scoring action. Scores recompute on a\n * schedule, so this shows the action's configured value, never a balance.\n * Fire-and-forget: any failure is silent (rewards UI must never break a flow).\n *\n * Each app supplies its own `getRewardsConfig` (bound to its own\n * `MedialaneClient` singleton) — the caching/toast logic lives here once.\n */\nexport function createRewardToast(getRewardsConfig: () => Promise<ApiRewardsConfig>) {\n let configPromise: Promise<ApiRewardsConfig> | null = null;\n function loadConfig() {\n configPromise ??= getRewardsConfig();\n return configPromise;\n }\n\n return function rewardToast(actionType: string): void {\n loadConfig()\n .then((config) => {\n const action = config.actions.find((a) => a.type === actionType);\n if (!action) return;\n toast(<XpToastContent xp={action.xp} label={action.label} />, { duration: 3500 });\n })\n .catch(() => {\n configPromise = null; // retry on the next action\n });\n };\n}\n"],"mappings":";AA0Bc;AAxBd,SAAS,aAAa;AACtB,SAAS,sBAAsB;AAWxB,SAAS,kBAAkB,kBAAmD;AACnF,MAAI,gBAAkD;AACtD,WAAS,aAAa;AACpB,sCAAkB,iBAAiB;AACnC,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,YAAY,YAA0B;AACpD,eAAW,EACR,KAAK,CAAC,WAAW;AAChB,YAAM,SAAS,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AAC/D,UAAI,CAAC,OAAQ;AACb,YAAM,oBAAC,kBAAe,IAAI,OAAO,IAAI,OAAO,OAAO,OAAO,GAAI,EAAE,UAAU,KAAK,CAAC;AAAA,IAClF,CAAC,EACA,MAAM,MAAM;AACX,sBAAgB;AAAA,IAClB,CAAC;AAAA,EACL;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/rewards/reward-toast.tsx"],"sourcesContent":["\"use client\";\n\nimport { toast } from \"sonner\";\nimport { XpToastContent } from \"./xp-toast-content.js\";\nimport type { ApiRewardsConfig } from \"@medialane/sdk\";\n\nexport interface RewardToastSnapshot {\n totalXp: number;\n currentLevel: number;\n}\n\n/**\n * Optimistic XP feedback after a scoring action. Scores recompute on a\n * schedule, so this shows the action's configured value, never a balance.\n * Fire-and-forget: any failure is silent (rewards UI must never break a flow).\n *\n * Each app supplies its own `getRewardsConfig` (bound to its own\n * `MedialaneClient` singleton) — the caching/toast logic lives here once.\n */\nexport function createRewardToast(getRewardsConfig: () => Promise<ApiRewardsConfig>) {\n let configPromise: Promise<ApiRewardsConfig> | null = null;\n function loadConfig() {\n configPromise ??= getRewardsConfig();\n return configPromise;\n }\n\n /**\n * @param snapshot Optional — when provided, the toast additionally shows\n * a progress bar toward the next level. Omit to get today's plain toast.\n */\n return function rewardToast(actionType: string, snapshot?: RewardToastSnapshot): void {\n loadConfig()\n .then((config) => {\n const action = config.actions.find((a) => a.type === actionType);\n if (!action) return;\n\n if (!snapshot) {\n toast(<XpToastContent xp={action.xp} label={action.label} />, { duration: 3500 });\n return;\n }\n\n const level = config.levels.find((l) => l.level === snapshot.currentLevel);\n const nextLevel = config.levels.find((l) => l.level === snapshot.currentLevel + 1);\n toast(\n <XpToastContent\n xp={action.xp}\n label={action.label}\n totalXp={snapshot.totalXp}\n levelXp={level?.xpRequired ?? 0}\n nextLevelXp={nextLevel?.xpRequired ?? null}\n />,\n { duration: 3500 }\n );\n })\n .catch(() => {\n configPromise = null; // retry on the next action\n });\n };\n}\n"],"mappings":";AAqCgB;AAnChB,SAAS,aAAa;AACtB,SAAS,sBAAsB;AAgBxB,SAAS,kBAAkB,kBAAmD;AACnF,MAAI,gBAAkD;AACtD,WAAS,aAAa;AACpB,sCAAkB,iBAAiB;AACnC,WAAO;AAAA,EACT;AAMA,SAAO,SAAS,YAAY,YAAoB,UAAsC;AACpF,eAAW,EACR,KAAK,CAAC,WAAW;AAChB,YAAM,SAAS,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AAC/D,UAAI,CAAC,OAAQ;AAEb,UAAI,CAAC,UAAU;AACb,cAAM,oBAAC,kBAAe,IAAI,OAAO,IAAI,OAAO,OAAO,OAAO,GAAI,EAAE,UAAU,KAAK,CAAC;AAChF;AAAA,MACF;AAEA,YAAM,QAAQ,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,UAAU,SAAS,YAAY;AACzE,YAAM,YAAY,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,UAAU,SAAS,eAAe,CAAC;AACjF;AAAA,QACE;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,OAAO;AAAA,YACX,OAAO,OAAO;AAAA,YACd,SAAS,SAAS;AAAA,YAClB,SAAS,OAAO,cAAc;AAAA,YAC9B,aAAa,WAAW,cAAc;AAAA;AAAA,QACxC;AAAA,QACA,EAAE,UAAU,KAAK;AAAA,MACnB;AAAA,IACF,CAAC,EACA,MAAM,MAAM;AACX,sBAAgB;AAAA,IAClB,CAAC;AAAA,EACL;AACF;","names":[]}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var use_rewards_celebrations_exports = {};
21
+ __export(use_rewards_celebrations_exports, {
22
+ useRewardsCelebrations: () => useRewardsCelebrations
23
+ });
24
+ module.exports = __toCommonJS(use_rewards_celebrations_exports);
25
+ var import_react = require("react");
26
+ const EMPTY = { leveledUpTo: null, newBadgeKeys: [] };
27
+ function storageKey(address) {
28
+ return `ml:rewards-seen:${address.toLowerCase()}`;
29
+ }
30
+ function readSeen(address) {
31
+ try {
32
+ const raw = localStorage.getItem(storageKey(address));
33
+ return raw ? JSON.parse(raw) : null;
34
+ } catch {
35
+ return null;
36
+ }
37
+ }
38
+ function writeSeen(address, state) {
39
+ try {
40
+ localStorage.setItem(storageKey(address), JSON.stringify(state));
41
+ } catch {
42
+ }
43
+ }
44
+ function useRewardsCelebrations(address, rewards) {
45
+ const [state, setState] = (0, import_react.useState)(EMPTY);
46
+ const lastAddress = (0, import_react.useRef)(null);
47
+ (0, import_react.useEffect)(() => {
48
+ if (!address || !rewards) return;
49
+ const seen = readSeen(address);
50
+ const currentBadgeKeys = rewards.badges.map((b) => b.key);
51
+ if (!seen || lastAddress.current !== address) {
52
+ writeSeen(address, { level: rewards.currentLevel, badgeKeys: currentBadgeKeys });
53
+ lastAddress.current = address;
54
+ return;
55
+ }
56
+ const leveledUpTo = rewards.currentLevel > seen.level ? rewards.currentLevel : null;
57
+ const newBadgeKeys = currentBadgeKeys.filter((k) => !seen.badgeKeys.includes(k));
58
+ if (leveledUpTo !== null || newBadgeKeys.length > 0) {
59
+ writeSeen(address, { level: rewards.currentLevel, badgeKeys: currentBadgeKeys });
60
+ setState({ leveledUpTo, newBadgeKeys });
61
+ }
62
+ }, [address, rewards]);
63
+ const dismiss = () => setState(EMPTY);
64
+ return { ...state, dismiss };
65
+ }
66
+ // Annotate the CommonJS export names for ESM import in node:
67
+ 0 && (module.exports = {
68
+ useRewardsCelebrations
69
+ });
70
+ //# sourceMappingURL=use-rewards-celebrations.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/rewards/use-rewards-celebrations.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\ninterface RewardsSnapshot {\n currentLevel: number;\n badges: { key: string }[];\n}\n\ninterface CelebrationState {\n leveledUpTo: number | null;\n newBadgeKeys: string[];\n}\n\nconst EMPTY: CelebrationState = { leveledUpTo: null, newBadgeKeys: [] };\n\nfunction storageKey(address: string) {\n return `ml:rewards-seen:${address.toLowerCase()}`;\n}\n\ninterface SeenState {\n level: number;\n badgeKeys: string[];\n}\n\nfunction readSeen(address: string): SeenState | null {\n try {\n const raw = localStorage.getItem(storageKey(address));\n return raw ? (JSON.parse(raw) as SeenState) : null;\n } catch {\n return null;\n }\n}\n\nfunction writeSeen(address: string, state: SeenState) {\n try {\n localStorage.setItem(storageKey(address), JSON.stringify(state));\n } catch {\n // localStorage unavailable (private mode, quota) — celebrations just won't fire again this session\n }\n}\n\n/**\n * Diffs the current rewards snapshot against the last-seen state cached in\n * localStorage (per address) and reports what's new since last time. A\n * first-ever snapshot for an address seeds the cache silently — no\n * celebration on first sight, only on a detected increase/addition.\n * Call `dismiss()` to clear the returned state once the caller has shown it\n * (the storage baseline is written the moment new state is detected, not on\n * dismiss, so a level-up and a badge unlock arriving together can each\n * dismiss on their own timeline without racing the other's write).\n */\nexport function useRewardsCelebrations(\n address: string | null | undefined,\n rewards: RewardsSnapshot | null | undefined\n): CelebrationState & { dismiss: () => void } {\n const [state, setState] = useState<CelebrationState>(EMPTY);\n const lastAddress = useRef<string | null>(null);\n\n useEffect(() => {\n if (!address || !rewards) return;\n\n const seen = readSeen(address);\n const currentBadgeKeys = rewards.badges.map((b) => b.key);\n\n if (!seen || lastAddress.current !== address) {\n // First time we've ever seen this address (or a wallet switch) — seed silently.\n writeSeen(address, { level: rewards.currentLevel, badgeKeys: currentBadgeKeys });\n lastAddress.current = address;\n return;\n }\n\n const leveledUpTo = rewards.currentLevel > seen.level ? rewards.currentLevel : null;\n const newBadgeKeys = currentBadgeKeys.filter((k) => !seen.badgeKeys.includes(k));\n\n if (leveledUpTo !== null || newBadgeKeys.length > 0) {\n // Persist the new baseline immediately — a level-up and a badge unlock\n // can arrive in the same snapshot but dismiss independently (the\n // celebration overlay dismisses itself on a timer/tap; the badge\n // toasts fire-and-forget). Gating the write on either UI action\n // dismissing would let the other clear this state first and skip the\n // write. A page refresh mid-celebration correctly won't re-fire either.\n writeSeen(address, { level: rewards.currentLevel, badgeKeys: currentBadgeKeys });\n setState({ leveledUpTo, newBadgeKeys });\n }\n }, [address, rewards]);\n\n // Purely local UI state — the storage baseline is already written above,\n // the moment new state was detected. This only clears what's on screen.\n const dismiss = () => setState(EMPTY);\n\n return { ...state, dismiss };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAA4C;AAY5C,MAAM,QAA0B,EAAE,aAAa,MAAM,cAAc,CAAC,EAAE;AAEtE,SAAS,WAAW,SAAiB;AACnC,SAAO,mBAAmB,QAAQ,YAAY,CAAC;AACjD;AAOA,SAAS,SAAS,SAAmC;AACnD,MAAI;AACF,UAAM,MAAM,aAAa,QAAQ,WAAW,OAAO,CAAC;AACpD,WAAO,MAAO,KAAK,MAAM,GAAG,IAAkB;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,SAAiB,OAAkB;AACpD,MAAI;AACF,iBAAa,QAAQ,WAAW,OAAO,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,EACjE,QAAQ;AAAA,EAER;AACF;AAYO,SAAS,uBACd,SACA,SAC4C;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAA2B,KAAK;AAC1D,QAAM,kBAAc,qBAAsB,IAAI;AAE9C,8BAAU,MAAM;AACd,QAAI,CAAC,WAAW,CAAC,QAAS;AAE1B,UAAM,OAAO,SAAS,OAAO;AAC7B,UAAM,mBAAmB,QAAQ,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG;AAExD,QAAI,CAAC,QAAQ,YAAY,YAAY,SAAS;AAE5C,gBAAU,SAAS,EAAE,OAAO,QAAQ,cAAc,WAAW,iBAAiB,CAAC;AAC/E,kBAAY,UAAU;AACtB;AAAA,IACF;AAEA,UAAM,cAAc,QAAQ,eAAe,KAAK,QAAQ,QAAQ,eAAe;AAC/E,UAAM,eAAe,iBAAiB,OAAO,CAAC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAC;AAE/E,QAAI,gBAAgB,QAAQ,aAAa,SAAS,GAAG;AAOnD,gBAAU,SAAS,EAAE,OAAO,QAAQ,cAAc,WAAW,iBAAiB,CAAC;AAC/E,eAAS,EAAE,aAAa,aAAa,CAAC;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,SAAS,OAAO,CAAC;AAIrB,QAAM,UAAU,MAAM,SAAS,KAAK;AAEpC,SAAO,EAAE,GAAG,OAAO,QAAQ;AAC7B;","names":[]}
@@ -0,0 +1,25 @@
1
+ interface RewardsSnapshot {
2
+ currentLevel: number;
3
+ badges: {
4
+ key: string;
5
+ }[];
6
+ }
7
+ interface CelebrationState {
8
+ leveledUpTo: number | null;
9
+ newBadgeKeys: string[];
10
+ }
11
+ /**
12
+ * Diffs the current rewards snapshot against the last-seen state cached in
13
+ * localStorage (per address) and reports what's new since last time. A
14
+ * first-ever snapshot for an address seeds the cache silently — no
15
+ * celebration on first sight, only on a detected increase/addition.
16
+ * Call `dismiss()` to clear the returned state once the caller has shown it
17
+ * (the storage baseline is written the moment new state is detected, not on
18
+ * dismiss, so a level-up and a badge unlock arriving together can each
19
+ * dismiss on their own timeline without racing the other's write).
20
+ */
21
+ declare function useRewardsCelebrations(address: string | null | undefined, rewards: RewardsSnapshot | null | undefined): CelebrationState & {
22
+ dismiss: () => void;
23
+ };
24
+
25
+ export { useRewardsCelebrations };
@@ -0,0 +1,25 @@
1
+ interface RewardsSnapshot {
2
+ currentLevel: number;
3
+ badges: {
4
+ key: string;
5
+ }[];
6
+ }
7
+ interface CelebrationState {
8
+ leveledUpTo: number | null;
9
+ newBadgeKeys: string[];
10
+ }
11
+ /**
12
+ * Diffs the current rewards snapshot against the last-seen state cached in
13
+ * localStorage (per address) and reports what's new since last time. A
14
+ * first-ever snapshot for an address seeds the cache silently — no
15
+ * celebration on first sight, only on a detected increase/addition.
16
+ * Call `dismiss()` to clear the returned state once the caller has shown it
17
+ * (the storage baseline is written the moment new state is detected, not on
18
+ * dismiss, so a level-up and a badge unlock arriving together can each
19
+ * dismiss on their own timeline without racing the other's write).
20
+ */
21
+ declare function useRewardsCelebrations(address: string | null | undefined, rewards: RewardsSnapshot | null | undefined): CelebrationState & {
22
+ dismiss: () => void;
23
+ };
24
+
25
+ export { useRewardsCelebrations };
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import { useEffect, useRef, useState } from "react";
3
+ const EMPTY = { leveledUpTo: null, newBadgeKeys: [] };
4
+ function storageKey(address) {
5
+ return `ml:rewards-seen:${address.toLowerCase()}`;
6
+ }
7
+ function readSeen(address) {
8
+ try {
9
+ const raw = localStorage.getItem(storageKey(address));
10
+ return raw ? JSON.parse(raw) : null;
11
+ } catch {
12
+ return null;
13
+ }
14
+ }
15
+ function writeSeen(address, state) {
16
+ try {
17
+ localStorage.setItem(storageKey(address), JSON.stringify(state));
18
+ } catch {
19
+ }
20
+ }
21
+ function useRewardsCelebrations(address, rewards) {
22
+ const [state, setState] = useState(EMPTY);
23
+ const lastAddress = useRef(null);
24
+ useEffect(() => {
25
+ if (!address || !rewards) return;
26
+ const seen = readSeen(address);
27
+ const currentBadgeKeys = rewards.badges.map((b) => b.key);
28
+ if (!seen || lastAddress.current !== address) {
29
+ writeSeen(address, { level: rewards.currentLevel, badgeKeys: currentBadgeKeys });
30
+ lastAddress.current = address;
31
+ return;
32
+ }
33
+ const leveledUpTo = rewards.currentLevel > seen.level ? rewards.currentLevel : null;
34
+ const newBadgeKeys = currentBadgeKeys.filter((k) => !seen.badgeKeys.includes(k));
35
+ if (leveledUpTo !== null || newBadgeKeys.length > 0) {
36
+ writeSeen(address, { level: rewards.currentLevel, badgeKeys: currentBadgeKeys });
37
+ setState({ leveledUpTo, newBadgeKeys });
38
+ }
39
+ }, [address, rewards]);
40
+ const dismiss = () => setState(EMPTY);
41
+ return { ...state, dismiss };
42
+ }
43
+ export {
44
+ useRewardsCelebrations
45
+ };
46
+ //# sourceMappingURL=use-rewards-celebrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/rewards/use-rewards-celebrations.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\ninterface RewardsSnapshot {\n currentLevel: number;\n badges: { key: string }[];\n}\n\ninterface CelebrationState {\n leveledUpTo: number | null;\n newBadgeKeys: string[];\n}\n\nconst EMPTY: CelebrationState = { leveledUpTo: null, newBadgeKeys: [] };\n\nfunction storageKey(address: string) {\n return `ml:rewards-seen:${address.toLowerCase()}`;\n}\n\ninterface SeenState {\n level: number;\n badgeKeys: string[];\n}\n\nfunction readSeen(address: string): SeenState | null {\n try {\n const raw = localStorage.getItem(storageKey(address));\n return raw ? (JSON.parse(raw) as SeenState) : null;\n } catch {\n return null;\n }\n}\n\nfunction writeSeen(address: string, state: SeenState) {\n try {\n localStorage.setItem(storageKey(address), JSON.stringify(state));\n } catch {\n // localStorage unavailable (private mode, quota) — celebrations just won't fire again this session\n }\n}\n\n/**\n * Diffs the current rewards snapshot against the last-seen state cached in\n * localStorage (per address) and reports what's new since last time. A\n * first-ever snapshot for an address seeds the cache silently — no\n * celebration on first sight, only on a detected increase/addition.\n * Call `dismiss()` to clear the returned state once the caller has shown it\n * (the storage baseline is written the moment new state is detected, not on\n * dismiss, so a level-up and a badge unlock arriving together can each\n * dismiss on their own timeline without racing the other's write).\n */\nexport function useRewardsCelebrations(\n address: string | null | undefined,\n rewards: RewardsSnapshot | null | undefined\n): CelebrationState & { dismiss: () => void } {\n const [state, setState] = useState<CelebrationState>(EMPTY);\n const lastAddress = useRef<string | null>(null);\n\n useEffect(() => {\n if (!address || !rewards) return;\n\n const seen = readSeen(address);\n const currentBadgeKeys = rewards.badges.map((b) => b.key);\n\n if (!seen || lastAddress.current !== address) {\n // First time we've ever seen this address (or a wallet switch) — seed silently.\n writeSeen(address, { level: rewards.currentLevel, badgeKeys: currentBadgeKeys });\n lastAddress.current = address;\n return;\n }\n\n const leveledUpTo = rewards.currentLevel > seen.level ? rewards.currentLevel : null;\n const newBadgeKeys = currentBadgeKeys.filter((k) => !seen.badgeKeys.includes(k));\n\n if (leveledUpTo !== null || newBadgeKeys.length > 0) {\n // Persist the new baseline immediately — a level-up and a badge unlock\n // can arrive in the same snapshot but dismiss independently (the\n // celebration overlay dismisses itself on a timer/tap; the badge\n // toasts fire-and-forget). Gating the write on either UI action\n // dismissing would let the other clear this state first and skip the\n // write. A page refresh mid-celebration correctly won't re-fire either.\n writeSeen(address, { level: rewards.currentLevel, badgeKeys: currentBadgeKeys });\n setState({ leveledUpTo, newBadgeKeys });\n }\n }, [address, rewards]);\n\n // Purely local UI state — the storage baseline is already written above,\n // the moment new state was detected. This only clears what's on screen.\n const dismiss = () => setState(EMPTY);\n\n return { ...state, dismiss };\n}\n"],"mappings":";AAEA,SAAS,WAAW,QAAQ,gBAAgB;AAY5C,MAAM,QAA0B,EAAE,aAAa,MAAM,cAAc,CAAC,EAAE;AAEtE,SAAS,WAAW,SAAiB;AACnC,SAAO,mBAAmB,QAAQ,YAAY,CAAC;AACjD;AAOA,SAAS,SAAS,SAAmC;AACnD,MAAI;AACF,UAAM,MAAM,aAAa,QAAQ,WAAW,OAAO,CAAC;AACpD,WAAO,MAAO,KAAK,MAAM,GAAG,IAAkB;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,SAAiB,OAAkB;AACpD,MAAI;AACF,iBAAa,QAAQ,WAAW,OAAO,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,EACjE,QAAQ;AAAA,EAER;AACF;AAYO,SAAS,uBACd,SACA,SAC4C;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA2B,KAAK;AAC1D,QAAM,cAAc,OAAsB,IAAI;AAE9C,YAAU,MAAM;AACd,QAAI,CAAC,WAAW,CAAC,QAAS;AAE1B,UAAM,OAAO,SAAS,OAAO;AAC7B,UAAM,mBAAmB,QAAQ,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG;AAExD,QAAI,CAAC,QAAQ,YAAY,YAAY,SAAS;AAE5C,gBAAU,SAAS,EAAE,OAAO,QAAQ,cAAc,WAAW,iBAAiB,CAAC;AAC/E,kBAAY,UAAU;AACtB;AAAA,IACF;AAEA,UAAM,cAAc,QAAQ,eAAe,KAAK,QAAQ,QAAQ,eAAe;AAC/E,UAAM,eAAe,iBAAiB,OAAO,CAAC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAC;AAE/E,QAAI,gBAAgB,QAAQ,aAAa,SAAS,GAAG;AAOnD,gBAAU,SAAS,EAAE,OAAO,QAAQ,cAAc,WAAW,iBAAiB,CAAC;AAC/E,eAAS,EAAE,aAAa,aAAa,CAAC;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,SAAS,OAAO,CAAC;AAIrB,QAAM,UAAU,MAAM,SAAS,KAAK;AAEpC,SAAO,EAAE,GAAG,OAAO,QAAQ;AAC7B;","names":[]}
@@ -22,24 +22,29 @@ __export(xp_toast_content_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(xp_toast_content_exports);
24
24
  var import_jsx_runtime = require("react/jsx-runtime");
25
- function XpToastContent({ xp, label, color = "#8b5cf6" }) {
26
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2.5", children: [
27
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
28
- "span",
29
- {
30
- className: "flex h-8 shrink-0 items-center rounded-full border px-2.5 text-sm font-black tabular-nums",
31
- style: { borderColor: `${color}60`, backgroundColor: `${color}18`, color },
32
- children: [
33
- "+",
34
- xp,
35
- " XP"
36
- ]
37
- }
38
- ),
39
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "min-w-0", children: [
40
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "truncate text-sm font-semibold", children: label }),
41
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground", children: "Counts toward your score soon" })
42
- ] })
25
+ var import_xp_progress = require("./xp-progress.js");
26
+ function XpToastContent({ xp, label, color = "#8b5cf6", totalXp, levelXp, nextLevelXp }) {
27
+ const showProgress = totalXp !== void 0 && levelXp !== void 0 && nextLevelXp !== void 0;
28
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-1.5", children: [
29
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2.5", children: [
30
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
31
+ "span",
32
+ {
33
+ className: "flex h-8 shrink-0 items-center rounded-full border px-2.5 text-sm font-black tabular-nums",
34
+ style: { borderColor: `${color}60`, backgroundColor: `${color}18`, color },
35
+ children: [
36
+ "+",
37
+ xp,
38
+ " XP"
39
+ ]
40
+ }
41
+ ),
42
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "min-w-0", children: [
43
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "truncate text-sm font-semibold", children: label }),
44
+ !showProgress && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground", children: "Counts toward your score soon" })
45
+ ] })
46
+ ] }),
47
+ showProgress && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_xp_progress.XpProgress, { totalXp, levelXp, nextLevelXp, badgeColor: color, variant: "bar" })
43
48
  ] });
44
49
  }
45
50
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/rewards/xp-toast-content.tsx"],"sourcesContent":["export interface XpToastContentProps {\n xp: number;\n /** The action's configured label, e.g. \"Mint an IP asset\". */\n label: string;\n color?: string;\n}\n\n/** Toast body for optimistic XP feedback: \"+20 XP · Mint an IP asset\".\n * Scores recompute on a schedule, so this shows the action's configured\n * value — the caller must never present it as a live balance. */\nexport function XpToastContent({ xp, label, color = \"#8b5cf6\" }: XpToastContentProps) {\n return (\n <div className=\"flex items-center gap-2.5\">\n <span\n className=\"flex h-8 shrink-0 items-center rounded-full border px-2.5 text-sm font-black tabular-nums\"\n style={{ borderColor: `${color}60`, backgroundColor: `${color}18`, color }}\n >\n +{xp} XP\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-semibold\">{label}</p>\n <p className=\"text-xs text-muted-foreground\">Counts toward your score soon</p>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAaM;AAHC,SAAS,eAAe,EAAE,IAAI,OAAO,QAAQ,UAAU,GAAwB;AACpF,SACE,6CAAC,SAAI,WAAU,6BACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,aAAa,GAAG,KAAK,MAAM,iBAAiB,GAAG,KAAK,MAAM,MAAM;AAAA,QAC1E;AAAA;AAAA,UACG;AAAA,UAAG;AAAA;AAAA;AAAA,IACP;AAAA,IACA,6CAAC,SAAI,WAAU,WACb;AAAA,kDAAC,OAAE,WAAU,kCAAkC,iBAAM;AAAA,MACrD,4CAAC,OAAE,WAAU,iCAAgC,2CAA6B;AAAA,OAC5E;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/rewards/xp-toast-content.tsx"],"sourcesContent":["import { XpProgress } from \"./xp-progress.js\";\n\nexport interface XpToastContentProps {\n xp: number;\n /** The action's configured label, e.g. \"Mint an IP asset\". */\n label: string;\n color?: string;\n /** Optional progress-bar context — when all three are provided, a thin\n * XpProgress bar renders under the label, animating toward the next\n * level. Omit any of them (the default) to render exactly as before. */\n totalXp?: number;\n levelXp?: number;\n nextLevelXp?: number | null;\n}\n\n/** Toast body for optimistic XP feedback: \"+20 XP · Mint an IP asset\".\n * Scores recompute on a schedule, so this shows the action's configured\n * value — the caller must never present it as a live balance. */\nexport function XpToastContent({ xp, label, color = \"#8b5cf6\", totalXp, levelXp, nextLevelXp }: XpToastContentProps) {\n const showProgress = totalXp !== undefined && levelXp !== undefined && nextLevelXp !== undefined;\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center gap-2.5\">\n <span\n className=\"flex h-8 shrink-0 items-center rounded-full border px-2.5 text-sm font-black tabular-nums\"\n style={{ borderColor: `${color}60`, backgroundColor: `${color}18`, color }}\n >\n +{xp} XP\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-semibold\">{label}</p>\n {!showProgress && <p className=\"text-xs text-muted-foreground\">Counts toward your score soon</p>}\n </div>\n </div>\n {showProgress && (\n <XpProgress totalXp={totalXp!} levelXp={levelXp!} nextLevelXp={nextLevelXp!} badgeColor={color} variant=\"bar\" />\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBQ;AAvBR,yBAA2B;AAkBpB,SAAS,eAAe,EAAE,IAAI,OAAO,QAAQ,WAAW,SAAS,SAAS,YAAY,GAAwB;AACnH,QAAM,eAAe,YAAY,UAAa,YAAY,UAAa,gBAAgB;AACvF,SACE,6CAAC,SAAI,WAAU,yBACb;AAAA,iDAAC,SAAI,WAAU,6BACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,aAAa,GAAG,KAAK,MAAM,iBAAiB,GAAG,KAAK,MAAM,MAAM;AAAA,UAC1E;AAAA;AAAA,YACG;AAAA,YAAG;AAAA;AAAA;AAAA,MACP;AAAA,MACA,6CAAC,SAAI,WAAU,WACb;AAAA,oDAAC,OAAE,WAAU,kCAAkC,iBAAM;AAAA,QACpD,CAAC,gBAAgB,4CAAC,OAAE,WAAU,iCAAgC,2CAA6B;AAAA,SAC9F;AAAA,OACF;AAAA,IACC,gBACC,4CAAC,iCAAW,SAAmB,SAAmB,aAA2B,YAAY,OAAO,SAAQ,OAAM;AAAA,KAElH;AAEJ;","names":[]}
@@ -5,10 +5,16 @@ interface XpToastContentProps {
5
5
  /** The action's configured label, e.g. "Mint an IP asset". */
6
6
  label: string;
7
7
  color?: string;
8
+ /** Optional progress-bar context — when all three are provided, a thin
9
+ * XpProgress bar renders under the label, animating toward the next
10
+ * level. Omit any of them (the default) to render exactly as before. */
11
+ totalXp?: number;
12
+ levelXp?: number;
13
+ nextLevelXp?: number | null;
8
14
  }
9
15
  /** Toast body for optimistic XP feedback: "+20 XP · Mint an IP asset".
10
16
  * Scores recompute on a schedule, so this shows the action's configured
11
17
  * value — the caller must never present it as a live balance. */
12
- declare function XpToastContent({ xp, label, color }: XpToastContentProps): react_jsx_runtime.JSX.Element;
18
+ declare function XpToastContent({ xp, label, color, totalXp, levelXp, nextLevelXp }: XpToastContentProps): react_jsx_runtime.JSX.Element;
13
19
 
14
20
  export { XpToastContent, type XpToastContentProps };
@@ -5,10 +5,16 @@ interface XpToastContentProps {
5
5
  /** The action's configured label, e.g. "Mint an IP asset". */
6
6
  label: string;
7
7
  color?: string;
8
+ /** Optional progress-bar context — when all three are provided, a thin
9
+ * XpProgress bar renders under the label, animating toward the next
10
+ * level. Omit any of them (the default) to render exactly as before. */
11
+ totalXp?: number;
12
+ levelXp?: number;
13
+ nextLevelXp?: number | null;
8
14
  }
9
15
  /** Toast body for optimistic XP feedback: "+20 XP · Mint an IP asset".
10
16
  * Scores recompute on a schedule, so this shows the action's configured
11
17
  * value — the caller must never present it as a live balance. */
12
- declare function XpToastContent({ xp, label, color }: XpToastContentProps): react_jsx_runtime.JSX.Element;
18
+ declare function XpToastContent({ xp, label, color, totalXp, levelXp, nextLevelXp }: XpToastContentProps): react_jsx_runtime.JSX.Element;
13
19
 
14
20
  export { XpToastContent, type XpToastContentProps };
@@ -1,22 +1,27 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- function XpToastContent({ xp, label, color = "#8b5cf6" }) {
3
- return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5", children: [
4
- /* @__PURE__ */ jsxs(
5
- "span",
6
- {
7
- className: "flex h-8 shrink-0 items-center rounded-full border px-2.5 text-sm font-black tabular-nums",
8
- style: { borderColor: `${color}60`, backgroundColor: `${color}18`, color },
9
- children: [
10
- "+",
11
- xp,
12
- " XP"
13
- ]
14
- }
15
- ),
16
- /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
17
- /* @__PURE__ */ jsx("p", { className: "truncate text-sm font-semibold", children: label }),
18
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Counts toward your score soon" })
19
- ] })
2
+ import { XpProgress } from "./xp-progress.js";
3
+ function XpToastContent({ xp, label, color = "#8b5cf6", totalXp, levelXp, nextLevelXp }) {
4
+ const showProgress = totalXp !== void 0 && levelXp !== void 0 && nextLevelXp !== void 0;
5
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
6
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5", children: [
7
+ /* @__PURE__ */ jsxs(
8
+ "span",
9
+ {
10
+ className: "flex h-8 shrink-0 items-center rounded-full border px-2.5 text-sm font-black tabular-nums",
11
+ style: { borderColor: `${color}60`, backgroundColor: `${color}18`, color },
12
+ children: [
13
+ "+",
14
+ xp,
15
+ " XP"
16
+ ]
17
+ }
18
+ ),
19
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
20
+ /* @__PURE__ */ jsx("p", { className: "truncate text-sm font-semibold", children: label }),
21
+ !showProgress && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Counts toward your score soon" })
22
+ ] })
23
+ ] }),
24
+ showProgress && /* @__PURE__ */ jsx(XpProgress, { totalXp, levelXp, nextLevelXp, badgeColor: color, variant: "bar" })
20
25
  ] });
21
26
  }
22
27
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/rewards/xp-toast-content.tsx"],"sourcesContent":["export interface XpToastContentProps {\n xp: number;\n /** The action's configured label, e.g. \"Mint an IP asset\". */\n label: string;\n color?: string;\n}\n\n/** Toast body for optimistic XP feedback: \"+20 XP · Mint an IP asset\".\n * Scores recompute on a schedule, so this shows the action's configured\n * value — the caller must never present it as a live balance. */\nexport function XpToastContent({ xp, label, color = \"#8b5cf6\" }: XpToastContentProps) {\n return (\n <div className=\"flex items-center gap-2.5\">\n <span\n className=\"flex h-8 shrink-0 items-center rounded-full border px-2.5 text-sm font-black tabular-nums\"\n style={{ borderColor: `${color}60`, backgroundColor: `${color}18`, color }}\n >\n +{xp} XP\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-semibold\">{label}</p>\n <p className=\"text-xs text-muted-foreground\">Counts toward your score soon</p>\n </div>\n </div>\n );\n}\n"],"mappings":"AAaM,SAOE,KAPF;AAHC,SAAS,eAAe,EAAE,IAAI,OAAO,QAAQ,UAAU,GAAwB;AACpF,SACE,qBAAC,SAAI,WAAU,6BACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,aAAa,GAAG,KAAK,MAAM,iBAAiB,GAAG,KAAK,MAAM,MAAM;AAAA,QAC1E;AAAA;AAAA,UACG;AAAA,UAAG;AAAA;AAAA;AAAA,IACP;AAAA,IACA,qBAAC,SAAI,WAAU,WACb;AAAA,0BAAC,OAAE,WAAU,kCAAkC,iBAAM;AAAA,MACrD,oBAAC,OAAE,WAAU,iCAAgC,2CAA6B;AAAA,OAC5E;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/rewards/xp-toast-content.tsx"],"sourcesContent":["import { XpProgress } from \"./xp-progress.js\";\n\nexport interface XpToastContentProps {\n xp: number;\n /** The action's configured label, e.g. \"Mint an IP asset\". */\n label: string;\n color?: string;\n /** Optional progress-bar context — when all three are provided, a thin\n * XpProgress bar renders under the label, animating toward the next\n * level. Omit any of them (the default) to render exactly as before. */\n totalXp?: number;\n levelXp?: number;\n nextLevelXp?: number | null;\n}\n\n/** Toast body for optimistic XP feedback: \"+20 XP · Mint an IP asset\".\n * Scores recompute on a schedule, so this shows the action's configured\n * value — the caller must never present it as a live balance. */\nexport function XpToastContent({ xp, label, color = \"#8b5cf6\", totalXp, levelXp, nextLevelXp }: XpToastContentProps) {\n const showProgress = totalXp !== undefined && levelXp !== undefined && nextLevelXp !== undefined;\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center gap-2.5\">\n <span\n className=\"flex h-8 shrink-0 items-center rounded-full border px-2.5 text-sm font-black tabular-nums\"\n style={{ borderColor: `${color}60`, backgroundColor: `${color}18`, color }}\n >\n +{xp} XP\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-semibold\">{label}</p>\n {!showProgress && <p className=\"text-xs text-muted-foreground\">Counts toward your score soon</p>}\n </div>\n </div>\n {showProgress && (\n <XpProgress totalXp={totalXp!} levelXp={levelXp!} nextLevelXp={nextLevelXp!} badgeColor={color} variant=\"bar\" />\n )}\n </div>\n );\n}\n"],"mappings":"AAuBQ,SAOE,KAPF;AAvBR,SAAS,kBAAkB;AAkBpB,SAAS,eAAe,EAAE,IAAI,OAAO,QAAQ,WAAW,SAAS,SAAS,YAAY,GAAwB;AACnH,QAAM,eAAe,YAAY,UAAa,YAAY,UAAa,gBAAgB;AACvF,SACE,qBAAC,SAAI,WAAU,yBACb;AAAA,yBAAC,SAAI,WAAU,6BACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,aAAa,GAAG,KAAK,MAAM,iBAAiB,GAAG,KAAK,MAAM,MAAM;AAAA,UAC1E;AAAA;AAAA,YACG;AAAA,YAAG;AAAA;AAAA;AAAA,MACP;AAAA,MACA,qBAAC,SAAI,WAAU,WACb;AAAA,4BAAC,OAAE,WAAU,kCAAkC,iBAAM;AAAA,QACpD,CAAC,gBAAgB,oBAAC,OAAE,WAAU,iCAAgC,2CAA6B;AAAA,SAC9F;AAAA,OACF;AAAA,IACC,gBACC,oBAAC,cAAW,SAAmB,SAAmB,aAA2B,YAAY,OAAO,SAAQ,OAAM;AAAA,KAElH;AAEJ;","names":[]}
package/dist/index.cjs CHANGED
@@ -45,6 +45,7 @@ __export(index_exports, {
45
45
  AssetUtilityIcons: () => import_asset_utility_icons.AssetUtilityIcons,
46
46
  BRAND: () => import_brand.BRAND,
47
47
  BadgeShelf: () => import_badge_shelf.BadgeShelf,
48
+ BadgeUnlockToastContent: () => import_badge_unlock_toast_content.BadgeUnlockToastContent,
48
49
  ClaimRail: () => import_claim_rail.ClaimRail,
49
50
  CoinCard: () => import_coin_card.CoinCard,
50
51
  CoinCardSkeleton: () => import_coin_card.CoinCardSkeleton,
@@ -55,7 +56,8 @@ __export(index_exports, {
55
56
  CollectionCardSkeleton: () => import_collection_card.CollectionCardSkeleton,
56
57
  CollectionFiltersBody: () => import_collection_filters.CollectionFiltersBody,
57
58
  CollectionFiltersTrigger: () => import_collection_filters.CollectionFiltersTrigger,
58
- CreatorsFundSection: () => import_creators_fund_section.CreatorsFundSection,
59
+ CommunityRewardsSection: () => import_community_rewards_section.CommunityRewardsSection,
60
+ CreatorAirdropBanner: () => import_creator_airdrop_banner.CreatorAirdropBanner,
59
61
  CtaCardGrid: () => import_cta_card_grid.CtaCardGrid,
60
62
  CurrencyAmount: () => import_currency_icon.CurrencyAmount,
61
63
  CurrencyIcon: () => import_currency_icon.CurrencyIcon,
@@ -101,6 +103,7 @@ __export(index_exports, {
101
103
  IP_TYPE_DATA_MAP: () => import_ip_types.IP_TYPE_DATA_MAP,
102
104
  IP_TYPE_MAP: () => import_ip_type_badge.IP_TYPE_MAP,
103
105
  IpTypeBadge: () => import_ip_type_badge.IpTypeBadge,
106
+ JourneyPath: () => import_journey_path.JourneyPath,
104
107
  KineticWords: () => import_motion_primitives.KineticWords,
105
108
  LAUNCHPAD_SERVICE_DEFINITIONS: () => import_launchpad_services2.LAUNCHPAD_SERVICE_DEFINITIONS,
106
109
  LAUNCHPAD_SERVICE_GROUPS: () => import_launchpad_services2.LAUNCHPAD_SERVICE_GROUPS,
@@ -115,6 +118,7 @@ __export(index_exports, {
115
118
  LeaderboardWidget: () => import_leaderboard_table.LeaderboardWidget,
116
119
  LevelBadge: () => import_level_badge.LevelBadge,
117
120
  LevelLadder: () => import_level_ladder.LevelLadder,
121
+ LevelUpCelebration: () => import_level_up_celebration.LevelUpCelebration,
118
122
  LicenseTermsBuilder: () => import_license_terms_builder.LicenseTermsBuilder,
119
123
  ListingCard: () => import_listing_card.ListingCard,
120
124
  ListingCardSkeleton: () => import_listing_card.ListingCardSkeleton,
@@ -181,7 +185,8 @@ __export(index_exports, {
181
185
  useIntersectionActive: () => import_use_intersection_active.useIntersectionActive,
182
186
  useLaunchpadFilter: () => import_launchpad_services.useLaunchpadFilter,
183
187
  useNavAccountSheet: () => import_nav_shell.useNavAccountSheet,
184
- useNavCommandMenu: () => import_nav_command_menu.useNavCommandMenu
188
+ useNavCommandMenu: () => import_nav_command_menu.useNavCommandMenu,
189
+ useRewardsCelebrations: () => import_use_rewards_celebrations.useRewardsCelebrations
185
190
  });
186
191
  module.exports = __toCommonJS(index_exports);
187
192
  var import_cn = require("./utils/cn.js");
@@ -265,7 +270,8 @@ var import_level_ladder = require("./components/rewards/level-ladder.js");
265
270
  var import_xp_toast_content = require("./components/rewards/xp-toast-content.js");
266
271
  var import_reward_toast = require("./components/rewards/reward-toast.js");
267
272
  var import_load_more_sentinel = require("./components/load-more-sentinel.js");
268
- var import_creators_fund_section = require("./components/creators-fund-section.js");
273
+ var import_community_rewards_section = require("./components/community-rewards-section.js");
274
+ var import_creator_airdrop_banner = require("./components/creator-airdrop-banner.js");
269
275
  var import_action_button = require("./components/action-button.js");
270
276
  var import_gradient_button = require("./components/gradient-button.js");
271
277
  var import_coin_launch_preview = require("./components/coin-launch-preview.js");
@@ -274,6 +280,10 @@ var import_token_glyph = require("./components/token-glyph.js");
274
280
  var import_stat_tile = require("./components/stat-tile.js");
275
281
  var import_action_dialog = require("./components/action-dialog.js");
276
282
  var import_hidden_content_banner = require("./components/hidden-content-banner.js");
283
+ var import_use_rewards_celebrations = require("./components/rewards/use-rewards-celebrations.js");
284
+ var import_level_up_celebration = require("./components/rewards/level-up-celebration.js");
285
+ var import_badge_unlock_toast_content = require("./components/rewards/badge-unlock-toast-content.js");
286
+ var import_journey_path = require("./components/rewards/journey-path.js");
277
287
  // Annotate the CommonJS export names for ESM import in node:
278
288
  0 && (module.exports = {
279
289
  ACTIVITY_MESSAGES,
@@ -303,6 +313,7 @@ var import_hidden_content_banner = require("./components/hidden-content-banner.j
303
313
  AssetUtilityIcons,
304
314
  BRAND,
305
315
  BadgeShelf,
316
+ BadgeUnlockToastContent,
306
317
  ClaimRail,
307
318
  CoinCard,
308
319
  CoinCardSkeleton,
@@ -313,7 +324,8 @@ var import_hidden_content_banner = require("./components/hidden-content-banner.j
313
324
  CollectionCardSkeleton,
314
325
  CollectionFiltersBody,
315
326
  CollectionFiltersTrigger,
316
- CreatorsFundSection,
327
+ CommunityRewardsSection,
328
+ CreatorAirdropBanner,
317
329
  CtaCardGrid,
318
330
  CurrencyAmount,
319
331
  CurrencyIcon,
@@ -359,6 +371,7 @@ var import_hidden_content_banner = require("./components/hidden-content-banner.j
359
371
  IP_TYPE_DATA_MAP,
360
372
  IP_TYPE_MAP,
361
373
  IpTypeBadge,
374
+ JourneyPath,
362
375
  KineticWords,
363
376
  LAUNCHPAD_SERVICE_DEFINITIONS,
364
377
  LAUNCHPAD_SERVICE_GROUPS,
@@ -373,6 +386,7 @@ var import_hidden_content_banner = require("./components/hidden-content-banner.j
373
386
  LeaderboardWidget,
374
387
  LevelBadge,
375
388
  LevelLadder,
389
+ LevelUpCelebration,
376
390
  LicenseTermsBuilder,
377
391
  ListingCard,
378
392
  ListingCardSkeleton,
@@ -439,6 +453,7 @@ var import_hidden_content_banner = require("./components/hidden-content-banner.j
439
453
  useIntersectionActive,
440
454
  useLaunchpadFilter,
441
455
  useNavAccountSheet,
442
- useNavCommandMenu
456
+ useNavCommandMenu,
457
+ useRewardsCelebrations
443
458
  });
444
459
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice, parsePriceDisplay } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\nexport { useIntersectionActive } from \"./utils/use-intersection-active.js\";\nexport { getReadIds, markRead } from \"./utils/notification-storage.js\";\nexport { licenseSummary } from \"./utils/license-summary.js\";\n\n// ── Data (server-safe — no React, safe in Server Components) ──────────────────\nexport { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from \"./data/ip-types.js\";\nexport type { IpTypeData } from \"./data/ip-types.js\";\nexport {\n IP_TYPES, LICENSE_TYPES, GEOGRAPHIC_SCOPES, AI_POLICIES,\n DERIVATIVES_OPTIONS, LICENSE_TRAIT_TYPES,\n} from \"./data/ip.js\";\nexport type { IPType, LicenseType } from \"./data/ip.js\";\nexport {\n IP_TEMPLATES, EMBED_PLATFORM_META, SOCIAL_PLATFORM_META, TEMPLATE_TRAIT_TYPES, DOC_UPLOAD,\n} from \"./data/ip-templates.js\";\nexport type { EmbedPlatform, SocialPlatform, TraitSuggestion, IPTemplate, DocUploadConfig } from \"./data/ip-templates.js\";\nexport { IPTypeDisplay } from \"./components/ip-type-display.js\";\nexport { AssetOverviewContent } from \"./components/asset-overview-content.js\";\nexport { AssetLicenseSummary } from \"./components/asset-license-summary.js\";\nexport { AssetMarketsTab } from \"./components/asset-markets-tab.js\";\nexport { ParentAttributionBanner } from \"./components/parent-attribution-banner.js\";\nexport type { ParentBannerProps } from \"./components/parent-attribution-banner.js\";\nexport { AssetMediaColumn, AssetHeaderBlock, AssetOwnerRow, buildEditionStats } from \"./components/asset-top-sections.js\";\nexport type { AssetOwnerRowProps } from \"./components/asset-top-sections.js\";\nexport { AssetCollectionBar } from \"./components/asset-collection-bar.js\";\nexport type { AssetCollectionBarProps, AssetCollectionBarSibling } from \"./components/asset-collection-bar.js\";\nexport { AssetUtilityIcons } from \"./components/asset-utility-icons.js\";\nexport type { AssetUtilityIconsProps } from \"./components/asset-utility-icons.js\";\nexport { AssetMarketplacePanel } from \"./components/asset-marketplace-panel.js\";\nexport type { AssetMarketplacePanelProps, ApiOrderLike } from \"./components/asset-marketplace-panel.js\";\nexport { BRAND } from \"./data/brand.js\";\nexport { LIVING_RENDER_COLLECTIONS, isLivingRenderCollection } from \"./data/living-render-collections.js\";\n\n// ── Components (client-only — all have \"use client\") ─────────────────────────\nexport { CurrencyIcon, CurrencyAmount } from \"./components/currency-icon.js\";\nexport type { CurrencyIconProps, CurrencyAmountProps } from \"./components/currency-icon.js\";\n\nexport { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./components/ip-type-badge.js\";\nexport type { IpTypeBadgeProps, IpTypeConfig } from \"./components/ip-type-badge.js\";\n\nexport { AddressDisplay } from \"./components/address-display.js\";\nexport type { AddressDisplayProps } from \"./components/address-display.js\";\n\nexport { MedialaneLogoFull } from \"./components/brand-logo.js\";\nexport type { MedialaneLogoFullProps } from \"./components/brand-logo.js\";\n\n// ── v0.2 additions ────────────────────────────────────────────────────────────\nexport { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from \"./components/motion-primitives.js\";\nexport { PageContainer } from \"./components/page-container.js\";\nexport type { PageContainerProps } from \"./components/page-container.js\";\nexport { ScrollSection } from \"./components/scroll-section.js\";\nexport type { ScrollSectionProps } from \"./components/scroll-section.js\";\nexport { ShareButton } from \"./components/share-button.js\";\nexport type { ShareButtonProps } from \"./components/share-button.js\";\nexport { CollectionCard, CollectionCardSkeleton } from \"./components/collection-card.js\";\nexport type { CollectionCardProps } from \"./components/collection-card.js\";\nexport { TokenCard, TokenCardSkeleton } from \"./components/token-card.js\";\nexport type { TokenCardProps } from \"./components/token-card.js\";\nexport { AnimatedTokenMedia } from \"./components/animated-token-media.js\";\nexport type { AnimatedTokenMediaProps } from \"./components/animated-token-media.js\";\nexport { ThemeAmbientBackground } from \"./components/theme-ambient-background.js\";\nexport {\n useCollectionFilters, SORT_OPTIONS, CollectionFiltersTrigger, CollectionFiltersBody,\n} from \"./components/collection-filters.js\";\nexport type { TraitSection, CollectionFiltersTriggerProps, CollectionFiltersBodyProps } from \"./components/collection-filters.js\";\nexport {\n DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel,\n DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup,\n DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent,\n DropdownMenuSubTrigger, DropdownMenuRadioGroup,\n} from \"./components/dropdown-menu.js\";\nexport { AssetCard, AssetCardSkeleton } from \"./components/asset-card.js\";\nexport type { AssetCardProps, AssetCardPrice } from \"./components/asset-card.js\";\nexport { AssetPicker } from \"./components/asset-picker.js\";\nexport type { AssetPickerProps, OwnedAsset } from \"./components/asset-picker.js\";\nexport { AssetSearchPicker } from \"./components/asset-search-picker.js\";\nexport type { AssetSearchPickerProps } from \"./components/asset-search-picker.js\";\nexport { LicenseTermsBuilder, EMPTY_SPONSORSHIP_TERMS, MEDIA_TYPES, DURATION_UNITS, toLicenseMetadata, toDurationDays } from \"./components/license-terms-builder.js\";\nexport type { LicenseTermsBuilderProps, SponsorshipTerms, DurationUnit } from \"./components/license-terms-builder.js\";\n// ── Coin discovery (chain-agnostic; price/data/href injected by the app) ─────\nexport {\n coinKind, formatCoinPrice, formatFdv,\n type CoinKind, type CoinCollectionLike, type CoinPriceLike,\n} from \"./data/coins.js\";\nexport { CoinCard, CoinRow, CoinCardSkeleton, type UseCoinPrice, type CoinTileProps } from \"./components/coin-card.js\";\nexport {\n CoinsExplorer,\n type CoinsExplorerProps, type CoinFilter, type CoinSort, type UseCoins,\n} from \"./components/coins-explorer.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo, timeUntil } from \"./utils/time.js\";\nexport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"./data/activity.js\";\nexport type { ActivityTypeConfig } from \"./data/activity.js\";\nexport { HeroSlider, HeroSliderSkeleton } from \"./components/hero-slider.js\";\nexport type { HeroSliderProps } from \"./components/hero-slider.js\";\nexport { ActivityTicker } from \"./components/activity-ticker.js\";\nexport type { ActivityTickerProps } from \"./components/activity-ticker.js\";\nexport { ListingCard, ListingCardSkeleton } from \"./components/listing-card.js\";\nexport type { ListingCardProps } from \"./components/listing-card.js\";\nexport { ActivityRow } from \"./components/activity-row.js\";\nexport type { ActivityRowProps } from \"./components/activity-row.js\";\nexport { ActivityFeedShell } from \"./components/activity-feed-shell.js\";\nexport type { ActivityFeedShellProps } from \"./components/activity-feed-shell.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.js\";\n\n// ── v0.3.2 additions ─────────────────────────────────────────────────────────\nexport { DiscoverHero } from \"./components/discover-hero.js\";\nexport type { DiscoverHeroProps } from \"./components/discover-hero.js\";\nexport { FeaturedCarousel, FeaturedCarouselSkeleton } from \"./components/featured-carousel.js\";\nexport type { FeaturedCarouselProps } from \"./components/featured-carousel.js\";\nexport { DiscoverCollectionsStrip } from \"./components/discover-collections-strip.js\";\nexport type { DiscoverCollectionsStripProps } from \"./components/discover-collections-strip.js\";\nexport { DiscoverCreatorsStrip } from \"./components/discover-creators-strip.js\";\nexport type { DiscoverCreatorsStripProps } from \"./components/discover-creators-strip.js\";\nexport { DiscoverFeedSection, DiscoverActivityStrip } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps, DiscoverActivityStripProps } from \"./components/discover-feed-section.js\";\nexport { ActivityCard, ActivityCardSkeleton, ACTIVITY_MESSAGES } from \"./components/activity-card.js\";\nexport type { ActivityCardProps } from \"./components/activity-card.js\";\n\n// ── Launchpad (grouped sections — single page-UI source since 0.8.0) ─────────\nexport { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES, useLaunchpadFilter } from \"./components/launchpad-services.js\";\nexport { LaunchpadFilterBar } from \"./components/launchpad-filter-bar.js\";\nexport type { LaunchpadFilterBarProps } from \"./components/launchpad-filter-bar.js\";\nexport { LaunchpadStrip } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadStripProps } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadGroupedSectionsProps, LaunchpadServiceCardProps, ServiceOverride, ServiceOverrides } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceGroup, ServiceGroupDefinition } from \"./data/launchpad-services.js\";\n\n// ── v0.5.0 additions ─────────────────────────────────────────────────────────\nexport { NavCommandMenu, useNavCommandMenu } from \"./components/nav-command-menu.js\";\nexport type { NavCommand, NavCommandGroup, NavCommandMenuProps } from \"./components/nav-command-menu.js\";\n\n// ── v0.62.0 — nav shell (brand trigger + header buttons + account sheet) ─────\nexport {\n NavBrandButton,\n NavIconButton,\n NavWalletTrigger,\n NavAccountSheet,\n useNavAccountSheet,\n} from \"./components/nav-shell.js\";\nexport type {\n NavBrandButtonProps,\n NavIconButtonProps,\n NavWalletTriggerProps,\n NavAccountSheetProps,\n} from \"./components/nav-shell.js\";\n\n// ── v0.59.0 — portfolio shell (two-level nav + header + overview) ────────────\nexport { PortfolioNav } from \"./components/portfolio-nav.js\";\nexport type {\n PortfolioNavProps,\n PortfolioNavSection,\n PortfolioNavChild,\n PortfolioBadgeVariant,\n} from \"./components/portfolio-nav.js\";\nexport { PortfolioHeader } from \"./components/portfolio-header.js\";\nexport type {\n PortfolioHeaderProps,\n PortfolioHeaderScore,\n} from \"./components/portfolio-header.js\";\nexport { PortfolioOverview } from \"./components/portfolio-overview.js\";\nexport type {\n PortfolioOverviewProps,\n PortfolioBentoTileConfig,\n} from \"./components/portfolio-overview.js\";\nexport { derivePortfolioCounts } from \"./utils/portfolio-counts.js\";\nexport type { PortfolioCounts, CountableOrder } from \"./utils/portfolio-counts.js\";\nexport { PortfolioBentoTile } from \"./components/portfolio-bento-tile.js\";\nexport type { PortfolioBentoTileProps } from \"./components/portfolio-bento-tile.js\";\nexport { PortfolioChipFilter } from \"./components/portfolio-chip-filter.js\";\nexport type {\n PortfolioChipFilterProps,\n PortfolioChipFilterOption,\n} from \"./components/portfolio-chip-filter.js\";\n\n// ── v0.22.0 additions — launchpad/claim form template primitives ─────────────\n// Pure-presentation header + rail shared by every launchpad/claim form. The\n// app supplies its own gate, back button, and form logic. Requires the\n// `.btn-border-animated` class (in @medialane/ui/styles) for the form shell.\nexport { ServiceHeader } from \"./components/service-header.js\";\nexport type { ServiceHeaderProps } from \"./components/service-header.js\";\nexport { ClaimRail } from \"./components/claim-rail.js\";\nexport type { ClaimRailProps } from \"./components/claim-rail.js\";\n\n// ── v0.23.0 additions — slot-based form shell ────────────────────────────────\n// Pure layout (back slot + header + animated-border compartment + 8/4 bento).\n// No auth/router — the app injects its own gate (around children) + back button.\nexport { ServiceFormShell } from \"./components/service-form-shell.js\";\nexport type { ServiceFormShellProps } from \"./components/service-form-shell.js\";\nexport { StepNav } from \"./components/step-nav.js\";\nexport type { StepNavProps, StepNavStep } from \"./components/step-nav.js\";\n\n// Rewards score kit (v0.36.0)\nexport { LevelBadge } from \"./components/rewards/level-badge.js\";\nexport type { LevelBadgeProps } from \"./components/rewards/level-badge.js\";\nexport { XpProgress } from \"./components/rewards/xp-progress.js\";\nexport type { XpProgressProps } from \"./components/rewards/xp-progress.js\";\nexport { BadgeShelf } from \"./components/rewards/badge-shelf.js\";\nexport type { BadgeShelfProps, BadgeShelfBadge } from \"./components/rewards/badge-shelf.js\";\nexport { ScoreSummaryCard } from \"./components/rewards/score-summary-card.js\";\nexport type { ScoreSummaryCardProps } from \"./components/rewards/score-summary-card.js\";\nexport { LeaderboardTable, LeaderboardWidget } from \"./components/rewards/leaderboard-table.js\";\nexport type { LeaderboardTableProps, LeaderboardWidgetProps, LeaderboardEntryLike } from \"./components/rewards/leaderboard-table.js\";\nexport { LevelLadder } from \"./components/rewards/level-ladder.js\";\nexport type { LevelLadderProps } from \"./components/rewards/level-ladder.js\";\nexport { XpToastContent } from \"./components/rewards/xp-toast-content.js\";\nexport type { XpToastContentProps } from \"./components/rewards/xp-toast-content.js\";\nexport { createRewardToast } from \"./components/rewards/reward-toast.js\";\n\n// ── v0.37.0 additions — infinite-scroll trigger ──────────────────────────────\nexport { LoadMoreSentinel } from \"./components/load-more-sentinel.js\";\nexport type { LoadMoreSentinelProps } from \"./components/load-more-sentinel.js\";\n\n// ── v0.47.0 additions — community rewards section ────────────────────────────\nexport { CreatorsFundSection } from \"./components/creators-fund-section.js\";\nexport type { CreatorsFundSectionProps, CreatorsFundLeaderboardEntry } from \"./components/creators-fund-section.js\";\n\n// ── Design system primitives — action-focus pattern, tokens, data display ────\nexport { ActionButton } from \"./components/action-button.js\";\nexport type { ActionButtonProps, ActionKey, ToneKey } from \"./components/action-button.js\";\nexport { GradientButton } from \"./components/gradient-button.js\";\nexport type { GradientButtonProps } from \"./components/gradient-button.js\";\n\nexport { CoinLaunchPreview } from \"./components/coin-launch-preview.js\";\nexport type { CoinPreviewData } from \"./components/coin-launch-preview.js\";\nexport { MedialaneCollectionCard } from \"./components/medialane-collection-card.js\";\nexport type { MedialaneCollectionCardProps } from \"./components/medialane-collection-card.js\";\nexport { TokenGlyph, TokenAmount } from \"./components/token-glyph.js\";\nexport type { TokenGlyphProps, TokenAmountProps, TokenSymbol } from \"./components/token-glyph.js\";\n\nexport { StatTile, StatPill } from \"./components/stat-tile.js\";\nexport type { StatTileProps, StatPillProps } from \"./components/stat-tile.js\";\n\nexport { ActionDialog } from \"./components/action-dialog.js\";\nexport type { ActionDialogProps } from \"./components/action-dialog.js\";\n\nexport { HiddenContentBanner } from \"./components/hidden-content-banner.js\";\n"],"mappings":"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","names":["import_launchpad_services"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice, parsePriceDisplay } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\nexport { useIntersectionActive } from \"./utils/use-intersection-active.js\";\nexport { getReadIds, markRead } from \"./utils/notification-storage.js\";\nexport { licenseSummary } from \"./utils/license-summary.js\";\n\n// ── Data (server-safe — no React, safe in Server Components) ──────────────────\nexport { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from \"./data/ip-types.js\";\nexport type { IpTypeData } from \"./data/ip-types.js\";\nexport {\n IP_TYPES, LICENSE_TYPES, GEOGRAPHIC_SCOPES, AI_POLICIES,\n DERIVATIVES_OPTIONS, LICENSE_TRAIT_TYPES,\n} from \"./data/ip.js\";\nexport type { IPType, LicenseType } from \"./data/ip.js\";\nexport {\n IP_TEMPLATES, EMBED_PLATFORM_META, SOCIAL_PLATFORM_META, TEMPLATE_TRAIT_TYPES, DOC_UPLOAD,\n} from \"./data/ip-templates.js\";\nexport type { EmbedPlatform, SocialPlatform, TraitSuggestion, IPTemplate, DocUploadConfig } from \"./data/ip-templates.js\";\nexport { IPTypeDisplay } from \"./components/ip-type-display.js\";\nexport { AssetOverviewContent } from \"./components/asset-overview-content.js\";\nexport { AssetLicenseSummary } from \"./components/asset-license-summary.js\";\nexport { AssetMarketsTab } from \"./components/asset-markets-tab.js\";\nexport { ParentAttributionBanner } from \"./components/parent-attribution-banner.js\";\nexport type { ParentBannerProps } from \"./components/parent-attribution-banner.js\";\nexport { AssetMediaColumn, AssetHeaderBlock, AssetOwnerRow, buildEditionStats } from \"./components/asset-top-sections.js\";\nexport type { AssetOwnerRowProps } from \"./components/asset-top-sections.js\";\nexport { AssetCollectionBar } from \"./components/asset-collection-bar.js\";\nexport type { AssetCollectionBarProps, AssetCollectionBarSibling } from \"./components/asset-collection-bar.js\";\nexport { AssetUtilityIcons } from \"./components/asset-utility-icons.js\";\nexport type { AssetUtilityIconsProps } from \"./components/asset-utility-icons.js\";\nexport { AssetMarketplacePanel } from \"./components/asset-marketplace-panel.js\";\nexport type { AssetMarketplacePanelProps, ApiOrderLike } from \"./components/asset-marketplace-panel.js\";\nexport { BRAND } from \"./data/brand.js\";\nexport { LIVING_RENDER_COLLECTIONS, isLivingRenderCollection } from \"./data/living-render-collections.js\";\n\n// ── Components (client-only — all have \"use client\") ─────────────────────────\nexport { CurrencyIcon, CurrencyAmount } from \"./components/currency-icon.js\";\nexport type { CurrencyIconProps, CurrencyAmountProps } from \"./components/currency-icon.js\";\n\nexport { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./components/ip-type-badge.js\";\nexport type { IpTypeBadgeProps, IpTypeConfig } from \"./components/ip-type-badge.js\";\n\nexport { AddressDisplay } from \"./components/address-display.js\";\nexport type { AddressDisplayProps } from \"./components/address-display.js\";\n\nexport { MedialaneLogoFull } from \"./components/brand-logo.js\";\nexport type { MedialaneLogoFullProps } from \"./components/brand-logo.js\";\n\n// ── v0.2 additions ────────────────────────────────────────────────────────────\nexport { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from \"./components/motion-primitives.js\";\nexport { PageContainer } from \"./components/page-container.js\";\nexport type { PageContainerProps } from \"./components/page-container.js\";\nexport { ScrollSection } from \"./components/scroll-section.js\";\nexport type { ScrollSectionProps } from \"./components/scroll-section.js\";\nexport { ShareButton } from \"./components/share-button.js\";\nexport type { ShareButtonProps } from \"./components/share-button.js\";\nexport { CollectionCard, CollectionCardSkeleton } from \"./components/collection-card.js\";\nexport type { CollectionCardProps } from \"./components/collection-card.js\";\nexport { TokenCard, TokenCardSkeleton } from \"./components/token-card.js\";\nexport type { TokenCardProps } from \"./components/token-card.js\";\nexport { AnimatedTokenMedia } from \"./components/animated-token-media.js\";\nexport type { AnimatedTokenMediaProps } from \"./components/animated-token-media.js\";\nexport { ThemeAmbientBackground } from \"./components/theme-ambient-background.js\";\nexport {\n useCollectionFilters, SORT_OPTIONS, CollectionFiltersTrigger, CollectionFiltersBody,\n} from \"./components/collection-filters.js\";\nexport type { TraitSection, CollectionFiltersTriggerProps, CollectionFiltersBodyProps } from \"./components/collection-filters.js\";\nexport {\n DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel,\n DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup,\n DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent,\n DropdownMenuSubTrigger, DropdownMenuRadioGroup,\n} from \"./components/dropdown-menu.js\";\nexport { AssetCard, AssetCardSkeleton } from \"./components/asset-card.js\";\nexport type { AssetCardProps, AssetCardPrice } from \"./components/asset-card.js\";\nexport { AssetPicker } from \"./components/asset-picker.js\";\nexport type { AssetPickerProps, OwnedAsset } from \"./components/asset-picker.js\";\nexport { AssetSearchPicker } from \"./components/asset-search-picker.js\";\nexport type { AssetSearchPickerProps } from \"./components/asset-search-picker.js\";\nexport { LicenseTermsBuilder, EMPTY_SPONSORSHIP_TERMS, MEDIA_TYPES, DURATION_UNITS, toLicenseMetadata, toDurationDays } from \"./components/license-terms-builder.js\";\nexport type { LicenseTermsBuilderProps, SponsorshipTerms, DurationUnit } from \"./components/license-terms-builder.js\";\n// ── Coin discovery (chain-agnostic; price/data/href injected by the app) ─────\nexport {\n coinKind, formatCoinPrice, formatFdv,\n type CoinKind, type CoinCollectionLike, type CoinPriceLike,\n} from \"./data/coins.js\";\nexport { CoinCard, CoinRow, CoinCardSkeleton, type UseCoinPrice, type CoinTileProps } from \"./components/coin-card.js\";\nexport {\n CoinsExplorer,\n type CoinsExplorerProps, type CoinFilter, type CoinSort, type UseCoins,\n} from \"./components/coins-explorer.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo, timeUntil } from \"./utils/time.js\";\nexport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"./data/activity.js\";\nexport type { ActivityTypeConfig } from \"./data/activity.js\";\nexport { HeroSlider, HeroSliderSkeleton } from \"./components/hero-slider.js\";\nexport type { HeroSliderProps } from \"./components/hero-slider.js\";\nexport { ActivityTicker } from \"./components/activity-ticker.js\";\nexport type { ActivityTickerProps } from \"./components/activity-ticker.js\";\nexport { ListingCard, ListingCardSkeleton } from \"./components/listing-card.js\";\nexport type { ListingCardProps } from \"./components/listing-card.js\";\nexport { ActivityRow } from \"./components/activity-row.js\";\nexport type { ActivityRowProps } from \"./components/activity-row.js\";\nexport { ActivityFeedShell } from \"./components/activity-feed-shell.js\";\nexport type { ActivityFeedShellProps } from \"./components/activity-feed-shell.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.js\";\n\n// ── v0.3.2 additions ─────────────────────────────────────────────────────────\nexport { DiscoverHero } from \"./components/discover-hero.js\";\nexport type { DiscoverHeroProps } from \"./components/discover-hero.js\";\nexport { FeaturedCarousel, FeaturedCarouselSkeleton } from \"./components/featured-carousel.js\";\nexport type { FeaturedCarouselProps } from \"./components/featured-carousel.js\";\nexport { DiscoverCollectionsStrip } from \"./components/discover-collections-strip.js\";\nexport type { DiscoverCollectionsStripProps } from \"./components/discover-collections-strip.js\";\nexport { DiscoverCreatorsStrip } from \"./components/discover-creators-strip.js\";\nexport type { DiscoverCreatorsStripProps } from \"./components/discover-creators-strip.js\";\nexport { DiscoverFeedSection, DiscoverActivityStrip } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps, DiscoverActivityStripProps } from \"./components/discover-feed-section.js\";\nexport { ActivityCard, ActivityCardSkeleton, ACTIVITY_MESSAGES } from \"./components/activity-card.js\";\nexport type { ActivityCardProps } from \"./components/activity-card.js\";\n\n// ── Launchpad (grouped sections — single page-UI source since 0.8.0) ─────────\nexport { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES, useLaunchpadFilter } from \"./components/launchpad-services.js\";\nexport { LaunchpadFilterBar } from \"./components/launchpad-filter-bar.js\";\nexport type { LaunchpadFilterBarProps } from \"./components/launchpad-filter-bar.js\";\nexport { LaunchpadStrip } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadStripProps } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadGroupedSectionsProps, LaunchpadServiceCardProps, ServiceOverride, ServiceOverrides } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceGroup, ServiceGroupDefinition } from \"./data/launchpad-services.js\";\n\n// ── v0.5.0 additions ─────────────────────────────────────────────────────────\nexport { NavCommandMenu, useNavCommandMenu } from \"./components/nav-command-menu.js\";\nexport type { NavCommand, NavCommandGroup, NavCommandMenuProps } from \"./components/nav-command-menu.js\";\n\n// ── v0.62.0 — nav shell (brand trigger + header buttons + account sheet) ─────\nexport {\n NavBrandButton,\n NavIconButton,\n NavWalletTrigger,\n NavAccountSheet,\n useNavAccountSheet,\n} from \"./components/nav-shell.js\";\nexport type {\n NavBrandButtonProps,\n NavIconButtonProps,\n NavWalletTriggerProps,\n NavAccountSheetProps,\n} from \"./components/nav-shell.js\";\n\n// ── v0.59.0 — portfolio shell (two-level nav + header + overview) ────────────\nexport { PortfolioNav } from \"./components/portfolio-nav.js\";\nexport type {\n PortfolioNavProps,\n PortfolioNavSection,\n PortfolioNavChild,\n PortfolioBadgeVariant,\n} from \"./components/portfolio-nav.js\";\nexport { PortfolioHeader } from \"./components/portfolio-header.js\";\nexport type {\n PortfolioHeaderProps,\n PortfolioHeaderScore,\n} from \"./components/portfolio-header.js\";\nexport { PortfolioOverview } from \"./components/portfolio-overview.js\";\nexport type {\n PortfolioOverviewProps,\n PortfolioBentoTileConfig,\n} from \"./components/portfolio-overview.js\";\nexport { derivePortfolioCounts } from \"./utils/portfolio-counts.js\";\nexport type { PortfolioCounts, CountableOrder } from \"./utils/portfolio-counts.js\";\nexport { PortfolioBentoTile } from \"./components/portfolio-bento-tile.js\";\nexport type { PortfolioBentoTileProps } from \"./components/portfolio-bento-tile.js\";\nexport { PortfolioChipFilter } from \"./components/portfolio-chip-filter.js\";\nexport type {\n PortfolioChipFilterProps,\n PortfolioChipFilterOption,\n} from \"./components/portfolio-chip-filter.js\";\n\n// ── v0.22.0 additions — launchpad/claim form template primitives ─────────────\n// Pure-presentation header + rail shared by every launchpad/claim form. The\n// app supplies its own gate, back button, and form logic. Requires the\n// `.btn-border-animated` class (in @medialane/ui/styles) for the form shell.\nexport { ServiceHeader } from \"./components/service-header.js\";\nexport type { ServiceHeaderProps } from \"./components/service-header.js\";\nexport { ClaimRail } from \"./components/claim-rail.js\";\nexport type { ClaimRailProps } from \"./components/claim-rail.js\";\n\n// ── v0.23.0 additions — slot-based form shell ────────────────────────────────\n// Pure layout (back slot + header + animated-border compartment + 8/4 bento).\n// No auth/router — the app injects its own gate (around children) + back button.\nexport { ServiceFormShell } from \"./components/service-form-shell.js\";\nexport type { ServiceFormShellProps } from \"./components/service-form-shell.js\";\nexport { StepNav } from \"./components/step-nav.js\";\nexport type { StepNavProps, StepNavStep } from \"./components/step-nav.js\";\n\n// Rewards score kit (v0.36.0)\nexport { LevelBadge } from \"./components/rewards/level-badge.js\";\nexport type { LevelBadgeProps } from \"./components/rewards/level-badge.js\";\nexport { XpProgress } from \"./components/rewards/xp-progress.js\";\nexport type { XpProgressProps } from \"./components/rewards/xp-progress.js\";\nexport { BadgeShelf } from \"./components/rewards/badge-shelf.js\";\nexport type { BadgeShelfProps, BadgeShelfBadge } from \"./components/rewards/badge-shelf.js\";\nexport { ScoreSummaryCard } from \"./components/rewards/score-summary-card.js\";\nexport type { ScoreSummaryCardProps } from \"./components/rewards/score-summary-card.js\";\nexport { LeaderboardTable, LeaderboardWidget } from \"./components/rewards/leaderboard-table.js\";\nexport type { LeaderboardTableProps, LeaderboardWidgetProps, LeaderboardEntryLike } from \"./components/rewards/leaderboard-table.js\";\nexport { LevelLadder } from \"./components/rewards/level-ladder.js\";\nexport type { LevelLadderProps } from \"./components/rewards/level-ladder.js\";\nexport { XpToastContent } from \"./components/rewards/xp-toast-content.js\";\nexport type { XpToastContentProps } from \"./components/rewards/xp-toast-content.js\";\nexport { createRewardToast } from \"./components/rewards/reward-toast.js\";\nexport type { RewardToastSnapshot } from \"./components/rewards/reward-toast.js\";\n\n// ── v0.37.0 additions — infinite-scroll trigger ──────────────────────────────\nexport { LoadMoreSentinel } from \"./components/load-more-sentinel.js\";\nexport type { LoadMoreSentinelProps } from \"./components/load-more-sentinel.js\";\n\n// ── v0.47.0 additions — community rewards section ────────────────────────────\nexport { CommunityRewardsSection } from \"./components/community-rewards-section.js\";\nexport type { CommunityRewardsSectionProps, CommunityRewardsEntry } from \"./components/community-rewards-section.js\";\nexport { CreatorAirdropBanner } from \"./components/creator-airdrop-banner.js\";\nexport type { CreatorAirdropBannerProps } from \"./components/creator-airdrop-banner.js\";\n\n// ── Design system primitives — action-focus pattern, tokens, data display ────\nexport { ActionButton } from \"./components/action-button.js\";\nexport type { ActionButtonProps, ActionKey, ToneKey } from \"./components/action-button.js\";\nexport { GradientButton } from \"./components/gradient-button.js\";\nexport type { GradientButtonProps } from \"./components/gradient-button.js\";\n\nexport { CoinLaunchPreview } from \"./components/coin-launch-preview.js\";\nexport type { CoinPreviewData } from \"./components/coin-launch-preview.js\";\nexport { MedialaneCollectionCard } from \"./components/medialane-collection-card.js\";\nexport type { MedialaneCollectionCardProps } from \"./components/medialane-collection-card.js\";\nexport { TokenGlyph, TokenAmount } from \"./components/token-glyph.js\";\nexport type { TokenGlyphProps, TokenAmountProps, TokenSymbol } from \"./components/token-glyph.js\";\n\nexport { StatTile, StatPill } from \"./components/stat-tile.js\";\nexport type { StatTileProps, StatPillProps } from \"./components/stat-tile.js\";\n\nexport { ActionDialog } from \"./components/action-dialog.js\";\nexport type { ActionDialogProps } from \"./components/action-dialog.js\";\n\nexport { HiddenContentBanner } from \"./components/hidden-content-banner.js\";\n\n// ── v0.99.0 additions — rewards UX overhaul ───────────────────────────────────\nexport { useRewardsCelebrations } from \"./components/rewards/use-rewards-celebrations.js\";\nexport { LevelUpCelebration } from \"./components/rewards/level-up-celebration.js\";\nexport type { LevelUpCelebrationProps } from \"./components/rewards/level-up-celebration.js\";\nexport { BadgeUnlockToastContent } from \"./components/rewards/badge-unlock-toast-content.js\";\nexport type { BadgeUnlockToastContentProps } from \"./components/rewards/badge-unlock-toast-content.js\";\nexport { JourneyPath } from \"./components/rewards/journey-path.js\";\nexport type { JourneyPathProps, JourneyStep } from \"./components/rewards/journey-path.js\";\n"],"mappings":"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","names":["import_launchpad_services"]}