@meetelise/studio-components 0.0.3 → 0.0.5

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 (207) hide show
  1. package/dist/components/Accordion.d.ts +16 -0
  2. package/dist/components/Accordion.d.ts.map +1 -0
  3. package/dist/components/Accordion.js +28 -0
  4. package/dist/components/Accordion.js.map +1 -0
  5. package/dist/components/AddressBlock.d.ts +14 -0
  6. package/dist/components/AddressBlock.d.ts.map +1 -0
  7. package/dist/components/AddressBlock.js +13 -0
  8. package/dist/components/AddressBlock.js.map +1 -0
  9. package/dist/components/AmenityList.d.ts +20 -0
  10. package/dist/components/AmenityList.d.ts.map +1 -0
  11. package/dist/components/AmenityList.js +75 -0
  12. package/dist/components/AmenityList.js.map +1 -0
  13. package/dist/components/Badge.d.ts +9 -0
  14. package/dist/components/Badge.d.ts.map +1 -0
  15. package/dist/components/Badge.js +16 -0
  16. package/dist/components/Badge.js.map +1 -0
  17. package/dist/components/Button.d.ts +12 -0
  18. package/dist/components/Button.d.ts.map +1 -0
  19. package/dist/components/Button.js +38 -0
  20. package/dist/components/Button.js.map +1 -0
  21. package/dist/components/CTABanner.d.ts +11 -0
  22. package/dist/components/CTABanner.d.ts.map +1 -0
  23. package/dist/components/CTABanner.js +17 -0
  24. package/dist/components/CTABanner.js.map +1 -0
  25. package/dist/components/ContactForm.d.ts +11 -0
  26. package/dist/components/ContactForm.d.ts.map +1 -0
  27. package/dist/components/ContactForm.js +91 -0
  28. package/dist/components/ContactForm.js.map +1 -0
  29. package/dist/components/Container.d.ts +9 -3
  30. package/dist/components/Container.d.ts.map +1 -1
  31. package/dist/components/Container.js +19 -8
  32. package/dist/components/Container.js.map +1 -1
  33. package/dist/components/Divider.d.ts +9 -0
  34. package/dist/components/Divider.d.ts.map +1 -0
  35. package/dist/components/Divider.js +15 -0
  36. package/dist/components/Divider.js.map +1 -0
  37. package/dist/components/EliseChat.d.ts +8 -0
  38. package/dist/components/EliseChat.d.ts.map +1 -0
  39. package/dist/components/EliseChat.js +22 -0
  40. package/dist/components/EliseChat.js.map +1 -0
  41. package/dist/components/FeatureCard.d.ts +15 -0
  42. package/dist/components/FeatureCard.d.ts.map +1 -0
  43. package/dist/components/FeatureCard.js +13 -0
  44. package/dist/components/FeatureCard.js.map +1 -0
  45. package/dist/components/Footer.d.ts +10 -0
  46. package/dist/components/Footer.d.ts.map +1 -0
  47. package/dist/components/Footer.js +19 -0
  48. package/dist/components/Footer.js.map +1 -0
  49. package/dist/components/Gallery.d.ts +18 -0
  50. package/dist/components/Gallery.d.ts.map +1 -0
  51. package/dist/components/Gallery.js +86 -0
  52. package/dist/components/Gallery.js.map +1 -0
  53. package/dist/components/Icon.d.ts +8 -0
  54. package/dist/components/Icon.d.ts.map +1 -0
  55. package/dist/components/Icon.js +26 -0
  56. package/dist/components/Icon.js.map +1 -0
  57. package/dist/components/Lightbox.d.ts +13 -0
  58. package/dist/components/Lightbox.d.ts.map +1 -0
  59. package/dist/components/Lightbox.js +23 -0
  60. package/dist/components/Lightbox.js.map +1 -0
  61. package/dist/components/MapEmbed.d.ts +16 -0
  62. package/dist/components/MapEmbed.d.ts.map +1 -0
  63. package/dist/components/MapEmbed.js +6 -0
  64. package/dist/components/MapEmbed.js.map +1 -0
  65. package/dist/components/Modal.d.ts +9 -0
  66. package/dist/components/Modal.d.ts.map +1 -0
  67. package/dist/components/Modal.js +19 -0
  68. package/dist/components/Modal.js.map +1 -0
  69. package/dist/components/Nav.d.ts +11 -0
  70. package/dist/components/Nav.d.ts.map +1 -0
  71. package/dist/components/Nav.js +53 -0
  72. package/dist/components/Nav.js.map +1 -0
  73. package/dist/components/ScheduleTour.d.ts +8 -0
  74. package/dist/components/ScheduleTour.d.ts.map +1 -0
  75. package/dist/components/ScheduleTour.js +158 -0
  76. package/dist/components/ScheduleTour.js.map +1 -0
  77. package/dist/components/ScrollReveal.d.ts +12 -0
  78. package/dist/components/ScrollReveal.d.ts.map +1 -0
  79. package/dist/components/ScrollReveal.js +37 -0
  80. package/dist/components/ScrollReveal.js.map +1 -0
  81. package/dist/components/Slot.d.ts +14 -0
  82. package/dist/components/Slot.d.ts.map +1 -0
  83. package/dist/components/Slot.js +5 -0
  84. package/dist/components/Slot.js.map +1 -0
  85. package/dist/components/Stat.d.ts +12 -0
  86. package/dist/components/Stat.d.ts.map +1 -0
  87. package/dist/components/Stat.js +12 -0
  88. package/dist/components/Stat.js.map +1 -0
  89. package/dist/components/Testimonial.d.ts +10 -0
  90. package/dist/components/Testimonial.d.ts.map +1 -0
  91. package/dist/components/Testimonial.js +9 -0
  92. package/dist/components/Testimonial.js.map +1 -0
  93. package/dist/components/Text.d.ts +3 -2
  94. package/dist/components/Text.d.ts.map +1 -1
  95. package/dist/components/Text.js +16 -7
  96. package/dist/components/Text.js.map +1 -1
  97. package/dist/components/ThemeProvider.d.ts.map +1 -1
  98. package/dist/components/ThemeProvider.js +85 -5
  99. package/dist/components/ThemeProvider.js.map +1 -1
  100. package/dist/components/VideoHero.d.ts +16 -0
  101. package/dist/components/VideoHero.d.ts.map +1 -0
  102. package/dist/components/VideoHero.js +19 -0
  103. package/dist/components/VideoHero.js.map +1 -0
  104. package/dist/components/VideoPlayer.d.ts +18 -0
  105. package/dist/components/VideoPlayer.d.ts.map +1 -0
  106. package/dist/components/VideoPlayer.js +14 -0
  107. package/dist/components/VideoPlayer.js.map +1 -0
  108. package/dist/components/VirtualTourEmbed.d.ts +9 -0
  109. package/dist/components/VirtualTourEmbed.d.ts.map +1 -0
  110. package/dist/components/VirtualTourEmbed.js +5 -0
  111. package/dist/components/VirtualTourEmbed.js.map +1 -0
  112. package/dist/components/browser/ComponentBrowser.d.ts +2 -0
  113. package/dist/components/browser/ComponentBrowser.d.ts.map +1 -0
  114. package/dist/components/browser/ComponentBrowser.js +73 -0
  115. package/dist/components/browser/ComponentBrowser.js.map +1 -0
  116. package/dist/components/browser/ComponentShowcase.d.ts +8 -0
  117. package/dist/components/browser/ComponentShowcase.d.ts.map +1 -0
  118. package/dist/components/browser/ComponentShowcase.js +104 -0
  119. package/dist/components/browser/ComponentShowcase.js.map +1 -0
  120. package/dist/components/browser/componentMeta.d.ts +40 -0
  121. package/dist/components/browser/componentMeta.d.ts.map +1 -0
  122. package/dist/components/browser/componentMeta.js +726 -0
  123. package/dist/components/browser/componentMeta.js.map +1 -0
  124. package/dist/components/registry.d.ts.map +1 -1
  125. package/dist/components/registry.js +56 -0
  126. package/dist/components/registry.js.map +1 -1
  127. package/dist/components/units/FloorPlanCard.d.ts +16 -0
  128. package/dist/components/units/FloorPlanCard.d.ts.map +1 -0
  129. package/dist/components/units/FloorPlanCard.js +28 -0
  130. package/dist/components/units/FloorPlanCard.js.map +1 -0
  131. package/dist/components/units/FloorplanExplorer.d.ts +21 -0
  132. package/dist/components/units/FloorplanExplorer.d.ts.map +1 -0
  133. package/dist/components/units/FloorplanExplorer.js +39 -0
  134. package/dist/components/units/FloorplanExplorer.js.map +1 -0
  135. package/dist/components/units/PricingMatrixModal.d.ts +12 -0
  136. package/dist/components/units/PricingMatrixModal.d.ts.map +1 -0
  137. package/dist/components/units/PricingMatrixModal.js +78 -0
  138. package/dist/components/units/PricingMatrixModal.js.map +1 -0
  139. package/dist/components/units/UnitCard.d.ts +12 -3
  140. package/dist/components/units/UnitCard.d.ts.map +1 -1
  141. package/dist/components/units/UnitCard.js +33 -5
  142. package/dist/components/units/UnitCard.js.map +1 -1
  143. package/dist/components/units/UnitDetail.d.ts +11 -0
  144. package/dist/components/units/UnitDetail.d.ts.map +1 -0
  145. package/dist/components/units/UnitDetail.js +16 -0
  146. package/dist/components/units/UnitDetail.js.map +1 -0
  147. package/dist/components/units/UnitExplorer.d.ts +17 -1
  148. package/dist/components/units/UnitExplorer.d.ts.map +1 -1
  149. package/dist/components/units/UnitExplorer.js +129 -25
  150. package/dist/components/units/UnitExplorer.js.map +1 -1
  151. package/dist/components/units/UnitFilters.d.ts +2 -2
  152. package/dist/components/units/UnitFilters.d.ts.map +1 -1
  153. package/dist/components/units/UnitFilters.js +2 -2
  154. package/dist/components/units/UnitFilters.js.map +1 -1
  155. package/dist/components/units/UnitPage.d.ts +8 -0
  156. package/dist/components/units/UnitPage.d.ts.map +1 -0
  157. package/dist/components/units/UnitPage.js +130 -0
  158. package/dist/components/units/UnitPage.js.map +1 -0
  159. package/dist/components/units/types.d.ts +109 -24
  160. package/dist/components/units/types.d.ts.map +1 -1
  161. package/dist/components/units/types.js +1 -0
  162. package/dist/components/units/types.js.map +1 -1
  163. package/dist/hooks/useAnalytics.d.ts +16 -0
  164. package/dist/hooks/useAnalytics.d.ts.map +1 -0
  165. package/dist/hooks/useAnalytics.js +65 -0
  166. package/dist/hooks/useAnalytics.js.map +1 -0
  167. package/dist/hooks/useAuth.d.ts.map +1 -1
  168. package/dist/hooks/useAuth.js +8 -2
  169. package/dist/hooks/useAuth.js.map +1 -1
  170. package/dist/hooks/useFees.d.ts +8 -0
  171. package/dist/hooks/useFees.d.ts.map +1 -0
  172. package/dist/hooks/useFees.js +37 -0
  173. package/dist/hooks/useFees.js.map +1 -0
  174. package/dist/hooks/useFloorplans.d.ts +19 -0
  175. package/dist/hooks/useFloorplans.d.ts.map +1 -0
  176. package/dist/hooks/useFloorplans.js +52 -0
  177. package/dist/hooks/useFloorplans.js.map +1 -0
  178. package/dist/hooks/useModal.d.ts +11 -0
  179. package/dist/hooks/useModal.d.ts.map +1 -0
  180. package/dist/hooks/useModal.js +35 -0
  181. package/dist/hooks/useModal.js.map +1 -0
  182. package/dist/hooks/useProperty.d.ts +66 -0
  183. package/dist/hooks/useProperty.d.ts.map +1 -0
  184. package/dist/hooks/useProperty.js +49 -0
  185. package/dist/hooks/useProperty.js.map +1 -0
  186. package/dist/hooks/useSpecials.d.ts +8 -0
  187. package/dist/hooks/useSpecials.d.ts.map +1 -0
  188. package/dist/hooks/useSpecials.js +37 -0
  189. package/dist/hooks/useSpecials.js.map +1 -0
  190. package/dist/index.d.ts +10 -3
  191. package/dist/index.d.ts.map +1 -1
  192. package/dist/index.js +8 -1
  193. package/dist/index.js.map +1 -1
  194. package/dist/renderer.d.ts.map +1 -1
  195. package/dist/renderer.js +46 -3
  196. package/dist/renderer.js.map +1 -1
  197. package/dist/router.d.ts +9 -0
  198. package/dist/router.d.ts.map +1 -1
  199. package/dist/router.js +34 -1
  200. package/dist/router.js.map +1 -1
  201. package/dist/types.d.ts +47 -1
  202. package/dist/types.d.ts.map +1 -1
  203. package/dist/utils/imageUrl.d.ts +21 -0
  204. package/dist/utils/imageUrl.d.ts.map +1 -0
  205. package/dist/utils/imageUrl.js +46 -0
  206. package/dist/utils/imageUrl.js.map +1 -0
  207. package/package.json +1 -1
@@ -0,0 +1,8 @@
1
+ import type { PublicSpecial } from "../components/units/types";
2
+ export declare function useSpecials(propertyIdOverride?: string): {
3
+ specials: PublicSpecial[];
4
+ loading: boolean;
5
+ error: string | null;
6
+ refetch: () => Promise<void>;
7
+ };
8
+ //# sourceMappingURL=useSpecials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSpecials.d.ts","sourceRoot":"","sources":["../../src/hooks/useSpecials.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,2BAA2B,CAAC;AAEjF,wBAAgB,WAAW,CAAC,kBAAkB,CAAC,EAAE,MAAM;;;;;EAiCtD"}
@@ -0,0 +1,37 @@
1
+ import { useState, useEffect, useCallback } from "react";
2
+ import { useSiteConfig } from "./useSiteConfig";
3
+ import { useAuth } from "./useAuth";
4
+ export function useSpecials(propertyIdOverride) {
5
+ const config = useSiteConfig();
6
+ const { authenticatedFetch } = useAuth();
7
+ const propertyId = propertyIdOverride ?? config.property?.propertyId;
8
+ const apiBaseUrl = config.property?.apiBaseUrl ?? "";
9
+ const [specials, setSpecials] = useState([]);
10
+ const [loading, setLoading] = useState(false);
11
+ const [error, setError] = useState(null);
12
+ const fetchSpecials = useCallback(async () => {
13
+ if (!propertyId)
14
+ return;
15
+ setLoading(true);
16
+ setError(null);
17
+ try {
18
+ const res = await authenticatedFetch(`${apiBaseUrl}/v1/properties/${propertyId}/specials`);
19
+ if (!res.ok)
20
+ throw new Error(`${res.status}`);
21
+ const data = await res.json();
22
+ setSpecials(data.items);
23
+ }
24
+ catch (e) {
25
+ setError(e instanceof Error ? e.message : "Failed to load specials");
26
+ }
27
+ finally {
28
+ setLoading(false);
29
+ }
30
+ }, [propertyId, apiBaseUrl, authenticatedFetch]);
31
+ useEffect(() => {
32
+ if (propertyId)
33
+ fetchSpecials();
34
+ }, [propertyId, fetchSpecials]);
35
+ return { specials, loading, error, refetch: fetchSpecials };
36
+ }
37
+ //# sourceMappingURL=useSpecials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSpecials.js","sourceRoot":"","sources":["../../src/hooks/useSpecials.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,UAAU,WAAW,CAAC,kBAA2B;IACrD,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,kBAAkB,IAAI,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC;IACrE,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,EAAE,UAAU,IAAI,EAAE,CAAC;IAErD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAkB,EAAE,CAAC,CAAC;IAC9D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC3C,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAClC,GAAG,UAAU,kBAAkB,UAAU,WAAW,CACrD,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAqB,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAChD,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;QACvE,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEjD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU;YAAE,aAAa,EAAE,CAAC;IAClC,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;IAEhC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;AAC9D,CAAC"}
package/dist/index.d.ts CHANGED
@@ -3,7 +3,14 @@ export { componentRegistry } from "./components/registry";
3
3
  export { ThemeProvider } from "./components/ThemeProvider";
4
4
  export { SiteConfigProvider, useSiteConfig } from "./hooks/useSiteConfig";
5
5
  export { AuthProvider, useAuth } from "./hooks/useAuth";
6
- export { navigate, useCurrentPath } from "./router";
7
- export type { SiteNode, SitePage, SiteMeta, SiteTheme, SiteProperty, SiteConfig, } from "./types";
8
- export type { UnitV2, UnitsPageResponse, UnitFilterValues, } from "./components/units/types";
6
+ export { ModalProvider, useModal } from "./hooks/useModal";
7
+ export { navigate, useCurrentPath, useRouteParams, matchPath, RouteParamsProvider } from "./router";
8
+ export type { SiteNode, SitePage, SiteLayout, SiteMeta, PageMeta, SiteTheme, SiteProperty, SiteConfig, AnalyticsConfig, NavLink, FooterColumn, } from "./types";
9
+ export type { PublicUnit, PublicFloorplan, PublicFee, PublicSpecial, PublicPriceMatrixEntry, UnitsPageResponse, FloorplansPageResponse, FeesResponse, SpecialsResponse, UnitFilterValues, } from "./components/units/types";
10
+ export { useProperty } from "./hooks/useProperty";
11
+ export { useFloorplans } from "./hooks/useFloorplans";
12
+ export { useFees } from "./hooks/useFees";
13
+ export { useSpecials } from "./hooks/useSpecials";
14
+ export { imageUrl } from "./utils/imageUrl";
15
+ export { useAnalytics } from "./hooks/useAnalytics";
9
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEpD,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,UAAU,GACX,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,MAAM,EACN,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpG,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,UAAU,EACV,eAAe,EACf,OAAO,EACP,YAAY,GACb,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,UAAU,EACV,eAAe,EACf,SAAS,EACT,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -3,5 +3,12 @@ export { componentRegistry } from "./components/registry";
3
3
  export { ThemeProvider } from "./components/ThemeProvider";
4
4
  export { SiteConfigProvider, useSiteConfig } from "./hooks/useSiteConfig";
5
5
  export { AuthProvider, useAuth } from "./hooks/useAuth";
6
- export { navigate, useCurrentPath } from "./router";
6
+ export { ModalProvider, useModal } from "./hooks/useModal";
7
+ export { navigate, useCurrentPath, useRouteParams, matchPath, RouteParamsProvider } from "./router";
8
+ export { useProperty } from "./hooks/useProperty";
9
+ export { useFloorplans } from "./hooks/useFloorplans";
10
+ export { useFees } from "./hooks/useFees";
11
+ export { useSpecials } from "./hooks/useSpecials";
12
+ export { imageUrl } from "./utils/imageUrl";
13
+ export { useAnalytics } from "./hooks/useAnalytics";
7
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AA6BpG,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC,SAAS,CAY1D;AAMD,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,UAAU,CAAA;CAAE,kDAKlE"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAsB,MAAM,SAAS,CAAC;AAKxE,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC,SAAS,CAY1D;AAkDD,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,UAAU,CAAA;CAAE,kDAiBlE"}
package/dist/renderer.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect } from "react";
2
3
  import { componentRegistry } from "./components/registry";
3
- import { useCurrentPath } from "./router";
4
+ import { useCurrentPath, matchPath, RouteParamsProvider } from "./router";
4
5
  export function renderNode(node) {
5
6
  const Component = componentRegistry[node.type];
6
7
  if (!Component) {
@@ -13,11 +14,53 @@ export function renderNode(node) {
13
14
  function RenderNode({ node }) {
14
15
  return _jsx(_Fragment, { children: renderNode(node) });
15
16
  }
17
+ function PageRoot({ tree }) {
18
+ return _jsx(_Fragment, { children: renderNode(tree) });
19
+ }
20
+ function findPage(pages, path) {
21
+ // Try exact match first (most common)
22
+ const exact = pages.find((p) => p.path === path);
23
+ if (exact)
24
+ return { page: exact, params: {} };
25
+ // Try pattern matching for :param segments
26
+ for (const page of pages) {
27
+ if (!page.path.includes(":"))
28
+ continue;
29
+ const params = matchPath(page.path, path);
30
+ if (params)
31
+ return { page, params };
32
+ }
33
+ return null;
34
+ }
35
+ function usePageMeta(path, page, siteMeta) {
36
+ useEffect(() => {
37
+ // Per-page meta from build-time injection or inline page.meta
38
+ const pageMetas = typeof window !== "undefined" ? window.__STUDIO_PAGE_META__ : undefined;
39
+ const meta = page?.meta ?? pageMetas?.[page?.path ?? ""];
40
+ const title = meta?.title ?? siteMeta?.title;
41
+ if (title)
42
+ document.title = title;
43
+ // Update meta description
44
+ const desc = meta?.description ?? siteMeta?.description;
45
+ if (desc) {
46
+ let el = document.querySelector('meta[name="description"]');
47
+ if (!el) {
48
+ el = document.createElement("meta");
49
+ el.setAttribute("name", "description");
50
+ document.head.appendChild(el);
51
+ }
52
+ el.setAttribute("content", desc);
53
+ }
54
+ }, [path, page, siteMeta]);
55
+ }
16
56
  export function SiteRenderer({ siteJson }) {
17
57
  const path = useCurrentPath();
18
- const page = siteJson.pages.find((p) => p.path === path) ?? siteJson.pages[0];
58
+ const match = findPage(siteJson.pages, path);
59
+ const page = match?.page ?? siteJson.pages[0];
60
+ const params = match?.params ?? {};
61
+ usePageMeta(path, page, siteJson.meta);
19
62
  if (!page)
20
63
  return null;
21
- return _jsx(_Fragment, { children: renderNode(page.tree) });
64
+ return (_jsx(RouteParamsProvider, { value: params, children: _jsx(PageRoot, { tree: page.tree }, path) }));
22
65
  }
23
66
  //# sourceMappingURL=renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,MAAM,UAAU,UAAU,CAAC,IAAc;IACvC,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAChD,KAAC,UAAU,IAAS,IAAI,EAAE,KAAK,IAAd,CAAC,CAAiB,CACpC,CAAC,CAAC;IAEH,OAAO,KAAC,SAAS,OAAK,IAAI,CAAC,KAAK,YAAG,QAAQ,GAAa,CAAC;AAC3D,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,IAAI,EAAsB;IAC9C,OAAO,4BAAG,UAAU,CAAC,IAAI,CAAC,GAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAE,QAAQ,EAA4B;IACjE,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9E,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,4BAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAI,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.tsx"],"names":[],"mappings":"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"}
package/dist/router.d.ts CHANGED
@@ -1,3 +1,12 @@
1
1
  export declare function navigate(to: string): void;
2
2
  export declare function useCurrentPath(): string;
3
+ export declare const RouteParamsProvider: import("react").Provider<Record<string, string>>;
4
+ /** Read route params extracted from the matched page path. */
5
+ export declare function useRouteParams(): Record<string, string>;
6
+ /**
7
+ * Match a page path pattern against the current URL path.
8
+ * Patterns use :param for dynamic segments: "/buildings/aventine/units/:unitId"
9
+ * Returns extracted params if matched, null if no match.
10
+ */
11
+ export declare function matchPath(pattern: string, currentPath: string): Record<string, string> | null;
3
12
  //# sourceMappingURL=router.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.tsx"],"names":[],"mappings":"AAIA,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,QAGlC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAevC"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.tsx"],"names":[],"mappings":"AAIA,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,QAIlC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAevC;AAQD,eAAO,MAAM,mBAAmB,kDAA8B,CAAC;AAE/D,8DAA8D;AAC9D,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAiB/B"}
package/dist/router.js CHANGED
@@ -1,7 +1,8 @@
1
- import { useState, useEffect, useCallback } from "react";
1
+ import { useState, useEffect, useCallback, createContext, useContext } from "react";
2
2
  let listeners = [];
3
3
  export function navigate(to) {
4
4
  window.history.pushState({}, "", to);
5
+ window.scrollTo(0, 0);
5
6
  listeners.forEach((fn) => fn());
6
7
  }
7
8
  export function useCurrentPath() {
@@ -17,4 +18,36 @@ export function useCurrentPath() {
17
18
  }, [sync]);
18
19
  return path;
19
20
  }
21
+ // ---------------------------------------------------------------------------
22
+ // Route params — supports :param segments in page paths
23
+ // ---------------------------------------------------------------------------
24
+ const RouteParamsContext = createContext({});
25
+ export const RouteParamsProvider = RouteParamsContext.Provider;
26
+ /** Read route params extracted from the matched page path. */
27
+ export function useRouteParams() {
28
+ return useContext(RouteParamsContext);
29
+ }
30
+ /**
31
+ * Match a page path pattern against the current URL path.
32
+ * Patterns use :param for dynamic segments: "/buildings/aventine/units/:unitId"
33
+ * Returns extracted params if matched, null if no match.
34
+ */
35
+ export function matchPath(pattern, currentPath) {
36
+ const patternParts = pattern.split("/").filter(Boolean);
37
+ const pathParts = currentPath.split("/").filter(Boolean);
38
+ if (patternParts.length !== pathParts.length)
39
+ return null;
40
+ const params = {};
41
+ for (let i = 0; i < patternParts.length; i++) {
42
+ const pat = patternParts[i];
43
+ const val = pathParts[i];
44
+ if (pat.startsWith(":")) {
45
+ params[pat.slice(1)] = decodeURIComponent(val);
46
+ }
47
+ else if (pat !== val) {
48
+ return null;
49
+ }
50
+ }
51
+ return params;
52
+ }
20
53
  //# sourceMappingURL=router.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzD,IAAI,SAAS,GAAsB,EAAE,CAAC;AAEtC,MAAM,UAAU,QAAQ,CAAC,EAAU;IACjC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACrC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE3D,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEtE,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEpF,IAAI,SAAS,GAAsB,EAAE,CAAC;AAEtC,MAAM,UAAU,QAAQ,CAAC,EAAU;IACjC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE3D,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEtE,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,wDAAwD;AACxD,8EAA8E;AAE9E,MAAM,kBAAkB,GAAG,aAAa,CAAyB,EAAE,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,QAAQ,CAAC;AAE/D,8DAA8D;AAC9D,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,OAAe,EACf,WAAmB;IAEnB,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEzD,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAE1D,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/types.d.ts CHANGED
@@ -1,15 +1,38 @@
1
1
  export interface SiteNode {
2
2
  type: string;
3
- props: Record<string, string | number | boolean>;
3
+ props: Record<string, any>;
4
4
  children?: SiteNode[];
5
5
  }
6
+ export interface NavLink {
7
+ label: string;
8
+ to: string;
9
+ }
10
+ export interface FooterColumn {
11
+ title: string;
12
+ links: NavLink[];
13
+ }
14
+ export interface PageMeta {
15
+ title?: string;
16
+ description?: string;
17
+ image?: string;
18
+ canonical?: string;
19
+ }
6
20
  export interface SitePage {
7
21
  path: string;
8
22
  tree: SiteNode;
23
+ /** Per-page meta overrides for SEO (title, description, og:image) */
24
+ meta?: PageMeta;
25
+ /** Layout name from site.layouts — wraps page tree in shared Nav/Footer/Modals */
26
+ layout?: string;
27
+ }
28
+ export interface SiteLayout {
29
+ tree: SiteNode;
9
30
  }
10
31
  export interface SiteMeta {
11
32
  title: string;
12
33
  description?: string;
34
+ image?: string;
35
+ url?: string;
13
36
  }
14
37
  export interface SiteTheme {
15
38
  colors: {
@@ -20,16 +43,39 @@ export interface SiteTheme {
20
43
  accent: string;
21
44
  muted: string;
22
45
  };
46
+ /** Font pair: "modern" (Inter), "editorial" (Playfair+Source Sans), "clean" (DM Sans), "bold" (Space Grotesk+Nunito) or custom {heading, body} */
47
+ fonts?: {
48
+ heading: string;
49
+ body: string;
50
+ } | "modern" | "editorial" | "clean" | "bold";
51
+ /** Border radius scale: "none" | "sm" | "md" | "lg" | "xl" | "full" */
52
+ radius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
53
+ /** Shadow style: "none" | "crisp" | "soft" | "heavy" */
54
+ shadow?: "none" | "crisp" | "soft" | "heavy";
23
55
  }
24
56
  export interface SiteProperty {
25
57
  propertyId: string;
26
58
  apiBaseUrl?: string;
27
59
  }
60
+ export interface AnalyticsConfig {
61
+ /** Google Analytics 4 measurement ID (e.g. "G-XXXXXX") */
62
+ ga4?: string;
63
+ /** Google Tag Manager container ID (e.g. "GTM-XXXXXX") */
64
+ gtm?: string;
65
+ }
28
66
  export interface SiteConfig {
29
67
  meta: SiteMeta;
30
68
  theme?: SiteTheme;
31
69
  siteId?: string;
32
70
  property?: SiteProperty;
71
+ /** Skip session-token auth; use devApiToken for API calls instead. */
72
+ devMode?: boolean;
73
+ /** Static Bearer token used when devMode is true (e.g. a vendor API key). */
74
+ devApiToken?: string;
75
+ /** Named layouts for DRY templates — each layout has a component tree with Slot placeholders */
76
+ layouts?: Record<string, SiteLayout>;
77
+ /** Analytics tracking configuration */
78
+ analytics?: AnalyticsConfig;
33
79
  pages: SitePage[];
34
80
  }
35
81
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE;QACN,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IAEb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,qEAAqE;IACrE,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE;QACN,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,kJAAkJ;IAClJ,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;IACtF,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;IACrD,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;CAC9C;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gGAAgG;IAChG,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,uCAAuC;IACvC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Construct a resized image URL that routes through the Studio CDN resizer.
3
+ *
4
+ * In production, images at /_img/{path}?w=400&q=80 are served by a Lambda
5
+ * that fetches the original, resizes with sharp, and caches the result.
6
+ *
7
+ * For media.eliseai.com URLs, rewrites to /_img/media/{id}.{ext}?w=...
8
+ * For /assets/ URLs, rewrites to /_img/assets/...?w=...
9
+ * For other URLs (external, data:, etc.), returns as-is.
10
+ *
11
+ * When no resize options are provided, returns the original URL unchanged.
12
+ */
13
+ interface ImageResizeOptions {
14
+ /** Target width in pixels. Snapped to nearest allowed: 100,200,400,600,800,1200,1600,1920 */
15
+ w?: number;
16
+ /** JPEG/WebP quality 1-100 (default: 80) */
17
+ q?: number;
18
+ }
19
+ export declare function imageUrl(url: string | null | undefined, opts?: ImageResizeOptions): string;
20
+ export {};
21
+ //# sourceMappingURL=imageUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageUrl.d.ts","sourceRoot":"","sources":["../../src/utils/imageUrl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,UAAU,kBAAkB;IAC1B,6FAA6F;IAC7F,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,MAAM,CA8B1F"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Construct a resized image URL that routes through the Studio CDN resizer.
3
+ *
4
+ * In production, images at /_img/{path}?w=400&q=80 are served by a Lambda
5
+ * that fetches the original, resizes with sharp, and caches the result.
6
+ *
7
+ * For media.eliseai.com URLs, rewrites to /_img/media/{id}.{ext}?w=...
8
+ * For /assets/ URLs, rewrites to /_img/assets/...?w=...
9
+ * For other URLs (external, data:, etc.), returns as-is.
10
+ *
11
+ * When no resize options are provided, returns the original URL unchanged.
12
+ */
13
+ const MEDIA_CDN_PREFIX = "https://media.eliseai.com/";
14
+ export function imageUrl(url, opts) {
15
+ if (!url)
16
+ return "";
17
+ if (!opts?.w)
18
+ return url;
19
+ // On localhost, skip resizing (no Lambda available)
20
+ if (typeof window !== "undefined" && window.location.hostname === "localhost") {
21
+ return url;
22
+ }
23
+ let path;
24
+ if (url.startsWith(MEDIA_CDN_PREFIX)) {
25
+ // media.eliseai.com/abc123.jpg → /_img/media/abc123.jpg
26
+ path = "/_img/media/" + url.slice(MEDIA_CDN_PREFIX.length);
27
+ }
28
+ else if (url.startsWith("/assets/")) {
29
+ // /assets/site/xxx/hero.jpg → /_img/assets/site/xxx/hero.jpg
30
+ path = "/_img" + url;
31
+ }
32
+ else if (url.startsWith("/_img/")) {
33
+ // Already a resize URL
34
+ path = url.split("?")[0];
35
+ }
36
+ else {
37
+ // External URL or unrecognized — can't resize
38
+ return url;
39
+ }
40
+ const params = new URLSearchParams();
41
+ params.set("w", String(opts.w));
42
+ if (opts.q && opts.q !== 80)
43
+ params.set("q", String(opts.q));
44
+ return `${path}?${params}`;
45
+ }
46
+ //# sourceMappingURL=imageUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageUrl.js","sourceRoot":"","sources":["../../src/utils/imageUrl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAStD,MAAM,UAAU,QAAQ,CAAC,GAA8B,EAAE,IAAyB;IAChF,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,GAAG,CAAC;IAEzB,oDAAoD;IACpD,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC9E,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,IAAY,CAAC;IAEjB,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,wDAAwD;QACxD,IAAI,GAAG,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;SAAM,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,6DAA6D;QAC7D,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;IACvB,CAAC;SAAM,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,uBAAuB;QACvB,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,8CAA8C;QAC9C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE;QAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7D,OAAO,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC;AAC7B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meetelise/studio-components",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "Elise Studio component library — renderer, layout primitives, and data-fetching components for property websites",
5
5
  "repository": {
6
6
  "type": "git",