@snowcone-app/ui 0.4.6 → 0.4.8
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/CHANGELOG.md +15 -0
- package/dist/index.cjs +890 -859
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.js +357 -328
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/composed/HeroProductImage.tsx +10 -0
- package/src/index.ts +7 -0
- package/src/patterns/MockupBackground.tsx +43 -0
- package/src/patterns/RealtimeProvider.tsx +13 -1
package/dist/index.js
CHANGED
|
@@ -5549,8 +5549,8 @@ import { useRef as useRef13, useEffect as useEffect18, useMemo as useMemo8, useS
|
|
|
5549
5549
|
|
|
5550
5550
|
// src/patterns/RealtimeProvider.tsx
|
|
5551
5551
|
import {
|
|
5552
|
-
createContext as
|
|
5553
|
-
useContext as
|
|
5552
|
+
createContext as createContext8,
|
|
5553
|
+
useContext as useContext6,
|
|
5554
5554
|
useState as useState17,
|
|
5555
5555
|
useEffect as useEffect17,
|
|
5556
5556
|
useCallback as useCallback10,
|
|
@@ -5559,10 +5559,23 @@ import {
|
|
|
5559
5559
|
} from "react";
|
|
5560
5560
|
import { useRealtimeMockup as useRealtimeMockup2 } from "@snowcone-app/sdk/react";
|
|
5561
5561
|
import { resolveVariantId as resolveVariantIdUtil } from "@snowcone-app/sdk";
|
|
5562
|
+
|
|
5563
|
+
// src/patterns/MockupBackground.tsx
|
|
5564
|
+
import { createContext as createContext7, useContext as useContext5 } from "react";
|
|
5562
5565
|
import { jsx as jsx51 } from "react/jsx-runtime";
|
|
5566
|
+
var MockupBackgroundContext = createContext7(void 0);
|
|
5567
|
+
function MockupBackground({ bg, children }) {
|
|
5568
|
+
return /* @__PURE__ */ jsx51(MockupBackgroundContext.Provider, { value: bg, children });
|
|
5569
|
+
}
|
|
5570
|
+
function useMockupBackgroundOptional() {
|
|
5571
|
+
return useContext5(MockupBackgroundContext);
|
|
5572
|
+
}
|
|
5573
|
+
|
|
5574
|
+
// src/patterns/RealtimeProvider.tsx
|
|
5575
|
+
import { jsx as jsx52 } from "react/jsx-runtime";
|
|
5563
5576
|
var DEFAULT_ARTBOARD_SIZE = 2e3;
|
|
5564
5577
|
var MAX_CONCURRENT_BLOBS = 5;
|
|
5565
|
-
var RealtimeContext =
|
|
5578
|
+
var RealtimeContext = createContext8(
|
|
5566
5579
|
void 0
|
|
5567
5580
|
);
|
|
5568
5581
|
function RealtimeProvider({
|
|
@@ -5576,6 +5589,7 @@ function RealtimeProvider({
|
|
|
5576
5589
|
grantUrl
|
|
5577
5590
|
}) {
|
|
5578
5591
|
const productContext = useProductOptional();
|
|
5592
|
+
const mockupBg = useMockupBackgroundOptional();
|
|
5579
5593
|
const [isEnabled, setIsEnabled] = useState17(autoEnable);
|
|
5580
5594
|
const useSessionGrant = Boolean(shop && grantUrl);
|
|
5581
5595
|
const getToken = useCallback10(async () => {
|
|
@@ -5596,6 +5610,7 @@ function RealtimeProvider({
|
|
|
5596
5610
|
const configSentRef = useRef12(false);
|
|
5597
5611
|
const placementSettingsOverridesRef = useRef12({});
|
|
5598
5612
|
const lastSentVariantIdRef = useRef12(null);
|
|
5613
|
+
const lastSentBgRef = useRef12(void 0);
|
|
5599
5614
|
const lastSentColorsRef = useRef12({});
|
|
5600
5615
|
const realtimeMockup = useRealtimeMockup2({
|
|
5601
5616
|
wsUrl,
|
|
@@ -5781,6 +5796,7 @@ function RealtimeProvider({
|
|
|
5781
5796
|
disconnect();
|
|
5782
5797
|
configSentRef.current = false;
|
|
5783
5798
|
lastSentVariantIdRef.current = null;
|
|
5799
|
+
lastSentBgRef.current = void 0;
|
|
5784
5800
|
lastSentColorsRef.current = {};
|
|
5785
5801
|
};
|
|
5786
5802
|
}
|
|
@@ -5802,7 +5818,8 @@ function RealtimeProvider({
|
|
|
5802
5818
|
);
|
|
5803
5819
|
const isFirstSend = !configSentRef.current;
|
|
5804
5820
|
const variantChanged = lastSentVariantIdRef.current !== null && lastSentVariantIdRef.current !== variantId;
|
|
5805
|
-
|
|
5821
|
+
const bgChanged = configSentRef.current && lastSentBgRef.current !== mockupBg;
|
|
5822
|
+
if (!isFirstSend && !variantChanged && !bgChanged) {
|
|
5806
5823
|
return;
|
|
5807
5824
|
}
|
|
5808
5825
|
const mockupIds = [];
|
|
@@ -5819,6 +5836,7 @@ function RealtimeProvider({
|
|
|
5819
5836
|
variantId,
|
|
5820
5837
|
shop,
|
|
5821
5838
|
width: mockupWidth,
|
|
5839
|
+
...mockupBg ? { bg: mockupBg } : {},
|
|
5822
5840
|
placementSettings: { ...placementSettingsOverridesRef.current }
|
|
5823
5841
|
} : {
|
|
5824
5842
|
productId,
|
|
@@ -5827,6 +5845,7 @@ function RealtimeProvider({
|
|
|
5827
5845
|
shop: "hTidnpNnNa",
|
|
5828
5846
|
seal: "bypass-sig-for-k6-load-test",
|
|
5829
5847
|
width: mockupWidth,
|
|
5848
|
+
...mockupBg ? { bg: mockupBg } : {},
|
|
5830
5849
|
placementSettings: { ...placementSettingsOverridesRef.current }
|
|
5831
5850
|
};
|
|
5832
5851
|
if (variantChanged) {
|
|
@@ -5838,6 +5857,7 @@ function RealtimeProvider({
|
|
|
5838
5857
|
sendConfigRaw(configPayload);
|
|
5839
5858
|
configSentRef.current = true;
|
|
5840
5859
|
lastSentVariantIdRef.current = variantId;
|
|
5860
|
+
lastSentBgRef.current = mockupBg;
|
|
5841
5861
|
setTimeout(() => {
|
|
5842
5862
|
const colorPlacements = placements.filter((p) => p.type === "color");
|
|
5843
5863
|
colorPlacements.forEach((p) => {
|
|
@@ -5855,7 +5875,8 @@ function RealtimeProvider({
|
|
|
5855
5875
|
productContext?.selection,
|
|
5856
5876
|
sendConfigRaw,
|
|
5857
5877
|
sendColorBlobTracked,
|
|
5858
|
-
mockupWidth
|
|
5878
|
+
mockupWidth,
|
|
5879
|
+
mockupBg
|
|
5859
5880
|
]);
|
|
5860
5881
|
useEffect17(() => {
|
|
5861
5882
|
if (!isEnabled || !isConnected || !isConfigured || !productContext?.product)
|
|
@@ -6223,17 +6244,17 @@ function RealtimeProvider({
|
|
|
6223
6244
|
registerBlobUrl
|
|
6224
6245
|
]
|
|
6225
6246
|
);
|
|
6226
|
-
return /* @__PURE__ */
|
|
6247
|
+
return /* @__PURE__ */ jsx52(RealtimeContext.Provider, { value: contextValue, children });
|
|
6227
6248
|
}
|
|
6228
6249
|
function useRealtime() {
|
|
6229
|
-
const context =
|
|
6250
|
+
const context = useContext6(RealtimeContext);
|
|
6230
6251
|
if (!context) {
|
|
6231
6252
|
throw new Error("useRealtime must be used within a RealtimeProvider");
|
|
6232
6253
|
}
|
|
6233
6254
|
return context;
|
|
6234
6255
|
}
|
|
6235
6256
|
function useRealtimeOptional() {
|
|
6236
|
-
return
|
|
6257
|
+
return useContext6(RealtimeContext);
|
|
6237
6258
|
}
|
|
6238
6259
|
|
|
6239
6260
|
// src/hooks/useCanvasContext.ts
|
|
@@ -7043,19 +7064,19 @@ import { useCallback as useCallback15, useMemo as useMemo10 } from "react";
|
|
|
7043
7064
|
|
|
7044
7065
|
// src/patterns/MockupPriorityProvider.tsx
|
|
7045
7066
|
import {
|
|
7046
|
-
createContext as
|
|
7047
|
-
useContext as
|
|
7067
|
+
createContext as createContext9,
|
|
7068
|
+
useContext as useContext7,
|
|
7048
7069
|
useCallback as useCallback14,
|
|
7049
7070
|
useRef as useRef18,
|
|
7050
7071
|
useMemo as useMemo9,
|
|
7051
7072
|
useState as useState23,
|
|
7052
7073
|
useEffect as useEffect23
|
|
7053
7074
|
} from "react";
|
|
7054
|
-
import { jsx as
|
|
7075
|
+
import { jsx as jsx53 } from "react/jsx-runtime";
|
|
7055
7076
|
var MAX_LEVEL3_PREFETCH = 5;
|
|
7056
7077
|
var PRIORITY_RECALC_DEBOUNCE_MS = 50;
|
|
7057
7078
|
var PRELOAD_MARGIN_PX = 750;
|
|
7058
|
-
var MockupPriorityContext =
|
|
7079
|
+
var MockupPriorityContext = createContext9(
|
|
7059
7080
|
void 0
|
|
7060
7081
|
);
|
|
7061
7082
|
function MockupPriorityProvider({ children }) {
|
|
@@ -7635,10 +7656,10 @@ function MockupPriorityProvider({ children }) {
|
|
|
7635
7656
|
subscribeLevel1Change
|
|
7636
7657
|
]
|
|
7637
7658
|
);
|
|
7638
|
-
return /* @__PURE__ */
|
|
7659
|
+
return /* @__PURE__ */ jsx53(MockupPriorityContext.Provider, { value: contextValue, children });
|
|
7639
7660
|
}
|
|
7640
7661
|
function useMockupPriority() {
|
|
7641
|
-
const context =
|
|
7662
|
+
const context = useContext7(MockupPriorityContext);
|
|
7642
7663
|
if (!context) {
|
|
7643
7664
|
throw new Error(
|
|
7644
7665
|
"useMockupPriority must be used within a MockupPriorityProvider"
|
|
@@ -7647,7 +7668,7 @@ function useMockupPriority() {
|
|
|
7647
7668
|
return context;
|
|
7648
7669
|
}
|
|
7649
7670
|
function useMockupPriorityOptional() {
|
|
7650
|
-
return
|
|
7671
|
+
return useContext7(MockupPriorityContext);
|
|
7651
7672
|
}
|
|
7652
7673
|
|
|
7653
7674
|
// src/hooks/useProductPage.ts
|
|
@@ -8373,8 +8394,8 @@ var CanvasExportService = class _CanvasExportService {
|
|
|
8373
8394
|
var canvasExportService = new CanvasExportService();
|
|
8374
8395
|
|
|
8375
8396
|
// src/components/CanvasIsolationBoundary.tsx
|
|
8376
|
-
import
|
|
8377
|
-
import { Fragment as Fragment9, jsx as
|
|
8397
|
+
import React41, { useEffect as useEffect26 } from "react";
|
|
8398
|
+
import { Fragment as Fragment9, jsx as jsx54, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
8378
8399
|
function CanvasIsolationConfigurator({
|
|
8379
8400
|
placementName: placementNameProp,
|
|
8380
8401
|
onArtworkChange,
|
|
@@ -8421,9 +8442,9 @@ function CanvasIsolationConfigurator({
|
|
|
8421
8442
|
}, []);
|
|
8422
8443
|
return null;
|
|
8423
8444
|
}
|
|
8424
|
-
var IsolatedChildren =
|
|
8445
|
+
var IsolatedChildren = React41.memo(
|
|
8425
8446
|
function IsolatedChildren2({ children }) {
|
|
8426
|
-
return /* @__PURE__ */
|
|
8447
|
+
return /* @__PURE__ */ jsx54(Fragment9, { children });
|
|
8427
8448
|
},
|
|
8428
8449
|
// Custom comparison: ALWAYS return true (never re-render due to parent changes)
|
|
8429
8450
|
// This is intentional - children should use refs/services for updates that need to bypass this
|
|
@@ -8437,7 +8458,7 @@ function CanvasIsolationBoundary({
|
|
|
8437
8458
|
serializeStateForServer
|
|
8438
8459
|
}) {
|
|
8439
8460
|
return /* @__PURE__ */ jsxs33(Fragment9, { children: [
|
|
8440
|
-
/* @__PURE__ */
|
|
8461
|
+
/* @__PURE__ */ jsx54(
|
|
8441
8462
|
CanvasIsolationConfigurator,
|
|
8442
8463
|
{
|
|
8443
8464
|
placementName,
|
|
@@ -8446,7 +8467,7 @@ function CanvasIsolationBoundary({
|
|
|
8446
8467
|
serializeStateForServer
|
|
8447
8468
|
}
|
|
8448
8469
|
),
|
|
8449
|
-
/* @__PURE__ */
|
|
8470
|
+
/* @__PURE__ */ jsx54(IsolatedChildren, { children })
|
|
8450
8471
|
] });
|
|
8451
8472
|
}
|
|
8452
8473
|
function useIsolatedCanvas() {
|
|
@@ -8470,7 +8491,7 @@ function useIsolatedCanvas() {
|
|
|
8470
8491
|
|
|
8471
8492
|
// src/components/LoadingOverlayPrism.tsx
|
|
8472
8493
|
import { useState as useState26, useEffect as useEffect27, useCallback as useCallback16, useRef as useRef19 } from "react";
|
|
8473
|
-
import { jsx as
|
|
8494
|
+
import { jsx as jsx55, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
8474
8495
|
function generateParticles() {
|
|
8475
8496
|
return Array.from({ length: 16 }, () => ({
|
|
8476
8497
|
left: 10 + Math.random() * 80,
|
|
@@ -8614,13 +8635,13 @@ function LoadingOverlayPrism({
|
|
|
8614
8635
|
onTransitionEnd: handleTransitionEnd,
|
|
8615
8636
|
children: [
|
|
8616
8637
|
/* @__PURE__ */ jsxs34("div", { className: "prism-loading-rainbow", children: [
|
|
8617
|
-
/* @__PURE__ */
|
|
8618
|
-
/* @__PURE__ */
|
|
8619
|
-
/* @__PURE__ */
|
|
8620
|
-
/* @__PURE__ */
|
|
8621
|
-
/* @__PURE__ */
|
|
8638
|
+
/* @__PURE__ */ jsx55("div", { className: "prism-loading-band" }),
|
|
8639
|
+
/* @__PURE__ */ jsx55("div", { className: "prism-loading-band" }),
|
|
8640
|
+
/* @__PURE__ */ jsx55("div", { className: "prism-loading-band" }),
|
|
8641
|
+
/* @__PURE__ */ jsx55("div", { className: "prism-loading-band" }),
|
|
8642
|
+
/* @__PURE__ */ jsx55("div", { className: "prism-loading-band" })
|
|
8622
8643
|
] }),
|
|
8623
|
-
particles.map((p, i) => /* @__PURE__ */
|
|
8644
|
+
particles.map((p, i) => /* @__PURE__ */ jsx55(
|
|
8624
8645
|
"div",
|
|
8625
8646
|
{
|
|
8626
8647
|
className: "prism-loading-particle",
|
|
@@ -8682,7 +8703,7 @@ import {
|
|
|
8682
8703
|
useCallback as useCallback17
|
|
8683
8704
|
} from "react";
|
|
8684
8705
|
import { createPortal as createPortal2 } from "react-dom";
|
|
8685
|
-
import { Fragment as Fragment10, jsx as
|
|
8706
|
+
import { Fragment as Fragment10, jsx as jsx56, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
8686
8707
|
var BANDS = [
|
|
8687
8708
|
{ rgb: "230, 45, 55", delay: "-0.0s" },
|
|
8688
8709
|
// red
|
|
@@ -8863,8 +8884,8 @@ function CandyVisual({
|
|
|
8863
8884
|
style,
|
|
8864
8885
|
onTransitionEnd,
|
|
8865
8886
|
children: [
|
|
8866
|
-
BANDS.map((_, i) => /* @__PURE__ */
|
|
8867
|
-
particles.map((p, i) => /* @__PURE__ */
|
|
8887
|
+
BANDS.map((_, i) => /* @__PURE__ */ jsx56("div", { className: "candy-band" }, `b-${i}`)),
|
|
8888
|
+
particles.map((p, i) => /* @__PURE__ */ jsx56(
|
|
8868
8889
|
"div",
|
|
8869
8890
|
{
|
|
8870
8891
|
className: "candy-particle",
|
|
@@ -8930,7 +8951,7 @@ var LoadingOverlayPrismCandy = memo2(function LoadingOverlayPrismCandy2({
|
|
|
8930
8951
|
if (!visible) fadeClass = "candy-fade-out";
|
|
8931
8952
|
else if (mounted) fadeClass = "candy-fade-in";
|
|
8932
8953
|
return /* @__PURE__ */ jsxs35(Fragment10, { children: [
|
|
8933
|
-
/* @__PURE__ */
|
|
8954
|
+
/* @__PURE__ */ jsx56(
|
|
8934
8955
|
"div",
|
|
8935
8956
|
{
|
|
8936
8957
|
ref: anchorRef,
|
|
@@ -8943,7 +8964,7 @@ var LoadingOverlayPrismCandy = memo2(function LoadingOverlayPrismCandy2({
|
|
|
8943
8964
|
}
|
|
8944
8965
|
),
|
|
8945
8966
|
bounds && typeof document !== "undefined" && createPortal2(
|
|
8946
|
-
/* @__PURE__ */
|
|
8967
|
+
/* @__PURE__ */ jsx56(
|
|
8947
8968
|
CandyVisual,
|
|
8948
8969
|
{
|
|
8949
8970
|
fadeClass,
|
|
@@ -8984,7 +9005,7 @@ var LoadingOverlayPrismCandyInline = memo2(
|
|
|
8984
9005
|
let fadeClass = "";
|
|
8985
9006
|
if (!visible) fadeClass = "candy-fade-out";
|
|
8986
9007
|
else if (mounted) fadeClass = "candy-fade-in";
|
|
8987
|
-
return /* @__PURE__ */
|
|
9008
|
+
return /* @__PURE__ */ jsx56(
|
|
8988
9009
|
CandyVisual,
|
|
8989
9010
|
{
|
|
8990
9011
|
fadeClass,
|
|
@@ -9005,7 +9026,7 @@ import { useRealtimeMockup as useRealtimeMockup3 } from "@snowcone-app/sdk/react
|
|
|
9005
9026
|
import { getProduct as getProduct3, listProducts as listProducts4, getMockupUrl as getMockupUrl2 } from "@snowcone-app/sdk";
|
|
9006
9027
|
|
|
9007
9028
|
// src/patterns/ProductPageProvider.tsx
|
|
9008
|
-
import { jsx as
|
|
9029
|
+
import { jsx as jsx57 } from "react/jsx-runtime";
|
|
9009
9030
|
function ProductPageProvider({
|
|
9010
9031
|
children,
|
|
9011
9032
|
productId,
|
|
@@ -9019,12 +9040,12 @@ function ProductPageProvider({
|
|
|
9019
9040
|
realtimeGrantUrl,
|
|
9020
9041
|
enablePriority = true
|
|
9021
9042
|
}) {
|
|
9022
|
-
let content = /* @__PURE__ */
|
|
9043
|
+
let content = /* @__PURE__ */ jsx57(Product, { productId, productData, children });
|
|
9023
9044
|
if (enablePriority) {
|
|
9024
|
-
content = /* @__PURE__ */
|
|
9045
|
+
content = /* @__PURE__ */ jsx57(MockupPriorityProvider, { children: content });
|
|
9025
9046
|
}
|
|
9026
9047
|
if (enableRealtime) {
|
|
9027
|
-
content = /* @__PURE__ */
|
|
9048
|
+
content = /* @__PURE__ */ jsx57(
|
|
9028
9049
|
RealtimeProvider,
|
|
9029
9050
|
{
|
|
9030
9051
|
wsUrl: realtimeWsUrl,
|
|
@@ -9034,7 +9055,7 @@ function ProductPageProvider({
|
|
|
9034
9055
|
}
|
|
9035
9056
|
);
|
|
9036
9057
|
}
|
|
9037
|
-
return /* @__PURE__ */
|
|
9058
|
+
return /* @__PURE__ */ jsx57(
|
|
9038
9059
|
Shop,
|
|
9039
9060
|
{
|
|
9040
9061
|
endpoint,
|
|
@@ -9054,14 +9075,14 @@ function ProductPageProviderMinimal({
|
|
|
9054
9075
|
shop,
|
|
9055
9076
|
initialArtwork
|
|
9056
9077
|
}) {
|
|
9057
|
-
return /* @__PURE__ */
|
|
9078
|
+
return /* @__PURE__ */ jsx57(
|
|
9058
9079
|
Shop,
|
|
9059
9080
|
{
|
|
9060
9081
|
endpoint,
|
|
9061
9082
|
mockupUrl,
|
|
9062
9083
|
shop,
|
|
9063
9084
|
initialArtwork,
|
|
9064
|
-
children: /* @__PURE__ */
|
|
9085
|
+
children: /* @__PURE__ */ jsx57(Product, { productId, productData, children })
|
|
9065
9086
|
}
|
|
9066
9087
|
);
|
|
9067
9088
|
}
|
|
@@ -9078,7 +9099,7 @@ import {
|
|
|
9078
9099
|
describeProductArtAlignment,
|
|
9079
9100
|
getSnapPoints
|
|
9080
9101
|
} from "@snowcone-app/sdk";
|
|
9081
|
-
import { Fragment as Fragment11, jsx as
|
|
9102
|
+
import { Fragment as Fragment11, jsx as jsx58, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
9082
9103
|
function ArtAlignment({
|
|
9083
9104
|
src: propSrc,
|
|
9084
9105
|
artworkAspectRatio: propAspectRatio,
|
|
@@ -9416,7 +9437,7 @@ function ArtAlignment({
|
|
|
9416
9437
|
if (!descriptor) {
|
|
9417
9438
|
return null;
|
|
9418
9439
|
}
|
|
9419
|
-
return /* @__PURE__ */
|
|
9440
|
+
return /* @__PURE__ */ jsx58(
|
|
9420
9441
|
"div",
|
|
9421
9442
|
{
|
|
9422
9443
|
className: `relative ${className || ""}`,
|
|
@@ -9425,8 +9446,8 @@ function ArtAlignment({
|
|
|
9425
9446
|
width: "fit-content",
|
|
9426
9447
|
maxWidth: "100%"
|
|
9427
9448
|
},
|
|
9428
|
-
children: /* @__PURE__ */
|
|
9429
|
-
/* @__PURE__ */
|
|
9449
|
+
children: /* @__PURE__ */ jsx58("div", { className: "overflow-hidden p-1", children: /* @__PURE__ */ jsxs36("div", { ref: containerRef, className: "relative", style: containerStyle, children: [
|
|
9450
|
+
/* @__PURE__ */ jsx58(
|
|
9430
9451
|
"img",
|
|
9431
9452
|
{
|
|
9432
9453
|
ref: imageRef,
|
|
@@ -9452,8 +9473,8 @@ function ArtAlignment({
|
|
|
9452
9473
|
}
|
|
9453
9474
|
),
|
|
9454
9475
|
isReady && maskDimensions.width > 0 && /* @__PURE__ */ jsxs36(Fragment11, { children: [
|
|
9455
|
-
/* @__PURE__ */
|
|
9456
|
-
/* @__PURE__ */
|
|
9476
|
+
/* @__PURE__ */ jsx58("div", { style: overlayStyle }),
|
|
9477
|
+
/* @__PURE__ */ jsx58(
|
|
9457
9478
|
"img",
|
|
9458
9479
|
{
|
|
9459
9480
|
src: descriptor.src,
|
|
@@ -9481,7 +9502,7 @@ function ArtAlignment({
|
|
|
9481
9502
|
loading: "eager"
|
|
9482
9503
|
}
|
|
9483
9504
|
),
|
|
9484
|
-
/* @__PURE__ */
|
|
9505
|
+
/* @__PURE__ */ jsx58(
|
|
9485
9506
|
"div",
|
|
9486
9507
|
{
|
|
9487
9508
|
...bind(),
|
|
@@ -9499,7 +9520,7 @@ function ArtAlignment({
|
|
|
9499
9520
|
|
|
9500
9521
|
// src/composed/ArtworkCustomizer.tsx
|
|
9501
9522
|
import { useEffect as useEffect30 } from "react";
|
|
9502
|
-
import { jsx as
|
|
9523
|
+
import { jsx as jsx59, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
9503
9524
|
function ArtworkCustomizer(props) {
|
|
9504
9525
|
const designContext = useDesign();
|
|
9505
9526
|
const artwork = props.artwork || designContext.selectedArtwork;
|
|
@@ -9524,10 +9545,10 @@ function ArtworkCustomizer(props) {
|
|
|
9524
9545
|
useEffect30(() => {
|
|
9525
9546
|
}, [selectedPlacement]);
|
|
9526
9547
|
if (!artwork) {
|
|
9527
|
-
return /* @__PURE__ */
|
|
9548
|
+
return /* @__PURE__ */ jsx59("div", { className: `text-sm text-muted-foreground ${props.className || ""}`, children: "Select artwork to customize" });
|
|
9528
9549
|
}
|
|
9529
9550
|
if (artwork.type === "pattern") {
|
|
9530
|
-
return /* @__PURE__ */
|
|
9551
|
+
return /* @__PURE__ */ jsx59(
|
|
9531
9552
|
TileCount,
|
|
9532
9553
|
{
|
|
9533
9554
|
artwork,
|
|
@@ -9539,7 +9560,7 @@ function ArtworkCustomizer(props) {
|
|
|
9539
9560
|
}
|
|
9540
9561
|
const isCanvasEditorMode = props.mode === "canvas" || !!props.children && props.mode !== "alignment";
|
|
9541
9562
|
return /* @__PURE__ */ jsxs37("div", { className: "flex flex-col gap-4", children: [
|
|
9542
|
-
placements.length > 1 && /* @__PURE__ */
|
|
9563
|
+
placements.length > 1 && /* @__PURE__ */ jsx59("div", { className: "text-sm leading-relaxed", children: placements.map((p) => /* @__PURE__ */ jsx59(
|
|
9543
9564
|
"button",
|
|
9544
9565
|
{
|
|
9545
9566
|
onClick: () => setSelectedPlacement?.(p.label),
|
|
@@ -9548,7 +9569,7 @@ function ArtworkCustomizer(props) {
|
|
|
9548
9569
|
},
|
|
9549
9570
|
p.label
|
|
9550
9571
|
)) }),
|
|
9551
|
-
isColorPlacement ? /* @__PURE__ */
|
|
9572
|
+
isColorPlacement ? /* @__PURE__ */ jsx59(ColorPicker2, { placement: selectedPlacement }) : isFitMode ? null : /* @__PURE__ */ jsx59("div", { className: "relative", children: props.children || /* @__PURE__ */ jsx59(
|
|
9552
9573
|
ArtAlignment,
|
|
9553
9574
|
{
|
|
9554
9575
|
artwork: { src: artwork.src },
|
|
@@ -9569,7 +9590,7 @@ import {
|
|
|
9569
9590
|
Shapes as LucideShapes,
|
|
9570
9591
|
Upload as LucideUpload
|
|
9571
9592
|
} from "lucide-react";
|
|
9572
|
-
import { jsx as
|
|
9593
|
+
import { jsx as jsx60, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
9573
9594
|
var ImageIcon = LucideImage;
|
|
9574
9595
|
var TypeIcon = LucideType;
|
|
9575
9596
|
var ShapesIcon = LucideShapes;
|
|
@@ -9581,28 +9602,28 @@ function CanvasEditor({
|
|
|
9581
9602
|
children
|
|
9582
9603
|
}) {
|
|
9583
9604
|
return /* @__PURE__ */ jsxs38("div", { className: "flex flex-col gap-6", children: [
|
|
9584
|
-
/* @__PURE__ */
|
|
9605
|
+
/* @__PURE__ */ jsx60("div", { className: "bg-background border-2 border-border rounded-lg aspect-square overflow-hidden relative", children: children || /* @__PURE__ */ jsx60("div", { className: "flex items-center justify-center w-full h-full", children: /* @__PURE__ */ jsx60("div", { className: "text-muted-foreground text-sm", children: "No editor provided" }) }) }),
|
|
9585
9606
|
/* @__PURE__ */ jsxs38("div", { className: "flex items-center justify-center gap-8 py-2", children: [
|
|
9586
|
-
/* @__PURE__ */
|
|
9607
|
+
/* @__PURE__ */ jsx60(
|
|
9587
9608
|
"button",
|
|
9588
9609
|
{
|
|
9589
9610
|
onClick: onOpenImageGallery,
|
|
9590
9611
|
className: "flex flex-col items-center gap-2 text-muted-foreground hover:text-foreground transition-colors",
|
|
9591
9612
|
"aria-label": "Open image gallery",
|
|
9592
|
-
children: /* @__PURE__ */
|
|
9613
|
+
children: /* @__PURE__ */ jsx60("div", { className: "w-10 h-10 flex items-center justify-center", children: /* @__PURE__ */ jsx60(ImageIcon, { className: "w-6 h-6" }) })
|
|
9593
9614
|
}
|
|
9594
9615
|
),
|
|
9595
|
-
/* @__PURE__ */
|
|
9616
|
+
/* @__PURE__ */ jsx60(
|
|
9596
9617
|
"button",
|
|
9597
9618
|
{
|
|
9598
9619
|
onClick: onOpenTypography,
|
|
9599
9620
|
className: "flex flex-col items-center gap-2 text-muted-foreground hover:text-foreground transition-colors",
|
|
9600
9621
|
"aria-label": "Add text",
|
|
9601
|
-
children: /* @__PURE__ */
|
|
9622
|
+
children: /* @__PURE__ */ jsx60("div", { className: "w-10 h-10 flex items-center justify-center", children: /* @__PURE__ */ jsx60(TypeIcon, { className: "w-6 h-6" }) })
|
|
9602
9623
|
}
|
|
9603
9624
|
),
|
|
9604
|
-
/* @__PURE__ */
|
|
9605
|
-
/* @__PURE__ */
|
|
9625
|
+
/* @__PURE__ */ jsx60("button", { className: "flex flex-col items-center gap-2 text-muted-foreground hover:text-foreground transition-colors", children: /* @__PURE__ */ jsx60("div", { className: "w-10 h-10 flex items-center justify-center", children: /* @__PURE__ */ jsx60(ShapesIcon, { className: "w-6 h-6" }) }) }),
|
|
9626
|
+
/* @__PURE__ */ jsx60("button", { className: "flex flex-col items-center gap-2 text-muted-foreground hover:text-foreground transition-colors", children: /* @__PURE__ */ jsx60("div", { className: "w-10 h-10 flex items-center justify-center", children: /* @__PURE__ */ jsx60(UploadIcon, { className: "w-6 h-6" }) }) })
|
|
9606
9627
|
] })
|
|
9607
9628
|
] });
|
|
9608
9629
|
}
|
|
@@ -9659,7 +9680,7 @@ function useContainerWidth(containerRef, maxWidth = 3e3) {
|
|
|
9659
9680
|
}
|
|
9660
9681
|
|
|
9661
9682
|
// src/composed/HeroProductImage.tsx
|
|
9662
|
-
import { jsx as
|
|
9683
|
+
import { jsx as jsx61, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
9663
9684
|
function slugifyPlacementKey(label) {
|
|
9664
9685
|
return label.toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "");
|
|
9665
9686
|
}
|
|
@@ -9693,6 +9714,7 @@ function buildHeroMockupUrl(args) {
|
|
|
9693
9714
|
width: args.width,
|
|
9694
9715
|
view: args.mockupId,
|
|
9695
9716
|
variant: args.variantId,
|
|
9717
|
+
...args.bg ? { bg: args.bg } : {},
|
|
9696
9718
|
...snow.resolver ? { base: snow.resolver } : {}
|
|
9697
9719
|
});
|
|
9698
9720
|
}
|
|
@@ -9730,6 +9752,7 @@ var HeroProductImage = memo3(function HeroProductImage2({
|
|
|
9730
9752
|
const shopContext = useShopOptional();
|
|
9731
9753
|
const realtimeContext = useRealtimeOptional();
|
|
9732
9754
|
const priorityContext = useMockupPriorityOptional();
|
|
9755
|
+
const mockupBg = useMockupBackgroundOptional();
|
|
9733
9756
|
const priorityContextRef = useRef23(priorityContext);
|
|
9734
9757
|
priorityContextRef.current = priorityContext;
|
|
9735
9758
|
const contextRef = useRef23(context);
|
|
@@ -9780,7 +9803,8 @@ var HeroProductImage = memo3(function HeroProductImage2({
|
|
|
9780
9803
|
placements: allPlacements,
|
|
9781
9804
|
mockupId: actualMockupId,
|
|
9782
9805
|
variantId: actualGvid,
|
|
9783
|
-
width
|
|
9806
|
+
width,
|
|
9807
|
+
bg: mockupBg
|
|
9784
9808
|
});
|
|
9785
9809
|
}, [
|
|
9786
9810
|
realtimeUrl,
|
|
@@ -9790,6 +9814,7 @@ var HeroProductImage = memo3(function HeroProductImage2({
|
|
|
9790
9814
|
actualProductId,
|
|
9791
9815
|
actualMockupId,
|
|
9792
9816
|
actualGvid,
|
|
9817
|
+
mockupBg,
|
|
9793
9818
|
product?.placements,
|
|
9794
9819
|
context?.product?.placements,
|
|
9795
9820
|
images,
|
|
@@ -10025,7 +10050,8 @@ var HeroProductImage = memo3(function HeroProductImage2({
|
|
|
10025
10050
|
placements: allPlacements,
|
|
10026
10051
|
mockupId: actualMockupId,
|
|
10027
10052
|
variantId: actualGvid,
|
|
10028
|
-
width
|
|
10053
|
+
width,
|
|
10054
|
+
bg: mockupBg
|
|
10029
10055
|
});
|
|
10030
10056
|
if (!url) return;
|
|
10031
10057
|
if (url === lastUrlRef.current) return;
|
|
@@ -10066,6 +10092,7 @@ var HeroProductImage = memo3(function HeroProductImage2({
|
|
|
10066
10092
|
actualProductId,
|
|
10067
10093
|
actualMockupId,
|
|
10068
10094
|
actualGvid,
|
|
10095
|
+
mockupBg,
|
|
10069
10096
|
images,
|
|
10070
10097
|
width,
|
|
10071
10098
|
effects,
|
|
@@ -10139,20 +10166,20 @@ var HeroProductImage = memo3(function HeroProductImage2({
|
|
|
10139
10166
|
}, []);
|
|
10140
10167
|
const handleLoaderExited = useCallback18(() => setLoaderMounted(false), []);
|
|
10141
10168
|
if (!hasArtwork) {
|
|
10142
|
-
return /* @__PURE__ */
|
|
10169
|
+
return /* @__PURE__ */ jsx61(
|
|
10143
10170
|
"div",
|
|
10144
10171
|
{
|
|
10145
10172
|
className: `bg-gray-100 flex items-center justify-center ${className || ""}`,
|
|
10146
10173
|
style,
|
|
10147
10174
|
children: /* @__PURE__ */ jsxs39("div", { className: "text-gray-400 text-center p-4", children: [
|
|
10148
|
-
/* @__PURE__ */
|
|
10175
|
+
/* @__PURE__ */ jsx61(
|
|
10149
10176
|
"svg",
|
|
10150
10177
|
{
|
|
10151
10178
|
className: "w-8 h-8 mx-auto mb-2",
|
|
10152
10179
|
fill: "none",
|
|
10153
10180
|
stroke: "currentColor",
|
|
10154
10181
|
viewBox: "0 0 24 24",
|
|
10155
|
-
children: /* @__PURE__ */
|
|
10182
|
+
children: /* @__PURE__ */ jsx61(
|
|
10156
10183
|
"path",
|
|
10157
10184
|
{
|
|
10158
10185
|
strokeLinecap: "round",
|
|
@@ -10163,18 +10190,18 @@ var HeroProductImage = memo3(function HeroProductImage2({
|
|
|
10163
10190
|
)
|
|
10164
10191
|
}
|
|
10165
10192
|
),
|
|
10166
|
-
/* @__PURE__ */
|
|
10193
|
+
/* @__PURE__ */ jsx61("p", { className: "text-xs", children: "No artwork" })
|
|
10167
10194
|
] })
|
|
10168
10195
|
}
|
|
10169
10196
|
);
|
|
10170
10197
|
}
|
|
10171
10198
|
if (error) {
|
|
10172
|
-
return /* @__PURE__ */
|
|
10199
|
+
return /* @__PURE__ */ jsx61(
|
|
10173
10200
|
"div",
|
|
10174
10201
|
{
|
|
10175
10202
|
className: `bg-red-50 flex items-center justify-center ${className || ""}`,
|
|
10176
10203
|
style,
|
|
10177
|
-
children: /* @__PURE__ */
|
|
10204
|
+
children: /* @__PURE__ */ jsx61("div", { className: "text-red-600 text-center p-4", children: /* @__PURE__ */ jsx61("p", { className: "text-xs", children: "Error loading" }) })
|
|
10178
10205
|
}
|
|
10179
10206
|
);
|
|
10180
10207
|
}
|
|
@@ -10186,7 +10213,7 @@ var HeroProductImage = memo3(function HeroProductImage2({
|
|
|
10186
10213
|
style,
|
|
10187
10214
|
"data-hero-image": "true",
|
|
10188
10215
|
children: [
|
|
10189
|
-
renderedUrl && !imgFailed && /* @__PURE__ */
|
|
10216
|
+
renderedUrl && !imgFailed && /* @__PURE__ */ jsx61(
|
|
10190
10217
|
"img",
|
|
10191
10218
|
{
|
|
10192
10219
|
alt: `Product mockup${placement ? ` - ${placement}` : ""}`,
|
|
@@ -10225,8 +10252,8 @@ var HeroProductImage = memo3(function HeroProductImage2({
|
|
|
10225
10252
|
}
|
|
10226
10253
|
}
|
|
10227
10254
|
),
|
|
10228
|
-
imgFailed && !prevUrl && /* @__PURE__ */
|
|
10229
|
-
realtimeContext?.renderError && /* @__PURE__ */
|
|
10255
|
+
imgFailed && !prevUrl && /* @__PURE__ */ jsx61("div", { className: "absolute inset-0 flex items-center justify-center bg-muted", children: /* @__PURE__ */ jsx61("p", { className: "text-muted-foreground text-xs", children: "Preview unavailable" }) }),
|
|
10256
|
+
realtimeContext?.renderError && /* @__PURE__ */ jsx61(
|
|
10230
10257
|
"div",
|
|
10231
10258
|
{
|
|
10232
10259
|
role: "alert",
|
|
@@ -10235,7 +10262,7 @@ var HeroProductImage = memo3(function HeroProductImage2({
|
|
|
10235
10262
|
children: `Render blocked: ${realtimeContext.renderError.code} \u2014 ${realtimeContext.renderError.message}`
|
|
10236
10263
|
}
|
|
10237
10264
|
),
|
|
10238
|
-
prevUrl && /* @__PURE__ */
|
|
10265
|
+
prevUrl && /* @__PURE__ */ jsx61(
|
|
10239
10266
|
"img",
|
|
10240
10267
|
{
|
|
10241
10268
|
alt: "",
|
|
@@ -10250,7 +10277,7 @@ var HeroProductImage = memo3(function HeroProductImage2({
|
|
|
10250
10277
|
onTransitionEnd: handleCrossfadeEnd
|
|
10251
10278
|
}
|
|
10252
10279
|
),
|
|
10253
|
-
loaderMounted && /* @__PURE__ */
|
|
10280
|
+
loaderMounted && /* @__PURE__ */ jsx61(
|
|
10254
10281
|
LoadingOverlayPrismCandyInline,
|
|
10255
10282
|
{
|
|
10256
10283
|
visible: !firstImageLoaded,
|
|
@@ -10264,16 +10291,16 @@ var HeroProductImage = memo3(function HeroProductImage2({
|
|
|
10264
10291
|
});
|
|
10265
10292
|
|
|
10266
10293
|
// src/composed/SafeImg.tsx
|
|
10267
|
-
import
|
|
10268
|
-
import { Fragment as Fragment12, jsx as
|
|
10269
|
-
var SafeImg =
|
|
10294
|
+
import React45, { useEffect as useEffect33, useState as useState32 } from "react";
|
|
10295
|
+
import { Fragment as Fragment12, jsx as jsx62 } from "react/jsx-runtime";
|
|
10296
|
+
var SafeImg = React45.forwardRef(
|
|
10270
10297
|
function SafeImg2({ fallback = null, onError, src, ...rest }, ref) {
|
|
10271
10298
|
const [failed, setFailed] = useState32(false);
|
|
10272
10299
|
useEffect33(() => {
|
|
10273
10300
|
setFailed(false);
|
|
10274
10301
|
}, [src]);
|
|
10275
|
-
if (failed) return /* @__PURE__ */
|
|
10276
|
-
return /* @__PURE__ */
|
|
10302
|
+
if (failed) return /* @__PURE__ */ jsx62(Fragment12, { children: fallback });
|
|
10303
|
+
return /* @__PURE__ */ jsx62(
|
|
10277
10304
|
"img",
|
|
10278
10305
|
{
|
|
10279
10306
|
...rest,
|
|
@@ -10312,7 +10339,7 @@ var { searchClient } = instantMeiliSearch(
|
|
|
10312
10339
|
|
|
10313
10340
|
// src/composed/search/SearchProvider.tsx
|
|
10314
10341
|
import { useEffect as useEffect34 } from "react";
|
|
10315
|
-
import { jsx as
|
|
10342
|
+
import { jsx as jsx63, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
10316
10343
|
function InitialSearchTrigger() {
|
|
10317
10344
|
const { refine } = useSearchBox();
|
|
10318
10345
|
useEffect34(() => {
|
|
@@ -10367,7 +10394,7 @@ function SearchProvider({
|
|
|
10367
10394
|
}
|
|
10368
10395
|
},
|
|
10369
10396
|
children: [
|
|
10370
|
-
/* @__PURE__ */
|
|
10397
|
+
/* @__PURE__ */ jsx63(
|
|
10371
10398
|
Configure,
|
|
10372
10399
|
{
|
|
10373
10400
|
hitsPerPage,
|
|
@@ -10376,7 +10403,7 @@ function SearchProvider({
|
|
|
10376
10403
|
attributesToRetrieve
|
|
10377
10404
|
}
|
|
10378
10405
|
),
|
|
10379
|
-
/* @__PURE__ */
|
|
10406
|
+
/* @__PURE__ */ jsx63(InitialSearchTrigger, {}),
|
|
10380
10407
|
children
|
|
10381
10408
|
]
|
|
10382
10409
|
}
|
|
@@ -10387,7 +10414,7 @@ function SearchProvider({
|
|
|
10387
10414
|
import { useSearchBox as useSearchBox2 } from "react-instantsearch";
|
|
10388
10415
|
import { Search, X } from "lucide-react";
|
|
10389
10416
|
import { useEffect as useEffect35, useRef as useRef24, useState as useState33 } from "react";
|
|
10390
|
-
import { jsx as
|
|
10417
|
+
import { jsx as jsx64, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
10391
10418
|
function SearchBox() {
|
|
10392
10419
|
const { query, refine, clear } = useSearchBox2();
|
|
10393
10420
|
const searchParams = useUiSearchParams();
|
|
@@ -10421,8 +10448,8 @@ function SearchBox() {
|
|
|
10421
10448
|
return () => clearTimeout(timer);
|
|
10422
10449
|
}
|
|
10423
10450
|
}, [searchParams, router]);
|
|
10424
|
-
return /* @__PURE__ */
|
|
10425
|
-
/* @__PURE__ */
|
|
10451
|
+
return /* @__PURE__ */ jsx64("form", { role: "search", onSubmit: (e) => e.preventDefault(), children: /* @__PURE__ */ jsxs41("div", { className: "relative", children: [
|
|
10452
|
+
/* @__PURE__ */ jsx64(
|
|
10426
10453
|
Input,
|
|
10427
10454
|
{
|
|
10428
10455
|
ref: inputRef,
|
|
@@ -10431,15 +10458,15 @@ function SearchBox() {
|
|
|
10431
10458
|
value: query,
|
|
10432
10459
|
onChange: (e) => refine(e.target.value),
|
|
10433
10460
|
placeholder: "Search products...",
|
|
10434
|
-
startContent: /* @__PURE__ */
|
|
10435
|
-
endContent: query ? /* @__PURE__ */
|
|
10461
|
+
startContent: /* @__PURE__ */ jsx64(Search, { className: "w-5 h-5", strokeWidth: 1.5, "aria-hidden": "true" }),
|
|
10462
|
+
endContent: query ? /* @__PURE__ */ jsx64(
|
|
10436
10463
|
"button",
|
|
10437
10464
|
{
|
|
10438
10465
|
type: "button",
|
|
10439
10466
|
onClick: clear,
|
|
10440
10467
|
className: "hover:text-foreground transition-colors",
|
|
10441
10468
|
"aria-label": "Clear search",
|
|
10442
|
-
children: /* @__PURE__ */
|
|
10469
|
+
children: /* @__PURE__ */ jsx64(X, { className: "w-4 h-4", strokeWidth: 2, "aria-hidden": "true" })
|
|
10443
10470
|
}
|
|
10444
10471
|
) : void 0,
|
|
10445
10472
|
"aria-label": "Search products",
|
|
@@ -10449,11 +10476,11 @@ function SearchBox() {
|
|
|
10449
10476
|
className: "[&::-webkit-search-cancel-button]:hidden [&::-webkit-search-decoration]:hidden"
|
|
10450
10477
|
}
|
|
10451
10478
|
),
|
|
10452
|
-
showShimmer && /* @__PURE__ */
|
|
10479
|
+
showShimmer && /* @__PURE__ */ jsx64(
|
|
10453
10480
|
"div",
|
|
10454
10481
|
{
|
|
10455
10482
|
className: "absolute inset-0 pointer-events-none rounded-input z-20 overflow-hidden",
|
|
10456
|
-
children: /* @__PURE__ */
|
|
10483
|
+
children: /* @__PURE__ */ jsx64(
|
|
10457
10484
|
"div",
|
|
10458
10485
|
{
|
|
10459
10486
|
className: "absolute inset-0",
|
|
@@ -10466,13 +10493,13 @@ function SearchBox() {
|
|
|
10466
10493
|
)
|
|
10467
10494
|
}
|
|
10468
10495
|
),
|
|
10469
|
-
/* @__PURE__ */
|
|
10496
|
+
/* @__PURE__ */ jsx64("style", { dangerouslySetInnerHTML: { __html: `
|
|
10470
10497
|
@keyframes searchShimmer {
|
|
10471
10498
|
0% { transform: translateX(-100%); }
|
|
10472
10499
|
100% { transform: translateX(100%); }
|
|
10473
10500
|
}
|
|
10474
10501
|
` } }),
|
|
10475
|
-
/* @__PURE__ */
|
|
10502
|
+
/* @__PURE__ */ jsx64("span", { id: descriptionId, className: "sr-only", children: "Search results will update as you type" })
|
|
10476
10503
|
] }) });
|
|
10477
10504
|
}
|
|
10478
10505
|
|
|
@@ -10480,7 +10507,7 @@ function SearchBox() {
|
|
|
10480
10507
|
import { Hits, useStats, useInstantSearch } from "react-instantsearch";
|
|
10481
10508
|
|
|
10482
10509
|
// src/composed/search/ProductHit.tsx
|
|
10483
|
-
import { jsx as
|
|
10510
|
+
import { jsx as jsx65 } from "react/jsx-runtime";
|
|
10484
10511
|
function ProductHitComponent({
|
|
10485
10512
|
hit: product,
|
|
10486
10513
|
variant = "overlay"
|
|
@@ -10497,12 +10524,12 @@ function ProductHitComponent({
|
|
|
10497
10524
|
}
|
|
10498
10525
|
return "";
|
|
10499
10526
|
};
|
|
10500
|
-
return /* @__PURE__ */
|
|
10527
|
+
return /* @__PURE__ */ jsx65(
|
|
10501
10528
|
Product,
|
|
10502
10529
|
{
|
|
10503
10530
|
productId,
|
|
10504
10531
|
productData: product,
|
|
10505
|
-
children: /* @__PURE__ */
|
|
10532
|
+
children: /* @__PURE__ */ jsx65(
|
|
10506
10533
|
ProductCard,
|
|
10507
10534
|
{
|
|
10508
10535
|
variant,
|
|
@@ -10524,9 +10551,9 @@ function ProductHitComponent({
|
|
|
10524
10551
|
|
|
10525
10552
|
// src/composed/search/ProductGrid.tsx
|
|
10526
10553
|
import { useState as useState34, useEffect as useEffect36, useCallback as useCallback19 } from "react";
|
|
10527
|
-
import { jsx as
|
|
10554
|
+
import { jsx as jsx66, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
10528
10555
|
function ProductGridSkeletonItem() {
|
|
10529
|
-
return /* @__PURE__ */
|
|
10556
|
+
return /* @__PURE__ */ jsx66("div", { className: "aspect-square bg-muted animate-pulse" });
|
|
10530
10557
|
}
|
|
10531
10558
|
function ProductGrid({
|
|
10532
10559
|
className = "",
|
|
@@ -10545,7 +10572,7 @@ function ProductGrid({
|
|
|
10545
10572
|
}, 1e3);
|
|
10546
10573
|
return () => clearTimeout(timer);
|
|
10547
10574
|
}, [nbHits]);
|
|
10548
|
-
const HitComponent = useCallback19(({ hit }) => /* @__PURE__ */
|
|
10575
|
+
const HitComponent = useCallback19(({ hit }) => /* @__PURE__ */ jsx66(
|
|
10549
10576
|
ProductHitComponent,
|
|
10550
10577
|
{
|
|
10551
10578
|
hit,
|
|
@@ -10553,9 +10580,9 @@ function ProductGrid({
|
|
|
10553
10580
|
}
|
|
10554
10581
|
), [variant]);
|
|
10555
10582
|
return /* @__PURE__ */ jsxs42("div", { className, children: [
|
|
10556
|
-
/* @__PURE__ */
|
|
10557
|
-
showSkeleton && /* @__PURE__ */
|
|
10558
|
-
/* @__PURE__ */
|
|
10583
|
+
/* @__PURE__ */ jsx66("div", { className: "sr-only", role: "status", "aria-live": "polite", "aria-atomic": "true", children: announcement }),
|
|
10584
|
+
showSkeleton && /* @__PURE__ */ jsx66("div", { className: `grid ${gridClassName}`, children: Array.from({ length: skeletonCount }).map((_, i) => /* @__PURE__ */ jsx66(ProductGridSkeletonItem, {}, i)) }),
|
|
10585
|
+
/* @__PURE__ */ jsx66("div", { className: showSkeleton ? "hidden" : "", children: /* @__PURE__ */ jsx66(
|
|
10559
10586
|
Hits,
|
|
10560
10587
|
{
|
|
10561
10588
|
hitComponent: HitComponent,
|
|
@@ -10574,7 +10601,7 @@ import { useState as useState36 } from "react";
|
|
|
10574
10601
|
|
|
10575
10602
|
// src/composed/search/FiltersButton.tsx
|
|
10576
10603
|
import { SlidersHorizontal as LucideSlidersHorizontal } from "lucide-react";
|
|
10577
|
-
import { jsx as
|
|
10604
|
+
import { jsx as jsx67, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
10578
10605
|
var SlidersHorizontalIcon = LucideSlidersHorizontal;
|
|
10579
10606
|
function FiltersButton({
|
|
10580
10607
|
onClick,
|
|
@@ -10589,8 +10616,8 @@ function FiltersButton({
|
|
|
10589
10616
|
className,
|
|
10590
10617
|
"aria-label": "Open filters",
|
|
10591
10618
|
children: [
|
|
10592
|
-
/* @__PURE__ */
|
|
10593
|
-
/* @__PURE__ */
|
|
10619
|
+
/* @__PURE__ */ jsx67(SlidersHorizontalIcon, { className: "w-4 h-4" }),
|
|
10620
|
+
/* @__PURE__ */ jsx67("span", { children })
|
|
10594
10621
|
]
|
|
10595
10622
|
}
|
|
10596
10623
|
);
|
|
@@ -10601,7 +10628,7 @@ import { useRefinementList, useRange, useStats as useStats2 } from "react-instan
|
|
|
10601
10628
|
import { X as LucideX2, SlidersHorizontal as LucideSlidersHorizontal2 } from "lucide-react";
|
|
10602
10629
|
import { useState as useState35, useEffect as useEffect37 } from "react";
|
|
10603
10630
|
import * as Slider2 from "@radix-ui/react-slider";
|
|
10604
|
-
import { Fragment as Fragment13, jsx as
|
|
10631
|
+
import { Fragment as Fragment13, jsx as jsx68, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
10605
10632
|
var XIcon2 = LucideX2;
|
|
10606
10633
|
function FiltersDrawer({ isOpen, onClose }) {
|
|
10607
10634
|
const [showCounts, setShowCounts] = useState35(false);
|
|
@@ -10627,7 +10654,7 @@ function FiltersDrawer({ isOpen, onClose }) {
|
|
|
10627
10654
|
return () => document.removeEventListener("keydown", handleEscape);
|
|
10628
10655
|
}, [isOpen, onClose]);
|
|
10629
10656
|
return /* @__PURE__ */ jsxs44(Fragment13, { children: [
|
|
10630
|
-
/* @__PURE__ */
|
|
10657
|
+
/* @__PURE__ */ jsx68(
|
|
10631
10658
|
"div",
|
|
10632
10659
|
{
|
|
10633
10660
|
className: `fixed inset-0 bg-black/50 z-40 transition-opacity ${isOpen ? "opacity-100" : "opacity-0 pointer-events-none"}`,
|
|
@@ -10645,25 +10672,25 @@ function FiltersDrawer({ isOpen, onClose }) {
|
|
|
10645
10672
|
"aria-labelledby": "filters-drawer-title",
|
|
10646
10673
|
children: [
|
|
10647
10674
|
/* @__PURE__ */ jsxs44("div", { className: "flex items-center justify-between px-4 py-4", children: [
|
|
10648
|
-
/* @__PURE__ */
|
|
10649
|
-
/* @__PURE__ */
|
|
10675
|
+
/* @__PURE__ */ jsx68("h2", { id: "filters-drawer-title", className: "text-xl font-bold", children: "Filters" }),
|
|
10676
|
+
/* @__PURE__ */ jsx68(
|
|
10650
10677
|
"button",
|
|
10651
10678
|
{
|
|
10652
10679
|
onClick: onClose,
|
|
10653
10680
|
className: "p-2 hover:bg-foreground/5 rounded-full transition-colors",
|
|
10654
10681
|
"aria-label": "Close filters",
|
|
10655
|
-
children: /* @__PURE__ */
|
|
10682
|
+
children: /* @__PURE__ */ jsx68(XIcon2, { className: "w-5 h-5" })
|
|
10656
10683
|
}
|
|
10657
10684
|
)
|
|
10658
10685
|
] }),
|
|
10659
|
-
/* @__PURE__ */
|
|
10686
|
+
/* @__PURE__ */ jsx68("div", { className: "px-4 pb-4", children: /* @__PURE__ */ jsxs44("p", { className: "text-sm font-caption text-foreground/60", role: "status", "aria-live": "polite", children: [
|
|
10660
10687
|
nbHits.toLocaleString(),
|
|
10661
10688
|
" ",
|
|
10662
10689
|
nbHits === 1 ? "result" : "results"
|
|
10663
10690
|
] }) }),
|
|
10664
|
-
/* @__PURE__ */
|
|
10665
|
-
/* @__PURE__ */
|
|
10666
|
-
/* @__PURE__ */
|
|
10691
|
+
/* @__PURE__ */ jsx68("div", { className: "flex-1 overflow-y-auto px-4 pb-4", children: /* @__PURE__ */ jsxs44("div", { className: "flex flex-col gap-8", children: [
|
|
10692
|
+
/* @__PURE__ */ jsx68(TagsSection, { showCounts, setShowCounts }),
|
|
10693
|
+
/* @__PURE__ */ jsx68(PriceSection, {})
|
|
10667
10694
|
] }) })
|
|
10668
10695
|
]
|
|
10669
10696
|
}
|
|
@@ -10689,8 +10716,8 @@ function TagsSection({
|
|
|
10689
10716
|
"aria-expanded": isExpanded,
|
|
10690
10717
|
"aria-controls": "tags-content",
|
|
10691
10718
|
children: [
|
|
10692
|
-
/* @__PURE__ */
|
|
10693
|
-
/* @__PURE__ */
|
|
10719
|
+
/* @__PURE__ */ jsx68("h3", { className: "text-base font-semibold text-primary", children: "Tags" }),
|
|
10720
|
+
/* @__PURE__ */ jsx68(
|
|
10694
10721
|
"svg",
|
|
10695
10722
|
{
|
|
10696
10723
|
className: `w-5 h-5 transition-transform text-foreground/40 group-hover:text-foreground/60 ${isExpanded ? "rotate-180" : ""}`,
|
|
@@ -10699,14 +10726,14 @@ function TagsSection({
|
|
|
10699
10726
|
stroke: "currentColor",
|
|
10700
10727
|
strokeWidth: 2.5,
|
|
10701
10728
|
"aria-hidden": "true",
|
|
10702
|
-
children: /* @__PURE__ */
|
|
10729
|
+
children: /* @__PURE__ */ jsx68("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })
|
|
10703
10730
|
}
|
|
10704
10731
|
)
|
|
10705
10732
|
]
|
|
10706
10733
|
}
|
|
10707
10734
|
),
|
|
10708
10735
|
isExpanded && /* @__PURE__ */ jsxs44("div", { className: "space-y-4", id: "tags-content", children: [
|
|
10709
|
-
/* @__PURE__ */
|
|
10736
|
+
/* @__PURE__ */ jsx68("div", { className: "flex flex-wrap gap-2", role: "group", "aria-label": "Product tags filter", children: items.map((item) => /* @__PURE__ */ jsxs44(
|
|
10710
10737
|
"button",
|
|
10711
10738
|
{
|
|
10712
10739
|
onClick: () => refine(item.value),
|
|
@@ -10717,15 +10744,15 @@ function TagsSection({
|
|
|
10717
10744
|
"aria-label": `${item.isRefined ? "Remove" : "Apply"} ${item.label} filter${showCounts ? ` (${item.count} products)` : ""}`,
|
|
10718
10745
|
"aria-pressed": item.isRefined,
|
|
10719
10746
|
children: [
|
|
10720
|
-
/* @__PURE__ */
|
|
10721
|
-
showCounts && /* @__PURE__ */
|
|
10747
|
+
/* @__PURE__ */ jsx68("span", { "aria-hidden": "true", children: item.label }),
|
|
10748
|
+
showCounts && /* @__PURE__ */ jsx68("span", { className: `text-xs font-caption ${item.isRefined ? "opacity-80" : "opacity-60"}`, "aria-hidden": "true", children: item.count })
|
|
10722
10749
|
]
|
|
10723
10750
|
},
|
|
10724
10751
|
item.value
|
|
10725
10752
|
)) }),
|
|
10726
10753
|
/* @__PURE__ */ jsxs44("div", { className: "flex items-center justify-between pt-2", children: [
|
|
10727
|
-
/* @__PURE__ */
|
|
10728
|
-
/* @__PURE__ */
|
|
10754
|
+
/* @__PURE__ */ jsx68("span", { className: "text-sm font-label text-foreground/60", id: "show-counts-label", children: "Show counts" }),
|
|
10755
|
+
/* @__PURE__ */ jsx68(
|
|
10729
10756
|
"button",
|
|
10730
10757
|
{
|
|
10731
10758
|
onClick: () => setShowCounts(!showCounts),
|
|
@@ -10733,7 +10760,7 @@ function TagsSection({
|
|
|
10733
10760
|
role: "switch",
|
|
10734
10761
|
"aria-checked": showCounts,
|
|
10735
10762
|
"aria-labelledby": "show-counts-label",
|
|
10736
|
-
children: /* @__PURE__ */
|
|
10763
|
+
children: /* @__PURE__ */ jsx68(
|
|
10737
10764
|
"span",
|
|
10738
10765
|
{
|
|
10739
10766
|
className: `inline-block h-4 w-4 transform rounded-full bg-background shadow-sm transition-transform ${showCounts ? "translate-x-6" : "translate-x-1"}`,
|
|
@@ -10788,8 +10815,8 @@ function PriceSection() {
|
|
|
10788
10815
|
"aria-expanded": isExpanded,
|
|
10789
10816
|
"aria-controls": "price-content",
|
|
10790
10817
|
children: [
|
|
10791
|
-
/* @__PURE__ */
|
|
10792
|
-
/* @__PURE__ */
|
|
10818
|
+
/* @__PURE__ */ jsx68("h3", { className: "text-base font-semibold text-primary", children: "Price" }),
|
|
10819
|
+
/* @__PURE__ */ jsx68(
|
|
10793
10820
|
"svg",
|
|
10794
10821
|
{
|
|
10795
10822
|
className: `w-5 h-5 transition-transform text-foreground/40 group-hover:text-foreground/60 ${isExpanded ? "rotate-180" : ""}`,
|
|
@@ -10798,7 +10825,7 @@ function PriceSection() {
|
|
|
10798
10825
|
stroke: "currentColor",
|
|
10799
10826
|
strokeWidth: 2.5,
|
|
10800
10827
|
"aria-hidden": "true",
|
|
10801
|
-
children: /* @__PURE__ */
|
|
10828
|
+
children: /* @__PURE__ */ jsx68("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })
|
|
10802
10829
|
}
|
|
10803
10830
|
)
|
|
10804
10831
|
]
|
|
@@ -10806,14 +10833,14 @@ function PriceSection() {
|
|
|
10806
10833
|
),
|
|
10807
10834
|
isExpanded && /* @__PURE__ */ jsxs44("div", { className: "space-y-6", id: "price-content", children: [
|
|
10808
10835
|
/* @__PURE__ */ jsxs44("div", { className: "flex items-center justify-between text-sm font-display", children: [
|
|
10809
|
-
/* @__PURE__ */
|
|
10810
|
-
/* @__PURE__ */
|
|
10836
|
+
/* @__PURE__ */ jsx68("span", { children: formatPrice2(localRange[0]) }),
|
|
10837
|
+
/* @__PURE__ */ jsx68("span", { className: "text-foreground/70", children: formatPrice2(localRange[1]) })
|
|
10811
10838
|
] }),
|
|
10812
|
-
/* @__PURE__ */
|
|
10839
|
+
/* @__PURE__ */ jsx68("div", { className: "relative h-24 flex items-end justify-between gap-0.5 px-1", "aria-hidden": "true", role: "presentation", children: [60, 40, 80, 50, 60, 30, 20, 15, 10, 5, 30, 20, 15, 10, 5, 3, 3, 60, 40].map((height, i) => {
|
|
10813
10840
|
const totalBars = 19;
|
|
10814
10841
|
const barPrice = rangeMin + (rangeMax - rangeMin) / totalBars * i;
|
|
10815
10842
|
const isInRange = barPrice >= localRange[0] && barPrice <= localRange[1];
|
|
10816
|
-
return /* @__PURE__ */
|
|
10843
|
+
return /* @__PURE__ */ jsx68(
|
|
10817
10844
|
"div",
|
|
10818
10845
|
{
|
|
10819
10846
|
className: `flex-1 rounded-t-sm transition-opacity ${isInRange ? "bg-foreground" : "bg-foreground/20"}`,
|
|
@@ -10822,7 +10849,7 @@ function PriceSection() {
|
|
|
10822
10849
|
i
|
|
10823
10850
|
);
|
|
10824
10851
|
}) }),
|
|
10825
|
-
/* @__PURE__ */
|
|
10852
|
+
/* @__PURE__ */ jsx68("div", { style: { touchAction: "none" }, className: "my-6", children: /* @__PURE__ */ jsxs44(
|
|
10826
10853
|
Slider2.Root,
|
|
10827
10854
|
{
|
|
10828
10855
|
className: "relative flex w-full touch-none select-none items-center",
|
|
@@ -10840,8 +10867,8 @@ function PriceSection() {
|
|
|
10840
10867
|
step: 1,
|
|
10841
10868
|
minStepsBetweenThumbs: 1,
|
|
10842
10869
|
children: [
|
|
10843
|
-
/* @__PURE__ */
|
|
10844
|
-
/* @__PURE__ */
|
|
10870
|
+
/* @__PURE__ */ jsx68(Slider2.Track, { className: "relative h-3 w-full grow overflow-hidden rounded-full bg-foreground/20", children: /* @__PURE__ */ jsx68(Slider2.Range, { className: "absolute h-full bg-foreground" }) }),
|
|
10871
|
+
/* @__PURE__ */ jsx68(
|
|
10845
10872
|
Slider2.Thumb,
|
|
10846
10873
|
{
|
|
10847
10874
|
className: "block h-6 w-6 rounded-full bg-background shadow transition-all focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary disabled:pointer-events-none disabled:opacity-50 cursor-grab active:cursor-grabbing hover:scale-105 border-2 border-primary",
|
|
@@ -10855,7 +10882,7 @@ function PriceSection() {
|
|
|
10855
10882
|
"aria-valuetext": formatPrice2(localRange[0])
|
|
10856
10883
|
}
|
|
10857
10884
|
),
|
|
10858
|
-
/* @__PURE__ */
|
|
10885
|
+
/* @__PURE__ */ jsx68(
|
|
10859
10886
|
Slider2.Thumb,
|
|
10860
10887
|
{
|
|
10861
10888
|
className: "block h-6 w-6 rounded-full bg-background shadow transition-all focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary disabled:pointer-events-none disabled:opacity-50 cursor-grab active:cursor-grabbing hover:scale-105 border-2 border-primary",
|
|
@@ -10874,8 +10901,8 @@ function PriceSection() {
|
|
|
10874
10901
|
) }),
|
|
10875
10902
|
/* @__PURE__ */ jsxs44("div", { className: "grid grid-cols-2 gap-3", children: [
|
|
10876
10903
|
/* @__PURE__ */ jsxs44("div", { children: [
|
|
10877
|
-
/* @__PURE__ */
|
|
10878
|
-
/* @__PURE__ */
|
|
10904
|
+
/* @__PURE__ */ jsx68("label", { htmlFor: "price-min", className: "text-xs font-label text-foreground/60 mb-1.5 block", children: "Min" }),
|
|
10905
|
+
/* @__PURE__ */ jsx68(
|
|
10879
10906
|
"input",
|
|
10880
10907
|
{
|
|
10881
10908
|
id: "price-min",
|
|
@@ -10894,8 +10921,8 @@ function PriceSection() {
|
|
|
10894
10921
|
)
|
|
10895
10922
|
] }),
|
|
10896
10923
|
/* @__PURE__ */ jsxs44("div", { children: [
|
|
10897
|
-
/* @__PURE__ */
|
|
10898
|
-
/* @__PURE__ */
|
|
10924
|
+
/* @__PURE__ */ jsx68("label", { htmlFor: "price-max", className: "text-xs font-label text-foreground/60 mb-1.5 block", children: "Max" }),
|
|
10925
|
+
/* @__PURE__ */ jsx68(
|
|
10899
10926
|
"input",
|
|
10900
10927
|
{
|
|
10901
10928
|
id: "price-max",
|
|
@@ -10919,11 +10946,11 @@ function PriceSection() {
|
|
|
10919
10946
|
}
|
|
10920
10947
|
|
|
10921
10948
|
// src/composed/search/Filters.tsx
|
|
10922
|
-
import { Fragment as Fragment14, jsx as
|
|
10949
|
+
import { Fragment as Fragment14, jsx as jsx69, jsxs as jsxs45 } from "react/jsx-runtime";
|
|
10923
10950
|
function Filters({ buttonClassName, buttonText }) {
|
|
10924
10951
|
const [isOpen, setIsOpen] = useState36(false);
|
|
10925
10952
|
return /* @__PURE__ */ jsxs45(Fragment14, { children: [
|
|
10926
|
-
/* @__PURE__ */
|
|
10953
|
+
/* @__PURE__ */ jsx69(
|
|
10927
10954
|
FiltersButton,
|
|
10928
10955
|
{
|
|
10929
10956
|
onClick: () => setIsOpen(true),
|
|
@@ -10931,14 +10958,14 @@ function Filters({ buttonClassName, buttonText }) {
|
|
|
10931
10958
|
children: buttonText
|
|
10932
10959
|
}
|
|
10933
10960
|
),
|
|
10934
|
-
/* @__PURE__ */
|
|
10961
|
+
/* @__PURE__ */ jsx69(FiltersDrawer, { isOpen, onClose: () => setIsOpen(false) })
|
|
10935
10962
|
] });
|
|
10936
10963
|
}
|
|
10937
10964
|
|
|
10938
10965
|
// src/composed/search/CurrentRefinements.tsx
|
|
10939
10966
|
import { useCurrentRefinements } from "react-instantsearch";
|
|
10940
10967
|
import { X as LucideX3 } from "lucide-react";
|
|
10941
|
-
import { jsx as
|
|
10968
|
+
import { jsx as jsx70, jsxs as jsxs46 } from "react/jsx-runtime";
|
|
10942
10969
|
var XIcon3 = LucideX3;
|
|
10943
10970
|
function CurrentRefinements() {
|
|
10944
10971
|
const { items, refine } = useCurrentRefinements();
|
|
@@ -10984,15 +11011,15 @@ function CurrentRefinements() {
|
|
|
10984
11011
|
if (allRefinements.length === 0) {
|
|
10985
11012
|
return null;
|
|
10986
11013
|
}
|
|
10987
|
-
return /* @__PURE__ */
|
|
11014
|
+
return /* @__PURE__ */ jsx70("div", { className: "flex flex-wrap items-center gap-2 mb-4 -mt-1", role: "group", "aria-label": "Active filters", children: allRefinements.map((refinement, index) => /* @__PURE__ */ jsxs46(
|
|
10988
11015
|
"button",
|
|
10989
11016
|
{
|
|
10990
11017
|
className: "bg-primary text-on-primary hover:bg-primary/90 inline-flex h-7 items-center gap-1.5 rounded-full px-3 text-sm transition-colors",
|
|
10991
11018
|
onClick: () => refinement.refine(),
|
|
10992
11019
|
"aria-label": `Remove filter: ${refinement.displayLabel}`,
|
|
10993
11020
|
children: [
|
|
10994
|
-
/* @__PURE__ */
|
|
10995
|
-
/* @__PURE__ */
|
|
11021
|
+
/* @__PURE__ */ jsx70("span", { className: "truncate", children: refinement.displayLabel }),
|
|
11022
|
+
/* @__PURE__ */ jsx70(XIcon3, { className: "w-3 h-3" })
|
|
10996
11023
|
]
|
|
10997
11024
|
},
|
|
10998
11025
|
`${refinement.attribute}-${refinement.value}-${index}`
|
|
@@ -11021,7 +11048,7 @@ import { useState as useState39, useEffect as useEffect39 } from "react";
|
|
|
11021
11048
|
// src/composed/zoom/ZoomOverlay.tsx
|
|
11022
11049
|
import { useState as useState37, useCallback as useCallback20 } from "react";
|
|
11023
11050
|
import { Plus as LucidePlus2, Minus as LucideMinus2 } from "lucide-react";
|
|
11024
|
-
import { Fragment as Fragment15, jsx as
|
|
11051
|
+
import { Fragment as Fragment15, jsx as jsx71, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
11025
11052
|
var PlusIcon2 = LucidePlus2;
|
|
11026
11053
|
var MinusIcon2 = LucideMinus2;
|
|
11027
11054
|
function ZoomOverlay({
|
|
@@ -11081,8 +11108,8 @@ function ZoomOverlay({
|
|
|
11081
11108
|
const isHovered = hoveredImageIndex === imageIndex;
|
|
11082
11109
|
const cursorStyle = isLargeTouchDevice ? "pointer" : isTouchDevice ? "default" : "none";
|
|
11083
11110
|
return /* @__PURE__ */ jsxs47(Fragment15, { children: [
|
|
11084
|
-
/* @__PURE__ */
|
|
11085
|
-
/* @__PURE__ */
|
|
11111
|
+
/* @__PURE__ */ jsx71("div", { className: "sr-only", role: "status", "aria-live": "polite", "aria-atomic": "true", children: announcement }),
|
|
11112
|
+
/* @__PURE__ */ jsx71(
|
|
11086
11113
|
"div",
|
|
11087
11114
|
{
|
|
11088
11115
|
className,
|
|
@@ -11090,7 +11117,7 @@ function ZoomOverlay({
|
|
|
11090
11117
|
...style,
|
|
11091
11118
|
position: "relative"
|
|
11092
11119
|
},
|
|
11093
|
-
children: /* @__PURE__ */
|
|
11120
|
+
children: /* @__PURE__ */ jsx71(
|
|
11094
11121
|
"div",
|
|
11095
11122
|
{
|
|
11096
11123
|
style: {
|
|
@@ -11113,7 +11140,7 @@ function ZoomOverlay({
|
|
|
11113
11140
|
handleZoomClick(e);
|
|
11114
11141
|
}
|
|
11115
11142
|
},
|
|
11116
|
-
children: /* @__PURE__ */
|
|
11143
|
+
children: /* @__PURE__ */ jsx71(
|
|
11117
11144
|
"div",
|
|
11118
11145
|
{
|
|
11119
11146
|
style: {
|
|
@@ -11129,7 +11156,7 @@ function ZoomOverlay({
|
|
|
11129
11156
|
)
|
|
11130
11157
|
}
|
|
11131
11158
|
),
|
|
11132
|
-
isHovered && !isTouchDevice && /* @__PURE__ */
|
|
11159
|
+
isHovered && !isTouchDevice && /* @__PURE__ */ jsx71(
|
|
11133
11160
|
"div",
|
|
11134
11161
|
{
|
|
11135
11162
|
className: "fixed pointer-events-none z-50 hidden md:block",
|
|
@@ -11139,7 +11166,7 @@ function ZoomOverlay({
|
|
|
11139
11166
|
transform: "translate(-50%, -50%)"
|
|
11140
11167
|
},
|
|
11141
11168
|
"aria-hidden": "true",
|
|
11142
|
-
children: /* @__PURE__ */
|
|
11169
|
+
children: /* @__PURE__ */ jsx71("div", { className: "bg-white dark:bg-gray-800 rounded-full p-2 shadow-sm dark:shadow-gray-950/50", children: isZoomed ? /* @__PURE__ */ jsx71(
|
|
11143
11170
|
MinusIcon2,
|
|
11144
11171
|
{
|
|
11145
11172
|
size: 20,
|
|
@@ -11147,7 +11174,7 @@ function ZoomOverlay({
|
|
|
11147
11174
|
strokeWidth: 1.5,
|
|
11148
11175
|
"aria-hidden": "true"
|
|
11149
11176
|
}
|
|
11150
|
-
) : /* @__PURE__ */
|
|
11177
|
+
) : /* @__PURE__ */ jsx71(
|
|
11151
11178
|
PlusIcon2,
|
|
11152
11179
|
{
|
|
11153
11180
|
size: 20,
|
|
@@ -11175,7 +11202,7 @@ import {
|
|
|
11175
11202
|
TransformComponent as OriginalTransformComponent
|
|
11176
11203
|
} from "react-zoom-pan-pinch";
|
|
11177
11204
|
import { X as X2 } from "lucide-react";
|
|
11178
|
-
import { Fragment as Fragment16, jsx as
|
|
11205
|
+
import { Fragment as Fragment16, jsx as jsx72, jsxs as jsxs48 } from "react/jsx-runtime";
|
|
11179
11206
|
var TransformWrapper = OriginalTransformWrapper;
|
|
11180
11207
|
var TransformComponent = OriginalTransformComponent;
|
|
11181
11208
|
var EnhancedImageViewer = ({
|
|
@@ -11315,12 +11342,12 @@ var EnhancedImageViewer = ({
|
|
|
11315
11342
|
);
|
|
11316
11343
|
if (!isMounted || !isClient) {
|
|
11317
11344
|
return createPortal3(
|
|
11318
|
-
/* @__PURE__ */
|
|
11345
|
+
/* @__PURE__ */ jsx72(
|
|
11319
11346
|
"div",
|
|
11320
11347
|
{
|
|
11321
11348
|
className: "fixed inset-0 bg-black flex items-center justify-center",
|
|
11322
11349
|
style: { zIndex: 999999 },
|
|
11323
|
-
children: /* @__PURE__ */
|
|
11350
|
+
children: /* @__PURE__ */ jsx72(
|
|
11324
11351
|
"div",
|
|
11325
11352
|
{
|
|
11326
11353
|
style: {
|
|
@@ -11345,7 +11372,7 @@ var EnhancedImageViewer = ({
|
|
|
11345
11372
|
"aria-modal": "true",
|
|
11346
11373
|
"aria-label": "Image viewer",
|
|
11347
11374
|
children: [
|
|
11348
|
-
/* @__PURE__ */
|
|
11375
|
+
/* @__PURE__ */ jsx72(
|
|
11349
11376
|
"button",
|
|
11350
11377
|
{
|
|
11351
11378
|
onClick: (e) => {
|
|
@@ -11371,10 +11398,10 @@ var EnhancedImageViewer = ({
|
|
|
11371
11398
|
touchAction: "manipulation",
|
|
11372
11399
|
marginBottom: "env(safe-area-inset-bottom, 0px)"
|
|
11373
11400
|
},
|
|
11374
|
-
children: /* @__PURE__ */
|
|
11401
|
+
children: /* @__PURE__ */ jsx72(X2, { className: "w-7 h-7", strokeWidth: 2.5 })
|
|
11375
11402
|
}
|
|
11376
11403
|
),
|
|
11377
|
-
/* @__PURE__ */
|
|
11404
|
+
/* @__PURE__ */ jsx72(
|
|
11378
11405
|
TransformWrapper,
|
|
11379
11406
|
{
|
|
11380
11407
|
initialScale: scale.initial,
|
|
@@ -11421,14 +11448,14 @@ var EnhancedImageViewer = ({
|
|
|
11421
11448
|
onTouchStart: handleTouchStart,
|
|
11422
11449
|
onTouchEnd: handleTouchEnd,
|
|
11423
11450
|
children: [
|
|
11424
|
-
/* @__PURE__ */
|
|
11451
|
+
/* @__PURE__ */ jsx72(
|
|
11425
11452
|
TransformComponent,
|
|
11426
11453
|
{
|
|
11427
11454
|
wrapperStyle: {
|
|
11428
11455
|
width: "100%",
|
|
11429
11456
|
height: "100%"
|
|
11430
11457
|
},
|
|
11431
|
-
children: /* @__PURE__ */
|
|
11458
|
+
children: /* @__PURE__ */ jsx72(
|
|
11432
11459
|
"div",
|
|
11433
11460
|
{
|
|
11434
11461
|
style: {
|
|
@@ -11439,7 +11466,7 @@ var EnhancedImageViewer = ({
|
|
|
11439
11466
|
alignItems: "center",
|
|
11440
11467
|
justifyContent: "center"
|
|
11441
11468
|
},
|
|
11442
|
-
children: /* @__PURE__ */
|
|
11469
|
+
children: /* @__PURE__ */ jsx72(
|
|
11443
11470
|
SafeImg,
|
|
11444
11471
|
{
|
|
11445
11472
|
ref: imgRef,
|
|
@@ -11461,7 +11488,7 @@ var EnhancedImageViewer = ({
|
|
|
11461
11488
|
}
|
|
11462
11489
|
),
|
|
11463
11490
|
/* @__PURE__ */ jsxs48("div", { className: "fixed bottom-5 left-0 right-0 z-50", children: [
|
|
11464
|
-
/* @__PURE__ */
|
|
11491
|
+
/* @__PURE__ */ jsx72("div", { className: "flex justify-center gap-2", children: (() => {
|
|
11465
11492
|
let currentIndex = propCurrentIndex !== void 0 ? propCurrentIndex : -1;
|
|
11466
11493
|
if (currentIndex === -1) {
|
|
11467
11494
|
currentIndex = images.findIndex(
|
|
@@ -11495,7 +11522,7 @@ var EnhancedImageViewer = ({
|
|
|
11495
11522
|
const nextIndex = findNextAvailableIndex(currentIndex, 1);
|
|
11496
11523
|
const prevIndex = findNextAvailableIndex(currentIndex, -1);
|
|
11497
11524
|
return /* @__PURE__ */ jsxs48(Fragment16, { children: [
|
|
11498
|
-
/* @__PURE__ */
|
|
11525
|
+
/* @__PURE__ */ jsx72(
|
|
11499
11526
|
"button",
|
|
11500
11527
|
{
|
|
11501
11528
|
onClick: () => {
|
|
@@ -11508,7 +11535,7 @@ var EnhancedImageViewer = ({
|
|
|
11508
11535
|
className: `w-10 h-10 rounded-full shadow-lg flex items-center justify-center transition-all duration-200 ${prevIndex === -1 ? "bg-white/40 text-black opacity-50 cursor-not-allowed" : "bg-white/90 hover:bg-white text-black"}`,
|
|
11509
11536
|
style: { touchAction: "manipulation" },
|
|
11510
11537
|
"aria-label": "Previous image",
|
|
11511
|
-
children: /* @__PURE__ */
|
|
11538
|
+
children: /* @__PURE__ */ jsx72(
|
|
11512
11539
|
"svg",
|
|
11513
11540
|
{
|
|
11514
11541
|
className: "w-4 h-4",
|
|
@@ -11516,7 +11543,7 @@ var EnhancedImageViewer = ({
|
|
|
11516
11543
|
stroke: "currentColor",
|
|
11517
11544
|
viewBox: "0 0 24 24",
|
|
11518
11545
|
"aria-hidden": "true",
|
|
11519
|
-
children: /* @__PURE__ */
|
|
11546
|
+
children: /* @__PURE__ */ jsx72(
|
|
11520
11547
|
"path",
|
|
11521
11548
|
{
|
|
11522
11549
|
strokeLinecap: "round",
|
|
@@ -11529,7 +11556,7 @@ var EnhancedImageViewer = ({
|
|
|
11529
11556
|
)
|
|
11530
11557
|
}
|
|
11531
11558
|
),
|
|
11532
|
-
/* @__PURE__ */
|
|
11559
|
+
/* @__PURE__ */ jsx72(
|
|
11533
11560
|
"button",
|
|
11534
11561
|
{
|
|
11535
11562
|
onClick: () => {
|
|
@@ -11542,7 +11569,7 @@ var EnhancedImageViewer = ({
|
|
|
11542
11569
|
className: `w-10 h-10 rounded-full shadow-lg flex items-center justify-center transition-all duration-200 ${nextIndex === -1 ? "bg-white/40 text-black opacity-50 cursor-not-allowed" : "bg-white/90 hover:bg-white text-black"}`,
|
|
11543
11570
|
style: { touchAction: "manipulation" },
|
|
11544
11571
|
"aria-label": "Next image",
|
|
11545
|
-
children: /* @__PURE__ */
|
|
11572
|
+
children: /* @__PURE__ */ jsx72(
|
|
11546
11573
|
"svg",
|
|
11547
11574
|
{
|
|
11548
11575
|
className: "w-4 h-4",
|
|
@@ -11550,7 +11577,7 @@ var EnhancedImageViewer = ({
|
|
|
11550
11577
|
stroke: "currentColor",
|
|
11551
11578
|
viewBox: "0 0 24 24",
|
|
11552
11579
|
"aria-hidden": "true",
|
|
11553
|
-
children: /* @__PURE__ */
|
|
11580
|
+
children: /* @__PURE__ */ jsx72(
|
|
11554
11581
|
"path",
|
|
11555
11582
|
{
|
|
11556
11583
|
strokeLinecap: "round",
|
|
@@ -11565,7 +11592,7 @@ var EnhancedImageViewer = ({
|
|
|
11565
11592
|
)
|
|
11566
11593
|
] });
|
|
11567
11594
|
})() }),
|
|
11568
|
-
/* @__PURE__ */
|
|
11595
|
+
/* @__PURE__ */ jsx72("div", { style: { position: "fixed", bottom: 20, left: 24, zIndex: 10, marginBottom: "env(safe-area-inset-bottom, 0px)" }, className: "h-10 px-3 rounded-full bg-white/90 text-black text-sm font-medium flex items-center justify-center shadow-lg", children: (() => {
|
|
11569
11596
|
const total = Math.max(images.length, 1);
|
|
11570
11597
|
const current = propCurrentIndex !== void 0 ? Math.min(propCurrentIndex + 1, total) : 1;
|
|
11571
11598
|
return `${current} / ${total}`;
|
|
@@ -11577,7 +11604,7 @@ var EnhancedImageViewer = ({
|
|
|
11577
11604
|
},
|
|
11578
11605
|
`${scale.initial}-${scale.min}-${scale.max}`
|
|
11579
11606
|
),
|
|
11580
|
-
/* @__PURE__ */
|
|
11607
|
+
/* @__PURE__ */ jsx72(
|
|
11581
11608
|
"div",
|
|
11582
11609
|
{
|
|
11583
11610
|
className: "absolute inset-0 bg-black",
|
|
@@ -11596,7 +11623,7 @@ var EnhancedImageViewer = ({
|
|
|
11596
11623
|
};
|
|
11597
11624
|
|
|
11598
11625
|
// src/composed/zoom/ResponsiveZoom.tsx
|
|
11599
|
-
import { Fragment as Fragment17, jsx as
|
|
11626
|
+
import { Fragment as Fragment17, jsx as jsx73, jsxs as jsxs49 } from "react/jsx-runtime";
|
|
11600
11627
|
function ResponsiveZoom({
|
|
11601
11628
|
imageIndex,
|
|
11602
11629
|
children,
|
|
@@ -11638,7 +11665,7 @@ function ResponsiveZoom({
|
|
|
11638
11665
|
}
|
|
11639
11666
|
};
|
|
11640
11667
|
return /* @__PURE__ */ jsxs49(Fragment17, { children: [
|
|
11641
|
-
isTouchDevice ? /* @__PURE__ */
|
|
11668
|
+
isTouchDevice ? /* @__PURE__ */ jsx73(
|
|
11642
11669
|
"div",
|
|
11643
11670
|
{
|
|
11644
11671
|
className,
|
|
@@ -11655,7 +11682,7 @@ function ResponsiveZoom({
|
|
|
11655
11682
|
},
|
|
11656
11683
|
children
|
|
11657
11684
|
}
|
|
11658
|
-
) : /* @__PURE__ */
|
|
11685
|
+
) : /* @__PURE__ */ jsx73(
|
|
11659
11686
|
ZoomOverlay,
|
|
11660
11687
|
{
|
|
11661
11688
|
imageIndex,
|
|
@@ -11666,7 +11693,7 @@ function ResponsiveZoom({
|
|
|
11666
11693
|
children
|
|
11667
11694
|
}
|
|
11668
11695
|
),
|
|
11669
|
-
showEnhancedViewer && isTouchDevice && currentImageUrl && /* @__PURE__ */
|
|
11696
|
+
showEnhancedViewer && isTouchDevice && currentImageUrl && /* @__PURE__ */ jsx73(
|
|
11670
11697
|
EnhancedImageViewer,
|
|
11671
11698
|
{
|
|
11672
11699
|
imageUrl: currentImageUrl,
|
|
@@ -11697,7 +11724,7 @@ import {
|
|
|
11697
11724
|
useMemo as useMemo15,
|
|
11698
11725
|
memo as memo4
|
|
11699
11726
|
} from "react";
|
|
11700
|
-
import { jsx as
|
|
11727
|
+
import { jsx as jsx74, jsxs as jsxs50 } from "react/jsx-runtime";
|
|
11701
11728
|
function StaticCarouselImage({
|
|
11702
11729
|
src,
|
|
11703
11730
|
alt,
|
|
@@ -11705,9 +11732,9 @@ function StaticCarouselImage({
|
|
|
11705
11732
|
}) {
|
|
11706
11733
|
const [failed, setFailed] = useState40(false);
|
|
11707
11734
|
if (failed || !src) {
|
|
11708
|
-
return /* @__PURE__ */
|
|
11735
|
+
return /* @__PURE__ */ jsx74("div", { className: `bg-muted ${className ?? ""}`, role: "img", "aria-label": alt });
|
|
11709
11736
|
}
|
|
11710
|
-
return /* @__PURE__ */
|
|
11737
|
+
return /* @__PURE__ */ jsx74(
|
|
11711
11738
|
"img",
|
|
11712
11739
|
{
|
|
11713
11740
|
src,
|
|
@@ -12197,14 +12224,14 @@ var MobileProductCarousel = memo4(function MobileProductCarousel2({
|
|
|
12197
12224
|
);
|
|
12198
12225
|
useEffect40(() => {
|
|
12199
12226
|
if (stickyHeroContext?.setCarouselIndicator && images.length > 1) {
|
|
12200
|
-
const indicator = /* @__PURE__ */
|
|
12227
|
+
const indicator = /* @__PURE__ */ jsx74(
|
|
12201
12228
|
"div",
|
|
12202
12229
|
{
|
|
12203
12230
|
className: "w-full",
|
|
12204
12231
|
role: "group",
|
|
12205
12232
|
"aria-label": "Product image navigation",
|
|
12206
12233
|
children: /* @__PURE__ */ jsxs50("div", { className: "relative h-1", children: [
|
|
12207
|
-
/* @__PURE__ */
|
|
12234
|
+
/* @__PURE__ */ jsx74("div", { className: "flex h-full", children: images.map((_, index) => /* @__PURE__ */ jsx74(
|
|
12208
12235
|
"button",
|
|
12209
12236
|
{
|
|
12210
12237
|
onClick: () => goToSlide(index),
|
|
@@ -12214,7 +12241,7 @@ var MobileProductCarousel = memo4(function MobileProductCarousel2({
|
|
|
12214
12241
|
},
|
|
12215
12242
|
index
|
|
12216
12243
|
)) }),
|
|
12217
|
-
/* @__PURE__ */
|
|
12244
|
+
/* @__PURE__ */ jsx74(
|
|
12218
12245
|
"div",
|
|
12219
12246
|
{
|
|
12220
12247
|
className: "absolute top-0 h-full bg-primary transition-all duration-300 ease-out",
|
|
@@ -12237,10 +12264,10 @@ var MobileProductCarousel = memo4(function MobileProductCarousel2({
|
|
|
12237
12264
|
};
|
|
12238
12265
|
}, [activeIndex, images.length, goToSlide, stickyHeroContext]);
|
|
12239
12266
|
if (!images || images.length === 0) {
|
|
12240
|
-
return /* @__PURE__ */
|
|
12267
|
+
return /* @__PURE__ */ jsx74("div", { className: "w-full aspect-video bg-muted rounded-lg" });
|
|
12241
12268
|
}
|
|
12242
12269
|
return /* @__PURE__ */ jsxs50("div", { className: `relative w-full h-full ${className}`, children: [
|
|
12243
|
-
/* @__PURE__ */
|
|
12270
|
+
/* @__PURE__ */ jsx74(
|
|
12244
12271
|
"div",
|
|
12245
12272
|
{
|
|
12246
12273
|
ref: carouselRef,
|
|
@@ -12258,7 +12285,7 @@ var MobileProductCarousel = memo4(function MobileProductCarousel2({
|
|
|
12258
12285
|
role: "region",
|
|
12259
12286
|
"aria-roledescription": "carousel",
|
|
12260
12287
|
"aria-label": "Product images",
|
|
12261
|
-
children: /* @__PURE__ */
|
|
12288
|
+
children: /* @__PURE__ */ jsx74(
|
|
12262
12289
|
"div",
|
|
12263
12290
|
{
|
|
12264
12291
|
className: `flex h-full ${isPeekReturning ? "transition-transform duration-300 ease-[cubic-bezier(0,0,0.2,1)]" : isPeeking ? "transition-transform duration-500 ease-[cubic-bezier(0.4,0,0.2,1)]" : isTransitioning || !isDragging ? "transition-transform duration-300 ease-[cubic-bezier(0.25,0.46,0.45,0.94)]" : ""}`,
|
|
@@ -12268,15 +12295,15 @@ var MobileProductCarousel = memo4(function MobileProductCarousel2({
|
|
|
12268
12295
|
children: images.map((image, index) => {
|
|
12269
12296
|
const DECODE_WINDOW = 1;
|
|
12270
12297
|
const isWithinDecodeWindow = Math.abs(index - activeIndex) <= DECODE_WINDOW;
|
|
12271
|
-
return /* @__PURE__ */
|
|
12298
|
+
return /* @__PURE__ */ jsx74(
|
|
12272
12299
|
"div",
|
|
12273
12300
|
{
|
|
12274
12301
|
className: "w-full h-full flex-shrink-0 relative select-none",
|
|
12275
|
-
children: !isWithinDecodeWindow ? /* @__PURE__ */
|
|
12302
|
+
children: !isWithinDecodeWindow ? /* @__PURE__ */ jsx74("div", { className: "w-full h-full bg-muted" }) : image.isPlaceholder ? (
|
|
12276
12303
|
// Rainbow prism loader (same as the /create route) instead of
|
|
12277
12304
|
// a flat pulse; fills this relative slide via inset:0.
|
|
12278
|
-
/* @__PURE__ */
|
|
12279
|
-
) : image.isRealMockup && currentArtwork ? /* @__PURE__ */
|
|
12305
|
+
/* @__PURE__ */ jsx74(LoadingOverlayPrismCandyInline, { visible: true, variant: "light" })
|
|
12306
|
+
) : image.isRealMockup && currentArtwork ? /* @__PURE__ */ jsx74(
|
|
12280
12307
|
HeroProductImage,
|
|
12281
12308
|
{
|
|
12282
12309
|
productId,
|
|
@@ -12288,7 +12315,7 @@ var MobileProductCarousel = memo4(function MobileProductCarousel2({
|
|
|
12288
12315
|
onUrlGenerated: image.mockupId ? (url) => handleUrlGenerated(image.mockupId, url) : void 0,
|
|
12289
12316
|
className: "w-full h-full object-cover cursor-pointer pointer-events-none"
|
|
12290
12317
|
}
|
|
12291
|
-
) : image.isRealMockup && !currentArtwork ? /* @__PURE__ */
|
|
12318
|
+
) : image.isRealMockup && !currentArtwork ? /* @__PURE__ */ jsx74(LoadingOverlayPrismCandyInline, { visible: true, variant: "light" }) : /* @__PURE__ */ jsx74(
|
|
12292
12319
|
StaticCarouselImage,
|
|
12293
12320
|
{
|
|
12294
12321
|
src: image.src,
|
|
@@ -12304,7 +12331,7 @@ var MobileProductCarousel = memo4(function MobileProductCarousel2({
|
|
|
12304
12331
|
)
|
|
12305
12332
|
}
|
|
12306
12333
|
),
|
|
12307
|
-
showIndicators && images.length > 1 && /* @__PURE__ */
|
|
12334
|
+
showIndicators && images.length > 1 && /* @__PURE__ */ jsx74(
|
|
12308
12335
|
"div",
|
|
12309
12336
|
{
|
|
12310
12337
|
ref: indicatorRef,
|
|
@@ -12313,7 +12340,7 @@ var MobileProductCarousel = memo4(function MobileProductCarousel2({
|
|
|
12313
12340
|
role: "group",
|
|
12314
12341
|
"aria-label": "Product image navigation",
|
|
12315
12342
|
children: /* @__PURE__ */ jsxs50("div", { className: "relative h-1", children: [
|
|
12316
|
-
/* @__PURE__ */
|
|
12343
|
+
/* @__PURE__ */ jsx74("div", { className: "flex h-full absolute inset-0", children: images.map((_, index) => /* @__PURE__ */ jsx74(
|
|
12317
12344
|
"button",
|
|
12318
12345
|
{
|
|
12319
12346
|
onClick: () => goToSlide(index),
|
|
@@ -12323,7 +12350,7 @@ var MobileProductCarousel = memo4(function MobileProductCarousel2({
|
|
|
12323
12350
|
},
|
|
12324
12351
|
index
|
|
12325
12352
|
)) }),
|
|
12326
|
-
/* @__PURE__ */
|
|
12353
|
+
/* @__PURE__ */ jsx74(
|
|
12327
12354
|
"div",
|
|
12328
12355
|
{
|
|
12329
12356
|
className: `absolute top-0 h-full bg-foreground ${isPeekReturning ? "transition-all duration-300 ease-[cubic-bezier(0,0,0.2,1)]" : isPeeking ? "transition-all duration-500 ease-[cubic-bezier(0.4,0,0.2,1)]" : isDragging ? "" : "transition-all duration-300 ease-out"}`,
|
|
@@ -12358,7 +12385,7 @@ var MobileProductCarousel = memo4(function MobileProductCarousel2({
|
|
|
12358
12385
|
naturalHeight: img.naturalHeight
|
|
12359
12386
|
} : null;
|
|
12360
12387
|
}).filter((img) => img !== null);
|
|
12361
|
-
return /* @__PURE__ */
|
|
12388
|
+
return /* @__PURE__ */ jsx74(
|
|
12362
12389
|
EnhancedImageViewer,
|
|
12363
12390
|
{
|
|
12364
12391
|
imageUrl,
|
|
@@ -12398,7 +12425,7 @@ var MobileProductCarousel = memo4(function MobileProductCarousel2({
|
|
|
12398
12425
|
|
|
12399
12426
|
// src/composed/carousels/HeroCarousel.tsx
|
|
12400
12427
|
import { useState as useState41, useRef as useRef27, useCallback as useCallback23, useEffect as useEffect41 } from "react";
|
|
12401
|
-
import { jsx as
|
|
12428
|
+
import { jsx as jsx75, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
12402
12429
|
function HeroCarousel({
|
|
12403
12430
|
images,
|
|
12404
12431
|
currentIndex = 0,
|
|
@@ -12477,7 +12504,7 @@ function HeroCarousel({
|
|
|
12477
12504
|
};
|
|
12478
12505
|
}, [activeIndex, images.length, goToSlide, onImageTap]);
|
|
12479
12506
|
if (!images || images.length === 0) {
|
|
12480
|
-
return /* @__PURE__ */
|
|
12507
|
+
return /* @__PURE__ */ jsx75("div", { className: "w-full h-full bg-muted" });
|
|
12481
12508
|
}
|
|
12482
12509
|
return /* @__PURE__ */ jsxs51(
|
|
12483
12510
|
"div",
|
|
@@ -12490,7 +12517,7 @@ function HeroCarousel({
|
|
|
12490
12517
|
overflow: "hidden"
|
|
12491
12518
|
},
|
|
12492
12519
|
children: [
|
|
12493
|
-
/* @__PURE__ */
|
|
12520
|
+
/* @__PURE__ */ jsx75(
|
|
12494
12521
|
"div",
|
|
12495
12522
|
{
|
|
12496
12523
|
className: "flex h-full transition-transform duration-300 ease-out",
|
|
@@ -12501,14 +12528,14 @@ function HeroCarousel({
|
|
|
12501
12528
|
backfaceVisibility: "hidden",
|
|
12502
12529
|
WebkitBackfaceVisibility: "hidden"
|
|
12503
12530
|
},
|
|
12504
|
-
children: images.map((image, index) => /* @__PURE__ */
|
|
12531
|
+
children: images.map((image, index) => /* @__PURE__ */ jsx75(
|
|
12505
12532
|
"div",
|
|
12506
12533
|
{
|
|
12507
12534
|
className: "w-full h-full flex-shrink-0",
|
|
12508
12535
|
style: {
|
|
12509
12536
|
contain: "layout paint"
|
|
12510
12537
|
},
|
|
12511
|
-
children: image.isRealMockup && currentArtwork ? /* @__PURE__ */
|
|
12538
|
+
children: image.isRealMockup && currentArtwork ? /* @__PURE__ */ jsx75(
|
|
12512
12539
|
HeroProductImage,
|
|
12513
12540
|
{
|
|
12514
12541
|
productId,
|
|
@@ -12517,7 +12544,7 @@ function HeroCarousel({
|
|
|
12517
12544
|
mockupId: image.mockupId,
|
|
12518
12545
|
className: "w-full h-full object-cover"
|
|
12519
12546
|
}
|
|
12520
|
-
) : /* @__PURE__ */
|
|
12547
|
+
) : /* @__PURE__ */ jsx75(
|
|
12521
12548
|
"img",
|
|
12522
12549
|
{
|
|
12523
12550
|
src: image.src,
|
|
@@ -12534,12 +12561,12 @@ function HeroCarousel({
|
|
|
12534
12561
|
))
|
|
12535
12562
|
}
|
|
12536
12563
|
),
|
|
12537
|
-
images.length > 1 && /* @__PURE__ */
|
|
12564
|
+
images.length > 1 && /* @__PURE__ */ jsx75(
|
|
12538
12565
|
"div",
|
|
12539
12566
|
{
|
|
12540
12567
|
className: "absolute bottom-4 left-0 right-0 flex justify-center gap-2 z-10",
|
|
12541
12568
|
style: { contain: "layout style" },
|
|
12542
|
-
children: images.map((_, index) => /* @__PURE__ */
|
|
12569
|
+
children: images.map((_, index) => /* @__PURE__ */ jsx75(
|
|
12543
12570
|
"button",
|
|
12544
12571
|
{
|
|
12545
12572
|
onClick: () => goToSlide(index),
|
|
@@ -12557,7 +12584,7 @@ function HeroCarousel({
|
|
|
12557
12584
|
|
|
12558
12585
|
// src/composed/grids/MasonryGrid.tsx
|
|
12559
12586
|
import { useState as useState42, useEffect as useEffect42, useMemo as useMemo16 } from "react";
|
|
12560
|
-
import { Fragment as Fragment18, jsx as
|
|
12587
|
+
import { Fragment as Fragment18, jsx as jsx76 } from "react/jsx-runtime";
|
|
12561
12588
|
var BREAKPOINTS = {
|
|
12562
12589
|
sm: 640,
|
|
12563
12590
|
md: 768,
|
|
@@ -12629,24 +12656,24 @@ function MasonryGrid({
|
|
|
12629
12656
|
);
|
|
12630
12657
|
if (items.length === 0) {
|
|
12631
12658
|
if (emptyContent) {
|
|
12632
|
-
return /* @__PURE__ */
|
|
12659
|
+
return /* @__PURE__ */ jsx76(Fragment18, { children: emptyContent });
|
|
12633
12660
|
}
|
|
12634
12661
|
return null;
|
|
12635
12662
|
}
|
|
12636
|
-
return /* @__PURE__ */
|
|
12663
|
+
return /* @__PURE__ */ jsx76(
|
|
12637
12664
|
"div",
|
|
12638
12665
|
{
|
|
12639
12666
|
className: `flex ${className}`,
|
|
12640
12667
|
style: { gap: `${gap}px` },
|
|
12641
12668
|
role: "list",
|
|
12642
|
-
children: distributedColumns.map((columnItems, columnIndex) => /* @__PURE__ */
|
|
12669
|
+
children: distributedColumns.map((columnItems, columnIndex) => /* @__PURE__ */ jsx76(
|
|
12643
12670
|
"div",
|
|
12644
12671
|
{
|
|
12645
12672
|
className: "flex-1 flex flex-col",
|
|
12646
12673
|
style: { gap: `${gap}px` },
|
|
12647
12674
|
children: columnItems.map((item, itemIndex) => {
|
|
12648
12675
|
const originalIndex = itemIndex * columnCount + columnIndex;
|
|
12649
|
-
return /* @__PURE__ */
|
|
12676
|
+
return /* @__PURE__ */ jsx76("div", { role: "listitem", children: renderItem(item, originalIndex) }, originalIndex);
|
|
12650
12677
|
})
|
|
12651
12678
|
},
|
|
12652
12679
|
columnIndex
|
|
@@ -12745,7 +12772,7 @@ function useHeroZoomScales(config = {}) {
|
|
|
12745
12772
|
}
|
|
12746
12773
|
|
|
12747
12774
|
// src/layouts/hero-zoom/HeroZoomLayout.tsx
|
|
12748
|
-
import { jsx as
|
|
12775
|
+
import { jsx as jsx77, jsxs as jsxs52 } from "react/jsx-runtime";
|
|
12749
12776
|
function HeroZoomLayout({
|
|
12750
12777
|
config = {},
|
|
12751
12778
|
header,
|
|
@@ -12918,8 +12945,8 @@ function HeroZoomLayout({
|
|
|
12918
12945
|
"--hero-zoom-final-transform": 1 / activeRender
|
|
12919
12946
|
},
|
|
12920
12947
|
children: [
|
|
12921
|
-
/* @__PURE__ */
|
|
12922
|
-
/* @__PURE__ */
|
|
12948
|
+
/* @__PURE__ */ jsx77("style", { dangerouslySetInnerHTML: { __html: scopedStyles } }),
|
|
12949
|
+
/* @__PURE__ */ jsx77(
|
|
12923
12950
|
"div",
|
|
12924
12951
|
{
|
|
12925
12952
|
style: {
|
|
@@ -12927,7 +12954,7 @@ function HeroZoomLayout({
|
|
|
12927
12954
|
}
|
|
12928
12955
|
}
|
|
12929
12956
|
),
|
|
12930
|
-
header && /* @__PURE__ */
|
|
12957
|
+
header && /* @__PURE__ */ jsx77(
|
|
12931
12958
|
"div",
|
|
12932
12959
|
{
|
|
12933
12960
|
ref: headerRef,
|
|
@@ -12940,7 +12967,7 @@ function HeroZoomLayout({
|
|
|
12940
12967
|
children: header
|
|
12941
12968
|
}
|
|
12942
12969
|
),
|
|
12943
|
-
/* @__PURE__ */
|
|
12970
|
+
/* @__PURE__ */ jsx77(
|
|
12944
12971
|
"div",
|
|
12945
12972
|
{
|
|
12946
12973
|
ref: imageContainerRef,
|
|
@@ -12960,7 +12987,7 @@ function HeroZoomLayout({
|
|
|
12960
12987
|
children: hero
|
|
12961
12988
|
}
|
|
12962
12989
|
),
|
|
12963
|
-
/* @__PURE__ */
|
|
12990
|
+
/* @__PURE__ */ jsx77("div", { className: "relative z-10", children })
|
|
12964
12991
|
]
|
|
12965
12992
|
}
|
|
12966
12993
|
);
|
|
@@ -12968,7 +12995,7 @@ function HeroZoomLayout({
|
|
|
12968
12995
|
|
|
12969
12996
|
// src/layouts/hero-zoom/HeroShrinkLayout.tsx
|
|
12970
12997
|
import { useEffect as useEffect45, useRef as useRef29, useState as useState44 } from "react";
|
|
12971
|
-
import { jsx as
|
|
12998
|
+
import { jsx as jsx78, jsxs as jsxs53 } from "react/jsx-runtime";
|
|
12972
12999
|
var DEFAULT_CONFIG = {
|
|
12973
13000
|
aspectRatio: 16 / 9,
|
|
12974
13001
|
initialHeightPercent: 70,
|
|
@@ -13087,9 +13114,9 @@ function HeroShrinkLayout({
|
|
|
13087
13114
|
className: `relative min-h-screen ${className}`,
|
|
13088
13115
|
style: { ...style, ...cssVars },
|
|
13089
13116
|
children: [
|
|
13090
|
-
/* @__PURE__ */
|
|
13091
|
-
/* @__PURE__ */
|
|
13092
|
-
header && /* @__PURE__ */
|
|
13117
|
+
/* @__PURE__ */ jsx78("style", { dangerouslySetInnerHTML: { __html: scopedStyles } }),
|
|
13118
|
+
/* @__PURE__ */ jsx78("div", { style: { height: spacerHeight } }),
|
|
13119
|
+
header && /* @__PURE__ */ jsx78(
|
|
13093
13120
|
"div",
|
|
13094
13121
|
{
|
|
13095
13122
|
ref: headerRef,
|
|
@@ -13098,7 +13125,7 @@ function HeroShrinkLayout({
|
|
|
13098
13125
|
children: header
|
|
13099
13126
|
}
|
|
13100
13127
|
),
|
|
13101
|
-
/* @__PURE__ */
|
|
13128
|
+
/* @__PURE__ */ jsx78(
|
|
13102
13129
|
"div",
|
|
13103
13130
|
{
|
|
13104
13131
|
ref: heroRef,
|
|
@@ -13106,15 +13133,15 @@ function HeroShrinkLayout({
|
|
|
13106
13133
|
children: hero
|
|
13107
13134
|
}
|
|
13108
13135
|
),
|
|
13109
|
-
/* @__PURE__ */
|
|
13136
|
+
/* @__PURE__ */ jsx78("div", { className: "relative z-10 bg-background", children })
|
|
13110
13137
|
]
|
|
13111
13138
|
}
|
|
13112
13139
|
);
|
|
13113
13140
|
}
|
|
13114
13141
|
|
|
13115
13142
|
// src/layouts/pdp/ImageEdgeBlur.tsx
|
|
13116
|
-
import
|
|
13117
|
-
import { jsx as
|
|
13143
|
+
import React52 from "react";
|
|
13144
|
+
import { jsx as jsx79 } from "react/jsx-runtime";
|
|
13118
13145
|
var BLUR_CONFIG = {
|
|
13119
13146
|
blur: 24,
|
|
13120
13147
|
crossfade: 68
|
|
@@ -13138,7 +13165,7 @@ var BLUR_LAYERS = [
|
|
|
13138
13165
|
{ blur: Math.round(BLUR_CONFIG.blur * 0.5), zone: 0.6 },
|
|
13139
13166
|
{ blur: BLUR_CONFIG.blur, zone: 1 }
|
|
13140
13167
|
];
|
|
13141
|
-
var ImageEdgeBlur =
|
|
13168
|
+
var ImageEdgeBlur = React52.memo(
|
|
13142
13169
|
function ImageEdgeBlur2({
|
|
13143
13170
|
imageSrc,
|
|
13144
13171
|
imageCapInfo,
|
|
@@ -13169,7 +13196,7 @@ var ImageEdgeBlur = React51.memo(
|
|
|
13169
13196
|
viewportWidth / LAYOUT_CONFIG2.IMAGE.ASPECT_RATIO,
|
|
13170
13197
|
maxWidthPx / LAYOUT_CONFIG2.IMAGE.ASPECT_RATIO
|
|
13171
13198
|
);
|
|
13172
|
-
return /* @__PURE__ */
|
|
13199
|
+
return /* @__PURE__ */ jsx79(
|
|
13173
13200
|
"div",
|
|
13174
13201
|
{
|
|
13175
13202
|
className: `absolute inset-0 pointer-events-none overflow-hidden ${className}`,
|
|
@@ -13177,7 +13204,7 @@ var ImageEdgeBlur = React51.memo(
|
|
|
13177
13204
|
children: BLUR_LAYERS.map((layer, index) => {
|
|
13178
13205
|
const layerMask = index === BLUR_LAYERS.length - 1 ? void 0 : `linear-gradient(to right, black 0%, black ${layer.zone * 100}%, transparent ${layer.zone * 100 + 10}%)`;
|
|
13179
13206
|
const blurScale = 1 + layer.blur * 3 / containerHeightPx;
|
|
13180
|
-
return /* @__PURE__ */
|
|
13207
|
+
return /* @__PURE__ */ jsx79(
|
|
13181
13208
|
"img",
|
|
13182
13209
|
{
|
|
13183
13210
|
src: imageSrc,
|
|
@@ -13224,7 +13251,7 @@ var ImageEdgeBlur = React51.memo(
|
|
|
13224
13251
|
);
|
|
13225
13252
|
|
|
13226
13253
|
// src/layouts/pdp/PDPLayout.tsx
|
|
13227
|
-
import { jsx as
|
|
13254
|
+
import { jsx as jsx80, jsxs as jsxs54 } from "react/jsx-runtime";
|
|
13228
13255
|
function PDPLayout({
|
|
13229
13256
|
renderHeroImage,
|
|
13230
13257
|
renderContent,
|
|
@@ -13254,13 +13281,13 @@ function PDPLayout({
|
|
|
13254
13281
|
};
|
|
13255
13282
|
return /* @__PURE__ */ jsxs54("div", { className: `pdp-layout ${className}`, children: [
|
|
13256
13283
|
(isDesktop === false || isDesktop === null) && /* @__PURE__ */ jsxs54("div", { className: "md:hidden", children: [
|
|
13257
|
-
renderMobileCarousel && /* @__PURE__ */
|
|
13258
|
-
/* @__PURE__ */
|
|
13284
|
+
renderMobileCarousel && /* @__PURE__ */ jsx80("div", { className: "mobile-carousel-container", children: renderMobileCarousel({ images: carouselImages }) }),
|
|
13285
|
+
/* @__PURE__ */ jsx80("div", { className: "mobile-content p-4", children: renderContent(contentProps) })
|
|
13259
13286
|
] }),
|
|
13260
13287
|
(isDesktop === true || isDesktop === null) && /* @__PURE__ */ jsxs54("div", { className: "hidden md:block relative", children: [
|
|
13261
13288
|
/* @__PURE__ */ jsxs54("div", { className: "desktop-hero relative", children: [
|
|
13262
13289
|
renderHeroImage(heroProps),
|
|
13263
|
-
showEdgeBlur && blurImageSrc && isWideMonitor2 && /* @__PURE__ */
|
|
13290
|
+
showEdgeBlur && blurImageSrc && isWideMonitor2 && /* @__PURE__ */ jsx80(
|
|
13264
13291
|
ImageEdgeBlur,
|
|
13265
13292
|
{
|
|
13266
13293
|
imageSrc: blurImageSrc,
|
|
@@ -13271,7 +13298,7 @@ function PDPLayout({
|
|
|
13271
13298
|
}
|
|
13272
13299
|
)
|
|
13273
13300
|
] }),
|
|
13274
|
-
/* @__PURE__ */
|
|
13301
|
+
/* @__PURE__ */ jsx80(
|
|
13275
13302
|
"div",
|
|
13276
13303
|
{
|
|
13277
13304
|
className: "desktop-sidebar",
|
|
@@ -13288,8 +13315,8 @@ function PDPLayout({
|
|
|
13288
13315
|
}
|
|
13289
13316
|
|
|
13290
13317
|
// src/layouts/pdp/SimpleImageBlur.tsx
|
|
13291
|
-
import
|
|
13292
|
-
import { jsx as
|
|
13318
|
+
import React53 from "react";
|
|
13319
|
+
import { jsx as jsx81 } from "react/jsx-runtime";
|
|
13293
13320
|
var BLUR_CONFIG2 = {
|
|
13294
13321
|
blur: 24,
|
|
13295
13322
|
crossfade: 60
|
|
@@ -13312,7 +13339,7 @@ function getFadeInMask(crossfadeWidth) {
|
|
|
13312
13339
|
black ${crossfadeWidth + 10}px
|
|
13313
13340
|
)`;
|
|
13314
13341
|
}
|
|
13315
|
-
var SimpleImageBlur =
|
|
13342
|
+
var SimpleImageBlur = React53.memo(function SimpleImageBlur2({
|
|
13316
13343
|
imageSrc,
|
|
13317
13344
|
width,
|
|
13318
13345
|
height = "100%",
|
|
@@ -13322,7 +13349,7 @@ var SimpleImageBlur = React52.memo(function SimpleImageBlur2({
|
|
|
13322
13349
|
if (!imageSrc || width <= 0) return null;
|
|
13323
13350
|
const fadeInMask = getFadeInMask(BLUR_CONFIG2.crossfade);
|
|
13324
13351
|
const extendedWidth = width + BLUR_CONFIG2.blur * 2;
|
|
13325
|
-
return /* @__PURE__ */
|
|
13352
|
+
return /* @__PURE__ */ jsx81(
|
|
13326
13353
|
"div",
|
|
13327
13354
|
{
|
|
13328
13355
|
className: `relative overflow-hidden ${className}`,
|
|
@@ -13335,7 +13362,7 @@ var SimpleImageBlur = React52.memo(function SimpleImageBlur2({
|
|
|
13335
13362
|
black 0%,
|
|
13336
13363
|
black ${layer.zone * 100}%,
|
|
13337
13364
|
transparent ${layer.zone * 100 + 10}%)`;
|
|
13338
|
-
return /* @__PURE__ */
|
|
13365
|
+
return /* @__PURE__ */ jsx81(
|
|
13339
13366
|
"img",
|
|
13340
13367
|
{
|
|
13341
13368
|
src: imageSrc,
|
|
@@ -13365,8 +13392,8 @@ var SimpleImageBlur = React52.memo(function SimpleImageBlur2({
|
|
|
13365
13392
|
});
|
|
13366
13393
|
|
|
13367
13394
|
// src/layouts/pdp/EdgeBlurBox.tsx
|
|
13368
|
-
import
|
|
13369
|
-
import { jsx as
|
|
13395
|
+
import React54 from "react";
|
|
13396
|
+
import { jsx as jsx82, jsxs as jsxs55 } from "react/jsx-runtime";
|
|
13370
13397
|
var BLUR_CONFIG3 = {
|
|
13371
13398
|
blur: 24,
|
|
13372
13399
|
crossfade: 60
|
|
@@ -13390,7 +13417,7 @@ function getFadeOutMask(crossfadeWidth) {
|
|
|
13390
13417
|
transparent 100%
|
|
13391
13418
|
)`;
|
|
13392
13419
|
}
|
|
13393
|
-
var EdgeBlurBox =
|
|
13420
|
+
var EdgeBlurBox = React54.memo(function EdgeBlurBox2({
|
|
13394
13421
|
imageSrc,
|
|
13395
13422
|
width,
|
|
13396
13423
|
height = "100%",
|
|
@@ -13416,7 +13443,7 @@ var EdgeBlurBox = React53.memo(function EdgeBlurBox2({
|
|
|
13416
13443
|
overflow: hasOverlap ? "visible" : "hidden"
|
|
13417
13444
|
},
|
|
13418
13445
|
children: [
|
|
13419
|
-
/* @__PURE__ */
|
|
13446
|
+
/* @__PURE__ */ jsx82(
|
|
13420
13447
|
"div",
|
|
13421
13448
|
{
|
|
13422
13449
|
style: {
|
|
@@ -13430,7 +13457,7 @@ var EdgeBlurBox = React53.memo(function EdgeBlurBox2({
|
|
|
13430
13457
|
transparent ${100 - (layer.zone * 100 + 10)}%,
|
|
13431
13458
|
black ${100 - layer.zone * 100}%,
|
|
13432
13459
|
black 100%)`;
|
|
13433
|
-
return /* @__PURE__ */
|
|
13460
|
+
return /* @__PURE__ */ jsx82(
|
|
13434
13461
|
"img",
|
|
13435
13462
|
{
|
|
13436
13463
|
src: imageSrc,
|
|
@@ -13458,7 +13485,7 @@ var EdgeBlurBox = React53.memo(function EdgeBlurBox2({
|
|
|
13458
13485
|
})
|
|
13459
13486
|
}
|
|
13460
13487
|
),
|
|
13461
|
-
/* @__PURE__ */
|
|
13488
|
+
/* @__PURE__ */ jsx82(
|
|
13462
13489
|
"img",
|
|
13463
13490
|
{
|
|
13464
13491
|
src: imageSrc,
|
|
@@ -13486,8 +13513,8 @@ var EdgeBlurBox = React53.memo(function EdgeBlurBox2({
|
|
|
13486
13513
|
});
|
|
13487
13514
|
|
|
13488
13515
|
// src/layouts/pdp/ImageBlurExtension.tsx
|
|
13489
|
-
import
|
|
13490
|
-
import { jsx as
|
|
13516
|
+
import React55 from "react";
|
|
13517
|
+
import { jsx as jsx83, jsxs as jsxs56 } from "react/jsx-runtime";
|
|
13491
13518
|
var BLUR_CONFIG4 = {
|
|
13492
13519
|
blur: 24,
|
|
13493
13520
|
crossfadeWidth: 80
|
|
@@ -13510,7 +13537,7 @@ function getFadeOutMask2(crossfadeWidth) {
|
|
|
13510
13537
|
transparent 100%
|
|
13511
13538
|
)`;
|
|
13512
13539
|
}
|
|
13513
|
-
var ImageBlurExtension =
|
|
13540
|
+
var ImageBlurExtension = React55.memo(function ImageBlurExtension2({
|
|
13514
13541
|
imageSrc,
|
|
13515
13542
|
width,
|
|
13516
13543
|
height,
|
|
@@ -13533,7 +13560,7 @@ var ImageBlurExtension = React54.memo(function ImageBlurExtension2({
|
|
|
13533
13560
|
height: heightValue
|
|
13534
13561
|
},
|
|
13535
13562
|
children: [
|
|
13536
|
-
BLUR_LAYERS4.map((layer, index) => /* @__PURE__ */
|
|
13563
|
+
BLUR_LAYERS4.map((layer, index) => /* @__PURE__ */ jsx83(
|
|
13537
13564
|
"img",
|
|
13538
13565
|
{
|
|
13539
13566
|
src: imageSrc,
|
|
@@ -13557,7 +13584,7 @@ var ImageBlurExtension = React54.memo(function ImageBlurExtension2({
|
|
|
13557
13584
|
},
|
|
13558
13585
|
`blur-${index}`
|
|
13559
13586
|
)),
|
|
13560
|
-
/* @__PURE__ */
|
|
13587
|
+
/* @__PURE__ */ jsx83(
|
|
13561
13588
|
"img",
|
|
13562
13589
|
{
|
|
13563
13590
|
src: imageSrc,
|
|
@@ -13585,23 +13612,23 @@ var ImageBlurExtension = React54.memo(function ImageBlurExtension2({
|
|
|
13585
13612
|
});
|
|
13586
13613
|
|
|
13587
13614
|
// src/design-system/ColorSwatch.tsx
|
|
13588
|
-
import { jsx as
|
|
13615
|
+
import { jsx as jsx84, jsxs as jsxs57 } from "react/jsx-runtime";
|
|
13589
13616
|
function ColorTokenSwatch({ name, cssVar, className = "" }) {
|
|
13590
13617
|
return /* @__PURE__ */ jsxs57("div", { className: `flex flex-col gap-1 ${className}`, children: [
|
|
13591
|
-
/* @__PURE__ */
|
|
13618
|
+
/* @__PURE__ */ jsx84(
|
|
13592
13619
|
"div",
|
|
13593
13620
|
{
|
|
13594
13621
|
className: "h-16 w-full rounded-lg border border-border shadow-sm",
|
|
13595
13622
|
style: { backgroundColor: `var(${cssVar})` }
|
|
13596
13623
|
}
|
|
13597
13624
|
),
|
|
13598
|
-
/* @__PURE__ */
|
|
13599
|
-
/* @__PURE__ */
|
|
13625
|
+
/* @__PURE__ */ jsx84("div", { className: "text-sm font-medium text-foreground", children: name }),
|
|
13626
|
+
/* @__PURE__ */ jsx84("code", { className: "text-xs text-muted-foreground font-mono", children: cssVar })
|
|
13600
13627
|
] });
|
|
13601
13628
|
}
|
|
13602
13629
|
function ColorRow({ name, cssVar, description }) {
|
|
13603
13630
|
return /* @__PURE__ */ jsxs57("div", { className: "flex items-center gap-4 py-2", children: [
|
|
13604
|
-
/* @__PURE__ */
|
|
13631
|
+
/* @__PURE__ */ jsx84(
|
|
13605
13632
|
"div",
|
|
13606
13633
|
{
|
|
13607
13634
|
className: "h-10 w-10 rounded-lg border border-border shadow-sm flex-shrink-0",
|
|
@@ -13609,15 +13636,15 @@ function ColorRow({ name, cssVar, description }) {
|
|
|
13609
13636
|
}
|
|
13610
13637
|
),
|
|
13611
13638
|
/* @__PURE__ */ jsxs57("div", { className: "flex-1 min-w-0", children: [
|
|
13612
|
-
/* @__PURE__ */
|
|
13613
|
-
description && /* @__PURE__ */
|
|
13639
|
+
/* @__PURE__ */ jsx84("div", { className: "text-sm font-medium text-foreground", children: name }),
|
|
13640
|
+
description && /* @__PURE__ */ jsx84("div", { className: "text-xs text-muted-foreground", children: description })
|
|
13614
13641
|
] }),
|
|
13615
|
-
/* @__PURE__ */
|
|
13642
|
+
/* @__PURE__ */ jsx84("code", { className: "text-xs text-muted-foreground font-mono bg-muted px-2 py-1 rounded", children: cssVar })
|
|
13616
13643
|
] });
|
|
13617
13644
|
}
|
|
13618
13645
|
|
|
13619
13646
|
// src/design-system/ColorPalette.tsx
|
|
13620
|
-
import { jsx as
|
|
13647
|
+
import { jsx as jsx85, jsxs as jsxs58 } from "react/jsx-runtime";
|
|
13621
13648
|
var COLOR_GROUPS = [
|
|
13622
13649
|
{
|
|
13623
13650
|
name: "Base",
|
|
@@ -13698,17 +13725,17 @@ var COLOR_GROUPS = [
|
|
|
13698
13725
|
}
|
|
13699
13726
|
];
|
|
13700
13727
|
function ColorPalette({ layout = "list", className = "" }) {
|
|
13701
|
-
return /* @__PURE__ */
|
|
13702
|
-
/* @__PURE__ */
|
|
13703
|
-
/* @__PURE__ */
|
|
13704
|
-
layout === "grid" ? /* @__PURE__ */
|
|
13728
|
+
return /* @__PURE__ */ jsx85("div", { className: `space-y-8 ${className}`, children: COLOR_GROUPS.map((group) => /* @__PURE__ */ jsxs58("section", { children: [
|
|
13729
|
+
/* @__PURE__ */ jsx85("h3", { className: "text-lg font-semibold text-foreground mb-1", children: group.name }),
|
|
13730
|
+
/* @__PURE__ */ jsx85("p", { className: "text-sm text-muted-foreground mb-4", children: group.description }),
|
|
13731
|
+
layout === "grid" ? /* @__PURE__ */ jsx85("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-4", children: group.colors.map((color) => /* @__PURE__ */ jsx85(
|
|
13705
13732
|
ColorTokenSwatch,
|
|
13706
13733
|
{
|
|
13707
13734
|
name: color.name,
|
|
13708
13735
|
cssVar: color.cssVar
|
|
13709
13736
|
},
|
|
13710
13737
|
color.cssVar
|
|
13711
|
-
)) }) : /* @__PURE__ */
|
|
13738
|
+
)) }) : /* @__PURE__ */ jsx85("div", { className: "bg-card rounded-lg border border-border p-4 divide-y divide-border", children: group.colors.map((color) => /* @__PURE__ */ jsx85(
|
|
13712
13739
|
ColorRow,
|
|
13713
13740
|
{
|
|
13714
13741
|
name: color.name,
|
|
@@ -13721,7 +13748,7 @@ function ColorPalette({ layout = "list", className = "" }) {
|
|
|
13721
13748
|
}
|
|
13722
13749
|
|
|
13723
13750
|
// src/design-system/TypographyScale.tsx
|
|
13724
|
-
import { jsx as
|
|
13751
|
+
import { jsx as jsx86, jsxs as jsxs59 } from "react/jsx-runtime";
|
|
13725
13752
|
var FONT_SAMPLES = [
|
|
13726
13753
|
{
|
|
13727
13754
|
name: "Heading",
|
|
@@ -13755,14 +13782,14 @@ var FONT_SAMPLES = [
|
|
|
13755
13782
|
}
|
|
13756
13783
|
];
|
|
13757
13784
|
function TypographyScale({ className = "" }) {
|
|
13758
|
-
return /* @__PURE__ */
|
|
13785
|
+
return /* @__PURE__ */ jsx86("div", { className: `space-y-8 ${className}`, children: FONT_SAMPLES.map((font) => /* @__PURE__ */ jsxs59("section", { className: "bg-card rounded-lg border border-border p-6", children: [
|
|
13759
13786
|
/* @__PURE__ */ jsxs59("div", { className: "flex items-center justify-between mb-4", children: [
|
|
13760
|
-
/* @__PURE__ */
|
|
13761
|
-
/* @__PURE__ */
|
|
13787
|
+
/* @__PURE__ */ jsx86("h3", { className: "text-lg font-semibold text-foreground", children: font.name }),
|
|
13788
|
+
/* @__PURE__ */ jsx86("code", { className: "text-xs text-muted-foreground font-mono bg-muted px-2 py-1 rounded", children: font.cssVar })
|
|
13762
13789
|
] }),
|
|
13763
|
-
/* @__PURE__ */
|
|
13764
|
-
/* @__PURE__ */
|
|
13765
|
-
/* @__PURE__ */
|
|
13790
|
+
/* @__PURE__ */ jsx86("div", { className: "space-y-4", children: font.sizes.map((size) => /* @__PURE__ */ jsxs59("div", { className: "flex items-baseline gap-4", children: [
|
|
13791
|
+
/* @__PURE__ */ jsx86("span", { className: "text-xs text-muted-foreground w-20 flex-shrink-0", children: size }),
|
|
13792
|
+
/* @__PURE__ */ jsx86(
|
|
13766
13793
|
"p",
|
|
13767
13794
|
{
|
|
13768
13795
|
className: `${size} text-foreground`,
|
|
@@ -13781,8 +13808,8 @@ var RADIUS_SAMPLES = [
|
|
|
13781
13808
|
{ name: "Full", value: "9999px" }
|
|
13782
13809
|
];
|
|
13783
13810
|
function RadiusScale({ className = "" }) {
|
|
13784
|
-
return /* @__PURE__ */
|
|
13785
|
-
/* @__PURE__ */
|
|
13811
|
+
return /* @__PURE__ */ jsx86("div", { className: `space-y-4 ${className}`, children: /* @__PURE__ */ jsx86("div", { className: "grid grid-cols-5 gap-4", children: RADIUS_SAMPLES.map((radius) => /* @__PURE__ */ jsxs59("div", { className: "flex flex-col items-center gap-2", children: [
|
|
13812
|
+
/* @__PURE__ */ jsx86(
|
|
13786
13813
|
"div",
|
|
13787
13814
|
{
|
|
13788
13815
|
className: "h-16 w-16 bg-primary",
|
|
@@ -13791,14 +13818,14 @@ function RadiusScale({ className = "" }) {
|
|
|
13791
13818
|
}
|
|
13792
13819
|
}
|
|
13793
13820
|
),
|
|
13794
|
-
/* @__PURE__ */
|
|
13795
|
-
/* @__PURE__ */
|
|
13821
|
+
/* @__PURE__ */ jsx86("span", { className: "text-sm font-medium text-foreground", children: radius.name }),
|
|
13822
|
+
/* @__PURE__ */ jsx86("code", { className: "text-xs text-muted-foreground font-mono", children: radius.cssVar || radius.value })
|
|
13796
13823
|
] }, radius.name)) }) });
|
|
13797
13824
|
}
|
|
13798
13825
|
|
|
13799
13826
|
// src/design-system/ThemeSwitcher.tsx
|
|
13800
13827
|
import { useState as useState45, useEffect as useEffect46 } from "react";
|
|
13801
|
-
import { Fragment as Fragment19, jsx as
|
|
13828
|
+
import { Fragment as Fragment19, jsx as jsx87, jsxs as jsxs60 } from "react/jsx-runtime";
|
|
13802
13829
|
function readThemeFromDOM() {
|
|
13803
13830
|
if (typeof document === "undefined") {
|
|
13804
13831
|
return { themeName: "Linear", isDark: false };
|
|
@@ -13866,35 +13893,35 @@ function ThemeSwitcher({ className = "", showBaseThemesOnly = true }) {
|
|
|
13866
13893
|
onClick: () => setIsOpen(!isOpen),
|
|
13867
13894
|
className: "flex items-center gap-2 px-4 py-2 bg-card border border-border rounded-lg hover:bg-muted transition-colors text-foreground",
|
|
13868
13895
|
children: [
|
|
13869
|
-
/* @__PURE__ */
|
|
13870
|
-
/* @__PURE__ */
|
|
13871
|
-
/* @__PURE__ */
|
|
13896
|
+
/* @__PURE__ */ jsx87("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx87("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01" }) }),
|
|
13897
|
+
/* @__PURE__ */ jsx87("span", { className: "font-medium", children: currentTheme }),
|
|
13898
|
+
/* @__PURE__ */ jsx87("svg", { className: `w-4 h-4 transition-transform ${isOpen ? "rotate-180" : ""}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx87("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) })
|
|
13872
13899
|
]
|
|
13873
13900
|
}
|
|
13874
13901
|
),
|
|
13875
13902
|
isOpen && /* @__PURE__ */ jsxs60(Fragment19, { children: [
|
|
13876
|
-
/* @__PURE__ */
|
|
13903
|
+
/* @__PURE__ */ jsx87(
|
|
13877
13904
|
"div",
|
|
13878
13905
|
{
|
|
13879
13906
|
className: "fixed inset-0 z-40",
|
|
13880
13907
|
onClick: () => setIsOpen(false)
|
|
13881
13908
|
}
|
|
13882
13909
|
),
|
|
13883
|
-
/* @__PURE__ */
|
|
13910
|
+
/* @__PURE__ */ jsx87("div", { className: "absolute top-full left-0 mt-2 w-56 max-h-80 overflow-auto bg-card border border-border rounded-lg shadow-lg z-50", children: themes.map((theme) => /* @__PURE__ */ jsxs60(
|
|
13884
13911
|
"button",
|
|
13885
13912
|
{
|
|
13886
13913
|
onClick: () => handleThemeSelect(theme.name),
|
|
13887
13914
|
className: `w-full px-4 py-2 text-left hover:bg-muted transition-colors flex items-center gap-3 ${currentTheme === theme.name ? "bg-muted" : ""}`,
|
|
13888
13915
|
children: [
|
|
13889
|
-
/* @__PURE__ */
|
|
13916
|
+
/* @__PURE__ */ jsx87(
|
|
13890
13917
|
"div",
|
|
13891
13918
|
{
|
|
13892
13919
|
className: "w-4 h-4 rounded-full border border-border",
|
|
13893
13920
|
style: { backgroundColor: theme.primaryColor || "#888" }
|
|
13894
13921
|
}
|
|
13895
13922
|
),
|
|
13896
|
-
/* @__PURE__ */
|
|
13897
|
-
currentTheme === theme.name && /* @__PURE__ */
|
|
13923
|
+
/* @__PURE__ */ jsx87("span", { className: "text-foreground", children: theme.name }),
|
|
13924
|
+
currentTheme === theme.name && /* @__PURE__ */ jsx87("svg", { className: "w-4 h-4 ml-auto text-primary", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx87("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 13l4 4L19 7" }) })
|
|
13898
13925
|
]
|
|
13899
13926
|
},
|
|
13900
13927
|
theme.name
|
|
@@ -13909,10 +13936,10 @@ function ThemeSwitcher({ className = "", showBaseThemesOnly = true }) {
|
|
|
13909
13936
|
title: `Switch to ${isDark ? "light" : "dark"} mode`,
|
|
13910
13937
|
children: [
|
|
13911
13938
|
isDark ? /* @__PURE__ */ jsxs60("svg", { className: "w-5 h-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: [
|
|
13912
|
-
/* @__PURE__ */
|
|
13913
|
-
/* @__PURE__ */
|
|
13914
|
-
] }) : /* @__PURE__ */
|
|
13915
|
-
/* @__PURE__ */
|
|
13939
|
+
/* @__PURE__ */ jsx87("circle", { cx: "12", cy: "12", r: "5" }),
|
|
13940
|
+
/* @__PURE__ */ jsx87("path", { d: "M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42" })
|
|
13941
|
+
] }) : /* @__PURE__ */ jsx87("svg", { className: "w-5 h-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx87("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }) }),
|
|
13942
|
+
/* @__PURE__ */ jsx87("span", { className: "text-sm", children: isDark ? "Light" : "Dark" })
|
|
13916
13943
|
]
|
|
13917
13944
|
}
|
|
13918
13945
|
)
|
|
@@ -13920,7 +13947,7 @@ function ThemeSwitcher({ className = "", showBaseThemesOnly = true }) {
|
|
|
13920
13947
|
}
|
|
13921
13948
|
|
|
13922
13949
|
// src/design-system/DesignSystemPage.tsx
|
|
13923
|
-
import { jsx as
|
|
13950
|
+
import { jsx as jsx88, jsxs as jsxs61 } from "react/jsx-runtime";
|
|
13924
13951
|
function DesignSystemPage({
|
|
13925
13952
|
showThemeSwitcher = true,
|
|
13926
13953
|
showColors = true,
|
|
@@ -13931,28 +13958,28 @@ function DesignSystemPage({
|
|
|
13931
13958
|
className = ""
|
|
13932
13959
|
}) {
|
|
13933
13960
|
return /* @__PURE__ */ jsxs61("div", { className: `max-w-4xl mx-auto px-4 py-8 ${className}`, children: [
|
|
13934
|
-
/* @__PURE__ */
|
|
13961
|
+
/* @__PURE__ */ jsx88("header", { className: "mb-12", children: /* @__PURE__ */ jsxs61("div", { className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-4", children: [
|
|
13935
13962
|
/* @__PURE__ */ jsxs61("div", { children: [
|
|
13936
|
-
/* @__PURE__ */
|
|
13937
|
-
/* @__PURE__ */
|
|
13963
|
+
/* @__PURE__ */ jsx88("h1", { className: "text-4xl font-bold text-foreground mb-2", children: "Design System" }),
|
|
13964
|
+
/* @__PURE__ */ jsx88("p", { className: "text-lg text-muted-foreground", children: "Visual reference for theme tokens and styles" })
|
|
13938
13965
|
] }),
|
|
13939
|
-
showThemeSwitcher && /* @__PURE__ */
|
|
13966
|
+
showThemeSwitcher && /* @__PURE__ */ jsx88(ThemeSwitcher, {})
|
|
13940
13967
|
] }) }),
|
|
13941
13968
|
showColors && /* @__PURE__ */ jsxs61("section", { className: "mb-16", children: [
|
|
13942
|
-
/* @__PURE__ */
|
|
13943
|
-
/* @__PURE__ */
|
|
13969
|
+
/* @__PURE__ */ jsx88("h2", { className: "text-2xl font-semibold text-foreground mb-6 pb-2 border-b border-border", children: "Color Palette" }),
|
|
13970
|
+
/* @__PURE__ */ jsx88(ColorPalette, { layout: colorLayout })
|
|
13944
13971
|
] }),
|
|
13945
13972
|
showTypography && /* @__PURE__ */ jsxs61("section", { className: "mb-16", children: [
|
|
13946
|
-
/* @__PURE__ */
|
|
13947
|
-
/* @__PURE__ */
|
|
13973
|
+
/* @__PURE__ */ jsx88("h2", { className: "text-2xl font-semibold text-foreground mb-6 pb-2 border-b border-border", children: "Typography" }),
|
|
13974
|
+
/* @__PURE__ */ jsx88(TypographyScale, {})
|
|
13948
13975
|
] }),
|
|
13949
13976
|
showRadius && /* @__PURE__ */ jsxs61("section", { className: "mb-16", children: [
|
|
13950
|
-
/* @__PURE__ */
|
|
13951
|
-
/* @__PURE__ */
|
|
13977
|
+
/* @__PURE__ */ jsx88("h2", { className: "text-2xl font-semibold text-foreground mb-6 pb-2 border-b border-border", children: "Border Radius" }),
|
|
13978
|
+
/* @__PURE__ */ jsx88(RadiusScale, {})
|
|
13952
13979
|
] }),
|
|
13953
13980
|
showSpacing && /* @__PURE__ */ jsxs61("section", { className: "mb-16", children: [
|
|
13954
|
-
/* @__PURE__ */
|
|
13955
|
-
/* @__PURE__ */
|
|
13981
|
+
/* @__PURE__ */ jsx88("h2", { className: "text-2xl font-semibold text-foreground mb-6 pb-2 border-b border-border", children: "Spacing Scale" }),
|
|
13982
|
+
/* @__PURE__ */ jsx88(SpacingScale, {})
|
|
13956
13983
|
] })
|
|
13957
13984
|
] });
|
|
13958
13985
|
}
|
|
@@ -13967,21 +13994,21 @@ function SpacingScale() {
|
|
|
13967
13994
|
{ name: "12", value: "3rem" },
|
|
13968
13995
|
{ name: "16", value: "4rem" }
|
|
13969
13996
|
];
|
|
13970
|
-
return /* @__PURE__ */
|
|
13971
|
-
/* @__PURE__ */
|
|
13972
|
-
/* @__PURE__ */
|
|
13997
|
+
return /* @__PURE__ */ jsx88("div", { className: "space-y-2", children: spaces.map((space) => /* @__PURE__ */ jsxs61("div", { className: "flex items-center gap-4", children: [
|
|
13998
|
+
/* @__PURE__ */ jsx88("code", { className: "text-xs text-muted-foreground font-mono w-8", children: space.name }),
|
|
13999
|
+
/* @__PURE__ */ jsx88(
|
|
13973
14000
|
"div",
|
|
13974
14001
|
{
|
|
13975
14002
|
className: "h-4 bg-primary rounded",
|
|
13976
14003
|
style: { width: space.value }
|
|
13977
14004
|
}
|
|
13978
14005
|
),
|
|
13979
|
-
/* @__PURE__ */
|
|
14006
|
+
/* @__PURE__ */ jsx88("span", { className: "text-sm text-muted-foreground", children: space.value })
|
|
13980
14007
|
] }, space.name)) });
|
|
13981
14008
|
}
|
|
13982
14009
|
|
|
13983
14010
|
// src/personalization/PersonalizationProvider.tsx
|
|
13984
|
-
import
|
|
14011
|
+
import React56, {
|
|
13985
14012
|
useState as useState46,
|
|
13986
14013
|
useCallback as useCallback26,
|
|
13987
14014
|
useRef as useRef30,
|
|
@@ -13989,25 +14016,25 @@ import React55, {
|
|
|
13989
14016
|
} from "react";
|
|
13990
14017
|
|
|
13991
14018
|
// src/personalization/PersonalizationContext.ts
|
|
13992
|
-
import { createContext as
|
|
13993
|
-
var PersonalizationContext =
|
|
14019
|
+
import { createContext as createContext10, useContext as useContext8 } from "react";
|
|
14020
|
+
var PersonalizationContext = createContext10(null);
|
|
13994
14021
|
function usePersonalizationContext() {
|
|
13995
|
-
return
|
|
14022
|
+
return useContext8(PersonalizationContext);
|
|
13996
14023
|
}
|
|
13997
14024
|
|
|
13998
14025
|
// src/personalization/PersonalizationProvider.tsx
|
|
13999
|
-
import { Fragment as Fragment20, jsx as
|
|
14026
|
+
import { Fragment as Fragment20, jsx as jsx89, jsxs as jsxs62 } from "react/jsx-runtime";
|
|
14000
14027
|
function createBridgeFromCanvas(canvasModule) {
|
|
14001
14028
|
const { useEditor, useCommands, useImageBinding } = canvasModule;
|
|
14002
14029
|
function TextBinder({ name, value }) {
|
|
14003
14030
|
const { elements } = useEditor();
|
|
14004
14031
|
const { executeElementUpdate } = useCommands();
|
|
14005
|
-
const elementsRef =
|
|
14032
|
+
const elementsRef = React56.useRef(elements);
|
|
14006
14033
|
elementsRef.current = elements;
|
|
14007
|
-
const executeRef =
|
|
14034
|
+
const executeRef = React56.useRef(executeElementUpdate);
|
|
14008
14035
|
executeRef.current = executeElementUpdate;
|
|
14009
|
-
const hasUserInput =
|
|
14010
|
-
|
|
14036
|
+
const hasUserInput = React56.useRef(false);
|
|
14037
|
+
React56.useEffect(() => {
|
|
14011
14038
|
if (value == null) return;
|
|
14012
14039
|
if (value === "" && !hasUserInput.current) return;
|
|
14013
14040
|
hasUserInput.current = true;
|
|
@@ -14025,12 +14052,12 @@ function createBridgeFromCanvas(canvasModule) {
|
|
|
14025
14052
|
function ColorBinder({ originalColor, newColor }) {
|
|
14026
14053
|
const { elements } = useEditor();
|
|
14027
14054
|
const { executeElementUpdate } = useCommands();
|
|
14028
|
-
const elementsRef =
|
|
14055
|
+
const elementsRef = React56.useRef(elements);
|
|
14029
14056
|
elementsRef.current = elements;
|
|
14030
|
-
const executeRef =
|
|
14057
|
+
const executeRef = React56.useRef(executeElementUpdate);
|
|
14031
14058
|
executeRef.current = executeElementUpdate;
|
|
14032
|
-
const appliedColorRef =
|
|
14033
|
-
|
|
14059
|
+
const appliedColorRef = React56.useRef(normalizeHex(originalColor));
|
|
14060
|
+
React56.useEffect(() => {
|
|
14034
14061
|
const normalizedNew = normalizeHex(newColor);
|
|
14035
14062
|
if (normalizedNew === appliedColorRef.current) return;
|
|
14036
14063
|
const matchColor = appliedColorRef.current;
|
|
@@ -14070,11 +14097,11 @@ function createBridgeFromCanvas(canvasModule) {
|
|
|
14070
14097
|
}
|
|
14071
14098
|
function ImageBinder({ name, value, fit = "cover" }) {
|
|
14072
14099
|
const { setImageUrl } = useImageBinding(name, { fit });
|
|
14073
|
-
const hasUserInput =
|
|
14100
|
+
const hasUserInput = React56.useRef(false);
|
|
14074
14101
|
const debouncedValue = useDebouncedValue(value, 500);
|
|
14075
|
-
const setImageUrlRef =
|
|
14102
|
+
const setImageUrlRef = React56.useRef(setImageUrl);
|
|
14076
14103
|
setImageUrlRef.current = setImageUrl;
|
|
14077
|
-
|
|
14104
|
+
React56.useEffect(() => {
|
|
14078
14105
|
if (debouncedValue == null) return;
|
|
14079
14106
|
if (debouncedValue === "" && !hasUserInput.current) return;
|
|
14080
14107
|
hasUserInput.current = true;
|
|
@@ -14084,15 +14111,15 @@ function createBridgeFromCanvas(canvasModule) {
|
|
|
14084
14111
|
return null;
|
|
14085
14112
|
}
|
|
14086
14113
|
return function PersonalizationBridge({ fields = [], values = {} } = {}) {
|
|
14087
|
-
return /* @__PURE__ */
|
|
14114
|
+
return /* @__PURE__ */ jsx89(Fragment20, { children: fields.map((field) => {
|
|
14088
14115
|
if (field.type === "text") {
|
|
14089
|
-
return /* @__PURE__ */
|
|
14116
|
+
return /* @__PURE__ */ jsx89(TextBinder, { name: field.name, value: values[field.name] ?? "" }, `text-${field.name}`);
|
|
14090
14117
|
}
|
|
14091
14118
|
if (field.type === "color") {
|
|
14092
|
-
return /* @__PURE__ */
|
|
14119
|
+
return /* @__PURE__ */ jsx89(ColorBinder, { originalColor: field.color, newColor: values[field.color] ?? field.color }, `color-${field.color}`);
|
|
14093
14120
|
}
|
|
14094
14121
|
if (field.type === "image") {
|
|
14095
|
-
return /* @__PURE__ */
|
|
14122
|
+
return /* @__PURE__ */ jsx89(ImageBinder, { name: field.name, value: values[field.name] ?? "", fit: field.fit ?? "cover" }, `image-${field.name}`);
|
|
14096
14123
|
}
|
|
14097
14124
|
return null;
|
|
14098
14125
|
}) });
|
|
@@ -14202,7 +14229,7 @@ function PersonalizationProvider({
|
|
|
14202
14229
|
setIsExporting(true);
|
|
14203
14230
|
}, []);
|
|
14204
14231
|
const shouldMountCanvas = CanvasComponent && BridgeComponent && canvasState?.elements && canvasState.elements.length > 0 && (!lazy || isActive);
|
|
14205
|
-
const contextValue =
|
|
14232
|
+
const contextValue = React56.useMemo(
|
|
14206
14233
|
() => ({
|
|
14207
14234
|
fields,
|
|
14208
14235
|
personValues,
|
|
@@ -14216,7 +14243,7 @@ function PersonalizationProvider({
|
|
|
14216
14243
|
[fields, personValues, updateField, isActive, isExporting, exportedBlobUrls, exportCount, reset]
|
|
14217
14244
|
);
|
|
14218
14245
|
return /* @__PURE__ */ jsxs62(PersonalizationContext.Provider, { value: contextValue, children: [
|
|
14219
|
-
shouldMountCanvas && CanvasComponent && BridgeComponent && /* @__PURE__ */
|
|
14246
|
+
shouldMountCanvas && CanvasComponent && BridgeComponent && /* @__PURE__ */ jsx89(
|
|
14220
14247
|
"div",
|
|
14221
14248
|
{
|
|
14222
14249
|
style: {
|
|
@@ -14229,7 +14256,7 @@ function PersonalizationProvider({
|
|
|
14229
14256
|
pointerEvents: "none"
|
|
14230
14257
|
},
|
|
14231
14258
|
"aria-hidden": true,
|
|
14232
|
-
children: /* @__PURE__ */
|
|
14259
|
+
children: /* @__PURE__ */ jsx89(
|
|
14233
14260
|
CanvasComponent,
|
|
14234
14261
|
{
|
|
14235
14262
|
initialElements: canvasState?.elements,
|
|
@@ -14249,7 +14276,7 @@ function PersonalizationProvider({
|
|
|
14249
14276
|
exportImageQuality: exportConfig?.imageQuality ?? 0.85,
|
|
14250
14277
|
onExport: handleExport,
|
|
14251
14278
|
onExportScheduled: handleExportScheduled,
|
|
14252
|
-
overlay: /* @__PURE__ */
|
|
14279
|
+
overlay: /* @__PURE__ */ jsx89(BridgeComponent, { fields, values: personValues })
|
|
14253
14280
|
}
|
|
14254
14281
|
)
|
|
14255
14282
|
},
|
|
@@ -14274,7 +14301,7 @@ function usePersonalizationOptional() {
|
|
|
14274
14301
|
}
|
|
14275
14302
|
|
|
14276
14303
|
// src/personalization/PersonalizationInputs.tsx
|
|
14277
|
-
import { jsx as
|
|
14304
|
+
import { jsx as jsx90, jsxs as jsxs63 } from "react/jsx-runtime";
|
|
14278
14305
|
function PersonalizationInputs({
|
|
14279
14306
|
className,
|
|
14280
14307
|
inputClassName = "w-full px-4 py-3 rounded-lg border text-base text-foreground placeholder:text-muted-foreground bg-white/50 outline-none focus:ring-2 focus:ring-foreground/20",
|
|
@@ -14299,7 +14326,7 @@ function PersonalizationInputs({
|
|
|
14299
14326
|
}
|
|
14300
14327
|
};
|
|
14301
14328
|
return /* @__PURE__ */ jsxs63("div", { className: className || "flex flex-col gap-3", children: [
|
|
14302
|
-
textFields.map((field) => /* @__PURE__ */
|
|
14329
|
+
textFields.map((field) => /* @__PURE__ */ jsx90(
|
|
14303
14330
|
"input",
|
|
14304
14331
|
{
|
|
14305
14332
|
type: "text",
|
|
@@ -14314,7 +14341,7 @@ function PersonalizationInputs({
|
|
|
14314
14341
|
`text-${field.name}`
|
|
14315
14342
|
)),
|
|
14316
14343
|
colorFields.map((field) => /* @__PURE__ */ jsxs63("div", { className: "flex items-center gap-3", children: [
|
|
14317
|
-
/* @__PURE__ */
|
|
14344
|
+
/* @__PURE__ */ jsx90(
|
|
14318
14345
|
"input",
|
|
14319
14346
|
{
|
|
14320
14347
|
type: "color",
|
|
@@ -14323,9 +14350,9 @@ function PersonalizationInputs({
|
|
|
14323
14350
|
onChange: (e) => updateField(field.color, e.target.value)
|
|
14324
14351
|
}
|
|
14325
14352
|
),
|
|
14326
|
-
/* @__PURE__ */
|
|
14353
|
+
/* @__PURE__ */ jsx90("span", { className: "text-base text-muted-foreground", children: field.label })
|
|
14327
14354
|
] }, `color-${field.color}`)),
|
|
14328
|
-
imageFields.map((field) => /* @__PURE__ */
|
|
14355
|
+
imageFields.map((field) => /* @__PURE__ */ jsx90(
|
|
14329
14356
|
"input",
|
|
14330
14357
|
{
|
|
14331
14358
|
type: "text",
|
|
@@ -14533,6 +14560,7 @@ export {
|
|
|
14533
14560
|
LoadingOverlayPrismCandyInline,
|
|
14534
14561
|
MasonryGrid,
|
|
14535
14562
|
MobileProductCarousel,
|
|
14563
|
+
MockupBackground,
|
|
14536
14564
|
MockupPriorityProvider,
|
|
14537
14565
|
PDPLayout,
|
|
14538
14566
|
PersonalizationInputs,
|
|
@@ -14658,6 +14686,7 @@ export {
|
|
|
14658
14686
|
useIsolatedCanvas,
|
|
14659
14687
|
useLoadingOverlay,
|
|
14660
14688
|
useMediaQuery,
|
|
14689
|
+
useMockupBackgroundOptional,
|
|
14661
14690
|
useMockupPriority,
|
|
14662
14691
|
useMockupPriorityOptional,
|
|
14663
14692
|
usePersonalization,
|