@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.
- package/dist/components/community-rewards-section.cjs +123 -0
- package/dist/components/community-rewards-section.cjs.map +1 -0
- package/dist/components/community-rewards-section.d.cts +15 -0
- package/dist/components/community-rewards-section.d.ts +15 -0
- package/dist/components/community-rewards-section.js +89 -0
- package/dist/components/community-rewards-section.js.map +1 -0
- package/dist/components/creator-airdrop-banner.cjs +79 -0
- package/dist/components/creator-airdrop-banner.cjs.map +1 -0
- package/dist/components/creator-airdrop-banner.d.cts +9 -0
- package/dist/components/creator-airdrop-banner.d.ts +9 -0
- package/dist/components/creator-airdrop-banner.js +45 -0
- package/dist/components/creator-airdrop-banner.js.map +1 -0
- package/dist/components/rewards/badge-shelf.cjs +2 -0
- package/dist/components/rewards/badge-shelf.cjs.map +1 -1
- package/dist/components/rewards/badge-shelf.d.cts +6 -1
- package/dist/components/rewards/badge-shelf.d.ts +6 -1
- package/dist/components/rewards/badge-shelf.js +1 -0
- package/dist/components/rewards/badge-shelf.js.map +1 -1
- package/dist/components/rewards/badge-unlock-toast-content.cjs +49 -0
- package/dist/components/rewards/badge-unlock-toast-content.cjs.map +1 -0
- package/dist/components/rewards/badge-unlock-toast-content.d.cts +11 -0
- package/dist/components/rewards/badge-unlock-toast-content.d.ts +11 -0
- package/dist/components/rewards/badge-unlock-toast-content.js +25 -0
- package/dist/components/rewards/badge-unlock-toast-content.js.map +1 -0
- package/dist/components/rewards/journey-path.cjs +77 -0
- package/dist/components/rewards/journey-path.cjs.map +1 -0
- package/dist/components/rewards/journey-path.d.cts +26 -0
- package/dist/components/rewards/journey-path.d.ts +26 -0
- package/dist/components/rewards/journey-path.js +53 -0
- package/dist/components/rewards/journey-path.js.map +1 -0
- package/dist/components/rewards/level-badge.cjs +1 -3
- package/dist/components/rewards/level-badge.cjs.map +1 -1
- package/dist/components/rewards/level-badge.d.cts +4 -2
- package/dist/components/rewards/level-badge.d.ts +4 -2
- package/dist/components/rewards/level-badge.js +1 -3
- package/dist/components/rewards/level-badge.js.map +1 -1
- package/dist/components/rewards/level-up-celebration.cjs +71 -0
- package/dist/components/rewards/level-up-celebration.cjs.map +1 -0
- package/dist/components/rewards/level-up-celebration.d.cts +16 -0
- package/dist/components/rewards/level-up-celebration.d.ts +16 -0
- package/dist/components/rewards/level-up-celebration.js +47 -0
- package/dist/components/rewards/level-up-celebration.js.map +1 -0
- package/dist/components/rewards/reward-toast.cjs +20 -2
- package/dist/components/rewards/reward-toast.cjs.map +1 -1
- package/dist/components/rewards/reward-toast.d.cts +6 -2
- package/dist/components/rewards/reward-toast.d.ts +6 -2
- package/dist/components/rewards/reward-toast.js +20 -2
- package/dist/components/rewards/reward-toast.js.map +1 -1
- package/dist/components/rewards/use-rewards-celebrations.cjs +70 -0
- package/dist/components/rewards/use-rewards-celebrations.cjs.map +1 -0
- package/dist/components/rewards/use-rewards-celebrations.d.cts +25 -0
- package/dist/components/rewards/use-rewards-celebrations.d.ts +25 -0
- package/dist/components/rewards/use-rewards-celebrations.js +46 -0
- package/dist/components/rewards/use-rewards-celebrations.js.map +1 -0
- package/dist/components/rewards/xp-toast-content.cjs +23 -18
- package/dist/components/rewards/xp-toast-content.cjs.map +1 -1
- package/dist/components/rewards/xp-toast-content.d.cts +7 -1
- package/dist/components/rewards/xp-toast-content.d.ts +7 -1
- package/dist/components/rewards/xp-toast-content.js +23 -18
- package/dist/components/rewards/xp-toast-content.js.map +1 -1
- package/dist/index.cjs +20 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -2
- package/dist/index.d.ts +7 -2
- package/dist/index.js +13 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/components/creators-fund-section.cjs +0 -139
- package/dist/components/creators-fund-section.cjs.map +0 -1
- package/dist/components/creators-fund-section.d.cts +0 -26
- package/dist/components/creators-fund-section.d.ts +0 -26
- package/dist/components/creators-fund-section.js +0 -105
- 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
|
-
|
|
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":";
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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":["
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
"
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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":["
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAAmB;AACnB,oBAAsD;AACtD,qBAA+B;AAC/B,kBAA2B;AAC3B,qCAAsC;AACtC,kCAAqC;AACrC,6BAA+B;AAG/B,sBAA+C;AAE/C,gBAGO;AAEP,0BAEO;AAEP,6BAA8B;AAC9B,oCAAqC;AACrC,mCAAoC;AACpC,+BAAgC;AAChC,uCAAwC;AAExC,gCAAqF;AAErF,kCAAmC;AAEnC,iCAAkC;AAElC,qCAAsC;AAEtC,mBAAsB;AACtB,uCAAoE;AAGpE,2BAA6C;AAG7C,2BAAyD;AAGzD,6BAA+B;AAG/B,wBAAkC;AAIlC,+BAAyF;AACzF,4BAA8B;AAE9B,4BAA8B;AAE9B,0BAA4B;AAE5B,6BAAuD;AAEvD,wBAA6C;AAE7C,kCAAmC;AAEnC,sCAAuC;AACvC,gCAEO;AAEP,2BAMO;AACP,wBAA6C;AAE7C,0BAA4B;AAE5B,iCAAkC;AAElC,mCAA6H;AAG7H,mBAGO;AACP,uBAA2F;AAC3F,4BAGO;AAGP,kBAAmC;AACnC,sBAAmD;AAEnD,yBAA+C;AAE/C,6BAA+B;AAE/B,0BAAiD;AAEjD,0BAA4B;AAE5B,iCAAkC;AAElC,2BAA4B;AAI5B,2BAA6B;AAE7B,+BAA2D;AAE3D,wCAAyC;AAEzC,qCAAsC;AAEtC,mCAA2D;AAE3D,2BAAsE;AAItE,gCAAiG;AACjG,kCAAmC;AAEnC,6BAA+B;AAG/B,IAAAA,6BAAwE;AAIxE,8BAAkD;AAIlD,uBAMO;AASP,2BAA6B;AAO7B,8BAAgC;AAKhC,gCAAkC;AAKlC,8BAAsC;AAEtC,kCAAmC;AAEnC,mCAAoC;AAUpC,4BAA8B;AAE9B,wBAA0B;AAM1B,gCAAiC;AAEjC,sBAAwB;AAIxB,yBAA2B;AAE3B,yBAA2B;AAE3B,yBAA2B;AAE3B,gCAAiC;AAEjC,+BAAoD;AAEpD,0BAA4B;AAE5B,8BAA+B;AAE/B,0BAAkC;AAIlC,gCAAiC;AAIjC,uCAAwC;AAExC,oCAAqC;AAIrC,2BAA6B;AAE7B,6BAA+B;AAG/B,iCAAkC;AAElC,uCAAwC;AAExC,yBAAwC;AAGxC,uBAAmC;AAGnC,2BAA6B;AAG7B,mCAAoC;AAGpC,sCAAuC;AACvC,kCAAmC;AAEnC,wCAAwC;AAExC,0BAA4B;","names":["import_launchpad_services"]}
|