@pixelated-tech/components 3.4.3 → 3.5.0

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 (228) hide show
  1. package/README.md +12 -191
  2. package/dist/components/admin/componentusage/componentAnalysis.js +12 -4
  3. package/dist/components/admin/componentusage/componentDiscovery.js +20 -6
  4. package/dist/components/admin/site-health/site-health-accessibility.js +5 -1
  5. package/dist/components/admin/site-health/site-health-axe-core.js +4 -0
  6. package/dist/components/admin/site-health/site-health-cloudwatch.integration.js +0 -5
  7. package/dist/components/admin/site-health/site-health-cloudwatch.js +7 -1
  8. package/dist/components/admin/site-health/site-health-dependency-vulnerabilities.js +4 -0
  9. package/dist/components/admin/site-health/site-health-github.js +6 -0
  10. package/dist/components/admin/site-health/site-health-google-analytics.js +6 -0
  11. package/dist/components/admin/site-health/site-health-google-search-console.js +6 -0
  12. package/dist/components/admin/site-health/site-health-on-site-seo.integration.js +128 -55
  13. package/dist/components/admin/site-health/site-health-on-site-seo.js +4 -0
  14. package/dist/components/admin/site-health/site-health-overview.js +11 -4
  15. package/dist/components/admin/site-health/site-health-performance.js +4 -0
  16. package/dist/components/admin/site-health/site-health-security.js +5 -1
  17. package/dist/components/admin/site-health/site-health-seo.js +5 -1
  18. package/dist/components/admin/site-health/site-health-template.js +19 -9
  19. package/dist/components/admin/site-health/site-health-uptime.js +4 -0
  20. package/dist/components/callout/callout.js +0 -10
  21. package/dist/components/carousel/carousel.js +15 -4
  22. package/dist/components/carousel/tiles.js +1 -1
  23. package/dist/components/cms/contentful.items.components.js +3 -4
  24. package/dist/components/cms/flickr.js +1 -1
  25. package/dist/components/cms/google.reviews.components.js +3 -3
  26. package/dist/components/cms/instagram.components.js +15 -5
  27. package/dist/components/cms/smartimage.js +2 -2
  28. package/dist/components/cms/wordpress.components.js +32 -6
  29. package/dist/components/cms/yelp.js +5 -0
  30. package/dist/components/config/config.server.js +7 -1
  31. package/dist/components/general/css.js +0 -1
  32. package/dist/components/general/image.js +0 -1
  33. package/dist/components/general/loading.js +2 -1
  34. package/dist/components/general/microinteractions.js +0 -1
  35. package/dist/components/general/modal.css +2 -4
  36. package/dist/components/general/modal.js +72 -30
  37. package/dist/components/general/sidepanel.js +16 -0
  38. package/dist/components/general/tab.js +1 -0
  39. package/dist/components/menu/menu-accordion.css +1 -1
  40. package/dist/components/menu/menu-accordion.js +15 -4
  41. package/dist/components/menu/menu-expando.js +21 -19
  42. package/dist/components/menu/menu-simple.js +14 -14
  43. package/dist/components/nerdjoke/nerdjoke.js +1 -1
  44. package/dist/components/seo/googlesearch.js +0 -1
  45. package/dist/components/seo/schema-blogposting.js +6 -1
  46. package/dist/components/seo/schema-recipe.js +34 -1
  47. package/dist/components/seo/schema-services.js +20 -2
  48. package/dist/components/shoppingcart/ebay.components.js +3 -3
  49. package/dist/components/shoppingcart/shoppingcart.components.js +76 -28
  50. package/dist/components/shoppingcart/shoppingcart.functions.js +4 -4
  51. package/dist/components/sitebuilder/config/CompoundFontSelector.js +13 -4
  52. package/dist/components/sitebuilder/config/ConfigBuilder.css +194 -5
  53. package/dist/components/sitebuilder/config/ConfigBuilder.js +183 -17
  54. package/dist/components/sitebuilder/config/FontSelector.js +13 -2
  55. package/dist/components/sitebuilder/config/routes-form.json +67 -0
  56. package/dist/components/sitebuilder/config/siteinfo-form.json +28 -14
  57. package/dist/components/sitebuilder/config/visualdesignform.json +4 -4
  58. package/dist/components/sitebuilder/form/formbuilder.js +1 -0
  59. package/dist/components/sitebuilder/form/formcomponents.js +2 -3
  60. package/dist/components/sitebuilder/form/formengine.js +6 -5
  61. package/dist/components/sitebuilder/form/formvalidator.js +5 -0
  62. package/dist/components/sitebuilder/page/components/PageBuilderUI.js +5 -1
  63. package/dist/components/structured/buzzwordbingo.css +0 -1
  64. package/dist/components/structured/recipe.js +1 -1
  65. package/dist/components/structured/socialcard.js +2 -2
  66. package/dist/components/utilities/functions.js +82 -1
  67. package/dist/components/utilities/gemini-api.client.js +76 -0
  68. package/dist/components/utilities/gemini-api.server.js +185 -0
  69. package/dist/data/routes.json +5 -5
  70. package/dist/index.adminclient.js +30 -0
  71. package/dist/index.adminserver.js +21 -0
  72. package/dist/index.js +4 -18
  73. package/dist/index.server.js +15 -28
  74. package/dist/types/components/admin/componentusage/componentAnalysis.d.ts.map +1 -1
  75. package/dist/types/components/admin/componentusage/componentDiscovery.d.ts +1 -1
  76. package/dist/types/components/admin/componentusage/componentDiscovery.d.ts.map +1 -1
  77. package/dist/types/components/admin/site-health/site-health-accessibility.d.ts +7 -4
  78. package/dist/types/components/admin/site-health/site-health-accessibility.d.ts.map +1 -1
  79. package/dist/types/components/admin/site-health/site-health-axe-core.d.ts +7 -4
  80. package/dist/types/components/admin/site-health/site-health-axe-core.d.ts.map +1 -1
  81. package/dist/types/components/admin/site-health/site-health-cloudwatch.d.ts +9 -6
  82. package/dist/types/components/admin/site-health/site-health-cloudwatch.d.ts.map +1 -1
  83. package/dist/types/components/admin/site-health/site-health-cloudwatch.integration.d.ts.map +1 -1
  84. package/dist/types/components/admin/site-health/site-health-dependency-vulnerabilities.d.ts +7 -4
  85. package/dist/types/components/admin/site-health/site-health-dependency-vulnerabilities.d.ts.map +1 -1
  86. package/dist/types/components/admin/site-health/site-health-github.d.ts +9 -6
  87. package/dist/types/components/admin/site-health/site-health-github.d.ts.map +1 -1
  88. package/dist/types/components/admin/site-health/site-health-google-analytics.d.ts +9 -6
  89. package/dist/types/components/admin/site-health/site-health-google-analytics.d.ts.map +1 -1
  90. package/dist/types/components/admin/site-health/site-health-google-search-console.d.ts +9 -6
  91. package/dist/types/components/admin/site-health/site-health-google-search-console.d.ts.map +1 -1
  92. package/dist/types/components/admin/site-health/site-health-on-site-seo.d.ts +8 -3
  93. package/dist/types/components/admin/site-health/site-health-on-site-seo.d.ts.map +1 -1
  94. package/dist/types/components/admin/site-health/site-health-on-site-seo.integration.d.ts.map +1 -1
  95. package/dist/types/components/admin/site-health/site-health-overview.d.ts +7 -4
  96. package/dist/types/components/admin/site-health/site-health-overview.d.ts.map +1 -1
  97. package/dist/types/components/admin/site-health/site-health-performance.d.ts +7 -4
  98. package/dist/types/components/admin/site-health/site-health-performance.d.ts.map +1 -1
  99. package/dist/types/components/admin/site-health/site-health-security.d.ts +7 -4
  100. package/dist/types/components/admin/site-health/site-health-security.d.ts.map +1 -1
  101. package/dist/types/components/admin/site-health/site-health-seo.d.ts +7 -4
  102. package/dist/types/components/admin/site-health/site-health-seo.d.ts.map +1 -1
  103. package/dist/types/components/admin/site-health/site-health-template.d.ts +12 -10
  104. package/dist/types/components/admin/site-health/site-health-template.d.ts.map +1 -1
  105. package/dist/types/components/admin/site-health/site-health-uptime.d.ts +7 -4
  106. package/dist/types/components/admin/site-health/site-health-uptime.d.ts.map +1 -1
  107. package/dist/types/components/callout/callout.d.ts +3 -3
  108. package/dist/types/components/callout/callout.d.ts.map +1 -1
  109. package/dist/types/components/carousel/carousel.d.ts +16 -7
  110. package/dist/types/components/carousel/carousel.d.ts.map +1 -1
  111. package/dist/types/components/carousel/tiles.d.ts +3 -6
  112. package/dist/types/components/carousel/tiles.d.ts.map +1 -1
  113. package/dist/types/components/cms/flickr.d.ts +3 -6
  114. package/dist/types/components/cms/flickr.d.ts.map +1 -1
  115. package/dist/types/components/cms/google.reviews.components.d.ts +1 -7
  116. package/dist/types/components/cms/google.reviews.components.d.ts.map +1 -1
  117. package/dist/types/components/cms/hubspot.components.d.ts +1 -2
  118. package/dist/types/components/cms/hubspot.components.d.ts.map +1 -1
  119. package/dist/types/components/cms/instagram.components.d.ts +14 -9
  120. package/dist/types/components/cms/instagram.components.d.ts.map +1 -1
  121. package/dist/types/components/cms/smartimage.d.ts +2 -28
  122. package/dist/types/components/cms/smartimage.d.ts.map +1 -1
  123. package/dist/types/components/cms/wordpress.components.d.ts +33 -14
  124. package/dist/types/components/cms/wordpress.components.d.ts.map +1 -1
  125. package/dist/types/components/cms/yelp.d.ts +9 -4
  126. package/dist/types/components/cms/yelp.d.ts.map +1 -1
  127. package/dist/types/components/config/config.server.d.ts +9 -6
  128. package/dist/types/components/config/config.server.d.ts.map +1 -1
  129. package/dist/types/components/general/loading.d.ts +5 -1
  130. package/dist/types/components/general/loading.d.ts.map +1 -1
  131. package/dist/types/components/general/microinteractions.d.ts +1 -3
  132. package/dist/types/components/general/microinteractions.d.ts.map +1 -1
  133. package/dist/types/components/general/modal.d.ts +11 -5
  134. package/dist/types/components/general/modal.d.ts.map +1 -1
  135. package/dist/types/components/general/semantic.d.ts +3 -3
  136. package/dist/types/components/general/sidepanel.d.ts +20 -13
  137. package/dist/types/components/general/sidepanel.d.ts.map +1 -1
  138. package/dist/types/components/general/tab.d.ts +1 -2
  139. package/dist/types/components/general/tab.d.ts.map +1 -1
  140. package/dist/types/components/menu/menu-accordion.d.ts +22 -9
  141. package/dist/types/components/menu/menu-accordion.d.ts.map +1 -1
  142. package/dist/types/components/menu/menu-expando.d.ts +14 -5
  143. package/dist/types/components/menu/menu-expando.d.ts.map +1 -1
  144. package/dist/types/components/menu/menu-simple.d.ts +4 -5
  145. package/dist/types/components/menu/menu-simple.d.ts.map +1 -1
  146. package/dist/types/components/nerdjoke/nerdjoke.d.ts +1 -1
  147. package/dist/types/components/nerdjoke/nerdjoke.d.ts.map +1 -1
  148. package/dist/types/components/seo/googleanalytics.d.ts.map +1 -1
  149. package/dist/types/components/seo/metadata.components.d.ts +2 -2
  150. package/dist/types/components/seo/metadata.components.d.ts.map +1 -1
  151. package/dist/types/components/seo/schema-blogposting.d.ts +7 -4
  152. package/dist/types/components/seo/schema-blogposting.d.ts.map +1 -1
  153. package/dist/types/components/seo/schema-recipe.d.ts +29 -30
  154. package/dist/types/components/seo/schema-recipe.d.ts.map +1 -1
  155. package/dist/types/components/seo/schema-services.d.ts +19 -9
  156. package/dist/types/components/seo/schema-services.d.ts.map +1 -1
  157. package/dist/types/components/shoppingcart/paypal.d.ts +1 -1
  158. package/dist/types/components/shoppingcart/paypal.d.ts.map +1 -1
  159. package/dist/types/components/shoppingcart/shoppingcart.components.d.ts +77 -28
  160. package/dist/types/components/shoppingcart/shoppingcart.components.d.ts.map +1 -1
  161. package/dist/types/components/shoppingcart/shoppingcart.functions.d.ts +4 -23
  162. package/dist/types/components/shoppingcart/shoppingcart.functions.d.ts.map +1 -1
  163. package/dist/types/components/sitebuilder/config/CompoundFontSelector.d.ts +10 -11
  164. package/dist/types/components/sitebuilder/config/CompoundFontSelector.d.ts.map +1 -1
  165. package/dist/types/components/sitebuilder/config/ConfigBuilder.d.ts +41 -174
  166. package/dist/types/components/sitebuilder/config/ConfigBuilder.d.ts.map +1 -1
  167. package/dist/types/components/sitebuilder/config/FontSelector.d.ts +12 -13
  168. package/dist/types/components/sitebuilder/config/FontSelector.d.ts.map +1 -1
  169. package/dist/types/components/sitebuilder/form/formbuilder.d.ts +7 -3
  170. package/dist/types/components/sitebuilder/form/formbuilder.d.ts.map +1 -1
  171. package/dist/types/components/sitebuilder/form/formcomponents.d.ts +1 -1
  172. package/dist/types/components/sitebuilder/form/formcomponents.d.ts.map +1 -1
  173. package/dist/types/components/sitebuilder/form/formengine.d.ts +1 -2
  174. package/dist/types/components/sitebuilder/form/formengine.d.ts.map +1 -1
  175. package/dist/types/components/sitebuilder/form/formextractor.d.ts +5 -4
  176. package/dist/types/components/sitebuilder/form/formextractor.d.ts.map +1 -1
  177. package/dist/types/components/sitebuilder/form/formtypes.d.ts +3 -3
  178. package/dist/types/components/sitebuilder/form/formtypes.d.ts.map +1 -1
  179. package/dist/types/components/sitebuilder/form/formvalidator.d.ts +8 -3
  180. package/dist/types/components/sitebuilder/form/formvalidator.d.ts.map +1 -1
  181. package/dist/types/components/sitebuilder/page/components/ComponentPropertiesForm.d.ts +2 -3
  182. package/dist/types/components/sitebuilder/page/components/ComponentPropertiesForm.d.ts.map +1 -1
  183. package/dist/types/components/sitebuilder/page/components/ComponentSelector.d.ts +2 -3
  184. package/dist/types/components/sitebuilder/page/components/ComponentSelector.d.ts.map +1 -1
  185. package/dist/types/components/sitebuilder/page/components/ComponentTree.d.ts +2 -3
  186. package/dist/types/components/sitebuilder/page/components/ComponentTree.d.ts.map +1 -1
  187. package/dist/types/components/sitebuilder/page/components/PageBuilderUI.d.ts +8 -7
  188. package/dist/types/components/sitebuilder/page/components/PageBuilderUI.d.ts.map +1 -1
  189. package/dist/types/components/sitebuilder/page/components/PageEngine.d.ts.map +1 -1
  190. package/dist/types/components/sitebuilder/page/components/SaveLoadSection.d.ts +2 -3
  191. package/dist/types/components/sitebuilder/page/components/SaveLoadSection.d.ts.map +1 -1
  192. package/dist/types/components/sitebuilder/page/lib/componentMap.d.ts +1 -1
  193. package/dist/types/components/structured/markdown.d.ts +1 -3
  194. package/dist/types/components/structured/markdown.d.ts.map +1 -1
  195. package/dist/types/components/structured/recipe.d.ts +5 -32
  196. package/dist/types/components/structured/recipe.d.ts.map +1 -1
  197. package/dist/types/components/structured/socialcard.d.ts +4 -0
  198. package/dist/types/components/structured/socialcard.d.ts.map +1 -1
  199. package/dist/types/components/structured/timeline.d.ts +1 -3
  200. package/dist/types/components/structured/timeline.d.ts.map +1 -1
  201. package/dist/types/components/utilities/functions.d.ts +20 -0
  202. package/dist/types/components/utilities/functions.d.ts.map +1 -1
  203. package/dist/types/components/utilities/gemini-api.client.d.ts +38 -0
  204. package/dist/types/components/utilities/gemini-api.client.d.ts.map +1 -0
  205. package/dist/types/components/utilities/gemini-api.server.d.ts +17 -0
  206. package/dist/types/components/utilities/gemini-api.server.d.ts.map +1 -0
  207. package/dist/types/index.adminclient.d.ts +27 -0
  208. package/dist/types/index.adminclient.d.ts.map +1 -0
  209. package/dist/types/index.adminserver.d.ts +19 -0
  210. package/dist/types/index.adminserver.d.ts.map +1 -0
  211. package/dist/types/index.d.ts +4 -18
  212. package/dist/types/index.server.d.ts +5 -28
  213. package/dist/types/stories/general/sidepanel.stories.d.ts.map +1 -1
  214. package/dist/types/stories/general/smartimage.stories.d.ts +74 -2
  215. package/dist/types/stories/general/smartimage.stories.d.ts.map +1 -1
  216. package/package.json +19 -9
  217. package/README.COMPONENTS.md +0 -2310
  218. package/dist/components/cms/pixelated.linkedin.js +0 -180
  219. package/dist/components/cms/pixelated.linkedin1.js +0 -84
  220. package/dist/components/cms/pixelated.linkedin2.js +0 -92
  221. package/dist/types/components/cms/pixelated.linkedin.d.ts +0 -2
  222. package/dist/types/components/cms/pixelated.linkedin.d.ts.map +0 -1
  223. package/dist/types/components/cms/pixelated.linkedin1.d.ts +0 -2
  224. package/dist/types/components/cms/pixelated.linkedin1.d.ts.map +0 -1
  225. package/dist/types/components/cms/pixelated.linkedin2.d.ts +0 -2
  226. package/dist/types/components/cms/pixelated.linkedin2.d.ts.map +0 -1
  227. package/dist/types/tests/pixelated.menu-expando.test.d.ts +0 -2
  228. package/dist/types/tests/pixelated.menu-expando.test.d.ts.map +0 -1
@@ -1,5 +1,7 @@
1
+ "use client";
1
2
  import { jsx as _jsx } from "react/jsx-runtime";
2
3
  import { createContext, useContext, useState, useCallback } from 'react';
4
+ import PropTypes from 'prop-types';
3
5
  import * as FVF from './formfieldvalidations';
4
6
  /**
5
7
  * Centralized field validation service
@@ -51,6 +53,9 @@ export function useFormValidation() {
51
53
  }
52
54
  return context;
53
55
  }
56
+ FormValidationProvider.propTypes = {
57
+ children: PropTypes.node.isRequired
58
+ };
54
59
  export function FormValidationProvider({ children }) {
55
60
  const [fieldValidity, setFieldValidity] = useState({});
56
61
  const [fieldErrors, setFieldErrors] = useState({});
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import React from 'react';
4
+ import PropTypes from 'prop-types';
4
5
  import { PageSectionHeader } from '../../../general/semantic';
5
6
  import { usePageBuilder } from '../lib/usePageBuilder';
6
7
  import { ComponentSelector } from '../components/ComponentSelector';
@@ -13,7 +14,10 @@ import './pagebuilder.scss';
13
14
  * PageBuilderUI - Main orchestrator component
14
15
  * Composes all sub-components and manages layout with inline editing
15
16
  */
16
- export function PageBuilderUI({ apiEndpoint = '/api/pagebuilder' } = {}) {
17
+ PageBuilderUI.propTypes = {
18
+ apiEndpoint: PropTypes.string,
19
+ };
20
+ export function PageBuilderUI({ apiEndpoint = '/api/pagebuilder' }) {
17
21
  const { pageJSON, setPageJSON, editableComponent, selectedPath, editMode, setEditableComponent, setSelectedPath, setEditMode, handleAddNewComponent, handleSelectComponent, handleEditComponent, cancelEdit, handleDeleteComponent, handleMoveUp, handleMoveDown, } = usePageBuilder();
18
22
  const [selectorKey, setSelectorKey] = React.useState(0);
19
23
  // Handle loading a saved page
@@ -33,7 +33,6 @@
33
33
  }
34
34
 
35
35
  .bingoBoxFreeSpace {
36
- background-color: #EEE;
37
36
  font-size: 1.1em;
38
37
  font-weight: bold;
39
38
  }
@@ -61,7 +61,6 @@ RecipeBook.propTypes = {
61
61
  }).isRequired,
62
62
  recipeCategories: PropTypes.array.isRequired
63
63
  };
64
- // export type RecipeBookType = InferProps<typeof RecipeBook.propTypes>;
65
64
  export function RecipeBook(props) {
66
65
  const [recipeElems] = useState(generateMyElems());
67
66
  const [outputElems, setOutputElems] = useState([]);
@@ -205,6 +204,7 @@ export function RecipePickList(props) {
205
204
  return (_jsx("form", { children: _jsx("select", { id: "recipe-list", name: "recipe-list", onChange: recipeListChanged, children: recipeOptions }) }));
206
205
  }
207
206
  /* ========== RECIPE BACK TO TOP ========== */
207
+ BackToTop.propTypes = {};
208
208
  export function BackToTop() {
209
209
  function scrollToTop() {
210
210
  window.scroll({
@@ -30,10 +30,10 @@ function removeDeadHrefs(element) {
30
30
  });
31
31
  return doc.body.innerHTML;
32
32
  }
33
+ /* ========== SOCIALCARD ========== */
33
34
  SocialCards.propTypes = {
34
35
  sources: PropTypes.object.isRequired
35
36
  };
36
- /* ========== SOCIALCARDS ========== */
37
37
  export function SocialCards(props) {
38
38
  const debug = false;
39
39
  const [state, setState] = useState({
@@ -306,12 +306,12 @@ SocialCard.propTypes = {
306
306
  iconSrcAlt: PropTypes.string.isRequired,
307
307
  card: PropTypes.any.isRequired
308
308
  };
309
- /* ========== SOCIALCARD ========== */
310
309
  export function SocialCard(props) {
311
310
  const config = usePixelatedConfig();
312
311
  return (_jsx("div", { className: "masonryItem", children: _jsxs("div", { className: "card", children: [_jsx("div", { className: "cardTitle", children: _jsxs("a", { href: props.card.link, target: "_blank", rel: "noopener noreferrer", children: [_jsx(SmartImage, { className: "cardIcon", src: props.iconSrc, title: props.iconSrcAlt, alt: props.iconSrcAlt, cloudinaryEnv: config?.cloudinary?.product_env, cloudinaryDomain: config?.cloudinary?.baseUrl, cloudinaryTransforms: config?.cloudinary?.transforms }), props.card.title] }) }), _jsx("div", { className: "cardBody", dangerouslySetInnerHTML: { __html: removeDeadHrefs(props.card.description) } }), _jsx("div", { className: "cardDate", children: props.card.pubDate })] }) }, props.card.guid));
313
312
  }
314
313
  /* ========== SPINNER ========== */
314
+ SocialCardsLoading.propTypes = {};
315
315
  export function SocialCardsLoading() {
316
316
  return (_jsx("div", { className: "cardsLoading", children: _jsx("div", { children: "Loading..." }) }));
317
317
  }
@@ -9,7 +9,6 @@ export function html2dom(str) {
9
9
  dom.innerHTML = str;
10
10
  return dom;
11
11
  }
12
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
13
12
  export function mergeDeep(a, b) {
14
13
  // first is default vals, all other objects overwrite
15
14
  const extended = {};
@@ -125,3 +124,85 @@ export function logAllChange() {
125
124
  }
126
125
  // Call the function to activate the listeners once the script is loaded
127
126
  // logChangeToAllElements();
127
+ /* ===== CLIENT COMPONENT DETECTION ===== */
128
+ /**
129
+ * Regex patterns that identify client-only code requiring browser execution
130
+ * Used by both ESLint rules and build scripts to determine client vs server components
131
+ */
132
+ export const CLIENT_ONLY_PATTERNS = [
133
+ /\baddEventListener\b/,
134
+ /\bcreateContext\b/,
135
+ /\bdocument\./,
136
+ /\blocalStorage\b/,
137
+ /\bnavigator\./,
138
+ /\bonBlur\b/,
139
+ /\bonChange\b/,
140
+ /\bonClick\b/,
141
+ /\bonFocus\b/,
142
+ /\bonInput\b/,
143
+ /\bonKey\b/,
144
+ /\bonMouse\b/,
145
+ /\bonSubmit\b/,
146
+ /\bremoveEventListener\b/,
147
+ /\bsessionStorage\b/,
148
+ /\buseCallback\b/,
149
+ /\buseContext\b/,
150
+ /\buseEffect\b/,
151
+ /\buseLayoutEffect\b/,
152
+ /\buseMemo\b/,
153
+ /\buseReducer\b/,
154
+ /\buseRef\b/,
155
+ /\buseState\b/,
156
+ /\bwindow\./,
157
+ /["']use client["']/ // Client directive
158
+ ];
159
+ /**
160
+ * Determines if a component file contains client-only code that requires browser execution
161
+ * @param fileContent - The source code content of the file
162
+ * @returns true if the file contains client-only patterns
163
+ */
164
+ export function isClientComponent(fileContent) {
165
+ return CLIENT_ONLY_PATTERNS.some(pattern => pattern.test(fileContent));
166
+ }
167
+ /* ===== COMPONENT FILE DETECTION ===== */
168
+ /**
169
+ * Glob patterns for finding component files
170
+ */
171
+ export const TS_FILE_IGNORE_PATTERNS = [
172
+ '**/*.d.ts',
173
+ '**/*.test.ts',
174
+ '**/*.spec.ts',
175
+ '**/*.stories.ts',
176
+ '**/documentation/**',
177
+ '**/examples/**',
178
+ '**/*.example.*'
179
+ ];
180
+ export const TSX_FILE_IGNORE_PATTERNS = [
181
+ '**/*.test.tsx',
182
+ '**/*.spec.tsx',
183
+ '**/*.stories.tsx',
184
+ '**/documentation/**',
185
+ '**/examples/**',
186
+ '**/*.example.*'
187
+ ];
188
+ /* ===== SERVER COMPONENT DETECTION ===== */
189
+ /**
190
+ * Regex patterns that identify server-only code that should not run on client
191
+ */
192
+ export const SERVER_ONLY_PATTERNS = [
193
+ /["']use server["']/, // Server directive
194
+ /\b__dirname\b/,
195
+ /\b__filename\b/,
196
+ /@aws-sdk/,
197
+ /\bchild_process\b/,
198
+ /\bexec\b/,
199
+ /\bexecAsync\b/,
200
+ /\bfs\b/,
201
+ /\bfs\.readFileSync\b/,
202
+ /\bfs\.existsSync\b/,
203
+ /\bimport.*googleapis\b|\brequire.*googleapis\b/, // Actual import of googleapis
204
+ /\bimport.*path\b|\brequire.*path\b/, // Actual import of path module
205
+ /\bprocess\.cwd\(\)/,
206
+ /\brequire\.resolve\b/,
207
+ /\butil\b/
208
+ ];
@@ -0,0 +1,76 @@
1
+ 'use client';
2
+ /**
3
+ * Service for integrating with Google Gemini API for SEO recommendations
4
+ */
5
+ export class GeminiApiService {
6
+ apiKey;
7
+ baseUrl;
8
+ constructor(apiKey, baseUrl = 'https://generativelanguage.googleapis.com') {
9
+ this.apiKey = apiKey;
10
+ this.baseUrl = baseUrl;
11
+ }
12
+ /**
13
+ * Generate SEO recommendations for a route
14
+ */
15
+ async generateRouteRecommendations(request) {
16
+ try {
17
+ // Use the proxy API route instead of direct Google API call
18
+ const response = await fetch('/api/ai/recommendations', {
19
+ method: 'POST',
20
+ headers: {
21
+ 'Content-Type': 'application/json',
22
+ },
23
+ body: JSON.stringify(request)
24
+ });
25
+ if (!response.ok) {
26
+ const errorText = await response.text();
27
+ console.error('AI API Error Response:', errorText);
28
+ throw new Error(`AI API error: ${response.status} ${response.statusText}`);
29
+ }
30
+ const data = await response.json();
31
+ if (!data.success) {
32
+ throw new Error(data.error || 'AI API request failed');
33
+ }
34
+ return {
35
+ success: true,
36
+ data: data.data
37
+ };
38
+ }
39
+ catch (error) {
40
+ console.error('AI API error:', error);
41
+ return {
42
+ success: false,
43
+ error: error instanceof Error ? error.message : 'Unknown error occurred'
44
+ };
45
+ }
46
+ }
47
+ /**
48
+ * List available models to debug API issues
49
+ */
50
+ async listModels() {
51
+ try {
52
+ const response = await fetch(`${this.baseUrl}/v1/models?key=${this.apiKey}`, {
53
+ method: 'GET',
54
+ headers: {
55
+ 'Content-Type': 'application/json',
56
+ },
57
+ });
58
+ if (!response.ok) {
59
+ throw new Error(`Failed to list models: ${response.status} ${response.statusText}`);
60
+ }
61
+ const data = await response.json();
62
+ console.log('Available models:', data);
63
+ return data;
64
+ }
65
+ catch (error) {
66
+ console.error('Error listing models:', error);
67
+ return null;
68
+ }
69
+ }
70
+ }
71
+ /**
72
+ * Create a Gemini API service instance
73
+ */
74
+ export function createGeminiApiService(apiKey) {
75
+ return new GeminiApiService(apiKey);
76
+ }
@@ -0,0 +1,185 @@
1
+ "use server";
2
+ /**
3
+ * Parse the response from Google Gemini API
4
+ */
5
+ function parseGeminiResponse(data) {
6
+ try {
7
+ console.log('Gemini API raw response:', JSON.stringify(data, null, 2));
8
+ // Check if we have candidates
9
+ if (!data.candidates || !Array.isArray(data.candidates) || data.candidates.length === 0) {
10
+ throw new Error('No candidates in Gemini API response');
11
+ }
12
+ const candidate = data.candidates[0];
13
+ // Check if response was truncated due to token limits
14
+ if (candidate.finishReason === 'MAX_TOKENS') {
15
+ throw new Error('AI response was truncated due to token limits. Please try again or use a shorter prompt.');
16
+ }
17
+ if (!candidate.content || !candidate.content.parts || !Array.isArray(candidate.content.parts) || candidate.content.parts.length === 0) {
18
+ throw new Error('No content parts in Gemini API response');
19
+ }
20
+ const text = candidate.content.parts[0].text;
21
+ console.log('Gemini API response text:', text);
22
+ if (!text) {
23
+ throw new Error('No text content in Gemini API response');
24
+ }
25
+ // Remove markdown code block markers if present
26
+ let jsonText = text.trim();
27
+ if (jsonText.startsWith('```json')) {
28
+ jsonText = jsonText.replace(/^```json\s*/, '').replace(/\s*```$/, '');
29
+ }
30
+ else if (jsonText.startsWith('```')) {
31
+ jsonText = jsonText.replace(/^```\s*/, '').replace(/\s*```$/, '');
32
+ }
33
+ console.log('Cleaned JSON text:', jsonText);
34
+ // The text should be JSON, try to parse it
35
+ const parsedResponse = JSON.parse(jsonText);
36
+ console.log('Parsed JSON response:', parsedResponse);
37
+ // Validate the expected structure
38
+ if (typeof parsedResponse !== 'object' || parsedResponse === null) {
39
+ throw new Error('Parsed response is not a valid object');
40
+ }
41
+ return {
42
+ title: parsedResponse.title || undefined,
43
+ keywords: Array.isArray(parsedResponse.keywords) ? parsedResponse.keywords : undefined,
44
+ description: parsedResponse.description || undefined
45
+ };
46
+ }
47
+ catch (error) {
48
+ console.error('Error parsing Gemini API response:', error);
49
+ console.error('Raw response data:', JSON.stringify(data, null, 2));
50
+ throw new Error('Failed to parse AI recommendations');
51
+ }
52
+ }
53
+ function buildRecommendationPrompt(request) {
54
+ const { route, siteInfo } = request;
55
+ // Extract location information
56
+ const address = siteInfo.address;
57
+ const locationInfo = address ?
58
+ `${address.addressLocality || ''}, ${address.addressRegion || ''} ${address.postalCode || ''}`.trim() :
59
+ '';
60
+ return `Generate SEO recommendations as JSON:
61
+
62
+ Business: ${siteInfo.name || 'Unknown'} - ${siteInfo.description || 'Not provided'}
63
+ ${locationInfo ? `Location: ${locationInfo}` : ''}
64
+ Route: ${route.name || route.path || '/'}
65
+ Current: Title="${route.title || ''}", Keywords="${Array.isArray(route.keywords) ? route.keywords.join(', ') : route.keywords || ''}", Description="${route.description || ''}"
66
+
67
+ Return only this JSON:
68
+ {
69
+ "title": "50-60 char optimized title",
70
+ "keywords": ["relevant", "keywords", "for", "this", "page", "including", "location-based", "terms"],
71
+ "description": "150-160 char meta description including location when relevant"
72
+ }`;
73
+ }
74
+ /**
75
+ * Parse the PaLM API response and extract recommendations
76
+ */
77
+ function parsePaLMResponse(data) {
78
+ try {
79
+ // Try Gemini API format first
80
+ let text = data.candidates?.[0]?.content?.parts?.[0]?.text;
81
+ // Fallback to PaLM format
82
+ if (!text) {
83
+ text = data.candidates?.[0]?.output;
84
+ }
85
+ if (!text) {
86
+ throw new Error('No response text from AI API');
87
+ }
88
+ // Try to parse JSON from the response
89
+ const jsonMatch = text.match(/\{[\s\S]*\}/);
90
+ if (!jsonMatch) {
91
+ throw new Error('No JSON found in AI response');
92
+ }
93
+ const parsed = JSON.parse(jsonMatch[0]);
94
+ return {
95
+ title: parsed.title,
96
+ keywords: Array.isArray(parsed.keywords) ? parsed.keywords : [],
97
+ description: parsed.description
98
+ };
99
+ }
100
+ catch (error) {
101
+ console.error('Error parsing AI response:', error);
102
+ return {
103
+ error: 'Failed to parse AI recommendations'
104
+ };
105
+ }
106
+ }
107
+ /**
108
+ * Infer business type from site information
109
+ */
110
+ function inferBusinessType(siteInfo) {
111
+ // Simple inference based on description keywords
112
+ const description = (siteInfo.description || '').toLowerCase();
113
+ if (description.includes('restaurant') || description.includes('food'))
114
+ return 'restaurant';
115
+ if (description.includes('real estate') || description.includes('property'))
116
+ return 'real estate';
117
+ if (description.includes('law') || description.includes('legal'))
118
+ return 'legal services';
119
+ if (description.includes('medical') || description.includes('health'))
120
+ return 'healthcare';
121
+ if (description.includes('consulting') || description.includes('consultant'))
122
+ return 'consulting';
123
+ if (description.includes('retail') || description.includes('store'))
124
+ return 'retail';
125
+ return 'general business';
126
+ }
127
+ /**
128
+ * Generate AI recommendations for SEO using Google Gemini API
129
+ */
130
+ export async function generateAiRecommendations(request, apiKey) {
131
+ try {
132
+ // Build the prompt using the shared function
133
+ const prompt = buildRecommendationPrompt(request);
134
+ // Make request to Google Gemini API
135
+ const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=${apiKey}`, {
136
+ method: 'POST',
137
+ headers: {
138
+ 'Content-Type': 'application/json',
139
+ },
140
+ body: JSON.stringify({
141
+ contents: [{
142
+ parts: [{
143
+ text: prompt
144
+ }]
145
+ }],
146
+ generationConfig: {
147
+ temperature: 0.7,
148
+ maxOutputTokens: 4096,
149
+ topP: 0.95,
150
+ topK: 40
151
+ }
152
+ })
153
+ });
154
+ if (!response.ok) {
155
+ console.error('Google API Response Status:', response.status);
156
+ console.error('Google API Response Status Text:', response.statusText);
157
+ // Try to get the response body for debugging
158
+ try {
159
+ const errorBody = await response.text();
160
+ console.error('Google API Error Response Body:', errorBody);
161
+ }
162
+ catch (e) {
163
+ console.error('Could not read error response body');
164
+ }
165
+ if (response.status === 429) {
166
+ // Check if it's quota exceeded vs rate limit
167
+ if (response.statusText === 'Too Many Requests') {
168
+ // This might be quota exceeded, not just rate limit
169
+ throw new Error('AI API quota exceeded. Please check your Google AI Studio billing settings and enable billing.');
170
+ }
171
+ throw new Error('AI API rate limit exceeded. Please try again later.');
172
+ }
173
+ throw new Error(`AI API error: ${response.status} ${response.statusText}`);
174
+ }
175
+ const data = await response.json();
176
+ // Parse the Gemini API response
177
+ return parseGeminiResponse(data);
178
+ }
179
+ catch (error) {
180
+ console.error('AI API error:', error);
181
+ return {
182
+ error: error instanceof Error ? error.message : 'Unknown error occurred'
183
+ };
184
+ }
185
+ }
@@ -9,7 +9,7 @@
9
9
  "favicon": "/favicon.ico",
10
10
  "favicon_sizes": "64x64 32x32 24x24 16x16",
11
11
  "favicon_type": "image/x-icon",
12
- "theme_color": "#369",
12
+ "theme_color": "#336699",
13
13
  "background_color": "#ffffff",
14
14
  "default_locale": "en",
15
15
  "display": "standalone",
@@ -32,10 +32,10 @@
32
32
  ]
33
33
  },
34
34
  "visualdesign": {
35
- "primary-color": { "value": "#369", "type": "color", "group": "palette", "label": "Primary color" },
36
- "secondary-color": { "value": "#BCD", "type": "color", "group": "palette", "label": "Secondary color" },
37
- "accent1-color": { "value": "#CCC", "type": "color", "group": "palette", "label": "Accent color 1" },
38
- "accent2-color": { "value": "#EEE", "type": "color", "group": "palette", "label": "Accent color 2" },
35
+ "primary-color": { "value": "#336699", "type": "color", "group": "palette", "label": "Primary color" },
36
+ "secondary-color": { "value": "#BBCCDD", "type": "color", "group": "palette", "label": "Secondary color" },
37
+ "accent1-color": { "value": "#CCCCCC", "type": "color", "group": "palette", "label": "Accent color 1" },
38
+ "accent2-color": { "value": "#EEEEEE", "type": "color", "group": "palette", "label": "Accent color 2" },
39
39
  "bg-color": { "value": "#ffffff", "type": "color", "group": "palette", "label": "Background color" },
40
40
  "text-color": { "value": "#000000", "type": "color", "group": "palette", "label": "Font color" },
41
41
  "header-font": { "value": "\"Montserrat\", Verdana, sans-serif", "type": "font", "group": "typography", "label": "Header font" },
@@ -0,0 +1,30 @@
1
+ // Admin client entry point - client components for admin functionality
2
+ // This entry requires optional dependencies: recharts
3
+ // Sites using admin client components should import from 'pixelated-components/adminclient'
4
+ export * from './components/admin/site-health/site-health-accessibility';
5
+ export * from './components/admin/site-health/site-health-axe-core';
6
+ export * from './components/admin/site-health/site-health-cloudwatch';
7
+ export * from './components/admin/site-health/site-health-cloudwatch.integration';
8
+ export * from './components/admin/site-health/site-health-core-web-vitals.integration';
9
+ export * from './components/admin/site-health/site-health-dependency-vulnerabilities';
10
+ export * from './components/admin/site-health/site-health-github';
11
+ export * from './components/admin/site-health/site-health-google-analytics';
12
+ export * from './components/admin/site-health/site-health-google-search-console';
13
+ export * from './components/admin/site-health/site-health-on-site-seo';
14
+ export * from './components/admin/site-health/site-health-overview';
15
+ export * from './components/admin/site-health/site-health-security';
16
+ export * from './components/admin/site-health/site-health-seo';
17
+ export * from './components/admin/site-health/site-health-template';
18
+ export * from './components/admin/site-health/site-health-uptime';
19
+ // Client-safe admin components (can run on both client and server)
20
+ export * from './components/admin/site-health/seo-constants';
21
+ export * from './components/admin/site-health/site-health-cache';
22
+ export * from './components/admin/site-health/site-health-indicators';
23
+ export * from './components/admin/site-health/site-health-on-site-seo.integration';
24
+ export * from './components/admin/site-health/site-health-types';
25
+ export * from './components/admin/site-health/site-health-performance';
26
+ export * from './components/admin/site-health/site-health-cache';
27
+ export * from './components/admin/site-health/site-health-indicators';
28
+ export * from './components/admin/site-health/site-health-on-site-seo.integration';
29
+ export * from './components/admin/site-health/site-health-performance';
30
+ export * from './components/admin/site-health/site-health-types';
@@ -0,0 +1,21 @@
1
+ // Admin entry point - server-side integrations and utilities for admin functionality
2
+ // This entry requires optional dependencies: recharts, googleapis, puppeteer, @aws-sdk/*, etc.
3
+ // Sites using admin features should import server functions from 'pixelated-components/admin'
4
+ export * from './components/admin/componentusage/componentDiscovery';
5
+ export * from './components/admin/componentusage/componentAnalysis';
6
+ export * from './components/admin/deploy/deployment.integration';
7
+ export * from './components/admin/site-health/google-api-auth';
8
+ export * from './components/admin/site-health/site-health-axe-core.integration';
9
+ export * from './components/admin/site-health/site-health-cache';
10
+ export * from './components/admin/site-health/site-health-core-web-vitals.integration';
11
+ export * from './components/admin/site-health/site-health-github.integration';
12
+ export * from './components/admin/site-health/site-health-google-analytics.integration';
13
+ export * from './components/admin/site-health/site-health-google-search-console.integration';
14
+ export * from './components/admin/site-health/site-health-indicators';
15
+ export * from './components/admin/site-health/site-health-on-site-seo.integration';
16
+ export * from './components/admin/site-health/site-health-cloudwatch.integration';
17
+ export * from './components/admin/site-health/seo-constants';
18
+ export * from './components/admin/site-health/site-health-security.integration';
19
+ export * from './components/admin/site-health/site-health-types';
20
+ export * from './components/admin/site-health/site-health-uptime.integration';
21
+ export * from './components/admin/sites/sites.integration';
package/dist/index.js CHANGED
@@ -20,6 +20,7 @@ export * from './components/cms/instagram.components';
20
20
  export * from './components/cms/wordpress.components';
21
21
  export * from './components/cms/wordpress.functions';
22
22
  export * from './components/cms/yelp';
23
+ export * from './components/config/config';
23
24
  export * from './components/config/config.client';
24
25
  export * from './components/config/config.server';
25
26
  export * from './components/config/config.types';
@@ -48,6 +49,7 @@ export * from './components/sitebuilder/config/ConfigEngine';
48
49
  export * from './components/sitebuilder/config/FontSelector';
49
50
  export * from './components/sitebuilder/config/CompoundFontSelector';
50
51
  export * from './components/sitebuilder/config/fonts';
52
+ export * from './components/sitebuilder/config/google-fonts';
51
53
  export * from './components/sitebuilder/form/formcomponents';
52
54
  export * from './components/sitebuilder/form/formtypes';
53
55
  export * from './components/sitebuilder/form/formutils';
@@ -79,24 +81,6 @@ export * from './components/seo/manifest';
79
81
  export * from './components/seo/metadata.functions';
80
82
  export * from './components/seo/metadata.components';
81
83
  export * from './components/seo/sitemap';
82
- export * from './components/admin/site-health/site-health-indicators';
83
- export * from './components/admin/site-health/site-health-accessibility';
84
- export * from './components/admin/site-health/site-health-axe-core';
85
- export * from './components/admin/site-health/site-health-cache';
86
- export * from './components/admin/site-health/site-health-dependency-vulnerabilities';
87
- export * from './components/admin/site-health/site-health-github';
88
- export * from './components/admin/site-health/site-health-google-analytics';
89
- export * from './components/admin/site-health/site-health-google-search-console';
90
- export * from './components/admin/site-health/site-health-on-site-seo';
91
- export * from './components/admin/site-health/site-health-cloudwatch';
92
- export * from './components/admin/site-health/seo-constants';
93
- export * from './components/admin/site-health/site-health-overview';
94
- export * from './components/admin/site-health/site-health-performance';
95
- export * from './components/admin/site-health/site-health-security';
96
- export * from './components/admin/site-health/site-health-seo';
97
- export * from './components/admin/site-health/site-health-template';
98
- export * from './components/admin/site-health/site-health-types';
99
- export * from './components/admin/site-health/site-health-uptime';
100
84
  export * from './components/shoppingcart/ebay.components';
101
85
  export * from './components/shoppingcart/ebay.functions';
102
86
  export * from './components/shoppingcart/paypal';
@@ -109,3 +93,5 @@ export * from './components/structured/resume';
109
93
  export * from './components/structured/socialcard';
110
94
  export * from './components/structured/timeline';
111
95
  export * from './components/utilities/functions';
96
+ export * from './components/utilities/gemini-api.client';
97
+ export * from './components/utilities/gemini-api.server';
@@ -2,25 +2,9 @@
2
2
  // Use this entry point for Next.js server components, API routes, and build-time code
3
3
  // Note: Client components (with JSX, CSS imports, browser APIs) are NOT exported here.
4
4
  // Import those from the main package entry point: @pixelated-tech/components
5
- export * from './components/admin/componentusage/componentDiscovery';
6
- export * from './components/admin/componentusage/componentAnalysis';
7
- export * from './components/admin/deploy/deployment.integration';
8
- export * from './components/admin/site-health/google-api-auth';
9
- export * from './components/admin/site-health/site-health-axe-core.integration';
10
- export * from './components/admin/site-health/site-health-cache';
11
- export * from './components/admin/site-health/site-health-core-web-vitals.integration';
12
- export * from './components/admin/site-health/site-health-github.integration';
13
- export * from './components/admin/site-health/site-health-google-analytics.integration';
14
- export * from './components/admin/site-health/site-health-google-search-console.integration';
15
- export * from './components/admin/site-health/site-health-indicators';
16
- export * from './components/admin/site-health/site-health-on-site-seo.integration';
17
- export * from './components/admin/site-health/site-health-cloudwatch.integration';
18
- export * from './components/admin/site-health/seo-constants';
19
- export * from './components/admin/site-health/site-health-security.integration';
20
- export * from './components/admin/site-health/site-health-performance';
21
- export * from './components/admin/site-health/site-health-types';
22
- export * from './components/admin/site-health/site-health-uptime.integration';
5
+ // Admin
23
6
  export * from './components/admin/sites/sites.integration';
7
+ // CMS
24
8
  export * from './components/cms/contentful.delivery';
25
9
  export * from './components/cms/contentful.management';
26
10
  export * from './components/cms/flickr';
@@ -28,12 +12,11 @@ export * from './components/cms/google.reviews.functions';
28
12
  export * from './components/cms/gravatar.functions';
29
13
  export * from './components/cms/instagram.functions';
30
14
  export * from './components/cms/wordpress.functions';
15
+ // Config
31
16
  export * from './components/config/config';
32
17
  export * from './components/config/config.server';
33
18
  export * from './components/config/config.types';
34
- export * from './components/menu/menu-accordion';
35
- export * from './components/menu/menu-expando';
36
- export * from './components/menu/menu-simple';
19
+ // SEO
37
20
  export * from './components/seo/googlemap';
38
21
  export * from './components/seo/manifest';
39
22
  export * from './components/seo/metadata.functions';
@@ -44,22 +27,26 @@ export * from './components/seo/schema-recipe';
44
27
  export * from './components/seo/schema-services';
45
28
  export * from './components/seo/schema-website';
46
29
  export * from './components/seo/sitemap';
30
+ // Shopping Cart
47
31
  export * from './components/shoppingcart/ebay.functions';
48
- export * from './components/sitebuilder/config/ConfigBuilder';
32
+ // Sitebuilder - Config
49
33
  export * from './components/sitebuilder/config/ConfigEngine';
50
- export * from './components/sitebuilder/config/google-fonts';
51
34
  export * from './components/sitebuilder/config/fonts';
52
- export * from './components/sitebuilder/form/formutils';
35
+ export * from './components/sitebuilder/config/google-fonts';
36
+ // Sitebuilder - Form
53
37
  export * from './components/sitebuilder/form/formtypes';
54
- export * from './components/sitebuilder/page/components/ComponentTree';
55
- export * from './components/sitebuilder/page/components/PageEngine';
38
+ export * from './components/sitebuilder/form/formutils';
39
+ // Sitebuilder - Page
56
40
  export * from './components/sitebuilder/page/lib/componentGeneration';
57
41
  export * from './components/sitebuilder/page/lib/componentMap';
58
42
  export * from './components/sitebuilder/page/lib/componentMetadata';
59
- export * from './components/sitebuilder/page/lib/pageStorageLocal'; // used for local storage
60
43
  export * from './components/sitebuilder/page/lib/pageStorageContentful';
44
+ export * from './components/sitebuilder/page/lib/pageStorageLocal'; // used for local storage
61
45
  export * from './components/sitebuilder/page/lib/pageStorageTypes';
62
46
  export * from './components/sitebuilder/page/lib/propTypeIntrospection';
63
47
  export * from './components/sitebuilder/page/lib/types';
64
- export * from './components/sitebuilder/page/lib/usePageBuilder';
48
+ // Structured
65
49
  export * from './components/structured/resume';
50
+ // Utilities
51
+ export * from './components/utilities/functions';
52
+ export * from './components/utilities/gemini-api.server';