@pixelated-tech/components 3.2.13 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/README.COMPONENTS.md +435 -78
  2. package/README.md +59 -32
  3. package/dist/components/callout/callout.scss +0 -3
  4. package/dist/components/cms/flickr.js +8 -2
  5. package/dist/components/cms/google.reviews.components.js +1 -1
  6. package/dist/components/general/tab.css +105 -0
  7. package/dist/components/general/tab.js +26 -0
  8. package/dist/components/menu/menu-expando.js +7 -1
  9. package/dist/components/nerdjoke/nerdjoke.js +13 -7
  10. package/dist/components/seo/manifest.js +40 -0
  11. package/dist/components/seo/metadata.components.js +0 -19
  12. package/dist/components/seo/metadata.functions.js +111 -0
  13. package/dist/components/seo/schema-blogposting.functions.js +42 -0
  14. package/dist/components/seo/schema-blogposting.js +0 -46
  15. package/dist/components/seo/schema-localbusiness.js +46 -2
  16. package/dist/components/seo/schema-website.js +31 -2
  17. package/dist/components/seo/sitemap.js +4 -4
  18. package/dist/components/shoppingcart/shoppingcart.components.js +4 -4
  19. package/dist/components/sitebuilder/config/ConfigBuilder.css +266 -0
  20. package/dist/components/sitebuilder/config/ConfigBuilder.js +221 -0
  21. package/dist/components/{pagebuilder → sitebuilder}/form/form.css +55 -30
  22. package/dist/components/sitebuilder/form/formbuilder.js +106 -0
  23. package/dist/components/sitebuilder/form/formcomponents.js +356 -0
  24. package/dist/components/sitebuilder/form/formengine.js +82 -0
  25. package/dist/components/{pagebuilder/form/form.js → sitebuilder/form/formextractor.js} +10 -211
  26. package/dist/components/sitebuilder/form/formutils.js +206 -0
  27. package/dist/components/sitebuilder/form/formvalidator.js +123 -0
  28. package/dist/components/{pagebuilder → sitebuilder/page}/components/ComponentPropertiesForm.js +1 -1
  29. package/dist/components/{pagebuilder → sitebuilder/page}/components/PageBuilderUI.js +2 -2
  30. package/dist/components/{pagebuilder → sitebuilder/page}/components/PageEngine.js +1 -1
  31. package/dist/components/sitebuilder/page/documentation/api-examples/save-route-example.js +37 -0
  32. package/dist/components/{pagebuilder → sitebuilder/page}/lib/componentMap.js +3 -3
  33. package/dist/components/{pagebuilder → sitebuilder/page}/lib/componentMetadata.js +2 -2
  34. package/dist/components/{pagebuilder → sitebuilder/page}/lib/pageStorageContentful.js +2 -2
  35. package/dist/components/sitebuilder/page/lib/pageStorageTypes.js +1 -0
  36. package/dist/data/form.json +18 -18
  37. package/dist/data/routes.json +25 -0
  38. package/dist/data/routes2.json +25 -0
  39. package/dist/data/shipping.to.json +9 -9
  40. package/dist/data/siteinfo-form.json +200 -0
  41. package/dist/index.js +31 -23
  42. package/dist/index.server.js +24 -18
  43. package/dist/types/components/cms/flickr.d.ts.map +1 -1
  44. package/dist/types/components/cms/google.reviews.components.d.ts.map +1 -1
  45. package/dist/types/components/config/config.types.d.ts +30 -0
  46. package/dist/types/components/config/config.types.d.ts.map +1 -1
  47. package/dist/types/components/general/semantic.d.ts +3 -3
  48. package/dist/types/components/general/tab.d.ts +18 -0
  49. package/dist/types/components/general/tab.d.ts.map +1 -0
  50. package/dist/types/components/menu/menu-expando.d.ts.map +1 -1
  51. package/dist/types/components/nerdjoke/nerdjoke.d.ts.map +1 -1
  52. package/dist/types/components/seo/manifest.d.ts +19 -0
  53. package/dist/types/components/seo/manifest.d.ts.map +1 -0
  54. package/dist/types/components/seo/metadata.components.d.ts +0 -17
  55. package/dist/types/components/seo/metadata.components.d.ts.map +1 -1
  56. package/dist/types/components/seo/{metadata.d.ts → metadata.functions.d.ts} +15 -1
  57. package/dist/types/components/seo/metadata.functions.d.ts.map +1 -0
  58. package/dist/types/components/seo/schema-blogposting.d.ts +1 -25
  59. package/dist/types/components/seo/schema-blogposting.d.ts.map +1 -1
  60. package/dist/types/components/seo/schema-blogposting.functions.d.ts +26 -0
  61. package/dist/types/components/seo/schema-blogposting.functions.d.ts.map +1 -0
  62. package/dist/types/components/seo/schema-localbusiness.d.ts +22 -23
  63. package/dist/types/components/seo/schema-localbusiness.d.ts.map +1 -1
  64. package/dist/types/components/seo/schema-website.d.ts +17 -18
  65. package/dist/types/components/seo/schema-website.d.ts.map +1 -1
  66. package/dist/types/components/seo/sitemap.d.ts.map +1 -1
  67. package/dist/types/components/shoppingcart/shoppingcart.components.d.ts +1 -1
  68. package/dist/types/components/sitebuilder/config/ConfigBuilder.d.ts +86 -0
  69. package/dist/types/components/sitebuilder/config/ConfigBuilder.d.ts.map +1 -0
  70. package/dist/types/components/sitebuilder/form/formbuilder.d.ts +11 -0
  71. package/dist/types/components/sitebuilder/form/formbuilder.d.ts.map +1 -0
  72. package/dist/types/components/{pagebuilder → sitebuilder}/form/formcomponents.d.ts +12 -16
  73. package/dist/types/components/sitebuilder/form/formcomponents.d.ts.map +1 -0
  74. package/dist/types/components/{pagebuilder/form/form.submit.d.ts → sitebuilder/form/formemailer.d.ts} +1 -1
  75. package/dist/types/components/sitebuilder/form/formemailer.d.ts.map +1 -0
  76. package/dist/types/components/sitebuilder/form/formengine.d.ts +14 -0
  77. package/dist/types/components/sitebuilder/form/formengine.d.ts.map +1 -0
  78. package/dist/types/components/sitebuilder/form/formextractor.d.ts +25 -0
  79. package/dist/types/components/sitebuilder/form/formextractor.d.ts.map +1 -0
  80. package/dist/types/components/{pagebuilder/form/formvalidations.d.ts → sitebuilder/form/formfieldvalidations.d.ts} +1 -1
  81. package/dist/types/components/sitebuilder/form/formfieldvalidations.d.ts.map +1 -0
  82. package/dist/types/components/sitebuilder/form/formtypes.d.ts +66 -0
  83. package/dist/types/components/sitebuilder/form/formtypes.d.ts.map +1 -0
  84. package/dist/types/components/sitebuilder/form/formutils.d.ts +20 -0
  85. package/dist/types/components/sitebuilder/form/formutils.d.ts.map +1 -0
  86. package/dist/types/components/sitebuilder/form/formvalidator.d.ts +20 -0
  87. package/dist/types/components/sitebuilder/form/formvalidator.d.ts.map +1 -0
  88. package/dist/types/components/sitebuilder/page/components/ComponentPropertiesForm.d.ts.map +1 -0
  89. package/dist/types/components/sitebuilder/page/components/ComponentSelector.d.ts.map +1 -0
  90. package/dist/types/components/sitebuilder/page/components/ComponentTree.d.ts.map +1 -0
  91. package/dist/types/components/{pagebuilder → sitebuilder/page}/components/PageBuilderUI.d.ts +1 -1
  92. package/dist/types/components/sitebuilder/page/components/PageBuilderUI.d.ts.map +1 -0
  93. package/dist/types/components/sitebuilder/page/components/PageEngine.d.ts.map +1 -0
  94. package/dist/types/components/sitebuilder/page/components/SaveLoadSection.d.ts.map +1 -0
  95. package/dist/types/components/sitebuilder/page/documentation/api-examples/save-route-example.d.ts +6 -0
  96. package/dist/types/components/sitebuilder/page/documentation/api-examples/save-route-example.d.ts.map +1 -0
  97. package/dist/types/components/sitebuilder/page/lib/componentGeneration.d.ts.map +1 -0
  98. package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/componentMap.d.ts +3 -3
  99. package/dist/types/components/sitebuilder/page/lib/componentMap.d.ts.map +1 -0
  100. package/dist/types/components/sitebuilder/page/lib/componentMetadata.d.ts.map +1 -0
  101. package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/pageStorageContentful.d.ts +1 -1
  102. package/dist/types/components/sitebuilder/page/lib/pageStorageContentful.d.ts.map +1 -0
  103. package/dist/types/components/sitebuilder/page/lib/pageStorageLocal.d.ts.map +1 -0
  104. package/dist/types/components/sitebuilder/page/lib/pageStorageTypes.d.ts.map +1 -0
  105. package/dist/types/components/sitebuilder/page/lib/propTypeIntrospection.d.ts.map +1 -0
  106. package/dist/types/components/sitebuilder/page/lib/types.d.ts.map +1 -0
  107. package/dist/types/components/sitebuilder/page/lib/usePageBuilder.d.ts.map +1 -0
  108. package/dist/types/index.d.ts +30 -21
  109. package/dist/types/index.server.d.ts +23 -17
  110. package/dist/types/stories/general/tab.stories.d.ts +45 -0
  111. package/dist/types/stories/general/tab.stories.d.ts.map +1 -0
  112. package/dist/types/stories/seo/seo.googleanalytics.stories.d.ts.map +1 -1
  113. package/dist/types/stories/seo/seo.metadata.stories.d.ts +1 -1
  114. package/dist/types/stories/seo/seo.metadata.stories.d.ts.map +1 -1
  115. package/dist/types/stories/seo/seo.schema.stories.d.ts +23 -0
  116. package/dist/types/stories/seo/seo.schema.stories.d.ts.map +1 -0
  117. package/dist/types/stories/sitebuilder/configbuilder.stories.d.ts +48 -0
  118. package/dist/types/stories/sitebuilder/configbuilder.stories.d.ts.map +1 -0
  119. package/dist/types/stories/{pagebuilder → sitebuilder}/form-builder.stories.d.ts +1 -1
  120. package/dist/types/stories/sitebuilder/form-builder.stories.d.ts.map +1 -0
  121. package/dist/types/stories/{pagebuilder → sitebuilder}/form-engine.stories.d.ts +1 -1
  122. package/dist/types/stories/sitebuilder/form-engine.stories.d.ts.map +1 -0
  123. package/dist/types/stories/{pagebuilder → sitebuilder}/form-extractor.stories.d.ts +1 -1
  124. package/dist/types/stories/sitebuilder/form-extractor.stories.d.ts.map +1 -0
  125. package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.stories.d.ts +1 -1
  126. package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.stories.d.ts.map +1 -1
  127. package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.usageguide.stories.d.ts +1 -1
  128. package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.usageguide.stories.d.ts.map +1 -1
  129. package/dist/types/stories/{pagebuilder → sitebuilder}/pageengine.stories.d.ts +1 -1
  130. package/dist/types/stories/{pagebuilder → sitebuilder}/pageengine.stories.d.ts.map +1 -1
  131. package/dist/types/tests/configbuilder.test.d.ts +2 -0
  132. package/dist/types/tests/configbuilder.test.d.ts.map +1 -0
  133. package/dist/types/tests/manifest.test.d.ts +2 -0
  134. package/dist/types/tests/manifest.test.d.ts.map +1 -0
  135. package/dist/types/tests/tab.test.d.ts +2 -0
  136. package/dist/types/tests/tab.test.d.ts.map +1 -0
  137. package/package.json +6 -5
  138. package/dist/components/pagebuilder/form/formcomponents.js +0 -359
  139. package/dist/components/seo/metadata.js +0 -108
  140. package/dist/components/utilities/api.js +0 -36
  141. package/dist/types/components/pagebuilder/components/ComponentPropertiesForm.d.ts.map +0 -1
  142. package/dist/types/components/pagebuilder/components/ComponentSelector.d.ts.map +0 -1
  143. package/dist/types/components/pagebuilder/components/ComponentTree.d.ts.map +0 -1
  144. package/dist/types/components/pagebuilder/components/PageBuilderUI.d.ts.map +0 -1
  145. package/dist/types/components/pagebuilder/components/PageEngine.d.ts.map +0 -1
  146. package/dist/types/components/pagebuilder/components/SaveLoadSection.d.ts.map +0 -1
  147. package/dist/types/components/pagebuilder/form/form.d.ts +0 -46
  148. package/dist/types/components/pagebuilder/form/form.d.ts.map +0 -1
  149. package/dist/types/components/pagebuilder/form/form.submit.d.ts.map +0 -1
  150. package/dist/types/components/pagebuilder/form/formcomponents.d.ts.map +0 -1
  151. package/dist/types/components/pagebuilder/form/formvalidations.d.ts.map +0 -1
  152. package/dist/types/components/pagebuilder/lib/componentGeneration.d.ts.map +0 -1
  153. package/dist/types/components/pagebuilder/lib/componentMap.d.ts.map +0 -1
  154. package/dist/types/components/pagebuilder/lib/componentMetadata.d.ts.map +0 -1
  155. package/dist/types/components/pagebuilder/lib/pageStorageContentful.d.ts.map +0 -1
  156. package/dist/types/components/pagebuilder/lib/pageStorageLocal.d.ts.map +0 -1
  157. package/dist/types/components/pagebuilder/lib/pageStorageTypes.d.ts.map +0 -1
  158. package/dist/types/components/pagebuilder/lib/propTypeIntrospection.d.ts.map +0 -1
  159. package/dist/types/components/pagebuilder/lib/types.d.ts.map +0 -1
  160. package/dist/types/components/pagebuilder/lib/usePageBuilder.d.ts.map +0 -1
  161. package/dist/types/components/seo/metadata.d.ts.map +0 -1
  162. package/dist/types/components/utilities/api.d.ts +0 -16
  163. package/dist/types/components/utilities/api.d.ts.map +0 -1
  164. package/dist/types/stories/pagebuilder/form-builder.stories.d.ts.map +0 -1
  165. package/dist/types/stories/pagebuilder/form-engine.stories.d.ts.map +0 -1
  166. package/dist/types/stories/pagebuilder/form-extractor.stories.d.ts.map +0 -1
  167. package/dist/types/tests/api.test.d.ts +0 -2
  168. package/dist/types/tests/api.test.d.ts.map +0 -1
  169. /package/dist/components/{pagebuilder/form/form.submit.js → sitebuilder/form/formemailer.js} +0 -0
  170. /package/dist/components/{pagebuilder/form/formvalidations.js → sitebuilder/form/formfieldvalidations.js} +0 -0
  171. /package/dist/components/{pagebuilder/lib/pageStorageTypes.js → sitebuilder/form/formtypes.js} +0 -0
  172. /package/dist/components/{pagebuilder → sitebuilder/page}/components/ComponentSelector.js +0 -0
  173. /package/dist/components/{pagebuilder → sitebuilder/page}/components/ComponentTree.js +0 -0
  174. /package/dist/components/{pagebuilder → sitebuilder/page}/components/SaveLoadSection.js +0 -0
  175. /package/dist/components/{pagebuilder → sitebuilder/page}/components/pagebuilder.scss +0 -0
  176. /package/dist/components/{pagebuilder → sitebuilder/page}/lib/componentGeneration.js +0 -0
  177. /package/dist/components/{pagebuilder → sitebuilder/page}/lib/pageStorageLocal.js +0 -0
  178. /package/dist/components/{pagebuilder → sitebuilder/page}/lib/propTypeIntrospection.js +0 -0
  179. /package/dist/components/{pagebuilder → sitebuilder/page}/lib/types.js +0 -0
  180. /package/dist/components/{pagebuilder → sitebuilder/page}/lib/usePageBuilder.js +0 -0
  181. /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/ComponentPropertiesForm.d.ts +0 -0
  182. /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/ComponentSelector.d.ts +0 -0
  183. /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/ComponentTree.d.ts +0 -0
  184. /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/PageEngine.d.ts +0 -0
  185. /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/SaveLoadSection.d.ts +0 -0
  186. /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/componentGeneration.d.ts +0 -0
  187. /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/componentMetadata.d.ts +0 -0
  188. /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/pageStorageLocal.d.ts +0 -0
  189. /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/pageStorageTypes.d.ts +0 -0
  190. /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/propTypeIntrospection.d.ts +0 -0
  191. /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/types.d.ts +0 -0
  192. /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/usePageBuilder.d.ts +0 -0
@@ -11,6 +11,7 @@ This guide provides detailed API documentation and usage examples for all Pixela
11
11
  - [Modal](#modal)
12
12
  - [SidePanel](#sidepanel)
13
13
  - [SmartImage](#smartimage)
14
+ - [Tab](#tab)
14
15
  - [Table](#table)
15
16
 
16
17
  ### CMS Integration
@@ -34,6 +35,7 @@ This guide provides detailed API documentation and usage examples for all Pixela
34
35
  - [ComponentPropertiesForm](#componentpropertiesform)
35
36
  - [ComponentSelector](#componentselector)
36
37
  - [ComponentTree](#componenttree)
38
+ - [ConfigBuilder](#configbuilder)
37
39
  - [PageBuilderUI](#pagebuilderui)
38
40
  - [PageEngine](#pageengine)
39
41
  - [SaveLoadSection](#saveloadsection)
@@ -44,6 +46,7 @@ This guide provides detailed API documentation and usage examples for all Pixela
44
46
  - [GoogleMap](#googlemap)
45
47
  - [GoogleSearch](#googlesearch)
46
48
  - [JSON-LD Schemas](#json-ld-schemas)
49
+ - [Manifest](#manifest)
47
50
  - [MetadataComponents](#metadatacomponents)
48
51
 
49
52
  ### Shopping Cart
@@ -553,7 +556,7 @@ const reviews = [
553
556
 
554
557
  ### Forms
555
558
 
556
- Dynamic form builder that generates forms from JSON configuration.
559
+ Dynamic form builder that generates forms from JSON configuration with comprehensive validation and event handling.
557
560
 
558
561
  #### FormEngine
559
562
 
@@ -565,21 +568,39 @@ import { FormEngine } from '@pixelated-tech/components';
565
568
  const formConfig = {
566
569
  fields: [
567
570
  {
568
- type: 'text',
571
+ component: 'FormInput',
569
572
  props: {
573
+ type: 'text',
574
+ id: 'email',
570
575
  name: 'email',
571
576
  label: 'Email Address',
572
577
  placeholder: 'Enter your email',
573
- required: true
578
+ required: 'required',
579
+ validate: 'email'
574
580
  }
575
581
  },
576
582
  {
577
- type: 'textarea',
583
+ component: 'FormTextarea',
578
584
  props: {
585
+ id: 'message',
579
586
  name: 'message',
580
587
  label: 'Message',
581
588
  placeholder: 'Enter your message',
582
- rows: 4
589
+ rows: '4',
590
+ required: 'required'
591
+ }
592
+ },
593
+ {
594
+ component: 'FormSelect',
595
+ props: {
596
+ id: 'category',
597
+ name: 'category',
598
+ label: 'Category',
599
+ options: [
600
+ { text: 'General', value: 'general' },
601
+ { text: 'Support', value: 'support' },
602
+ { text: 'Sales', value: 'sales' }
603
+ ]
583
604
  }
584
605
  }
585
606
  ]
@@ -594,36 +615,171 @@ const formConfig = {
594
615
 
595
616
  #### Form Components
596
617
 
597
- Individual form field components for custom form building.
618
+ Individual form field components with unified event handling and validation.
619
+
620
+ ##### FormInput
621
+ Text input field with validation and accessibility features.
598
622
 
599
623
  ```tsx
600
- import * as FC from '@pixelated-tech/components';
624
+ import { FormInput } from '@pixelated-tech/components';
625
+
626
+ <FormInput
627
+ type="email"
628
+ id="email"
629
+ name="email"
630
+ label="Email Address"
631
+ placeholder="Enter your email"
632
+ required="required"
633
+ validate="email"
634
+ display="vertical"
635
+ />
636
+ ```
601
637
 
602
- function CustomForm() {
603
- return (
604
- <form>
605
- <FC.TextInput
606
- name="username"
607
- label="Username"
608
- required={true}
609
- placeholder="Enter username"
610
- />
611
- <FC.EmailInput
612
- name="email"
613
- label="Email"
614
- required={true}
615
- />
616
- <FC.TextArea
617
- name="bio"
618
- label="Bio"
619
- rows={4}
620
- placeholder="Tell us about yourself"
621
- />
622
- </form>
623
- );
624
- }
638
+ **Props:**
639
+ - `type`: Input type (text, email, password, etc.)
640
+ - `id`: Unique identifier
641
+ - `name`: Form field name
642
+ - `label`: Display label
643
+ - `placeholder`: Input placeholder text
644
+ - `required`: Makes field required
645
+ - `validate`: Validation rule name
646
+ - `display`: Layout mode (vertical/horizontal)
647
+
648
+ ##### FormTextarea
649
+ Multi-line text input with validation.
650
+
651
+ ```tsx
652
+ import { FormTextarea } from '@pixelated-tech/components';
653
+
654
+ <FormTextarea
655
+ id="description"
656
+ name="description"
657
+ label="Description"
658
+ placeholder="Enter description"
659
+ rows="4"
660
+ required="required"
661
+ display="vertical"
662
+ />
625
663
  ```
626
664
 
665
+ ##### FormSelect
666
+ Dropdown selection with option validation.
667
+
668
+ ```tsx
669
+ import { FormSelect } from '@pixelated-tech/components';
670
+
671
+ <FormSelect
672
+ id="category"
673
+ name="category"
674
+ label="Category"
675
+ options={[
676
+ { text: 'Option 1', value: 'opt1' },
677
+ { text: 'Option 2', value: 'opt2' }
678
+ ]}
679
+ required="required"
680
+ />
681
+ ```
682
+
683
+ ##### FormRadio
684
+ Radio button group with validation.
685
+
686
+ ```tsx
687
+ import { FormRadio } from '@pixelated-tech/components';
688
+
689
+ <FormRadio
690
+ id="choice"
691
+ name="choice"
692
+ label="Choose an option"
693
+ options={[
694
+ { text: 'Option A', value: 'a' },
695
+ { text: 'Option B', value: 'b' }
696
+ ]}
697
+ required="required"
698
+ />
699
+ ```
700
+
701
+ ##### FormCheckbox
702
+ Checkbox group with validation.
703
+
704
+ ```tsx
705
+ import { FormCheckbox } from '@pixelated-tech/components';
706
+
707
+ <FormCheckbox
708
+ id="preferences"
709
+ name="preferences"
710
+ label="Preferences"
711
+ options={[
712
+ { text: 'Email updates', value: 'email' },
713
+ { text: 'SMS updates', value: 'sms' }
714
+ ]}
715
+ />
716
+ ```
717
+
718
+ ##### FormButton
719
+ Action button for form submission.
720
+
721
+ ```tsx
722
+ import { FormButton } from '@pixelated-tech/components';
723
+
724
+ <FormButton
725
+ type="submit"
726
+ id="submit-btn"
727
+ text="Submit Form"
728
+ onClick={handleSubmit}
729
+ />
730
+ ```
731
+
732
+ ##### FormTooltip
733
+ Unified tooltip and validation message component with mouseover behavior and conditional styling.
734
+
735
+ ```tsx
736
+ import { FormTooltip } from '@pixelated-tech/components';
737
+
738
+ // Tooltip mode - displays information with black ⓘ icon
739
+ <FormTooltip
740
+ mode="tooltip"
741
+ text={['This field is required', 'Please enter a valid email address']}
742
+ />
743
+
744
+ // Validation mode - displays errors with red ❌ icon
745
+ <FormTooltip
746
+ mode="validate"
747
+ text={['Email format is invalid', 'Please check your input']}
748
+ />
749
+ ```
750
+
751
+ **Props:**
752
+ - `mode`: Display mode ('tooltip' for info, 'validate' for errors)
753
+ - `text`: Array of strings to display (always use array format)
754
+
755
+ **Features:**
756
+ - **Conditional Icons**: ⓘ (black) for tooltips, ❌ (red) for validation errors
757
+ - **Mouseover Behavior**: Shows/hides content on hover for both modes
758
+ - **Unified Styling**: Consistent appearance with mode-based color variations
759
+ - **Array-Based Text**: Always accepts text as string array for consistency
760
+
761
+ #### Form Validation
762
+
763
+ Built-in validation rules available via the `validate` prop:
764
+
765
+ - `email`: Email format validation
766
+ - `url`: URL format validation
767
+ - `phone`: Phone number format
768
+ - `zipcode`: US zip code validation
769
+ - `required`: Required field validation
770
+ - Custom validation functions can be added to `formvalidations.tsx`
771
+
772
+ #### Recent Improvements
773
+
774
+ **Version 3.2.14+** includes major refactoring for better performance and maintainability:
775
+
776
+ - **FormTooltip Unification**: Merged FormTooltip and FormValidate into single component with mode-based rendering
777
+ - **Unified Event Handling**: All form components now use consistent `onChange` and `onInput` handlers for better test compatibility
778
+ - **Performance Optimization**: Replaced inefficient `JSON.parse/stringify` with direct object destructuring
779
+ - **Code Deduplication**: Custom `useFormComponent` hook eliminates repetitive validation logic
780
+ - **Circular Reference Prevention**: Fixed memory leaks in option generation for radio/checkbox components
781
+ - **Enhanced Test Coverage**: 2,244 tests passing across 67 test files with comprehensive form component coverage
782
+
627
783
  ### Menu
628
784
 
629
785
  Navigation components with multiple interaction patterns.
@@ -690,6 +846,29 @@ const menuItems = [
690
846
  <MenuExpando menuItems={menuItems} />
691
847
  ```
692
848
 
849
+ ### Tab
850
+
851
+ Configurable tab component with multiple orientations and content areas.
852
+
853
+ ```tsx
854
+ import { Tab } from '@pixelated-tech/components';
855
+
856
+ const tabs = [
857
+ { id: 'tab1', label: 'Tab 1', content: <div>Content for Tab 1</div> },
858
+ { id: 'tab2', label: 'Tab 2', content: <div>Content for Tab 2</div> },
859
+ { id: 'tab3', label: 'Tab 3', content: <div>Content for Tab 3</div> },
860
+ ];
861
+
862
+ <Tab tabs={tabs} orientation="top" defaultActiveTab="tab1" />
863
+ ```
864
+
865
+ #### Props
866
+
867
+ - `tabs`: Array of tab objects with `id`, `label`, and `content`
868
+ - `orientation`: 'top' | 'bottom' | 'left' | 'right' (default: 'top')
869
+ - `defaultActiveTab`: ID of the initially active tab
870
+ - `onTabChange`: Callback function called when tab changes
871
+
693
872
  ### Tables
694
873
 
695
874
  Data display component with sorting and image support.
@@ -873,6 +1052,87 @@ import { SaveLoadSection } from '@pixelated-tech/components';
873
1052
  | `onLoad` | `function` | - | Load handler |
874
1053
  | `onNew` | `function` | - | New page handler |
875
1054
 
1055
+ ### ConfigBuilder
1056
+
1057
+ Tabbed interface for managing site metadata and routes configuration.
1058
+
1059
+ ```tsx
1060
+ import { ConfigBuilder } from '@pixelated-tech/components';
1061
+
1062
+ <ConfigBuilder
1063
+ initialConfig={{
1064
+ siteInfo: { name: 'My Site', description: 'Site description' },
1065
+ routes: [
1066
+ { path: '/home', component: 'Home', title: 'Home Page' }
1067
+ ]
1068
+ }}
1069
+ onSave={(config) => console.log('Config saved:', config)}
1070
+ />
1071
+ ```
1072
+
1073
+ #### Props
1074
+ | Prop | Type | Default | Description |
1075
+ |------|------|---------|-------------|
1076
+ | `initialConfig` | `SiteConfig` | - | Initial site configuration |
1077
+ | `onSave` | `function` | - | Configuration save handler |
1078
+
1079
+ #### SiteConfig Type
1080
+ ```tsx
1081
+ interface SiteConfig {
1082
+ siteInfo: {
1083
+ name: string;
1084
+ author: string;
1085
+ description: string;
1086
+ url: string;
1087
+ email: string;
1088
+ favicon: string;
1089
+ favicon_sizes: string;
1090
+ favicon_type: string;
1091
+ theme_color: string;
1092
+ background_color: string;
1093
+ default_locale: string;
1094
+ display: string;
1095
+ image?: string;
1096
+ image_height?: string;
1097
+ image_width?: string;
1098
+ telephone?: string;
1099
+ address?: {
1100
+ streetAddress: string;
1101
+ addressLocality: string;
1102
+ addressRegion: string;
1103
+ postalCode: string;
1104
+ addressCountry: string;
1105
+ };
1106
+ priceRange?: string;
1107
+ sameAs?: string[];
1108
+ keywords?: string;
1109
+ };
1110
+ routes: Array<{
1111
+ path: string;
1112
+ component: string;
1113
+ title?: string;
1114
+ description?: string;
1115
+ }>;
1116
+ }
1117
+ ```
1118
+
1119
+ #### Features
1120
+ - **Tabbed Interface**: Organized into "Site Info" and "Routes" tabs
1121
+ - **Comprehensive Site Info Management**: Edit all standard site metadata fields including PWA settings, contact info, and address
1122
+ - **Route Management**: Add, edit, and remove page routes with component mapping
1123
+ - **Real-time Preview**: JSON preview of current configuration
1124
+ - **Save Functionality**: Callback-based configuration persistence with form validation enforcement
1125
+ - **Form Validation**: Required field validation for essential site information with visual feedback
1126
+
1127
+ #### Validation Behavior
1128
+
1129
+ The "Save Config" button enforces form validation before allowing configuration saves:
1130
+
1131
+ - **Required Fields**: Site name, author, description, URL, and email are mandatory
1132
+ - **Visual Feedback**: Invalid fields show validation errors with ❌ indicators
1133
+ - **Save Prevention**: Save action is blocked until all required validations pass
1134
+ - **Real-time Validation**: Form validates as you type with immediate feedback
1135
+
876
1136
  ---
877
1137
 
878
1138
  ## SEO & Schema
@@ -881,11 +1141,16 @@ import { SaveLoadSection } from '@pixelated-tech/components';
881
1141
 
882
1142
  Structured data components for SEO.
883
1143
 
1144
+ **Configuration**: The LocalBusiness and Website schema components can use `siteInfo` data from the routes JSON file as fallback values when props are not explicitly provided. This allows for centralized site-wide configuration of business/website information.
1145
+
884
1146
  #### LocalBusiness
885
1147
 
1148
+ Generates LocalBusiness JSON-LD structured data. When props are not provided, falls back to `siteInfo` configuration from routes JSON.
1149
+
886
1150
  ```tsx
887
1151
  import { LocalBusinessSchema } from '@pixelated-tech/components';
888
1152
 
1153
+ // With explicit props
889
1154
  <LocalBusinessSchema
890
1155
  name="My Business"
891
1156
  address={{
@@ -896,6 +1161,19 @@ import { LocalBusinessSchema } from '@pixelated-tech/components';
896
1161
  }}
897
1162
  telephone="(555) 123-4567"
898
1163
  />
1164
+
1165
+ // Or with siteinfo object (recommended)
1166
+ <LocalBusinessSchema
1167
+ siteInfo={siteInfoData}
1168
+ streetAddress="123 Main St"
1169
+ addressLocality="City"
1170
+ addressRegion="State"
1171
+ postalCode="12345"
1172
+ />
1173
+
1174
+ // Or with minimal props (uses siteInfo fallbacks)
1175
+ <LocalBusinessSchema />
1176
+ ```
899
1177
  ```
900
1178
 
901
1179
  #### Recipe
@@ -941,9 +1219,12 @@ import { ServicesSchema } from '@pixelated-tech/components';
941
1219
 
942
1220
  #### Website
943
1221
 
1222
+ Generates Website JSON-LD structured data. When props are not provided, falls back to `siteInfo` configuration from routes JSON.
1223
+
944
1224
  ```tsx
945
1225
  import { WebsiteSchema } from '@pixelated-tech/components';
946
1226
 
1227
+ // With explicit props
947
1228
  <WebsiteSchema
948
1229
  name="My Website"
949
1230
  url="https://example.com"
@@ -953,6 +1234,22 @@ import { WebsiteSchema } from '@pixelated-tech/components';
953
1234
  logo: "https://example.com/logo.png"
954
1235
  }}
955
1236
  />
1237
+
1238
+ // Or with siteinfo object (recommended)
1239
+ <WebsiteSchema
1240
+ siteInfo={siteInfoData}
1241
+ potentialAction={{
1242
+ '@type': 'SearchAction',
1243
+ target: {
1244
+ '@type': 'EntryPoint',
1245
+ urlTemplate: 'https://example.com/search?q={search_term}'
1246
+ }
1247
+ }}
1248
+ />
1249
+
1250
+ // Or with minimal props (uses siteInfo fallbacks)
1251
+ <WebsiteSchema />
1252
+ ```
956
1253
  ```
957
1254
 
958
1255
  #### BlogPosting
@@ -1057,6 +1354,52 @@ import { GoogleSearch } from '@pixelated-tech/components';
1057
1354
  | `apiKey` | `string` | - | Google API key |
1058
1355
  | `placeholder` | `string` | `'Search...'` | Search input placeholder |
1059
1356
 
1357
+ ### Manifest
1358
+
1359
+ Generates a complete PWA manifest from siteinfo configuration. This component centralizes PWA manifest generation and ensures consistency across sites.
1360
+
1361
+ ```tsx
1362
+ import { Manifest } from '@pixelated-tech/components';
1363
+
1364
+ // Basic usage with siteinfo
1365
+ export default function manifest() {
1366
+ return Manifest({ siteInfo: myRoutes.siteInfo });
1367
+ }
1368
+
1369
+ // With custom properties for site-specific overrides
1370
+ export default function manifest() {
1371
+ return Manifest({
1372
+ siteInfo: myRoutes.siteInfo,
1373
+ customProperties: {
1374
+ orientation: 'portrait',
1375
+ categories: ['business', 'productivity'],
1376
+ lang: 'en-US'
1377
+ }
1378
+ });
1379
+ }
1380
+ ```
1381
+
1382
+ #### Props
1383
+ | Prop | Type | Default | Description |
1384
+ |------|------|---------|-------------|
1385
+ | `siteInfo` | `SiteInfo` | - | Site configuration object from routes.json |
1386
+ | `customProperties` | `Partial<MetadataRoute.Manifest>` | `{}` | Optional custom manifest properties to override defaults |
1387
+
1388
+ #### Generated Properties
1389
+
1390
+ The component automatically generates these manifest properties from `siteInfo`:
1391
+
1392
+ - `name` & `short_name`: From `siteInfo.name`
1393
+ - `description`: From `siteInfo.description`
1394
+ - `theme_color`: From `siteInfo.theme_color`
1395
+ - `background_color`: From `siteInfo.background_color`
1396
+ - `display`: From `siteInfo.display`
1397
+ - `homepage_url`: From `siteInfo.url`
1398
+ - `developer`: Object with `name` and `url` from siteInfo
1399
+ - `icons`: Array with favicon configuration
1400
+ - `author`: From `siteInfo.author` (non-standard property)
1401
+ - `default_locale`: From `siteInfo.default_locale`
1402
+
1060
1403
  ### MetadataComponents
1061
1404
 
1062
1405
  Dynamic meta tag injection for SEO.
@@ -1312,7 +1655,19 @@ import { NerdJoke } from '@pixelated-tech/components';
1312
1655
 
1313
1656
  ### PixelatedClientConfigProvider Setup
1314
1657
 
1315
- For components that use external services, wrap your app with the configuration provider:
1658
+ The PixelatedClientConfigProvider enables components to access centralized configuration data. Configuration can be loaded from environment variables or a `routes.json` file in your project.
1659
+
1660
+ **Config Consumers:**
1661
+ - **LocalBusinessSchema & WebsiteSchema**: Use `siteInfo` for fallback business/website data
1662
+ - **CloudinaryImage & SmartImage**: Use `cloudinary` for image optimization settings
1663
+ - **WordPress**: Use `wordpress` for API connections
1664
+ - **ContentfulItems**: Use `contentful` for CMS integration
1665
+ - **eBay**: Use `ebay` for store integration
1666
+ - **Flickr**: Use `flickr` for photo gallery integration
1667
+ - **GoogleAnalytics**: Use `googleAnalytics` for tracking
1668
+ - **HubSpot**: Use `hubspot` for CRM integration
1669
+ - **PayPal**: Use `paypal` for payment processing
1670
+ - **Proxy**: Use `proxy` for API proxy settings
1316
1671
 
1317
1672
  ```tsx
1318
1673
  // app/layout.tsx (Next.js 13+ App Router)
@@ -1327,15 +1682,63 @@ export default function RootLayout({
1327
1682
  <html lang="en">
1328
1683
  <body>
1329
1684
  <PixelatedClientConfigProvider config={{
1685
+ // Site-wide business/website information (used by schema components)
1686
+ siteInfo: {
1687
+ name: 'Your Business Name',
1688
+ description: 'Your business description',
1689
+ url: 'https://yourwebsite.com',
1690
+ email: 'contact@yourwebsite.com',
1691
+ telephone: '(555) 123-4567',
1692
+ address: {
1693
+ streetAddress: '123 Main St',
1694
+ addressLocality: 'City',
1695
+ addressRegion: 'State',
1696
+ postalCode: '12345',
1697
+ addressCountry: 'United States'
1698
+ },
1699
+ openingHours: 'Mo-Fr 09:00-18:00'
1700
+ },
1701
+ // Image optimization
1330
1702
  cloudinary: {
1331
1703
  product_env: 'production',
1332
1704
  baseUrl: 'https://res.cloudinary.com/your-account',
1333
1705
  transforms: 'f_auto,q_auto,w_auto'
1334
1706
  },
1707
+ // CMS integrations
1335
1708
  wordpress: {
1336
1709
  site: 'your-blog.wordpress.com'
1337
1710
  },
1338
- // Add other service configurations as needed
1711
+ contentful: {
1712
+ spaceId: 'your-space-id',
1713
+ accessToken: 'your-access-token',
1714
+ environment: 'master'
1715
+ },
1716
+ // E-commerce
1717
+ ebay: {
1718
+ appId: 'your-app-id',
1719
+ globalId: 'EBAY-US'
1720
+ },
1721
+ paypal: {
1722
+ sandboxPayPalApiKey: 'your-sandbox-key',
1723
+ payPalApiKey: 'your-production-key'
1724
+ },
1725
+ // Analytics & CRM
1726
+ googleAnalytics: {
1727
+ id: 'GA-XXXXXXXXX'
1728
+ },
1729
+ hubspot: {
1730
+ portalId: 'your-portal-id',
1731
+ formId: 'your-form-id'
1732
+ },
1733
+ // Media services
1734
+ flickr: {
1735
+ api_key: 'your-flickr-api-key',
1736
+ user_id: 'your-user-id'
1737
+ },
1738
+ // API proxy
1739
+ proxy: {
1740
+ proxyURL: 'https://proxy.pixelated.tech/prod/proxy?url='
1741
+ }
1339
1742
  }}>
1340
1743
  {children}
1341
1744
  </PixelatedClientConfigProvider>
@@ -1345,52 +1748,6 @@ export default function RootLayout({
1345
1748
  }
1346
1749
  ```
1347
1750
 
1348
- ### Cloudinary Configuration
1349
-
1350
- ```tsx
1351
- const cloudinaryConfig = {
1352
- product_env: 'production', // Environment identifier
1353
- baseUrl: 'https://res.cloudinary.com/your-account', // Your Cloudinary URL
1354
- transforms: 'f_auto,q_auto,w_auto' // Default transformations
1355
- };
1356
- ```
1357
-
1358
- ### WordPress Configuration
1359
-
1360
- ```tsx
1361
- const wordpressConfig = {
1362
- site: 'your-blog.wordpress.com', // WordPress site URL
1363
- apiVersion: '1.1' // API version (optional)
1364
- };
1365
- ```
1366
-
1367
- ### Contentful Configuration
1368
-
1369
- ```tsx
1370
- const contentfulConfig = {
1371
- spaceId: 'your-space-id', // Contentful space ID
1372
- accessToken: 'your-access-token', // Contentful access token
1373
- environment: 'master' // Contentful environment
1374
- };
1375
- ```
1376
-
1377
- ### Other Service Configurations
1378
-
1379
- ```tsx
1380
- const config = {
1381
- calendly: {
1382
- username: 'your-calendly-username'
1383
- },
1384
- hubspot: {
1385
- portalId: 'your-portal-id',
1386
- formId: 'your-form-id'
1387
- },
1388
- instagram: {
1389
- accessToken: 'your-access-token'
1390
- }
1391
- };
1392
- ```
1393
-
1394
1751
  ---
1395
1752
 
1396
1753
  ## TypeScript Support