@pixelated-tech/components 3.13.5 → 3.13.7

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 (32) hide show
  1. package/dist/components/admin/deploy/deployment.integration.js +3 -3
  2. package/dist/components/admin/site-health/site-health-axe-core.integration.js +13 -3
  3. package/dist/components/admin/site-health/site-health-core-web-vitals.integration.js +1 -1
  4. package/dist/components/admin/site-health/site-health-on-site-seo.integration.js +3 -3
  5. package/dist/components/admin/site-health/site-health-security.integration.js +2 -2
  6. package/dist/components/admin/sites/sites.integration.js +2 -2
  7. package/dist/components/general/hero.js +1 -1
  8. package/dist/components/general/modal.css +70 -60
  9. package/dist/components/general/smartimage.js +2 -1
  10. package/dist/components/integrations/gemini-api.server.js +1 -1
  11. package/dist/components/integrations/gravatar.components.js +1 -1
  12. package/dist/components/integrations/socialcard.js +2 -2
  13. package/dist/components/shoppingcart/ebay.components.js +1 -1
  14. package/dist/components/shoppingcart/ebay.functions.js +1 -1
  15. package/dist/components/sitebuilder/config/ConfigBuilder.js +1 -1
  16. package/dist/components/sitebuilder/config/FontSelector.js +1 -1
  17. package/dist/components/sitebuilder/form/formextractor.js +1 -1
  18. package/dist/components/sitebuilder/form/formutils.js +1 -1
  19. package/dist/components/sitebuilder/page/components/ComponentSelector.js +1 -1
  20. package/dist/components/sitebuilder/page/components/ComponentTree.js +4 -4
  21. package/dist/components/sitebuilder/page/components/PageEngine.js +4 -4
  22. package/dist/components/sitebuilder/page/components/SaveLoadSection.js +4 -4
  23. package/dist/config/pixelated.config.json.enc +1 -1
  24. package/dist/scripts/create-pixelated-app.js +3 -3
  25. package/dist/scripts/release.sh +18 -10
  26. package/dist/scripts/update.sh +33 -0
  27. package/dist/scripts/zip-pixelated-theme.js +3 -3
  28. package/dist/types/components/general/hero.d.ts.map +1 -1
  29. package/dist/types/components/general/recipe.d.ts.map +1 -1
  30. package/dist/types/components/shoppingcart/ebay.components.d.ts.map +1 -1
  31. package/dist/types/components/sitebuilder/page/components/ComponentSelector.d.ts.map +1 -1
  32. package/package.json +27 -39
@@ -57,7 +57,7 @@ async function executeScript(siteName, versionType, commitMessage, environments,
57
57
  };
58
58
  }
59
59
  catch (error) {
60
- throw new Error(`Deployment failed: ${error.message}`);
60
+ throw new Error(`Deployment failed: ${error.message}`, { cause: error });
61
61
  }
62
62
  }
63
63
  /**
@@ -133,7 +133,7 @@ async function runPrepCommands(siteName, versionType, commitMessage, localPath)
133
133
  return results.join('\n');
134
134
  }
135
135
  catch (error) {
136
- throw new Error(`Prep failed: ${error.message}`);
136
+ throw new Error(`Prep failed: ${error.message}`, { cause: error });
137
137
  }
138
138
  }
139
139
  /**
@@ -167,6 +167,6 @@ async function deployToEnvironment(siteName, environment, versionType, commitMes
167
167
  if (error.message.includes('Repository not found') || error.message.includes('does not exist')) {
168
168
  return `${errorMsg}\nRepository not found or access denied. Check your git remote configuration.`;
169
169
  }
170
- throw new Error(errorMsg);
170
+ throw new Error(errorMsg, { cause: error });
171
171
  }
172
172
  }
@@ -141,7 +141,7 @@ async function runAxeCoreAnalysis(url, runtime_env = 'auto') {
141
141
  const hint = `Could not launch Chrome/Chromium. Ensure Puppeteer browsers are installed (run 'npx puppeteer browsers install chrome') and that the browser binary is accessible. You can also set PUPPETEER_EXECUTABLE_PATH to the installed browser binary or adjust PUPPETEER_CACHE_DIR to point to a writable cache directory. Original error: ${original}`;
142
142
  if (debug)
143
143
  console.error('Puppeteer launch failed:', err);
144
- throw new Error(hint);
144
+ throw new Error(hint, { cause: err });
145
145
  }
146
146
  const page = await browser.newPage();
147
147
  // Set viewport for consistent results
@@ -203,6 +203,7 @@ async function runAxeCoreAnalysis(url, runtime_env = 'auto') {
203
203
  path.join(process.cwd(), '..', 'node_modules', 'axe-core', 'axe.min.js'),
204
204
  path.join(__dirname, '..', '..', 'node_modules', 'axe-core', 'axe.min.js')
205
205
  ];
206
+ let lastError = null;
206
207
  for (const p of possiblePaths) {
207
208
  try {
208
209
  if (fs.existsSync(p)) {
@@ -214,7 +215,8 @@ async function runAxeCoreAnalysis(url, runtime_env = 'auto') {
214
215
  }
215
216
  }
216
217
  catch (e) {
217
- // ignore local file read errors
218
+ // remember for diagnostics but otherwise ignore
219
+ lastError = e;
218
220
  }
219
221
  }
220
222
  // Last resort: require.resolve
@@ -231,7 +233,15 @@ async function runAxeCoreAnalysis(url, runtime_env = 'auto') {
231
233
  }
232
234
  }
233
235
  if (!injected) {
234
- 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;
235
245
  }
236
246
  }
237
247
  // Run axe-core analysis (poll across frames for availability after injection)
@@ -119,7 +119,7 @@ export async function fetchPSIData(url) {
119
119
  : `PSI API request failed: ${error instanceof Error ? error.message : 'Unknown error'}`;
120
120
  if (debug)
121
121
  console.error('PSI request error (final):', { url, error });
122
- throw new Error(errorMessage);
122
+ throw new Error(errorMessage, { cause: error });
123
123
  }
124
124
  // Wait before retry (exponential backoff) - retry on both network errors and timeouts
125
125
  if (debug)
@@ -118,8 +118,8 @@ function analyzePatternMetric(html, metric) {
118
118
  const regex = new RegExp(metric.pattern, 'gi');
119
119
  const matches = html.match(regex) || [];
120
120
  const count = matches.length;
121
- let score = 0;
122
- let displayValue = '';
121
+ let score;
122
+ let displayValue;
123
123
  let details = undefined;
124
124
  // Apply count logic
125
125
  switch (metric.countLogic) {
@@ -652,7 +652,7 @@ function calculateGzipCompressionScore(data) {
652
652
  };
653
653
  }
654
654
  let score = 0;
655
- let displayValue = 'No compression detected';
655
+ let displayValue;
656
656
  if (data.isCompressed) {
657
657
  score = 1;
658
658
  displayValue = `Compression enabled: ${data.contentEncoding || data.transferEncoding}`;
@@ -128,9 +128,9 @@ async function runNpmAudit(localPath) {
128
128
  return JSON.parse(execError.stdout);
129
129
  }
130
130
  catch (parseError) {
131
- throw new Error(`Failed to parse npm audit output: ${parseError.message}`);
131
+ throw new Error(`Failed to parse npm audit output: ${parseError.message}`, { cause: parseError });
132
132
  }
133
133
  }
134
- throw new Error(`npm audit failed: ${execError.message}`);
134
+ throw new Error(`npm audit failed: ${execError.message}`, { cause: error });
135
135
  }
136
136
  }
@@ -19,7 +19,7 @@ export async function loadSitesConfig(configPath) {
19
19
  }
20
20
  catch (error) {
21
21
  console.error('Error loading sites:', error);
22
- throw new Error('Failed to load sites configuration');
22
+ throw new Error('Failed to load sites configuration', { cause: error });
23
23
  }
24
24
  }
25
25
  /**
@@ -37,7 +37,7 @@ export async function saveSitesConfig(sites, configPath) {
37
37
  }
38
38
  catch (error) {
39
39
  console.error('Error saving sites:', error);
40
- throw new Error('Failed to save sites configuration');
40
+ throw new Error('Failed to save sites configuration', { cause: error });
41
41
  }
42
42
  }
43
43
  /**
@@ -63,7 +63,7 @@ export function Hero({ img, imgAlt, imgId, variant = 'static', height = '60vh',
63
63
  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
64
  }
65
65
  else if (variant === 'anchored-img') {
66
- 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: "1000px", style: { height: height ?? '60vh' } }), children] }) }));
66
+ 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
67
  }
68
68
  else {
69
69
  return (_jsx(_Fragment, { children: _jsx("div", { id: id, className: "hero" + (variant ? " " + variant : ''), style: { backgroundImage: `url(${img})`, height: height ?? '60vh' }, children: children }) }));
@@ -1,63 +1,73 @@
1
-
2
1
  .modal {
3
- position: fixed; /* Stay in place */
4
- z-index: 1000; /* Sit on top */
5
- top: 0;
6
- left: 0;
7
- width: 100%; /* Full width */
8
- height: 100%; /* Full height */
9
- overflow: auto; /* Enable scroll if needed */
10
- background-color: rgb(0,0,0); /* Fallback color */
11
- background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
12
- }
13
-
14
- /* Modal Content/Box */
15
- .modal-content {
16
- background-color: #fefefe;
17
- margin: 15% auto; /* 15% from the top and centered */
18
- padding: 20px;
19
- border: 1px solid #888;
20
- max-width: 80%;
21
- width: fit-content;
22
- position: relative;
23
- }
2
+ position: fixed;
3
+ /* Stay in place */
4
+ z-index: 1000;
5
+ /* Sit on top */
6
+ top: 0;
7
+ left: 0;
8
+ width: 100%;
9
+ /* Full width */
10
+ height: 100%;
11
+ /* Full height */
12
+ overflow: auto;
13
+ /* Enable scroll if needed */
14
+ background-color: rgb(0, 0, 0);
15
+ /* Fallback color */
16
+ background-color: rgba(0, 0, 0, 0.4);
17
+ /* Black w/ opacity */
18
+ }
19
+
20
+ /* Modal Content/Box */
21
+ .modal-content {
22
+ background-color: #fefefe;
23
+ margin: 15% auto;
24
+ /* 15% from the top and centered */
25
+ padding: 20px;
26
+ border: 1px solid #888;
27
+ max-width: 95vw;
28
+ max-height: 95vh;
29
+ width: fit-content;
30
+ position: relative;
31
+ }
32
+
33
+ .modal-content img {
34
+ border: 2px solid #aaa;
35
+ max-width: 90vw;
36
+ max-height: 90vh;
37
+ }
38
+
39
+ /* The Close Button */
40
+ .modal-close {
41
+ color: #aaa;
42
+ font-size: 28px;
43
+ line-height: 26px;
44
+ font-weight: bold;
45
+ text-align: center;
46
+ position: absolute;
47
+ float: right;
48
+ right: 10px;
49
+ top: 10px;
50
+ width: 30px;
51
+ height: 30px;
52
+ background-color: white;
53
+ border: 1px solid #999;
54
+ -moz-border-radius: 5px;
55
+ -webkit-border-radius: 5px;
56
+ border-radius: 5px;
57
+ z-index: 10;
58
+ }
59
+
60
+ .modal-close:hover,
61
+ .modal-close:focus {
62
+ color: black;
63
+ text-decoration: none;
64
+ cursor: pointer;
65
+ }
24
66
 
25
- .modal-content img {
26
- border: 2px solid #aaa;
27
- }
28
-
29
- /* The Close Button */
30
- .modal-close {
31
- color: #aaa;
32
- font-size: 28px;
33
- line-height: 26px;
34
- font-weight: bold;
35
- text-align: center;
36
- position: absolute;
37
- float: right;
38
- right: 10px;
39
- top: 10px;
40
- width: 30px;
41
- height:30px;
42
- background-color: white;
43
- border: 1px solid #999;
44
- -moz-border-radius: 5px;
45
- -webkit-border-radius: 5px;
46
- border-radius: 5px;
47
- z-index: 10;
48
- }
49
-
50
- .modal-close:hover,
51
- .modal-close:focus {
52
- color: black;
53
- text-decoration: none;
54
- cursor: pointer;
55
- }
56
-
57
- .show {
58
- display: block;
59
- }
67
+ .show {
68
+ display: block;
69
+ }
60
70
 
61
- .hide{
62
- display: none;
63
- }
71
+ .hide {
72
+ display: none;
73
+ }
@@ -177,7 +177,8 @@ export function SmartImage(props) {
177
177
  transforms: newProps.cloudinaryTransforms ?? undefined,
178
178
  cloudinaryDomain: newProps.cloudinaryDomain
179
179
  });
180
- newProps.sizes = `${newProps.width}px`;
180
+ if (!(newProps.sizes))
181
+ newProps.sizes = `${newProps.width}px`;
181
182
  }
182
183
  else {
183
184
  const breakpoints = [320, 640, 768, 1024, 1280, 1536];
@@ -53,7 +53,7 @@ function parseGeminiResponse(data) {
53
53
  catch (error) {
54
54
  console.error('Error parsing Gemini API response:', error);
55
55
  console.error('Raw response data:', JSON.stringify(data, null, 2));
56
- throw new Error('Failed to parse AI recommendations');
56
+ throw new Error('Failed to parse AI recommendations', { cause: error });
57
57
  }
58
58
  }
59
59
  function buildRecommendationPrompt(request) {
@@ -165,6 +165,6 @@ export function GravatarCard(props) {
165
165
  const photoOnRight = direction === 'right';
166
166
  const config = usePixelatedConfig();
167
167
  const avatarElement = (_jsx("div", { className: "gravatar-avatar-container", children: _jsx(SmartImage, { src: avatarUrl, alt: displayName, title: displayName, width: avatarSize ?? 120, height: avatarSize ?? 120, quality: 100, className: "gravatar-avatar", cloudinaryEnv: config?.cloudinary?.product_env, cloudinaryDomain: config?.cloudinary?.baseUrl, cloudinaryTransforms: config?.cloudinary?.transforms }) }));
168
- const contentElement = (_jsxs("div", { className: "gravatar-content", children: [_jsxs("div", { className: "gravatar-header", children: [_jsx("h3", { className: "gravatar-name", children: profileLink ? (_jsx("a", { href: profileLink, target: "_blank", rel: "noopener noreferrer", className: "gravatar-name-link", children: displayName })) : (displayName) }), pronouns && _jsxs("span", { className: "gravatar-pronouns", children: ["(", pronouns, ")"] })] }), (jobTitle || company) && (_jsxs("div", { className: "gravatar-job-company", children: [jobTitle && _jsx("strong", { children: jobTitle }), jobTitle && company && _jsx("span", { children: " at " }), company && _jsx("span", { children: company })] })), location && (_jsxs("div", { className: "gravatar-location", children: ["\uD83D\uDCCD ", location] })), aboutMe && !compact && (_jsx("p", { className: "gravatar-about", children: aboutMe })), (githubUrl || linkedinUrl || twitterUrl || instagramUrl || websiteUrl) && (_jsxs("div", { className: "gravatar-social-links", children: [githubUrl && (_jsx("a", { href: githubUrl, target: "_blank", rel: "noopener noreferrer", className: "gravatar-social-link", children: "GitHub" })), linkedinUrl && (_jsx("a", { href: linkedinUrl, target: "_blank", rel: "noopener noreferrer", className: "gravatar-social-link gravatar-social-link-linkedin", children: "LinkedIn" })), twitterUrl && (_jsx("a", { href: twitterUrl, target: "_blank", rel: "noopener noreferrer", className: "gravatar-social-link gravatar-social-link-twitter", children: "X" })), instagramUrl && (_jsx("a", { href: instagramUrl, target: "_blank", rel: "noopener noreferrer", className: "gravatar-social-link gravatar-social-link-instagram", children: "Instagram" })), websiteUrl && (_jsx("a", { href: websiteUrl, target: "_blank", rel: "noopener noreferrer", className: "gravatar-social-link gravatar-social-link-website", children: "Website" }))] }))] }));
168
+ const contentElement = (_jsxs("div", { className: "gravatar-content", children: [_jsxs("div", { className: "gravatar-header", children: [_jsx("h3", { className: "gravatar-name", children: profileLink ? (_jsx("a", { href: profileLink, target: "_blank", rel: "noopener noreferrer", className: "gravatar-name-link", children: displayName })) : (displayName) }), pronouns && _jsxs("span", { className: "gravatar-pronouns", children: ["(", pronouns, ")"] })] }), (jobTitle || company) && (_jsxs("div", { className: "gravatar-job-company", children: [jobTitle && _jsx("strong", { children: jobTitle }), jobTitle && company && _jsx("span", { children: " at " }), company && _jsx("span", { children: company })] })), location && (_jsxs("div", { className: "gravatar-location", children: [_jsx("span", { role: "img", "aria-label": "location", children: "\uD83D\uDCCD" }), " ", location] })), aboutMe && !compact && (_jsx("p", { className: "gravatar-about", children: aboutMe })), (githubUrl || linkedinUrl || twitterUrl || instagramUrl || websiteUrl) && (_jsxs("div", { className: "gravatar-social-links", children: [githubUrl && (_jsx("a", { href: githubUrl, target: "_blank", rel: "noopener noreferrer", className: "gravatar-social-link", children: "GitHub" })), linkedinUrl && (_jsx("a", { href: linkedinUrl, target: "_blank", rel: "noopener noreferrer", className: "gravatar-social-link gravatar-social-link-linkedin", children: "LinkedIn" })), twitterUrl && (_jsx("a", { href: twitterUrl, target: "_blank", rel: "noopener noreferrer", className: "gravatar-social-link gravatar-social-link-twitter", children: "X" })), instagramUrl && (_jsx("a", { href: instagramUrl, target: "_blank", rel: "noopener noreferrer", className: "gravatar-social-link gravatar-social-link-instagram", children: "Instagram" })), websiteUrl && (_jsx("a", { href: websiteUrl, target: "_blank", rel: "noopener noreferrer", className: "gravatar-social-link gravatar-social-link-website", children: "Website" }))] }))] }));
169
169
  return (_jsx("div", { className: `gravatar-card ${isHorizontal ? 'gravatar-card-horizontal' : ''} ${compact ? 'gravatar-card-compact' : ''}`, children: isHorizontal && photoOnRight ? (_jsxs(_Fragment, { children: [contentElement, avatarElement] })) : (_jsxs(_Fragment, { children: [avatarElement, contentElement] })) }));
170
170
  }
@@ -168,7 +168,7 @@ export function SocialCards(props) {
168
168
  .then((items) => {
169
169
  let i = 0;
170
170
  for (const prop in items) {
171
- let myNewCard = {};
171
+ let myNewCard;
172
172
  const item = items[prop];
173
173
  myNewCard = item;
174
174
  /* ===== FIX FOR SOURCE ===== */
@@ -192,7 +192,7 @@ export function SocialCards(props) {
192
192
  let allCardData = [];
193
193
  for (const prop in state.sources) {
194
194
  const source = state.sources[prop];
195
- let sourceCardData = [];
195
+ let sourceCardData;
196
196
  if (Object.prototype.hasOwnProperty.call(source, 'url') && source.url && source.url.length > 0) {
197
197
  sourceCardData = await getFeedEntries(source.url, source.entryCount);
198
198
  allCardData = [...allCardData, ...sourceCardData];
@@ -378,5 +378,5 @@ export function EbayRateLimitsVisualizer(props) {
378
378
  // Check for API-level errors in the returned data
379
379
  const hasTokenError = data?.rate_limit?.errors?.[0]?.message === "Invalid access token" ||
380
380
  data?.user_rate_limit?.errors?.[0]?.message === "Invalid access token";
381
- return (_jsxs("div", { style: { padding: '20px', fontFamily: 'sans-serif', border: '1px solid #ddd', borderRadius: '8px' }, children: [_jsx("h3", { children: "Ebay Rate Limits Data Visualizer" }), _jsxs("div", { style: { marginBottom: '20px', display: 'flex', flexDirection: 'column', gap: '10px' }, children: [_jsxs("div", { style: { display: 'flex', gap: '10px', alignItems: 'center' }, children: [_jsx("label", { htmlFor: "ebay-token", children: _jsx("b", { children: "Token:" }) }), _jsx("input", { id: "ebay-token", type: "text", value: token, onChange: (e) => setToken(e.target.value), placeholder: "Paste eBay token here", style: { flexGrow: 1, padding: '5px', fontFamily: 'monospace' } }), _jsx("button", { onClick: fetchToken, disabled: fetchingToken || !apiProps.appId, children: fetchingToken ? 'Fetching Token...' : 'Auto-Fetch Token' })] }), _jsxs("div", { style: { display: 'flex', gap: '10px' }, children: [_jsx("button", { onClick: fetchData, disabled: loading || !token, style: { padding: '8px 16px', cursor: 'pointer', background: '#0070f3', color: 'white', border: 'none', borderRadius: '4px' }, children: loading ? 'Fetching Limits...' : 'Fetch Rate Limits' }), _jsx("button", { onClick: showMockData, style: { padding: '8px 16px', cursor: 'pointer', border: '1px solid #ccc', borderRadius: '4px', background: 'white' }, children: "Load Sample Structure" })] })] }), error && (_jsxs("div", { style: { color: '#d00', background: '#fff5f5', padding: '10px', borderRadius: '4px', marginBottom: '10px', border: '1px solid #feb2b2' }, children: [_jsx("b", { children: "Error:" }), " ", error] })), hasTokenError && (_jsxs("div", { style: { color: '#c53030', background: '#fff5f5', padding: '10px', borderRadius: '4px', marginBottom: '10px', border: '1px solid #feb2b2' }, children: ["\uD83D\uDEA8 ", _jsx("b", { children: "Authentication Error:" }), " Your eBay access token is invalid or expired. Use \"Auto-Fetch Token\" if credentials are set, or paste a new one."] })), data ? (_jsxs("div", { style: { marginTop: '20px' }, children: [_jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, children: [_jsx("h4", { children: "Response Data:" }), _jsx("button", { onClick: () => setData(null), style: { padding: '4px 8px', fontSize: '12px' }, children: "Clear" })] }), _jsx("pre", { style: { background: '#f8f9fa', padding: '15px', borderRadius: '5px', overflow: 'auto', border: '1px solid #e9ecef', fontSize: '13px' }, children: JSON.stringify(data, null, 2) })] })) : (_jsx("div", { style: { color: '#666', fontStyle: 'italic', marginTop: '20px' }, children: "No rate limit data loaded yet." }))] }));
381
+ return (_jsxs("div", { style: { padding: '20px', fontFamily: 'sans-serif', border: '1px solid #ddd', borderRadius: '8px' }, children: [_jsx("h3", { children: "Ebay Rate Limits Data Visualizer" }), _jsxs("div", { style: { marginBottom: '20px', display: 'flex', flexDirection: 'column', gap: '10px' }, children: [_jsxs("div", { style: { display: 'flex', gap: '10px', alignItems: 'center' }, children: [_jsx("label", { htmlFor: "ebay-token", children: _jsx("b", { children: "Token:" }) }), _jsx("input", { id: "ebay-token", type: "text", value: token, onChange: (e) => setToken(e.target.value), placeholder: "Paste eBay token here", style: { flexGrow: 1, padding: '5px', fontFamily: 'monospace' } }), _jsx("button", { onClick: fetchToken, disabled: fetchingToken || !apiProps.appId, children: fetchingToken ? 'Fetching Token...' : 'Auto-Fetch Token' })] }), _jsxs("div", { style: { display: 'flex', gap: '10px' }, children: [_jsx("button", { onClick: fetchData, disabled: loading || !token, style: { padding: '8px 16px', cursor: 'pointer', background: '#0070f3', color: 'white', border: 'none', borderRadius: '4px' }, children: loading ? 'Fetching Limits...' : 'Fetch Rate Limits' }), _jsx("button", { onClick: showMockData, style: { padding: '8px 16px', cursor: 'pointer', border: '1px solid #ccc', borderRadius: '4px', background: 'white' }, children: "Load Sample Structure" })] })] }), error && (_jsxs("div", { style: { color: '#d00', background: '#fff5f5', padding: '10px', borderRadius: '4px', marginBottom: '10px', border: '1px solid #feb2b2' }, children: [_jsx("b", { children: "Error:" }), " ", error] })), hasTokenError && (_jsxs("div", { style: { color: '#c53030', background: '#fff5f5', padding: '10px', borderRadius: '4px', marginBottom: '10px', border: '1px solid #feb2b2' }, children: [_jsx("span", { role: "img", "aria-label": "error", children: "\uD83D\uDEA8" }), " ", _jsx("b", { children: "Authentication Error:" }), " Your eBay access token is invalid or expired. Use \"Auto-Fetch Token\" if credentials are set, or paste a new one."] })), data ? (_jsxs("div", { style: { marginTop: '20px' }, children: [_jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, children: [_jsx("h4", { children: "Response Data:" }), _jsx("button", { onClick: () => setData(null), style: { padding: '4px 8px', fontSize: '12px' }, children: "Clear" })] }), _jsx("pre", { style: { background: '#f8f9fa', padding: '15px', borderRadius: '5px', overflow: 'auto', border: '1px solid #e9ecef', fontSize: '13px' }, children: JSON.stringify(data, null, 2) })] })) : (_jsx("div", { style: { color: '#666', fontStyle: 'italic', marginTop: '20px' }, children: "No rate limit data loaded yet." }))] }));
382
382
  }
@@ -66,7 +66,7 @@ getShoppingCartItem.propTypes = {
66
66
  apiProps: PropTypes.any,
67
67
  };
68
68
  export function getShoppingCartItem(props) {
69
- let qty = 0;
69
+ let qty;
70
70
  const thisItem = props.thisItem;
71
71
  const apiProps = props.apiProps;
72
72
  const itemCategory = apiProps?.itemCategory;
@@ -520,7 +520,7 @@ export function ConfigBuilder(props) {
520
520
  if (debug)
521
521
  console.log('AI Recommend button clicked for route:', index);
522
522
  handleAiRecommendations(index);
523
- }, className: "route-button ai-recommend", children: [_jsx("span", { className: "ai-icon", children: "\u2728" }), " Recommend"] }), _jsx("button", { onClick: () => removeRoute(index), className: "route-button remove", children: "Remove" })] })] }, index))) }), _jsx("button", { onClick: addRoute, children: "Add Route" })] }) }))
523
+ }, className: "route-button ai-recommend", children: [_jsx("span", { className: "ai-icon", role: "img", "aria-label": "sparkles", children: "\u2728" }), " Recommend"] }), _jsx("button", { onClick: () => removeRoute(index), className: "route-button remove", children: "Remove" })] })] }, index))) }), _jsx("button", { onClick: addRoute, children: "Add Route" })] }) }))
524
524
  },
525
525
  {
526
526
  id: 'services',
@@ -98,7 +98,7 @@ export function FontSelector(props) {
98
98
  }
99
99
  return null;
100
100
  };
101
- return (_jsxs("div", { className: "font-selector-container", children: [_jsxs("label", { htmlFor: id, className: "font-selector-label", children: [label, required && _jsx("span", { className: "font-selector-required", children: "*" }), getTooltip() && (_jsx("span", { className: "font-selector-tooltip", title: getTooltip().replace(/\[([^\]]+)\]\([^)]+\)/, '$1'), children: "\uD83D\uDC41\uFE0F" }))] }), _jsxs("div", { className: "font-selector-input-container", children: [_jsx("input", { type: "text", id: id, name: name, value: inputValue ?? '', onChange: handleInputChange, onFocus: handleFocus, onBlur: handleBlur, placeholder: placeholder ?? undefined, required: required ?? false, autoComplete: "off", className: "font-selector-input" }), showDropdown && filteredOptions.length > 0 && (_jsx("div", { className: "font-selector-dropdown", children: isLoading ? (_jsx("div", { className: "font-selector-loading", children: "Loading fonts..." })) : (filteredOptions.map((option) => (_jsxs("div", { className: "font-selector-option", onClick: () => handleOptionSelect(option), onKeyDown: (e) => {
101
+ return (_jsxs("div", { className: "font-selector-container", children: [_jsxs("label", { htmlFor: id, className: "font-selector-label", children: [label, required && _jsx("span", { className: "font-selector-required", children: "*" }), getTooltip() && (_jsx("span", { className: "font-selector-tooltip", title: getTooltip().replace(/\[([^\]]+)\]\([^)]+\)/, '$1'), children: _jsx("span", { role: "img", "aria-label": "preview", children: "\uD83D\uDC41\uFE0F" }) }))] }), _jsxs("div", { className: "font-selector-input-container", children: [_jsx("input", { type: "text", id: id, name: name, value: inputValue ?? '', onChange: handleInputChange, onFocus: handleFocus, onBlur: handleBlur, placeholder: placeholder ?? undefined, required: required ?? false, autoComplete: "off", className: "font-selector-input" }), showDropdown && filteredOptions.length > 0 && (_jsx("div", { className: "font-selector-dropdown", children: isLoading ? (_jsx("div", { className: "font-selector-loading", children: "Loading fonts..." })) : (filteredOptions.map((option) => (_jsxs("div", { className: "font-selector-option", onClick: () => handleOptionSelect(option), onKeyDown: (e) => {
102
102
  if (e.key === 'Enter' || e.key === ' ') {
103
103
  e.preventDefault();
104
104
  handleOptionSelect(option);
@@ -268,7 +268,7 @@ export function FormExtractEngine(props) {
268
268
  }
269
269
  }
270
270
  else if (props.htmlPaste) {
271
- let json = {};
271
+ let json;
272
272
  if (!htmlPaste || (props.htmlPaste !== htmlPaste)) {
273
273
  setHtmlPaste(props.htmlPaste);
274
274
  const thisHTML = new DOMParser().parseFromString(props.htmlPaste, 'text/html');
@@ -54,7 +54,7 @@ function generateFieldJSON(component, type) {
54
54
  }
55
55
  ];
56
56
  // Type-specific fields
57
- let typeSpecificFields = [];
57
+ let typeSpecificFields;
58
58
  if (component === 'FormSelect') {
59
59
  typeSpecificFields = [
60
60
  {
@@ -68,7 +68,7 @@ export function ComponentSelector(props) {
68
68
  padding: '0.75rem',
69
69
  marginBottom: '1rem',
70
70
  color: '#0d47a1'
71
- }, children: [_jsx("strong", { children: "\u2795 Adding child component" }), _jsx("div", { style: { fontSize: '0.875rem', marginTop: '0.25rem' }, children: "Select a component type to add as a child" })] })), _jsx("label", { htmlFor: "component-type-selector", style: { display: 'block', marginBottom: '0.5rem', fontWeight: 'bold' }, children: "Component Type:" }), _jsxs("select", { id: "component-type-selector", onChange: handleComponentChange, value: selectedValue, style: {
71
+ }, children: [_jsxs("strong", { children: [_jsx("span", { role: "img", "aria-label": "add", children: "\u2795" }), " Adding child component"] }), _jsx("div", { style: { fontSize: '0.875rem', marginTop: '0.25rem' }, children: "Select a component type to add as a child" })] })), _jsx("label", { htmlFor: "component-type-selector", style: { display: 'block', marginBottom: '0.5rem', fontWeight: 'bold' }, children: "Component Type:" }), _jsxs("select", { id: "component-type-selector", onChange: handleComponentChange, value: selectedValue, style: {
72
72
  marginBottom: '1rem',
73
73
  fontSize: '1rem',
74
74
  border: '1px solid #ccc',
@@ -76,7 +76,7 @@ export function ComponentTree({ components, onSelectComponent, onEditComponent,
76
76
  cursor: 'pointer',
77
77
  fontSize: '0.65rem',
78
78
  lineHeight: '1',
79
- }, title: "Move down", children: "\u25BC" })] }), _jsx("button", { onClick: (e) => {
79
+ }, title: "Move down", children: _jsx("span", { role: "img", "aria-label": "move down", children: "\u25BC" }) })] }), _jsxs("button", { onClick: (e) => {
80
80
  e.stopPropagation();
81
81
  onEditComponent(component, currentPath);
82
82
  }, style: {
@@ -87,7 +87,7 @@ export function ComponentTree({ components, onSelectComponent, onEditComponent,
87
87
  borderRadius: '3px',
88
88
  cursor: 'pointer',
89
89
  fontSize: '0.75rem',
90
- }, title: "Edit properties", children: "\u270F\uFE0F Edit" }), isLayout && (_jsx("button", { onClick: (e) => {
90
+ }, title: "Edit properties", children: [_jsx("span", { role: "img", "aria-label": "edit", children: "\u270F\uFE0F" }), " Edit"] }), isLayout && (_jsxs("button", { onClick: (e) => {
91
91
  e.stopPropagation();
92
92
  onSelectComponent(component, currentPath);
93
93
  }, style: {
@@ -98,7 +98,7 @@ export function ComponentTree({ components, onSelectComponent, onEditComponent,
98
98
  borderRadius: '3px',
99
99
  cursor: 'pointer',
100
100
  fontSize: '0.75rem',
101
- }, title: "Add child component", children: "\u2795 Child" })), _jsx("button", { onClick: (e) => {
101
+ }, title: "Add child component", children: [_jsx("span", { role: "img", "aria-label": "add", children: "\u2795" }), " Child"] })), _jsxs("button", { onClick: (e) => {
102
102
  e.stopPropagation();
103
103
  onDeleteComponent(currentPath);
104
104
  }, style: {
@@ -109,7 +109,7 @@ export function ComponentTree({ components, onSelectComponent, onEditComponent,
109
109
  borderRadius: '3px',
110
110
  cursor: 'pointer',
111
111
  fontSize: '0.75rem',
112
- }, title: "Delete component", children: "\uD83D\uDDD1\uFE0F Delete" })] })] }), hasChildren && (_jsx("div", { children: component.children.map((child, childIndex) => renderTreeNode(child, childIndex, `${currentPath}.children`)) }))] }, currentPath));
112
+ }, title: "Delete component", children: [_jsx("span", { role: "img", "aria-label": "delete", children: "\uD83D\uDDD1\uFE0F" }), " Delete"] })] })] }), hasChildren && (_jsx("div", { children: component.children.map((child, childIndex) => renderTreeNode(child, childIndex, `${currentPath}.children`)) }))] }, currentPath));
113
113
  }
114
114
  return (_jsx("div", { children: components.map((component, index) => renderTreeNode(component, index, 'root')) }));
115
115
  }
@@ -102,16 +102,16 @@ export function PageEngine(props) {
102
102
  }, title: "Move up", children: "\u25B2" }), _jsx("button", { className: "move-btn move-down", onClick: (e) => {
103
103
  e.stopPropagation();
104
104
  onMoveDown?.(currentPath);
105
- }, title: "Move down", children: "\u25BC" })] }), _jsx("button", { className: "edit-btn", onClick: (e) => {
105
+ }, title: "Move down", children: _jsx("span", { role: "img", "aria-label": "move down", children: "\u25BC" }) })] }), _jsx("button", { className: "edit-btn", onClick: (e) => {
106
106
  e.stopPropagation();
107
107
  onEditComponent?.(componentData, currentPath);
108
- }, title: "Edit properties", children: "\u270F\uFE0F" }), isLayout && (_jsx("button", { className: "child-btn", onClick: (e) => {
108
+ }, title: "Edit properties", children: _jsx("span", { role: "img", "aria-label": "edit", children: "\u270F\uFE0F" }) }), isLayout && (_jsx("button", { className: "child-btn", onClick: (e) => {
109
109
  e.stopPropagation();
110
110
  onSelectComponent?.(componentData, currentPath);
111
- }, title: "Add child component", children: "\u2795" })), _jsx("button", { className: "delete-btn", onClick: (e) => {
111
+ }, title: "Add child component", children: _jsx("span", { role: "img", "aria-label": "add", children: "\u2795" }) })), _jsx("button", { className: "delete-btn", onClick: (e) => {
112
112
  e.stopPropagation();
113
113
  onDeleteComponent?.(currentPath);
114
- }, title: "Delete component", children: "\uD83D\uDDD1\uFE0F" })] })] }, `wrapper-${index}`));
114
+ }, title: "Delete component", children: _jsx("span", { role: "img", "aria-label": "delete", children: "\uD83D\uDDD1\uFE0F" }) })] })] }, `wrapper-${index}`));
115
115
  }
116
116
  const components = [];
117
117
  const pageComponents = props?.pageData?.components;
@@ -126,17 +126,17 @@ export function SaveLoadSection({ pageData, onLoad, apiEndpoint = '/api/pagebuil
126
126
  border: '1px solid #ccc',
127
127
  borderRadius: '4px',
128
128
  fontSize: '1rem'
129
- } })] }), _jsxs("div", { style: { display: 'flex', gap: '0.5rem', marginBottom: '0.5rem' }, children: [_jsx("button", { onClick: handleSave, disabled: isLoading || !pageName.trim(), className: "button", style: {
129
+ } })] }), _jsxs("div", { style: { display: 'flex', gap: '0.5rem', marginBottom: '0.5rem' }, children: [_jsxs("button", { onClick: handleSave, disabled: isLoading || !pageName.trim(), className: "button", style: {
130
130
  flex: 1,
131
131
  background: '#4CAF50',
132
132
  color: 'white',
133
133
  opacity: isLoading || !pageName.trim() ? 0.5 : 1
134
- }, children: "\uD83D\uDCBE Save Page" }), _jsxs("button", { onClick: () => setShowLoadList(!showLoadList), disabled: isLoading, className: "button", style: {
134
+ }, children: [_jsx("span", { role: "img", "aria-label": "save", children: "\uD83D\uDCBE" }), " Save Page"] }), _jsxs("button", { onClick: () => setShowLoadList(!showLoadList), disabled: isLoading, className: "button", style: {
135
135
  flex: 1,
136
136
  background: '#2196F3',
137
137
  color: 'white',
138
138
  opacity: isLoading ? 0.5 : 1
139
- }, children: ["\uD83D\uDCC1 ", showLoadList ? 'Hide' : 'Load Page'] })] }), showLoadList && (_jsx("div", { style: {
139
+ }, children: [_jsx("span", { role: "img", "aria-label": "folder", children: "\uD83D\uDCC1" }), " ", showLoadList ? 'Hide' : 'Load Page'] })] }), showLoadList && (_jsx("div", { style: {
140
140
  marginTop: '0.5rem',
141
141
  padding: '0.5rem',
142
142
  border: '1px solid #ddd',
@@ -167,7 +167,7 @@ export function SaveLoadSection({ pageData, onLoad, apiEndpoint = '/api/pagebuil
167
167
  padding: '0.25rem 0.5rem',
168
168
  cursor: 'pointer',
169
169
  fontSize: '0.875rem'
170
- }, children: "\uD83D\uDDD1\uFE0F" })] }, page))) })) })), message && (_jsx("div", { style: {
170
+ }, children: _jsx("span", { role: "img", "aria-label": "delete", children: "\uD83D\uDDD1\uFE0F" }) })] }, page))) })) })), message && (_jsx("div", { style: {
171
171
  marginTop: '0.5rem',
172
172
  padding: '0.5rem',
173
173
  borderRadius: '4px',
@@ -1 +1 @@
1
- pxl:v1:18abfb175f3eda28fcb71b19:88d9139c5e6c054df401944497a84a85:7b752c165f15de118c4443b8c4163493f501bba71b244f91547e65bdf73b7ef08b0bb6002ccbfc60da18e4ad08058e83c9ca982587b6bba7e7a12d7d938907228cdd2e3910ae8af3b89d591a1155499f069dde0ff0c6b1900c4c8fc3dc483bea9756d46127258633ecf04b2233ab5ec33cf5dbb0d8c2701b93a8b73b0ba5381e7bfc0ee16cc4f9b97a244f909499ccb28424abd6cbe7aba404b405af61933bb2ce98605af816b98f0712bb106581cd66c381efc0541141c078d2cc776164f0485b80d7bc5d65de302b975769ead4a4d73fa732b08f5b1c2c7b5e4aedeb02b478e21de71cf63592121c008668f819aae230d12511ec9a4bfbba8878624b0fa9d3dd94af75f1c02b79fcfaf2632bb58e9dd2015a5fe105ab5b1e6fd41e52a62ee6b320af44927748877bb058c94ef4d04bba5f54fa89bb4bc3133195e4ee2684f88eb02c3a5169a77353c3313aa70a164b37572325fd649498b2893d39c0f96142ea5d4273d0dd6b20119dbfeb0fe7e4534015270bebdb72bc6e209d95450303587fd0e46da080da61264df599f856b17d31bbf4e83f22d10937fd91108c24ee0d5b01c2eae1ae42f5f0035026b0c713655740e1b191fcd1164f35fb530d6e5569f0b1b57cb8caacf840e70bffb2722651e3cfcd98d89a8b4db933fdebb9ea686f1356c176c6c9f8af18a6ea1d9e1209f7dee17db270480fd572e4a3a41695cdf8336ddd2e233ae13c09f6c8a7acc6a115db21c0c25abec8b8b9fa25e207404117799a4caa21835ab95d03ae2acd0e0e40ed55adc5d64dd8ef2071a342a5d51ed89b7a098407656af61047eab8c4d5c882097316bec3ef6fbcc541dac6e03484d682dcdc1b452a7d4459882d3a2c6256869c86133708905e033e8e5111a6d17c78d9fa8cf252319dba026167d54fa2c6301c84381bb24b202ffb48f58edd48728de570dd3f5dfdc3e4920e803c4219431925bf2d651e1fc27e4368c6244fba498f66d5f4426a45918618ce0541ec48e330f8860d852483f4e10db4ef1cbcf216d82de6e0b6ac987a4492b53533c353e6e7238f5bc2b51db693c685ec7ba250d53af3fcd69b5e697524887dca88f5d16d5548dd364c38a50624072e270bdff6e782415a8aa0acd14ec22186518a0fb49f695cabcafbb4d9a5f04959efe36284e332d50cb0dbcbe81822ec5b618260c4d4c816b1de6c08f42a874f07c01ebfbedb4778c75c3fccd1a34c4adfa13f85ff2887a4e403a139eba2d92d0862dbcb051f8d2fa9737e5f80f1f755359015244fc72b8971391222a2e526493fc9f058b7656c2b1c77eb1143828a2ed8665c1d13d23598da5c1856f5f2669709a321052b8232e6d6044ce84dd083fcb64c34828bfcda076af0ea40a362172b98d39ed2bc7e45c31ea7f11429bffcf1df8dd1ed35564101ee89e368274ff50a55b4ad5edb0cf9b2144ce117254ee6ceaed213c45cfead5a25861844ec9502ac96196a8b43577901b68958dc2d7e1ec000a429540b0fdcc469d43d4dd1d2863828507deba7c9a18e49b6c234309f505205b3d900c2dfd967fc532a725e24bcf39005fdf3ccb5350c6d2713b9935dece88f741eb9e0fb3c0696c52c9a92d4d92e0d296d175d852f722897bc3ecb85a53ddf3aeb45bc5b262e83f4fcaf8679c515541e58f1c084351aed15081eb5d33965f7e9bcc69f3c112adff17bba33f5cfd91f7ed173f08c02e42b29fb25d62ad3d7dac1c0a3b5fa97a4537f1f983e08da6fd60cb38becc41894d16e367b959926f05a60864e04fd1965e2395ec76a22dd6b99efdeb3ca61935732f0e62c8ad26a22f1c0846ea56a54274d03c3c62666a6172daa85088b0fab81198174836f4f5b0635f7fb416066d6f42ef16738ac04c4ea84bceb54cd8fe02b4caf211e323737bfe92a5bbc1c1fa80d30cbdb03644197eb01d54df8bcd2a45d5090ef4448f59c77d248152969a73d24f7748a13a37ae30ec91ad854dc1c3b700fd26a3d00c887f6a323ad1fbe2d73526b7862198bfa7892306e11cad0d4be8945587fb11e0dbd4c12612c5635b934fcaac6c657e5741c2b7fd8b3a4a85267ceec54b8996f9c7b2597e05a3387fe8bc6f0771a9d48b81081083a424faee8ad1b2d1e6f2c642601cb638608c9546b894916f05f7f1b5fff08e7c0dabe672e688a15bc22e26492994fb79435cb4cd26a1e54ceba10114e368899dc139f1f364e2fcab599573d0f98dddd2db287d7613fe16b3bc56cdda1f52b9f481b81cb72d5108bd071a5c1cf14289b61d144afc26691ec37db143f84fdc57aa416a289467881f06666dc204c66d8847e40467eb2954bd058286c3e46a82c1ced4156df93d8f0fb02e478cf58e46f7d70ee77edb5a8bd7b1240aa5ad0c8a9874081c7c13fe178092ca50b051b2f95bb618688fd075266b57f10a03ebcc3935cfc6b06a348b54f67f7f6dbf75b1bc4407e4dd158d84f2aa9871e2976e28766689d6594362dba0f8ccefcfab3fdd603f31ed5ad63d6bf98eb73f3a3bb38561395746ec811c04ff241fffd14b5d280da67fb865ea1e2cccd7ca902b61f849936d7760f37785272dc6d8f9c7f0838802cc9410ec98e9d41db26677fef0bf710a62b22610718c3fc5ab0fb188d295d1eaa1a98c9d90e57501db94b5c8bbae4ec5440726360d8cdaa9c9e84ddcfa046db2c5bba29498bf3088a8a86aa097f1155324de34e07bd1fa6388e40ec15ecd9d790409754c86767d0f2dff63054cfa17bc56c5888705c1953c6673b5211f3325a05c35cb7f5638b5efba2f0307d03d9197b0463356e893d4f01c4c5594e0ddcf9d425b95575b459b7711c87ee78b7a76eb738a92b6aa294b164b4500096c0da71d072b71e61507de8aff343db309469d3164a982e8c49e5a972fc6042740ef2fd640a7a75d6f56522a7833beb49ad143ca9d4b809378e52d944a9c248892136752984578a39fbc6a69198df8710469cec7234f7a30be36837df4dab8790a00ac8fcc90617f04ed5a6f112332fe3ef489f3e21d8df1a45f50e4bde9a73686d0adb177e8a9ed3f8d78f35417e0de0c8e516a58f9b042a3fed04332385ac06965e0699998b52d567c337bab2c9b938b7a2b83ca78c99d2dc64f8e9f4fbc78dbf52b63d9f9c07ffaf69522009eb8c1764566daad9591e979893bc26f4baa0ce9ca92b13dda352421aea067d68703cf6496442fc109e9c48567a0879421040ccddf062c15b7adb888f6e6c0ac2dee7283de42b0b0cd2e785d6d130a2692a4d6589756f959581016079ec23fc9d59ceb2906fabd4c6181bb3fb226750bac42a10ac80472e8b3c89d5543e1368e6a2b78b6d449f1c60e63c20134a229ceb4cfce0b86ebbcf257a6aa6e8b1d83166e5178d6d3d3c0996469b52aae46fc04a704709032a2974fff1b0d6cd4ec57b3571bec80e63a0a92171d4307a28b87b48d5224c360a67fe671b69fe482555e8a2103dd0dbee0cda986e225ff4ec5a3b5c4488c8a4ad9458ac9f5108894358ff41740ae6725e2740fb5fa8129ec5fbec951aa087d42f1dd9bc06880ce1dd55b5e7bc233b2779d62489c9ccc6be147d107d7727c0679e2a53b0c19e9f763771a2b71affdb21139cb68711faa079848ba805277cf8e8c6998435d8985ad0167113dac10ca510b3a93d0f56816760ca3d7b13127bb67c49b36118bf1f2e3fce3adfc6c3fb0ab737abc41f55552a0ab6a8094800b416f8a8b4b289f04fca273a58bb953d2d7ce1f0d4f379387c6900df1747d04ee16b3089a4487c55d9d3e90f873375c4eed4d87f61c6b1272b56e9fabe6410238490c39461360f1e9e062f7ddcbca3bd3a364b6b1beb8fc2813244ca4de827591b546234355d1a5df99a16829aa3469950e121e82fe7d8b437a7d22829bb35fdc8f24e2dc865cbfd9e2d4e4bd1d730dbcffa6d590b4ff3c6d25a0b6f3b3f968170c27fd63720506b3ee70b3b768fb1b2d298f10eb2c7c6942aaee3edba9ed5389770f3653421a7043d3da7a0a7b1d8b78f0dc4cea26c0e499e7d1b39103158d7a9c96672832f3211d00acc978fe6c6e8d1e1d339a97bd38eb9132e2ed3458125437eff12b3c0f3f8a886845bc093b5dbf4c3461b0ad5581955f1ba2147e4b69f89fa44bba25fd328c99179da337b2e364f096f162a861c21372528b09b3f9e8c2fa2d0f07ff2d186f141cc37e8129d496f92db1ebcbc6728e2d30976159b5dd855209ce869a0ef6cbf1e23a9a4449830e74b850057df371657a4b8742038dd6988e646f26a3d42066ac4c1e7aff56a1b745b44478c98efbe95cef831420a293e88f91e36b44cdbaf32b2a5baae26a9c11086e8adab9bea6c2f4ad518a621a1e962e80a15bb321ffc5c3a74ed8f809d796248df548fa7fe7b887591c474a922969bd5921deb6a2e0b92265cfd7d68eb3d43fa77f1ec978b934c1654cfb482dd67a8eee6aa83eb82c22ac047c538512068ddb0e9bc078f5072bf979c5aea6ed010f62e8871a765e4717b7eda6fbc49dffc6e1aed93b5851c023c3a606b393a184e40b0a18b179058de45a3b6054d156d8f015d5450f3956eee77973b41df51b2e59828ae3f75154f57b3d739c8ac22fcfe911289c3acde01aabcc2d72b530e537c534d06a5349a95044a7d433ef380b0c1eb650a535228835c0fc4cd7060e0dabde4a9e6b79554dfb01dd91149d3876e4363cc0dafeae2af3589d411f0e269c26958097586d856c2fcbbb970a3a904f138372585e4db360b6f70e48e99e1001d2de573f50c23b8c769804e1f1c7c5c82078abbe9c4efc6c69a58792952b00e21ff6ddf97ef5089456776eb0f6ff1ba403e0cc9d75744f0487caf14815ea870e950464f40f829cf7375c2392edaf7026fb5f1b911d7ecad096e3a936f7ae374335c82736acd1937041bac88f36402dc20fcc2fe7f9a078f50c52349ae091de47775411753f64598f91245092072b625dc082243e3226c7232836f416dc7c0b2ce45ec8212eaa58c328a3adbf9b604ad960714df0958213bb6c269ca9547f2d2ca2f75aff91858de806f19aac2da3344294eb397d387ca223400736ad33512460107a8c3d18b6e6aea341bd287babf266209f8bc5e94a94d3298bd839115f3da00af1e4fbd8529fa6c69883a128a55cfc82041afef78f8d7cb3c4c8593b9259f56aa7dc465887232ebee84
1
+ pxl:v1:b3a4313ab5b83f3892f9f463:120a8b22fafe51e3c603cdcaaca9b922:ae62d0122364ece5f61f4f091ca72c66130ffc8a3f1079b42299826fd56b95529852468e84cf1ef9e7da72be9592af371846c65d65afc6f9447ff83029a33f152d2df1e22f11c83e3554b843c0a8b76456f2936457311f6896ee0338ca57d7907112a56ebb2744b82efb72aa782859c6701fcd8b18ca8c981523a00c28eb96f5742ed296712a16f2e7718e6405af2256eb0eaf9488059f15a08f7ef7ff83b4e6c43cfa74bc86a892f5bd435b19bce33edf166997e9987d50834dcaf3ad7a1b636cc81a0f9fba6efd70e3e346aa86739a575aba7be81a29d52818e6f6960a5c64791465ae0db6b543086f6e119af17c2a47a5f4aebed083c421ddc6a1a50b664edb408038ccaa8debef0d78fdfc493189aeda01ee31e6417f2e0fd3ed144d57d1c45d1dbed67d2ca8645722216526d56701d8ff38b5d96704ccdf0452b205b1ca5b037ed3677ccf7adf76e540efc764d7666feffc3d0c09196569c5b66d6d86fb201514fd6ffea6469846fbebceca4c612a0cf84051d22274088febab65dd65f1f438f631dda0a4b19148a7cff758a65c4cf7610d16e4bdaf98d1c116ba77e51b0064dc1a666f3824d964cfe04d00dae187168660c538615f0055f37607970c9dd20b205d2148e75f8b18126f75b4c6b2f54529730cdb32b8777772f29ff532a1c5bbca99ed07e0bb2d6ca20646cda4b0a2826c72f25ce7290ac93df615ada9a817660a4fde7bdacfeaf4b6a21bcfa9f05ef458d632f1ab7b3b0e97d47c2ff9a171abc873af793d1d5a182eccad7e056453277daa2c4c8c04226be9604e076116101eb0b9116851bf6d793ee76de946d55bfc4cae9995bbfa1738dd865bf912714b556e6c3f67b179441a6c01499b347c863309d5fa6fb67201c3474822e6d8898ec2d61724f00c77cdc64a36a13668f2d97728a86f5a3fa27799bdf967ecfa7c101160961fbdc45693815378f6f43ab1e43a611026f171e690f6a0d7416f960ad693f738f5acbeb113743bf51f343145b03b297250932100e96f9b16af46ab9f30aac25f5c8fc0e7cf848fb0288b7fea643e0d3201ddf56f2c40d9f34bf0946e83d0d25abcb991b75a88d11f4cd6f62f94b6e5d68e619b1874abd08b3da90b5f4cd76a063ef458b5e8dd2ce2fc77b0b625af24afa53a2331d338d94839322887f95e01a0f0df57242f64025a22cd8d1be940ea98fbdb666203377cdcd2047139bd210767729bdc2c67692f2f1a4c7a364aa11b9742f6c076620a472c42c0b40c3f69b3ac0a2fca5fef92c6b642c2c00b2c77124e2e3f7543347f6dc50545506cf79b3e82ec5b830bb229e68e48ebc1c52b7d8772eae04b9ec4863d16ba037aa19ac18482a9ab53661ca1a74c1c7738f26203e315ff5a2c1fe2fe82e95ed50c402a2c8ffaf7fd8570317edc196c26cfbb6c10169f82b64ec32f330501956ae78724d6235c6087e21e01cd5836fb20d0c17f0ffeace53b869896b1a8ffe74c0708ab8573695ac02cfaf19efda6a29fc01f123fc3ad666b4b38b4c5a07952705fab707d8e1bf4cbe613d01015f9d7e0e912cc729973817cd31242d05d1710964e3d94e06b680b332ffc5a66e4e5208a7f1169d12c31277fae4c4a4dd57cce415a87d5b167a56b9bccedee7862e02fc6d025ea4c3431061ef4fc162c9e2385a22d14ec5d89be0094d3ee56aa45434c5e0688bda8c01aed1bc8a86484f12b03a28c8dac2d7f429578267b41f66a64d51e9970708c828093598a6af822ab28828ef1a0cdcc8aa0c1c4285e4920ad56cd96ba3d496a2df1aa66635194343af301b7d0f25378bfbd88844c9888522888f3e00386d2503699a7370ad2267d67fe4e1d16fc7cba0b7f68f4a8631c33fbbf33c6af7ceec388dfc3c0b2ccd737bae46d35bd503d5c3fe78ef292a2ed43504ad943eaecca20dbc6a836845b6d21a1e8796cb6a49552b2fb6380fb02e2bc7146f9b2c6006e234d2d3000828a679281e383fc06a4192eb9ebc54fde74d492a2eb4e32be245e06134522e3bf33504c3c5226eb8a6617f9839e07aa27054128be1bcb9230a45895345f30ed14e8fd5afb4f530ebb96c00fb70ad57c463f8dfd72bfe12276f3127be6147987c912156bbb1227f3116a4f5f3d5a5e4f43cd605dbac4bd4cfd48a1919f8dd1d7f718127dba08b650d23a8bd6f452073ab3017f8a7f5f9493129c5b3d3d31305d25979e190cce3b1bff1798d761811bb86092a1a6f5ef3c7dda3d7b5251f8ed84ad29737fdd6e090a2a014cfc03bfd434f02bc069a0768233d0ca7fe893536653bd91ff2a0004199d42da32321dcc75bd3ff690ad3db60a05b84d62a034ed5e25e455c23e06e309a52d39d39a644a4d81cacb854d925c9b53bdaf491de6f7a599b0df7774fd5639e5c5485c82184959cfaebf389e21079b85913670782b2dc96a3b04e6e798506d8a678909f226da6b10161aa229b10d4800e6cacc3939e20dd4e64f97ba0ec036d5f77546ff7a5a6726e325f2f9925530508b65eb86e8469bbe4af83b4b6c4375615e1ca84383eac490e050f1a85eb36ea55892231d329e557593037a45ee67e146590b11f555617b13cb3f7205ebf01e90a3fe811f0ace688d2e019017544456ac060f5243bc7e0312c1200a20d8f5134eceeb9154445194bb8c0d0d2d04fedb9a202247e8c04c756616ad2642bcdd52e22d46a341ad00e8561d424219e55e25f87dc1b2f7ab0df758419ade1b168082b6c2a2e8cb39c629d5483bfaf4bd465979a0b6e40c7a61d4eaa93b7221fcd42b8e691370e2ca3a11afee8d03c5422c8355762dd65672afbfa4a017fa4341f234e8c99a4b75baeba4b008acce06bfd6227d744ed15c15daa0e430c6ec6a8bf5fe55366cca2a52ed4859401d54457388256c6cdbf26b66b65dd51f8ab89590062aae870aa872c9847ad7c25fa209a0976e27dde1f19b8b7daf96220b2a01344c7ba2b88e38dd3e06b474c5716c806700773794e5940cd1d928d7509fb625e760f099d06cbf604b123dfa29e4c8bcb0465821e050b779d893368e153a1033a6d7ed5ffecf228b3cc295fed48dd287126dd090e1485d905ee993c67f1a71d64b6b826bf0536a31ab6482030ea78a08b67218d044e3a9932255b7a0b61e6aedd19ef7b59ccf62e5662b31d466448c93e700102545eed863c07823099b5e7e9f0daeccae9ad927bfc3e923647cefecae447db3465840dd2439ab5d8343b0ee81a124596b1b54cb7c4d37b7072c4990e3237622d9ad8403f966efe3ac8f0b854219de3eea4d4cf8e7a089b889cc559beee220240ad64960c1e65cd0864205141557e310b398f82fe363a15724636522b58d94a8a2b3fbb692bcb81c4ff8be3b1ac1beb12bff9f2b7d0f6bdc84b2b38dce2521f91fafbe3b04380c0f47e7b9486c616f3c52f3a78a8ba1fc284fabe99132135ea241c9d17da4c5acb0e57c5815d910d9902dcf7e0ec80138e548fcc82c8ab29ae2d5b190983f151f985c50c73ecefb9957d8e17548fb35a78eec469e851a3cdcffd3378c42525f0809b57eaf341585966cecd58928e3a6eb5d43e29b50f050a6a0e530fecf4970f56a4e02890799d2f51b5aa83c2794c7d5cbca861ad90dbc73992808f2760ae511a62a4bbc5f9fd6e0546fe9ba864361131ea38a211248666cbcfd925893e6438a317bd7ed2666be3925ce3169e9d843dc591d55e09ecdc83d7f9b1c1fb9b6820ad98f9ec193761cf1536b22fa76db66e4fda831204961a91aada53735723cca2d89e48685f8f8b1b7dcfbb6802076a26278b0f8b827af9e5fadd2f9f28d5881ef2a1f714deeb3b3d8aba3e5edd6363d8006946d034271262d6a9e3b624b2b1b2d93b52d03480bac7700827d18c738923150161aea04736a38e75c7eccd1ca855d441ac8a456b16bed82d839e9851b49121eeb55d3b128e2e63839fcecd9f7dfbcb405c6d03b35ff577b06290fd632b94f9c8dc539c9e1fb5cde40964e708cb5ac76ef437523c4711e288fb928d7232c37f7d394c9e5b8ee98f6b66e3639ceb9afac823c244873d5c8bdc48244ab6aba32d5f8329e8a4ba4e97c7f522d1b3cd356ff12bc9774397efd7795cf1a9e544b51a9b29244ed87a237a6c9f802d6c0c4969d1d7d02b677a7bdea03cac5aff432c08d2e0730e3ea58b2a0d06246fdc55f4532fc690dbd76b8758ef1a13163915450a502223a18df4a114231023687850dc58d093047cbf4ef6a46463a048206a46d3afb5aad7da80f7931a0f13fc931ad601d88a90b05ee36f60ef1f48ca509691d988ce383aac54cccb0aca76bb1f594deaf77dd2696b029fb893ccfff0ac19dee4bed4fadae40e9208fc702eb7e4016299212caac4dbb1c142429c47fe55cca7de52aef6f00f5641fbc35f1ba0cb1c430c28795e1678706ca899b250fcc600c7ccf32373a37ffd2799cbdfd40e0bfaa0c7b20dfb475a387e76cfd308ce527f5487754ba4149a35bc3e6e123384defff6bcee20f9e1a726941b843ed2e96448d1952ff980e5799b064f55bcdc61710e3ba5a2349b2a0c50b0d4e7b1985b2c2e617c97c82e63b4ddb5a0754ed8e0f67d342acc7f0c7d347375c248398edcf624be16fd7ad6d45cac59378b9abba95b5661283ff2ce347077a837d64a6e6ae0e1606f8c2c776d6c8c4ea0093421da6050ea91a2542ccc8279b1f0e01d7b62df969d068c459b8343349ab444fd971d152cf8856b42176ecb118a5648636b60e01a520feb2e05e062abff9803ab2b40f7f173e1660badff72b7e6e8f95572eb957b74cac785e9ab2f2fc169b2488e9c9e7ed816c745b266a8166e98de744ace3ffdcff18fd96fb5b36ca49c0c390026b48ef307ec596e6e87a01ff988ee2bf2f5cdc3a42e63c46563d2d182897cccd4bae44d166b2d1e67b71b7a7e5f2fbad59d3e434daeb7ff53e8daf3a32427b96cfe4e64059ed69110f3d61426bc9dc5e2341ca02b90ebb42073325c4eda62906ca1193fd0e358d121a565c5fab73ae66c20b278e2d5bb3f568132e4495771014cb707d6a808430a191519d83797410328156d4726dbd02190d17a037cf9025f794089daf2d55f8945a40b1f3e4bdba4d65d0505d3ea3fa0b87f0af0e774cd35f236810c150fc4cb9c9e0d4ad0b488b6dd8f21f4e0d2e442790e818e1a415481058db4686817f02fb6554ba90
@@ -255,7 +255,7 @@ export async function createAndPushRemote(destPath, siteName, defaultOwner) {
255
255
  });`;
256
256
  await fs.writeFile(tmpFile, tmpContent, 'utf8');
257
257
 
258
- let execOut = null;
258
+ let execOut;
259
259
  try {
260
260
  execOut = await _exec(`npx tsx ${tmpFile}`, { cwd: destPath, timeout: 60_000 });
261
261
  } catch (e) {
@@ -273,7 +273,7 @@ export async function createAndPushRemote(destPath, siteName, defaultOwner) {
273
273
  throw new Error('Missing provider output');
274
274
  }
275
275
 
276
- let githubInfo = null;
276
+ let githubInfo;
277
277
  try { githubInfo = JSON.parse(outStr); } catch (e) { console.error('❌ Invalid JSON from config provider:', outStr); throw e; }
278
278
  const token = githubInfo?.token;
279
279
  const cfgOwner = githubInfo?.defaultOwner;
@@ -373,7 +373,7 @@ export async function createAmplifyApp(rl, siteName, cloneUrl, sitePath) {
373
373
  try {
374
374
  createResp = await client.send(new CreateAppCommand({ name: siteName, platform: 'WEB_DYNAMIC', repository: cloneUrl || undefined, accessToken: githubToken || undefined }));
375
375
  } catch (e) {
376
- throw new Error('Failed to create Amplify app via SDK: ' + (e?.message || e));
376
+ throw new Error('Failed to create Amplify app via SDK: ' + (e?.message || e), { cause: e });
377
377
  }
378
378
 
379
379
  const appId = createResp?.app?.appId || createResp?.appId || createResp?.id;
@@ -162,23 +162,31 @@ 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
- UPDATES=$(npm outdated | awk 'NR>1 {print $1"@"$4}' || true)
168
- if [ -n "$UPDATES" ]; then
169
- echo "Updating the following packages: $UPDATES"
170
- echo "$UPDATES" | xargs npm install --force --save 2>/dev/null || true
171
- echo "✅ Successfully updated: $UPDATES"
172
- else
173
- echo " No dependency updates needed."
174
- 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"
175
182
 
176
183
 
177
184
 
178
185
  echo ""
179
186
  echo "📦 Step $((STEP_COUNT++)): Updating Audit Fixes..."
180
187
  echo "================================================="
181
- npm audit fix --force 2>/dev/null || true
188
+ # remove --force to avoid breaking changes
189
+ npm audit fix 2>/dev/null || true
182
190
 
183
191
 
184
192
 
@@ -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
@@ -49,7 +49,7 @@ export function zipPixelatedTheme(inputPath, zipName = 'Pixelated.zip') {
49
49
  console.log(`Removed existing zip: ${zipPath}`);
50
50
  }
51
51
  } catch (err) {
52
- throw new Error(`Failed to remove existing zip '${zipPath}': ${err?.message ?? err}`);
52
+ throw new Error(`Failed to remove existing zip '${zipPath}': ${err?.message ?? err}`, { cause: err });
53
53
  }
54
54
 
55
55
  // Ensure `zip` command is available
@@ -74,9 +74,9 @@ export function zipPixelatedTheme(inputPath, zipName = 'Pixelated.zip') {
74
74
  } catch (err) {
75
75
  // Normalize ENOENT into a clearer message for callers/tests
76
76
  if (err && err.code === 'ENOENT') {
77
- throw new Error('`zip` command not found on PATH — please install zip (e.g. `brew install zip`)');
77
+ throw new Error('`zip` command not found on PATH — please install zip (e.g. `brew install zip`)', { cause: err });
78
78
  }
79
- throw new Error(`Failed to run zip: ${String(err)}`);
79
+ throw new Error(`Failed to run zip: ${String(err)}`, { cause: err });
80
80
  }
81
81
 
82
82
  if (result && result.error) {
@@ -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,2CAwDnG;yBAxDe,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;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 +1 @@
1
- {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../../src/components/general/recipe.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,cAAc,CAAC;AAetB,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,GAAG,GAAG,gBAAgB,CAuD5E;AAwDD,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CAkF/C;yBAlFe,UAAU;;QAT1B,kEAAkE;;YAEhE,qDAAqD;;;QAGtD,uEAAuE;;;;AA6GxE,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAOvD;yBAPe,cAAc;;QAV9B,uCAAuC;;QAEtC,+CAA+C;;QAE/C,6BAA6B;;QAE7B,oEAAoE;;;;AA+BrE,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAE,KAAK,EAAE,kBAAkB,2CA0CxD;yBA1Ce,cAAc;;QAR9B,oEAAoE;;QAEnE,oCAAoC;;QAEpC,wEAAwE;;;;AAiEzE,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CA8CvD;yBA9Ce,cAAc;;QAR9B,uEAAuE;;QAEtE,kEAAkE;;QAElE,4FAA4F;;;;AA0D7F,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AACnE,wBAAgB,SAAS,4CAwBxB;yBAxBe,SAAS"}
1
+ {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../../src/components/general/recipe.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,cAAc,CAAC;AAetB,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,GAAG,GAAG,gBAAgB,CAuD5E;AAwDD,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CAkF/C;yBAlFe,UAAU;;QAT1B,kEAAkE;;YAEhE,qDAAqD;;;QAGtD,uEAAuE;;;;AA6GxE,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAOvD;yBAPe,cAAc;;QAV9B,uCAAuC;;QAEtC,+CAA+C;;QAE/C,6BAA6B;;QAE7B,oEAAoE;;;;AA+BrE,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAE,KAAK,EAAE,kBAAkB,2CA0CxD;yBA1Ce,cAAc;;QAR9B,oEAAoE;;QAEnE,oCAAoC;;QAEpC,wEAAwE;;;;AAiEzE,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CA+CvD;yBA/Ce,cAAc;;QAR9B,uEAAuE;;QAEtE,kEAAkE;;QAElE,4FAA4F;;;;AA2D7F,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AACnE,wBAAgB,SAAS,4CAwBxB;yBAxBe,SAAS"}
@@ -1 +1 @@
1
- {"version":3,"file":"ebay.components.d.ts","sourceRoot":"","sources":["../../../../src/components/shoppingcart/ebay.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AASnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,YAAY,CAAC;AAkBpB,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AACnE,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,2CAmG7C;yBAnGe,SAAS;;QANzB,8CAA8C;;QAE7C,mEAAmE;;;;AAwHpE,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,kDAqEvD;yBArEe,cAAc;;QAN9B,0DAA0D;;QAEzD,yCAAyC;;;;AA8F1C,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAwDnD;yBAxDe,YAAY;;QAR5B,uBAAuB;;QAEtB,8CAA8C;;QAE9C,0BAA0B;;;;AA+E3B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CASvD;yBATe,cAAc;;QAR9B,0BAA0B;;QAEzB,sCAAsC;;QAEtC,6CAA6C;;;;AAkC9C,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAuFvD;yBAvFe,cAAc;;QAR9B,6BAA6B;;QAE5B,wCAAwC;;QAExC,kDAAkD;;;;AA4GnD,MAAM,MAAM,4BAA4B,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,SAAS,CAAC,CAAC;AACjG,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,4BAA4B,2CAgK3E;yBAhKe,wBAAwB;;QANxC,iDAAiD;;QAEhD,uCAAuC"}
1
+ {"version":3,"file":"ebay.components.d.ts","sourceRoot":"","sources":["../../../../src/components/shoppingcart/ebay.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AASnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,YAAY,CAAC;AAkBpB,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AACnE,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,2CAmG7C;yBAnGe,SAAS;;QANzB,8CAA8C;;QAE7C,mEAAmE;;;;AAwHpE,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,kDAsEvD;yBAtEe,cAAc;;QAN9B,0DAA0D;;QAEzD,yCAAyC;;;;AA+F1C,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAwDnD;yBAxDe,YAAY;;QAR5B,uBAAuB;;QAEtB,8CAA8C;;QAE9C,0BAA0B;;;;AA+E3B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CASvD;yBATe,cAAc;;QAR9B,0BAA0B;;QAEzB,sCAAsC;;QAEtC,6CAA6C;;;;AAkC9C,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAuFvD;yBAvFe,cAAc;;QAR9B,6BAA6B;;QAE5B,wCAAwC;;QAExC,kDAAkD;;;;AA4GnD,MAAM,MAAM,4BAA4B,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,SAAS,CAAC,CAAC;AACjG,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,4BAA4B,2CAgK3E;yBAhKe,wBAAwB;;QANxC,iDAAiD;;QAEhD,uCAAuC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ComponentSelector.d.ts","sourceRoot":"","sources":["../../../../../../src/components/sitebuilder/page/components/ComponentSelector.tsx"],"names":[],"mappings":"AAEA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA6BnD,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACnF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,qBAAqB,2CAiF7D;yBAjFe,iBAAiB;;QAXjC,oDAAoD;;QAEnD,wDAAwD;;QAExD,2FAA2F"}
1
+ {"version":3,"file":"ComponentSelector.d.ts","sourceRoot":"","sources":["../../../../../../src/components/sitebuilder/page/components/ComponentSelector.tsx"],"names":[],"mappings":"AAEA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA6BnD,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACnF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,qBAAqB,2CAkF7D;yBAlFe,iBAAiB;;QAXjC,oDAAoD;;QAEnD,wDAAwD;;QAExD,2FAA2F"}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@pixelated-tech/components",
3
- "version": "3.13.5",
3
+ "version": "3.13.7",
4
+ "type": "module",
4
5
  "private": false,
5
6
  "author": {
6
7
  "name": "Pixelated Technologies",
@@ -87,7 +88,7 @@
87
88
  "config:decrypt": "npm run config:vault -- decrypt src/config/pixelated.config.json.enc",
88
89
  "create-pixelated-app": "node src/scripts/create-pixelated-app.js",
89
90
  "zip-theme": "node src/scripts/zip-pixelated-theme.js ../pixelated-blog-wp-theme Pixelated.zip",
90
- "update": "UPDATES=$(npm outdated | awk 'NR>1 {print $1\"@\"$4}' || 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"
91
92
  },
92
93
  "scripts-20260113": {
93
94
  "build": "npm run validate-exports && npm run buildClean && npm run tsc && npm run rsync && npm run tscClean ",
@@ -97,10 +98,11 @@
97
98
  "tscClean": "rm -rf dist/{images,stories,tests}",
98
99
  "rsync": "(cd src && tar -cf - $(find . -name \"*.css\" -o -name \"*.scss\" -o -name \"*.json\") scripts/) | tar -C dist -xf -",
99
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/}\"' _ {} \\;",
100
- "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"
101
104
  },
102
105
  "scripts-old": {
103
- "buildBabel": "npm run buildClean && NODE_ENV=production babel src --out-dir dist --copy-files",
104
106
  "build-webpack": "rm -rf dist && npx tsc --project tsconfig.json && webpack --config webpack.config.js && npm run build-webpack-rsync",
105
107
  "build-webpack-rsync": "rsync -a --include='*' --include='*/' src/css dist/css"
106
108
  },
@@ -110,30 +112,28 @@
110
112
  "html-entities": "^2.6.0"
111
113
  },
112
114
  "devDependencies": {
113
- "@aws-sdk/client-amplify": "^3.893.0",
114
- "@aws-sdk/client-cloudwatch": "^3.893.0",
115
- "@aws-sdk/client-iam": "^3.893.0",
116
- "@aws-sdk/client-route-53": "^3.893.0",
117
- "@babel/cli": "^7.28.6",
115
+ "@aws-sdk/client-amplify": "^3.996.0",
116
+ "@aws-sdk/client-cloudwatch": "^3.996.0",
117
+ "@aws-sdk/client-iam": "^3.996.0",
118
+ "@aws-sdk/client-route-53": "^3.996.0",
119
+ "@aws-sdk/xml-builder": "^3.972.5",
118
120
  "@babel/core": "^7.29.0",
119
121
  "@babel/plugin-proposal-class-properties": "^7.18.6",
120
122
  "@babel/plugin-proposal-object-rest-spread": "^7.20.7",
121
123
  "@babel/preset-env": "^7.29.0",
122
124
  "@babel/preset-react": "^7.28.5",
123
125
  "@babel/preset-typescript": "^7.28.5",
124
- "@eslint/js": "^9.39.2",
125
- "@eslint/json": "^1.0.1",
126
- "@eslint/markdown": "^7.5.1",
127
- "@storybook/addon-a11y": "^10.2.9",
128
- "@storybook/addon-docs": "^10.2.9",
126
+ "@eslint/js": "^10.0.1",
127
+ "@storybook/addon-a11y": "^10.2.11",
128
+ "@storybook/addon-docs": "^10.2.11",
129
129
  "@storybook/addon-webpack5-compiler-babel": "^4.0.0",
130
130
  "@storybook/preset-scss": "^1.0.3",
131
- "@storybook/react-webpack5": "^10.2.9",
131
+ "@storybook/react-webpack5": "^10.2.11",
132
132
  "@testing-library/dom": "^10.4.1",
133
133
  "@testing-library/react": "^16.3.2",
134
134
  "@testing-library/user-event": "^14.6.1",
135
135
  "@types/md5": "^2.3.6",
136
- "@types/node": "^25.2.3",
136
+ "@types/node": "^25.3.0",
137
137
  "@types/prop-types": "^15.7.15",
138
138
  "@types/react": "^19.2.14",
139
139
  "@types/react-dom": "^19.2.3",
@@ -145,24 +145,20 @@
145
145
  "ajv": "^8.18.0",
146
146
  "ajv-keywords": "^5.1.0",
147
147
  "babel-loader": "^10.0.0",
148
- "clean-webpack-plugin": "^4.0.0",
148
+ "clean-webpack-plugin": "^1.0.1",
149
149
  "copy-webpack-plugin": "^13.0.1",
150
150
  "css-loader": "^7.1.4",
151
- "eslint": "^9.39.2",
152
- "eslint-config-standard": "^10.2.1",
153
- "eslint-plugin-import": "^2.32.0",
151
+ "eslint": "^9.39.3",
152
+ "eslint-plugin-import": "^1.16.0",
154
153
  "eslint-plugin-jsx-a11y": "^6.10.2",
155
- "eslint-plugin-n": "^17.24.0",
156
- "eslint-plugin-promise": "^4.3.1",
157
154
  "eslint-plugin-react": "^7.37.5",
158
- "eslint-plugin-storybook": "^0.1.1",
159
- "file-loader": "^1.0.0",
160
- "happy-dom": "^20.6.2",
155
+ "file-loader": "^6.2.0",
156
+ "happy-dom": "^20.7.0",
161
157
  "jsdom": "^28.1.0",
162
158
  "less-loader": "^12.3.1",
163
159
  "mini-css-extract-plugin": "^2.10.0",
164
160
  "next": "^16.1.6",
165
- "null-loader": "^0.1.1",
161
+ "null-loader": "^4.0.1",
166
162
  "prop-types": "^15.8.1",
167
163
  "react": "^19.2.4",
168
164
  "react-dom": "^19.2.4",
@@ -171,11 +167,11 @@
171
167
  "redux": "^5.0.1",
172
168
  "sass": "^1.97.3",
173
169
  "sass-loader": "^16.0.7",
174
- "storybook": "^10.2.9",
170
+ "storybook": "^10.2.11",
175
171
  "style-loader": "^4.0.0",
176
172
  "ts-loader": "^9.5.4",
177
173
  "typescript": "^5.9.3",
178
- "url-loader": "^0.5.9",
174
+ "url-loader": "^4.1.1",
179
175
  "vitest": "^4.0.18",
180
176
  "webpack": "^5.105.2",
181
177
  "webpack-cli": "^6.0.1",
@@ -188,21 +184,13 @@
188
184
  "react-dom": "^19.2.0"
189
185
  },
190
186
  "optionalDependencies": {
191
- "@aws-sdk/client-cloudwatch": "^3.893.0",
187
+ "@aws-sdk/client-cloudwatch": "^3.996.0",
192
188
  "@aws-sdk/client-route-53": "^3.893.0",
193
189
  "googleapis": "^171.4.0",
194
190
  "md5": "^2.3.0",
195
- "puppeteer": "^24.37.3",
191
+ "puppeteer": "^24.37.5",
196
192
  "react-redux": "*",
197
193
  "recharts": "^3.7.0",
198
194
  "redux": "*"
199
- },
200
- "overrides": {
201
- "eslint-config-standard": {
202
- "eslint": "^9.39.2",
203
- "eslint-plugin-n": "^17.23.2",
204
- "eslint-plugin-promise": "^7.2.1"
205
- }
206
- },
207
- "type": "module"
195
+ }
208
196
  }