@khanacademy/perseus-editor 1.1.0 → 2.0.0

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 (312) hide show
  1. package/.babelrc.js +1 -1
  2. package/.eslintrc.js +1 -0
  3. package/CHANGELOG.md +21 -0
  4. package/dist/all-editors.d.ts +2 -0
  5. package/dist/all-editors.js.flow +8 -0
  6. package/dist/all-widgets.d.ts +22 -0
  7. package/dist/all-widgets.js.flow +34 -0
  8. package/dist/article-editor.d.ts +59 -0
  9. package/dist/article-editor.js.flow +72 -0
  10. package/dist/components/blur-input.d.ts +19 -0
  11. package/dist/components/blur-input.js.flow +25 -0
  12. package/dist/components/checkbox.d.ts +20 -0
  13. package/dist/components/checkbox.js.flow +26 -0
  14. package/dist/components/device-framer.d.ts +15 -0
  15. package/dist/components/device-framer.js.flow +20 -0
  16. package/dist/components/drag-target.d.ts +2 -0
  17. package/dist/components/drag-target.js.flow +8 -0
  18. package/dist/components/dropdown-option.d.ts +35 -0
  19. package/dist/components/dropdown-option.js.flow +49 -0
  20. package/dist/components/form-wrapped-text-field.d.ts +48 -0
  21. package/dist/components/form-wrapped-text-field.js.flow +48 -0
  22. package/dist/components/graph-settings.d.ts +2 -0
  23. package/dist/components/graph-settings.js.flow +8 -0
  24. package/dist/components/hover-behavior.d.ts +85 -0
  25. package/dist/components/hover-behavior.js.flow +48 -0
  26. package/dist/components/json-editor.d.ts +2 -0
  27. package/dist/components/json-editor.js.flow +8 -0
  28. package/dist/components/link.d.ts +41 -0
  29. package/dist/components/link.js.flow +50 -0
  30. package/dist/components/simple-button.d.ts +16 -0
  31. package/dist/components/simple-button.js.flow +18 -0
  32. package/dist/components/sortable.d.ts +2 -0
  33. package/dist/components/sortable.js.flow +8 -0
  34. package/dist/components/util.d.ts +1 -0
  35. package/dist/components/util.js.flow +9 -0
  36. package/dist/components/viewport-resizer.d.ts +16 -0
  37. package/dist/components/viewport-resizer.js.flow +22 -0
  38. package/dist/diffs/__stories__/perseus-diff-wrapper.d.ts +5 -0
  39. package/dist/diffs/__stories__/perseus-diff-wrapper.js.flow +11 -0
  40. package/dist/diffs/article-diff.d.ts +50 -0
  41. package/dist/diffs/article-diff.js.flow +71 -0
  42. package/dist/diffs/item-diff.d.ts +23 -0
  43. package/dist/diffs/item-diff.js.flow +41 -0
  44. package/dist/diffs/renderer-diff.d.ts +22 -0
  45. package/dist/diffs/renderer-diff.js.flow +25 -0
  46. package/dist/diffs/split-diff.d.ts +2 -0
  47. package/dist/diffs/split-diff.js.flow +8 -0
  48. package/dist/diffs/string-array-diff.d.ts +2 -0
  49. package/dist/diffs/string-array-diff.js.flow +11 -0
  50. package/dist/diffs/structured-item-diff.d.ts +25 -0
  51. package/dist/diffs/structured-item-diff.js.flow +37 -0
  52. package/dist/diffs/tags-diff.d.ts +21 -0
  53. package/dist/diffs/tags-diff.js.flow +24 -0
  54. package/dist/diffs/text-diff.d.ts +15 -0
  55. package/dist/diffs/text-diff.js.flow +21 -0
  56. package/dist/diffs/widget-diff-performer.d.ts +2 -0
  57. package/dist/diffs/widget-diff-performer.js.flow +8 -0
  58. package/dist/diffs/widget-diff.d.ts +21 -0
  59. package/dist/diffs/widget-diff.js.flow +31 -0
  60. package/dist/editor-page.d.ts +57 -0
  61. package/dist/editor-page.js.flow +73 -0
  62. package/dist/editor.d.ts +82 -0
  63. package/dist/editor.js.flow +98 -0
  64. package/dist/es/index.js +1428 -2587
  65. package/dist/es/index.js.map +1 -1
  66. package/dist/hint-editor.d.ts +64 -0
  67. package/dist/hint-editor.js.flow +87 -0
  68. package/dist/i18n.d.ts +7 -0
  69. package/dist/i18n.js.flow +13 -0
  70. package/dist/iframe-content-renderer.d.ts +22 -0
  71. package/dist/iframe-content-renderer.js.flow +28 -0
  72. package/dist/index.d.ts +17 -2
  73. package/dist/index.js +1492 -2548
  74. package/dist/index.js.flow +23 -2
  75. package/dist/index.js.map +1 -1
  76. package/dist/item-editor.d.ts +36 -0
  77. package/dist/item-editor.js.flow +46 -0
  78. package/dist/item-extras-editor.d.ts +17 -0
  79. package/dist/item-extras-editor.js.flow +23 -0
  80. package/dist/katex-error-view.d.ts +16 -0
  81. package/dist/katex-error-view.js.flow +24 -0
  82. package/dist/multirenderer-editor.d.ts +32 -0
  83. package/dist/multirenderer-editor.js.flow +46 -0
  84. package/dist/section-control-button.d.ts +12 -0
  85. package/dist/section-control-button.js.flow +20 -0
  86. package/dist/stateful-article-editor.d.ts +10 -0
  87. package/dist/stateful-article-editor.js.flow +16 -0
  88. package/dist/stateful-editor-page.d.ts +2 -0
  89. package/dist/stateful-editor-page.js.flow +8 -0
  90. package/dist/testing-widgets.d.ts +22 -0
  91. package/dist/testing-widgets.js.flow +34 -0
  92. package/dist/util/register-all-widgets-and-editors-for-testing.d.ts +1 -0
  93. package/dist/util/register-all-widgets-and-editors-for-testing.js.flow +7 -0
  94. package/dist/widgets/categorizer-editor.d.ts +47 -0
  95. package/dist/widgets/categorizer-editor.js.flow +61 -0
  96. package/dist/widgets/cs-program-editor.d.ts +21 -0
  97. package/dist/widgets/cs-program-editor.js.flow +25 -0
  98. package/dist/widgets/definition-editor.d.ts +17 -0
  99. package/dist/widgets/definition-editor.js.flow +23 -0
  100. package/dist/widgets/dropdown-editor.d.ts +23 -0
  101. package/dist/widgets/dropdown-editor.js.flow +37 -0
  102. package/dist/widgets/example-graphie-widget-editor.d.ts +18 -0
  103. package/dist/widgets/example-graphie-widget-editor.js.flow +25 -0
  104. package/dist/widgets/example-graphie-widget.d.ts +87 -0
  105. package/dist/widgets/example-graphie-widget.js.flow +101 -0
  106. package/dist/widgets/example-widget-editor.d.ts +19 -0
  107. package/dist/widgets/example-widget-editor.js.flow +26 -0
  108. package/dist/widgets/example-widget.d.ts +71 -0
  109. package/dist/widgets/example-widget.js.flow +86 -0
  110. package/dist/widgets/explanation-editor.d.ts +21 -0
  111. package/dist/widgets/explanation-editor.js.flow +27 -0
  112. package/dist/widgets/expression-editor.d.ts +33 -0
  113. package/dist/widgets/expression-editor.js.flow +41 -0
  114. package/dist/widgets/graded-group-editor.d.ts +53 -0
  115. package/dist/widgets/graded-group-editor.js.flow +67 -0
  116. package/dist/widgets/graded-group-set-editor.d.ts +51 -0
  117. package/dist/widgets/graded-group-set-editor.js.flow +65 -0
  118. package/dist/widgets/grapher-editor.d.ts +14 -0
  119. package/dist/widgets/grapher-editor.js.flow +21 -0
  120. package/dist/widgets/group-editor.d.ts +49 -0
  121. package/dist/widgets/group-editor.js.flow +63 -0
  122. package/dist/widgets/iframe-editor.d.ts +18 -0
  123. package/dist/widgets/iframe-editor.js.flow +24 -0
  124. package/dist/widgets/image-editor.d.ts +2 -0
  125. package/dist/widgets/image-editor.js.flow +8 -0
  126. package/dist/widgets/input-number-editor.d.ts +47 -0
  127. package/dist/widgets/input-number-editor.js.flow +77 -0
  128. package/dist/widgets/interaction/constraint-editor.d.ts +26 -0
  129. package/dist/widgets/interaction/constraint-editor.js.flow +35 -0
  130. package/dist/widgets/interaction-editor.d.ts +28 -0
  131. package/dist/widgets/interaction-editor.js.flow +36 -0
  132. package/dist/widgets/interactive-graph-editor.d.ts +2 -0
  133. package/dist/widgets/interactive-graph-editor.js.flow +8 -0
  134. package/dist/widgets/label-image/answer-choices.d.ts +13 -0
  135. package/dist/widgets/label-image/answer-choices.js.flow +16 -0
  136. package/dist/widgets/label-image/behavior.d.ts +14 -0
  137. package/dist/widgets/label-image/behavior.js.flow +17 -0
  138. package/dist/widgets/label-image/marker.d.ts +30 -0
  139. package/dist/widgets/label-image/marker.js.flow +34 -0
  140. package/dist/widgets/label-image/question-markers.d.ts +22 -0
  141. package/dist/widgets/label-image/question-markers.js.flow +25 -0
  142. package/dist/widgets/label-image/select-image.d.ts +10 -0
  143. package/dist/widgets/label-image/select-image.js.flow +13 -0
  144. package/dist/widgets/label-image-editor.d.ts +45 -0
  145. package/dist/widgets/label-image-editor.js.flow +44 -0
  146. package/dist/widgets/lights-puzzle-editor.d.ts +24 -0
  147. package/dist/widgets/lights-puzzle-editor.js.flow +34 -0
  148. package/dist/widgets/matcher-editor.d.ts +19 -0
  149. package/dist/widgets/matcher-editor.js.flow +28 -0
  150. package/dist/widgets/matrix-editor.d.ts +20 -0
  151. package/dist/widgets/matrix-editor.js.flow +26 -0
  152. package/dist/widgets/measurer-editor.d.ts +32 -0
  153. package/dist/widgets/measurer-editor.js.flow +42 -0
  154. package/dist/widgets/molecule-editor.d.ts +17 -0
  155. package/dist/widgets/molecule-editor.js.flow +23 -0
  156. package/dist/widgets/number-line-editor.d.ts +36 -0
  157. package/dist/widgets/number-line-editor.js.flow +45 -0
  158. package/dist/widgets/numeric-input-editor.d.ts +2 -0
  159. package/dist/widgets/numeric-input-editor.js.flow +8 -0
  160. package/dist/widgets/orderer-editor.d.ts +20 -0
  161. package/dist/widgets/orderer-editor.js.flow +30 -0
  162. package/dist/widgets/passage-editor.d.ts +18 -0
  163. package/dist/widgets/passage-editor.js.flow +24 -0
  164. package/dist/widgets/passage-ref-editor.d.ts +11 -0
  165. package/dist/widgets/passage-ref-editor.js.flow +17 -0
  166. package/dist/widgets/passage-ref-target-editor.d.ts +16 -0
  167. package/dist/widgets/passage-ref-target-editor.js.flow +22 -0
  168. package/dist/widgets/plotter-editor.d.ts +45 -0
  169. package/dist/widgets/plotter-editor.js.flow +53 -0
  170. package/dist/widgets/radio/editor.d.ts +64 -0
  171. package/dist/widgets/radio/editor.js.flow +80 -0
  172. package/dist/widgets/reaction-diagram-editor.d.ts +20 -0
  173. package/dist/widgets/reaction-diagram-editor.js.flow +26 -0
  174. package/dist/widgets/sequence-editor.d.ts +56 -0
  175. package/dist/widgets/sequence-editor.js.flow +72 -0
  176. package/dist/widgets/simple-markdown-tester-editor.d.ts +14 -0
  177. package/dist/widgets/simple-markdown-tester-editor.js.flow +23 -0
  178. package/dist/widgets/simple-markdown-tester.d.ts +52 -0
  179. package/dist/widgets/simple-markdown-tester.js.flow +61 -0
  180. package/dist/widgets/simulator-editor.d.ts +20 -0
  181. package/dist/widgets/simulator-editor.js.flow +26 -0
  182. package/dist/widgets/sorter-editor.d.ts +16 -0
  183. package/dist/widgets/sorter-editor.js.flow +22 -0
  184. package/dist/widgets/table-editor.d.ts +18 -0
  185. package/dist/widgets/table-editor.js.flow +24 -0
  186. package/dist/widgets/transformer-editor.d.ts +11 -0
  187. package/dist/widgets/transformer-editor.js.flow +17 -0
  188. package/dist/widgets/unit-editor.d.ts +33 -0
  189. package/dist/widgets/unit-editor.js.flow +41 -0
  190. package/dist/widgets/video-editor.d.ts +19 -0
  191. package/dist/widgets/video-editor.js.flow +25 -0
  192. package/package.json +6 -5
  193. package/src/__stories__/{editor.stories.js → editor.stories.tsx} +4 -5
  194. package/src/__stories__/{section-control-button.stories.jsx → section-control-button.stories.tsx} +10 -11
  195. package/src/__testdata__/{input-number_testdata.js → input-number.testdata.ts} +2 -3
  196. package/src/__tests__/{editor_test.jsx → editor.test.tsx} +4 -7
  197. package/src/__tests__/{i18n_test.jsx → i18n.test.ts} +5 -5
  198. package/src/__tests__/{traversal_test.jsx → traversal.test.ts} +9 -10
  199. package/src/{all-editors_test.js → all-editors.test.ts} +1 -2
  200. package/src/all-editors.ts +83 -0
  201. package/src/all-widgets.ts +7 -0
  202. package/src/{article-editor.jsx → article-editor.tsx} +52 -42
  203. package/src/components/__stories__/{blur-input.stories.jsx → blur-input.stories.tsx} +2 -4
  204. package/src/components/{blur-input.jsx → blur-input.tsx} +12 -13
  205. package/src/components/{checkbox.jsx → checkbox.tsx} +18 -19
  206. package/src/components/{device-framer.jsx → device-framer.tsx} +4 -5
  207. package/src/components/{drag-target.jsx → drag-target.tsx} +0 -1
  208. package/src/components/{dropdown-option.jsx → dropdown-option.tsx} +40 -40
  209. package/src/components/{form-wrapped-text-field.jsx → form-wrapped-text-field.tsx} +47 -53
  210. package/src/components/{graph-settings.jsx → graph-settings.tsx} +4 -8
  211. package/src/components/{hover-behavior.jsx → hover-behavior.ts} +32 -33
  212. package/src/components/{json-editor.jsx → json-editor.tsx} +4 -3
  213. package/src/components/{link.jsx → link.ts} +33 -33
  214. package/src/components/{simple-button.jsx → simple-button.tsx} +3 -4
  215. package/src/components/{sortable.jsx → sortable.tsx} +3 -3
  216. package/src/components/{util.js → util.ts} +1 -2
  217. package/src/components/{viewport-resizer.jsx → viewport-resizer.tsx} +5 -6
  218. package/src/diffs/__stories__/{perseus-diff-wrapper.jsx → perseus-diff-wrapper.tsx} +3 -2
  219. package/src/diffs/__stories__/{structured-item-diff.stories.jsx → structured-item-diff.stories.tsx} +27 -22
  220. package/src/diffs/__stories__/{tags-diff.stories.jsx → tags-diff.stories.tsx} +12 -14
  221. package/src/diffs/__stories__/{text-diff.stories.jsx → text-diff.stories.tsx} +12 -14
  222. package/src/diffs/__tests__/{split-diff_test.js → split-diff.test.ts} +1 -2
  223. package/src/diffs/__tests__/{string-array-diff_test.js → string-array-diff.test.ts} +1 -2
  224. package/src/diffs/__tests__/{structured-item-diff_test.js → structured-item-diff.test.ts} +15 -14
  225. package/src/diffs/__tests__/{widget-diff-performer_test.js → widget-diff-performer.test.ts} +1 -2
  226. package/src/diffs/{article-diff.jsx → article-diff.tsx} +5 -6
  227. package/src/diffs/{item-diff.jsx → item-diff.tsx} +4 -5
  228. package/src/diffs/{renderer-diff.jsx → renderer-diff.tsx} +22 -28
  229. package/src/diffs/{split-diff.jsx → split-diff.ts} +4 -3
  230. package/src/diffs/{string-array-diff.jsx → string-array-diff.ts} +8 -9
  231. package/src/diffs/{structured-item-diff.jsx → structured-item-diff.tsx} +32 -27
  232. package/src/diffs/{tags-diff.jsx → tags-diff.tsx} +15 -16
  233. package/src/diffs/{text-diff.jsx → text-diff.tsx} +13 -13
  234. package/src/diffs/{widget-diff-performer.jsx → widget-diff-performer.ts} +3 -8
  235. package/src/diffs/{widget-diff.jsx → widget-diff.tsx} +15 -14
  236. package/src/{editor-page.jsx → editor-page.tsx} +52 -60
  237. package/src/{editor.jsx → editor.tsx} +315 -277
  238. package/src/{hint-editor.jsx → hint-editor.tsx} +105 -79
  239. package/src/{i18n.jsx → i18n.ts} +9 -6
  240. package/src/{iframe-content-renderer.jsx → iframe-content-renderer.tsx} +23 -17
  241. package/src/{index.js → index.ts} +15 -16
  242. package/src/{item-editor.jsx → item-editor.tsx} +35 -30
  243. package/src/{item-extras-editor.jsx → item-extras-editor.tsx} +3 -4
  244. package/src/{katex-error-view.jsx → katex-error-view.tsx} +4 -5
  245. package/src/{multirenderer-editor.jsx → multirenderer-editor.tsx} +132 -127
  246. package/src/{section-control-button.jsx → section-control-button.tsx} +10 -9
  247. package/src/{stateful-article-editor.jsx → stateful-article-editor.tsx} +2 -5
  248. package/src/{stateful-editor-page.jsx → stateful-editor-page.tsx} +1 -3
  249. package/src/{testing-widgets.js → testing-widgets.ts} +5 -6
  250. package/src/util/{register-all-widgets-and-editors-for-testing_test.js → register-all-widgets-and-editors-for-testing.test.ts} +1 -2
  251. package/src/util/{register-all-widgets-and-editors-for-testing.js → register-all-widgets-and-editors-for-testing.ts} +2 -3
  252. package/src/widgets/__stories__/{label-image-editor.stories.jsx → label-image-editor.stories.tsx} +22 -18
  253. package/src/widgets/__stories__/{radio-editor.stories.jsx → radio-editor.stories.tsx} +15 -10
  254. package/src/widgets/{categorizer-editor.jsx → categorizer-editor.tsx} +8 -6
  255. package/src/widgets/{cs-program-editor.jsx → cs-program-editor.tsx} +17 -17
  256. package/src/widgets/{definition-editor.jsx → definition-editor.tsx} +9 -8
  257. package/src/widgets/{dropdown-editor.jsx → dropdown-editor.tsx} +27 -19
  258. package/src/widgets/{example-graphie-widget-editor.jsx → example-graphie-widget-editor.tsx} +8 -8
  259. package/src/widgets/{example-graphie-widget.jsx → example-graphie-widget.tsx} +14 -17
  260. package/src/widgets/{example-widget-editor.jsx → example-widget-editor.tsx} +10 -7
  261. package/src/widgets/{example-widget.jsx → example-widget.tsx} +14 -12
  262. package/src/widgets/{explanation-editor.jsx → explanation-editor.tsx} +12 -10
  263. package/src/widgets/{expression-editor.jsx → expression-editor.tsx} +36 -26
  264. package/src/widgets/{graded-group-editor.jsx → graded-group-editor.tsx} +18 -10
  265. package/src/widgets/{graded-group-set-editor.jsx → graded-group-set-editor.tsx} +15 -12
  266. package/src/widgets/{grapher-editor.jsx → grapher-editor.tsx} +10 -9
  267. package/src/widgets/{group-editor.jsx → group-editor.tsx} +11 -9
  268. package/src/widgets/{iframe-editor.jsx → iframe-editor.tsx} +16 -13
  269. package/src/widgets/{image-editor.jsx → image-editor.tsx} +4 -7
  270. package/src/widgets/{input-number-editor.jsx → input-number-editor.tsx} +61 -47
  271. package/src/widgets/interaction/{constraint-editor.jsx → constraint-editor.tsx} +21 -24
  272. package/src/widgets/{interaction-editor.jsx → interaction-editor.tsx} +160 -61
  273. package/src/widgets/{interactive-graph-editor.jsx → interactive-graph-editor.tsx} +13 -10
  274. package/src/widgets/label-image/__stories__/{answer-choices.stories.jsx → answer-choices.stories.tsx} +22 -17
  275. package/src/widgets/label-image/__stories__/{behavior.stories.jsx → behavior.stories.tsx} +9 -10
  276. package/src/widgets/label-image/__stories__/{marker.stories.jsx → marker.stories.tsx} +11 -12
  277. package/src/widgets/label-image/__stories__/{question-markers.stories.jsx → question-markers.stories.tsx} +17 -16
  278. package/src/widgets/label-image/__stories__/{select-image.stories.jsx → select-image.stories.tsx} +12 -13
  279. package/src/widgets/label-image/{answer-choices.jsx → answer-choices.tsx} +18 -18
  280. package/src/widgets/label-image/{behavior.jsx → behavior.tsx} +9 -11
  281. package/src/widgets/label-image/{marker.jsx → marker.tsx} +17 -19
  282. package/src/widgets/label-image/{question-markers.jsx → question-markers.tsx} +16 -21
  283. package/src/widgets/label-image/{select-image.jsx → select-image.tsx} +5 -7
  284. package/src/widgets/{label-image-editor.jsx → label-image-editor.tsx} +38 -44
  285. package/src/widgets/{lights-puzzle-editor.jsx → lights-puzzle-editor.tsx} +34 -24
  286. package/src/widgets/{matcher-editor.jsx → matcher-editor.tsx} +9 -7
  287. package/src/widgets/{matrix-editor.jsx → matrix-editor.tsx} +10 -9
  288. package/src/widgets/{measurer-editor.jsx → measurer-editor.tsx} +21 -14
  289. package/src/widgets/{molecule-editor.jsx → molecule-editor.tsx} +9 -8
  290. package/src/widgets/{number-line-editor.jsx → number-line-editor.tsx} +19 -17
  291. package/src/widgets/{numeric-input-editor.jsx → numeric-input-editor.tsx} +10 -10
  292. package/src/widgets/{orderer-editor.jsx → orderer-editor.tsx} +17 -12
  293. package/src/widgets/{passage-editor.jsx → passage-editor.tsx} +9 -7
  294. package/src/widgets/{passage-ref-editor.jsx → passage-ref-editor.tsx} +8 -6
  295. package/src/widgets/{passage-ref-target-editor.jsx → passage-ref-target-editor.tsx} +9 -7
  296. package/src/widgets/{plotter-editor.jsx → plotter-editor.tsx} +34 -33
  297. package/src/widgets/radio/{editor.jsx → editor.tsx} +22 -21
  298. package/src/widgets/{reaction-diagram-editor.jsx → reaction-diagram-editor.tsx} +14 -10
  299. package/src/widgets/{sequence-editor.jsx → sequence-editor.tsx} +13 -13
  300. package/src/widgets/{simple-markdown-tester-editor.jsx → simple-markdown-tester-editor.tsx} +11 -9
  301. package/src/widgets/{simple-markdown-tester.jsx → simple-markdown-tester.tsx} +8 -7
  302. package/src/widgets/{simulator-editor.jsx → simulator-editor.tsx} +10 -8
  303. package/src/widgets/{sorter-editor.jsx → sorter-editor.tsx} +8 -6
  304. package/src/widgets/{table-editor.jsx → table-editor.tsx} +11 -10
  305. package/src/widgets/{transformer-editor.jsx → transformer-editor.tsx} +37 -35
  306. package/src/widgets/{unit-editor.jsx → unit-editor.tsx} +31 -25
  307. package/src/widgets/{video-editor.jsx → video-editor.tsx} +8 -9
  308. package/tsconfig.json +22 -0
  309. package/tsconfig.tsbuildinfo +1 -0
  310. package/src/all-editors.js +0 -85
  311. package/src/all-widgets.js +0 -10
  312. /package/dist/{strings.js → strings} +0 -0
package/.babelrc.js CHANGED
@@ -5,4 +5,4 @@
5
5
  *
6
6
  * We should remove this when jest is fixed.
7
7
  */
8
- module.exports = require("../../config/build/babel.config.js");
8
+ module.exports = require("../../config/build/babel.config");
package/.eslintrc.js CHANGED
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-var-requires */
1
2
  /* eslint-disable import/no-commonjs */
2
3
  const path = require("path");
3
4
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @khanacademy/perseus-editor
2
2
 
3
+ ## 2.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 53fd3768: Migrate source code to TypeScript
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [53fd3768]
12
+ - Updated dependencies [53fd3768]
13
+ - @khanacademy/perseus@4.0.0
14
+ - @khanacademy/kas@0.3.0
15
+ - @khanacademy/kmath@0.1.0
16
+
17
+ ## 1.1.1
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies [8ca2a1a6]
22
+ - @khanacademy/perseus@3.0.0
23
+
3
24
  ## 1.1.0
4
25
 
5
26
  ### Minor Changes
@@ -0,0 +1,2 @@
1
+ declare const _default: any[];
2
+ export default _default;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Flowtype definitions for data
3
+ * Generated by Flowgen from a Typescript Definition
4
+ * Flowgen v1.21.0
5
+ * @flow
6
+ */
7
+ declare var _default: any[];
8
+ declare export default typeof _default;
@@ -0,0 +1,22 @@
1
+ /// <reference types="react" />
2
+ declare const _default: readonly Readonly<{
3
+ name: string;
4
+ displayName: string;
5
+ getWidget?: (() => import("react").ComponentType<any>) | undefined;
6
+ accessible?: boolean | ((props: any) => boolean) | undefined;
7
+ hidden?: boolean | undefined;
8
+ version?: import("@khanacademy/perseus").Version | undefined;
9
+ supportedAlignments?: readonly import("@khanacademy/perseus").Alignment[] | undefined;
10
+ defaultAlignment?: import("@khanacademy/perseus").Alignment | undefined;
11
+ getDefaultAlignment?: (() => import("@khanacademy/perseus").Alignment) | undefined;
12
+ isLintable?: boolean | undefined;
13
+ transform?: import("../../perseus/src/types").WidgetTransform | undefined;
14
+ tracking?: import("../../perseus/src/types").Tracking | undefined;
15
+ staticTransform?: import("../../perseus/src/types").WidgetTransform | undefined;
16
+ traverseChildWidgets?: any;
17
+ propUpgrades?: {
18
+ [key: string]: (arg1: any) => any;
19
+ } | undefined;
20
+ widget: import("react").ComponentType<any>;
21
+ }>[];
22
+ export default _default;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Flowtype definitions for data
3
+ * Generated by Flowgen from a Typescript Definition
4
+ * Flowgen v1.21.0
5
+ * @flow
6
+ */
7
+ import * as $Flowgen$Import$react from "react";
8
+ import * as $Flowgen$Import$_40_khanacademy_2f_perseus from "@khanacademy/perseus";
9
+ import * as $Flowgen$Import$_2e__2e__2f__2e__2e__2f_perseus_2f_src_2f_types from "../../perseus/src/types";
10
+ declare var _default: $ReadOnlyArray<
11
+ $ReadOnly<{|
12
+ name: string,
13
+ displayName: string,
14
+ getWidget?: (() => $Flowgen$Import$react.ComponentType<any>) | void,
15
+ accessible?: boolean | ((props: any) => boolean) | void,
16
+ hidden?: boolean | void,
17
+ version?: $Flowgen$Import$_40_khanacademy_2f_perseus.Version | void,
18
+ supportedAlignments?: $ReadOnlyArray<$Flowgen$Import$_40_khanacademy_2f_perseus.Alignment> | void,
19
+ defaultAlignment?: $Flowgen$Import$_40_khanacademy_2f_perseus.Alignment | void,
20
+ getDefaultAlignment?:
21
+ | (() => $Flowgen$Import$_40_khanacademy_2f_perseus.Alignment)
22
+ | void,
23
+ isLintable?: boolean | void,
24
+ transform?: $Flowgen$Import$_2e__2e__2f__2e__2e__2f_perseus_2f_src_2f_types.WidgetTransform | void,
25
+ tracking?: $Flowgen$Import$_2e__2e__2f__2e__2e__2f_perseus_2f_src_2f_types.Tracking | void,
26
+ staticTransform?: $Flowgen$Import$_2e__2e__2f__2e__2e__2f_perseus_2f_src_2f_types.WidgetTransform | void,
27
+ traverseChildWidgets?: any,
28
+ propUpgrades?: {
29
+ [key: string]: (arg1: any) => any,
30
+ } | void,
31
+ widget: $Flowgen$Import$react.ComponentType<any>,
32
+ |}>
33
+ >;
34
+ declare export default typeof _default;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * An article editor. Articles are long-form pieces of content, composed of
3
+ * multiple (Renderer) sections concatenated together.
4
+ */
5
+ import { Changeable } from "@khanacademy/perseus";
6
+ import * as React from "react";
7
+ import type { APIOptions } from "@khanacademy/perseus";
8
+ type RendererProps = {
9
+ content?: string;
10
+ widgets?: any;
11
+ images?: any;
12
+ };
13
+ type JsonType = RendererProps | ReadonlyArray<RendererProps>;
14
+ type DefaultProps = {
15
+ contentPaths?: ReadonlyArray<string>;
16
+ json: JsonType;
17
+ mode: "diff" | "edit" | "json" | "preview";
18
+ screen: "phone" | "tablet" | "desktop";
19
+ sectionImageUploadGenerator: (i: number) => React.ReactElement<React.ComponentProps<"span">>;
20
+ useNewStyles: boolean;
21
+ };
22
+ type PerseusArticleEditorProps = DefaultProps & {
23
+ apiOptions?: APIOptions;
24
+ imageUploader?: (arg1: string, arg2: (arg1: string) => unknown) => unknown;
25
+ previewURL: string;
26
+ } & Changeable.ChangeableProps;
27
+ type State = {
28
+ highlightLint: boolean;
29
+ };
30
+ export default class ArticleEditor extends React.Component<PerseusArticleEditorProps, State> {
31
+ static defaultProps: DefaultProps;
32
+ state: State;
33
+ componentDidMount(): void;
34
+ componentDidUpdate(): void;
35
+ _updatePreviewFrames(): void;
36
+ _apiOptionsForSection(section: RendererProps, sectionIndex: number): any;
37
+ _sections(): ReadonlyArray<RendererProps>;
38
+ _renderEditor(): React.ReactElement<React.ComponentProps<"div">>;
39
+ _renderAddSection(): React.ReactElement<React.ComponentProps<"div">>;
40
+ _renderLinterHUD(): React.ReactElement<any>;
41
+ _renderIframePreview(i: number | string, nochrome: boolean): React.ReactElement<any>;
42
+ _renderPreviewMode(): React.ReactElement<React.ComponentProps<"div">>;
43
+ _handleJsonChange: (newJson: JsonType) => void;
44
+ _handleEditorChange: (i: number, newProps: RendererProps) => void;
45
+ _handleMoveSectionEarlier(i: number): void;
46
+ _handleMoveSectionLater(i: number): void;
47
+ _handleAddSectionAfter(i: number): void;
48
+ _handleRemoveSection(i: number): void;
49
+ serialize(): JsonType;
50
+ /**
51
+ * Returns an array, with one element be section.
52
+ * Each element is an array of lint warnings present in that section.
53
+ *
54
+ * This function can currently only be called in edit mode.
55
+ */
56
+ getSaveWarnings(): ReadonlyArray<RendererProps>;
57
+ render(): React.ReactNode;
58
+ }
59
+ export {};
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Flowtype definitions for data
3
+ * Generated by Flowgen from a Typescript Definition
4
+ * Flowgen v1.21.0
5
+ * @flow
6
+ */
7
+ import { Changeable } from "@khanacademy/perseus";
8
+ import * as React from "react";
9
+ import type { APIOptions } from "@khanacademy/perseus";
10
+ declare type RendererProps = {|
11
+ content?: string,
12
+ widgets?: any,
13
+ images?: any,
14
+ |};
15
+ declare type JsonType = RendererProps | $ReadOnlyArray<RendererProps>;
16
+ declare type DefaultProps = {|
17
+ contentPaths?: $ReadOnlyArray<string>,
18
+ json: JsonType,
19
+ mode: "diff" | "edit" | "json" | "preview",
20
+ screen: "phone" | "tablet" | "desktop",
21
+ sectionImageUploadGenerator: (
22
+ i: number
23
+ ) => React.Element<"span">,
24
+ useNewStyles: boolean,
25
+ |};
26
+ declare type PerseusArticleEditorProps = {|
27
+ ...DefaultProps,
28
+ ...{|
29
+ apiOptions?: APIOptions,
30
+ imageUploader?: (arg1: string, arg2: (arg1: string) => mixed) => mixed,
31
+ previewURL: string,
32
+ |},
33
+ ...Changeable.ChangeableProps,
34
+ |};
35
+ declare type State = {|
36
+ highlightLint: boolean,
37
+ |};
38
+ declare export default class ArticleEditor
39
+ extends React.Component<PerseusArticleEditorProps, State>
40
+ {
41
+ static defaultProps: DefaultProps;
42
+ state: State;
43
+ componentDidMount(): void;
44
+ componentDidUpdate(): void;
45
+ _updatePreviewFrames(): void;
46
+ _apiOptionsForSection(section: RendererProps, sectionIndex: number): any;
47
+ _sections(): $ReadOnlyArray<RendererProps>;
48
+ _renderEditor(): React.Element<"div">;
49
+ _renderAddSection(): React.Element<"div">;
50
+ _renderLinterHUD(): React.Element<any>;
51
+ _renderIframePreview(
52
+ i: number | string,
53
+ nochrome: boolean
54
+ ): React.Element<any>;
55
+ _renderPreviewMode(): React.Element<"div">;
56
+ _handleJsonChange: (newJson: JsonType) => void;
57
+ _handleEditorChange: (i: number, newProps: RendererProps) => void;
58
+ _handleMoveSectionEarlier(i: number): void;
59
+ _handleMoveSectionLater(i: number): void;
60
+ _handleAddSectionAfter(i: number): void;
61
+ _handleRemoveSection(i: number): void;
62
+ serialize(): JsonType;
63
+
64
+ /**
65
+ * Returns an array, with one element be section.
66
+ * Each element is an array of lint warnings present in that section.
67
+ *
68
+ * This function can currently only be called in edit mode.
69
+ */
70
+ getSaveWarnings(): $ReadOnlyArray<RendererProps>;
71
+ render(): React.Node;
72
+ }
@@ -0,0 +1,19 @@
1
+ import * as React from "react";
2
+ import type { CSSProperties } from "aphrodite";
3
+ type Props = {
4
+ value: string;
5
+ onChange: (arg1: string) => void;
6
+ className?: string;
7
+ style?: CSSProperties;
8
+ };
9
+ type State = {
10
+ value: string;
11
+ };
12
+ declare class BlurInput extends React.Component<Props, State> {
13
+ constructor(props: Props);
14
+ UNSAFE_componentWillReceiveProps(nextProps: Props): void;
15
+ handleChange: (e: any) => void;
16
+ handleBlur: (e: any) => void;
17
+ render(): React.ReactNode;
18
+ }
19
+ export default BlurInput;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Flowtype definitions for data
3
+ * Generated by Flowgen from a Typescript Definition
4
+ * Flowgen v1.21.0
5
+ * @flow
6
+ */
7
+ import * as React from "react";
8
+ import type { CSSProperties } from "aphrodite";
9
+ declare type Props = {|
10
+ value: string,
11
+ onChange: (arg1: string) => void,
12
+ className?: string,
13
+ style?: CSSProperties,
14
+ |};
15
+ declare type State = {|
16
+ value: string,
17
+ |};
18
+ declare class BlurInput extends React.Component<Props, State> {
19
+ constructor(props: Props): this;
20
+ UNSAFE_componentWillReceiveProps(nextProps: Props): void;
21
+ handleChange: (e: any) => void;
22
+ handleBlur: (e: any) => void;
23
+ render(): React.Node;
24
+ }
25
+ declare export default typeof BlurInput;
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ export type CheckboxProps = {
3
+ checked: boolean;
4
+ disabled?: boolean;
5
+ appearDisabled?: boolean;
6
+ onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
7
+ tabIndex?: number | string;
8
+ style?: {
9
+ marginTop: number;
10
+ };
11
+ dataTestId?: string;
12
+ id?: string;
13
+ };
14
+ export default class Checkbox extends React.Component<CheckboxProps> {
15
+ static defaultProps: {
16
+ checked: boolean;
17
+ onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
18
+ };
19
+ render(): React.ReactNode;
20
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Flowtype definitions for data
3
+ * Generated by Flowgen from a Typescript Definition
4
+ * Flowgen v1.21.0
5
+ * @flow
6
+ */
7
+ import * as React from "react";
8
+ export type CheckboxProps = {|
9
+ checked: boolean,
10
+ disabled?: boolean,
11
+ appearDisabled?: boolean,
12
+ onChange: (event: SyntheticInputEvent<HTMLInputElement>) => void,
13
+ tabIndex?: number | string,
14
+ style?: {|
15
+ marginTop: number,
16
+ |},
17
+ dataTestId?: string,
18
+ id?: string,
19
+ |};
20
+ declare export default class Checkbox extends React.Component<CheckboxProps> {
21
+ static defaultProps: {|
22
+ checked: boolean,
23
+ onChange: (event: SyntheticInputEvent<HTMLInputElement>) => void,
24
+ |};
25
+ render(): React.Node;
26
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * A component that displays its contents inside a device frame.
3
+ */
4
+ import PropTypes from "prop-types";
5
+ import * as React from "react";
6
+ type Props = any;
7
+ declare class DeviceFramer extends React.Component<Props> {
8
+ static propTypes: {
9
+ children: PropTypes.Validator<PropTypes.ReactElementLike>;
10
+ deviceType: PropTypes.Validator<NonNullable<"phone" | "tablet" | "desktop">>;
11
+ nochrome: PropTypes.Requireable<boolean>;
12
+ };
13
+ render(): React.ReactNode;
14
+ }
15
+ export default DeviceFramer;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Flowtype definitions for data
3
+ * Generated by Flowgen from a Typescript Definition
4
+ * Flowgen v1.21.0
5
+ * @flow
6
+ */
7
+ import PropTypes from "prop-types";
8
+ import * as React from "react";
9
+ declare type Props = any;
10
+ declare class DeviceFramer extends React.Component<Props> {
11
+ static propTypes: {|
12
+ children: PropTypes.Validator<PropTypes.ReactElementLike>,
13
+ deviceType: PropTypes.Validator<
14
+ $NonMaybeType<"phone" | "tablet" | "desktop">
15
+ >,
16
+ nochrome: PropTypes.Requireable<boolean>,
17
+ |};
18
+ render(): React.Node;
19
+ }
20
+ declare export default typeof DeviceFramer;
@@ -0,0 +1,2 @@
1
+ declare const DragTarget: any;
2
+ export default DragTarget;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Flowtype definitions for data
3
+ * Generated by Flowgen from a Typescript Definition
4
+ * Flowgen v1.21.0
5
+ * @flow
6
+ */
7
+ declare var DragTarget: any;
8
+ declare export default typeof DragTarget;
@@ -0,0 +1,35 @@
1
+ import * as React from "react";
2
+ export type OptionRenderer = (children: React.ReactElement<any> | null | undefined, value: string, selected: boolean, disabled?: boolean) => React.ReactElement<any>;
3
+ type OptionProps = {
4
+ value: string;
5
+ children?: React.ReactNode;
6
+ selected?: boolean;
7
+ disabled?: boolean;
8
+ onClick?: () => void;
9
+ optionRenderer?: OptionRenderer;
10
+ onDropdownClose?: () => void;
11
+ hideFocusState?: boolean;
12
+ testId?: string;
13
+ ariaLabel?: string;
14
+ };
15
+ export declare const optionHeight = 30;
16
+ declare class Option extends React.Component<OptionProps> {
17
+ node: HTMLDivElement;
18
+ handleKeyDown(event: any): void;
19
+ render(): React.ReactNode;
20
+ }
21
+ declare class OptionGroup extends React.Component<{
22
+ onSelected: (value: string) => void;
23
+ children?: Array<React.ReactElement<React.ComponentProps<typeof Option>>>;
24
+ selectedValues: Array<string>;
25
+ optionRenderer?: OptionRenderer;
26
+ noMargin?: boolean;
27
+ onDropdownClose?: () => void;
28
+ hideFocusState?: boolean;
29
+ }> {
30
+ focusedElement: Element;
31
+ componentDidMount(): void;
32
+ render(): React.ReactNode;
33
+ }
34
+ export { OptionGroup };
35
+ export default Option;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Flowtype definitions for data
3
+ * Generated by Flowgen from a Typescript Definition
4
+ * Flowgen v1.21.0
5
+ * @flow
6
+ */
7
+ import * as React from "react";
8
+ export type OptionRenderer = (
9
+ children: React.Element<any> | null | void,
10
+ value: string,
11
+ selected: boolean,
12
+ disabled?: boolean
13
+ ) => React.Element<any>;
14
+ declare type OptionProps = {|
15
+ value: string,
16
+ children?: React.Node,
17
+ selected?: boolean,
18
+ disabled?: boolean,
19
+ onClick?: () => void,
20
+ optionRenderer?: OptionRenderer,
21
+ onDropdownClose?: () => void,
22
+ hideFocusState?: boolean,
23
+ testId?: string,
24
+ ariaLabel?: string,
25
+ |};
26
+ declare export var optionHeight: 30;
27
+ declare class Option extends React.Component<OptionProps> {
28
+ node: HTMLDivElement;
29
+ handleKeyDown(event: any): void;
30
+ render(): React.Node;
31
+ }
32
+ declare class OptionGroup
33
+ extends
34
+ React.Component<{|
35
+ onSelected: (value: string) => void,
36
+ children?: Array<React.Element<typeof Option>>,
37
+ selectedValues: Array<string>,
38
+ optionRenderer?: OptionRenderer,
39
+ noMargin?: boolean,
40
+ onDropdownClose?: () => void,
41
+ hideFocusState?: boolean,
42
+ |}>
43
+ {
44
+ focusedElement: Element;
45
+ componentDidMount(): void;
46
+ render(): React.Node;
47
+ }
48
+ declare export { OptionGroup };
49
+ declare export default typeof Option;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * DEPRECATED: Use <TextField> from ./text-field.jsx instead.
3
+ *
4
+ * This component wraps an <input> in a <form> to make it easier to add an
5
+ * `onSubmit` handler. In practice though this can complicate things because
6
+ * each field is in it's own form which is not how forms should be structured.
7
+ * If you need to handle `onSubmit`, please use <TextField> directly with your
8
+ * own <form> that wraps all text fields in the form.
9
+ **/
10
+ import { components } from "@khanacademy/perseus";
11
+ import * as React from "react";
12
+ type Props = {
13
+ id?: string;
14
+ testId?: string;
15
+ type?: string;
16
+ name?: string;
17
+ readOnly?: boolean;
18
+ value?: string | ReadonlyArray<string> | number | undefined;
19
+ placeholder?: string;
20
+ defaultValue?: string | number | ReadonlyArray<string> | undefined;
21
+ disabled?: boolean;
22
+ autoFocus?: boolean;
23
+ maxLength?: number;
24
+ invalid?: "true" | "false";
25
+ style?: React.CSSProperties | undefined;
26
+ className?: string;
27
+ width?: number | string;
28
+ grow?: boolean | number;
29
+ shrink?: boolean | number;
30
+ labelMediumInputText?: boolean;
31
+ icon?: React.ReactElement<React.ComponentProps<typeof components.Icon>>;
32
+ leftSideIcon?: boolean;
33
+ backgroundColor?: string;
34
+ focusBorderColor?: string;
35
+ borderColor?: string;
36
+ color?: string;
37
+ onSubmit?: (arg1: React.ChangeEvent<HTMLInputElement>) => unknown;
38
+ onBlur?: (arg1: React.ChangeEvent<HTMLInputElement>) => unknown;
39
+ onFocus?: (arg1: React.ChangeEvent<HTMLInputElement>) => unknown;
40
+ onChange?: (arg1: React.ChangeEvent<HTMLInputElement>) => unknown;
41
+ onClick?: (arg1: React.MouseEvent<HTMLInputElement>) => unknown;
42
+ onKeyPress?: (arg1: React.KeyboardEvent<HTMLInputElement>) => unknown;
43
+ onKeyDown?: (arg1: React.KeyboardEvent<HTMLInputElement>) => unknown;
44
+ ["aria-label"]?: string;
45
+ ["aria-describedby"]?: string | undefined;
46
+ };
47
+ declare const _default: React.ForwardRefExoticComponent<Props & React.RefAttributes<HTMLInputElement>>;
48
+ export default _default;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Flowtype definitions for data
3
+ * Generated by Flowgen from a Typescript Definition
4
+ * Flowgen v1.21.0
5
+ * @flow
6
+ */
7
+ import { components } from "@khanacademy/perseus";
8
+ import * as React from "react";
9
+ declare type Props = {|
10
+ id?: string,
11
+ testId?: string,
12
+ type?: string,
13
+ name?: string,
14
+ readOnly?: boolean,
15
+ value?: string | $ReadOnlyArray<string> | number | void,
16
+ placeholder?: string,
17
+ defaultValue?: string | number | $ReadOnlyArray<string> | void,
18
+ disabled?: boolean,
19
+ autoFocus?: boolean,
20
+ maxLength?: number,
21
+ invalid?: "true" | "false",
22
+ style?: React.CSSProperties | void,
23
+ className?: string,
24
+ width?: number | string,
25
+ grow?: boolean | number,
26
+ shrink?: boolean | number,
27
+ labelMediumInputText?: boolean,
28
+ icon?: React.Element<typeof components.Icon>,
29
+ leftSideIcon?: boolean,
30
+ backgroundColor?: string,
31
+ focusBorderColor?: string,
32
+ borderColor?: string,
33
+ color?: string,
34
+ onSubmit?: (arg1: SyntheticInputEvent<HTMLInputElement>) => mixed,
35
+ onBlur?: (arg1: SyntheticInputEvent<HTMLInputElement>) => mixed,
36
+ onFocus?: (arg1: SyntheticInputEvent<HTMLInputElement>) => mixed,
37
+ onChange?: (arg1: SyntheticInputEvent<HTMLInputElement>) => mixed,
38
+ onClick?: (arg1: SyntheticMouseEvent<HTMLInputElement>) => mixed,
39
+ onKeyPress?: (arg1: SyntheticKeyboardEvent<HTMLInputElement>) => mixed,
40
+ onKeyDown?: (arg1: SyntheticKeyboardEvent<HTMLInputElement>) => mixed,
41
+ "aria-label": string | void,
42
+ "aria-describedby": (string | void) | void,
43
+ |};
44
+ declare var _default: React.ForwardRefExoticComponent<{|
45
+ ...Props,
46
+ ...React.RefAttributes<HTMLInputElement>,
47
+ |}>;
48
+ declare export default typeof _default;
@@ -0,0 +1,2 @@
1
+ declare const GraphSettings: any;
2
+ export default GraphSettings;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Flowtype definitions for data
3
+ * Generated by Flowgen from a Typescript Definition
4
+ * Flowgen v1.21.0
5
+ * @flow
6
+ */
7
+ declare var GraphSettings: any;
8
+ declare export default typeof GraphSettings;
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Add hover behavior to another component.
3
+ *
4
+ * This component provides hover and focus status updates in a consistent way
5
+ * across desktop and mobile.
6
+ *
7
+ * For advice on when to use this component instead of Button, see README.md.
8
+ *
9
+ * Many mobile browsers treat :hover as sticky which results in buttons looking
10
+ * pressed even when the user has lifted their finger. This component ensures
11
+ * that when user lifts their finger the hover state is removed.
12
+ *
13
+ * We also chnage how the focus state works. Browsers immediately set the
14
+ * focus state as soon as you click on a button. This component only sets the
15
+ * focus state when a user starts navigating between elements via keybaord.
16
+ *
17
+ * HoverBehavior accepts a function as 'children' which is passed state and
18
+ * an object containing event handlers. The 'children' function should return
19
+ * an React Element of some sort.
20
+ *
21
+ * Example:
22
+ *
23
+ * class MyButtonLikeComponent extends React.Component {
24
+ * render(): React.Node {
25
+ * return <HoverBehavior
26
+ * disabled={this.props.disabled}
27
+ * onClick={this.handleClick}
28
+ * >
29
+ * {({hovered}, handlers) =>
30
+ * <RoundRect
31
+ * textcolor='white'
32
+ * backgroundColor={hovered ? 'red' : 'blue'}/>}
33
+ * {...handlers}
34
+ * >
35
+ * {this.props.children}
36
+ * </RoundRect>
37
+ * }
38
+ * </HoverBehavior>
39
+ * }
40
+ * }
41
+ *
42
+ * This follows a pattern call 'Function as Child Components':
43
+ * https://medium.com/merrickchristensen/function-as-child-components-5f3920a9ace9#.sw0jiio8b
44
+ */
45
+ import * as React from "react";
46
+ type Handlers = {
47
+ onBlur: () => unknown;
48
+ onClick: (e: React.MouseEvent) => unknown;
49
+ onFocus: () => unknown;
50
+ onMouseDown: () => unknown;
51
+ onMouseEnter: () => unknown;
52
+ onMouseLeave: () => unknown;
53
+ onTouchStart: () => unknown;
54
+ onTouchEnd: () => unknown;
55
+ };
56
+ type State = {
57
+ focused: boolean;
58
+ hovered: boolean;
59
+ };
60
+ type Props = {
61
+ children?: (state: State, handlers: Handlers) => React.ReactElement;
62
+ disabled?: boolean;
63
+ onClick?: (e: React.MouseEvent) => unknown;
64
+ startHovered: boolean;
65
+ shouldUpdate: () => boolean;
66
+ };
67
+ export default class HoverBehavior extends React.Component<Props, State> {
68
+ static defaultProps: {
69
+ shouldUpdate: () => boolean;
70
+ startHovered: boolean;
71
+ };
72
+ constructor(props: Props);
73
+ focusFlag: boolean;
74
+ waitingForClick: boolean;
75
+ handleClick: (e: React.MouseEvent) => void;
76
+ handleMouseEnter: () => void;
77
+ handleMouseLeave: () => void;
78
+ handleTouchStart: () => void;
79
+ handleTouchEnd: () => void;
80
+ handleMouseDown: () => void;
81
+ handleBlur: () => void;
82
+ handleFocus: () => void;
83
+ render(): React.ReactNode;
84
+ }
85
+ export {};