@meetelise/studio-components 0.0.22 → 0.0.24

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.
Files changed (106) hide show
  1. package/dist/componentSchema.json +43 -1
  2. package/dist/components/Accordion.d.ts +1 -1
  3. package/dist/components/Accordion.d.ts.map +1 -1
  4. package/dist/components/Accordion.js +5 -1
  5. package/dist/components/Accordion.js.map +1 -1
  6. package/dist/components/AddressBlock.d.ts.map +1 -1
  7. package/dist/components/AddressBlock.js +4 -0
  8. package/dist/components/AddressBlock.js.map +1 -1
  9. package/dist/components/AmenityList.d.ts +1 -1
  10. package/dist/components/AmenityList.d.ts.map +1 -1
  11. package/dist/components/AmenityList.js +37 -6
  12. package/dist/components/AmenityList.js.map +1 -1
  13. package/dist/components/Container.d.ts +2 -1
  14. package/dist/components/Container.d.ts.map +1 -1
  15. package/dist/components/Container.js +5 -3
  16. package/dist/components/Container.js.map +1 -1
  17. package/dist/components/FeatureCard.d.ts +2 -1
  18. package/dist/components/FeatureCard.d.ts.map +1 -1
  19. package/dist/components/FeatureCard.js +2 -1
  20. package/dist/components/FeatureCard.js.map +1 -1
  21. package/dist/components/Footer.d.ts +2 -1
  22. package/dist/components/Footer.d.ts.map +1 -1
  23. package/dist/components/Footer.js +2 -1
  24. package/dist/components/Footer.js.map +1 -1
  25. package/dist/components/Gallery.d.ts +3 -2
  26. package/dist/components/Gallery.d.ts.map +1 -1
  27. package/dist/components/Gallery.js +45 -12
  28. package/dist/components/Gallery.js.map +1 -1
  29. package/dist/components/Image.d.ts +2 -1
  30. package/dist/components/Image.d.ts.map +1 -1
  31. package/dist/components/Image.js +2 -1
  32. package/dist/components/Image.js.map +1 -1
  33. package/dist/components/Lightbox.d.ts +2 -1
  34. package/dist/components/Lightbox.d.ts.map +1 -1
  35. package/dist/components/Lightbox.js +2 -1
  36. package/dist/components/Lightbox.js.map +1 -1
  37. package/dist/components/Link.d.ts.map +1 -1
  38. package/dist/components/Link.js +4 -0
  39. package/dist/components/Link.js.map +1 -1
  40. package/dist/components/Modal.d.ts +1 -1
  41. package/dist/components/Modal.d.ts.map +1 -1
  42. package/dist/components/Modal.js +4 -2
  43. package/dist/components/Modal.js.map +1 -1
  44. package/dist/components/Nav.d.ts +2 -1
  45. package/dist/components/Nav.d.ts.map +1 -1
  46. package/dist/components/Nav.js +3 -2
  47. package/dist/components/Nav.js.map +1 -1
  48. package/dist/components/PropertyCard.d.ts +1 -1
  49. package/dist/components/PropertyCard.d.ts.map +1 -1
  50. package/dist/components/PropertyCard.js +9 -1
  51. package/dist/components/PropertyCard.js.map +1 -1
  52. package/dist/components/StudioEditPlaceholder.d.ts +9 -0
  53. package/dist/components/StudioEditPlaceholder.d.ts.map +1 -0
  54. package/dist/components/StudioEditPlaceholder.js +8 -0
  55. package/dist/components/StudioEditPlaceholder.js.map +1 -0
  56. package/dist/components/StudioImage.d.ts +18 -0
  57. package/dist/components/StudioImage.d.ts.map +1 -0
  58. package/dist/components/StudioImage.js +76 -0
  59. package/dist/components/StudioImage.js.map +1 -0
  60. package/dist/components/VideoEmbed.d.ts +10 -0
  61. package/dist/components/VideoEmbed.d.ts.map +1 -0
  62. package/dist/components/VideoEmbed.js +47 -0
  63. package/dist/components/VideoEmbed.js.map +1 -0
  64. package/dist/components/VideoHero.d.ts +2 -1
  65. package/dist/components/VideoHero.d.ts.map +1 -1
  66. package/dist/components/VideoHero.js +3 -1
  67. package/dist/components/VideoHero.js.map +1 -1
  68. package/dist/components/VideoPlayer.d.ts +1 -1
  69. package/dist/components/VideoPlayer.d.ts.map +1 -1
  70. package/dist/components/VideoPlayer.js +4 -2
  71. package/dist/components/VideoPlayer.js.map +1 -1
  72. package/dist/components/browser/componentMeta.d.ts.map +1 -1
  73. package/dist/components/browser/componentMeta.js +31 -0
  74. package/dist/components/browser/componentMeta.js.map +1 -1
  75. package/dist/components/registry.d.ts.map +1 -1
  76. package/dist/components/registry.js +2 -0
  77. package/dist/components/registry.js.map +1 -1
  78. package/dist/components/units/FloorPlanCard.d.ts.map +1 -1
  79. package/dist/components/units/FloorPlanCard.js +2 -2
  80. package/dist/components/units/FloorPlanCard.js.map +1 -1
  81. package/dist/components/units/FloorplanExplorer.d.ts.map +1 -1
  82. package/dist/components/units/FloorplanExplorer.js +3 -3
  83. package/dist/components/units/FloorplanExplorer.js.map +1 -1
  84. package/dist/components/units/UnitCard.d.ts.map +1 -1
  85. package/dist/components/units/UnitCard.js +3 -3
  86. package/dist/components/units/UnitCard.js.map +1 -1
  87. package/dist/components/units/UnitPage.d.ts.map +1 -1
  88. package/dist/components/units/UnitPage.js +2 -2
  89. package/dist/components/units/UnitPage.js.map +1 -1
  90. package/dist/index.d.ts +6 -2
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +3 -1
  93. package/dist/index.js.map +1 -1
  94. package/dist/schema/componentSchema.d.ts +1 -1
  95. package/dist/schema/componentSchema.d.ts.map +1 -1
  96. package/dist/schema/componentSchema.js +16 -1
  97. package/dist/schema/componentSchema.js.map +1 -1
  98. package/dist/utils/imageUrl.d.ts +13 -3
  99. package/dist/utils/imageUrl.d.ts.map +1 -1
  100. package/dist/utils/imageUrl.js +58 -19
  101. package/dist/utils/imageUrl.js.map +1 -1
  102. package/dist/utils/resolveConfig.d.ts +48 -4
  103. package/dist/utils/resolveConfig.d.ts.map +1 -1
  104. package/dist/utils/resolveConfig.js +171 -14
  105. package/dist/utils/resolveConfig.js.map +1 -1
  106. package/package.json +1 -1
@@ -1,32 +1,47 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useState, useMemo, useEffect, useCallback } from "react";
2
+ import { useState, useMemo, useEffect, useCallback, useRef } from "react";
3
3
  import { twMerge } from "tailwind-merge";
4
4
  import { useSiteConfig } from "../hooks/useSiteConfig";
5
5
  import { useAuth } from "../hooks/useAuth";
6
- import { imageUrl } from "../utils/imageUrl";
7
6
  import { Lightbox } from "./Lightbox";
7
+ import { StudioEditPlaceholder } from "./StudioEditPlaceholder";
8
+ import { StudioImage } from "./StudioImage";
8
9
  const gridColClasses = {
9
10
  2: "grid-cols-1 sm:grid-cols-2",
10
11
  3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
11
12
  4: "grid-cols-2 sm:grid-cols-3 lg:grid-cols-4",
12
13
  };
14
+ const gridSizes = {
15
+ 2: "(min-width: 640px) 50vw, 100vw",
16
+ 3: "(min-width: 1024px) 33vw, (min-width: 640px) 50vw, 100vw",
17
+ 4: "(min-width: 1024px) 25vw, (min-width: 640px) 33vw, 50vw",
18
+ };
13
19
  /** Map media API "type" field to a user-friendly category name. */
14
20
  const TYPE_TO_CATEGORY = {
15
21
  Building: "Community",
16
22
  UnitPhotography: "Interiors",
17
23
  Floorplan: "Floor Plans",
18
24
  };
25
+ function imageKey(src, index) {
26
+ if (typeof src === "string")
27
+ return `${src}-${index}`;
28
+ return `${src?.asset ?? src?.src ?? "image"}-${index}`;
29
+ }
19
30
  export function Gallery({ propertyId: propertyIdProp, images: staticImages = [], categories, layout = "grid", columns = 3, className, "data-node-id": dataNodeId, }) {
20
31
  const config = useSiteConfig();
21
32
  const { authenticatedFetch } = useAuth();
22
33
  const propertyId = propertyIdProp ?? config.property?.propertyId;
23
34
  const apiBaseUrl = config.property?.apiBaseUrl ?? "";
24
35
  const [apiImages, setApiImages] = useState(null);
25
- const [loading, setLoading] = useState(false);
36
+ const [loading, setLoading] = useState(Boolean(propertyId));
37
+ const [loadedPropertyId, setLoadedPropertyId] = useState(null);
38
+ const requestSeqRef = useRef(0);
26
39
  // Fetch from media API when propertyId is available
27
40
  const fetchMedia = useCallback(async () => {
28
41
  if (!propertyId)
29
42
  return;
43
+ const requestSeq = requestSeqRef.current + 1;
44
+ requestSeqRef.current = requestSeq;
30
45
  setLoading(true);
31
46
  try {
32
47
  const res = await authenticatedFetch(`${apiBaseUrl}/v1/properties/${propertyId}?include_media=true`);
@@ -37,21 +52,38 @@ export function Gallery({ propertyId: propertyIdProp, images: staticImages = [],
37
52
  alt: m.name || m.description || "",
38
53
  category: TYPE_TO_CATEGORY[m.type ?? ""] ?? m.type ?? undefined,
39
54
  }));
55
+ if (requestSeq !== requestSeqRef.current)
56
+ return;
40
57
  setApiImages(items);
41
58
  }
42
59
  catch {
60
+ if (requestSeq !== requestSeqRef.current)
61
+ return;
43
62
  setApiImages(null);
44
63
  }
45
64
  finally {
46
- setLoading(false);
65
+ if (requestSeq === requestSeqRef.current) {
66
+ setLoadedPropertyId(propertyId);
67
+ setLoading(false);
68
+ }
47
69
  }
48
70
  }, [propertyId, apiBaseUrl, authenticatedFetch]);
49
71
  useEffect(() => {
50
- if (propertyId)
51
- fetchMedia();
72
+ if (!propertyId) {
73
+ requestSeqRef.current += 1;
74
+ setApiImages(null);
75
+ setLoadedPropertyId(null);
76
+ setLoading(false);
77
+ return;
78
+ }
79
+ fetchMedia();
52
80
  }, [propertyId, fetchMedia]);
53
81
  // Use API images if available, else static content-blob images
54
- const images = apiImages ?? staticImages;
82
+ const hasFreshApiImages = Boolean(propertyId) && loadedPropertyId === propertyId && apiImages !== null;
83
+ const images = hasFreshApiImages ? apiImages : staticImages;
84
+ const isWaitingForApiImages = Boolean(propertyId) &&
85
+ staticImages.length === 0 &&
86
+ (loading || loadedPropertyId !== propertyId);
55
87
  const [activeCategory, setActiveCategory] = useState(null);
56
88
  const [lightboxIndex, setLightboxIndex] = useState(null);
57
89
  const [carouselIndex, setCarouselIndex] = useState(0);
@@ -66,11 +98,12 @@ export function Gallery({ propertyId: propertyIdProp, images: staticImages = [],
66
98
  return images;
67
99
  return images.filter((img) => img.category === activeCategory);
68
100
  }, [images, activeCategory]);
69
- if (loading) {
101
+ if (loading || isWaitingForApiImages) {
70
102
  return (_jsx("div", { "data-node-id": dataNodeId, className: twMerge("text-center py-8 text-[var(--color-muted)]", className), children: "Loading gallery..." }));
71
103
  }
72
- if (images.length === 0)
73
- return null;
104
+ if (images.length === 0) {
105
+ return (_jsx(StudioEditPlaceholder, { "data-node-id": dataNodeId, label: "Add gallery images", hint: "Photos will appear here", className: className }));
106
+ }
74
107
  return (_jsxs("div", { "data-node-id": dataNodeId, className: twMerge("w-full", className), children: [derivedCategories.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-2 mb-6", children: derivedCategories.map((cat) => {
75
108
  const isActive = cat === "All" ? !activeCategory : activeCategory === cat;
76
109
  return (_jsx("button", { onClick: () => setActiveCategory(cat === "All" ? null : cat), className: twMerge("rounded-full px-4 py-1.5 text-sm font-medium transition-colors cursor-pointer", isActive
@@ -78,9 +111,9 @@ export function Gallery({ propertyId: propertyIdProp, images: staticImages = [],
78
111
  : "bg-[var(--color-muted)]/10 text-[var(--color-foreground)] hover:bg-[var(--color-muted)]/20"), children: cat }, cat));
79
112
  }) })), layout === "grid" ? (
80
113
  /* Grid Layout */
81
- _jsx("div", { className: twMerge("grid gap-3", gridColClasses[columns] ?? gridColClasses[3]), children: filtered.map((img, i) => (_jsx("button", { onClick: () => setLightboxIndex(i), className: "group relative aspect-[4/3] overflow-hidden rounded-lg bg-gray-100 cursor-pointer", children: _jsx("img", { src: imageUrl(img.src, { w: 400, q: 75 }), alt: img.alt ?? "", loading: "lazy", className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" }) }, `${img.src}-${i}`))) })) : (
114
+ _jsx("div", { className: twMerge("grid gap-3", gridColClasses[columns] ?? gridColClasses[3]), children: filtered.map((img, i) => (_jsx("button", { onClick: () => setLightboxIndex(i), className: "group relative aspect-[4/3] overflow-hidden rounded-lg bg-gray-100 cursor-pointer", children: _jsx(StudioImage, { src: img.src, alt: img.alt ?? "", sizes: gridSizes[columns] ?? gridSizes[3], quality: 75, allowCrop: false, className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" }) }, imageKey(img.src, i)))) })) : (
82
115
  /* Carousel Layout */
83
- _jsx("div", { className: "relative", children: filtered.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "aspect-[16/9] overflow-hidden rounded-lg bg-gray-100", children: _jsx("img", { src: imageUrl(filtered[carouselIndex % filtered.length]?.src, { w: 1200, q: 85 }), alt: filtered[carouselIndex % filtered.length]?.alt ?? "", className: "w-full h-full object-cover" }) }), _jsxs("div", { className: "absolute top-3 right-3 bg-black/50 text-white text-xs px-2 py-1 rounded", children: [(carouselIndex % filtered.length) + 1, " /", " ", filtered.length] }), filtered.length > 1 && (_jsxs(_Fragment, { children: [_jsx("button", { onClick: () => setCarouselIndex((carouselIndex - 1 + filtered.length) %
116
+ _jsx("div", { className: "relative", children: filtered.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "aspect-[16/9] overflow-hidden rounded-lg bg-gray-100", children: _jsx(StudioImage, { src: filtered[carouselIndex % filtered.length]?.src, alt: filtered[carouselIndex % filtered.length]?.alt ?? "", sizes: "100vw", quality: 85, allowCrop: false, className: "w-full h-full object-cover" }) }), _jsxs("div", { className: "absolute top-3 right-3 bg-black/50 text-white text-xs px-2 py-1 rounded", children: [(carouselIndex % filtered.length) + 1, " /", " ", filtered.length] }), filtered.length > 1 && (_jsxs(_Fragment, { children: [_jsx("button", { onClick: () => setCarouselIndex((carouselIndex - 1 + filtered.length) %
84
117
  filtered.length), className: "absolute left-2 top-1/2 -translate-y-1/2 bg-black/40 hover:bg-black/60 text-white rounded-full p-2 cursor-pointer", "aria-label": "Previous", children: _jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M15 18l-6-6 6-6" }) }) }), _jsx("button", { onClick: () => setCarouselIndex((carouselIndex + 1) % filtered.length), className: "absolute right-2 top-1/2 -translate-y-1/2 bg-black/40 hover:bg-black/60 text-white rounded-full p-2 cursor-pointer", "aria-label": "Next", children: _jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M9 18l6-6-6-6" }) }) })] })), _jsx("button", { onClick: () => setLightboxIndex(carouselIndex % filtered.length), className: "absolute inset-0 cursor-pointer", "aria-label": "Open fullscreen" })] })) })), lightboxIndex != null && (_jsx(Lightbox, { images: filtered, index: lightboxIndex, onClose: () => setLightboxIndex(null), onChange: setLightboxIndex }))] }));
85
118
  }
86
119
  //# sourceMappingURL=Gallery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Gallery.js","sourceRoot":"","sources":["../../src/components/Gallery.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Gallery.js","sourceRoot":"","sources":["../../src/components/Gallery.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { EditableNodeAttributes } from "../types";
2
+ import { type StudioImageSource } from "./StudioImage";
2
3
  interface ImageProps extends EditableNodeAttributes {
3
- src?: string;
4
+ src?: StudioImageSource;
4
5
  alt?: string;
5
6
  className?: string;
6
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Image.d.ts","sourceRoot":"","sources":["../../src/components/Image.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEvD,UAAU,UAAW,SAAQ,sBAAsB;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,UAAU,kDAUpF"}
1
+ {"version":3,"file":"Image.d.ts","sourceRoot":"","sources":["../../src/components/Image.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEpE,UAAU,UAAW,SAAQ,sBAAsB;IACjD,GAAG,CAAC,EAAE,iBAAiB,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,UAAU,kDAWpF"}
@@ -1,8 +1,9 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { twMerge } from "tailwind-merge";
3
+ import { StudioImage } from "./StudioImage";
3
4
  export function Image({ src, alt, className, "data-node-id": dataNodeId }) {
4
5
  if (!src)
5
6
  return null;
6
- return (_jsx("img", { "data-node-id": dataNodeId, src: src, alt: alt ?? "", className: twMerge("max-w-full", className) }));
7
+ return (_jsx(StudioImage, { "data-node-id": dataNodeId, src: src, alt: alt ?? "", sizes: "100vw", className: twMerge("max-w-full", className) }));
7
8
  }
8
9
  //# sourceMappingURL=Image.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Image.js","sourceRoot":"","sources":["../../src/components/Image.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AASzC,MAAM,UAAU,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAc;IACnF,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,CACL,8BACgB,UAAU,EACxB,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,IAAI,EAAE,EACd,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,GAC3C,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"Image.js","sourceRoot":"","sources":["../../src/components/Image.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,OAAO,EAAE,WAAW,EAA0B,MAAM,eAAe,CAAC;AAQpE,MAAM,UAAU,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAc;IACnF,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,CACL,KAAC,WAAW,oBACI,UAAU,EACxB,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,IAAI,EAAE,EACd,KAAK,EAAC,OAAO,EACb,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,GAC3C,CACH,CAAC;AACJ,CAAC"}
@@ -1,5 +1,6 @@
1
+ import { type StudioImageSource } from "./StudioImage";
1
2
  interface LightboxImage {
2
- src: string;
3
+ src: StudioImageSource;
3
4
  alt?: string;
4
5
  }
5
6
  interface LightboxProps {
@@ -1 +1 @@
1
- {"version":3,"file":"Lightbox.d.ts","sourceRoot":"","sources":["../../src/components/Lightbox.tsx"],"names":[],"mappings":"AAEA,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,UAAU,aAAa;IACrB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,aAAa,kDAmF3E"}
1
+ {"version":3,"file":"Lightbox.d.ts","sourceRoot":"","sources":["../../src/components/Lightbox.tsx"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEpE,UAAU,aAAa;IACrB,GAAG,EAAE,iBAAiB,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,UAAU,aAAa;IACrB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,aAAa,kDAsF3E"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useCallback } from "react";
3
+ import { StudioImage } from "./StudioImage";
3
4
  export function Lightbox({ images, index, onClose, onChange }) {
4
5
  const image = images[index];
5
6
  if (!image)
@@ -18,6 +19,6 @@ export function Lightbox({ images, index, onClose, onChange }) {
18
19
  window.addEventListener("keydown", onKey);
19
20
  return () => window.removeEventListener("keydown", onKey);
20
21
  }, [onClose, goPrev, goNext]);
21
- return (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/90", onClick: onClose, children: [_jsx("button", { onClick: onClose, className: "absolute top-4 right-4 text-white/70 hover:text-white z-10 cursor-pointer", "aria-label": "Close", children: _jsx("svg", { width: "28", height: "28", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M6 6l12 12M18 6L6 18" }) }) }), _jsxs("div", { className: "absolute top-4 left-4 text-white/60 text-sm", children: [index + 1, " / ", images.length] }), images.length > 1 && (_jsx("button", { onClick: (e) => { e.stopPropagation(); goPrev(); }, className: "absolute left-4 text-white/70 hover:text-white z-10 cursor-pointer", "aria-label": "Previous", children: _jsx("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M15 18l-6-6 6-6" }) }) })), _jsx("img", { src: image.src, alt: image.alt ?? "", className: "max-w-[90vw] max-h-[85vh] object-contain", onClick: (e) => e.stopPropagation() }), images.length > 1 && (_jsx("button", { onClick: (e) => { e.stopPropagation(); goNext(); }, className: "absolute right-4 text-white/70 hover:text-white z-10 cursor-pointer", "aria-label": "Next", children: _jsx("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M9 18l6-6-6-6" }) }) })), image.alt && (_jsx("div", { className: "absolute bottom-4 left-1/2 -translate-x-1/2 text-white/70 text-sm text-center max-w-md", children: image.alt }))] }));
22
+ return (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/90", onClick: onClose, children: [_jsx("button", { onClick: onClose, className: "absolute top-4 right-4 text-white/70 hover:text-white z-10 cursor-pointer", "aria-label": "Close", children: _jsx("svg", { width: "28", height: "28", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M6 6l12 12M18 6L6 18" }) }) }), _jsxs("div", { className: "absolute top-4 left-4 text-white/60 text-sm", children: [index + 1, " / ", images.length] }), images.length > 1 && (_jsx("button", { onClick: (e) => { e.stopPropagation(); goPrev(); }, className: "absolute left-4 text-white/70 hover:text-white z-10 cursor-pointer", "aria-label": "Previous", children: _jsx("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M15 18l-6-6 6-6" }) }) })), _jsx(StudioImage, { src: image.src, alt: image.alt ?? "", sizes: "90vw", quality: 90, allowCrop: false, className: "max-w-[90vw] max-h-[85vh] object-contain", onClick: (e) => e.stopPropagation() }), images.length > 1 && (_jsx("button", { onClick: (e) => { e.stopPropagation(); goNext(); }, className: "absolute right-4 text-white/70 hover:text-white z-10 cursor-pointer", "aria-label": "Next", children: _jsx("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M9 18l6-6-6-6" }) }) })), image.alt && (_jsx("div", { className: "absolute bottom-4 left-1/2 -translate-x-1/2 text-white/70 text-sm text-center max-w-md", children: image.alt }))] }));
22
23
  }
23
24
  //# sourceMappingURL=Lightbox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Lightbox.js","sourceRoot":"","sources":["../../src/components/Lightbox.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Lightbox.js","sourceRoot":"","sources":["../../src/components/Lightbox.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/components/Link.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEvD,UAAU,SAAU,SAAQ,sBAAsB;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,SAAS,2CAgBrF"}
1
+ {"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/components/Link.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGvD,UAAU,SAAU,SAAQ,sBAAsB;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,SAAS,2CA2BrF"}
@@ -1,9 +1,13 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { twMerge } from "tailwind-merge";
3
3
  import { useNavigate } from "../router";
4
+ import { StudioEditPlaceholder } from "./StudioEditPlaceholder";
4
5
  const defaults = "text-[var(--color-primary)] underline-offset-2 hover:underline cursor-pointer";
5
6
  export function Link({ to, content, className, "data-node-id": dataNodeId }) {
6
7
  const navigate = useNavigate();
8
+ if (!content) {
9
+ return (_jsx(StudioEditPlaceholder, { "data-node-id": dataNodeId, label: "Empty Link", hint: "Add link text", className: className }));
10
+ }
7
11
  return (_jsx("a", { "data-node-id": dataNodeId, href: to, className: twMerge(defaults, className), onClick: (e) => {
8
12
  e.preventDefault();
9
13
  navigate(to);
@@ -1 +1 @@
1
- {"version":3,"file":"Link.js","sourceRoot":"","sources":["../../src/components/Link.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AASxC,MAAM,QAAQ,GAAG,+EAA+E,CAAC;AAEjG,MAAM,UAAU,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAa;IACpF,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,OAAO,CACL,4BACgB,UAAU,EACxB,IAAI,EAAE,EAAE,EACR,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,EACvC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACb,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,QAAQ,CAAC,EAAE,CAAC,CAAC;QACf,CAAC,YAEA,OAAO,GACN,CACL,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"Link.js","sourceRoot":"","sources":["../../src/components/Link.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAQhE,MAAM,QAAQ,GAAG,+EAA+E,CAAC;AAEjG,MAAM,UAAU,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAa;IACpF,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CACL,KAAC,qBAAqB,oBACN,UAAU,EACxB,KAAK,EAAC,YAAY,EAClB,IAAI,EAAC,eAAe,EACpB,SAAS,EAAE,SAAS,GACpB,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CACL,4BACgB,UAAU,EACxB,IAAI,EAAE,EAAE,EACR,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,EACvC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACb,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,QAAQ,CAAC,EAAE,CAAC,CAAC;QACf,CAAC,YAEA,OAAO,GACN,CACL,CAAC;AACJ,CAAC"}
@@ -5,6 +5,6 @@ interface ModalProps extends EditableNodeAttributes {
5
5
  children?: React.ReactNode;
6
6
  className?: string;
7
7
  }
8
- export declare function Modal({ id, title, children, className, "data-node-id": dataNodeId }: ModalProps): import("react/jsx-runtime").JSX.Element | null;
8
+ export declare function Modal({ id, title, children, className, "data-node-id": dataNodeId }: ModalProps): import("react/jsx-runtime").JSX.Element;
9
9
  export {};
10
10
  //# sourceMappingURL=Modal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../src/components/Modal.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEvD,UAAU,UAAW,SAAQ,sBAAsB;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,UAAU,kDA4D/F"}
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../src/components/Modal.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGvD,UAAU,UAAW,SAAQ,sBAAsB;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,UAAU,2CAqE/F"}
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useRef, useEffect } from "react";
3
3
  import { twMerge } from "tailwind-merge";
4
4
  import { useModal } from "../hooks/useModal";
5
+ import { StudioEditPlaceholder } from "./StudioEditPlaceholder";
5
6
  export function Modal({ id, title, children, className, "data-node-id": dataNodeId }) {
6
7
  const { activeModalId, closeModal } = useModal();
7
8
  const panelRef = useRef(null);
@@ -12,8 +13,9 @@ export function Modal({ id, title, children, className, "data-node-id": dataNode
12
13
  panelRef.current.focus();
13
14
  }
14
15
  }, [isOpen]);
15
- if (!isOpen)
16
- return null;
16
+ if (!isOpen) {
17
+ return (_jsx(StudioEditPlaceholder, { "data-node-id": dataNodeId, label: "Closed Modal", hint: "Open this modal from a button", className: className }));
18
+ }
17
19
  return (_jsxs("div", { "data-node-id": dataNodeId, className: "fixed inset-0 z-50 flex items-center justify-center p-4", onClick: closeModal, role: "dialog", "aria-modal": "true", "aria-label": title, children: [_jsx("div", { className: "absolute inset-0 bg-black/60" }), _jsxs("div", { ref: panelRef, tabIndex: -1, onClick: (e) => e.stopPropagation(), className: twMerge("relative z-10 w-full max-w-lg max-h-[90vh] overflow-y-auto rounded-[var(--radius)] bg-white shadow-2xl", className), children: [_jsxs("div", { className: "flex items-center justify-between border-b border-gray-100 px-6 py-4", children: [title && (_jsx("h2", { className: "text-lg font-semibold text-[var(--color-foreground)]", children: title })), _jsx("button", { onClick: closeModal, className: "ml-auto rounded-md p-1 text-[var(--color-muted)] hover:text-[var(--color-foreground)] transition-colors cursor-pointer", "aria-label": "Close", children: _jsx("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M5 5l10 10M15 5L5 15" }) }) })] }), _jsx("div", { className: "px-6 py-5", children: children })] })] }));
18
20
  }
19
21
  //# sourceMappingURL=Modal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../src/components/Modal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAU7C,MAAM,UAAU,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAc;IAC9F,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,aAAa,KAAK,EAAE,CAAC;IAEpC,uCAAuC;IACvC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC/B,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,OAAO,CACL,+BACgB,UAAU,EACxB,SAAS,EAAC,yDAAyD,EACnE,OAAO,EAAE,UAAU,EACnB,IAAI,EAAC,QAAQ,gBACF,MAAM,gBACL,KAAK,aAGjB,cAAK,SAAS,EAAC,8BAA8B,GAAG,EAGhD,eACE,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,CAAC,CAAC,EACZ,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,EACnC,SAAS,EAAE,OAAO,CAChB,wGAAwG,EACxG,SAAS,CACV,aAGD,eAAK,SAAS,EAAC,sEAAsE,aAClF,KAAK,IAAI,CACR,aAAI,SAAS,EAAC,sDAAsD,YACjE,KAAK,GACH,CACN,EACD,iBACE,OAAO,EAAE,UAAU,EACnB,SAAS,EAAC,wHAAwH,gBACvH,OAAO,YAElB,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,GAAG,YAC/F,eAAM,CAAC,EAAC,sBAAsB,GAAG,GAC7B,GACC,IACL,EAGN,cAAK,SAAS,EAAC,WAAW,YAAE,QAAQ,GAAO,IACvC,IACF,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../src/components/Modal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAShE,MAAM,UAAU,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAc;IAC9F,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,aAAa,KAAK,EAAE,CAAC;IAEpC,uCAAuC;IACvC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC/B,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CACL,KAAC,qBAAqB,oBACN,UAAU,EACxB,KAAK,EAAC,cAAc,EACpB,IAAI,EAAC,+BAA+B,EACpC,SAAS,EAAE,SAAS,GACpB,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CACL,+BACgB,UAAU,EACxB,SAAS,EAAC,yDAAyD,EACnE,OAAO,EAAE,UAAU,EACnB,IAAI,EAAC,QAAQ,gBACF,MAAM,gBACL,KAAK,aAGjB,cAAK,SAAS,EAAC,8BAA8B,GAAG,EAGhD,eACE,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,CAAC,CAAC,EACZ,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,EACnC,SAAS,EAAE,OAAO,CAChB,wGAAwG,EACxG,SAAS,CACV,aAGD,eAAK,SAAS,EAAC,sEAAsE,aAClF,KAAK,IAAI,CACR,aAAI,SAAS,EAAC,sDAAsD,YACjE,KAAK,GACH,CACN,EACD,iBACE,OAAO,EAAE,UAAU,EACnB,SAAS,EAAC,wHAAwH,gBACvH,OAAO,YAElB,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,GAAG,YAC/F,eAAM,CAAC,EAAC,sBAAsB,GAAG,GAC7B,GACC,IACL,EAGN,cAAK,SAAS,EAAC,WAAW,YAAE,QAAQ,GAAO,IACvC,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { EditableNodeAttributes, NavLink as NavLinkType } from "../types";
2
+ import { type StudioImageSource } from "./StudioImage";
2
3
  interface NavProps extends EditableNodeAttributes {
3
- logo?: string;
4
+ logo?: StudioImageSource;
4
5
  siteName?: string;
5
6
  links?: NavLinkType[];
6
7
  sticky?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Nav.d.ts","sourceRoot":"","sources":["../../src/components/Nav.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,UAAU,CAAC;AAE/E,UAAU,QAAS,SAAQ,sBAAsB;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAU,EAAE,MAAc,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,QAAQ,2CA2HlH"}
1
+ {"version":3,"file":"Nav.d.ts","sourceRoot":"","sources":["../../src/components/Nav.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEpE,UAAU,QAAS,SAAQ,sBAAsB;IAC/C,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAU,EAAE,MAAc,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,QAAQ,2CA4HlH"}
@@ -2,6 +2,7 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
2
2
  import { useState } from "react";
3
3
  import { twMerge } from "tailwind-merge";
4
4
  import { useNavigate, usePathname } from "../router";
5
+ import { StudioImage } from "./StudioImage";
5
6
  export function Nav({ logo, siteName, links = [], sticky = false, className, "data-node-id": dataNodeId }) {
6
7
  const [menuOpen, setMenuOpen] = useState(false);
7
8
  const navigate = useNavigate();
@@ -36,10 +37,10 @@ export function Nav({ logo, siteName, links = [], sticky = false, className, "da
36
37
  }
37
38
  setMenuOpen(false);
38
39
  };
39
- return (_jsxs("nav", { "data-node-id": dataNodeId, className: twMerge("w-full bg-white border-b border-gray-100 z-40", sticky && "sticky top-0 shadow-sm", className), children: [_jsxs("div", { className: "max-w-6xl mx-auto flex items-center justify-between px-4 py-3", children: [_jsx("a", { href: "/", onClick: (e) => {
40
+ return (_jsxs("nav", { "data-node-id": dataNodeId, className: twMerge("w-full bg-white border-b border-gray-100 z-40", sticky && "sticky top-0 shadow-sm", className), children: [_jsxs("div", { className: "max-w-6xl mx-auto flex items-center justify-between px-4 py-3", children: [_jsx("a", { href: "/", "aria-label": siteName ? `${siteName} home` : "Home", onClick: (e) => {
40
41
  e.preventDefault();
41
42
  handleNav("/");
42
- }, className: "flex items-center gap-2 cursor-pointer", children: logo ? (_jsx("img", { src: logo, alt: siteName ?? "Home", className: "h-8 w-auto", width: "auto", height: "32" })) : siteName ? (_jsx("span", { className: "text-lg font-bold text-[var(--color-foreground)]", children: siteName })) : null }), _jsx("div", { className: "hidden md:flex items-center gap-6", children: links.map((link) => (_jsx("a", { href: link.to, onClick: (e) => {
43
+ }, className: "flex items-center gap-2 cursor-pointer", children: logo ? (_jsx(StudioImage, { src: logo, decorative: true, sizes: "160px", className: "h-8 w-auto" })) : siteName ? (_jsx("span", { className: "text-lg font-bold text-[var(--color-foreground)]", children: siteName })) : null }), _jsx("div", { className: "hidden md:flex items-center gap-6", children: links.map((link) => (_jsx("a", { href: link.to, onClick: (e) => {
43
44
  e.preventDefault();
44
45
  handleNav(link.to);
45
46
  }, className: twMerge("text-sm font-medium transition-colors cursor-pointer", pathname === link.to
@@ -1 +1 @@
1
- {"version":3,"file":"Nav.js","sourceRoot":"","sources":["../../src/components/Nav.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Nav.js","sourceRoot":"","sources":["../../src/components/Nav.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { PublicProperty } from "../hooks/useProperties";
2
2
  import type { EditableNodeAttributes } from "../types";
3
3
  interface PropertyCardProps extends EditableNodeAttributes {
4
- property: PublicProperty;
4
+ property?: PublicProperty | null;
5
5
  /**
6
6
  * Link target template. Placeholders: {id}, {name}, {city}, {state}.
7
7
  * Use an absolute URL (https://…) to link to a property's own website.
@@ -1 +1 @@
1
- {"version":3,"file":"PropertyCard.d.ts","sourceRoot":"","sources":["../../src/components/PropertyCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEvD,UAAU,iBAAkB,SAAQ,sBAAsB;IACxD,QAAQ,EAAE,cAAc,CAAC;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM,CAMnF;AAQD,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAgC,EAChC,SAAS,EACT,cAAc,EAAE,UAAU,GAC3B,EAAE,iBAAiB,2CA6CnB"}
1
+ {"version":3,"file":"PropertyCard.d.ts","sourceRoot":"","sources":["../../src/components/PropertyCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAIvD,UAAU,iBAAkB,SAAQ,sBAAsB;IACxD,QAAQ,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM,CAMnF;AAYD,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAgC,EAChC,SAAS,EACT,cAAc,EAAE,UAAU,GAC3B,EAAE,iBAAiB,2CA2DnB"}
@@ -1,6 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { twMerge } from "tailwind-merge";
3
3
  import { useNavigate } from "../router";
4
+ import { StudioEditPlaceholder } from "./StudioEditPlaceholder";
5
+ import { StudioImage } from "./StudioImage";
4
6
  export function buildPropertyHref(pattern, property) {
5
7
  return pattern
6
8
  .replace(/\{id\}/g, String(property.id))
@@ -14,8 +16,14 @@ function primaryImageUrl(property) {
14
16
  const sorted = [...property.media].sort((a, b) => (a.rank ?? 999) - (b.rank ?? 999));
15
17
  return sorted[0]?.url ?? null;
16
18
  }
19
+ function isUsableProperty(value) {
20
+ return Boolean(value && typeof value === "object" && (value.id != null || value.name));
21
+ }
17
22
  export function PropertyCard({ property, hrefPattern = "/properties/{id}", className, "data-node-id": dataNodeId, }) {
18
23
  const navigate = useNavigate();
24
+ if (!isUsableProperty(property)) {
25
+ return (_jsx(StudioEditPlaceholder, { "data-node-id": dataNodeId, label: "Configure property card", hint: "Property cards are usually rendered by Property Grid", className: className }));
26
+ }
19
27
  const href = buildPropertyHref(hrefPattern, property);
20
28
  const isExternal = /^https?:\/\//i.test(href);
21
29
  const image = primaryImageUrl(property);
@@ -26,6 +34,6 @@ export function PropertyCard({ property, hrefPattern = "/properties/{id}", class
26
34
  e.preventDefault();
27
35
  navigate(href);
28
36
  };
29
- return (_jsxs("a", { "data-node-id": dataNodeId, href: href, onClick: handleClick, target: isExternal ? "_blank" : undefined, rel: isExternal ? "noopener noreferrer" : undefined, className: twMerge("group flex flex-col overflow-hidden rounded-[var(--radius)] bg-white shadow-[var(--shadow)] transition-shadow hover:shadow-[var(--shadow-hover)] cursor-pointer", className), children: [_jsx("div", { className: "aspect-[4/3] w-full overflow-hidden bg-[var(--color-muted)]/10", children: image && (_jsx("img", { src: image, alt: property.name ?? "Property", loading: "lazy", className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105" })) }), _jsxs("div", { className: "flex flex-col gap-1 p-4", children: [_jsx("span", { className: "text-base font-semibold text-[var(--color-foreground)]", children: property.name ?? "Community" }), location && (_jsx("span", { className: "text-sm text-[var(--color-secondary)]", children: location }))] })] }));
37
+ return (_jsxs("a", { "data-node-id": dataNodeId, href: href, onClick: handleClick, target: isExternal ? "_blank" : undefined, rel: isExternal ? "noopener noreferrer" : undefined, className: twMerge("group flex flex-col overflow-hidden rounded-[var(--radius)] bg-white shadow-[var(--shadow)] transition-shadow hover:shadow-[var(--shadow-hover)] cursor-pointer", className), children: [_jsx("div", { className: "aspect-[4/3] w-full overflow-hidden bg-[var(--color-muted)]/10", children: image && (_jsx(StudioImage, { src: image, alt: property.name ?? "Property", sizes: "(min-width: 1024px) 33vw, (min-width: 640px) 50vw, 100vw", allowCrop: false, loading: "lazy", className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105" })) }), _jsxs("div", { className: "flex flex-col gap-1 p-4", children: [_jsx("span", { className: "text-base font-semibold text-[var(--color-foreground)]", children: property.name ?? "Community" }), location && (_jsx("span", { className: "text-sm text-[var(--color-secondary)]", children: location }))] })] }));
30
38
  }
31
39
  //# sourceMappingURL=PropertyCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PropertyCard.js","sourceRoot":"","sources":["../../src/components/PropertyCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAcxC,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,QAAwB;IACzE,OAAO,OAAO;SACX,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SACvC,OAAO,CAAC,WAAW,EAAE,kBAAkB,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;SAC7D,OAAO,CAAC,WAAW,EAAE,kBAAkB,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;SAC7D,OAAO,CAAC,YAAY,EAAE,kBAAkB,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,eAAe,CAAC,QAAwB;IAC/C,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChE,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IACrF,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAW,GAAG,kBAAkB,EAChC,SAAS,EACT,cAAc,EAAE,UAAU,GACR;IAClB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,iBAAiB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5E,MAAM,WAAW,GAAG,CAAC,CAAsC,EAAE,EAAE;QAC7D,IAAI,UAAU;YAAE,OAAO,CAAC,6CAA6C;QACrE,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO,CACL,6BACgB,UAAU,EACxB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EACzC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,EACnD,SAAS,EAAE,OAAO,CAChB,iKAAiK,EACjK,SAAS,CACV,aAED,cAAK,SAAS,EAAC,gEAAgE,YAC5E,KAAK,IAAI,CACR,cACE,GAAG,EAAE,KAAK,EACV,GAAG,EAAE,QAAQ,CAAC,IAAI,IAAI,UAAU,EAChC,OAAO,EAAC,MAAM,EACd,SAAS,EAAC,oFAAoF,GAC9F,CACH,GACG,EACN,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAM,SAAS,EAAC,wDAAwD,YACrE,QAAQ,CAAC,IAAI,IAAI,WAAW,GACxB,EACN,QAAQ,IAAI,CACX,eAAM,SAAS,EAAC,uCAAuC,YAAE,QAAQ,GAAQ,CAC1E,IACG,IACJ,CACL,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"PropertyCard.js","sourceRoot":"","sources":["../../src/components/PropertyCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { EditableNodeAttributes } from "../types";
2
+ interface StudioEditPlaceholderProps extends EditableNodeAttributes {
3
+ label: string;
4
+ hint?: string;
5
+ className?: string;
6
+ }
7
+ export declare function StudioEditPlaceholder({ label, hint, className, "data-node-id": dataNodeId, }: StudioEditPlaceholderProps): import("react/jsx-runtime").JSX.Element | null;
8
+ export {};
9
+ //# sourceMappingURL=StudioEditPlaceholder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StudioEditPlaceholder.d.ts","sourceRoot":"","sources":["../../src/components/StudioEditPlaceholder.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEvD,UAAU,0BAA2B,SAAQ,sBAAsB;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,IAAI,EACJ,SAAS,EACT,cAAc,EAAE,UAAU,GAC3B,EAAE,0BAA0B,kDAe5B"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { twMerge } from "tailwind-merge";
3
+ export function StudioEditPlaceholder({ label, hint, className, "data-node-id": dataNodeId, }) {
4
+ if (!dataNodeId)
5
+ return null;
6
+ return (_jsxs("div", { "data-node-id": dataNodeId, "data-studio-runtime-placeholder": "true", "data-studio-empty-kind": "component", "data-studio-empty-label": label, className: twMerge("studio-edit-placeholder", className), children: [_jsx("span", { children: label }), hint && _jsx("small", { children: hint })] }));
7
+ }
8
+ //# sourceMappingURL=StudioEditPlaceholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StudioEditPlaceholder.js","sourceRoot":"","sources":["../../src/components/StudioEditPlaceholder.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AASzC,MAAM,UAAU,qBAAqB,CAAC,EACpC,KAAK,EACL,IAAI,EACJ,SAAS,EACT,cAAc,EAAE,UAAU,GACC;IAC3B,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,OAAO,CACL,+BACgB,UAAU,qCACQ,MAAM,4BACf,WAAW,6BACT,KAAK,EAC9B,SAAS,EAAE,OAAO,CAAC,yBAAyB,EAAE,SAAS,CAAC,aAExD,yBAAO,KAAK,GAAQ,EACnB,IAAI,IAAI,0BAAQ,IAAI,GAAS,IAC1B,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type ImageResizeOptions } from "../utils/imageUrl";
2
+ import type { ResolvedImage } from "../utils/resolveConfig";
3
+ export type StudioImageSource = ResolvedImage | string | null | undefined;
4
+ interface StudioImageProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, "alt" | "sizes" | "src" | "srcSet"> {
5
+ src: StudioImageSource;
6
+ sizes: string;
7
+ alt?: string;
8
+ fallbackAlt?: string;
9
+ decorative?: boolean;
10
+ allowCrop?: boolean;
11
+ quality?: number;
12
+ }
13
+ export declare function studioImageUrl(source: StudioImageSource, opts?: ImageResizeOptions & {
14
+ allowCrop?: boolean;
15
+ }): string;
16
+ export declare function StudioImage({ src, sizes, alt, fallbackAlt, decorative, allowCrop, quality, loading, className, style, ...imgProps }: StudioImageProps): import("react/jsx-runtime").JSX.Element | null;
17
+ export {};
18
+ //# sourceMappingURL=StudioImage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StudioImage.d.ts","sourceRoot":"","sources":["../../src/components/StudioImage.tsx"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAE1E,UAAU,gBACR,SAAQ,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC3F,GAAG,EAAE,iBAAiB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAoDD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,kBAAkB,GAAG;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAClD,MAAM,CAKR;AAED,wBAAgB,WAAW,CAAC,EAC1B,GAAG,EACH,KAAK,EACL,GAAG,EACH,WAAW,EACX,UAAkB,EAClB,SAAgB,EAChB,OAAY,EACZ,OAAgB,EAChB,SAAS,EACT,KAAK,EACL,GAAG,QAAQ,EACZ,EAAE,gBAAgB,kDAkDlB"}
@@ -0,0 +1,76 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { twMerge } from "tailwind-merge";
3
+ import { canResizeImageUrl, imageUrl, RESIZE_WIDTHS, } from "../utils/imageUrl";
4
+ function isResolvedImage(value) {
5
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6
+ }
7
+ function sourceUrl(source) {
8
+ if (!source)
9
+ return "";
10
+ return isResolvedImage(source) ? source.src : source;
11
+ }
12
+ function resizeOptionsForSource(source, opts, allowCrop) {
13
+ if (!isResolvedImage(source))
14
+ return opts;
15
+ return {
16
+ ...opts,
17
+ fp: opts.fp ?? source.focalPoint,
18
+ crop: opts.crop ?? (allowCrop ? source.crop : undefined),
19
+ };
20
+ }
21
+ function defaultWidth(source) {
22
+ const width = isResolvedImage(source) ? source.width : undefined;
23
+ if (!width)
24
+ return 1200;
25
+ return [...RESIZE_WIDTHS].reverse().find((candidate) => candidate <= width) ?? RESIZE_WIDTHS[0];
26
+ }
27
+ function dimensions(source, allowCrop) {
28
+ if (!isResolvedImage(source))
29
+ return {};
30
+ if (allowCrop && source.crop?.aspect && source.width) {
31
+ return { width: source.width, height: Math.round(source.width / source.crop.aspect) };
32
+ }
33
+ return {
34
+ ...(source.width != null ? { width: source.width } : {}),
35
+ ...(source.height != null ? { height: source.height } : {}),
36
+ };
37
+ }
38
+ function altText(source, explicitAlt, fallbackAlt, decorative) {
39
+ if (decorative)
40
+ return "";
41
+ if (!isResolvedImage(source))
42
+ return explicitAlt ?? fallbackAlt ?? "";
43
+ return source.placementAlt ?? explicitAlt ?? source.assetAlt ?? source.alt ?? fallbackAlt ?? "";
44
+ }
45
+ export function studioImageUrl(source, opts) {
46
+ const url = sourceUrl(source);
47
+ if (!url)
48
+ return "";
49
+ const { allowCrop = true, ...resizeOpts } = opts ?? {};
50
+ return imageUrl(url, resizeOptionsForSource(source, resizeOpts, allowCrop));
51
+ }
52
+ export function StudioImage({ src, sizes, alt, fallbackAlt, decorative = false, allowCrop = true, quality = 80, loading = "lazy", className, style, ...imgProps }) {
53
+ if (isResolvedImage(src) && src.unresolved) {
54
+ if (src.quietUnresolved)
55
+ return null;
56
+ return (_jsx("div", { role: "img", "aria-label": altText(src, alt, fallbackAlt, decorative), className: twMerge("flex min-h-24 items-center justify-center bg-gray-100 text-xs text-gray-500", className), children: "Image unavailable" }));
57
+ }
58
+ const baseUrl = sourceUrl(src);
59
+ if (!baseUrl)
60
+ return null;
61
+ const canResize = canResizeImageUrl(baseUrl);
62
+ const crop = isResolvedImage(src) && allowCrop ? src.crop : undefined;
63
+ const hasServerCrop = Boolean(crop?.aspect);
64
+ const focalPoint = isResolvedImage(src) ? src.focalPoint : undefined;
65
+ const resizeBase = resizeOptionsForSource(src, { q: quality }, allowCrop);
66
+ const displaySrc = canResize
67
+ ? imageUrl(baseUrl, { ...resizeBase, w: defaultWidth(src) })
68
+ : baseUrl;
69
+ const srcSet = canResize
70
+ ? RESIZE_WIDTHS.map((width) => `${imageUrl(baseUrl, { ...resizeBase, w: width })} ${width}w`).join(", ")
71
+ : undefined;
72
+ const objectPosition = focalPoint && !hasServerCrop ? `${focalPoint.x * 100}% ${focalPoint.y * 100}%` : undefined;
73
+ const intrinsic = dimensions(src, allowCrop);
74
+ return (_jsx("img", { ...imgProps, src: displaySrc, srcSet: srcSet, sizes: srcSet ? sizes : undefined, alt: altText(src, alt, fallbackAlt, decorative), loading: loading, decoding: imgProps.decoding ?? "async", className: className, style: { ...style, ...(objectPosition ? { objectPosition } : {}) }, width: intrinsic.width, height: intrinsic.height }));
75
+ }
76
+ //# sourceMappingURL=StudioImage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StudioImage.js","sourceRoot":"","sources":["../../src/components/StudioImage.tsx"],"names":[],"mappings":"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"}