@burdenoff/website-sdk 2026.710.1 → 2026.716.2
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/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +690 -84
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +690 -84
- package/dist/index.mjs.map +1 -1
- package/dist/product-card-Dm1zkFkm.d.mts +157 -0
- package/dist/product-card-Dm1zkFkm.d.ts +157 -0
- package/dist/store/index.d.mts +27 -154
- package/dist/store/index.d.ts +27 -154
- package/dist/store/index.js +834 -227
- package/dist/store/index.js.map +1 -1
- package/dist/store/index.mjs +835 -229
- package/dist/store/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/store/index.js
CHANGED
|
@@ -7,6 +7,196 @@ var reactHelmetAsync = require('react-helmet-async');
|
|
|
7
7
|
var __defProp = Object.defineProperty;
|
|
8
8
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
9
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
10
|
+
function formatPrice(price, currency, pricingModel) {
|
|
11
|
+
if (pricingModel === "FREE" || !price || price === 0) return "Free";
|
|
12
|
+
const curr = currency || "USD";
|
|
13
|
+
try {
|
|
14
|
+
return new Intl.NumberFormat("en-US", {
|
|
15
|
+
style: "currency",
|
|
16
|
+
currency: curr
|
|
17
|
+
}).format(price);
|
|
18
|
+
} catch {
|
|
19
|
+
return `${curr} ${price.toFixed(2)}`;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function formatDownloads(n) {
|
|
23
|
+
if (!n) return "0";
|
|
24
|
+
if (n >= 1e6) return `${(n / 1e6).toFixed(1)}M`;
|
|
25
|
+
if (n >= 1e3) return `${(n / 1e3).toFixed(1)}K`;
|
|
26
|
+
return n.toString();
|
|
27
|
+
}
|
|
28
|
+
function StarRating({ rating }) {
|
|
29
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex items-center gap-0.5", children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
30
|
+
"svg",
|
|
31
|
+
{
|
|
32
|
+
viewBox: "0 0 12 12",
|
|
33
|
+
className: `w-3 h-3 ${star <= Math.round(rating) ? "text-amber-400 fill-current" : "text-muted-foreground/30 fill-current"}`,
|
|
34
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 1l1.545 3.09L11 4.59l-2.5 2.41.59 3.41L6 8.79l-3.09 1.61L3.5 7 1 4.59l3.455-.5L6 1z" })
|
|
35
|
+
},
|
|
36
|
+
star
|
|
37
|
+
)) });
|
|
38
|
+
}
|
|
39
|
+
function TypeBadge({ type }) {
|
|
40
|
+
const labels = {
|
|
41
|
+
APP: "App",
|
|
42
|
+
NODE: "Node",
|
|
43
|
+
WORKFLOW: "Workflow",
|
|
44
|
+
TEMPLATE: "Template",
|
|
45
|
+
INTEGRATION: "Integration",
|
|
46
|
+
EXTENSION: "Extension",
|
|
47
|
+
THEME: "Theme"
|
|
48
|
+
};
|
|
49
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block text-xs px-2 py-0.5 rounded-full bg-primary/10 text-primary font-medium", children: labels[type] ?? type });
|
|
50
|
+
}
|
|
51
|
+
function ProductCard({ product, onClick, href }) {
|
|
52
|
+
const priceLabel = formatPrice(
|
|
53
|
+
product.price,
|
|
54
|
+
product.currency,
|
|
55
|
+
product.pricingModel
|
|
56
|
+
);
|
|
57
|
+
const inner = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group bg-card border border-border rounded-xl p-4 flex flex-col gap-3 transition-all duration-200 hover:shadow-md hover:border-primary/30 cursor-pointer h-full", children: [
|
|
58
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-2", children: [
|
|
59
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-12 h-12 rounded-lg bg-muted flex-shrink-0 overflow-hidden", children: product.icon ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
60
|
+
"img",
|
|
61
|
+
{
|
|
62
|
+
src: product.icon,
|
|
63
|
+
alt: "",
|
|
64
|
+
"aria-hidden": "true",
|
|
65
|
+
className: "w-full h-full object-cover"
|
|
66
|
+
}
|
|
67
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center bg-gradient-to-br from-primary/15 to-primary/5", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
68
|
+
"svg",
|
|
69
|
+
{
|
|
70
|
+
viewBox: "0 0 32 32",
|
|
71
|
+
className: "w-8 h-8",
|
|
72
|
+
fill: "none",
|
|
73
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
74
|
+
"aria-hidden": "true",
|
|
75
|
+
children: [
|
|
76
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
77
|
+
"polygon",
|
|
78
|
+
{
|
|
79
|
+
points: "16,4 28,10 16,16 4,10",
|
|
80
|
+
className: "fill-primary/30",
|
|
81
|
+
stroke: "currentColor",
|
|
82
|
+
strokeWidth: "0.6",
|
|
83
|
+
strokeOpacity: "0.35"
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
87
|
+
"polygon",
|
|
88
|
+
{
|
|
89
|
+
points: "4,10 16,16 16,28 4,22",
|
|
90
|
+
className: "fill-primary/15",
|
|
91
|
+
stroke: "currentColor",
|
|
92
|
+
strokeWidth: "0.6",
|
|
93
|
+
strokeOpacity: "0.35"
|
|
94
|
+
}
|
|
95
|
+
),
|
|
96
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
97
|
+
"polygon",
|
|
98
|
+
{
|
|
99
|
+
points: "28,10 16,16 16,28 28,22",
|
|
100
|
+
className: "fill-primary/20",
|
|
101
|
+
stroke: "currentColor",
|
|
102
|
+
strokeWidth: "0.6",
|
|
103
|
+
strokeOpacity: "0.35"
|
|
104
|
+
}
|
|
105
|
+
)
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
) }) }),
|
|
109
|
+
/* @__PURE__ */ jsxRuntime.jsx(TypeBadge, { type: product.type })
|
|
110
|
+
] }),
|
|
111
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
112
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-semibold text-foreground text-sm leading-snug line-clamp-1 group-hover:text-primary transition-colors", children: product.name }),
|
|
113
|
+
product.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground text-xs mt-1 line-clamp-2 leading-relaxed", children: product.description })
|
|
114
|
+
] }),
|
|
115
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
|
|
116
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5", children: product.rating != null && product.rating > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
117
|
+
/* @__PURE__ */ jsxRuntime.jsx(StarRating, { rating: product.rating }),
|
|
118
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: product.rating.toFixed(1) })
|
|
119
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "No reviews yet" }) }),
|
|
120
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
121
|
+
"span",
|
|
122
|
+
{
|
|
123
|
+
className: `text-xs font-semibold ${priceLabel === "Free" ? "text-emerald-500" : "text-foreground"}`,
|
|
124
|
+
children: priceLabel
|
|
125
|
+
}
|
|
126
|
+
)
|
|
127
|
+
] })
|
|
128
|
+
] });
|
|
129
|
+
if (href) {
|
|
130
|
+
return /* @__PURE__ */ jsxRuntime.jsx("a", { href, onClick, className: "block h-full no-underline", children: inner });
|
|
131
|
+
}
|
|
132
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
133
|
+
"button",
|
|
134
|
+
{
|
|
135
|
+
type: "button",
|
|
136
|
+
onClick,
|
|
137
|
+
className: "block w-full text-left h-full",
|
|
138
|
+
children: inner
|
|
139
|
+
}
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// src/store/queries.ts
|
|
144
|
+
var STORE_PRODUCT_FIELDS = `
|
|
145
|
+
fragment StoreProductFields on StoreProduct {
|
|
146
|
+
id name slug type subType nature status pricingModel
|
|
147
|
+
price currency description icon bannerUrl screenshots
|
|
148
|
+
category tags featured downloads viewCount rating reviewCount
|
|
149
|
+
publisherId authorName license compatibleProducts
|
|
150
|
+
}
|
|
151
|
+
`;
|
|
152
|
+
var HOME_GROUPED_PRODUCTS_QUERY = `
|
|
153
|
+
${STORE_PRODUCT_FIELDS}
|
|
154
|
+
query HomeGroupedProducts($compatibleWith: String) {
|
|
155
|
+
homeGroupedProducts(compatibleWith: $compatibleWith) {
|
|
156
|
+
featured { ...StoreProductFields }
|
|
157
|
+
mostDownloaded { ...StoreProductFields }
|
|
158
|
+
recentlyAdded { ...StoreProductFields }
|
|
159
|
+
freeItems { ...StoreProductFields }
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
`;
|
|
163
|
+
var BROWSE_STORE_QUERY = `
|
|
164
|
+
${STORE_PRODUCT_FIELDS}
|
|
165
|
+
query BrowseStore($input: BrowseStoreInput!) {
|
|
166
|
+
browseStore(input: $input) {
|
|
167
|
+
products { ...StoreProductFields }
|
|
168
|
+
totalCount
|
|
169
|
+
hasMore
|
|
170
|
+
nextCursor
|
|
171
|
+
facets {
|
|
172
|
+
types { value count }
|
|
173
|
+
categories { value count }
|
|
174
|
+
pricingModels { value count }
|
|
175
|
+
priceRange { min max }
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
`;
|
|
180
|
+
var STORE_PRODUCT_DETAILS_QUERY = `
|
|
181
|
+
${STORE_PRODUCT_FIELDS}
|
|
182
|
+
query StoreProductDetails($input: StoreProductDetailsInput!) {
|
|
183
|
+
storeProductDetails(input: $input) {
|
|
184
|
+
product { ...StoreProductFields longDescription videoUrls minPlatformVersion }
|
|
185
|
+
publisher { id name email websiteUrl logoUrl bio isVerified tier }
|
|
186
|
+
reviews { id rating title comment verifiedPurchase helpful createdAt }
|
|
187
|
+
reviewsCount
|
|
188
|
+
relatedProducts { ...StoreProductFields }
|
|
189
|
+
ratingDistribution { fiveStars fourStars threeStars twoStars oneStar }
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
`;
|
|
193
|
+
var CATEGORIES_QUERY = `
|
|
194
|
+
query Categories {
|
|
195
|
+
categories {
|
|
196
|
+
id name slug description icon parentId
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
`;
|
|
10
200
|
|
|
11
201
|
// src/client/security.ts
|
|
12
202
|
var LOOPBACK_HOSTS = /* @__PURE__ */ new Set(["localhost", "127.0.0.1", "::1"]);
|
|
@@ -204,155 +394,6 @@ function PageHead({
|
|
|
204
394
|
))
|
|
205
395
|
] });
|
|
206
396
|
}
|
|
207
|
-
function formatPrice(price, currency, pricingModel) {
|
|
208
|
-
if (pricingModel === "FREE" || !price || price === 0) return "Free";
|
|
209
|
-
const curr = currency || "USD";
|
|
210
|
-
try {
|
|
211
|
-
return new Intl.NumberFormat("en-US", {
|
|
212
|
-
style: "currency",
|
|
213
|
-
currency: curr
|
|
214
|
-
}).format(price);
|
|
215
|
-
} catch {
|
|
216
|
-
return `${curr} ${price.toFixed(2)}`;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
function formatDownloads(n) {
|
|
220
|
-
if (!n) return "0";
|
|
221
|
-
if (n >= 1e6) return `${(n / 1e6).toFixed(1)}M`;
|
|
222
|
-
if (n >= 1e3) return `${(n / 1e3).toFixed(1)}K`;
|
|
223
|
-
return n.toString();
|
|
224
|
-
}
|
|
225
|
-
function StarRating({ rating }) {
|
|
226
|
-
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex items-center gap-0.5", children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
227
|
-
"svg",
|
|
228
|
-
{
|
|
229
|
-
viewBox: "0 0 12 12",
|
|
230
|
-
className: `w-3 h-3 ${star <= Math.round(rating) ? "text-amber-400 fill-current" : "text-muted-foreground/30 fill-current"}`,
|
|
231
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 1l1.545 3.09L11 4.59l-2.5 2.41.59 3.41L6 8.79l-3.09 1.61L3.5 7 1 4.59l3.455-.5L6 1z" })
|
|
232
|
-
},
|
|
233
|
-
star
|
|
234
|
-
)) });
|
|
235
|
-
}
|
|
236
|
-
function TypeBadge({ type }) {
|
|
237
|
-
const labels = {
|
|
238
|
-
APP: "App",
|
|
239
|
-
NODE: "Node",
|
|
240
|
-
WORKFLOW: "Workflow",
|
|
241
|
-
TEMPLATE: "Template",
|
|
242
|
-
INTEGRATION: "Integration",
|
|
243
|
-
EXTENSION: "Extension",
|
|
244
|
-
THEME: "Theme"
|
|
245
|
-
};
|
|
246
|
-
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block text-xs px-2 py-0.5 rounded-full bg-primary/10 text-primary font-medium", children: labels[type] ?? type });
|
|
247
|
-
}
|
|
248
|
-
function ProductCard({ product, onClick, href }) {
|
|
249
|
-
const priceLabel = formatPrice(product.price, product.currency, product.pricingModel);
|
|
250
|
-
const inner = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group bg-card border border-border rounded-xl p-4 flex flex-col gap-3 transition-all duration-200 hover:shadow-md hover:border-primary/30 cursor-pointer h-full", children: [
|
|
251
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-2", children: [
|
|
252
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-12 h-12 rounded-lg bg-muted flex-shrink-0 overflow-hidden", children: product.icon ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
253
|
-
"img",
|
|
254
|
-
{
|
|
255
|
-
src: product.icon,
|
|
256
|
-
alt: "",
|
|
257
|
-
"aria-hidden": "true",
|
|
258
|
-
className: "w-full h-full object-cover"
|
|
259
|
-
}
|
|
260
|
-
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center bg-gradient-to-br from-primary/15 to-primary/5", children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 32 32", className: "w-8 h-8", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [
|
|
261
|
-
/* @__PURE__ */ jsxRuntime.jsx("polygon", { points: "16,4 28,10 16,16 4,10", className: "fill-primary/30", stroke: "currentColor", strokeWidth: "0.6", strokeOpacity: "0.35" }),
|
|
262
|
-
/* @__PURE__ */ jsxRuntime.jsx("polygon", { points: "4,10 16,16 16,28 4,22", className: "fill-primary/15", stroke: "currentColor", strokeWidth: "0.6", strokeOpacity: "0.35" }),
|
|
263
|
-
/* @__PURE__ */ jsxRuntime.jsx("polygon", { points: "28,10 16,16 16,28 28,22", className: "fill-primary/20", stroke: "currentColor", strokeWidth: "0.6", strokeOpacity: "0.35" })
|
|
264
|
-
] }) }) }),
|
|
265
|
-
/* @__PURE__ */ jsxRuntime.jsx(TypeBadge, { type: product.type })
|
|
266
|
-
] }),
|
|
267
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
268
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-semibold text-foreground text-sm leading-snug line-clamp-1 group-hover:text-primary transition-colors", children: product.name }),
|
|
269
|
-
product.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground text-xs mt-1 line-clamp-2 leading-relaxed", children: product.description })
|
|
270
|
-
] }),
|
|
271
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
|
|
272
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5", children: product.rating != null && product.rating > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
273
|
-
/* @__PURE__ */ jsxRuntime.jsx(StarRating, { rating: product.rating }),
|
|
274
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: product.rating.toFixed(1) })
|
|
275
|
-
] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "No reviews yet" }) }),
|
|
276
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
277
|
-
"span",
|
|
278
|
-
{
|
|
279
|
-
className: `text-xs font-semibold ${priceLabel === "Free" ? "text-emerald-500" : "text-foreground"}`,
|
|
280
|
-
children: priceLabel
|
|
281
|
-
}
|
|
282
|
-
)
|
|
283
|
-
] })
|
|
284
|
-
] });
|
|
285
|
-
if (href) {
|
|
286
|
-
return /* @__PURE__ */ jsxRuntime.jsx("a", { href, onClick, className: "block h-full no-underline", children: inner });
|
|
287
|
-
}
|
|
288
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
289
|
-
"button",
|
|
290
|
-
{
|
|
291
|
-
type: "button",
|
|
292
|
-
onClick,
|
|
293
|
-
className: "block w-full text-left h-full",
|
|
294
|
-
children: inner
|
|
295
|
-
}
|
|
296
|
-
);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
// src/store/queries.ts
|
|
300
|
-
var STORE_PRODUCT_FIELDS = `
|
|
301
|
-
fragment StoreProductFields on StoreProduct {
|
|
302
|
-
id name slug type subType nature status pricingModel
|
|
303
|
-
price currency description icon bannerUrl screenshots
|
|
304
|
-
category tags featured downloads viewCount rating reviewCount
|
|
305
|
-
publisherId authorName license compatibleProducts
|
|
306
|
-
}
|
|
307
|
-
`;
|
|
308
|
-
var HOME_GROUPED_PRODUCTS_QUERY = `
|
|
309
|
-
${STORE_PRODUCT_FIELDS}
|
|
310
|
-
query HomeGroupedProducts($compatibleWith: String) {
|
|
311
|
-
homeGroupedProducts(compatibleWith: $compatibleWith) {
|
|
312
|
-
featured { ...StoreProductFields }
|
|
313
|
-
mostDownloaded { ...StoreProductFields }
|
|
314
|
-
recentlyAdded { ...StoreProductFields }
|
|
315
|
-
freeItems { ...StoreProductFields }
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
`;
|
|
319
|
-
var BROWSE_STORE_QUERY = `
|
|
320
|
-
${STORE_PRODUCT_FIELDS}
|
|
321
|
-
query BrowseStore($input: BrowseStoreInput!) {
|
|
322
|
-
browseStore(input: $input) {
|
|
323
|
-
products { ...StoreProductFields }
|
|
324
|
-
totalCount
|
|
325
|
-
hasMore
|
|
326
|
-
nextCursor
|
|
327
|
-
facets {
|
|
328
|
-
types { value count }
|
|
329
|
-
categories { value count }
|
|
330
|
-
pricingModels { value count }
|
|
331
|
-
priceRange { min max }
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
`;
|
|
336
|
-
var STORE_PRODUCT_DETAILS_QUERY = `
|
|
337
|
-
${STORE_PRODUCT_FIELDS}
|
|
338
|
-
query StoreProductDetails($input: StoreProductDetailsInput!) {
|
|
339
|
-
storeProductDetails(input: $input) {
|
|
340
|
-
product { ...StoreProductFields longDescription videoUrls minPlatformVersion }
|
|
341
|
-
publisher { id name email websiteUrl logoUrl bio isVerified tier }
|
|
342
|
-
reviews { id rating title comment verifiedPurchase helpful createdAt }
|
|
343
|
-
reviewsCount
|
|
344
|
-
relatedProducts { ...StoreProductFields }
|
|
345
|
-
ratingDistribution { fiveStars fourStars threeStars twoStars oneStar }
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
`;
|
|
349
|
-
var CATEGORIES_QUERY = `
|
|
350
|
-
query Categories {
|
|
351
|
-
categories {
|
|
352
|
-
id name slug description icon parentId
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
`;
|
|
356
397
|
function dedupAcross(lists) {
|
|
357
398
|
const seen = /* @__PURE__ */ new Set();
|
|
358
399
|
return lists.map((list) => {
|
|
@@ -370,7 +411,11 @@ function FeaturedHeroCard({
|
|
|
370
411
|
product,
|
|
371
412
|
onNavigate
|
|
372
413
|
}) {
|
|
373
|
-
const priceLabel = formatPrice(
|
|
414
|
+
const priceLabel = formatPrice(
|
|
415
|
+
product.price,
|
|
416
|
+
product.currency,
|
|
417
|
+
product.pricingModel
|
|
418
|
+
);
|
|
374
419
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
375
420
|
"button",
|
|
376
421
|
{
|
|
@@ -379,28 +424,155 @@ function FeaturedHeroCard({
|
|
|
379
424
|
className: "group w-full text-left h-full rounded-2xl border border-border bg-card overflow-hidden hover:border-primary/40 transition-all duration-300 hover:shadow-xl hover:shadow-primary/10 flex flex-col",
|
|
380
425
|
children: [
|
|
381
426
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative h-44 sm:h-52 bg-gradient-to-br from-primary/20 via-primary/8 to-background overflow-hidden flex-shrink-0", children: [
|
|
382
|
-
product.bannerUrl ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
427
|
+
product.bannerUrl ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
428
|
+
"img",
|
|
429
|
+
{
|
|
430
|
+
src: product.bannerUrl,
|
|
431
|
+
alt: "",
|
|
432
|
+
"aria-hidden": "true",
|
|
433
|
+
className: "w-full h-full object-cover"
|
|
434
|
+
}
|
|
435
|
+
) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
436
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
437
|
+
"svg",
|
|
438
|
+
{
|
|
439
|
+
className: "absolute inset-0 w-full h-full opacity-[0.07]",
|
|
440
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
441
|
+
"aria-hidden": "true",
|
|
442
|
+
children: [
|
|
443
|
+
/* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
444
|
+
"pattern",
|
|
445
|
+
{
|
|
446
|
+
id: "fg-hero-grid",
|
|
447
|
+
width: "36",
|
|
448
|
+
height: "36",
|
|
449
|
+
patternUnits: "userSpaceOnUse",
|
|
450
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
451
|
+
"path",
|
|
452
|
+
{
|
|
453
|
+
d: "M 36 0 L 0 0 0 36",
|
|
454
|
+
fill: "none",
|
|
455
|
+
stroke: "currentColor",
|
|
456
|
+
strokeWidth: "1"
|
|
457
|
+
}
|
|
458
|
+
)
|
|
459
|
+
}
|
|
460
|
+
) }),
|
|
461
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { width: "100%", height: "100%", fill: "url(#fg-hero-grid)" })
|
|
462
|
+
]
|
|
463
|
+
}
|
|
464
|
+
),
|
|
465
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
466
|
+
"div",
|
|
467
|
+
{
|
|
468
|
+
className: "absolute inset-0 flex items-center justify-center",
|
|
469
|
+
"aria-hidden": "true",
|
|
470
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
471
|
+
"svg",
|
|
472
|
+
{
|
|
473
|
+
viewBox: "0 0 64 64",
|
|
474
|
+
className: "w-20 h-20 opacity-25",
|
|
475
|
+
fill: "none",
|
|
476
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
477
|
+
children: [
|
|
478
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
479
|
+
"polygon",
|
|
480
|
+
{
|
|
481
|
+
points: "32,8 56,20 32,32 8,20",
|
|
482
|
+
className: "fill-primary/40",
|
|
483
|
+
stroke: "currentColor",
|
|
484
|
+
strokeWidth: "1",
|
|
485
|
+
strokeOpacity: "0.5"
|
|
486
|
+
}
|
|
487
|
+
),
|
|
488
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
489
|
+
"polygon",
|
|
490
|
+
{
|
|
491
|
+
points: "8,20 32,32 32,56 8,44",
|
|
492
|
+
className: "fill-primary/20",
|
|
493
|
+
stroke: "currentColor",
|
|
494
|
+
strokeWidth: "1",
|
|
495
|
+
strokeOpacity: "0.5"
|
|
496
|
+
}
|
|
497
|
+
),
|
|
498
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
499
|
+
"polygon",
|
|
500
|
+
{
|
|
501
|
+
points: "56,20 32,32 32,56 56,44",
|
|
502
|
+
className: "fill-primary/30",
|
|
503
|
+
stroke: "currentColor",
|
|
504
|
+
strokeWidth: "1",
|
|
505
|
+
strokeOpacity: "0.5"
|
|
506
|
+
}
|
|
507
|
+
)
|
|
508
|
+
]
|
|
509
|
+
}
|
|
510
|
+
)
|
|
511
|
+
}
|
|
512
|
+
)
|
|
392
513
|
] }),
|
|
393
514
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute top-3 left-3 text-xs font-semibold px-2.5 py-1 rounded-full bg-primary text-primary-foreground shadow-sm", children: "Featured" }),
|
|
394
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-4 left-4 w-14 h-14 rounded-xl shadow-lg overflow-hidden border-2 border-background", children: product.icon ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
515
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-4 left-4 w-14 h-14 rounded-xl shadow-lg overflow-hidden border-2 border-background", children: product.icon ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
516
|
+
"img",
|
|
517
|
+
{
|
|
518
|
+
src: product.icon,
|
|
519
|
+
alt: "",
|
|
520
|
+
"aria-hidden": "true",
|
|
521
|
+
className: "w-full h-full object-cover"
|
|
522
|
+
}
|
|
523
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full bg-gradient-to-br from-primary/25 to-primary/10 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
524
|
+
"svg",
|
|
525
|
+
{
|
|
526
|
+
viewBox: "0 0 32 32",
|
|
527
|
+
className: "w-8 h-8",
|
|
528
|
+
fill: "none",
|
|
529
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
530
|
+
"aria-hidden": "true",
|
|
531
|
+
children: [
|
|
532
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
533
|
+
"polygon",
|
|
534
|
+
{
|
|
535
|
+
points: "16,4 28,10 16,16 4,10",
|
|
536
|
+
className: "fill-primary/40",
|
|
537
|
+
stroke: "currentColor",
|
|
538
|
+
strokeWidth: "0.6",
|
|
539
|
+
strokeOpacity: "0.4"
|
|
540
|
+
}
|
|
541
|
+
),
|
|
542
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
543
|
+
"polygon",
|
|
544
|
+
{
|
|
545
|
+
points: "4,10 16,16 16,28 4,22",
|
|
546
|
+
className: "fill-primary/20",
|
|
547
|
+
stroke: "currentColor",
|
|
548
|
+
strokeWidth: "0.6",
|
|
549
|
+
strokeOpacity: "0.4"
|
|
550
|
+
}
|
|
551
|
+
),
|
|
552
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
553
|
+
"polygon",
|
|
554
|
+
{
|
|
555
|
+
points: "28,10 16,16 16,28 28,22",
|
|
556
|
+
className: "fill-primary/30",
|
|
557
|
+
stroke: "currentColor",
|
|
558
|
+
strokeWidth: "0.6",
|
|
559
|
+
strokeOpacity: "0.4"
|
|
560
|
+
}
|
|
561
|
+
)
|
|
562
|
+
]
|
|
563
|
+
}
|
|
564
|
+
) }) })
|
|
399
565
|
] }),
|
|
400
566
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 flex flex-col flex-1", children: [
|
|
401
567
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-3 mb-2", children: [
|
|
402
568
|
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground group-hover:text-primary transition-colors line-clamp-1", children: product.name }),
|
|
403
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
569
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
570
|
+
"span",
|
|
571
|
+
{
|
|
572
|
+
className: `text-sm font-bold flex-shrink-0 ${priceLabel === "Free" ? "text-emerald-500" : "text-foreground"}`,
|
|
573
|
+
children: priceLabel
|
|
574
|
+
}
|
|
575
|
+
)
|
|
404
576
|
] }),
|
|
405
577
|
product.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground line-clamp-2 leading-relaxed flex-1", children: product.description }),
|
|
406
578
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 flex items-center gap-2", children: [
|
|
@@ -421,7 +593,10 @@ function ScrollRow({
|
|
|
421
593
|
}) {
|
|
422
594
|
const ref = react.useRef(null);
|
|
423
595
|
function scroll(dir) {
|
|
424
|
-
ref.current?.scrollBy({
|
|
596
|
+
ref.current?.scrollBy({
|
|
597
|
+
left: dir === "r" ? 272 : -272,
|
|
598
|
+
behavior: "smooth"
|
|
599
|
+
});
|
|
425
600
|
}
|
|
426
601
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative group/row", children: [
|
|
427
602
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -431,7 +606,19 @@ function ScrollRow({
|
|
|
431
606
|
onClick: () => scroll("l"),
|
|
432
607
|
"aria-label": "Scroll left",
|
|
433
608
|
className: "absolute left-0 top-1/2 -translate-y-1/2 -translate-x-4 z-10 w-8 h-8 rounded-full bg-background border border-border shadow-md items-center justify-center text-muted-foreground hover:text-primary hover:border-primary/40 transition-all hidden sm:flex opacity-0 group-hover/row:opacity-100",
|
|
434
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
609
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
610
|
+
"svg",
|
|
611
|
+
{
|
|
612
|
+
viewBox: "0 0 16 16",
|
|
613
|
+
className: "w-4 h-4",
|
|
614
|
+
fill: "none",
|
|
615
|
+
stroke: "currentColor",
|
|
616
|
+
strokeWidth: "1.5",
|
|
617
|
+
strokeLinecap: "round",
|
|
618
|
+
strokeLinejoin: "round",
|
|
619
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 3L6 8l4 5" })
|
|
620
|
+
}
|
|
621
|
+
)
|
|
435
622
|
}
|
|
436
623
|
),
|
|
437
624
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -440,7 +627,13 @@ function ScrollRow({
|
|
|
440
627
|
ref,
|
|
441
628
|
className: "flex gap-3 overflow-x-auto pb-1 snap-x snap-mandatory",
|
|
442
629
|
style: { scrollbarWidth: "none", msOverflowStyle: "none" },
|
|
443
|
-
children: products.map((product) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-shrink-0 w-56 snap-start", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
630
|
+
children: products.map((product) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-shrink-0 w-56 snap-start", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
631
|
+
ProductCard,
|
|
632
|
+
{
|
|
633
|
+
product,
|
|
634
|
+
onClick: () => onProductClick(product)
|
|
635
|
+
}
|
|
636
|
+
) }, product.id))
|
|
444
637
|
}
|
|
445
638
|
),
|
|
446
639
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -450,7 +643,19 @@ function ScrollRow({
|
|
|
450
643
|
onClick: () => scroll("r"),
|
|
451
644
|
"aria-label": "Scroll right",
|
|
452
645
|
className: "absolute right-0 top-1/2 -translate-y-1/2 translate-x-4 z-10 w-8 h-8 rounded-full bg-background border border-border shadow-md items-center justify-center text-muted-foreground hover:text-primary hover:border-primary/40 transition-all hidden sm:flex opacity-0 group-hover/row:opacity-100",
|
|
453
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
646
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
647
|
+
"svg",
|
|
648
|
+
{
|
|
649
|
+
viewBox: "0 0 16 16",
|
|
650
|
+
className: "w-4 h-4",
|
|
651
|
+
fill: "none",
|
|
652
|
+
stroke: "currentColor",
|
|
653
|
+
strokeWidth: "1.5",
|
|
654
|
+
strokeLinecap: "round",
|
|
655
|
+
strokeLinejoin: "round",
|
|
656
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 3l4 5-4 5" })
|
|
657
|
+
}
|
|
658
|
+
)
|
|
454
659
|
}
|
|
455
660
|
)
|
|
456
661
|
] });
|
|
@@ -605,16 +810,65 @@ function StoreHomePage({
|
|
|
605
810
|
}
|
|
606
811
|
),
|
|
607
812
|
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "relative overflow-hidden pt-14 pb-12 sm:pt-20 sm:pb-16", children: [
|
|
608
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
813
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
814
|
+
"div",
|
|
815
|
+
{
|
|
816
|
+
className: "absolute inset-0 bg-gradient-to-b from-background via-primary/[0.06] to-background pointer-events-none",
|
|
817
|
+
"aria-hidden": "true"
|
|
818
|
+
}
|
|
819
|
+
),
|
|
820
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
821
|
+
"svg",
|
|
822
|
+
{
|
|
823
|
+
className: "absolute inset-0 w-full h-full opacity-[0.035] pointer-events-none",
|
|
824
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
825
|
+
"aria-hidden": "true",
|
|
826
|
+
children: [
|
|
827
|
+
/* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
828
|
+
"pattern",
|
|
829
|
+
{
|
|
830
|
+
id: "store-home-grid",
|
|
831
|
+
width: "40",
|
|
832
|
+
height: "40",
|
|
833
|
+
patternUnits: "userSpaceOnUse",
|
|
834
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
835
|
+
"path",
|
|
836
|
+
{
|
|
837
|
+
d: "M 40 0 L 0 0 0 40",
|
|
838
|
+
fill: "none",
|
|
839
|
+
stroke: "currentColor",
|
|
840
|
+
strokeWidth: "1"
|
|
841
|
+
}
|
|
842
|
+
)
|
|
843
|
+
}
|
|
844
|
+
) }),
|
|
845
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { width: "100%", height: "100%", fill: "url(#store-home-grid)" })
|
|
846
|
+
]
|
|
847
|
+
}
|
|
848
|
+
),
|
|
849
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
850
|
+
"div",
|
|
851
|
+
{
|
|
852
|
+
className: "absolute -top-16 left-1/3 w-80 h-80 rounded-full bg-primary/10 blur-3xl pointer-events-none",
|
|
853
|
+
"aria-hidden": "true"
|
|
854
|
+
}
|
|
855
|
+
),
|
|
856
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
857
|
+
"div",
|
|
858
|
+
{
|
|
859
|
+
className: "absolute top-8 right-1/4 w-56 h-56 rounded-full bg-primary/8 blur-2xl pointer-events-none",
|
|
860
|
+
"aria-hidden": "true"
|
|
861
|
+
}
|
|
862
|
+
),
|
|
615
863
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center", children: [
|
|
616
864
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-2 px-3 py-1 rounded-full border border-primary/30 bg-primary/10 text-xs font-semibold text-primary mb-5", children: [
|
|
617
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
865
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
866
|
+
"span",
|
|
867
|
+
{
|
|
868
|
+
className: "w-1.5 h-1.5 rounded-full bg-primary flex-shrink-0",
|
|
869
|
+
"aria-hidden": "true"
|
|
870
|
+
}
|
|
871
|
+
),
|
|
618
872
|
"Community Marketplace"
|
|
619
873
|
] }),
|
|
620
874
|
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-4xl sm:text-5xl md:text-6xl font-extrabold tracking-tight text-foreground mb-4 leading-[1.08]", children: resolvedTitle }),
|
|
@@ -626,7 +880,9 @@ function StoreHomePage({
|
|
|
626
880
|
onSubmit: (e) => {
|
|
627
881
|
e.preventDefault();
|
|
628
882
|
const q = new FormData(e.currentTarget).get("q");
|
|
629
|
-
navigate(
|
|
883
|
+
navigate(
|
|
884
|
+
q.trim() ? `${browsePath}?q=${encodeURIComponent(q.trim())}` : browsePath
|
|
885
|
+
);
|
|
630
886
|
},
|
|
631
887
|
children: [
|
|
632
888
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -668,9 +924,23 @@ function StoreHomePage({
|
|
|
668
924
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [...Array(4)].map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(GridCardSkeleton, {}, i)) })
|
|
669
925
|
] }) : error ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "py-16 text-center", children: [
|
|
670
926
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mb-4", children: error }),
|
|
671
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
927
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
928
|
+
"button",
|
|
929
|
+
{
|
|
930
|
+
type: "button",
|
|
931
|
+
onClick: () => window.location.reload(),
|
|
932
|
+
className: "text-sm text-primary hover:underline",
|
|
933
|
+
children: "Retry"
|
|
934
|
+
}
|
|
935
|
+
)
|
|
672
936
|
] }) : featuredItems.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-[1fr_2fr] gap-4 items-start", children: [
|
|
673
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
937
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
938
|
+
FeaturedHeroCard,
|
|
939
|
+
{
|
|
940
|
+
product: featuredItems[0],
|
|
941
|
+
onNavigate: navigate
|
|
942
|
+
}
|
|
943
|
+
),
|
|
674
944
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: featuredItems.slice(1, 5).map((product) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
675
945
|
ProductCard,
|
|
676
946
|
{
|
|
@@ -691,7 +961,13 @@ function StoreHomePage({
|
|
|
691
961
|
onNavigate: navigate
|
|
692
962
|
}
|
|
693
963
|
),
|
|
694
|
-
loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-3 overflow-hidden", children: [...Array(5)].map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(ScrollCardSkeleton, {}, i)) }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
964
|
+
loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-3 overflow-hidden", children: [...Array(5)].map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(ScrollCardSkeleton, {}, i)) }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
965
|
+
ScrollRow,
|
|
966
|
+
{
|
|
967
|
+
products: popularItems,
|
|
968
|
+
onProductClick: handleProductClick
|
|
969
|
+
}
|
|
970
|
+
)
|
|
695
971
|
] }),
|
|
696
972
|
(loading || freeItems.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
|
|
697
973
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -714,16 +990,35 @@ function StoreHomePage({
|
|
|
714
990
|
] })
|
|
715
991
|
] }),
|
|
716
992
|
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "relative overflow-hidden border-t border-border", children: [
|
|
717
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
718
|
-
|
|
993
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
994
|
+
"div",
|
|
995
|
+
{
|
|
996
|
+
className: "absolute inset-0 bg-gradient-to-br from-primary/8 via-background to-primary/5 pointer-events-none",
|
|
997
|
+
"aria-hidden": "true"
|
|
998
|
+
}
|
|
999
|
+
),
|
|
1000
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1001
|
+
"div",
|
|
1002
|
+
{
|
|
1003
|
+
className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-80 h-40 rounded-full bg-primary/12 blur-3xl pointer-events-none",
|
|
1004
|
+
"aria-hidden": "true"
|
|
1005
|
+
}
|
|
1006
|
+
),
|
|
719
1007
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative max-w-2xl mx-auto px-4 py-16 text-center", children: [
|
|
720
1008
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-2 px-3 py-1 rounded-full border border-primary/30 bg-primary/10 text-xs font-semibold text-primary mb-5", children: [
|
|
721
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1009
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1010
|
+
"span",
|
|
1011
|
+
{
|
|
1012
|
+
className: "w-1.5 h-1.5 rounded-full bg-primary flex-shrink-0",
|
|
1013
|
+
"aria-hidden": "true"
|
|
1014
|
+
}
|
|
1015
|
+
),
|
|
722
1016
|
"Become a publisher"
|
|
723
1017
|
] }),
|
|
724
1018
|
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl sm:text-3xl font-bold text-foreground mb-3", children: "Built something useful?" }),
|
|
725
1019
|
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-muted-foreground mb-8 max-w-lg mx-auto leading-relaxed", children: [
|
|
726
|
-
"Share your workflows, nodes, and integrations with
|
|
1020
|
+
"Share your workflows, nodes, and integrations with",
|
|
1021
|
+
" ",
|
|
727
1022
|
productName ?? "the",
|
|
728
1023
|
" community. Earn from your work or contribute for free."
|
|
729
1024
|
] }),
|
|
@@ -779,7 +1074,14 @@ var PRICING_OPTIONS = [
|
|
|
779
1074
|
];
|
|
780
1075
|
function parseUrlParams() {
|
|
781
1076
|
if (typeof window === "undefined")
|
|
782
|
-
return {
|
|
1077
|
+
return {
|
|
1078
|
+
q: "",
|
|
1079
|
+
type: "",
|
|
1080
|
+
pricingModel: "",
|
|
1081
|
+
category: "",
|
|
1082
|
+
sortBy: "RELEVANCE",
|
|
1083
|
+
featured: false
|
|
1084
|
+
};
|
|
783
1085
|
const p = new URLSearchParams(window.location.search);
|
|
784
1086
|
return {
|
|
785
1087
|
q: p.get("q") ?? "",
|
|
@@ -831,7 +1133,9 @@ function StoreBrowsePage({
|
|
|
831
1133
|
const [featured, setFeatured] = react.useState(initial.featured);
|
|
832
1134
|
const [offset, setOffset] = react.useState(0);
|
|
833
1135
|
const [result, setResult] = react.useState(null);
|
|
834
|
-
const [allProducts, setAllProducts] = react.useState(
|
|
1136
|
+
const [allProducts, setAllProducts] = react.useState(
|
|
1137
|
+
[]
|
|
1138
|
+
);
|
|
835
1139
|
const [categories, setCategories] = react.useState([]);
|
|
836
1140
|
const [loading, setLoading] = react.useState(true);
|
|
837
1141
|
const [loadingMore, setLoadingMore] = react.useState(false);
|
|
@@ -875,7 +1179,16 @@ function StoreBrowsePage({
|
|
|
875
1179
|
return () => {
|
|
876
1180
|
cancelled = true;
|
|
877
1181
|
};
|
|
878
|
-
}, [
|
|
1182
|
+
}, [
|
|
1183
|
+
client,
|
|
1184
|
+
search,
|
|
1185
|
+
type,
|
|
1186
|
+
pricingModel,
|
|
1187
|
+
category,
|
|
1188
|
+
sortBy,
|
|
1189
|
+
compatibleWith,
|
|
1190
|
+
featured
|
|
1191
|
+
]);
|
|
879
1192
|
function loadMore() {
|
|
880
1193
|
const nextOffset = offset + PAGE_SIZE;
|
|
881
1194
|
setLoadingMore(true);
|
|
@@ -1051,7 +1364,8 @@ function StoreBrowsePage({
|
|
|
1051
1364
|
onClick: () => setFiltersOpen(!filtersOpen),
|
|
1052
1365
|
className: "lg:hidden h-10 px-4 rounded-lg border border-border bg-background text-sm text-foreground hover:bg-muted/50 transition-colors",
|
|
1053
1366
|
children: [
|
|
1054
|
-
"Filters
|
|
1367
|
+
"Filters",
|
|
1368
|
+
" ",
|
|
1055
1369
|
hasActiveFilters && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: "\u2022" })
|
|
1056
1370
|
]
|
|
1057
1371
|
}
|
|
@@ -1065,14 +1379,32 @@ function StoreBrowsePage({
|
|
|
1065
1379
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-4 flex-wrap", children: [
|
|
1066
1380
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: loading ? "Loading\u2026" : `${result?.totalCount ?? 0} results` }),
|
|
1067
1381
|
hasActiveFilters && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap gap-1.5", children: [
|
|
1068
|
-
search && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1382
|
+
search && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1383
|
+
Chip,
|
|
1384
|
+
{
|
|
1385
|
+
label: `"${search}"`,
|
|
1386
|
+
onRemove: () => {
|
|
1387
|
+
setSearch("");
|
|
1388
|
+
setInputValue("");
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1391
|
+
),
|
|
1072
1392
|
type && /* @__PURE__ */ jsxRuntime.jsx(Chip, { label: type, onRemove: () => setType("") }),
|
|
1073
|
-
pricingModel && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1393
|
+
pricingModel && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1394
|
+
Chip,
|
|
1395
|
+
{
|
|
1396
|
+
label: pricingModel,
|
|
1397
|
+
onRemove: () => setPricingModel("")
|
|
1398
|
+
}
|
|
1399
|
+
),
|
|
1074
1400
|
category && /* @__PURE__ */ jsxRuntime.jsx(Chip, { label: category, onRemove: () => setCategory("") }),
|
|
1075
|
-
featured && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1401
|
+
featured && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1402
|
+
Chip,
|
|
1403
|
+
{
|
|
1404
|
+
label: "Featured",
|
|
1405
|
+
onRemove: () => setFeatured(false)
|
|
1406
|
+
}
|
|
1407
|
+
)
|
|
1076
1408
|
] })
|
|
1077
1409
|
] }),
|
|
1078
1410
|
loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 gap-4", children: [...Array(12)].map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -1124,9 +1456,97 @@ function StoreBrowsePage({
|
|
|
1124
1456
|
function Chip({ label, onRemove }) {
|
|
1125
1457
|
return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1 text-xs bg-primary/10 text-primary rounded-full px-2.5 py-0.5 font-medium", children: [
|
|
1126
1458
|
label,
|
|
1127
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1459
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1460
|
+
"button",
|
|
1461
|
+
{
|
|
1462
|
+
type: "button",
|
|
1463
|
+
onClick: onRemove,
|
|
1464
|
+
"aria-label": `Remove ${label}`,
|
|
1465
|
+
className: "hover:opacity-70",
|
|
1466
|
+
children: "\xD7"
|
|
1467
|
+
}
|
|
1468
|
+
)
|
|
1128
1469
|
] });
|
|
1129
1470
|
}
|
|
1471
|
+
function detectTheme() {
|
|
1472
|
+
if (typeof document === "undefined") return "light";
|
|
1473
|
+
const root = document.documentElement;
|
|
1474
|
+
return root.classList.contains("dark") || root.getAttribute("data-theme") === "dark" ? "dark" : "light";
|
|
1475
|
+
}
|
|
1476
|
+
function WorkflowEmbed({
|
|
1477
|
+
appUrl,
|
|
1478
|
+
productId,
|
|
1479
|
+
theme,
|
|
1480
|
+
clickToInteract = true,
|
|
1481
|
+
hideCta = false,
|
|
1482
|
+
className,
|
|
1483
|
+
onError
|
|
1484
|
+
}) {
|
|
1485
|
+
const iframeRef = react.useRef(null);
|
|
1486
|
+
const [status, setStatus] = react.useState("loading");
|
|
1487
|
+
const [interactive, setInteractive] = react.useState(!clickToInteract);
|
|
1488
|
+
const resolvedTheme = react.useMemo(() => theme ?? detectTheme(), [theme]);
|
|
1489
|
+
const src = react.useMemo(() => {
|
|
1490
|
+
const base = appUrl.replace(/\/+$/, "");
|
|
1491
|
+
const params = new URLSearchParams({
|
|
1492
|
+
productId,
|
|
1493
|
+
theme: resolvedTheme
|
|
1494
|
+
});
|
|
1495
|
+
if (hideCta) params.set("cta", "false");
|
|
1496
|
+
return `${base}/embed/workflow?${params.toString()}`;
|
|
1497
|
+
}, [appUrl, productId, resolvedTheme, hideCta]);
|
|
1498
|
+
react.useEffect(() => {
|
|
1499
|
+
const handler = (event) => {
|
|
1500
|
+
if (event.source !== iframeRef.current?.contentWindow) return;
|
|
1501
|
+
const data = event.data;
|
|
1502
|
+
if (data?.type === "fluidgrids:embed:loaded") setStatus("loaded");
|
|
1503
|
+
if (data?.type === "fluidgrids:embed:error") {
|
|
1504
|
+
setStatus("error");
|
|
1505
|
+
onError?.(data.message ?? "Failed to load workflow preview");
|
|
1506
|
+
}
|
|
1507
|
+
};
|
|
1508
|
+
window.addEventListener("message", handler);
|
|
1509
|
+
return () => window.removeEventListener("message", handler);
|
|
1510
|
+
}, [onError]);
|
|
1511
|
+
if (status === "error") return null;
|
|
1512
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1513
|
+
"div",
|
|
1514
|
+
{
|
|
1515
|
+
className: `relative w-full overflow-hidden rounded-xl border border-border bg-muted ${className ?? ""}`,
|
|
1516
|
+
style: { aspectRatio: "16 / 9" },
|
|
1517
|
+
children: [
|
|
1518
|
+
status === "loading" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1519
|
+
"div",
|
|
1520
|
+
{
|
|
1521
|
+
className: "absolute inset-0 animate-pulse bg-muted",
|
|
1522
|
+
"aria-hidden": "true"
|
|
1523
|
+
}
|
|
1524
|
+
),
|
|
1525
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1526
|
+
"iframe",
|
|
1527
|
+
{
|
|
1528
|
+
ref: iframeRef,
|
|
1529
|
+
src,
|
|
1530
|
+
title: "Workflow preview",
|
|
1531
|
+
loading: "lazy",
|
|
1532
|
+
className: "h-full w-full border-0",
|
|
1533
|
+
style: interactive ? void 0 : { pointerEvents: "none" }
|
|
1534
|
+
}
|
|
1535
|
+
),
|
|
1536
|
+
clickToInteract && !interactive && status === "loaded" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1537
|
+
"button",
|
|
1538
|
+
{
|
|
1539
|
+
type: "button",
|
|
1540
|
+
onClick: () => setInteractive(true),
|
|
1541
|
+
className: "absolute inset-0 flex items-end justify-center bg-transparent pb-4",
|
|
1542
|
+
"aria-label": "Click to explore the workflow",
|
|
1543
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rounded-full border border-border bg-background/90 px-4 py-1.5 text-xs font-medium text-foreground shadow-sm backdrop-blur transition-colors hover:bg-background", children: "Click to explore" })
|
|
1544
|
+
}
|
|
1545
|
+
)
|
|
1546
|
+
]
|
|
1547
|
+
}
|
|
1548
|
+
);
|
|
1549
|
+
}
|
|
1130
1550
|
var ANIM_STYLES = `
|
|
1131
1551
|
@keyframes sdFadeUp {
|
|
1132
1552
|
from { opacity: 0; transform: translateY(16px); }
|
|
@@ -1159,7 +1579,11 @@ var ANIM_STYLES = `
|
|
|
1159
1579
|
.sd-d5 { animation-delay: 320ms; }
|
|
1160
1580
|
.sd-d6 { animation-delay: 400ms; }
|
|
1161
1581
|
`;
|
|
1162
|
-
function RatingBar({
|
|
1582
|
+
function RatingBar({
|
|
1583
|
+
label,
|
|
1584
|
+
count,
|
|
1585
|
+
total
|
|
1586
|
+
}) {
|
|
1163
1587
|
const pct = total > 0 ? Math.round(count / total * 100) : 0;
|
|
1164
1588
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground", children: [
|
|
1165
1589
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-12 text-right shrink-0", children: label }),
|
|
@@ -1175,12 +1599,63 @@ function RatingBar({ label, count, total }) {
|
|
|
1175
1599
|
}
|
|
1176
1600
|
function IconBlock({ src }) {
|
|
1177
1601
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex-shrink-0", children: [
|
|
1178
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1602
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1603
|
+
"div",
|
|
1604
|
+
{
|
|
1605
|
+
className: "sd-gp absolute -inset-1.5 rounded-2xl bg-primary/30 blur-md pointer-events-none",
|
|
1606
|
+
"aria-hidden": "true"
|
|
1607
|
+
}
|
|
1608
|
+
),
|
|
1609
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "sd-si relative w-20 h-20 rounded-2xl overflow-hidden shadow-lg ring-1 ring-border", children: src ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1610
|
+
"img",
|
|
1611
|
+
{
|
|
1612
|
+
src,
|
|
1613
|
+
alt: "",
|
|
1614
|
+
"aria-hidden": true,
|
|
1615
|
+
className: "w-full h-full object-cover"
|
|
1616
|
+
}
|
|
1617
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full bg-gradient-to-br from-primary/25 to-primary/8 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1618
|
+
"svg",
|
|
1619
|
+
{
|
|
1620
|
+
viewBox: "0 0 40 40",
|
|
1621
|
+
className: "w-10 h-10",
|
|
1622
|
+
fill: "none",
|
|
1623
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
1624
|
+
"aria-hidden": "true",
|
|
1625
|
+
children: [
|
|
1626
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1627
|
+
"polygon",
|
|
1628
|
+
{
|
|
1629
|
+
points: "20,4 34,11 20,18 6,11",
|
|
1630
|
+
className: "fill-primary/40",
|
|
1631
|
+
stroke: "currentColor",
|
|
1632
|
+
strokeWidth: "0.6",
|
|
1633
|
+
strokeOpacity: "0.4"
|
|
1634
|
+
}
|
|
1635
|
+
),
|
|
1636
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1637
|
+
"polygon",
|
|
1638
|
+
{
|
|
1639
|
+
points: "6,11 20,18 20,34 6,27",
|
|
1640
|
+
className: "fill-primary/20",
|
|
1641
|
+
stroke: "currentColor",
|
|
1642
|
+
strokeWidth: "0.6",
|
|
1643
|
+
strokeOpacity: "0.4"
|
|
1644
|
+
}
|
|
1645
|
+
),
|
|
1646
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1647
|
+
"polygon",
|
|
1648
|
+
{
|
|
1649
|
+
points: "34,11 20,18 20,34 34,27",
|
|
1650
|
+
className: "fill-primary/30",
|
|
1651
|
+
stroke: "currentColor",
|
|
1652
|
+
strokeWidth: "0.6",
|
|
1653
|
+
strokeOpacity: "0.4"
|
|
1654
|
+
}
|
|
1655
|
+
)
|
|
1656
|
+
]
|
|
1657
|
+
}
|
|
1658
|
+
) }) })
|
|
1184
1659
|
] });
|
|
1185
1660
|
}
|
|
1186
1661
|
function StoreProductDetailPage({
|
|
@@ -1196,6 +1671,7 @@ function StoreProductDetailPage({
|
|
|
1196
1671
|
const [error, setError] = react.useState(null);
|
|
1197
1672
|
const [activeScreenshot, setActiveScreenshot] = react.useState(0);
|
|
1198
1673
|
const [screenshotKey, setScreenshotKey] = react.useState(0);
|
|
1674
|
+
const [embedFailed, setEmbedFailed] = react.useState(false);
|
|
1199
1675
|
react.useEffect(() => {
|
|
1200
1676
|
if (!slug && !id) {
|
|
1201
1677
|
setError("Product not found.");
|
|
@@ -1249,11 +1725,30 @@ function StoreProductDetailPage({
|
|
|
1249
1725
|
if (error || !details) {
|
|
1250
1726
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 text-center", children: [
|
|
1251
1727
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mb-4", children: error ?? "Product not found." }),
|
|
1252
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1728
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1729
|
+
"button",
|
|
1730
|
+
{
|
|
1731
|
+
type: "button",
|
|
1732
|
+
onClick: () => navigate("/store"),
|
|
1733
|
+
className: "text-sm text-primary hover:underline",
|
|
1734
|
+
children: "Back to Store"
|
|
1735
|
+
}
|
|
1736
|
+
)
|
|
1253
1737
|
] });
|
|
1254
1738
|
}
|
|
1255
|
-
const {
|
|
1256
|
-
|
|
1739
|
+
const {
|
|
1740
|
+
product,
|
|
1741
|
+
publisher,
|
|
1742
|
+
reviews,
|
|
1743
|
+
reviewsCount,
|
|
1744
|
+
relatedProducts,
|
|
1745
|
+
ratingDistribution
|
|
1746
|
+
} = details;
|
|
1747
|
+
const priceLabel = formatPrice(
|
|
1748
|
+
product.price,
|
|
1749
|
+
product.currency,
|
|
1750
|
+
product.pricingModel
|
|
1751
|
+
);
|
|
1257
1752
|
const screenshots = product.screenshots ?? [];
|
|
1258
1753
|
const totalRatings = ratingDistribution ? ratingDistribution.fiveStars + ratingDistribution.fourStars + ratingDistribution.threeStars + ratingDistribution.twoStars + ratingDistribution.oneStar : 0;
|
|
1259
1754
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full", children: [
|
|
@@ -1267,15 +1762,60 @@ function StoreProductDetailPage({
|
|
|
1267
1762
|
}
|
|
1268
1763
|
),
|
|
1269
1764
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative overflow-hidden", children: [
|
|
1270
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1765
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1766
|
+
"div",
|
|
1767
|
+
{
|
|
1768
|
+
className: "absolute inset-0 bg-gradient-to-b from-primary/[0.07] via-background to-background pointer-events-none",
|
|
1769
|
+
"aria-hidden": "true"
|
|
1770
|
+
}
|
|
1771
|
+
),
|
|
1772
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
1773
|
+
"svg",
|
|
1774
|
+
{
|
|
1775
|
+
className: "absolute inset-0 w-full h-full opacity-[0.04] pointer-events-none",
|
|
1776
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
1777
|
+
"aria-hidden": "true",
|
|
1778
|
+
children: [
|
|
1779
|
+
/* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1780
|
+
"pattern",
|
|
1781
|
+
{
|
|
1782
|
+
id: "sd-grid",
|
|
1783
|
+
width: "40",
|
|
1784
|
+
height: "40",
|
|
1785
|
+
patternUnits: "userSpaceOnUse",
|
|
1786
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1787
|
+
"path",
|
|
1788
|
+
{
|
|
1789
|
+
d: "M 40 0 L 0 0 0 40",
|
|
1790
|
+
fill: "none",
|
|
1791
|
+
stroke: "currentColor",
|
|
1792
|
+
strokeWidth: "1"
|
|
1793
|
+
}
|
|
1794
|
+
)
|
|
1795
|
+
}
|
|
1796
|
+
) }),
|
|
1797
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { width: "100%", height: "100%", fill: "url(#sd-grid)" })
|
|
1798
|
+
]
|
|
1799
|
+
}
|
|
1800
|
+
),
|
|
1801
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1802
|
+
"div",
|
|
1803
|
+
{
|
|
1804
|
+
className: "absolute -top-12 -left-12 w-72 h-72 rounded-full bg-primary/10 blur-3xl pointer-events-none",
|
|
1805
|
+
"aria-hidden": "true"
|
|
1806
|
+
}
|
|
1807
|
+
),
|
|
1276
1808
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 pt-6 pb-8", children: [
|
|
1277
1809
|
/* @__PURE__ */ jsxRuntime.jsxs("nav", { className: "sd-fi text-sm text-muted-foreground mb-6 flex items-center gap-1.5 flex-wrap", children: [
|
|
1278
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1810
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1811
|
+
"button",
|
|
1812
|
+
{
|
|
1813
|
+
type: "button",
|
|
1814
|
+
onClick: () => navigate("/store"),
|
|
1815
|
+
className: "hover:text-primary transition-colors",
|
|
1816
|
+
children: "Store"
|
|
1817
|
+
}
|
|
1818
|
+
),
|
|
1279
1819
|
/* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: "\u203A" }),
|
|
1280
1820
|
product.category && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1281
1821
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -1341,6 +1881,14 @@ function StoreProductDetailPage({
|
|
|
1341
1881
|
}
|
|
1342
1882
|
)
|
|
1343
1883
|
] }),
|
|
1884
|
+
product.type === "WORKFLOW" && !embedFailed && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sd-fu sd-d3 mb-8", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1885
|
+
WorkflowEmbed,
|
|
1886
|
+
{
|
|
1887
|
+
appUrl: appLoginUrl,
|
|
1888
|
+
productId: product.id,
|
|
1889
|
+
onError: () => setEmbedFailed(true)
|
|
1890
|
+
}
|
|
1891
|
+
) }),
|
|
1344
1892
|
screenshots.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sd-fu sd-d3 mb-8", children: [
|
|
1345
1893
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-xl overflow-hidden bg-muted aspect-video mb-3 shadow-md", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1346
1894
|
"img",
|
|
@@ -1357,7 +1905,14 @@ function StoreProductDetailPage({
|
|
|
1357
1905
|
type: "button",
|
|
1358
1906
|
onClick: () => switchScreenshot(i),
|
|
1359
1907
|
className: `w-20 h-14 rounded-lg overflow-hidden flex-shrink-0 border-2 transition-all duration-200 ${i === activeScreenshot ? "border-primary shadow-sm shadow-primary/20" : "border-transparent opacity-50 hover:opacity-80"}`,
|
|
1360
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1908
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1909
|
+
"img",
|
|
1910
|
+
{
|
|
1911
|
+
src,
|
|
1912
|
+
alt: `Thumbnail ${i + 1}`,
|
|
1913
|
+
className: "w-full h-full object-cover"
|
|
1914
|
+
}
|
|
1915
|
+
)
|
|
1361
1916
|
},
|
|
1362
1917
|
i
|
|
1363
1918
|
)) })
|
|
@@ -1369,7 +1924,14 @@ function StoreProductDetailPage({
|
|
|
1369
1924
|
publisher && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sd-fu sd-d5 mb-8 p-4 rounded-xl border border-border bg-card hover:border-primary/30 transition-colors duration-300", children: [
|
|
1370
1925
|
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-sm font-semibold text-foreground mb-3", children: "Publisher" }),
|
|
1371
1926
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
1372
|
-
publisher.logoUrl ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1927
|
+
publisher.logoUrl ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1928
|
+
"img",
|
|
1929
|
+
{
|
|
1930
|
+
src: publisher.logoUrl,
|
|
1931
|
+
alt: publisher.name,
|
|
1932
|
+
className: "w-10 h-10 rounded-full object-cover"
|
|
1933
|
+
}
|
|
1934
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-10 h-10 rounded-full bg-primary/10 flex items-center justify-center text-primary text-sm font-bold", children: publisher.name.charAt(0).toUpperCase() }),
|
|
1373
1935
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1374
1936
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
1375
1937
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold text-foreground text-sm", children: publisher.name }),
|
|
@@ -1395,11 +1957,46 @@ function StoreProductDetailPage({
|
|
|
1395
1957
|
] })
|
|
1396
1958
|
] }),
|
|
1397
1959
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 space-y-1.5 pt-1", children: [
|
|
1398
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1960
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1961
|
+
RatingBar,
|
|
1962
|
+
{
|
|
1963
|
+
label: "5 \u2605",
|
|
1964
|
+
count: ratingDistribution.fiveStars,
|
|
1965
|
+
total: totalRatings
|
|
1966
|
+
}
|
|
1967
|
+
),
|
|
1968
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1969
|
+
RatingBar,
|
|
1970
|
+
{
|
|
1971
|
+
label: "4 \u2605",
|
|
1972
|
+
count: ratingDistribution.fourStars,
|
|
1973
|
+
total: totalRatings
|
|
1974
|
+
}
|
|
1975
|
+
),
|
|
1976
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1977
|
+
RatingBar,
|
|
1978
|
+
{
|
|
1979
|
+
label: "3 \u2605",
|
|
1980
|
+
count: ratingDistribution.threeStars,
|
|
1981
|
+
total: totalRatings
|
|
1982
|
+
}
|
|
1983
|
+
),
|
|
1984
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1985
|
+
RatingBar,
|
|
1986
|
+
{
|
|
1987
|
+
label: "2 \u2605",
|
|
1988
|
+
count: ratingDistribution.twoStars,
|
|
1989
|
+
total: totalRatings
|
|
1990
|
+
}
|
|
1991
|
+
),
|
|
1992
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1993
|
+
RatingBar,
|
|
1994
|
+
{
|
|
1995
|
+
label: "1 \u2605",
|
|
1996
|
+
count: ratingDistribution.oneStar,
|
|
1997
|
+
total: totalRatings
|
|
1998
|
+
}
|
|
1999
|
+
)
|
|
1403
2000
|
] })
|
|
1404
2001
|
] }),
|
|
1405
2002
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: reviews.slice(0, 5).map((review, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -1414,11 +2011,14 @@ function StoreProductDetailPage({
|
|
|
1414
2011
|
] }),
|
|
1415
2012
|
review.title && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-semibold text-sm text-foreground mb-1", children: review.title }),
|
|
1416
2013
|
review.comment && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: review.comment }),
|
|
1417
|
-
review.createdAt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground mt-2", children: new Date(review.createdAt).toLocaleDateString(
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
2014
|
+
review.createdAt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground mt-2", children: new Date(review.createdAt).toLocaleDateString(
|
|
2015
|
+
"en-US",
|
|
2016
|
+
{
|
|
2017
|
+
year: "numeric",
|
|
2018
|
+
month: "short",
|
|
2019
|
+
day: "numeric"
|
|
2020
|
+
}
|
|
2021
|
+
) })
|
|
1422
2022
|
]
|
|
1423
2023
|
},
|
|
1424
2024
|
review.id
|
|
@@ -1438,7 +2038,13 @@ function StoreProductDetailPage({
|
|
|
1438
2038
|
] }),
|
|
1439
2039
|
/* @__PURE__ */ jsxRuntime.jsx("aside", { className: "lg:sticky lg:top-24 self-start", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sd-fu sd-d4 bg-card border border-border rounded-xl p-5 space-y-4 hover:border-primary/30 transition-colors duration-300 hover:shadow-lg hover:shadow-primary/5", children: [
|
|
1440
2040
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1441
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2041
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2042
|
+
"div",
|
|
2043
|
+
{
|
|
2044
|
+
className: `text-3xl font-extrabold ${priceLabel === "Free" ? "text-emerald-500" : "text-foreground"}`,
|
|
2045
|
+
children: priceLabel
|
|
2046
|
+
}
|
|
2047
|
+
),
|
|
1442
2048
|
product.pricingModel === "SUBSCRIPTION" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-muted-foreground", children: "per month" })
|
|
1443
2049
|
] }),
|
|
1444
2050
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -1497,6 +2103,7 @@ exports.StoreBrowsePage = StoreBrowsePage;
|
|
|
1497
2103
|
exports.StoreHomePage = StoreHomePage;
|
|
1498
2104
|
exports.StoreProductDetailPage = StoreProductDetailPage;
|
|
1499
2105
|
exports.TypeBadge = TypeBadge;
|
|
2106
|
+
exports.WorkflowEmbed = WorkflowEmbed;
|
|
1500
2107
|
exports.formatDownloads = formatDownloads;
|
|
1501
2108
|
exports.formatPrice = formatPrice;
|
|
1502
2109
|
//# sourceMappingURL=index.js.map
|