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