@kirill.konshin/utils 0.0.17 → 0.0.19

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 (170) hide show
  1. package/.turbo/turbo-build.log +38 -38
  2. package/.turbo/turbo-test.log +37 -37
  3. package/CHANGELOG.md +12 -0
  4. package/dist/bootstrap/adaptiveContainer.d.ts +2 -1
  5. package/dist/bootstrap/adaptiveContainer.d.ts.map +1 -1
  6. package/dist/bootstrap/adaptiveContainer.js +2 -2
  7. package/dist/bootstrap/adaptiveContainer.js.map +1 -1
  8. package/dist/bootstrap/controls.d.ts +6 -6
  9. package/dist/bootstrap/controls.d.ts.map +1 -1
  10. package/dist/bootstrap/controls.js.map +1 -1
  11. package/dist/bootstrap/error.d.ts +4 -2
  12. package/dist/bootstrap/error.d.ts.map +1 -1
  13. package/dist/bootstrap/error.js +2 -7
  14. package/dist/bootstrap/error.js.map +1 -1
  15. package/dist/bootstrap/field.d.ts +4 -2
  16. package/dist/bootstrap/field.d.ts.map +1 -1
  17. package/dist/bootstrap/field.js +2 -2
  18. package/dist/bootstrap/field.js.map +1 -1
  19. package/dist/bootstrap/footer.d.ts +5 -5
  20. package/dist/bootstrap/footer.d.ts.map +1 -1
  21. package/dist/bootstrap/footer.js +9 -4
  22. package/dist/bootstrap/footer.js.map +1 -1
  23. package/dist/bootstrap/globalLoading.d.ts +4 -2
  24. package/dist/bootstrap/globalLoading.d.ts.map +1 -1
  25. package/dist/bootstrap/globalLoading.js +2 -2
  26. package/dist/bootstrap/globalLoading.js.map +1 -1
  27. package/dist/bootstrap/loading.d.ts +4 -2
  28. package/dist/bootstrap/loading.d.ts.map +1 -1
  29. package/dist/bootstrap/loading.js +3 -2
  30. package/dist/bootstrap/loading.js.map +1 -1
  31. package/dist/bootstrap/responsiveHelper.d.ts +2 -1
  32. package/dist/bootstrap/responsiveHelper.d.ts.map +1 -1
  33. package/dist/bootstrap/responsiveHelper.js +5 -5
  34. package/dist/bootstrap/responsiveHelper.js.map +1 -1
  35. package/dist/bootstrap/screen.d.ts +4 -2
  36. package/dist/bootstrap/screen.d.ts.map +1 -1
  37. package/dist/bootstrap/screen.js +3 -2
  38. package/dist/bootstrap/screen.js.map +1 -1
  39. package/dist/bootstrap/toaster.d.ts +4 -2
  40. package/dist/bootstrap/toaster.d.ts.map +1 -1
  41. package/dist/bootstrap/toaster.js +2 -5
  42. package/dist/bootstrap/toaster.js.map +1 -1
  43. package/dist/bootstrap/useModal.d.ts +2 -1
  44. package/dist/bootstrap/useModal.d.ts.map +1 -1
  45. package/dist/bootstrap/useModal.js +3 -3
  46. package/dist/bootstrap/useModal.js.map +1 -1
  47. package/dist/bootstrap/useWrappedForm.d.ts +1 -1
  48. package/dist/bootstrap/useWrappedForm.d.ts.map +1 -1
  49. package/dist/bootstrap/useWrappedForm.js.map +1 -1
  50. package/dist/core/cache.d.ts +2 -2
  51. package/dist/core/cache.d.ts.map +1 -1
  52. package/dist/core/cache.js.map +1 -1
  53. package/dist/core/errors.d.ts.map +1 -1
  54. package/dist/core/errors.js.map +1 -1
  55. package/dist/core/files.d.ts +2 -1
  56. package/dist/core/files.d.ts.map +1 -1
  57. package/dist/core/files.js +7 -3
  58. package/dist/core/files.js.map +1 -1
  59. package/dist/core/index.js +2 -1
  60. package/dist/core/ls.d.ts +1 -1
  61. package/dist/core/ls.d.ts.map +1 -1
  62. package/dist/core/ls.js.map +1 -1
  63. package/dist/core/measure.d.ts +4 -4
  64. package/dist/core/measure.d.ts.map +1 -1
  65. package/dist/core/measure.js +5 -1
  66. package/dist/core/measure.js.map +1 -1
  67. package/dist/core/worker.d.ts +3 -3
  68. package/dist/core/worker.d.ts.map +1 -1
  69. package/dist/core/worker.js.map +1 -1
  70. package/dist/core/wrpc.d.ts +4 -4
  71. package/dist/core/wrpc.d.ts.map +1 -1
  72. package/dist/core/wrpc.fixture.d.ts +1 -4
  73. package/dist/core/wrpc.fixture.d.ts.map +1 -1
  74. package/dist/core/wrpc.js.map +1 -1
  75. package/dist/electron/createWindow.d.ts.map +1 -1
  76. package/dist/electron/createWindow.js.map +1 -1
  77. package/dist/electron/updater.d.ts +1 -1
  78. package/dist/electron/updater.d.ts.map +1 -1
  79. package/dist/electron/updater.js +1 -1
  80. package/dist/electron/updater.js.map +1 -1
  81. package/dist/electron-builder/images.d.ts.map +1 -1
  82. package/dist/electron-builder/images.js.map +1 -1
  83. package/dist/mui/formControlFieldset.d.ts +2 -2
  84. package/dist/mui/formControlFieldset.d.ts.map +1 -1
  85. package/dist/mui/formControlFieldset.js.map +1 -1
  86. package/dist/mui/formLabelLegend.d.ts +2 -2
  87. package/dist/mui/formLabelLegend.d.ts.map +1 -1
  88. package/dist/mui/formLabelLegend.js.map +1 -1
  89. package/dist/mui/genericControl.d.ts +2 -2
  90. package/dist/mui/genericControl.d.ts.map +1 -1
  91. package/dist/mui/genericControl.js.map +1 -1
  92. package/dist/mui/readOnly.d.ts +2 -2
  93. package/dist/mui/readOnly.d.ts.map +1 -1
  94. package/dist/mui/readOnly.js.map +1 -1
  95. package/dist/next/measure.d.ts.map +1 -1
  96. package/dist/next/measure.js.map +1 -1
  97. package/dist/next/noSSR.d.ts +27 -3
  98. package/dist/next/noSSR.d.ts.map +1 -1
  99. package/dist/next/noSSR.js +2 -4
  100. package/dist/next/noSSR.js.map +1 -1
  101. package/dist/react/form/client.d.ts.map +1 -1
  102. package/dist/react/form/client.js.map +1 -1
  103. package/dist/react/form/form.d.ts +22 -8
  104. package/dist/react/form/form.d.ts.map +1 -1
  105. package/dist/react/form/form.js +27 -7
  106. package/dist/react/form/form.js.map +1 -1
  107. package/dist/react/index.js +2 -1
  108. package/dist/react/keyboard.d.ts +5 -6
  109. package/dist/react/keyboard.d.ts.map +1 -1
  110. package/dist/react/keyboard.js.map +1 -1
  111. package/dist/react/useFetcher.d.ts.map +1 -1
  112. package/dist/react/useFetcher.js.map +1 -1
  113. package/dist/react-native/share.d.ts +1 -1
  114. package/dist/react-native/share.d.ts.map +1 -1
  115. package/dist/react-native/share.js.map +1 -1
  116. package/dist/react-native/update.d.ts +2 -3
  117. package/dist/react-native/update.d.ts.map +1 -1
  118. package/dist/react-native/update.js +2 -2
  119. package/dist/react-native/update.js.map +1 -1
  120. package/dist/react-native/useAppState.d.ts +1 -1
  121. package/dist/react-native/useAppState.d.ts.map +1 -1
  122. package/dist/react-native/useAppState.js.map +1 -1
  123. package/dist/tailwind/fullpage.d.ts +2 -6
  124. package/dist/tailwind/fullpage.d.ts.map +1 -1
  125. package/dist/tailwind/fullpage.js.map +1 -1
  126. package/dist/tailwind/responsiveHelper.d.ts +2 -1
  127. package/dist/tailwind/responsiveHelper.d.ts.map +1 -1
  128. package/dist/tailwind/responsiveHelper.js +2 -2
  129. package/dist/tailwind/responsiveHelper.js.map +1 -1
  130. package/package.json +1 -1
  131. package/src/bootstrap/adaptiveContainer.tsx +3 -3
  132. package/src/bootstrap/controls.stories.tsx +1 -1
  133. package/src/bootstrap/controls.tsx +12 -12
  134. package/src/bootstrap/error.tsx +7 -10
  135. package/src/bootstrap/field.tsx +11 -9
  136. package/src/bootstrap/footer.tsx +17 -5
  137. package/src/bootstrap/globalLoading.tsx +5 -3
  138. package/src/bootstrap/loading.tsx +10 -8
  139. package/src/bootstrap/responsiveHelper.tsx +11 -6
  140. package/src/bootstrap/screen.tsx +24 -22
  141. package/src/bootstrap/toaster.tsx +8 -6
  142. package/src/bootstrap/useModal.tsx +12 -7
  143. package/src/bootstrap/useWrappedForm.ts +9 -7
  144. package/src/core/cache.ts +15 -8
  145. package/src/core/errors.ts +4 -1
  146. package/src/core/files.ts +8 -4
  147. package/src/core/ls.ts +8 -4
  148. package/src/core/measure.ts +55 -7
  149. package/src/core/worker.ts +18 -11
  150. package/src/core/wrpc.fixture.ts +40 -6
  151. package/src/core/wrpc.ts +23 -5
  152. package/src/electron/createWindow.ts +3 -3
  153. package/src/electron/updater.ts +1 -1
  154. package/src/electron-builder/images.ts +1 -1
  155. package/src/mui/formControlFieldset.tsx +2 -2
  156. package/src/mui/formLabelLegend.tsx +2 -2
  157. package/src/mui/genericControl.tsx +2 -2
  158. package/src/mui/readOnly.tsx +2 -2
  159. package/src/next/measure.ts +19 -2
  160. package/src/next/noSSR.tsx +26 -7
  161. package/src/react/form/client.tsx +13 -2
  162. package/src/react/form/form.tsx +67 -18
  163. package/src/react/keyboard.tsx +9 -4
  164. package/src/react/useFetcher.ts +8 -3
  165. package/src/react-native/share.ts +1 -1
  166. package/src/react-native/update.tsx +3 -3
  167. package/src/react-native/useAppState.ts +1 -1
  168. package/src/tailwind/fullpage.tsx +2 -2
  169. package/src/tailwind/responsiveHelper.tsx +3 -3
  170. package/tsconfig.json +1 -0
@@ -1,14 +1,12 @@
1
1
  "use client";
2
- import { jsx } from "react/jsx-runtime";
3
2
  import { useState, useLayoutEffect } from "react";
4
- const DefaultOnSSR = () => /* @__PURE__ */ jsx("span", {});
5
- function NoSSR({ children, onSSR = /* @__PURE__ */ jsx(DefaultOnSSR, {}) }) {
3
+ const NoSSR = function NoSSR2({ children, onSSR = null }) {
6
4
  const [canRender, setCanRender] = useState(false);
7
5
  useLayoutEffect(() => {
8
6
  setCanRender(true);
9
7
  }, []);
10
8
  return canRender ? children : onSSR;
11
- }
9
+ };
12
10
  export {
13
11
  NoSSR
14
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"noSSR.js","sources":["../../src/next/noSSR.tsx"],"sourcesContent":["'use client';\n\nimport React, { useLayoutEffect, useState } from 'react';\n\nconst DefaultOnSSR = () => <span />;\n\n// @see https://github.com/kadirahq/react-no-ssr/blob/master/src/index.js\n// @see https://nextjs.org/docs/messages/react-hydration-error#solution-1-using-useeffect-to-run-on-the-client-only\nexport function NoSSR({ children, onSSR = <DefaultOnSSR /> }) {\n const [canRender, setCanRender] = useState(false);\n\n useLayoutEffect(() => {\n setCanRender(true);\n }, []);\n\n return canRender ? children : onSSR;\n}\n"],"names":[],"mappings":";;;AAIA,MAAM,eAAe,MAAM,oBAAC,QAAK,EAAA;AAI1B,SAAS,MAAM,EAAE,UAAU,QAAS,oBAAA,cAAA,CAAa,CAAA,KAAM;AAC1D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,kBAAgB,MAAM;AAClB,iBAAa,IAAI;AAAA,EACrB,GAAG,EAAE;AAEL,SAAO,YAAY,WAAW;AAClC;"}
1
+ {"version":3,"file":"noSSR.js","sources":["../../src/next/noSSR.tsx"],"sourcesContent":["'use client';\n\nimport React, { FC, JSX, useLayoutEffect, useState } from 'react';\n\n/**\n * Prefer using Next.js `dynamic()` import with `ssr: false` because this will also remove import from server bundle.\n *\n * ```tsx\n * 'use client';\n *\n * import React from 'react';\n * import dynamic from 'next/dynamic';\n *\n * const PageClient = dynamic(() => import('./pageClient'), { ssr: false });\n *\n * export default function Page() {\n * return (\n * <PageClient />\n * );\n * }\n * ```\n *\n * In other cases this component can be used to just prevent server rendering.\n *\n * @see https://github.com/kadirahq/react-no-ssr/blob/master/src/index.js\n * @see https://nextjs.org/docs/messages/react-hydration-error#solution-1-using-useeffect-to-run-on-the-client-only\n */\nexport const NoSSR: FC<{ children: any; onSSR?: JSX.Element }> = function NoSSR({ children, onSSR = null }): any {\n const [canRender, setCanRender] = useState(false);\n\n useLayoutEffect(() => {\n setCanRender(true);\n }, []);\n\n return canRender ? children : onSSR;\n};\n"],"names":["NoSSR"],"mappings":";;AA2BO,MAAM,QAAoD,SAASA,OAAM,EAAE,UAAU,QAAQ,QAAa;AAC7G,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,kBAAgB,MAAM;AAClB,iBAAa,IAAI;AAAA,EACrB,GAAG,EAAE;AAEL,SAAO,YAAY,WAAW;AAClC;"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/react/form/client.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAU,WAAW,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,wBAAgB,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;8BAqBhD,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,gBACvC,WAAW,CAAC,CAAC,CAAC;wCAWjB,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,gBACvC,WAAW,CAAC,CAAC,CAAC,KAC5B,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;EAkB9E"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/react/form/client.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAU,WAAW,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,wBAAgB,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EACnD,MAAM,EAAE,CAAC,GACV;IACC,aAAa,EAAE,CACX,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EACpD,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,KAC3B,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACvF,uBAAuB,EAAE,CACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EACpD,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,KAC3B,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;CACjF,CAqDA"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sources":["../../../src/react/form/client.tsx"],"sourcesContent":["'use client';\n\nimport { useActionState, useCallback, useState, useTransition } from 'react';\nimport { create, MaybeTypeOf, Validation } from './form';\nimport { z } from 'zod';\n\nconst FORM_DEBUG = process.env.NEXT_PUBLIC_FORM_DEBUG === 'true';\n\nexport function createClient<S extends z.ZodObject<any>>(schema: S) {\n const { validate } = create(schema);\n\n function useValidationCallback(\n actionFn: (data: FormData) => Promise<Validation<S>>,\n ): (formData: FormData) => Promise<Validation<S>> {\n return useCallback(\n async (formData: FormData) => {\n const clientRes = validate(formData);\n console.log('Client validation', FORM_DEBUG ? 'ignored' : 'active', clientRes);\n if (!clientRes.success && !FORM_DEBUG) return clientRes;\n\n const serverRes = await actionFn(formData);\n console.log('Server validation', serverRes);\n return serverRes;\n },\n [actionFn],\n );\n }\n\n function useValidation(\n actionFn: (data: FormData) => Promise<Validation<S>>,\n initialData: MaybeTypeOf<S> = {} as MaybeTypeOf<S>,\n ) {\n const cb = useValidationCallback(actionFn);\n\n return useActionState<Validation<S>, FormData>(async (_, data) => cb(data), {\n success: false,\n data: initialData,\n });\n }\n\n function useValidationTransition(\n actionFn: (data: FormData) => Promise<Validation<S>>,\n initialData: MaybeTypeOf<S> = {} as MaybeTypeOf<S>,\n ): [Validation<S>, (formData: FormData) => Promise<Validation<S>>, boolean] {\n const [isPending, startTransition] = useTransition();\n const [state, setState] = useState<Validation<S>>({ success: false, data: initialData });\n const cb = useValidationCallback(actionFn);\n\n const wrappedCb = useCallback(\n (formData: FormData) => {\n const promise = cb(formData);\n startTransition(() => promise.then(setState));\n return promise;\n },\n [cb, startTransition],\n );\n\n return [state, wrappedCb, isPending];\n }\n\n return { useValidation, useValidationTransition };\n}\n"],"names":[],"mappings":";;;AAMA,MAAM,aAAa,QAAQ,IAAI,2BAA2B;AAEnD,SAAS,aAAyC,QAAW;AAChE,QAAM,EAAE,SAAA,IAAa,OAAO,MAAM;AAElC,WAAS,sBACL,UAC8C;AACvC,WAAA;AAAA,MACH,OAAO,aAAuB;AACpB,cAAA,YAAY,SAAS,QAAQ;AACnC,gBAAQ,IAAI,qBAAqB,aAAa,YAAY,UAAU,SAAS;AAC7E,YAAI,CAAC,UAAU,WAAW,CAAC,WAAmB,QAAA;AAExC,cAAA,YAAY,MAAM,SAAS,QAAQ;AACjC,gBAAA,IAAI,qBAAqB,SAAS;AACnC,eAAA;AAAA,MACX;AAAA,MACA,CAAC,QAAQ;AAAA,IACb;AAAA,EAAA;AAGJ,WAAS,cACL,UACA,cAA8B,IAChC;AACQ,UAAA,KAAK,sBAAsB,QAAQ;AAEzC,WAAO,eAAwC,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG;AAAA,MACxE,SAAS;AAAA,MACT,MAAM;AAAA,IAAA,CACT;AAAA,EAAA;AAGL,WAAS,wBACL,UACA,cAA8B,IAC0C;AACxE,UAAM,CAAC,WAAW,eAAe,IAAI,cAAc;AAC7C,UAAA,CAAC,OAAO,QAAQ,IAAI,SAAwB,EAAE,SAAS,OAAO,MAAM,aAAa;AACjF,UAAA,KAAK,sBAAsB,QAAQ;AAEzC,UAAM,YAAY;AAAA,MACd,CAAC,aAAuB;AACd,cAAA,UAAU,GAAG,QAAQ;AAC3B,wBAAgB,MAAM,QAAQ,KAAK,QAAQ,CAAC;AACrC,eAAA;AAAA,MACX;AAAA,MACA,CAAC,IAAI,eAAe;AAAA,IACxB;AAEO,WAAA,CAAC,OAAO,WAAW,SAAS;AAAA,EAAA;AAGhC,SAAA,EAAE,eAAe,wBAAwB;AACpD;"}
1
+ {"version":3,"file":"client.js","sources":["../../../src/react/form/client.tsx"],"sourcesContent":["'use client';\n\nimport { useActionState, useCallback, useState, useTransition } from 'react';\nimport { create, MaybeTypeOf, Validation } from './form';\nimport { z } from 'zod';\n\nconst FORM_DEBUG = process.env.NEXT_PUBLIC_FORM_DEBUG === 'true';\n\nexport function createClient<S extends z.ZodObject<any>>(\n schema: S,\n): {\n useValidation: (\n actionFn: (data: FormData) => Promise<Validation<S>>,\n initialData?: MaybeTypeOf<S>,\n ) => [state: Validation<S>, dispatch: (payload: FormData) => void, isPending: boolean];\n useValidationTransition: (\n actionFn: (data: FormData) => Promise<Validation<S>>,\n initialData?: MaybeTypeOf<S>,\n ) => [Validation<S>, (formData: FormData) => Promise<Validation<S>>, boolean];\n} {\n const { validate } = create(schema);\n\n function useValidationCallback(\n actionFn: (data: FormData) => Promise<Validation<S>>,\n ): (formData: FormData) => Promise<Validation<S>> {\n return useCallback(\n async (formData: FormData) => {\n const clientRes = validate(formData);\n console.log('Client validation', FORM_DEBUG ? 'ignored' : 'active', clientRes);\n if (!clientRes.success && !FORM_DEBUG) return clientRes;\n\n const serverRes = await actionFn(formData);\n console.log('Server validation', serverRes);\n return serverRes;\n },\n [actionFn],\n );\n }\n\n function useValidation(\n actionFn: (data: FormData) => Promise<Validation<S>>,\n initialData: MaybeTypeOf<S> = {} as MaybeTypeOf<S>,\n ): [state: Validation<S>, dispatch: (payload: FormData) => void, isPending: boolean] {\n const cb = useValidationCallback(actionFn);\n\n return useActionState<Validation<S>, FormData>(async (_, data) => cb(data), {\n success: false,\n data: initialData,\n });\n }\n\n function useValidationTransition(\n actionFn: (data: FormData) => Promise<Validation<S>>,\n initialData: MaybeTypeOf<S> = {} as MaybeTypeOf<S>,\n ): [Validation<S>, (formData: FormData) => Promise<Validation<S>>, boolean] {\n const [isPending, startTransition] = useTransition();\n const [state, setState] = useState<Validation<S>>({ success: false, data: initialData });\n const cb = useValidationCallback(actionFn);\n\n const wrappedCb = useCallback(\n (formData: FormData) => {\n const promise = cb(formData);\n startTransition(() => promise.then(setState));\n return promise;\n },\n [cb, startTransition],\n );\n\n return [state, wrappedCb, isPending];\n }\n\n return { useValidation, useValidationTransition };\n}\n"],"names":[],"mappings":";;;AAMA,MAAM,aAAa,QAAQ,IAAI,2BAA2B;AAEnD,SAAS,aACZ,QAUF;AACE,QAAM,EAAE,SAAA,IAAa,OAAO,MAAM;AAElC,WAAS,sBACL,UAC8C;AACvC,WAAA;AAAA,MACH,OAAO,aAAuB;AACpB,cAAA,YAAY,SAAS,QAAQ;AACnC,gBAAQ,IAAI,qBAAqB,aAAa,YAAY,UAAU,SAAS;AAC7E,YAAI,CAAC,UAAU,WAAW,CAAC,WAAmB,QAAA;AAExC,cAAA,YAAY,MAAM,SAAS,QAAQ;AACjC,gBAAA,IAAI,qBAAqB,SAAS;AACnC,eAAA;AAAA,MACX;AAAA,MACA,CAAC,QAAQ;AAAA,IACb;AAAA,EAAA;AAGJ,WAAS,cACL,UACA,cAA8B,IACmD;AAC3E,UAAA,KAAK,sBAAsB,QAAQ;AAEzC,WAAO,eAAwC,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG;AAAA,MACxE,SAAS;AAAA,MACT,MAAM;AAAA,IAAA,CACT;AAAA,EAAA;AAGL,WAAS,wBACL,UACA,cAA8B,IAC0C;AACxE,UAAM,CAAC,WAAW,eAAe,IAAI,cAAc;AAC7C,UAAA,CAAC,OAAO,QAAQ,IAAI,SAAwB,EAAE,SAAS,OAAO,MAAM,aAAa;AACjF,UAAA,KAAK,sBAAsB,QAAQ;AAEzC,UAAM,YAAY;AAAA,MACd,CAAC,aAAuB;AACd,cAAA,UAAU,GAAG,QAAQ;AAC3B,wBAAgB,MAAM,QAAQ,KAAK,QAAQ,CAAC;AACrC,eAAA;AAAA,MACX;AAAA,MACA,CAAC,IAAI,eAAe;AAAA,IACxB;AAEO,WAAA,CAAC,OAAO,WAAW,SAAS;AAAA,EAAA;AAGhC,SAAA,EAAE,eAAe,wBAAwB;AACpD;"}
@@ -1,4 +1,5 @@
1
1
  import { typeToFlattenedError, z, SafeParseReturnType, TypeOf } from 'zod';
2
+ import { Context, FC } from 'react';
2
3
  export declare const stringRequired: () => z.ZodString;
3
4
  export declare const maxLength: (schema: z.ZodString) => number;
4
5
  export declare const minLength: (schema: z.ZodString) => number;
@@ -16,30 +17,43 @@ export type Validation<S extends ZodObject> = {
16
17
  data?: MaybeTypeOf<S>;
17
18
  errors?: Errors<S>;
18
19
  };
19
- export declare const FormContext: import('react').Context<{
20
+ export declare const FormContext: Context<{
20
21
  schema: ZodObject;
21
22
  }>;
22
- export declare const Form: <S extends ZodObject>({ schema, children }: {
23
+ export interface FormProps<S extends ZodObject> {
23
24
  schema: S;
24
25
  children: any;
25
- }) => import("react/jsx-runtime").JSX.Element;
26
+ }
27
+ export declare const Form: FC<FormProps<any>>;
26
28
  export declare function create<S extends ZodObject>(schema: S): {
27
29
  register: (name: keyof TypeOf<S>, data?: MaybeTypeOf<S>, errors?: Errors<S>, mui?: boolean) => {
28
30
  label?: any;
29
- helperText?: string | undefined;
30
- error?: boolean | undefined;
31
+ helperText?: string;
32
+ error?: boolean;
31
33
  name: keyof z.TypeOf<S>;
32
34
  id: keyof z.TypeOf<S>;
33
35
  required: boolean;
34
36
  maxLength: number;
35
37
  type: string;
36
- defaultValue: Partial<z.TypeOf<S>>[keyof z.TypeOf<S>] | undefined;
38
+ defaultValue?: Partial<z.TypeOf<S>>[keyof z.TypeOf<S>];
37
39
  };
38
40
  validate: (formData: FormData) => Validation<S>;
39
41
  validationError: (data: MaybeTypeOf<S>, errors: Errors<S>) => Validation<S>;
40
42
  };
41
- export declare function Hint({ children, error }: {
43
+ interface FieldProps<S extends ZodObject> {
44
+ children?: any;
45
+ name: keyof TypeOf<S>;
46
+ errors?: Validation<S>['errors'];
47
+ hint?: string;
48
+ className?: string;
49
+ labelProps?: any;
50
+ [key: string]: any;
51
+ }
52
+ export declare const Field: FC<FieldProps<any>>;
53
+ export interface HintProps {
42
54
  children: any;
43
55
  error?: boolean;
44
- }): import("react/jsx-runtime").JSX.Element;
56
+ }
57
+ export declare const Hint: FC<HintProps>;
58
+ export {};
45
59
  //# sourceMappingURL=form.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../../src/react/form/form.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,CAAC,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAM3E,eAAO,MAAM,cAAc,mBAAgE,CAAC;AAC5F,eAAO,MAAM,SAAS,WAAY,CAAC,CAAC,SAAS,KAAG,MAA+B,CAAC;AAChF,eAAO,MAAM,SAAS,WAAY,CAAC,CAAC,SAAS,KAAG,MAA+B,CAAC;AAChF,eAAO,MAAM,UAAU,WAAY,CAAC,CAAC,SAAS,KAAG,OAAgC,CAAC;AAElF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1E,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,SAAS,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAChG,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,SAAS,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;AACzF,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,SAAS,IACpC;IACI,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC;CAClB,GACD;IACI,OAAO,EAAE,KAAK,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CACtB,CAAC;AAER,eAAO,MAAM,WAAW;YACZ,SAAS;EACJ,CAAC;AAElB,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,SAAS,wBAAwB;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE,4CAG3F,CAAC;AAKF,wBAAgB,MAAM,CAAC,CAAC,SAAS,SAAS,EAAE,MAAM,EAAE,CAAC;qBAKzB,MAAM,MAAM,CAAC,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC,CAAC,QAAO,OAAO;;;;;;;;;;;yBA2BpE,QAAQ,KAAG,UAAU,CAAC,CAAC,CAAC;4BARrB,WAAW,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,KAAG,UAAU,CAAC,CAAC,CAAC;EAwBnF;AAuCD,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;IAAE,QAAQ,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,2CAE3E"}
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../../src/react/form/form.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,CAAC,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC3E,OAAO,EAAE,OAAO,EAA2C,EAAE,EAAQ,MAAM,OAAO,CAAC;AAKnF,eAAO,MAAM,cAAc,QAAO,CAAC,CAAC,SAAoE,CAAC;AACzG,eAAO,MAAM,SAAS,WAAY,CAAC,CAAC,SAAS,KAAG,MAA+B,CAAC;AAChF,eAAO,MAAM,SAAS,WAAY,CAAC,CAAC,SAAS,KAAG,MAA+B,CAAC;AAChF,eAAO,MAAM,UAAU,WAAY,CAAC,CAAC,SAAS,KAAG,OAAgC,CAAC;AAElF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1E,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,SAAS,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAChG,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,SAAS,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;AACzF,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,SAAS,IACpC;IACI,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC;CAClB,GACD;IACI,OAAO,EAAE,KAAK,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CACtB,CAAC;AAER,eAAO,MAAM,WAAW,EAAE,OAAO,CAAC;IAC9B,MAAM,EAAE,SAAS,CAAC;CACrB,CAAgC,CAAC;AAElC,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,SAAS;IAC1C,MAAM,EAAE,CAAC,CAAC;IACV,QAAQ,EAAE,GAAG,CAAC;CACjB;AAED,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAGlC,CAAC;AAKH,wBAAgB,MAAM,CAAC,CAAC,SAAS,SAAS,EACtC,MAAM,EAAE,CAAC,GACV;IACC,QAAQ,EAAE,CACN,IAAI,EAAE,MAAM,MAAM,CAAC,CAAC,CAAC,EACrB,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EACrB,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAClB,GAAG,CAAC,EAAE,OAAO,KACZ;QACD,KAAK,CAAC,EAAE,GAAG,CAAC;QACZ,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,EAAE,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1D,CAAC;IACF,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC;IAChD,eAAe,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC;CAC/E,CA+DA;AAED,UAAU,UAAU,CAAC,CAAC,SAAS,SAAS;IACpC,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,IAAI,EAAE,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,eAAO,MAAM,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CA4BpC,CAAC;AAEH,MAAM,WAAW,SAAS;IACtB,QAAQ,EAAE,GAAG,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,SAAS,CAE7B,CAAC"}
@@ -1,17 +1,17 @@
1
- import { jsx } from "react/jsx-runtime";
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { z } from "zod";
3
- import { createContext, useMemo } from "react";
4
- import "clsx";
3
+ import { createContext, memo, useMemo, useContext } from "react";
4
+ import clsx from "clsx";
5
5
  const nonEmpty = "This field cannot be empty";
6
6
  const stringRequired = () => z.string({ required_error: nonEmpty }).min(1, nonEmpty);
7
7
  const maxLength = (schema) => schema.maxLength || 0;
8
8
  const minLength = (schema) => schema.minLength || 0;
9
9
  const isRequired = (schema) => minLength(schema) > 0;
10
10
  const FormContext = createContext(null);
11
- const Form = ({ schema, children }) => {
11
+ const Form = memo(function Form2({ schema, children }) {
12
12
  const value = useMemo(() => ({ schema }), [schema]);
13
13
  return /* @__PURE__ */ jsx(FormContext.Provider, { value, children });
14
- };
14
+ });
15
15
  const getShape = (schema) => schema.shape || schema.sourceType().shape;
16
16
  function create(schema) {
17
17
  if (!getShape(schema)) {
@@ -53,10 +53,30 @@ function create(schema) {
53
53
  }
54
54
  return { register, validate, validationError };
55
55
  }
56
- function Hint({ children, error }) {
56
+ const Field = memo(function Field2({
57
+ children,
58
+ name,
59
+ errors,
60
+ hint,
61
+ className,
62
+ labelProps,
63
+ ...props
64
+ }) {
65
+ var _a;
66
+ const { schema } = useContext(FormContext);
67
+ const { description } = getShape(schema)[name];
68
+ return /* @__PURE__ */ jsxs("div", { ...props, className: clsx("form-row", className), children: [
69
+ description && /* @__PURE__ */ jsx("label", { ...labelProps, htmlFor: name, children: description }),
70
+ children,
71
+ hint && /* @__PURE__ */ jsx(Hint, { children: hint }),
72
+ (_a = errors == null ? void 0 : errors[name]) == null ? void 0 : _a.map((e) => /* @__PURE__ */ jsx(Hint, { error: true, children: e }, e))
73
+ ] });
74
+ });
75
+ const Hint = memo(function Hint2({ children, error }) {
57
76
  return /* @__PURE__ */ jsx("div", { className: `hint ${error ? "hint-error" : ""}`, children });
58
- }
77
+ });
59
78
  export {
79
+ Field,
60
80
  Form,
61
81
  FormContext,
62
82
  Hint,
@@ -1 +1 @@
1
- {"version":3,"file":"form.js","sources":["../../../src/react/form/form.tsx"],"sourcesContent":["import { typeToFlattenedError, z, SafeParseReturnType, TypeOf } from 'zod';\nimport { createContext, useContext, useMemo } from 'react';\nimport clsx from 'clsx';\n\nconst nonEmpty = 'This field cannot be empty';\n\nexport const stringRequired = () => z.string({ required_error: nonEmpty }).min(1, nonEmpty);\nexport const maxLength = (schema: z.ZodString): number => schema.maxLength || 0;\nexport const minLength = (schema: z.ZodString): number => schema.minLength || 0;\nexport const isRequired = (schema: z.ZodString): boolean => minLength(schema) > 0;\n\nexport type ZodObject = z.ZodObject<any> | z.ZodEffects<z.ZodObject<any>>; // z.ZodType<any, any, any>\nexport type MaybeTypeOf<S extends ZodObject> = Partial<TypeOf<S>>;\nexport type SafeTypeOf<S extends ZodObject> = SafeParseReturnType<TypeOf<S>, TypeOf<S>>['data'];\nexport type Errors<S extends ZodObject> = typeToFlattenedError<TypeOf<S>>['fieldErrors'];\nexport type Validation<S extends ZodObject> =\n | {\n success: true; // this is true only if form was validated successfully\n data: SafeTypeOf<S>;\n errors?: never;\n }\n | {\n success: false;\n data?: MaybeTypeOf<S>;\n errors?: Errors<S>;\n };\n\nexport const FormContext = createContext<{\n schema: ZodObject;\n}>(null as never);\n\nexport const Form = <S extends ZodObject>({ schema, children }: { schema: S; children: any }) => {\n const value = useMemo(() => ({ schema }), [schema]);\n return <FormContext.Provider value={value}>{children}</FormContext.Provider>;\n};\n\nconst getShape = <S extends ZodObject>(schema: S) =>\n (schema as z.ZodObject<any>).shape || (schema as z.ZodEffects<z.ZodObject<any>>).sourceType().shape;\n\nexport function create<S extends ZodObject>(schema: S) {\n if (!getShape(schema)) {\n throw new Error('Invalid schema: only z.object() or z.object().refine() are supported');\n }\n\n function register(name: keyof TypeOf<S>, data?: MaybeTypeOf<S>, errors?: Errors<S>, mui: boolean = false) {\n const field = getShape(schema)[name];\n return {\n name,\n id: name,\n required: isRequired(field),\n maxLength: maxLength(field),\n type: field.isEmail ? 'email' : (name as string).includes('password') ? 'password' : 'text',\n defaultValue: data?.[name],\n ...(mui\n ? {\n label: field.description,\n helperText: errors?.[name]?.join(', '),\n error: !!errors?.[name]?.length,\n }\n : {}),\n };\n }\n\n function validationError(data: MaybeTypeOf<S>, errors: Errors<S>): Validation<S> {\n return {\n success: false,\n data, // data is undefined if there are errors\n errors, // Next.js will butcher error object, so we provide something more primitive\n };\n }\n\n function validate(formData: FormData): Validation<S> {\n const rawData = Object.fromEntries(formData) as TypeOf<S>;\n const { error, data } = schema.safeParse(rawData);\n\n // console.log('Validate result', { error, data, rawData });\n\n if (error) {\n // data is undefined if there are errors\n // Next.js will butcher error object, so we provide something more primitive\n return validationError(rawData, error.flatten().fieldErrors as any);\n }\n\n return { success: true, data };\n }\n\n return { register, validate, validationError };\n}\n\nfunction Field<S extends ZodObject>({\n children,\n name,\n errors,\n hint,\n className,\n labelProps,\n ...props\n}: {\n children?: any;\n name: keyof TypeOf<S>;\n errors?: Validation<S>['errors'];\n hint?: string;\n className?: string;\n labelProps?: any;\n}) {\n const { schema } = useContext(FormContext);\n const { description } = getShape(schema)[name];\n\n return (\n <div {...props} className={clsx('form-row', className)}>\n {description && (\n <label {...labelProps} htmlFor={name}>\n {description}\n </label>\n )}\n {children}\n {hint && <Hint>{hint}</Hint>}\n {errors?.[name]?.map((e: string) => (\n <Hint error key={e}>\n {e}\n </Hint>\n ))}\n </div>\n );\n}\n\nexport function Hint({ children, error }: { children: any; error?: boolean }) {\n return <div className={`hint ${error ? 'hint-error' : ''}`}>{children}</div>;\n}\n"],"names":[],"mappings":";;;;AAIA,MAAM,WAAW;AAEJ,MAAA,iBAAiB,MAAM,EAAE,OAAO,EAAE,gBAAgB,UAAU,EAAE,IAAI,GAAG,QAAQ;AACnF,MAAM,YAAY,CAAC,WAAgC,OAAO,aAAa;AACvE,MAAM,YAAY,CAAC,WAAgC,OAAO,aAAa;AACvE,MAAM,aAAa,CAAC,WAAiC,UAAU,MAAM,IAAI;AAkBnE,MAAA,cAAc,cAExB,IAAa;AAET,MAAM,OAAO,CAAsB,EAAE,QAAQ,eAA6C;AACvF,QAAA,QAAQ,QAAQ,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC;AAClD,SAAQ,oBAAA,YAAY,UAAZ,EAAqB,OAAe,SAAS,CAAA;AACzD;AAEA,MAAM,WAAW,CAAsB,WAClC,OAA4B,SAAU,OAA0C,aAAa;AAE3F,SAAS,OAA4B,QAAW;AAC/C,MAAA,CAAC,SAAS,MAAM,GAAG;AACb,UAAA,IAAI,MAAM,sEAAsE;AAAA,EAAA;AAG1F,WAAS,SAAS,MAAuB,MAAuB,QAAoB,MAAe,OAAO;;AACtG,UAAM,QAAQ,SAAS,MAAM,EAAE,IAAI;AAC5B,WAAA;AAAA,MACH;AAAA,MACA,IAAI;AAAA,MACJ,UAAU,WAAW,KAAK;AAAA,MAC1B,WAAW,UAAU,KAAK;AAAA,MAC1B,MAAM,MAAM,UAAU,UAAW,KAAgB,SAAS,UAAU,IAAI,aAAa;AAAA,MACrF,cAAc,6BAAO;AAAA,MACrB,GAAI,MACE;AAAA,QACI,OAAO,MAAM;AAAA,QACb,aAAY,sCAAS,UAAT,mBAAgB,KAAK;AAAA,QACjC,OAAO,CAAC,GAAC,sCAAS,UAAT,mBAAgB;AAAA,MAAA,IAE7B,CAAA;AAAA,IACV;AAAA,EAAA;AAGK,WAAA,gBAAgB,MAAsB,QAAkC;AACtE,WAAA;AAAA,MACH,SAAS;AAAA,MACT;AAAA;AAAA,MACA;AAAA;AAAA,IACJ;AAAA,EAAA;AAGJ,WAAS,SAAS,UAAmC;AAC3C,UAAA,UAAU,OAAO,YAAY,QAAQ;AAC3C,UAAM,EAAE,OAAO,KAAA,IAAS,OAAO,UAAU,OAAO;AAIhD,QAAI,OAAO;AAGP,aAAO,gBAAgB,SAAS,MAAM,QAAA,EAAU,WAAkB;AAAA,IAAA;AAG/D,WAAA,EAAE,SAAS,MAAM,KAAK;AAAA,EAAA;AAG1B,SAAA,EAAE,UAAU,UAAU,gBAAgB;AACjD;AAuCO,SAAS,KAAK,EAAE,UAAU,SAA6C;AACnE,SAAA,oBAAC,SAAI,WAAW,QAAQ,QAAQ,eAAe,EAAE,IAAK,SAAS,CAAA;AAC1E;"}
1
+ {"version":3,"file":"form.js","sources":["../../../src/react/form/form.tsx"],"sourcesContent":["import { typeToFlattenedError, z, SafeParseReturnType, TypeOf } from 'zod';\nimport { Context, createContext, useContext, useMemo, JSX, FC, memo } from 'react';\nimport clsx from 'clsx';\n\nconst nonEmpty = 'This field cannot be empty';\n\nexport const stringRequired = (): z.ZodString => z.string({ required_error: nonEmpty }).min(1, nonEmpty);\nexport const maxLength = (schema: z.ZodString): number => schema.maxLength || 0;\nexport const minLength = (schema: z.ZodString): number => schema.minLength || 0;\nexport const isRequired = (schema: z.ZodString): boolean => minLength(schema) > 0;\n\nexport type ZodObject = z.ZodObject<any> | z.ZodEffects<z.ZodObject<any>>; // z.ZodType<any, any, any>\nexport type MaybeTypeOf<S extends ZodObject> = Partial<TypeOf<S>>;\nexport type SafeTypeOf<S extends ZodObject> = SafeParseReturnType<TypeOf<S>, TypeOf<S>>['data'];\nexport type Errors<S extends ZodObject> = typeToFlattenedError<TypeOf<S>>['fieldErrors'];\nexport type Validation<S extends ZodObject> =\n | {\n success: true; // this is true only if form was validated successfully\n data: SafeTypeOf<S>;\n errors?: never;\n }\n | {\n success: false;\n data?: MaybeTypeOf<S>;\n errors?: Errors<S>;\n };\n\nexport const FormContext: Context<{\n schema: ZodObject;\n}> = createContext(null as never);\n\nexport interface FormProps<S extends ZodObject> {\n schema: S;\n children: any;\n}\n\nexport const Form: FC<FormProps<any>> = memo(function Form({ schema, children }) {\n const value = useMemo(() => ({ schema }), [schema]);\n return <FormContext.Provider value={value}>{children}</FormContext.Provider>;\n});\n\nconst getShape = <S extends ZodObject>(schema: S) =>\n (schema as z.ZodObject<any>).shape || (schema as z.ZodEffects<z.ZodObject<any>>).sourceType().shape;\n\nexport function create<S extends ZodObject>(\n schema: S,\n): {\n register: (\n name: keyof TypeOf<S>,\n data?: MaybeTypeOf<S>,\n errors?: Errors<S>,\n mui?: boolean,\n ) => {\n label?: any;\n helperText?: string;\n error?: boolean;\n name: keyof z.TypeOf<S>;\n id: keyof z.TypeOf<S>;\n required: boolean;\n maxLength: number;\n type: string;\n defaultValue?: Partial<z.TypeOf<S>>[keyof z.TypeOf<S>];\n };\n validate: (formData: FormData) => Validation<S>;\n validationError: (data: MaybeTypeOf<S>, errors: Errors<S>) => Validation<S>;\n} {\n if (!getShape(schema)) {\n throw new Error('Invalid schema: only z.object() or z.object().refine() are supported');\n }\n\n function register(\n name: keyof TypeOf<S>,\n data?: MaybeTypeOf<S>,\n errors?: Errors<S>,\n mui: boolean = false,\n ): {\n label?: any;\n helperText?: string;\n error?: boolean;\n name: keyof z.TypeOf<S>;\n id: keyof z.TypeOf<S>;\n required: boolean;\n maxLength: number;\n type: string;\n defaultValue?: Partial<z.TypeOf<S>>[keyof z.TypeOf<S>];\n } {\n const field = getShape(schema)[name];\n return {\n name,\n id: name,\n required: isRequired(field),\n maxLength: maxLength(field),\n type: field.isEmail ? 'email' : (name as string).includes('password') ? 'password' : 'text',\n defaultValue: data?.[name],\n ...(mui\n ? {\n label: field.description,\n helperText: errors?.[name]?.join(', '),\n error: !!errors?.[name]?.length,\n }\n : {}),\n };\n }\n\n function validationError(data: MaybeTypeOf<S>, errors: Errors<S>): Validation<S> {\n return {\n success: false,\n data, // data is undefined if there are errors\n errors, // Next.js will butcher error object, so we provide something more primitive\n };\n }\n\n function validate(formData: FormData): Validation<S> {\n const rawData = Object.fromEntries(formData) as TypeOf<S>;\n const { error, data } = schema.safeParse(rawData);\n\n // console.log('Validate result', { error, data, rawData });\n\n if (error) {\n // data is undefined if there are errors\n // Next.js will butcher error object, so we provide something more primitive\n return validationError(rawData, error.flatten().fieldErrors as any);\n }\n\n return { success: true, data };\n }\n\n return { register, validate, validationError };\n}\n\ninterface FieldProps<S extends ZodObject> {\n children?: any;\n name: keyof TypeOf<S>;\n errors?: Validation<S>['errors'];\n hint?: string;\n className?: string;\n labelProps?: any;\n [key: string]: any;\n}\n\nexport const Field: FC<FieldProps<any>> = memo(function Field({\n children,\n name,\n errors,\n hint,\n className,\n labelProps,\n ...props\n}) {\n const { schema } = useContext(FormContext);\n const { description } = getShape(schema)[name];\n\n return (\n <div {...props} className={clsx('form-row', className)}>\n {description && (\n <label {...labelProps} htmlFor={name}>\n {description}\n </label>\n )}\n {children}\n {hint && <Hint>{hint}</Hint>}\n {errors?.[name]?.map((e: string) => (\n <Hint error key={e}>\n {e}\n </Hint>\n ))}\n </div>\n );\n});\n\nexport interface HintProps {\n children: any;\n error?: boolean;\n}\n\nexport const Hint: FC<HintProps> = memo(function Hint({ children, error }) {\n return <div className={`hint ${error ? 'hint-error' : ''}`}>{children}</div>;\n});\n"],"names":["Form","Field","Hint"],"mappings":";;;;AAIA,MAAM,WAAW;AAEJ,MAAA,iBAAiB,MAAmB,EAAE,OAAO,EAAE,gBAAgB,UAAU,EAAE,IAAI,GAAG,QAAQ;AAChG,MAAM,YAAY,CAAC,WAAgC,OAAO,aAAa;AACvE,MAAM,YAAY,CAAC,WAAgC,OAAO,aAAa;AACvE,MAAM,aAAa,CAAC,WAAiC,UAAU,MAAM,IAAI;AAkBnE,MAAA,cAER,cAAc,IAAa;AAOzB,MAAM,OAA2B,KAAK,SAASA,MAAK,EAAE,QAAQ,YAAY;AACvE,QAAA,QAAQ,QAAQ,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC;AAClD,SAAQ,oBAAA,YAAY,UAAZ,EAAqB,OAAe,SAAS,CAAA;AACzD,CAAC;AAED,MAAM,WAAW,CAAsB,WAClC,OAA4B,SAAU,OAA0C,aAAa;AAE3F,SAAS,OACZ,QAoBF;AACM,MAAA,CAAC,SAAS,MAAM,GAAG;AACb,UAAA,IAAI,MAAM,sEAAsE;AAAA,EAAA;AAG1F,WAAS,SACL,MACA,MACA,QACA,MAAe,OAWjB;;AACE,UAAM,QAAQ,SAAS,MAAM,EAAE,IAAI;AAC5B,WAAA;AAAA,MACH;AAAA,MACA,IAAI;AAAA,MACJ,UAAU,WAAW,KAAK;AAAA,MAC1B,WAAW,UAAU,KAAK;AAAA,MAC1B,MAAM,MAAM,UAAU,UAAW,KAAgB,SAAS,UAAU,IAAI,aAAa;AAAA,MACrF,cAAc,6BAAO;AAAA,MACrB,GAAI,MACE;AAAA,QACI,OAAO,MAAM;AAAA,QACb,aAAY,sCAAS,UAAT,mBAAgB,KAAK;AAAA,QACjC,OAAO,CAAC,GAAC,sCAAS,UAAT,mBAAgB;AAAA,MAAA,IAE7B,CAAA;AAAA,IACV;AAAA,EAAA;AAGK,WAAA,gBAAgB,MAAsB,QAAkC;AACtE,WAAA;AAAA,MACH,SAAS;AAAA,MACT;AAAA;AAAA,MACA;AAAA;AAAA,IACJ;AAAA,EAAA;AAGJ,WAAS,SAAS,UAAmC;AAC3C,UAAA,UAAU,OAAO,YAAY,QAAQ;AAC3C,UAAM,EAAE,OAAO,KAAA,IAAS,OAAO,UAAU,OAAO;AAIhD,QAAI,OAAO;AAGP,aAAO,gBAAgB,SAAS,MAAM,QAAA,EAAU,WAAkB;AAAA,IAAA;AAG/D,WAAA,EAAE,SAAS,MAAM,KAAK;AAAA,EAAA;AAG1B,SAAA,EAAE,UAAU,UAAU,gBAAgB;AACjD;AAYa,MAAA,QAA6B,KAAK,SAASC,OAAM;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAG;;AACC,QAAM,EAAE,OAAA,IAAW,WAAW,WAAW;AACzC,QAAM,EAAE,YAAY,IAAI,SAAS,MAAM,EAAE,IAAI;AAGzC,SAAA,qBAAC,SAAK,GAAG,OAAO,WAAW,KAAK,YAAY,SAAS,GAChD,UAAA;AAAA,IAAA,mCACI,SAAO,EAAA,GAAG,YAAY,SAAS,MAC3B,UACL,aAAA;AAAA,IAEH;AAAA,IACA,QAAS,oBAAA,MAAA,EAAM,UAAK,KAAA,CAAA;AAAA,KACpB,sCAAS,UAAT,mBAAgB,IAAI,CAAC,MACjB,oBAAA,MAAA,EAAK,OAAK,MACN,UADY,EAAA,GAAA,CAEjB;AAAA,EACH,GACL;AAER,CAAC;AAOM,MAAM,OAAsB,KAAK,SAASC,MAAK,EAAE,UAAU,SAAS;AAChE,SAAA,oBAAC,SAAI,WAAW,QAAQ,QAAQ,eAAe,EAAE,IAAK,SAAS,CAAA;AAC1E,CAAC;"}
@@ -1,10 +1,11 @@
1
1
  import { createClient } from "./form/client.js";
2
- import { Form, FormContext, Hint, create, isRequired, maxLength, minLength, stringRequired } from "./form/form.js";
2
+ import { Field, Form, FormContext, Hint, create, isRequired, maxLength, minLength, stringRequired } from "./form/form.js";
3
3
  import { apiCall, jsonContentType } from "./apiCall.js";
4
4
  import { HotkeysContext, HotkeysProvider, useHotkeys } from "./keyboard.js";
5
5
  import { useFetch } from "./useFetch.js";
6
6
  import { useFetcher } from "./useFetcher.js";
7
7
  export {
8
+ Field,
8
9
  Form,
9
10
  FormContext,
10
11
  Hint,
@@ -1,11 +1,10 @@
1
- import { Dispatch, SetStateAction } from 'react';
1
+ import { Dispatch, SetStateAction, FC, Context } from 'react';
2
2
  export type Hotkeys = Record<KeyboardEvent['code'], (e: KeyboardEvent) => void>;
3
- export declare const HotkeysContext: import('react').Context<{
3
+ export type HotkeyContextType = {
4
4
  enabled: boolean;
5
5
  setEnabled: Dispatch<SetStateAction<boolean>>;
6
- }>;
7
- export declare const HotkeysProvider: ({ children }: {
8
- children: any;
9
- }) => import("react/jsx-runtime").JSX.Element;
6
+ };
7
+ export declare const HotkeysContext: Context<HotkeyContextType>;
8
+ export declare const HotkeysProvider: FC<any>;
10
9
  export declare const useHotkeys: (hotkeys: Hotkeys) => void;
11
10
  //# sourceMappingURL=keyboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/react/keyboard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA+C,QAAQ,EAAE,cAAc,EAAc,MAAM,OAAO,CAAC;AAM1G,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC,CAAC;AAEhF,eAAO,MAAM,cAAc;aACd,OAAO;gBACJ,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;EAChC,CAAC;AAElB,eAAO,MAAM,eAAe;;6CAM3B,CAAC;AAEF,eAAO,MAAM,UAAU,YAAa,OAAO,SAyB1C,CAAC"}
1
+ {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/react/keyboard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA+C,QAAQ,EAAE,cAAc,EAAc,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAMvH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC,CAAC;AAEhF,MAAM,MAAM,iBAAiB,GAAG;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,iBAAiB,CAGrC,CAAC;AAElB,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,GAAG,CAMnC,CAAC;AAEF,eAAO,MAAM,UAAU,YAAa,OAAO,KAAG,IAyB7C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"keyboard.js","sources":["../../src/react/keyboard.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, createContext, useMemo, useState, Dispatch, SetStateAction, useContext } from 'react';\n\nconst isCtrlOrMeta = (e: KeyboardEvent) => e.metaKey || e.ctrlKey;\n\nconst EVENT = 'keydown';\n\nexport type Hotkeys = Record<KeyboardEvent['code'], (e: KeyboardEvent) => void>;\n\nexport const HotkeysContext = createContext<{\n enabled: boolean;\n setEnabled: Dispatch<SetStateAction<boolean>>;\n}>(null as never);\n\nexport const HotkeysProvider = ({ children }) => {\n const [enabled, setEnabled] = useState(true);\n\n const control = useMemo(() => ({ enabled, setEnabled }), [enabled, setEnabled]);\n\n return <HotkeysContext.Provider value={control}>{children}</HotkeysContext.Provider>;\n};\n\nexport const useHotkeys = (hotkeys: Hotkeys) => {\n const { enabled } = useContext(HotkeysContext);\n\n useEffect(() => {\n if (typeof document === 'undefined' || !enabled) {\n return;\n }\n\n const listeners = (e: KeyboardEvent) => {\n if (!isCtrlOrMeta(e)) return;\n\n for (const [code, callback] of Object.entries(hotkeys)) {\n if (e.code === code) {\n callback(e);\n return;\n }\n }\n };\n\n window.addEventListener(EVENT, listeners, true);\n\n return () => {\n window.removeEventListener(EVENT, listeners);\n };\n }, [hotkeys, enabled]);\n};\n"],"names":[],"mappings":";;;AAIA,MAAM,eAAe,CAAC,MAAqB,EAAE,WAAW,EAAE;AAE1D,MAAM,QAAQ;AAID,MAAA,iBAAiB,cAG3B,IAAa;AAET,MAAM,kBAAkB,CAAC,EAAE,eAAe;AAC7C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAErC,QAAA,UAAU,QAAQ,OAAO,EAAE,SAAS,eAAe,CAAC,SAAS,UAAU,CAAC;AAE9E,6BAAQ,eAAe,UAAf,EAAwB,OAAO,SAAU,UAAS;AAC9D;AAEa,MAAA,aAAa,CAAC,YAAqB;AAC5C,QAAM,EAAE,QAAA,IAAY,WAAW,cAAc;AAE7C,YAAU,MAAM;AACZ,QAAI,OAAO,aAAa,eAAe,CAAC,SAAS;AAC7C;AAAA,IAAA;AAGE,UAAA,YAAY,CAAC,MAAqB;AAChC,UAAA,CAAC,aAAa,CAAC,EAAG;AAEtB,iBAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,OAAO,GAAG;AAChD,YAAA,EAAE,SAAS,MAAM;AACjB,mBAAS,CAAC;AACV;AAAA,QAAA;AAAA,MACJ;AAAA,IAER;AAEO,WAAA,iBAAiB,OAAO,WAAW,IAAI;AAE9C,WAAO,MAAM;AACF,aAAA,oBAAoB,OAAO,SAAS;AAAA,IAC/C;AAAA,EAAA,GACD,CAAC,SAAS,OAAO,CAAC;AACzB;"}
1
+ {"version":3,"file":"keyboard.js","sources":["../../src/react/keyboard.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, createContext, useMemo, useState, Dispatch, SetStateAction, useContext, FC, Context } from 'react';\n\nconst isCtrlOrMeta = (e: KeyboardEvent) => e.metaKey || e.ctrlKey;\n\nconst EVENT = 'keydown';\n\nexport type Hotkeys = Record<KeyboardEvent['code'], (e: KeyboardEvent) => void>;\n\nexport type HotkeyContextType = {\n enabled: boolean;\n setEnabled: Dispatch<SetStateAction<boolean>>;\n};\n\nexport const HotkeysContext: Context<HotkeyContextType> = createContext<{\n enabled: boolean;\n setEnabled: Dispatch<SetStateAction<boolean>>;\n}>(null as never);\n\nexport const HotkeysProvider: FC<any> = ({ children }) => {\n const [enabled, setEnabled] = useState(true);\n\n const control = useMemo(() => ({ enabled, setEnabled }), [enabled, setEnabled]);\n\n return <HotkeysContext.Provider value={control}>{children}</HotkeysContext.Provider>;\n};\n\nexport const useHotkeys = (hotkeys: Hotkeys): void => {\n const { enabled } = useContext(HotkeysContext);\n\n useEffect(() => {\n if (typeof document === 'undefined' || !enabled) {\n return;\n }\n\n const listeners = (e: KeyboardEvent) => {\n if (!isCtrlOrMeta(e)) return;\n\n for (const [code, callback] of Object.entries(hotkeys)) {\n if (e.code === code) {\n callback(e);\n return;\n }\n }\n };\n\n window.addEventListener(EVENT, listeners, true);\n\n return () => {\n window.removeEventListener(EVENT, listeners);\n };\n }, [hotkeys, enabled]);\n};\n"],"names":[],"mappings":";;;AAIA,MAAM,eAAe,CAAC,MAAqB,EAAE,WAAW,EAAE;AAE1D,MAAM,QAAQ;AASD,MAAA,iBAA6C,cAGvD,IAAa;AAET,MAAM,kBAA2B,CAAC,EAAE,eAAe;AACtD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAErC,QAAA,UAAU,QAAQ,OAAO,EAAE,SAAS,eAAe,CAAC,SAAS,UAAU,CAAC;AAE9E,6BAAQ,eAAe,UAAf,EAAwB,OAAO,SAAU,UAAS;AAC9D;AAEa,MAAA,aAAa,CAAC,YAA2B;AAClD,QAAM,EAAE,QAAA,IAAY,WAAW,cAAc;AAE7C,YAAU,MAAM;AACZ,QAAI,OAAO,aAAa,eAAe,CAAC,SAAS;AAC7C;AAAA,IAAA;AAGE,UAAA,YAAY,CAAC,MAAqB;AAChC,UAAA,CAAC,aAAa,CAAC,EAAG;AAEtB,iBAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,OAAO,GAAG;AAChD,YAAA,EAAE,SAAS,MAAM;AACjB,mBAAS,CAAC;AACV;AAAA,QAAA;AAAA,MACJ;AAAA,IAER;AAEO,WAAA,iBAAiB,OAAO,WAAW,IAAI;AAE9C,WAAO,MAAM;AACF,aAAA,oBAAoB,OAAO,SAAS;AAAA,IAC/C;AAAA,EAAA,GACD,CAAC,SAAS,OAAO,CAAC;AACzB;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFetcher.d.ts","sourceRoot":"","sources":["../../src/react/useFetcher.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAC9B,EAAE,KAAA,EAEF,EAAE,YAAoB,EAAE,OAAO,EAAE,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;CAAO;;;;;EA2CnG"}
1
+ {"version":3,"file":"useFetcher.d.ts","sourceRoot":"","sources":["../../src/react/useFetcher.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAC9B,EAAE,EAAE,GAAG,EAEP,EAAE,YAAoB,EAAE,OAAO,EAAE,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;CAAO,GACjG;IACC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC7C,CA0CA"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFetcher.js","sources":["../../src/react/useFetcher.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport function useFetcher<T = any>(\n cb,\n\n { fetchOnMount = false, onError }: { fetchOnMount?: boolean; onError?: (e: Error) => void } = {},\n) {\n const [loading, setLoading] = useState(fetchOnMount);\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<T | null>(null);\n\n const isMounted = useRef(false);\n\n const trigger = useCallback(\n async (...args) => {\n try {\n setLoading(true);\n setError(null);\n const res = await cb(args);\n if (!isMounted.current) return;\n setData(res);\n return res;\n } catch (e) {\n console.error('Fetch failed', e);\n if (!isMounted.current) return;\n setError(e);\n (onError as any)?.(e);\n } finally {\n if (isMounted.current) setLoading(false);\n }\n },\n [cb, onError],\n );\n\n useEffect(() => {\n if (fetchOnMount) {\n trigger().catch((e) => console.error('Fetch on mount failed', e)); // catch actually will never happen\n }\n }, [fetchOnMount, cb, trigger]);\n\n useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n });\n\n return { loading, error, data, trigger };\n}\n"],"names":[],"mappings":";AAEgB,SAAA,WACZ,IAEA,EAAE,eAAe,OAAO,QAAQ,IAA8D,IAChG;AACE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,YAAY;AACnD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAuB,IAAI;AACrD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAmB,IAAI;AAEzC,QAAA,YAAY,OAAO,KAAK;AAE9B,QAAM,UAAU;AAAA,IACZ,UAAU,SAAS;AACX,UAAA;AACA,mBAAW,IAAI;AACf,iBAAS,IAAI;AACP,cAAA,MAAM,MAAM,GAAG,IAAI;AACrB,YAAA,CAAC,UAAU,QAAS;AACxB,gBAAQ,GAAG;AACJ,eAAA;AAAA,eACF,GAAG;AACA,gBAAA,MAAM,gBAAgB,CAAC;AAC3B,YAAA,CAAC,UAAU,QAAS;AACxB,iBAAS,CAAC;AACT,2CAAkB;AAAA,MAAC,UACtB;AACM,YAAA,UAAU,QAAS,YAAW,KAAK;AAAA,MAAA;AAAA,IAE/C;AAAA,IACA,CAAC,IAAI,OAAO;AAAA,EAChB;AAEA,YAAU,MAAM;AACZ,QAAI,cAAc;AACN,cAAA,EAAE,MAAM,CAAC,MAAM,QAAQ,MAAM,yBAAyB,CAAC,CAAC;AAAA,IAAA;AAAA,EAErE,GAAA,CAAC,cAAc,IAAI,OAAO,CAAC;AAE9B,YAAU,MAAM;AACZ,cAAU,UAAU;AACpB,WAAO,MAAM;AACT,gBAAU,UAAU;AAAA,IACxB;AAAA,EAAA,CACH;AAED,SAAO,EAAE,SAAS,OAAO,MAAM,QAAQ;AAC3C;"}
1
+ {"version":3,"file":"useFetcher.js","sources":["../../src/react/useFetcher.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport function useFetcher<T = any>(\n cb: any,\n\n { fetchOnMount = false, onError }: { fetchOnMount?: boolean; onError?: (e: Error) => void } = {},\n): {\n loading: boolean;\n error: Error | null;\n data: T | null;\n trigger: (...args: any[]) => Promise<any>;\n} {\n const [loading, setLoading] = useState(fetchOnMount);\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<T | null>(null);\n\n const isMounted = useRef(false);\n\n const trigger = useCallback(\n async (...args: any[]): Promise<any> => {\n try {\n setLoading(true);\n setError(null);\n const res = await cb(args);\n if (!isMounted.current) return;\n setData(res);\n return res;\n } catch (e) {\n console.error('Fetch failed', e);\n if (!isMounted.current) return;\n setError(e);\n (onError as any)?.(e);\n } finally {\n if (isMounted.current) setLoading(false);\n }\n },\n [cb, onError],\n );\n\n useEffect(() => {\n if (fetchOnMount) {\n trigger().catch((e) => console.error('Fetch on mount failed', e)); // catch actually will never happen\n }\n }, [fetchOnMount, cb, trigger]);\n\n useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n });\n\n return { loading, error, data, trigger };\n}\n"],"names":[],"mappings":";AAEgB,SAAA,WACZ,IAEA,EAAE,eAAe,OAAO,QAAQ,IAA8D,IAMhG;AACE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,YAAY;AACnD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAuB,IAAI;AACrD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAmB,IAAI;AAEzC,QAAA,YAAY,OAAO,KAAK;AAE9B,QAAM,UAAU;AAAA,IACZ,UAAU,SAA8B;AAChC,UAAA;AACA,mBAAW,IAAI;AACf,iBAAS,IAAI;AACP,cAAA,MAAM,MAAM,GAAG,IAAI;AACrB,YAAA,CAAC,UAAU,QAAS;AACxB,gBAAQ,GAAG;AACJ,eAAA;AAAA,eACF,GAAG;AACA,gBAAA,MAAM,gBAAgB,CAAC;AAC3B,YAAA,CAAC,UAAU,QAAS;AACxB,iBAAS,CAAC;AACT,2CAAkB;AAAA,MAAC,UACtB;AACM,YAAA,UAAU,QAAS,YAAW,KAAK;AAAA,MAAA;AAAA,IAE/C;AAAA,IACA,CAAC,IAAI,OAAO;AAAA,EAChB;AAEA,YAAU,MAAM;AACZ,QAAI,cAAc;AACN,cAAA,EAAE,MAAM,CAAC,MAAM,QAAQ,MAAM,yBAAyB,CAAC,CAAC;AAAA,IAAA;AAAA,EAErE,GAAA,CAAC,cAAc,IAAI,OAAO,CAAC;AAE9B,YAAU,MAAM;AACZ,cAAU,UAAU;AACpB,WAAO,MAAM;AACT,gBAAU,UAAU;AAAA,IACxB;AAAA,EAAA,CACH;AAED,SAAO,EAAE,SAAS,OAAO,MAAM,QAAQ;AAC3C;"}
@@ -5,5 +5,5 @@
5
5
  * @param fileName
6
6
  * @returns {Promise<void>}
7
7
  */
8
- export declare const shareDialog: (base64: any, fileName: any) => Promise<void>;
8
+ export declare const shareDialog: (base64: string, fileName: string) => Promise<void>;
9
9
  //# sourceMappingURL=share.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/react-native/share.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,+CAoBvB,CAAC"}
1
+ {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/react-native/share.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,WAAkB,MAAM,YAAY,MAAM,KAAG,OAAO,CAAC,IAAI,CAoBhF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"share.js","sources":["../../src/react-native/share.ts"],"sourcesContent":["import * as FileSystem from 'expo-file-system';\nimport * as Sharing from 'expo-sharing';\n\n/**\n * data:text/plain;base64,W29iamV\n * @see https://stackoverflow.com/questions/69738812/problem-to-generate-pdf-from-a-blob-in-an-expo-app-using-filesystem\n * @param base64\n * @param fileName\n * @returns {Promise<void>}\n */\nexport const shareDialog = async (base64, fileName) => {\n const path = `${FileSystem.documentDirectory}/${fileName}`;\n\n try {\n if (!(await Sharing.isAvailableAsync())) throw new Error('Sharing is not available');\n\n const [header, buffer] = base64.split(',');\n const [, mimeTypeStr] = header.split(':');\n const [mimeType] = mimeTypeStr.split(';');\n\n await FileSystem.writeAsStringAsync(`${path}`, buffer, {\n encoding: FileSystem.EncodingType.Base64,\n });\n\n await Sharing.shareAsync(path, { mimeType, UTI: fileName, dialogTitle: 'Save or share document' });\n } catch (error) {\n alert('Sharing failed: ' + error.message);\n } finally {\n await FileSystem.deleteAsync(path);\n }\n};\n"],"names":[],"mappings":";;AAUa,MAAA,cAAc,OAAO,QAAQ,aAAa;AACnD,QAAM,OAAO,GAAG,WAAW,iBAAiB,IAAI,QAAQ;AAEpD,MAAA;AACI,QAAA,CAAE,MAAM,QAAQ,mBAA2B,OAAA,IAAI,MAAM,0BAA0B;AAEnF,UAAM,CAAC,QAAQ,MAAM,IAAI,OAAO,MAAM,GAAG;AACzC,UAAM,CAAG,EAAA,WAAW,IAAI,OAAO,MAAM,GAAG;AACxC,UAAM,CAAC,QAAQ,IAAI,YAAY,MAAM,GAAG;AAExC,UAAM,WAAW,mBAAmB,GAAG,IAAI,IAAI,QAAQ;AAAA,MACnD,UAAU,WAAW,aAAa;AAAA,IAAA,CACrC;AAEK,UAAA,QAAQ,WAAW,MAAM,EAAE,UAAU,KAAK,UAAU,aAAa,0BAA0B;AAAA,WAC5F,OAAO;AACN,UAAA,qBAAqB,MAAM,OAAO;AAAA,EAAA,UAC1C;AACQ,UAAA,WAAW,YAAY,IAAI;AAAA,EAAA;AAEzC;"}
1
+ {"version":3,"file":"share.js","sources":["../../src/react-native/share.ts"],"sourcesContent":["import * as FileSystem from 'expo-file-system';\nimport * as Sharing from 'expo-sharing';\n\n/**\n * data:text/plain;base64,W29iamV\n * @see https://stackoverflow.com/questions/69738812/problem-to-generate-pdf-from-a-blob-in-an-expo-app-using-filesystem\n * @param base64\n * @param fileName\n * @returns {Promise<void>}\n */\nexport const shareDialog = async (base64: string, fileName: string): Promise<void> => {\n const path = `${FileSystem.documentDirectory}/${fileName}`;\n\n try {\n if (!(await Sharing.isAvailableAsync())) throw new Error('Sharing is not available');\n\n const [header, buffer] = base64.split(',');\n const [, mimeTypeStr] = header.split(':');\n const [mimeType] = mimeTypeStr.split(';');\n\n await FileSystem.writeAsStringAsync(`${path}`, buffer, {\n encoding: FileSystem.EncodingType.Base64,\n });\n\n await Sharing.shareAsync(path, { mimeType, UTI: fileName, dialogTitle: 'Save or share document' });\n } catch (error) {\n alert('Sharing failed: ' + error.message);\n } finally {\n await FileSystem.deleteAsync(path);\n }\n};\n"],"names":[],"mappings":";;AAUa,MAAA,cAAc,OAAO,QAAgB,aAAoC;AAClF,QAAM,OAAO,GAAG,WAAW,iBAAiB,IAAI,QAAQ;AAEpD,MAAA;AACI,QAAA,CAAE,MAAM,QAAQ,mBAA2B,OAAA,IAAI,MAAM,0BAA0B;AAEnF,UAAM,CAAC,QAAQ,MAAM,IAAI,OAAO,MAAM,GAAG;AACzC,UAAM,CAAG,EAAA,WAAW,IAAI,OAAO,MAAM,GAAG;AACxC,UAAM,CAAC,QAAQ,IAAI,YAAY,MAAM,GAAG;AAExC,UAAM,WAAW,mBAAmB,GAAG,IAAI,IAAI,QAAQ;AAAA,MACnD,UAAU,WAAW,aAAa;AAAA,IAAA,CACrC;AAEK,UAAA,QAAQ,WAAW,MAAM,EAAE,UAAU,KAAK,UAAU,aAAa,0BAA0B;AAAA,WAC5F,OAAO;AACN,UAAA,qBAAqB,MAAM,OAAO;AAAA,EAAA,UAC1C;AACQ,UAAA,WAAW,YAAY,IAAI;AAAA,EAAA;AAEzC;"}
@@ -1,4 +1,3 @@
1
- export declare function Update({ children }: {
2
- children: any;
3
- }): any;
1
+ import { FC } from 'react';
2
+ export declare const Update: FC<any>;
4
3
  //# sourceMappingURL=update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/react-native/update.tsx"],"names":[],"mappings":"AAIA,wBAAgB,MAAM,CAAC,EAAE,QAAQ,EAAE;;CAAA,OAmClC"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/react-native/update.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAuB,MAAM,OAAO,CAAC;AAGhD,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,GAAG,CAmC1B,CAAC"}
@@ -2,7 +2,7 @@ import { jsxs } from "react/jsx-runtime";
2
2
  import * as Updates from "expo-updates";
3
3
  import { useState, useEffect } from "react";
4
4
  import { Text } from "react-native";
5
- function Update({ children }) {
5
+ const Update = function Update2({ children }) {
6
6
  const [updating, setUpdating] = useState(true);
7
7
  useEffect(() => {
8
8
  (async () => {
@@ -33,7 +33,7 @@ function Update({ children }) {
33
33
  ] });
34
34
  }
35
35
  return children;
36
- }
36
+ };
37
37
  export {
38
38
  Update
39
39
  };
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sources":["../../src/react-native/update.tsx"],"sourcesContent":["import * as Updates from 'expo-updates';\nimport { useEffect, useState } from 'react';\nimport { Text } from 'react-native';\n\nexport function Update({ children }) {\n //FIXME useUpdates https://blog.expo.dev/feature-preview-updates-js-api-for-expo-updates-3b92beb40dab\n const [updating, setUpdating] = useState(true);\n\n useEffect(() => {\n (async () => {\n try {\n if (__DEV__) {\n setUpdating(false);\n return;\n }\n\n const update = await Updates.checkForUpdateAsync();\n\n if (!update.isAvailable) {\n setUpdating(false);\n return;\n }\n\n await Updates.fetchUpdateAsync();\n alert('Update is available. App will reload.');\n await Updates.reloadAsync();\n } catch (error) {\n // You can also add an alert() to see the error message in case of an error when fetching updates.\n alert(`Error fetching latest Expo update: ${error}`);\n setUpdating(false);\n }\n })();\n });\n\n if (updating) {\n return <Text>Checking for updates ({Updates.channel})...</Text>;\n }\n\n return children;\n}\n"],"names":[],"mappings":";;;;AAIgB,SAAA,OAAO,EAAE,YAAY;AAEjC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,IAAI;AAE7C,YAAU,MAAM;AACZ,KAAC,YAAY;AACL,UAAA;AACA,YAAI,SAAS;AACT,sBAAY,KAAK;AACjB;AAAA,QAAA;AAGE,cAAA,SAAS,MAAM,QAAQ,oBAAoB;AAE7C,YAAA,CAAC,OAAO,aAAa;AACrB,sBAAY,KAAK;AACjB;AAAA,QAAA;AAGJ,cAAM,QAAQ,iBAAiB;AAC/B,cAAM,uCAAuC;AAC7C,cAAM,QAAQ,YAAY;AAAA,eACrB,OAAO;AAEN,cAAA,sCAAsC,KAAK,EAAE;AACnD,oBAAY,KAAK;AAAA,MAAA;AAAA,IACrB,GACD;AAAA,EAAA,CACN;AAED,MAAI,UAAU;AACV,gCAAQ,MAAK,EAAA,UAAA;AAAA,MAAA;AAAA,MAAuB,QAAQ;AAAA,MAAQ;AAAA,IAAA,GAAI;AAAA,EAAA;AAGrD,SAAA;AACX;"}
1
+ {"version":3,"file":"update.js","sources":["../../src/react-native/update.tsx"],"sourcesContent":["import * as Updates from 'expo-updates';\nimport { FC, useEffect, useState } from 'react';\nimport { Text } from 'react-native';\n\nexport const Update: FC<any> = function Update({ children }) {\n //FIXME useUpdates https://blog.expo.dev/feature-preview-updates-js-api-for-expo-updates-3b92beb40dab\n const [updating, setUpdating] = useState(true);\n\n useEffect(() => {\n (async () => {\n try {\n if (__DEV__) {\n setUpdating(false);\n return;\n }\n\n const update = await Updates.checkForUpdateAsync();\n\n if (!update.isAvailable) {\n setUpdating(false);\n return;\n }\n\n await Updates.fetchUpdateAsync();\n alert('Update is available. App will reload.');\n await Updates.reloadAsync();\n } catch (error) {\n // You can also add an alert() to see the error message in case of an error when fetching updates.\n alert(`Error fetching latest Expo update: ${error}`);\n setUpdating(false);\n }\n })();\n });\n\n if (updating) {\n return <Text>Checking for updates ({Updates.channel})...</Text>;\n }\n\n return children;\n};\n"],"names":["Update"],"mappings":";;;;AAIO,MAAM,SAAkB,SAASA,QAAO,EAAE,YAAY;AAEzD,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,IAAI;AAE7C,YAAU,MAAM;AACZ,KAAC,YAAY;AACL,UAAA;AACA,YAAI,SAAS;AACT,sBAAY,KAAK;AACjB;AAAA,QAAA;AAGE,cAAA,SAAS,MAAM,QAAQ,oBAAoB;AAE7C,YAAA,CAAC,OAAO,aAAa;AACrB,sBAAY,KAAK;AACjB;AAAA,QAAA;AAGJ,cAAM,QAAQ,iBAAiB;AAC/B,cAAM,uCAAuC;AAC7C,cAAM,QAAQ,YAAY;AAAA,eACrB,OAAO;AAEN,cAAA,sCAAsC,KAAK,EAAE;AACnD,oBAAY,KAAK;AAAA,MAAA;AAAA,IACrB,GACD;AAAA,EAAA,CACN;AAED,MAAI,UAAU;AACV,gCAAQ,MAAK,EAAA,UAAA;AAAA,MAAA;AAAA,MAAuB,QAAQ;AAAA,MAAQ;AAAA,IAAA,GAAI;AAAA,EAAA;AAGrD,SAAA;AACX;"}
@@ -1,2 +1,2 @@
1
- export declare function useAppState(): "active" | "unknown" | "background" | "inactive" | "extension";
1
+ export declare function useAppState(): 'active' | 'background' | 'inactive' | 'unknown' | 'extension';
2
2
  //# sourceMappingURL=useAppState.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAppState.d.ts","sourceRoot":"","sources":["../../src/react-native/useAppState.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,mEAc1B"}
1
+ {"version":3,"file":"useAppState.d.ts","sourceRoot":"","sources":["../../src/react-native/useAppState.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,IAAI,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAc5F"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAppState.js","sources":["../../src/react-native/useAppState.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { AppState } from 'react-native';\n\nexport function useAppState() {\n const [appState, setAppState] = useState(AppState.currentState);\n\n useEffect(() => {\n const subscription = AppState.addEventListener('change', (nextAppState) => {\n setAppState(nextAppState);\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return appState;\n}\n"],"names":[],"mappings":";;AAGO,SAAS,cAAc;AAC1B,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,SAAS,YAAY;AAE9D,YAAU,MAAM;AACZ,UAAM,eAAe,SAAS,iBAAiB,UAAU,CAAC,iBAAiB;AACvE,kBAAY,YAAY;AAAA,IAAA,CAC3B;AAED,WAAO,MAAM;AACT,mBAAa,OAAO;AAAA,IACxB;AAAA,EACJ,GAAG,EAAE;AAEE,SAAA;AACX;"}
1
+ {"version":3,"file":"useAppState.js","sources":["../../src/react-native/useAppState.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { AppState } from 'react-native';\n\nexport function useAppState(): 'active' | 'background' | 'inactive' | 'unknown' | 'extension' {\n const [appState, setAppState] = useState(AppState.currentState);\n\n useEffect(() => {\n const subscription = AppState.addEventListener('change', (nextAppState) => {\n setAppState(nextAppState);\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return appState;\n}\n"],"names":[],"mappings":";;AAGO,SAAS,cAA8E;AAC1F,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,SAAS,YAAY;AAE9D,YAAU,MAAM;AACZ,UAAM,eAAe,SAAS,iBAAiB,UAAU,CAAC,iBAAiB;AACvE,kBAAY,YAAY;AAAA,IAAA,CAC3B;AAED,WAAO,MAAM;AACT,mBAAa,OAAO;AAAA,IACxB;AAAA,EACJ,GAAG,EAAE;AAEE,SAAA;AACX;"}
@@ -1,7 +1,3 @@
1
- export declare const Fullpage: ({ divRef, className, children, ...props }: {
2
- [x: string]: any;
3
- divRef?: null | undefined;
4
- className?: string | undefined;
5
- children: any;
6
- }) => import("react/jsx-runtime").JSX.Element;
1
+ import { FC } from 'react';
2
+ export declare const Fullpage: FC<any>;
7
3
  //# sourceMappingURL=fullpage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fullpage.d.ts","sourceRoot":"","sources":["../../src/tailwind/fullpage.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ;;;;;6CAQpB,CAAC"}
1
+ {"version":3,"file":"fullpage.d.ts","sourceRoot":"","sources":["../../src/tailwind/fullpage.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAElC,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,GAAG,CAQ5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fullpage.js","sources":["../../src/tailwind/fullpage.tsx"],"sourcesContent":["import React from 'react';\n\nexport const Fullpage = ({ divRef = null, className = '', children, ...props }) => (\n <div\n ref={divRef}\n {...props}\n className={`container h-screen flex flex-col justify-center items-center ${className}`}\n >\n {children}\n </div>\n);\n"],"names":[],"mappings":";AAEa,MAAA,WAAW,CAAC,EAAE,SAAS,MAAM,YAAY,IAAI,UAAU,GAAG,MAAA,MACnE;AAAA,EAAC;AAAA,EAAA;AAAA,IACG,KAAK;AAAA,IACJ,GAAG;AAAA,IACJ,WAAW,gEAAgE,SAAS;AAAA,IAEnF;AAAA,EAAA;AACL;"}
1
+ {"version":3,"file":"fullpage.js","sources":["../../src/tailwind/fullpage.tsx"],"sourcesContent":["import React, { FC } from 'react';\n\nexport const Fullpage: FC<any> = ({ divRef = null, className = '', children, ...props }) => (\n <div\n ref={divRef}\n {...props}\n className={`container h-screen flex flex-col justify-center items-center ${className}`}\n >\n {children}\n </div>\n);\n"],"names":[],"mappings":";AAEa,MAAA,WAAoB,CAAC,EAAE,SAAS,MAAM,YAAY,IAAI,UAAU,GAAG,MAAA,MAC5E;AAAA,EAAC;AAAA,EAAA;AAAA,IACG,KAAK;AAAA,IACJ,GAAG;AAAA,IACJ,WAAW,gEAAgE,SAAS;AAAA,IAEnF;AAAA,EAAA;AACL;"}
@@ -1,2 +1,3 @@
1
- export declare function ResponsiveHelperTW(): import("react/jsx-runtime").JSX.Element;
1
+ import { FC } from 'react';
2
+ export declare const ResponsiveHelperTW: FC<any>;
2
3
  //# sourceMappingURL=responsiveHelper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"responsiveHelper.d.ts","sourceRoot":"","sources":["../../src/tailwind/responsiveHelper.tsx"],"names":[],"mappings":"AAIA,wBAAgB,kBAAkB,4CAWjC"}
1
+ {"version":3,"file":"responsiveHelper.d.ts","sourceRoot":"","sources":["../../src/tailwind/responsiveHelper.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAElC,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,GAAG,CAWtC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsxs, jsx } from "react/jsx-runtime";
3
- function ResponsiveHelperTW() {
3
+ const ResponsiveHelperTW = function ResponsiveHelperTW2() {
4
4
  return /* @__PURE__ */ jsxs("span", { className: "fixed bottom-0 right-2 z-30 leading-none text-xs", children: [
5
5
  /* @__PURE__ */ jsx("small", { className: "hidden xs:max-sm:block", children: "XS" }),
6
6
  /* @__PURE__ */ jsx("small", { className: "hidden sm:max-md:block", children: "SM" }),
@@ -9,7 +9,7 @@ function ResponsiveHelperTW() {
9
9
  /* @__PURE__ */ jsx("small", { className: "hidden xl:max-2xl:block", children: "XL" }),
10
10
  /* @__PURE__ */ jsx("small", { className: "hidden 2xl:block", children: "XXL" })
11
11
  ] });
12
- }
12
+ };
13
13
  export {
14
14
  ResponsiveHelperTW
15
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"responsiveHelper.js","sources":["../../src/tailwind/responsiveHelper.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nexport function ResponsiveHelperTW() {\n return (\n <span className=\"fixed bottom-0 right-2 z-30 leading-none text-xs\">\n <small className=\"hidden xs:max-sm:block\">XS</small>\n <small className=\"hidden sm:max-md:block\">SM</small>\n <small className=\"hidden md:max-lg:block\">MD</small>\n <small className=\"hidden lg:max-xl:block\">LG</small>\n <small className=\"hidden xl:max-2xl:block\">XL</small>\n <small className=\"hidden 2xl:block\">XXL</small>\n </span>\n );\n}\n"],"names":[],"mappings":";;AAIO,SAAS,qBAAqB;AAE7B,SAAA,qBAAC,QAAK,EAAA,WAAU,oDACZ,UAAA;AAAA,IAAC,oBAAA,SAAA,EAAM,WAAU,0BAAyB,UAAE,MAAA;AAAA,IAC3C,oBAAA,SAAA,EAAM,WAAU,0BAAyB,UAAE,MAAA;AAAA,IAC3C,oBAAA,SAAA,EAAM,WAAU,0BAAyB,UAAE,MAAA;AAAA,IAC3C,oBAAA,SAAA,EAAM,WAAU,0BAAyB,UAAE,MAAA;AAAA,IAC3C,oBAAA,SAAA,EAAM,WAAU,2BAA0B,UAAE,MAAA;AAAA,IAC5C,oBAAA,SAAA,EAAM,WAAU,oBAAmB,UAAG,MAAA,CAAA;AAAA,EAAA,GAC3C;AAER;"}
1
+ {"version":3,"file":"responsiveHelper.js","sources":["../../src/tailwind/responsiveHelper.tsx"],"sourcesContent":["'use client';\n\nimport React, { FC } from 'react';\n\nexport const ResponsiveHelperTW: FC<any> = function ResponsiveHelperTW() {\n return (\n <span className=\"fixed bottom-0 right-2 z-30 leading-none text-xs\">\n <small className=\"hidden xs:max-sm:block\">XS</small>\n <small className=\"hidden sm:max-md:block\">SM</small>\n <small className=\"hidden md:max-lg:block\">MD</small>\n <small className=\"hidden lg:max-xl:block\">LG</small>\n <small className=\"hidden xl:max-2xl:block\">XL</small>\n <small className=\"hidden 2xl:block\">XXL</small>\n </span>\n );\n};\n"],"names":["ResponsiveHelperTW"],"mappings":";;AAIa,MAAA,qBAA8B,SAASA,sBAAqB;AAEjE,SAAA,qBAAC,QAAK,EAAA,WAAU,oDACZ,UAAA;AAAA,IAAC,oBAAA,SAAA,EAAM,WAAU,0BAAyB,UAAE,MAAA;AAAA,IAC3C,oBAAA,SAAA,EAAM,WAAU,0BAAyB,UAAE,MAAA;AAAA,IAC3C,oBAAA,SAAA,EAAM,WAAU,0BAAyB,UAAE,MAAA;AAAA,IAC3C,oBAAA,SAAA,EAAM,WAAU,0BAAyB,UAAE,MAAA;AAAA,IAC3C,oBAAA,SAAA,EAAM,WAAU,2BAA0B,UAAE,MAAA;AAAA,IAC5C,oBAAA,SAAA,EAAM,WAAU,oBAAmB,UAAG,MAAA,CAAA;AAAA,EAAA,GAC3C;AAER;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kirill.konshin/utils",
3
3
  "description": "Utilities",
4
- "version": "0.0.17",
4
+ "version": "0.0.19",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "----- BUILD -----": "",
@@ -1,12 +1,12 @@
1
- import React from 'react';
1
+ import React, { FC } from 'react';
2
2
  import { Container, ContainerProps } from 'react-bootstrap';
3
3
  import { useBreakpoint } from './responsiveHelper';
4
4
 
5
- export function AdaptiveContainer({ children, ...props }: ContainerProps) {
5
+ export const AdaptiveContainer: FC<ContainerProps> = function AdaptiveContainer({ children, ...props }) {
6
6
  const { isMobile } = useBreakpoint();
7
7
  return (
8
8
  <Container fluid={isMobile} {...props}>
9
9
  {children}
10
10
  </Container>
11
11
  );
12
- }
12
+ };
@@ -19,7 +19,7 @@ const meta: Meta<typeof Control> = {
19
19
  const [options, setOptionsRaw] = useState(args.options);
20
20
 
21
21
  const setOptions = useCallback(
22
- (options) =>
22
+ (options: any) =>
23
23
  setOptionsRaw((currentOptions) => {
24
24
  return { ...currentOptions, ...options };
25
25
  }),
@@ -1,8 +1,8 @@
1
- import React, { HTMLInputTypeAttribute, memo } from 'react';
1
+ import React, { HTMLInputTypeAttribute, memo, FC } from 'react';
2
2
 
3
- const lcFirst = (str) => str[0].toLowerCase() + str.substring(1, str.length);
3
+ const lcFirst = (str: string) => str[0].toLowerCase() + str.substring(1, str.length);
4
4
 
5
- const toProperty = (str) => lcFirst(str).split(' ').join('');
5
+ const toProperty = (str: string) => lcFirst(str).split(' ').join('');
6
6
 
7
7
  export interface ControlProps {
8
8
  value?: any;
@@ -24,7 +24,7 @@ export interface ControlProps {
24
24
 
25
25
  export type LabelProps = Pick<ControlProps, 'name' | 'value' | 'defaultValue'> & { reset: () => void };
26
26
 
27
- export const Label = memo<LabelProps>(function Label({ name, reset, value, defaultValue }) {
27
+ export const Label: FC<LabelProps> = memo(function Label({ name, reset, value, defaultValue }) {
28
28
  return (
29
29
  <label className="flex-grow-1 mb-0 d-flex align-items-center justify-content-start gap-2">
30
30
  {name}
@@ -39,7 +39,7 @@ export const Label = memo<LabelProps>(function Label({ name, reset, value, defau
39
39
  );
40
40
  });
41
41
 
42
- export const Control = memo<ControlProps>(function Control({
42
+ export const Control: FC<ControlProps> = memo(function Control({
43
43
  value = null,
44
44
  setValue,
45
45
  defaultValue = null,
@@ -47,7 +47,7 @@ export const Control = memo<ControlProps>(function Control({
47
47
  setOptions,
48
48
  defaultOptions = {},
49
49
  name,
50
- inputProps: { Tag = 'input', property = 'value', valueExtractor = (e) => e.target.value, ...inputProps } = {},
50
+ inputProps: { Tag = 'input', property = 'value', valueExtractor = (e: any) => e.target.value, ...inputProps } = {},
51
51
  hideValue = false,
52
52
  children,
53
53
  }) {
@@ -66,7 +66,7 @@ export const Control = memo<ControlProps>(function Control({
66
66
  {...inputProps}
67
67
  {...{ [property]: value || '' }} // null is needed to make it always controlled
68
68
  className={`${value === defaultValue ? 'opacity-75' : ''} ${inputProps.className}`}
69
- onChange={(e) => setValue(valueExtractor(e))}
69
+ onChange={(e: Event) => setValue(valueExtractor(e))}
70
70
  >
71
71
  {children}
72
72
  </Tag>
@@ -85,7 +85,7 @@ export interface RangeProps extends ControlProps {
85
85
  step?: number;
86
86
  }
87
87
 
88
- export const Range = memo<RangeProps>(function Range({ min, max, step = 0.1, ...props }) {
88
+ export const Range: FC<RangeProps> = memo(function Range({ min, max, step = 0.1, ...props }) {
89
89
  return (
90
90
  <Control
91
91
  inputProps={{
@@ -94,23 +94,23 @@ export const Range = memo<RangeProps>(function Range({ min, max, step = 0.1, ...
94
94
  max,
95
95
  step,
96
96
  className: 'form-control-range',
97
- valueExtractor: (e) => parseFloat(e.target.value),
97
+ valueExtractor: (e: any) => parseFloat(e.target.value),
98
98
  }}
99
99
  {...props}
100
100
  />
101
101
  );
102
102
  });
103
103
 
104
- export const Checkbox = memo<ControlProps>(function Checkbox(props) {
104
+ export const Checkbox: FC<ControlProps> = memo(function Checkbox(props) {
105
105
  return (
106
106
  <Control
107
- inputProps={{ type: 'checkbox', property: 'checked', valueExtractor: (e) => e.target.checked }}
107
+ inputProps={{ type: 'checkbox', property: 'checked', valueExtractor: (e: any) => e.target.checked }}
108
108
  {...props}
109
109
  />
110
110
  );
111
111
  });
112
112
 
113
- export const Select = memo<ControlProps>(function Select({ children, ...props }) {
113
+ export const Select: FC<ControlProps> = memo(function Select({ children, ...props }) {
114
114
  return (
115
115
  <Control inputProps={{ Tag: 'select', className: 'form-select' }} {...props} hideValue={true}>
116
116
  {children}