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