@medialane/ui 0.290.0 → 0.292.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 (102) hide show
  1. package/dist/components/account/input-otp.d.cts +2 -2
  2. package/dist/components/account/input-otp.d.ts +2 -2
  3. package/dist/components/action-button.cjs +3 -30
  4. package/dist/components/action-button.cjs.map +1 -1
  5. package/dist/components/action-button.d.cts +1 -2
  6. package/dist/components/action-button.d.ts +1 -2
  7. package/dist/components/action-button.js +1 -28
  8. package/dist/components/action-button.js.map +1 -1
  9. package/dist/components/badge.d.cts +1 -1
  10. package/dist/components/badge.d.ts +1 -1
  11. package/dist/components/button.d.cts +2 -2
  12. package/dist/components/button.d.ts +2 -2
  13. package/dist/components/drop/create/launch-dialog.cjs +10 -7
  14. package/dist/components/drop/create/launch-dialog.cjs.map +1 -1
  15. package/dist/components/drop/create/launch-dialog.js +10 -7
  16. package/dist/components/drop/create/launch-dialog.js.map +1 -1
  17. package/dist/components/drop/page/drop-manage.cjs +6 -3
  18. package/dist/components/drop/page/drop-manage.cjs.map +1 -1
  19. package/dist/components/drop/page/drop-manage.js +6 -3
  20. package/dist/components/drop/page/drop-manage.js.map +1 -1
  21. package/dist/components/drop/page/drop-mint-dialog.cjs +9 -6
  22. package/dist/components/drop/page/drop-mint-dialog.cjs.map +1 -1
  23. package/dist/components/drop/page/drop-mint-dialog.js +9 -6
  24. package/dist/components/drop/page/drop-mint-dialog.js.map +1 -1
  25. package/dist/components/fast-mint/fast-mint.cjs +6 -13
  26. package/dist/components/fast-mint/fast-mint.cjs.map +1 -1
  27. package/dist/components/fast-mint/fast-mint.d.cts +2 -2
  28. package/dist/components/fast-mint/fast-mint.d.ts +2 -2
  29. package/dist/components/fast-mint/fast-mint.js +7 -15
  30. package/dist/components/fast-mint/fast-mint.js.map +1 -1
  31. package/dist/components/gated-content.cjs +2 -1
  32. package/dist/components/gated-content.cjs.map +1 -1
  33. package/dist/components/gated-content.js +2 -1
  34. package/dist/components/gated-content.js.map +1 -1
  35. package/dist/components/listings-grid.cjs +147 -0
  36. package/dist/components/listings-grid.cjs.map +1 -0
  37. package/dist/components/listings-grid.d.cts +15 -0
  38. package/dist/components/listings-grid.d.ts +15 -0
  39. package/dist/components/listings-grid.js +113 -0
  40. package/dist/components/listings-grid.js.map +1 -0
  41. package/dist/components/media-wallet/action-button.cjs +0 -18
  42. package/dist/components/media-wallet/action-button.cjs.map +1 -1
  43. package/dist/components/media-wallet/action-button.d.cts +1 -3
  44. package/dist/components/media-wallet/action-button.d.ts +1 -3
  45. package/dist/components/media-wallet/action-button.js +0 -16
  46. package/dist/components/media-wallet/action-button.js.map +1 -1
  47. package/dist/components/media-wallet/activate-card.cjs +2 -2
  48. package/dist/components/media-wallet/activate-card.cjs.map +1 -1
  49. package/dist/components/media-wallet/activate-card.js +1 -1
  50. package/dist/components/media-wallet/activate-card.js.map +1 -1
  51. package/dist/components/media-wallet/media-wallet-activity.cjs +4 -6
  52. package/dist/components/media-wallet/media-wallet-activity.cjs.map +1 -1
  53. package/dist/components/media-wallet/media-wallet-activity.js +4 -6
  54. package/dist/components/media-wallet/media-wallet-activity.js.map +1 -1
  55. package/dist/components/media-wallet/media-wallet-home.cjs +2 -1
  56. package/dist/components/media-wallet/media-wallet-home.cjs.map +1 -1
  57. package/dist/components/media-wallet/media-wallet-home.js +2 -1
  58. package/dist/components/media-wallet/media-wallet-home.js.map +1 -1
  59. package/dist/components/media-wallet/quick-action.cjs +3 -3
  60. package/dist/components/media-wallet/quick-action.cjs.map +1 -1
  61. package/dist/components/media-wallet/quick-action.d.cts +1 -1
  62. package/dist/components/media-wallet/quick-action.d.ts +1 -1
  63. package/dist/components/media-wallet/quick-action.js +1 -1
  64. package/dist/components/media-wallet/quick-action.js.map +1 -1
  65. package/dist/components/media-wallet/success-dialog.cjs +2 -2
  66. package/dist/components/media-wallet/success-dialog.cjs.map +1 -1
  67. package/dist/components/media-wallet/success-dialog.js +1 -1
  68. package/dist/components/media-wallet/success-dialog.js.map +1 -1
  69. package/dist/components/media-wallet/wallet-activity-icon.cjs +5 -4
  70. package/dist/components/media-wallet/wallet-activity-icon.cjs.map +1 -1
  71. package/dist/components/media-wallet/wallet-activity-icon.js +5 -4
  72. package/dist/components/media-wallet/wallet-activity-icon.js.map +1 -1
  73. package/dist/components/medialane-collection-card.cjs +6 -6
  74. package/dist/components/medialane-collection-card.cjs.map +1 -1
  75. package/dist/components/medialane-collection-card.js +6 -6
  76. package/dist/components/medialane-collection-card.js.map +1 -1
  77. package/dist/components/sheet.d.cts +1 -1
  78. package/dist/components/sheet.d.ts +1 -1
  79. package/dist/components/wallet/self-fund-consent-dialog.cjs +6 -4
  80. package/dist/components/wallet/self-fund-consent-dialog.cjs.map +1 -1
  81. package/dist/components/wallet/self-fund-consent-dialog.js +6 -4
  82. package/dist/components/wallet/self-fund-consent-dialog.js.map +1 -1
  83. package/dist/data/brand.cjs +54 -2
  84. package/dist/data/brand.cjs.map +1 -1
  85. package/dist/data/brand.d.cts +16 -1
  86. package/dist/data/brand.d.ts +16 -1
  87. package/dist/data/brand.js +47 -1
  88. package/dist/data/brand.js.map +1 -1
  89. package/dist/index.cjs +11 -3
  90. package/dist/index.cjs.map +1 -1
  91. package/dist/index.d.cts +2 -2
  92. package/dist/index.d.ts +2 -2
  93. package/dist/index.js +7 -3
  94. package/dist/index.js.map +1 -1
  95. package/dist/medialane.css +14 -23
  96. package/package.json +1 -1
  97. package/dist/components/action-dialog.cjs +0 -70
  98. package/dist/components/action-dialog.cjs.map +0 -1
  99. package/dist/components/action-dialog.d.cts +0 -12
  100. package/dist/components/action-dialog.d.ts +0 -12
  101. package/dist/components/action-dialog.js +0 -46
  102. package/dist/components/action-dialog.js.map +0 -1
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var listings_grid_exports = {};
31
+ __export(listings_grid_exports, {
32
+ ListingsGrid: () => ListingsGrid
33
+ });
34
+ module.exports = __toCommonJS(listings_grid_exports);
35
+ var import_jsx_runtime = require("react/jsx-runtime");
36
+ var import_react = require("react");
37
+ var import_sdk = require("@medialane/sdk");
38
+ var import_link = __toESM(require("./link.js"), 1);
39
+ var import_button = require("./button.js");
40
+ var import_listing_card = require("./listing-card.js");
41
+ var import_listing_card_menu = require("./listing-card-menu.js");
42
+ var import_load_more_sentinel = require("./load-more-sentinel.js");
43
+ var import_medialane_app = require("./medialane-app.js");
44
+ var import_use_orders = require("../utils/use-orders.js");
45
+ var import_use_image_url = require("../utils/use-image-url.js");
46
+ var import_use_usd_prices = require("../utils/use-usd-prices.js");
47
+ var import_empty_messages = require("../utils/empty-messages.js");
48
+ const PAGE_SIZE = 15;
49
+ const BACKEND_PAGE_SIZE = 50;
50
+ function MarketplaceListingCard({ order, onBuy }) {
51
+ const resolveImage = (0, import_use_image_url.useImageUrl)();
52
+ const usdPrices = (0, import_use_usd_prices.useUsdPrices)();
53
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
54
+ import_listing_card.ListingCard,
55
+ {
56
+ order,
57
+ onBuy,
58
+ overflowMenu: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_listing_card_menu.ListingCardMenu, { order }),
59
+ imageUrl: resolveImage(order.token?.image),
60
+ usdValue: (0, import_use_usd_prices.usdValueFor)(order.price?.formatted, order.price?.currency, usdPrices)
61
+ }
62
+ );
63
+ }
64
+ function ListingsGrid({ sort = "recent", currency, orderType = "", minPrice, maxPrice, initialOrders, onBuy }) {
65
+ const { walletAddress } = (0, import_medialane_app.useMedialaneApp)();
66
+ const [backendPage, setBackendPage] = (0, import_react.useState)(1);
67
+ const [visiblePages, setVisiblePages] = (0, import_react.useState)(1);
68
+ const [allOrders, setAllOrders] = (0, import_react.useState)(initialOrders ?? []);
69
+ const prevFilters = (0, import_react.useRef)({ sort, currency, orderType, minPrice, maxPrice });
70
+ (0, import_react.useEffect)(() => {
71
+ const f = prevFilters.current;
72
+ if (f.sort !== sort || f.currency !== currency || f.orderType !== orderType || f.minPrice !== minPrice || f.maxPrice !== maxPrice) {
73
+ prevFilters.current = { sort, currency, orderType, minPrice, maxPrice };
74
+ setBackendPage(1);
75
+ setVisiblePages(1);
76
+ setAllOrders([]);
77
+ }
78
+ }, [sort, currency, orderType, minPrice, maxPrice]);
79
+ const { orders, meta, isLoading } = (0, import_use_orders.useOrders)({
80
+ status: "ACTIVE",
81
+ sort,
82
+ ...currency ? { currency } : {},
83
+ ...minPrice ? { minPrice } : {},
84
+ ...maxPrice ? { maxPrice } : {},
85
+ page: backendPage,
86
+ limit: BACKEND_PAGE_SIZE
87
+ });
88
+ (0, import_react.useEffect)(() => {
89
+ if (isLoading) return;
90
+ if (backendPage === 1) {
91
+ setAllOrders(orders);
92
+ } else {
93
+ setAllOrders((prev) => {
94
+ const existing = new Set(prev.map((o) => o.orderHash));
95
+ const newItems = orders.filter((o) => !existing.has(o.orderHash));
96
+ return newItems.length > 0 ? [...prev, ...newItems] : prev;
97
+ });
98
+ }
99
+ }, [orders, isLoading, backendPage]);
100
+ const filteredOrders = orderType === "offers" ? allOrders.filter((o) => o.offer.itemType === "ERC20") : allOrders.filter((o) => o.offer.itemType === "ERC721" || o.offer.itemType === "ERC1155");
101
+ const visibleLimit = visiblePages * PAGE_SIZE;
102
+ const displayedOrders = filteredOrders.slice(0, visibleLimit);
103
+ const isInitialLoading = isLoading && allOrders.length === 0;
104
+ const isLoadingMore = isLoading && allOrders.length > 0;
105
+ const backendTotal = meta?.total ?? 0;
106
+ const hasBackendMore = backendTotal > 0 ? allOrders.length < backendTotal : orders.length === BACKEND_PAGE_SIZE;
107
+ const hasBufferedOrders = filteredOrders.length > displayedOrders.length;
108
+ const hasMore = hasBufferedOrders || hasBackendMore || isLoadingMore;
109
+ (0, import_react.useEffect)(() => {
110
+ if (isLoading || !hasBackendMore || filteredOrders.length >= visibleLimit) return;
111
+ setBackendPage((p) => p + 1);
112
+ }, [filteredOrders.length, hasBackendMore, isLoading, visibleLimit]);
113
+ const isOwner = (order) => !!walletAddress && !!order.offerer && (0, import_sdk.normalizeAddress)("STARKNET", order.offerer) === (0, import_sdk.normalizeAddress)("STARKNET", walletAddress);
114
+ const handleLoadMore = () => {
115
+ setVisiblePages((p) => p + 1);
116
+ };
117
+ if (isInitialLoading || filteredOrders.length === 0 && hasBackendMore) {
118
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4", children: Array.from({ length: PAGE_SIZE }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_listing_card.ListingCardSkeleton, {}, i)) });
119
+ }
120
+ if (filteredOrders.length === 0 && !isLoading && !hasBackendMore) {
121
+ const empty = orderType === "offers" ? import_empty_messages.emptyMessages.offers : import_empty_messages.emptyMessages.listings;
122
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col items-center justify-center py-24 gap-4 text-center", children: [
123
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-2xl font-bold", children: empty.title }),
124
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground max-w-sm", children: empty.description }),
125
+ orderType !== "offers" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { variant: "outline", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/create", children: "Create & List" }) })
126
+ ] });
127
+ }
128
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-6", children: [
129
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4", children: [
130
+ displayedOrders.map((order) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MarketplaceListingCard, { order, onBuy: isOwner(order) ? void 0 : onBuy }, order.orderHash)),
131
+ isLoadingMore && Array.from({ length: PAGE_SIZE }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_listing_card.ListingCardSkeleton, {}, `loading-${i}`))
132
+ ] }),
133
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_load_more_sentinel.LoadMoreSentinel, { hasMore, isLoading: isLoadingMore, onLoadMore: handleLoadMore }),
134
+ !hasMore && filteredOrders.length > PAGE_SIZE && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-center text-xs text-muted-foreground", children: [
135
+ "All ",
136
+ filteredOrders.length,
137
+ " ",
138
+ orderType === "offers" ? "offers" : "listings",
139
+ " shown"
140
+ ] })
141
+ ] }) });
142
+ }
143
+ // Annotate the CommonJS export names for ESM import in node:
144
+ 0 && (module.exports = {
145
+ ListingsGrid
146
+ });
147
+ //# sourceMappingURL=listings-grid.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/listings-grid.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { normalizeAddress, type ApiOrder, type SortOrder } from \"@medialane/sdk\";\nimport Link from \"./link.js\";\nimport { Button } from \"./button.js\";\nimport { ListingCard, ListingCardSkeleton } from \"./listing-card.js\";\nimport { ListingCardMenu } from \"./listing-card-menu.js\";\nimport { LoadMoreSentinel } from \"./load-more-sentinel.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport { useOrders } from \"../utils/use-orders.js\";\nimport { useImageUrl } from \"../utils/use-image-url.js\";\nimport { useUsdPrices, usdValueFor } from \"../utils/use-usd-prices.js\";\nimport { emptyMessages } from \"../utils/empty-messages.js\";\n\nconst PAGE_SIZE = 15;\nconst BACKEND_PAGE_SIZE = 50;\n\nexport interface ListingsGridProps {\n sort?: string;\n currency?: string;\n orderType?: string;\n minPrice?: string;\n maxPrice?: string;\n\n initialOrders?: ApiOrder[];\n onBuy: (order: ApiOrder) => void;\n}\n\nfunction MarketplaceListingCard({ order, onBuy }: { order: ApiOrder; onBuy?: (order: ApiOrder) => void }) {\n const resolveImage = useImageUrl();\n const usdPrices = useUsdPrices();\n return (\n <ListingCard\n order={order}\n onBuy={onBuy}\n overflowMenu={<ListingCardMenu order={order} />}\n imageUrl={resolveImage(order.token?.image)}\n usdValue={usdValueFor(order.price?.formatted, order.price?.currency, usdPrices)}\n />\n );\n}\n\nexport function ListingsGrid({ sort = \"recent\", currency, orderType = \"\", minPrice, maxPrice, initialOrders, onBuy }: ListingsGridProps) {\n const { walletAddress } = useMedialaneApp();\n const [backendPage, setBackendPage] = useState(1);\n const [visiblePages, setVisiblePages] = useState(1);\n const [allOrders, setAllOrders] = useState<ApiOrder[]>(initialOrders ?? []);\n\n const prevFilters = useRef({ sort, currency, orderType, minPrice, maxPrice });\n useEffect(() => {\n const f = prevFilters.current;\n if (f.sort !== sort || f.currency !== currency || f.orderType !== orderType || f.minPrice !== minPrice || f.maxPrice !== maxPrice) {\n prevFilters.current = { sort, currency, orderType, minPrice, maxPrice };\n setBackendPage(1);\n setVisiblePages(1);\n setAllOrders([]);\n }\n }, [sort, currency, orderType, minPrice, maxPrice]);\n\n const { orders, meta, isLoading } = useOrders({\n status: \"ACTIVE\",\n sort: sort as SortOrder,\n ...(currency ? { currency } : {}),\n ...(minPrice ? { minPrice } : {}),\n ...(maxPrice ? { maxPrice } : {}),\n page: backendPage,\n limit: BACKEND_PAGE_SIZE,\n });\n\n useEffect(() => {\n if (isLoading) return;\n if (backendPage === 1) {\n setAllOrders(orders);\n } else {\n setAllOrders((prev) => {\n const existing = new Set(prev.map((o) => o.orderHash));\n const newItems = orders.filter((o) => !existing.has(o.orderHash));\n return newItems.length > 0 ? [...prev, ...newItems] : prev;\n });\n }\n }, [orders, isLoading, backendPage]);\n\n const filteredOrders = orderType === \"offers\"\n ? allOrders.filter((o) => o.offer.itemType === \"ERC20\")\n : allOrders.filter((o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\");\n\n const visibleLimit = visiblePages * PAGE_SIZE;\n const displayedOrders = filteredOrders.slice(0, visibleLimit);\n\n const isInitialLoading = isLoading && allOrders.length === 0;\n const isLoadingMore = isLoading && allOrders.length > 0;\n const backendTotal = meta?.total ?? 0;\n const hasBackendMore = backendTotal > 0\n ? allOrders.length < backendTotal\n : orders.length === BACKEND_PAGE_SIZE;\n const hasBufferedOrders = filteredOrders.length > displayedOrders.length;\n const hasMore = hasBufferedOrders || hasBackendMore || isLoadingMore;\n\n useEffect(() => {\n if (isLoading || !hasBackendMore || filteredOrders.length >= visibleLimit) return;\n setBackendPage((p) => p + 1);\n }, [filteredOrders.length, hasBackendMore, isLoading, visibleLimit]);\n\n const isOwner = (order: ApiOrder) =>\n !!walletAddress && !!order.offerer && normalizeAddress(\"STARKNET\", order.offerer) === normalizeAddress(\"STARKNET\", walletAddress);\n\n const handleLoadMore = () => {\n setVisiblePages((p) => p + 1);\n };\n\n if (isInitialLoading || (filteredOrders.length === 0 && hasBackendMore)) {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4\">\n {Array.from({ length: PAGE_SIZE }).map((_, i) => (\n <ListingCardSkeleton key={i} />\n ))}\n </div>\n );\n }\n\n if (filteredOrders.length === 0 && !isLoading && !hasBackendMore) {\n const empty = orderType === \"offers\" ? emptyMessages.offers : emptyMessages.listings;\n return (\n <div className=\"flex flex-col items-center justify-center py-24 gap-4 text-center\">\n <p className=\"text-2xl font-bold\">{empty.title}</p>\n <p className=\"text-muted-foreground max-w-sm\">{empty.description}</p>\n {orderType !== \"offers\" && (\n <Button variant=\"outline\" asChild>\n <Link href=\"/create\">Create &amp; List</Link>\n </Button>\n )}\n </div>\n );\n }\n\n return (\n <>\n <div className=\"space-y-6\">\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4\">\n {displayedOrders.map((order) => (\n <MarketplaceListingCard key={order.orderHash} order={order} onBuy={isOwner(order) ? undefined : onBuy} />\n ))}\n {isLoadingMore &&\n Array.from({ length: PAGE_SIZE }).map((_, i) => (\n <ListingCardSkeleton key={`loading-${i}`} />\n ))}\n </div>\n\n <LoadMoreSentinel hasMore={hasMore} isLoading={isLoadingMore} onLoadMore={handleLoadMore} />\n\n {!hasMore && filteredOrders.length > PAGE_SIZE && (\n <p className=\"text-center text-xs text-muted-foreground\">\n All {filteredOrders.length} {orderType === \"offers\" ? \"offers\" : \"listings\"} shown\n </p>\n )}\n </div>\n </>\n );\n}\n"],"mappings":"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","names":["Link"]}
@@ -0,0 +1,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ApiOrder } from '@medialane/sdk';
3
+
4
+ interface ListingsGridProps {
5
+ sort?: string;
6
+ currency?: string;
7
+ orderType?: string;
8
+ minPrice?: string;
9
+ maxPrice?: string;
10
+ initialOrders?: ApiOrder[];
11
+ onBuy: (order: ApiOrder) => void;
12
+ }
13
+ declare function ListingsGrid({ sort, currency, orderType, minPrice, maxPrice, initialOrders, onBuy }: ListingsGridProps): react_jsx_runtime.JSX.Element;
14
+
15
+ export { ListingsGrid, type ListingsGridProps };
@@ -0,0 +1,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ApiOrder } from '@medialane/sdk';
3
+
4
+ interface ListingsGridProps {
5
+ sort?: string;
6
+ currency?: string;
7
+ orderType?: string;
8
+ minPrice?: string;
9
+ maxPrice?: string;
10
+ initialOrders?: ApiOrder[];
11
+ onBuy: (order: ApiOrder) => void;
12
+ }
13
+ declare function ListingsGrid({ sort, currency, orderType, minPrice, maxPrice, initialOrders, onBuy }: ListingsGridProps): react_jsx_runtime.JSX.Element;
14
+
15
+ export { ListingsGrid, type ListingsGridProps };
@@ -0,0 +1,113 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState, useEffect, useRef } from "react";
4
+ import { normalizeAddress } from "@medialane/sdk";
5
+ import Link from "./link.js";
6
+ import { Button } from "./button.js";
7
+ import { ListingCard, ListingCardSkeleton } from "./listing-card.js";
8
+ import { ListingCardMenu } from "./listing-card-menu.js";
9
+ import { LoadMoreSentinel } from "./load-more-sentinel.js";
10
+ import { useMedialaneApp } from "./medialane-app.js";
11
+ import { useOrders } from "../utils/use-orders.js";
12
+ import { useImageUrl } from "../utils/use-image-url.js";
13
+ import { useUsdPrices, usdValueFor } from "../utils/use-usd-prices.js";
14
+ import { emptyMessages } from "../utils/empty-messages.js";
15
+ const PAGE_SIZE = 15;
16
+ const BACKEND_PAGE_SIZE = 50;
17
+ function MarketplaceListingCard({ order, onBuy }) {
18
+ const resolveImage = useImageUrl();
19
+ const usdPrices = useUsdPrices();
20
+ return /* @__PURE__ */ jsx(
21
+ ListingCard,
22
+ {
23
+ order,
24
+ onBuy,
25
+ overflowMenu: /* @__PURE__ */ jsx(ListingCardMenu, { order }),
26
+ imageUrl: resolveImage(order.token?.image),
27
+ usdValue: usdValueFor(order.price?.formatted, order.price?.currency, usdPrices)
28
+ }
29
+ );
30
+ }
31
+ function ListingsGrid({ sort = "recent", currency, orderType = "", minPrice, maxPrice, initialOrders, onBuy }) {
32
+ const { walletAddress } = useMedialaneApp();
33
+ const [backendPage, setBackendPage] = useState(1);
34
+ const [visiblePages, setVisiblePages] = useState(1);
35
+ const [allOrders, setAllOrders] = useState(initialOrders ?? []);
36
+ const prevFilters = useRef({ sort, currency, orderType, minPrice, maxPrice });
37
+ useEffect(() => {
38
+ const f = prevFilters.current;
39
+ if (f.sort !== sort || f.currency !== currency || f.orderType !== orderType || f.minPrice !== minPrice || f.maxPrice !== maxPrice) {
40
+ prevFilters.current = { sort, currency, orderType, minPrice, maxPrice };
41
+ setBackendPage(1);
42
+ setVisiblePages(1);
43
+ setAllOrders([]);
44
+ }
45
+ }, [sort, currency, orderType, minPrice, maxPrice]);
46
+ const { orders, meta, isLoading } = useOrders({
47
+ status: "ACTIVE",
48
+ sort,
49
+ ...currency ? { currency } : {},
50
+ ...minPrice ? { minPrice } : {},
51
+ ...maxPrice ? { maxPrice } : {},
52
+ page: backendPage,
53
+ limit: BACKEND_PAGE_SIZE
54
+ });
55
+ useEffect(() => {
56
+ if (isLoading) return;
57
+ if (backendPage === 1) {
58
+ setAllOrders(orders);
59
+ } else {
60
+ setAllOrders((prev) => {
61
+ const existing = new Set(prev.map((o) => o.orderHash));
62
+ const newItems = orders.filter((o) => !existing.has(o.orderHash));
63
+ return newItems.length > 0 ? [...prev, ...newItems] : prev;
64
+ });
65
+ }
66
+ }, [orders, isLoading, backendPage]);
67
+ const filteredOrders = orderType === "offers" ? allOrders.filter((o) => o.offer.itemType === "ERC20") : allOrders.filter((o) => o.offer.itemType === "ERC721" || o.offer.itemType === "ERC1155");
68
+ const visibleLimit = visiblePages * PAGE_SIZE;
69
+ const displayedOrders = filteredOrders.slice(0, visibleLimit);
70
+ const isInitialLoading = isLoading && allOrders.length === 0;
71
+ const isLoadingMore = isLoading && allOrders.length > 0;
72
+ const backendTotal = meta?.total ?? 0;
73
+ const hasBackendMore = backendTotal > 0 ? allOrders.length < backendTotal : orders.length === BACKEND_PAGE_SIZE;
74
+ const hasBufferedOrders = filteredOrders.length > displayedOrders.length;
75
+ const hasMore = hasBufferedOrders || hasBackendMore || isLoadingMore;
76
+ useEffect(() => {
77
+ if (isLoading || !hasBackendMore || filteredOrders.length >= visibleLimit) return;
78
+ setBackendPage((p) => p + 1);
79
+ }, [filteredOrders.length, hasBackendMore, isLoading, visibleLimit]);
80
+ const isOwner = (order) => !!walletAddress && !!order.offerer && normalizeAddress("STARKNET", order.offerer) === normalizeAddress("STARKNET", walletAddress);
81
+ const handleLoadMore = () => {
82
+ setVisiblePages((p) => p + 1);
83
+ };
84
+ if (isInitialLoading || filteredOrders.length === 0 && hasBackendMore) {
85
+ return /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4", children: Array.from({ length: PAGE_SIZE }).map((_, i) => /* @__PURE__ */ jsx(ListingCardSkeleton, {}, i)) });
86
+ }
87
+ if (filteredOrders.length === 0 && !isLoading && !hasBackendMore) {
88
+ const empty = orderType === "offers" ? emptyMessages.offers : emptyMessages.listings;
89
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center py-24 gap-4 text-center", children: [
90
+ /* @__PURE__ */ jsx("p", { className: "text-2xl font-bold", children: empty.title }),
91
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground max-w-sm", children: empty.description }),
92
+ orderType !== "offers" && /* @__PURE__ */ jsx(Button, { variant: "outline", asChild: true, children: /* @__PURE__ */ jsx(Link, { href: "/create", children: "Create & List" }) })
93
+ ] });
94
+ }
95
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
96
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4", children: [
97
+ displayedOrders.map((order) => /* @__PURE__ */ jsx(MarketplaceListingCard, { order, onBuy: isOwner(order) ? void 0 : onBuy }, order.orderHash)),
98
+ isLoadingMore && Array.from({ length: PAGE_SIZE }).map((_, i) => /* @__PURE__ */ jsx(ListingCardSkeleton, {}, `loading-${i}`))
99
+ ] }),
100
+ /* @__PURE__ */ jsx(LoadMoreSentinel, { hasMore, isLoading: isLoadingMore, onLoadMore: handleLoadMore }),
101
+ !hasMore && filteredOrders.length > PAGE_SIZE && /* @__PURE__ */ jsxs("p", { className: "text-center text-xs text-muted-foreground", children: [
102
+ "All ",
103
+ filteredOrders.length,
104
+ " ",
105
+ orderType === "offers" ? "offers" : "listings",
106
+ " shown"
107
+ ] })
108
+ ] }) });
109
+ }
110
+ export {
111
+ ListingsGrid
112
+ };
113
+ //# sourceMappingURL=listings-grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/listings-grid.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { normalizeAddress, type ApiOrder, type SortOrder } from \"@medialane/sdk\";\nimport Link from \"./link.js\";\nimport { Button } from \"./button.js\";\nimport { ListingCard, ListingCardSkeleton } from \"./listing-card.js\";\nimport { ListingCardMenu } from \"./listing-card-menu.js\";\nimport { LoadMoreSentinel } from \"./load-more-sentinel.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport { useOrders } from \"../utils/use-orders.js\";\nimport { useImageUrl } from \"../utils/use-image-url.js\";\nimport { useUsdPrices, usdValueFor } from \"../utils/use-usd-prices.js\";\nimport { emptyMessages } from \"../utils/empty-messages.js\";\n\nconst PAGE_SIZE = 15;\nconst BACKEND_PAGE_SIZE = 50;\n\nexport interface ListingsGridProps {\n sort?: string;\n currency?: string;\n orderType?: string;\n minPrice?: string;\n maxPrice?: string;\n\n initialOrders?: ApiOrder[];\n onBuy: (order: ApiOrder) => void;\n}\n\nfunction MarketplaceListingCard({ order, onBuy }: { order: ApiOrder; onBuy?: (order: ApiOrder) => void }) {\n const resolveImage = useImageUrl();\n const usdPrices = useUsdPrices();\n return (\n <ListingCard\n order={order}\n onBuy={onBuy}\n overflowMenu={<ListingCardMenu order={order} />}\n imageUrl={resolveImage(order.token?.image)}\n usdValue={usdValueFor(order.price?.formatted, order.price?.currency, usdPrices)}\n />\n );\n}\n\nexport function ListingsGrid({ sort = \"recent\", currency, orderType = \"\", minPrice, maxPrice, initialOrders, onBuy }: ListingsGridProps) {\n const { walletAddress } = useMedialaneApp();\n const [backendPage, setBackendPage] = useState(1);\n const [visiblePages, setVisiblePages] = useState(1);\n const [allOrders, setAllOrders] = useState<ApiOrder[]>(initialOrders ?? []);\n\n const prevFilters = useRef({ sort, currency, orderType, minPrice, maxPrice });\n useEffect(() => {\n const f = prevFilters.current;\n if (f.sort !== sort || f.currency !== currency || f.orderType !== orderType || f.minPrice !== minPrice || f.maxPrice !== maxPrice) {\n prevFilters.current = { sort, currency, orderType, minPrice, maxPrice };\n setBackendPage(1);\n setVisiblePages(1);\n setAllOrders([]);\n }\n }, [sort, currency, orderType, minPrice, maxPrice]);\n\n const { orders, meta, isLoading } = useOrders({\n status: \"ACTIVE\",\n sort: sort as SortOrder,\n ...(currency ? { currency } : {}),\n ...(minPrice ? { minPrice } : {}),\n ...(maxPrice ? { maxPrice } : {}),\n page: backendPage,\n limit: BACKEND_PAGE_SIZE,\n });\n\n useEffect(() => {\n if (isLoading) return;\n if (backendPage === 1) {\n setAllOrders(orders);\n } else {\n setAllOrders((prev) => {\n const existing = new Set(prev.map((o) => o.orderHash));\n const newItems = orders.filter((o) => !existing.has(o.orderHash));\n return newItems.length > 0 ? [...prev, ...newItems] : prev;\n });\n }\n }, [orders, isLoading, backendPage]);\n\n const filteredOrders = orderType === \"offers\"\n ? allOrders.filter((o) => o.offer.itemType === \"ERC20\")\n : allOrders.filter((o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\");\n\n const visibleLimit = visiblePages * PAGE_SIZE;\n const displayedOrders = filteredOrders.slice(0, visibleLimit);\n\n const isInitialLoading = isLoading && allOrders.length === 0;\n const isLoadingMore = isLoading && allOrders.length > 0;\n const backendTotal = meta?.total ?? 0;\n const hasBackendMore = backendTotal > 0\n ? allOrders.length < backendTotal\n : orders.length === BACKEND_PAGE_SIZE;\n const hasBufferedOrders = filteredOrders.length > displayedOrders.length;\n const hasMore = hasBufferedOrders || hasBackendMore || isLoadingMore;\n\n useEffect(() => {\n if (isLoading || !hasBackendMore || filteredOrders.length >= visibleLimit) return;\n setBackendPage((p) => p + 1);\n }, [filteredOrders.length, hasBackendMore, isLoading, visibleLimit]);\n\n const isOwner = (order: ApiOrder) =>\n !!walletAddress && !!order.offerer && normalizeAddress(\"STARKNET\", order.offerer) === normalizeAddress(\"STARKNET\", walletAddress);\n\n const handleLoadMore = () => {\n setVisiblePages((p) => p + 1);\n };\n\n if (isInitialLoading || (filteredOrders.length === 0 && hasBackendMore)) {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4\">\n {Array.from({ length: PAGE_SIZE }).map((_, i) => (\n <ListingCardSkeleton key={i} />\n ))}\n </div>\n );\n }\n\n if (filteredOrders.length === 0 && !isLoading && !hasBackendMore) {\n const empty = orderType === \"offers\" ? emptyMessages.offers : emptyMessages.listings;\n return (\n <div className=\"flex flex-col items-center justify-center py-24 gap-4 text-center\">\n <p className=\"text-2xl font-bold\">{empty.title}</p>\n <p className=\"text-muted-foreground max-w-sm\">{empty.description}</p>\n {orderType !== \"offers\" && (\n <Button variant=\"outline\" asChild>\n <Link href=\"/create\">Create &amp; List</Link>\n </Button>\n )}\n </div>\n );\n }\n\n return (\n <>\n <div className=\"space-y-6\">\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4\">\n {displayedOrders.map((order) => (\n <MarketplaceListingCard key={order.orderHash} order={order} onBuy={isOwner(order) ? undefined : onBuy} />\n ))}\n {isLoadingMore &&\n Array.from({ length: PAGE_SIZE }).map((_, i) => (\n <ListingCardSkeleton key={`loading-${i}`} />\n ))}\n </div>\n\n <LoadMoreSentinel hasMore={hasMore} isLoading={isLoadingMore} onLoadMore={handleLoadMore} />\n\n {!hasMore && filteredOrders.length > PAGE_SIZE && (\n <p className=\"text-center text-xs text-muted-foreground\">\n All {filteredOrders.length} {orderType === \"offers\" ? \"offers\" : \"listings\"} shown\n </p>\n )}\n </div>\n </>\n );\n}\n"],"mappings":"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","names":[]}
@@ -19,26 +19,10 @@ var __copyProps = (to, from, except, desc) => {
19
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
20
  var action_button_exports = {};
21
21
  __export(action_button_exports, {
22
- ACTION_FOREGROUNDS: () => ACTION_FOREGROUNDS,
23
- ACTION_GRADIENTS: () => ACTION_GRADIENTS,
24
22
  TrustNote: () => TrustNote
25
23
  });
26
24
  module.exports = __toCommonJS(action_button_exports);
27
25
  var import_jsx_runtime = require("react/jsx-runtime");
28
- const ACTION_GRADIENTS = {
29
- buy: ["#3b7bff", "#8a5cf6", "#3b7bff"],
30
- submit: ["#d6359a", "#5b4ce6", "#d6359a"],
31
- offer: ["#f6608f", "#fb8b46", "#f6608f"],
32
- remix: ["#8a5cf6", "#f6608f", "#8a5cf6"],
33
- license: ["#3b7bff", "#5b4ce6", "#3b7bff"]
34
- };
35
- const ACTION_FOREGROUNDS = {
36
- buy: "#3b7bff",
37
- submit: "#5b4ce6",
38
- offer: "#fb7a32",
39
- remix: "#8a3ff0",
40
- license: "#3b7bff"
41
- };
42
26
  function TrustNote({ children, center }) {
43
27
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: `flex items-center gap-1.5 text-2xs leading-relaxed text-muted-foreground ${center ? "justify-center" : ""}`, children: [
44
28
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 2l7 4v6c0 5-3.5 8-7 10-3.5-2-7-5-7-10V6z" }) }),
@@ -47,8 +31,6 @@ function TrustNote({ children, center }) {
47
31
  }
48
32
  // Annotate the CommonJS export names for ESM import in node:
49
33
  0 && (module.exports = {
50
- ACTION_FOREGROUNDS,
51
- ACTION_GRADIENTS,
52
34
  TrustNote
53
35
  });
54
36
  //# sourceMappingURL=action-button.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/media-wallet/action-button.tsx"],"sourcesContent":["\"use client\";\n\nexport const ACTION_GRADIENTS: Record<string, [string, string, string]> = {\n buy: [\"#3b7bff\", \"#8a5cf6\", \"#3b7bff\"],\n submit: [\"#d6359a\", \"#5b4ce6\", \"#d6359a\"],\n offer: [\"#f6608f\", \"#fb8b46\", \"#f6608f\"],\n remix: [\"#8a5cf6\", \"#f6608f\", \"#8a5cf6\"],\n license: [\"#3b7bff\", \"#5b4ce6\", \"#3b7bff\"],\n};\nexport const ACTION_FOREGROUNDS: Record<string, string> = {\n buy: \"#3b7bff\",\n submit: \"#5b4ce6\",\n offer: \"#fb7a32\",\n remix: \"#8a3ff0\",\n license: \"#3b7bff\",\n};\n\nexport function TrustNote({ children, center }: { children: React.ReactNode; center?: boolean }) {\n return (\n <div className={`flex items-center gap-1.5 text-2xs leading-relaxed text-muted-foreground ${center ? \"justify-center\" : \"\"}`}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" className=\"flex-shrink-0\">\n <path d=\"M12 2l7 4v6c0 5-3.5 8-7 10-3.5-2-7-5-7-10V6z\" />\n </svg>\n <span>{children}</span>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBI;AAjBG,MAAM,mBAA6D;AAAA,EACxE,KAAK,CAAC,WAAW,WAAW,SAAS;AAAA,EACrC,QAAQ,CAAC,WAAW,WAAW,SAAS;AAAA,EACxC,OAAO,CAAC,WAAW,WAAW,SAAS;AAAA,EACvC,OAAO,CAAC,WAAW,WAAW,SAAS;AAAA,EACvC,SAAS,CAAC,WAAW,WAAW,SAAS;AAC3C;AACO,MAAM,qBAA6C;AAAA,EACxD,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AACX;AAEO,SAAS,UAAU,EAAE,UAAU,OAAO,GAAoD;AAC/F,SACE,6CAAC,SAAI,WAAW,4EAA4E,SAAS,mBAAmB,EAAE,IACxH;AAAA,gDAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,WAAU,iBAC1G,sDAAC,UAAK,GAAE,gDAA+C,GACzD;AAAA,IACA,4CAAC,UAAM,UAAS;AAAA,KAClB;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/media-wallet/action-button.tsx"],"sourcesContent":["\"use client\";\n\nexport function TrustNote({ children, center }: { children: React.ReactNode; center?: boolean }) {\n return (\n <div className={`flex items-center gap-1.5 text-2xs leading-relaxed text-muted-foreground ${center ? \"justify-center\" : \"\"}`}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" className=\"flex-shrink-0\">\n <path d=\"M12 2l7 4v6c0 5-3.5 8-7 10-3.5-2-7-5-7-10V6z\" />\n </svg>\n <span>{children}</span>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAII;AAFG,SAAS,UAAU,EAAE,UAAU,OAAO,GAAoD;AAC/F,SACE,6CAAC,SAAI,WAAW,4EAA4E,SAAS,mBAAmB,EAAE,IACxH;AAAA,gDAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,WAAU,iBAC1G,sDAAC,UAAK,GAAE,gDAA+C,GACzD;AAAA,IACA,4CAAC,UAAM,UAAS;AAAA,KAClB;AAEJ;","names":[]}
@@ -1,10 +1,8 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
 
3
- declare const ACTION_GRADIENTS: Record<string, [string, string, string]>;
4
- declare const ACTION_FOREGROUNDS: Record<string, string>;
5
3
  declare function TrustNote({ children, center }: {
6
4
  children: React.ReactNode;
7
5
  center?: boolean;
8
6
  }): react_jsx_runtime.JSX.Element;
9
7
 
10
- export { ACTION_FOREGROUNDS, ACTION_GRADIENTS, TrustNote };
8
+ export { TrustNote };
@@ -1,10 +1,8 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
 
3
- declare const ACTION_GRADIENTS: Record<string, [string, string, string]>;
4
- declare const ACTION_FOREGROUNDS: Record<string, string>;
5
3
  declare function TrustNote({ children, center }: {
6
4
  children: React.ReactNode;
7
5
  center?: boolean;
8
6
  }): react_jsx_runtime.JSX.Element;
9
7
 
10
- export { ACTION_FOREGROUNDS, ACTION_GRADIENTS, TrustNote };
8
+ export { TrustNote };
@@ -1,19 +1,5 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- const ACTION_GRADIENTS = {
4
- buy: ["#3b7bff", "#8a5cf6", "#3b7bff"],
5
- submit: ["#d6359a", "#5b4ce6", "#d6359a"],
6
- offer: ["#f6608f", "#fb8b46", "#f6608f"],
7
- remix: ["#8a5cf6", "#f6608f", "#8a5cf6"],
8
- license: ["#3b7bff", "#5b4ce6", "#3b7bff"]
9
- };
10
- const ACTION_FOREGROUNDS = {
11
- buy: "#3b7bff",
12
- submit: "#5b4ce6",
13
- offer: "#fb7a32",
14
- remix: "#8a3ff0",
15
- license: "#3b7bff"
16
- };
17
3
  function TrustNote({ children, center }) {
18
4
  return /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1.5 text-2xs leading-relaxed text-muted-foreground ${center ? "justify-center" : ""}`, children: [
19
5
  /* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", className: "flex-shrink-0", children: /* @__PURE__ */ jsx("path", { d: "M12 2l7 4v6c0 5-3.5 8-7 10-3.5-2-7-5-7-10V6z" }) }),
@@ -21,8 +7,6 @@ function TrustNote({ children, center }) {
21
7
  ] });
22
8
  }
23
9
  export {
24
- ACTION_FOREGROUNDS,
25
- ACTION_GRADIENTS,
26
10
  TrustNote
27
11
  };
28
12
  //# sourceMappingURL=action-button.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/media-wallet/action-button.tsx"],"sourcesContent":["\"use client\";\n\nexport const ACTION_GRADIENTS: Record<string, [string, string, string]> = {\n buy: [\"#3b7bff\", \"#8a5cf6\", \"#3b7bff\"],\n submit: [\"#d6359a\", \"#5b4ce6\", \"#d6359a\"],\n offer: [\"#f6608f\", \"#fb8b46\", \"#f6608f\"],\n remix: [\"#8a5cf6\", \"#f6608f\", \"#8a5cf6\"],\n license: [\"#3b7bff\", \"#5b4ce6\", \"#3b7bff\"],\n};\nexport const ACTION_FOREGROUNDS: Record<string, string> = {\n buy: \"#3b7bff\",\n submit: \"#5b4ce6\",\n offer: \"#fb7a32\",\n remix: \"#8a3ff0\",\n license: \"#3b7bff\",\n};\n\nexport function TrustNote({ children, center }: { children: React.ReactNode; center?: boolean }) {\n return (\n <div className={`flex items-center gap-1.5 text-2xs leading-relaxed text-muted-foreground ${center ? \"justify-center\" : \"\"}`}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" className=\"flex-shrink-0\">\n <path d=\"M12 2l7 4v6c0 5-3.5 8-7 10-3.5-2-7-5-7-10V6z\" />\n </svg>\n <span>{children}</span>\n </div>\n );\n}\n"],"mappings":";AAmBI,SAEI,KAFJ;AAjBG,MAAM,mBAA6D;AAAA,EACxE,KAAK,CAAC,WAAW,WAAW,SAAS;AAAA,EACrC,QAAQ,CAAC,WAAW,WAAW,SAAS;AAAA,EACxC,OAAO,CAAC,WAAW,WAAW,SAAS;AAAA,EACvC,OAAO,CAAC,WAAW,WAAW,SAAS;AAAA,EACvC,SAAS,CAAC,WAAW,WAAW,SAAS;AAC3C;AACO,MAAM,qBAA6C;AAAA,EACxD,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AACX;AAEO,SAAS,UAAU,EAAE,UAAU,OAAO,GAAoD;AAC/F,SACE,qBAAC,SAAI,WAAW,4EAA4E,SAAS,mBAAmB,EAAE,IACxH;AAAA,wBAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,WAAU,iBAC1G,8BAAC,UAAK,GAAE,gDAA+C,GACzD;AAAA,IACA,oBAAC,UAAM,UAAS;AAAA,KAClB;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/media-wallet/action-button.tsx"],"sourcesContent":["\"use client\";\n\nexport function TrustNote({ children, center }: { children: React.ReactNode; center?: boolean }) {\n return (\n <div className={`flex items-center gap-1.5 text-2xs leading-relaxed text-muted-foreground ${center ? \"justify-center\" : \"\"}`}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" className=\"flex-shrink-0\">\n <path d=\"M12 2l7 4v6c0 5-3.5 8-7 10-3.5-2-7-5-7-10V6z\" />\n </svg>\n <span>{children}</span>\n </div>\n );\n}\n"],"mappings":";AAII,SAEI,KAFJ;AAFG,SAAS,UAAU,EAAE,UAAU,OAAO,GAAoD;AAC/F,SACE,qBAAC,SAAI,WAAW,4EAA4E,SAAS,mBAAmB,EAAE,IACxH;AAAA,wBAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,WAAU,iBAC1G,8BAAC,UAAK,GAAE,gDAA+C,GACzD;AAAA,IACA,oBAAC,UAAM,UAAS;AAAA,KAClB;AAEJ;","names":[]}
@@ -26,8 +26,8 @@ var import_jsx_runtime = require("react/jsx-runtime");
26
26
  var import_react = require("react");
27
27
  var import_action_button = require("../action-button.js");
28
28
  var import_describe_error = require("../../utils/describe-error.js");
29
+ var import_brand = require("../../data/brand.js");
29
30
  var import_types = require("./types.js");
30
- const BRAND_GRADIENT = "linear-gradient(115deg,#3b7bff,#8a5cf6,#f6608f,#fb8b46,#3b7bff)";
31
31
  function ActivateCard({ onActivated }) {
32
32
  const { wallet } = (0, import_types.useMediaWalletApp)();
33
33
  const [busy, setBusy] = (0, import_react.useState)(false);
@@ -54,7 +54,7 @@ function ActivateCard({ onActivated }) {
54
54
  onClick: activate,
55
55
  disabled: busy,
56
56
  className: "w-full disabled:opacity-40 disabled:pointer-events-none",
57
- style: { "--ml-grad": BRAND_GRADIENT },
57
+ style: { "--ml-grad": import_brand.BRAND_GRADIENT },
58
58
  children: [
59
59
  busy && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "h-4 w-4 animate-spin rounded-full border-2 border-foreground/25 border-t-foreground" }),
60
60
  "Activate my wallet"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/media-wallet/activate-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { ActionButton } from \"../action-button.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { useMediaWalletApp } from \"./types.js\";\n\nconst BRAND_GRADIENT = \"linear-gradient(115deg,#3b7bff,#8a5cf6,#f6608f,#fb8b46,#3b7bff)\";\n\nexport function ActivateCard({ onActivated }: { onActivated: (txHash?: string) => void }) {\n const { wallet } = useMediaWalletApp();\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const activate = async () => {\n setError(null);\n setBusy(true);\n try {\n await wallet.completeDeployment(() => {});\n onActivated();\n } catch (e) {\n setError(describeError(e).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <div className=\"card-base p-5\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <ActionButton\n action=\"buy\"\n big\n onClick={activate}\n disabled={busy}\n className=\"w-full disabled:opacity-40 disabled:pointer-events-none\"\n style={{ \"--ml-grad\": BRAND_GRADIENT } as React.CSSProperties}\n >\n {busy && <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-foreground/25 border-t-foreground\" />}\n Activate my wallet\n </ActionButton>\n <p className=\"mx-auto max-w-[22rem] text-sm leading-relaxed text-muted-foreground\">\n Your account is stored securely and ready whenever you need it. Activating is free — no gas fees.\n </p>\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BQ;AA5BR,mBAAyB;AACzB,2BAA6B;AAC7B,4BAA8B;AAC9B,mBAAkC;AAElC,MAAM,iBAAiB;AAEhB,SAAS,aAAa,EAAE,YAAY,GAA+C;AACxF,QAAM,EAAE,OAAO,QAAI,gCAAkB;AACrC,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,IAAI;AAEtD,QAAM,WAAW,YAAY;AAC3B,aAAS,IAAI;AACb,YAAQ,IAAI;AACZ,QAAI;AACF,YAAM,OAAO,mBAAmB,MAAM;AAAA,MAAC,CAAC;AACxC,kBAAY;AAAA,IACd,SAAS,GAAG;AACV,mBAAS,qCAAc,CAAC,EAAE,OAAO;AAAA,IACnC,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,SACE,4CAAC,SAAI,WAAU,iBACb,uDAAC,SAAI,WAAU,gDACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAO;AAAA,QACP,KAAG;AAAA,QACH,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAU;AAAA,QACV,OAAO,EAAE,aAAa,eAAe;AAAA,QAEpC;AAAA,kBAAQ,4CAAC,UAAK,WAAU,uFAAsF;AAAA,UAAG;AAAA;AAAA;AAAA,IAEpH;AAAA,IACA,4CAAC,OAAE,WAAU,uEAAsE,oHAEnF;AAAA,IACC,SAAS,4CAAC,OAAE,WAAU,4BAA4B,iBAAM;AAAA,KAC3D,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/media-wallet/activate-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { ActionButton } from \"../action-button.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { BRAND_GRADIENT } from \"../../data/brand.js\";\nimport { useMediaWalletApp } from \"./types.js\";\n\nexport function ActivateCard({ onActivated }: { onActivated: (txHash?: string) => void }) {\n const { wallet } = useMediaWalletApp();\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const activate = async () => {\n setError(null);\n setBusy(true);\n try {\n await wallet.completeDeployment(() => {});\n onActivated();\n } catch (e) {\n setError(describeError(e).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <div className=\"card-base p-5\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <ActionButton\n action=\"buy\"\n big\n onClick={activate}\n disabled={busy}\n className=\"w-full disabled:opacity-40 disabled:pointer-events-none\"\n style={{ \"--ml-grad\": BRAND_GRADIENT } as React.CSSProperties}\n >\n {busy && <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-foreground/25 border-t-foreground\" />}\n Activate my wallet\n </ActionButton>\n <p className=\"mx-auto max-w-[22rem] text-sm leading-relaxed text-muted-foreground\">\n Your account is stored securely and ready whenever you need it. Activating is free — no gas fees.\n </p>\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BQ;AA3BR,mBAAyB;AACzB,2BAA6B;AAC7B,4BAA8B;AAC9B,mBAA+B;AAC/B,mBAAkC;AAE3B,SAAS,aAAa,EAAE,YAAY,GAA+C;AACxF,QAAM,EAAE,OAAO,QAAI,gCAAkB;AACrC,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,IAAI;AAEtD,QAAM,WAAW,YAAY;AAC3B,aAAS,IAAI;AACb,YAAQ,IAAI;AACZ,QAAI;AACF,YAAM,OAAO,mBAAmB,MAAM;AAAA,MAAC,CAAC;AACxC,kBAAY;AAAA,IACd,SAAS,GAAG;AACV,mBAAS,qCAAc,CAAC,EAAE,OAAO;AAAA,IACnC,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,SACE,4CAAC,SAAI,WAAU,iBACb,uDAAC,SAAI,WAAU,gDACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAO;AAAA,QACP,KAAG;AAAA,QACH,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAU;AAAA,QACV,OAAO,EAAE,aAAa,4BAAe;AAAA,QAEpC;AAAA,kBAAQ,4CAAC,UAAK,WAAU,uFAAsF;AAAA,UAAG;AAAA;AAAA;AAAA,IAEpH;AAAA,IACA,4CAAC,OAAE,WAAU,uEAAsE,oHAEnF;AAAA,IACC,SAAS,4CAAC,OAAE,WAAU,4BAA4B,iBAAM;AAAA,KAC3D,GACF;AAEJ;","names":[]}
@@ -3,8 +3,8 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useState } from "react";
4
4
  import { ActionButton } from "../action-button.js";
5
5
  import { describeError } from "../../utils/describe-error.js";
6
+ import { BRAND_GRADIENT } from "../../data/brand.js";
6
7
  import { useMediaWalletApp } from "./types.js";
7
- const BRAND_GRADIENT = "linear-gradient(115deg,#3b7bff,#8a5cf6,#f6608f,#fb8b46,#3b7bff)";
8
8
  function ActivateCard({ onActivated }) {
9
9
  const { wallet } = useMediaWalletApp();
10
10
  const [busy, setBusy] = useState(false);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/media-wallet/activate-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { ActionButton } from \"../action-button.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { useMediaWalletApp } from \"./types.js\";\n\nconst BRAND_GRADIENT = \"linear-gradient(115deg,#3b7bff,#8a5cf6,#f6608f,#fb8b46,#3b7bff)\";\n\nexport function ActivateCard({ onActivated }: { onActivated: (txHash?: string) => void }) {\n const { wallet } = useMediaWalletApp();\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const activate = async () => {\n setError(null);\n setBusy(true);\n try {\n await wallet.completeDeployment(() => {});\n onActivated();\n } catch (e) {\n setError(describeError(e).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <div className=\"card-base p-5\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <ActionButton\n action=\"buy\"\n big\n onClick={activate}\n disabled={busy}\n className=\"w-full disabled:opacity-40 disabled:pointer-events-none\"\n style={{ \"--ml-grad\": BRAND_GRADIENT } as React.CSSProperties}\n >\n {busy && <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-foreground/25 border-t-foreground\" />}\n Activate my wallet\n </ActionButton>\n <p className=\"mx-auto max-w-[22rem] text-sm leading-relaxed text-muted-foreground\">\n Your account is stored securely and ready whenever you need it. Activating is free — no gas fees.\n </p>\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n </div>\n </div>\n );\n}\n"],"mappings":";AA8BQ,SAQW,KARX;AA5BR,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,yBAAyB;AAElC,MAAM,iBAAiB;AAEhB,SAAS,aAAa,EAAE,YAAY,GAA+C;AACxF,QAAM,EAAE,OAAO,IAAI,kBAAkB;AACrC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAEtD,QAAM,WAAW,YAAY;AAC3B,aAAS,IAAI;AACb,YAAQ,IAAI;AACZ,QAAI;AACF,YAAM,OAAO,mBAAmB,MAAM;AAAA,MAAC,CAAC;AACxC,kBAAY;AAAA,IACd,SAAS,GAAG;AACV,eAAS,cAAc,CAAC,EAAE,OAAO;AAAA,IACnC,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,SACE,oBAAC,SAAI,WAAU,iBACb,+BAAC,SAAI,WAAU,gDACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAO;AAAA,QACP,KAAG;AAAA,QACH,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAU;AAAA,QACV,OAAO,EAAE,aAAa,eAAe;AAAA,QAEpC;AAAA,kBAAQ,oBAAC,UAAK,WAAU,uFAAsF;AAAA,UAAG;AAAA;AAAA;AAAA,IAEpH;AAAA,IACA,oBAAC,OAAE,WAAU,uEAAsE,oHAEnF;AAAA,IACC,SAAS,oBAAC,OAAE,WAAU,4BAA4B,iBAAM;AAAA,KAC3D,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/media-wallet/activate-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { ActionButton } from \"../action-button.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { BRAND_GRADIENT } from \"../../data/brand.js\";\nimport { useMediaWalletApp } from \"./types.js\";\n\nexport function ActivateCard({ onActivated }: { onActivated: (txHash?: string) => void }) {\n const { wallet } = useMediaWalletApp();\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const activate = async () => {\n setError(null);\n setBusy(true);\n try {\n await wallet.completeDeployment(() => {});\n onActivated();\n } catch (e) {\n setError(describeError(e).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <div className=\"card-base p-5\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <ActionButton\n action=\"buy\"\n big\n onClick={activate}\n disabled={busy}\n className=\"w-full disabled:opacity-40 disabled:pointer-events-none\"\n style={{ \"--ml-grad\": BRAND_GRADIENT } as React.CSSProperties}\n >\n {busy && <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-foreground/25 border-t-foreground\" />}\n Activate my wallet\n </ActionButton>\n <p className=\"mx-auto max-w-[22rem] text-sm leading-relaxed text-muted-foreground\">\n Your account is stored securely and ready whenever you need it. Activating is free — no gas fees.\n </p>\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n </div>\n </div>\n );\n}\n"],"mappings":";AA6BQ,SAQW,KARX;AA3BR,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAC/B,SAAS,yBAAyB;AAE3B,SAAS,aAAa,EAAE,YAAY,GAA+C;AACxF,QAAM,EAAE,OAAO,IAAI,kBAAkB;AACrC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAEtD,QAAM,WAAW,YAAY;AAC3B,aAAS,IAAI;AACb,YAAQ,IAAI;AACZ,QAAI;AACF,YAAM,OAAO,mBAAmB,MAAM;AAAA,MAAC,CAAC;AACxC,kBAAY;AAAA,IACd,SAAS,GAAG;AACV,eAAS,cAAc,CAAC,EAAE,OAAO;AAAA,IACnC,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,SACE,oBAAC,SAAI,WAAU,iBACb,+BAAC,SAAI,WAAU,gDACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAO;AAAA,QACP,KAAG;AAAA,QACH,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAU;AAAA,QACV,OAAO,EAAE,aAAa,eAAe;AAAA,QAEpC;AAAA,kBAAQ,oBAAC,UAAK,WAAU,uFAAsF;AAAA,UAAG;AAAA;AAAA;AAAA,IAEpH;AAAA,IACA,oBAAC,OAAE,WAAU,uEAAsE,oHAEnF;AAAA,IACC,SAAS,oBAAC,OAAE,WAAU,4BAA4B,iBAAM;AAAA,KAC3D,GACF;AAEJ;","names":[]}
@@ -45,13 +45,11 @@ var import_wallet_activity_icon = require("./wallet-activity-icon.js");
45
45
  var import_action_modal = require("./action-modal.js");
46
46
  var import_types = require("./types.js");
47
47
  var import_medialane_app = require("../medialane-app.js");
48
+ var import_brand = require("../../data/brand.js");
48
49
  var import_empty_messages = require("../../utils/empty-messages.js");
49
- const GRADS = [
50
- "linear-gradient(135deg,#3b7bff,#8a5cf6)",
51
- "linear-gradient(135deg,#8a5cf6,#f6608f)",
52
- "linear-gradient(135deg,#f6608f,#fb8b46)",
53
- "linear-gradient(135deg,#5b4ce6,#3b7bff)"
54
- ];
50
+ const GRADS = [["blue", "purple"], ["purple", "rose"], ["rose", "orange"], ["purple", "blue"]].map(
51
+ ([from, to]) => `linear-gradient(135deg, ${import_brand.BRAND_COLOR[from]}, ${import_brand.BRAND_COLOR[to]})`
52
+ );
55
53
  const gradFor = (seed) => {
56
54
  let h = 0;
57
55
  for (let i = 0; i < seed.length; i++) h = h * 31 + seed.charCodeAt(i) | 0;