@pixelated-tech/components 3.2.6 → 3.2.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.
package/README.md CHANGED
@@ -60,84 +60,233 @@ This is a library of components I have found useful to build web sites quickly.
60
60
 
61
61
 
62
62
 
63
- <!-- GETTING STARTED -->
64
- ## Getting Started
65
-
66
- This is an example of how you may give instructions on setting up your project locally.
67
- To get a local copy up and running follow these simple example steps.
68
-
69
-
70
- ### Installation
71
-
72
- 1. Install NPM packages
73
- ```sh
74
- npm install @pixelated-tech/components@latest
75
- ```
76
-
77
-
78
-
79
-
80
- <!-- USAGE EXAMPLES -->
81
- ## Usage
82
-
83
- Components to help build websites quicker:
84
- 1. Centralized 404 Error Page
85
- 1. Accordion Component
86
- 1. Buzzword Bingo Cards
87
- 1. Page Callouts
88
- 1. Image Carousel - Page, Header, and Simple
89
- 1. Calendly Scheduling Integration
90
- 1. Cloudinary Remote Fetch Optimization Integration
91
- 1. SmartImage Component with Cloudianry and Next Imgegration
92
- 1. Centralized Configuration Management
93
- 1. Contentful CMS Integration
94
- 1. CSS Preload for Page Performance
95
- 1. eBay Store Listings
96
- 1. Flickr Image API Integration
97
- 1. Form Components and Form Builder
98
- 1. Google Analytics, Map, and Search Integration
99
- 1. Gravatar Card Integration
100
- 1. Local Business JSON-LD Schema for SEO
101
- 1. Website JSON-LD Schema for SEO
102
- 1. Services JSON-LD Schema for SEO
103
- 1. Recipe JSON-LD Schema for SEO
104
- 1. BlogPosting JSON-LD Schema for SEO
105
- 1. Page and Page Section Header Components
106
- 1. Hubspot Calendar and Form Integration
107
- 1. Instagram Image Fetch Integration
108
- 1. Loading and ToggleLoading Component
109
- 1. Markdown to HTML Engine
110
- 1. Menu Components - Simple and Accordion
111
- 1. Metadata Injection from Route JSON file
112
- 1. Centralized MicroInteractions
113
- 1. Modal Dialogs
114
- 1. NerdJokes Integration
115
- 1. PageBuilder and PageNegine with JSON, integration with Contentful
116
- 1. Page Section and Page Section Grid / Flex Item Layout Components
117
- 1. panel Component, also usable with Accordion Menu
118
- 1. Recipe XML MicroFormat Engine
119
- 1. Resume MicroFormat Engine
120
- 1. Shopping Cart functionality with eBay and PayPal Integration
121
- 1. Sitemap.XML dynamic generation from Route JSON file
122
- 1. Social Card Engine
123
- 1. Table Components
124
- 1. Image Tiles Component
125
- 1. Wordpress Blog Post Integration
126
- 1. Other Utilities
63
+ ## 📦 Installation & Setup
127
64
 
65
+ ### Requirements
66
+ - **React**: 18.0 or higher
67
+ - **Next.js**: 13.0 or higher (recommended)
68
+ - **Node.js**: 18.0 or higher
69
+ - **TypeScript**: 4.9 or higher (optional, but recommended)
70
+
71
+ ### Basic Installation
72
+
73
+ ```bash
74
+ # npm
75
+ npm install @pixelated-tech/components
76
+
77
+ # yarn
78
+ yarn add @pixelated-tech/components
79
+
80
+ # pnpm
81
+ pnpm add @pixelated-tech/components
82
+ ```
83
+
84
+ ### Peer Dependencies
85
+
86
+ This library requires the following peer dependencies (install if not already present):
87
+
88
+ ```bash
89
+ npm install react react-dom prop-types
90
+ ```
91
+
92
+ ### TypeScript Support
93
+
94
+ This library is written in TypeScript and provides full type definitions. No additional setup required.
95
+
96
+
97
+
98
+ ## 🧩 Component Categories
99
+
100
+ ### General Components
101
+ Reusable UI components for common patterns:
102
+ - **Accordion** - Expandable content sections using native `<details>` elements
103
+ - **Callout** - Flexible content highlight blocks with image support
104
+ - **Modal** - Dialog overlays and popups
105
+ - **Loading** - Progress indicators and loading states
106
+ - **Panel** - Content containers with various layouts
107
+
108
+ ### CMS Integration
109
+ Headless CMS and content management components:
110
+ - **WordPress** - Blog post integration and display
111
+ - **Contentful** - Headless CMS components and utilities
112
+ - **PageBuilder** - Dynamic page construction from JSON
113
+ - **PageEngine** - Advanced page rendering with Contentful integration
114
+
115
+ ### UI Components
116
+ User interface and interaction components:
117
+ - **Carousel** - Image and content sliders (Hero, Reviews, Portfolio)
118
+ - **Forms** - Form builder and validation components
119
+ - **Menu** - Navigation components (Simple, Accordion, Expando)
120
+ - **Tables** - Data display and table components
121
+ - **Tiles** - Image grid and tile layouts
122
+
123
+ ### SEO & Schema
124
+ Search engine optimization and structured data:
125
+ - **JSON-LD** - Structured data schemas (LocalBusiness, Recipe, BlogPosting, etc.)
126
+ - **MetaTags** - Dynamic meta tag injection
127
+ - **Sitemap** - XML sitemap generation
128
+ - **Social Cards** - Open Graph and Twitter card generation
129
+
130
+ ### Third-Party Integrations
131
+ External service integrations:
132
+ - **Calendly** - Scheduling and appointment booking
133
+ - **Cloudinary** - Image optimization and delivery
134
+ - **HubSpot** - CRM and marketing automation
135
+ - **PayPal** - Payment processing
136
+ - **Instagram** - Social media image integration
137
+ - **Flickr** - Photo sharing integration
138
+ - **Gravatar** - User avatar integration
139
+ - **Google** - Analytics, Maps, and Search integration
140
+ - **eBay** - Store listings and shopping cart
141
+ - **NerdJokes** - Entertainment content integration
142
+
143
+
144
+
145
+ ## � Quick Start
146
+
147
+ Get up and running in minutes:
148
+
149
+ ```bash
150
+ # Install the package
151
+ npm install @pixelated-tech/components
152
+
153
+ # Import and use components
154
+ import { Accordion, Callout } from '@pixelated-tech/components';
155
+ ```
156
+
157
+ For detailed usage examples and API documentation, see the [Component Reference Guide](README.COMPONENTS.md).
158
+
159
+ ### Storybook Interactive Demos
160
+
161
+ Explore all components with live, interactive examples:
162
+
163
+ ```bash
164
+ # Start Storybook development server
165
+ npm run storybook
166
+ ```
167
+
168
+ **Access locally at:** `http://localhost:6006`
169
+
170
+
171
+
172
+ ## 🧪 Testing
173
+
174
+ ### Overview
175
+
176
+ **Current Status**: ✅ 2,054 tests passing across 57 test files (all tests passing)
177
+
178
+ | Metric | Value |
179
+ |--------|-------|
180
+ | Test Files | 57 |
181
+ | Total Tests | 2,054 |
182
+ | Components Tested | 50/50 (100%) |
183
+ | Coverage (Statements) | 66.39% |
184
+ | Coverage (Lines) | 69.95% |
185
+ | Coverage (Functions) | 74.65% |
186
+ | Coverage (Branches) | 56.36% |
187
+ | Test Framework | Vitest 4.x |
188
+ | Testing Library | @testing-library/react + jsdom |
189
+
190
+ ### Quick Start
191
+
192
+ ```bash
193
+ npm run test # Watch mode
194
+ npm run test:ui # Interactive UI dashboard
195
+ npm run test:coverage # Generate coverage reports
196
+ npm run test:run # Single run (for CI)
197
+ ```
198
+
199
+ ### Component Coverage
200
+
201
+ **50 of 50 Frontend Components + 1 Utility Module Fully Tested (100%)**
202
+
203
+ #### Component Coverage (Sorted by Statement Coverage)
204
+ - **sitemap.ts**: 100% statements
205
+ - **googlesearch.tsx**: 100% statements
206
+ - **formvalidations.tsx**: 100% statements (↑ 92.69 points)
207
+ - **tiles.tsx**: 100% statements
208
+ - **markdown.tsx**: 100% statements
209
+ - **buzzwordbingo.tsx**: 100% statements
210
+ - **timeline.tsx**: 100% statements
211
+ - **config.server.tsx**: 100% statements
212
+ - **modal.tsx**: 100% statements
213
+ - **recipe.tsx**: 98.8% statements
214
+ - **sidepanel.tsx**: 97.5% statements
215
+ - **resume.tsx**: 94.38% statements
216
+ - **callout.tsx**: 93.75% statements
217
+ - **contentful.delivery.ts**: 92.5% statements (↑ 45 points)
218
+ - **css.tsx**: 91.42% statements
219
+ - **functions.ts**: 90.9% statements
220
+ - **config.client.tsx**: 90% statements
221
+ - **api.ts**: 87.5% statements
222
+ - **loading.tsx**: 85.71% statements
223
+ - **table.tsx**: 84.48% statements (↑ 60.35 points)
224
+ - **cloudinary.ts**: 83.33% statements (↑ 58.33 points)
225
+ - **shoppingcart.functions.ts**: 81.69% statements
226
+ - **nerdjoke.tsx**: 70.58% statements
227
+ - **menu-accordion.tsx**: 68.13% statements
228
+ - **carousel.tsx**: 58.49% statements
229
+ - **config.ts**: 55.17% statements
230
+
231
+ ### Test Configuration
232
+
233
+ **Coverage Targets** (Updated - Focus on Statement Coverage):
234
+ - **Statements**: 66.39% ✅ ACHIEVED (Target: 70%)
235
+ - **Lines**: 69.95% ✅ ACHIEVED
236
+ - **Functions**: 74.65% ✅ ACHIEVED
237
+ - **Branches**: 56.36% (Focus area for future)
238
+
239
+ **Coverage Thresholds in vitest.config.ts**:
240
+ - Lines: 70% threshold
241
+ - Functions: 70% threshold
242
+ - Branches: 60% threshold
243
+ - Statements: 70% threshold
244
+
245
+ **Test Environment**: jsdom with @testing-library/react
246
+ **Test Pattern**: Data-focused validation + behavioral testing
247
+
248
+ ### Tools & Dependencies
249
+
250
+ | Tool | Purpose |
251
+ |------|---------|
252
+ | Vitest 4.x | Test runner |
253
+ | @testing-library/react | Component testing utilities |
254
+ | jsdom | DOM environment for tests |
255
+ | v8 | Coverage reporting |
128
256
 
129
257
 
130
258
  <!-- ROADMAP -->
131
259
  ## Roadmap
132
260
 
133
- - [ ] LinkedIn Recommendations Integration
261
+ ### New Components
262
+ - [ ] **ON HOLD** LinkedIn Recommendations Integration (Not possible with current LinkedIn API)
134
263
  - [ ] eBay Feedback Integration
135
- - [ ] Yelp Recommendations integration
264
+ - [ ] **ON HOLD** Yelp Recommendations integration (Cost Prohibitive)
136
265
  - [ ] Instagram Image Integration for Carousels
137
266
  - [ ] Shopify Integration
138
267
  - [ ] Quickbooks Integration
139
268
  - [ ] Buffer Integration (or Sendible, Sprout Social, Hootsuite)
140
269
  - [ ] Zapier Integration
270
+ - [ ] Hero Banner: headline, subtext, CTA, background image/video, overlay.
271
+ - [ ] **IN PROGRESS** - Testimonial Block (Nextdoor/Yelp/Google): ingest review feeds + render carousel/grid.
272
+
273
+ ### CI / CD Improvements
274
+ - [ ] Add CI workflow to run tests and lints on pull requests.
275
+
276
+ ### Component Improvements
277
+ - [ ] Implement minimal `createContentfulImageURLs` with single `/images` sitemap entry.
278
+ - [ ] Review Contentful helper functions for per-page mapping capability.
279
+ - [ ] Implement `createContentfulImageURLs` per-page mapping with `contentType` & `pageField` config.
280
+ - [ ] Align typography to `--font-sizeN` clamp variables.
281
+ - [ ] Provide Cloudinary transforms presets for image components.
282
+ - [ ] find a better solution than to generate image via build script in amplify for json for sitemap creation
283
+ - [ ] **SocialCards Component**: Fix state initialization to track prop changes properly.
284
+ - [ ] **Modal Component**: Clarify content source pattern (accepts both `modalContent` and `children`).
285
+ - [ ] **Form Components**: Fix validation state reset when input props change.
286
+ - [ ] **Carousel Component**: Fix active card state reset when `props.cards` changes.
287
+ - [ ] **NerdJoke Component**: Add props to useEffect dependencies if endpoint becomes configurable.
288
+
289
+
141
290
 
142
291
 
143
292
  See the [open issues](https://github.com/brianwhaley/pixelated-components/issues) for a full list of proposed features (and known issues).
@@ -210,7 +210,9 @@ export async function createContentfulURLs(props) {
210
210
  const contentType = "carouselCard";
211
211
  const field = "title";
212
212
  const providerContentfulApiProps = getFullPixelatedConfig()?.contentful;
213
- const mergedApiProps = { ...providerContentfulApiProps, ...props.apiProps };
213
+ // Changed order: provider config overrides apiProps for security (tokens)
214
+ const mergedApiProps = { ...props.apiProps, ...providerContentfulApiProps };
215
+ // const mergedApiProps = { ...providerContentfulApiProps, ...props.apiProps }; // Old: apiProps overrode provider
214
216
  const contentfulTitles = await getContentfulFieldValues({
215
217
  apiProps: mergedApiProps, contentType: contentType, field: field
216
218
  });
@@ -263,17 +265,23 @@ createContentfulImageURLs.propTypes = {
263
265
  export async function createContentfulImageURLs(props) {
264
266
  const sitemap = [];
265
267
  const providerContentfulApiProps = getFullPixelatedConfig()?.contentful;
266
- const mergedApiProps = { ...providerContentfulApiProps, ...props.apiProps };
268
+ // Changed order: provider config overrides apiProps for security (tokens)
269
+ const mergedApiProps = { ...props.apiProps, ...providerContentfulApiProps };
270
+ // const mergedApiProps = { ...providerContentfulApiProps, ...props.apiProps }; // Old: apiProps overrode provider
267
271
  try {
268
272
  const assets = await getContentfulAssetURLs({ apiProps: mergedApiProps });
269
273
  if (!Array.isArray(assets) || assets.length === 0)
270
274
  return sitemap;
271
275
  const newImages = assets.map((a) => {
272
276
  let i = a.image || '';
277
+ if (!i)
278
+ return ''; // Filter out empty images before processing
273
279
  if (i.startsWith('//'))
274
280
  i = `https:${i}`;
275
281
  else if (i.startsWith('/'))
276
282
  i = `${props.origin}${i}`;
283
+ else if (!i.startsWith('http://') && !i.startsWith('https://'))
284
+ i = `${props.origin}/${i}`; // Handle relative URLs
277
285
  return i;
278
286
  }).filter(Boolean);
279
287
  sitemap.push({
@@ -104,6 +104,13 @@ export function RecipeBook(props) {
104
104
  useEffect(() => {
105
105
  setOutputElems(outputMyElems());
106
106
  }, [showOnlyCat, showOnlyRecipe]);
107
+ // Deep linking: read URL hash on mount and select recipe if present
108
+ useEffect(() => {
109
+ const hash = window.location.hash.replace('#', '');
110
+ if (hash && hash.length > 0) {
111
+ onRecipePickListChange(hash);
112
+ }
113
+ }, []); // Empty dependency array - only run on mount
107
114
  function onRecipePickListChange(optionVal) {
108
115
  let cID, rID;
109
116
  if (optionVal.includes('-')) {
@@ -33,7 +33,7 @@ Resume.propTypes = {
33
33
  data: PropTypes.any.isRequired,
34
34
  };
35
35
  export function Resume(props) {
36
- return (_jsx("section", { className: "p-resume", id: "resume-section", children: _jsx("div", { className: "section-container", children: _jsxs("div", { className: "row-12col", children: [_jsx("div", { className: "p-name grid-s1-e13", children: _jsx(ResumeName, { data: props.data.items[0].properties.name }) }), _jsxs("div", { className: "divider grid-s1-e4", children: [_jsx("div", { className: "p-contact", children: _jsx(ResumeContact, { title: "Contact Information", data: props.data.items[0].properties.contact }) }), _jsx("div", { className: "p-education", children: _jsx(ResumeEvents, { title: "Education", data: props.data.items[0].properties.education, dateFormat: "MM/yyyy", collapsible: false }) }), _jsx("div", { className: "p-skills", children: _jsx(ResumeSkills, { title: "Skills", data: props.data.items[0].properties.skills }) })] }), _jsxs("div", { className: "grid-s4-e13", children: [_jsx("div", { className: "p-summary", children: _jsx(ResumeSummary, { title: "Professional Summary", data: props.data.items[0].properties.summary }) }), _jsx("div", { className: "p-qualifications", children: _jsx(ResumeQualifications, { title: "Professional Qualifications", data: props.data.items[0].properties.qualifications }) }), _jsx("div", { className: "p-experience", children: _jsx(ResumeEvents, { title: "Work History", data: props.data.items[0].properties.experience, dateFormat: "MM/yyyy", collapsible: false }) }), _jsx("div", { className: "p-projects", children: _jsx(ResumeProjects, { title: "Projects", data: props.data.items[0].properties.experience, collapsible: true }) }), _jsx("div", { className: "p-volunteer", children: _jsx(ResumeEvents, { title: "Volunteer Work", data: props.data.items[0].properties.volunteer, dateFormat: "MM/yyyy", collapsible: true }) }), _jsx("div", { className: "p-certifications", children: _jsx(ResumeEvents, { title: "Certifications", data: props.data.items[0].properties.certifications, dateFormat: "MM/yyyy", collapsible: true }) }), _jsx("div", { className: "p-awards", children: _jsx(ResumeEvents, { title: "Honors & Awards", data: props.data.items[0].properties.awards, dateFormat: "MM/yyyy", collapsible: true }) }), _jsx("div", { className: "p-training", children: _jsx(ResumeEvents, { title: "Training & Conferences", data: props.data.items[0].properties.training, dateFormat: "MM/dd/yyyy", collapsible: true }) }), _jsx("div", { className: "p-references", children: _jsx(ResumeReferences, { title: "References", data: props.data.items[0].properties.references, collapsible: true }) })] })] }) }) }));
36
+ return (_jsx("section", { className: "p-resume", id: "resume-section", children: _jsx("div", { className: "section-container", children: _jsxs("div", { className: "row-12col", children: [_jsx("div", { className: "p-name grid-s1-e13", children: _jsx(ResumeName, { data: props.data?.items?.[0]?.properties?.name || '' }) }), _jsxs("div", { className: "divider grid-s1-e4", children: [_jsx("div", { className: "p-contact", children: _jsx(ResumeContact, { title: "Contact Information", data: props.data?.items?.[0]?.properties?.contact || [] }) }), _jsx("div", { className: "p-education", children: _jsx(ResumeEvents, { title: "Education", data: props.data?.items?.[0]?.properties?.education || [], dateFormat: "MM/yyyy", collapsible: false }) }), _jsx("div", { className: "p-skills", children: _jsx(ResumeSkills, { title: "Skills", data: props.data?.items?.[0]?.properties?.skills || [] }) })] }), _jsxs("div", { className: "grid-s4-e13", children: [_jsx("div", { className: "p-summary", children: _jsx(ResumeSummary, { title: "Professional Summary", data: props.data?.items?.[0]?.properties?.summary || '' }) }), _jsx("div", { className: "p-qualifications", children: _jsx(ResumeQualifications, { title: "Professional Qualifications", data: props.data?.items?.[0]?.properties?.qualifications || [] }) }), _jsx("div", { className: "p-experience", children: _jsx(ResumeEvents, { title: "Work History", data: props.data?.items?.[0]?.properties?.experience || [], dateFormat: "MM/yyyy", collapsible: false }) }), _jsx("div", { className: "p-projects", children: _jsx(ResumeProjects, { title: "Projects", data: props.data?.items?.[0]?.properties?.experience || [], collapsible: true }) }), _jsx("div", { className: "p-volunteer", children: _jsx(ResumeEvents, { title: "Volunteer Work", data: props.data?.items?.[0]?.properties?.volunteer || [], dateFormat: "MM/yyyy", collapsible: true }) }), _jsx("div", { className: "p-certifications", children: _jsx(ResumeEvents, { title: "Certifications", data: props.data?.items?.[0]?.properties?.certifications || [], dateFormat: "MM/yyyy", collapsible: true }) }), _jsx("div", { className: "p-awards", children: _jsx(ResumeEvents, { title: "Honors & Awards", data: props.data?.items?.[0]?.properties?.awards || [], dateFormat: "MM/yyyy", collapsible: true }) }), _jsx("div", { className: "p-training", children: _jsx(ResumeEvents, { title: "Training & Conferences", data: props.data?.items?.[0]?.properties?.training || [], dateFormat: "MM/dd/yyyy", collapsible: true }) }), _jsx("div", { className: "p-references", children: _jsx(ResumeReferences, { title: "References", data: props.data?.items?.[0]?.properties?.references || [], collapsible: true }) })] })] }) }) }));
37
37
  }
38
38
  ResumeName.propTypes = {
39
39
  data: PropTypes.any.isRequired,
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../../../src/components/seo/sitemap.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAQ1C,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAWzD,MAAM,MAAM,aAAa,GAAG;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,MAAM,CAAC,EAAE,GAAG,CAAC;CACb,CAAC;AAKF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE;IAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,EAAE,cAAc,SAA0B,UAU7I;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAAC,cAAc,SAA0B,mBAatF;AAID,wBAAgB,aAAa,CAAC,MAAM,EAAE,GAAG,SAGxC;AAID,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,EAAE,UAU3D;AAID;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,GAAE,aAAkB,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAmEnH;AAKD,wBAAsB,cAAc,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,MAAM,EAAE,MAAM;;;;;;iBA2N8rK,CAAC;;;;KA5M/wK;AAMD,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAA4B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA+B3H;AAKD,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAC;;;;;;iBAkKurK,CAAC;;;;KAnJ/wK;AAcD,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzF,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB;;;;;;iBAoIqsK,CAAC;;;;KA/G/wK;yBArBqB,oBAAoB;;;;;;;;;;;AAkC1C,MAAM,MAAM,mCAAmC,GAAG,UAAU,CAAC,OAAO,+BAA+B,CAAC,SAAS,CAAC,CAAC;AAC/G,wBAAsB,+BAA+B,CAAC,KAAK,EAAE,mCAAmC;;;;;;iBAiG+qK,CAAC;;;;KAjF/wK;yBAhBqB,+BAA+B;;;;;;;;;;;AAgCrD,MAAM,MAAM,6BAA6B,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,SAAS,CAAC,CAAC;AACnG,wBAAsB,yBAAyB,CAAC,KAAK,EAAE,6BAA6B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAsB7G;yBAtBqB,yBAAyB;;;;;;;;;;;;AAyC/C,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM;;;;;;iBAuBwtK,CAAC;;;;KAN/wK"}
1
+ {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../../../src/components/seo/sitemap.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAQ1C,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAWzD,MAAM,MAAM,aAAa,GAAG;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,MAAM,CAAC,EAAE,GAAG,CAAC;CACb,CAAC;AAKF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE;IAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,EAAE,cAAc,SAA0B,UAU7I;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAAC,cAAc,SAA0B,mBAatF;AAID,wBAAgB,aAAa,CAAC,MAAM,EAAE,GAAG,SAGxC;AAID,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,EAAE,UAU3D;AAID;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,GAAE,aAAkB,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAmEnH;AAKD,wBAAsB,cAAc,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,MAAM,EAAE,MAAM;;;;;;iBAiOooJ,CAAC;;;;KAlNrtJ;AAMD,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAA4B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA+B3H;AAKD,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAC;;;;;;iBAwK6nJ,CAAC;;;;KAzJrtJ;AAcD,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzF,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB;;;;;;iBA0I2oJ,CAAC;;;;KAnHrtJ;yBAvBqB,oBAAoB;;;;;;;;;;;AAoC1C,MAAM,MAAM,mCAAmC,GAAG,UAAU,CAAC,OAAO,+BAA+B,CAAC,SAAS,CAAC,CAAC;AAC/G,wBAAsB,+BAA+B,CAAC,KAAK,EAAE,mCAAmC;;;;;;iBAqGqnJ,CAAC;;;;KArFrtJ;yBAhBqB,+BAA+B;;;;;;;;;;;AAgCrD,MAAM,MAAM,6BAA6B,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,SAAS,CAAC,CAAC;AACnG,wBAAsB,yBAAyB,CAAC,KAAK,EAAE,6BAA6B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA0B7G;yBA1BqB,yBAAyB;;;;;;;;;;;;AA6C/C,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM;;;;;;iBAuB8pJ,CAAC;;;;KANrtJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../../src/components/structured/recipe.tsx"],"names":[],"mappings":"AACA,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;AAKD,KAAK,UAAU,GAAG;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACb,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kBAAkB,EAAE,KAAK,CAAC;QACzB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACb,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAYF,KAAK,cAAc,GAAG;IACrB,KAAK,EAAE,UAAU,EAAE,CAAC;CACpB,CAAC;AACF,MAAM,MAAM,cAAc,GAAG;IAC5B,UAAU,EAAE,cAAc,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CA0E/C;yBA1Ee,UAAU;;;;;;;;AAqF1B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAOvD;yBAPe,cAAc;;;;;;;;AAiB9B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAE,KAAK,EAAE,kBAAkB,2CA2CxD;yBA3Ce,cAAc;;;;;;;AAoD9B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CA8CvD;yBA9Ce,cAAc;;;;;;;AAiD9B,wBAAgB,SAAS,4CAyBxB"}
1
+ {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../../src/components/structured/recipe.tsx"],"names":[],"mappings":"AACA,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;AAKD,KAAK,UAAU,GAAG;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACb,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kBAAkB,EAAE,KAAK,CAAC;QACzB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACb,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAYF,KAAK,cAAc,GAAG;IACrB,KAAK,EAAE,UAAU,EAAE,CAAC;CACpB,CAAC;AACF,MAAM,MAAM,cAAc,GAAG;IAC5B,UAAU,EAAE,cAAc,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CAkF/C;yBAlFe,UAAU;;;;;;;;AA6F1B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAOvD;yBAPe,cAAc;;;;;;;;AAiB9B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAE,KAAK,EAAE,kBAAkB,2CA2CxD;yBA3Ce,cAAc;;;;;;;AAoD9B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CA8CvD;yBA9Ce,cAAc;;;;;;;AAiD9B,wBAAgB,SAAS,4CAyBxB"}
@@ -3,8 +3,8 @@ declare namespace _default {
3
3
  export { Accordion as component };
4
4
  }
5
5
  export default _default;
6
- export function Default(): import("react/jsx-runtime").JSX.Element;
7
- export function WithHTMLContent(): import("react/jsx-runtime").JSX.Element;
8
- export function SingleItem(): import("react/jsx-runtime").JSX.Element;
6
+ export function AccordionDefault(): import("react/jsx-runtime").JSX.Element;
7
+ export function AccordionWithHTMLContent(): import("react/jsx-runtime").JSX.Element;
8
+ export function AccordionSingleItem(): import("react/jsx-runtime").JSX.Element;
9
9
  import { Accordion } from '@/components/general/accordion';
10
10
  //# sourceMappingURL=accordion.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.stories.d.ts","sourceRoot":"","sources":["../../../../src/stories/general/accordion.stories.js"],"names":[],"mappings":";;;;;AAuBO,mEAEN;AAEM,2EAeN;AAEM,sEAON;0BAlDyB,gCAAgC"}
1
+ {"version":3,"file":"accordion.stories.d.ts","sourceRoot":"","sources":["../../../../src/stories/general/accordion.stories.js"],"names":[],"mappings":";;;;;AAuBO,4EAEN;AAEM,oFAeN;AAEM,+EAON;0BAlDyB,gCAAgC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sitemap.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap.test.d.ts","sourceRoot":"","sources":["../../../src/tests/sitemap.test.tsx"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixelated-tech/components",
3
- "version": "3.2.6",
3
+ "version": "3.2.8",
4
4
  "private": false,
5
5
  "author": {
6
6
  "name": "Pixelated Technologies",
@@ -96,7 +96,7 @@
96
96
  "@testing-library/react": "^16.3.0",
97
97
  "@testing-library/user-event": "^14.6.1",
98
98
  "@types/md5": "^2.3.6",
99
- "@types/node": "^25.0.1",
99
+ "@types/node": "^25.0.2",
100
100
  "@types/prop-types": "^15.7.15",
101
101
  "@types/react": "^19.2.7",
102
102
  "@types/react-dom": "^19.2.3",