@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/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 createContext7,
5553
- useContext as useContext5,
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 = createContext7(
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
- if (!isFirstSend && !variantChanged) {
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__ */ jsx51(RealtimeContext.Provider, { value: contextValue, children });
6247
+ return /* @__PURE__ */ jsx52(RealtimeContext.Provider, { value: contextValue, children });
6227
6248
  }
6228
6249
  function useRealtime() {
6229
- const context = useContext5(RealtimeContext);
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 useContext5(RealtimeContext);
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 createContext8,
7047
- useContext as useContext6,
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 jsx52 } from "react/jsx-runtime";
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 = createContext8(
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__ */ jsx52(MockupPriorityContext.Provider, { value: contextValue, children });
7659
+ return /* @__PURE__ */ jsx53(MockupPriorityContext.Provider, { value: contextValue, children });
7639
7660
  }
7640
7661
  function useMockupPriority() {
7641
- const context = useContext6(MockupPriorityContext);
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 useContext6(MockupPriorityContext);
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 React40, { useEffect as useEffect26 } from "react";
8377
- import { Fragment as Fragment9, jsx as jsx53, jsxs as jsxs33 } from "react/jsx-runtime";
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 = React40.memo(
8445
+ var IsolatedChildren = React41.memo(
8425
8446
  function IsolatedChildren2({ children }) {
8426
- return /* @__PURE__ */ jsx53(Fragment9, { children });
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__ */ jsx53(
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__ */ jsx53(IsolatedChildren, { children })
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 jsx54, jsxs as jsxs34 } from "react/jsx-runtime";
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__ */ jsx54("div", { className: "prism-loading-band" }),
8618
- /* @__PURE__ */ jsx54("div", { className: "prism-loading-band" }),
8619
- /* @__PURE__ */ jsx54("div", { className: "prism-loading-band" }),
8620
- /* @__PURE__ */ jsx54("div", { className: "prism-loading-band" }),
8621
- /* @__PURE__ */ jsx54("div", { className: "prism-loading-band" })
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__ */ jsx54(
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 jsx55, jsxs as jsxs35 } from "react/jsx-runtime";
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__ */ jsx55("div", { className: "candy-band" }, `b-${i}`)),
8867
- particles.map((p, i) => /* @__PURE__ */ jsx55(
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__ */ jsx55(
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__ */ jsx55(
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__ */ jsx55(
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 jsx56 } from "react/jsx-runtime";
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__ */ jsx56(Product, { productId, productData, children });
9043
+ let content = /* @__PURE__ */ jsx57(Product, { productId, productData, children });
9023
9044
  if (enablePriority) {
9024
- content = /* @__PURE__ */ jsx56(MockupPriorityProvider, { children: content });
9045
+ content = /* @__PURE__ */ jsx57(MockupPriorityProvider, { children: content });
9025
9046
  }
9026
9047
  if (enableRealtime) {
9027
- content = /* @__PURE__ */ jsx56(
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__ */ jsx56(
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__ */ jsx56(
9078
+ return /* @__PURE__ */ jsx57(
9058
9079
  Shop,
9059
9080
  {
9060
9081
  endpoint,
9061
9082
  mockupUrl,
9062
9083
  shop,
9063
9084
  initialArtwork,
9064
- children: /* @__PURE__ */ jsx56(Product, { productId, productData, children })
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 jsx57, jsxs as jsxs36 } from "react/jsx-runtime";
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__ */ jsx57(
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__ */ jsx57("div", { className: "overflow-hidden p-1", children: /* @__PURE__ */ jsxs36("div", { ref: containerRef, className: "relative", style: containerStyle, children: [
9429
- /* @__PURE__ */ jsx57(
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__ */ jsx57("div", { style: overlayStyle }),
9456
- /* @__PURE__ */ jsx57(
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__ */ jsx57(
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 jsx58, jsxs as jsxs37 } from "react/jsx-runtime";
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__ */ jsx58("div", { className: `text-sm text-muted-foreground ${props.className || ""}`, children: "Select artwork to customize" });
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__ */ jsx58(
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__ */ jsx58("div", { className: "text-sm leading-relaxed", children: placements.map((p) => /* @__PURE__ */ jsx58(
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__ */ jsx58(ColorPicker2, { placement: selectedPlacement }) : isFitMode ? null : /* @__PURE__ */ jsx58("div", { className: "relative", children: props.children || /* @__PURE__ */ jsx58(
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 jsx59, jsxs as jsxs38 } from "react/jsx-runtime";
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__ */ jsx59("div", { className: "bg-background border-2 border-border rounded-lg aspect-square overflow-hidden relative", children: children || /* @__PURE__ */ jsx59("div", { className: "flex items-center justify-center w-full h-full", children: /* @__PURE__ */ jsx59("div", { className: "text-muted-foreground text-sm", children: "No editor provided" }) }) }),
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__ */ jsx59(
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__ */ jsx59("div", { className: "w-10 h-10 flex items-center justify-center", children: /* @__PURE__ */ jsx59(ImageIcon, { className: "w-6 h-6" }) })
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__ */ jsx59(
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__ */ jsx59("div", { className: "w-10 h-10 flex items-center justify-center", children: /* @__PURE__ */ jsx59(TypeIcon, { className: "w-6 h-6" }) })
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__ */ jsx59("button", { className: "flex flex-col items-center gap-2 text-muted-foreground hover:text-foreground transition-colors", children: /* @__PURE__ */ jsx59("div", { className: "w-10 h-10 flex items-center justify-center", children: /* @__PURE__ */ jsx59(ShapesIcon, { className: "w-6 h-6" }) }) }),
9605
- /* @__PURE__ */ jsx59("button", { className: "flex flex-col items-center gap-2 text-muted-foreground hover:text-foreground transition-colors", children: /* @__PURE__ */ jsx59("div", { className: "w-10 h-10 flex items-center justify-center", children: /* @__PURE__ */ jsx59(UploadIcon, { className: "w-6 h-6" }) }) })
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 jsx60, jsxs as jsxs39 } from "react/jsx-runtime";
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__ */ jsx60(
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__ */ jsx60(
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__ */ jsx60(
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__ */ jsx60("p", { className: "text-xs", children: "No artwork" })
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__ */ jsx60(
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__ */ jsx60("div", { className: "text-red-600 text-center p-4", children: /* @__PURE__ */ jsx60("p", { className: "text-xs", children: "Error loading" }) })
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__ */ jsx60(
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__ */ jsx60("div", { className: "absolute inset-0 flex items-center justify-center bg-muted", children: /* @__PURE__ */ jsx60("p", { className: "text-muted-foreground text-xs", children: "Preview unavailable" }) }),
10229
- realtimeContext?.renderError && /* @__PURE__ */ jsx60(
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__ */ jsx60(
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__ */ jsx60(
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 React44, { useEffect as useEffect33, useState as useState32 } from "react";
10268
- import { Fragment as Fragment12, jsx as jsx61 } from "react/jsx-runtime";
10269
- var SafeImg = React44.forwardRef(
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__ */ jsx61(Fragment12, { children: fallback });
10276
- return /* @__PURE__ */ jsx61(
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 jsx62, jsxs as jsxs40 } from "react/jsx-runtime";
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__ */ jsx62(
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__ */ jsx62(InitialSearchTrigger, {}),
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 jsx63, jsxs as jsxs41 } from "react/jsx-runtime";
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__ */ jsx63("form", { role: "search", onSubmit: (e) => e.preventDefault(), children: /* @__PURE__ */ jsxs41("div", { className: "relative", children: [
10425
- /* @__PURE__ */ jsx63(
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__ */ jsx63(Search, { className: "w-5 h-5", strokeWidth: 1.5, "aria-hidden": "true" }),
10435
- endContent: query ? /* @__PURE__ */ jsx63(
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__ */ jsx63(X, { className: "w-4 h-4", strokeWidth: 2, "aria-hidden": "true" })
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__ */ jsx63(
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__ */ jsx63(
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__ */ jsx63("style", { dangerouslySetInnerHTML: { __html: `
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__ */ jsx63("span", { id: descriptionId, className: "sr-only", children: "Search results will update as you type" })
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 jsx64 } from "react/jsx-runtime";
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__ */ jsx64(
10527
+ return /* @__PURE__ */ jsx65(
10501
10528
  Product,
10502
10529
  {
10503
10530
  productId,
10504
10531
  productData: product,
10505
- children: /* @__PURE__ */ jsx64(
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 jsx65, jsxs as jsxs42 } from "react/jsx-runtime";
10554
+ import { jsx as jsx66, jsxs as jsxs42 } from "react/jsx-runtime";
10528
10555
  function ProductGridSkeletonItem() {
10529
- return /* @__PURE__ */ jsx65("div", { className: "aspect-square bg-muted animate-pulse" });
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__ */ jsx65(
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__ */ jsx65("div", { className: "sr-only", role: "status", "aria-live": "polite", "aria-atomic": "true", children: announcement }),
10557
- showSkeleton && /* @__PURE__ */ jsx65("div", { className: `grid ${gridClassName}`, children: Array.from({ length: skeletonCount }).map((_, i) => /* @__PURE__ */ jsx65(ProductGridSkeletonItem, {}, i)) }),
10558
- /* @__PURE__ */ jsx65("div", { className: showSkeleton ? "hidden" : "", children: /* @__PURE__ */ jsx65(
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 jsx66, jsxs as jsxs43 } from "react/jsx-runtime";
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__ */ jsx66(SlidersHorizontalIcon, { className: "w-4 h-4" }),
10593
- /* @__PURE__ */ jsx66("span", { children })
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 jsx67, jsxs as jsxs44 } from "react/jsx-runtime";
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__ */ jsx67(
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__ */ jsx67("h2", { id: "filters-drawer-title", className: "text-xl font-bold", children: "Filters" }),
10649
- /* @__PURE__ */ jsx67(
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__ */ jsx67(XIcon2, { className: "w-5 h-5" })
10682
+ children: /* @__PURE__ */ jsx68(XIcon2, { className: "w-5 h-5" })
10656
10683
  }
10657
10684
  )
10658
10685
  ] }),
10659
- /* @__PURE__ */ jsx67("div", { className: "px-4 pb-4", children: /* @__PURE__ */ jsxs44("p", { className: "text-sm font-caption text-foreground/60", role: "status", "aria-live": "polite", children: [
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__ */ jsx67("div", { className: "flex-1 overflow-y-auto px-4 pb-4", children: /* @__PURE__ */ jsxs44("div", { className: "flex flex-col gap-8", children: [
10665
- /* @__PURE__ */ jsx67(TagsSection, { showCounts, setShowCounts }),
10666
- /* @__PURE__ */ jsx67(PriceSection, {})
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__ */ jsx67("h3", { className: "text-base font-semibold text-primary", children: "Tags" }),
10693
- /* @__PURE__ */ jsx67(
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__ */ jsx67("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })
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__ */ jsx67("div", { className: "flex flex-wrap gap-2", role: "group", "aria-label": "Product tags filter", children: items.map((item) => /* @__PURE__ */ jsxs44(
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__ */ jsx67("span", { "aria-hidden": "true", children: item.label }),
10721
- showCounts && /* @__PURE__ */ jsx67("span", { className: `text-xs font-caption ${item.isRefined ? "opacity-80" : "opacity-60"}`, "aria-hidden": "true", children: item.count })
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__ */ jsx67("span", { className: "text-sm font-label text-foreground/60", id: "show-counts-label", children: "Show counts" }),
10728
- /* @__PURE__ */ jsx67(
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__ */ jsx67(
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__ */ jsx67("h3", { className: "text-base font-semibold text-primary", children: "Price" }),
10792
- /* @__PURE__ */ jsx67(
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__ */ jsx67("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })
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__ */ jsx67("span", { children: formatPrice2(localRange[0]) }),
10810
- /* @__PURE__ */ jsx67("span", { className: "text-foreground/70", children: formatPrice2(localRange[1]) })
10836
+ /* @__PURE__ */ jsx68("span", { children: formatPrice2(localRange[0]) }),
10837
+ /* @__PURE__ */ jsx68("span", { className: "text-foreground/70", children: formatPrice2(localRange[1]) })
10811
10838
  ] }),
10812
- /* @__PURE__ */ jsx67("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) => {
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__ */ jsx67(
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__ */ jsx67("div", { style: { touchAction: "none" }, className: "my-6", children: /* @__PURE__ */ jsxs44(
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__ */ jsx67(Slider2.Track, { className: "relative h-3 w-full grow overflow-hidden rounded-full bg-foreground/20", children: /* @__PURE__ */ jsx67(Slider2.Range, { className: "absolute h-full bg-foreground" }) }),
10844
- /* @__PURE__ */ jsx67(
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__ */ jsx67(
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__ */ jsx67("label", { htmlFor: "price-min", className: "text-xs font-label text-foreground/60 mb-1.5 block", children: "Min" }),
10878
- /* @__PURE__ */ jsx67(
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__ */ jsx67("label", { htmlFor: "price-max", className: "text-xs font-label text-foreground/60 mb-1.5 block", children: "Max" }),
10898
- /* @__PURE__ */ jsx67(
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 jsx68, jsxs as jsxs45 } from "react/jsx-runtime";
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__ */ jsx68(
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__ */ jsx68(FiltersDrawer, { isOpen, onClose: () => setIsOpen(false) })
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 jsx69, jsxs as jsxs46 } from "react/jsx-runtime";
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__ */ jsx69("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(
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__ */ jsx69("span", { className: "truncate", children: refinement.displayLabel }),
10995
- /* @__PURE__ */ jsx69(XIcon3, { className: "w-3 h-3" })
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 jsx70, jsxs as jsxs47 } from "react/jsx-runtime";
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__ */ jsx70("div", { className: "sr-only", role: "status", "aria-live": "polite", "aria-atomic": "true", children: announcement }),
11085
- /* @__PURE__ */ jsx70(
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__ */ jsx70(
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__ */ jsx70(
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__ */ jsx70(
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__ */ jsx70("div", { className: "bg-white dark:bg-gray-800 rounded-full p-2 shadow-sm dark:shadow-gray-950/50", children: isZoomed ? /* @__PURE__ */ jsx70(
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__ */ jsx70(
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 jsx71, jsxs as jsxs48 } from "react/jsx-runtime";
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__ */ jsx71(
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__ */ jsx71(
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__ */ jsx71(
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__ */ jsx71(X2, { className: "w-7 h-7", strokeWidth: 2.5 })
11401
+ children: /* @__PURE__ */ jsx72(X2, { className: "w-7 h-7", strokeWidth: 2.5 })
11375
11402
  }
11376
11403
  ),
11377
- /* @__PURE__ */ jsx71(
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__ */ jsx71(
11451
+ /* @__PURE__ */ jsx72(
11425
11452
  TransformComponent,
11426
11453
  {
11427
11454
  wrapperStyle: {
11428
11455
  width: "100%",
11429
11456
  height: "100%"
11430
11457
  },
11431
- children: /* @__PURE__ */ jsx71(
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__ */ jsx71(
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__ */ jsx71("div", { className: "flex justify-center gap-2", children: (() => {
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__ */ jsx71(
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__ */ jsx71(
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__ */ jsx71(
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__ */ jsx71(
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__ */ jsx71(
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__ */ jsx71(
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__ */ jsx71("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: (() => {
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__ */ jsx71(
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 jsx72, jsxs as jsxs49 } from "react/jsx-runtime";
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__ */ jsx72(
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__ */ jsx72(
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__ */ jsx72(
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 jsx73, jsxs as jsxs50 } from "react/jsx-runtime";
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__ */ jsx73("div", { className: `bg-muted ${className ?? ""}`, role: "img", "aria-label": alt });
11735
+ return /* @__PURE__ */ jsx74("div", { className: `bg-muted ${className ?? ""}`, role: "img", "aria-label": alt });
11709
11736
  }
11710
- return /* @__PURE__ */ jsx73(
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__ */ jsx73(
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__ */ jsx73("div", { className: "flex h-full", children: images.map((_, index) => /* @__PURE__ */ jsx73(
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__ */ jsx73(
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__ */ jsx73("div", { className: "w-full aspect-video bg-muted rounded-lg" });
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__ */ jsx73(
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__ */ jsx73(
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__ */ jsx73(
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__ */ jsx73("div", { className: "w-full h-full bg-muted" }) : image.isPlaceholder ? (
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__ */ jsx73(LoadingOverlayPrismCandyInline, { visible: true, variant: "light" })
12279
- ) : image.isRealMockup && currentArtwork ? /* @__PURE__ */ jsx73(
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__ */ jsx73(LoadingOverlayPrismCandyInline, { visible: true, variant: "light" }) : /* @__PURE__ */ jsx73(
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__ */ jsx73(
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__ */ jsx73("div", { className: "flex h-full absolute inset-0", children: images.map((_, index) => /* @__PURE__ */ jsx73(
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__ */ jsx73(
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__ */ jsx73(
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 jsx74, jsxs as jsxs51 } from "react/jsx-runtime";
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__ */ jsx74("div", { className: "w-full h-full bg-muted" });
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__ */ jsx74(
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__ */ jsx74(
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__ */ jsx74(
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__ */ jsx74(
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__ */ jsx74(
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__ */ jsx74(
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 jsx75 } from "react/jsx-runtime";
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__ */ jsx75(Fragment18, { children: emptyContent });
12659
+ return /* @__PURE__ */ jsx76(Fragment18, { children: emptyContent });
12633
12660
  }
12634
12661
  return null;
12635
12662
  }
12636
- return /* @__PURE__ */ jsx75(
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__ */ jsx75(
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__ */ jsx75("div", { role: "listitem", children: renderItem(item, originalIndex) }, originalIndex);
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 jsx76, jsxs as jsxs52 } from "react/jsx-runtime";
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__ */ jsx76("style", { dangerouslySetInnerHTML: { __html: scopedStyles } }),
12922
- /* @__PURE__ */ jsx76(
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__ */ jsx76(
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__ */ jsx76(
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__ */ jsx76("div", { className: "relative z-10", children })
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 jsx77, jsxs as jsxs53 } from "react/jsx-runtime";
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__ */ jsx77("style", { dangerouslySetInnerHTML: { __html: scopedStyles } }),
13091
- /* @__PURE__ */ jsx77("div", { style: { height: spacerHeight } }),
13092
- header && /* @__PURE__ */ jsx77(
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__ */ jsx77(
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__ */ jsx77("div", { className: "relative z-10 bg-background", children })
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 React51 from "react";
13117
- import { jsx as jsx78 } from "react/jsx-runtime";
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 = React51.memo(
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__ */ jsx78(
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__ */ jsx78(
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 jsx79, jsxs as jsxs54 } from "react/jsx-runtime";
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__ */ jsx79("div", { className: "mobile-carousel-container", children: renderMobileCarousel({ images: carouselImages }) }),
13258
- /* @__PURE__ */ jsx79("div", { className: "mobile-content p-4", children: renderContent(contentProps) })
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__ */ jsx79(
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__ */ jsx79(
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 React52 from "react";
13292
- import { jsx as jsx80 } from "react/jsx-runtime";
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 = React52.memo(function SimpleImageBlur2({
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__ */ jsx80(
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__ */ jsx80(
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 React53 from "react";
13369
- import { jsx as jsx81, jsxs as jsxs55 } from "react/jsx-runtime";
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 = React53.memo(function EdgeBlurBox2({
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__ */ jsx81(
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__ */ jsx81(
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__ */ jsx81(
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 React54 from "react";
13490
- import { jsx as jsx82, jsxs as jsxs56 } from "react/jsx-runtime";
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 = React54.memo(function ImageBlurExtension2({
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__ */ jsx82(
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__ */ jsx82(
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 jsx83, jsxs as jsxs57 } from "react/jsx-runtime";
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__ */ jsx83(
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__ */ jsx83("div", { className: "text-sm font-medium text-foreground", children: name }),
13599
- /* @__PURE__ */ jsx83("code", { className: "text-xs text-muted-foreground font-mono", children: cssVar })
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__ */ jsx83(
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__ */ jsx83("div", { className: "text-sm font-medium text-foreground", children: name }),
13613
- description && /* @__PURE__ */ jsx83("div", { className: "text-xs text-muted-foreground", children: description })
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__ */ jsx83("code", { className: "text-xs text-muted-foreground font-mono bg-muted px-2 py-1 rounded", children: cssVar })
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 jsx84, jsxs as jsxs58 } from "react/jsx-runtime";
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__ */ jsx84("div", { className: `space-y-8 ${className}`, children: COLOR_GROUPS.map((group) => /* @__PURE__ */ jsxs58("section", { children: [
13702
- /* @__PURE__ */ jsx84("h3", { className: "text-lg font-semibold text-foreground mb-1", children: group.name }),
13703
- /* @__PURE__ */ jsx84("p", { className: "text-sm text-muted-foreground mb-4", children: group.description }),
13704
- layout === "grid" ? /* @__PURE__ */ jsx84("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-4", children: group.colors.map((color) => /* @__PURE__ */ jsx84(
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__ */ jsx84("div", { className: "bg-card rounded-lg border border-border p-4 divide-y divide-border", children: group.colors.map((color) => /* @__PURE__ */ jsx84(
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 jsx85, jsxs as jsxs59 } from "react/jsx-runtime";
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__ */ jsx85("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: [
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__ */ jsx85("h3", { className: "text-lg font-semibold text-foreground", children: font.name }),
13761
- /* @__PURE__ */ jsx85("code", { className: "text-xs text-muted-foreground font-mono bg-muted px-2 py-1 rounded", children: font.cssVar })
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__ */ jsx85("div", { className: "space-y-4", children: font.sizes.map((size) => /* @__PURE__ */ jsxs59("div", { className: "flex items-baseline gap-4", children: [
13764
- /* @__PURE__ */ jsx85("span", { className: "text-xs text-muted-foreground w-20 flex-shrink-0", children: size }),
13765
- /* @__PURE__ */ jsx85(
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__ */ jsx85("div", { className: `space-y-4 ${className}`, children: /* @__PURE__ */ jsx85("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: [
13785
- /* @__PURE__ */ jsx85(
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__ */ jsx85("span", { className: "text-sm font-medium text-foreground", children: radius.name }),
13795
- /* @__PURE__ */ jsx85("code", { className: "text-xs text-muted-foreground font-mono", children: radius.cssVar || radius.value })
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 jsx86, jsxs as jsxs60 } from "react/jsx-runtime";
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__ */ jsx86("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx86("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" }) }),
13870
- /* @__PURE__ */ jsx86("span", { className: "font-medium", children: currentTheme }),
13871
- /* @__PURE__ */ jsx86("svg", { className: `w-4 h-4 transition-transform ${isOpen ? "rotate-180" : ""}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx86("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) })
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__ */ jsx86(
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__ */ jsx86("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(
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__ */ jsx86(
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__ */ jsx86("span", { className: "text-foreground", children: theme.name }),
13897
- currentTheme === theme.name && /* @__PURE__ */ jsx86("svg", { className: "w-4 h-4 ml-auto text-primary", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx86("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 13l4 4L19 7" }) })
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__ */ jsx86("circle", { cx: "12", cy: "12", r: "5" }),
13913
- /* @__PURE__ */ jsx86("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" })
13914
- ] }) : /* @__PURE__ */ jsx86("svg", { className: "w-5 h-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx86("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }) }),
13915
- /* @__PURE__ */ jsx86("span", { className: "text-sm", children: isDark ? "Light" : "Dark" })
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 jsx87, jsxs as jsxs61 } from "react/jsx-runtime";
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__ */ jsx87("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: [
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__ */ jsx87("h1", { className: "text-4xl font-bold text-foreground mb-2", children: "Design System" }),
13937
- /* @__PURE__ */ jsx87("p", { className: "text-lg text-muted-foreground", children: "Visual reference for theme tokens and styles" })
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__ */ jsx87(ThemeSwitcher, {})
13966
+ showThemeSwitcher && /* @__PURE__ */ jsx88(ThemeSwitcher, {})
13940
13967
  ] }) }),
13941
13968
  showColors && /* @__PURE__ */ jsxs61("section", { className: "mb-16", children: [
13942
- /* @__PURE__ */ jsx87("h2", { className: "text-2xl font-semibold text-foreground mb-6 pb-2 border-b border-border", children: "Color Palette" }),
13943
- /* @__PURE__ */ jsx87(ColorPalette, { layout: colorLayout })
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__ */ jsx87("h2", { className: "text-2xl font-semibold text-foreground mb-6 pb-2 border-b border-border", children: "Typography" }),
13947
- /* @__PURE__ */ jsx87(TypographyScale, {})
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__ */ jsx87("h2", { className: "text-2xl font-semibold text-foreground mb-6 pb-2 border-b border-border", children: "Border Radius" }),
13951
- /* @__PURE__ */ jsx87(RadiusScale, {})
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__ */ jsx87("h2", { className: "text-2xl font-semibold text-foreground mb-6 pb-2 border-b border-border", children: "Spacing Scale" }),
13955
- /* @__PURE__ */ jsx87(SpacingScale, {})
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__ */ jsx87("div", { className: "space-y-2", children: spaces.map((space) => /* @__PURE__ */ jsxs61("div", { className: "flex items-center gap-4", children: [
13971
- /* @__PURE__ */ jsx87("code", { className: "text-xs text-muted-foreground font-mono w-8", children: space.name }),
13972
- /* @__PURE__ */ jsx87(
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__ */ jsx87("span", { className: "text-sm text-muted-foreground", children: space.value })
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 React55, {
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 createContext9, useContext as useContext7 } from "react";
13993
- var PersonalizationContext = createContext9(null);
14019
+ import { createContext as createContext10, useContext as useContext8 } from "react";
14020
+ var PersonalizationContext = createContext10(null);
13994
14021
  function usePersonalizationContext() {
13995
- return useContext7(PersonalizationContext);
14022
+ return useContext8(PersonalizationContext);
13996
14023
  }
13997
14024
 
13998
14025
  // src/personalization/PersonalizationProvider.tsx
13999
- import { Fragment as Fragment20, jsx as jsx88, jsxs as jsxs62 } from "react/jsx-runtime";
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 = React55.useRef(elements);
14032
+ const elementsRef = React56.useRef(elements);
14006
14033
  elementsRef.current = elements;
14007
- const executeRef = React55.useRef(executeElementUpdate);
14034
+ const executeRef = React56.useRef(executeElementUpdate);
14008
14035
  executeRef.current = executeElementUpdate;
14009
- const hasUserInput = React55.useRef(false);
14010
- React55.useEffect(() => {
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 = React55.useRef(elements);
14055
+ const elementsRef = React56.useRef(elements);
14029
14056
  elementsRef.current = elements;
14030
- const executeRef = React55.useRef(executeElementUpdate);
14057
+ const executeRef = React56.useRef(executeElementUpdate);
14031
14058
  executeRef.current = executeElementUpdate;
14032
- const appliedColorRef = React55.useRef(normalizeHex(originalColor));
14033
- React55.useEffect(() => {
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 = React55.useRef(false);
14100
+ const hasUserInput = React56.useRef(false);
14074
14101
  const debouncedValue = useDebouncedValue(value, 500);
14075
- const setImageUrlRef = React55.useRef(setImageUrl);
14102
+ const setImageUrlRef = React56.useRef(setImageUrl);
14076
14103
  setImageUrlRef.current = setImageUrl;
14077
- React55.useEffect(() => {
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__ */ jsx88(Fragment20, { children: fields.map((field) => {
14114
+ return /* @__PURE__ */ jsx89(Fragment20, { children: fields.map((field) => {
14088
14115
  if (field.type === "text") {
14089
- return /* @__PURE__ */ jsx88(TextBinder, { name: field.name, value: values[field.name] ?? "" }, `text-${field.name}`);
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__ */ jsx88(ColorBinder, { originalColor: field.color, newColor: values[field.color] ?? field.color }, `color-${field.color}`);
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__ */ jsx88(ImageBinder, { name: field.name, value: values[field.name] ?? "", fit: field.fit ?? "cover" }, `image-${field.name}`);
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 = React55.useMemo(
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__ */ jsx88(
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__ */ jsx88(
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__ */ jsx88(BridgeComponent, { fields, values: personValues })
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 jsx89, jsxs as jsxs63 } from "react/jsx-runtime";
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__ */ jsx89(
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__ */ jsx89(
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__ */ jsx89("span", { className: "text-base text-muted-foreground", children: field.label })
14353
+ /* @__PURE__ */ jsx90("span", { className: "text-base text-muted-foreground", children: field.label })
14327
14354
  ] }, `color-${field.color}`)),
14328
- imageFields.map((field) => /* @__PURE__ */ jsx89(
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,