@pixelated-tech/components 3.2.14 → 3.3.1

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 (202) hide show
  1. package/README.COMPONENTS.md +520 -31
  2. package/README.md +163 -49
  3. package/dist/components/cms/cloudinary.image.js +1 -0
  4. package/dist/components/cms/wordpress.components.js +1 -0
  5. package/dist/components/general/sidepanel.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-accordion.css +10 -0
  9. package/dist/components/menu/menu-accordion.js +2 -1
  10. package/dist/components/menu/menu-simple.css +0 -7
  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/sitemap.js +1 -1
  16. package/dist/components/shoppingcart/shoppingcart.components.js +4 -4
  17. package/dist/components/sitebuilder/config/CompoundFontSelector.css +25 -0
  18. package/dist/components/sitebuilder/config/CompoundFontSelector.js +41 -0
  19. package/dist/components/sitebuilder/config/ConfigBuilder.css +277 -0
  20. package/dist/components/sitebuilder/config/ConfigBuilder.js +380 -0
  21. package/dist/components/sitebuilder/config/ConfigEngine.js +82 -0
  22. package/dist/components/sitebuilder/config/FontSelector.css +82 -0
  23. package/dist/components/sitebuilder/config/FontSelector.js +115 -0
  24. package/dist/components/sitebuilder/config/google-fonts.js +112 -0
  25. package/dist/components/{pagebuilder → sitebuilder}/form/form.css +55 -34
  26. package/dist/components/sitebuilder/form/formbuilder.js +107 -0
  27. package/dist/components/sitebuilder/form/formcomponents.js +380 -0
  28. package/dist/components/sitebuilder/form/formengine.js +82 -0
  29. package/dist/components/{pagebuilder/form/form.js → sitebuilder/form/formextractor.js} +10 -211
  30. package/dist/components/sitebuilder/form/formutils.js +206 -0
  31. package/dist/components/sitebuilder/form/formvalidator.js +123 -0
  32. package/dist/components/{pagebuilder → sitebuilder/page}/components/ComponentPropertiesForm.js +1 -1
  33. package/dist/components/{pagebuilder → sitebuilder/page}/components/PageBuilderUI.js +2 -2
  34. package/dist/components/{pagebuilder → sitebuilder/page}/components/PageEngine.js +1 -1
  35. package/dist/components/sitebuilder/page/documentation/api-examples/save-route-example.js +37 -0
  36. package/dist/components/{pagebuilder → sitebuilder/page}/lib/componentMap.js +3 -3
  37. package/dist/components/{pagebuilder → sitebuilder/page}/lib/componentMetadata.js +2 -2
  38. package/dist/components/{pagebuilder → sitebuilder/page}/lib/pageStorageContentful.js +2 -2
  39. package/dist/components/sitebuilder/page/lib/pageStorageTypes.js +1 -0
  40. package/dist/components/structured/markdown.js +1 -0
  41. package/dist/components/structured/recipe.js +1 -0
  42. package/dist/components/structured/timeline.js +1 -0
  43. package/dist/css/pixelated.global.css +0 -35
  44. package/dist/css/pixelated.grid.scss +4 -0
  45. package/dist/css/pixelated.visualdesign.scss +88 -0
  46. package/dist/data/form.json +18 -18
  47. package/dist/data/routes.json +32 -1
  48. package/dist/data/shipping.to.json +9 -9
  49. package/dist/data/siteinfo-form.json +200 -0
  50. package/dist/data/visualdesignform.json +244 -0
  51. package/dist/index.js +33 -21
  52. package/dist/index.server.js +24 -17
  53. package/dist/types/components/cms/cloudinary.image.d.ts.map +1 -1
  54. package/dist/types/components/cms/wordpress.components.d.ts.map +1 -1
  55. package/dist/types/components/general/semantic.d.ts +3 -3
  56. package/dist/types/components/general/tab.d.ts +18 -0
  57. package/dist/types/components/general/tab.d.ts.map +1 -0
  58. package/dist/types/components/menu/menu-accordion.d.ts.map +1 -1
  59. package/dist/types/components/seo/metadata.components.d.ts +0 -17
  60. package/dist/types/components/seo/metadata.components.d.ts.map +1 -1
  61. package/dist/types/components/seo/{metadata.d.ts → metadata.functions.d.ts} +15 -1
  62. package/dist/types/components/seo/metadata.functions.d.ts.map +1 -0
  63. package/dist/types/components/seo/schema-blogposting.d.ts +1 -25
  64. package/dist/types/components/seo/schema-blogposting.d.ts.map +1 -1
  65. package/dist/types/components/seo/schema-blogposting.functions.d.ts +26 -0
  66. package/dist/types/components/seo/schema-blogposting.functions.d.ts.map +1 -0
  67. package/dist/types/components/seo/sitemap.d.ts.map +1 -1
  68. package/dist/types/components/shoppingcart/shoppingcart.components.d.ts +1 -1
  69. package/dist/types/components/sitebuilder/config/CompoundFontSelector.d.ts +23 -0
  70. package/dist/types/components/sitebuilder/config/CompoundFontSelector.d.ts.map +1 -0
  71. package/dist/types/components/sitebuilder/config/ConfigBuilder.d.ts +354 -0
  72. package/dist/types/components/sitebuilder/config/ConfigBuilder.d.ts.map +1 -0
  73. package/dist/types/components/sitebuilder/config/ConfigEngine.d.ts +10 -0
  74. package/dist/types/components/sitebuilder/config/ConfigEngine.d.ts.map +1 -0
  75. package/dist/types/components/sitebuilder/config/FontSelector.d.ts +27 -0
  76. package/dist/types/components/sitebuilder/config/FontSelector.d.ts.map +1 -0
  77. package/dist/types/components/sitebuilder/config/google-fonts.d.ts +41 -0
  78. package/dist/types/components/sitebuilder/config/google-fonts.d.ts.map +1 -0
  79. package/dist/types/components/sitebuilder/form/formbuilder.d.ts +11 -0
  80. package/dist/types/components/sitebuilder/form/formbuilder.d.ts.map +1 -0
  81. package/dist/types/components/{pagebuilder → sitebuilder}/form/formcomponents.d.ts +15 -17
  82. package/dist/types/components/sitebuilder/form/formcomponents.d.ts.map +1 -0
  83. package/dist/types/components/{pagebuilder/form/form.submit.d.ts → sitebuilder/form/formemailer.d.ts} +1 -1
  84. package/dist/types/components/sitebuilder/form/formemailer.d.ts.map +1 -0
  85. package/dist/types/components/sitebuilder/form/formengine.d.ts +14 -0
  86. package/dist/types/components/sitebuilder/form/formengine.d.ts.map +1 -0
  87. package/dist/types/components/sitebuilder/form/formextractor.d.ts +25 -0
  88. package/dist/types/components/sitebuilder/form/formextractor.d.ts.map +1 -0
  89. package/dist/types/components/{pagebuilder/form/formvalidations.d.ts → sitebuilder/form/formfieldvalidations.d.ts} +1 -1
  90. package/dist/types/components/sitebuilder/form/formfieldvalidations.d.ts.map +1 -0
  91. package/dist/types/components/sitebuilder/form/formtypes.d.ts +66 -0
  92. package/dist/types/components/sitebuilder/form/formtypes.d.ts.map +1 -0
  93. package/dist/types/components/sitebuilder/form/formutils.d.ts +20 -0
  94. package/dist/types/components/sitebuilder/form/formutils.d.ts.map +1 -0
  95. package/dist/types/components/sitebuilder/form/formvalidator.d.ts +20 -0
  96. package/dist/types/components/sitebuilder/form/formvalidator.d.ts.map +1 -0
  97. package/dist/types/components/sitebuilder/page/components/ComponentPropertiesForm.d.ts.map +1 -0
  98. package/dist/types/components/sitebuilder/page/components/ComponentSelector.d.ts.map +1 -0
  99. package/dist/types/components/sitebuilder/page/components/ComponentTree.d.ts.map +1 -0
  100. package/dist/types/components/{pagebuilder → sitebuilder/page}/components/PageBuilderUI.d.ts +1 -1
  101. package/dist/types/components/sitebuilder/page/components/PageBuilderUI.d.ts.map +1 -0
  102. package/dist/types/components/sitebuilder/page/components/PageEngine.d.ts.map +1 -0
  103. package/dist/types/components/sitebuilder/page/components/SaveLoadSection.d.ts.map +1 -0
  104. package/dist/types/components/sitebuilder/page/documentation/api-examples/save-route-example.d.ts +6 -0
  105. package/dist/types/components/sitebuilder/page/documentation/api-examples/save-route-example.d.ts.map +1 -0
  106. package/dist/types/components/sitebuilder/page/lib/componentGeneration.d.ts.map +1 -0
  107. package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/componentMap.d.ts +3 -3
  108. package/dist/types/components/sitebuilder/page/lib/componentMap.d.ts.map +1 -0
  109. package/dist/types/components/sitebuilder/page/lib/componentMetadata.d.ts.map +1 -0
  110. package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/pageStorageContentful.d.ts +1 -1
  111. package/dist/types/components/sitebuilder/page/lib/pageStorageContentful.d.ts.map +1 -0
  112. package/dist/types/components/sitebuilder/page/lib/pageStorageLocal.d.ts.map +1 -0
  113. package/dist/types/components/sitebuilder/page/lib/pageStorageTypes.d.ts.map +1 -0
  114. package/dist/types/components/sitebuilder/page/lib/propTypeIntrospection.d.ts.map +1 -0
  115. package/dist/types/components/sitebuilder/page/lib/types.d.ts.map +1 -0
  116. package/dist/types/components/sitebuilder/page/lib/usePageBuilder.d.ts.map +1 -0
  117. package/dist/types/components/structured/markdown.d.ts.map +1 -1
  118. package/dist/types/components/structured/recipe.d.ts.map +1 -1
  119. package/dist/types/components/structured/timeline.d.ts.map +1 -1
  120. package/dist/types/index.d.ts +33 -20
  121. package/dist/types/index.server.d.ts +23 -16
  122. package/dist/types/stories/general/tab.stories.d.ts +45 -0
  123. package/dist/types/stories/general/tab.stories.d.ts.map +1 -0
  124. package/dist/types/stories/seo/seo.metadata.stories.d.ts +1 -1
  125. package/dist/types/stories/seo/seo.metadata.stories.d.ts.map +1 -1
  126. package/dist/types/stories/sitebuilder/compoundfontselector.stories.d.ts +51 -0
  127. package/dist/types/stories/sitebuilder/compoundfontselector.stories.d.ts.map +1 -0
  128. package/dist/types/stories/sitebuilder/configbuilder.stories.d.ts +103 -0
  129. package/dist/types/stories/sitebuilder/configbuilder.stories.d.ts.map +1 -0
  130. package/dist/types/stories/{pagebuilder → sitebuilder}/form-builder.stories.d.ts +1 -1
  131. package/dist/types/stories/sitebuilder/form-builder.stories.d.ts.map +1 -0
  132. package/dist/types/stories/{pagebuilder → sitebuilder}/form-engine.stories.d.ts +1 -1
  133. package/dist/types/stories/sitebuilder/form-engine.stories.d.ts.map +1 -0
  134. package/dist/types/stories/{pagebuilder → sitebuilder}/form-extractor.stories.d.ts +1 -1
  135. package/dist/types/stories/sitebuilder/form-extractor.stories.d.ts.map +1 -0
  136. package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.stories.d.ts +1 -1
  137. package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.stories.d.ts.map +1 -1
  138. package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.usageguide.stories.d.ts +1 -1
  139. package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.usageguide.stories.d.ts.map +1 -1
  140. package/dist/types/stories/{pagebuilder → sitebuilder}/pageengine.stories.d.ts +1 -1
  141. package/dist/types/stories/{pagebuilder → sitebuilder}/pageengine.stories.d.ts.map +1 -1
  142. package/dist/types/tests/compoundfontselector.test.d.ts +2 -0
  143. package/dist/types/tests/compoundfontselector.test.d.ts.map +1 -0
  144. package/dist/types/tests/configbuilder.test.d.ts +2 -0
  145. package/dist/types/tests/configbuilder.test.d.ts.map +1 -0
  146. package/dist/types/tests/configengine.test.d.ts +2 -0
  147. package/dist/types/tests/configengine.test.d.ts.map +1 -0
  148. package/dist/types/tests/fontselector.test.d.ts +2 -0
  149. package/dist/types/tests/fontselector.test.d.ts.map +1 -0
  150. package/dist/types/tests/tab.test.d.ts +2 -0
  151. package/dist/types/tests/tab.test.d.ts.map +1 -0
  152. package/package.json +15 -12
  153. package/dist/components/pagebuilder/form/formcomponents.js +0 -359
  154. package/dist/components/seo/metadata.js +0 -108
  155. package/dist/types/components/pagebuilder/components/ComponentPropertiesForm.d.ts.map +0 -1
  156. package/dist/types/components/pagebuilder/components/ComponentSelector.d.ts.map +0 -1
  157. package/dist/types/components/pagebuilder/components/ComponentTree.d.ts.map +0 -1
  158. package/dist/types/components/pagebuilder/components/PageBuilderUI.d.ts.map +0 -1
  159. package/dist/types/components/pagebuilder/components/PageEngine.d.ts.map +0 -1
  160. package/dist/types/components/pagebuilder/components/SaveLoadSection.d.ts.map +0 -1
  161. package/dist/types/components/pagebuilder/form/form.d.ts +0 -46
  162. package/dist/types/components/pagebuilder/form/form.d.ts.map +0 -1
  163. package/dist/types/components/pagebuilder/form/form.submit.d.ts.map +0 -1
  164. package/dist/types/components/pagebuilder/form/formcomponents.d.ts.map +0 -1
  165. package/dist/types/components/pagebuilder/form/formvalidations.d.ts.map +0 -1
  166. package/dist/types/components/pagebuilder/lib/componentGeneration.d.ts.map +0 -1
  167. package/dist/types/components/pagebuilder/lib/componentMap.d.ts.map +0 -1
  168. package/dist/types/components/pagebuilder/lib/componentMetadata.d.ts.map +0 -1
  169. package/dist/types/components/pagebuilder/lib/pageStorageContentful.d.ts.map +0 -1
  170. package/dist/types/components/pagebuilder/lib/pageStorageLocal.d.ts.map +0 -1
  171. package/dist/types/components/pagebuilder/lib/pageStorageTypes.d.ts.map +0 -1
  172. package/dist/types/components/pagebuilder/lib/propTypeIntrospection.d.ts.map +0 -1
  173. package/dist/types/components/pagebuilder/lib/types.d.ts.map +0 -1
  174. package/dist/types/components/pagebuilder/lib/usePageBuilder.d.ts.map +0 -1
  175. package/dist/types/components/seo/metadata.d.ts.map +0 -1
  176. package/dist/types/stories/pagebuilder/form-builder.stories.d.ts.map +0 -1
  177. package/dist/types/stories/pagebuilder/form-engine.stories.d.ts.map +0 -1
  178. package/dist/types/stories/pagebuilder/form-extractor.stories.d.ts.map +0 -1
  179. /package/dist/components/{pagebuilder/form/form.submit.js → sitebuilder/form/formemailer.js} +0 -0
  180. /package/dist/components/{pagebuilder/form/formvalidations.js → sitebuilder/form/formfieldvalidations.js} +0 -0
  181. /package/dist/components/{pagebuilder/lib/pageStorageTypes.js → sitebuilder/form/formtypes.js} +0 -0
  182. /package/dist/components/{pagebuilder → sitebuilder/page}/components/ComponentSelector.js +0 -0
  183. /package/dist/components/{pagebuilder → sitebuilder/page}/components/ComponentTree.js +0 -0
  184. /package/dist/components/{pagebuilder → sitebuilder/page}/components/SaveLoadSection.js +0 -0
  185. /package/dist/components/{pagebuilder → sitebuilder/page}/components/pagebuilder.scss +0 -0
  186. /package/dist/components/{pagebuilder → sitebuilder/page}/lib/componentGeneration.js +0 -0
  187. /package/dist/components/{pagebuilder → sitebuilder/page}/lib/pageStorageLocal.js +0 -0
  188. /package/dist/components/{pagebuilder → sitebuilder/page}/lib/propTypeIntrospection.js +0 -0
  189. /package/dist/components/{pagebuilder → sitebuilder/page}/lib/types.js +0 -0
  190. /package/dist/components/{pagebuilder → sitebuilder/page}/lib/usePageBuilder.js +0 -0
  191. /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/ComponentPropertiesForm.d.ts +0 -0
  192. /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/ComponentSelector.d.ts +0 -0
  193. /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/ComponentTree.d.ts +0 -0
  194. /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/PageEngine.d.ts +0 -0
  195. /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/SaveLoadSection.d.ts +0 -0
  196. /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/componentGeneration.d.ts +0 -0
  197. /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/componentMetadata.d.ts +0 -0
  198. /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/pageStorageLocal.d.ts +0 -0
  199. /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/pageStorageTypes.d.ts +0 -0
  200. /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/propTypeIntrospection.d.ts +0 -0
  201. /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/types.d.ts +0 -0
  202. /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/usePageBuilder.d.ts +0 -0
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Google Fonts Integration
3
+ * Fetches and caches Google Fonts data for use in visual design forms
4
+ */
5
+ // Cache for Google Fonts data
6
+ let fontsCache = null;
7
+ let cacheTimestamp = 0;
8
+ const CACHE_DURATION = 24 * 60 * 60 * 1000; // 24 hours
9
+ // Fallback Google fonts for when API is unavailable (sorted alphabetically)
10
+ const FALLBACK_GOOGLE_FONTS = [
11
+ { family: 'Cairo', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
12
+ { family: 'Crimson Text', category: 'serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
13
+ { family: 'Fira Sans', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
14
+ { family: 'Inter', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
15
+ { family: 'Lato', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
16
+ { family: 'Libre Baskerville', category: 'serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
17
+ { family: 'Lora', category: 'serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
18
+ { family: 'Merriweather', category: 'serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
19
+ { family: 'Montserrat', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
20
+ { family: 'Nunito', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
21
+ { family: 'Open Sans', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
22
+ { family: 'Oswald', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
23
+ { family: 'Playfair Display', category: 'serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
24
+ { family: 'Poppins', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
25
+ { family: 'PT Sans', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
26
+ { family: 'Raleway', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
27
+ { family: 'Roboto', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
28
+ { family: 'Source Sans Pro', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
29
+ { family: 'Ubuntu', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
30
+ { family: 'Work Sans', category: 'sans-serif', variants: [], subsets: [], version: '', lastModified: '', kind: '', menu: '', files: {} },
31
+ ];
32
+ /**
33
+ * Fetch Google Fonts list from API
34
+ * Note: Requires GOOGLE_FONTS_API_KEY environment variable
35
+ */
36
+ export async function fetchGoogleFonts() {
37
+ // Check cache first
38
+ if (fontsCache && (Date.now() - cacheTimestamp) < CACHE_DURATION) {
39
+ return fontsCache;
40
+ }
41
+ const apiKey = process.env.GOOGLE_FONTS_API_KEY;
42
+ if (!apiKey) {
43
+ console.warn('GOOGLE_FONTS_API_KEY not set, returning empty fonts list');
44
+ return [];
45
+ }
46
+ try {
47
+ const response = await fetch(`https://www.googleapis.com/webfonts/v1/webfonts?key=${apiKey}&sort=popularity`);
48
+ if (!response.ok) {
49
+ throw new Error(`Google Fonts API error: ${response.status}`);
50
+ }
51
+ const data = await response.json();
52
+ // Cache the results
53
+ fontsCache = data.items;
54
+ cacheTimestamp = Date.now();
55
+ return data.items;
56
+ }
57
+ catch (error) {
58
+ console.error('Failed to fetch Google Fonts:', error);
59
+ return [];
60
+ }
61
+ }
62
+ /**
63
+ * Get font options for form dropdowns
64
+ */
65
+ export async function getFontOptions() {
66
+ const fonts = await fetchGoogleFonts();
67
+ // If no fonts loaded from API, use fallback popular fonts
68
+ if (!fonts || fonts.length === 0) {
69
+ return FALLBACK_GOOGLE_FONTS
70
+ .sort((a, b) => a.family.localeCompare(b.family))
71
+ .map((font) => ({
72
+ value: font.family,
73
+ label: `${font.family} (${font.category})`,
74
+ category: font.category
75
+ }));
76
+ }
77
+ return fonts
78
+ .sort((a, b) => a.family.localeCompare(b.family))
79
+ .map((font) => ({
80
+ value: font.family,
81
+ label: `${font.family} (${font.category})`,
82
+ category: font.category
83
+ }));
84
+ }
85
+ /**
86
+ * Generate Google Fonts CSS import URL for given fonts
87
+ */
88
+ export function generateGoogleFontsUrl(fonts) {
89
+ if (!fonts.length)
90
+ return '';
91
+ // Clean font names and create URL
92
+ const cleanFonts = fonts
93
+ .map(font => font.replace(/['"]/g, '').trim())
94
+ .filter(font => font.length > 0);
95
+ if (!cleanFonts.length)
96
+ return '';
97
+ const fontParam = cleanFonts
98
+ .map(font => font.replace(/\s+/g, '+'))
99
+ .join('|');
100
+ return `https://fonts.googleapis.com/css2?family=${fontParam}&display=swap`;
101
+ }
102
+ /**
103
+ * Generate HTML link tag for Google Fonts
104
+ */
105
+ export function generateGoogleFontsLink(fonts) {
106
+ const url = generateGoogleFontsUrl(fonts);
107
+ if (!url)
108
+ return '';
109
+ return `<link rel="preconnect" href="https://fonts.googleapis.com">
110
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
111
+ <link href="${url}" rel="stylesheet">`;
112
+ }
@@ -59,47 +59,68 @@ form span {
59
59
  vertical-align: middle;
60
60
  }
61
61
 
62
- .tooltip {
63
- display: inline;
64
- margin-right: 10px;
62
+
63
+ /* ========================================
64
+ ============== TOOLTIP ==============
65
+ ======================================== */
66
+
67
+ .tooltip-container {
68
+ display: inline-block;
65
69
  position: relative;
70
+ margin-left: 5px;
71
+ vertical-align: middle;
66
72
  }
67
73
 
68
- .tooltipIcon {
69
- /* display: inline;
70
- color: white !important;
71
- background-color: #369;
72
- border-radius: 20px;
73
- padding: 0 3px; */
74
- vertical-align: middle;
75
- padding: 5px;
76
- box-shadow: none;
77
- background-color: transparent;
78
- border: none;
74
+ .tooltip-icon {
75
+ display: inline-flex;
76
+ align-items: center;
77
+ justify-content: center;
78
+ font-size: 1.0rem;
79
+ font-weight: bold;
80
+ cursor: pointer;
81
+ padding: 0 3px;
82
+ line-height: 1;
83
+ color: #00F;
79
84
  }
80
85
 
81
- .tooltipIcon img {
82
- width: 20px;
83
- /* margin: 5px 0 0 -10px; */
84
- background-color: #DDD;
85
- border-radius: 5px;
86
+ .tooltip-icon-validate {
87
+ color: #d00;
86
88
  }
87
89
 
88
- .tooltipText {
89
- display: none;
90
+ .tooltip-text {
90
91
  position: absolute;
91
- top: -25px;
92
- left: 25px;
93
- width: 200px;
94
- padding: 3px 8px;
95
- color: #fff;
96
- text-align: center;
97
- background-color: #666;
98
- border: 1px solid white;
99
- border-radius: 4px;
100
- box-shadow: -3px 0 10px #369, 0 3px 10px #369, 3px 0 10px #369, 0 -3px 10px #369;
92
+ top: -15px;
93
+ left: 35px;
94
+ min-width: 200px;
95
+ max-width: 300px;
96
+ padding: 8px 12px;
97
+ background-color: #333;
98
+ color: white;
99
+ border-radius: 4px;
100
+ box-shadow: 0 2px 8px rgba(0,0,0,0.3);
101
+ z-index: 1000;
102
+ font-size: 0.9em;
103
+ white-space: normal;
101
104
  }
102
- .tooltip a {
103
- /* pointer-events: none; */
104
- text-decoration: none;
105
+
106
+ .tooltip-text::before {
107
+ content: '';
108
+ position: absolute;
109
+ top: 50%;
110
+ left: -8px;
111
+ transform: translateY(-50%);
112
+ width: 0;
113
+ height: 0;
114
+ border-top: 8px solid transparent;
115
+ border-bottom: 8px solid transparent;
116
+ border-right: 8px solid #333;
117
+ z-index: 1001;
118
+ }
119
+
120
+ .tooltip-text-item {
121
+ margin-bottom: 4px;
122
+ }
123
+
124
+ .tooltip-text-item:last-child {
125
+ margin-bottom: 0;
105
126
  }
@@ -0,0 +1,107 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import * as FC from './formcomponents';
6
+ import { mapTypeToComponent, generateTypeField, debug } from './formutils';
7
+ import { FormEngine } from './formengine';
8
+ /* ===== FORM BUILDER =====
9
+ Display all the components for a Form Builder -
10
+ Element Buttons, Element Details, and the Form */
11
+ export function FormBuilder() {
12
+ const [formData, setFormData] = useState({ fields: [] });
13
+ const [fieldFormData, setFieldFormData] = useState({ fields: [] });
14
+ function appendFormData(event) {
15
+ // APPEND JSON FOR NEW FIELD TO EXISTING JSON CONFIG OBJECT - EXPOSED EXTERNAL
16
+ if (debug)
17
+ console.log("Appending form Data...");
18
+ const props = {};
19
+ const target = event.target;
20
+ for (const prop in target) {
21
+ const thisProp = target[prop];
22
+ if (thisProp && thisProp.value && (thisProp.value !== Object(thisProp.value))) {
23
+ props[thisProp.name] = thisProp.value;
24
+ }
25
+ }
26
+ const field = {};
27
+ field.props = props;
28
+ field.component = mapTypeToComponent(field.props.type);
29
+ let fields = [];
30
+ if (Object.keys(formData).length > 0) {
31
+ fields = JSON.parse(JSON.stringify(formData.fields));
32
+ }
33
+ fields[fields.length] = field;
34
+ setFormData({ fields: fields });
35
+ setFieldFormData({ fields: [] });
36
+ return (field);
37
+ }
38
+ /* function getCircularReplacer() {
39
+ const seen = new WeakSet();
40
+ return (key, value) => {
41
+ if (typeof value === 'object' && value !== null) {
42
+ if (seen.has(value)) {
43
+ return ; // return undefined ;
44
+ }
45
+ seen.add(value);
46
+ }
47
+ return value;
48
+ };
49
+ } */
50
+ return (_jsxs("div", { className: "section-container", children: [_jsxs("div", { style: { display: 'inline-block', verticalAlign: 'top' }, children: [_jsx(FormBuild, { setFormData: setFieldFormData }), _jsx("div", {}), _jsx(FormEngine, { name: "field_props", id: "field_props", onSubmitHandler: appendFormData, formData: fieldFormData })] }), _jsx("div", { style: { display: 'inline-block', verticalAlign: 'top' }, children: _jsx("pre", { style: { width: '100%' }, children: JSON.stringify(formData, null, 2) }) }), _jsxs("div", { children: [_jsx("br", {}), _jsx("br", {}), _jsx("hr", {}), _jsx("br", {}), _jsx("br", {})] }), _jsx("div", { style: { display: 'block', verticalAlign: 'top' }, children: _jsx(FormEngine, { formData: formData || {} }) })] }));
51
+ }
52
+ /*
53
+ ===== FORM BUILD =====
54
+ Dynamically generate, component by component, and prop by prop,
55
+ the JSON to create a form via FormEngine
56
+ */
57
+ FormBuild.propTypes = {
58
+ setFormData: PropTypes.func.isRequired,
59
+ };
60
+ export function FormBuild(props) {
61
+ function generateFieldJSON(component, type) {
62
+ // GENERATE THE JSON TO DISPLAY A FORM TO ADD A FIELD - INTERNAL
63
+ if (debug)
64
+ console.log("Generating Form JSON for ", component, " Type : ", type);
65
+ const form = { fields: [] };
66
+ let i = 0;
67
+ for (const prop in FC[component].propTypes) {
68
+ const field = {};
69
+ field.component = 'FormInput';
70
+ const props = {};
71
+ props.label = prop;
72
+ props.name = prop;
73
+ props.id = prop;
74
+ props.type = 'text';
75
+ if (prop === 'type') {
76
+ props.disabled = true;
77
+ props.value = type;
78
+ props.list = 'inputTypes';
79
+ }
80
+ field.props = props;
81
+ form.fields[i] = field;
82
+ i++;
83
+ }
84
+ const addButton = {
85
+ component: 'FormButton',
86
+ props: {
87
+ label: 'Add ' + component,
88
+ type: 'submit',
89
+ id: 'Add ' + component,
90
+ text: 'Add ' + component
91
+ }
92
+ };
93
+ form.fields[i] = addButton;
94
+ return (form);
95
+ }
96
+ function handlePhaseOneSubmit(event) {
97
+ // GENERATE THE JSON TO DISPLAY A FORM TO ADD A FIELD - EXTERNAL
98
+ const target = event.target;
99
+ const typeElement = target.elements.namedItem('type');
100
+ const myType = typeElement ? typeElement.value : '';
101
+ const myComponent = mapTypeToComponent(myType);
102
+ const fieldJSON = generateFieldJSON(myComponent, myType);
103
+ props.setFormData(fieldJSON);
104
+ return true;
105
+ }
106
+ return (_jsx(_Fragment, { children: _jsx(FormEngine, { formData: generateTypeField(), onSubmitHandler: event => { handlePhaseOneSubmit(event); }, name: "build", id: "build", method: "post" }) }));
107
+ }