@pixelated-tech/components 3.13.6 → 3.13.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -197,13 +197,13 @@ async function runAxeCoreAnalysis(url, runtime_env = 'auto') {
197
197
  }
198
198
  catch (err) {
199
199
  let injected = false;
200
- let lastError;
201
200
  // Try common local node_modules locations relative to process.cwd() and __dirname
202
201
  const possiblePaths = [
203
202
  path.join(process.cwd(), 'node_modules', 'axe-core', 'axe.min.js'),
204
203
  path.join(process.cwd(), '..', 'node_modules', 'axe-core', 'axe.min.js'),
205
204
  path.join(__dirname, '..', '..', 'node_modules', 'axe-core', 'axe.min.js')
206
205
  ];
206
+ let lastError = null;
207
207
  for (const p of possiblePaths) {
208
208
  try {
209
209
  if (fs.existsSync(p)) {
@@ -215,7 +215,8 @@ async function runAxeCoreAnalysis(url, runtime_env = 'auto') {
215
215
  }
216
216
  }
217
217
  catch (e) {
218
- // ignore local file read errors
218
+ // remember for diagnostics but otherwise ignore
219
+ lastError = e;
219
220
  }
220
221
  }
221
222
  // Last resort: require.resolve
@@ -232,7 +233,15 @@ async function runAxeCoreAnalysis(url, runtime_env = 'auto') {
232
233
  }
233
234
  }
234
235
  if (!injected) {
235
- throw new Error('Could not load axe-core via CDN or local inline injection');
236
+ // include the original CDN error as the cause so eslint's
237
+ // ``preserve-caught-error`` rule is satisfied. append any
238
+ // local load failure info to the message for diagnostics.
239
+ const msg = 'Could not load axe-core via CDN or local inline injection';
240
+ const errorToThrow = new Error(msg, { cause: err });
241
+ if (lastError) {
242
+ errorToThrow.message += ` (local injection error: ${String(lastError)})`;
243
+ }
244
+ throw errorToThrow;
236
245
  }
237
246
  }
238
247
  // Run axe-core analysis (poll across frames for availability after injection)
@@ -17,7 +17,7 @@ body:has(.hero.anchored-img) {
17
17
 
18
18
  .hero {
19
19
  width: 100%;
20
- height: 60vh;
20
+ height: 60vh; /* default */
21
21
  display: flex;
22
22
  flex-direction: column;
23
23
  justify-content: center;
@@ -80,3 +80,15 @@ body:has(.hero.anchored-img) {
80
80
  }
81
81
 
82
82
  }
83
+
84
+ .hero.video {
85
+ color: white;
86
+
87
+ video {
88
+ width: 100%;
89
+ height: 100%;
90
+ object-fit: cover;
91
+ z-index: -1;
92
+ }
93
+
94
+ }
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect } from 'react';
3
3
  import PropTypes from 'prop-types';
4
4
  import { SmartImage } from '@pixelated-tech/components';
@@ -17,23 +17,30 @@ import "./hero.css";
17
17
  * ANCHORED works as expected on desktop. mobile does not anchor and image is full size
18
18
  * ANCHORED-DIV works mostly as expected on desktop and mobile (only see the last hero image)
19
19
  * ANCHORED-IMG works as expected on desktop and mobile, but requires JS
20
+ * VIDEO TBD
20
21
  */
21
22
  Hero.propTypes = {
22
- /** Background image URL (required) */
23
- img: PropTypes.string.isRequired,
24
- /** Alternative text for the background image (optional) */
25
- imgAlt: PropTypes.string,
26
- /** ID for the hero section */
27
- imgId: PropTypes.string,
28
- /** Layout variant: 'static' or 'anchored' */
29
- variant: PropTypes.oneOf(['static', 'anchored', 'anchored-div', 'anchored-img', 'sticky']),
23
+ /** Layout variant: 'static', 'anchored' or 'video' */
24
+ variant: PropTypes.oneOf(['static', 'anchored', 'anchored-div', 'anchored-img', 'video']),
30
25
  /** Height for hero section (string like '60vh' or number) */
31
26
  height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
32
27
  /** Child nodes to render over the background */
33
28
  children: PropTypes.node,
29
+ /** Background image URL (required unless using video variant) */
30
+ img: PropTypes.string,
31
+ /** Alternative text for the background image (optional) */
32
+ imgAlt: PropTypes.string,
33
+ /** ID for the hero section */
34
+ imgId: PropTypes.string,
35
+ /** Video file URL (mp4/webm etc) when using the 'video' variant */
36
+ video: PropTypes.string,
37
+ /** Poster image to show before the video plays */
38
+ videoPoster: PropTypes.string,
34
39
  };
35
- export function Hero({ img, imgAlt, imgId, variant = 'static', height = '60vh', children }) {
36
- const id = imgId ?? imgAlt ?? img.split('/').pop()?.split('.')[0];
40
+ export function Hero({ img, imgAlt, video, videoPoster, imgId, variant = 'static', height = '60vh', children }) {
41
+ const id = imgId ?? imgAlt ?? img?.split('/').pop()?.split('.')[0] ?? '';
42
+ const hasVideo = variant === 'video' && !!video; // only play when variant explicitly video
43
+ // note: we don't validate in production – caller should pick correct props
37
44
  useEffect(() => {
38
45
  const parentContainer = document.getElementById("hero-" + id?.toString());
39
46
  const anchorImage = document.getElementById(id?.toString() || '');
@@ -55,17 +62,24 @@ export function Hero({ img, imgAlt, imgId, variant = 'static', height = '60vh',
55
62
  rootMargin: '0px',
56
63
  threshold: 0.0
57
64
  });
58
- if (variant === 'anchored-img' && parentContainer) {
65
+ if (variant === 'anchored-img' && !!img && parentContainer) {
59
66
  observer.observe(parentContainer);
60
67
  }
61
68
  }, []);
62
- if (variant === 'anchored-div') {
69
+ if (variant === 'static' && !!img) {
70
+ return (_jsx(_Fragment, { children: _jsx("div", { id: id, className: "hero" + (variant ? " " + variant : ''), style: { backgroundImage: `url(${img})`, height: height ?? '60vh' }, children: children }) }));
71
+ }
72
+ else if (variant === 'anchored-div' && !!img) {
63
73
  return (_jsx(_Fragment, { children: _jsxs("div", { id: id, className: "hero" + (variant ? " " + variant : ''), style: { height: height ?? '60vh' }, children: [_jsx("div", { id: id + "-bg", className: "hero-div-bg-img", style: { backgroundImage: `url(${img})` } }), children] }) }));
64
74
  }
65
- else if (variant === 'anchored-img') {
75
+ else if (variant === 'anchored-img' && !!img) {
66
76
  return (_jsx(_Fragment, { children: _jsxs("div", { className: "hero" + (variant ? " " + variant : ''), id: "hero-" + id?.toString(), children: [_jsx(SmartImage, { src: img, alt: imgAlt || '', id: id?.toString() || '', quality: 100, width: 4000, height: 3000, fetchPriority: "high", aboveFold: true, style: { height: height ?? '60vh' } }), children] }) }));
67
77
  }
78
+ else if (variant === 'video' && !!video) {
79
+ return (_jsxs("div", { id: id, className: "hero video", style: { height: height ?? '60vh' }, children: [_jsx("video", { src: video, poster: videoPoster || undefined, autoPlay: true, muted: true, loop: true, playsInline: true, className: "hero-video" }), children] }));
80
+ }
68
81
  else {
69
- return (_jsx(_Fragment, { children: _jsx("div", { id: id, className: "hero" + (variant ? " " + variant : ''), style: { backgroundImage: `url(${img})`, height: height ?? '60vh' }, children: children }) }));
82
+ /* If no valid variant or required media is provided, render an empty hero container with children (if any) */
83
+ return (_jsx("div", { id: id, className: "hero" + (variant ? " " + variant : ''), style: { height: height ?? '60vh' }, children: children }));
70
84
  }
71
85
  }
@@ -177,6 +177,7 @@ export function SmartImage(props) {
177
177
  transforms: newProps.cloudinaryTransforms ?? undefined,
178
178
  cloudinaryDomain: newProps.cloudinaryDomain
179
179
  });
180
+ // newProps.sizes = `${newProps.width}px`;
180
181
  if (!(newProps.sizes))
181
182
  newProps.sizes = `${newProps.width}px`;
182
183
  }
@@ -13,29 +13,20 @@
13
13
  ============ GOOGLE SEARCH ============
14
14
  ======================================== */
15
15
 
16
- .gsib_a {
17
- padding: 1px 8px !important;
18
- }
19
-
20
- .gsc-tabsArea {
21
- border-color: #336699;
22
- }
16
+ form.gsc-search-box {
17
+ max-width: 100% !important;
23
18
 
24
- .gsc-tabHeader.gsc-tabhActive {
25
- border-color: #336699;
26
- }
19
+ table td {
20
+ height: 15px;
21
+ }
27
22
 
28
- input.gsc-search-button, input.gsc-search-button:hover, input.gsc-search-button:focus {
29
- box-sizing: content-box;
30
- }
23
+ input.gsc-input {
24
+ font-size: 1.0em !important;
25
+ background: none !important;
26
+ }
31
27
 
32
- input.gsc-input {
33
- font-size: 1.0em !important;
34
- background: none !important;
35
- }
28
+ .gsc-input .gsc-input-box {
29
+ padding: 0px;
30
+ }
36
31
 
37
- .gsc-control-cse {
38
- border-color: transparent !important;
39
- background-color: transparent !important;
40
- padding: .5em !important;
41
32
  }
@@ -7,6 +7,7 @@ import { SmartImage } from '../general/smartimage';
7
7
  import { PageGridItem } from '../general/semantic';
8
8
  import { getWordPressItems } from './wordpress.functions';
9
9
  import { Loading, ToggleLoading } from '../general/loading';
10
+ import { CacheManager } from "../general/cache-manager";
10
11
  import "./wordpress.css";
11
12
  // https://microformats.org/wiki/h-entry
12
13
  function decodeString(str) {
@@ -14,6 +15,31 @@ function decodeString(str) {
14
15
  textarea.innerHTML = str;
15
16
  return textarea.value;
16
17
  }
18
+ const wpCacheTTL = 1000 * 60 * 60 * 24 * 7; // 1 week
19
+ const wpCache = new CacheManager({ mode: 'local', ttl: wpCacheTTL, prefix: 'wp_' });
20
+ /**
21
+ * getCachedWordPressItems — Fetch posts from the WordPress REST API with caching. Checks local cache first and returns cached posts if available and not expired; otherwise fetches from the API, stores in cache, and returns the fresh data.
22
+ *
23
+ * @param {string} [props.site] - WordPress site identifier (site slug or domain).
24
+ * @returns {array|undefined} Array of blog posts if successful, or undefined if site is not provided.
25
+ */
26
+ getCachedWordPressItems.propTypes = {
27
+ /** WordPress site identifier (slug or domain) */
28
+ site: PropTypes.string.isRequired,
29
+ };
30
+ export async function getCachedWordPressItems(props) {
31
+ const site = props.site ?? '';
32
+ if (!site)
33
+ return undefined;
34
+ const key = `posts-${site}`;
35
+ let posts = wpCache.get(key) || undefined;
36
+ if (!posts) {
37
+ posts = await getWordPressItems({ site });
38
+ if (posts)
39
+ wpCache.set(key, posts);
40
+ }
41
+ return posts;
42
+ }
17
43
  /**
18
44
  * BlogPostList — Render a list of WordPress posts. If `posts` are provided they are used directly; otherwise the component will fetch posts from the configured WordPress endpoint.
19
45
  *
@@ -22,6 +22,7 @@ getWordPressItems.propTypes = {
22
22
  export async function getWordPressItems(props) {
23
23
  const { baseURL = wpApiURL } = props;
24
24
  const requested = props.count; // undefined means fetch all available
25
+ const tag = `wp-posts-${props.site}`; // unique per site so we can invalidate fetch cache separately
25
26
  const posts = [];
26
27
  let page = 1;
27
28
  while (true) {
@@ -29,13 +30,19 @@ export async function getWordPressItems(props) {
29
30
  const number = Math.min(remaining || 100, 100);
30
31
  const wpPostsURL = `${baseURL}${props.site}/posts?number=${number}&page=${page}`;
31
32
  try {
32
- const response = await fetch(wpPostsURL);
33
+ // const response = await fetch(wpPostsURL);
34
+ const response = await fetch(wpPostsURL, {
35
+ // cache the HTTP response and mark it with a tag so it can be
36
+ // invalidated independently of the page cache.
37
+ cache: 'force-cache',
38
+ next: { revalidate: 60 * 60 * 24 * 7, tags: [tag] }, // revalidate once per week
39
+ });
33
40
  const data = await response.json();
34
41
  const batch = Array.isArray(data.posts) ? data.posts : [];
35
42
  if (batch.length === 0) {
36
43
  break; // no more posts
37
44
  }
38
- // Process Photon URLs in featured images
45
+ // Process WordPress Photon URLs in featured images
39
46
  const processedBatch = batch.map(post => ({
40
47
  ...post,
41
48
  featured_image: post.featured_image ? photonToOriginalUrl(post.featured_image) : post.featured_image
@@ -51,8 +58,53 @@ export async function getWordPressItems(props) {
51
58
  return;
52
59
  }
53
60
  }
61
+ // once we've fetched the posts we can also compare the "modified" date from
62
+ // the first post (which is the most recent) with a fresh timestamp obtained
63
+ // via getWordPressLastModified. if the header indicates a newer update than
64
+ // what we just fetched, bust the cache so future callers get the latest data.
65
+ try {
66
+ if (posts.length > 0 && posts[0].modified) {
67
+ const lastModified = await getWordPressLastModified({ site: props.site, baseURL });
68
+ if (lastModified && lastModified !== posts[0].modified) {
69
+ // our cached response is stale relative to origin
70
+ import('next/cache').then(({ revalidateTag }) => {
71
+ revalidateTag(`wp-posts-${props.site}`, {});
72
+ });
73
+ }
74
+ }
75
+ }
76
+ catch (e) {
77
+ // non-fatal, we already have posts and can return them
78
+ console.warn('comparison check failed', e);
79
+ }
54
80
  return posts;
55
81
  }
82
+ /*
83
+ * Retrieve the modified timestamp of the most recent post on a WP site.
84
+ * WordPress doesn’t support HEAD on the posts endpoint, so we fetch a single
85
+ * post and pull the `modified` field from the JSON payload. This is still
86
+ * very light-weight compared to fetching the whole collection.
87
+ *
88
+ * @param props.site - WordPress site slug or domain
89
+ * @param props.baseURL - Optional API base URL (defaults to WordPress public API)
90
+ * @returns the ISO modified string or null if unavailable/error.
91
+ */
92
+ export async function getWordPressLastModified(props) {
93
+ const { baseURL = wpApiURL } = props;
94
+ const url = `${baseURL}${props.site}/posts?number=1&fields=modified`;
95
+ try {
96
+ const res = await fetch(url);
97
+ if (!res.ok)
98
+ return null;
99
+ const data = await res.json();
100
+ const modified = Array.isArray(data.posts) && data.posts[0]?.modified;
101
+ return modified || null;
102
+ }
103
+ catch (e) {
104
+ console.error('Error fetching WP last-modified value', e);
105
+ return null;
106
+ }
107
+ }
56
108
  /**
57
109
  * getWordPressItemImages — Extract image objects from a WordPress post for use in sitemaps and galleries.
58
110
  *
@@ -1 +1 @@
1
- pxl:v1:19583b2d4cffcf9960898880:e73ee5b6d8c0ed02bf573a7ebb38abdc:e72b5481c485ee728bcdc549d4a134c698f335ccfbe83a8b19b4643a533f3de9dc49e93dbdeb7066305d74f04f0794dabf108f6cb4f31ecfbe27e45636147eb4c6f66e2f308ca25d7ab8cad465b7a29f8dbe2d20871df5ea1c2190cdc9ec2ccfc65348e95e2347b0a8bf2e65cb1f8c72ed9ac882b112a16a46623d042893f7e6768ad60c0d2f15b06af324b0db4b8d50a732f334a8c66031f734f00dbd06bded7addcd4f1bc0ca75aecb71739439a762d3795b86bf6309c51bfc790a6953f449aea40e7362ba492057d5dcfb330a544837e85b1ae02da591149d92151b72f9cff92037ad8e24db20459065d37754d4d56f5b21496cad5d34fcece3f8b2a04f571d7bc3111b0003ac3ab6d3f3c6be26405372e491f662ae56ac64f1b3f0eb7351ecae27a510f0c7d38da8850099506f1a05c696d86cb646136a55df756de37ce577cd9e38a57f4f5037283391dab2220bec50eb578fbe061a815c42d3e43b66bd48b54c0f4d89cc2c3bed153917b63099ff281afbb84fcf3b2ecf441d8d6954fd416f65b9adb4d35958ad50c0499c6e3546c5d44d021404a080f954e20df1abcd736f7622f018b24cb8c51b0a1bdd0b399dae60ba501da0e99d07d3c22cfcaff1b14095f1327208df1ef4510735e370a2fde079688d3f270602fa89816e1e0de2d27dd6e33fc456b30a4cae7f391a6b70c6e62c41a23a5fbabc8f644e4f0d352a151a4b3fdfdfc8b96ba2e375f7b1ad99429ed11d704afdf518718a0cd5644259518a75b153207baccee9d7409034668960115b54dfc275052c4609afdc5f3efd76d3081f92fc5847c8b10aa72e1e014b20a8579a856c83b067438e300681ef38d710b234577bd74889b6bfd3941f50ac836bcba61e11f31bcd6edc1966ed16966b82d7e71875dbfc22a5143e443dabf268f8b872411ab927b971e04f01cf306f63a1f2d9f3b831373f0c4da16411f1407b528b838754cb6254b5b30e31271c91c9198f4e422b293ac8bf83cf76d6855fcae4ffe5b97a09f83176146b192ed5fb2f45d71ef1391c6d9111aba24f2e346f140fd5103fc35e4bc0e99bcb829cc554e562bf08a2987a43697e2b7467397862081d6da852f5d134d9ebeaa31ed8b8ab308fead700d0dbfb701dba2c56380f93a304dd9565ab5c249d86f5a7ed75a33604c74b129aedb83bac274242514a6904056b7fac94503c95c9e260c5473eccf81848ca98a8c85aede061e0a3a9b54a448c2fd18a4371d31766b3a8538b50f15feda7034cbc1f18f1c3fa4a650b42e28135e56210902b4b972cc766f53972cb9f5c1ec183b50f4e916a4b9ce7f351dd4e10d98d34129e1a1b208268d7327000e2e235f2db9f1c4fc58fa19015cab3b93aa4af1bd623d766c9b4db64d015647b4b06f0d45b70d1a09231fd7427476c98eb30d2b8c70c410a4fdb42902bf9ce63753948064312d16d6910840eaec8a3ea93b56041de614d60c3568fc185793b336770f1a52f8230ee090147325b19a05418b19a1d39d1b420f7b174e9c57ce0f623ea09c7662bad65115025b84b677ab49fbab30370ef52b7fd742f1dd68def6fe345e051cad1fc6cf5d44d8e149ffdc35e50faaff77aa43758e4a0a7ad4c603e8282b1f1d7c7a5a505cb6892fd0ccfb2a60a7b7818d9f0d7fdeb45e012868e5f14d736022ebe3446a6f7b213e4fb617ffeadfc748bc4641123fcc9a711584ffafdbceaf12a059b044cd68b6682f53e136960f06788949fdbffb044f4fc67046732f7bbde208b38d2e76ba7662964f0856dd8a380cf0983236240fa9e4dcc138790a3e7264d5a9b280f81cf3e9b6b86bbe066d37bef68cedcb0b9ec913f53d71364872f020d0ed6f410170fc91b582905bd36a10b32199d1f3031a9d2309bab7108dc144c4d8b54fb57e61388728298a8e1343d23e5ffddc18822d20a6caa9d8286bbc9a6d30ad914b785c02daf03d95f65e0f7ee03ce9d780bcfc783c5712258aae147eb917d1e1757ea0a631f2d790c721ed239eeb0a051c6cb270ec98647eb6f40bcede502cced490deb1888576d5d68fe680b1cb63fbdf8fa577617ed22b60f59f3760386766e11ad9b7ced8fb3d83fe9fbda75e562a5da38fd66f5d9623ed4186b7c7503f7d7b1fb8038b7e7b04ac183c0af83e51a7ce86048fed388a1a5ac46142961eba722efb14646475329f9697a8b496eb41e3a951e1e90eff05c50bcd6e7adc143c6ef54ec80c49bdacda5f2e7c50f00e666b60b55cc6f8440cd886f7c0356ec956de7b5b9a49ca5ce38a1abd31ddad53d18fb6784f413cd3ac5e8ad9efd5b1d7efdc87dda531f7b4d724de806c93991ae81acfb6a93d69b203e1cab6e2522d0af98c426a3094bbf278d4d2e8485f5bcc403cb0bf4cf3dd0471082a8c27877a63e1927ead904a16fbd80d74bb0d286d4c5659c864a0c8e7a1cda2706a424a4bb6f2ac3d5f925282bdbd013ac1f893b71bb255f35befe53cc05ad38cad4984816aa4362d78c466ae12cec0ecad84f1d87a84cab700fbaf0e5f2c93cd60ff93fa379d61d0399637c7084700f9615b9deaea2a36d8622b3a2503166b59ac1e0d3ac653837373dc1f3f15cceb7bec7338452b0386c616a95c61341f4455f9f18db6205474f10bf29936f3f99375048df0620b4479a9cf7f93ec45768e2753fcb7fe8428dd2c680a2837d6ff22c23d433b6ce5fd53007e655d6c54129da61fa572d8181c584316bd761bc9cf600da95c47583cff1eeefd612bfdb1082165763861449bfa04ef37120b4be70a7f988708f2bba2d9d3c45c35328ee4c896ba94f0108806e60b11fe6c190fc34c9aaf80e40cf46602ae9024afd5fa9e45b242d6ffad514114e368ba79e38626613ebc068e2320199972bbadba8f36767368a79e32e77ca8049da792ed14241d50c585e01585ea95550a0135c434dff3c66afcfa7bf669640a1a6cc34e085d52d996eeaf1626694aa32d3b3d3dc128afe302a4ebe7e8def8a968861bf14d9eda7dedb250fbe317c10527dd517e0c53d3eaff395e290fab3ceda9447292451b44938d49fc696f09d51aff79b1d20b36ac97dd8d284dc5c98ad5fdb94745b32a7371b70cbbf3d9457a65863e3edfe187bc0779221153be444c38ecce6bd46f42399015fe4209a39e4fa0127f4862432d7fb6db829294d472c96a105db4c3e02463e253ce7c30d5aa8e45061f61d413211a389ed744dfc7ecca99e2793e2e71134a10e114b67bb29571b363eea388d4763fae1e86453b124a9b0a0726b63395a853525522dd2a244b18f422f05e57d2c47f8b527150259471c5b0c4c8c0ecc4b3a9eded3107fed768d5f564e342c68c71e1cd0144c8f883f065a51b4a46a3c03452b2e72437d3e0ac43ab7fd8b53b18508fdbe6baf49412d04b84dd44abcec211762c29664bb5244223e06d63727221184d17825ca16dc65fe33e8f1e93e9f092854144d58a70dc96fadfdb4312b513daff6db6ea7cc24d34fbd5303885aa3b07905381b87e44fdaf2c0202a2f49716a393c3e01cb14eb53292a00d98c520b3f160cdb3b024878da4822495084f7402af6b48b3cfbbe4ca8fd78d575616f8b8b0560681a49ae402fbb408ccc5970a13bf0efa01d6680a674b64d36ecfa0a34cfb0de566e29d2021b04ab512f6316e125876255840b5deeaf816e888f0b4692b0b0c0c61981b1f384c0b3d6cf283cd956758505d9788cdf5089703b08c31d090bfc19b637b42bc7266dfee6fe70e493dd71156c31e8bfab797bdb4a0f1d93ca536103d7e4abc8358b5648a79c98ad73ff277c85da7e694a34aad92f2184bf0d38d3f1c1294ec6881698b4b771d604beab7025eec814177c5afbbf8ac6b8c7a98faa182514c0dd770e2a99a353e58f64e994a26c35240277df9a543a5fb1a93f47ecc6936fa5fa2ddbb8872f73de0550df9c8800c3a56ebf989c9e591882d877db06044d82054e6d1cb9a919030cabbaa33f3932386df2f63cfa73e107fad014765f98b109e4bc5c8b9157ff32b806aa13d2f6fc853220ab35721be88649e9c43eeef0dd17adcf42dcf612d177390526ba680bee4de1c6a92985abdc2c9a997f65bdb255950e8b860a502451d32bcf7965d6fe31eb09b48ecae97ec21f99bd2f1c3aeb49612987b8557f1e97e925a9d588d5a5b0b14674ab771e51d37574dacc51427dc97a7c68e7066a81262266493f23e9449848cbd418ef43e60e4eeaa41c67f2b0b57dca0696e4b2e22fa44b852bde27cde94e2905d75d335335d556632bfd6c42472bc6257248465a79f8422232e690e9e9268d2ce05108e10b1f2687b81f43fbebba95d0b504351d3bc5ce583a564b7b08c161fcd5d77cad808444f35a37fbfd9f9d529f9c350c0d7f182e959632448002f1e8c500fb75fb4b29b703ddde7e768935bae4d3a54239f624573276ca088a89064af9a254926533626a2f88ef52846b171cb3ce9b454e7763a2d57d2e39ebbc72c524e408152e14ffc8836ec4ca1c7a5120c730dad3407e61528c5bed2d8f4c045f06761acb2837f0aa334c4093d70829bedc07e49df72cb95be2e70c9fa6fa50a2c43a66f0634207e04a18c8020487b3c1ab89c53171fb52dfbf337adc38d96587bb8968f8d346091782edf9e871f6be3320701c7ec4bc73332f5486ac3103cb900d887d0e53eea1a60e923def40e28f0cc3f1f03483c760512fd88f59ebc9d3f6fd2e0af899c14bfaf15e210508ff0400ec57bbf0ff73603552f4b0c935991f0bc2a4564ba004810c2b109558f016d34e76351ebbd8344aed1a0c203629eda2ae82cef2e294e72461912eb9d075f2247558abf9085b177c1ef08086cc800bca75a968ea543d0602ff9f045375f4a4c6d0095d709df5b58f2669dda6a2a43057a3977475b57ad69e741b15e3bdc22df2523c903d6f3bb52ae5ed9e2d41705a8ca5cc5538cb53b10b13780c329537255222a458bfc2ca2404043b73edf776fb213e6dda63fab89bb05239f3ae51af23a45e1d10e3fd2513b9016d417dbc06b1f0f1cf8dd105eb10bdb21d7893f70c50704e27f8312d81142e628439d0a97934f90ab55700b67440341a92e3e93642af1e3344b0c8ccbcd799c076c3ab5c6c69645bde836fcf174db35338c78c41a9880958918b11e0fd434dfad18cfd9f54b38d9b40379973a61f049ede301ac0
1
+ pxl:v1:fbf000f31450173d233f8d07:98f501df255377cc090f542157c6849d:791bc568604616c2980235f5076a5723a8fbd3036e3ff67690b5641fb0fd2c2ba6cd81d824504c036acd43d75495b394f50bc62b23094fb308a2c2854268f87004a2f0f03af1ce300f8a8272e905817bb328a0d696aa56a788bfd17f5c23ae0faef6165de82f4e57ea952b479e3194f38c901df8f8e1258ac7bb048b2b92b41862bb4636335fb36e2a04b54725fe3df8c0c52f2e6e4c1a8032422f94fa9092ff00bf36d4ad048537f545c028243f8497eedf91f35ce0f1a7197279f0b672ecd70f3782747f125e66ba4b01c24cd44960157ba073d331767d1c0b6605f7ea8c71adf5d52dc0fdc38e4bbdc53b817d3652329cc6537e13ed2aada1ef5d9f66796c00121813d9a467d242219c5b28d616f87e91265d3f7bb7d83c0d4f034c963392bfb5af187a1504b1d3eb4c950c360cf01ddd688c06e22d4da7017d9b41c10a99e115f23ab08cf622be306dfd9a418e5fb4cfe8f5aff1cbbcf59ab4cd9da01f67813aec29921906d0741bf1fa265a423e099310ac5ec716436cee539176713f32e92aae56ed8ba7be84032032aec269a5d341a054377394e62248a9cb92a9f2cc3c926395ef06a91cf5f8f9c3e4413ddcf5d0b4b9161a4e29590a6472cdd0f5d528e1f9db3d1820a5f4b3f15703a0785201db7bac327a8ac5050db63f5bbbfa3de111d6c3e73cc7a170f2e6e8b3eccea11a95fd18752bade6dbeb65686b54ba841615acff123b702f5a40c1b8c16943f92d491a30f90182b380c2db4f42ff4257e3a0320616958c7d30bad619caa2e1db4898b8925cbc20b873036b1a49fb01f73362ef73aea816c8425ec4dc00e516ef418ad0499ea00d0835dd58c68572d3c1dbd6fddeb0aa85b13d8a6bc6c05e27b141bea252fb4a7addd97a96c2862a57d3a862e8b1c4e661d72f93dfee016f8179dd3875202e4fd0f977619aaa53c4a12cdf205fb73cf29dcd6998833443483addd674cb034fa7df77ac21bb52ac2a56f50d8a0cddcf6066dbd8731466e01fe21cdd78b2d9422273ab332e7b50965becb5ebdea95bd081ebc8c6e76b630cfbcaa419ebda382b61292bd55a2d84d63f56e42336b26cef8a622a0c4fa1fa1778f25200283beffa38d069dd783a39462bd1cbdd69d875abe01a2883fca84a73c3ff33f750ec128aecd2c71dfb097904d364b513eb08023f6585aa36ffe5fcc83294ff12baa0196c4b83c1611d58330757841b3c0b6eb4868c53e544fbdea8d155a7eda0b69e1711a7393a95cd790a0084442d8c1ff37b29438466beb6255a95a8e9a859976d3426e3604592977b7217f027dc9379f79a98d0336c7f7f751d74be4adecf3cd53a9db6781eb2261a667d56a88b129ea5bdaea82fb66b5b126e2216b0d99973d75e071df331d8a36a086d82fef8304926abcc812746026e2f17e918488119fad26c1b5e5269ae10da03110841df4b0daa8a6be742dc7215513266c4f0772756b2ab46f88bcbef9966e200cf69d849dc6964f261a6a32e0ab7bf573f164c82649a451b82c950a154b213b62c7339e8e5c589e9e7a586b8a9819ff5da892f512523bf6547d1ab8fc381b3fd7000fabade1023b68cd899eadc68078e22ed7520d178709ea4ee588c288f88ef9a59c6467fd6bb098bbb2ccf5e1a4ee67ff3ca65eff684ee7489502f0517a7a3b70aaa5a17de3a1b3e0ee673621dcf1af2075c5232cabf15a3c3cd8e5b66df709516f47a4f754d4468f76593a2485410f8abfdcddc7345717d67aee69c70c98143c13199f448a697bd5763c49f9b75656cfc06490a92e6e4ff190faca377fb1b7566af3b91be5187fd77fd7f04bd57a53cb5b88b3490faa240b36ed2fb1b723671776f7881f49d42c14b55ddd00c2ae0c852cc2e05fd9b70f9867cccce515082db3ab3d5052a4afd80b5ab3dc6976170a1114d04cb3a225b8388325fd24609d11820b4d47f002cb7529abc47bd10ce96e2373425784b68258058683dc459a55a78d0b6cf8b9023204ed6a0ba90e5221b4103302437c5a919d5b098d21ba233138cc36c56bc5a6b74a29358b4156c4d0011944fb2d86fbb6c9d3feb27e34c1cbb204b5a6e10cea4100e85b96a28a5372401ad79bde01a950d2afeebae6d52fde22a1c6f19603f02336d0c1513a1d50ccef469fefefcc92ce01c839b719687d9cb47e869bdd9238d54390b9ab3689daa9ee748fe0793e9415e2e50af1a3e5221fcd903687245da166ef7fd726f2ed4750845653f1db0324aed2c4d2a2c59e9fe26dd151b200b90aab0e528fc437d24fe03db59094e47b6f889a5df2e8d8ecc38f7a030e18852edbdc6be479a93ea8b20f3dbd7248dbf8515d727c9a96063be090bba4a80fcfbded04b4f508451a515fcbf82a4afed4355e3a4b5463300297d32883f54b89012cf481c214e94832e3d9204752c3abcd3b018c7bc8f701d214fed6a72a27416f902326103868747884da3c3dd220e00e8f11ceb8c54a3b6abc039267dc54bb9471bd9e5ffb7dfa01aa7f80e35985237c9dafe164b730d7165ef528c515843cd1512a2d48c4b270b9f1e50648b45a0995671aae6418ee03bfd7239767ccc40fc89e0b88e6c23501c040943c289442901393f6ba169e8bbc360c0fdef8ccb8ac439d7661411ebf92c3efacb6b49c79faec622022e300cab336ebaae5342b560a68f71c513ab376ef85beeade2c71354d1a56f67be3f49d67ab94a6ab9c0634cf2b29576aaabead68e1acd6f47c01ed9da731420a63f46d67aa1fa42656bf31cac070adb1be5cb4a1fc7fc56718687c3dd219f0530f4adce63ea8b757deb31f4bddb50b5b962ba69973de96d3f5fa378bfd3ae40c35ee358fb21e9a0c23d5bee9a4141d7cda9b3c7a0fe76f0cebda6e824875bc52d65ef7d45ca4a3e088757a537db92d300fc3c255454439ad7ce0b3e9cbe5e4dd3a6b95acf6ad769753b9cb77148a77997e0276f774cd94dcae601dd4168f0f699af8f1d37ace99e827fc4bd7bd6732a58a42ee170e261b4062af972056f9abb5e6d64f28c6a46e1b88c294b4d4a2d06a2b0ae323b679b6e077b87bf7cbccd923ca5c9bb3c44b1202f27cc81c6cd379606a075d88e827970a5307b9ee15790d783ffb8c77dadd670d866e8ee547692c5e0e48dc18288901f2de0efed420e24cea2aee0fecee0edf851f69968ef07ad4afdf89b7aaa3828a88c1a21fd7a732329205a79b18a9874fe42bf0bae300f6c774e9c1cd1b66ea97d3d56e694e9c73105ed209f0042b1d01a4640191e8027624bbbaf1f5d790762e2710ac5a72a9e191ce8819eb9c18c7f11107a54481c32d186fe2cf8f4fb8ed222f230d3fc0ebbc834a091e04bd0924ea3c80fa19a6cf95a8bfb401bbcbba5c77903b33c2501eaa205e8c80b351769ae5c5ba45210b4bbb2849b0a8f0360be47bf789366b7759fe25f8efb5540a0cc4b266be2a86b739a8d32a3e6fbca078e5307540429e6c8cb18447cc3ad383afabe4ae4a4fc301d1df641090798631443d94a827cf2b6db4a2f3ecb4125f24c21286041e429a244ba0d1e7dbf1ae85435f8f0a0a55640e8604178a92f113be0aee6e68fe5276bf8b1b6bbb65368d982602a0c5a961033078a1a5a4b363ec269d9be43aead8d0ced985cb12f25efa5f0a751dba9db957736eb20166de46c4dce44500ca25902bb0a0d1fa9c26e0e0bc1cfe771736bcc219c5d0778e56d8cb147869e571e831043427cf804fb26041460bc90cd69151163c1e3be958744c0a5a9d1e3a0862c942a2219bf5b27b29ce88a818cfd45c385b51749171d44f4007ce1261874cd1f2ae0be596c2c84dbcae0e4f2bafff13976dbee1253799ee16e795cc9bafd8b5400bea9193e925295a6aa45b3caba5335a2b412885494b80456a6f3f44c1faba043723700d1bb32464595a3b44b9fcfedfa8971c390c610ab7a9b9fa134fa31541cf54650a925d1a835c9a9f54ca936bf4281972fdd2ff6979e596545132199537a6cacbe86857d02b6374c73c382b73bfecdef55792f980cdb5d0fde1a5073d57984d49e23ea5da360c736053275956615ab74881445210b213bbf0e1edb5bff0409d6e43bc0d87d575e5f4bbc4322bade3ec4d55f00c8c3273e9d4aece771618015cac2ed06d6dcb9d43a68fed759d8c5cb209175ef015967fd4fdd6b4f7e2335e094a277aa906d18e6db43d8a2fa300fc472464843d514547d3a570326493043360960e0470822e31ae666845c4942b2447c0847b8581fa9c157ba0c9f353096af6988b1aabfd4b2af3d4abbc1d383110f0bac23cae697e6d7cc4a187f95252124777da449452f88ce925f6bb7aac2ad0a1f3ab467915457fa1096ca73135d4052daf5afb9e5ca88dc66953b30a5467a29d9d405d1b1bf5c208a89b13fa382401a68bf845f0ff48d13a58a3f65571cdb9acd53f472ab484b16b15a3f9ecd294c5971a79c888b339a503a8a20d72b5c45b261ccf366a5ff91816c810626edf6c0411e3a6d6cab4b1fa49866ca83f77fc0562a9228423e4293b53a892b6a3c22991d09c2006a8ce51c0ed860f7c4d7f681a6eb28bad68ad44bc4f6ff53527e22442af63580982b60a7ddc2be544e6875d66bd2fc3dd0c40ad534ba0b143e34f892ee229b8f432d364d919fbf43b462df16f75db0b6688740dcae990b0f40b1c12cf0e2c51410a9d7e21746bce3dfcea6b075902e582ec37969d15907c050f15d6ac75fbedfd6629ad40d42547739c29c05a5524a1605944bde50af6ba7cf5c6ed3f743576f39b31eaca57c30779d5e0da8af2e5e0f33bd342dfb430a5c220e193e46996b08d94e207f486253dffd6b26af9e84135ee207723fc21da2da497e00f6ab0ca4c257fba797aacd283c10417ed0b9c2154c392614538f00e28b15709a9b73109dd2ceb50b5c5e368d3fa5d2aeae956c681bfe40647fb9abdf9eab1df01a426af05105abcdf9c191d67a72398ef3b87e54c2d12c91793c9839a431131d76fb7fa6e7a14bf511b86c9c2c66c04f4f8bf887251357ebf96ce042e34f470d042e3e9adcceed4e4d70904f3bc817b50132bcb66040d1fbe156b79d453dbafd6f3d57eaeeb6c9a67c1a9faf35b8301ddeb117ba27869d6f899468c412e508884b3ba9cb175c65da2abe855cd5955c1f5bfadd55a12cea45e03a22105d5bea2203b65e60946987c140eaefac58c8
@@ -162,19 +162,23 @@ fi
162
162
 
163
163
 
164
164
  echo ""
165
- echo "📦 Step $((STEP_COUNT++)): Updating dependencies..."
165
+ echo "📦 Step $((STEP_COUNT++)): Updating dependencies (all sections)..."
166
166
  echo "================================================="
167
- # build list of packages we can actually update (use the "wanted" column \3 instead of latest \4 so we stay inside semver)
168
- UPDATES=$(npm outdated | awk 'NR>1 {print \$1"@"\$3}' || true)
169
-
170
- if [ -n "$UPDATES" ]; then
171
- echo "Updating the following packages: $UPDATES"
172
- # removed --force from npm install to avoid unnecessary breaking updates
173
- echo "$UPDATES" | xargs npm install --save 2>/dev/null || true
174
- echo " Successfully updated: $UPDATES"
175
- else
176
- echo "✅ No dependency updates needed."
177
- fi
167
+ # iterate through prod/dev/optional sections, only bumping same-major versions
168
+ for scope in "" dev optional; do
169
+ flag=$([ "$scope" ] && echo "--$scope" || echo "")
170
+ save=$([ "$scope" ] && echo "--save-$scope" || echo "--save")
171
+ pkgs=$(npm outdated $flag --parseable --long | awk -F: '{ split($2,c,"@"); split($4,l,"@"); split(c[2],cv,"\\."); split(l[2],lv,"\\."); if(cv[1]==lv[1]) print $4 }')
172
+ if [ -n "$pkgs" ]; then
173
+ echo "Updating $scope packages: $pkgs"
174
+ echo "$pkgs" | xargs npm install --force $save 2>/dev/null || true
175
+ else
176
+ echo "✅ No $scope updates needed"
177
+ fi
178
+ done
179
+ # report peer deps separately
180
+ peers=$(npm outdated --parseable --long --peer | awk -F: '{print $4}')
181
+ printf "peer deps (manual): %s\n" "$peers"
178
182
 
179
183
 
180
184
 
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # update.sh - refresh dependencies across all sections
5
+ # usage: bash src/scripts/update.sh
6
+
7
+ for type in "" --dev --optional --peer; do
8
+ case $type in
9
+ "") flag=""; installArgs="--save" ;;
10
+ --dev) flag=--dev; installArgs="--save-dev" ;;
11
+ --optional) flag=--optional; installArgs="--save-optional" ;;
12
+ --peer) flag=--peer; installArgs="" ;;
13
+ esac
14
+
15
+ UPDATES=$(npm outdated $flag | awk 'NR>1 {print $1"@"$3}' || true)
16
+ if [ -n "$UPDATES" ]; then
17
+ echo "Updating $type packages: $UPDATES"
18
+ if [ "$type" = "--peer" ]; then
19
+ echo "peer deps need manual bumping: $UPDATES"
20
+ else
21
+ echo "$UPDATES" | xargs npm install --force $installArgs 2>/dev/null || true
22
+ fi
23
+ echo "✅ Updated $type packages"
24
+ else
25
+ echo "✅ No $type updates needed"
26
+ fi
27
+ done
28
+
29
+ # print peer dependencies that need manual update
30
+ peers=$(npm outdated --parseable --long --peer | awk -F: '{print $4}')
31
+ printf "peer deps (manual): %s\n" "$peers"
32
+
33
+ npm audit fix 2>/dev/null || true
@@ -1,21 +1,25 @@
1
1
  import PropTypes, { InferProps } from 'prop-types';
2
2
  import "./hero.css";
3
3
  export type HeroType = InferProps<typeof Hero.propTypes>;
4
- export declare function Hero({ img, imgAlt, imgId, variant, height, children }: HeroType): import("react/jsx-runtime").JSX.Element;
4
+ export declare function Hero({ img, imgAlt, video, videoPoster, imgId, variant, height, children }: HeroType): import("react/jsx-runtime").JSX.Element;
5
5
  export declare namespace Hero {
6
6
  var propTypes: {
7
- /** Background image URL (required) */
8
- img: PropTypes.Validator<string>;
9
- /** Alternative text for the background image (optional) */
10
- imgAlt: PropTypes.Requireable<string>;
11
- /** ID for the hero section */
12
- imgId: PropTypes.Requireable<string>;
13
- /** Layout variant: 'static' or 'anchored' */
7
+ /** Layout variant: 'static', 'anchored' or 'video' */
14
8
  variant: PropTypes.Requireable<string>;
15
9
  /** Height for hero section (string like '60vh' or number) */
16
10
  height: PropTypes.Requireable<NonNullable<string | number | null | undefined>>;
17
11
  /** Child nodes to render over the background */
18
12
  children: PropTypes.Requireable<PropTypes.ReactNodeLike>;
13
+ /** Background image URL (required unless using video variant) */
14
+ img: PropTypes.Requireable<string>;
15
+ /** Alternative text for the background image (optional) */
16
+ imgAlt: PropTypes.Requireable<string>;
17
+ /** ID for the hero section */
18
+ imgId: PropTypes.Requireable<string>;
19
+ /** Video file URL (mp4/webm etc) when using the 'video' variant */
20
+ video: PropTypes.Requireable<string>;
21
+ /** Poster image to show before the video plays */
22
+ videoPoster: PropTypes.Requireable<string>;
19
23
  };
20
24
  }
21
25
  //# sourceMappingURL=hero.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hero.d.ts","sourceRoot":"","sources":["../../../../src/components/general/hero.tsx"],"names":[],"mappings":"AAEA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,YAAY,CAAC;AA+BpB,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;AACzD,wBAAgB,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAkB,EAAE,MAAe,EAAE,QAAQ,EAAE,EAAE,QAAQ,2CA2DnG;yBA3De,IAAI;;QAdnB,sCAAsC;;QAEtC,2DAA2D;;QAE3D,8BAA8B;;QAE9B,6CAA6C;;QAE7C,6DAA6D;;QAE7D,gDAAgD"}
1
+ {"version":3,"file":"hero.d.ts","sourceRoot":"","sources":["../../../../src/components/general/hero.tsx"],"names":[],"mappings":"AAEA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,YAAY,CAAC;AAoCpB,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;AACzD,wBAAgB,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,OAAkB,EAAE,MAAe,EAAE,QAAQ,EAAE,EAAE,QAAQ,2CAoFvH;yBApFe,IAAI;;QAlBnB,sDAAsD;;QAEtD,6DAA6D;;QAE7D,gDAAgD;;QAEhD,iEAAiE;;QAEjE,2DAA2D;;QAE3D,8BAA8B;;QAE9B,mEAAmE;;QAEnE,kDAAkD"}
@@ -1 +1 @@
1
- {"version":3,"file":"smartimage.d.ts","sourceRoot":"","sources":["../../../../src/components/general/smartimage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmB,MAAM,OAAO,CAAC;AACxC,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA0HnD,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;AACjH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CA2I/C;yBA3Ie,UAAU;;QA/C1B,2EAA2E;;QAE1E,kCAAkC;;QAElC,6CAA6C;;QAG7C,gCAAgC;;QAEhC,yCAAyC;;QAEzC,uEAAuE;;QAEvE,kCAAkC;;QAElC,mFAAmF;;QAEnF,uCAAuC;;QAEvC,wDAAwD;;QAExD,qCAAqC;;QAErC,+CAA+C;;QAE/C,sDAAsD;;QAEtD,sDAAsD;;QAEtD,wDAAwD;;QAExD,iDAAiD;;QAEjD,4BAA4B;;QAE5B,yDAAyD;;QAEzD,8CAA8C;;QAE9C,+DAA+D;;QAE/D,+EAA+E;;QAE/E,yDAAyD"}
1
+ {"version":3,"file":"smartimage.d.ts","sourceRoot":"","sources":["../../../../src/components/general/smartimage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmB,MAAM,OAAO,CAAC;AACxC,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA0HnD,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;AACjH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CA4I/C;yBA5Ie,UAAU;;QA/C1B,2EAA2E;;QAE1E,kCAAkC;;QAElC,6CAA6C;;QAG7C,gCAAgC;;QAEhC,yCAAyC;;QAEzC,uEAAuE;;QAEvE,kCAAkC;;QAElC,mFAAmF;;QAEnF,uCAAuC;;QAEvC,wDAAwD;;QAExD,qCAAqC;;QAErC,+CAA+C;;QAE/C,sDAAsD;;QAEtD,sDAAsD;;QAEtD,wDAAwD;;QAExD,iDAAiD;;QAEjD,4BAA4B;;QAE5B,yDAAyD;;QAEzD,8CAA8C;;QAE9C,+DAA+D;;QAE/D,+EAA+E;;QAE/E,yDAAyD"}
@@ -1,5 +1,16 @@
1
1
  import PropTypes, { InferProps } from 'prop-types';
2
+ import type { BlogPostType } from './wordpress.functions';
2
3
  import "./wordpress.css";
4
+ export type getCachedWordPressItemsType = InferProps<typeof getCachedWordPressItems.propTypes>;
5
+ export declare function getCachedWordPressItems(props: {
6
+ site: string;
7
+ }): Promise<BlogPostType[] | undefined>;
8
+ export declare namespace getCachedWordPressItems {
9
+ var propTypes: {
10
+ /** WordPress site identifier (slug or domain) */
11
+ site: PropTypes.Validator<string>;
12
+ };
13
+ }
3
14
  export type BlogPostListType = InferProps<typeof BlogPostList.propTypes>;
4
15
  export declare function BlogPostList(props: BlogPostListType): import("react/jsx-runtime").JSX.Element;
5
16
  export declare namespace BlogPostList {
@@ -1 +1 @@
1
- {"version":3,"file":"wordpress.components.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/wordpress.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQnD,OAAO,iBAAiB,CAAC;AAgCzB,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAsDnD;yBAtDe,YAAY;;QAZ5B,gCAAgC;;QAE/B,kCAAkC;;QAElC,2CAA2C;;QAE3C,0CAA0C;;QAE1C,wCAAwC;;;;AA0FzC,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,2CAgDzD;yBAhDe,eAAe;;QAlB/B,iCAAiC;;QAEhC,iBAAiB;;QAEjB,qCAAqC;;QAErC,mBAAmB;;QAEnB,iCAAiC;;QAEjC,uCAAuC;;QAEvC,yBAAyB;;QAEzB,2BAA2B;;;;AAiE5B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,kDAyB/D;yBAzBe,kBAAkB;;QAJlC,8BAA8B"}
1
+ {"version":3,"file":"wordpress.components.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/wordpress.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAM1D,OAAO,iBAAiB,CAAC;AA0BzB,MAAM,MAAM,2BAA2B,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,SAAS,CAAC,CAAC;AAC/F,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,uCAUpE;yBAVqB,uBAAuB;;QAJ5C,iDAAiD;;;;AAuClD,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAsDnD;yBAtDe,YAAY;;QAZ3B,gCAAgC;;QAEhC,kCAAkC;;QAElC,2CAA2C;;QAE3C,0CAA0C;;QAE1C,wCAAwC;;;;AA0FzC,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,2CAgDzD;yBAhDe,eAAe;;QAlB9B,iCAAiC;;QAEjC,iBAAiB;;QAEjB,qCAAqC;;QAErC,mBAAmB;;QAEnB,iCAAiC;;QAEjC,uCAAuC;;QAEvC,yBAAyB;;QAEzB,2BAA2B;;;;AAiE5B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,kDAyB/D;yBAzBe,kBAAkB;;QAJjC,8BAA8B"}
@@ -31,6 +31,10 @@ export declare namespace getWordPressItems {
31
31
  baseURL: PropTypes.Requireable<string>;
32
32
  };
33
33
  }
34
+ export declare function getWordPressLastModified(props: {
35
+ site: string;
36
+ baseURL?: string;
37
+ }): Promise<any>;
34
38
  export type WordPressSitemapImage = {
35
39
  url: string;
36
40
  title?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"wordpress.functions.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/wordpress.functions.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAWnD,MAAM,MAAM,YAAY,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE;QAChB,GAAG,EAAE,MAAM,CAAC;KACZ,CAAA;IACD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC,CAAC;AAgBF,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACnF,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,uCAkChG;yBAlCqB,iBAAiB;;QARvC,iDAAiD;;QAEhD,0CAA0C;;QAE1C,4CAA4C;;;;AA4C7C,MAAM,MAAM,qBAAqB,GAAG;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAUF,MAAM,MAAM,0BAA0B,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,SAAS,CAAC,CAAC;AAC7F,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,qBAAqB,EAAE,CAuClF;yBAvCe,sBAAsB;;QAJtC,4BAA4B;;;;AAkD5B,MAAM,MAAM,oBAAoB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAaF,MAAM,MAAM,0BAA0B,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,SAAS,CAAC,CAAC;AAC7F,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,8BAerF;yBAfqB,sBAAsB;;QAN5C,iDAAiD;;QAEhD,4CAA4C;;;;AAqB7C;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAkB7D"}
1
+ {"version":3,"file":"wordpress.functions.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/wordpress.functions.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAWnD,MAAM,MAAM,YAAY,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE;QAChB,GAAG,EAAE,MAAM,CAAC;KACZ,CAAA;IACD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC,CAAC;AAgBF,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACnF,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,uCA6DhG;yBA7DqB,iBAAiB;;QARvC,iDAAiD;;QAEhD,0CAA0C;;QAE1C,4CAA4C;;;;AAiF7C,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,gBAavF;AAMD,MAAM,MAAM,qBAAqB,GAAG;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAUF,MAAM,MAAM,0BAA0B,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,SAAS,CAAC,CAAC;AAC7F,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,qBAAqB,EAAE,CAuClF;yBAvCe,sBAAsB;;QAJtC,4BAA4B;;;;AAkD5B,MAAM,MAAM,oBAAoB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAaF,MAAM,MAAM,0BAA0B,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,SAAS,CAAC,CAAC;AAC7F,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,8BAerF;yBAfqB,sBAAsB;;QAN5C,iDAAiD;;QAEhD,4CAA4C;;;;AAqB7C;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAkB7D"}
@@ -9,6 +9,16 @@ declare const _default: {
9
9
  type: string;
10
10
  };
11
11
  };
12
+ video: {
13
+ control: {
14
+ type: string;
15
+ };
16
+ };
17
+ videoPoster: {
18
+ control: {
19
+ type: string;
20
+ };
21
+ };
12
22
  variant: {
13
23
  control: {
14
24
  type: string;
@@ -40,4 +50,29 @@ export declare const HeroPlayground: {
40
50
  height: number;
41
51
  };
42
52
  };
53
+ export declare const HeroVideo: {
54
+ render: (args: any) => import("react/jsx-runtime").JSX.Element;
55
+ args: {
56
+ video: string;
57
+ videoPoster: string;
58
+ height: number;
59
+ };
60
+ argTypes: {
61
+ video: {
62
+ control: {
63
+ type: string;
64
+ };
65
+ };
66
+ videoPoster: {
67
+ control: {
68
+ type: string;
69
+ };
70
+ };
71
+ height: {
72
+ control: {
73
+ type: string;
74
+ };
75
+ };
76
+ };
77
+ };
43
78
  //# sourceMappingURL=hero.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hero.stories.d.ts","sourceRoot":"","sources":["../../../../src/stories/general/hero.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGjD,wBASE;AAiBF,eAAO,MAAM,cAAc;;;;;;;;CAQ1B,CAAC"}
1
+ {"version":3,"file":"hero.stories.d.ts","sourceRoot":"","sources":["../../../../src/stories/general/hero.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGjD,wBAWE;AAiBF,eAAO,MAAM,cAAc;;;;;;;;CAQ1B,CAAC;AAEF,eAAO,MAAM,SAAS;mBACL,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAiBnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=wordpress.components.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wordpress.components.test.d.ts","sourceRoot":"","sources":["../../../src/tests/wordpress.components.test.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixelated-tech/components",
3
- "version": "3.13.6",
3
+ "version": "3.13.8",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "author": {
@@ -88,7 +88,7 @@
88
88
  "config:decrypt": "npm run config:vault -- decrypt src/config/pixelated.config.json.enc",
89
89
  "create-pixelated-app": "node src/scripts/create-pixelated-app.js",
90
90
  "zip-theme": "node src/scripts/zip-pixelated-theme.js ../pixelated-blog-wp-theme Pixelated.zip",
91
- "update": "UPDATES=$(npm outdated | awk 'NR>1 {print $1\"@\"$3}' || true); if [ -n \"$UPDATES\" ]; then echo \"Updating the following packages: $UPDATES\"; echo \"$UPDATES\" | xargs npm install --force --save 2>/dev/null || true; echo \"✅ Successfully updated: $UPDATES\"; else echo \"✅ No dependency updates needed.\"; fi; npm audit fix 2>/dev/null || true"
91
+ "update": "bash dist/scripts/update.sh"
92
92
  },
93
93
  "scripts-20260113": {
94
94
  "build": "npm run validate-exports && npm run buildClean && npm run tsc && npm run rsync && npm run tscClean ",
@@ -98,7 +98,9 @@
98
98
  "tscClean": "rm -rf dist/{images,stories,tests}",
99
99
  "rsync": "(cd src && tar -cf - $(find . -name \"*.css\" -o -name \"*.scss\" -o -name \"*.json\") scripts/) | tar -C dist -xf -",
100
100
  "rsync1": "find src -type f \\( -name \"*.css\" -o -name \"*.scss\" -o -name \"*.json\" \\) -exec sh -c 'mkdir -p dist/$(dirname \"${1#src/}\") && cp \"$1\" dist/\"${1#src/}\"' _ {} \\; ; find src/scripts -type f -exec sh -c 'mkdir -p dist/$(dirname \"${1#src/}\") && cp \"$1\" dist/\"${1#src/}\"' _ {} \\;",
101
- "rsync2": "rsync -a --include='*.css' --include='*.scss' --include='*.json' --include='scripts/**' --include='*/' --exclude='*' src/ dist"
101
+ "rsync2": "rsync -a --include='*.css' --include='*.scss' --include='*.json' --include='scripts/**' --include='*/' --exclude='*' src/ dist",
102
+ "update": "UPDATES=$(npm outdated | awk 'NR>1 {print $1\"@\"$3}' || true); if [ -n \"$UPDATES\" ]; then echo \"Updating the following packages: $UPDATES\"; echo \"$UPDATES\" | xargs npm install --force --save 2>/dev/null || true; echo \"✅ Successfully updated: $UPDATES\"; else echo \"✅ No dependency updates needed.\"; fi; npm audit fix 2>/dev/null || true",
103
+ "update-all": "npm run update && UPDATES=$(npm outdated --dev | awk 'NR>1 {print $1\"@\"$3}') && [ -n \"$UPDATES\" ] && echo \"$UPDATES\" | xargs npm install --force --save-dev; UPDATES=$(npm outdated --optional | awk 'NR>1 {print $1\"@\"$3}') && [ -n \"$UPDATES\" ] && echo \"$UPDATES\" | xargs npm install --force --save-optional; npm audit fix"
102
104
  },
103
105
  "scripts-old": {
104
106
  "build-webpack": "rm -rf dist && npx tsc --project tsconfig.json && webpack --config webpack.config.js && npm run build-webpack-rsync",
@@ -110,22 +112,23 @@
110
112
  "html-entities": "^2.6.0"
111
113
  },
112
114
  "devDependencies": {
113
- "@aws-sdk/client-amplify": "^3.996.0",
114
- "@aws-sdk/client-cloudwatch": "^3.996.0",
115
- "@aws-sdk/client-iam": "^3.996.0",
116
- "@aws-sdk/client-route-53": "^3.996.0",
115
+ "@aws-sdk/client-amplify": "^3.998.0",
116
+ "@aws-sdk/client-cloudwatch": "^3.998.0",
117
+ "@aws-sdk/client-iam": "^3.998.0",
118
+ "@aws-sdk/client-route-53": "^3.998.0",
119
+ "@aws-sdk/xml-builder": "^3.972.7",
117
120
  "@babel/core": "^7.29.0",
118
121
  "@babel/plugin-proposal-class-properties": "^7.18.6",
119
122
  "@babel/plugin-proposal-object-rest-spread": "^7.20.7",
120
123
  "@babel/preset-env": "^7.29.0",
121
124
  "@babel/preset-react": "^7.28.5",
122
125
  "@babel/preset-typescript": "^7.28.5",
123
- "@eslint/js": "^9.39.3",
124
- "@storybook/addon-a11y": "^10.2.11",
125
- "@storybook/addon-docs": "^10.2.11",
126
+ "@eslint/js": "^10.0.1",
127
+ "@storybook/addon-a11y": "^10.2.12",
128
+ "@storybook/addon-docs": "^10.2.12",
126
129
  "@storybook/addon-webpack5-compiler-babel": "^4.0.0",
127
130
  "@storybook/preset-scss": "^1.0.3",
128
- "@storybook/react-webpack5": "^10.2.11",
131
+ "@storybook/react-webpack5": "^10.2.12",
129
132
  "@testing-library/dom": "^10.4.1",
130
133
  "@testing-library/react": "^16.3.2",
131
134
  "@testing-library/user-event": "^14.6.1",
@@ -164,7 +167,7 @@
164
167
  "redux": "^5.0.1",
165
168
  "sass": "^1.97.3",
166
169
  "sass-loader": "^16.0.7",
167
- "storybook": "^10.2.11",
170
+ "storybook": "^10.2.12",
168
171
  "style-loader": "^4.0.0",
169
172
  "ts-loader": "^9.5.4",
170
173
  "typescript": "^5.9.3",
@@ -181,7 +184,7 @@
181
184
  "react-dom": "^19.2.0"
182
185
  },
183
186
  "optionalDependencies": {
184
- "@aws-sdk/client-cloudwatch": "^3.893.0",
187
+ "@aws-sdk/client-cloudwatch": "^3.996.0",
185
188
  "@aws-sdk/client-route-53": "^3.893.0",
186
189
  "googleapis": "^171.4.0",
187
190
  "md5": "^2.3.0",