@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.
- package/README.COMPONENTS.md +435 -78
- package/README.md +59 -32
- package/dist/components/callout/callout.scss +0 -3
- package/dist/components/cms/flickr.js +8 -2
- package/dist/components/cms/google.reviews.components.js +1 -1
- package/dist/components/general/tab.css +105 -0
- package/dist/components/general/tab.js +26 -0
- package/dist/components/menu/menu-expando.js +7 -1
- package/dist/components/nerdjoke/nerdjoke.js +13 -7
- package/dist/components/seo/manifest.js +40 -0
- package/dist/components/seo/metadata.components.js +0 -19
- package/dist/components/seo/metadata.functions.js +111 -0
- package/dist/components/seo/schema-blogposting.functions.js +42 -0
- package/dist/components/seo/schema-blogposting.js +0 -46
- package/dist/components/seo/schema-localbusiness.js +46 -2
- package/dist/components/seo/schema-website.js +31 -2
- package/dist/components/seo/sitemap.js +4 -4
- package/dist/components/shoppingcart/shoppingcart.components.js +4 -4
- package/dist/components/sitebuilder/config/ConfigBuilder.css +266 -0
- package/dist/components/sitebuilder/config/ConfigBuilder.js +221 -0
- package/dist/components/{pagebuilder → sitebuilder}/form/form.css +55 -30
- package/dist/components/sitebuilder/form/formbuilder.js +106 -0
- package/dist/components/sitebuilder/form/formcomponents.js +356 -0
- package/dist/components/sitebuilder/form/formengine.js +82 -0
- package/dist/components/{pagebuilder/form/form.js → sitebuilder/form/formextractor.js} +10 -211
- package/dist/components/sitebuilder/form/formutils.js +206 -0
- package/dist/components/sitebuilder/form/formvalidator.js +123 -0
- package/dist/components/{pagebuilder → sitebuilder/page}/components/ComponentPropertiesForm.js +1 -1
- package/dist/components/{pagebuilder → sitebuilder/page}/components/PageBuilderUI.js +2 -2
- package/dist/components/{pagebuilder → sitebuilder/page}/components/PageEngine.js +1 -1
- package/dist/components/sitebuilder/page/documentation/api-examples/save-route-example.js +37 -0
- package/dist/components/{pagebuilder → sitebuilder/page}/lib/componentMap.js +3 -3
- package/dist/components/{pagebuilder → sitebuilder/page}/lib/componentMetadata.js +2 -2
- package/dist/components/{pagebuilder → sitebuilder/page}/lib/pageStorageContentful.js +2 -2
- package/dist/components/sitebuilder/page/lib/pageStorageTypes.js +1 -0
- package/dist/data/form.json +18 -18
- package/dist/data/routes.json +25 -0
- package/dist/data/routes2.json +25 -0
- package/dist/data/shipping.to.json +9 -9
- package/dist/data/siteinfo-form.json +200 -0
- package/dist/index.js +31 -23
- package/dist/index.server.js +24 -18
- package/dist/types/components/cms/flickr.d.ts.map +1 -1
- package/dist/types/components/cms/google.reviews.components.d.ts.map +1 -1
- package/dist/types/components/config/config.types.d.ts +30 -0
- package/dist/types/components/config/config.types.d.ts.map +1 -1
- package/dist/types/components/general/semantic.d.ts +3 -3
- package/dist/types/components/general/tab.d.ts +18 -0
- package/dist/types/components/general/tab.d.ts.map +1 -0
- package/dist/types/components/menu/menu-expando.d.ts.map +1 -1
- package/dist/types/components/nerdjoke/nerdjoke.d.ts.map +1 -1
- package/dist/types/components/seo/manifest.d.ts +19 -0
- package/dist/types/components/seo/manifest.d.ts.map +1 -0
- package/dist/types/components/seo/metadata.components.d.ts +0 -17
- package/dist/types/components/seo/metadata.components.d.ts.map +1 -1
- package/dist/types/components/seo/{metadata.d.ts → metadata.functions.d.ts} +15 -1
- package/dist/types/components/seo/metadata.functions.d.ts.map +1 -0
- package/dist/types/components/seo/schema-blogposting.d.ts +1 -25
- package/dist/types/components/seo/schema-blogposting.d.ts.map +1 -1
- package/dist/types/components/seo/schema-blogposting.functions.d.ts +26 -0
- package/dist/types/components/seo/schema-blogposting.functions.d.ts.map +1 -0
- package/dist/types/components/seo/schema-localbusiness.d.ts +22 -23
- package/dist/types/components/seo/schema-localbusiness.d.ts.map +1 -1
- package/dist/types/components/seo/schema-website.d.ts +17 -18
- package/dist/types/components/seo/schema-website.d.ts.map +1 -1
- package/dist/types/components/seo/sitemap.d.ts.map +1 -1
- package/dist/types/components/shoppingcart/shoppingcart.components.d.ts +1 -1
- package/dist/types/components/sitebuilder/config/ConfigBuilder.d.ts +86 -0
- package/dist/types/components/sitebuilder/config/ConfigBuilder.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/form/formbuilder.d.ts +11 -0
- package/dist/types/components/sitebuilder/form/formbuilder.d.ts.map +1 -0
- package/dist/types/components/{pagebuilder → sitebuilder}/form/formcomponents.d.ts +12 -16
- package/dist/types/components/sitebuilder/form/formcomponents.d.ts.map +1 -0
- package/dist/types/components/{pagebuilder/form/form.submit.d.ts → sitebuilder/form/formemailer.d.ts} +1 -1
- package/dist/types/components/sitebuilder/form/formemailer.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/form/formengine.d.ts +14 -0
- package/dist/types/components/sitebuilder/form/formengine.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/form/formextractor.d.ts +25 -0
- package/dist/types/components/sitebuilder/form/formextractor.d.ts.map +1 -0
- package/dist/types/components/{pagebuilder/form/formvalidations.d.ts → sitebuilder/form/formfieldvalidations.d.ts} +1 -1
- package/dist/types/components/sitebuilder/form/formfieldvalidations.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/form/formtypes.d.ts +66 -0
- package/dist/types/components/sitebuilder/form/formtypes.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/form/formutils.d.ts +20 -0
- package/dist/types/components/sitebuilder/form/formutils.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/form/formvalidator.d.ts +20 -0
- package/dist/types/components/sitebuilder/form/formvalidator.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/components/ComponentPropertiesForm.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/components/ComponentSelector.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/components/ComponentTree.d.ts.map +1 -0
- package/dist/types/components/{pagebuilder → sitebuilder/page}/components/PageBuilderUI.d.ts +1 -1
- package/dist/types/components/sitebuilder/page/components/PageBuilderUI.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/components/PageEngine.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/components/SaveLoadSection.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/documentation/api-examples/save-route-example.d.ts +6 -0
- package/dist/types/components/sitebuilder/page/documentation/api-examples/save-route-example.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/lib/componentGeneration.d.ts.map +1 -0
- package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/componentMap.d.ts +3 -3
- package/dist/types/components/sitebuilder/page/lib/componentMap.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/lib/componentMetadata.d.ts.map +1 -0
- package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/pageStorageContentful.d.ts +1 -1
- package/dist/types/components/sitebuilder/page/lib/pageStorageContentful.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/lib/pageStorageLocal.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/lib/pageStorageTypes.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/lib/propTypeIntrospection.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/lib/types.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/lib/usePageBuilder.d.ts.map +1 -0
- package/dist/types/index.d.ts +30 -21
- package/dist/types/index.server.d.ts +23 -17
- package/dist/types/stories/general/tab.stories.d.ts +45 -0
- package/dist/types/stories/general/tab.stories.d.ts.map +1 -0
- package/dist/types/stories/seo/seo.googleanalytics.stories.d.ts.map +1 -1
- package/dist/types/stories/seo/seo.metadata.stories.d.ts +1 -1
- package/dist/types/stories/seo/seo.metadata.stories.d.ts.map +1 -1
- package/dist/types/stories/seo/seo.schema.stories.d.ts +23 -0
- package/dist/types/stories/seo/seo.schema.stories.d.ts.map +1 -0
- package/dist/types/stories/sitebuilder/configbuilder.stories.d.ts +48 -0
- package/dist/types/stories/sitebuilder/configbuilder.stories.d.ts.map +1 -0
- package/dist/types/stories/{pagebuilder → sitebuilder}/form-builder.stories.d.ts +1 -1
- package/dist/types/stories/sitebuilder/form-builder.stories.d.ts.map +1 -0
- package/dist/types/stories/{pagebuilder → sitebuilder}/form-engine.stories.d.ts +1 -1
- package/dist/types/stories/sitebuilder/form-engine.stories.d.ts.map +1 -0
- package/dist/types/stories/{pagebuilder → sitebuilder}/form-extractor.stories.d.ts +1 -1
- package/dist/types/stories/sitebuilder/form-extractor.stories.d.ts.map +1 -0
- package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.stories.d.ts +1 -1
- package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.stories.d.ts.map +1 -1
- package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.usageguide.stories.d.ts +1 -1
- package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.usageguide.stories.d.ts.map +1 -1
- package/dist/types/stories/{pagebuilder → sitebuilder}/pageengine.stories.d.ts +1 -1
- package/dist/types/stories/{pagebuilder → sitebuilder}/pageengine.stories.d.ts.map +1 -1
- package/dist/types/tests/configbuilder.test.d.ts +2 -0
- package/dist/types/tests/configbuilder.test.d.ts.map +1 -0
- package/dist/types/tests/manifest.test.d.ts +2 -0
- package/dist/types/tests/manifest.test.d.ts.map +1 -0
- package/dist/types/tests/tab.test.d.ts +2 -0
- package/dist/types/tests/tab.test.d.ts.map +1 -0
- package/package.json +6 -5
- package/dist/components/pagebuilder/form/formcomponents.js +0 -359
- package/dist/components/seo/metadata.js +0 -108
- package/dist/components/utilities/api.js +0 -36
- package/dist/types/components/pagebuilder/components/ComponentPropertiesForm.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/components/ComponentSelector.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/components/ComponentTree.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/components/PageBuilderUI.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/components/PageEngine.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/components/SaveLoadSection.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/form/form.d.ts +0 -46
- package/dist/types/components/pagebuilder/form/form.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/form/form.submit.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/form/formcomponents.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/form/formvalidations.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/componentGeneration.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/componentMap.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/componentMetadata.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/pageStorageContentful.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/pageStorageLocal.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/pageStorageTypes.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/propTypeIntrospection.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/types.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/usePageBuilder.d.ts.map +0 -1
- package/dist/types/components/seo/metadata.d.ts.map +0 -1
- package/dist/types/components/utilities/api.d.ts +0 -16
- package/dist/types/components/utilities/api.d.ts.map +0 -1
- package/dist/types/stories/pagebuilder/form-builder.stories.d.ts.map +0 -1
- package/dist/types/stories/pagebuilder/form-engine.stories.d.ts.map +0 -1
- package/dist/types/stories/pagebuilder/form-extractor.stories.d.ts.map +0 -1
- package/dist/types/tests/api.test.d.ts +0 -2
- package/dist/types/tests/api.test.d.ts.map +0 -1
- /package/dist/components/{pagebuilder/form/form.submit.js → sitebuilder/form/formemailer.js} +0 -0
- /package/dist/components/{pagebuilder/form/formvalidations.js → sitebuilder/form/formfieldvalidations.js} +0 -0
- /package/dist/components/{pagebuilder/lib/pageStorageTypes.js → sitebuilder/form/formtypes.js} +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/components/ComponentSelector.js +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/components/ComponentTree.js +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/components/SaveLoadSection.js +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/components/pagebuilder.scss +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/lib/componentGeneration.js +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/lib/pageStorageLocal.js +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/lib/propTypeIntrospection.js +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/lib/types.js +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/lib/usePageBuilder.js +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/ComponentPropertiesForm.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/ComponentSelector.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/ComponentTree.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/PageEngine.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/SaveLoadSection.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/componentGeneration.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/componentMetadata.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/pageStorageLocal.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/pageStorageTypes.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/propTypeIntrospection.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/types.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/usePageBuilder.d.ts +0 -0
package/README.COMPONENTS.md
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
578
|
+
required: 'required',
|
|
579
|
+
validate: 'email'
|
|
574
580
|
}
|
|
575
581
|
},
|
|
576
582
|
{
|
|
577
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|