@finsweet/webflow-apps-utils 1.0.2 → 1.0.4

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 (293) hide show
  1. package/README.md +162 -1
  2. package/dist/index.d.ts +2 -1
  3. package/dist/index.js +2 -1
  4. package/dist/providers/GlobalProvider.mdx +322 -0
  5. package/dist/providers/GlobalProvider.svelte +58 -0
  6. package/dist/providers/GlobalProvider.svelte.d.ts +4 -0
  7. package/dist/providers/configuratorUtils.d.ts +37 -0
  8. package/dist/providers/configuratorUtils.js +219 -0
  9. package/dist/providers/globalContext.svelte.d.ts +18 -0
  10. package/dist/providers/globalContext.svelte.js +439 -0
  11. package/dist/providers/index.d.ts +5 -0
  12. package/dist/providers/index.js +7 -0
  13. package/dist/providers/types.d.ts +103 -0
  14. package/dist/providers/types.js +6 -0
  15. package/dist/router/Router.mdx +958 -0
  16. package/dist/router/Router.stories.d.ts +6 -0
  17. package/dist/router/Router.stories.js +47 -0
  18. package/dist/router/examples/RouterExample.svelte +271 -0
  19. package/dist/{ui/components/NoSettingsNeeded.svelte.d.ts → router/examples/RouterExample.svelte.d.ts} +3 -3
  20. package/dist/router/examples/index.d.ts +4 -0
  21. package/dist/router/examples/index.js +4 -0
  22. package/dist/router/examples/pages/AboutPage.svelte +568 -0
  23. package/dist/router/examples/pages/AboutPage.svelte.d.ts +13 -0
  24. package/dist/router/examples/pages/HomePage.svelte +200 -0
  25. package/dist/router/examples/pages/HomePage.svelte.d.ts +14 -0
  26. package/dist/router/examples/pages/NotFoundPage.svelte +307 -0
  27. package/dist/router/examples/pages/NotFoundPage.svelte.d.ts +17 -0
  28. package/dist/router/hooks.svelte.d.ts +2 -2
  29. package/dist/router/index.d.ts +3 -0
  30. package/dist/router/index.js +3 -0
  31. package/dist/router/{Link.svelte → providers/Link.svelte} +1 -1
  32. package/dist/router/{Route.svelte → providers/Route.svelte} +1 -1
  33. package/dist/router/{Route.svelte.d.ts → providers/Route.svelte.d.ts} +1 -1
  34. package/dist/router/{Router.svelte → providers/RouterProvider.svelte} +22 -5
  35. package/dist/router/{Router.svelte.d.ts → providers/RouterProvider.svelte.d.ts} +8 -4
  36. package/dist/router/providers/index.d.ts +3 -0
  37. package/dist/router/providers/index.js +3 -0
  38. package/dist/router/{index.svelte.d.ts → router.svelte.d.ts} +1 -3
  39. package/dist/router/{index.svelte.js → router.svelte.js} +1 -4
  40. package/dist/stores/docs/Form.mdx +542 -0
  41. package/dist/stores/forms.d.ts +41 -4
  42. package/dist/stores/forms.js +86 -32
  43. package/dist/stores/index.d.ts +0 -1
  44. package/dist/stores/index.js +0 -1
  45. package/dist/types/customCode.d.ts +1 -1
  46. package/dist/types/webflow.d.ts +31 -47
  47. package/dist/types/window.d.ts +1 -0
  48. package/dist/ui/components/LoadingScreen.svelte +2 -1
  49. package/dist/ui/components/button/Button.svelte +1 -1
  50. package/dist/ui/components/button-group/ButtonGroup.stories.js +112 -0
  51. package/dist/ui/components/{ButtonGroup.svelte → button-group/ButtonGroup.svelte} +20 -33
  52. package/dist/ui/components/button-group/ButtonGroup.svelte.d.ts +13 -0
  53. package/dist/ui/components/button-group/index.d.ts +2 -0
  54. package/dist/ui/components/button-group/index.js +1 -0
  55. package/dist/ui/components/button-group/types.d.ts +32 -0
  56. package/dist/ui/components/checkbox/Checkbox.stories.d.ts +55 -0
  57. package/dist/ui/components/checkbox/Checkbox.stories.js +162 -0
  58. package/dist/ui/components/checkbox/Checkbox.svelte +141 -0
  59. package/dist/ui/components/checkbox/Checkbox.svelte.d.ts +4 -0
  60. package/dist/ui/components/checkbox/index.d.ts +2 -0
  61. package/dist/ui/components/checkbox/index.js +1 -0
  62. package/dist/ui/components/checkbox/types.d.ts +32 -0
  63. package/dist/ui/components/controlled-buttons/ControlledButtons.stories.d.ts +32 -0
  64. package/dist/ui/components/controlled-buttons/ControlledButtons.stories.js +152 -0
  65. package/dist/ui/components/{buttons/FooterButton.svelte → controlled-buttons/ControlledButtons.svelte} +18 -67
  66. package/dist/ui/components/controlled-buttons/ControlledButtons.svelte.d.ts +4 -0
  67. package/dist/ui/components/controlled-buttons/index.d.ts +2 -0
  68. package/dist/ui/components/controlled-buttons/index.js +1 -0
  69. package/dist/ui/components/{buttons → controlled-buttons}/types.d.ts +11 -4
  70. package/dist/ui/components/copy-text/CopyText.stories.d.ts +70 -0
  71. package/dist/ui/components/copy-text/CopyText.stories.js +241 -0
  72. package/dist/ui/components/copy-text/CopyText.svelte +249 -0
  73. package/dist/ui/components/copy-text/CopyText.svelte.d.ts +4 -0
  74. package/dist/ui/components/copy-text/index.d.ts +2 -0
  75. package/dist/ui/components/copy-text/index.js +1 -0
  76. package/dist/ui/components/copy-text/types.d.ts +52 -0
  77. package/dist/ui/components/copy-text/types.js +1 -0
  78. package/dist/ui/components/divider/Divider.stories.svelte +134 -0
  79. package/dist/ui/components/{clickable/Clickable.stories.svelte.d.ts → divider/Divider.stories.svelte.d.ts} +4 -4
  80. package/dist/ui/components/divider/Divider.svelte +30 -0
  81. package/dist/ui/components/divider/Divider.svelte.d.ts +4 -0
  82. package/dist/ui/components/divider/index.d.ts +2 -0
  83. package/dist/ui/components/divider/index.js +1 -0
  84. package/dist/ui/components/divider/types.d.ts +23 -0
  85. package/dist/ui/components/divider/types.js +1 -0
  86. package/dist/ui/components/iframe/Iframe.stories.svelte +122 -0
  87. package/dist/ui/components/{ToggleItem.svelte.d.ts → iframe/Iframe.stories.svelte.d.ts} +7 -8
  88. package/dist/ui/components/iframe/Iframe.svelte +75 -0
  89. package/dist/ui/components/iframe/Iframe.svelte.d.ts +4 -0
  90. package/dist/ui/components/iframe/index.d.ts +2 -0
  91. package/dist/ui/components/iframe/index.js +1 -0
  92. package/dist/ui/components/iframe/types.d.ts +38 -0
  93. package/dist/ui/components/iframe/types.js +1 -0
  94. package/dist/ui/components/index.d.ts +13 -39
  95. package/dist/ui/components/index.js +13 -39
  96. package/dist/ui/components/input/Input.stories.d.ts +33 -0
  97. package/dist/ui/components/input/Input.stories.js +176 -0
  98. package/dist/ui/components/input/Input.svelte +358 -81
  99. package/dist/ui/components/input/types.d.ts +33 -1
  100. package/dist/ui/components/layout/Layout.stories.svelte +3 -3
  101. package/dist/ui/components/layout/Layout.svelte +10 -64
  102. package/dist/ui/components/layout/Layout.svelte.d.ts +2 -2
  103. package/dist/ui/components/layout/common/EditModeMessage.svelte +24 -12
  104. package/dist/ui/components/layout/{ExampleLayout.svelte → examples/ExampleLayout.svelte} +56 -39
  105. package/dist/ui/components/layout/examples/Wrapper.svelte +9 -0
  106. package/dist/ui/components/{Header.svelte.d.ts → layout/examples/Wrapper.svelte.d.ts} +4 -6
  107. package/dist/ui/components/layout/examples/index.d.ts +2 -0
  108. package/dist/ui/components/layout/examples/index.js +2 -0
  109. package/dist/ui/components/layout/index.d.ts +3 -2
  110. package/dist/ui/components/layout/index.js +2 -1
  111. package/dist/ui/components/layout/test-helpers/TestLayoutWithFooter.svelte +20 -0
  112. package/dist/ui/components/layout/test-helpers/TestLayoutWithFooter.svelte.d.ts +7 -0
  113. package/dist/ui/components/layout/types.d.ts +1 -10
  114. package/dist/ui/components/modal/Example.svelte +320 -0
  115. package/dist/ui/components/modal/Example.svelte.d.ts +3 -0
  116. package/dist/ui/components/modal/Modal.stories.svelte +18 -0
  117. package/dist/ui/components/modal/Modal.stories.svelte.d.ts +26 -0
  118. package/dist/ui/components/modal/Modal.svelte +490 -0
  119. package/dist/ui/components/modal/Modal.svelte.d.ts +130 -0
  120. package/dist/ui/components/modal/index.d.ts +2 -0
  121. package/dist/ui/components/modal/index.js +1 -0
  122. package/dist/ui/components/modal/types.d.ts +75 -0
  123. package/dist/ui/components/modal/types.js +1 -0
  124. package/dist/ui/components/notification/Notification.stories.svelte +239 -0
  125. package/dist/ui/components/{ToggleList.svelte.d.ts → notification/Notification.stories.svelte.d.ts} +9 -21
  126. package/dist/ui/components/notification/Notification.svelte +294 -0
  127. package/dist/ui/components/notification/Notification.svelte.d.ts +67 -0
  128. package/dist/ui/components/notification/index.d.ts +2 -0
  129. package/dist/ui/components/notification/index.js +1 -0
  130. package/dist/ui/components/notification/types.d.ts +68 -0
  131. package/dist/ui/components/notification/types.js +1 -0
  132. package/dist/ui/components/section/Section.stories.svelte +263 -0
  133. package/dist/ui/components/section/Section.stories.svelte.d.ts +27 -0
  134. package/dist/ui/components/section/Section.svelte +326 -0
  135. package/dist/ui/components/section/Section.svelte.d.ts +5 -0
  136. package/dist/ui/components/section/index.d.ts +2 -0
  137. package/dist/ui/components/section/index.js +1 -0
  138. package/dist/ui/components/section/types.d.ts +114 -0
  139. package/dist/ui/components/section/types.js +1 -0
  140. package/dist/ui/components/{ImageUpload.svelte → shared/ImageUpload.svelte} +3 -3
  141. package/dist/ui/components/{SelectBodyOrDivBlock.svelte → shared/SelectBodyOrDivBlock.svelte} +1 -1
  142. package/dist/ui/components/shared/index.d.ts +2 -0
  143. package/dist/ui/components/shared/index.js +2 -0
  144. package/dist/ui/components/text/Text.stories.svelte +67 -1
  145. package/dist/ui/components/text/Text.svelte +209 -8
  146. package/dist/ui/components/text/types.d.ts +4 -0
  147. package/dist/ui/index.css +33 -5
  148. package/dist/utils/animations/factory.d.ts +7 -0
  149. package/dist/utils/animations/factory.js +101 -0
  150. package/dist/utils/animations/index.d.ts +7 -0
  151. package/dist/utils/animations/index.js +62 -0
  152. package/dist/utils/animations/types.d.ts +39 -0
  153. package/dist/utils/animations/types.js +1 -0
  154. package/dist/utils/api/checkIfAppModeIsDesign.d.ts +1 -2
  155. package/dist/utils/api/checkIfAppModeIsDesign.js +1 -2
  156. package/dist/utils/api/clipboard/handlePaste.d.ts +6 -37
  157. package/dist/utils/api/clipboard/handlePaste.js +2 -6
  158. package/dist/utils/api/getAllAssets.d.ts +1 -2
  159. package/dist/utils/api/getAllAssets.js +1 -2
  160. package/dist/utils/api/getFinsweetComponentsEnvironment.d.ts +1 -2
  161. package/dist/utils/api/getFinsweetComponentsEnvironment.js +3 -6
  162. package/dist/utils/api/index.d.ts +0 -1
  163. package/dist/utils/api/index.js +0 -1
  164. package/dist/utils/api/insertWithXSCP.d.ts +1 -2
  165. package/dist/utils/api/insertWithXSCP.js +1 -2
  166. package/dist/utils/auth/crossWindowLogin.d.ts +3 -0
  167. package/dist/utils/auth/crossWindowLogin.js +3 -0
  168. package/dist/utils/auth/index.d.ts +9 -25
  169. package/dist/utils/auth/index.js +9 -25
  170. package/dist/utils/browser-storage/localStorage.d.ts +4 -12
  171. package/dist/utils/browser-storage/localStorage.js +4 -12
  172. package/dist/utils/browser-storage/sessionStorage.d.ts +4 -12
  173. package/dist/utils/browser-storage/sessionStorage.js +4 -12
  174. package/dist/utils/custom-code/api.d.ts +3 -7
  175. package/dist/utils/custom-code/api.js +3 -7
  176. package/dist/utils/custom-code/configs.d.ts +22 -0
  177. package/dist/utils/custom-code/configs.js +40 -0
  178. package/dist/utils/custom-code/index.d.ts +1 -0
  179. package/dist/utils/custom-code/index.js +1 -0
  180. package/dist/utils/helpers/capitalizeFirstLetter.d.ts +4 -0
  181. package/dist/utils/helpers/capitalizeFirstLetter.js +9 -0
  182. package/dist/utils/helpers/cleanupTooltipMessage.d.ts +1 -2
  183. package/dist/utils/helpers/cleanupTooltipMessage.js +1 -2
  184. package/dist/utils/helpers/getTimeNow.d.ts +4 -0
  185. package/dist/utils/helpers/getTimeNow.js +8 -0
  186. package/dist/utils/helpers/goto.d.ts +1 -4
  187. package/dist/utils/helpers/goto.js +2 -7
  188. package/dist/utils/helpers/index.d.ts +5 -0
  189. package/dist/utils/helpers/index.js +5 -0
  190. package/dist/utils/helpers/minifyCode.d.ts +10 -0
  191. package/dist/utils/helpers/minifyCode.js +73 -0
  192. package/dist/utils/helpers/noop.d.ts +1 -1
  193. package/dist/utils/helpers/noop.js +1 -1
  194. package/dist/utils/helpers/numbers.d.ts +4 -14
  195. package/dist/utils/helpers/numbers.js +4 -14
  196. package/dist/utils/helpers/objectsToModuleExports.d.ts +2 -4
  197. package/dist/utils/helpers/objectsToModuleExports.js +2 -3
  198. package/dist/utils/helpers/toHumanReadableList.d.ts +4 -0
  199. package/dist/utils/helpers/toHumanReadableList.js +11 -0
  200. package/dist/utils/helpers/trimText.d.ts +1 -8
  201. package/dist/utils/helpers/trimText.js +1 -8
  202. package/dist/utils/index.d.ts +5 -0
  203. package/dist/utils/index.js +5 -0
  204. package/dist/utils/logger/index.d.ts +0 -2
  205. package/dist/utils/logger/index.js +0 -2
  206. package/dist/utils/webflow-canvas/attributes/getAllWebflowElementAttributes.d.ts +1 -3
  207. package/dist/utils/webflow-canvas/attributes/getAllWebflowElementAttributes.js +1 -3
  208. package/dist/utils/webflow-canvas/attributes/getInstanceNamesFromObject.d.ts +1 -5
  209. package/dist/utils/webflow-canvas/attributes/getInstanceNamesFromObject.js +1 -5
  210. package/dist/utils/webflow-canvas/attributes/getWebflowElementAttribute.d.ts +1 -4
  211. package/dist/utils/webflow-canvas/attributes/getWebflowElementAttribute.js +1 -4
  212. package/dist/utils/webflow-canvas/attributes/getWebflowElementTextContent.d.ts +1 -3
  213. package/dist/utils/webflow-canvas/attributes/getWebflowElementTextContent.js +1 -3
  214. package/dist/utils/webflow-canvas/attributes/removeWebflowElementAttribute.d.ts +1 -4
  215. package/dist/utils/webflow-canvas/attributes/removeWebflowElementAttribute.js +1 -4
  216. package/dist/utils/webflow-canvas/attributes/setStyles.d.ts +1 -3
  217. package/dist/utils/webflow-canvas/attributes/setStyles.js +1 -3
  218. package/dist/utils/webflow-canvas/attributes/setWebflowElementAttribute.d.ts +1 -8
  219. package/dist/utils/webflow-canvas/attributes/setWebflowElementAttribute.js +1 -13
  220. package/dist/utils/webflow-canvas/findInstanceElement.d.ts +0 -6
  221. package/dist/utils/webflow-canvas/findInstanceElement.js +1 -7
  222. package/dist/utils/webflow-canvas/getAllChildren.d.ts +16 -0
  223. package/dist/utils/webflow-canvas/getAllChildren.js +65 -0
  224. package/dist/utils/webflow-canvas/getAllPages.d.ts +3 -10
  225. package/dist/utils/webflow-canvas/getAllPages.js +3 -10
  226. package/dist/utils/webflow-canvas/getElementClassList.d.ts +9 -0
  227. package/dist/utils/webflow-canvas/getElementClassList.js +19 -0
  228. package/dist/utils/webflow-canvas/getSiteStagingUrl.d.ts +1 -4
  229. package/dist/utils/webflow-canvas/getSiteStagingUrl.js +1 -4
  230. package/dist/utils/webflow-canvas/index.d.ts +3 -0
  231. package/dist/utils/webflow-canvas/index.js +3 -0
  232. package/package.json +14 -2
  233. package/dist/router/README.md +0 -397
  234. package/dist/stores/globalStore.d.ts +0 -10
  235. package/dist/stores/globalStore.js +0 -10
  236. package/dist/ui/components/ButtonGroup.svelte.d.ts +0 -28
  237. package/dist/ui/components/Checkbox.svelte +0 -94
  238. package/dist/ui/components/Checkbox.svelte.d.ts +0 -36
  239. package/dist/ui/components/Copy.svelte +0 -329
  240. package/dist/ui/components/Copy.svelte.d.ts +0 -35
  241. package/dist/ui/components/CustomModal.svelte +0 -192
  242. package/dist/ui/components/CustomModal.svelte.d.ts +0 -45
  243. package/dist/ui/components/DisableInEditMode.svelte +0 -66
  244. package/dist/ui/components/DisableInEditMode.svelte.d.ts +0 -33
  245. package/dist/ui/components/Divider.svelte +0 -31
  246. package/dist/ui/components/Divider.svelte.d.ts +0 -31
  247. package/dist/ui/components/Header.svelte +0 -30
  248. package/dist/ui/components/Iframe.svelte +0 -89
  249. package/dist/ui/components/Iframe.svelte.d.ts +0 -40
  250. package/dist/ui/components/InjectComponent.svelte +0 -297
  251. package/dist/ui/components/InjectComponent.svelte.d.ts +0 -27
  252. package/dist/ui/components/Modal.svelte +0 -139
  253. package/dist/ui/components/Modal.svelte.d.ts +0 -42
  254. package/dist/ui/components/Navbar.svelte +0 -132
  255. package/dist/ui/components/Navbar.svelte.d.ts +0 -29
  256. package/dist/ui/components/NoSettingsNeeded.svelte +0 -31
  257. package/dist/ui/components/Notification.svelte +0 -193
  258. package/dist/ui/components/Notification.svelte.d.ts +0 -64
  259. package/dist/ui/components/PlusMinusButton.svelte +0 -91
  260. package/dist/ui/components/PlusMinusButton.svelte.d.ts +0 -22
  261. package/dist/ui/components/PreviewBar.svelte +0 -40
  262. package/dist/ui/components/PreviewBar.svelte.d.ts +0 -20
  263. package/dist/ui/components/ScrollableContent.svelte +0 -18
  264. package/dist/ui/components/ScrollableContent.svelte.d.ts +0 -31
  265. package/dist/ui/components/Section.svelte +0 -97
  266. package/dist/ui/components/Section.svelte.d.ts +0 -50
  267. package/dist/ui/components/Spacer.svelte +0 -9
  268. package/dist/ui/components/Spacer.svelte.d.ts +0 -22
  269. package/dist/ui/components/SpinnerPlusMinus.svelte +0 -75
  270. package/dist/ui/components/SpinnerPlusMinus.svelte.d.ts +0 -23
  271. package/dist/ui/components/SpinnerUpDown.svelte +0 -194
  272. package/dist/ui/components/SpinnerUpDown.svelte.d.ts +0 -31
  273. package/dist/ui/components/Tabs.svelte +0 -71
  274. package/dist/ui/components/Tabs.svelte.d.ts +0 -26
  275. package/dist/ui/components/ToggleItem.svelte +0 -29
  276. package/dist/ui/components/ToggleList.svelte +0 -57
  277. package/dist/ui/components/buttons/FooterButton.svelte.d.ts +0 -10
  278. package/dist/ui/components/buttons/index.d.ts +0 -5
  279. package/dist/ui/components/buttons/index.js +0 -5
  280. package/dist/ui/components/clickable/Clickable.stories.svelte +0 -213
  281. package/dist/ui/components/clickable/Clickable.svelte +0 -93
  282. package/dist/ui/components/clickable/Clickable.svelte.d.ts +0 -4
  283. package/dist/ui/components/clickable/index.d.ts +0 -2
  284. package/dist/ui/components/clickable/index.js +0 -1
  285. package/dist/ui/components/clickable/types.d.ts +0 -17
  286. package/dist/utils/api/copyPaste/index.d.ts +0 -18
  287. /package/dist/router/{Link.svelte.d.ts → providers/Link.svelte.d.ts} +0 -0
  288. /package/dist/ui/components/{buttons → button-group}/types.js +0 -0
  289. /package/dist/ui/components/{clickable → checkbox}/types.js +0 -0
  290. /package/dist/{utils/api/copyPaste/index.js → ui/components/controlled-buttons/types.js} +0 -0
  291. /package/dist/ui/components/layout/{ExampleLayout.svelte.d.ts → examples/ExampleLayout.svelte.d.ts} +0 -0
  292. /package/dist/ui/components/{ImageUpload.svelte.d.ts → shared/ImageUpload.svelte.d.ts} +0 -0
  293. /package/dist/ui/components/{SelectBodyOrDivBlock.svelte.d.ts → shared/SelectBodyOrDivBlock.svelte.d.ts} +0 -0
@@ -6,18 +6,25 @@ const formsRegistry = writable({});
6
6
  // Validates class name according to HTML class name rules
7
7
  const classNameRegex = /^[a-zA-Z0-9_-]+$/;
8
8
  /**
9
- * Creates a form validation utility with Zod
9
+ * Creates a form validation utility with Svelte 5 reactive stores
10
10
  * @param identifier - Unique identifier for the form
11
11
  * @param options - Configuration options
12
12
  */
13
13
  export class FormValidator {
14
14
  schema;
15
- store;
16
- form;
15
+ _store;
17
16
  instancesSet = new Set();
18
17
  initialValues;
19
18
  identifier;
20
19
  currentInstanceToIgnore = null;
20
+ classValidationEnabled = true;
21
+ // Public reactive stores that components can directly use
22
+ values;
23
+ errors;
24
+ touched;
25
+ isValid;
26
+ isDirty;
27
+ isSubmitting;
21
28
  /**
22
29
  * Generates unique name, instance, and class based on solution name and existing instances
23
30
  * @param existingInstances - Array of existing instance names
@@ -86,8 +93,8 @@ export class FormValidator {
86
93
  if (options?.existingInstances) {
87
94
  options.existingInstances.forEach((instance) => this.instancesSet.add(instance.toLowerCase()));
88
95
  }
89
- // Create the form state store
90
- this.store = writable({
96
+ // Create the internal form state store
97
+ this._store = writable({
91
98
  values: initialValues,
92
99
  errors: {},
93
100
  touched: {},
@@ -96,7 +103,12 @@ export class FormValidator {
96
103
  isSubmitting: false
97
104
  });
98
105
  // Create a derived store that's the primary interface to the form
99
- this.form = derived(this.store, ($store) => $store);
106
+ this.values = derived(this._store, ($store) => $store.values);
107
+ this.errors = derived(this._store, ($store) => $store.errors);
108
+ this.touched = derived(this._store, ($store) => $store.touched);
109
+ this.isValid = derived(this._store, ($store) => $store.isValid);
110
+ this.isDirty = derived(this._store, ($store) => $store.isDirty);
111
+ this.isSubmitting = derived(this._store, ($store) => $store.isSubmitting);
100
112
  // Register this form with the global registry
101
113
  formsRegistry.update((registry) => {
102
114
  registry[identifier] = this;
@@ -120,7 +132,7 @@ export class FormValidator {
120
132
  * Set the value of a specific field
121
133
  */
122
134
  setField(field, value) {
123
- this.store.update((state) => {
135
+ this._store.update((state) => {
124
136
  const newState = {
125
137
  ...state,
126
138
  values: {
@@ -141,7 +153,7 @@ export class FormValidator {
141
153
  * Set multiple field values at once
142
154
  */
143
155
  setFields(values) {
144
- this.store.update((state) => {
156
+ this._store.update((state) => {
145
157
  const newTouched = { ...state.touched };
146
158
  // Mark all updated fields as touched
147
159
  Object.keys(values).forEach((key) => {
@@ -171,7 +183,7 @@ export class FormValidator {
171
183
  * Reset the form to initial values
172
184
  */
173
185
  reset() {
174
- this.store.set({
186
+ this._store.set({
175
187
  values: { ...this.initialValues },
176
188
  errors: {},
177
189
  touched: {},
@@ -181,32 +193,46 @@ export class FormValidator {
181
193
  });
182
194
  this.validate();
183
195
  }
196
+ /**
197
+ * Enable or disable class name validation
198
+ * @param enabled - Whether to enable class validation
199
+ */
200
+ enableClassValidation(enabled) {
201
+ this.classValidationEnabled = enabled;
202
+ this.validate();
203
+ }
184
204
  /**
185
205
  * Validate the form values
186
206
  */
187
207
  validate() {
188
- this.store.update((state) => {
189
- // Create a custom schema for validation that includes instance uniqueness
190
- const currentSchema = z.object({
191
- name: z.string().min(1, { message: 'Name is required' }),
192
- instance: z
193
- .string()
194
- .min(1, { message: 'Instance is required' })
195
- .refine((value) => {
196
- // Skip if empty (handled by min(1) above)
197
- if (!value)
198
- return true;
199
- // If we're in edit mode and this is the current instance, skip duplicate validation
200
- if (this.currentInstanceToIgnore &&
201
- value.toLowerCase() === this.currentInstanceToIgnore) {
202
- return true;
203
- }
204
- // Check for uniqueness against the set of existing instances
205
- return !this.instancesSet.has(value.toLowerCase());
206
- }, { message: 'Instance name must be unique' }),
207
- class: z.string().min(1, { message: 'Class is required' }).regex(classNameRegex, {
208
+ this._store.update((state) => {
209
+ // Create a custom schema for validation that includes instance uniqueness and conditional class validation
210
+ const nameSchema = z.string().min(1, { message: 'Name is required' });
211
+ const instanceSchema = z
212
+ .string()
213
+ .min(1, { message: 'Instance is required' })
214
+ .refine((value) => {
215
+ // Skip if empty (handled by min(1) above)
216
+ if (!value)
217
+ return true;
218
+ // If we're in edit mode and this is the current instance, skip duplicate validation
219
+ if (this.currentInstanceToIgnore &&
220
+ value.toLowerCase() === this.currentInstanceToIgnore) {
221
+ return true;
222
+ }
223
+ // Check for uniqueness against the set of existing instances
224
+ return !this.instancesSet.has(value.toLowerCase());
225
+ }, { message: 'Instance name must be unique' });
226
+ // Conditionally create class validation
227
+ const classSchema = this.classValidationEnabled
228
+ ? z.string().min(1, { message: 'Class is required' }).regex(classNameRegex, {
208
229
  message: 'Class must contain only letters, numbers, underscores, and hyphens'
209
230
  })
231
+ : z.string();
232
+ const currentSchema = z.object({
233
+ name: nameSchema,
234
+ instance: instanceSchema,
235
+ class: classSchema
210
236
  });
211
237
  // Validate the current values against the schema
212
238
  const result = currentSchema.safeParse(state.values);
@@ -233,18 +259,46 @@ export class FormValidator {
233
259
  * Set the form as submitting
234
260
  */
235
261
  setSubmitting(isSubmitting) {
236
- this.store.update((state) => ({
262
+ this._store.update((state) => ({
237
263
  ...state,
238
264
  isSubmitting
239
265
  }));
240
266
  }
241
267
  /**
242
- * Get the current state of the form
268
+ * Get the current state of the form (for legacy compatibility)
243
269
  */
244
270
  getState() {
245
- return get(this.store);
271
+ return get(this._store);
246
272
  }
247
273
  }
274
+ /**
275
+ * Setup form hook
276
+ */
277
+ export function createForm(identifier, initialValues, options) {
278
+ const form = new FormValidator(identifier, initialValues, options);
279
+ if (options?.enableClassValidation !== undefined) {
280
+ form.enableClassValidation(options.enableClassValidation);
281
+ }
282
+ return {
283
+ // Reactive stores that components can directly subscribe to
284
+ values: form.values,
285
+ errors: form.errors,
286
+ touched: form.touched,
287
+ isValid: form.isValid,
288
+ isDirty: form.isDirty,
289
+ isSubmitting: form.isSubmitting,
290
+ // Helper methods
291
+ setField: form.setField.bind(form),
292
+ setFields: form.setFields.bind(form),
293
+ reset: form.reset.bind(form),
294
+ enableClassValidation: form.enableClassValidation.bind(form),
295
+ ignoreInstanceValidation: form.ignoreInstanceValidation.bind(form),
296
+ setSubmitting: form.setSubmitting.bind(form),
297
+ // For advanced use cases
298
+ validate: () => form.validateWithInstances(options?.existingInstances || []),
299
+ getState: form.getState.bind(form)
300
+ };
301
+ }
248
302
  /**
249
303
  * Get a form by its identifier
250
304
  */
@@ -1,7 +1,6 @@
1
1
  export * from './breakpoints';
2
2
  export * from './forms';
3
3
  export * from './componentInjectErrors';
4
- export * from './globalStore';
5
4
  export * from './router';
6
5
  export * from './showConfirmActionModal';
7
6
  export * from './siteInfo';
@@ -1,7 +1,6 @@
1
1
  export * from './breakpoints';
2
2
  export * from './forms';
3
3
  export * from './componentInjectErrors';
4
- export * from './globalStore';
5
4
  export * from './router';
6
5
  export * from './showConfirmActionModal';
7
6
  export * from './siteInfo';
@@ -2,7 +2,7 @@ interface CustomCodeAttributes {
2
2
  async: string;
3
3
  type: string;
4
4
  siteId: string;
5
- finsweet: 'components';
5
+ finsweet: 'components' | 'cmp' | 'fast-search';
6
6
  }
7
7
  export interface CustomCodeBlock {
8
8
  id?: string;
@@ -75,51 +75,35 @@ export interface Webflow extends Pick<WebflowCallback[], 'push'> {
75
75
  };
76
76
  require: <Key extends WebflowModule>(key: Key) => (Key extends 'commerce' ? WebflowCommerce : Key extends 'lightbox' ? WebflowLightbox : Key extends 'slider' ? WebflowSlider : Key extends 'tabs' ? WebflowTabs : WebflowIx2) | undefined;
77
77
  }
78
- /**
79
- * CMS
80
- */
81
- export type CollectionListWrapperElement = HTMLDivElement;
82
- export type CollectionListElement = HTMLDivElement;
83
- export type CollectionItemElement = HTMLDivElement;
84
- export type CollectionEmptyElement = HTMLDivElement;
85
- export type PaginationWrapperElement = HTMLDivElement;
86
- export type PaginationButtonElement = HTMLAnchorElement;
87
- export type PageCountElement = HTMLDivElement;
88
- /**
89
- * Forms
90
- */
91
- export type FormBlockElement = HTMLDivElement;
92
- export type FormSuccessElement = HTMLDivElement;
93
- export type FormErrorElement = HTMLDivElement;
94
- /**
95
- * Sliders
96
- */
97
- export type SliderElement = HTMLDivElement;
98
- export type SliderMaskElement = HTMLDivElement;
99
- export type SlideElement = HTMLDivElement;
100
- export type SliderArrowElement = HTMLDivElement;
101
- export type SliderNavElement = HTMLDivElement;
102
- export type SliderDotElement = HTMLDivElement;
103
- /**
104
- * Tabs
105
- */
106
- export type TabsElement = HTMLDivElement;
107
- export type TabsMenuElement = HTMLDivElement;
108
- export type TabLinkElement = HTMLLinkElement;
109
- export type TabsContentElement = HTMLDivElement;
110
- export type TabPaneElement = HTMLDivElement;
111
- /**
112
- * Rich Text Block
113
- */
114
- export type RichTextBlockElement = HTMLDivElement;
115
- /**
116
- * Dropdowns
117
- */
118
- export type DropdownElement = HTMLDivElement;
119
- export type DropdownToggle = HTMLDivElement;
120
- export type DropdownList = HTMLElement;
121
- /**
122
- * The default Webflow Breakpoint names.
123
- */
124
- export type WebflowBreakpoint = 'main' | 'medium' | 'small' | 'tiny';
78
+ export type XSCPMetadata = {
79
+ meta: {
80
+ droppedLinks: number;
81
+ dynBindRemovedCount: number;
82
+ dynListBindRemovedCount: number;
83
+ paginationRemovedCount: number;
84
+ universalBindingsRemovedCount: number;
85
+ unlinkedSymbolCount: number;
86
+ };
87
+ type: string;
88
+ payload: {
89
+ nodes: PastedNodes[];
90
+ assets: object[];
91
+ ix1: object[];
92
+ ix2: object[];
93
+ styles: {
94
+ name: string;
95
+ type: string | 'class';
96
+ }[];
97
+ };
98
+ };
99
+ type PastedNodes = {
100
+ children: string[];
101
+ classes: string[];
102
+ tag: string;
103
+ type: string;
104
+ _id: string;
105
+ data: {
106
+ xattr: Attr[];
107
+ };
108
+ };
125
109
  export {};
@@ -9,6 +9,7 @@ declare global {
9
9
  event: string;
10
10
  } | IArguments>;
11
11
  Webflow?: Webflow | WebflowCallback[];
12
+ isLoadingCustomCodeConfigs: boolean;
12
13
  }
13
14
  }
14
15
  export type ALLOWED_BREAKPOINTS = '320' | '480' | '768' | '991' | '1280' | '1440' | '1920';
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { WarningTriangleOutlineIcon } from '../icons';
3
- import { Loader, Text } from '.';
3
+ import { Text } from '.';
4
+ import Loader from './Loader.svelte';
4
5
 
5
6
  export let message = '';
6
7
  export let position: 'fixed' | 'absolute' = 'fixed';
@@ -98,7 +98,7 @@
98
98
  iconSize = '16px',
99
99
  padding,
100
100
  class: className = '',
101
- loadingText = 'Please wait...',
101
+ loadingText = 'Please wait',
102
102
  fullWidth = false,
103
103
  tooltip,
104
104
  invalid = false,
@@ -0,0 +1,112 @@
1
+ import ButtonGroup from './ButtonGroup.svelte';
2
+ const meta = {
3
+ title: 'Ui/ButtonGroup',
4
+ component: ButtonGroup,
5
+ parameters: {
6
+ layout: 'centered',
7
+ docs: {
8
+ description: {
9
+ component: 'A button group component that allows users to select one option from multiple choices. Provides keyboard navigation and accessibility features.'
10
+ }
11
+ }
12
+ },
13
+ tags: ['autodocs'],
14
+ argTypes: {
15
+ buttons: {
16
+ control: 'object',
17
+ description: 'Array of button options with name and value properties'
18
+ },
19
+ selected: {
20
+ control: 'text',
21
+ description: 'Currently selected value'
22
+ },
23
+ disabled: {
24
+ control: 'boolean',
25
+ description: 'Whether the entire button group is disabled'
26
+ },
27
+ id: {
28
+ control: 'text',
29
+ description: 'Unique identifier for the button group'
30
+ },
31
+ onselect: {
32
+ action: 'onselect',
33
+ description: 'Event handler called when a button is selected'
34
+ }
35
+ }
36
+ };
37
+ export default meta;
38
+ // Basic stories
39
+ export const Default = {
40
+ args: {
41
+ buttons: [
42
+ { name: 'Option 1', value: 'option1' },
43
+ { name: 'Option 2', value: 'option2' }
44
+ ],
45
+ selected: 'option1'
46
+ }
47
+ };
48
+ export const WithoutSelection = {
49
+ args: {
50
+ buttons: [
51
+ { name: 'Left', value: 'left' },
52
+ { name: 'Center', value: 'center' },
53
+ { name: 'Right', value: 'right' }
54
+ ]
55
+ }
56
+ };
57
+ export const Disabled = {
58
+ args: {
59
+ buttons: [
60
+ { name: 'Edit', value: 'edit' },
61
+ { name: 'Preview', value: 'preview' },
62
+ { name: 'Publish', value: 'publish' }
63
+ ],
64
+ selected: 'edit',
65
+ disabled: true
66
+ }
67
+ };
68
+ export const LongLabels = {
69
+ args: {
70
+ buttons: [
71
+ { name: 'Short', value: 'short' },
72
+ { name: 'Medium Length', value: 'medium' },
73
+ { name: 'Very Long Button Label', value: 'long' }
74
+ ],
75
+ selected: 'medium'
76
+ }
77
+ };
78
+ export const ManyOptions = {
79
+ args: {
80
+ buttons: [
81
+ { name: 'XS', value: 'xs' },
82
+ { name: 'SM', value: 'sm' },
83
+ { name: 'MD', value: 'md' },
84
+ { name: 'LG', value: 'lg' },
85
+ { name: 'XL', value: 'xl' },
86
+ { name: 'XXL', value: 'xxl' }
87
+ ],
88
+ selected: 'md'
89
+ }
90
+ };
91
+ // Interactive example
92
+ export const Interactive = {
93
+ render: (args) => ({
94
+ Component: ButtonGroup,
95
+ props: {
96
+ ...args,
97
+ onselect: (value) => {
98
+ console.log('Selected:', value);
99
+ // Update the selected value to show selection change
100
+ args.selected = value;
101
+ }
102
+ }
103
+ }),
104
+ args: {
105
+ buttons: [
106
+ { name: 'Grid', value: 'grid' },
107
+ { name: 'List', value: 'list' },
108
+ { name: 'Card', value: 'card' }
109
+ ],
110
+ selected: 'grid'
111
+ }
112
+ };
@@ -1,14 +1,13 @@
1
1
  <script lang="ts">
2
- import { createEventDispatcher } from 'svelte';
3
-
4
- export let id: string;
5
- export let buttons: { name: string; value: string }[] = [];
6
- export let selected: string;
7
- export let disabled = false;
2
+ interface Props {
3
+ id?: string;
4
+ buttons?: { name: string; value: string }[];
5
+ selected?: string;
6
+ disabled?: boolean;
7
+ onselect?: (value: string) => void;
8
+ }
8
9
 
9
- const dispatch = createEventDispatcher<{
10
- select: string;
11
- }>();
10
+ let { id, buttons = [], selected = $bindable(), disabled = false, onselect }: Props = $props();
12
11
 
13
12
  /**
14
13
  * Sets selected value and dispatches the select event.
@@ -17,7 +16,7 @@
17
16
  const selectButton = (value: string) => {
18
17
  if (disabled) return;
19
18
  selected = value;
20
- dispatch('select', value);
19
+ onselect?.(value);
21
20
  };
22
21
 
23
22
  /**
@@ -34,20 +33,15 @@
34
33
  };
35
34
  </script>
36
35
 
37
- <div class="button-group">
36
+ <div class="btn-group">
38
37
  {#each buttons as { name, value }, index (index)}
39
38
  <div
40
39
  {id}
41
- class="button {selected === value ? 'active' : ''} {disabled ? 'disabled' : ''}"
40
+ class="btn {selected === value ? 'active' : ''} {disabled ? 'disabled' : ''}"
42
41
  role="button"
43
42
  tabindex={disabled ? -1 : 0}
44
- on:click={() => selectButton(value)}
45
- {...{
46
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
47
- //@ts-ignore - svelte v4 types for markdown not supported https://github.com/sveltejs/svelte/issues/4701
48
- //on:keydown: (event: KeyboardEvent) => handleKeydown(event, value)
49
- }}
50
- on:keydown={(event) => handleKeydown(event, value)}
43
+ onclick={() => selectButton(value)}
44
+ onkeydown={(event) => handleKeydown(event, value)}
51
45
  aria-disabled={disabled}
52
46
  >
53
47
  {name}
@@ -56,7 +50,7 @@
56
50
  </div>
57
51
 
58
52
  <style>
59
- .button-group {
53
+ .btn-group {
60
54
  display: flex;
61
55
  background: var(
62
56
  --action-action-secondary-background,
@@ -66,41 +60,34 @@
66
60
  box-shadow: var(--boxShadows-action-secondary);
67
61
  }
68
62
 
69
- .button {
63
+ .btn {
70
64
  padding: 4px 8px;
71
65
  cursor: pointer;
72
66
  background: transparent;
73
- border-radius: 0px;
74
- transition: background-color 0.2s;
75
- border-width: 0px;
67
+ border-radius: var(--border-radius);
76
68
  margin: 2px 0px;
77
69
  color: var(--text1);
78
70
  }
79
71
 
80
- .button.disabled {
72
+ .btn.disabled {
81
73
  opacity: 0.75;
82
74
  cursor: not-allowed;
83
75
  }
84
76
 
85
- .button-group .button:first-of-type {
77
+ .btn-group .btn:first-of-type {
86
78
  margin-left: 2px;
87
79
  border-top-left-radius: var(--border-radius);
88
80
  border-bottom-left-radius: var(--border-radius);
89
81
  }
90
82
 
91
- .button-group .button:last-of-type {
83
+ .btn-group .btn:last-of-type {
92
84
  margin-right: 2px;
93
85
  border-top-right-radius: var(--border-radius);
94
86
  border-bottom-right-radius: var(--border-radius);
95
87
  }
96
88
 
97
- .button:hover {
98
- background-color: var(--actionSecondaryBackgroundHover);
99
- }
100
-
101
- .button.active {
89
+ .btn.active {
102
90
  background: var(--background1);
103
91
  color: white;
104
- border-radius: var(--border-radius);
105
92
  }
106
93
  </style>
@@ -0,0 +1,13 @@
1
+ interface Props {
2
+ id?: string;
3
+ buttons?: {
4
+ name: string;
5
+ value: string;
6
+ }[];
7
+ selected?: string;
8
+ disabled?: boolean;
9
+ onselect?: (value: string) => void;
10
+ }
11
+ declare const ButtonGroup: import("svelte").Component<Props, {}, "selected">;
12
+ type ButtonGroup = ReturnType<typeof ButtonGroup>;
13
+ export default ButtonGroup;
@@ -0,0 +1,2 @@
1
+ export { default as ButtonGroup } from './ButtonGroup.svelte';
2
+ export type * from './types.js';
@@ -0,0 +1 @@
1
+ export { default as ButtonGroup } from './ButtonGroup.svelte';
@@ -0,0 +1,32 @@
1
+ export interface ButtonGroupOption {
2
+ /**
3
+ * Display name for the button
4
+ */
5
+ name: string;
6
+ /**
7
+ * Value associated with the button
8
+ */
9
+ value: string;
10
+ }
11
+ export interface ButtonGroupProps {
12
+ /**
13
+ * Unique identifier for the button group
14
+ */
15
+ id?: string;
16
+ /**
17
+ * Array of button options
18
+ */
19
+ buttons?: ButtonGroupOption[];
20
+ /**
21
+ * Currently selected value
22
+ */
23
+ selected?: string;
24
+ /**
25
+ * Whether the entire button group is disabled
26
+ */
27
+ disabled?: boolean;
28
+ /**
29
+ * Event handler called when a button is selected
30
+ */
31
+ onselect?: (value: string) => void;
32
+ }
@@ -0,0 +1,55 @@
1
+ import type { StoryObj } from '@storybook/sveltekit';
2
+ declare const meta: {
3
+ title: string;
4
+ component: import("svelte").Component<import("./types").CheckboxProps, {}, "">;
5
+ parameters: {
6
+ layout: string;
7
+ docs: {
8
+ description: {
9
+ component: string;
10
+ };
11
+ };
12
+ };
13
+ tags: string[];
14
+ argTypes: {
15
+ checked: {
16
+ control: string;
17
+ description: string;
18
+ };
19
+ defaultChecked: {
20
+ control: string;
21
+ description: string;
22
+ };
23
+ disabled: {
24
+ control: string;
25
+ description: string;
26
+ };
27
+ variant: {
28
+ control: {
29
+ type: string;
30
+ };
31
+ options: string[];
32
+ description: string;
33
+ };
34
+ onChange: {
35
+ action: string;
36
+ description: string;
37
+ };
38
+ };
39
+ };
40
+ export default meta;
41
+ type Story = StoryObj<typeof meta>;
42
+ export declare const Default: Story;
43
+ export declare const DefaultChecked: Story;
44
+ export declare const Controlled: Story;
45
+ export declare const CheckboxVariant: Story;
46
+ export declare const RadioVariant: Story;
47
+ export declare const Disabled: Story;
48
+ export declare const DisabledChecked: Story;
49
+ export declare const DisabledRadio: Story;
50
+ export declare const Uncontrolled: Story;
51
+ export declare const Interactive: Story;
52
+ export declare const InteractiveRadio: Story;
53
+ export declare const AccessibilityTest: Story;
54
+ export declare const MultipleCheckboxes: Story;
55
+ export declare const FocusStates: Story;