@overmap-ai/forms 1.0.15 → 1.0.17-master.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 (285) hide show
  1. package/.husky/pre-commit +6 -0
  2. package/.prettierrc.json +10 -0
  3. package/.storybook/StoryDecorator.tsx +22 -0
  4. package/.storybook/main.ts +20 -0
  5. package/.storybook/palettes/green.css +66 -0
  6. package/.storybook/palettes/red.css +66 -0
  7. package/.storybook/preview.css +39 -0
  8. package/.storybook/preview.tsx +31 -0
  9. package/.storybook/tailwind-theme/accentPalette.css +181 -0
  10. package/.storybook/tailwind-theme/backgrounds.css +11 -0
  11. package/.storybook/tailwind-theme/basePalette.css +178 -0
  12. package/dev/publish-alpha.sh +13 -0
  13. package/dev/publish-patch.sh +3 -0
  14. package/dist/ColorPicker/ColorPicker.d.ts +10 -0
  15. package/dist/ColorPicker/index.d.ts +1 -0
  16. package/dist/FileBadge/FileBadge.d.ts +7 -0
  17. package/dist/FileBadge/index.d.ts +1 -0
  18. package/dist/FileCard/FileCard.d.ts +8 -0
  19. package/dist/FileCard/index.d.ts +1 -0
  20. package/dist/FileIcon/FileIcon.d.ts +4 -0
  21. package/dist/FileIcon/index.d.ts +1 -0
  22. package/dist/FileViewer/FileViewerProvider.d.ts +2 -0
  23. package/dist/FileViewer/context.d.ts +4 -0
  24. package/dist/FileViewer/index.d.ts +3 -0
  25. package/dist/FileViewer/typings.d.ts +5 -0
  26. package/dist/ImageCard/ImageCard.d.ts +9 -0
  27. package/dist/ImageCard/index.d.ts +1 -0
  28. package/dist/ImageMarkup/ImageMarkup.d.ts +14 -0
  29. package/dist/ImageMarkup/index.d.ts +1 -0
  30. package/dist/ImageViewer/ImageViewer.d.ts +7 -0
  31. package/dist/ImageViewer/constants.d.ts +1 -0
  32. package/dist/ImageViewer/index.d.ts +2 -0
  33. package/dist/PDFViewer/PDFViewer.d.ts +7 -0
  34. package/dist/PDFViewer/constants.d.ts +1 -0
  35. package/dist/PDFViewer/index.d.ts +2 -0
  36. package/dist/SpreadsheetViewer/SpreadsheetViewer.d.ts +7 -0
  37. package/dist/SpreadsheetViewer/constants.d.ts +1 -0
  38. package/dist/SpreadsheetViewer/index.d.ts +2 -0
  39. package/dist/{builder → forms/builder}/DropDispatch.d.ts +2 -2
  40. package/dist/forms/builder/FieldActions.d.ts +13 -0
  41. package/dist/forms/builder/FieldBuilder.d.ts +10 -0
  42. package/dist/forms/builder/FieldSectionWithActions.d.ts +10 -0
  43. package/dist/forms/builder/FieldWithActions.d.ts +9 -0
  44. package/dist/forms/builder/FieldsEditor.d.ts +5 -0
  45. package/dist/forms/builder/FormBuilder.d.ts +25 -0
  46. package/dist/forms/builder/constants.d.ts +18 -0
  47. package/dist/forms/builder/hooks.d.ts +7 -0
  48. package/dist/forms/builder/index.d.ts +2 -0
  49. package/dist/{builder → forms/builder}/typings.d.ts +2 -1
  50. package/dist/forms/builder/utils.d.ts +23 -0
  51. package/dist/forms/constants.d.ts +3 -0
  52. package/dist/forms/constantsJsx.d.ts +9 -0
  53. package/dist/{fields → forms/fields}/BaseField/BaseField.d.ts +23 -10
  54. package/dist/forms/fields/BaseField/hooks.d.ts +388 -0
  55. package/dist/forms/fields/BaseField/index.d.ts +4 -0
  56. package/dist/{fields → forms/fields}/BaseField/layouts.d.ts +11 -5
  57. package/dist/{fields → forms/fields}/BaseField/typings.d.ts +2 -2
  58. package/dist/{fields → forms/fields}/BooleanField/BooleanField.d.ts +12 -6
  59. package/dist/forms/fields/BooleanField/BooleanInput.d.ts +3 -0
  60. package/dist/forms/fields/BooleanField/index.d.ts +2 -0
  61. package/dist/{fields → forms/fields}/CustomField/CustomField.d.ts +12 -6
  62. package/dist/{fields → forms/fields}/CustomField/FieldInputClonerField/FieldInputCloner.d.ts +2 -3
  63. package/dist/{fields → forms/fields}/CustomField/FieldInputClonerField/FieldInputClonerField.d.ts +3 -3
  64. package/dist/forms/fields/CustomField/FieldInputClonerField/index.d.ts +3 -0
  65. package/dist/forms/fields/CustomField/FieldInputClonerField/typings.d.ts +5 -0
  66. package/dist/forms/fields/CustomField/index.d.ts +1 -0
  67. package/dist/forms/fields/DateField/DateField.d.ts +22 -0
  68. package/dist/forms/fields/DateField/DateInput.d.ts +3 -0
  69. package/dist/forms/fields/DateField/index.d.ts +2 -0
  70. package/dist/{fields → forms/fields}/FieldSection/FieldSection.d.ts +13 -9
  71. package/dist/forms/fields/FieldSection/FieldSectionLayout.d.ts +6 -0
  72. package/dist/forms/fields/FieldSection/index.d.ts +1 -0
  73. package/dist/forms/fields/MultiStringField/MultiStringField.d.ts +40 -0
  74. package/dist/forms/fields/MultiStringField/MultiStringInput.d.ts +7 -0
  75. package/dist/forms/fields/MultiStringField/index.d.ts +2 -0
  76. package/dist/{fields → forms/fields}/NumberField/NumberField.d.ts +27 -10
  77. package/dist/forms/fields/NumberField/NumberInput.d.ts +3 -0
  78. package/dist/forms/fields/NumberField/index.d.ts +2 -0
  79. package/dist/forms/fields/QrField/QrField.d.ts +21 -0
  80. package/dist/forms/fields/QrField/QrInput.d.ts +9 -0
  81. package/dist/forms/fields/QrField/index.d.ts +2 -0
  82. package/dist/{fields → forms/fields}/SelectField/BaseSelectField.d.ts +12 -5
  83. package/dist/{fields → forms/fields}/SelectField/MultiSelectField.d.ts +13 -6
  84. package/dist/forms/fields/SelectField/MultiSelectInput.d.ts +3 -0
  85. package/dist/{fields → forms/fields}/SelectField/SelectField.d.ts +14 -7
  86. package/dist/forms/fields/SelectField/SelectInput.d.ts +3 -0
  87. package/dist/forms/fields/SelectField/index.d.ts +4 -0
  88. package/dist/forms/fields/StringOrTextFields/StringField/StringField.d.ts +26 -0
  89. package/dist/forms/fields/StringOrTextFields/StringField/StringInput.d.ts +3 -0
  90. package/dist/forms/fields/StringOrTextFields/StringField/index.d.ts +2 -0
  91. package/dist/{fields → forms/fields}/StringOrTextFields/StringOrTextField.d.ts +13 -8
  92. package/dist/forms/fields/StringOrTextFields/TextField/TextField.d.ts +22 -0
  93. package/dist/forms/fields/StringOrTextFields/TextField/TextInput.d.ts +3 -0
  94. package/dist/forms/fields/StringOrTextFields/TextField/index.d.ts +2 -0
  95. package/dist/forms/fields/StringOrTextFields/index.d.ts +2 -0
  96. package/dist/{fields → forms/fields}/UploadField/UploadField.d.ts +24 -9
  97. package/dist/forms/fields/UploadField/UploadInput.d.ts +3 -0
  98. package/dist/forms/fields/UploadField/index.d.ts +2 -0
  99. package/dist/forms/fields/constants.d.ts +106 -0
  100. package/dist/forms/fields/hooks.d.ts +6 -0
  101. package/dist/forms/fields/index.d.ts +12 -0
  102. package/dist/{fields → forms/fields}/typings.d.ts +9 -6
  103. package/dist/{fields → forms/fields}/utils.d.ts +7 -3
  104. package/dist/forms/index.d.ts +5 -0
  105. package/dist/{renderer → forms/renderer}/FormRenderer/FormRenderer.d.ts +4 -3
  106. package/dist/{renderer → forms/renderer}/PatchForm/Field.d.ts +5 -3
  107. package/dist/{renderer → forms/renderer}/PatchForm/Provider.d.ts +8 -4
  108. package/dist/forms/renderer/PatchForm/index.d.ts +2 -0
  109. package/dist/forms/renderer/index.d.ts +2 -0
  110. package/dist/forms/typings.d.ts +105 -0
  111. package/dist/forms/utils.d.ts +7 -0
  112. package/dist/forms.js +4450 -2478
  113. package/dist/forms.umd.cjs +44 -2777
  114. package/dist/index.d.ts +11 -3
  115. package/eslint.config.js +56 -0
  116. package/package.json +96 -94
  117. package/src/ColorPicker/ColorPicker.tsx +47 -0
  118. package/src/ColorPicker/index.ts +1 -0
  119. package/src/FileBadge/FileBadge.tsx +27 -0
  120. package/src/FileBadge/index.ts +1 -0
  121. package/src/FileCard/FileCard.stories.tsx +69 -0
  122. package/src/FileCard/FileCard.tsx +53 -0
  123. package/src/FileCard/index.ts +1 -0
  124. package/src/FileIcon/FileIcon.tsx +31 -0
  125. package/src/FileIcon/index.ts +1 -0
  126. package/src/FileViewer/FileViewerProvider.stories.tsx +50 -0
  127. package/src/FileViewer/FileViewerProvider.tsx +72 -0
  128. package/src/FileViewer/context.ts +11 -0
  129. package/src/FileViewer/index.ts +3 -0
  130. package/src/FileViewer/typings.ts +5 -0
  131. package/src/ImageCard/ImageCard.stories.tsx +94 -0
  132. package/src/ImageCard/ImageCard.tsx +82 -0
  133. package/src/ImageCard/index.ts +1 -0
  134. package/src/ImageMarkup/ImageMarkup.stories.tsx +65 -0
  135. package/src/ImageMarkup/ImageMarkup.tsx +268 -0
  136. package/src/ImageMarkup/index.ts +1 -0
  137. package/src/ImageViewer/ImageViewer.stories.tsx +57 -0
  138. package/src/ImageViewer/ImageViewer.tsx +124 -0
  139. package/src/ImageViewer/constants.ts +1 -0
  140. package/src/ImageViewer/index.ts +2 -0
  141. package/src/PDFViewer/PDFViewer.stories.tsx +55 -0
  142. package/src/PDFViewer/PDFViewer.tsx +170 -0
  143. package/src/PDFViewer/constants.ts +1 -0
  144. package/src/PDFViewer/index.ts +2 -0
  145. package/src/SpreadsheetViewer/SpreadsheetViewer.stories.tsx +55 -0
  146. package/src/SpreadsheetViewer/SpreadsheetViewer.tsx +162 -0
  147. package/src/SpreadsheetViewer/constants.ts +8 -0
  148. package/src/SpreadsheetViewer/index.ts +2 -0
  149. package/src/forms/builder/DropDispatch.ts +84 -0
  150. package/src/forms/builder/FieldActions.tsx +155 -0
  151. package/src/forms/builder/FieldBuilder.tsx +386 -0
  152. package/src/forms/builder/FieldSectionWithActions.tsx +260 -0
  153. package/src/forms/builder/FieldWithActions.tsx +129 -0
  154. package/src/forms/builder/FieldsEditor.tsx +180 -0
  155. package/src/forms/builder/FormBuilder.stories.tsx +105 -0
  156. package/src/forms/builder/FormBuilder.tsx +237 -0
  157. package/src/forms/builder/constants.ts +18 -0
  158. package/src/forms/builder/hooks.tsx +24 -0
  159. package/src/forms/builder/index.ts +2 -0
  160. package/src/forms/builder/typings.ts +18 -0
  161. package/src/forms/builder/utils.ts +229 -0
  162. package/src/forms/constants.ts +9 -0
  163. package/src/forms/constantsJsx.tsx +67 -0
  164. package/src/forms/fields/BaseField/BaseField.ts +152 -0
  165. package/src/forms/fields/BaseField/hooks.tsx +60 -0
  166. package/src/forms/fields/BaseField/index.ts +4 -0
  167. package/src/forms/fields/BaseField/layouts.tsx +100 -0
  168. package/src/forms/fields/BaseField/typings.ts +9 -0
  169. package/src/forms/fields/BooleanField/BooleanField.tsx +48 -0
  170. package/src/forms/fields/BooleanField/BooleanInput.tsx +54 -0
  171. package/src/forms/fields/BooleanField/index.ts +2 -0
  172. package/src/forms/fields/CustomField/CustomField.tsx +45 -0
  173. package/src/forms/fields/CustomField/FieldInputClonerField/FieldInputCloner.tsx +25 -0
  174. package/src/forms/fields/CustomField/FieldInputClonerField/FieldInputClonerField.tsx +26 -0
  175. package/src/forms/fields/CustomField/FieldInputClonerField/index.ts +3 -0
  176. package/src/forms/fields/CustomField/FieldInputClonerField/typings.ts +8 -0
  177. package/src/forms/fields/CustomField/index.ts +1 -0
  178. package/src/forms/fields/DateField/DateField.tsx +42 -0
  179. package/src/forms/fields/DateField/DateInput.tsx +39 -0
  180. package/src/forms/fields/DateField/index.ts +2 -0
  181. package/src/forms/fields/FieldSection/FieldSection.tsx +173 -0
  182. package/src/forms/fields/FieldSection/FieldSectionLayout.tsx +56 -0
  183. package/src/forms/fields/FieldSection/index.ts +1 -0
  184. package/src/forms/fields/MultiStringField/MultiStringField.tsx +90 -0
  185. package/src/forms/fields/MultiStringField/MultiStringInput.tsx +207 -0
  186. package/src/forms/fields/MultiStringField/index.ts +2 -0
  187. package/src/forms/fields/NumberField/NumberField.tsx +173 -0
  188. package/src/forms/fields/NumberField/NumberInput.tsx +44 -0
  189. package/src/forms/fields/NumberField/index.ts +2 -0
  190. package/src/forms/fields/QrField/QrField.tsx +38 -0
  191. package/src/forms/fields/QrField/QrInput.module.sass +5 -0
  192. package/src/forms/fields/QrField/QrInput.tsx +144 -0
  193. package/src/forms/fields/QrField/index.ts +2 -0
  194. package/src/forms/fields/SelectField/BaseSelectField.ts +73 -0
  195. package/src/forms/fields/SelectField/MultiSelectField.tsx +53 -0
  196. package/src/forms/fields/SelectField/MultiSelectInput.tsx +80 -0
  197. package/src/forms/fields/SelectField/SelectField.tsx +49 -0
  198. package/src/forms/fields/SelectField/SelectInput.tsx +69 -0
  199. package/src/forms/fields/SelectField/index.ts +4 -0
  200. package/src/forms/fields/StringOrTextFields/StringField/StringField.tsx +61 -0
  201. package/src/forms/fields/StringOrTextFields/StringField/StringInput.tsx +41 -0
  202. package/src/forms/fields/StringOrTextFields/StringField/index.ts +2 -0
  203. package/src/forms/fields/StringOrTextFields/StringOrTextField.ts +143 -0
  204. package/src/forms/fields/StringOrTextFields/TextField/TextField.tsx +52 -0
  205. package/src/forms/fields/StringOrTextFields/TextField/TextInput.tsx +42 -0
  206. package/src/forms/fields/StringOrTextFields/TextField/index.ts +2 -0
  207. package/src/forms/fields/StringOrTextFields/index.ts +2 -0
  208. package/src/forms/fields/UploadField/UploadField.tsx +156 -0
  209. package/src/forms/fields/UploadField/UploadInput.tsx +220 -0
  210. package/src/forms/fields/UploadField/index.ts +2 -0
  211. package/src/forms/fields/UploadField/utils.ts +17 -0
  212. package/src/forms/fields/constants.ts +43 -0
  213. package/src/forms/fields/hooks.tsx +26 -0
  214. package/src/forms/fields/index.ts +12 -0
  215. package/src/forms/fields/typings.ts +45 -0
  216. package/src/forms/fields/utils.ts +125 -0
  217. package/src/forms/index.ts +5 -0
  218. package/src/forms/renderer/FormRenderer/FormRenderer.stories.tsx +142 -0
  219. package/src/forms/renderer/FormRenderer/FormRenderer.tsx +135 -0
  220. package/src/forms/renderer/PatchForm/Field.tsx +41 -0
  221. package/src/forms/renderer/PatchForm/PatchForm.stories.tsx +91 -0
  222. package/src/forms/renderer/PatchForm/Provider.tsx +119 -0
  223. package/src/forms/renderer/PatchForm/index.ts +2 -0
  224. package/src/forms/renderer/index.ts +2 -0
  225. package/src/forms/typings.ts +162 -0
  226. package/src/forms/utils.ts +69 -0
  227. package/src/index.ts +11 -0
  228. package/src/vite-env.d.ts +1 -0
  229. package/tailwind.config.ts +8 -0
  230. package/tsconfig.json +26 -0
  231. package/tsconfig.node.json +10 -0
  232. package/vite.config.ts +23 -0
  233. package/README.md +0 -12
  234. package/dist/builder/FieldActions.d.ts +0 -12
  235. package/dist/builder/FieldBuilder.d.ts +0 -24
  236. package/dist/builder/FieldSectionWithActions.d.ts +0 -10
  237. package/dist/builder/FieldWithActions.d.ts +0 -11
  238. package/dist/builder/FieldsEditor.d.ts +0 -2
  239. package/dist/builder/FormBuilder.d.ts +0 -15
  240. package/dist/builder/constants.d.ts +0 -1
  241. package/dist/builder/index.d.ts +0 -2
  242. package/dist/builder/utils.d.ts +0 -13
  243. package/dist/fields/BaseField/hooks.d.ts +0 -374
  244. package/dist/fields/BaseField/index.d.ts +0 -4
  245. package/dist/fields/BooleanField/BooleanInput.d.ts +0 -4
  246. package/dist/fields/BooleanField/index.d.ts +0 -2
  247. package/dist/fields/CustomField/FieldInputClonerField/index.d.ts +0 -3
  248. package/dist/fields/CustomField/FieldInputClonerField/typings.d.ts +0 -5
  249. package/dist/fields/CustomField/index.d.ts +0 -1
  250. package/dist/fields/DateField/DateField.d.ts +0 -16
  251. package/dist/fields/DateField/DateInput.d.ts +0 -4
  252. package/dist/fields/DateField/index.d.ts +0 -2
  253. package/dist/fields/FieldSection/FieldSectionLayout.d.ts +0 -7
  254. package/dist/fields/FieldSection/index.d.ts +0 -1
  255. package/dist/fields/MultiStringField/MultiStringField.d.ts +0 -30
  256. package/dist/fields/MultiStringField/MultiStringInput.d.ts +0 -8
  257. package/dist/fields/MultiStringField/index.d.ts +0 -2
  258. package/dist/fields/NumberField/NumberInput.d.ts +0 -4
  259. package/dist/fields/NumberField/index.d.ts +0 -2
  260. package/dist/fields/SelectField/MultiSelectInput.d.ts +0 -4
  261. package/dist/fields/SelectField/SelectInput.d.ts +0 -4
  262. package/dist/fields/SelectField/index.d.ts +0 -4
  263. package/dist/fields/StringOrTextFields/StringField/StringField.d.ts +0 -19
  264. package/dist/fields/StringOrTextFields/StringField/StringInput.d.ts +0 -4
  265. package/dist/fields/StringOrTextFields/StringField/index.d.ts +0 -2
  266. package/dist/fields/StringOrTextFields/TextField/TextField.d.ts +0 -16
  267. package/dist/fields/StringOrTextFields/TextField/TextInput.d.ts +0 -4
  268. package/dist/fields/StringOrTextFields/TextField/index.d.ts +0 -2
  269. package/dist/fields/StringOrTextFields/index.d.ts +0 -2
  270. package/dist/fields/UploadField/UploadInput.d.ts +0 -4
  271. package/dist/fields/UploadField/index.d.ts +0 -2
  272. package/dist/fields/constants.d.ts +0 -20
  273. package/dist/fields/hooks.d.ts +0 -6
  274. package/dist/fields/index.d.ts +0 -11
  275. package/dist/forms.js.map +0 -1
  276. package/dist/forms.umd.cjs.map +0 -1
  277. package/dist/renderer/FormBrowser/FormBrowser.d.ts +0 -11
  278. package/dist/renderer/FormSubmissionBrowser/FormSubmissionBrowser.d.ts +0 -28
  279. package/dist/renderer/FormSubmissionViewer/FormSubmissionViewer.d.ts +0 -17
  280. package/dist/renderer/PatchForm/index.d.ts +0 -2
  281. package/dist/renderer/index.d.ts +0 -5
  282. package/dist/style.css +0 -34
  283. package/dist/typings.d.ts +0 -17
  284. package/dist/utils.d.ts +0 -7
  285. /package/dist/{fields → forms/fields}/UploadField/utils.d.ts +0 -0
package/dist/index.d.ts CHANGED
@@ -1,3 +1,11 @@
1
- export * from "./builder";
2
- export * from "./fields";
3
- export * from "./renderer";
1
+ export * from './ColorPicker';
2
+ export * from './FileBadge';
3
+ export * from './FileCard';
4
+ export * from './FileIcon';
5
+ export * from './FileViewer';
6
+ export * from './forms';
7
+ export * from './ImageCard';
8
+ export * from './ImageMarkup';
9
+ export * from './ImageViewer';
10
+ export * from './PDFViewer';
11
+ export * from './SpreadsheetViewer';
@@ -0,0 +1,56 @@
1
+ import pluginJs from "@eslint/js"
2
+ import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"
3
+ import pluginReact from "eslint-plugin-react"
4
+ import simpleImportSort from "eslint-plugin-simple-import-sort"
5
+ import pluginStorybook from "eslint-plugin-storybook"
6
+ import globals from "globals"
7
+ import tseslint from "typescript-eslint"
8
+
9
+ /** @type {import('eslint').Linter.Config[]} */
10
+ export default [
11
+ { files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"] },
12
+ { languageOptions: { globals: globals.browser } },
13
+ pluginJs.configs.recommended,
14
+ ...tseslint.configs.recommended,
15
+ {
16
+ rules: {
17
+ "no-unused-vars": "off",
18
+ "@typescript-eslint/no-unused-vars": [
19
+ "error",
20
+ {
21
+ varsIgnorePattern: "^_",
22
+ argsIgnorePattern: "^_",
23
+ caughtErrorsIgnorePattern: "^_",
24
+ },
25
+ ],
26
+ },
27
+ },
28
+ {
29
+ plugins: {
30
+ "simple-import-sort": simpleImportSort,
31
+ },
32
+ rules: {
33
+ "simple-import-sort/imports": "error",
34
+ "simple-import-sort/exports": "error",
35
+ },
36
+ },
37
+ {
38
+ ...pluginReact.configs.flat.recommended,
39
+ settings: {
40
+ react: { version: "detect" },
41
+ },
42
+ rules: {
43
+ "react/react-in-jsx-scope": "off",
44
+ },
45
+ },
46
+ ...pluginStorybook.configs["flat/recommended"],
47
+ eslintPluginPrettierRecommended,
48
+ {
49
+ linterOptions: {
50
+ reportUnusedDisableDirectives: "error",
51
+ },
52
+ },
53
+ {
54
+ ignores: ["!.storybook", "dist"],
55
+ },
56
+ ]
package/package.json CHANGED
@@ -1,94 +1,96 @@
1
- {
2
- "name": "@overmap-ai/forms",
3
- "description": "Form functionality for Overmap",
4
- "author": "Wôrdn Inc.",
5
- "license": "UNLICENSED",
6
- "version": "1.0.15",
7
- "type": "module",
8
- "main": "dist/forms.umd.cjs",
9
- "module": "dist/forms.js",
10
- "types": "dist/index.d.ts",
11
- "files": [
12
- "dist"
13
- ],
14
- "scripts": {
15
- "dev": "yarn storybook",
16
- "storybook": "storybook dev -p 6006",
17
- "build": "tsc --noEmit && vite build",
18
- "lint": "eslint --report-unused-disable-directives --max-warnings 0 \"src/**/*.{tsx,ts}\"",
19
- "lint:fix": "yarn lint --fix",
20
- "preview": "vite preview",
21
- "prepare": "husky install",
22
- "build-storybook": "storybook build"
23
- },
24
- "dependencies": {
25
- "@hello-pangea/dnd": "^16.3.0",
26
- "formik": "^2.4.5",
27
- "linkify-react": "^4.1.3",
28
- "linkifyjs": "^4.1.3",
29
- "lodash.clonedeep": "^4.5.0",
30
- "lodash.get": "^4.4.2",
31
- "lodash.set": "^4.3.2"
32
- },
33
- "peerDependencies": {
34
- "@overmap-ai/blocks": "^1.0.8",
35
- "@overmap-ai/core": "^1.0.1",
36
- "@radix-ui/react-icons": ">1.0.0",
37
- "@radix-ui/themes": ">2.0.0",
38
- "react": "^18.2.0",
39
- "react-dom": "^18.2.0"
40
- },
41
- "devDependencies": {
42
- "@overmap-ai/blocks": "^1.0.22",
43
- "@overmap-ai/core": "^1.0.29",
44
- "@rollup/plugin-commonjs": "^25.0.4",
45
- "@storybook/addon-a11y": "^7.4.5",
46
- "@storybook/addon-essentials": "^7.4.5",
47
- "@storybook/addon-interactions": "^7.4.5",
48
- "@storybook/addon-links": "^7.4.5",
49
- "@storybook/addon-themes": "^7.4.5",
50
- "@storybook/blocks": "^7.4.5",
51
- "@storybook/react": "^7.4.5",
52
- "@storybook/react-vite": "^7.4.5",
53
- "@storybook/testing-library": "^0.2.1",
54
- "@types/lodash.clonedeep": "^4.5.9",
55
- "@types/lodash.get": "^4.4.7",
56
- "@types/lodash.set": "^4.3.7",
57
- "@types/node": "^20.6.2",
58
- "@types/react": "^18.2.15",
59
- "@types/react-dom": "^18.2.7",
60
- "@typescript-eslint/eslint-plugin": "^6.0.0",
61
- "@typescript-eslint/parser": "^6.0.0",
62
- "@vitejs/plugin-react-swc": "^3.3.2",
63
- "eslint": "^8.45.0",
64
- "eslint-config-prettier": "^9.0.0",
65
- "eslint-plugin-prettier": "^5.0.0",
66
- "eslint-plugin-react": "^7.33.2",
67
- "eslint-plugin-react-hooks": "^4.6.0",
68
- "eslint-plugin-react-refresh": "^0.4.3",
69
- "eslint-plugin-storybook": "^0.6.14",
70
- "husky": "^8.0.3",
71
- "lint-staged": "^14.0.1",
72
- "prettier": "^3.0.3",
73
- "react": "^18.2.0",
74
- "react-dom": "^18.2.0",
75
- "react-redux": "^8.1.3",
76
- "redux": "^4.2.1",
77
- "rollup-plugin-polyfill-node": "^0.12.0",
78
- "sass": "^1.67.0",
79
- "storybook": "^7.4.5",
80
- "typescript": "^5.0.2",
81
- "vite": "^4.4.5",
82
- "vite-plugin-dts": "^3.5.3",
83
- "vite-plugin-externalize-deps": "^0.7.0"
84
- },
85
- "lint-staged": {
86
- "*.{ts,tsx}": [
87
- "eslint --fix --report-unused-disable-directives --max-warnings 0"
88
- ]
89
- },
90
- "resolutions": {
91
- "jackspeak": "2.1.1",
92
- "@types/react": "^18.2.15"
93
- }
94
- }
1
+ {
2
+ "name": "@overmap-ai/forms",
3
+ "private": false,
4
+ "version": "1.0.17-master.1",
5
+ "license": "UNLICENSED",
6
+ "main": "dist/forms.umd.cjs",
7
+ "module": "dist/forms.js",
8
+ "types": "dist/index.d.ts",
9
+ "type": "module",
10
+ "scripts": {
11
+ "dev": "vite",
12
+ "build": "tsc && vite build",
13
+ "preview": "vite preview",
14
+ "prepare": "husky",
15
+ "lint:fix": "yarn lint --fix",
16
+ "lint": "tsc --noEmit && eslint . --max-warnings 0",
17
+ "storybook": "storybook dev -p 6006",
18
+ "build-storybook": "storybook build"
19
+ },
20
+ "peerDependencies": {
21
+ "@overmap-ai/blocks": "1.0.31-tailwind-components.22",
22
+ "@overmap-ai/core": "1.0.60-forms-removal.3",
23
+ "react": ">=18.2.0 <20.0.0",
24
+ "react-dom": ">=18.2.0 <20.0.0",
25
+ "tailwindcss": "^4.0.0"
26
+ },
27
+ "devDependencies": {
28
+ "@chromatic-com/storybook": "^3.2.4",
29
+ "@eslint/js": "^9.19.0",
30
+ "@overmap-ai/blocks": "1.0.31-tailwind-components.25",
31
+ "@overmap-ai/core": "1.0.60-forms-removal.3",
32
+ "@radix-ui/colors": "^3.0.0",
33
+ "@storybook/addon-a11y": "^8.5.3",
34
+ "@storybook/addon-essentials": "^8.5.3",
35
+ "@storybook/addon-interactions": "^8.5.3",
36
+ "@storybook/addon-onboarding": "^8.5.3",
37
+ "@storybook/addon-themes": "^8.5.3",
38
+ "@storybook/addon-viewport": "^8.5.3",
39
+ "@storybook/blocks": "^8.5.3",
40
+ "@storybook/react": "^8.5.3",
41
+ "@storybook/react-vite": "^8.5.3",
42
+ "@storybook/test": "^8.5.3",
43
+ "@storybook/types": "^8.5.3",
44
+ "@tailwindcss/vite": "^4.0.0",
45
+ "@types/file-saver": "^2.0.7",
46
+ "@types/lodash.clonedeep": "^4.5.9",
47
+ "@types/lodash.get": "^4.4.9",
48
+ "@types/lodash.set": "^4.3.9",
49
+ "@types/node": "^22.13.0",
50
+ "@types/react": "^19.0.0",
51
+ "@types/react-dom": "^19.0.0",
52
+ "@types/react-icons": "^3.0.0",
53
+ "@types/xlsx": "^0.0.36",
54
+ "@vitejs/plugin-react": "^4.3.4",
55
+ "eslint": "^9.19.0",
56
+ "eslint-config-prettier": "^10.0.1",
57
+ "eslint-plugin-prettier": "^5.2.3",
58
+ "eslint-plugin-react": "^7.37.4",
59
+ "eslint-plugin-simple-import-sort": "^12.1.1",
60
+ "eslint-plugin-storybook": "^0.11.2",
61
+ "file-saver": "^2.0.5",
62
+ "globals": "^15.14.0",
63
+ "husky": "^9.1.7",
64
+ "prettier": "^3.4.2",
65
+ "react": "^19.0.0",
66
+ "react-dom": "^19.0.0",
67
+ "storybook": "^8.5.3",
68
+ "tailwindcss": "^4.0.0",
69
+ "typescript": "~5.6.2",
70
+ "typescript-eslint": "^8.22.0",
71
+ "vite": "^6.0.5",
72
+ "vite-plugin-dts": "^4.5.0",
73
+ "vite-plugin-externalize-deps": "^0.9.0"
74
+ },
75
+ "eslintConfig": {
76
+ "extends": [
77
+ "plugin:storybook/recommended"
78
+ ]
79
+ },
80
+ "dependencies": {
81
+ "@hello-pangea/dnd": "^17.0.0",
82
+ "formik": "^2.4.6",
83
+ "lodash.clonedeep": "^4.5.0",
84
+ "lodash.get": "^4.4.2",
85
+ "lodash.set": "^4.3.2",
86
+ "qr-scanner": "^1.4.2",
87
+ "react-icons": "^5.4.0",
88
+ "react-pdf": "^9.2.1",
89
+ "react-sketch-canvas": "^6.2.0",
90
+ "react-spreadsheet": "^0.9.5",
91
+ "xlsx": "^0.18.5"
92
+ },
93
+ "resolutions": {
94
+ "@types/react": "^19.0.0"
95
+ }
96
+ }
@@ -0,0 +1,47 @@
1
+ import { IconButton, Popover, RiIcon } from "@overmap-ai/blocks"
2
+ import { CSSColor } from "@overmap-ai/core"
3
+ import { memo, ReactElement, useCallback } from "react"
4
+
5
+ interface ColorPickerProps {
6
+ selectedColor: CSSColor | null
7
+ allColors: CSSColor[]
8
+ onFinish: (color: CSSColor) => void
9
+ trigger: ReactElement
10
+ }
11
+
12
+ export const ColorPicker = memo((props: ColorPickerProps) => {
13
+ const { selectedColor, allColors, onFinish, trigger } = props
14
+
15
+ const handleSelectedColorChange = useCallback(
16
+ (color: CSSColor) => () => {
17
+ onFinish(color)
18
+ },
19
+ [onFinish],
20
+ )
21
+
22
+ return (
23
+ <Popover.Root>
24
+ <Popover.Trigger>{trigger}</Popover.Trigger>
25
+ <Popover.Content size="sm">
26
+ <div className="grid w-max grid-cols-7 gap-x-1 gap-y-1">
27
+ {allColors.map((color) => (
28
+ <IconButton
29
+ key={color}
30
+ onClick={handleSelectedColorChange(color)}
31
+ style={{
32
+ backgroundColor: color,
33
+ }}
34
+ type="button"
35
+ variant="solid"
36
+ aria-label={color}
37
+ >
38
+ {selectedColor === color && <RiIcon icon="RiCheckLine" />}
39
+ </IconButton>
40
+ ))}
41
+ </div>
42
+ </Popover.Content>
43
+ </Popover.Root>
44
+ )
45
+ })
46
+
47
+ ColorPicker.displayName = "ColorPicker"
@@ -0,0 +1 @@
1
+ export * from "./ColorPicker"
@@ -0,0 +1,27 @@
1
+ import { Badge, BadgeProps } from "@overmap-ai/blocks"
2
+ import { truncate } from "@overmap-ai/core"
3
+ import { memo, useMemo } from "react"
4
+
5
+ import { FileIcon } from "../FileIcon"
6
+
7
+ export interface FileBadgeProps extends Omit<BadgeProps, "children"> {
8
+ file: File
9
+ truncateLength?: number
10
+ hideName?: boolean
11
+ }
12
+ export const FileBadge = memo((props: FileBadgeProps) => {
13
+ const { file, truncateLength, hideName = false, ...rest } = props
14
+
15
+ const fileName = useMemo(
16
+ () => (truncateLength !== undefined ? truncate(file.name, truncateLength) : file.name),
17
+ [file.name, truncateLength],
18
+ )
19
+
20
+ return (
21
+ <Badge {...rest}>
22
+ <FileIcon fileType={file.type} />
23
+ {!hideName && fileName}
24
+ </Badge>
25
+ )
26
+ })
27
+ FileBadge.displayName = "FileBadge"
@@ -0,0 +1 @@
1
+ export * from "./FileBadge"
@@ -0,0 +1,69 @@
1
+ import type { Meta } from "@storybook/react"
2
+ import { ChangeEvent, useCallback, useRef, useState } from "react"
3
+
4
+ import { FileCard } from "./FileCard"
5
+
6
+ const meta = {
7
+ title: "Components/FileCard",
8
+ component: FileCard,
9
+ tags: ["autodocs"],
10
+ parameters: {
11
+ disablePanel: true,
12
+ },
13
+ } satisfies Meta<typeof FileCard>
14
+
15
+ export default meta
16
+
17
+ export const Basic = () => {
18
+ const inputRef = useRef<HTMLInputElement>(null)
19
+ const [files, setFiles] = useState<File[]>([])
20
+
21
+ const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {
22
+ if (e.target.files) {
23
+ const files = Array.from(e.target.files)
24
+ if (files.length > 0) {
25
+ setFiles(files)
26
+ }
27
+ }
28
+ }, [])
29
+
30
+ return (
31
+ <>
32
+ <input ref={inputRef} multiple type="file" onChange={handleChange} />
33
+ <div className="flex flex-col gap-1">
34
+ {files.map((file, index) => (
35
+ <FileCard key={index} file={file} />
36
+ ))}
37
+ </div>
38
+ </>
39
+ )
40
+ }
41
+
42
+ export const Loading = () => {
43
+ return <FileCard file={null} />
44
+ }
45
+
46
+ export const Errored = () => {
47
+ const inputRef = useRef<HTMLInputElement>(null)
48
+ const [files, setFiles] = useState<File[]>([])
49
+
50
+ const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {
51
+ if (e.target.files) {
52
+ const files = Array.from(e.target.files)
53
+ if (files.length > 0) {
54
+ setFiles(files)
55
+ }
56
+ }
57
+ }, [])
58
+
59
+ return (
60
+ <>
61
+ <input ref={inputRef} multiple type="file" onChange={handleChange} />
62
+ <div className="flex flex-col gap-1">
63
+ {files.map((file, index) => (
64
+ <FileCard key={index} file={file} error={file.name} />
65
+ ))}
66
+ </div>
67
+ </>
68
+ )
69
+ }
@@ -0,0 +1,53 @@
1
+ import { RiIcon, Spinner } from "@overmap-ai/blocks"
2
+ import { truncate } from "@overmap-ai/core"
3
+ import { cx } from "class-variance-authority"
4
+ import { ComponentProps, forwardRef, memo, PropsWithoutRef, ReactNode, useMemo } from "react"
5
+
6
+ import { FileIcon } from "../FileIcon"
7
+
8
+ export interface FileCardProps extends Omit<PropsWithoutRef<ComponentProps<"div">>, "children"> {
9
+ file: File | null
10
+ truncateLength?: number
11
+ error?: string
12
+ rightSlot?: ReactNode
13
+ }
14
+
15
+ export const FileCard = memo(
16
+ forwardRef<HTMLDivElement, FileCardProps>((props, ref) => {
17
+ const { file, className, error, truncateLength, rightSlot, ...rest } = props
18
+
19
+ const fileName = useMemo(() => {
20
+ if (!file) return
21
+ return truncateLength !== undefined ? truncate(file.name, truncateLength) : file.name
22
+ }, [file, truncateLength])
23
+
24
+ return (
25
+ <div
26
+ className={cx(
27
+ className,
28
+ "flex h-5 w-full items-center gap-2 rounded-md border border-(--base-a6) bg-(--base-2) text-sm py-1 px-2 h-max",
29
+ {
30
+ "text-(--gray-11)": error,
31
+ },
32
+ )}
33
+ ref={ref}
34
+ {...rest}
35
+ >
36
+ {error ? <RiIcon icon="RiFileWarningLine" /> : <FileIcon fileType={file?.type ?? ""} />}
37
+ {!error ? (
38
+ file ? (
39
+ fileName
40
+ ) : (
41
+ <div className="flex w-full justify-center">
42
+ <Spinner />
43
+ </div>
44
+ )
45
+ ) : (
46
+ error
47
+ )}
48
+ {rightSlot}
49
+ </div>
50
+ )
51
+ }),
52
+ )
53
+ FileCard.displayName = "FileCard"
@@ -0,0 +1 @@
1
+ export * from "./FileCard"
@@ -0,0 +1,31 @@
1
+ import { RiIcon } from "@overmap-ai/blocks"
2
+ import { memo, useMemo } from "react"
3
+
4
+ import { SUPPORTED_IMAGE_FILE_TYPES } from "../ImageViewer"
5
+ import { SUPPORTED_PDF_FILE_TYPES } from "../PDFViewer"
6
+ import { SUPPORTED_SPREADSHEET_FILE_EXTENSIONS } from "../SpreadsheetViewer"
7
+
8
+ // TODO: create a mapping for each supported file extensions to a appropriate icon.
9
+ // May need to outsource some icons for this.
10
+
11
+ export interface FileIconProps {
12
+ fileType: string
13
+ }
14
+ export const FileIcon = memo((props: FileIconProps) => {
15
+ const { fileType } = props
16
+ const icon = useMemo(() => {
17
+ if (SUPPORTED_SPREADSHEET_FILE_EXTENSIONS.includes(fileType)) {
18
+ return <RiIcon icon="RiFileExcelLine" />
19
+ }
20
+ if (SUPPORTED_PDF_FILE_TYPES.includes(fileType)) {
21
+ return <RiIcon icon="RiFilePdfLine" />
22
+ }
23
+ if (SUPPORTED_IMAGE_FILE_TYPES.includes(fileType)) {
24
+ return <RiIcon icon="RiFileImageLine" />
25
+ }
26
+ return <RiIcon icon="RiFileLine" />
27
+ }, [fileType])
28
+
29
+ return <div className="h-max w-max">{icon}</div>
30
+ })
31
+ FileIcon.displayName = "FileIcon"
@@ -0,0 +1 @@
1
+ export * from "./FileIcon"
@@ -0,0 +1,50 @@
1
+ import { Button } from "@overmap-ai/blocks"
2
+ import type { Meta } from "@storybook/react"
3
+ import { ChangeEvent, useCallback, useRef, useState } from "react"
4
+
5
+ import { useFileViewer } from "./context"
6
+ import { FileViewerProvider } from "./FileViewerProvider"
7
+
8
+ const meta = {
9
+ title: "Contexts/FileViewer",
10
+ component: FileViewerProvider,
11
+ tags: ["autodocs"],
12
+ parameters: {
13
+ disablePanel: true,
14
+ },
15
+ } satisfies Meta<typeof FileViewerProvider>
16
+
17
+ export default meta
18
+
19
+ export const Basic = () => {
20
+ const inputRef = useRef<HTMLInputElement>(null)
21
+ const [file, setFile] = useState<File | null>(null)
22
+ const openFileViewer = useFileViewer()
23
+
24
+ const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {
25
+ if (e.target.files) {
26
+ const files = Array.from(e.target.files)
27
+ if (files.length > 0) {
28
+ setFile(files[0] || null)
29
+ }
30
+ }
31
+ }, [])
32
+
33
+ return (
34
+ <>
35
+ <input ref={inputRef} type="file" onChange={handleChange} />
36
+ {file && (
37
+ <Button
38
+ onClick={() => {
39
+ openFileViewer((close) => ({
40
+ file: file,
41
+ onDelete: close,
42
+ }))
43
+ }}
44
+ >
45
+ Open
46
+ </Button>
47
+ )}
48
+ </>
49
+ )
50
+ }
@@ -0,0 +1,72 @@
1
+ import { memo, PropsWithChildren, useCallback, useEffect, useMemo, useState } from "react"
2
+
3
+ import { ImageViewer, SUPPORTED_IMAGE_FILE_TYPES } from "../ImageViewer"
4
+ import { PDFViewer, SUPPORTED_PDF_FILE_TYPES } from "../PDFViewer"
5
+ import { SpreadsheetViewer, SUPPORTED_SPREADSHEET_FILE_EXTENSIONS } from "../SpreadsheetViewer"
6
+ import { FileViewerContext } from "./context"
7
+ import { FileViewerConfig } from "./typings"
8
+
9
+ type FileViewerType = "image" | "spreadsheet" | "pdf"
10
+ export const FileViewerProvider = memo((props: PropsWithChildren) => {
11
+ const { children } = props
12
+ const [config, setConfig] = useState<FileViewerConfig | null>(null)
13
+ const [fileType, setFileType] = useState<FileViewerType | null>(null)
14
+
15
+ const closeFileViewer = useCallback(() => {
16
+ setConfig(null)
17
+ setFileType(null)
18
+ }, [])
19
+
20
+ const openFileViewer = useCallback(
21
+ (func: (closeFileViewer: () => void) => FileViewerConfig) => {
22
+ setConfig(func(closeFileViewer))
23
+ },
24
+ [closeFileViewer],
25
+ )
26
+
27
+ const handleClose = useCallback(() => {
28
+ if (!config) return
29
+ if (config.onClose) config.onClose()
30
+ closeFileViewer()
31
+ }, [closeFileViewer, config])
32
+
33
+ useEffect(() => {
34
+ if (!config) return
35
+ const { file } = config
36
+
37
+ if (SUPPORTED_SPREADSHEET_FILE_EXTENSIONS.includes(file.type)) {
38
+ setFileType("spreadsheet")
39
+ return
40
+ }
41
+ if (SUPPORTED_PDF_FILE_TYPES.includes(file.type)) {
42
+ setFileType("pdf")
43
+ return
44
+ }
45
+ if (SUPPORTED_IMAGE_FILE_TYPES.includes(file.type)) {
46
+ setFileType("image")
47
+ return
48
+ }
49
+ }, [config])
50
+
51
+ const value = useMemo(() => openFileViewer, [openFileViewer])
52
+
53
+ return (
54
+ <FileViewerContext.Provider value={value}>
55
+ {children}
56
+ {config && (
57
+ <>
58
+ {fileType === "spreadsheet" && (
59
+ <SpreadsheetViewer file={config.file} onDelete={config.onDelete} onClose={handleClose} />
60
+ )}
61
+ {fileType === "pdf" && (
62
+ <PDFViewer file={config.file} onDelete={config.onDelete} onClose={handleClose} />
63
+ )}
64
+ {fileType === "image" && (
65
+ <ImageViewer file={config.file} onDelete={config.onDelete} onClose={handleClose} />
66
+ )}
67
+ </>
68
+ )}
69
+ </FileViewerContext.Provider>
70
+ )
71
+ })
72
+ FileViewerProvider.displayName = "FileViewerProvider"
@@ -0,0 +1,11 @@
1
+ import { createContext, useContext } from "react"
2
+
3
+ import { FileViewerConfig } from "./typings"
4
+
5
+ export type FileViewerContextType = (func: (close: () => void) => FileViewerConfig) => void
6
+
7
+ export const FileViewerContext = createContext<FileViewerContextType>(() => {
8
+ throw new Error("No FileViewerProvider found")
9
+ })
10
+
11
+ export const useFileViewer = () => useContext(FileViewerContext)
@@ -0,0 +1,3 @@
1
+ export * from "./context"
2
+ export * from "./FileViewerProvider"
3
+ export * from "./typings"
@@ -0,0 +1,5 @@
1
+ export interface FileViewerConfig {
2
+ file: File
3
+ onDelete?: (file: File) => void
4
+ onClose?: () => void
5
+ }