@pixelated-tech/components 3.12.0 → 3.13.1

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 (87) hide show
  1. package/dist/components/admin/componentusage/componentAnalysis.js +2 -0
  2. package/dist/components/admin/deploy/deployment.integration.js +8 -0
  3. package/dist/components/admin/site-health/site-health-dependency-vulnerabilities.js +3 -1
  4. package/dist/components/config/config.js +41 -2
  5. package/dist/components/general/buzzwordbingo.css +8 -8
  6. package/dist/components/general/buzzwordbingo.js +3 -3
  7. package/dist/components/general/countup.css +19 -0
  8. package/dist/components/general/countup.js +62 -0
  9. package/dist/components/general/global-error.css +1 -1
  10. package/dist/components/general/global-error.js +1 -1
  11. package/dist/components/general/menu-accordion.css +24 -24
  12. package/dist/components/general/menu-accordion.js +13 -13
  13. package/dist/components/general/menu-expando.css +4 -4
  14. package/dist/components/general/menu-expando.js +7 -7
  15. package/dist/components/general/metadata.functions.js +1 -1
  16. package/dist/components/general/microinteractions.css +1 -1
  17. package/dist/components/general/nerdjoke.css +5 -5
  18. package/dist/components/general/nerdjoke.js +2 -2
  19. package/dist/components/general/recipe.css +1 -1
  20. package/dist/components/general/recipe.js +1 -1
  21. package/dist/components/general/semantic.js +1 -1
  22. package/dist/components/general/sidepanel.css +3 -3
  23. package/dist/components/general/skeleton.css +4 -4
  24. package/dist/components/general/skeleton.js +3 -3
  25. package/dist/components/general/styleguide.js +2 -2
  26. package/dist/components/general/table.css +6 -6
  27. package/dist/components/general/table.js +5 -5
  28. package/dist/components/general/tiles.js +3 -2
  29. package/dist/components/general/well-known.js +137 -0
  30. package/dist/components/integrations/contentful.management.js +25 -25
  31. package/dist/components/integrations/socialcard.css +6 -6
  32. package/dist/components/integrations/socialcard.js +2 -2
  33. package/dist/components/integrations/wordpress.components.js +1 -1
  34. package/dist/components/integrations/wordpress.css +2 -2
  35. package/dist/components/shoppingcart/ebay.components.js +11 -11
  36. package/dist/components/shoppingcart/ebay.css +20 -20
  37. package/dist/components/shoppingcart/shoppingcart.components.js +11 -11
  38. package/dist/components/shoppingcart/shoppingcart.css +19 -19
  39. package/dist/components/sitebuilder/form/form.css +4 -4
  40. package/dist/components/sitebuilder/form/formcomponents.js +3 -3
  41. package/dist/components/sitebuilder/page/components/PageBuilderUI.js +2 -2
  42. package/dist/components/sitebuilder/page/lib/pageStorageContentful.js +4 -4
  43. package/dist/config/pixelated.config.json.enc +1 -1
  44. package/dist/css/pixelated.grid.scss +1 -1
  45. package/dist/index.js +1 -1
  46. package/dist/index.server.js +3 -4
  47. package/dist/scripts/pixelated-eslint-plugin.js +51 -3
  48. package/dist/types/components/admin/componentusage/componentAnalysis.d.ts +2 -5
  49. package/dist/types/components/admin/componentusage/componentAnalysis.d.ts.map +1 -1
  50. package/dist/types/components/admin/deploy/deployment.integration.d.ts +1 -5
  51. package/dist/types/components/admin/deploy/deployment.integration.d.ts.map +1 -1
  52. package/dist/types/components/admin/site-health/site-health-dependency-vulnerabilities.d.ts.map +1 -1
  53. package/dist/types/components/admin/site-health/site-health-github.integration.d.ts +1 -11
  54. package/dist/types/components/admin/site-health/site-health-github.integration.d.ts.map +1 -1
  55. package/dist/types/components/admin/sites/sites.integration.d.ts +7 -1
  56. package/dist/types/components/admin/sites/sites.integration.d.ts.map +1 -1
  57. package/dist/types/components/config/config.d.ts.map +1 -1
  58. package/dist/types/components/config/config.types.d.ts +2 -2
  59. package/dist/types/components/config/config.types.d.ts.map +1 -1
  60. package/dist/types/components/general/countup.d.ts +17 -0
  61. package/dist/types/components/general/countup.d.ts.map +1 -0
  62. package/dist/types/components/general/tiles.d.ts.map +1 -1
  63. package/dist/types/components/general/well-known.d.ts +56 -0
  64. package/dist/types/components/general/well-known.d.ts.map +1 -0
  65. package/dist/types/components/integrations/contentful.management.d.ts +1 -5
  66. package/dist/types/components/integrations/contentful.management.d.ts.map +1 -1
  67. package/dist/types/components/shoppingcart/ebay.functions.d.ts +2 -2
  68. package/dist/types/components/shoppingcart/ebay.functions.d.ts.map +1 -1
  69. package/dist/types/components/shoppingcart/paypal.d.ts.map +1 -1
  70. package/dist/types/components/shoppingcart/shoppingcart.functions.d.ts +20 -12
  71. package/dist/types/components/shoppingcart/shoppingcart.functions.d.ts.map +1 -1
  72. package/dist/types/components/sitebuilder/page/lib/pageStorageContentful.d.ts +1 -1
  73. package/dist/types/components/sitebuilder/page/lib/pageStorageContentful.d.ts.map +1 -1
  74. package/dist/types/index.d.ts +1 -1
  75. package/dist/types/index.server.d.ts +3 -4
  76. package/dist/types/scripts/pixelated-eslint-plugin.d.ts +18 -0
  77. package/dist/types/stories/general/countup.stories.d.ts +47 -0
  78. package/dist/types/stories/general/countup.stories.d.ts.map +1 -0
  79. package/dist/types/tests/securitytxt.test.d.ts +2 -0
  80. package/dist/types/tests/securitytxt.test.d.ts.map +1 -0
  81. package/package.json +23 -13
  82. package/dist/components/config/config.utils.js +0 -52
  83. package/dist/components/general/humanstxt.js +0 -81
  84. package/dist/types/components/config/config.utils.d.ts +0 -6
  85. package/dist/types/components/config/config.utils.d.ts.map +0 -1
  86. package/dist/types/components/general/humanstxt.d.ts +0 -37
  87. package/dist/types/components/general/humanstxt.d.ts.map +0 -1
@@ -39,7 +39,7 @@
39
39
  }
40
40
 
41
41
 
42
- .masonryItem { /* Masonry bricks or child elements */
42
+ .masonry-item { /* Masonry bricks or child elements */
43
43
  display: inline-block;
44
44
  padding: 5px;
45
45
  width: 100%;
@@ -76,7 +76,7 @@
76
76
  white-space: normal;
77
77
  }
78
78
 
79
- .cardTitle {
79
+ .card-title {
80
80
  background-color: #EEE;
81
81
  /* background-image: url(/images/pix/pix-bg-sm-bw.gif); */
82
82
  border-bottom: 1px solid #999;
@@ -88,7 +88,7 @@
88
88
  /* .cardTitle a {
89
89
  } */
90
90
 
91
- .cardIcon {
91
+ .card-icon {
92
92
  background: #FFF;
93
93
  border: 0;
94
94
  height: 20px;
@@ -97,7 +97,7 @@
97
97
  margin: 0px 5px 0px 0px;
98
98
  }
99
99
 
100
- .cardDate {
100
+ .card-date {
101
101
  background-color: #DDD;
102
102
  border-top: 1px solid #999;
103
103
  font-size: 0.8em;
@@ -105,14 +105,14 @@
105
105
  text-align: right;
106
106
  }
107
107
 
108
- .cardBody {
108
+ .card-body {
109
109
  background-color: #fff;
110
110
  display: inline-block;
111
111
  padding: 5px;
112
112
  width: 100%;
113
113
  }
114
114
 
115
- .cardsLoading {
115
+ .cards-loading {
116
116
  column-span: all;
117
117
  text-align: center;
118
118
  }
@@ -312,7 +312,7 @@ SocialCard.propTypes = {
312
312
  };
313
313
  export function SocialCard(props) {
314
314
  const config = usePixelatedConfig();
315
- 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));
315
+ return (_jsx("div", { className: "masonry-item", children: _jsxs("div", { className: "card", children: [_jsx("div", { className: "card-title", children: _jsxs("a", { href: props.card.link, target: "_blank", rel: "noopener noreferrer", children: [_jsx(SmartImage, { className: "card-icon", 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: "card-body", dangerouslySetInnerHTML: { __html: removeDeadHrefs(props.card.description) } }), _jsx("div", { className: "card-date", children: props.card.pubDate })] }) }, props.card.guid));
316
316
  }
317
317
  /* ========== SPINNER ========== */
318
318
  /** SocialCardsLoading.propTypes — No props (simple loading indicator).
@@ -320,5 +320,5 @@ export function SocialCard(props) {
320
320
  */
321
321
  SocialCardsLoading.propTypes = { /** no props */};
322
322
  export function SocialCardsLoading() {
323
- return (_jsx("div", { className: "cardsLoading", children: _jsx("div", { children: "Loading..." }) }));
323
+ return (_jsx("div", { className: "cards-loading", children: _jsx("div", { children: "Loading..." }) }));
324
324
  }
@@ -123,5 +123,5 @@ export function BlogPostCategories(props) {
123
123
  ? category.trim().toLowerCase().replace(/[ /]+/g, '-')
124
124
  : undefined).filter(Boolean).sort();
125
125
  const config = usePixelatedConfig();
126
- return (_jsxs("div", { className: "blogPostCategories", children: [_jsx("div", { children: "Categories: " }), myCategoryImages.map((categoryImg, index) => categoryImg ? (_jsx("span", { className: "p-category", children: _jsx(SmartImage, { className: "u-photo", src: `/images/icons/${categoryImg}.png`, title: String(categoryImg), alt: String(categoryImg), cloudinaryEnv: config?.cloudinary?.product_env ?? undefined, cloudinaryDomain: config?.cloudinary?.baseUrl ?? undefined, cloudinaryTransforms: config?.cloudinary?.transforms ?? undefined }) }, categoryImg + "-" + index)) : null)] }));
126
+ return (_jsxs("div", { className: "blog-post-categories", children: [_jsx("div", { children: "Categories: " }), myCategoryImages.map((categoryImg, index) => categoryImg ? (_jsx("span", { className: "p-category", children: _jsx(SmartImage, { className: "u-photo", src: `/images/icons/${categoryImg}.png`, title: String(categoryImg), alt: String(categoryImg), cloudinaryEnv: config?.cloudinary?.product_env ?? undefined, cloudinaryDomain: config?.cloudinary?.baseUrl ?? undefined, cloudinaryTransforms: config?.cloudinary?.transforms ?? undefined }) }, categoryImg + "-" + index)) : null)] }));
127
127
  }
@@ -9,7 +9,7 @@
9
9
  border-radius: 25px;
10
10
  }
11
11
 
12
- .blogPostCategories {
12
+ .blog-post-categories {
13
13
  /* border: 1px solid #ccc; */
14
14
  margin: 10px;
15
15
  padding: 20px;
@@ -54,7 +54,7 @@
54
54
  }
55
55
 
56
56
  .blog-post-summary .p-category img,
57
- .blogPostCategories .p-category img {
57
+ .blog-post-categories .p-category img {
58
58
  width: 30px;
59
59
  height: 30px;
60
60
  margin: 0 5px;
@@ -98,10 +98,10 @@ export function EbayItems(props) {
98
98
  ToggleLoading(false);
99
99
  }, []);
100
100
  if (items && items.length > 0) {
101
- return (_jsxs(_Fragment, { children: [_jsx(Loading, {}), _jsx("div", { className: "ebayItemsHeader", children: _jsx(EbayItemHeader, { title: `${items.length} Store Items` }) }), _jsx("div", { className: "ebayItemsHeader", children: _jsx(EbayListFilter, { aspects: aspects, callback: fetchItems }) }), _jsx("div", { id: "ebayItems", className: "ebayItems", children: paintItems({ items: items, cloudinaryProductEnv: props.cloudinaryProductEnv }) })] }));
101
+ return (_jsxs(_Fragment, { children: [_jsx(Loading, {}), _jsx("div", { className: "ebay-items-header", children: _jsx(EbayItemHeader, { title: `${items.length} Store Items` }) }), _jsx("div", { className: "ebay-items-header", children: _jsx(EbayListFilter, { aspects: aspects, callback: fetchItems }) }), _jsx("div", { id: "ebay-items", className: "ebay-items", children: paintItems({ items: items, cloudinaryProductEnv: props.cloudinaryProductEnv }) })] }));
102
102
  }
103
103
  else {
104
- return (_jsx("div", { className: "section-container", children: _jsx("div", { id: "ebayItems", className: "ebayItems", children: _jsx(Loading, {}) }) }));
104
+ return (_jsx("div", { className: "section-container", children: _jsx("div", { id: "ebay-items", className: "ebay-items", children: _jsx(Loading, {}) }) }));
105
105
  }
106
106
  }
107
107
  /**
@@ -154,7 +154,7 @@ export function EbayListFilter(props) {
154
154
  props.callback({ aspectName: aspectName.value, aspectValue: aspectValue.value });
155
155
  }
156
156
  }
157
- return (_jsxs("form", { name: "ebayItemsFilter", id: "ebayItemsFilter", children: [_jsxs("span", { className: "filterInput", children: [_jsx("label", { htmlFor: "aspectName", children: "Aspect:" }), _jsxs("select", { id: "aspectName", onChange: onAspectNameChange, children: [_jsx("option", { value: "" }), aspectNames.map((aspectName, index) => _jsx("option", { value: aspectName, children: aspectName }, index))] })] }), _jsxs("span", { className: "filterInput", children: [_jsx("label", { htmlFor: "aspectValue", onChange: onAspectValueChange, children: "Value:" }), _jsx("select", { id: "aspectValue", children: _jsx("option", { value: "" }) })] }), _jsx("span", { className: "filterInput", children: _jsx("button", { type: "button", onClick: handleAspectFilter, children: "Filter" }) })] }));
157
+ return (_jsxs("form", { name: "ebay-items-filter", id: "ebay-items-filter", children: [_jsxs("span", { className: "filter-input", children: [_jsx("label", { htmlFor: "aspectName", children: "Aspect:" }), _jsxs("select", { id: "aspectName", onChange: onAspectNameChange, children: [_jsx("option", { value: "" }), aspectNames.map((aspectName, index) => _jsx("option", { value: aspectName, children: aspectName }, index))] })] }), _jsxs("span", { className: "filter-input", children: [_jsx("label", { htmlFor: "aspectValue", onChange: onAspectValueChange, children: "Value:" }), _jsx("select", { id: "aspectValue", children: _jsx("option", { value: "" }) })] }), _jsx("span", { className: "filter-input", children: _jsx("button", { type: "button", onClick: handleAspectFilter, children: "Filter" }) })] }));
158
158
  }
159
159
  /**
160
160
  * EbayListItem — Render a single eBay item with thumbnail, metadata and add-to-cart actions.
@@ -185,13 +185,13 @@ export function EbayListItem(props) {
185
185
  shoppingCartItem.itemURL = itemURL;
186
186
  const config = usePixelatedConfig();
187
187
  const itemImageComponent = _jsx(SmartImage, { src: itemImage, title: thisItem.title, alt: thisItem.title, cloudinaryEnv: props.cloudinaryProductEnv ?? undefined, cloudinaryDomain: config?.cloudinary?.baseUrl ?? undefined, cloudinaryTransforms: config?.cloudinary?.transforms ?? undefined });
188
- return (_jsxs("div", { className: "ebayItem row-12col", children: [_jsx("div", { className: "ebayItemPhoto grid-s1-e5", children: itemURL
188
+ return (_jsxs("div", { className: "ebay-item row-12col", children: [_jsx("div", { className: "ebay-item-photo grid-s1-e5", children: itemURL
189
189
  ? _jsx("a", { href: itemURL, target: itemURLTarget, rel: "noopener noreferrer", children: itemImageComponent })
190
- : (itemImageComponent) }), _jsxs("div", { className: "ebayItemBody grid-s5-e13", children: [_jsx("div", { className: "ebayItemHeader", children: itemURL
190
+ : (itemImageComponent) }), _jsxs("div", { className: "ebay-item-body grid-s5-e13", children: [_jsx("div", { className: "ebay-item-header", children: itemURL
191
191
  ? _jsx(EbayItemHeader, { url: itemURL, target: itemURLTarget, title: thisItem.title })
192
- : _jsx(EbayItemHeader, { title: thisItem.title }) }), _jsxs("div", { className: "ebayItemDetails grid12", children: [_jsxs("div", { children: [_jsx("b", { children: "Item ID: " }), thisItem.legacyItemId] }), _jsxs("div", { children: [_jsx("b", { children: "Quantity: " }), thisItem.categories[0].categoryId == apiProps.itemCategory ? 1 : 10] }), _jsxs("div", { children: [_jsx("b", { children: "Condition: " }), thisItem.condition] }), _jsxs("div", { children: [_jsx("b", { children: "Seller: " }), thisItem.seller.username, " (", thisItem.seller.feedbackScore, ")", _jsx("br", {}), thisItem.seller.feedbackPercentage, "% positive"] }), _jsxs("div", { children: [_jsx("b", { children: "Buying Options: " }), thisItem.buyingOptions[0]] }), _jsxs("div", { children: [_jsx("b", { children: "Location: " }), thisItem.itemLocation.postalCode + ", " + thisItem.itemLocation.country] }), _jsxs("div", { children: [_jsx("b", { children: "Listing Date: " }), thisItem.itemCreationDate] })] }), _jsx("div", { className: "ebayItemPrice", children: itemURL
192
+ : _jsx(EbayItemHeader, { title: thisItem.title }) }), _jsxs("div", { className: "ebay-item-details grid12", children: [_jsxs("div", { children: [_jsx("b", { children: "Item ID: " }), thisItem.legacyItemId] }), _jsxs("div", { children: [_jsx("b", { children: "Quantity: " }), thisItem.categories[0].categoryId == apiProps.itemCategory ? 1 : 10] }), _jsxs("div", { children: [_jsx("b", { children: "Condition: " }), thisItem.condition] }), _jsxs("div", { children: [_jsx("b", { children: "Seller: " }), thisItem.seller.username, " (", thisItem.seller.feedbackScore, ")", _jsx("br", {}), thisItem.seller.feedbackPercentage, "% positive"] }), _jsxs("div", { children: [_jsx("b", { children: "Buying Options: " }), thisItem.buyingOptions[0]] }), _jsxs("div", { children: [_jsx("b", { children: "Location: " }), thisItem.itemLocation.postalCode + ", " + thisItem.itemLocation.country] }), _jsxs("div", { children: [_jsx("b", { children: "Listing Date: " }), thisItem.itemCreationDate] })] }), _jsx("div", { className: "ebay-item-price", children: itemURL
193
193
  ? _jsxs("a", { href: itemURL, target: itemURLTarget, rel: "noreferrer", children: ["$", thisItem.price.value + " " + thisItem.price.currency] })
194
- : "$" + thisItem.price.value + " " + thisItem.price.currency }), _jsx("br", {}), _jsxs("div", { className: "ebayItemAddToCart", children: [_jsx(ViewItemDetails, { href: "/store", itemID: thisItem.legacyItemId }), _jsx(AddToCartButton, { handler: addToShoppingCart, item: shoppingCartItem, itemID: thisItem.legacyItemId })] })] })] }));
194
+ : "$" + thisItem.price.value + " " + thisItem.price.currency }), _jsx("br", {}), _jsxs("div", { className: "ebay-item-add-to-cart", children: [_jsx(ViewItemDetails, { href: "/store", itemID: thisItem.legacyItemId }), _jsx(AddToCartButton, { handler: addToShoppingCart, item: shoppingCartItem, itemID: thisItem.legacyItemId })] })] })] }));
195
195
  }
196
196
  /**
197
197
  * EbayItemHeader — Render a heading for an eBay item; optionally wrap in a link when a `url` is provided.
@@ -260,14 +260,14 @@ export function EbayItemDetail(props) {
260
260
  const itemURLTarget = "_self"; /* "_blank" */
261
261
  const shoppingCartItem = getShoppingCartItem({ thisItem: thisItem, cloudinaryProductEnv: props.cloudinaryProductEnv, apiProps: apiProps });
262
262
  shoppingCartItem.itemURL = itemURL;
263
- return (_jsx(_Fragment, { children: _jsxs("div", { className: "ebayItem row-12col", children: [_jsx("div", { className: "ebayItemHeader grid-s1-e13", children: itemURL
263
+ return (_jsx(_Fragment, { children: _jsxs("div", { className: "ebay-item row-12col", children: [_jsx("div", { className: "ebay-item-header grid-s1-e13", children: itemURL
264
264
  ? _jsx(EbayItemHeader, { url: itemURL, title: thisItem.title })
265
- : _jsx(EbayItemHeader, { title: thisItem.title }) }), _jsx("br", {}), _jsx("div", { className: "ebayItemPhotoCarousel grid-s1-e7", children: _jsx(Carousel, { cards: images, draggable: true, imgFit: "contain" }) }), _jsxs("div", { className: "grid-s7-e13", children: [_jsx("div", { className: "ebayItemDetails grid12", children: _jsx("div", { dangerouslySetInnerHTML: { __html: thisItem.description.replace(/(<br\s*\/?>\s*){2,}/gi, '') } }) }), _jsx("br", {}), _jsxs("div", { className: "ebayItemDetails grid12", children: [_jsxs("div", { children: [_jsx("b", { children: "Item ID: " }), thisItem.legacyItemId] }), _jsxs("div", { children: [_jsx("b", { children: "Quantity: " }), thisItem.categoryId == apiProps.itemCategory ? 1 : 10] }), _jsxs("div", { children: [_jsx("b", { children: "Category: " }), thisItem.categoryPath] }), _jsxs("div", { children: [_jsx("b", { children: "Condition: " }), thisItem.condition] }), _jsxs("div", { children: [_jsx("b", { children: "Seller: " }), thisItem.seller.username, " (", thisItem.seller.feedbackScore, ")", _jsx("br", {}), thisItem.seller.feedbackPercentage, "% positive"] }), _jsxs("div", { children: [_jsx("b", { children: "Buying Options: " }), thisItem.buyingOptions[0]] }), _jsxs("div", { children: [_jsx("b", { children: "Location: " }), thisItem.itemLocation.city + ", " + thisItem.itemLocation.stateOrProvince] }), _jsxs("div", { children: [_jsx("b", { children: "Listing Date: " }), thisItem.itemCreationDate] }), _jsx("br", {})] }), _jsx("div", { className: "ebayItemPrice", children: itemURL
265
+ : _jsx(EbayItemHeader, { title: thisItem.title }) }), _jsx("br", {}), _jsx("div", { className: "ebay-item-photo-carousel grid-s1-e7", children: _jsx(Carousel, { cards: images, draggable: true, imgFit: "contain" }) }), _jsxs("div", { className: "grid-s7-e13", children: [_jsx("div", { className: "ebay-item-details grid12", children: _jsx("div", { dangerouslySetInnerHTML: { __html: thisItem.description.replace(/(<br\s*\/?>\s*){2,}/gi, '') } }) }), _jsx("br", {}), _jsxs("div", { className: "ebay-item-details grid12", children: [_jsxs("div", { children: [_jsx("b", { children: "Item ID: " }), thisItem.legacyItemId] }), _jsxs("div", { children: [_jsx("b", { children: "Quantity: " }), thisItem.categoryId == apiProps.itemCategory ? 1 : 10] }), _jsxs("div", { children: [_jsx("b", { children: "Category: " }), thisItem.categoryPath] }), _jsxs("div", { children: [_jsx("b", { children: "Condition: " }), thisItem.condition] }), _jsxs("div", { children: [_jsx("b", { children: "Seller: " }), thisItem.seller.username, " (", thisItem.seller.feedbackScore, ")", _jsx("br", {}), thisItem.seller.feedbackPercentage, "% positive"] }), _jsxs("div", { children: [_jsx("b", { children: "Buying Options: " }), thisItem.buyingOptions[0]] }), _jsxs("div", { children: [_jsx("b", { children: "Location: " }), thisItem.itemLocation.city + ", " + thisItem.itemLocation.stateOrProvince] }), _jsxs("div", { children: [_jsx("b", { children: "Listing Date: " }), thisItem.itemCreationDate] }), _jsx("br", {})] }), _jsx("div", { className: "ebay-item-price", children: itemURL
266
266
  ? _jsxs("a", { href: itemURL, target: itemURLTarget, rel: "noreferrer", children: ["$", thisItem.price.value + " " + thisItem.price.currency] })
267
- : "$" + thisItem.price.value + " " + thisItem.price.currency }), _jsx("br", {}), _jsx("div", { className: "ebayItemAddToCart", children: _jsx(AddToCartButton, { handler: addToShoppingCart, item: shoppingCartItem, itemID: thisItem.legacyItemId }) })] })] }) }));
267
+ : "$" + thisItem.price.value + " " + thisItem.price.currency }), _jsx("br", {}), _jsx("div", { className: "ebay-item-add-to-cart", children: _jsx(AddToCartButton, { handler: addToShoppingCart, item: shoppingCartItem, itemID: thisItem.legacyItemId }) })] })] }) }));
268
268
  }
269
269
  else {
270
- return (_jsx(_Fragment, { children: _jsx("div", { id: "ebayItems", className: "ebayItems", children: _jsx("div", { className: "centered", children: "Loading..." }) }) }));
270
+ return (_jsx(_Fragment, { children: _jsx("div", { id: "ebay-items", className: "ebay-items", children: _jsx("div", { className: "centered", children: "Loading..." }) }) }));
271
271
  }
272
272
  }
273
273
  /* ========== EBAY RATE LIMITS VISUALIZER ========== */
@@ -2,23 +2,23 @@
2
2
  =============== EBAY ===============
3
3
  ======================================== */
4
4
 
5
- .ebayItems {
5
+ .ebay-items {
6
6
  text-align: center;
7
7
  }
8
8
 
9
9
  @media screen and (max-width: 480px) {
10
- .ebayItems {
10
+ .ebay-items {
11
11
  padding: 20px;
12
12
  }
13
13
  }
14
14
 
15
- .ebayItemsHeader {
15
+ .ebay-items-header {
16
16
  font-size: 1.25em;
17
17
  font-weight: bold;
18
18
  text-align: center;
19
19
  }
20
20
 
21
- #ebayItemsFilter {
21
+ #ebay-items-filter {
22
22
  font-size: 0.8em;
23
23
  margin: 20px auto;
24
24
  }
@@ -27,44 +27,44 @@
27
27
  #ebayItemsFilter {
28
28
  text-align: left;
29
29
  }
30
- .filterInput {
30
+ .filter-input {
31
31
  display: block;
32
32
  }
33
33
  }
34
34
 
35
- .ebayItem {
35
+ .ebay-item {
36
36
  border: 1px solid #DDD;
37
37
  text-align: left;
38
38
  padding: 20px 5px !important;
39
39
  }
40
40
 
41
41
  @media screen and (max-width: 480px) {
42
- .ebayItem {
42
+ .ebay-item {
43
43
  text-align: center;
44
44
  }
45
45
  }
46
46
 
47
- .ebayItemBody {
47
+ .ebay-item-body {
48
48
  grid-auto-rows: min-content;
49
49
  margin: 10px 0;
50
50
  }
51
51
 
52
- .ebayItemHeader {
52
+ .ebay-item-header {
53
53
  margin: 0 auto;
54
54
  }
55
55
 
56
- .ebayItemHeader h2 {
56
+ .ebay-item-header h2 {
57
57
  font-size: 1.25em;
58
58
  font-weight: bold;
59
59
  }
60
60
 
61
61
  /* ===== PHOTO CAROUSEL ON EBAY ITEM DETAIL PAGE ===== */
62
- .ebayItemPhotoCarousel {
62
+ .ebay-item-photo-carousel {
63
63
  width: 100%;
64
64
  height: 400px;
65
65
  }
66
66
 
67
- .ebayItemPhotoCarousel {
67
+ .ebay-item-photo-carousel {
68
68
 
69
69
  .carousel-container {
70
70
  background: none;
@@ -84,38 +84,38 @@
84
84
  }
85
85
 
86
86
  @media screen and (max-width: 480px) {
87
- .ebayItemPhotoCarousel {
87
+ .ebay-item-photo-carousel {
88
88
  height: 350px;
89
89
  }
90
- .ebayItemPhotoCarousel .carousel-container {
90
+ .ebay-item-photo-carousel .carousel-container {
91
91
  height: 300px;
92
92
  }
93
93
  }
94
94
 
95
- .ebayItemPhoto {
95
+ .ebay-item-photo {
96
96
  overflow: hidden;
97
97
  }
98
98
 
99
- .ebayItemPhoto img {
99
+ .ebay-item-photo img {
100
100
  padding: 10px 0;
101
101
  width: 100%;
102
102
  }
103
103
 
104
- .ebayItems .ebayItemDetails {
104
+ .ebay-items .ebay-item-details {
105
105
  display: none;
106
106
  }
107
107
 
108
- .ebayItemDetails {
108
+ .ebay-item-details {
109
109
  padding-bottom: 10px;
110
110
  }
111
111
 
112
112
  @media screen and (max-width: 480px) {
113
- .ebayItemDetails {
113
+ .ebay-item-details {
114
114
  text-align: left;
115
115
  }
116
116
  }
117
117
 
118
- .ebayItemPrice{
118
+ .ebay-item-price{
119
119
  font-size: 1.5em;
120
120
  font-weight: bold;
121
121
  /* background-image: url(/images/pix/pix-bg-sm-bw.gif); */
@@ -157,20 +157,20 @@ export function ShoppingCart(props) {
157
157
  console.log("SendMail Response:", sendMailResponse);
158
158
  // ========== THANK YOU ==========
159
159
  const pmt = orderData.purchase_units[0].payments.captures[0];
160
- return (_jsxs("div", { className: "pixCart", children: [_jsx(CalloutHeader, { title: "Shopping Cart : " }), _jsx("br", {}), _jsx("div", { id: "paypal-button-container", className: "paypal-button-container" }), _jsxs("div", { children: [_jsx("h3", { children: "Thank you for your payment!" }), "Payment ID : ", pmt.id, " ", _jsx("br", {}), "Status : ", pmt.status, " ", _jsx("br", {}), "Amount : $", pmt.amount.value + " " + pmt.amount.currency_code, " ", _jsx("br", {}), "Created : ", pmt.create_time, " ", _jsx("br", {})] })] }));
160
+ return (_jsxs("div", { className: "pix-cart", children: [_jsx(CalloutHeader, { title: "Shopping Cart : " }), _jsx("br", {}), _jsx("div", { id: "paypal-button-container", className: "paypal-button-container" }), _jsxs("div", { children: [_jsx("h3", { children: "Thank you for your payment!" }), "Payment ID : ", pmt.id, " ", _jsx("br", {}), "Status : ", pmt.status, " ", _jsx("br", {}), "Amount : $", pmt.amount.value + " " + pmt.amount.currency_code, " ", _jsx("br", {}), "Created : ", pmt.create_time, " ", _jsx("br", {})] })] }));
161
161
  }
162
162
  else if (progressStep === "Checkout") {
163
163
  // ========== CHECKOUT ==========
164
- return (_jsxs("div", { className: "pixCart", children: [_jsx(CalloutHeader, { title: "Checkout Summary : " }), checkoutData && _jsx(CheckoutItems, { ...checkoutData }), _jsx("br", {}), _jsx(FormButton, { className: "pixCartButton", type: "button", id: "backToCart", text: "<= Back To Cart", onClick: () => SetProgressStep("ShippingInfo") }), _jsx("br", {}), payPalClientID && (_jsx(PayPal, { payPalClientID: payPalClientID, checkoutData: getCheckoutData(), onApprove: handleOnApprove }))] }));
164
+ return (_jsxs("div", { className: "pix-cart", children: [_jsx(CalloutHeader, { title: "Checkout Summary : " }), checkoutData && _jsx(CheckoutItems, { ...checkoutData }), _jsx("br", {}), _jsx(FormButton, { className: "pix-cart-button", type: "button", id: "backToCart", text: "<= Back To Cart", onClick: () => SetProgressStep("ShippingInfo") }), _jsx("br", {}), payPalClientID && (_jsx(PayPal, { payPalClientID: payPalClientID, checkoutData: getCheckoutData(), onApprove: handleOnApprove }))] }));
165
165
  }
166
166
  else if (progressStep === "ShippingInfo") {
167
167
  // ========== SHOPPING CART ==========
168
168
  // ========== SHIPPING INFO ==========
169
- return (_jsxs("div", { className: "pixCart", children: [_jsx(CalloutHeader, { title: "Shopping Cart : " }), paintCartItems(shoppingCart ?? []), _jsx("br", {}), _jsx("div", { children: _jsx(FormButton, { className: "pixCartButton", type: "button", id: "backToCart", text: "Clear Cart", onClick: () => clearShoppingCart() }) }), _jsx("br", {}), _jsx("br", {}), _jsx("hr", {}), _jsx("br", {}), _jsx("br", {}), _jsxs("div", { children: [_jsx(CalloutHeader, { title: "Shipping To : " }), _jsx(FormEngine, { name: "address_to", id: "address_to", formData: shippingToData, onSubmitHandler: onShippingSubmit })] })] }));
169
+ return (_jsxs("div", { className: "pix-cart", children: [_jsx(CalloutHeader, { title: "Shopping Cart : " }), paintCartItems(shoppingCart ?? []), _jsx("br", {}), _jsx("div", { children: _jsx(FormButton, { className: "pix-cart-button", type: "button", id: "backToCart", text: "Clear Cart", onClick: () => clearShoppingCart() }) }), _jsx("br", {}), _jsx("br", {}), _jsx("hr", {}), _jsx("br", {}), _jsx("br", {}), _jsxs("div", { children: [_jsx(CalloutHeader, { title: "Shipping To : " }), _jsx(FormEngine, { name: "address_to", id: "address_to", formData: shippingToData, onSubmitHandler: onShippingSubmit })] })] }));
170
170
  }
171
171
  else {
172
172
  // ========== EMPTY SHOPPING CART ==========
173
- return (_jsxs("div", { className: "pixCart", children: [_jsx(CalloutHeader, { title: "Shopping Cart : " }), _jsx("br", {}), _jsx("div", { className: "centered", children: "No items in your shopping cart" }), _jsx("div", { id: "paypal-button-container", className: "paypal-button-container" })] }));
173
+ return (_jsxs("div", { className: "pix-cart", children: [_jsx(CalloutHeader, { title: "Shopping Cart : " }), _jsx("br", {}), _jsx("div", { className: "centered", children: "No items in your shopping cart" }), _jsx("div", { id: "paypal-button-container", className: "paypal-button-container" })] }));
174
174
  }
175
175
  }
176
176
  /**
@@ -205,13 +205,13 @@ export function ShoppingCartItem(props) {
205
205
  const thisItem = props.item;
206
206
  const thisItemTarget = "_self"; // "_blank"
207
207
  const config = usePixelatedConfig();
208
- return (_jsxs("div", { className: "pixCartItem row-12col", children: [_jsx("div", { className: "pixCartItemPhoto grid-s1-e4", children: thisItem.itemURL && thisItem.itemImageURL
208
+ return (_jsxs("div", { className: "pix-cart-item row-12col", children: [_jsx("div", { className: "pix-cart-item-photo grid-s1-e4", children: thisItem.itemURL && thisItem.itemImageURL
209
209
  ? _jsx("a", { href: thisItem.itemURL, target: thisItemTarget, rel: "noopener noreferrer", children: _jsx(SmartImage, { src: thisItem.itemImageURL, alt: thisItem.itemTitle, cloudinaryEnv: config?.cloudinary?.product_env, cloudinaryDomain: config?.cloudinary?.baseUrl, cloudinaryTransforms: config?.cloudinary?.transforms }) })
210
210
  : thisItem.itemImageURL
211
211
  ? (_jsx(SmartImage, { src: thisItem.itemImageURL, title: thisItem.itemTitle, alt: thisItem.itemTitle, cloudinaryEnv: config?.cloudinary?.product_env, cloudinaryDomain: config?.cloudinary?.baseUrl, cloudinaryTransforms: config?.cloudinary?.transforms }))
212
- : _jsx(_Fragment, {}) }), _jsxs("div", { className: "grid-s4-e11", children: [_jsx("div", { className: "pixCartItemHeader", children: _jsx("span", { children: thisItem.itemURL
212
+ : _jsx(_Fragment, {}) }), _jsxs("div", { className: "grid-s4-e11", children: [_jsx("div", { className: "pix-cart-item-header", children: _jsx("span", { children: thisItem.itemURL
213
213
  ? _jsx("a", { href: thisItem.itemURL, target: thisItemTarget, rel: "noopener noreferrer", children: _jsx("h2", { className: "", children: thisItem.itemTitle }) })
214
- : _jsx("h2", { className: "", children: thisItem.itemTitle }) }) }), _jsxs("div", { className: "pixCartItemDetails grid12", children: [_jsx("br", {}), _jsxs("div", { children: [_jsx("b", { children: "Item ID: " }), thisItem.itemID] }), _jsxs("div", { children: [_jsx("b", { children: "Quantity: " }), thisItem.itemQuantity] }), _jsx("br", {}), _jsx("div", { children: _jsx(FormButton, { className: "pixCartButton", type: "button", id: `btn-rm-${thisItem.itemID}`, text: "Remove Item From Cart", onClick: () => removeFromShoppingCart(thisItem) }) })] })] }), _jsx("div", { className: "grid-s11-e13", children: _jsx("div", { className: "pixCartItemPrice", children: formatAsUSD(thisItem.itemCost) }) })] }));
214
+ : _jsx("h2", { className: "", children: thisItem.itemTitle }) }) }), _jsxs("div", { className: "pix-cart-item-details grid12", children: [_jsx("br", {}), _jsxs("div", { children: [_jsx("b", { children: "Item ID: " }), thisItem.itemID] }), _jsxs("div", { children: [_jsx("b", { children: "Quantity: " }), thisItem.itemQuantity] }), _jsx("br", {}), _jsx("div", { children: _jsx(FormButton, { className: "pix-cart-button", type: "button", id: `btn-rm-${thisItem.itemID}`, text: "Remove Item From Cart", onClick: () => removeFromShoppingCart(thisItem) }) })] })] }), _jsx("div", { className: "grid-s11-e13", children: _jsx("div", { className: "pix-cart-item-price", children: formatAsUSD(thisItem.itemCost) }) })] }));
215
215
  }
216
216
  /**
217
217
  * CheckoutItems — Display a checkout summary with itemized lines and shipping information.
@@ -338,7 +338,7 @@ export function CartButton(props) {
338
338
  MicroInteractions({ cartpulse: false });
339
339
  }
340
340
  }, [cartCount]);
341
- return (_jsx("div", { className: "pixCart", children: _jsxs("button", { className: "pixCartButton", type: "button", id: "pixCartButton", onClick: () => window.location.href = props.href, children: [_jsx(SmartImage, { src: "/images/icons/cart-icon.png", title: "View Shopping Cart", alt: "View Shopping Cart", cloudinaryEnv: config?.cloudinary?.product_env, cloudinaryDomain: config?.cloudinary?.baseUrl, cloudinaryTransforms: config?.cloudinary?.transforms }), _jsxs("span", { children: ["\u00A0", `(${cartCount})`] })] }) }));
341
+ return (_jsx("div", { className: "pix-cart", children: _jsxs("button", { className: "pix-cart-button", type: "button", id: "pix-cart-button", onClick: () => window.location.href = props.href, children: [_jsx(SmartImage, { src: "/images/icons/cart-icon.png", title: "View Shopping Cart", alt: "View Shopping Cart", cloudinaryEnv: config?.cloudinary?.product_env, cloudinaryDomain: config?.cloudinary?.baseUrl, cloudinaryTransforms: config?.cloudinary?.transforms }), _jsxs("span", { children: ["\u00A0", `(${cartCount})`] })] }) }));
342
342
  }
343
343
  /**
344
344
  * ViewItemDetails — Button to navigate to an item detail page for a given item ID.
@@ -353,7 +353,7 @@ ViewItemDetails.propTypes = {
353
353
  itemID: PropTypes.string.isRequired,
354
354
  };
355
355
  export function ViewItemDetails(props) {
356
- return (_jsx("div", { children: _jsx(FormButton, { className: "pixCartButton", type: "button", id: `btn-item-${props.itemID}`, text: "View Item Details", onClick: () => window.location.href = `${props.href}/${props.itemID}` }) }));
356
+ return (_jsx("div", { children: _jsx(FormButton, { className: "pix-cart-button", type: "button", id: `btn-item-${props.itemID}`, text: "View Item Details", onClick: () => window.location.href = `${props.href}/${props.itemID}` }) }));
357
357
  }
358
358
  /**
359
359
  * AddToCartButton — Button that adds an item to the shopping cart and displays a confirmation modal.
@@ -380,7 +380,7 @@ export function AddToCartButton(props) {
380
380
  props.handler(props.item);
381
381
  handleModalOpen(e.nativeEvent, "-" + props.itemID);
382
382
  }
383
- return (_jsxs("div", { children: [_jsx(FormButton, { className: "pixCartButton", type: "button", id: `btn-add-${props.itemID}`, text: "Add to Shopping Cart", onClick: (e) => handleClick(e) }), modalContent && _jsx(Modal, { modalContent: modalContent, modalID: "-" + props.itemID })] }));
383
+ return (_jsxs("div", { children: [_jsx(FormButton, { className: "pix-cart-button", type: "button", id: `btn-add-${props.itemID}`, text: "Add to Shopping Cart", onClick: (e) => handleClick(e) }), modalContent && _jsx(Modal, { modalContent: modalContent, modalID: "-" + props.itemID })] }));
384
384
  }
385
385
  /**
386
386
  * GoToCartButton — Button that navigates the user to the shopping cart page.
@@ -395,5 +395,5 @@ GoToCartButton.propTypes = {
395
395
  itemID: PropTypes.string.isRequired,
396
396
  };
397
397
  export function GoToCartButton(props) {
398
- return (_jsx("div", { children: _jsx(FormButton, { className: "pixCartButton", type: "button", id: `btn-cart-${props.itemID}`, text: "Go to Shopping Cart", onClick: () => window.location.href = props.href }) }));
398
+ return (_jsx("div", { children: _jsx(FormButton, { className: "pix-cart-button", type: "button", id: `btn-cart-${props.itemID}`, text: "Go to Shopping Cart", onClick: () => window.location.href = props.href }) }));
399
399
  }
@@ -2,56 +2,56 @@
2
2
  ========== SHOPPING CART ===========
3
3
  ======================================== */
4
4
 
5
- .pixCart {
5
+ .pix-cart {
6
6
  --do-nothing: true
7
7
  }
8
8
 
9
- .pixCart .callout-header {
9
+ .pix-cart .callout-header {
10
10
  text-align: left
11
11
  }
12
12
 
13
- .pixCartItems {
13
+ .pix-cart-items {
14
14
  text-align: center;
15
15
  }
16
16
 
17
17
  @media screen and (max-width: 480px) {
18
- .pixCartItems {
18
+ .pix-cart-items {
19
19
  padding: 20px;
20
20
  }
21
21
  }
22
22
 
23
- .pixCartItem {
23
+ .pix-cart-item {
24
24
  border: 1px solid #DDD;
25
25
  text-align: left;
26
26
  padding: 20px 5px !important;
27
27
  }
28
28
 
29
29
  @media screen and (max-width: 480px) {
30
- .pixCartItem {
30
+ .pix-cart-item {
31
31
  text-align: center;
32
32
  }
33
33
  }
34
34
 
35
- .pixCartItemHeader {
35
+ .pix-cart-item-header {
36
36
  margin: 0 auto;
37
37
  }
38
38
 
39
- .pixCartItemHeader h2 {
39
+ .pix-cart-item-header h2 {
40
40
  font-size: 1.25em;
41
41
  font-weight: bold;
42
42
  }
43
43
 
44
- .pixCartItemPhoto img {
44
+ .pix-cart-item-photo img {
45
45
  padding: 10px 0;
46
46
  width: 100%;
47
47
 
48
48
  }
49
49
 
50
- .pixCartItemDetails {
50
+ .pix-cart-item-details {
51
51
  padding-bottom: 10px;
52
52
  }
53
53
 
54
- .pixCartItemPrice{
54
+ .pix-cart-item-price{
55
55
  font-size: 1.5em;
56
56
  font-weight: bold;
57
57
 
@@ -89,9 +89,9 @@
89
89
 
90
90
  /* ===== SHOPPING CART SHIPPING FIELDS ===== */
91
91
 
92
- .pixCartButton,
93
- .pixCart .pixCartButton,
94
- #pixCartButton.pixCartButton {
92
+ .pix-cart-button,
93
+ .pix-cart .pix-cart-button,
94
+ #pix-cart-button.pix-cart-button {
95
95
  font-size: 1.1em;
96
96
  font-family: Verdana, Geneva, sans-serif;
97
97
  color: #000;
@@ -110,19 +110,19 @@
110
110
  margin: 5px auto;
111
111
  }
112
112
 
113
- .pixCartButton:hover,
114
- .pixCart .pixCartButton:hover,
115
- #pixCartButton.pixCartButton:hover {
113
+ .pix-cart-button:hover,
114
+ .pix-cart .pix-cart-button:hover,
115
+ #pix-cart-button.pix-cart-button:hover {
116
116
  color: #369;
117
117
  text-decoration: underline;
118
118
  }
119
119
 
120
- #pixCartButton.pixCartButton {
120
+ #pix-cart-button.pix-cart-button {
121
121
  width: 80px;
122
122
  min-width: 80px;
123
123
  height: 30px;
124
124
  }
125
- #pixCartButton.pixCartButton img {
125
+ #pix-cart-button.pix-cart-button img {
126
126
  width: 20px;
127
127
  }
128
128
 
@@ -17,14 +17,14 @@ form button {
17
17
  border-radius: 5px;
18
18
  }
19
19
 
20
- .displayVertical,
21
- span.displayVertical:last-child,
22
- span.displayVertical:last-of-type {
20
+ .display-vertical,
21
+ span.display-vertical:last-child,
22
+ span.display-vertical:last-of-type {
23
23
  display:block;
24
24
  margin: 1px 5px 20px 20px !important;
25
25
  }
26
26
 
27
- span.displayVertical {
27
+ span.display-vertical {
28
28
  display:block;
29
29
  margin: 1px 5px 1px 20px !important;
30
30
  }
@@ -17,7 +17,7 @@ const setupInputProps = (props, display) => {
17
17
  // Remove props that shouldn't go to DOM
18
18
  inputProps = Object.fromEntries(Object.entries(inputProps).filter(([key]) => !['display', 'label', 'listItems', 'validate', 'options', 'parent', 'text', 'checked'].includes(key)));
19
19
  // Set className based on display mode
20
- inputProps["className"] = (display == "vertical") ? "displayVertical" : "";
20
+ inputProps["className"] = (display == "vertical") ? "display-vertical" : "";
21
21
  // Handle controlled vs uncontrolled inputs properly
22
22
  // If value is provided, use it for controlled behavior
23
23
  // Otherwise, use defaultValue for uncontrolled behavior
@@ -510,7 +510,7 @@ function FormRadioOption(props) {
510
510
  };
511
511
  // If there is no parent onChange (no updater), render uncontrolled via defaultChecked
512
512
  const controlProps = parentHasOnChange ? { checked: isChecked } : { defaultChecked: isChecked };
513
- return (_jsxs("span", { className: props.parent && props.parent.display == "vertical" ? "displayVertical" : "", children: [_jsx("input", { type: "radio", id: `${props.parent?.name}-${props.value}`, name: props.parent?.name, value: props.value, ...controlProps, onChange: handleChange, required: !!(props.parent && props.parent.required), ...inputProps }), _jsx("label", { htmlFor: `${props.parent?.name}-${props.value}`, children: props.text })] }));
513
+ return (_jsxs("span", { className: props.parent && props.parent.display == "vertical" ? "display-vertical" : "", children: [_jsx("input", { type: "radio", id: `${props.parent?.name}-${props.value}`, name: props.parent?.name, value: props.value, ...controlProps, onChange: handleChange, required: !!(props.parent && props.parent.required), ...inputProps }), _jsx("label", { htmlFor: `${props.parent?.name}-${props.value}`, children: props.text })] }));
514
514
  }
515
515
  /**
516
516
  * FormCheckbox — Render a set of checkbox inputs from provided options and manage selection array.
@@ -597,7 +597,7 @@ function FormCheckboxOption(props) {
597
597
  props.parent.onChange(newChecked);
598
598
  }
599
599
  };
600
- return (_jsxs("span", { className: props.parent.display == "vertical" ? "displayVertical" : "", children: [_jsx("input", { type: "checkbox", id: props.parent.name + "_" + props.text, name: props.text, value: props.value, checked: isChecked, onChange: handleChange, ...inputProps }), _jsx("label", { htmlFor: props.parent.name + "_" + props.text, children: props.text })] }));
600
+ return (_jsxs("span", { className: props.parent.display == "vertical" ? "display-vertical" : "", children: [_jsx("input", { type: "checkbox", id: props.parent.name + "_" + props.text, name: props.text, value: props.value, checked: isChecked, onChange: handleChange, ...inputProps }), _jsx("label", { htmlFor: props.parent.name + "_" + props.text, children: props.text })] }));
601
601
  }
602
602
  /**
603
603
  * FormButton — Render a standard HTML button used for form actions.
@@ -40,14 +40,14 @@ export function PageBuilderUI({ apiEndpoint = '/api/pagebuilder' }) {
40
40
  setSelectorKey(prev => prev + 1);
41
41
  setEditableComponent({});
42
42
  }
43
- return (_jsxs("div", { className: "row-2col", style: { gridTemplateColumns: "1fr 3fr", alignItems: "start" }, children: [_jsxs("div", { className: "gridItem", children: [_jsx(PageSectionHeader, { title: "Component Editor" }), _jsx(SaveLoadSection, { pageData: pageJSON, onLoad: handleLoadPage, apiEndpoint: apiEndpoint }), _jsx(ComponentSelector, { setEditableComponent: setEditableComponent, parentPath: selectedPath || undefined, editMode: editMode ? {
43
+ return (_jsxs("div", { className: "row-2col", style: { gridTemplateColumns: "1fr 3fr", alignItems: "start" }, children: [_jsxs("div", { className: "grid-item", children: [_jsx(PageSectionHeader, { title: "Component Editor" }), _jsx(SaveLoadSection, { pageData: pageJSON, onLoad: handleLoadPage, apiEndpoint: apiEndpoint }), _jsx(ComponentSelector, { setEditableComponent: setEditableComponent, parentPath: selectedPath || undefined, editMode: editMode ? {
44
44
  component: editMode.component.component,
45
45
  props: editMode.component.props
46
46
  } : undefined }, selectorKey), _jsx("br", {}), _jsx(ComponentPropertiesForm, { editableComponent: editableComponent, onSubmit: handleAddWithReset }), editMode && (_jsx("div", { children: _jsx("button", { onClick: cancelEdit, type: "button", className: "button", style: {
47
47
  background: '#FFA726',
48
48
  color: 'white',
49
49
  transition: 'all 0.2s ease',
50
- }, onMouseEnter: (e) => e.currentTarget.style.background = '#FB8C00', onMouseLeave: (e) => e.currentTarget.style.background = '#FFA726', children: "Cancel Edit" }) }))] }), _jsxs("div", { className: "gridItem", children: [_jsx(PageSectionHeader, { title: "Page Preview" }), _jsx("section", { id: "preview-section", children: _jsxs("div", { className: "section-container", children: [pageJSON.components.length > 0 ? (_jsx(PageEngine, { pageData: pageJSON, editMode: true, selectedPath: selectedPath, onEditComponent: handleEditComponent, onSelectComponent: handleSelectComponent, onDeleteComponent: handleDeleteComponent, onMoveUp: handleMoveUp, onMoveDown: handleMoveDown })) : (_jsx("p", { style: { color: '#666', fontStyle: 'italic', padding: '2rem', textAlign: 'center' }, children: "No components yet. Start by selecting a component above and adding it to your page." })), _jsxs("details", { style: { marginTop: '1rem' }, children: [_jsx("summary", { style: { cursor: 'pointer', userSelect: 'none' }, children: _jsx("strong", { children: "Page JSON" }) }), _jsx("pre", { style: {
50
+ }, onMouseEnter: (e) => e.currentTarget.style.background = '#FB8C00', onMouseLeave: (e) => e.currentTarget.style.background = '#FFA726', children: "Cancel Edit" }) }))] }), _jsxs("div", { className: "grid-item", children: [_jsx(PageSectionHeader, { title: "Page Preview" }), _jsx("section", { id: "preview-section", children: _jsxs("div", { className: "section-container", children: [pageJSON.components.length > 0 ? (_jsx(PageEngine, { pageData: pageJSON, editMode: true, selectedPath: selectedPath, onEditComponent: handleEditComponent, onSelectComponent: handleSelectComponent, onDeleteComponent: handleDeleteComponent, onMoveUp: handleMoveUp, onMoveDown: handleMoveDown })) : (_jsx("p", { style: { color: '#666', fontStyle: 'italic', padding: '2rem', textAlign: 'center' }, children: "No components yet. Start by selecting a component above and adding it to your page." })), _jsxs("details", { style: { marginTop: '1rem' }, children: [_jsx("summary", { style: { cursor: 'pointer', userSelect: 'none' }, children: _jsx("strong", { children: "Page JSON" }) }), _jsx("pre", { style: {
51
51
  maxHeight: '400px',
52
52
  overflow: 'auto',
53
53
  fontSize: '0.875rem',
@@ -19,9 +19,9 @@ export async function listContentfulPages(config) {
19
19
  // Map management-style config to delivery apiProps for the CDN-based read helper
20
20
  const apiProps = {
21
21
  base_url: 'https://cdn.contentful.com',
22
- space_id: config.spaceId,
22
+ space_id: config.space_id,
23
23
  environment: config.environment || 'master',
24
- delivery_access_token: config.accessToken,
24
+ delivery_access_token: config.delivery_access_token,
25
25
  };
26
26
  const result = await getContentfulEntriesByType({ apiProps, contentType: CONTENT_TYPE });
27
27
  if (!result || !Array.isArray(result.items)) {
@@ -46,9 +46,9 @@ export async function loadContentfulPage(name, config) {
46
46
  // Use delivery API for reads
47
47
  const apiProps = {
48
48
  base_url: 'https://cdn.contentful.com',
49
- space_id: config.spaceId,
49
+ space_id: config.space_id,
50
50
  environment: config.environment || 'master',
51
- delivery_access_token: config.accessToken,
51
+ delivery_access_token: config.delivery_access_token,
52
52
  };
53
53
  const result = await getContentfulEntriesByType({ apiProps, contentType: CONTENT_TYPE });
54
54
  if (!result || !Array.isArray(result.items) || result.items.length === 0) {
@@ -1 +1 @@
1
- pxl:v1:4cafcdfc486273b5291aa952:a56d5142b18338e2a3419627c0fc4d80:bd4ba14fbe5adcc35537a30c250c48bd82adf8cb6b602fc645da59e39daf913952c2c091d10624182b38166dc88e28e1be616f7a2a6106e0a72329cf12ca1527a1837ec50a556bff7d9d93fe416978950f5270ac26f8eb36d833f185e0ef9282c735a5d84f65a8eaf7c7b95a38206998952b77204d82417d380c28dad7ac8802c6b8a68025c44b6d8402761df93273dfab5a5b6051d52d267bfef6a353b7c1a3bce8ba3e6e4ca1d6195537fef7b74cf4d631f65fdb1702019e531c16513309885bdb0bf99a9acd2cf8a8ab84c8cbbeb2c20bc0653f2da6a465e4eaed11ed7b59e75a7d7e735fa6bede92115646382c7f238684c08fb8beea0a4c215f005f47cbdc9041f1dee79b625495ba4e5cc693c3988b9122c46bd1ca65363d65b30b0ee99b05af6b3c653597dac3f1d1db5c9fbb3ccd53a3c432913211e10d5cec4338e0b48b8380f2be0f3e34aff764d334d334926b6d97192b12b768642a55d3d8af298672717f89e198952deb50282f1ef55c2a4cd7c34d1eabe92df783e1b0a39bcdf5977b8668f62b0b10aaf4c08efd80172e5f07272464d47bc3ed326974cc45ce295c4eb1c099450b14938493a7220231eebc6a26e8abba4bbe1e3e4b937e3220abeca0d5ba9ab9f9cea409914f812ee780b1aaa919bb6160e9372a422d4174a18fa07da05543e3d407f9cc5c14f2bf12b1c4c1e73d9cd31039eaa42bbc41c07646c5be721d1f07eb29a6005a28eafeef43c2b7ccfaddf3db498a7b8429df75772826935db24ac0f3f9c586087e92080bfca691b98273824c51347415c84a82f681d91a38d6ab1bbc7ab65e1661633c2b5b7f768bf3145bf498fa443008b17ae7025b39a4b45898e3781d0bbfcd57670e07b4e67d2b6e14b970c0d82c48fc07b76254e6c68008131159b69eb6a90d29fb818fe5cd1bbbb38c927abbed03e9101cd8aa4ff62c051497df91c11d6b7770e8788c241e6f8046226596fcdb79022bdb68926f4adf567d3c9ddf462b57c30154f9c9cde588377819db6be4b8436a1b78ba10b08e795aae4f21593c083f7fa3d0dc8992c66ba5ea4933a5e8ec24421a2f33e334957eed81de8dfddce307b464fbc37c9053b83d8a499937fa6b6a32559c62e0cdd35a41e0d9442b857a050fb56922d52ceeda1ba9c2ab96c2cfb54dd014ad6ade298ade7be8e2eda1c809e429a4a4ea296bbb5d9b475f0c51f4ce2982d54ed5ea1c13b193a89a2a9cacab91ccff98c74312a057e5ba911796e7b14f0d0ac8506eb9c958ee7fec575984394b9920cbf1a21f77a02f518f03a5cf950dfcc000adff9757ddfb447377464912eacbcd8f5be50b3944c01062aa01c5c1b36198f7b8c75f53cf754c896e73cd1a0a8102fabb1e10815faafd556705c219c081a6e6e1803639789cadad8e24f6d3ed5b519936eecc806e8d0a793a761b2aeba0b0fe4fe216d7fb18fe716320348c717356306570bd6b6070e59111236171ce49e17c4f3953ac856b172887d0fcbc88d3633bfb69925c0029bfcfd73551667f2017ed274e4c86d7ec6673346965368e47e1b71b4775a8a03aefd99c15d5ae484eeae9dc5ced38e40deae11eff719928347535d661ea2923d0ff7100729d09e1af25522719b3ef4bbbb8765015a733c8e2f1410f99807eec19f8dfd6db414de4b3910ec4475fd7005bdffba9965070beaad022b05980e661e4cf1bcdecb7f0ba654e706ca01bbeb1368b8402f14ae93818d76d35b80b28a32157fc12d12b3e053650d13a74c405ab1dbe5e940ea9e5c7b22143528007db5fef88758b5cd03e219318bb787d61ffef11d09c674c05d594671a3e86ed4fddadd609f02999bb02a57b26b05607895f1ec5e4eb03c98da499b9acfd357ca2497c440800b8e5fb8b2f9b54490f6a77f582ff69602e5dad99f46c556aadfe66d9df2fda8cbd887f31082ba9daa18774eaf7b28048ed0cddaf2f5c73f65b4cdaefa7d1c0e93ecfec983bb07a9aa3bd62ce4f387bd2947ecced921f43523559b0e847c3e0d88ce55cecdc2b1eb17a2d2de24e3817e0ab77f1b463106d51c9aaa05bbb4d52b9d89649fca7bc8545451a241d64ff141697c22aaa67b54de79eee22987ae2673b6e82f92360a1fca99ff122ccdb64597632a742b97592a8c0136f6c3aeaaec49db657d66dbdee72d711e716718122b527b88a242f2481fcb97a3403d54d85c3c42bb4a14b7bb785f4f2db48ec38a1721789e03e2f75bf9d8ad5134f5afeaa802a8c61166b75d7e1b96a928fb3f20d963f4235bae1bb8553453cdbf1c27fbcfb913566565595c8bf7a16d0aba8d5be63e08e79505191151da3eb8328bf6687c351e27e1f61621e3eaaa7784c4fd55fb62e9d33804328c59e749af71bc3248e17762e9095e6192a39e1afda1e07fe2f6b05d457e7ce7b0cecdeaf087efa61e2c4ed4cde9f46692d7719305dba811080ec56d35e6207e3a3796aabe02c89c8b1d7c749cbff0292f555a18e4fbbd5457e1c2aa4f9c63987fea066d37f0c3bd642914f0030bc72bcec5fbaf9d445b9a36b5638cc1af5dffd9dc8cd395f92a2d5b44c4d261bc2fe1bd1fff5d9e60f58c99d20a57be20c081ec1d37ea7f5a7017459cb68e27aad952c3d3b6a4b10b34cac652a12fdc293c3c5d626a87f9c4f65eb89a1c01db3c8f340ff0e5bbbed5fb2453d934821847b7cedd83b8e7761a427fc167f501880cb3402daf3156247e9b237bb0c2a37ced4516102897e6e9ac939d797cf8e35efac71ab6e93100d35450822e0bd17dbd5077cb278958d2202c8a5536b079e95884d2072f72d6ca20a6af87f276863f47e729c886e1340a8274263c099329cf2b663ccb86a41c4c0eb32dc0d0d700832dc51af47adb36b15eb7976caceb128ffb3a46411878dac1f281e878a32df401c1b8f7efb77f77d8124b1a2dc11cbb3e7bf31d1076773d13ad6e5d878fe9d95b36814623200eb229ba307ae8dc2aebedcbc624351e9d23fc7e1e0e90b458ea1993122a2b3d3160a62f860a45d08e54b61129aa6d8b98137163e9096fb4da1f58c9c845ba6e4386672cb868c41686d2a1897b0fb0f6a0c337b23d62184200251298072dabae257a8d67e9123b8fab4eaba775ce65b1526b157c6775f7505315f68219fa099c91161db70b153f303134903a6e1fec9525c01c1be44589e9fa95a57c2c8def7cc0a9d8f971e26526c62bb95927f2f7c96d443c0008229af21f2efcb5a9eb9e0051bbddc6e143430ac02a35ab899f2ef1b81db3aa86143b3dc1b42b426dcfb70065d3b265a5984864ae5515ae2250b0d96a38cd548fed9684a02c6227ec5fe37e1fc710961b87dd50ce01d8858eeefc7734f98bf2669572a5dc0b98210400cdb84b5f5c95d5dfc2e2988f8886c340ddc5f0d22325473af8ab2c7a9ab3ad0e8a74b855381edf66d9f6a516df51af3e7ea07a482c488e0b7b08f4b1be0d9840b35e3043336792cf69c068fa8044e76b5a3b05c4b879de2830ff2f0628f566850ec11c0095bd7fbe9f6de449a3087f809c3fa1a12d9ad307e80904778b645b26ae26a0d168b1153aca36f427fea1c22be0d464ef6a7f924595231fcda031bd791020b4348bbd0a735147f99cf95f6d0013dff3c9a827d62d581fccd998c103e6f99ae4be7cb24d5ebf05cb534a403a112eba587dbac95ef981d5745dd23b4551b3a7a71e1ea896c43c4bcc567ec06917548c87d82f6ba6a3e0722eab1a975033a5bce6abd7fa28b815c84601ca2b2ead6d0fce2562252b0dfb1def66afc9c4e3a8f0569b5a3e7e21f6b4690ab538d4e1a30a47417859f596c1f240625d05aa3314027c4a46e1c7c333ca010e69631a5e6edd45d013edde553dab4333fff66a3c79bd683337e74bea1ba0c851d3c200f9aba5ce0876713639ba2cb17c2cc754e8b3f5140691b3663a00ee94869a16191fbe8e1955a2050364abe90939321ce14cabf2e58611474cd2d59fd6f92705a8f50348297edafd798ccb010713c940dad5fb40bcd15b7ea2950a3def71b0998b9383cb85d04bea7b4b14b6e518931f5e33191e1cfb028049d4353eca1b2abae38fe6f7df3da6a0b3503b092a4b8adb2775f453a3f7b4349dea4220077db5f5370aa7479eb7298d831794518ca721fc62babd8e6b4dfb577e9f72b1a3da9542bc8ba6f27fb5140f495d7678ed14883d7fc6c68ff1b4de9f059f5ee049cf50568e679c6f1a34f1edb77fa6f7e6c2cd63482a3d1e3a3b16d00f1d0edb8c72afbcbcebeb80c13c7a6fd5d9cfc1ec521df9529a1e0c4a3b6e044bdf56741b397cf49fd40dc741f24cbb60c7fad2cfdf4e9094aa18b254f54aff303ce8a0dee2e092e55517bc9776339fd8a3f6fdb82002fb9433eb9972df58a9c44666c7eae475a27a6717b0e40ab3e79f5721b3a75d5008a1c483096a6fac0087d3e00628a2e6b0a6ab4325b831547adcd2a7cf7827ae0abc647fd4e2404b3f65a714bf370b0ae9f6f7fc2a6de136258763a3760cba08f7522bf09306cb5ed8028c71a7feb00b2133bd6b3ab21a5118ccd349d503ca0097856ce40543b14e0af2d5f07c0998cb68bbcc21177cdb86d137ff33e67cfabea51c9dfe6e396d7b3368e3ed2392e72160a88c9cf3a8effdb20c51672c74639abad7a441e3714f0ae3bcb52390981c71c9e4d68b6b025b7d9212993e294762589f6707deb30a43e12b2457789024545c0a8ccecdd0764bedb73d6b50aaef3d661d7cc186c9975907da701c4ad5641f59c404cd5553d87200c2ddcbab819f8ad99802eba8f0861df135d4d017a17c5be09be0c062a0d25f008d0f0f336f7afca592135903e72c1a9c3237affae7fa718b9b9efd114cacb8650fa669569dcf03274bae6f0621deb3c26441fb665723543054b587aa6a5a802642a46681ad40ba7823e6292e193ff4d7cddf18028fa883fba7d050797d5c5250666869bbd528bcce34aaf8e479c3e72e12c54a92ec6c4f82902de30b0560b4877a8ffdc62b90bea531cbfbb0e496e9b392113bd667b615674a645dbf27f3d4dd590549745886d9f9a63c5e93daea20fc6742aab62bceff1401e36b8953860271b17d494f661a5ca7b8463d05a84870b85bdbd9b9a04e8d09cf18da76902cd8e51e4c14012e7807d68a53a60c053a23cee570e93ec50cfc00619dcdc132f842cfdf17b0f9bb79979f7e5f7
1
+ pxl:v1:a83c395fd77995d9628186d5:4c69b862c4abd6fdd5cd328cabdd434d:359d004e4dfc32eaa2e418ca4fa9519ba2299219b38c3620770020ee92234f10e477cc64b4bd4991384e8b9184fe4f346c66be7bdba183e607497c1e87b3675f2a8dc4b8b58fc1d7476c79df110d9d35be67546ceec60cd6fdd9034d4de8a2c087ca31d85963d3dff02e39a5265290fc0f68a0a9981f4fa47563d1161d16e63e41c42291c801998e44d36c9caa27e783c2999a59f487142c0bc2fedd11cc6ce0eb81f4b81382e4d63ec91d0f34d46901a2b1accccb09ca70cbce15fcc647280c1748fb0581eb32d0aad6b2420904639b6fe55ee87215c45f702c0129bd3b1cd60175a4d082207210c9c97f1ed45b0ecadbdcf2b93f50a350a30b7b114bb4b50a68e79ca98d1b420b7523aa7457709fbaa823be382561378bb30728f3f8f1879ae172d7ee80d080c8101320f45e56b46f495edac9770ebb9b298d80a5d585c3eddb107820e5894e356960aa8ccbe599d01af5fede2c616d3370a1c0f52dffad3756011933cefc393c65a3d38a15203b6dcaae1320b77fa65604863d9d41418db9ccd65d61518216d3bb1b382a72b226c36a77a4ba477f1579e8339c55dcfc80e18f12c82ad13f926ff62532c5392ec542ee81e8859c6165f71cd026553a968d0653a80d6998504cb0a7a5065aea112d09e3fb3c0eeb1ead35af8a8c58df0add7af9279c3f8d763130be2a62e98f0a0432a1632ec46e5dce97cab5918043da0838b1a33c827a64ca892f91555a6b5db2360b36987b0a6ab150d48404a0fafe0c6c4f528d10beae265ac16c8e603d40e5767b20ad5a079645a31a741ae8f3f9e99093c4ba2a17bfd5429ed7c167f9f7f40df7e83d18c8537d4608fcbf2259aeeb0045c605971afdd6618f780fcdf62c5edcee550e263918f0687ca24bae903565b3e00f3a7c36d8049d4df757bd711e151d1be99c7ffbb9cbafb91dd89a8520bca0e65f6d9e5d4af592d28899aa3adf66644f898eddfa899bed91cc2d20f820153b4703226383c071c04019f3f211e8c8ba2ac983fa20e0c521b39783adee0e39513afcc2687ca22ad52b847975db930514dfbc8ed477deff8dc233a823d0f1e108a088857509ae5f5d9e08c5b6b2a4a28de8fe4ca145cf4e2eefb600c0c609a003b968b9fe0751ad2ea536e530781ef87941ea06d45e5f5d05990162246be63453898d643bb794cc02481aa45e4f68c3f8b17fa2b90f4d76a31ab52fde3c0eb1911be160ba453422dedbac20e513b68098ba2ab01cb500b8b65b1f2afb9524ea83c96de7ca89fbbea7dbed9b34f2e827fcbc6abd6c98b706ba9fbbd9da9fdd6ac1a2fa01e285e41b21540742a12b6296bded14cb62613b3182c3c05a746cdf3be5a24e4074030c4f40a25d04e89df14b6a75b13aa88aea56284baba967099dbca2bc26ceca1ad8b1d35e65c54a7ccabab586129e98900a243660471ce471cc1bf2fe249648b573340b4f982fc6c4adcc42403d37236b62f9eb43d9884e38da47a61b88d6d69ce7a9f6ce8ad8b18b002ae80d1e75cf53ae3166795719e912d0e678ed285b3dfca3fd770c91a3a75a4994047e4892568ed00da3f4dcc1f0b41804f566c98e81270dd9de9c195312162b3c20e8fcefa567df37cdc171c7098f48dc91d881163211acc407c99b130eded42ab63fe4db75c8f501eefda061744d146a51cebe939e78d5bd98e8cb2b08ebaec29d05ee63d3c14753cd74de489c9acbbd72492bbf67c321f1eda6198677bbf3b1caf31adb1625136c0a01e929156cfd1da12066890ae6f0002559a859d638cf229138feaa69b5c927aeb21aade659405026fa0bca87f96ddaa51b8f362179fb56b509c79f803537d859768fa7c32793f26069cee544e26a2868eb5a657578753dea0bedc41dff059305080b77c1e22c80f873585a77d6013d534dab91808bd0118ba618872bb5b1f5d3f27a6fbdcc49d00bec70cfc840547474a788298db556f2939e905f26f1bbf08975cd3c5162294ef0447b3726ed377e1d34fefb1fe24d16b0497780799679a84613a924afd2230b80d72889a974740be225c075c104f56e52bc485eb1cbfb64fe9c4e4ebf480665ef86789838c739e1e63aa592687bfe887e23d893b7c907717ffda9f78abdaa1c1a9f32a4f5d6add12896f11455f79a44346ddebe0b4fc38533c1c010219125db5dbc398ee71bbfb4d8b4af6e8fb0eb66e8ccefda3036b16162022b28a8f3472ba96da5a14ceb8e02f3d0b0ecde0c1fde97ad9f3a47c7f7abc7f12a3a43277cfad405883e37ff634601012b4a5ac1908e9363b06f2c6606d8f0d7283a7e63db07cf1ca406a475a733b54333cb6b3a2f90fc84d4cd7bd3675db480f1e6d696937f10331ccc62abae8341138ce0bd14d5fb209adce72a37b10b0e34bae248b00c676aa8e78ec1facfd8399af641cc7bb28eadadf45a43737417acdc754462a167d6e218f64569d136f9e0d89664b88da08722ebf43a6c4b95284560d1b207c297f68af454bce36a804cb75a85506c4915b12447d757f8dc4a073b2d64e9017d8b0e76f8037e42f321a1db23d6106c7f145a7cc8e7148292ab4aa80736711aa4da67fbe926b0202b8b09219b62f9d4a0427a8e2df93a11836c1c8e7fee14f58bf268853afdadfed31b2e1ec62b0b6d9d242c9617cfd90072e332f0dd35c8f10cc1aa304bf37a4412c9c13bf75496ce557efe3e5f60c93724b2cf0979ddfc2169a12e051894f2852c1c60bb9dd40c331b67838aee8031f6e490f9a611afd72db8622f67e3f40101fc68f36ca28544e8dba18dc138ae6d004f68df6aae85b81b6b4f6aa0ec0c01f351de4ff9d8599adde6464d9b2cbecf68ec253c29e4ca19af2e518f40773583c877c7faecfb75810d459487a94f9df15b281aa76f293921272628fd0ea2d3134049385e931a911b084c5b40a1467b93ff8bd38e69804168b072d4eb6735dbcbb9de2e30eab38b961f86db6fa6b370dc3d165ef5f152051340469d25590507f2bf341b8f8a98cfdf9eb107660aec537c40ab39e9f378ae706aaef0be751ae600c59fcb1ebc11a5e33d11dfa0b4441b4a733d20514b4c06c5aac99f524c4cf5c9316a448c5893aad716077194083e481fba82818d22d6bf22eda660359159a2fe09506340f19e6d52017a8971b65dec967c5d62adc6e4d1d148ac7530a690ba2911bc9192d42d72495afbba1ad26934dfba15caec289bff93f238273a63531313105d15ab4e14b1975511a12e1357177f5c3c86b2f11ad6affd273552c3c8dbeffca8d097489e7e14f8ab539ecc985dcf0ff27d3248fe04048aef6da97a8c228d03da4bae2c53581406991209fccb8e874e9f9ae2241a5181f2303a525d2fa2ea62d5bb44bd929d6267e7e5045123effb980c9f8bc76a851666af168d065c0f44574d421c91a7fda078769c09c0a69caa5e7f8b6f5dfe730ab8af669c3478bdae86f782738386a6c34ab55965ae2638ce47d58fb21412016298cb073eb36889f856760e3183bca02913bcc0a0309ae2a400aadbdb5b4b1bd28b64de1609313a200d223a2cc2c2e5129163fc817f15a85b020c275f61005baabd82c6b0786b8fdba201b68d822b12e1ffecc9ea17236662539149a2d1766f01e76d3322faf05f73960f6a945b7ff237d7eb37c55dd5b5578677b9483ca2cbba52101f77575b1508f3c46dca013164666fd8179f8d3e8c77a3fbf60f6baefd203943435c9d9bf098384079f4716d740111499fb284424aafae9bb1dd2d0376e869817f36594f507138d45b51a61ba27c735826c0d70b7217303f5c87e5e544e1dda9263d79ea62d7cdc6a82ac368074822248f9062dc6c2be91488e5b479c4b579cad9901ec0ee2cb20c87daa6a341b7345acafcefaf8ad85f9a8454576ee938ec13912972ff8384612580984d97b98438e658af82f7563dbddbb44c68caac3ef50202cdcb18f39036dc64214d006f46fc1fa7e8b1dc47342e0e6ff101206a3184ce7fcdba6c0d3b71fa63981668208b4522f8c28bf35228c6db41828287fa057cd7f6fe30f84d7b8e3fcb6e0e8b309e81abf5e5566798d5d69d9d32f170db58cac90a2af0d8371caec9caa6e7c8e833766968fe2a039a5e780c1948721bc05429cdfb57d489543012a293aa7c17f6482f8792092693b769e5ec1f7fa4dd334d8f94c5dde6e68d46d4008dd281cdd63028e77efae6089217ee0ab23b1655647c65951812c9d3942b7caf9e3f63f3e69c3820d240ff6dbf6bf44b8ca45a2f4af2819d00f0b9367d2cefe6785f8f5b52967b630587716911da1a6e36e3fe78031d97df2cf1048dbe5a2981bc95be373525c543b7a7b7a397f715325c13b786874eb215e91930e9701605f2abccb8b2fdda894cb2df33ce4a28754cb1ff64aaeeeb5ee02e5ecfc716a9cc0f76e3c6024213ab5d17093e2c75be690ba455bf9ce07c1027dfe6ae07fe7231aea220b1fb10b6d52f0b8843c0334dc5617e044223ed2c7466d678ff4e0fe081a73151e5a8955e5d36e2debc4322f509a20bc899292ae7ff59b0a622d563b6e8a32005d75acb33779daf687dd2fd347c1bfdd93251b3a7ec97922dc7793aa7d1da54832741e96397ca789d09ae5e48b77bd5c10a376c8979574c497e74ac30a84c7419293051ac9c3c627893c8533af95e6c1426a036b8bd84c431a16e0e2710d476ebc5345149535881228678c56d755903c6a9a8aff5edaa82537ae500f72b06a8c662c0ee78c9dd4576876ce057c76fe5ce23d0c05fd62c3d691f75c223e1e5c7b22b32f69b7735e476a47fc022cd4fe1bc3f5b25c5a9728705c0ae5703e5982ea17ab90739181bfebd28ad0f945b5c224450519c4d0178e53aae484fb2f98c38bfbd4caef11ee8216f0b2a706c3873fe6d835fc74d680285be9ca54d2b40fd8c7af9d1e6fe8b0a9a3c3dc70385e5c2125d09fe832ae8cdf94717bf43a7b60c0608d524f2b5c4cf7cf434510eee5cb8ad865dc0744ea30266104bdcc8251bb452ea3ea8dc7a4cb3fd987669dfd2e8246788127137aa9aa780c931a88612ef49ec81a0ce902bec24378845f0fd51e307fda316c3bc08c10255fd20367785285c12242fd0c2e6c287bd025226660a938c8d03ac8ff770a83f8d9734546e869d814ec025a2050f7ae935412401a5a1bcd6c16b40db4501a576428bea88072c50292481dd6c829501