coles-solid-library 0.5.0 → 0.5.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 (240) hide show
  1. package/USAGE.html +20 -12
  2. package/dist/__tests__/Body.test.d.ts +1 -0
  3. package/dist/__tests__/Button.accessibility.test.d.ts +1 -0
  4. package/dist/__tests__/Button.coverage.test.d.ts +1 -0
  5. package/dist/__tests__/Button.extra.test.d.ts +1 -0
  6. package/dist/__tests__/Button.test.d.ts +1 -0
  7. package/dist/__tests__/Carosel.test.d.ts +1 -0
  8. package/dist/__tests__/Checkbox.test.d.ts +1 -0
  9. package/dist/__tests__/Chip.performance.test.d.ts +1 -0
  10. package/dist/__tests__/Chip.test.d.ts +1 -0
  11. package/dist/__tests__/Chipbar.performance.test.d.ts +1 -0
  12. package/dist/__tests__/Chipbar.test.d.ts +1 -0
  13. package/dist/__tests__/Container.test.d.ts +1 -0
  14. package/dist/__tests__/CoreComponents.performance.test.d.ts +1 -0
  15. package/dist/__tests__/Expansion.accessibility.test.d.ts +1 -0
  16. package/dist/__tests__/ExpansionPanel.test.d.ts +1 -0
  17. package/dist/__tests__/Form.performance.test.d.ts +1 -0
  18. package/dist/__tests__/Form.submit.test.d.ts +1 -0
  19. package/dist/__tests__/FormArray.externalMutation.test.d.ts +1 -0
  20. package/dist/__tests__/FormArray.test.d.ts +1 -0
  21. package/dist/__tests__/FormBridgeRecursion.test.d.ts +1 -0
  22. package/dist/__tests__/FormDependencyRegression.test.d.ts +1 -0
  23. package/dist/__tests__/FormEnhancements.test.d.ts +1 -0
  24. package/dist/__tests__/FormField.resetAndClear.test.d.ts +1 -0
  25. package/dist/__tests__/FormField.test.d.ts +1 -0
  26. package/dist/__tests__/FormFieldDirtyOnFocus.test.d.ts +1 -0
  27. package/dist/__tests__/FormFieldDirtyState.test.d.ts +1 -0
  28. package/dist/__tests__/FormFieldExtra.test.d.ts +1 -0
  29. package/dist/__tests__/FormFieldProgrammaticSet.test.d.ts +1 -0
  30. package/dist/__tests__/FormGroup.additionalGaps.test.d.ts +1 -0
  31. package/dist/__tests__/FormGroup.gaps.test.d.ts +1 -0
  32. package/dist/__tests__/FormGroup.test.d.ts +1 -0
  33. package/dist/__tests__/FormGroupAccessors.integration.test.d.ts +1 -0
  34. package/dist/__tests__/FormGroupAccessors.test.d.ts +1 -0
  35. package/dist/__tests__/FormReactiveUpdate.test.d.ts +1 -0
  36. package/dist/__tests__/Icon.test.d.ts +1 -0
  37. package/dist/__tests__/Input.test.d.ts +1 -0
  38. package/dist/__tests__/InputV2EdgeCases.test.d.ts +1 -0
  39. package/dist/__tests__/LegacyInputDirty.test.d.ts +1 -0
  40. package/dist/__tests__/Menu.performance.test.d.ts +1 -0
  41. package/dist/__tests__/Menu.test.d.ts +1 -0
  42. package/dist/__tests__/MenuDropdown.test.d.ts +1 -0
  43. package/dist/__tests__/MenuItem.accessibility.test.d.ts +1 -0
  44. package/dist/__tests__/Modal.additional.test.d.ts +1 -0
  45. package/dist/__tests__/Modal.performance.test.d.ts +1 -0
  46. package/dist/__tests__/Modal.test.d.ts +1 -0
  47. package/dist/__tests__/Radio.test.d.ts +1 -0
  48. package/dist/__tests__/RadioGroup.keyboard.test.d.ts +1 -0
  49. package/dist/__tests__/Select.accessibility.test.d.ts +1 -0
  50. package/dist/__tests__/Select.formField.test.d.ts +1 -0
  51. package/dist/__tests__/Select.mobile.test.d.ts +1 -0
  52. package/dist/__tests__/Select.optionEdge.test.d.ts +1 -0
  53. package/dist/__tests__/Select.performance.test.d.ts +1 -0
  54. package/dist/__tests__/Select.test.d.ts +1 -0
  55. package/dist/__tests__/Snackbar.additional.test.d.ts +1 -0
  56. package/dist/__tests__/Snackbar.performance.test.d.ts +1 -0
  57. package/dist/__tests__/Snackbar.test.d.ts +1 -0
  58. package/dist/__tests__/TabBar.performance.test.d.ts +1 -0
  59. package/dist/__tests__/TabBar.test.d.ts +1 -0
  60. package/dist/__tests__/TableV2.additional.test.d.ts +1 -0
  61. package/dist/__tests__/TableV2.dropHeaderAttr.test.d.ts +1 -0
  62. package/dist/__tests__/TableV2.dropdownAdvanced.test.d.ts +1 -0
  63. package/dist/__tests__/TableV2.extra.test.d.ts +1 -0
  64. package/dist/__tests__/TableV2.nullCells.test.d.ts +1 -0
  65. package/dist/__tests__/TableV2.performance.test.d.ts +1 -0
  66. package/dist/__tests__/TableV2.test.d.ts +1 -0
  67. package/dist/__tests__/TextArea.test.d.ts +1 -0
  68. package/dist/__tests__/Validators.test.d.ts +1 -0
  69. package/dist/__tests__/globalWindowManager.performance.test.d.ts +1 -0
  70. package/dist/__tests__/globalWindowManager.test.d.ts +1 -0
  71. package/dist/__tests__/helpers/renderWithTheme.d.ts +106 -0
  72. package/dist/__tests__/injectStyles.test.d.ts +1 -0
  73. package/dist/__tests__/tools.advanced.test.d.ts +1 -0
  74. package/dist/__tests__/tools.clone.edge.test.d.ts +1 -0
  75. package/dist/__tests__/tools.test.d.ts +1 -0
  76. package/dist/__tests__/useClickOutside.test.d.ts +1 -0
  77. package/dist/__tests__/useDirectFormBinding.test.d.ts +1 -0
  78. package/dist/components/Button/Button.d.ts +1 -1
  79. package/dist/components/Button/Button.js +2 -0
  80. package/dist/components/Button/Button.js.map +1 -0
  81. package/dist/components/Button/Button.module.scss.js +2 -0
  82. package/dist/components/Button/Button.module.scss.js.map +1 -0
  83. package/dist/components/Carosel/Carosel.js +2 -0
  84. package/dist/components/Carosel/Carosel.js.map +1 -0
  85. package/dist/components/Carosel/Carosel.module.scss.js +2 -0
  86. package/dist/components/Carosel/Carosel.module.scss.js.map +1 -0
  87. package/dist/components/Carosel/Slide.js +2 -0
  88. package/dist/components/Carosel/Slide.js.map +1 -0
  89. package/dist/components/Checkbox/checkbox.js +2 -0
  90. package/dist/components/Checkbox/checkbox.js.map +1 -0
  91. package/dist/components/Checkbox/checkbox.module.scss.js +2 -0
  92. package/dist/components/Checkbox/checkbox.module.scss.js.map +1 -0
  93. package/dist/components/Chip/Chip.js +2 -0
  94. package/dist/components/Chip/Chip.js.map +1 -0
  95. package/dist/components/Chip/Chip.module.scss.js +2 -0
  96. package/dist/components/Chip/Chip.module.scss.js.map +1 -0
  97. package/dist/components/Chipbar/chipbar.js +2 -0
  98. package/dist/components/Chipbar/chipbar.js.map +1 -0
  99. package/dist/components/Chipbar/chipbar.module.scss.js +2 -0
  100. package/dist/components/Chipbar/chipbar.module.scss.js.map +1 -0
  101. package/dist/components/ComponentBody/body.component.js +2 -0
  102. package/dist/components/ComponentBody/body.component.js.map +1 -0
  103. package/dist/components/ComponentBody/body.module.scss.js +2 -0
  104. package/dist/components/ComponentBody/body.module.scss.js.map +1 -0
  105. package/dist/components/Container/container.js +2 -0
  106. package/dist/components/Container/container.js.map +1 -0
  107. package/dist/components/Container/container.module.scss.js +2 -0
  108. package/dist/components/Container/container.module.scss.js.map +1 -0
  109. package/dist/components/Form/form.js +2 -0
  110. package/dist/components/Form/form.js.map +1 -0
  111. package/dist/components/Form/formGroup.d.ts +7 -0
  112. package/dist/components/Form/formGroup.js +2 -0
  113. package/dist/components/Form/formGroup.js.map +1 -0
  114. package/dist/components/Form/formHelp/formArray.js +2 -0
  115. package/dist/components/Form/formHelp/formArray.js.map +1 -0
  116. package/dist/components/Form/formHelp/validators.js +2 -0
  117. package/dist/components/Form/formHelp/validators.js.map +1 -0
  118. package/dist/components/Form/useDirectFormBinding.js +2 -0
  119. package/dist/components/Form/useDirectFormBinding.js.map +1 -0
  120. package/dist/components/Form/useFormFieldBinding.js +2 -0
  121. package/dist/components/Form/useFormFieldBinding.js.map +1 -0
  122. package/dist/components/FormField/coleError.js +2 -0
  123. package/dist/components/FormField/coleError.js.map +1 -0
  124. package/dist/components/FormField/formField.js +2 -0
  125. package/dist/components/FormField/formField.js.map +1 -0
  126. package/dist/components/FormField/formProvider.js +2 -0
  127. package/dist/components/FormField/formProvider.js.map +1 -0
  128. package/dist/components/FormField/formfield.module.scss.js +2 -0
  129. package/dist/components/FormField/formfield.module.scss.js.map +1 -0
  130. package/dist/components/Icon/generated/outlined/keyboard_arrow_down.js +2 -0
  131. package/dist/components/Icon/generated/outlined/keyboard_arrow_down.js.map +1 -0
  132. package/dist/components/Icon/generated/outlined/keyboard_arrow_up.js +2 -0
  133. package/dist/components/Icon/generated/outlined/keyboard_arrow_up.js.map +1 -0
  134. package/dist/components/Icon/icon.d.ts +3 -8
  135. package/dist/components/Icon/icon.js +2 -0
  136. package/dist/components/Icon/icon.js.map +1 -0
  137. package/dist/components/Icon/icon.module.scss.js +2 -0
  138. package/dist/components/Icon/icon.module.scss.js.map +1 -0
  139. package/dist/components/Input/input.module.scss.js +2 -0
  140. package/dist/components/Input/input.module.scss.js.map +1 -0
  141. package/dist/components/Input/inputV2.js +2 -0
  142. package/dist/components/Input/inputV2.js.map +1 -0
  143. package/dist/components/Menu/menu.js +2 -0
  144. package/dist/components/Menu/menu.js.map +1 -0
  145. package/dist/components/Menu/menu.module.scss.js +2 -0
  146. package/dist/components/Menu/menu.module.scss.js.map +1 -0
  147. package/dist/components/Menu/menuContext.js +2 -0
  148. package/dist/components/Menu/menuContext.js.map +1 -0
  149. package/dist/components/Menu/menuDropdown.js +2 -0
  150. package/dist/components/Menu/menuDropdown.js.map +1 -0
  151. package/dist/components/Menu/menuitem.js +2 -0
  152. package/dist/components/Menu/menuitem.js.map +1 -0
  153. package/dist/components/Radio/radio-group.module.scss.js +2 -0
  154. package/dist/components/Radio/radio-group.module.scss.js.map +1 -0
  155. package/dist/components/Radio/radio.js +2 -0
  156. package/dist/components/Radio/radio.js.map +1 -0
  157. package/dist/components/Radio/radio.module.scss.js +2 -0
  158. package/dist/components/Radio/radio.module.scss.js.map +1 -0
  159. package/dist/components/Radio/radioGroup.js +2 -0
  160. package/dist/components/Radio/radioGroup.js.map +1 -0
  161. package/dist/components/Select/option.component.js +2 -0
  162. package/dist/components/Select/option.component.js.map +1 -0
  163. package/dist/components/Select/select.component.js +2 -0
  164. package/dist/components/Select/select.component.js.map +1 -0
  165. package/dist/components/Select/selectContext.js +2 -0
  166. package/dist/components/Select/selectContext.js.map +1 -0
  167. package/dist/components/Select/selectStyles.module.scss.js +2 -0
  168. package/dist/components/Select/selectStyles.module.scss.js.map +1 -0
  169. package/dist/components/Select/useHighlight.js +2 -0
  170. package/dist/components/Select/useHighlight.js.map +1 -0
  171. package/dist/components/Select/useSelectOptions.js +2 -0
  172. package/dist/components/Select/useSelectOptions.js.map +1 -0
  173. package/dist/components/Select/useTypeahead.js +2 -0
  174. package/dist/components/Select/useTypeahead.js.map +1 -0
  175. package/dist/components/Snackbar/snackbar.js +2 -0
  176. package/dist/components/Snackbar/snackbar.js.map +1 -0
  177. package/dist/components/Snackbar/snackbar.module.scss.js +2 -0
  178. package/dist/components/Snackbar/snackbar.module.scss.js.map +1 -0
  179. package/dist/components/TabV2/tabs.js +2 -0
  180. package/dist/components/TabV2/tabs.js.map +1 -0
  181. package/dist/components/TabV2/tabs.module.scss.js +2 -0
  182. package/dist/components/TabV2/tabs.module.scss.js.map +1 -0
  183. package/dist/components/TableV2/cell.js +2 -0
  184. package/dist/components/TableV2/cell.js.map +1 -0
  185. package/dist/components/TableV2/column.js +2 -0
  186. package/dist/components/TableV2/column.js.map +1 -0
  187. package/dist/components/TableV2/header.js +2 -0
  188. package/dist/components/TableV2/header.js.map +1 -0
  189. package/dist/components/TableV2/row.js +2 -0
  190. package/dist/components/TableV2/row.js.map +1 -0
  191. package/dist/components/TableV2/table.js +2 -0
  192. package/dist/components/TableV2/table.js.map +1 -0
  193. package/dist/components/TableV2/table.module.scss.js +2 -0
  194. package/dist/components/TableV2/table.module.scss.js.map +1 -0
  195. package/dist/components/TableV2/tableProvider.js +2 -0
  196. package/dist/components/TableV2/tableProvider.js.map +1 -0
  197. package/dist/components/TextArea/TextArea.js +2 -0
  198. package/dist/components/TextArea/TextArea.js.map +1 -0
  199. package/dist/components/TextArea/TextArea.module.scss.js +2 -0
  200. package/dist/components/TextArea/TextArea.module.scss.js.map +1 -0
  201. package/dist/components/expansion/expansion.js +2 -0
  202. package/dist/components/expansion/expansion.js.map +1 -0
  203. package/dist/components/expansion/expansion.module.scss.js +2 -0
  204. package/dist/components/expansion/expansion.module.scss.js.map +1 -0
  205. package/dist/components/modal/popup.component.js +2 -0
  206. package/dist/components/modal/popup.component.js.map +1 -0
  207. package/dist/components/modal/popup.module.scss.js +2 -0
  208. package/dist/components/modal/popup.module.scss.js.map +1 -0
  209. package/dist/components/svgs/arrows.js +2 -0
  210. package/dist/components/svgs/arrows.js.map +1 -0
  211. package/dist/globalWindowManager.d.ts +9 -0
  212. package/dist/globalWindowManager.js +2 -0
  213. package/dist/globalWindowManager.js.map +1 -0
  214. package/dist/index.js +2 -0
  215. package/dist/index.js.map +1 -0
  216. package/dist/injectStyles.d.ts +1 -0
  217. package/dist/styleInject.js +2 -0
  218. package/dist/styleInject.js.map +1 -0
  219. package/dist/tools/eventTools.d.ts +12 -0
  220. package/dist/tools/eventTools.js +2 -0
  221. package/dist/tools/eventTools.js.map +1 -0
  222. package/dist/tools/index.d.ts +4 -0
  223. package/dist/tools/tools.d.ts +15 -0
  224. package/dist/tools/tools.js +2 -0
  225. package/dist/tools/tools.js.map +1 -0
  226. package/dist/tools/useOverlayPosition.d.ts +27 -0
  227. package/dist/tools/useOverlayPosition.js +2 -0
  228. package/dist/tools/useOverlayPosition.js.map +1 -0
  229. package/dist/vite.d.ts +52 -0
  230. package/dist/vite.js +2 -0
  231. package/dist/vite.js.map +1 -0
  232. package/package.json +146 -11
  233. package/readme.md +36 -0
  234. package/dist/generated/registries/outlined.d.ts +0 -3
  235. package/dist/generated/registries/outlined.js +0 -7784
  236. package/dist/generated/registries/rounded.d.ts +0 -3
  237. package/dist/generated/registries/rounded.js +0 -7784
  238. package/dist/generated/registries/sharp.d.ts +0 -3
  239. package/dist/generated/registries/sharp.js +0 -7784
  240. package/dist/index.esm.js +0 -5475
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox.js","sources":["../../../src/components/Checkbox/checkbox.tsx"],"sourcesContent":["import { createMemo, createSignal, JSX, createEffect } from \"solid-js\";\n// @ts-ignore\nimport styles from \"./checkbox.module.scss\";\nimport { useFormProvider } from \"../FormField/formProvider\";\nimport { useFormContext } from \"../Form/form\";\nimport { useDirectFormBinding } from \"../Form/useDirectFormBinding\";\n\ninterface CheckboxProps {\n label?: string | JSX.Element;\n checked?: boolean; // controlled value\n defaultChecked?: boolean; // uncontrolled initial\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n ariaLabel?: string; // for accessibility when no visible label is provided\n formName?: string;\n formIndex?: number;\n formArrayName?: string;\n}\n\nexport function Checkbox(props: CheckboxProps) {\n const field = useFormProvider<boolean>();\n const formCtx = useFormContext<any>();\n const binding = useDirectFormBinding({ formName: props.formName, formIndex: props.formIndex, formArrayName: props.formArrayName });\n const formName = binding.formName;\n\n // Internal state for uncontrolled usage outside form context\n const [internalChecked, setInternalChecked] = createSignal<boolean>(props.defaultChecked ?? false);\n\n // Derive current checked state with priority: controlled prop -> FormArray -> form context -> field local value -> internal state\n const checkedState = createMemo<boolean>(() => {\n if (props.checked !== undefined) return !!props.checked;\n if (binding.isFormArray) return !!binding.getValue();\n if (formName && formCtx?.data) return !!formCtx.data[formName];\n if (field?.getValue) return !!field.getValue();\n return internalChecked();\n });\n\n // Keep field/form floating states in sync if programmatic changes occur\n createEffect(() => {\n const c = checkedState();\n if (formName && formCtx?.data) {\n field?.setTextInside?.(c);\n field?.setValue?.(c as any);\n }\n });\n\n const commitValue = (next: boolean) => {\n if (props.checked === undefined) {\n if (binding.isFormArray) {\n binding.setValue(next);\n } else if (formName && formCtx?.formGroup) {\n formCtx.formGroup.set(formName as any, next as any);\n formCtx.setData?.(formName as any, next as any);\n } else if (field?.setValue) {\n field.setValue(next as any);\n } else {\n setInternalChecked(next);\n }\n }\n field?.setTextInside?.(next);\n props.onChange?.(next);\n };\n\n const handleChange = (e: Event) => {\n const target = e.currentTarget as HTMLInputElement;\n const newChecked = target.checked;\n if (props.checked !== undefined) {\n // controlled: emit change; parent should update props.checked.\n // After microtask (allow parent reactive update) sync DOM to current checkedState\n props.onChange?.(newChecked);\n queueMicrotask(() => {\n // checkedState() reflects latest props / form context\n const desired = checkedState();\n if (target.checked !== desired) target.checked = desired;\n });\n return;\n }\n // uncontrolled / form-managed\n commitValue(newChecked);\n };\n\n return (\n <label\n class={styles.checkbox}\n classList={{\n [styles[\"checkbox--disabled\"]]: props.disabled,\n [styles[\"checkbox--checked\"]]: checkedState(),\n }}\n >\n <input\n type=\"checkbox\"\n class={styles[\"checkbox__input\"]}\n checked={checkedState()}\n disabled={props.disabled}\n aria-label={props.label ? undefined : props.ariaLabel}\n onChange={handleChange}\n />\n <span class={styles[\"checkbox__checkmark\"]} />\n {props.label && <span class={styles[\"checkbox__label\"]}>{props.label}</span>}\n </label>\n );\n}\n"],"names":["Checkbox","props","field","useFormProvider","formCtx","useFormContext","binding","useDirectFormBinding","formName","formIndex","formArrayName","internalChecked","setInternalChecked","createSignal","defaultChecked","checkedState","createMemo","undefined","checked","isFormArray","getValue","data","createEffect","c","setTextInside","setValue","handleChange","e","target","currentTarget","newChecked","onChange","queueMicrotask","desired","next","formGroup","set","setData","_el$","_tmpl$","_el$2","firstChild","_el$3","nextSibling","addEventListener","_$insert","_c$","_$memo","label","_el$4","_tmpl$2","_$effect","_$className","styles","_p$","_v$","checkbox","_v$2","disabled","_v$3","_v$4","_v$5","ariaLabel","_v$6","t","_$classList","a","o","i","_$setAttribute","n"],"mappings":"geAmBM,SAAUA,EAASC,GACvB,MAAMC,EAAQC,IACRC,EAAUC,IACVC,EAAUC,EAAqB,CAAEC,SAAUP,EAAMO,SAAUC,UAAWR,EAAMQ,UAAWC,cAAeT,EAAMS,gBAC5GF,EAAWF,EAAQE,UAGlBG,EAAiBC,GAAsBC,EAAsBZ,EAAMa,iBAAkB,GAGtFC,EAAeC,EAAoB,SACjBC,IAAlBhB,EAAMiB,UAAgCjB,EAAMiB,QAC5CZ,EAAQa,cAAsBb,EAAQc,WACtCZ,GAAYJ,GAASiB,OAAejB,EAAQiB,KAAKb,GACjDN,GAAOkB,WAAmBlB,EAAMkB,WAC7BT,KAITW,EAAa,KACX,MAAMC,EAAIR,IACNP,GAAYJ,GAASiB,OACvBnB,GAAOsB,gBAAgBD,GACvBrB,GAAOuB,WAAWF,MAItB,MAiBMG,EAAgBC,IACpB,MAAMC,EAASD,EAAEE,cACXC,EAAaF,EAAOV,QAC1B,QAAsBD,IAAlBhB,EAAMiB,QASR,OANAjB,EAAM8B,WAAWD,QACjBE,eAAe,KAEb,MAAMC,EAAUlB,IACZa,EAAOV,UAAYe,IAASL,EAAOV,QAAUe,KA3BlCC,QAgCPJ,OA/BUb,IAAlBhB,EAAMiB,UACJZ,EAAQa,YACVb,EAAQmB,SAASS,GACR1B,GAAYJ,GAAS+B,WAC9B/B,EAAQ+B,UAAUC,IAAI5B,EAAiB0B,GACvC9B,EAAQiC,UAAU7B,EAAiB0B,IAC1BhC,GAAOuB,SAChBvB,EAAMuB,SAASS,GAEftB,EAAmBsB,IAGvBhC,GAAOsB,gBAAgBU,GACvBjC,EAAM8B,WAAWG,IAqBnB,OAAAI,EAAAC,IAAAC,EAAAF,EAAAG,WAAAC,EAAAF,EAAAG,YAAAH,EAAAI,iBAAA,SAcgBlB,GAAYmB,EAAAP,GAAAQ,EAAAC,EAAA,MAGvB9C,EAAM+C,OAAK,KAAXF,aAAAG,EAAAC,IAAAL,EAAAI,EAAA,IAAwDhD,EAAM+C,OAAKG,EAAA,IAAAC,EAAAH,EAAvCI,EAAwB,kBAACJ,GAArD,IAAAA,IAA2E,MAAAE,EAAAG,IAAA,IAAAC,EAfrEF,EAAOG,SAAQC,EACX,CACT,CAACJ,EAAO,uBAAwBpD,EAAMyD,SACtC,CAACL,EAAO,sBAAuBtC,KAChC4C,EAIQN,EAAwB,gBAACO,EAEtB3D,EAAMyD,SAAQG,EACZ5D,EAAM+C,WAAQ/B,EAAYhB,EAAM6D,UAASC,EAG1CV,EAA4B,oBAAC,OAAAE,IAAAD,EAAA3B,GAAAyB,EAAAd,EAAAgB,EAAA3B,EAAA4B,GAAAD,EAAAU,EAAAC,EAAA3B,EAAAmB,EAAAH,EAAAU,GAAAL,IAAAL,EAAAY,GAAAd,EAAAZ,EAAAc,EAAAY,EAAAP,GAAAC,IAAAN,EAAAa,IAAA3B,EAAAkB,SAAAJ,EAAAa,EAAAP,GAAAC,IAAAP,EAAAc,GAAAC,EAAA7B,EAAA,aAAAc,EAAAc,EAAAP,GAAAE,IAAAT,EAAAgB,GAAAlB,EAAAV,EAAAY,EAAAgB,EAAAP,GAAAT,GAAA,CAAA3B,OAAAV,EAAA+C,OAAA/C,EAAAiD,OAAAjD,EAAAkD,OAAAlD,EAAAmD,OAAAnD,EAAAqD,OAAArD,IAAAkC,MAAAX,EAAAtB,QAL/BH,KAAcuB,EAX7B,IAc4BQ,EAd5BR,EAAAE,EAAAE,CAoBF"}
@@ -0,0 +1,2 @@
1
+ import c from"../../styleInject.js";var e={checkbox:"checkbox-module_checkbox__LzFLC","checkbox--disabled":"checkbox-module_checkbox--disabled__5PdL7",checkbox__input:"checkbox-module_checkbox__input__pTELL",checkbox__checkmark:"checkbox-module_checkbox__checkmark__0kdFq",checkbox__label:"checkbox-module_checkbox__label__YXjgj"};c('.checkbox-module_checkbox__LzFLC {\n display: flex;\n align-items: center;\n cursor: pointer;\n width: -moz-fit-content;\n width: fit-content;\n}\n\n.checkbox-module_checkbox--disabled__5PdL7 {\n cursor: not-allowed;\n}\n\n.checkbox-module_checkbox__input__pTELL {\n position: absolute;\n opacity: 0;\n pointer-events: none;\n}\n\n.checkbox-module_checkbox__checkmark__0kdFq {\n position: relative;\n width: 16px;\n height: 16px;\n border: 2px solid #666;\n border-radius: 4px;\n background: transparent;\n margin-right: 0.5em;\n flex-shrink: 0;\n}\n\n.checkbox-module_checkbox__checkmark__0kdFq:after {\n content: "";\n position: absolute;\n top: 50%;\n left: 50%;\n width: 5px;\n height: 10px;\n border: solid #fff;\n border-width: 0 2px 2px 0;\n transform: translate(-50%, -60%) rotate(45deg);\n display: none;\n}\n\n.checkbox-module_checkbox__input__pTELL:checked + .checkbox-module_checkbox__checkmark__0kdFq {\n background: #007bff;\n border-color: #007bff;\n}\n\n.checkbox-module_checkbox__input__pTELL:checked + .checkbox-module_checkbox__checkmark__0kdFq:after {\n display: block;\n}\n\n.checkbox-module_checkbox__LzFLC:hover .checkbox-module_checkbox__checkmark__0kdFq {\n border-color: #444;\n}\n\n.checkbox-module_checkbox__LzFLC:focus-within .checkbox-module_checkbox__checkmark__0kdFq {\n outline: 2px solid #80bdff;\n outline-offset: 2px;\n}\n\n.checkbox-module_checkbox__label__YXjgj {\n vertical-align: middle;\n}\n\n.checkbox-module_checkbox--disabled__5PdL7 .checkbox-module_checkbox__checkmark__0kdFq {\n border-color: #ccc;\n background: transparent;\n}\n\n.checkbox-module_checkbox--disabled__5PdL7 .checkbox-module_checkbox__checkmark__0kdFq:after {\n border-color: #ccc;\n}\n\n.checkbox-module_checkbox--disabled__5PdL7 .checkbox-module_checkbox__label__YXjgj {\n color: #ccc;\n}');export{e as default};
2
+ //# sourceMappingURL=checkbox.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{delegateEvents as r,addEventListener as e,insert as t,createComponent as n,effect as o,className as s,template as i}from"solid-js/web";import{Show as l}from"solid-js";import c from"./Chip.module.scss.js";import{Button as a}from"../Button/Button.js";var p=i("<span>"),u=i("<span>:"),m=i("<span><span>");const h=r=>{const i=r.onClick?`${c.hover}`:"";return h=m(),v=h.firstChild,e(h,"click",r.onClick,!0),t(h,n(l,{get when(){return!!r.key},get children(){return[(e=p(),t(e,()=>r.key),e),u()];var e}}),v),t(v,()=>" "+r.value),t(h,n(l,{get when(){return!!r.remove},get children(){return n(a,{transparent:!0,get class(){return`${c.hover} ${c.removeChipButton}`},get onClick(){return r.remove},children:"x"})}}),null),o(()=>s(h,`${c.tertiary} ${c.Chip} ${r.class??""} ${i}`)),h;var h,v};r(["click"]);export{h as Chip};
2
+ //# sourceMappingURL=Chip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chip.js","sources":["../../../src/components/Chip/Chip.tsx"],"sourcesContent":["import { Component, createMemo, JSX, Show } from \"solid-js\";\n// @ts-ignore\nimport style from \"./Chip.module.scss\";\nimport Button from \"../Button/Button\";\n\n\ninterface Props {\n class?: string;\n key?: string;\n value: string;\n remove?: (e: MouseEvent)=> any;\n\t\tonClick?: (e: MouseEvent)=> any;\n}\nconst Chip: Component<Props> = (props)=> {\n const hoverChip = props.onClick ? `${style.hover}` : \"\";\n return (\n <span onClick={props.onClick} class={`${style['tertiary']} ${style.Chip} ${props.class ?? \"\"} ${hoverChip}`}>\n <Show when={!!props.key}>\n <span>{props.key}</span>\n <span>:</span>\n </Show>\n <span>{' '+props.value}</span>\n <Show when={!!props.remove}>\n <Button transparent class={`${style.hover} ${style.removeChipButton}`} onClick={props.remove}>\n x\n </Button>\n </Show>\n </span>\n )\n}\nexport { Chip };\nexport default Chip;"],"names":["Chip","props","hoverChip","onClick","style","hover","_el$","_tmpl$3","_el$4","firstChild","_$addEventListener","_$insert","_$createComponent","Show","when","key","children","_el$2","_tmpl$","_tmpl$2","value","remove","Button","transparent","removeChipButton","_$effect","_$className","class","_$delegateEvents"],"mappings":"qTAaA,MAAMA,EAA0BC,IAC9B,MAAMC,EAAYD,EAAME,QAAU,GAAGC,EAAMC,QAAU,GACrD,OAAAC,EAAAC,IAAAC,EAAAF,EAAAG,WAAAC,EAAAJ,EAAA,QACiBL,EAAME,SAAO,GAAAQ,EAAAL,EAAAM,EACzBC,EAAI,CAAA,QAACC,GAAI,QAAIb,EAAMc,GAAG,EAAA,YAAAC,GAAA,MAAA,EAAAC,EAAAC,IAAAP,EAAAM,EAAA,IACdhB,EAAMc,KAAGE,GAAAE,KADK,IAAAF,CACL,IAAAT,GAAAG,EAAAH,EAAA,IAGX,IAAIP,EAAMmB,OAAKT,EAAAL,EAAAM,EACrBC,EAAI,CAAA,QAACC,GAAI,QAAIb,EAAMoB,MAAM,EAAA,YAAAL,GAAA,OAAAJ,EACvBU,EAAM,CAACC,aAAW,EAAA,SAAA,GAAA,MAAQ,GAAGnB,EAAMC,SAASD,EAAMoB,kBAAkB,EAAA,WAAErB,GAAO,OAAEF,EAAMoB,MAAM,EAAAL,SAAA,KAAA,IAAA,MAAAS,EAAA,IAAAC,EAAApB,EAP3D,GAAGF,EAAgB,YAAKA,EAAMJ,QAAQC,EAAM0B,OAAS,MAAMzB,MAAWI,EAD7G,IAAAA,EAAAE,GAgBkBoB,EAAA,CAAA"}
@@ -0,0 +1,2 @@
1
+ import n from"../../styleInject.js";var t={Chip:"Chip-module_Chip__HWK4W",removeChipButton:"Chip-module_removeChipButton__kl1mU",hover:"Chip-module_hover__fvVQS",tertiary:"Chip-module_tertiary__TtdnV"};n(".Chip-module_Chip__HWK4W {\n display: flex;\n flex-direction: row;\n padding: 5px 10px;\n margin-left: 8px;\n border-radius: 15px;\n height: -moz-max-content;\n height: max-content;\n min-width: -moz-min-content;\n min-width: min-content;\n max-width: -moz-max-content;\n max-width: max-content;\n margin: 5px;\n}\n.Chip-module_Chip__HWK4W span {\n margin: 0px 2px;\n width: -moz-max-content;\n width: max-content;\n max-width: 10em;\n text-overflow: ellipsis;\n}\n.Chip-module_Chip__HWK4W button {\n font-size: 1rem !important;\n height: -moz-min-content;\n height: min-content;\n margin: auto 0px;\n padding: 0px 4px !important;\n margin-left: 5px !important;\n border-radius: 8px;\n}\n\n.Chip-module_removeChipButton__kl1mU {\n margin: 0 !important;\n margin-left: 5px !important;\n padding: 0 !important;\n font-size: 1rem !important;\n}\n\n.Chip-module_hover__fvVQS:hover {\n cursor: pointer;\n}\n\n.Chip-module_tertiary__TtdnV {\n background-color: inherit;\n color: var(--on-container-color, #000);\n border: 1px solid var(--primary-color, #4CAF50);\n margin-right: 6px;\n}\n.Chip-module_tertiary__TtdnV button {\n background-color: inherit;\n color: var(--on-container-color, #000);\n font-weight: 700;\n}");export{t as default};
2
+ //# sourceMappingURL=Chip.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chip.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{effect as r,insert as e,createComponent as t,className as l,use as n,memo as i,template as o}from"solid-js/web";import{createSignal as c,onMount as h,onCleanup as s,Show as d,For as u}from"solid-js";import a from"./chipbar.module.scss.js";import{Chip as v}from"../Chip/Chip.js";import{Button as p}from"../Button/Button.js";var g=o("<span>"),f=o("<div><div>");function m(o){const m=void 0!==o.chips,[w,A]=c(),[C,L]=c(!1),[j,$]=c(!1),y=r=>{w()&&($(w()?.scrollLeft!==w().scrollWidth-w().clientWidth),L(w().scrollLeft>0),w().scrollLeft<=0&&L(!1))};h(()=>{w()&&w().addEventListener("scroll",y)}),s(()=>{w()&&w().removeEventListener("scroll",y)}),r(()=>{Array.isArray(o.children)?o.children.length>0&&y():o?.chips?.(),y()});const b=()=>{w().scrollLeft-=100,y()},k=()=>{w().scrollLeft+=100,y(),L(!0)};return B=f(),D=B.firstChild,e(B,t(d,{get when(){return C()},get children(){var n=g();return e(n,t(p,{onMouseDown:b,children:"←"})),r(()=>l(n,`${a.leftArrow}`)),n}}),D),n(A,D),e(D,t(d,{get when(){return i(()=>!0)()&&(m||!m&&void 0!==o.clearAll)},get children(){var r=g();return e(r,t(p,{onClick:()=>{m?o.setChips([]):o.clearAll&&o.clearAll([])},children:"Clear All"})),r}}),null),e(D,t(d,{get when(){return!0},get children(){return[t(d,{when:m,get children(){return t(u,{get each(){return o.chips()},children:(r,e)=>t(v,{get key(){return r?.key??`${r}`},get value(){return r?.value},remove:()=>o.setChips(r=>[...r].filter((r,t)=>t!==e()))})})}}),t(d,{when:!m,get children(){return o.children}})]}}),null),e(B,t(d,{get when(){return j()},get children(){var n=g();return e(n,t(p,{onMouseDown:k,children:"→"})),r(()=>l(n,`${a.rightArrow}`)),n}}),null),r(r=>{var e=`${a.chipbar}`,t=`${a.chipContainer}`;return e!==r.e&&l(B,r.e=e),t!==r.t&&l(D,r.t=t),r},{e:void 0,t:void 0}),B;var B,D}export{m as Chipbar};
2
+ //# sourceMappingURL=chipbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chipbar.js","sources":["../../../src/components/Chipbar/chipbar.tsx"],"sourcesContent":["import { Accessor, Component, createSignal, For, JSX, onCleanup, onMount, Setter, Show } from \"solid-js\";\n// @ts-ignore\nimport style from \"./chipbar.module.scss\";\n// import type ChipType from \"../../models/chip\";\nimport { Chip } from \"../Chip/Chip\";\nimport Button from \"../Button/Button\";\nimport { effect } from \"solid-js/web\";\nexport interface ChipType {\n key: string;\n value: string;\n}\ninterface Props {\n chips: Accessor<ChipType[]>;\n setChips?: Setter<ChipType[]>;\n}\ninterface InsideChipsProps{\n children: JSX.Element[] | JSX.Element;\n clearAll?: Setter<any[]>;\n}\n// Single union signature: babel-preset-solid rewrites this `function Chipbar` into\n// `var Chipbar = _$$component(...)`, which orphans TS overload signatures and breaks\n// vite 8's Oxc transformer. Runtime already discriminates the two shapes via `hasSignalChips`.\nfunction Chipbar(props: Props | InsideChipsProps): JSX.Element {\n const hasSignalChips = (props as Props).chips !== undefined;\n const [chipContainer, setChipContainer] = createSignal<HTMLDivElement>();\n const [showLeft, setShowLeft] = createSignal(false);\n const [showRight, setShowRight] = createSignal(false);\n const scrollFunction = (e: any) => {\n if (chipContainer()) {\n setShowRight(chipContainer()?.scrollLeft !== chipContainer()!.scrollWidth - chipContainer()!.clientWidth);\n setShowLeft(chipContainer()!.scrollLeft > 0);\n if (chipContainer()!.scrollLeft <= 0) {\n setShowLeft(false);\n }\n }\n }\n const hasChips = ()=> true;\n const clearAll = () => {\n if (hasSignalChips) {\n (props as Props).setChips!([]);\n } else if ((props as InsideChipsProps).clearAll) {\n (props as InsideChipsProps).clearAll!([]);\n }\n }\n onMount(()=>{\n if (chipContainer()) {\n chipContainer()!.addEventListener(\"scroll\", scrollFunction)\n }\n });\n onCleanup(()=>{\n if (chipContainer()) {\n chipContainer()!.removeEventListener(\"scroll\", scrollFunction)\n }\n });\n effect(()=>{\n const isChildArr = Array.isArray((props as InsideChipsProps).children);\n if (isChildArr) {\n if (((props as InsideChipsProps).children as JSX.Element[]).length > 0) {\n scrollFunction(null);\n }\n } else {\n if ((props as Props)?.chips?.()?.length > 0 ) {\n }\n }\n scrollFunction(null);\n });\n const scrollLeft = () => {\n chipContainer()!.scrollLeft -= 100;\n scrollFunction(null);\n }\n const scrollRight = () => {\n chipContainer()!.scrollLeft += 100;\n scrollFunction(null);\n setShowLeft(true);\n }\n return (\n <div class={`${style.chipbar}`}>\n <Show when={showLeft()}>\n <span class={`${style.leftArrow}`}>\n <Button onMouseDown={scrollLeft}>←</Button>\n </span>\n </Show>\n <div ref={setChipContainer} class={`${style.chipContainer}`}>\n <Show when={hasChips() && (hasSignalChips || !hasSignalChips && (props as InsideChipsProps).clearAll !== undefined)}>\n <span>\n <Button onClick={() => hasChips() ? clearAll() : null}>Clear All</Button>\n </span>\n </Show>\n <Show when={hasChips()}>\n <Show when={hasSignalChips}>\n <For each={(props as Props).chips!()}>\n {(chip, i) => (\n <Chip \n key={chip?.key ?? `${chip}`} \n value={chip?.value} \n remove={()=>((props as Props).setChips!((old)=> [...old].filter((x, index)=>index !== i())))} />\n )}\n </For>\n </Show>\n <Show when={!hasSignalChips}>\n {(props as InsideChipsProps).children}\n </Show>\n </Show>\n </div>\n <Show when={showRight()}>\n <span class={`${style.rightArrow}`}>\n <Button onMouseDown={scrollRight}>→</Button>\n </span>\n </Show>\n </div>\n );\n}\nexport { Chipbar };\nexport default Chipbar;"],"names":["Chipbar","props","hasSignalChips","undefined","chips","chipContainer","setChipContainer","createSignal","showLeft","setShowLeft","showRight","setShowRight","scrollFunction","e","scrollLeft","scrollWidth","clientWidth","onMount","addEventListener","onCleanup","removeEventListener","effect","Array","isArray","children","length","scrollRight","_el$","_tmpl$2","_el$3","firstChild","_$insert","_$createComponent","Show","when","_el$2","_tmpl$","Button","onMouseDown","_$effect","_$className","style","leftArrow","_$use","_$memo","clearAll","_el$4","onClick","setChips","For","each","chip","i","Chip","key","value","remove","old","filter","x","index","_el$5","rightArrow","_p$","_v$","chipbar","_v$2","t"],"mappings":"8WAsBA,SAASA,EAAQC,GACf,MAAMC,OAA4CC,IAA1BF,EAAgBG,OACjCC,EAAeC,GAAoBC,KACnCC,EAAUC,GAAeF,GAAa,IACtCG,EAAWC,GAAgBJ,GAAa,GACzCK,EAAkBC,IAClBR,MACFM,EAAaN,KAAiBS,aAAeT,IAAiBU,YAAcV,IAAiBW,aAC7FP,EAAYJ,IAAiBS,WAAa,GACtCT,IAAiBS,YAAc,GACjCL,GAAY,KAYlBQ,EAAQ,KACFZ,KACFA,IAAiBa,iBAAiB,SAAUN,KAGhDO,EAAU,KACJd,KACFA,IAAiBe,oBAAoB,SAAUR,KAGnDS,EAAO,KACcC,MAAMC,QAAStB,EAA2BuB,UAErDvB,EAA2BuB,SAA2BC,OAAS,GACnEb,IAGGX,GAAiBG,UAGxBQ,MAEF,MAAME,EAAaA,KACjBT,IAAiBS,YAAc,IAC/BF,KAEIc,EAAcA,KAClBrB,IAAiBS,YAAc,IAC/BF,IACAH,GAAY,IAEd,OAAAkB,EAAAC,IAAAC,EAAAF,EAAAG,WAAAC,EAAAJ,EAAAK,EAEKC,EAAI,CAAA,QAACC,GAAI,OAAE1B,GAAU,EAAA,YAAAgB,GAAA,IAAAW,EAAAC,IACa,OADbL,EAAAI,EAAAH,EAEjBK,EAAM,CAACC,YAAaxB,EAAUU,SAAA,OAAAe,EAAA,IAAAC,EAAAL,EADpB,GAAGM,EAAMC,cAAWP,CAAA,IAAAN,GAAAc,EAIzBrC,EAAgBuB,GAAAE,EAAAF,EAAAG,EACvBC,EAAI,CAAA,QAACC,GAAI,OAAEU,EAAA,KAAA,EAAAA,KAAe1C,IAAmBA,QAA2DC,IAAxCF,EAA2B4C,SAAuB,EAAA,YAAArB,GAAA,IAAAsB,EAAAV,IAE1D,OAF0DL,EAAAe,EAAAd,EAE9GK,EAAM,CAACU,QAASA,KA/CrB7C,EACDD,EAAgB+C,SAAU,IACjB/C,EAA2B4C,UACpC5C,EAA2B4C,SAAU,KA4CqBrB,SAAA,eAAAsB,CAAA,IAAA,MAAAf,EAAAF,EAAAG,EAGxDC,EAAI,CAAA,QAACC,GAAI,OApDM,CAoDM,EAAA,YAAAV,GAAA,MAAA,CAAAQ,EACnBC,EAAI,CAACC,KAAMhC,EAAc,YAAAsB,GAAA,OAAAQ,EACvBiB,EAAG,CAAA,QAACC,GAAI,OAAGjD,EAAgBG,OAAQ,EAAAoB,SACjCA,CAAC2B,EAAMC,IAACpB,EACNqB,EAAI,CAAA,OACHC,GAAG,OAAEH,GAAMG,KAAO,GAAGH,GAAM,EAAA,SAC3BI,GAAK,OAAEJ,GAAMI,KAAK,EAClBC,OAAQA,IAAMvD,EAAgB+C,SAAWS,GAAO,IAAIA,GAAKC,OAAO,CAACC,EAAGC,IAAQA,IAAUR,SACzF,IAAApB,EAGJC,EAAI,CAACC,MAAOhC,EAAc,YAAAsB,GAAA,OACvBvB,EAA2BuB,QAAQ,IAAA,IAAA,MAAAO,EAAAJ,EAAAK,EAI1CC,EAAI,CAAA,QAACC,GAAI,OAAExB,GAAW,EAAA,YAAAc,GAAA,IAAAqC,EAAAzB,IACa,OADbL,EAAA8B,EAAA7B,EAElBK,EAAM,CAACC,YAAaZ,EAAWF,SAAA,OAAAe,EAAA,IAAAC,EAAAqB,EADrB,GAAGpB,EAAMqB,eAAYD,CAAA,IAAA,MAAAtB,EAAAwB,IAAA,IAAAC,EA7B1B,GAAGvB,EAAMwB,UAASC,EAMO,GAAGzB,EAAMpC,gBAAe,OAAA2D,IAAAD,EAAAlD,GAAA2B,EAAAb,EAAAoC,EAAAlD,EAAAmD,GAAAE,IAAAH,EAAAI,GAAA3B,EAAAX,EAAAkC,EAAAI,EAAAD,GAAAH,GAAA,CAAAlD,OAAAV,EAAAgE,OAAAhE,IAAAwB,EAP/D,IAAAA,EAAAE,CAoCF"}
@@ -0,0 +1,2 @@
1
+ import n from"../../styleInject.js";var i={chipbar:"chipbar-module_chipbar__PjssB",chipContainer:"chipbar-module_chipContainer__lnYfX",leftArrow:"chipbar-module_leftArrow__OS8vV",rightArrow:"chipbar-module_rightArrow__T4ubJ"};n(".chipbar-module_chipbar__PjssB {\n display: flex;\n flex-direction: row;\n min-width: 100%;\n width: -moz-max-content;\n width: max-content;\n max-width: 100%;\n padding: var(--spacing-1, 8px) 0px;\n border-bottom: 1px solid var(--on-background, white);\n}\n\n.chipbar-module_chipContainer__lnYfX {\n display: flex;\n flex-direction: row;\n overflow-x: hidden;\n scroll-behavior: smooth;\n flex-grow: 1;\n}\n.chipbar-module_chipContainer__lnYfX span {\n height: -moz-min-content;\n height: min-content;\n margin: auto 0px;\n}\n.chipbar-module_chipContainer__lnYfX span button {\n width: -moz-max-content;\n width: max-content;\n padding: 5px;\n}\n\n.chipbar-module_leftArrow__OS8vV {\n margin-right: 10px;\n align-self: flex-start;\n margin: auto 0px;\n}\n\n.chipbar-module_rightArrow__T4ubJ {\n margin-left: 10px;\n align-self: flex-end;\n margin: auto 0px;\n}");export{i as default};
2
+ //# sourceMappingURL=chipbar.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chipbar.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{spread as s,mergeProps as o,insert as r,template as t}from"solid-js/web";import{splitProps as c}from"solid-js";import e from"./body.module.scss.js";var l=t("<div>");const d=t=>{const[d,i]=c(t,["children","class","style"]);return m=l(),s(m,o(i,{get class(){return`${e.compBody} ${d.class??""}`}}),!1,!0),r(m,()=>d.children),m;var m};export{d as Body};
2
+ //# sourceMappingURL=body.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.component.js","sources":["../../../src/components/ComponentBody/body.component.tsx"],"sourcesContent":["import { Component, createMemo, JSX, splitProps } from \"solid-js\";\n// @ts-ignore\nimport styles from './body.module.scss';\nimport { CSSModuleClasses } from \"../cssmodule\";\n\ninterface Props extends JSX.HTMLAttributes<HTMLDivElement> {\n children: JSX.Element | JSX.Element[];\n class?: CSSModuleClasses[string];\n style?: 'primary' | 'accent' | 'tertiary';\n}\nexport const Body: Component<Props> = (props) => {\n const [customProps, normalProps] = splitProps(props, [\"children\", \"class\", 'style']);\n return (\n <div {...normalProps} class={`${styles.compBody} ${customProps.class ?? \"\"}`}>\n {customProps.children}\n </div>\n )\n}"],"names":["Body","props","customProps","normalProps","splitProps","_el$","_tmpl$","_$spread","_$mergeProps","styles","compBody","class","_$insert","children"],"mappings":"4KAUO,MAAMA,EAA0BC,IACrC,MAAOC,EAAaC,GAAeC,EAAWH,EAAO,CAAC,WAAY,QAAS,UAC3E,OAAAI,EAAAC,IAAAC,EAAAF,EAAAG,EACWL,EAAW,CAAA,SAAA,GAAA,MAAS,GAAGM,EAAOC,YAAYR,EAAYS,OAAS,IAAI,KAAA,GAAA,GAAAC,EAAAP,EAAA,IACzEH,EAAYW,UAAQR,EAFzB,IAAAA"}
@@ -0,0 +1,2 @@
1
+ import o from"../../styleInject.js";var d={compBody:"body-module_compBody__d3HyU"};o(".body-module_compBody__d3HyU {\n width: 70%;\n margin: 0 auto;\n border-radius: 15px;\n padding: 8px;\n padding-top: 0px;\n background-color: var(--surface-color, #EEEEEE);\n color: var(--on-surface-color, #000000);\n}\n@media screen and (max-width: 768px) {\n .body-module_compBody__d3HyU {\n width: 95%;\n margin: 0 auto;\n }\n}");export{d as default};
2
+ //# sourceMappingURL=body.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{spread as r,mergeProps as s,insert as e,template as o}from"solid-js/web";import{splitProps as t}from"solid-js";import c from"./container.module.scss.js";var i=o("<div>");const m=o=>{const[m,l]=t(o,["children","class","theme"]);return n=i(),r(n,s(l,{get class(){return`${c[m.theme]} ${m.class}`}}),!1,!0),e(n,()=>m.children),n;var n};export{m as Container};
2
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sources":["../../../src/components/Container/container.tsx"],"sourcesContent":["import { Component, JSX, splitProps } from \"solid-js\";\n// @ts-ignore\nimport styles from './container.module.scss';\n\nexport type ThemeVariables = \"primary\" | \"primaryVariant\" | \"secondary\" | \"secondaryVariant\" | \"background\" | \"surface\" | \"surfaceVariant\" | \"container\" | \"error\" | \"header\" | \"subheader\";\nexport type BorderThemeVariables = \"borderPrimary\" | \"borderSecondary\" | \"borderError\" | \"borderSurface\" | \"borderSurfaceVariant\" | \"borderContainer\" | \"borderBackground\" | \"none\";\n\ninterface ContainerProps extends JSX.HTMLAttributes<HTMLDivElement> {\n theme: ThemeVariables;\n children: JSX.Element | JSX.Element[] | undefined;\n}\nexport const Container: Component<ContainerProps> = (props) => {\n const [local, other] = splitProps(props, [\"children\", \"class\", \"theme\"]);\n return (\n <div {...other} class={`${styles[local.theme]} ${local.class}`} >\n {local.children}\n </div>\n );\n}"],"names":["Container","props","local","other","splitProps","_el$","_tmpl$","_$spread","_$mergeProps","styles","theme","class","_$insert","children"],"mappings":"iLAWO,MAAMA,EAAwCC,IACnD,MAAOC,EAAOC,GAASC,EAAWH,EAAO,CAAC,WAAY,QAAS,UAC/D,OAAAI,EAAAC,IAAAC,EAAAF,EAAAG,EACWL,EAAK,CAAA,SAAA,GAAA,MAAS,GAAGM,EAAOP,EAAMQ,UAAUR,EAAMS,OAAO,KAAA,GAAA,GAAAC,EAAAP,EAAA,IAC3DH,EAAMW,UAAQR,EAFnB,IAAAA"}
@@ -0,0 +1,2 @@
1
+ import r from"../../styleInject.js";var o={primary:"container-module_primary__EvZuR",primaryVariant:"container-module_primaryVariant__lC3Dg",secondary:"container-module_secondary__-ywDW",secondaryVariant:"container-module_secondaryVariant__E7Gxe",background:"container-module_background__TT8pn",surface:"container-module_surface__59oDI",surfaceVariant:"container-module_surfaceVariant__S9Pyg",container:"container-module_container__Xfc8t",error:"container-module_error__anU8a",header:"container-module_header__2SLww",subheader:"container-module_subheader__Y2LUC"};r(".container-module_primary__EvZuR {\n background-color: var(--primary-color, #4CAF50);\n color: var(--on-primary-color, #fff);\n fill: var(--on-primary-color, #fff);\n}\n\n.container-module_primaryVariant__lC3Dg {\n background-color: var(--primary-color-varient, #43A047);\n color: var(--on-primary-color, #fff);\n fill: var(--on-primary-color, #fff);\n}\n\n.container-module_secondary__-ywDW {\n background-color: var(--secondary-color, #14b9c3);\n color: var(--on-secondary-color, #000000);\n fill: var(--on-secondary-color, #000000);\n}\n\n.container-module_secondaryVariant__E7Gxe {\n background-color: var(--secondary-color-varient, #0b969f);\n color: var(--on-secondary-color, #000000);\n fill: var(--on-secondary-color, #000000);\n}\n\n.container-module_background__TT8pn {\n background-color: var(--background-color, #ffffff);\n color: var(--on-background-color, #000000);\n fill: var(--on-background-color, #000000);\n}\n\n.container-module_surface__59oDI {\n background-color: var(--surface-color, #EEEEEE);\n color: var(--on-surface-color, #000000);\n fill: var(--on-surface-color, #000000);\n}\n\n.container-module_surfaceVariant__S9Pyg {\n background-color: var(--surface-color-variant, #ccc);\n color: var(--on-surface-color, #000000);\n fill: var(--on-surface-color, #000000);\n}\n\n.container-module_container__Xfc8t {\n background-color: var(--container-color, #ffffff);\n color: var(--on-container-color, #000);\n fill: var(--on-container-color, #000);\n}\n\n.container-module_error__anU8a {\n background-color: var(--error-color, #B00020);\n color: var(--on-error-color, #ffffff);\n fill: var(--on-error-color, #ffffff);\n}\n\n.container-module_header__2SLww {\n background-color: var(--header-background-color, #2E7D32);\n color: var(--header-on-background-color, #fff);\n fill: var(--header-on-background-color, #fff);\n height: 50px;\n}\n.container-module_header__2SLww a {\n color: var(--header-on-background-color, #fff);\n}\n\n.container-module_subheader__Y2LUC {\n background-color: var(--subheader-background-color, #388E3C);\n color: var(--subheader-on-background-color, #fff);\n fill: var(--subheader-on-background-color, #fff);\n height: 38px;\n}");export{o as default};
2
+ //# sourceMappingURL=container.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{createComponent as r,use as t,insert as e,template as o}from"solid-js/web";import{createContext as n,useContext as a,createSignal as i,createEffect as s,onCleanup as u,untrack as m}from"solid-js";import{createStore as c,unwrap as f}from"solid-js/store";import{valuesEqual as d}from"./formGroup.js";import{FormArray as l}from"./formHelp/formArray.js";import{CloneStore as v}from"../../tools/tools.js";var p=o("<form>");const h=n(),b=()=>a(h),y=t=>{if(t.data instanceof l){const e=t.data;return r(G,{formArray:e,get children(){return r(A,{get onSubmit(){return t.onSubmit},get children(){return t.children},formArray:e})}})}const e=t.data,o=e.get()??{},n={};return Object.keys(o).forEach(r=>{n[r]=o[r]}),r(j,{value:n,formGroup:e,get children(){return r(g,{data:e,get onSubmit(){return t.onSubmit},get children(){return t.children}})}})},g=r=>{const[o,n]=i(),a=b(),m=async t=>{t.preventDefault();const e=v(a?.data??{});await(a.formGroup?.validateAsync())&&r?.onSubmit?.(e)};return s(()=>{o()?.addEventListener("submit",m)}),u(()=>{o()?.removeEventListener("submit",m)}),c=p(),t(n,c),e(c,()=>r.children),c;var c},A=r=>{const[o,n]=i(),a=async t=>{t.preventDefault(),await r.formArray.validateAsync()&&r.onSubmit(r.formArray.get())};return s(()=>{o()?.addEventListener("submit",a)}),u(()=>{o()?.removeEventListener("submit",a)}),m=p(),t(n,m),e(m,()=>r.children),m;var m},j=t=>{const e=t.value??{},[o,n]=c(e);return s(()=>{const r=t.formGroup._unsafeRaw(),e=[];for(const t in r)e.push([t,r[t]]);m(()=>{for(const[r,t]of e){t&&"object"==typeof t&&!(t instanceof l)?d(f(o[r]),f(t))||n(r,v(t)):o[r]!==t&&n(r,t)}})}),r(h.Provider,{get value(){return{data:o,setData:n,formGroup:t.formGroup}},get children(){return t.children}})},G=t=>{const[e,o]=c({});return r(h.Provider,{get value(){return{data:e,setData:o,formArray:t.formArray}},get children(){return t.children}})};export{y as Form,b as useFormContext};
2
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sources":["../../../src/components/Form/form.tsx"],"sourcesContent":["import { createContext, createEffect, createSignal, JSX, onCleanup, untrack, useContext, } from \"solid-js\"\nimport { createStore, SetStoreFunction, unwrap } from \"solid-js/store\";\nimport { FormGroup, valuesEqual } from \"./formGroup\";\nimport { FormArray } from \"./formHelp/formArray\";\nimport { CloneStore } from \"../../tools\";\n\ninterface FormContext<T extends object> {\n data: T;\n setData: SetStoreFunction<T>;\n formGroup?: FormGroup<T>;\n formArray?: FormArray<any>;\n}\nconst FormContext = createContext<FormContext<object | any>>();\nexport const useFormContext = <T extends object = any,>() => {\n return useContext(FormContext) as FormContext<T>;\n};\n\ninterface Props<T extends object> {\n data: FormGroup<T> | FormArray<T>;\n children: JSX.Element;\n onSubmit: (data: T | T[]) => void;\n}\n\nexport const Form = <T extends object>(props: Props<T>) => {\n if (props.data instanceof FormArray) {\n const fa = props.data as FormArray<T>;\n return (\n <ArrayProvider<T> formArray={fa}>\n <FormInnerArray onSubmit={props.onSubmit} children={props.children} formArray={fa} />\n </ArrayProvider>\n );\n }\n\n const fg = props.data as FormGroup<T>;\n const startData = fg.get() ?? {};\n // Custom shallow clone preserving FormArray instances (already handled in FormGroup.get)\n const initialValue: any = {};\n Object.keys(startData as any).forEach(k => {\n (initialValue as any)[k] = (startData as any)[k];\n });\n return (\n <Provider<T> value={initialValue} formGroup={fg}>\n <FormInner data={fg} onSubmit={props.onSubmit} children={props.children} />\n </Provider>\n )\n};\n\nconst FormInner = <T extends object>(props: Props<T>) => {\n const [formRef, setFormRef] = createSignal<HTMLFormElement>();\n const formData = useFormContext<T>();\n const submitFunction = async (e: Event) => {\n e.preventDefault();\n const submitData = CloneStore(formData?.data ?? {});\n // Use validateAsync so async validators are actually enforced before submit\n // (sync validate() optimistically treats pending async validators as passing).\n if (await formData.formGroup?.validateAsync()) {\n props?.onSubmit?.(submitData);\n }\n };\n createEffect(() => {\n formRef()?.addEventListener('submit', submitFunction);\n });\n onCleanup(() => {\n formRef()?.removeEventListener('submit', submitFunction);\n })\n\n return (\n <form ref={setFormRef}>\n {props.children}\n </form>\n )\n};\n\ninterface FormInnerArrayProps<T extends object> {\n formArray: FormArray<T>;\n children: JSX.Element;\n onSubmit: (data: T[]) => void;\n}\n\nconst FormInnerArray = <T extends object>(props: FormInnerArrayProps<T>) => {\n const [formRef, setFormRef] = createSignal<HTMLFormElement>();\n const submitFunction = async (e: Event) => {\n e.preventDefault();\n // Await async validators (see FormInner) before submitting the array data.\n if (await props.formArray.validateAsync()) {\n props.onSubmit(props.formArray.get());\n }\n };\n createEffect(() => {\n formRef()?.addEventListener('submit', submitFunction);\n });\n onCleanup(() => {\n formRef()?.removeEventListener('submit', submitFunction);\n });\n\n return (\n <form ref={setFormRef}>\n {props.children}\n </form>\n )\n};\n\ninterface FormProvider<T extends object> {\n value: T;\n children: JSX.Element;\n formGroup: FormGroup<T>;\n}\nconst Provider = <T extends object,>(props: FormProvider<T>) => {\n const defaultData = props.value as T ?? {};\n const [data, setData] = createStore<T>(defaultData);\n // Bridge: mirror the FormGroup store into the FormContext store so programmatic\n // calls to formGroup.set(...) propagate into bound fields. Reads of `raw` stay\n // tracked; all `data` access is wrapped in untrack so this effect never depends\n // on the store it writes — that self-dependency caused a \"too much recursion\"\n // reactive loop (the effect re-dirtied itself on every setData).\n // NOTE: top-level-only diffing is correct because FormGroup.set/reset always\n // replace a whole top-level key with a fresh reference.\n createEffect(() => {\n const raw = props.formGroup._unsafeRaw(); // reactive read of underlying store\n const snapshot: [string, any][] = [];\n for (const k in raw as any) snapshot.push([k, (raw as any)[k]]); // tracked reads\n untrack(() => {\n for (const [k, nextVal] of snapshot) {\n // Plain objects/arrays are cloned at the boundary so the context store never\n // shares references with the FormGroup's internal store (a mutation of one\n // would otherwise silently mutate the other). FormArray instances and\n // primitives pass through by reference. The structural compare (valuesEqual,\n // which handles key order / Date / NaN / undefined unlike JSON.stringify)\n // prevents a wasteful re-clone on every sync.\n const isPlainObject = nextVal && typeof nextVal === 'object' && !(nextVal instanceof FormArray);\n if (isPlainObject) {\n if (!valuesEqual(unwrap((data as any)[k]), unwrap(nextVal))) {\n setData(k as any, CloneStore(nextVal));\n }\n } else if ((data as any)[k] !== nextVal) {\n setData(k as any, nextVal);\n }\n }\n });\n });\n return (\n <FormContext.Provider value={{ data, setData, formGroup: props.formGroup }}>\n {props.children}\n </FormContext.Provider>\n )\n}\n\nconst ArrayProvider = <T extends object>(props: { formArray: FormArray<T>; children: JSX.Element }) => {\n const [data, setData] = createStore<T>({} as T);\n return (\n <FormContext.Provider value={{ data, setData, formArray: props.formArray }}>\n {props.children}\n </FormContext.Provider>\n );\n};\n"],"names":["FormContext","createContext","useFormContext","useContext","Form","props","data","FormArray","fa","_$createComponent","ArrayProvider","formArray","children","FormInnerArray","onSubmit","fg","startData","get","initialValue","Object","keys","forEach","k","Provider","value","formGroup","FormInner","formRef","setFormRef","createSignal","formData","submitFunction","async","e","preventDefault","submitData","CloneStore","validateAsync","createEffect","addEventListener","onCleanup","removeEventListener","_el$","_tmpl$","_$use","_$insert","_el$2","defaultData","setData","createStore","raw","_unsafeRaw","snapshot","push","untrack","nextVal","valuesEqual","unwrap"],"mappings":"yaAYA,MAAMA,EAAcC,IACPC,EAAiBA,IACrBC,EAAWH,GASPI,EAA0BC,IACrC,GAAIA,EAAMC,gBAAgBC,EAAW,CACnC,MAAMC,EAAKH,EAAMC,KACjB,OAAAG,EACGC,EAAa,CAAIC,UAAWH,EAAE,YAAAI,GAAA,OAAAH,EAC5BI,EAAc,CAAA,YAACC,GAAQ,OAAET,EAAMS,QAAQ,EAAA,YAAEF,GAAQ,OAAEP,EAAMO,QAAQ,EAAED,UAAWH,GAAE,GAGvF,CAEA,MAAMO,EAAKV,EAAMC,KACXU,EAAYD,EAAGE,OAAS,CAAA,EAExBC,EAAoB,CAAA,EAI1B,OAHAC,OAAOC,KAAKJ,GAAkBK,QAAQC,IACnCJ,EAAqBI,GAAMN,EAAkBM,KAEhDb,EACGc,EAAQ,CAAIC,MAAON,EAAcO,UAAWV,EAAE,YAAAH,GAAA,OAAAH,EAC5CiB,EAAS,CAACpB,KAAMS,EAAE,YAAED,GAAQ,OAAET,EAAMS,QAAQ,EAAA,YAAEF,GAAQ,OAAEP,EAAMO,QAAQ,GAAA,KAKvEc,EAA+BrB,IACnC,MAAOsB,EAASC,GAAcC,IACxBC,EAAW5B,IACX6B,EAAiBC,UACrBC,EAAEC,iBACF,MAAMC,EAAaC,EAAWN,GAAUxB,MAAQ,CAAA,SAGtCwB,EAASL,WAAWY,kBAC5BhC,GAAOS,WAAWqB,IAUtB,OAPAG,EAAa,KACXX,KAAWY,iBAAiB,SAAUR,KAExCS,EAAU,KACRb,KAAWc,oBAAoB,SAAUV,KAG3CW,EAAAC,IAAAC,EACahB,EAAUc,GAAAG,EAAAH,EAAA,IAClBrC,EAAMO,UAAQ8B,EAFnB,IAAAA,GAaI7B,EAAoCR,IACxC,MAAOsB,EAASC,GAAcC,IACxBE,EAAiBC,UACrBC,EAAEC,uBAEQ7B,EAAMM,UAAU0B,iBACxBhC,EAAMS,SAAST,EAAMM,UAAUM,QAUnC,OAPAqB,EAAa,KACXX,KAAWY,iBAAiB,SAAUR,KAExCS,EAAU,KACRb,KAAWc,oBAAoB,SAAUV,KAG3Ce,EAAAH,IAAAC,EACahB,EAAUkB,GAAAD,EAAAC,EAAA,IAClBzC,EAAMO,UAAQkC,EAFnB,IAAAA,GAYIvB,EAA+BlB,IACnC,MAAM0C,EAAc1C,EAAMmB,OAAc,CAAA,GACjClB,EAAM0C,GAAWC,EAAeF,GA+BvC,OAvBAT,EAAa,KACX,MAAMY,EAAM7C,EAAMoB,UAAU0B,aACtBC,EAA4B,GAClC,IAAK,MAAM9B,KAAK4B,EAAYE,EAASC,KAAK,CAAC/B,EAAI4B,EAAY5B,KAC3DgC,EAAQ,KACN,IAAK,MAAOhC,EAAGiC,KAAYH,EAAU,CAObG,GAA8B,iBAAZA,KAA0BA,aAAmBhD,GAE9EiD,EAAYC,EAAQnD,EAAagB,IAAKmC,EAAOF,KAChDP,EAAQ1B,EAAUc,EAAWmB,IAErBjD,EAAagB,KAAOiC,GAC9BP,EAAQ1B,EAAUiC,EAEtB,MAGJ9C,EACGT,EAAYuB,SAAQ,CAAA,SAACC,GAAK,MAAE,CAAElB,OAAM0C,UAASvB,UAAWpB,EAAMoB,UAAW,EAAA,YAAAb,GAAA,OACvEP,EAAMO,QAAQ,KAKfF,EAAmCL,IACvC,MAAOC,EAAM0C,GAAWC,EAAe,CAAA,GACvC,OAAAxC,EACGT,EAAYuB,SAAQ,CAAA,SAACC,GAAK,MAAE,CAAElB,OAAM0C,UAASrC,UAAWN,EAAMM,UAAW,EAAA,YAAAC,GAAA,OACvEP,EAAMO,QAAQ"}
@@ -2,6 +2,13 @@ import { Error as FormError, FormGroupData, ValidatorResult, ControlMeta } from
2
2
  import { Accessor } from "solid-js";
3
3
  export { FormArray } from "./formHelp/formArray";
4
4
  export { Validators } from "./formHelp/validators";
5
+ /**
6
+ * Structural, key-order-insensitive equality used for dirty tracking. Unlike a
7
+ * `JSON.stringify` comparison it does not flag a field dirty just because an
8
+ * object's keys were inserted in a different order, and it treats NaN/Dates
9
+ * correctly. Behaviourally equivalent to the old check for primitives & arrays.
10
+ */
11
+ export declare function valuesEqual(a: any, b: any): boolean;
5
12
  /**
6
13
  * Represents a group of form controls and manages their state, validation, and errors.
7
14
  *
@@ -0,0 +1,2 @@
1
+ import{createStore as t}from"solid-js/store";import{CloneStore as r,Clone as a,isNullish as e}from"../../tools/tools.js";import{createMemo as i,createSignal as n,untrack as s}from"solid-js";import{FormArray as o}from"./formHelp/formArray.js";function l(t,r){if(t===r)return!0;if("number"==typeof t&&"number"==typeof r)return Number.isNaN(t)&&Number.isNaN(r);if(t instanceof Date||r instanceof Date)return t instanceof Date&&r instanceof Date&&t.getTime()===r.getTime();if(null===t||null===r||"object"!=typeof t||"object"!=typeof r)return!1;if(Array.isArray(t)!==Array.isArray(r))return!1;const a=Object.keys(t),e=Object.keys(r);return a.length===e.length&&a.every(a=>Object.prototype.hasOwnProperty.call(r,a)&&l(t[a],r[a]))}class h{validators={};meta={};keys=[];fieldChangeValue=t=>i(()=>{const a=this.internalDataSignal[0][t];return a instanceof o?a.get():r(a)});constructor(a){this.data=a;const e={},s={},l={};for(const t in a){const i=a[t];this.keys.push(t),i instanceof o?e[t]=i:(e[t]=r(i[0]),s[t]=i[1],l[t]=i[1].map(t=>({key:t.errKey,hasError:!1})));const n=i instanceof o?i.get():r(e[t]);this.meta[t]={touched:!1,dirty:!1,initialValue:n}}this.internalDataSignal=t(e),this.validators=s,this.errors=n(l),this.formChangeValue=i(()=>{const t=this.internalDataSignal[0];return this.keys.reduce((a,e)=>{const i=t[e];return a[e]=i instanceof o?i.get():r(i),a},{})})}_unsafeRaw(){return this.internalDataSignal[0]}get(t){if(!t){const t={};for(const a of this.keys){const e=this.internalDataSignal[0][a];t[a]=e instanceof o?e:r(e)}return t}return this.internalDataSignal[0][t]instanceof o?this.internalDataSignal[0][t].get():r(this.internalDataSignal[0][t])}getR(t){return this.internalDataSignal[0][t]instanceof o?this.internalDataSignal[0][t].get():this.internalDataSignal[0][t]}getArrayItem(t,r){if(this.internalDataSignal[0][t]instanceof o)return this.internalDataSignal[0][t].getAt(r)}hasValidator(t,r){return this.internalDataSignal[0][t]instanceof o?this.internalDataSignal[0][t].hasAnyValidator(r):this.errors[0]()?.[t]?.some(t=>t.key===r)??!1}getErrors(t){return this.internalDataSignal[0][t]instanceof o?[]:this.errors[0]()?.[t]??[]}hasError(t){return this.internalDataSignal[0][t]instanceof o?this.internalDataSignal[0][t].hasError():this.errors[0]()?.[t]?.some(t=>t.hasError)??!1}setError(t,r,e){s(()=>{if(this.internalDataSignal[0][t]instanceof o)return;const i=this.errors[0](),n=i[t]??[];let s=n.findIndex(t=>t.key===r);-1===s?n.push({key:r,hasError:e}):n[s].hasError=e,i[t]=n,this.errors[1](()=>a(i))})}addValidator(t,r){this.validators[t]||(this.validators[t]=[]),this.validators[t].push(r),this.setError(t,r.errKey,!1)}removeValidator(t,r){this.validators[t]&&(this.validators[t]=this.validators[t].filter(t=>t.errKey!==r),s(()=>{const e=this.errors[0]();e[t]&&(e[t]=e[t].filter(t=>t.key!==r),this.errors[1](()=>a(e)))}))}getMeta(t){return this.meta[t]}markTouched(t){this.meta[t].touched=!0}markDirty(t){this.meta[t].dirty=!0}hasAnyError(){const t=this.errors[0]();for(const r of this.keys){const a=this.internalDataSignal[0][r];if(a instanceof o){if(a.hasError())return!0}else if(t[r]?.some(t=>t.hasError))return!0}return!1}hasAnyValidator(t){for(const r of this.keys){const a=this.internalDataSignal[0][r];if(a instanceof o){if(a.hasAnyValidator(t))return!0}else if(t){if(this.validators[r]?.some(r=>r.errKey===t))return!0}else if(this.validators[r]?.length>0)return!0}return!1}getAllErrors(){const t=this.errors[0](),r=[];for(const a of this.keys)t[a]&&r.push(...t[a]);return r}reset(){s(()=>{for(const t of this.keys){const e=this.meta[t],i=this.internalDataSignal[0][t];i instanceof o?i.reset():this.internalDataSignal[1](t,r(e.initialValue)),e.touched=!1,e.dirty=!1;const n=this.errors[0]();n[t]=n[t]?.map(t=>({...t,hasError:!1})),this.errors[1](()=>a(n))}})}set(t,a){s(()=>{if(this.internalDataSignal[0][t]instanceof o)return void(Array.isArray(a)&&this.internalDataSignal[0][t].set(a));this.internalDataSignal[1](e=>({...e,[t]:r(a)}));const e=this.meta[t];e&&(e.touched||(e.touched=!0),e.dirty||l(e.initialValue,a)||(e.dirty=!0))})}addToArray(t,r){s(()=>{this.internalDataSignal[0][t]instanceof o&&this.internalDataSignal[0][t].add(r)})}removeFromArray(t,r){s(()=>{this.internalDataSignal[0][t]instanceof o&&this.internalDataSignal[0][t].remove(r)})}validate(t){if(e(this.internalDataSignal?.[0]))return"production"!==process?.env?.NODE_ENV&&console.error("Data is null"),!1;if(!t){return this.keys.map(t=>this.validate(t)).every(Boolean)}if(this.internalDataSignal?.[0]?.[t]instanceof o)return this.internalDataSignal[0][t].validateCurrent();const r=this.validators[t];if(!r)return!0;let a=!0;for(const e of r)try{const r=e.revalidate(this.internalDataSignal[0][t]),i=!!("function"==typeof r?.then)||r,n=e.hide?.(this.internalDataSignal[0][t]);n?this.setError(t,e.errKey,!1):(this.setError(t,e.errKey,!i),i||(a=!1))}catch(r){"production"!==process?.env?.NODE_ENV&&console.warn("Validator threw",e.errKey,r),this.setError(t,e.errKey,!0),a=!1}return a}async validateAsync(t){if(!t){return(await Promise.all(this.keys.map(t=>this.validateAsync(t)))).every(Boolean)}if(this.internalDataSignal?.[0]?.[t]instanceof o)return this.internalDataSignal[0][t].validateCurrent();const r=this.validators[t];if(!r)return!0;let a=!0;for(const e of r)try{const r=await e.revalidate(this.internalDataSignal[0][t]),i=e.hide?.(this.internalDataSignal[0][t]);i?this.setError(t,e.errKey,!1):this.setError(t,e.errKey,!r),r||i||(a=!1)}catch{this.setError(t,e.errKey,!0),a=!1}return a}}export{o as FormArray,h as FormGroup,l as valuesEqual};
2
+ //# sourceMappingURL=formGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formGroup.js","sources":["../../../src/components/Form/formGroup.ts"],"sourcesContent":["import { createStore, SetStoreFunction } from \"solid-js/store\";\nimport { Clone, CloneStore, isNullish } from \"../../tools\";\nimport { FormArray } from \"./formHelp/formArray\";\nimport { Error as FormError, ErrorObject, FormGroupData, ValidatorObject, ValidatorResult, ControlMeta } from \"./formHelp/models\";\nimport { Accessor, createMemo, createSignal, Setter, Signal, untrack } from \"solid-js\";\nexport { FormArray } from \"./formHelp/formArray\";\nexport { Validators } from \"./formHelp/validators\";\n\n/**\n * Structural, key-order-insensitive equality used for dirty tracking. Unlike a\n * `JSON.stringify` comparison it does not flag a field dirty just because an\n * object's keys were inserted in a different order, and it treats NaN/Dates\n * correctly. Behaviourally equivalent to the old check for primitives & arrays.\n */\nexport function valuesEqual(a: any, b: any): boolean {\n if (a === b) return true;\n if (typeof a === 'number' && typeof b === 'number') {\n return Number.isNaN(a) && Number.isNaN(b);\n }\n if (a instanceof Date || b instanceof Date) {\n return a instanceof Date && b instanceof Date && a.getTime() === b.getTime();\n }\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {\n return false;\n }\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n const ka = Object.keys(a);\n const kb = Object.keys(b);\n if (ka.length !== kb.length) return false;\n return ka.every((k) => Object.prototype.hasOwnProperty.call(b, k) && valuesEqual(a[k], b[k]));\n}\n\n/**\n * Represents a group of form controls and manages their state, validation, and errors.\n *\n * @template T - The shape of the form's data, where each property corresponds to a form control.\n */\nexport class FormGroup<T extends object> {\n\n private internalDataSignal: [T, SetStoreFunction<T>];\n\n private validators: ValidatorObject<T> = {};\n\n private errors: Signal<ErrorObject<T>>;\n private meta: Record<keyof T, ControlMeta<any>> = {} as any;\n private keys: (keyof T)[] = [];\n\n /** Reactive memo that returns a cloned snapshot of the full form state.\n * FormArray fields resolve via `.get()` (plain array), others via `CloneStore`. */\n public formChangeValue!: Accessor<T>;\n\n /** Returns a per-field reactive accessor. Each call creates an independent memo. */\n public fieldChangeValue = <K extends keyof T>(key: K): Accessor<T[K]> => {\n return createMemo(() => {\n const val = this.internalDataSignal[0][key];\n if (val instanceof FormArray) {\n return val.get() as T[K];\n }\n return CloneStore(val);\n });\n };\n\n constructor(public data: FormGroupData<T>) {\n const newData = {} as T;\n const newValidators = {} as ValidatorObject<T>;\n const newErrors = {} as ErrorObject<T>;\n\n for (const key in data) {\n const value = data[key];\n\n this.keys.push(key);\n if (value instanceof FormArray) {\n newData[key] = value as unknown as T[Extract<keyof T, string>];\n } else {\n // Deep clone initial value so external object mutations after FormGroup construction\n // do not mutate internal reactive store (primitive clone is cheap, objects safeguarded)\n newData[key] = CloneStore(value[0]);\n newValidators[key] = value[1];\n newErrors[key] = value[1].map(validator => ({ key: validator.errKey, hasError: false }));\n }\n const initialVal = value instanceof FormArray ? (value.get() as any) : CloneStore((newData as any)[key]);\n (this.meta as any)[key] = { touched: false, dirty: false, initialValue: initialVal };\n }\n\n this.internalDataSignal = createStore<T>(newData);\n this.validators = newValidators;\n this.errors = createSignal<ErrorObject<T>>(newErrors);\n\n // Initialise formChangeValue here (after internalDataSignal exists) to avoid\n // eager evaluation in Solid dev mode when createMemo is used as a field initialiser.\n this.formChangeValue = createMemo(() => {\n const current = this.internalDataSignal[0];\n return this.keys.reduce((acc, key) => {\n const val = current[key];\n if (val instanceof FormArray) {\n (acc as any)[key] = val.get();\n } else {\n (acc as any)[key] = CloneStore(val);\n }\n return acc;\n }, {} as T);\n });\n }\n\n /**\n * INTERNAL: returns the reactive internal store reference (DO NOT MUTATE outside FormGroup).\n * Used for bridging into FormContext without triggering cloning loops.\n */\n public _unsafeRaw(): T { return this.internalDataSignal[0]; }\n\n /**\n * Gets the current form data or the value of a specific control.\n *\n * @overload\n * @returns A cloned copy of the entire form data.\n *\n * @overload\n * @param key - The key of the control to retrieve.\n * @returns A cloned copy of the value for the specified control.\n */\n public get(): T;\n public get<K extends keyof T>(key: K): T[K];\n public get<K extends keyof T>(key?: K): T[K] | T {\n if (!key) {\n // Custom clone that preserves FormArray instances (structuredClone fails on functions inside)\n const clone: any = {};\n for (const k of this.keys) {\n const val = this.internalDataSignal[0][k];\n if (val instanceof FormArray) {\n clone[k] = val; // keep reference; consumer methods operate on instance\n } else {\n clone[k] = CloneStore(val);\n }\n }\n return clone;\n }\n\n // If the control is a FormArray, use its get method\n if (this.internalDataSignal[0][key] instanceof FormArray) {\n // Return the array from FormArray.get() as the expected type T[K]\n return (this.internalDataSignal[0][key] as unknown as FormArray<ElementType<T[K]> & object>).get() as T[K];\n }\n\n return CloneStore(this.internalDataSignal[0][key]);\n }\n\n /**\n * Gets the current value of a specific control.\n * without cloning the value\n * @param key - The key of the control to retrieve.\n * @returns The value of the specified control.\n */\n public getR<K extends keyof T>(key: K): T[K] {\n\n // If the control is a FormArray, use its get method\n if (this.internalDataSignal[0][key] instanceof FormArray) {\n // Return the array from FormArray.get() as the expected type T[K]\n return (this.internalDataSignal[0][key] as unknown as FormArray<ElementType<T[K]> & object>).get() as T[K];\n }\n\n return this.internalDataSignal[0][key];\n }\n\n /**\n * Gets a specific item from a FormArray at the given index\n * \n * @param key - The key of the form control containing the FormArray\n * @param index - The index to retrieve from the array\n * @returns The item at the specified index, or undefined if not found\n */\n public getArrayItem<K extends keyof T>(key: K, index: number): ElementType<T[K]> | undefined {\n if (this.internalDataSignal[0][key] instanceof FormArray) {\n return (this.internalDataSignal[0][key] as unknown as FormArray<ElementType<T[K]> & object>).getAt(index);\n }\n return undefined;\n }\n\n /**\n * Checks whether a specific validator error exists for a given control.\n *\n * @param key - The key of the form control.\n * @param errKey - The error key to check for.\n * @returns `true` if the error exists, otherwise `false`.\n */\n public hasValidator<K extends keyof T>(key: K, errKey: 'required' | 'minLength' | 'maxLength' | string): boolean {\n if (this.internalDataSignal[0][key] instanceof FormArray) {\n // BUGFIX: previously returned current error state (hasError). Now correctly checks for validator definition presence.\n return (this.internalDataSignal[0][key] as unknown as FormArray<ElementType<T[K]> & object>).hasAnyValidator(errKey);\n }\n return this.errors[0]()?.[key]?.some(error => error.key === errKey) ?? false;\n }\n\n /**\n * Gets all errors for a specific control\n * \n * @param key - The key of the form control\n * @returns An array of errors for the control\n */\n public getErrors<K extends keyof T>(key: K): (typeof this.errors)[0] extends () => infer E ? (E extends Record<K, infer U> ? U : never) : never {\n if (this.internalDataSignal[0][key] instanceof FormArray) {\n return [] as any;\n }\n return (this.errors[0]()?.[key] ?? []) as (typeof this.errors)[0] extends () => infer E ? (E extends Record<K, infer U> ? U : never) : never;\n }\n\n /**\n * Determines if a specific control has any validation errors.\n *\n * @param key - The key of the form control.\n * @returns `true` if any error is present, otherwise `false`.\n */\n public hasError<K extends keyof T>(key: K): boolean {\n if (this.internalDataSignal[0][key] instanceof FormArray) {\n return (this.internalDataSignal[0][key] as unknown as FormArray<ElementType<T[K]> & object>).hasError();\n }\n return this.errors[0]()?.[key]?.some(error => error.hasError) ?? false;\n }\n\n /**\n * Sets an error state for a validator on a specific control\n * \n * @param key - The key of the form control\n * @param errKey - The error key to update\n * @param hasError - Whether the error should be set or cleared\n */\n public setError(key: keyof T, errKey: string, hasError: boolean): void {\n // Imperative: read+write the errors signal (and the data store for the FormArray\n // check) without subscribing the caller — see set() for the rationale.\n untrack(() => {\n if (this.internalDataSignal[0][key] instanceof FormArray) return;\n const current = this.errors[0]();\n const list = current[key] ?? [];\n let index = list.findIndex(e => e.key === errKey);\n if (index === -1) {\n list.push({ key: errKey, hasError });\n } else {\n list[index].hasError = hasError;\n }\n current[key] = list as any;\n this.errors[1](() => Clone(current));\n });\n }\n\n public addValidator<K extends keyof T>(key: K, validator: ValidatorResult<T[K]>): void {\n if (!this.validators[key]) this.validators[key] = [] as any;\n (this.validators[key] as any).push(validator);\n this.setError(key, validator.errKey, false);\n }\n public removeValidator<K extends keyof T>(key: K, errKey: string): void {\n if (!this.validators[key]) return;\n (this.validators[key] as any) = (this.validators[key] as any).filter((v: ValidatorResult<T[K]>) => v.errKey !== errKey);\n // Imperative read+write of the errors signal — keep it untracked (see set()).\n untrack(() => {\n const current = this.errors[0]();\n if (current[key]) {\n current[key] = current[key].filter(e => e.key !== errKey) as any;\n this.errors[1](() => Clone(current));\n }\n });\n }\n public getMeta<K extends keyof T>(key: K) { return (this.meta as any)[key] as ControlMeta<T[K]>; }\n public markTouched<K extends keyof T>(key: K) { (this.meta as any)[key].touched = true; }\n public markDirty<K extends keyof T>(key: K) { (this.meta as any)[key].dirty = true; }\n\n /** Returns true if any field in the group has validation errors. */\n public hasAnyError(): boolean {\n const errs = this.errors[0]();\n for (const k of this.keys) {\n const val = this.internalDataSignal[0][k];\n if (val instanceof FormArray) {\n if ((val as unknown as FormArray<any>).hasError()) return true;\n } else if (errs[k]?.some(e => e.hasError)) {\n return true;\n }\n }\n return false;\n }\n\n /** Returns true if any field has a validator, optionally matching errKey. */\n public hasAnyValidator(errKey?: string): boolean {\n for (const k of this.keys) {\n const val = this.internalDataSignal[0][k];\n if (val instanceof FormArray) {\n if ((val as unknown as FormArray<any>).hasAnyValidator(errKey)) return true;\n } else if (!errKey) {\n if ((this.validators[k] as any)?.length > 0) return true;\n } else {\n if ((this.validators[k] as any)?.some((v: ValidatorResult<any>) => v.errKey === errKey)) return true;\n }\n }\n return false;\n }\n\n /** Returns a flat array of all field errors across the group. */\n public getAllErrors(): FormError[] {\n const errs = this.errors[0]();\n const result: FormError[] = [];\n for (const k of this.keys) {\n if (errs[k]) result.push(...errs[k]);\n }\n return result;\n }\n\n public reset(): void {\n // Imperative: reads + writes both the data store and the errors signal. Untracked\n // so callers (e.g. a reset button handler invoked from a reactive scope) don't\n // subscribe to the stores reset() mutates — see set() for the rationale.\n untrack(() => {\n for (const k of this.keys) {\n const m = (this.meta as any)[k];\n // If control is a FormArray, invoke its own reset to clear dynamic items & errors\n const current = this.internalDataSignal[0][k];\n if (current instanceof FormArray) {\n (current as any).reset();\n } else {\n // Direct store write to avoid triggering meta touched/dirty logic in set()\n this.internalDataSignal[1](k as any, CloneStore(m.initialValue));\n }\n m.touched = false; m.dirty = false;\n const errs = this.errors[0]();\n errs[k] = errs[k]?.map(e => ({ ...e, hasError: false })) as any;\n this.errors[1](() => Clone(errs));\n }\n });\n }\n\n /**\n * Sets a new value for a specified form control.\n *\n * @param key - The key of the form control to update.\n * @param value - The new value to assign to the control.\n */\n public set<K extends keyof T>(key: K, value: T[K]): void {\n // Run untracked: reading internalDataSignal[0][key] (the FormArray branch check)\n // must not subscribe the caller. Otherwise calling set() inside a consumer\n // createEffect/createMemo would subscribe that computation to the very store set()\n // writes — a self-triggering loop (same class of bug as the Form provider bridge).\n untrack(() => {\n // If the control is a FormArray, use its set method\n if (this.internalDataSignal[0][key] instanceof FormArray) {\n if (Array.isArray(value)) {\n (this.internalDataSignal[0][key] as unknown as FormArray<ElementType<T[K]> & object>).set(value as any);\n }\n return;\n }\n // Clone on write to match the construct/read contract: external mutation of the\n // caller's object after set() must not leak into the internal reactive store.\n this.internalDataSignal[1]((old) => ({ ...old, [key]: CloneStore(value) }));\n const m = (this.meta as any)[key];\n if (m) {\n if (!m.touched) m.touched = true;\n if (!m.dirty && !valuesEqual(m.initialValue, value)) m.dirty = true;\n }\n });\n }\n\n /**\n * Adds a FormGroup item to a FormArray control.\n *\n * @param key - The key of the FormArray control\n * @param group - The FormGroup instance to add\n */\n public addToArray<K extends keyof T>(\n key: K,\n group: FormGroup<ElementType<T[K]> & object>\n ): void {\n // Untracked: the store read is only to locate the FormArray to mutate (see set()).\n untrack(() => {\n if (this.internalDataSignal[0][key] instanceof FormArray) {\n (this.internalDataSignal[0][key] as unknown as FormArray<ElementType<T[K]> & object>).add(group);\n }\n });\n }\n\n /**\n * Removes an item from a FormArray control\n * \n * @param key - The key of the FormArray control\n * @param index - The index of the item to remove\n */\n public removeFromArray<K extends keyof T>(key: K, index: number): void {\n // Untracked: the store read is only to locate the FormArray to mutate (see set()).\n untrack(() => {\n if (this.internalDataSignal[0][key] instanceof FormArray) {\n (this.internalDataSignal[0][key] as unknown as FormArray<ElementType<T[K]> & object>).remove(index);\n }\n });\n }\n\n /**\n * Validates the form data.\n *\n * If a key is provided, only that control is validated. If no key is provided, the entire form is validated.\n *\n * @param key - (Optional) The key of the control to validate.\n * @returns `true` if the control(s) pass all validations; otherwise, `false`.\n */\n public validate<K extends keyof T>(key?: K): boolean {\n if (isNullish(this.internalDataSignal?.[0])) {\n if (process?.env?.NODE_ENV !== 'production') console.error('Data is null');\n return false;\n }\n if (!key) {\n const results = this.keys.map(k => this.validate(k));\n return results.every(Boolean);\n }\n if (this.internalDataSignal?.[0]?.[key] instanceof FormArray) {\n return (this.internalDataSignal[0][key] as unknown as FormArray<ElementType<T[K]> & object>).validateCurrent();\n }\n const validators = this.validators[key];\n if (!validators) return true;\n let allValid = true;\n for (const validator of validators) {\n try {\n const result = validator.revalidate(this.internalDataSignal[0][key]);\n const isPromise = typeof (result as any)?.then === 'function';\n const resolved = isPromise ? true : (result as boolean); // optimistic until async handled via validateAsync\n const toHide = validator.hide?.(this.internalDataSignal[0][key]);\n if (toHide) {\n this.setError(key, validator.errKey, false);\n } else {\n this.setError(key, validator.errKey, !resolved);\n if (!resolved) allValid = false;\n }\n } catch (e) {\n if (process?.env?.NODE_ENV !== 'production') console.warn('Validator threw', validator.errKey, e);\n this.setError(key, validator.errKey, true);\n allValid = false;\n }\n }\n return allValid;\n }\n\n public async validateAsync<K extends keyof T>(key?: K): Promise<boolean> {\n if (!key) {\n const results = await Promise.all(this.keys.map(k => this.validateAsync(k)));\n return results.every(Boolean);\n }\n if (this.internalDataSignal?.[0]?.[key] instanceof FormArray) {\n return (this.internalDataSignal[0][key] as unknown as FormArray<ElementType<T[K]> & object>).validateCurrent();\n }\n const validators = this.validators[key];\n if (!validators) return true;\n let allValid = true;\n for (const validator of validators) {\n try {\n const res = await validator.revalidate(this.internalDataSignal[0][key]);\n const toHide = validator.hide?.(this.internalDataSignal[0][key]);\n if (toHide) this.setError(key, validator.errKey, false); else this.setError(key, validator.errKey, !res);\n if (!res && !toHide) allValid = false;\n } catch {\n this.setError(key, validator.errKey, true);\n allValid = false;\n }\n }\n return allValid;\n }\n}\n\n/**\n * Utility type to extract the element type from an array type\n */\ntype ElementType<T> = T extends (infer U)[] ? U : never;"],"names":["valuesEqual","a","b","Number","isNaN","Date","getTime","Array","isArray","ka","Object","keys","kb","length","every","k","prototype","hasOwnProperty","call","FormGroup","validators","meta","fieldChangeValue","key","createMemo","val","this","internalDataSignal","FormArray","get","CloneStore","constructor","data","newData","newValidators","newErrors","value","push","map","validator","errKey","hasError","initialVal","touched","dirty","initialValue","createStore","errors","createSignal","formChangeValue","current","reduce","acc","_unsafeRaw","clone","getR","getArrayItem","index","getAt","hasValidator","hasAnyValidator","some","error","getErrors","setError","untrack","list","findIndex","e","Clone","addValidator","removeValidator","filter","v","getMeta","markTouched","markDirty","hasAnyError","errs","getAllErrors","result","reset","m","set","old","addToArray","group","add","removeFromArray","remove","validate","isNullish","process","env","NODE_ENV","console","Boolean","validateCurrent","allValid","revalidate","resolved","then","toHide","hide","warn","validateAsync","Promise","all","res"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{createStore as r}from"solid-js/store";import{Clone as t}from"../../../tools/tools.js";import"solid-js";class s{arrayErrors=[];constructor(t=[],s=[]){const[e,o]=r([...t]);this.groups=e,this.setGroups=o,this.internalArrayValidation=s,this._initialGroups=[...t]}get length(){return this.groups.length}hasAnyValidator(r){if(!r)return this.internalArrayValidation.length>0||this.groups.some(r=>r.hasAnyValidator());return!!this.internalArrayValidation.some(t=>t.errKey===r)||this.groups.some(t=>t.hasAnyValidator(r))}reset(){this._initialGroups.forEach(r=>r.reset()),this.setGroups(()=>[...this._initialGroups]),this.arrayErrors=[]}get(){return this.groups.map(r=>r.get())}getAt(r){if(!(r<0||r>=this.groups.length))return this.groups[r].get()}getGroup(r){if(!(r<0||r>=this.groups.length))return this.groups[r]}getGroups(){return[...this.groups]}getProperty(r,t){const s=this.getGroup(r);return s?s.get(t):void 0}set(r){const t=Math.min(r.length,this.groups.length);for(let s=0;s<t;s++){const t=r[s];for(const r in t)this.groups[s].set(r,t[r])}r.length<this.groups.length&&this.setGroups(t=>t.slice(0,r.length))}setAt(r,t){const s=this.getGroup(r);if(s)for(const r in t)s.set(r,t[r]);else console.error(`Index ${r} out of bounds.`)}setProperty(r,t,s){const e=this.getGroup(r);e?e.set(t,s):console.error(`Index ${r} out of bounds.`)}remove(r){this.setGroups(t=>{const s=[...t];return s.splice(r,1),s})}replace(r,t){this.setGroups(s=>{const e=[...s];return e[r]=t,e})}add(r){this.setGroups(t=>[...t,r])}hasError(r){if(null!=r){const t=this.getGroup(r);return!!t&&t.hasAnyError()}const t=this.groups.some(r=>r.hasAnyError()),s=this.arrayErrors.some(r=>r.hasError);return t||s}hasValidator(r,t){const s=this.getGroup(r);return!!s&&s.hasAnyValidator(t)}getErrors(){return this.groups.map(r=>[...r.getAllErrors(),...t(this.arrayErrors)])}getErrorsAt(r){const s=this.getGroup(r);return s?[...s.getAllErrors(),...t(this.arrayErrors)]:[]}getArrayErrors(){return t(this.arrayErrors)}validateCurrent(r){return this.validate(r)}validateField(r,t){const s=this.getGroup(r);return!!s&&s.validate(t)}validate(r){const t=this.get();this.arrayErrors=this.internalArrayValidation.map(r=>({key:r.errKey,hasError:!r.revalidate(t)}));const s=this.arrayErrors.every(r=>!r.hasError);if(null!=r){const t=this.getGroup(r);if(!t)return!1;return t.validate()&&s}return this.groups.map(r=>r.validate()).every(Boolean)&&s}async validateAsync(r){const t=this.get();this.arrayErrors=await Promise.all(this.internalArrayValidation.map(async r=>({key:r.errKey,hasError:!await r.revalidate(t)})));const s=this.arrayErrors.every(r=>!r.hasError);if(null!=r){const t=this.getGroup(r);if(!t)return!1;return await t.validateAsync()&&s}return(await Promise.all(this.groups.map(r=>r.validateAsync()))).every(Boolean)&&s}}export{s as FormArray};
2
+ //# sourceMappingURL=formArray.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formArray.js","sources":["../../../../src/components/Form/formHelp/formArray.ts"],"sourcesContent":["import { createStore, SetStoreFunction } from \"solid-js/store\";\nimport { ValidatorResult, Error } from \"./models\";\nimport { Clone } from \"../../../tools\";\nimport { FormGroup } from \"../formGroup\";\n\n/**\n * A class that encapsulates an array of FormGroup instances along with optional array-level validation.\n *\n * @template T - An object type representing the shape of a single form group's value.\n */\nexport class FormArray<T extends object> {\n /**\n * Array-level validators that validate the entire array of form group values.\n * @private\n */\n private internalArrayValidation: ValidatorResult<T[]>[];\n\n /**\n * The FormGroup instances managed by this array.\n * @private\n */\n private groups: FormGroup<T>[];\n\n /**\n * Solid store setter for the groups array.\n * @private\n */\n private setGroups: SetStoreFunction<FormGroup<T>[]>;\n\n /**\n * Array-level errors (from array-level validators only).\n * Per-item errors live in each FormGroup.\n * @private\n */\n private arrayErrors: Error[] = [];\n\n /**\n * Snapshot of initial groups for reset.\n * @private\n */\n private readonly _initialGroups: FormGroup<T>[];\n\n /**\n * Creates an instance of FormArray.\n *\n * @param groups - An array of FormGroup instances representing the initial items.\n * @param arrayValidators - Optional array-level validators (e.g., min/max item count).\n */\n constructor(groups: FormGroup<T>[] = [], arrayValidators: ValidatorResult<T[]>[] = []) {\n const [storeGroups, setStoreGroups] = createStore<FormGroup<T>[]>([...groups]);\n\n this.groups = storeGroups;\n this.setGroups = setStoreGroups;\n this.internalArrayValidation = arrayValidators;\n this._initialGroups = [...groups];\n }\n\n /**\n * Returns the number of items in the array.\n */\n public get length(): number {\n return this.groups.length;\n }\n\n /**\n * Returns true if any validator (array-level or within any group) exists matching the provided errKey.\n * If no errKey provided, returns true when any validator exists at all.\n */\n public hasAnyValidator(errKey?: string): boolean {\n if (!errKey) {\n return this.internalArrayValidation.length > 0 || this.groups.some(g => g.hasAnyValidator());\n }\n const inArray = this.internalArrayValidation.some(v => v.errKey === errKey);\n if (inArray) return true;\n return this.groups.some(g => g.hasAnyValidator(errKey));\n }\n\n /**\n * Resets the array to its initial groups and clears array-level errors.\n * Each initial FormGroup is reset to its own initial state.\n */\n public reset(): void {\n this._initialGroups.forEach(g => g.reset());\n this.setGroups(() => [...this._initialGroups]);\n this.arrayErrors = [];\n }\n\n /**\n * Gets the current values of all form groups in the array.\n *\n * @returns An array of cloned plain-object values from each FormGroup.\n */\n public get(): T[] {\n return this.groups.map(g => g.get());\n }\n\n /**\n * Gets the value of a specific form group in the array.\n *\n * @param index - The index of the group.\n * @returns A cloned copy of the group's value, or undefined if out of bounds.\n */\n public getAt(index: number): T | undefined {\n if (index < 0 || index >= this.groups.length) {\n return undefined;\n }\n return this.groups[index].get();\n }\n\n /**\n * Gets the FormGroup instance at the specified index.\n *\n * @param index - The index of the group.\n * @returns The FormGroup instance, or undefined if out of bounds.\n */\n public getGroup(index: number): FormGroup<T> | undefined {\n if (index < 0 || index >= this.groups.length) {\n return undefined;\n }\n return this.groups[index];\n }\n\n /**\n * Returns a shallow copy of all FormGroup instances.\n */\n public getGroups(): FormGroup<T>[] {\n return [...this.groups];\n }\n\n /**\n * Gets a property value from the FormGroup at the specified index.\n *\n * @param index - The index of the group.\n * @param key - The property key to retrieve.\n * @returns The property value, or undefined if not found.\n */\n public getProperty<K extends keyof T>(index: number, key: K): T[K] | undefined {\n const group = this.getGroup(index);\n return group ? group.get(key) : undefined;\n }\n\n /**\n * Sets the values of all groups. Updates existing groups in-place and\n * discards any excess groups. Does not create new groups for excess values.\n *\n * @param values - The new values for the groups.\n */\n public set(values: T[]): void {\n const len = Math.min(values.length, this.groups.length);\n for (let i = 0; i < len; i++) {\n const val = values[i];\n for (const key in val) {\n this.groups[i].set(key as keyof T, val[key as keyof T]);\n }\n }\n // If fewer values than groups, remove excess groups\n if (values.length < this.groups.length) {\n this.setGroups(old => old.slice(0, values.length));\n }\n }\n\n /**\n * Sets the value of a group at the specified index.\n *\n * @param index - The index of the group to update.\n * @param value - The new value for the group.\n */\n public setAt(index: number, value: T): void {\n const group = this.getGroup(index);\n if (!group) {\n console.error(`Index ${index} out of bounds.`);\n return;\n }\n for (const key in value) {\n group.set(key as keyof T, value[key as keyof T]);\n }\n }\n\n /**\n * Sets a property value on the FormGroup at the specified index.\n *\n * @param index - The index of the group.\n * @param key - The property key to set.\n * @param value - The new value for the property.\n */\n public setProperty<K extends keyof T>(index: number, key: K, value: T[K]): void {\n const group = this.getGroup(index);\n if (!group) {\n console.error(`Index ${index} out of bounds.`);\n return;\n }\n group.set(key, value);\n }\n\n /**\n * Removes a group at the specified index.\n *\n * @param index - The index of the group to remove.\n */\n public remove(index: number) {\n this.setGroups(old => {\n const copy = [...old];\n copy.splice(index, 1);\n return copy;\n });\n }\n\n /**\n * Replaces a group at the specified index with a new FormGroup.\n *\n * @param index - The index of the group to replace.\n * @param group - The new FormGroup instance.\n */\n public replace(index: number, group: FormGroup<T>) {\n this.setGroups(old => {\n const copy = [...old];\n copy[index] = group;\n return copy;\n });\n }\n\n /**\n * Adds a new FormGroup to the array.\n *\n * @param group - The FormGroup instance to add.\n */\n public add(group: FormGroup<T>) {\n this.setGroups(old => [...old, group]);\n }\n\n /**\n * Checks if any validation errors exist.\n *\n * @param index - (Optional) The index of the group to check for errors.\n * If not provided, checks all groups and array-level errors.\n * @returns `true` if any errors are found, otherwise `false`.\n */\n public hasError(index?: number): boolean {\n if (index !== undefined && index !== null) {\n const group = this.getGroup(index);\n if (!group) return false;\n return group.hasAnyError();\n }\n const anyGroupError = this.groups.some(g => g.hasAnyError());\n const anyArrayError = this.arrayErrors.some(e => e.hasError);\n return anyGroupError || anyArrayError;\n }\n\n /**\n * Checks if a specific validator error exists for a group at the given index.\n *\n * @param index - The index of the group.\n * @param errKey - The key identifying the specific error to check for.\n * @returns `true` if the specific error is present, otherwise `false`.\n */\n public hasValidator(index: number, errKey: string): boolean {\n const group = this.getGroup(index);\n if (!group) return false;\n return group.hasAnyValidator(errKey);\n }\n\n /**\n * Gets all errors for the form array.\n * Each inner array contains the errors from one FormGroup plus array-level errors.\n *\n * @returns An array of error arrays for each group.\n */\n public getErrors(): Error[][] {\n return this.groups.map(g => {\n return [...g.getAllErrors(), ...Clone(this.arrayErrors)];\n });\n }\n\n /**\n * Gets errors for a specific group in the array.\n *\n * @param index - The index of the group.\n * @returns An array of errors for the group, or an empty array if not found.\n */\n public getErrorsAt(index: number): Error[] {\n const group = this.getGroup(index);\n if (!group) return [];\n return [...group.getAllErrors(), ...Clone(this.arrayErrors)];\n }\n\n /**\n * Gets only array-level errors (not per-group errors).\n */\n public getArrayErrors(): Error[] {\n return Clone(this.arrayErrors);\n }\n\n /**\n * Validates the form array using current values.\n *\n * @param index - Optional index to validate just one group.\n * @returns True if validation passes, false otherwise.\n */\n public validateCurrent(index?: number): boolean {\n return this.validate(index);\n }\n\n /**\n * Validates a SINGLE field within the group at the given index, without\n * touching that group's other fields or the array-level validators. Used by\n * direct field bindings (e.g. an Input/Select bound to one array-item property)\n * so blurring one field does not eagerly flag its siblings.\n *\n * @param index - The index of the group.\n * @param key - The property key to validate.\n * @returns `true` if the field is valid (or the group is missing), else `false`.\n */\n public validateField<K extends keyof T>(index: number, key: K): boolean {\n const group = this.getGroup(index);\n return group ? group.validate(key) : false;\n }\n\n /**\n * Validates the form array.\n *\n * @param index - (Optional) The index of a single group to validate.\n * If not provided, validates all groups and array-level validators.\n * @returns `true` if all validations pass, otherwise `false`.\n */\n public validate(index?: number): boolean {\n // Run array-level validators\n const values = this.get();\n this.arrayErrors = this.internalArrayValidation.map(validator => ({\n key: validator.errKey,\n hasError: !validator.revalidate(values)\n }));\n const arrayValid = this.arrayErrors.every(e => !e.hasError);\n\n if (index !== undefined && index !== null) {\n const group = this.getGroup(index);\n if (!group) return false;\n const groupValid = group.validate();\n return groupValid && arrayValid;\n }\n\n // Validate all groups\n const groupResults = this.groups.map(g => g.validate());\n const allGroupsValid = groupResults.every(Boolean);\n return allGroupsValid && arrayValid;\n }\n\n /**\n * Async counterpart to {@link validate}. Awaits async (and sync) array-level\n * validators and each group's `validateAsync`, so forms with async validators\n * are correctly enforced on submit.\n *\n * @param index - (Optional) The index of a single group to validate.\n * @returns A promise resolving to `true` if all validations pass.\n */\n public async validateAsync(index?: number): Promise<boolean> {\n const values = this.get();\n this.arrayErrors = await Promise.all(\n this.internalArrayValidation.map(async validator => ({\n key: validator.errKey,\n hasError: !(await validator.revalidate(values))\n }))\n );\n const arrayValid = this.arrayErrors.every(e => !e.hasError);\n\n if (index !== undefined && index !== null) {\n const group = this.getGroup(index);\n if (!group) return false;\n const groupValid = await group.validateAsync();\n return groupValid && arrayValid;\n }\n\n const groupResults = await Promise.all(this.groups.map(g => g.validateAsync()));\n const allGroupsValid = groupResults.every(Boolean);\n return allGroupsValid && arrayValid;\n }\n}\n"],"names":["FormArray","arrayErrors","constructor","groups","arrayValidators","storeGroups","setStoreGroups","createStore","this","setGroups","internalArrayValidation","_initialGroups","length","hasAnyValidator","errKey","some","g","v","reset","forEach","get","map","getAt","index","getGroup","getGroups","getProperty","key","group","undefined","set","values","len","Math","min","i","val","old","slice","setAt","value","console","error","setProperty","remove","copy","splice","replace","add","hasError","hasAnyError","anyGroupError","anyArrayError","e","hasValidator","getErrors","getAllErrors","Clone","getErrorsAt","getArrayErrors","validateCurrent","validate","validateField","validator","revalidate","arrayValid","every","Boolean","validateAsync","Promise","all","async"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{isNullish as t}from"../../../tools/tools.js";import"solid-js";class e{static required(){return this.createValidatorResult("required",e=>!t(e)&&("string"==typeof e?0!==e.trim().length:!Array.isArray(e)||0!==e.length))}static get Required(){return e.required()}static email(){return this.createValidatorResult("email",e=>!!(t(e)||"string"==typeof e&&""===e.trim())||/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/.test(e))}static get Email(){return e.email()}static minLength(e){return this.createValidatorResult("minLength",r=>!t(r)&&!(r.length<e))}static maxLength(e){return this.createValidatorResult("maxLength",r=>!t(r)&&r.length<=e)}static pattern(t,e){return this.createValidatorResult(t,t=>e.test(t))}static custom(t,e,r){return this.createValidatorResult(t,e,r)}static asyncCustom(t,e,r){return this.createValidatorResult(t,e,r)}static createValidatorResult(t,e,r){return{errKey:t,revalidate:e,hide:r}}}export{e as Validators};
2
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sources":["../../../../src/components/Form/formHelp/validators.ts"],"sourcesContent":["import { isNullish } from \"../../../tools\";\nimport { ValidatorResult } from \"./models\";\n\n/**\n * A collection of static validator functions that return a ValidatorResult.\n * These validators can be used to validate common conditions such as required fields,\n * email format, minimum/maximum length, custom patterns, and more.\n */\nexport class Validators {\n /**\n * Validates that a value is present (i.e. not null or undefined).\n * For strings, it checks that the trimmed string is not empty.\n * For arrays, it verifies that the array is not empty.\n *\n * @template T - The type of the value to validate.\n * @returns A ValidatorResult that includes the error key and a revalidation function.\n *\n * @private\n */\n private static required<T>(): ValidatorResult<T> {\n const errKey = 'required';\n return this.createValidatorResult(errKey, (value: T) => {\n if (isNullish(value)) return false;\n if (typeof value === 'string') return value.trim().length !== 0;\n if (Array.isArray(value)) return value.length !== 0;\n return true;\n });\n }\n\n /**\n * A getter that returns the required validator.\n *\n * @returns A ValidatorResult for validating required fields.\n */\n public static get Required() {\n return Validators.required();\n }\n\n /**\n * Validates that a string is in a valid email format.\n *\n * @returns A ValidatorResult that includes the error key and a revalidation function for email validation.\n *\n * @private\n */\n private static email(): ValidatorResult<string> {\n const errKey = 'email';\n return this.createValidatorResult(errKey, (value: string) => {\n // Blank passes — `Required` owns emptiness, so an optional email field left\n // empty does not surface a format error.\n if (isNullish(value) || (typeof value === 'string' && value.trim() === '')) return true;\n return /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$/.test(value);\n });\n }\n\n /**\n * A getter that returns the email validator.\n *\n * @returns A ValidatorResult for validating email format.\n */\n public static get Email() {\n return Validators.email();\n }\n\n /**\n * Creates a validator that checks if a value meets the minimum length requirement.\n *\n * @param length - The minimum length required.\n * @returns A ValidatorResult that includes the error key and a revalidation function for minimum length.\n */\n public static minLength(length: number): ValidatorResult<string | any[]> {\n const errKey = 'minLength';\n return this.createValidatorResult(errKey, (value: string | any[]) => {\n if (isNullish(value)) return false;\n return !(value.length < length)\n });\n }\n\n /**\n * Creates a validator that checks if a value does not exceed the maximum length.\n *\n * @param length - The maximum allowed length.\n * @returns A ValidatorResult that includes the error key and a revalidation function for maximum length.\n */\n public static maxLength(length: number): ValidatorResult<string | any[]> {\n const errKey = 'maxLength';\n return this.createValidatorResult(errKey, (value: string | any[]) => {\n if (isNullish(value)) return false;\n return value.length <= length;\n });\n }\n\n /**\n * Creates a validator that checks if a string matches the provided regular expression pattern.\n *\n * @param errKey - The error key to associate with this validator.\n * @param pattern - The regular expression pattern to test the value against.\n * @returns A ValidatorResult that includes the provided error key and a revalidation function.\n */\n public static pattern(errKey: string, pattern: RegExp): ValidatorResult<string> {\n return this.createValidatorResult(errKey, (value: string) => pattern.test(value));\n }\n\n /**\n * Creates a custom validator with a provided validation function.\n *\n * @template T - The type of the value to validate.\n * @param errKey - The error key to associate with this validator.\n * @param validator - A function that receives a value of type T and returns a boolean indicating validity.\n * @returns A ValidatorResult that includes the error key and a revalidation function.\n */\n public static custom<T>(errKey: string, validator: (value: T) => boolean, hide?: (val: T) => boolean): ValidatorResult<T> {\n return this.createValidatorResult(errKey, validator, hide);\n }\n\n /**\n * Creates an async validator; resolves promise to boolean.\n */\n public static asyncCustom<T>(errKey: string, validator: (value: T) => Promise<boolean>, hide?: (val: T) => boolean): ValidatorResult<T> {\n return this.createValidatorResult(errKey, validator, hide);\n }\n\n /**\n * A helper function that creates a ValidatorResult object.\n *\n * @template T - The type of the value to validate.\n * @param errKey - The error key associated with the validator.\n * @param revalidate - A function that revalidates a given value and returns true if valid, false otherwise.\n * @returns A ValidatorResult containing the error key and revalidation function.\n *\n * @private\n */\n private static createValidatorResult<T>(errKey: string, revalidate: (val: any) => boolean | Promise<boolean>, hide?: (val: T) => boolean): ValidatorResult<T> {\n return { errKey, revalidate, hide };\n }\n}\n"],"names":["Validators","required","this","createValidatorResult","value","isNullish","trim","length","Array","isArray","Required","email","test","Email","minLength","maxLength","pattern","errKey","custom","validator","hide","asyncCustom","revalidate"],"mappings":"2EAQaA,EAWH,eAAOC,GAEb,OAAOC,KAAKC,sBADG,WAC4BC,IACrCC,EAAUD,KACO,iBAAVA,EAAmD,IAAxBA,EAAME,OAAOC,QAC/CC,MAAMC,QAAQL,IAAgC,IAAjBA,EAAMG,QAG3C,CAOO,mBAAWG,GAChB,OAAOV,EAAWC,UACpB,CASQ,YAAOU,GAEb,OAAOT,KAAKC,sBADG,QAC4BC,MAGrCC,EAAUD,IAA4B,iBAAVA,GAAuC,KAAjBA,EAAME,SACrD,mDAAmDM,KAAKR,GAEnE,CAOO,gBAAWS,GAChB,OAAOb,EAAWW,OACpB,CAQO,gBAAOG,CAAUP,GAEtB,OAAOL,KAAKC,sBADG,YAC4BC,IACrCC,EAAUD,MACLA,EAAMG,OAASA,GAE5B,CAQO,gBAAOQ,CAAUR,GAEtB,OAAOL,KAAKC,sBADG,YAC4BC,IACrCC,EAAUD,IACPA,EAAMG,QAAUA,EAE3B,CASO,cAAOS,CAAQC,EAAgBD,GACpC,OAAOd,KAAKC,sBAAsBc,EAASb,GAAkBY,EAAQJ,KAAKR,GAC5E,CAUO,aAAOc,CAAUD,EAAgBE,EAAkCC,GACxE,OAAOlB,KAAKC,sBAAsBc,EAAQE,EAAWC,EACvD,CAKO,kBAAOC,CAAeJ,EAAgBE,EAA2CC,GACtF,OAAOlB,KAAKC,sBAAsBc,EAAQE,EAAWC,EACvD,CAYQ,4BAAOjB,CAAyBc,EAAgBK,EAAsDF,GAC5G,MAAO,CAAEH,SAAQK,aAAYF,OAC/B"}
@@ -0,0 +1,2 @@
1
+ import{createMemo as r}from"solid-js";import{useFormContext as o}from"./form.js";import{useFormProvider as m}from"../FormField/formProvider.js";import{FormArray as f}from"./formHelp/formArray.js";function e(e){const t=m(),a=o(),i=e.formName??t?.formName,n=r(()=>{if(void 0!==e.formIndex){if(a?.formArray)return a.formArray;if(e.formArrayName&&a?.formGroup){const r=a.formGroup._unsafeRaw(),o=r?.[e.formArrayName];if(o instanceof f)return o}}}),d=r(()=>!!n());return{formName:i,getValue:()=>{const r=n();return r&&void 0!==e.formIndex&&i?r.getProperty(e.formIndex,i):i&&a?.data?a.data[i]:void 0},setValue:r=>{const o=n();o&&void 0!==e.formIndex&&i?o.setProperty(e.formIndex,i,r):i&&a?.formGroup&&a.formGroup.set(i,r)},markDirty:()=>{const r=n();if(r&&void 0!==e.formIndex&&i){const o=r.getGroup(e.formIndex);return void(o&&o.markDirty(i))}if(i&&a?.formGroup){const r=a.formGroup.getMeta(i);r&&!r.dirty&&a.formGroup.markDirty(i)}},validate:()=>{const r=n();return r&&void 0!==e.formIndex?i?r.validateField(e.formIndex,i):r.validateCurrent(e.formIndex):i&&a?.formGroup?a.formGroup.validate(i):void 0},formGroup:a?.formGroup,formArray:n(),isFormArray:d()}}export{e as useDirectFormBinding};
2
+ //# sourceMappingURL=useDirectFormBinding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDirectFormBinding.js","sources":["../../../src/components/Form/useDirectFormBinding.ts"],"sourcesContent":["import { createMemo } from 'solid-js';\nimport { useFormContext } from './form';\nimport { useFormProvider } from '../FormField/formProvider';\nimport { FormGroup } from './formGroup';\nimport { FormArray } from './formHelp/formArray';\n\nexport interface DirectFormBindingProps {\n /** Field key — either a FormGroup field name, or a property key within a FormArray item */\n formName?: string;\n /** Array index — selects which item in a FormArray to bind to */\n formIndex?: number;\n /** FormGroup key that holds the FormArray (for FormArray-within-FormGroup) */\n formArrayName?: string;\n}\n\nexport interface DirectFormBindingResult {\n /** The resolved field name (from direct props or FormField context) */\n formName: string | undefined;\n /** Read the current bound value */\n getValue: () => any;\n /** Write a new value to the bound field */\n setValue: (val: any) => void;\n /** Mark the bound field as dirty */\n markDirty: () => void;\n /** Validate the bound field. Returns true if valid, false otherwise, undefined if no binding */\n validate: () => boolean | undefined;\n /** The FormGroup instance if available */\n formGroup: FormGroup<any> | undefined;\n /** The resolved FormArray instance if binding targets an array */\n formArray: FormArray<any> | undefined;\n /** True when binding targets a FormArray item */\n isFormArray: boolean;\n}\n\n/**\n * Hook that resolves form binding from direct props, with FormField context as fallback.\n *\n * Supports three binding modes:\n * 1. **FormGroup (simple)**: `formName` binds to `formGroup.data[formName]`\n * 2. **FormArray (top-level)**: `formIndex` + `formName` binds to `formArray.getAt(formIndex)[formName]`\n * 3. **FormArray (within FormGroup)**: `formArrayName` + `formIndex` + `formName` binds to\n * `formGroup.data[formArrayName].getAt(formIndex)[formName]`\n *\n * Priority: direct props > FormField context > undefined\n */\nexport function useDirectFormBinding(props: DirectFormBindingProps): DirectFormBindingResult {\n const fieldContext = useFormProvider();\n const formContext = useFormContext();\n\n const resolvedFormName = props.formName ?? fieldContext?.formName;\n\n // Determine which FormArray we're targeting (if any)\n const resolvedFormArray = createMemo<FormArray<any> | undefined>(() => {\n if (props.formIndex === undefined) return undefined;\n\n // Top-level FormArray\n if (formContext?.formArray) {\n return formContext.formArray;\n }\n\n // FormArray within FormGroup. Read the raw store value (the live FormArray\n // instance) rather than getR(), which returns the array's plain values and\n // would never be `instanceof FormArray`.\n if (props.formArrayName && formContext?.formGroup) {\n const raw = formContext.formGroup._unsafeRaw() as any;\n const field = raw?.[props.formArrayName];\n if (field instanceof FormArray) {\n return field;\n }\n }\n\n return undefined;\n });\n\n const isFormArray = createMemo(() => !!resolvedFormArray());\n\n const getValue = () => {\n const fa = resolvedFormArray();\n if (fa && props.formIndex !== undefined && resolvedFormName) {\n return fa.getProperty(props.formIndex, resolvedFormName as any);\n }\n\n // Simple FormGroup binding\n if (resolvedFormName && formContext?.data) {\n return formContext.data[resolvedFormName];\n }\n\n return undefined;\n };\n\n const setValue = (val: any) => {\n const fa = resolvedFormArray();\n if (fa && props.formIndex !== undefined && resolvedFormName) {\n fa.setProperty(props.formIndex, resolvedFormName as any, val);\n return;\n }\n\n // Simple FormGroup binding. The Form Provider bridge effect mirrors the\n // FormGroup store into the context store, so an explicit setData here is\n // redundant (and would double-write the same key).\n if (resolvedFormName && formContext?.formGroup) {\n formContext.formGroup.set(resolvedFormName as any, val);\n }\n };\n\n const markDirty = () => {\n const fa = resolvedFormArray();\n if (fa && props.formIndex !== undefined && resolvedFormName) {\n const group = fa.getGroup(props.formIndex);\n if (group) {\n group.markDirty(resolvedFormName as any);\n }\n return;\n }\n\n if (resolvedFormName && formContext?.formGroup) {\n const meta = formContext.formGroup.getMeta(resolvedFormName as any);\n if (meta && !meta.dirty) {\n formContext.formGroup.markDirty(resolvedFormName as any);\n }\n }\n };\n\n const validate = (): boolean | undefined => {\n const fa = resolvedFormArray();\n if (fa && props.formIndex !== undefined) {\n // Validate only the bound field, not the whole row + array-level validators.\n if (resolvedFormName) {\n return fa.validateField(props.formIndex, resolvedFormName as any);\n }\n return fa.validateCurrent(props.formIndex);\n }\n\n if (resolvedFormName && formContext?.formGroup) {\n return formContext.formGroup.validate(resolvedFormName as any);\n }\n\n return undefined;\n };\n\n return {\n formName: resolvedFormName,\n getValue,\n setValue,\n markDirty,\n validate,\n formGroup: formContext?.formGroup,\n formArray: resolvedFormArray(),\n isFormArray: isFormArray(),\n };\n}\n"],"names":["useDirectFormBinding","props","fieldContext","useFormProvider","formContext","useFormContext","resolvedFormName","formName","resolvedFormArray","createMemo","undefined","formIndex","formArray","formArrayName","formGroup","raw","_unsafeRaw","field","FormArray","isFormArray","getValue","fa","getProperty","data","setValue","val","setProperty","set","markDirty","group","getGroup","meta","getMeta","dirty","validate","validateField","validateCurrent"],"mappings":"oMA6CM,SAAUA,EAAqBC,GACnC,MAAMC,EAAeC,IACfC,EAAcC,IAEdC,EAAmBL,EAAMM,UAAYL,GAAcK,SAGnDC,EAAoBC,EAAuC,KAC/D,QAAwBC,IAApBT,EAAMU,UAAV,CAGA,GAAIP,GAAaQ,UACf,OAAOR,EAAYQ,UAMrB,GAAIX,EAAMY,eAAiBT,GAAaU,UAAW,CACjD,MAAMC,EAAMX,EAAYU,UAAUE,aAC5BC,EAAQF,IAAMd,EAAMY,eAC1B,GAAII,aAAiBC,EACnB,OAAOD,CAEX,CAhBmD,IAqB/CE,EAAcV,EAAW,MAAQD,KAkEvC,MAAO,CACLD,SAAUD,EACVc,SAlEeA,KACf,MAAMC,EAAKb,IACX,OAAIa,QAA0BX,IAApBT,EAAMU,WAA2BL,EAClCe,EAAGC,YAAYrB,EAAMU,UAAWL,GAIrCA,GAAoBF,GAAamB,KAC5BnB,EAAYmB,KAAKjB,QAD1B,GA4DAkB,SArDgBC,IAChB,MAAMJ,EAAKb,IACPa,QAA0BX,IAApBT,EAAMU,WAA2BL,EACzCe,EAAGK,YAAYzB,EAAMU,UAAWL,EAAyBmB,GAOvDnB,GAAoBF,GAAaU,WACnCV,EAAYU,UAAUa,IAAIrB,EAAyBmB,IA2CrDG,UAvCgBA,KAChB,MAAMP,EAAKb,IACX,GAAIa,QAA0BX,IAApBT,EAAMU,WAA2BL,EAAkB,CAC3D,MAAMuB,EAAQR,EAAGS,SAAS7B,EAAMU,WAIhC,YAHIkB,GACFA,EAAMD,UAAUtB,GAGpB,CAEA,GAAIA,GAAoBF,GAAaU,UAAW,CAC9C,MAAMiB,EAAO3B,EAAYU,UAAUkB,QAAQ1B,GACvCyB,IAASA,EAAKE,OAChB7B,EAAYU,UAAUc,UAAUtB,EAEpC,GAyBA4B,SAtBeA,KACf,MAAMb,EAAKb,IACX,OAAIa,QAA0BX,IAApBT,EAAMU,UAEVL,EACKe,EAAGc,cAAclC,EAAMU,UAAWL,GAEpCe,EAAGe,gBAAgBnC,EAAMU,WAG9BL,GAAoBF,GAAaU,UAC5BV,EAAYU,UAAUoB,SAAS5B,QADxC,GAaAQ,UAAWV,GAAaU,UACxBF,UAAWJ,IACXW,YAAaA,IAEjB"}
@@ -0,0 +1,2 @@
1
+ import{createMemo as r}from"solid-js";import{useFormContext as o}from"./form.js";function t(t){const e=o();if(!e.formGroup)throw new Error("useFormFieldBinding requires a FormGroup. It cannot be used with FormArray as the top-level Form data.");const a=e.formGroup;return{value:r(()=>a.getR(t)),setValue:r=>a.set(t,r),errors:()=>a.getErrors(t)??[],hasError:()=>a.hasError(t),touched:()=>a.getMeta(t)?.touched??!1,dirty:()=>a.getMeta(t)?.dirty??!1,validate:()=>a.validate(t)}}export{t as useFormFieldBinding};
2
+ //# sourceMappingURL=useFormFieldBinding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFormFieldBinding.js","sources":["../../../src/components/Form/useFormFieldBinding.ts"],"sourcesContent":["import { Accessor, createMemo } from 'solid-js';\nimport { useFormContext } from './form';\nimport { FormGroup } from './formGroup';\n\nexport interface FieldBinding<T, K extends keyof T> {\n value: Accessor<T[K]>;\n setValue: (v: T[K]) => void;\n errors: () => { key: string; hasError: boolean }[];\n hasError: () => boolean;\n touched: () => boolean;\n dirty: () => boolean;\n validate: () => boolean;\n}\n\nexport function useFormFieldBinding<T extends object, K extends keyof T>(key: K): FieldBinding<T, K> {\n const ctx = useFormContext<T>();\n if (!ctx.formGroup) {\n throw new Error('useFormFieldBinding requires a FormGroup. It cannot be used with FormArray as the top-level Form data.');\n }\n const fg: FormGroup<T> = ctx.formGroup;\n const value = createMemo(() => fg.getR(key));\n return {\n value,\n setValue: (v: T[K]) => fg.set(key, v),\n errors: () => (fg.getErrors(key) as any) ?? [],\n hasError: () => fg.hasError(key),\n touched: () => fg.getMeta(key)?.touched ?? false,\n dirty: () => fg.getMeta(key)?.dirty ?? false,\n validate: () => fg.validate(key)\n };\n}\n"],"names":["useFormFieldBinding","key","ctx","useFormContext","formGroup","Error","fg","value","createMemo","getR","setValue","v","set","errors","getErrors","hasError","touched","getMeta","dirty","validate"],"mappings":"iFAcM,SAAUA,EAAyDC,GACvE,MAAMC,EAAMC,IACZ,IAAKD,EAAIE,UACP,MAAM,IAAIC,MAAM,0GAElB,MAAMC,EAAmBJ,EAAIE,UAE7B,MAAO,CACLG,MAFYC,EAAW,IAAMF,EAAGG,KAAKR,IAGrCS,SAAWC,GAAYL,EAAGM,IAAIX,EAAKU,GACnCE,OAAQA,IAAOP,EAAGQ,UAAUb,IAAgB,GAC5Cc,SAAUA,IAAMT,EAAGS,SAASd,GAC5Be,QAASA,IAAMV,EAAGW,QAAQhB,IAAMe,UAAW,EAC3CE,MAAOA,IAAMZ,EAAGW,QAAQhB,IAAMiB,QAAS,EACvCC,SAAUA,IAAMb,EAAGa,SAASlB,GAEhC"}
@@ -0,0 +1,2 @@
1
+ import{createEffect as r,onCleanup as e}from"solid-js";import{useFormProvider as o}from"./formProvider.js";const m=m=>{const s=o();return r(()=>{s?.formName&&m.errorName&&s?.setErrors(r=>{const e=r?.err??[],o={key:m.errorName,hasError:!1,display:m.children};return{err:[...e.filter(r=>r.key!==m.errorName),o]}})}),e(()=>{s?.formName&&m.errorName&&s?.setErrors(r=>({err:(r?.err??[]).filter(r=>r.key!==m.errorName)}))}),[]};export{m as ColeError};
2
+ //# sourceMappingURL=coleError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coleError.js","sources":["../../../src/components/FormField/coleError.tsx"],"sourcesContent":["import { Component, JSX, createEffect, onCleanup } from \"solid-js\";\n// @ts-ignore\nimport styles from './coleerr.module.scss';\nimport { useFormProvider } from \"./formProvider\";\n\ninterface Props {\n errorName: string;\n children?: JSX.Element;\n}\nexport const ColeError: Component<Props> = (props) => {\n const formField = useFormProvider();\n createEffect(() => {\n if (!!formField?.formName && !!props.errorName) {\n formField?.setErrors((prev) => {\n const existing = prev?.err ?? [];\n const newError = { key: props.errorName, hasError: false, display: props.children };\n // Upsert by key so re-runs / duplicate registrations don't accumulate copies.\n const filtered = existing.filter((e: any) => e.key !== props.errorName);\n return { err: [...filtered, newError] };\n });\n }\n });\n\n // Remove this error display when the component unmounts.\n onCleanup(() => {\n if (!!formField?.formName && !!props.errorName) {\n formField?.setErrors((prev) => ({\n err: (prev?.err ?? []).filter((e: any) => e.key !== props.errorName),\n }));\n }\n });\n\n return (<></>);\n};"],"names":["ColeError","props","formField","useFormProvider","createEffect","formName","errorName","setErrors","prev","existing","err","newError","key","hasError","display","children","filter","e","onCleanup"],"mappings":"2GASO,MAAMA,EAA+BC,IAC1C,MAAMC,EAAYC,IAsBlB,OArBAC,EAAa,KACLF,GAAWG,UAAcJ,EAAMK,WACnCJ,GAAWK,UAAWC,IACpB,MAAMC,EAAWD,GAAME,KAAO,GACxBC,EAAW,CAAEC,IAAKX,EAAMK,UAAWO,UAAU,EAAOC,QAASb,EAAMc,UAGzE,MAAO,CAAEL,IAAK,IADGD,EAASO,OAAQC,GAAWA,EAAEL,MAAQX,EAAMK,WACjCK,QAMlCO,EAAU,KACFhB,GAAWG,UAAcJ,EAAMK,WACnCJ,GAAWK,UAAWC,IAAI,CACxBE,KAAMF,GAAME,KAAO,IAAIM,OAAQC,GAAWA,EAAEL,MAAQX,EAAMK,gBAKhE"}
@@ -0,0 +1,2 @@
1
+ import{createComponent as e,use as r,spread as t,mergeProps as o,insert as s,memo as m,effect as n,className as a,style as i,template as l}from"solid-js/web";import{splitProps as f,createSignal as d,createMemo as u,createEffect as c,children as g,onMount as p,Show as N,For as h}from"solid-js";import{Provider as y,useFormProvider as v}from"./formProvider.js";import{isNullish as F}from"../../tools/tools.js";import{useClickOutside as j}from"../../tools/eventTools.js";import G from"./formfield.module.scss.js";import{useFormContext as V}from"../Form/form.js";var x=l("<fieldset><legend><span>"),C=l("<div>");const $=r=>e(y,{get name(){return r.name},get formName(){return r.formName},get children(){return e(T,r)}}),T=l=>{const[y,$]=f(l,["children","styleType","name","class","legendClass","formName"]),T=v(),q=V(),[k,w]=d(),E=e=>null!=e&&(("string"!=typeof e||""!==e.trim())&&(!Array.isArray(e)||0!==e.length)),I=u(()=>{let e;if(!!y?.formName&&!!q?.formGroup){const r=q?.data?.[y?.formName??""];E(r)&&(e=r)}else E(T?.getValue?.())&&(e=T?.getValue?.());const r=!!y?.formName&&!!q?.formGroup?.getMeta?.(y.formName)?.dirty;return E(e)||T?.getFocused?.()||r});c(()=>{if(!y?.formName)return;const e=q?.formGroup?.getMeta?.(y.formName);if(!e)return;const r=q?.data?.[y.formName],t=E(r);e.dirty||e.touched||t||!T?.getFocused?.()||T?.setFocused?.(!1)});const M=g(()=>l.children),R=u(()=>!F(y?.formName)&&(!(!Object.keys(l).includes("required")||!1===l.required)||q?.formGroup?.hasValidator?.(y?.formName??"","required")));return c(()=>{T.setName(l.name)}),p(()=>T?.setFocused?.(!1)),j([k,T.getOverlayRef],()=>{if(F(q?.data)){if(!F(T?.getValue)){const e=T?.getValue?.();T?.setTextInside(!E(e))}}else{const e=q?.data?.[y?.formName??""];T?.setTextInside(!E(e))}const e=!!y?.formName&&!!q?.formGroup?.getMeta?.(y.formName)?.dirty;(!!T?.getFocused?.()||e)&&q?.formGroup?.validate?.(y?.formName??""),T?.setFocused(!1)}),p(()=>{if(void 0!==T?.getValue){const e=!E(T?.getValue?.());T.setTextInside(e)}}),c(()=>{const e=k?.();e&&T?.setFormFieldRef?.(e)}),[(A=x(),L=A.firstChild,O=L.firstChild,r(w,A),t(A,o($,{get class(){return`${G.primary} ${G.formField} ${I()?G["has-focus"]:""} ${y.class??""}`}}),!1,!0),s(O,e(N,{get when(){return!R()},get children(){return T.getName()}}),null),s(O,e(N,{get when(){return R()},get children(){return[m(()=>T?.getName())," *"]}}),null),s(A,M,null),n(e=>{var r=`${y?.legendClass??""}`,t=`${G.legendStyle}`;return r!==e.e&&a(L,e.e=r),t!==e.t&&a(O,e.t=t),e},{e:void 0,t:void 0}),A),(b=C(),s(b,e(h,{get each(){return(()=>{if(!y?.formName)return[];const e=(q?.formGroup?.getErrors?.(y.formName)??[]).filter(e=>e.hasError);if(0===e.length)return[];let r=e.map(e=>e.key);return r.includes("required")&&(r=r.filter(e=>"minLength"!==e&&"maxLength"!==e)),(T?.getErrors?.().err??[]).filter(e=>r.includes(e.key))})()},children:(e,r)=>{return t=C(),s(t,()=>e.display),n(e=>{var o=G.error,s=(e=>{const r=k()?.getBoundingClientRect();return r?{top:12*e+"px"}:{}})(r());return o!==e.e&&a(t,e.e=o),e.t=i(t,s,e.t),e},{e:void 0,t:void 0}),t;var t}})),n(()=>a(b,G.errorContainer)),b)];var b,A,L,O};export{$ as FormField};
2
+ //# sourceMappingURL=formField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formField.js","sources":["../../../src/components/FormField/formField.tsx"],"sourcesContent":["import { Component, createSignal, createMemo, JSX, splitProps, children, createEffect, onMount, Show, For } from \"solid-js\";\nimport { Provider, useFormProvider } from \"./formProvider\";\nimport { Clone, isNullish, useClickOutside } from '../../tools';\n// @ts-ignore\nimport style from \"./formfield.module.scss\";\nimport { useFormContext } from \"../Form/form\";\n\ninterface Props extends JSX.FieldsetHTMLAttributes<HTMLFieldSetElement> {\n\tchildren: JSX.Element;\n\tstyleType?: \"primary\";\n\tname: string;\n formName?: string;\n\tclass?: string;\n legendClass?: string;\n required?: boolean;\n}\n\nconst FormField: Component<Props> = (props)=>{\n return (\n <Provider name={props.name} formName={props.formName}>\n <FormField2 {...props}/>\n </Provider>\n )\n}\n\nconst FormField2: Component<Props> = (props) => {\n const [local, others] = splitProps(props, [\"children\", \"styleType\", \"name\", \"class\", \"legendClass\", \"formName\"]);\n const context = useFormProvider();\n const formContext = useFormContext();\n const [fieldRef, setFieldRef] = createSignal<HTMLFieldSetElement>(); // Moved up before it's used\n \n const hasValue = (val: any) => {\n if (val === undefined || val === null) return false;\n if (typeof val === \"string\" && val.trim() === \"\") return false;\n if (Array.isArray(val) && val.length === 0) return false;\n return true;\n };\n\n // Track dirty meta so legend can float once a field has been modified even if some components\n // didn't properly synchronize their internal value signals yet.\n const isDirty = () => {\n if (!local?.formName) return false;\n try { return !!formContext?.formGroup?.getMeta?.(local.formName)?.dirty; } catch { return false; }\n };\n\n const shouldFloat = createMemo(() => {\n let currentVal: any;\n const hasFormContext = !!local?.formName && !!formContext?.formGroup;\n // Prefer form context store value when available\n if (hasFormContext) {\n const formVal = formContext?.data?.[local?.formName ?? ''];\n if (hasValue(formVal)) {\n currentVal = formVal;\n }\n } else if (hasValue(context?.getValue?.())) {\n // Fallback to local provider value only when no form context\n currentVal = context?.getValue?.();\n }\n // Float when value present, focused, or control marked dirty (programmatic set)\n // Access meta directly for reactivity on dirty change\n const metaDirty = local?.formName ? !!formContext?.formGroup?.getMeta?.(local.formName)?.dirty : false;\n // Float when there is a value, or focused, or meta marked dirty (programmatic set),\n // or legacy input marked dirty-on-focus even if still empty (metaDirty && no value yet)\n const hasAnyValue = hasValue(currentVal);\n return hasAnyValue || context?.getFocused?.() || metaDirty;\n });\n\n // Effect: if underlying meta resets to pristine and value cleared, ensure focused state cleared\n createEffect(() => {\n if (!local?.formName) return;\n const meta = formContext?.formGroup?.getMeta?.(local.formName);\n if (!meta) return;\n // Read current value from form context\n const value = formContext?.data?.[local.formName];\n const hasAny = hasValue(value);\n if (!meta.dirty && !meta.touched && !hasAny && context?.getFocused?.()) {\n context?.setFocused?.(false);\n }\n });\n\t\n const theChildren = children(()=>props.children);\n\n const formErrors = () => {\n if (!local?.formName) return [];\n const allErrors = (formContext?.formGroup?.getErrors?.(local.formName) ?? []).filter(e => e.hasError);\n if (allErrors.length === 0) return [];\n let errKeys = allErrors.map(e => e.key);\n if (errKeys.includes('required')) {\n errKeys = errKeys.filter(k => k !== 'minLength' && k !== 'maxLength');\n }\n // Map to displays stored in context errors (ColeError registered displays) if available\n const displayMap = context?.getErrors?.().err ?? [];\n return displayMap.filter(e => errKeys.includes(e.key));\n }\n\n const hasRequired = createMemo(()=>{\n if (isNullish(local?.formName)) return false;\n if (Object.keys(props).includes('required') && props.required !== false) return true;\n return formContext?.formGroup?.hasValidator?.(local?.formName ?? '', 'required');\n });\n\n const getErrorLocStyle = (index: number) => {\n const fieldBox = fieldRef()?.getBoundingClientRect();\n if (!fieldBox) return {};\n return {\n top: `${(index * 12)}px`,\n }\n }\n \n createEffect(()=>{\n context.setName(props.name);\n });\n // Initialize focus state only once (was previously resetting every render and preventing focus-based floating)\n onMount(() => context?.setFocused?.(false));\n\n useClickOutside([fieldRef, context.getOverlayRef], () => {\n if (!isNullish(formContext?.data)) {\n const value = formContext?.data?.[local?.formName ?? ''];\n context?.setTextInside(!hasValue(value));\n } else if (!isNullish(context?.getValue)) {\n const val = context?.getValue?.();\n context?.setTextInside(!hasValue(val));\n }\n const metaDirty = local?.formName ? !!formContext?.formGroup?.getMeta?.(local.formName)?.dirty : false;\n const shouldValidate = !!context?.getFocused?.() || metaDirty;\n if (shouldValidate) {\n formContext?.formGroup?.validate?.(local?.formName ?? '');\n }\n context?.setFocused(false);\n });\n\n onMount(() => {\n if (context?.getValue !== undefined) {\n const textInside = !hasValue(context?.getValue?.());\n context.setTextInside(textInside);\n }\n });\n\n createEffect(() => {\n const fieldRefer = fieldRef?.();\n if (fieldRefer) {\n context?.setFormFieldRef?.(fieldRefer);\n }\n })\n \n return (\n <>\n <fieldset {...others}\n ref={setFieldRef}\n class={`${style[\"primary\"]} ${style.formField} ${shouldFloat() ? style[\"has-focus\"] : \"\"} ${local.class ?? ''}`}>\n <legend class={`${local?.legendClass ?? ''}`}>\n <span class={`${style.legendStyle}`}>\n <Show when={!hasRequired()}>\n {context.getName()}\n </Show>\n <Show when={hasRequired()}>\n {context?.getName()} *\n </Show>\n </span>\n </legend>\n {theChildren()}\n </fieldset>\n <div class={style.errorContainer}>\n <For each={formErrors()}>{(error, index) => {\n return (\n <div class={style.error} style={getErrorLocStyle(index())}>{error.display}</div>\n )\n }}</For>\n </div>\n </>\n );\n};\n\nexport { FormField };\nexport default FormField;"],"names":["FormField","props","_$createComponent","Provider","name","formName","children","FormField2","local","others","splitProps","context","useFormProvider","formContext","useFormContext","fieldRef","setFieldRef","createSignal","hasValue","val","trim","Array","isArray","length","shouldFloat","createMemo","currentVal","formGroup","formVal","data","getValue","metaDirty","getMeta","dirty","getFocused","createEffect","meta","value","hasAny","touched","setFocused","theChildren","hasRequired","isNullish","Object","keys","includes","required","hasValidator","setName","onMount","useClickOutside","getOverlayRef","setTextInside","validate","undefined","textInside","fieldRefer","setFormFieldRef","_el$","_tmpl$","_el$2","firstChild","_el$3","_$use","_$spread","_$mergeProps","style","formField","class","_$insert","Show","when","getName","_$memo","_$effect","_p$","_v$","legendClass","_v$2","legendStyle","e","_$className","t","_el$4","_tmpl$2","For","each","formErrors","allErrors","getErrors","filter","hasError","errKeys","map","key","k","err","error","index","_el$5","display","_v$3","_v$4","fieldBox","getBoundingClientRect","top","getErrorLocStyle","_$style","errorContainer"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{createComponent as e}from"solid-js/web";import{createContext as t,useContext as r,createSignal as o}from"solid-js";const s=t(void 0),i=t=>{const[r,i]=o(t.name??""),[d,l]=o(!1),[n,m]=o(!1),[a,u]=o(t.value??""),[g,f]=o(t.type??"text"),[c,F]=o(),[p,v]=o(),[y,x]=o({err:[]});return e(s.Provider,{get value(){return{getName:r,setName:i,getTextInside:d,setTextInside:l,getFocused:n,setFocused:m,getValue:a,setValue:u,getFieldType:g,setFieldType:f,getFormFieldRef:c,setFormFieldRef:F,getOverlayRef:p,setOverlayRef:v,getErrors:y,setErrors:x,formName:t.formName}},get children(){return t.children}})};function d(){const e=r(s);return e||{}}export{i as Provider,d as useFormProvider};
2
+ //# sourceMappingURL=formProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formProvider.js","sources":["../../../src/components/FormField/formProvider.tsx"],"sourcesContent":["import { Accessor, JSX, Component, createSignal, useContext, createContext, Setter, Context } from \"solid-js\";\nimport { Error } from \"../Form/formHelp/models\";\n\ninterface formFieldContext<T=string> {\n\tgetName: Accessor<string>;\n\tsetName: Setter<string>;\n\tgetTextInside: Accessor<boolean>;\n\tsetTextInside: Setter<boolean>;\n\tgetFocused: Accessor<boolean>;\n\tsetFocused: Setter<boolean>;\n\tgetValue: Accessor<T>;\n\tsetValue: Setter<T>;\n\tgetFieldType: Accessor<string>;\n\tsetFieldType: Setter<string>;\n formName?: string;\n getErrors: Accessor<{err: Error[]}>;\n setErrors: Setter<{err: Error[]}>;\n getFormFieldRef: Accessor<HTMLFieldSetElement | undefined>;\n setFormFieldRef: Setter<HTMLFieldSetElement | undefined>;\n // Active overlay element (e.g. a Select's portaled dropdown / mobile popup) so the\n // FormField click-outside can treat clicks inside it as \"inside\" the field.\n getOverlayRef: Accessor<HTMLElement | undefined>;\n setOverlayRef: Setter<HTMLElement | undefined>;\n}\n\nconst FormFieldContext = createContext<formFieldContext<any> | undefined>(undefined);\ninterface ProviderProps {\n\tchildren: JSX.Element;\n\tname?: string;\n\tvalue?: string;\n\ttype?: string;\n formName?: string;\n}\nexport const Provider: Component<ProviderProps> = (props) => {\n const [getName, setName] = createSignal(props.name ?? \"\");\n const [getTextInside, setTextInside] = createSignal(false);\n const [getFocused, setFocused] = createSignal(false);\n const [getValue, setValue] = createSignal(props.value ?? \"\");\n const [getFieldType, setFieldType] = createSignal(props.type ?? \"text\");\n const [getFormFieldRef, setFormFieldRef] = createSignal<HTMLFieldSetElement>();\n const [getOverlayRef, setOverlayRef] = createSignal<HTMLElement>();\n const [getErrors, setErrors] = createSignal<{err: Error[]}>({err: []});\n return (\n <FormFieldContext.Provider\n value={{\n getName,\n setName,\n getTextInside,\n setTextInside,\n getFocused,\n setFocused,\n getValue,\n setValue,\n getFieldType,\n setFieldType,\n getFormFieldRef,\n setFormFieldRef,\n getOverlayRef,\n setOverlayRef,\n getErrors,\n setErrors,\n formName: props.formName\n }}\n >\n {props.children}\n </FormFieldContext.Provider>\n );\n};\n\nexport function useFormProvider<T=string>(): formFieldContext<T> {\n const context = useContext(FormFieldContext);\n if (!context) {\n return {} as formFieldContext<T>;\n }\n return context;\n};"],"names":["FormFieldContext","createContext","undefined","Provider","props","getName","setName","createSignal","name","getTextInside","setTextInside","getFocused","setFocused","getValue","setValue","value","getFieldType","setFieldType","type","getFormFieldRef","setFormFieldRef","getOverlayRef","setOverlayRef","getErrors","setErrors","err","_$createComponent","formName","children","useFormProvider","context","useContext"],"mappings":"0HAyBA,MAAMA,EAAmBC,OAAiDC,GAQ7DC,EAAsCC,IACjD,MAAOC,EAASC,GAAWC,EAAaH,EAAMI,MAAQ,KAC/CC,EAAeC,GAAiBH,GAAa,IAC7CI,EAAYC,GAAcL,GAAa,IACvCM,EAAUC,GAAYP,EAAaH,EAAMW,OAAS,KAClDC,EAAcC,GAAgBV,EAAaH,EAAMc,MAAQ,SACzDC,EAAiBC,GAAmBb,KACpCc,EAAeC,GAAiBf,KAChCgB,EAAWC,GAAajB,EAA6B,CAACkB,IAAK,KAClE,OAAAC,EACG1B,EAAiBG,SAAQ,CAAA,SACxBY,GAAK,MAAE,CACLV,UACAC,UACAG,gBACAC,gBACAC,aACAC,aACAC,WACAC,WACAE,eACAC,eACAE,kBACAC,kBACAC,gBACAC,gBACAC,YACAC,YACAG,SAAUvB,EAAMuB,SACjB,EAAA,YAAAC,GAAA,OAEAxB,EAAMwB,QAAQ,cAKLC,IACd,MAAMC,EAAUC,EAAW/B,GAC3B,OAAK8B,GACI,CAAA,CAGX"}
@@ -0,0 +1,2 @@
1
+ import n from"../../styleInject.js";var e={formField:"formfield-module_formField__w6mH9","has-focus":"formfield-module_has-focus__9ingx",primary:"formfield-module_primary__7BYyQ",legendStyle:"formfield-module_legendStyle__gnI49",errorContainer:"formfield-module_errorContainer__HR4PL",error:"formfield-module_error__wNBh2"};n('.formfield-module_formField__w6mH9:focus-within > legend, .formfield-module_has-focus__9ingx > legend {\n top: -8px !important;\n font-size: 0.75rem !important;\n}\n\n.formfield-module_formField__w6mH9 {\n position: relative;\n display: inline-block;\n border-radius: var(--border-radius-md);\n box-sizing: border-box;\n border: none;\n background-color: var(--container-color, #ffffff);\n color: var(--on-container-color, #000);\n margin-top: 0px !important;\n margin-bottom: 0px !important;\n}\n.formfield-module_formField__w6mH9 > legend {\n position: absolute;\n left: 12px;\n top: calc(50% - 0.5em);\n font-size: 1rem;\n transition: top 0.25s ease, font-size 0.25s ease;\n pointer-events: none;\n}\n.formfield-module_formField__w6mH9 input::-moz-placeholder, .formfield-module_formField__w6mH9 select::-moz-placeholder {\n opacity: 0 !important;\n -moz-transition: opacity 0.25s ease;\n transition: opacity 0.25s ease;\n}\n.formfield-module_formField__w6mH9 input::placeholder,\n.formfield-module_formField__w6mH9 select::placeholder {\n opacity: 0 !important;\n transition: opacity 0.25s ease;\n}\n.formfield-module_formField__w6mH9 label {\n position: relative;\n top: -0.5rem;\n padding-right: 10px;\n}\n.formfield-module_formField__w6mH9:has(textarea) {\n position: relative;\n margin: 8px;\n}\n.formfield-module_formField__w6mH9:has(textarea) textarea {\n background-color: var(--container-color, #ffffff);\n color: var(--on-container-color, #000);\n width: auto;\n min-width: 95%;\n font-family: "Roboto, sans-serif";\n font-size: 16px;\n padding-bottom: 8px;\n border: none;\n}\n.formfield-module_formField__w6mH9:has(textarea) textarea:focus {\n outline: none;\n}\n.formfield-module_formField__w6mH9:has(textarea) textarea::-moz-placeholder {\n color: var(--on-container-color, #000);\n opacity: var(--text-emphasis-medium, 87%);\n}\n.formfield-module_formField__w6mH9:has(textarea) textarea::placeholder {\n color: var(--on-container-color, #000);\n opacity: var(--text-emphasis-medium, 87%);\n}\n.formfield-module_formField__w6mH9:has(textarea) legend {\n height: 24px;\n position: absolute;\n left: 8px;\n transition: all 0.25s ease;\n}\n.formfield-module_formField__w6mH9:has([is=coles-solid-select]) {\n position: relative;\n height: 48px !important;\n padding: 0px !important;\n width: 100%;\n}\n.formfield-module_formField__w6mH9:has([is=coles-solid-select]) legend {\n height: 16px;\n max-height: 16px;\n transition: all 0.25s ease;\n top: calc(50% - 1em);\n z-index: 1;\n}\n.formfield-module_formField__w6mH9:has([is=coles-solid-select]) [is=coles-solid-select] {\n position: absolute;\n left: 0px;\n right: 0px;\n padding: 0px !important;\n margin: 0px !important;\n height: 48px !important;\n border-radius: 4px;\n font-family: "Roboto, sans-serif";\n font-size: 16px;\n width: auto;\n min-width: 95%;\n z-index: 0;\n}\n.formfield-module_formField__w6mH9:has([is=coles-solid-select]) [is=coles-solid-select]:nth-child(n) {\n border-radius: 4px;\n}\n.formfield-module_formField__w6mH9:has(input[type=text]) {\n height: 48px;\n position: relative;\n width: 100%;\n margin-top: 16px;\n margin-bottom: 16px;\n}\n.formfield-module_formField__w6mH9:has(input[type=text]) legend {\n position: absolute;\n height: 24px;\n left: 8px;\n transition: all 0.25s ease;\n}\n.formfield-module_formField__w6mH9:has(input[type=text]) input[type=text] {\n background-color: transparent !important;\n height: 24px;\n border-radius: 4px;\n margin: 8px 0px;\n font-family: "Roboto, sans-serif";\n font-size: 16px;\n width: 100%;\n min-width: 95%;\n}\n.formfield-module_formField__w6mH9:has(input[type=text]) input[type=text]::-moz-placeholder {\n opacity: 0;\n}\n.formfield-module_formField__w6mH9:has(input[type=text]) input[type=text]::placeholder {\n opacity: 0;\n}\n.formfield-module_formField__w6mH9:has(input[type=number]) {\n height: 48px;\n position: relative;\n width: 100%;\n margin-top: 16px;\n margin-bottom: 16px;\n}\n.formfield-module_formField__w6mH9:has(input[type=number]) legend {\n height: 24px;\n position: absolute;\n left: 8px;\n transition: all 0.25s ease;\n}\n.formfield-module_formField__w6mH9:has(input[type=number]) input[type=number] {\n background-color: transparent !important;\n color: var(--on-primary-color, #fff);\n height: 24px;\n border-radius: 4px;\n margin: 8px 0px;\n font-family: "Roboto, sans-serif";\n font-size: 16px;\n width: 100%;\n min-width: 95%;\n}\n.formfield-module_formField__w6mH9:has(input[type=number]) input[type=number]::-moz-placeholder {\n opacity: 0;\n}\n.formfield-module_formField__w6mH9:has(input[type=number]) input[type=number]::placeholder {\n opacity: 0;\n}\n@media screen and (max-width: 768px) {\n .formfield-module_formField__w6mH9 {\n max-width: 75%;\n }\n}\n\n.formfield-module_topMargin__dahW5 {\n margin-top: 12px;\n}\n\n.formfield-module_primary__7BYyQ:has(input[type=text]) input[type=text] {\n color: var(--on-container-color, #000);\n}\n.formfield-module_primary__7BYyQ:has(input[type=text]) input[type=text]::-moz-placeholder {\n color: var(--on-container-color, #000);\n opacity: var(--text-emphasis-medium, 87%);\n}\n.formfield-module_primary__7BYyQ:has(input[type=text]) input[type=text]::placeholder {\n color: var(--on-container-color, #000);\n opacity: var(--text-emphasis-medium, 87%);\n}\n.formfield-module_primary__7BYyQ:has(input[type=number]) input[type=number] {\n color: var(--on-container-color, #000);\n}\n.formfield-module_primary__7BYyQ:has(input[type=number]) input[type=number]::-moz-placeholder {\n color: var(--on-container-color, #000);\n opacity: var(--text-emphasis-medium, 87%);\n}\n.formfield-module_primary__7BYyQ:has(input[type=number]) input[type=number]::placeholder {\n color: var(--on-container-color, #000);\n opacity: var(--text-emphasis-medium, 87%);\n}\n.formfield-module_primary__7BYyQ:has([is=coles-solid-select]) [is=coles-solid-select] {\n background-color: var(--container-color, #ffffff);\n color: var(--on-container-color, #000);\n}\n.formfield-module_primary__7BYyQ:has(textarea) {\n width: 100%;\n height: auto;\n}\n.formfield-module_primary__7BYyQ:has(textarea) textarea {\n background-color: var(--container-color, #ffffff);\n color: var(--on-container-color, #000);\n}\n.formfield-module_primary__7BYyQ:has(textarea) textarea::-moz-placeholder {\n color: var(--on-container-color, #000);\n opacity: var(--text-emphasis-medium, 87%);\n}\n.formfield-module_primary__7BYyQ:has(textarea) textarea::placeholder {\n color: var(--on-container-color, #000);\n opacity: var(--text-emphasis-medium, 87%);\n}\n\n.formfield-module_legendStyle__gnI49 {\n background-color: transparent;\n opacity: var(--text-emphasis-medium, 87%);\n width: 100%;\n transition: all 0.3s ease;\n}\n\n.formfield-module_checkboxPadding__DU1CG {\n padding: 0px;\n padding-bottom: 10px;\n padding-left: 10px;\n padding-right: 10px;\n}\n\n.formfield-module_errorContainer__HR4PL {\n position: relative;\n min-height: 2rem;\n}\n\n.formfield-module_error__wNBh2 {\n position: absolute;\n background: transparent;\n color: var(--error-color, #B00020);\n font-size: 10px;\n}');export{e as default};
2
+ //# sourceMappingURL=formfield.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formfield.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ var t='<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 -960 960 960"><path d="M480-344 240-584l43-43 197 197 197-197 43 43-240 240Z"/></svg>';export{t as default};
2
+ //# sourceMappingURL=keyboard_arrow_down.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard_arrow_down.js","sources":["../../../../../src/components/Icon/generated/outlined/keyboard_arrow_down.js"],"sourcesContent":["export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"48\\\" height=\\\"48\\\" viewBox=\\\"0 -960 960 960\\\"><path d=\\\"M480-344 240-584l43-43 197 197 197-197 43 43-240 240Z\\\"/></svg>\";\n"],"names":["KeyboardArrowDown"],"mappings":"AAAA,IAAAA,EAAe"}
@@ -0,0 +1,2 @@
1
+ var t='<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 -960 960 960"><path d="M480-554 283-357l-43-43 240-240 240 240-43 43-197-197Z"/></svg>';export{t as default};
2
+ //# sourceMappingURL=keyboard_arrow_up.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard_arrow_up.js","sources":["../../../../../src/components/Icon/generated/outlined/keyboard_arrow_up.js"],"sourcesContent":["export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"48\\\" height=\\\"48\\\" viewBox=\\\"0 -960 960 960\\\"><path d=\\\"M480-554 283-357l-43-43 240-240 240 240-43 43-197-197Z\\\"/></svg>\";\n"],"names":["KeyboardArrowUp"],"mappings":"AAAA,IAAAA,EAAe"}
@@ -1,18 +1,13 @@
1
- import { Component, JSX } from "solid-js";
1
+ import { Component } from "solid-js";
2
2
  export interface IconProps {
3
- /** Icon name resolved at runtime via the lazy registry (e.g. "home"). Also settable as a text-node child. */
4
- name?: string;
5
- /** A pre-imported SVG string from `coles-solid-library/icons` — the tree-shakeable path. Wins over `name`. */
3
+ /** A pre-imported SVG string from `coles-solid-library/icons` the tree-shakeable path. */
4
+ id?: string;
6
5
  icon?: string;
7
6
  size?: number | "small" | "medium" | "large";
8
7
  color?: string;
9
- /** Ignored when `icon` is supplied (the variant is baked into which export you imported). */
10
- variant?: "outlined" | "rounded" | "sharp";
11
8
  onClick?: (e: MouseEvent) => void;
12
9
  onPointerDown?: (e: PointerEvent) => void;
13
10
  ref?: (el: HTMLDivElement) => void;
14
- /** Text-node child as an alias for `name` (e.g. <Icon>home</Icon>). */
15
- children?: JSX.Element;
16
11
  }
17
12
  declare const Icon: Component<IconProps>;
18
13
  export default Icon;
@@ -0,0 +1,2 @@
1
+ import{use as i,effect as e,setAttribute as r,className as t,setStyleProperty as o,template as l}from"solid-js/web";import{createMemo as s}from"solid-js";import n from"./icon.module.scss.js";var c=l("<div style=display:inline-block>");const d={small:16,medium:24,large:32},a=l=>{const a=s(()=>{if("number"==typeof l.size)return l.size;const i=l.size;return l.size&&d[i]?d[i]:24}),f=s(()=>l.color??"currentColor"),p=s(()=>l.icon??""),u=s(()=>{const i=p();if(!i)return"";const e=f(),r=a();let t=i.replace(/width=".*?"/g,`width="${r}"`).replace(/height=".*?"/g,`height="${r}"`);return t=/fill="/.test(t)?t.replace(/fill=".*?"/g,`fill="${e}"`):t.replace(/<svg([^>]*)>/,(i,r)=>{if(/fill=/.test(r))return`<svg${r}>`;const t=r&&r.endsWith(" ")?"":" ";return`<svg${r}${t}fill="${e}">`}),t});return v=c(),i(i=>{l?.ref?.(i)},v),e(i=>{var e=l.id,s=n.icon,c=`${a()}px`,d=`${a()}px`,f=u();return e!==i.e&&r(v,"id",i.e=e),s!==i.t&&t(v,i.t=s),c!==i.a&&o(v,"width",i.a=c),d!==i.o&&o(v,"height",i.o=d),f!==i.i&&(v.innerHTML=i.i=f),i},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),v;var v};export{a as Icon};
2
+ //# sourceMappingURL=icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon.js","sources":["../../../src/components/Icon/icon.tsx"],"sourcesContent":["import {\n Component,\n createMemo,\n} from \"solid-js\";\n// @ts-ignore\nimport styles from \"./icon.module.scss\";\n\n// Icons are supplied as pre-imported SVG strings via the `icon` prop — the tree-shakeable\n// static path. Import the icons you use from `coles-solid-library/icons` (or `/icons/rounded`,\n// `/icons/sharp`) so a consumer's bundler drops every icon it never references. There is no\n// runtime name-lookup path: it required a registry enumerating every icon, which forced\n// bundlers to emit all ~7.7k icon chunks per variant (breaking PWA service-worker precaching).\n\nexport interface IconProps {\n /** A pre-imported SVG string from `coles-solid-library/icons` — the tree-shakeable path. */\n id?: string;\n icon?: string;\n size?: number | \"small\" | \"medium\" | \"large\";\n color?: string;\n onClick?: (e: MouseEvent) => void;\n onPointerDown?: (e: PointerEvent) => void;\n ref?: (el: HTMLDivElement) => void;\n}\n\nconst sizeMap = { small: 16, medium: 24, large: 32 } as const;\n\nconst Icon: Component<IconProps> = (props) => {\n const size = createMemo(() => {\n if (typeof props.size === \"number\") return props.size;\n const key = props.size as keyof typeof sizeMap;\n if (props.size && sizeMap[key]) return sizeMap[key];\n return 24;\n });\n const color = createMemo(() => props.color ?? \"currentColor\");\n\n const rawSvg = createMemo(() => props.icon ?? \"\");\n\n // Recolor + resize the raw SVG markup (preserved verbatim from the original implementation).\n const svg = createMemo(() => {\n const markup = rawSvg();\n if (!markup) return \"\";\n\n const nextColor = color();\n const nextSize = size();\n\n let nextMarkup = markup\n .replace(/width=\".*?\"/g, `width=\"${nextSize}\"`)\n .replace(/height=\".*?\"/g, `height=\"${nextSize}\"`);\n\n if (/fill=\"/.test(nextMarkup)) {\n nextMarkup = nextMarkup.replace(/fill=\".*?\"/g, `fill=\"${nextColor}\"`);\n } else {\n nextMarkup = nextMarkup.replace(/<svg([^>]*)>/, (match, attrs) => {\n if (/fill=/.test(attrs)) {\n return `<svg${attrs}>`;\n }\n const spacer = attrs && attrs.endsWith(\" \") ? \"\" : attrs ? \" \" : \" \";\n return `<svg${attrs}${spacer}fill=\"${nextColor}\">`;\n });\n }\n\n return nextMarkup;\n });\n\n return (\n <div\n id={props.id}\n class={styles.icon}\n ref={(el) => {\n props?.ref?.(el);\n }}\n style={{\n width: `${size()}px`,\n height: `${size()}px`,\n display: \"inline-block\",\n }}\n innerHTML={svg()}\n />\n );\n};\n\nexport default Icon;\nexport { Icon };\n"],"names":["sizeMap","small","medium","large","Icon","props","size","createMemo","key","color","rawSvg","icon","svg","markup","nextColor","nextSize","nextMarkup","replace","test","match","attrs","spacer","endsWith","_el$","_tmpl$","_$use","el","ref","_$effect","_p$","_v$","id","_v$2","styles","_v$3","_v$4","_v$5","e","_$setAttribute","t","_$className","a","_$setStyleProperty","o","i","innerHTML","undefined"],"mappings":"2OAwBA,MAAMA,EAAU,CAAEC,MAAO,GAAIC,OAAQ,GAAIC,MAAO,IAE1CC,EAA8BC,IAClC,MAAMC,EAAOC,EAAW,KACtB,GAA0B,iBAAfF,EAAMC,KAAmB,OAAOD,EAAMC,KACjD,MAAME,EAAMH,EAAMC,KAClB,OAAID,EAAMC,MAAQN,EAAQQ,GAAaR,EAAQQ,GACxC,KAEHC,EAAQF,EAAW,IAAMF,EAAMI,OAAS,gBAExCC,EAASH,EAAW,IAAMF,EAAMM,MAAQ,IAGxCC,EAAML,EAAW,KACrB,MAAMM,EAASH,IACf,IAAKG,EAAQ,MAAO,GAEpB,MAAMC,EAAYL,IACZM,EAAWT,IAEjB,IAAIU,EAAaH,EACdI,QAAQ,eAAgB,UAAUF,MAClCE,QAAQ,gBAAiB,WAAWF,MAcvC,OAXEC,EADE,SAASE,KAAKF,GACHA,EAAWC,QAAQ,cAAe,SAASH,MAE3CE,EAAWC,QAAQ,eAAgB,CAACE,EAAOC,KACtD,GAAI,QAAQF,KAAKE,GACf,MAAO,OAAOA,KAEhB,MAAMC,EAASD,GAASA,EAAME,SAAS,KAAO,GAAa,IAC3D,MAAO,OAAOF,IAAQC,UAAeP,QAIlCE,IAGT,OAAAO,EAAAC,IAAAC,EAIUC,IACJrB,GAAOsB,MAAMD,IACdH,GAAAK,EAAAC,IAAA,IAAAC,EAJGzB,EAAM0B,GAAEC,EACLC,EAAOtB,KAAIuB,EAKT,GAAG5B,QAAU6B,EACZ,GAAG7B,QAAU8B,EAGZxB,IAAK,OAAAkB,IAAAD,EAAAQ,GAAAC,EAAAf,EAAA,KAAAM,EAAAQ,EAAAP,GAAAE,IAAAH,EAAAU,GAAAC,EAAAjB,EAAAM,EAAAU,EAAAP,GAAAE,IAAAL,EAAAY,GAAAC,EAAAnB,EAAA,QAAAM,EAAAY,EAAAP,GAAAC,IAAAN,EAAAc,GAAAD,EAAAnB,EAAA,SAAAM,EAAAc,EAAAR,GAAAC,IAAAP,EAAAe,IAAArB,EAAAsB,UAAAhB,EAAAe,EAAAR,GAAAP,GAAA,CAAAQ,OAAAS,EAAAP,OAAAO,EAAAL,OAAAK,EAAAH,OAAAG,EAAAF,OAAAE,IAAAvB,EAZpB,IAAAA"}
@@ -0,0 +1,2 @@
1
+ import n from"../../styleInject.js";var o={icon:"icon-module_icon__K4BP-"};n(".icon-module_icon__K4BP- {\n outline: none !important;\n border: none !important;\n}\n.icon-module_icon__K4BP- svg {\n color: var(--header-on-background-color, #fff) !important;\n}\n.icon-module_icon__K4BP-:focus {\n outline: none !important;\n border: none !important;\n}\n.icon-module_icon__K4BP-:active {\n outline: none !important;\n border: none !important;\n}");export{o as default};
2
+ //# sourceMappingURL=icon.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}