@burdenoff/website-sdk 2026.716.2 → 2026.716.3
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 +141 -693
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +141 -693
- package/dist/index.mjs.map +1 -1
- package/dist/store/index.d.mts +154 -27
- package/dist/store/index.d.ts +154 -27
- package/dist/store/index.js +284 -837
- package/dist/store/index.js.map +1 -1
- package/dist/store/index.mjs +286 -838
- package/dist/store/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/product-card-Dm1zkFkm.d.mts +0 -157
- package/dist/product-card-Dm1zkFkm.d.ts +0 -157
package/dist/store/index.mjs
CHANGED
|
@@ -1,200 +1,10 @@
|
|
|
1
|
-
import { createContext, useState, useEffect, useRef,
|
|
1
|
+
import { createContext, useState, useEffect, useRef, 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
|
-
`;
|
|
198
8
|
|
|
199
9
|
// src/client/security.ts
|
|
200
10
|
var LOOPBACK_HOSTS = /* @__PURE__ */ new Set(["localhost", "127.0.0.1", "::1"]);
|
|
@@ -392,6 +202,155 @@ function PageHead({
|
|
|
392
202
|
))
|
|
393
203
|
] });
|
|
394
204
|
}
|
|
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
|
+
`;
|
|
395
354
|
function dedupAcross(lists) {
|
|
396
355
|
const seen = /* @__PURE__ */ new Set();
|
|
397
356
|
return lists.map((list) => {
|
|
@@ -409,11 +368,7 @@ function FeaturedHeroCard({
|
|
|
409
368
|
product,
|
|
410
369
|
onNavigate
|
|
411
370
|
}) {
|
|
412
|
-
const priceLabel = formatPrice(
|
|
413
|
-
product.price,
|
|
414
|
-
product.currency,
|
|
415
|
-
product.pricingModel
|
|
416
|
-
);
|
|
371
|
+
const priceLabel = formatPrice(product.price, product.currency, product.pricingModel);
|
|
417
372
|
return /* @__PURE__ */ jsxs(
|
|
418
373
|
"button",
|
|
419
374
|
{
|
|
@@ -422,155 +377,28 @@ function FeaturedHeroCard({
|
|
|
422
377
|
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",
|
|
423
378
|
children: [
|
|
424
379
|
/* @__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: [
|
|
425
|
-
product.bannerUrl ? /* @__PURE__ */ jsx(
|
|
426
|
-
"
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
className: "
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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
|
-
)
|
|
380
|
+
product.bannerUrl ? /* @__PURE__ */ jsx("img", { src: product.bannerUrl, alt: "", "aria-hidden": "true", className: "w-full h-full object-cover" }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
381
|
+
/* @__PURE__ */ jsxs("svg", { className: "absolute inset-0 w-full h-full opacity-[0.07]", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [
|
|
382
|
+
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("pattern", { id: "fg-hero-grid", width: "36", height: "36", patternUnits: "userSpaceOnUse", children: /* @__PURE__ */ jsx("path", { d: "M 36 0 L 0 0 0 36", fill: "none", stroke: "currentColor", strokeWidth: "1" }) }) }),
|
|
383
|
+
/* @__PURE__ */ jsx("rect", { width: "100%", height: "100%", fill: "url(#fg-hero-grid)" })
|
|
384
|
+
] }),
|
|
385
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center", "aria-hidden": "true", children: /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 64 64", className: "w-20 h-20 opacity-25", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
386
|
+
/* @__PURE__ */ jsx("polygon", { points: "32,8 56,20 32,32 8,20", className: "fill-primary/40", stroke: "currentColor", strokeWidth: "1", strokeOpacity: "0.5" }),
|
|
387
|
+
/* @__PURE__ */ jsx("polygon", { points: "8,20 32,32 32,56 8,44", className: "fill-primary/20", stroke: "currentColor", strokeWidth: "1", strokeOpacity: "0.5" }),
|
|
388
|
+
/* @__PURE__ */ jsx("polygon", { points: "56,20 32,32 32,56 56,44", className: "fill-primary/30", stroke: "currentColor", strokeWidth: "1", strokeOpacity: "0.5" })
|
|
389
|
+
] }) })
|
|
511
390
|
] }),
|
|
512
391
|
/* @__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" }),
|
|
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
|
-
"
|
|
515
|
-
{
|
|
516
|
-
|
|
517
|
-
|
|
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
|
-
) }) })
|
|
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("img", { src: product.icon, alt: "", "aria-hidden": "true", className: "w-full h-full object-cover" }) : /* @__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("svg", { viewBox: "0 0 32 32", className: "w-8 h-8", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [
|
|
393
|
+
/* @__PURE__ */ jsx("polygon", { points: "16,4 28,10 16,16 4,10", className: "fill-primary/40", stroke: "currentColor", strokeWidth: "0.6", strokeOpacity: "0.4" }),
|
|
394
|
+
/* @__PURE__ */ jsx("polygon", { points: "4,10 16,16 16,28 4,22", className: "fill-primary/20", stroke: "currentColor", strokeWidth: "0.6", strokeOpacity: "0.4" }),
|
|
395
|
+
/* @__PURE__ */ jsx("polygon", { points: "28,10 16,16 16,28 28,22", className: "fill-primary/30", stroke: "currentColor", strokeWidth: "0.6", strokeOpacity: "0.4" })
|
|
396
|
+
] }) }) })
|
|
563
397
|
] }),
|
|
564
398
|
/* @__PURE__ */ jsxs("div", { className: "p-5 flex flex-col flex-1", children: [
|
|
565
399
|
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3 mb-2", children: [
|
|
566
400
|
/* @__PURE__ */ jsx("h3", { className: "text-base font-bold text-foreground group-hover:text-primary transition-colors line-clamp-1", children: product.name }),
|
|
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
|
-
)
|
|
401
|
+
/* @__PURE__ */ jsx("span", { className: `text-sm font-bold flex-shrink-0 ${priceLabel === "Free" ? "text-emerald-500" : "text-foreground"}`, children: priceLabel })
|
|
574
402
|
] }),
|
|
575
403
|
product.description && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground line-clamp-2 leading-relaxed flex-1", children: product.description }),
|
|
576
404
|
/* @__PURE__ */ jsxs("div", { className: "mt-3 flex items-center gap-2", children: [
|
|
@@ -591,10 +419,7 @@ function ScrollRow({
|
|
|
591
419
|
}) {
|
|
592
420
|
const ref = useRef(null);
|
|
593
421
|
function scroll(dir) {
|
|
594
|
-
ref.current?.scrollBy({
|
|
595
|
-
left: dir === "r" ? 272 : -272,
|
|
596
|
-
behavior: "smooth"
|
|
597
|
-
});
|
|
422
|
+
ref.current?.scrollBy({ left: dir === "r" ? 272 : -272, behavior: "smooth" });
|
|
598
423
|
}
|
|
599
424
|
return /* @__PURE__ */ jsxs("div", { className: "relative group/row", children: [
|
|
600
425
|
/* @__PURE__ */ jsx(
|
|
@@ -604,19 +429,7 @@ function ScrollRow({
|
|
|
604
429
|
onClick: () => scroll("l"),
|
|
605
430
|
"aria-label": "Scroll left",
|
|
606
431
|
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",
|
|
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
|
-
)
|
|
432
|
+
children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 16 16", className: "w-4 h-4", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M10 3L6 8l4 5" }) })
|
|
620
433
|
}
|
|
621
434
|
),
|
|
622
435
|
/* @__PURE__ */ jsx(
|
|
@@ -625,13 +438,7 @@ function ScrollRow({
|
|
|
625
438
|
ref,
|
|
626
439
|
className: "flex gap-3 overflow-x-auto pb-1 snap-x snap-mandatory",
|
|
627
440
|
style: { scrollbarWidth: "none", msOverflowStyle: "none" },
|
|
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))
|
|
441
|
+
children: products.map((product) => /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 w-56 snap-start", children: /* @__PURE__ */ jsx(ProductCard, { product, onClick: () => onProductClick(product) }) }, product.id))
|
|
635
442
|
}
|
|
636
443
|
),
|
|
637
444
|
/* @__PURE__ */ jsx(
|
|
@@ -641,19 +448,7 @@ function ScrollRow({
|
|
|
641
448
|
onClick: () => scroll("r"),
|
|
642
449
|
"aria-label": "Scroll right",
|
|
643
450
|
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",
|
|
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
|
-
)
|
|
451
|
+
children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 16 16", className: "w-4 h-4", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M6 3l4 5-4 5" }) })
|
|
657
452
|
}
|
|
658
453
|
)
|
|
659
454
|
] });
|
|
@@ -756,8 +551,10 @@ function StoreHomePage({
|
|
|
756
551
|
const [grouped, setGrouped] = useState(null);
|
|
757
552
|
const [loading, setLoading] = useState(true);
|
|
758
553
|
const [error, setError] = useState(null);
|
|
554
|
+
const [retryKey, setRetryKey] = useState(0);
|
|
759
555
|
useEffect(() => {
|
|
760
556
|
let cancelled = false;
|
|
557
|
+
let autoRetryTimer = null;
|
|
761
558
|
async function load() {
|
|
762
559
|
setLoading(true);
|
|
763
560
|
try {
|
|
@@ -771,7 +568,15 @@ function StoreHomePage({
|
|
|
771
568
|
setGrouped(res.data.homeGroupedProducts);
|
|
772
569
|
setError(null);
|
|
773
570
|
} catch {
|
|
774
|
-
if (!cancelled)
|
|
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
|
+
}
|
|
775
580
|
} finally {
|
|
776
581
|
if (!cancelled) setLoading(false);
|
|
777
582
|
}
|
|
@@ -779,8 +584,9 @@ function StoreHomePage({
|
|
|
779
584
|
load();
|
|
780
585
|
return () => {
|
|
781
586
|
cancelled = true;
|
|
587
|
+
if (autoRetryTimer) clearTimeout(autoRetryTimer);
|
|
782
588
|
};
|
|
783
|
-
}, [client, compatibleWith]);
|
|
589
|
+
}, [client, compatibleWith, retryKey]);
|
|
784
590
|
function navigate(path) {
|
|
785
591
|
if (onNavigate) {
|
|
786
592
|
onNavigate(path);
|
|
@@ -808,65 +614,16 @@ function StoreHomePage({
|
|
|
808
614
|
}
|
|
809
615
|
),
|
|
810
616
|
/* @__PURE__ */ jsxs("section", { className: "relative overflow-hidden pt-14 pb-12 sm:pt-20 sm:pb-16", children: [
|
|
811
|
-
/* @__PURE__ */ jsx(
|
|
812
|
-
|
|
813
|
-
{
|
|
814
|
-
|
|
815
|
-
|
|
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
|
-
),
|
|
617
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-b from-background via-primary/[0.06] to-background pointer-events-none", "aria-hidden": "true" }),
|
|
618
|
+
/* @__PURE__ */ jsxs("svg", { className: "absolute inset-0 w-full h-full opacity-[0.035] pointer-events-none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [
|
|
619
|
+
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("pattern", { id: "store-home-grid", width: "40", height: "40", patternUnits: "userSpaceOnUse", children: /* @__PURE__ */ jsx("path", { d: "M 40 0 L 0 0 0 40", fill: "none", stroke: "currentColor", strokeWidth: "1" }) }) }),
|
|
620
|
+
/* @__PURE__ */ jsx("rect", { width: "100%", height: "100%", fill: "url(#store-home-grid)" })
|
|
621
|
+
] }),
|
|
622
|
+
/* @__PURE__ */ jsx("div", { className: "absolute -top-16 left-1/3 w-80 h-80 rounded-full bg-primary/10 blur-3xl pointer-events-none", "aria-hidden": "true" }),
|
|
623
|
+
/* @__PURE__ */ jsx("div", { className: "absolute top-8 right-1/4 w-56 h-56 rounded-full bg-primary/8 blur-2xl pointer-events-none", "aria-hidden": "true" }),
|
|
861
624
|
/* @__PURE__ */ jsxs("div", { className: "relative max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center", children: [
|
|
862
625
|
/* @__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: [
|
|
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
|
-
),
|
|
626
|
+
/* @__PURE__ */ jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-primary flex-shrink-0", "aria-hidden": "true" }),
|
|
870
627
|
"Community Marketplace"
|
|
871
628
|
] }),
|
|
872
629
|
/* @__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 }),
|
|
@@ -878,9 +635,7 @@ function StoreHomePage({
|
|
|
878
635
|
onSubmit: (e) => {
|
|
879
636
|
e.preventDefault();
|
|
880
637
|
const q = new FormData(e.currentTarget).get("q");
|
|
881
|
-
navigate(
|
|
882
|
-
q.trim() ? `${browsePath}?q=${encodeURIComponent(q.trim())}` : browsePath
|
|
883
|
-
);
|
|
638
|
+
navigate(q.trim() ? `${browsePath}?q=${encodeURIComponent(q.trim())}` : browsePath);
|
|
884
639
|
},
|
|
885
640
|
children: [
|
|
886
641
|
/* @__PURE__ */ jsx(
|
|
@@ -922,23 +677,9 @@ function StoreHomePage({
|
|
|
922
677
|
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [...Array(4)].map((_, i) => /* @__PURE__ */ jsx(GridCardSkeleton, {}, i)) })
|
|
923
678
|
] }) : error ? /* @__PURE__ */ jsxs("div", { className: "py-16 text-center", children: [
|
|
924
679
|
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground mb-4", children: error }),
|
|
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
|
-
)
|
|
680
|
+
/* @__PURE__ */ jsx("button", { type: "button", onClick: () => setRetryKey((k) => k + 1), className: "text-sm text-primary hover:underline", children: "Retry" })
|
|
934
681
|
] }) : featuredItems.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-[1fr_2fr] gap-4 items-start", children: [
|
|
935
|
-
/* @__PURE__ */ jsx(
|
|
936
|
-
FeaturedHeroCard,
|
|
937
|
-
{
|
|
938
|
-
product: featuredItems[0],
|
|
939
|
-
onNavigate: navigate
|
|
940
|
-
}
|
|
941
|
-
),
|
|
682
|
+
/* @__PURE__ */ jsx(FeaturedHeroCard, { product: featuredItems[0], onNavigate: navigate }),
|
|
942
683
|
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: featuredItems.slice(1, 5).map((product) => /* @__PURE__ */ jsx(
|
|
943
684
|
ProductCard,
|
|
944
685
|
{
|
|
@@ -959,13 +700,7 @@ function StoreHomePage({
|
|
|
959
700
|
onNavigate: navigate
|
|
960
701
|
}
|
|
961
702
|
),
|
|
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
|
-
)
|
|
703
|
+
loading ? /* @__PURE__ */ jsx("div", { className: "flex gap-3 overflow-hidden", children: [...Array(5)].map((_, i) => /* @__PURE__ */ jsx(ScrollCardSkeleton, {}, i)) }) : /* @__PURE__ */ jsx(ScrollRow, { products: popularItems, onProductClick: handleProductClick })
|
|
969
704
|
] }),
|
|
970
705
|
(loading || freeItems.length > 0) && /* @__PURE__ */ jsxs("section", { children: [
|
|
971
706
|
/* @__PURE__ */ jsx(
|
|
@@ -988,35 +723,16 @@ function StoreHomePage({
|
|
|
988
723
|
] })
|
|
989
724
|
] }),
|
|
990
725
|
/* @__PURE__ */ jsxs("section", { className: "relative overflow-hidden border-t border-border", children: [
|
|
991
|
-
/* @__PURE__ */ jsx(
|
|
992
|
-
|
|
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
|
-
),
|
|
726
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-br from-primary/8 via-background to-primary/5 pointer-events-none", "aria-hidden": "true" }),
|
|
727
|
+
/* @__PURE__ */ jsx("div", { 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", "aria-hidden": "true" }),
|
|
1005
728
|
/* @__PURE__ */ jsxs("div", { className: "relative max-w-2xl mx-auto px-4 py-16 text-center", children: [
|
|
1006
729
|
/* @__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: [
|
|
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
|
-
),
|
|
730
|
+
/* @__PURE__ */ jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-primary flex-shrink-0", "aria-hidden": "true" }),
|
|
1014
731
|
"Become a publisher"
|
|
1015
732
|
] }),
|
|
1016
733
|
/* @__PURE__ */ jsx("h2", { className: "text-2xl sm:text-3xl font-bold text-foreground mb-3", children: "Built something useful?" }),
|
|
1017
734
|
/* @__PURE__ */ jsxs("p", { className: "text-muted-foreground mb-8 max-w-lg mx-auto leading-relaxed", children: [
|
|
1018
|
-
"Share your workflows, nodes, and integrations with",
|
|
1019
|
-
" ",
|
|
735
|
+
"Share your workflows, nodes, and integrations with ",
|
|
1020
736
|
productName ?? "the",
|
|
1021
737
|
" community. Earn from your work or contribute for free."
|
|
1022
738
|
] }),
|
|
@@ -1072,14 +788,7 @@ var PRICING_OPTIONS = [
|
|
|
1072
788
|
];
|
|
1073
789
|
function parseUrlParams() {
|
|
1074
790
|
if (typeof window === "undefined")
|
|
1075
|
-
return {
|
|
1076
|
-
q: "",
|
|
1077
|
-
type: "",
|
|
1078
|
-
pricingModel: "",
|
|
1079
|
-
category: "",
|
|
1080
|
-
sortBy: "RELEVANCE",
|
|
1081
|
-
featured: false
|
|
1082
|
-
};
|
|
791
|
+
return { q: "", type: "", pricingModel: "", category: "", sortBy: "RELEVANCE", featured: false };
|
|
1083
792
|
const p = new URLSearchParams(window.location.search);
|
|
1084
793
|
return {
|
|
1085
794
|
q: p.get("q") ?? "",
|
|
@@ -1131,9 +840,7 @@ function StoreBrowsePage({
|
|
|
1131
840
|
const [featured, setFeatured] = useState(initial.featured);
|
|
1132
841
|
const [offset, setOffset] = useState(0);
|
|
1133
842
|
const [result, setResult] = useState(null);
|
|
1134
|
-
const [allProducts, setAllProducts] = useState(
|
|
1135
|
-
[]
|
|
1136
|
-
);
|
|
843
|
+
const [allProducts, setAllProducts] = useState([]);
|
|
1137
844
|
const [categories, setCategories] = useState([]);
|
|
1138
845
|
const [loading, setLoading] = useState(true);
|
|
1139
846
|
const [loadingMore, setLoadingMore] = useState(false);
|
|
@@ -1177,16 +884,7 @@ function StoreBrowsePage({
|
|
|
1177
884
|
return () => {
|
|
1178
885
|
cancelled = true;
|
|
1179
886
|
};
|
|
1180
|
-
}, [
|
|
1181
|
-
client,
|
|
1182
|
-
search,
|
|
1183
|
-
type,
|
|
1184
|
-
pricingModel,
|
|
1185
|
-
category,
|
|
1186
|
-
sortBy,
|
|
1187
|
-
compatibleWith,
|
|
1188
|
-
featured
|
|
1189
|
-
]);
|
|
887
|
+
}, [client, search, type, pricingModel, category, sortBy, compatibleWith, featured]);
|
|
1190
888
|
function loadMore() {
|
|
1191
889
|
const nextOffset = offset + PAGE_SIZE;
|
|
1192
890
|
setLoadingMore(true);
|
|
@@ -1362,8 +1060,7 @@ function StoreBrowsePage({
|
|
|
1362
1060
|
onClick: () => setFiltersOpen(!filtersOpen),
|
|
1363
1061
|
className: "lg:hidden h-10 px-4 rounded-lg border border-border bg-background text-sm text-foreground hover:bg-muted/50 transition-colors",
|
|
1364
1062
|
children: [
|
|
1365
|
-
"Filters",
|
|
1366
|
-
" ",
|
|
1063
|
+
"Filters ",
|
|
1367
1064
|
hasActiveFilters && /* @__PURE__ */ jsx("span", { className: "text-primary", children: "\u2022" })
|
|
1368
1065
|
]
|
|
1369
1066
|
}
|
|
@@ -1377,32 +1074,14 @@ function StoreBrowsePage({
|
|
|
1377
1074
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-4 flex-wrap", children: [
|
|
1378
1075
|
/* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: loading ? "Loading\u2026" : `${result?.totalCount ?? 0} results` }),
|
|
1379
1076
|
hasActiveFilters && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-1.5", children: [
|
|
1380
|
-
search && /* @__PURE__ */ jsx(
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
onRemove: () => {
|
|
1385
|
-
setSearch("");
|
|
1386
|
-
setInputValue("");
|
|
1387
|
-
}
|
|
1388
|
-
}
|
|
1389
|
-
),
|
|
1077
|
+
search && /* @__PURE__ */ jsx(Chip, { label: `"${search}"`, onRemove: () => {
|
|
1078
|
+
setSearch("");
|
|
1079
|
+
setInputValue("");
|
|
1080
|
+
} }),
|
|
1390
1081
|
type && /* @__PURE__ */ jsx(Chip, { label: type, onRemove: () => setType("") }),
|
|
1391
|
-
pricingModel && /* @__PURE__ */ jsx(
|
|
1392
|
-
Chip,
|
|
1393
|
-
{
|
|
1394
|
-
label: pricingModel,
|
|
1395
|
-
onRemove: () => setPricingModel("")
|
|
1396
|
-
}
|
|
1397
|
-
),
|
|
1082
|
+
pricingModel && /* @__PURE__ */ jsx(Chip, { label: pricingModel, onRemove: () => setPricingModel("") }),
|
|
1398
1083
|
category && /* @__PURE__ */ jsx(Chip, { label: category, onRemove: () => setCategory("") }),
|
|
1399
|
-
featured && /* @__PURE__ */ jsx(
|
|
1400
|
-
Chip,
|
|
1401
|
-
{
|
|
1402
|
-
label: "Featured",
|
|
1403
|
-
onRemove: () => setFeatured(false)
|
|
1404
|
-
}
|
|
1405
|
-
)
|
|
1084
|
+
featured && /* @__PURE__ */ jsx(Chip, { label: "Featured", onRemove: () => setFeatured(false) })
|
|
1406
1085
|
] })
|
|
1407
1086
|
] }),
|
|
1408
1087
|
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(
|
|
@@ -1454,97 +1133,9 @@ function StoreBrowsePage({
|
|
|
1454
1133
|
function Chip({ label, onRemove }) {
|
|
1455
1134
|
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: [
|
|
1456
1135
|
label,
|
|
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
|
-
)
|
|
1136
|
+
/* @__PURE__ */ jsx("button", { type: "button", onClick: onRemove, "aria-label": `Remove ${label}`, className: "hover:opacity-70", children: "\xD7" })
|
|
1467
1137
|
] });
|
|
1468
1138
|
}
|
|
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
|
-
}
|
|
1548
1139
|
var ANIM_STYLES = `
|
|
1549
1140
|
@keyframes sdFadeUp {
|
|
1550
1141
|
from { opacity: 0; transform: translateY(16px); }
|
|
@@ -1577,11 +1168,50 @@ var ANIM_STYLES = `
|
|
|
1577
1168
|
.sd-d5 { animation-delay: 320ms; }
|
|
1578
1169
|
.sd-d6 { animation-delay: 400ms; }
|
|
1579
1170
|
`;
|
|
1580
|
-
function
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
})
|
|
1171
|
+
function mdInline(text) {
|
|
1172
|
+
const parts = text.split(/(\*\*[^*]+\*\*)/g);
|
|
1173
|
+
if (parts.length === 1) return text;
|
|
1174
|
+
return /* @__PURE__ */ jsx(Fragment, { children: parts.map(
|
|
1175
|
+
(part, i) => part.startsWith("**") && part.endsWith("**") ? /* @__PURE__ */ jsx("strong", { className: "font-semibold text-foreground", children: part.slice(2, -2) }, i) : part || null
|
|
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 }) {
|
|
1585
1215
|
const pct = total > 0 ? Math.round(count / total * 100) : 0;
|
|
1586
1216
|
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground", children: [
|
|
1587
1217
|
/* @__PURE__ */ jsx("span", { className: "w-12 text-right shrink-0", children: label }),
|
|
@@ -1597,63 +1227,12 @@ function RatingBar({
|
|
|
1597
1227
|
}
|
|
1598
1228
|
function IconBlock({ src }) {
|
|
1599
1229
|
return /* @__PURE__ */ jsxs("div", { className: "relative flex-shrink-0", children: [
|
|
1600
|
-
/* @__PURE__ */ jsx(
|
|
1601
|
-
|
|
1602
|
-
{
|
|
1603
|
-
|
|
1604
|
-
|
|
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
|
-
) }) })
|
|
1230
|
+
/* @__PURE__ */ jsx("div", { className: "sd-gp absolute -inset-1.5 rounded-2xl bg-primary/30 blur-md pointer-events-none", "aria-hidden": "true" }),
|
|
1231
|
+
/* @__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("img", { src, alt: "", "aria-hidden": true, className: "w-full h-full object-cover" }) : /* @__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("svg", { viewBox: "0 0 40 40", className: "w-10 h-10", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [
|
|
1232
|
+
/* @__PURE__ */ jsx("polygon", { points: "20,4 34,11 20,18 6,11", className: "fill-primary/40", stroke: "currentColor", strokeWidth: "0.6", strokeOpacity: "0.4" }),
|
|
1233
|
+
/* @__PURE__ */ jsx("polygon", { points: "6,11 20,18 20,34 6,27", className: "fill-primary/20", stroke: "currentColor", strokeWidth: "0.6", strokeOpacity: "0.4" }),
|
|
1234
|
+
/* @__PURE__ */ jsx("polygon", { points: "34,11 20,18 20,34 34,27", className: "fill-primary/30", stroke: "currentColor", strokeWidth: "0.6", strokeOpacity: "0.4" })
|
|
1235
|
+
] }) }) })
|
|
1657
1236
|
] });
|
|
1658
1237
|
}
|
|
1659
1238
|
function StoreProductDetailPage({
|
|
@@ -1669,7 +1248,6 @@ function StoreProductDetailPage({
|
|
|
1669
1248
|
const [error, setError] = useState(null);
|
|
1670
1249
|
const [activeScreenshot, setActiveScreenshot] = useState(0);
|
|
1671
1250
|
const [screenshotKey, setScreenshotKey] = useState(0);
|
|
1672
|
-
const [embedFailed, setEmbedFailed] = useState(false);
|
|
1673
1251
|
useEffect(() => {
|
|
1674
1252
|
if (!slug && !id) {
|
|
1675
1253
|
setError("Product not found.");
|
|
@@ -1723,30 +1301,11 @@ function StoreProductDetailPage({
|
|
|
1723
1301
|
if (error || !details) {
|
|
1724
1302
|
return /* @__PURE__ */ jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 text-center", children: [
|
|
1725
1303
|
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground mb-4", children: error ?? "Product not found." }),
|
|
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
|
-
)
|
|
1304
|
+
/* @__PURE__ */ jsx("button", { type: "button", onClick: () => navigate("/store"), className: "text-sm text-primary hover:underline", children: "Back to Store" })
|
|
1735
1305
|
] });
|
|
1736
1306
|
}
|
|
1737
|
-
const {
|
|
1738
|
-
|
|
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
|
-
);
|
|
1307
|
+
const { product, publisher, reviews, reviewsCount, relatedProducts, ratingDistribution } = details;
|
|
1308
|
+
const priceLabel = formatPrice(product.price, product.currency, product.pricingModel);
|
|
1750
1309
|
const screenshots = product.screenshots ?? [];
|
|
1751
1310
|
const totalRatings = ratingDistribution ? ratingDistribution.fiveStars + ratingDistribution.fourStars + ratingDistribution.threeStars + ratingDistribution.twoStars + ratingDistribution.oneStar : 0;
|
|
1752
1311
|
return /* @__PURE__ */ jsxs("div", { className: "w-full", children: [
|
|
@@ -1760,60 +1319,15 @@ function StoreProductDetailPage({
|
|
|
1760
1319
|
}
|
|
1761
1320
|
),
|
|
1762
1321
|
/* @__PURE__ */ jsxs("div", { className: "relative overflow-hidden", children: [
|
|
1763
|
-
/* @__PURE__ */ jsx(
|
|
1764
|
-
|
|
1765
|
-
{
|
|
1766
|
-
|
|
1767
|
-
|
|
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
|
-
),
|
|
1322
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-b from-primary/[0.07] via-background to-background pointer-events-none", "aria-hidden": "true" }),
|
|
1323
|
+
/* @__PURE__ */ jsxs("svg", { className: "absolute inset-0 w-full h-full opacity-[0.04] pointer-events-none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [
|
|
1324
|
+
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("pattern", { id: "sd-grid", width: "40", height: "40", patternUnits: "userSpaceOnUse", children: /* @__PURE__ */ jsx("path", { d: "M 40 0 L 0 0 0 40", fill: "none", stroke: "currentColor", strokeWidth: "1" }) }) }),
|
|
1325
|
+
/* @__PURE__ */ jsx("rect", { width: "100%", height: "100%", fill: "url(#sd-grid)" })
|
|
1326
|
+
] }),
|
|
1327
|
+
/* @__PURE__ */ jsx("div", { className: "absolute -top-12 -left-12 w-72 h-72 rounded-full bg-primary/10 blur-3xl pointer-events-none", "aria-hidden": "true" }),
|
|
1806
1328
|
/* @__PURE__ */ jsxs("div", { className: "relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 pt-6 pb-8", children: [
|
|
1807
1329
|
/* @__PURE__ */ jsxs("nav", { className: "sd-fi text-sm text-muted-foreground mb-6 flex items-center gap-1.5 flex-wrap", children: [
|
|
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
|
-
),
|
|
1330
|
+
/* @__PURE__ */ jsx("button", { type: "button", onClick: () => navigate("/store"), className: "hover:text-primary transition-colors", children: "Store" }),
|
|
1817
1331
|
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\u203A" }),
|
|
1818
1332
|
product.category && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1819
1333
|
/* @__PURE__ */ jsx(
|
|
@@ -1879,14 +1393,6 @@ function StoreProductDetailPage({
|
|
|
1879
1393
|
}
|
|
1880
1394
|
)
|
|
1881
1395
|
] }),
|
|
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
|
-
) }),
|
|
1890
1396
|
screenshots.length > 0 && /* @__PURE__ */ jsxs("div", { className: "sd-fu sd-d3 mb-8", children: [
|
|
1891
1397
|
/* @__PURE__ */ jsx("div", { className: "rounded-xl overflow-hidden bg-muted aspect-video mb-3 shadow-md", children: /* @__PURE__ */ jsx(
|
|
1892
1398
|
"img",
|
|
@@ -1903,33 +1409,19 @@ function StoreProductDetailPage({
|
|
|
1903
1409
|
type: "button",
|
|
1904
1410
|
onClick: () => switchScreenshot(i),
|
|
1905
1411
|
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"}`,
|
|
1906
|
-
children: /* @__PURE__ */ jsx(
|
|
1907
|
-
"img",
|
|
1908
|
-
{
|
|
1909
|
-
src,
|
|
1910
|
-
alt: `Thumbnail ${i + 1}`,
|
|
1911
|
-
className: "w-full h-full object-cover"
|
|
1912
|
-
}
|
|
1913
|
-
)
|
|
1412
|
+
children: /* @__PURE__ */ jsx("img", { src, alt: `Thumbnail ${i + 1}`, className: "w-full h-full object-cover" })
|
|
1914
1413
|
},
|
|
1915
1414
|
i
|
|
1916
1415
|
)) })
|
|
1917
1416
|
] }),
|
|
1918
1417
|
product.longDescription && /* @__PURE__ */ jsxs("div", { className: "sd-fu sd-d4 mb-8", children: [
|
|
1919
1418
|
/* @__PURE__ */ jsx("h2", { className: "text-lg font-bold text-foreground mb-3", children: "About" }),
|
|
1920
|
-
/* @__PURE__ */ jsx("div", { className: "
|
|
1419
|
+
/* @__PURE__ */ jsx("div", { className: "text-muted-foreground", children: /* @__PURE__ */ jsx(MdAbout, { content: product.longDescription }) })
|
|
1921
1420
|
] }),
|
|
1922
1421
|
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: [
|
|
1923
1422
|
/* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold text-foreground mb-3", children: "Publisher" }),
|
|
1924
1423
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
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() }),
|
|
1424
|
+
publisher.logoUrl ? /* @__PURE__ */ jsx("img", { src: publisher.logoUrl, alt: publisher.name, className: "w-10 h-10 rounded-full object-cover" }) : /* @__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() }),
|
|
1933
1425
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1934
1426
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
1935
1427
|
/* @__PURE__ */ jsx("span", { className: "font-semibold text-foreground text-sm", children: publisher.name }),
|
|
@@ -1955,46 +1447,11 @@ function StoreProductDetailPage({
|
|
|
1955
1447
|
] })
|
|
1956
1448
|
] }),
|
|
1957
1449
|
/* @__PURE__ */ jsxs("div", { className: "flex-1 space-y-1.5 pt-1", children: [
|
|
1958
|
-
/* @__PURE__ */ jsx(
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
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
|
-
)
|
|
1450
|
+
/* @__PURE__ */ jsx(RatingBar, { label: "5 \u2605", count: ratingDistribution.fiveStars, total: totalRatings }),
|
|
1451
|
+
/* @__PURE__ */ jsx(RatingBar, { label: "4 \u2605", count: ratingDistribution.fourStars, total: totalRatings }),
|
|
1452
|
+
/* @__PURE__ */ jsx(RatingBar, { label: "3 \u2605", count: ratingDistribution.threeStars, total: totalRatings }),
|
|
1453
|
+
/* @__PURE__ */ jsx(RatingBar, { label: "2 \u2605", count: ratingDistribution.twoStars, total: totalRatings }),
|
|
1454
|
+
/* @__PURE__ */ jsx(RatingBar, { label: "1 \u2605", count: ratingDistribution.oneStar, total: totalRatings })
|
|
1998
1455
|
] })
|
|
1999
1456
|
] }),
|
|
2000
1457
|
/* @__PURE__ */ jsx("div", { className: "space-y-3", children: reviews.slice(0, 5).map((review, idx) => /* @__PURE__ */ jsxs(
|
|
@@ -2009,14 +1466,11 @@ function StoreProductDetailPage({
|
|
|
2009
1466
|
] }),
|
|
2010
1467
|
review.title && /* @__PURE__ */ jsx("p", { className: "font-semibold text-sm text-foreground mb-1", children: review.title }),
|
|
2011
1468
|
review.comment && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: review.comment }),
|
|
2012
|
-
review.createdAt && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground mt-2", children: new Date(review.createdAt).toLocaleDateString(
|
|
2013
|
-
"
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
day: "numeric"
|
|
2018
|
-
}
|
|
2019
|
-
) })
|
|
1469
|
+
review.createdAt && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground mt-2", children: new Date(review.createdAt).toLocaleDateString("en-US", {
|
|
1470
|
+
year: "numeric",
|
|
1471
|
+
month: "short",
|
|
1472
|
+
day: "numeric"
|
|
1473
|
+
}) })
|
|
2020
1474
|
]
|
|
2021
1475
|
},
|
|
2022
1476
|
review.id
|
|
@@ -2036,13 +1490,7 @@ function StoreProductDetailPage({
|
|
|
2036
1490
|
] }),
|
|
2037
1491
|
/* @__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: [
|
|
2038
1492
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
2039
|
-
/* @__PURE__ */ jsx(
|
|
2040
|
-
"div",
|
|
2041
|
-
{
|
|
2042
|
-
className: `text-3xl font-extrabold ${priceLabel === "Free" ? "text-emerald-500" : "text-foreground"}`,
|
|
2043
|
-
children: priceLabel
|
|
2044
|
-
}
|
|
2045
|
-
),
|
|
1493
|
+
/* @__PURE__ */ jsx("div", { className: `text-3xl font-extrabold ${priceLabel === "Free" ? "text-emerald-500" : "text-foreground"}`, children: priceLabel }),
|
|
2046
1494
|
product.pricingModel === "SUBSCRIPTION" && /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: "per month" })
|
|
2047
1495
|
] }),
|
|
2048
1496
|
/* @__PURE__ */ jsx(
|
|
@@ -2095,6 +1543,6 @@ function StoreProductDetailPage({
|
|
|
2095
1543
|
] });
|
|
2096
1544
|
}
|
|
2097
1545
|
|
|
2098
|
-
export { ProductCard, StarRating, StoreBrowsePage, StoreHomePage, StoreProductDetailPage, TypeBadge,
|
|
1546
|
+
export { ProductCard, StarRating, StoreBrowsePage, StoreHomePage, StoreProductDetailPage, TypeBadge, formatDownloads, formatPrice };
|
|
2099
1547
|
//# sourceMappingURL=index.mjs.map
|
|
2100
1548
|
//# sourceMappingURL=index.mjs.map
|